1
0
mirror of https://github.com/vcmi/vcmi.git synced 2025-06-17 00:07:41 +02:00

Large rewrite of adventure map objects:

- replaced CDefObjInfo with ObjectTemplate class
- ObjectTempate is a direct member of objects instead of pointer with
shared ownership across CMap, handler and game objects
- simplified handling of objects that can change appearance (e.g. towns)
- all object queries regarding object appearance/blockmaps use h3m pos
instead of relative positions
- removed need of modhandler::reload
- cleanup of some old code
This commit is contained in:
Ivan Savenko
2014-01-02 23:48:38 +00:00
parent 2b9e074d54
commit 2c4c964a45
27 changed files with 729 additions and 672 deletions

View File

@ -789,91 +789,4 @@ void CModHandler::afterLoad()
std::ofstream file(*CResourceHandler::get()->getResourceName(ResourceID("config/modSettings.json")), std::ofstream::trunc);
file << modSettings;
reload();
}
void CModHandler::reload()
{
{
//recreate adventure map defs
assert(!VLC->dobjinfo->gobjs[Obj::MONSTER].empty()); //make sure that at least some def info was found
const CGDefInfo * baseInfo = VLC->dobjinfo->gobjs[Obj::MONSTER].begin()->second;
for(auto & crea : VLC->creh->creatures)
{
if (!vstd::contains(VLC->dobjinfo->gobjs[Obj::MONSTER], crea->idNumber)) // no obj info for this type
{
auto info = new CGDefInfo(*baseInfo);
info->subid = crea->idNumber;
info->name = crea->advMapDef;
VLC->dobjinfo->gobjs[Obj::MONSTER][crea->idNumber] = info;
}
}
}
{
assert(!VLC->dobjinfo->gobjs[Obj::ARTIFACT].empty());
const CGDefInfo * baseInfo = VLC->dobjinfo->gobjs[Obj::ARTIFACT].begin()->second;
for(auto & art : VLC->arth->artifacts)
{
if (!vstd::contains(VLC->dobjinfo->gobjs[Obj::ARTIFACT], art->id)) // no obj info for this type
{
auto info = new CGDefInfo(*baseInfo);
info->subid = art->id;
info->name = art->advMapDef;
VLC->dobjinfo->gobjs[Obj::ARTIFACT][art->id] = info;
}
}
}
{
assert(!VLC->dobjinfo->gobjs[Obj::TOWN].empty()); //make sure that at least some def info was found
const CGDefInfo * baseInfo = VLC->dobjinfo->gobjs[Obj::TOWN].begin()->second;
auto & townInfos = VLC->dobjinfo->gobjs[Obj::TOWN];
for(auto & faction : VLC->townh->factions)
{
TFaction index = faction->index;
CTown * town = faction->town;
if (town)
{
auto & cientInfo = town->clientInfo;
if (!vstd::contains(VLC->dobjinfo->gobjs[Obj::TOWN], index)) // no obj info for this type
{
auto info = new CGDefInfo(*baseInfo);
info->subid = index;
townInfos[index] = info;
}
townInfos[index]->name = cientInfo.advMapCastle;
VLC->dobjinfo->villages[index] = new CGDefInfo(*townInfos[index]);
VLC->dobjinfo->villages[index]->name = cientInfo.advMapVillage;
VLC->dobjinfo->capitols[index] = new CGDefInfo(*townInfos[index]);
VLC->dobjinfo->capitols[index]->name = cientInfo.advMapCapitol;
for (int i = 0; i < town->dwellings.size(); ++i)
{
const CGDefInfo * baseInfo = VLC->dobjinfo->gobjs[Obj::CREATURE_GENERATOR1][i]; //get same blockmap as first dwelling of tier i
for (auto cre : town->creatures[i]) //both unupgraded and upgraded get same dwelling
{
auto info = new CGDefInfo(*baseInfo);
info->subid = cre;
info->name = town->dwellings[i];
VLC->dobjinfo->gobjs[Obj::CREATURE_GENERATOR1][cre] = info;
VLC->objh->cregens[cre] = cre; //map of dwelling -> creature id
}
}
}
}
}
}