mirror of
https://github.com/vcmi/vcmi.git
synced 2024-12-24 22:14:36 +02:00
Town building build mode fixes
* CGameHandler::buildStructure was using wrong requirements for buildings in auto mode. * Build mode loading was wrong in case of omitted value * Show town hall slot for not built building only if it have normal build mode
This commit is contained in:
parent
8027650f4a
commit
c39cd5f951
@ -1339,14 +1339,22 @@ CHallInterface::CHallInterface(const CGTownInstance *Town):
|
|||||||
{
|
{
|
||||||
for(size_t col=0; col<boxList[row].size(); col++) //for each box
|
for(size_t col=0; col<boxList[row].size(); col++) //for each box
|
||||||
{
|
{
|
||||||
const CBuilding *building = nullptr;
|
const CBuilding * building = nullptr;
|
||||||
for(auto & elem : boxList[row][col])//we are looking for the first not build structure
|
for(auto & buildingID : boxList[row][col])//we are looking for the first not built structure
|
||||||
{
|
{
|
||||||
auto buildingID = elem;
|
const CBuilding * current = town->town->buildings.at(buildingID);
|
||||||
building = town->town->buildings.at(buildingID);
|
if(vstd::contains(town->builtBuildings, buildingID))
|
||||||
|
{
|
||||||
if(!vstd::contains(town->builtBuildings,buildingID))
|
building = current;
|
||||||
break;
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if(current->mode == CBuilding::BUILD_NORMAL)
|
||||||
|
{
|
||||||
|
building = current;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
int posX = pos.w/2 - boxList[row].size()*154/2 - (boxList[row].size()-1)*20 + 194*col,
|
int posX = pos.w/2 - boxList[row].size()*154/2 - (boxList[row].size()-1)*20 + 194*col,
|
||||||
posY = 35 + 104*row;
|
posY = 35 + 104*row;
|
||||||
|
@ -129,7 +129,7 @@
|
|||||||
[
|
[
|
||||||
[ [ "villageHall", "townHall", "cityHall", "capitol" ], [ "fort", "citadel", "castle" ], [ "tavern" ], [ "blacksmith" ] ],
|
[ [ "villageHall", "townHall", "cityHall", "capitol" ], [ "fort", "citadel", "castle" ], [ "tavern" ], [ "blacksmith" ] ],
|
||||||
[ [ "marketplace", "resourceSilo" ], [ "mageGuild1", "mageGuild2", "mageGuild3", "mageGuild4", "mageGuild5" ], [ "special2" ], [ "special3" ] ],
|
[ [ "marketplace", "resourceSilo" ], [ "mageGuild1", "mageGuild2", "mageGuild3", "mageGuild4", "mageGuild5" ], [ "special2" ], [ "special3" ] ],
|
||||||
[ [ "special1" ], [ "special4" ], [ "horde1" ] ],
|
[ [ "special1" ], [ "special4" ], [ "horde1", "horde1Upgr" ] ],
|
||||||
[ [ "dwellingLvl1", "dwellingUpLvl1" ], [ "dwellingLvl2", "dwellingUpLvl2" ], [ "dwellingLvl3", "dwellingUpLvl3" ], [ "dwellingLvl4", "dwellingUpLvl4" ] ],
|
[ [ "dwellingLvl1", "dwellingUpLvl1" ], [ "dwellingLvl2", "dwellingUpLvl2" ], [ "dwellingLvl3", "dwellingUpLvl3" ], [ "dwellingLvl4", "dwellingUpLvl4" ] ],
|
||||||
[ [ "dwellingLvl5", "dwellingUpLvl5" ], [ "dwellingLvl6", "dwellingUpLvl6" ], [ "dwellingLvl7", "dwellingUpLvl7" ] ]
|
[ [ "dwellingLvl5", "dwellingUpLvl5" ], [ "dwellingLvl6", "dwellingUpLvl6" ], [ "dwellingLvl7", "dwellingUpLvl7" ] ]
|
||||||
],
|
],
|
||||||
@ -171,7 +171,7 @@
|
|||||||
|
|
||||||
"special1": { "id" : 17, "requires" : [ "marketplace" ] },
|
"special1": { "id" : 17, "requires" : [ "marketplace" ] },
|
||||||
"horde1": { "id" : 18, "upgrades" : "dwellingLvl1" },
|
"horde1": { "id" : 18, "upgrades" : "dwellingLvl1" },
|
||||||
"horde1Upgr": { "id" : 19, "upgrades" : "dwellingUpLvl1", "requires" : [ "allOf", [ "horde1" ], [ "dwellingUpLvl1" ] ], "mode" : "auto" },
|
"horde1Upgr": { "id" : 19, "upgrades" : "dwellingUpLvl1", "requires" : [ "horde1" ], "mode" : "auto" },
|
||||||
"special2": { "id" : 21, "requires" : [ "mageGuild1" ] },
|
"special2": { "id" : 21, "requires" : [ "mageGuild1" ] },
|
||||||
"special3": { "id" : 22 },
|
"special3": { "id" : 22 },
|
||||||
"special4": { "id" : 23 },
|
"special4": { "id" : 23 },
|
||||||
|
@ -66,6 +66,24 @@ si32 CBuilding::getDistance(BuildingID buildID) const
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CBuilding::deserializeFix()
|
||||||
|
{
|
||||||
|
//default value for mode was broken, have to fix it here for old saves (v777 and older)
|
||||||
|
switch(mode)
|
||||||
|
{
|
||||||
|
case BUILD_NORMAL:
|
||||||
|
case BUILD_AUTO:
|
||||||
|
case BUILD_SPECIAL:
|
||||||
|
case BUILD_GRAIL:
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
mode = BUILD_NORMAL;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
CFaction::CFaction()
|
CFaction::CFaction()
|
||||||
{
|
{
|
||||||
town = nullptr;
|
town = nullptr;
|
||||||
@ -329,9 +347,20 @@ void CTownHandler::loadBuilding(CTown * town, const std::string & stringID, cons
|
|||||||
{
|
{
|
||||||
auto ret = new CBuilding();
|
auto ret = new CBuilding();
|
||||||
|
|
||||||
static const std::string modes [] = {"normal", "auto", "special", "grail"};
|
static const std::vector<std::string> MODES =
|
||||||
|
{
|
||||||
|
"normal", "auto", "special", "grail"
|
||||||
|
};
|
||||||
|
|
||||||
ret->mode = static_cast<CBuilding::EBuildMode>(boost::find(modes, source["mode"].String()) - modes);
|
ret->mode = CBuilding::BUILD_NORMAL;
|
||||||
|
{
|
||||||
|
if(source["mode"].getType() == JsonNode::DATA_STRING)
|
||||||
|
{
|
||||||
|
auto rawMode = vstd::find_pos(MODES, source["mode"].String());
|
||||||
|
if(rawMode > 0)
|
||||||
|
ret->mode = static_cast<CBuilding::EBuildMode>(rawMode);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
ret->identifier = stringID;
|
ret->identifier = stringID;
|
||||||
ret->town = town;
|
ret->town = town;
|
||||||
|
@ -78,9 +78,15 @@ public:
|
|||||||
h & requirements;
|
h & requirements;
|
||||||
h & upgrade;
|
h & upgrade;
|
||||||
h & mode;
|
h & mode;
|
||||||
|
if(!h.saving)
|
||||||
|
deserializeFix();
|
||||||
}
|
}
|
||||||
|
|
||||||
friend class CTownHandler;
|
friend class CTownHandler;
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
void deserializeFix();
|
||||||
};
|
};
|
||||||
|
|
||||||
/// This is structure used only by client
|
/// This is structure used only by client
|
||||||
|
@ -2993,9 +2993,11 @@ bool CGameHandler::buildStructure(ObjectInstanceID tid, BuildingID requestedID,
|
|||||||
buildingsThatWillBe.insert(b->bid);
|
buildingsThatWillBe.insert(b->bid);
|
||||||
remainingAutoBuildings -= b;
|
remainingAutoBuildings -= b;
|
||||||
|
|
||||||
for (auto autoBuilding : remainingAutoBuildings)
|
for(auto autoBuilding : remainingAutoBuildings)
|
||||||
{
|
{
|
||||||
if (autoBuilding->requirements.test(areRequirementsFullfilled))
|
auto actualRequirements = t->genBuildingRequirements(autoBuilding->bid);
|
||||||
|
|
||||||
|
if(actualRequirements.test(areRequirementsFullfilled))
|
||||||
buildingsToAdd.push(autoBuilding);
|
buildingsToAdd.push(autoBuilding);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user