1
0
mirror of https://github.com/vcmi/vcmi.git synced 2025-11-29 23:07:48 +02:00

Fix obelisks puzzle revealing

Teams and players were messed up in lib; hardcoded constants were refactored.
This commit is contained in:
Vadim Markovtsev
2016-01-20 10:44:13 +03:00
parent e4b73180bd
commit 10f888a483
8 changed files with 95 additions and 83 deletions

View File

@@ -533,7 +533,7 @@ void CGSeerHut::newTurn() const
{
if (quest->lastDay >= 0 && quest->lastDay < cb->getDate()-1) //time is up
{
cb->setObjProperty (id, 10, CQuest::COMPLETE);
cb->setObjProperty (id, CGSeerHut::OBJPROP_VISITED, CQuest::COMPLETE);
}
}
@@ -550,7 +550,7 @@ void CGSeerHut::onHeroVisit( const CGHeroInstance * h ) const
if (firstVisit)
{
isCustom = quest->isCustomFirst;
cb->setObjProperty (id, 10, CQuest::IN_PROGRESS);
cb->setObjProperty (id, CGSeerHut::OBJPROP_VISITED, CQuest::IN_PROGRESS);
AddQuest aq;
aq.quest = QuestInfo (quest, this, visitablePos());
@@ -645,7 +645,7 @@ void CGSeerHut::finishQuest(const CGHeroInstance * h, ui32 accept) const
default:
break;
}
cb->setObjProperty (id, 10, CQuest::COMPLETE); //mission complete
cb->setObjProperty (id, CGSeerHut::OBJPROP_VISITED, CQuest::COMPLETE); //mission complete
completeQuest(h); //make sure to remove QuestGuard at the very end
}
}

View File

@@ -118,6 +118,8 @@ public:
h & rewardType & rID & rVal & seerName;
}
protected:
static constexpr int OBJPROP_VISITED = 10;
void setPropertyDer(ui8 what, ui32 val) override;
};

View File

