From 9cbc1f10584f8ce167e702a5dbbd44eb849725b6 Mon Sep 17 00:00:00 2001 From: Ivan Savenko Date: Tue, 7 Aug 2012 21:46:24 +0000 Subject: [PATCH] - merged basicCreatures and upgradedCreatures into single array - missing fix for savegames --- AI/VCAI/VCAI.cpp | 5 ++- client/CCastleInterface.cpp | 2 +- client/CPreGame.cpp | 2 +- client/NetPacksClient.cpp | 4 +- config/buildings.json | 30 +++++--------- lib/CBuildingHandler.cpp | 4 +- lib/CGameState.cpp | 2 +- lib/CObjectHandler.cpp | 29 ++++++++------ lib/CObjectHandler.h | 2 +- lib/CTownHandler.cpp | 27 +++++-------- lib/CTownHandler.h | 5 +-- lib/Filesystem/CFileInfo.cpp | 1 - server/CGameHandler.cpp | 78 +++++++++++++++--------------------- 13 files changed, 84 insertions(+), 107 deletions(-) diff --git a/AI/VCAI/VCAI.cpp b/AI/VCAI/VCAI.cpp index 5a453047a..61114fc7d 100644 --- a/AI/VCAI/VCAI.cpp +++ b/AI/VCAI/VCAI.cpp @@ -2975,7 +2975,10 @@ TSubgoal CGoal::whatToDoToAchieve() auto creature = VLC->creh->creatures[objid]; if (t->subID == creature->faction) //TODO: how to force AI to build unupgraded creatures? :O { - int bid = t->creatureDwelling(creature->level); + auto creatures = t->town->creatures[creature->level]; + int upgradeNumber = std::find(creatures.begin(), creatures.end(), creature->idNumber) - creatures.begin(); + + int bid = EBuilding::DWELL_FIRST + creature->level + upgradeNumber * GameConstants::CREATURES_PER_TOWN; if (t->hasBuilt(bid)) //this assumes only creatures with dwellings are assigned to faction { dwellings.push_back(t); diff --git a/client/CCastleInterface.cpp b/client/CCastleInterface.cpp index eadba837b..2630d182b 100644 --- a/client/CCastleInterface.cpp +++ b/client/CCastleInterface.cpp @@ -1591,7 +1591,7 @@ CFortScreen::RecruitArea::RecruitArea(int posX, int posY, const CGTownInstance * if (!town->creatures[level].second.empty()) creature = CGI->creh->creatures[town->creatures[level].second.back()]; else - creature = CGI->creh->creatures[town->town->basicCreatures[level]]; + creature = CGI->creh->creatures[town->town->creatures[level][0]]; hoverText = boost::str(boost::format(CGI->generaltexth->tcommands[21]) % creature->namePl); creatureAnim = new CCreaturePic(159, 4, creature, false); diff --git a/client/CPreGame.cpp b/client/CPreGame.cpp index 10509d8fe..1a6894189 100644 --- a/client/CPreGame.cpp +++ b/client/CPreGame.cpp @@ -2521,7 +2521,7 @@ void OptionsTab::SelectedBox::clickRight( tribool down, bool previousState ) int x = 60, y = 159; for(int i = 0; i < 7; i++) { - int c = t.basicCreatures[i]; + int c = t.creatures[i][0]; blitAt(graphics->smallImgs[c], x, y, bmp); CSDL_Ext::printAtMiddleWB(CGI->creh->creatures[c]->nameSing, x + 16, y + 45, FONT_TINY, 10, Colors::Cornsilk, bmp); diff --git a/client/NetPacksClient.cpp b/client/NetPacksClient.cpp index 1f9195f79..4b279b984 100644 --- a/client/NetPacksClient.cpp +++ b/client/NetPacksClient.cpp @@ -761,10 +761,12 @@ void YourTurn::applyCl( CClient *cl ) void SaveGame::applyCl(CClient *cl) { - tlog1 << "Saving to " << fname << "\n"; CFileInfo info(fname); CResourceHandler::get()->createResource(info.getStem() + ".vcgm1"); + //FIXME: Workaround for a file that was created by server and in future should be used only by server + CResourceHandler::get()->createResource(info.getStem() + ".vlgm1"); + try { CSaveFile save(CResourceHandler::get()->getResourceName(ResourceID(info.getStem(), EResType::CLIENT_SAVEGAME))); diff --git a/config/buildings.json b/config/buildings.json index 05ed15e0b..44aaaccbe 100644 --- a/config/buildings.json +++ b/config/buildings.json @@ -22,8 +22,7 @@ "properties" : { "blit_order" : { "type" : "array", "items" : {"type":"number"}, "default" :[] }, - "creatures_basic" : { "type" : "array", "items" : {"type":"number"} }, - "creatures_upgraded" :{ "type" : "array", "items" : {"type":"number"} }, + "creatures" : { "type" : "array", "items" : { "type" : "array", "items" : {"type":"number"} } }, "horde" : { "type" : "array", "items" : {"type":"number", "default" : -1} }, "primary_resource" : { "type" : "number", "default" : 127}, "mage_guild" : { "type" : "number", "default" : 5}, @@ -132,8 +131,7 @@ { "id" : 20, "defname" : "TBCSBOAT.def", "x" : 478, "y" : 134, "border" : "TOCSDKMN.bmp", "area" : "TZCSDKMN.bmp" } ], "blit_order" : [ 0, 1, 2, 3, 10, 11, 12, 13, 5, 22, 30, 37, 16, 6, 20, 18, 19, 34, 41 ], - "creatures_basic" : [ 0, 2, 4, 6, 8, 10, 12, 150 ], - "creatures_upgraded" : [ 1, 3, 5, 7, 9, 11, 13 ], + "creatures" : [ [0, 1], [2, 3], [4, 5], [6, 7], [8, 9], [10, 11], [12, 13] ], "horde" : [ 2, null ], "mage_guild" : 4, "war_machine" : 4, @@ -221,8 +219,7 @@ { "id" : 11, "defname" : "TBRMHAL2.def", "x" : 538, "y" : 187, "border" : "TORHAL2.bmp", "area" : "TZRHAL2.bmp" } ], "blit_order" : [ 33, 40, 35, 42, 16, 32, 39, 0, 1, 2, 3, 4, 31, 18, 38, 19, 34, 24, 41, 25, 5, 30, 37, 14, 10, 11, 12, 13, 17, 21, 22, -1, 27, 28, 29, 15 ], - "creatures_basic" : [ 14, 16, 18, 20, 22, 24, 26, 151 ], - "creatures_upgraded" : [ 15, 17, 19, 21, 23, 25, 27 ], + "creatures" : [ [14, 15], [16, 17], [18, 19], [20, 21], [22, 23], [24, 25], [26, 27] ], "horde" : [ 1, 4 ], "mage_guild" : 5, "primary_resource" : 4, @@ -306,8 +303,7 @@ { "id" : 8, "defname" : "TBTWCAS2.def", "x" : 301, "y" : 0, "border" : "TOTCAS2.bmp", "area" : "TZTCAS2.bmp" } ], "blit_order" : [ 36, 43, 32, 39, 10, 11, 12, 13, 32, 35, 42, 15, 5, 18, 19 ], - "creatures_basic" : [ 28, 30, 32, 34, 36, 38, 40, 152 ], - "creatures_upgraded" : [ 29, 31, 33, 35, 37, 39, 41 ], + "creatures" : [ [28, 29], [30, 31], [32, 33], [34, 35], [36, 37], [38, 39], [40, 41] ], "horde" : [ 1, null ], "primary_resource" : 5, "war_machine" : 5, @@ -391,8 +387,7 @@ { "id" : 8, "defname" : "TBINCAS2.def", "x" : 222, "y" : 44, "border" : "TOICAS1A.bmp", "area" : "TZICAS1A.bmp" } ], "blit_order" : [ 26, 21, 7, 8, 9, 22, 31, 38, 36, 43, 10, 11, 12, 13, 5, 32, 39, 24, 25, 33, 40, 34, 41, 30, 37, 18, 19, 14, 15, 16, 35, 42 ], - "creatures_basic" : [ 42, 44, 46, 48, 50, 52, 54, 153 ], - "creatures_upgraded" : [ 43, 45, 47, 49, 51, 53, 55 ], + "creatures" : [ [42, 43], [44, 45], [46, 47], [48, 49], [50, 51], [52, 53], [54, 55] ], "horde" : [ 0, 2 ], "primary_resource" : 1, "war_machine" : 5, @@ -481,8 +476,7 @@ { "id" : 20, "defname" : "TBNCBOAT.def", "x" : 617, "y" : 265, "border" : "TONSHPNA.bmp", "area" : "TZNSHPNA.bmp" } ], "blit_order" : [ 17, 0, 1, 2, 3, 4, 7, 8, 9, 32, 39, 26, 15, 14, 34, 41, 16, 5, 33, 40, 31, 38, 6, 30, 18, 37, 19, 22, 20 ], - "creatures_basic" : [ 56, 58, 60, 62, 64, 66, 68, 154 ], - "creatures_upgraded" : [ 57, 59, 61, 63, 65, 67, 69 ], + "creatures" : [ [56, 57], [58, 59], [60, 61], [62, 63], [64, 65], [66, 67], [68, 69] ], "horde" : [ 0, null ], "war_machine" : 6, @@ -564,8 +558,7 @@ { "id" : 8, "defname" : "TBDNCAS2.def", "x" : 363, "y" : 87, "border" : "TODCAS2.bmp", "area" : "TZDCAS2.bmp" } ], "blit_order" : [ 0, 1, 2, 3, 4, 21, 35, 42, 5, 30, 18, 37, 19, 32, 39, 26, 7, 8, 9, 23 ], - "creatures_basic" : [ 70, 72, 74, 76, 78, 80, 82, 155 ], - "creatures_upgraded" : [ 71, 73, 75, 77, 79, 81, 83 ], + "creatures" : [ [70, 71], [72, 73], [74, 75], [76, 77], [78, 79], [80, 81], [82, 83] ], "horde" : [ 0, null ], "primary_resource" : 3, "war_machine" : 4, @@ -645,8 +638,7 @@ { "id" : 16, "defname" : "TBSTBLAK.def", "x" : 660, "y" : 286, "border" : "TOSBLK1.bmp", "area" : "TZSBLK1.bmp" } ], "blit_order" : [ 33, 40, 30, 18, 37, 19, 31, 38, 23, 26, 5, 32, 39, 15, 14, 21, 16, 22 ], - "creatures_basic" : [ 84, 86, 88, 90, 92, 94, 96, 156 ], - "creatures_upgraded" : [ 85, 87, 89, 91, 93, 95, 97 ], + "creatures" : [ [84, 85], [86, 87], [88, 89], [90, 91], [92, 93], [94, 95], [96, 97] ], "horde" : [ 0, null ], "mage_guild" : 3, "war_machine" : 5, @@ -730,8 +722,7 @@ { "id" : 20, "defname" : "TBFRBOAT.def", "x" : 197, "y" : 294, "border" : "TOFDCK1.bmp", "area" : "TZFDCK1.bmp" } ], "blit_order" : [ 16, 15, 14, 34, 41, 31, 38, 10, 11, 12, 13, 29, 0, 1, 2, 33, 40, 30, 18, 37, 19, 5, 36, 43, 26 ], - "creatures_basic" : [ 98, 100, 104, 106, 102, 108, 110, 157 ], - "creatures_upgraded" : [ 99, 101, 105, 107, 103, 109, 111 ], + "creatures" : [ [98, 99], [100, 101], [102, 103], [104, 105], [106, 107], [108, 109], [110, 111] ], "horde" : [ 0, null ], "mage_guild" : 3, "war_machine" : 6, @@ -818,8 +809,7 @@ { "id" : 20, "defname" : "TBELBOAT.def", "x" : 239, "y" : 215, "border" : "TOELBOAT.bmp", "area" : "TZELBOAT.bmp" } ], "blit_order" : [ -1, 27, 28, 16, 34, 41, 6, 20, 33, 40, 36, 43, 21, 0, 1, 2, 3, 4, 5, 15, 14, 17, 35, 42, 30, 18, 37, 19, 10, 11, 12, 13, 29 ], - "creatures_basic" : [ 118, 112, 115, 114, 113, 120, 130, 158 ], - "creatures_upgraded" : [ 119, 127, 123, 129, 125, 121, 131 ], + "creatures" : [ [118, 119], [112, 127], [115, 123], [114, 129], [113, 125], [120, 121], [130, 131] ], "horde" : [ 0, null ], "primary_resource" : 1, "war_machine" : 4, diff --git a/lib/CBuildingHandler.cpp b/lib/CBuildingHandler.cpp index 8334eff79..2d0f0a5f4 100644 --- a/lib/CBuildingHandler.cpp +++ b/lib/CBuildingHandler.cpp @@ -89,12 +89,14 @@ void CBuildingHandler::loadBuildings() { temp = readTo(buf,it,'\n');//read blank line temp = readTo(buf,it,'\n');// and faction name - for(int bg = 0; bg<14; bg++) + for(int bg = 0; ; bg++) { CBuilding *nb = readBg(buf,it); nb->tid = i; nb->bid = bg+30; buildings[i][bg+30] = nb; + if (it >= buf.size() || buf[it] == '\t') //read till empty line + break; } } /////done reading BUILDING.TXT***************************** diff --git a/lib/CGameState.cpp b/lib/CGameState.cpp index b74b6989c..e8cc367a2 100644 --- a/lib/CGameState.cpp +++ b/lib/CGameState.cpp @@ -589,7 +589,7 @@ std::pair CGameState::pickObject (CGObjectInstance *obj) dwl->info = nullptr; std::pair result(-1, -1); - int cid = VLC->townh->towns[faction].basicCreatures[level]; + int cid = VLC->townh->towns[faction].creatures[level][0]; //golem factory is not in list of cregens but can be placed as random object static const int factoryCreatures[] = {32, 33, 116, 117}; diff --git a/lib/CObjectHandler.cpp b/lib/CObjectHandler.cpp index fb73dcfaf..217a14e12 100644 --- a/lib/CObjectHandler.cpp +++ b/lib/CObjectHandler.cpp @@ -1889,11 +1889,16 @@ int CGTownInstance::mageGuildLevel() const return 1; return 0; } -bool CGTownInstance::creatureDwelling(const int & level, bool upgraded) const + +int CGTownInstance::creatureDwellingLevel(int dwelling) const { - if ( level<0 || level >= GameConstants::CREATURES_PER_TOWN ) - return false; - return vstd::contains(builtBuildings, 30+level+upgraded*GameConstants::CREATURES_PER_TOWN); + if ( dwelling<0 || dwelling >= GameConstants::CREATURES_PER_TOWN ) + return -1; + for (int i=0; ; i++) + { + if (!vstd::contains(builtBuildings, 30+dwelling+i*GameConstants::CREATURES_PER_TOWN)) + return i-1; + } } int CGTownInstance::getHordeLevel(const int & HID) const//HID - 0 or 1; returns creature level or -1 if that horde structure is not present { @@ -2075,10 +2080,10 @@ void CGTownInstance::initObj() creatures.resize(GameConstants::CREATURES_PER_TOWN); for (int i = 0; i < GameConstants::CREATURES_PER_TOWN; i++) { - if(creatureDwelling(i,false)) - creatures[i].second.push_back(town->basicCreatures[i]); - if(creatureDwelling(i,true)) - creatures[i].second.push_back(town->upgradedCreatures[i]); + int dwellingLevel = creatureDwellingLevel(i); + int creaturesTotal = town->creatures[i].size(); + for (int j=0; j< std::min(dwellingLevel + 1, creaturesTotal); j++) + creatures[i].second.push_back(town->creatures[i][j]); } switch (subID) @@ -2149,7 +2154,7 @@ void CGTownInstance::newTurn() const if ((stacksCount() < GameConstants::ARMY_SIZE && rand()%100 < 25) || Slots().empty()) //add new stack { int i = rand() % std::min (GameConstants::ARMY_SIZE, cb->getDate(3)<<1); - TCreature c = town->basicCreatures[i]; + TCreature c = town->creatures[i][0]; TSlot n = -1; TQuantity count = creatureGrowth(i); @@ -2233,7 +2238,7 @@ void CGTownInstance::removeCapitols (ui8 owner) const int CGTownInstance::getBoatType() const { - const CCreature *c = VLC->creh->creatures[town->basicCreatures.front()]; + const CCreature *c = VLC->creh->creatures[town->creatures.front().front()]; if (c->isGood()) return 1; else if (c->isEvil()) @@ -6844,9 +6849,9 @@ void CArmedInstance::randomizeArmy(int type) if(randID > max) { if(randID % 2) - j->second->setType(VLC->townh->towns[type].basicCreatures[(randID-197) / 2 -1]); + j->second->setType(VLC->townh->towns[type].creatures[(randID-197) / 2 -1][0]); else - j->second->setType(VLC->townh->towns[type].upgradedCreatures[(randID-197) / 2 -1]); + j->second->setType(VLC->townh->towns[type].creatures[(randID-197) / 2 -1][1]); randID = -1; } diff --git a/lib/CObjectHandler.h b/lib/CObjectHandler.h index 822e839aa..5b73ef241 100644 --- a/lib/CObjectHandler.h +++ b/lib/CObjectHandler.h @@ -630,7 +630,7 @@ public: CGTownInstance::EFortLevel fortLevel() const; int hallLevel() const; // -1 - none, 0 - village, 1 - town, 2 - city, 3 - capitol int mageGuildLevel() const; // -1 - none, 0 - village, 1 - town, 2 - city, 3 - capitol - bool creatureDwelling(const int & level, bool upgraded=false) const; + int creatureDwellingLevel(int dwelling) const; int getHordeLevel(const int & HID) const; //HID - 0 or 1; returns creature level or -1 if that horde structure is not present int creatureGrowth(const int & level) const; GrowthInfo getGrowthInfo(int level) const; diff --git a/lib/CTownHandler.cpp b/lib/CTownHandler.cpp index 901aec00d..d312a2d33 100644 --- a/lib/CTownHandler.cpp +++ b/lib/CTownHandler.cpp @@ -40,12 +40,8 @@ void CTownHandler::loadStructures() towns.push_back(town); } - for(int x=0;x names; //names of the town instances - std::vector basicCreatures; //level (from 0) -> ID - std::vector upgradedCreatures; //level (from 0) -> ID + std::vector > creatures; //level (from 0) -> list of creatures on this tier std::map hordeLvl; //[0] - first horde building creature level; [1] - second horde building (-1 if not present) ui32 mageLevel; //max available mage guild level int bonus; //pic number @@ -39,7 +38,7 @@ public: template void serialize(Handler &h, const int version) { - h & names & basicCreatures & upgradedCreatures & hordeLvl & mageLevel & bonus + h & names & creatures & hordeLvl & mageLevel & bonus & primaryRes & warMachine & typeID; } }; diff --git a/lib/Filesystem/CFileInfo.cpp b/lib/Filesystem/CFileInfo.cpp index 79876c34a..e11fc413e 100644 --- a/lib/Filesystem/CFileInfo.cpp +++ b/lib/Filesystem/CFileInfo.cpp @@ -84,7 +84,6 @@ std::string CFileInfo::getBaseName() const return name.substr(begin, end - begin); } - EResType::Type CFileInfo::getType() const { return EResTypeHelper::getTypeFromExtension(getExtension()); diff --git a/server/CGameHandler.cpp b/server/CGameHandler.cpp index faf0f20fb..bafc249ba 100644 --- a/server/CGameHandler.cpp +++ b/server/CGameHandler.cpp @@ -1286,7 +1286,7 @@ void CGameHandler::newTurn() sac.creatures = t->creatures; for (int k=0; k < GameConstants::CREATURES_PER_TOWN; k++) //creature growths { - if(t->creatureDwelling(k))//there is dwelling (k-level) + if(t->creatureDwellingLevel(k) >= 0)//there is dwelling (k-level) { ui32 &availableCount = sac.creatures[k].first; const CCreature *cre = VLC->creh->creatures[t->creatures[k].second.back()]; @@ -2420,54 +2420,52 @@ bool CGameHandler::buildStructure( si32 tid, si32 bid, bool force /*=false*/ ) CGTownInstance * t = static_cast(gs->map->objects[tid].get()); CBuilding * b = VLC->buildh->buildings[t->subID][bid]; - if( !force && gs->canBuildStructure(t,bid) != 7) + if(!force) { - complain("Cannot build that building!"); - return false; - } + if (gs->canBuildStructure(t,bid) != 7) + COMPLAIN_RET("Cannot build that building!"); - if( !force && bid == 26) //grail - { - if(!t->visitingHero || !t->visitingHero->hasArt(2)) + if(bid == 26) //grail { - complain("Cannot build grail - hero doesn't have it"); - return false; + if(!t->visitingHero || !t->visitingHero->hasArt(2)) + COMPLAIN_RET("Cannot build grail - hero doesn't have it") + else + removeArtifact(ArtifactLocation(t->visitingHero, t->visitingHero->getArtPos(2, false))); } - - //remove grail - removeArtifact(ArtifactLocation(t->visitingHero, t->visitingHero->getArtPos(2, false))); } NewStructures ns; ns.tid = tid; + //we have upgr. dwelling, upgr. horde will be builded as well if ( (bid == 18) && (vstd::contains(t->builtBuildings,(t->town->hordeLvl[0]+37))) ) - ns.bid.insert(19);//we have upgr. dwelling, upgr. horde will be builded as well + ns.bid.insert(19); else if ( (bid == 24) && (vstd::contains(t->builtBuildings,(t->town->hordeLvl[1]+37))) ) ns.bid.insert(25); - else if(bid>36) //upg dwelling + + else if(bid >= EBuilding::DWELL_FIRST) //dwelling { - if ( (bid-37 == t->town->hordeLvl[0]) && (vstd::contains(t->builtBuildings,18)) ) - ns.bid.insert(19);//we have horde, will be upgraded as well as dwelling - if ( (bid-37 == t->town->hordeLvl[1]) && (vstd::contains(t->builtBuildings,24)) ) - ns.bid.insert(25); + int level = (bid - EBuilding::DWELL_FIRST) % GameConstants::CREATURES_PER_TOWN; + int upgradeNumber = (bid - EBuilding::DWELL_FIRST) / GameConstants::CREATURES_PER_TOWN; + + if (upgradeNumber >= t->town->creatures[level].size()) + COMPLAIN_RET("Cannot build dwelling: no creature found!"); + + CCreature * crea = VLC->creh->creatures[t->town->creatures[level][upgradeNumber]]; + + if (vstd::iswithin(bid, EBuilding::DWELL_UP_FIRST, EBuilding::DWELL_UP_LAST)) + { + if ( (bid-37 == t->town->hordeLvl[0]) && (vstd::contains(t->builtBuildings,18)) ) + ns.bid.insert(19);//we have horde, will be upgraded as well as dwelling + if ( (bid-37 == t->town->hordeLvl[1]) && (vstd::contains(t->builtBuildings,24)) ) + ns.bid.insert(25); + } SetAvailableCreatures ssi; ssi.tid = tid; ssi.creatures = t->creatures; - ssi.creatures[bid-37].second.push_back(t->town->upgradedCreatures[bid-37]); - //Test for 2nd upgrade - add sharpshooters if grand elves dwelling was constructed - //if (t->subID == 1 && bid == 39) - // ssi.creatures[bid-37].second.push_back(137); - sendAndApply(&ssi); - } - else if(bid >= 30) //bas. dwelling - { - int crid = t->town->basicCreatures[bid-30]; - SetAvailableCreatures ssi; - ssi.tid = tid; - ssi.creatures = t->creatures; - ssi.creatures[bid-30].first = VLC->creh->creatures[crid]->growth; - ssi.creatures[bid-30].second.push_back(crid); + if (bid <= EBuilding::DWELL_LAST) + ssi.creatures[level].first = crea->growth; + ssi.creatures[level].second.push_back(crea->idNumber); sendAndApply(&ssi); } else if(bid == 11) @@ -2476,18 +2474,6 @@ bool CGameHandler::buildStructure( si32 tid, si32 bid, bool force /*=false*/ ) ns.bid.insert(28); else if(bid == 13) ns.bid.insert(29); - else if (t->subID == 4 && bid == 17) //veil of darkness - { - //handled via town->reacreateBonuses in apply -// GiveBonus gb(GiveBonus::TOWN); -// gb.bonus.type = Bonus::DARKNESS; -// gb.bonus.val = 20; -// gb.id = t->id; -// gb.bonus.duration = Bonus::PERMANENT; -// gb.bonus.source = Bonus::TOWN_STRUCTURE; -// gb.bonus.id = 17; -// sendAndApply(&gb); - } else if ( t->subID == 5 && bid == 22 ) { setPortalDwelling(t); @@ -4709,7 +4695,7 @@ void CGameHandler::handleTownEvents(CGTownInstance * town, NewTurn &n, std::map< for(si32 i=0;icreatures.size();i++) //creature growths { - if(town->creatureDwelling(i) && ev->creatures[i])//there is dwelling + if(town->creatureDwellingLevel(i) >= 0 && ev->creatures[i])//there is dwelling { newCreas[town->id][i] += ev->creatures[i]; iw.components.push_back(Component(Component::CREATURE,