mirror of
https://github.com/vcmi/vcmi.git
synced 2025-11-25 22:42:04 +02:00
fix upgrade
This commit is contained in:
@@ -40,7 +40,7 @@ void BuildAnalyzer::updateTownDwellings(TownDevelopmentInfo & developmentInfo)
|
|||||||
|
|
||||||
for(bool prefix : prefixes)
|
for(bool prefix : prefixes)
|
||||||
{
|
{
|
||||||
BuildingID building = BuildingID(BuildingID::getDwelling(level, prefix));
|
BuildingID building = BuildingID(BuildingID::getDwellingFromLevel(level, prefix));
|
||||||
|
|
||||||
if(!vstd::contains(buildings, building))
|
if(!vstd::contains(buildings, building))
|
||||||
continue; // no such building in town
|
continue; // no such building in town
|
||||||
@@ -209,10 +209,10 @@ BuildingInfo BuildAnalyzer::getBuildingOrPrerequisite(
|
|||||||
int creatureLevel = -1;
|
int creatureLevel = -1;
|
||||||
int creatureUpgrade = 0;
|
int creatureUpgrade = 0;
|
||||||
|
|
||||||
if(BuildingID::getLevel(toBuild) != -1)
|
if(BuildingID::getLevelFromDwelling(toBuild) != -1)
|
||||||
{
|
{
|
||||||
creatureLevel = BuildingID::getLevel(toBuild) % GameConstants::CREATURES_PER_TOWN;
|
creatureLevel = BuildingID::getLevelFromDwelling(toBuild);
|
||||||
creatureUpgrade = BuildingID::getLevel(toBuild) / GameConstants::CREATURES_PER_TOWN;
|
creatureUpgrade = BuildingID::getUpgradedFromDwelling(toBuild);
|
||||||
}
|
}
|
||||||
else if(toBuild == BuildingID::HORDE_1 || toBuild == BuildingID::HORDE_1_UPGR)
|
else if(toBuild == BuildingID::HORDE_1 || toBuild == BuildingID::HORDE_1_UPGR)
|
||||||
{
|
{
|
||||||
@@ -262,7 +262,7 @@ BuildingInfo BuildAnalyzer::getBuildingOrPrerequisite(
|
|||||||
|
|
||||||
auto otherDwelling = [](const BuildingID & id) -> bool
|
auto otherDwelling = [](const BuildingID & id) -> bool
|
||||||
{
|
{
|
||||||
return BuildingID::getLevel(id) != -1;
|
return BuildingID::getLevelFromDwelling(id) != -1;
|
||||||
};
|
};
|
||||||
|
|
||||||
if(vstd::contains_if(missingBuildings, otherDwelling))
|
if(vstd::contains_if(missingBuildings, otherDwelling))
|
||||||
@@ -405,7 +405,7 @@ BuildingInfo::BuildingInfo(
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if(BuildingID::getLevel(id) != -1)
|
if(BuildingID::getLevelFromDwelling(id) != -1)
|
||||||
{
|
{
|
||||||
creatureGrows = creature->getGrowth();
|
creatureGrows = creature->getGrowth();
|
||||||
|
|
||||||
|
|||||||
@@ -163,7 +163,7 @@ void CBuildingRect::showPopupWindow(const Point & cursorPosition)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
int level = BuildingID::getLevel(bid) % bld->town->creatures.size();
|
int level = BuildingID::getLevelFromDwelling(bid);
|
||||||
GH.windows().createAndPushWindow<CDwellingInfoBox>(parent->pos.x+parent->pos.w / 2, parent->pos.y+parent->pos.h /2, town, level);
|
GH.windows().createAndPushWindow<CDwellingInfoBox>(parent->pos.x+parent->pos.w / 2, parent->pos.y+parent->pos.h /2, town, level);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -688,7 +688,7 @@ void CCastleBuildings::buildingClicked(BuildingID building, BuildingSubID::EBuil
|
|||||||
|
|
||||||
if (building >= BuildingID::DWELL_FIRST)
|
if (building >= BuildingID::DWELL_FIRST)
|
||||||
{
|
{
|
||||||
enterDwelling((BuildingID::getLevel(building))%town->town->creatures.size());
|
enterDwelling((BuildingID::getLevelFromDwelling(building)));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -1771,12 +1771,12 @@ CFortScreen::CFortScreen(const CGTownInstance * town):
|
|||||||
BuildingID buildingID;
|
BuildingID buildingID;
|
||||||
if(fortSize == town->town->creatures.size())
|
if(fortSize == town->town->creatures.size())
|
||||||
{
|
{
|
||||||
BuildingID dwelling = BuildingID::getDwelling(i, true);
|
BuildingID dwelling = BuildingID::getDwellingFromLevel(i, true);
|
||||||
|
|
||||||
if(vstd::contains(town->builtBuildings, dwelling))
|
if(vstd::contains(town->builtBuildings, dwelling))
|
||||||
buildingID = BuildingID(BuildingID::getDwelling(i, true));
|
buildingID = BuildingID(BuildingID::getDwellingFromLevel(i, true));
|
||||||
else
|
else
|
||||||
buildingID = BuildingID(BuildingID::getDwelling(i));
|
buildingID = BuildingID(BuildingID::getDwellingFromLevel(i));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -1878,7 +1878,7 @@ const CCreature * CFortScreen::RecruitArea::getMyCreature()
|
|||||||
|
|
||||||
const CBuilding * CFortScreen::RecruitArea::getMyBuilding()
|
const CBuilding * CFortScreen::RecruitArea::getMyBuilding()
|
||||||
{
|
{
|
||||||
BuildingID myID = BuildingID(BuildingID::getDwelling(level));
|
BuildingID myID = BuildingID(BuildingID::getDwellingFromLevel(level));
|
||||||
|
|
||||||
if (level == town->town->creatures.size())
|
if (level == town->town->creatures.size())
|
||||||
return town->town->getSpecialBuilding(BuildingSubID::PORTAL_OF_SUMMONING);
|
return town->town->getSpecialBuilding(BuildingSubID::PORTAL_OF_SUMMONING);
|
||||||
|
|||||||
@@ -298,7 +298,7 @@ public:
|
|||||||
HORDE_2_UPGR, GRAIL, EXTRA_TOWN_HALL, EXTRA_CITY_HALL, EXTRA_CAPITOL,
|
HORDE_2_UPGR, GRAIL, EXTRA_TOWN_HALL, EXTRA_CITY_HALL, EXTRA_CAPITOL,
|
||||||
DWELL_FIRST=30, DWELL_LVL_2, DWELL_LVL_3, DWELL_LVL_4, DWELL_LVL_5, DWELL_LVL_6, DWELL_LAST=36,
|
DWELL_FIRST=30, DWELL_LVL_2, DWELL_LVL_3, DWELL_LVL_4, DWELL_LVL_5, DWELL_LVL_6, DWELL_LAST=36,
|
||||||
DWELL_UP_FIRST=37, DWELL_LVL_2_UP, DWELL_LVL_3_UP, DWELL_LVL_4_UP, DWELL_LVL_5_UP,
|
DWELL_UP_FIRST=37, DWELL_LVL_2_UP, DWELL_LVL_3_UP, DWELL_LVL_4_UP, DWELL_LVL_5_UP,
|
||||||
DWELL_LVL_6_UP, DWELL_UP_LAST=43, DWELL_LVL_8, DWELL_LVL_8_UP,
|
DWELL_LVL_6_UP, DWELL_UP_LAST=43, DWELL_LVL_8=50, DWELL_LVL_8_UP=57,
|
||||||
|
|
||||||
DWELL_LVL_1 = DWELL_FIRST,
|
DWELL_LVL_1 = DWELL_FIRST,
|
||||||
DWELL_LVL_7 = DWELL_LAST,
|
DWELL_LVL_7 = DWELL_LAST,
|
||||||
@@ -314,26 +314,41 @@ public:
|
|||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static Type getDwelling(int level, bool up = false)
|
private:
|
||||||
|
static std::vector<std::vector<Type>> getDwellings()
|
||||||
{
|
{
|
||||||
const std::vector<Type> dwellings = { DWELL_LVL_1, DWELL_LVL_2, DWELL_LVL_3, DWELL_LVL_4, DWELL_LVL_5, DWELL_LVL_6, DWELL_LVL_7, DWELL_LVL_8 };
|
std::vector<Type> dwellings = { DWELL_LVL_1, DWELL_LVL_2, DWELL_LVL_3, DWELL_LVL_4, DWELL_LVL_5, DWELL_LVL_6, DWELL_LVL_7, DWELL_LVL_8 };
|
||||||
const std::vector<Type> dwellingsUp = { DWELL_LVL_1_UP, DWELL_LVL_2_UP, DWELL_LVL_3_UP, DWELL_LVL_4_UP, DWELL_LVL_5_UP, DWELL_LVL_6_UP, DWELL_LVL_7_UP, DWELL_LVL_8_UP };
|
std::vector<Type> dwellingsUp = { DWELL_LVL_1_UP, DWELL_LVL_2_UP, DWELL_LVL_3_UP, DWELL_LVL_4_UP, DWELL_LVL_5_UP, DWELL_LVL_6_UP, DWELL_LVL_7_UP, DWELL_LVL_8_UP };
|
||||||
|
return {dwellings, dwellingsUp};
|
||||||
return up ? dwellingsUp[level] : dwellings[level];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int getLevel(BuildingIDBase level)
|
public:
|
||||||
|
static Type getDwellingFromLevel(int level, bool up = false)
|
||||||
{
|
{
|
||||||
const std::vector<Type> dwellings = { DWELL_LVL_1, DWELL_LVL_2, DWELL_LVL_3, DWELL_LVL_4, DWELL_LVL_5, DWELL_LVL_6, DWELL_LVL_7, DWELL_LVL_8 };
|
return getDwellings()[up ? 1 : 0][level];
|
||||||
const std::vector<Type> dwellingsUp = { DWELL_LVL_1_UP, DWELL_LVL_2_UP, DWELL_LVL_3_UP, DWELL_LVL_4_UP, DWELL_LVL_5_UP, DWELL_LVL_6_UP, DWELL_LVL_7_UP, DWELL_LVL_8_UP };
|
}
|
||||||
|
|
||||||
auto it = std::find(dwellings.begin(), dwellings.end(), level);
|
static int getLevelFromDwelling(BuildingIDBase dwelling)
|
||||||
if (it != dwellings.end())
|
{
|
||||||
return std::distance(dwellings.begin(), it);
|
for(int i = 0; i < 2; i++)
|
||||||
it = std::find(dwellingsUp.begin(), dwellingsUp.end(), level);
|
{
|
||||||
if (it != dwellingsUp.end())
|
auto tmp = getDwellings()[i];
|
||||||
return std::distance(dwellingsUp.begin(), it);
|
auto it = std::find(tmp.begin(), tmp.end(), dwelling);
|
||||||
|
if (it != tmp.end())
|
||||||
|
return std::distance(tmp.begin(), it);
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int getUpgradedFromDwelling(BuildingIDBase dwelling)
|
||||||
|
{
|
||||||
|
for(int i = 0; i < 2; i++)
|
||||||
|
{
|
||||||
|
auto tmp = getDwellings()[i];
|
||||||
|
auto it = std::find(tmp.begin(), tmp.end(), dwelling);
|
||||||
|
if (it != tmp.end())
|
||||||
|
return i;
|
||||||
|
}
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -56,7 +56,7 @@ BuildingID CBuildingHandler::campToERMU(int camp, FactionID townType, const std:
|
|||||||
{
|
{
|
||||||
if (hordeLvlsPerTType[townType.getNum()][0] == i)
|
if (hordeLvlsPerTType[townType.getNum()][0] == i)
|
||||||
{
|
{
|
||||||
BuildingID dwellingID(BuildingID::getDwelling(hordeLvlsPerTType[townType.getNum()][0], true));
|
BuildingID dwellingID(BuildingID::getDwellingFromLevel(hordeLvlsPerTType[townType.getNum()][0], true));
|
||||||
|
|
||||||
if(vstd::contains(builtBuildings, dwellingID)) //if upgraded dwelling is built
|
if(vstd::contains(builtBuildings, dwellingID)) //if upgraded dwelling is built
|
||||||
return BuildingID::HORDE_1_UPGR;
|
return BuildingID::HORDE_1_UPGR;
|
||||||
@@ -67,7 +67,7 @@ BuildingID CBuildingHandler::campToERMU(int camp, FactionID townType, const std:
|
|||||||
{
|
{
|
||||||
if(hordeLvlsPerTType[townType.getNum()].size() > 1)
|
if(hordeLvlsPerTType[townType.getNum()].size() > 1)
|
||||||
{
|
{
|
||||||
BuildingID dwellingID(BuildingID::getDwelling(hordeLvlsPerTType[townType.getNum()][1], true));
|
BuildingID dwellingID(BuildingID::getDwellingFromLevel(hordeLvlsPerTType[townType.getNum()][1], true));
|
||||||
|
|
||||||
if(vstd::contains(builtBuildings, dwellingID)) //if upgraded dwelling is built
|
if(vstd::contains(builtBuildings, dwellingID)) //if upgraded dwelling is built
|
||||||
return BuildingID::HORDE_2_UPGR;
|
return BuildingID::HORDE_2_UPGR;
|
||||||
|
|||||||
@@ -520,7 +520,7 @@ void CGTownInstance::initObj(vstd::RNG & rand) ///initialize town structures
|
|||||||
|
|
||||||
for (int level = 0; level < town->creatures.size(); level++)
|
for (int level = 0; level < town->creatures.size(); level++)
|
||||||
{
|
{
|
||||||
BuildingID buildID = BuildingID(BuildingID::getDwelling(level));
|
BuildingID buildID = BuildingID(BuildingID::getDwellingFromLevel(level));
|
||||||
int upgradeNum = 0;
|
int upgradeNum = 0;
|
||||||
|
|
||||||
for (; town->buildings.count(buildID); upgradeNum++, buildID.advance(town->creatures.size()))
|
for (; town->buildings.count(buildID); upgradeNum++, buildID.advance(town->creatures.size()))
|
||||||
|
|||||||
@@ -2360,10 +2360,10 @@ bool CGameHandler::buildStructure(ObjectInstanceID tid, BuildingID requestedID,
|
|||||||
//Performs stuff that has to be done before new building is built
|
//Performs stuff that has to be done before new building is built
|
||||||
auto processBeforeBuiltStructure = [t, this](const BuildingID buildingID)
|
auto processBeforeBuiltStructure = [t, this](const BuildingID buildingID)
|
||||||
{
|
{
|
||||||
if(BuildingID::getLevel(buildingID) > -1) //dwelling
|
if(BuildingID::getLevelFromDwelling(buildingID) > -1) //dwelling
|
||||||
{
|
{
|
||||||
int level = BuildingID::getLevel(buildingID) % t->town->creatures.size();
|
int level = BuildingID::getLevelFromDwelling(buildingID);
|
||||||
int upgradeNumber = BuildingID::getLevel(buildingID) / t->town->creatures.size();
|
int upgradeNumber = BuildingID::getUpgradedFromDwelling(buildingID);
|
||||||
|
|
||||||
if(upgradeNumber >= t->town->creatures.at(level).size())
|
if(upgradeNumber >= t->town->creatures.at(level).size())
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user