1
0
mirror of https://github.com/vcmi/vcmi.git synced 2025-02-03 13:01:33 +02:00

Properly calculate building requirements

In OH3 you can't build Capitol when Tavern is not builded.
In VCMI up to now you could.
This commit is contained in:
Piotr Wójcik 2016-08-30 20:53:56 +02:00
parent 326be61ecb
commit 044e2b9e51
3 changed files with 11 additions and 9 deletions

View File

@ -1378,7 +1378,7 @@ std::string CBuildWindow::getTextForState(int state)
}; };
ret = CGI->generaltexth->allTexts[52]; ret = CGI->generaltexth->allTexts[52];
ret += "\n" + town->genBuildingRequirements(building->bid, false).toString(toStr); ret += "\n" + town->genBuildingRequirements(building->bid).toString(toStr);
break; break;
} }
case EBuildingState::MISSING_BASE: case EBuildingState::MISSING_BASE:

View File

@ -1126,7 +1126,7 @@ bool CGTownInstance::hasBuilt(BuildingID buildingID) const
return vstd::contains(builtBuildings, buildingID); return vstd::contains(builtBuildings, buildingID);
} }
CBuilding::TRequired CGTownInstance::genBuildingRequirements(BuildingID buildID, bool includeUpgrade) const CBuilding::TRequired CGTownInstance::genBuildingRequirements(BuildingID buildID) const
{ {
const CBuilding * building = town->buildings.at(buildID); const CBuilding * building = town->buildings.at(buildID);
@ -1138,10 +1138,14 @@ CBuilding::TRequired CGTownInstance::genBuildingRequirements(BuildingID buildID,
if (!hasBuilt(id)) if (!hasBuilt(id))
return id; return id;
if (build->upgrade != BuildingID::NONE && !hasBuilt(build->upgrade)) CBuilding::TRequired::OperatorAll requirements;
return build->upgrade;
return build->requirements.morph(dependTest); if (build->upgrade != BuildingID::NONE)
requirements.expressions.push_back(dependTest(build->upgrade));
requirements.expressions.push_back(build->requirements.morph(dependTest));
return requirements;
}; };
CBuilding::TRequired::OperatorAll requirements; CBuilding::TRequired::OperatorAll requirements;
@ -1149,9 +1153,7 @@ CBuilding::TRequired CGTownInstance::genBuildingRequirements(BuildingID buildID,
{ {
const CBuilding * upgr = town->buildings.at(building->upgrade); const CBuilding * upgr = town->buildings.at(building->upgrade);
if (includeUpgrade) requirements.expressions.push_back(dependTest(upgr->bid));
requirements.expressions.push_back(upgr->bid);
requirements.expressions.push_back(upgr->requirements.morph(dependTest));
} }
requirements.expressions.push_back(building->requirements.morph(dependTest)); requirements.expressions.push_back(building->requirements.morph(dependTest));

View File

@ -238,7 +238,7 @@ public:
bool armedGarrison() const; //true if town has creatures in garrison or garrisoned hero bool armedGarrison() const; //true if town has creatures in garrison or garrisoned hero
int getTownLevel() const; int getTownLevel() const;
CBuilding::TRequired genBuildingRequirements(BuildingID build, bool includeUpgrade=true) const; CBuilding::TRequired genBuildingRequirements(BuildingID build) const;
void mergeGarrisonOnSiege() const; // merge garrison into army of visiting hero void mergeGarrisonOnSiege() const; // merge garrison into army of visiting hero
void removeCapitols (PlayerColor owner) const; void removeCapitols (PlayerColor owner) const;