1
0
mirror of https://github.com/vcmi/vcmi.git synced 2025-03-25 21:38:59 +02:00

Fixed crashes when VCAI cannot find hero to recruit.

Bumped format version.
This commit is contained in:
Michał W. Urbańczyk 2013-02-09 17:37:38 +00:00
parent d03dbf64a6
commit e31f5062f9
4 changed files with 11 additions and 6 deletions

View File

@ -1882,9 +1882,8 @@ void VCAI::tryRealize(CGoal g)
{
if(const CGTownInstance *t = findTownWithTavern())
{
//TODO co jesli nie ma dostepnego bohatera?
recruitHero(t, true);
//TODO jezeli miasto jest zablokowane, sprobowac oczyscic wejscie
cb->recruitHero(t, cb->getAvailableHeroes(t)[0]);
}
//TODO karkolomna alternatywa - tawerna na mapie przygod lub wiezienie (nie wiem, czy warto?)
@ -2505,10 +2504,14 @@ void VCAI::checkHeroArmy (HeroPtr h)
}
}
void VCAI::recruitHero(const CGTownInstance * t)
void VCAI::recruitHero(const CGTownInstance * t, bool throwing)
{
BNLOG("Trying to recruit a hero in %s at %s", t->name % t->visitablePos())
cb->recruitHero(t, cb->getAvailableHeroes(t).front());
if(auto availableHero = frontOrNull(cb->getAvailableHeroes(t)))
cb->recruitHero(t, availableHero);
else if(throwing)
throw cannotFulfillGoalException("No available heroes in tavern in " + t->nodeName());
}
void VCAI::finish()

View File

@ -359,7 +359,7 @@ public:
bool fulfillsGoal (CGoal &goal, CGoal &mainGoal);
bool fulfillsGoal (CGoal &goal, const CGoal &mainGoal); //TODO: something smarter
void recruitHero(const CGTownInstance * t);
void recruitHero(const CGTownInstance * t, bool throwing = false);
std::vector<const CGObjectInstance *> getPossibleDestinations(HeroPtr h);
void buildStructure(const CGTownInstance * t);
//void recruitCreatures(const CGTownInstance * t);

View File

@ -251,6 +251,8 @@ void CCallback::setSelection(const CArmedInstance * obj)
void CCallback::recruitHero(const CGObjectInstance *townOrTavern, const CGHeroInstance *hero)
{
assert(townOrTavern);
assert(hero);
ui8 i=0;
for(; i<gs->players[player].availableHeroes.size(); i++)
{

View File

@ -34,7 +34,7 @@
#include "CObjectHandler.h" //for CArmedInstance
#include "Mapping/CCampaignHandler.h" //for CCampaignState
const ui32 version = 735;
const ui32 version = 737;
const TSlot COMMANDER_SLOT_PLACEHOLDER = -2;
class CConnection;