1046 lines
28 KiB
C++
1046 lines
28 KiB
C++
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
|
|
// Copyright (C) 2010 Winch Gate Property Limited
|
|
//
|
|
// This program is free software: you can redistribute it and/or modify
|
|
// it under the terms of the GNU Affero General Public License as
|
|
// published by the Free Software Foundation, either version 3 of the
|
|
// License, or (at your option) any later version.
|
|
//
|
|
// This program is distributed in the hope that it will be useful,
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
// GNU Affero General Public License for more details.
|
|
//
|
|
// You should have received a copy of the GNU Affero General Public License
|
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
|
|
|
|
|
|
/////////////
|
|
// INCLUDE //
|
|
/////////////
|
|
#include "stdpch.h" // First include for pre-compiled headers.
|
|
// Misc
|
|
#include "nel/misc/path.h"
|
|
#include "nel/misc/file.h"
|
|
#include "nel/misc/smart_ptr.h"
|
|
#include "nel/misc/sheet_id.h"
|
|
// Georges
|
|
#include "nel/georges/u_form.h"
|
|
#include "nel/georges/u_form_elm.h"
|
|
#include "nel/georges/u_form_loader.h"
|
|
#include "nel/georges/u_type.h"
|
|
#include "nel/georges/load_form.h"
|
|
// Client
|
|
#include "sheet_manager.h"
|
|
//#include "client_cfg.h"
|
|
#include "client_sheets/entity_sheet.h"
|
|
#include "client_sheets/faction_sheet.h"
|
|
// Game Share
|
|
#include "game_share/visual_slot_manager.h"
|
|
|
|
|
|
///////////
|
|
// USING //
|
|
///////////
|
|
using namespace NLMISC;
|
|
using namespace std;
|
|
using namespace NLGEORGES;
|
|
|
|
|
|
/////////////
|
|
// GLOBALS //
|
|
/////////////
|
|
// Sheet manager.
|
|
CSheetManager SheetMngr;
|
|
UFormLoader *CSheetManager::FormLoader = NULL;
|
|
COFile fItemAssoc;
|
|
bool ItemAssocFileOpen = false;
|
|
|
|
// there can be several instance of CSheetManager (for reload operations) -> ctruct the loader here rather than in CSheetManager ctor
|
|
class CFormLoaderInit
|
|
{
|
|
public:
|
|
CFormLoaderInit()
|
|
{
|
|
nlassert (CSheetManager::FormLoader == NULL);
|
|
CSheetManager::FormLoader = UFormLoader::createLoader ();
|
|
nlassert (CSheetManager::FormLoader != NULL);
|
|
}
|
|
~CFormLoaderInit()
|
|
{
|
|
if (CSheetManager::FormLoader)
|
|
{
|
|
UFormLoader::releaseLoader (CSheetManager::FormLoader);
|
|
CSheetManager::FormLoader = NULL;
|
|
}
|
|
}
|
|
};
|
|
|
|
|
|
static CFormLoaderInit FormLoadInit;
|
|
|
|
class CTypeVersion
|
|
{
|
|
public:
|
|
std::string Type;
|
|
uint Version;
|
|
|
|
CTypeVersion(std::string type, uint version) {Type=type; Version=version;}
|
|
};
|
|
|
|
CTypeVersion TypeVersion [] =
|
|
{
|
|
CTypeVersion("creature", 17),
|
|
// CTypeVersion("player", 0),
|
|
CTypeVersion("fx", 0),
|
|
CTypeVersion("building", 2),
|
|
CTypeVersion("sitem", 42),
|
|
CTypeVersion("item", 42),
|
|
CTypeVersion("plant", 5),
|
|
CTypeVersion("death_impact", 0),
|
|
// CTypeVersion("mission", 0),
|
|
CTypeVersion("race_stats", 3),
|
|
CTypeVersion("light_cycle", 0),
|
|
CTypeVersion("weather_setup", 1),
|
|
CTypeVersion("continent", 12),
|
|
CTypeVersion("world", 1),
|
|
CTypeVersion("weather_function_params", 2),
|
|
CTypeVersion("mission_icon", 0),
|
|
CTypeVersion("sbrick", 32),
|
|
CTypeVersion("sphrase", 4),
|
|
CTypeVersion("skill_tree", 5),
|
|
CTypeVersion("titles", 1),
|
|
CTypeVersion("succes_chances_table", 1),
|
|
CTypeVersion("automaton_list", 23),
|
|
CTypeVersion("animset_list", 25),
|
|
CTypeVersion("animation_fx", 4),
|
|
CTypeVersion("id_to_string_array", 1),
|
|
CTypeVersion("emot", 1),
|
|
CTypeVersion("forage_source", 2),
|
|
CTypeVersion("flora", 0),
|
|
CTypeVersion("animation_fx_set", 3),
|
|
CTypeVersion("attack_list", 9),
|
|
CTypeVersion("text_emotes", 1),
|
|
CTypeVersion("sky", 5),
|
|
CTypeVersion("outpost", 0),
|
|
CTypeVersion("outpost_building", 1),
|
|
CTypeVersion("outpost_squad", 1),
|
|
CTypeVersion("faction", 0),
|
|
};
|
|
// This is just a value for CVS conflict generation.
|
|
const char *LastPackedFilenameVersionIncrementer= "nico";
|
|
|
|
|
|
|
|
/////////////
|
|
// MEMBERS //
|
|
/////////////
|
|
static uint Version = 2;
|
|
|
|
|
|
////////////////////////
|
|
// CSheetManagerEntry //
|
|
////////////////////////
|
|
|
|
// ***************************************************************************
|
|
CSheetManagerEntry::CSheetManagerEntry () : EntitySheet(NULL)
|
|
{
|
|
}
|
|
|
|
//-----------------------------------------------
|
|
// ~CSheetManagerEntry :
|
|
//-----------------------------------------------
|
|
CSheetManagerEntry::~CSheetManagerEntry ()
|
|
{
|
|
// Release the sheet.
|
|
if(EntitySheet != 0)
|
|
{
|
|
delete EntitySheet;
|
|
EntitySheet = 0;
|
|
}
|
|
}// ~CSheetManagerEntry //
|
|
|
|
|
|
// ***************************************************************************
|
|
void CSheetManagerEntry::readGeorges (const NLMISC::CSmartPtr<NLGEORGES::UForm> &form, const NLMISC::CSheetId &sheetId)
|
|
{
|
|
// Load the form with given sheet id
|
|
if (form)
|
|
{
|
|
// if (EntitySheet != NULL)
|
|
// delete EntitySheet;
|
|
|
|
CEntitySheet *sheet = NULL;
|
|
|
|
std::string extension = NLMISC::CSheetId::fileExtensionFromType(sheetId.getSheetType());
|
|
|
|
// create the new structure
|
|
if (extension == "creature")
|
|
sheet = new CCharacterSheet;
|
|
else if(extension == "player")
|
|
sheet = new CPlayerSheet;
|
|
else if(extension == "fx")
|
|
sheet = new CFXSheet;
|
|
else if(extension == "building")
|
|
sheet = new CBuildingSheet;
|
|
else if(extension == "sitem" || extension == "item" )
|
|
sheet = new CItemSheet;
|
|
else if(extension == "plant")
|
|
sheet = new CPlantSheet;
|
|
else if(extension == "death_impact")
|
|
sheet = new CPactSheet;
|
|
else if(extension == "mission")
|
|
sheet = new CMissionSheet;
|
|
else if(extension == "race_stats")
|
|
sheet = new CRaceStatsSheet;
|
|
else if(extension == "light_cycle")
|
|
sheet = new CLightCycleSheet;
|
|
else if(extension == "weather_setup")
|
|
sheet = new CWeatherSetupSheet;
|
|
else if(extension == "continent")
|
|
sheet = new CContinentSheet;
|
|
else if(extension == "world")
|
|
sheet = new CWorldSheet;
|
|
else if(extension == "weather_function_params")
|
|
sheet = new CWeatherFunctionParamsSheet;
|
|
else if(extension == "mission_icon")
|
|
sheet = new CMissionIconSheet;
|
|
else if(extension == "sbrick")
|
|
sheet = new CSBrickSheet;
|
|
else if(extension == "sphrase")
|
|
sheet = new CSPhraseSheet;
|
|
else if(extension == "skill_tree")
|
|
sheet = new CSkillsTreeSheet;
|
|
else if(extension == "titles")
|
|
sheet = new CUnblockTitlesSheet;
|
|
else if(extension == "succes_chances_table")
|
|
sheet = new CSuccessTableSheet;
|
|
else if(extension == "automaton_list")
|
|
sheet = new CAutomatonListSheet;
|
|
else if(extension == "animset_list")
|
|
sheet = new CAnimationSetListSheet;
|
|
else if(extension == "animation_fx")
|
|
sheet = new CAnimationFXSheet;
|
|
else if(extension == "id_to_string_array")
|
|
sheet = new CIDToStringArraySheet;
|
|
else if(extension == "emot")
|
|
sheet = new CEmotListSheet;
|
|
else if(extension == "forage_source")
|
|
sheet = new CForageSourceSheet;
|
|
else if(extension == "flora")
|
|
sheet = new CFloraSheet;
|
|
else if(extension == "animation_fx_set")
|
|
sheet = new CAnimationFXSetSheet;
|
|
else if(extension == "attack_list")
|
|
sheet = new CAttackListSheet;
|
|
else if(extension == "text_emotes")
|
|
sheet = new CTextEmotListSheet;
|
|
else if(extension == "sky")
|
|
sheet = new CSkySheet;
|
|
else if(extension == "outpost")
|
|
sheet = new COutpostSheet;
|
|
else if(extension == "outpost_building")
|
|
sheet = new COutpostBuildingSheet;
|
|
else if(extension == "outpost_squad")
|
|
sheet = new COutpostSquadSheet;
|
|
else if(extension == "faction")
|
|
sheet = new CFactionSheet;
|
|
else
|
|
{
|
|
nlwarning("CSheetManager::loadSheet: Do not know how to create the class from the sheet '%s'.", sheetId.toString().c_str());
|
|
return;
|
|
}
|
|
|
|
// Build the sheet from an external file.
|
|
sheet->Id = sheetId;
|
|
sheet->build(form->getRootNode());
|
|
|
|
EntitySheet = sheet;
|
|
SheetMngr.processSheet(EntitySheet);
|
|
}
|
|
// Error while loading the form.
|
|
else
|
|
{
|
|
// nlwarning("CSheetManager::loadSheet: Cannot load the form '%s'.", filename.c_str());
|
|
EntitySheet = 0;
|
|
}
|
|
}
|
|
|
|
// ***************************************************************************
|
|
void CSheetManagerEntry::initSheet(CEntitySheet *pES, NLMISC::IStream &s, CEntitySheet::TType type)
|
|
{
|
|
if (pES != NULL)
|
|
{
|
|
pES->Id.serial(s);
|
|
pES->serial(s);
|
|
pES->Type = type;
|
|
SheetMngr.processSheet(pES);
|
|
}
|
|
}
|
|
|
|
|
|
// ***************************************************************************
|
|
void CSheetManagerEntry::serial (NLMISC::IStream &s)
|
|
{
|
|
if (s.isReading())
|
|
{
|
|
// if (EntitySheet != NULL)
|
|
// delete EntitySheet;
|
|
|
|
CEntitySheet::TType type = CEntitySheet::TypeCount;
|
|
s.serialEnum(type);
|
|
|
|
switch(type)
|
|
{
|
|
case CEntitySheet::FAUNA:
|
|
{
|
|
EntitySheet = new CCharacterSheet;
|
|
initSheet(EntitySheet, s, type);
|
|
}
|
|
break;
|
|
case CEntitySheet::FLORA:
|
|
{
|
|
EntitySheet = new CFloraSheet;
|
|
initSheet(EntitySheet, s, type);
|
|
}
|
|
break;
|
|
case CEntitySheet::CHAR:
|
|
{
|
|
EntitySheet = new CPlayerSheet;
|
|
initSheet(EntitySheet, s, type);
|
|
}
|
|
break;
|
|
case CEntitySheet::FX:
|
|
{
|
|
EntitySheet = new CFXSheet;
|
|
initSheet(EntitySheet, s, type);
|
|
}
|
|
break;
|
|
case CEntitySheet::BUILDING:
|
|
{
|
|
EntitySheet = new CBuildingSheet;
|
|
initSheet(EntitySheet, s, type);
|
|
}
|
|
break;
|
|
case CEntitySheet::ITEM:
|
|
{
|
|
EntitySheet = new CItemSheet;
|
|
initSheet(EntitySheet, s, type);
|
|
}
|
|
break;
|
|
case CEntitySheet::PLANT:
|
|
{
|
|
EntitySheet = new CPlantSheet;
|
|
initSheet(EntitySheet, s, type);
|
|
}
|
|
break;
|
|
case CEntitySheet::PACT:
|
|
{
|
|
EntitySheet = new CPactSheet;
|
|
initSheet(EntitySheet, s, type);
|
|
}
|
|
break;
|
|
case CEntitySheet::MISSION:
|
|
{
|
|
EntitySheet = new CMissionSheet;
|
|
initSheet(EntitySheet, s, type);
|
|
}
|
|
break;
|
|
case CEntitySheet::MISSION_ICON:
|
|
{
|
|
EntitySheet = new CMissionIconSheet;
|
|
initSheet(EntitySheet, s, type);
|
|
}
|
|
break;
|
|
case CEntitySheet::RACE_STATS:
|
|
{
|
|
EntitySheet = new CRaceStatsSheet;
|
|
initSheet(EntitySheet, s, type);
|
|
}
|
|
break;
|
|
case CEntitySheet::LIGHT_CYCLE:
|
|
{
|
|
EntitySheet = new CLightCycleSheet;
|
|
initSheet(EntitySheet, s, type);
|
|
}
|
|
break;
|
|
case CEntitySheet::WEATHER_SETUP:
|
|
{
|
|
EntitySheet = new CWeatherSetupSheet;
|
|
initSheet(EntitySheet, s, type);
|
|
}
|
|
break;
|
|
case CEntitySheet::CONTINENT:
|
|
{
|
|
EntitySheet = new CContinentSheet;
|
|
initSheet(EntitySheet, s, type);
|
|
}
|
|
break;
|
|
case CEntitySheet::WORLD:
|
|
{
|
|
EntitySheet = new CWorldSheet;
|
|
initSheet(EntitySheet, s, type);
|
|
}
|
|
break;
|
|
case CEntitySheet::WEATHER_FUNCTION_PARAMS:
|
|
{
|
|
EntitySheet = new CWeatherFunctionParamsSheet;
|
|
initSheet(EntitySheet, s, type);
|
|
}
|
|
break;
|
|
case CEntitySheet::SBRICK:
|
|
{
|
|
EntitySheet = new CSBrickSheet;
|
|
initSheet(EntitySheet, s, type);
|
|
}
|
|
break;
|
|
case CEntitySheet::SPHRASE:
|
|
{
|
|
EntitySheet = new CSPhraseSheet;
|
|
initSheet(EntitySheet, s, type);
|
|
}
|
|
break;
|
|
case CEntitySheet::SKILLS_TREE:
|
|
{
|
|
EntitySheet = new CSkillsTreeSheet;
|
|
initSheet(EntitySheet, s, type);
|
|
}
|
|
break;
|
|
case CEntitySheet::UNBLOCK_TITLES:
|
|
{
|
|
EntitySheet = new CUnblockTitlesSheet;
|
|
initSheet(EntitySheet, s, type);
|
|
}
|
|
break;
|
|
case CEntitySheet::SUCCESS_TABLE:
|
|
{
|
|
EntitySheet = new CSuccessTableSheet;
|
|
initSheet(EntitySheet, s, type);
|
|
}
|
|
break;
|
|
case CEntitySheet::AUTOMATON_LIST:
|
|
{
|
|
EntitySheet = new CAutomatonListSheet;
|
|
initSheet(EntitySheet, s, type);
|
|
}
|
|
break;
|
|
case CEntitySheet::ANIMATION_SET_LIST:
|
|
{
|
|
EntitySheet = new CAnimationSetListSheet;
|
|
initSheet(EntitySheet, s, type);
|
|
}
|
|
break;
|
|
case CEntitySheet::ANIMATION_FX:
|
|
{
|
|
EntitySheet = new CAnimationFXSheet;
|
|
initSheet(EntitySheet, s, type);
|
|
}
|
|
break;
|
|
case CEntitySheet::ID_TO_STRING_ARRAY:
|
|
{
|
|
EntitySheet = new CIDToStringArraySheet;
|
|
initSheet(EntitySheet, s, type);
|
|
}
|
|
break;
|
|
case CEntitySheet::EMOT:
|
|
{
|
|
EntitySheet = new CEmotListSheet;
|
|
initSheet(EntitySheet, s, type);
|
|
}
|
|
break;
|
|
case CEntitySheet::FORAGE_SOURCE:
|
|
{
|
|
EntitySheet = new CForageSourceSheet;
|
|
initSheet(EntitySheet, s, type);
|
|
}
|
|
break;
|
|
case CEntitySheet::ANIMATION_FX_SET:
|
|
{
|
|
EntitySheet = new CAnimationFXSetSheet;
|
|
initSheet(EntitySheet, s, type);
|
|
}
|
|
break;
|
|
case CEntitySheet::ATTACK_LIST:
|
|
{
|
|
EntitySheet = new CAttackListSheet;
|
|
initSheet(EntitySheet, s, type);
|
|
}
|
|
break;
|
|
case CEntitySheet::TEXT_EMOT:
|
|
{
|
|
EntitySheet = new CTextEmotListSheet;
|
|
initSheet(EntitySheet, s, type);
|
|
}
|
|
break;
|
|
case CEntitySheet::SKY:
|
|
{
|
|
EntitySheet = new CSkySheet;
|
|
initSheet(EntitySheet, s, type);
|
|
}
|
|
break;
|
|
case CEntitySheet::OUTPOST:
|
|
{
|
|
EntitySheet = new COutpostSheet;
|
|
initSheet(EntitySheet, s, type);
|
|
}
|
|
break;
|
|
case CEntitySheet::OUTPOST_BUILDING:
|
|
{
|
|
EntitySheet = new COutpostBuildingSheet;
|
|
initSheet(EntitySheet, s, type);
|
|
}
|
|
break;
|
|
case CEntitySheet::OUTPOST_SQUAD:
|
|
{
|
|
EntitySheet = new COutpostSquadSheet;
|
|
initSheet(EntitySheet, s, type);
|
|
}
|
|
break;
|
|
case CEntitySheet::FACTION:
|
|
{
|
|
EntitySheet = new CFactionSheet;
|
|
initSheet(EntitySheet, s, type);
|
|
}
|
|
break;
|
|
default:
|
|
nlwarning("CSheetManager::load: Unknown type '%d' in the packed file. Rebuild=true and Ignore this sheet.", type);
|
|
EntitySheet = NULL;
|
|
break;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (EntitySheet != NULL)
|
|
{
|
|
s.serialEnum(EntitySheet->Type);
|
|
EntitySheet->Id.serial(s);
|
|
EntitySheet->serial(s);
|
|
}
|
|
else
|
|
{
|
|
// write a speudo entry into the stream
|
|
CEntitySheet::TType tmp = CEntitySheet::UNKNOWN;
|
|
s.serialEnum(tmp);
|
|
}
|
|
}
|
|
}
|
|
|
|
// ***************************************************************************
|
|
void CSheetManagerEntry::removed()
|
|
{
|
|
// any action that is needed if the sheet no more exist.
|
|
if (EntitySheet != 0)
|
|
{
|
|
delete EntitySheet;
|
|
EntitySheet = 0;
|
|
}
|
|
}
|
|
|
|
// ***************************************************************************
|
|
uint CSheetManagerEntry::getVersion ()
|
|
{
|
|
return Version;
|
|
}
|
|
|
|
//-----------------------------------------------
|
|
//-----------------------------------------------
|
|
void CSheetManagerEntry::setVersion(uint version)
|
|
{
|
|
Version = version;
|
|
}// setVersion //
|
|
|
|
|
|
/////////////
|
|
// METHODS //
|
|
/////////////
|
|
//-----------------------------------------------
|
|
// CSheetManager :
|
|
// Constructor.
|
|
//-----------------------------------------------
|
|
CSheetManager::CSheetManager()
|
|
{
|
|
_NbEyesColor = 0; // Default is no color available for the eyes.
|
|
|
|
// Slot 0 is invalid.
|
|
for(uint i=0; i<SLOTTYPE::NB_SLOT; ++i)
|
|
{
|
|
TItemVector slotList;
|
|
slotList.push_back(0);
|
|
_VisualSlots.push_back(slotList);
|
|
}
|
|
}
|
|
|
|
//-----------------------------------------------
|
|
// CSheetManager :
|
|
// Destructor.
|
|
//-----------------------------------------------
|
|
CSheetManager::~CSheetManager()
|
|
{
|
|
release();
|
|
}
|
|
|
|
//-----------------------------------------------
|
|
void CSheetManager::release()
|
|
{
|
|
_VisualSlots.clear();
|
|
|
|
_EntitySheetContainer.clear();
|
|
|
|
_SheetToVS.clear();
|
|
}
|
|
|
|
//-----------------------------------------------
|
|
// load :
|
|
// Load all sheets.
|
|
//-----------------------------------------------
|
|
void CSheetManager::load(NLMISC::IProgressCallback &callBack, bool updatePackedSheet, bool needComputeVS, bool dumpVSIndex)
|
|
{
|
|
// Open The Item Association File
|
|
if(!fItemAssoc.open(getLogDirectory() + "item_association.dbg", false, true))
|
|
nlwarning("CSheetManager::load: Cannot Open the 'item_association.txt'.");
|
|
else
|
|
ItemAssocFileOpen = true;
|
|
|
|
// Initialize the Sheet DB.
|
|
loadAllSheet(callBack, updatePackedSheet, needComputeVS, dumpVSIndex);
|
|
|
|
// Close the Item Association File.
|
|
fItemAssoc.close();
|
|
ItemAssocFileOpen = false;
|
|
|
|
// Optimize memory taken by all strings of all sheets
|
|
ClientSheetsStrings.memoryCompress();
|
|
|
|
return;
|
|
}// load //
|
|
|
|
|
|
//-----------------------------------------------
|
|
// loadAllSheet :
|
|
// Load all sheets.
|
|
//-----------------------------------------------
|
|
void CSheetManager::loadAllSheet(NLMISC::IProgressCallback &callBack, bool updatePackedSheet, bool needComputeVS, bool dumpVSIndex, bool forceRecompute /*= false*/, const std::vector<std::string> *userExtensions /*= NULL*/)
|
|
{
|
|
|
|
callBack.progress (0);
|
|
callBack.pushCropedValues (0, 0.5f);
|
|
|
|
// Get some information from typ files.
|
|
loadTyp();
|
|
|
|
// prepare a list of sheets extension to load.
|
|
vector<string> extensions;
|
|
|
|
uint sizeTypeVersion = sizeof(TypeVersion);
|
|
uint sizeCTypeVersion = sizeof(CTypeVersion);
|
|
uint nb = sizeTypeVersion/sizeCTypeVersion;
|
|
{
|
|
if (!userExtensions)
|
|
{
|
|
_EntitySheetContainer.clear();
|
|
}
|
|
TEntitySheetMap entitySheetContainer;
|
|
for(uint i=0; i<nb; ++i)
|
|
{
|
|
// see if extension is wanted
|
|
bool found = false;
|
|
if (userExtensions)
|
|
{
|
|
for(uint l = 0; l < userExtensions->size(); ++l)
|
|
{
|
|
if (stricmp((*userExtensions)[l].c_str(), TypeVersion[i].Type.c_str()) == 0)
|
|
{
|
|
found = true;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
found = true;
|
|
}
|
|
if (found)
|
|
{
|
|
entitySheetContainer.clear();
|
|
extensions.clear();
|
|
extensions.push_back(TypeVersion[i].Type);
|
|
CSheetManagerEntry::setVersion(TypeVersion[i].Version);
|
|
string path = CPath::lookup(TypeVersion[i].Type + ".packed_sheets", false);
|
|
if (forceRecompute && !path.empty())
|
|
{
|
|
// delete previous packed sheets
|
|
NLMISC::CFile::deleteFile(path);
|
|
path.clear();
|
|
}
|
|
if(path.empty())
|
|
path = "../../client/data/" + TypeVersion[i].Type + ".packed_sheets";
|
|
::loadForm(extensions, path, entitySheetContainer, updatePackedSheet);
|
|
|
|
TEntitySheetMap::iterator it = entitySheetContainer.begin();
|
|
while(it != entitySheetContainer.end())
|
|
{
|
|
_EntitySheetContainer[(*it).first] = (*it).second;
|
|
(*it).second.EntitySheet = 0;
|
|
// Next
|
|
++it;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
// Re-compute Visual Slot
|
|
if(needComputeVS)
|
|
computeVS();
|
|
|
|
// Compute Visual Slots
|
|
{
|
|
for(uint i=0; i<SLOTTYPE::NB_SLOT; ++i)
|
|
_VisualSlots[i].resize(CVisualSlotManager::getInstance()->getNbIndex((SLOTTYPE::EVisualSlot)i)+1, 0); // Nb Index +1 because index 0 is reserve for empty.
|
|
|
|
//
|
|
TEntitySheetMap::iterator it = _EntitySheetContainer.begin();
|
|
while(it != _EntitySheetContainer.end())
|
|
{
|
|
std::vector<CVisualSlotManager::TIdxbyVS> result;
|
|
CVisualSlotManager::getInstance()->sheet2Index((*it).first, result);
|
|
|
|
for(uint i=0; i<result.size(); ++i)
|
|
{
|
|
if(dynamic_cast<CItemSheet *>((*it).second.EntitySheet))
|
|
{
|
|
_SheetToVS[dynamic_cast<CItemSheet *>((*it).second.EntitySheet)].push_back(std::make_pair(result[i].VisualSlot, result[i].Index));
|
|
_VisualSlots[result[i].VisualSlot][result[i].Index] = dynamic_cast<CItemSheet *>((*it).second.EntitySheet);
|
|
}
|
|
}
|
|
|
|
++it;
|
|
}
|
|
}
|
|
|
|
// Dump visual slots
|
|
// nb : if a new visual_slot.tab has just been generated don't forget
|
|
// to move it in data_common before dump.
|
|
if(dumpVSIndex)
|
|
dumpVisualSlotsIndex();
|
|
|
|
//
|
|
callBack.popCropedValues();
|
|
}// loadAllSheet //
|
|
|
|
|
|
// ***************************************************************************
|
|
void CSheetManager::loadAllSheetNoPackedSheet(NLMISC::IProgressCallback &callBack, const std::vector<std::string> &extensions, const std::string &wildcardFilter)
|
|
{
|
|
|
|
callBack.progress (0);
|
|
callBack.pushCropedValues (0, 0.5f);
|
|
|
|
// load all forms
|
|
::loadFormNoPackedSheet(extensions, _EntitySheetContainer, wildcardFilter);
|
|
|
|
//
|
|
callBack.popCropedValues();
|
|
}
|
|
|
|
|
|
//-----------------------------------------------
|
|
// computeVS :
|
|
// compute Visual Slots for this sheet.
|
|
//-----------------------------------------------
|
|
void CSheetManager::computeVS()
|
|
{
|
|
static std::map< std::string, uint16 > ProcessedItem;
|
|
map< string, uint16 >::iterator it;
|
|
|
|
CVisualSlotManager::TVisualSlot vs;
|
|
vs.resize(SLOTTYPE::NB_SLOT);
|
|
|
|
//
|
|
TEntitySheetMap::iterator itS = _EntitySheetContainer.begin();
|
|
while(itS != _EntitySheetContainer.end())
|
|
{
|
|
// Visual Slots are only valid for Items.
|
|
CItemSheet *item = dynamic_cast<CItemSheet *>((*itS).second.EntitySheet);
|
|
if (item && (*itS).first.getSheetType()==CSheetId::typeFromFileExtension(std::string("sitem")))
|
|
{
|
|
for(uint j=0; j<SLOTTYPE::NB_SLOT_TYPE; ++j)
|
|
{
|
|
SLOTTYPE::TSlotType slotType= (SLOTTYPE::TSlotType)j;
|
|
if( item->hasSlot(slotType) )
|
|
{
|
|
SLOTTYPE::EVisualSlot visualSlot = SLOTTYPE::convertTypeToVisualSlot(slotType);
|
|
if(visualSlot != SLOTTYPE::HIDDEN_SLOT)
|
|
{
|
|
string currentSheet = ((*itS).first).toString();
|
|
|
|
CVisualSlotManager::TElement vsElmt;
|
|
|
|
string sheetName = toString("%s%d", currentSheet.c_str(), visualSlot);
|
|
|
|
// Is the sheet already process (could be process by a sheet with a different lvl)
|
|
it = ProcessedItem.find( sheetName );
|
|
// Insert if not found
|
|
if(it == ProcessedItem.end())
|
|
{
|
|
uint itemNumber;
|
|
if(vs[visualSlot].Element.size() == 0)
|
|
itemNumber = 1;
|
|
else
|
|
itemNumber = vs[visualSlot].Element[vs[visualSlot].Element.size()-1].Index+1;
|
|
|
|
// Item Processed
|
|
ProcessedItem.insert(make_pair(sheetName, itemNumber));
|
|
|
|
vsElmt.Index = itemNumber;
|
|
}
|
|
else
|
|
{
|
|
vsElmt.Index = (*it).second;
|
|
}
|
|
//
|
|
vsElmt.SheetId = (*itS).first;
|
|
vs[visualSlot].Element.push_back(vsElmt);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// Next Sheet
|
|
++itS;
|
|
}
|
|
|
|
|
|
// Open the file.
|
|
NLMISC::COFile f;
|
|
if(f.open("visual_slot.tab"))
|
|
{
|
|
// Dump entities.
|
|
f.serialCont(vs);
|
|
|
|
// Close the File.
|
|
f.close();
|
|
}
|
|
else
|
|
nlwarning("SheetMngr:load: cannot open/create the file 'visual_slot.tab'.");
|
|
}// computeVS //
|
|
|
|
//-----------------------------------------------
|
|
// processSheet :
|
|
// Porcessing the sheet.
|
|
// \param sheet : sheet to process.
|
|
//-----------------------------------------------
|
|
void CSheetManager::processSheet (CEntitySheet * /* sheet */)
|
|
{
|
|
// For now: no op
|
|
}// processSheet //
|
|
|
|
//=======================================================================
|
|
const CSheetManager::TVisualSlotItemArray *CSheetManager::getVSItems(CItemSheet *sheet) const
|
|
{
|
|
TItemSheet2SlotItemArray::const_iterator it = _SheetToVS.find(sheet);
|
|
if (it == _SheetToVS.end())
|
|
return NULL;
|
|
return &(it->second);
|
|
}
|
|
|
|
//=======================================================================
|
|
sint CSheetManager::getVSIndex(const std::string &itemName, SLOTTYPE::EVisualSlot slot)
|
|
{
|
|
NLMISC::CSheetId si;
|
|
if (!si.buildSheetId(itemName))
|
|
{
|
|
nlwarning("<CSheetManager::getVSIndex> : cannot build id from item %s for the slot %d.", itemName.c_str(), slot);
|
|
return -1;
|
|
}
|
|
|
|
TEntitySheetMap::iterator it = _EntitySheetContainer.find(si);;
|
|
if (it == _EntitySheetContainer.end())
|
|
{
|
|
nlwarning("<CSheetManager::getVSIndex> : cannot find %s for the slot %d.", itemName.c_str(), slot);
|
|
return -1;
|
|
}
|
|
if (it->second.EntitySheet == 0 || it->second.EntitySheet->type() != CEntitySheet::ITEM)
|
|
{
|
|
nlwarning("<CSheetManager::getVSIndex> : %s is not an item for the slot %d.", itemName.c_str(), slot);
|
|
return -1;
|
|
}
|
|
|
|
CItemSheet *is = static_cast<CItemSheet *>(it->second.EntitySheet);
|
|
|
|
const TVisualSlotItemArray *ia = getVSItems(is);
|
|
if (ia == NULL)
|
|
{
|
|
nlwarning("<CSheetManager::getVSIndex> : no items for the slot %d. while looking for %s", slot, itemName.c_str());
|
|
return -1;
|
|
}
|
|
|
|
TVisualSlotItemArray::const_iterator first(ia->begin()), last(ia->end());
|
|
for(; first != last; ++first)
|
|
{
|
|
if (first->first == slot)
|
|
{
|
|
return first->second;
|
|
}
|
|
}
|
|
|
|
nlwarning("<CSheetManager::getVSIndex> : cannot find %s for the slot %d.", itemName.c_str(), slot);
|
|
return -1;
|
|
}
|
|
|
|
//-----------------------------------------------
|
|
// get :
|
|
// Get a sheet from its number.
|
|
// \param uint32 num : sheet number.
|
|
// \return CEntitySheet * : pointer on the sheet according to the param or 0 if any pb.
|
|
//-----------------------------------------------
|
|
CEntitySheet *CSheetManager::get(CSheetId num)
|
|
{
|
|
TEntitySheetMap::iterator it = _EntitySheetContainer.find(num);
|
|
if(it != _EntitySheetContainer.end())
|
|
return it->second.EntitySheet;
|
|
else
|
|
return NULL;
|
|
}// get //
|
|
|
|
|
|
//-----------------------------------------------
|
|
uint CSheetManager::getNumItem(SLOTTYPE::EVisualSlot slot)
|
|
{
|
|
// The slot is not a visible one.
|
|
if (slot == SLOTTYPE::HIDDEN_SLOT)
|
|
return 0;
|
|
// Convert into an uint to remove warnings.
|
|
uint s = (uint)slot;
|
|
|
|
// Check slot.
|
|
if(s < _VisualSlots.size())
|
|
{
|
|
return (uint)_VisualSlots[s].size();
|
|
}
|
|
else
|
|
{
|
|
nlwarning("CSheetManager::getNumItem : invalid slot %d.", slot);
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
//-----------------------------------------------
|
|
// getItem :
|
|
// Get the real.
|
|
//-----------------------------------------------
|
|
CItemSheet *CSheetManager::getItem(SLOTTYPE::EVisualSlot slot, uint index)
|
|
{
|
|
// The slot is not a visible one.
|
|
if(slot == SLOTTYPE::HIDDEN_SLOT)
|
|
return 0;
|
|
|
|
// Convert into an uint to remove warnings.
|
|
uint s = (uint)slot;
|
|
|
|
// Check slot.
|
|
if(s < _VisualSlots.size())
|
|
{
|
|
// Check index.
|
|
if(index < _VisualSlots[s].size())
|
|
{
|
|
// Not the default Item.
|
|
if(index != 0)
|
|
return _VisualSlots[s][index];
|
|
// Default Item.
|
|
else
|
|
return NULL;
|
|
}
|
|
// Bad index.
|
|
else
|
|
{
|
|
//nlwarning("CSheetManager::getItem : invalid index %d for the slot %d.", index, slot);
|
|
return NULL;
|
|
}
|
|
}
|
|
// Bad slot.
|
|
else
|
|
{
|
|
nlwarning("CSheetManager::getItem : invalid slot %d.", slot);
|
|
return NULL;
|
|
}
|
|
}// getItem //
|
|
|
|
|
|
//-----------------------------------------------
|
|
// loadTyp :
|
|
// Get Some information from 'typ' files.
|
|
//-----------------------------------------------
|
|
void CSheetManager::loadTyp()
|
|
{
|
|
// Read the Eyes Color 'typ'
|
|
NLMISC::CSmartPtr<NLGEORGES::UType> smartPtr = FormLoader->loadFormType("_creature_3d_eyes_color.typ");
|
|
if(smartPtr)
|
|
{
|
|
string maxStr = smartPtr->getMax();
|
|
fromString(maxStr, _NbEyesColor);
|
|
if(_NbEyesColor <= 0)
|
|
nlwarning("CSheetManager::loadTyp: There no is Color available for the eyes.");
|
|
}
|
|
else
|
|
nlwarning("CSheetManager::loadTyp: Cannot load the '_creature_3d_eyes_color.typ' file.");
|
|
|
|
// Read the Hair Color 'typ'
|
|
smartPtr = FormLoader->loadFormType("_creature_3d_hair_color.typ");
|
|
if(smartPtr)
|
|
{
|
|
string maxStr = smartPtr->getMax();
|
|
fromString(maxStr, _NbHairColor);
|
|
if(_NbHairColor <= 0)
|
|
nlwarning("CSheetManager::loadTyp: There is no Color available for the hair.");
|
|
}
|
|
else
|
|
nlwarning("CSheetManager::loadTyp: Cannot load the '_creature_3d_hair_color.typ' file.");
|
|
}// initTyp //
|
|
|
|
|
|
// ***************************************************************************
|
|
void CSheetManager::dumpVisualSlots()
|
|
{
|
|
for(uint k = 0; k < _VisualSlots.size(); ++k)
|
|
{
|
|
TItemVector &iv = _VisualSlots[k];
|
|
for(uint l = 0; l < iv.size(); ++l)
|
|
{
|
|
if (iv[l])
|
|
{
|
|
nlinfo("Slot %d, item %d = %s", (int) k, (int) l, iv[l]->Id.toString().c_str());
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
// ***************************************************************************
|
|
void CSheetManager::dumpVisualSlotsIndex()
|
|
{
|
|
FILE * vsIndexFile = fopen(std::string(getLogDirectory() + "vs_index.txt").c_str(),"w");
|
|
if( vsIndexFile )
|
|
{
|
|
for (uint i=0; i < SLOTTYPE::NB_SLOT; ++i)
|
|
{
|
|
fprintf(vsIndexFile,"VISUAL SLOT : %d\n", i);
|
|
TItemVector &rVTmp = _VisualSlots[i];
|
|
for (uint j = 0; j < rVTmp.size(); ++j)
|
|
{
|
|
CItemSheet *pIS = rVTmp[j];
|
|
if (pIS != NULL)
|
|
{
|
|
fprintf(vsIndexFile,"%d : %s\n", j, pIS->Id.toString().c_str());
|
|
}
|
|
//nlSleep(100);
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
nlwarning("<CSheetManager::loadAllSheet> Can't open file to dump VS index");
|
|
}
|
|
fclose(vsIndexFile);
|
|
}
|