1
0
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:
Ivan Savenko
2014-06-03 22:45:18 +03:00
143 changed files with 8788 additions and 8457 deletions

View File

@ -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;