mirror of
https://github.com/vcmi/vcmi.git
synced 2025-11-06 09:09:40 +02:00
Fixed crash on town time event (-1 and -2 "structures" present on buildings list).
This commit is contained in:
@@ -363,6 +363,7 @@ CBattleCallback::CBattleCallback(CGameState *GS, int Player, CClient *C )
|
|||||||
|
|
||||||
bool CBattleCallback::battleMakeTacticAction( BattleAction * action )
|
bool CBattleCallback::battleMakeTacticAction( BattleAction * action )
|
||||||
{
|
{
|
||||||
|
assert(cl->gs->curB->tacticDistance);
|
||||||
MakeAction ma;
|
MakeAction ma;
|
||||||
ma.ba = *action;
|
ma.ba = *action;
|
||||||
sendRequest(&ma);
|
sendRequest(&ma);
|
||||||
|
|||||||
@@ -1334,7 +1334,6 @@ void CPlayerInterface::showShipyardDialog(const IShipyard *obj)
|
|||||||
void CPlayerInterface::newObject( const CGObjectInstance * obj )
|
void CPlayerInterface::newObject( const CGObjectInstance * obj )
|
||||||
{
|
{
|
||||||
boost::unique_lock<boost::recursive_mutex> un(*pim);
|
boost::unique_lock<boost::recursive_mutex> un(*pim);
|
||||||
CGI->mh->printObject(obj);
|
|
||||||
//we might have built a boat in shipyard in opened town screen
|
//we might have built a boat in shipyard in opened town screen
|
||||||
if(obj->ID == 8
|
if(obj->ID == 8
|
||||||
&& LOCPLINT->castleInt
|
&& LOCPLINT->castleInt
|
||||||
|
|||||||
@@ -161,6 +161,7 @@ public:
|
|||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////
|
||||||
friend class CCallback; //handling players actions
|
friend class CCallback; //handling players actions
|
||||||
|
friend class CBattleCallback; //handling players actions
|
||||||
friend void processCommand(const std::string &message, CClient *&client); //handling console
|
friend void processCommand(const std::string &message, CClient *&client); //handling console
|
||||||
|
|
||||||
void handlePack( CPack * pack ); //applies the given pack and deletes it
|
void handlePack( CPack * pack ); //applies the given pack and deletes it
|
||||||
|
|||||||
@@ -864,7 +864,8 @@ void NewObject::applyCl(CClient *cl)
|
|||||||
cl->updatePaths();
|
cl->updatePaths();
|
||||||
|
|
||||||
const CGObjectInstance *obj = cl->getObj(id);
|
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++)
|
for(std::map<ui8, CGameInterface*>::iterator i=cl->playerint.begin();i!=cl->playerint.end();i++)
|
||||||
{
|
{
|
||||||
//TODO: check if any covered tile is visible
|
//TODO: check if any covered tile is visible
|
||||||
|
|||||||
@@ -68,7 +68,7 @@ public:
|
|||||||
//void getParents(TCNodes &out, const CBonusSystemNode *root /*= NULL*/) const;
|
//void getParents(TCNodes &out, const CBonusSystemNode *root /*= NULL*/) const;
|
||||||
|
|
||||||
template<typename RanGen>
|
template<typename RanGen>
|
||||||
int getRandomAmount(RanGen &ranGen)
|
int getRandomAmount(RanGen &ranGen) const
|
||||||
{
|
{
|
||||||
if(ammMax == ammMin)
|
if(ammMax == ammMin)
|
||||||
return ammMax;
|
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++)
|
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)
|
if (vti->town->hordeLvl[0] == i)
|
||||||
(*ev)->buildings.insert(18);
|
ev->buildings.insert(18);
|
||||||
if (vti->town->hordeLvl[1] == i)
|
if (vti->town->hordeLvl[1] == i)
|
||||||
(*ev)->buildings.insert(24);
|
ev->buildings.insert(24);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
//init spells
|
//init spells
|
||||||
vti->spells.resize(SPELL_LEVELS);
|
vti->spells.resize(SPELL_LEVELS);
|
||||||
CSpell *s;
|
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::map<int,int> mapa;
|
||||||
std::set<si32> ret;
|
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
|
if(addAuxiliary)
|
||||||
ret.insert(-1); //houses near v.hall / eyecandies
|
{
|
||||||
ret.insert(-2); //terrain eyecandy, if -1 is used
|
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())
|
if(ret.find(11)!=ret.end())
|
||||||
ret.insert(27);
|
ret.insert(27);
|
||||||
@@ -752,7 +755,7 @@ void Mapa::loadTown( CGObjectInstance * &nobj, const unsigned char * bufor, int
|
|||||||
nce->buildings.insert(byte*8+bit);
|
nce->buildings.insert(byte*8+bit);
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
nce->buildings = convertBuildings(nce->buildings,subid);
|
nce->buildings = convertBuildings(nce->buildings,subid, false);
|
||||||
|
|
||||||
nce->creatures.resize(7);
|
nce->creatures.resize(7);
|
||||||
for(int vv=0; vv<7; ++vv)
|
for(int vv=0; vv<7; ++vv)
|
||||||
|
|||||||
@@ -1049,10 +1049,13 @@ void CGameHandler::newTurn()
|
|||||||
getFreeTiles(tiles);
|
getFreeTiles(tiles);
|
||||||
ui32 amount = (tiles.size()) >> 6;
|
ui32 amount = (tiles.size()) >> 6;
|
||||||
std::random_shuffle(tiles.begin(), tiles.end(), p_myrandom);
|
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)
|
for (int i = 0; i < amount; ++i)
|
||||||
{
|
{
|
||||||
tile = tiles.begin();
|
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
|
tiles.erase(tile); //not use it again
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user