mirror of
https://github.com/vcmi/vcmi.git
synced 2024-11-24 08:32:34 +02:00
Fixed crash on town time event (-1 and -2 "structures" present on buildings list).
This commit is contained in:
parent
77be397bf6
commit
4c3ed24fe1
@ -363,6 +363,7 @@ CBattleCallback::CBattleCallback(CGameState *GS, int Player, CClient *C )
|
||||
|
||||
bool CBattleCallback::battleMakeTacticAction( BattleAction * action )
|
||||
{
|
||||
assert(cl->gs->curB->tacticDistance);
|
||||
MakeAction ma;
|
||||
ma.ba = *action;
|
||||
sendRequest(&ma);
|
||||
|
@ -1334,7 +1334,6 @@ void CPlayerInterface::showShipyardDialog(const IShipyard *obj)
|
||||
void CPlayerInterface::newObject( const CGObjectInstance * obj )
|
||||
{
|
||||
boost::unique_lock<boost::recursive_mutex> un(*pim);
|
||||
CGI->mh->printObject(obj);
|
||||
//we might have built a boat in shipyard in opened town screen
|
||||
if(obj->ID == 8
|
||||
&& LOCPLINT->castleInt
|
||||
|
@ -161,6 +161,7 @@ public:
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
friend class CCallback; //handling players actions
|
||||
friend class CBattleCallback; //handling players actions
|
||||
friend void processCommand(const std::string &message, CClient *&client); //handling console
|
||||
|
||||
void handlePack( CPack * pack ); //applies the given pack and deletes it
|
||||
|
@ -864,7 +864,8 @@ void NewObject::applyCl(CClient *cl)
|
||||
cl->updatePaths();
|
||||
|
||||
const CGObjectInstance *obj = cl->getObj(id);
|
||||
//notify interfaces about move
|
||||
CGI->mh->printObject(obj);
|
||||
|
||||
for(std::map<ui8, CGameInterface*>::iterator i=cl->playerint.begin();i!=cl->playerint.end();i++)
|
||||
{
|
||||
//TODO: check if any covered tile is visible
|
||||
|
@ -68,7 +68,7 @@ public:
|
||||
//void getParents(TCNodes &out, const CBonusSystemNode *root /*= NULL*/) const;
|
||||
|
||||
template<typename RanGen>
|
||||
int getRandomAmount(RanGen &ranGen)
|
||||
int getRandomAmount(RanGen &ranGen) const
|
||||
{
|
||||
if(ammMax == ammMin)
|
||||
return ammMax;
|
||||
|
@ -1466,16 +1466,19 @@ void CGameState::init( StartInfo * si, ui32 checksum, int Seed )
|
||||
}
|
||||
}
|
||||
|
||||
for (std::list<CCastleEvent*>::iterator ev=vti->events.begin(); ev!=vti->events.end(); ev++)
|
||||
//town events
|
||||
BOOST_FOREACH(CCastleEvent *ev, vti->events)
|
||||
{
|
||||
for (int i = 0; i<CREATURES_PER_TOWN; i++)
|
||||
if (vstd::contains((*ev)->buildings,(-31-i))) //if we have horde for this level
|
||||
if (vstd::contains(ev->buildings,(-31-i))) //if we have horde for this level
|
||||
{
|
||||
(*ev)->buildings.erase(-31-i);
|
||||
ev->buildings.erase(-31-i);
|
||||
if (vti->town->hordeLvl[0] == i)
|
||||
(*ev)->buildings.insert(18);
|
||||
ev->buildings.insert(18);
|
||||
if (vti->town->hordeLvl[1] == i)
|
||||
(*ev)->buildings.insert(24);
|
||||
ev->buildings.insert(24);
|
||||
}
|
||||
}
|
||||
//init spells
|
||||
vti->spells.resize(SPELL_LEVELS);
|
||||
CSpell *s;
|
||||
|
13
lib/map.cpp
13
lib/map.cpp
@ -24,7 +24,7 @@
|
||||
*
|
||||
*/
|
||||
|
||||
static std::set<si32> convertBuildings(const std::set<si32> h3m, int castleID)
|
||||
static std::set<si32> convertBuildings(const std::set<si32> h3m, int castleID, bool addAuxiliary = true)
|
||||
{
|
||||
std::map<int,int> mapa;
|
||||
std::set<si32> ret;
|
||||
@ -51,9 +51,12 @@ static std::set<si32> convertBuildings(const std::set<si32> h3m, int castleID)
|
||||
}
|
||||
}
|
||||
|
||||
ret.insert(10); //village hall is always present
|
||||
ret.insert(-1); //houses near v.hall / eyecandies
|
||||
ret.insert(-2); //terrain eyecandy, if -1 is used
|
||||
if(addAuxiliary)
|
||||
{
|
||||
ret.insert(10); //village hall is always present
|
||||
ret.insert(-1); //houses near v.hall / eyecandies
|
||||
ret.insert(-2); //terrain eyecandy, if -1 is used
|
||||
}
|
||||
|
||||
if(ret.find(11)!=ret.end())
|
||||
ret.insert(27);
|
||||
@ -752,7 +755,7 @@ void Mapa::loadTown( CGObjectInstance * &nobj, const unsigned char * bufor, int
|
||||
nce->buildings.insert(byte*8+bit);
|
||||
i++;
|
||||
}
|
||||
nce->buildings = convertBuildings(nce->buildings,subid);
|
||||
nce->buildings = convertBuildings(nce->buildings,subid, false);
|
||||
|
||||
nce->creatures.resize(7);
|
||||
for(int vv=0; vv<7; ++vv)
|
||||
|
@ -1049,10 +1049,13 @@ void CGameHandler::newTurn()
|
||||
getFreeTiles(tiles);
|
||||
ui32 amount = (tiles.size()) >> 6;
|
||||
std::random_shuffle(tiles.begin(), tiles.end(), p_myrandom);
|
||||
tlog5 << "Spawning wandering monsters. Found " << tiles.size() << " free tiles. Creature type: " << n.creatureid << std::endl;
|
||||
const CCreature *cre = VLC->creh->creatures[n.creatureid];
|
||||
for (int i = 0; i < amount; ++i)
|
||||
{
|
||||
tile = tiles.begin();
|
||||
putNewMonster(n.creatureid, VLC->creh->creatures[n.creatureid]->getRandomAmount(std::rand), *tile);
|
||||
tlog5 << "\tSpawning monster at " << *tile << std::endl;
|
||||
putNewMonster(n.creatureid, cre->getRandomAmount(std::rand), *tile);
|
||||
tiles.erase(tile); //not use it again
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user