@@ -60,7 +60,7 @@ static std::string & visitedTxt(const bool visited)
void CPlayersVisited::setPropertyDer( ui8 what, ui32 val )
{
if(what == 10)
if(what == CPlayersVisited::OBJPROP_VISITED)
players.insert(PlayerColor(val));
}
@@ -103,16 +103,16 @@ std::string CGCreature::getHoverText(const CGHeroInstance * hero) const
{
std::string hoverName;
if(hero->hasVisions(this, 0))
{
{
MetaString ms;
ms << stacks.begin()->second->count;
ms << " " ;
ms.addTxt(MetaString::CRE_PL_NAMES,subID);
ms << "\n";
int decision = takenAction(hero, true);
switch (decision)
{
case FIGHT:
@@ -123,19 +123,19 @@ std::string CGCreature::getHoverText(const CGHeroInstance * hero) const
break;
case JOIN_FOR_FREE:
ms.addTxt(MetaString::GENERAL_TXT,243);
break;
break;
default: //decision = cost in gold
VLC->generaltexth->allTexts[244];
ms << boost::to_string(boost::format(VLC->generaltexth->allTexts[244]) % decision);
ms << boost::to_string(boost::format(VLC->generaltexth->allTexts[244]) % decision);
break;
}
}
ms.toString(hoverName);
ms.toString(hoverName);
}
else
{
hoverName = getHoverText(hero->tempOwner);
}
hoverName = getHoverText(hero->tempOwner);
}
const JsonNode & texts = VLC->generaltexth->localizedTexts["adventureMap"]["monsterThreat"];
@@ -1310,7 +1310,7 @@ void CGWitchHut::onHeroVisit( const CGHeroInstance * h ) const
iw.soundID = soundBase::gazebo;
iw.player = h->getOwner();
if(!wasVisited(h->tempOwner))
cb->setObjProperty(id, 10, h->tempOwner.getNum());
cb->setObjProperty(id, CGWitchHut::OBJPROP_VISITED, h->tempOwner.getNum());
ui32 txt_id;
if(h->getSecSkillLevel(SecondarySkill(ability))) //you already know this skill
{
@@ -1420,7 +1420,7 @@ void CGShrine::onHeroVisit( const CGHeroInstance * h ) const
}
if(!wasVisited(h->tempOwner))
cb->setObjProperty(id, 10, h->tempOwner.getNum());
cb->setObjProperty(id, CGShrine::OBJPROP_VISITED, h->tempOwner.getNum());
InfoWindow iw;
iw.soundID = soundBase::temple;
@@ -1745,7 +1745,7 @@ void CGShipyard::getOutOffsets( std::vector<int3> &offsets ) const
int3(-3,0,0), int3(1,0,0), //AB
int3(-3,1,0), int3(1,1,0), int3(-2,1,0), int3(0,1,0), int3(-1,1,0), //CDEFG
int3(-3,-1,0), int3(1,-1,0), int3(-2,-1,0), int3(0,-1,0), int3(-1,-1,0) //HIJKL
};
};
}
void CGShipyard::onHeroVisit( const CGHeroInstance * h ) const
@@ -1821,7 +1821,7 @@ void CCartographer::blockingDialogAnswered(const CGHeroInstance *hero, ui32 answ
//water = 0; land = 1; underground = 2;
cb->getAllTiles (fw.tiles, hero->tempOwner, subID - 1, !subID + 1); //reveal appropriate tiles
cb->sendAndApply (&fw);
cb->setObjProperty (id, 10, hero->tempOwner.getNum());
cb->setObjProperty (id, CCartographer::OBJPROP_VISITED, hero->tempOwner.getNum());
}
}
@@ -1843,11 +1843,13 @@ void CGObelisk::onHeroVisit( const CGHeroInstance * h ) const
iw.text.addTxt(MetaString::ADVOB_TXT, 96);
cb->sendAndApply(&iw);
cb->setObjProperty(id, 20, h->tempOwner.getNum()); //increment general visited obelisks counter
// increment general visited obelisks counter
cb->setObjProperty(id, CGObelisk::OBJPROP_INC, team.getNum());
openWindow(OpenWindow::PUZZLE_MAP, h->tempOwner.getNum());
cb->setObjProperty(id, 10, h->tempOwner.getNum()); //mark that particular obelisk as visited
// mark that particular obelisk as visited
cb->setObjProperty(id, CGObelisk::OBJPROP_VISITED, h->tempOwner.getNum());
}
else
{
@@ -1869,20 +1871,26 @@ std::string CGObelisk::getHoverText(PlayerColor player) const
void CGObelisk::setPropertyDer( ui8 what, ui32 val )
{
CPlayersVisited::setPropertyDer(what, val);
switch(what)
{
case 20:
assert(val < PlayerColor::PLAYER_LIMIT_I);
visited[TeamID(val)]++;
case CGObelisk::OBJPROP_INC:
{
assert(val < PlayerColor::PLAYER_LIMIT_I);
auto progress = ++visited[TeamID(val)];
logGlobal->debugStream() << boost::format("Player %d: obelisk progress %d / %d")
% val % static_cast<int>(progress) % static_cast<int>(obeliskCount);
if(visited[TeamID(val)] > obeliskCount)
{
logGlobal->errorStream() << "Error: Visited " << visited[TeamID(val)] << "\t\t" << obeliskCount;
assert(0);
}
if(progress > obeliskCount)
{
logGlobal->errorStream() << "Error: Visited " << progress << "\t\t" << obeliskCount;
assert(0);
}
break;
break;
}
default:
CPlayersVisited::setPropertyDer(what, val);
break;
}
}

View File

@@ -28,6 +28,8 @@ public:
h & static_cast<CGObjectInstance&>(*this);
h & players;
}
static constexpr int OBJPROP_VISITED = 10;
};
class DLL_LINKAGE CGCreature : public CArmedInstance //creatures on map
@@ -451,6 +453,7 @@ class DLL_LINKAGE CGDenOfthieves : public CGObjectInstance
class DLL_LINKAGE CGObelisk : public CPlayersVisited
{
public:
static constexpr int OBJPROP_INC = 20;
static ui8 obeliskCount; //how many obelisks are on map
static std::map<TeamID, ui8> visited; //map: team_id => how many obelisks has been visited