mirror of
https://github.com/vcmi/vcmi.git
synced 2025-06-29 00:41:38 +02:00
Merged changes from upstream and fixed compilation caused by API changes
This commit is contained in:
@ -729,11 +729,13 @@ CGameState::~CGameState()
|
||||
BattleInfo * CGameState::setupBattle(int3 tile, const CArmedInstance *armies[2], const CGHeroInstance * heroes[2], bool creatureBank, const CGTownInstance *town)
|
||||
{
|
||||
const TerrainTile &t = map->getTile(tile);
|
||||
ETerrainType terrain = t.terType;
|
||||
ETerrainType terrain = t.terType;
|
||||
if(t.isCoastal() && !t.isWater())
|
||||
terrain = ETerrainType::SAND;
|
||||
terrain = ETerrainType::SAND;
|
||||
|
||||
BFieldType terType = battleGetBattlefieldType(tile);
|
||||
if (heroes[0] && heroes[0]->boat && heroes[1] && heroes[1]->boat)
|
||||
terType = BFieldType::SHIP_TO_SHIP;
|
||||
return BattleInfo::setupBattle(tile, terrain, terType, armies, heroes, creatureBank, town);
|
||||
}
|
||||
|
||||
@ -808,8 +810,8 @@ void CGameState::initNewGame()
|
||||
CStopWatch sw;
|
||||
|
||||
// Gen map
|
||||
CMapGenerator mapGenerator;
|
||||
map = mapGenerator.generate(scenarioOps->mapGenOptions.get(), scenarioOps->seedToBeUsed).release();
|
||||
CMapGenerator mapGenerator(scenarioOps->mapGenOptions, scenarioOps->seedToBeUsed);
|
||||
map = mapGenerator.generate().release();
|
||||
|
||||
// Update starting options
|
||||
for(int i = 0; i < map->players.size(); ++i)
|
||||
@ -1000,7 +1002,7 @@ void CGameState::initGrailPosition()
|
||||
&& !t.visitable
|
||||
&& t.terType != ETerrainType::WATER
|
||||
&& t.terType != ETerrainType::ROCK
|
||||
&& map->grailPos.dist2d(int3(i,j,k)) <= map->grailRadious)
|
||||
&& map->grailPos.dist2dSQ(int3(i, j, k)) <= (map->grailRadious * map->grailRadious))
|
||||
allowedPos.push_back(int3(i,j,k));
|
||||
}
|
||||
}
|
||||
@ -1236,21 +1238,6 @@ CGameState::CrossoverHeroesList CGameState::getCrossoverHeroesFromPreviousScenar
|
||||
}
|
||||
}
|
||||
|
||||
// Now we need to perform deep copies of all heroes
|
||||
// The lambda below replaces pointer to a hero with a pointer to its deep copy.
|
||||
auto replaceWithDeepCopy = [](CGHeroInstance *&hero)
|
||||
{
|
||||
// We cache map original hero => copy.
|
||||
// We may be called multiple times with the same hero and should return a single copy.
|
||||
static std::map<CGHeroInstance*, CGHeroInstance*> oldToCopy;
|
||||
if(!oldToCopy[hero])
|
||||
oldToCopy[hero] = CMemorySerializer::deepCopy(*hero).release();
|
||||
|
||||
hero = oldToCopy[hero];
|
||||
};
|
||||
range::for_each(crossoverHeroes.heroesFromAnyPreviousScenarios, replaceWithDeepCopy);
|
||||
range::for_each(crossoverHeroes.heroesFromPreviousScenario, replaceWithDeepCopy);
|
||||
|
||||
return crossoverHeroes;
|
||||
}
|
||||
|
||||
@ -1877,6 +1864,8 @@ void CGameState::initMapObjects()
|
||||
}
|
||||
}
|
||||
CGTeleport::postInit(); //pairing subterranean gates
|
||||
|
||||
map->calculateGuardingGreaturePositions(); //calculate once again when all the guards are placed and initialized
|
||||
}
|
||||
|
||||
void CGameState::initVisitingAndGarrisonedHeroes()
|
||||
@ -1923,8 +1912,7 @@ BFieldType CGameState::battleGetBattlefieldType(int3 tile)
|
||||
for(auto &obj : map->objects)
|
||||
{
|
||||
//look only for objects covering given tile
|
||||
if( !obj || obj->pos.z != tile.z
|
||||
|| !obj->coveringAt(tile.x - obj->pos.x, tile.y - obj->pos.y))
|
||||
if( !obj || obj->pos.z != tile.z || !obj->coveringAt(tile.x, tile.y))
|
||||
continue;
|
||||
|
||||
switch(obj->ID)
|
||||
@ -1955,27 +1943,27 @@ BFieldType CGameState::battleGetBattlefieldType(int3 tile)
|
||||
if(!t.isWater() && t.isCoastal())
|
||||
return BFieldType::SAND_SHORE;
|
||||
|
||||
switch(t.terType)
|
||||
switch(t.terType)
|
||||
{
|
||||
case ETerrainType::DIRT:
|
||||
case ETerrainType::DIRT:
|
||||
return BFieldType(rand.nextInt(3, 5));
|
||||
case ETerrainType::SAND:
|
||||
case ETerrainType::SAND:
|
||||
return BFieldType::SAND_MESAS; //TODO: coast support
|
||||
case ETerrainType::GRASS:
|
||||
case ETerrainType::GRASS:
|
||||
return BFieldType(rand.nextInt(6, 7));
|
||||
case ETerrainType::SNOW:
|
||||
case ETerrainType::SNOW:
|
||||
return BFieldType(rand.nextInt(10, 11));
|
||||
case ETerrainType::SWAMP:
|
||||
case ETerrainType::SWAMP:
|
||||
return BFieldType::SWAMP_TREES;
|
||||
case ETerrainType::ROUGH:
|
||||
case ETerrainType::ROUGH:
|
||||
return BFieldType::ROUGH;
|
||||
case ETerrainType::SUBTERRANEAN:
|
||||
case ETerrainType::SUBTERRANEAN:
|
||||
return BFieldType::SUBTERRANEAN;
|
||||
case ETerrainType::LAVA:
|
||||
case ETerrainType::LAVA:
|
||||
return BFieldType::LAVA;
|
||||
case ETerrainType::WATER:
|
||||
case ETerrainType::WATER:
|
||||
return BFieldType::SHIP;
|
||||
case ETerrainType::ROCK:
|
||||
case ETerrainType::ROCK:
|
||||
return BFieldType::ROCKLANDS;
|
||||
default:
|
||||
return BFieldType::NONE;
|
||||
@ -2775,7 +2763,7 @@ std::vector<CGameState::CampaignHeroReplacement> CGameState::generateCampaignHer
|
||||
{
|
||||
auto hero = *it;
|
||||
crossoverHeroes.removeHeroFromBothLists(hero);
|
||||
campaignHeroReplacements.push_back(CampaignHeroReplacement(hero, heroPlaceholder->id));
|
||||
campaignHeroReplacements.push_back(CampaignHeroReplacement(CMemorySerializer::deepCopy(*hero).release(), heroPlaceholder->id));
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -2810,7 +2798,8 @@ std::vector<CGameState::CampaignHeroReplacement> CGameState::generateCampaignHer
|
||||
auto heroPlaceholder = heroPlaceholders[i];
|
||||
if(crossoverHeroes.heroesFromPreviousScenario.size() > i)
|
||||
{
|
||||
campaignHeroReplacements.push_back(CampaignHeroReplacement(crossoverHeroes.heroesFromPreviousScenario[i], heroPlaceholder->id));
|
||||
auto hero = crossoverHeroes.heroesFromPreviousScenario[i];
|
||||
campaignHeroReplacements.push_back(CampaignHeroReplacement(CMemorySerializer::deepCopy(*hero).release(), heroPlaceholder->id));
|
||||
}
|
||||
}
|
||||
|
||||
@ -3088,7 +3077,8 @@ void InfoAboutTown::initFromTown(const CGTownInstance *t, bool detailed)
|
||||
{
|
||||
//include details about hero
|
||||
details = new Details;
|
||||
details->goldIncome = t->dailyIncome();
|
||||
TResources income = t->dailyIncome();
|
||||
details->goldIncome = income[Res::GOLD];
|
||||
details->customRes = t->hasBuilt(BuildingID::RESOURCE_SILO);
|
||||
details->hallLevel = t->hallLevel();
|
||||
details->garrisonedHero = t->garrisonHero;
|
||||
|
Reference in New Issue
Block a user