1
0
mirror of https://github.com/vcmi/vcmi.git synced 2025-06-23 00:28:08 +02:00

Workaround for hero & town issue. Game still crashes elsewhere, though.

This commit is contained in:
DjWarmonger
2014-07-01 12:07:53 +02:00
parent dc98f14884
commit bae9f2083f
4 changed files with 24 additions and 8 deletions

View File

@ -1899,6 +1899,13 @@ void CGameState::initVisitingAndGarrisonedHeroes()
} }
} }
} }
for (auto hero : map->heroesOnMap)
{
if (hero->visitedTown)
{
assert (hero->visitedTown->visitingHero == hero);
}
}
} }
BFieldType CGameState::battleGetBattlefieldType(int3 tile) BFieldType CGameState::battleGetBattlefieldType(int3 tile)

View File

@ -523,7 +523,14 @@ void CGTownInstance::onHeroVisit(const CGHeroInstance * h) const
void CGTownInstance::onHeroLeave(const CGHeroInstance * h) const void CGTownInstance::onHeroLeave(const CGHeroInstance * h) const
{ {
cb->stopHeroVisitCastle(this, h); //FIXME: find out why this issue appears on random maps
if (visitingHero == h)
{
cb->stopHeroVisitCastle(this, h);
logGlobal->warnStream() << h->name << " correctly left town " << name;
}
else
logGlobal->warnStream() << "Warning, " << h->name << " tries to leave the town " << name << " but hero is not inside.";
} }
std::string CGTownInstance::getObjectName() const std::string CGTownInstance::getObjectName() const

View File

@ -23,8 +23,8 @@ void CMapGenerator::foreach_neighbour(const int3 &pos, std::function<void(int3&
} }
CMapGenerator::CMapGenerator(shared_ptr<CMapGenOptions> mapGenOptions, int randomSeed /*= std::time(nullptr)*/) : CMapGenerator::CMapGenerator(shared_ptr<CMapGenOptions> mapGenOptions, int RandomSeed /*= std::time(nullptr)*/) :
mapGenOptions(mapGenOptions), randomSeed(randomSeed), monolithIndex(0) mapGenOptions(mapGenOptions), randomSeed(RandomSeed), monolithIndex(0)
{ {
rand.setSeed(randomSeed); rand.setSeed(randomSeed);
} }
@ -50,12 +50,13 @@ void CMapGenerator::initTiles()
CMapGenerator::~CMapGenerator() CMapGenerator::~CMapGenerator()
{ {
//FIXME: what if map is not present anymore? if (tiles)
if (tiles && map)
{ {
for (int i=0; i < map->width; i++) int width = mapGenOptions->getWidth();
int height = mapGenOptions->getHeight();
for (int i=0; i < width; i++)
{ {
for(int j=0; j < map->height; j++) for(int j=0; j < height; j++)
{ {
delete [] tiles[i][j]; delete [] tiles[i][j];
} }
@ -80,6 +81,7 @@ std::unique_ptr<CMap> CMapGenerator::generate()
genZones(); genZones();
map->calculateGuardingGreaturePositions(); //clear map so that all tiles are unguarded map->calculateGuardingGreaturePositions(); //clear map so that all tiles are unguarded
fillZones(); fillZones();
//updated fuarded tiles will be calculated in CGameState::initMapObjects()
} }
catch (rmgException &e) catch (rmgException &e)
{ {

View File

@ -51,7 +51,7 @@ public:
class DLL_LINKAGE CMapGenerator class DLL_LINKAGE CMapGenerator
{ {
public: public:
explicit CMapGenerator(shared_ptr<CMapGenOptions> mapGenOptions, int randomSeed = std::time(nullptr)); explicit CMapGenerator(shared_ptr<CMapGenOptions> mapGenOptions, int RandomSeed = std::time(nullptr));
~CMapGenerator(); // required due to unique_ptr ~CMapGenerator(); // required due to unique_ptr
std::unique_ptr<CMap> generate(); std::unique_ptr<CMap> generate();