1
0
mirror of https://github.com/vcmi/vcmi.git synced 2025-04-11 11:31:52 +02:00

Fix granting of building upgrade as bonus

Such as granting Mages Guild Level 4 when town does not have Mages Guild
Level 1
This commit is contained in:
Ivan Savenko 2023-06-26 17:15:47 +03:00
parent 48ac84110b
commit 098e68b8dd

View File

@ -526,29 +526,49 @@ void CGameStateCampaign::initTowns()
{
auto chosenBonus = currentBonus();
if (chosenBonus && chosenBonus->type == CampaignBonusType::BUILDING)
if (!chosenBonus)
return;
if (chosenBonus->type != CampaignBonusType::BUILDING)
return;
for (int g=0; g<gameState->map->towns.size(); ++g)
{
for (int g=0; g<gameState->map->towns.size(); ++g)
CGTownInstance * town = gameState->map->towns[g];
PlayerState * owner = gameState->getPlayerState(town->getOwner());
if (!owner)
continue;
PlayerInfo & pi = gameState->map->players[owner->color.getNum()];
if (!owner->human)
continue;
if (town->pos != pi.posOfMainTown)
continue;
BuildingID newBuilding;
if(gameState->scenarioOps->campState->formatVCMI())
newBuilding = BuildingID(chosenBonus->info1);
else
newBuilding = CBuildingHandler::campToERMU(chosenBonus->info1, town->subID, town->builtBuildings);
// Build granted building & all prerequisites - e.g. Mages Guild Lvl 3 should also give Mages Guild Lvl 1 & 2
while(true)
{
PlayerState * owner = gameState->getPlayerState(gameState->map->towns[g]->getOwner());
if (owner)
{
PlayerInfo & pi = gameState->map->players[owner->color.getNum()];
if (newBuilding == BuildingID::NONE)
break;
if (owner->human && //human-owned
gameState->map->towns[g]->pos == pi.posOfMainTown)
{
BuildingID buildingId;
if(gameState->scenarioOps->campState->formatVCMI())
buildingId = BuildingID(chosenBonus->info1);
else
buildingId = CBuildingHandler::campToERMU(chosenBonus->info1, gameState->map->towns[g]->subID, gameState->map->towns[g]->builtBuildings);
if (town->builtBuildings.count(newBuilding) != 0)
break;
gameState->map->towns[g]->builtBuildings.insert(buildingId);
break;
}
}
town->builtBuildings.insert(newBuilding);
auto building = town->town->buildings.at(newBuilding);
newBuilding = building->upgrade;
}
break;
}
}