From 264ce77ec99a6206aa213c9f9c0ea26945b2a30c Mon Sep 17 00:00:00 2001 From: alexvins Date: Sun, 13 Jan 2013 12:40:24 +0000 Subject: [PATCH] [refactor] a few more cleanups --- lib/CDefObjInfoHandler.cpp | 31 +++- lib/CObjectHandler.cpp | 129 ++++++-------- lib/CObjectHandler.h | 338 ++++++++++++++++++++---------------- lib/Mapping/CMapService.cpp | 64 +++---- 4 files changed, 291 insertions(+), 271 deletions(-) diff --git a/lib/CDefObjInfoHandler.cpp b/lib/CDefObjInfoHandler.cpp index 55178be64..364db9922 100644 --- a/lib/CDefObjInfoHandler.cpp +++ b/lib/CDefObjInfoHandler.cpp @@ -48,7 +48,6 @@ void CGDefInfo::fetchInfoFromMSK() void CDefObjInfoHandler::load() { - VLC->dobjinfo = this; auto textFile = CResourceHandler::get()->loadData(ResourceID("DATA/ZOBJCTS.TXT")); std::istringstream inp(std::string((char*)textFile.first.get(), textFile.second)); @@ -60,7 +59,7 @@ void CDefObjInfoHandler::load() CGDefInfo* nobj = new CGDefInfo(); std::string dump; inp>>nobj->name; - + std::transform(nobj->name.begin(), nobj->name.end(), nobj->name.begin(), (int(*)(int))toupper); for(int o=0; o<6; ++o) @@ -89,7 +88,7 @@ void CDefObjInfoHandler::load() } } - for(int yy=0; yy<2; ++yy) //first - on which types of terrain object can be placed; + for(int yy=0; yy<2; ++yy) //first - on which types of terrain object can be placed; inp>>dump; //second -in which terrains' menus object in the editor will be available (?) inp>>nobj->id; inp>>nobj->subid; @@ -101,9 +100,25 @@ void CDefObjInfoHandler::load() { nobj->visitDir = 0xff; } - else + else { - static int visitableFromTop[] = {29, 82, 86, 11, 59, 8, 111,33,81,12,9,212,215,22}; //sea chest, flotsam, shipwreck survivor, buoy, ocean bottle, boat, whirlpool, garrison, scholar, campfire, borderguard, bordergate, questguard, corpse + using namespace Obj; + static int visitableFromTop[] = + {FLOTSAM, + SEA_CHEST, + SHIPWRECK_SURVIVOR, + BUOY, + OCEAN_BOTTLE, + BOAT, + WHIRLPOOL, + GARRISON, + SCHOLAR, + CAMPFIRE, + BORDERGUARD, + BORDER_GATE, + QUEST_GUARD, + CORPSE}; + for(int i=0; i < ARRAY_COUNT(visitableFromTop); i++) { if(visitableFromTop[i] == nobj->id) @@ -130,12 +145,12 @@ void CDefObjInfoHandler::load() if(i) { - gobjs[124][i] = new CGDefInfo(*gobjs[124][0]); + gobjs[Obj::HOLE][i] = new CGDefInfo(*gobjs[Obj::HOLE][0]); } - gobjs[124][i]->name = holeDefs[i]; + gobjs[Obj::HOLE][i]->name = holeDefs[i]; } } - + CDefObjInfoHandler::~CDefObjInfoHandler() { for(bmap > >::iterator i=gobjs.begin(); i!=gobjs.end(); i++) diff --git a/lib/CObjectHandler.cpp b/lib/CObjectHandler.cpp index c834fb674..bd016f1fc 100644 --- a/lib/CObjectHandler.cpp +++ b/lib/CObjectHandler.cpp @@ -83,6 +83,12 @@ static void showInfoDialog(const CGHeroInstance* h, const ui32 txtID, const ui16 showInfoDialog(playerID,txtID,soundID); } +static std::string & visitedTxt(const bool visited) +{ + int id = visited ? 352 : 353; + return VLC->generaltexth->allTexts[id]; +} + ///IObjectInterface void IObjectInterface::onHeroVisit(const CGHeroInstance * h) const {} @@ -465,10 +471,8 @@ void CGObjectInstance::getNameVis( std::string &hname ) const hname = VLC->generaltexth->names[ID]; if(h) { - if(!h->hasBonusFrom(Bonus::OBJECT,ID)) - hname += " " + VLC->generaltexth->allTexts[353]; //not visited - else - hname += " " + VLC->generaltexth->allTexts[352]; //visited + const bool visited = h->hasBonusFrom(Bonus::OBJECT,ID); + hname + " " + visitedTxt(visited); } } @@ -1604,7 +1608,7 @@ void CGDwelling::initObj() } } -void CGDwelling::setProperty(ui8 what, ui32 val) +void CGDwelling::setPropertyDer(ui8 what, ui32 val) { switch (what) { @@ -2768,9 +2772,8 @@ const std::string & CGVisitableOPH::getHoverText() const if(h) { hoverName += "\n\n"; - hoverName += (vstd::contains(visitors,h->id)) - ? (VLC->generaltexth->allTexts[352]) //visited - : ( VLC->generaltexth->allTexts[353]); //not visited + bool visited = vstd::contains(visitors,h->id); + hoverName += visitedTxt(visited); } return hoverName; } @@ -2794,7 +2797,7 @@ void CGVisitableOPH::schoolSelected(int heroID, ui32 which) const int base = (ID == Obj::SCHOOL_OF_MAGIC ? 2 : 0); cb->setObjProperty(id, ObjProperty::VISITORS, heroID); //add to the visitors - cb->giveResource(cb->getOwner(heroID),6,-1000); //take 1000 gold + cb->giveResource(cb->getOwner(heroID),Res::GOLD,-1000); //take 1000 gold cb->changePrimSkill(heroID, base + which-1, +1); //give appropriate skill } @@ -2826,7 +2829,7 @@ void COPWBonus::onHeroVisit (const CGHeroInstance * h) const switch (town->subID) { case ETownType::CASTLE: //Stables - if (!h->hasBonusFrom(Bonus::OBJECT, 94)) //does not stack with advMap Stables + if (!h->hasBonusFrom(Bonus::OBJECT, Obj::STABLES)) //does not stack with advMap Stables { GiveBonus gb; gb.bonus = Bonus(Bonus::ONE_WEEK, Bonus::LAND_MOVEMENT, Bonus::OBJECT, 600, 94, VLC->generaltexth->arraytxt[100]); @@ -3593,7 +3596,7 @@ void CGVisitableOPW::onHeroVisit( const CGHeroInstance * h ) const cb->showInfoDialog(&iw); cb->setObjProperty(id, ObjProperty::VISITED, true); MetaString ms; //set text to "visited" - ms << std::pair(3,ID) << " " << std::pair(1,352); + ms.addTxt(MetaString::OBJ_NAMES,ID); ms << " "; ms.addTxt(MetaString::GENERAL_TXT,352); cb->setHoverName(id,&ms); } } @@ -4745,25 +4748,24 @@ void CGWitchHut::onHeroVisit( const CGHeroInstance * h ) const iw.player = h->getOwner(); if(!wasVisited(h->tempOwner)) cb->setObjProperty(id,10,h->tempOwner); - + ui32 txt_id; if(h->getSecSkillLevel(static_cast(ability))) //you alredy know this skill { - iw.text.addTxt(MetaString::ADVOB_TXT,172); - iw.text.addReplacement(MetaString::SEC_SKILL_NAME, ability); + txt_id =172; } else if(!h->canLearnSkill()) //already all skills slots used { - iw.text.addTxt(MetaString::ADVOB_TXT,173); - iw.text.addReplacement(MetaString::SEC_SKILL_NAME, ability); + txt_id = 173; } else //give sec skill { iw.components.push_back(Component(Component::SEC_SKILL, ability, 1, 0)); - iw.text.addTxt(MetaString::ADVOB_TXT,171); - iw.text.addReplacement(MetaString::SEC_SKILL_NAME, ability); + txt_id = 171; cb->changeSecSkill(h->id,ability,1,true); } + iw.text.addTxt(MetaString::ADVOB_TXT,txt_id); + iw.text.addReplacement(MetaString::SEC_SKILL_NAME, ability); cb->showInfoDialog(&iw); } @@ -4980,10 +4982,8 @@ const std::string & CGBonusingObject::getHoverText() const hoverName = VLC->generaltexth->names[ID]; if(h) { - if(!h->hasBonusFrom(Bonus::OBJECT,ID)) - hoverName += " " + VLC->generaltexth->allTexts[353]; //not visited - else - hoverName += " " + VLC->generaltexth->allTexts[352]; //visited + bool visited = h->hasBonusFrom(Bonus::OBJECT,ID); + hoverName += " " + visitedTxt(visited); } return hoverName; } @@ -5018,11 +5018,7 @@ void CGMagicSpring::onHeroVisit(const CGHeroInstance * h) const const std::string & CGMagicSpring::getHoverText() const { - hoverName = VLC->generaltexth->names[ID]; - if(!visited) - hoverName += " " + VLC->generaltexth->allTexts[353]; //not visited - else - hoverName += " " + VLC->generaltexth->allTexts[352]; //visited + hoverName = VLC->generaltexth->names[ID] + " " + visitedTxt(visited); return hoverName; } @@ -5489,10 +5485,11 @@ void CGSignBottle::onHeroVisit( const CGHeroInstance * h ) const cb->removeObject(id); } -void CGScholar::giveAnyBonus( const CGHeroInstance * h ) const -{ - -} +//TODO: remove +//void CGScholar::giveAnyBonus( const CGHeroInstance * h ) const +//{ +// +//} void CGScholar::onHeroVisit( const CGHeroInstance * h ) const { @@ -5691,12 +5688,8 @@ void CGOnceVisitable::onHeroVisit( const CGHeroInstance * h ) const const std::string & CGOnceVisitable::getHoverText() const { - hoverName = VLC->generaltexth->names[ID] + " "; - - hoverName += (wasVisited(cb->getCurrentPlayer()) - ? (VLC->generaltexth->allTexts[352]) //visited - : ( VLC->generaltexth->allTexts[353])); //not visited - + const bool visited = wasVisited(cb->getCurrentPlayer()); + hoverName = VLC->generaltexth->names[ID] + " " + visitedTxt(visited); return hoverName; } @@ -5812,11 +5805,8 @@ void CBank::initObj() } const std::string & CBank::getHoverText() const { - hoverName = VLC->objh->creBanksNames[index]; - if (bc == NULL) - hoverName += " " + VLC->generaltexth->allTexts[352]; - else - hoverName += " " + VLC->generaltexth->allTexts[353]; + bool visited = (bc == nullptr); + hoverName = VLC->objh->creBanksNames[index] + " " + visitedTxt(visited); return hoverName; } void CBank::reset(ui16 var1) //prevents desync @@ -6185,11 +6175,7 @@ void CGPyramid::initObj() } const std::string & CGPyramid::getHoverText() const { - hoverName = VLC->objh->creBanksNames[21]; - if (bc == NULL) - hoverName += " " + VLC->generaltexth->allTexts[352]; - else - hoverName += " " + VLC->generaltexth->allTexts[353]; + hoverName = VLC->objh->creBanksNames[21]+ " " + visitedTxt((bc==nullptr)); return hoverName; } void CGPyramid::onHeroVisit (const CGHeroInstance * h) const @@ -6253,6 +6239,14 @@ bool CGKeys::wasMyColorVisited (int player) const return false; } +const std::string& CGKeys::getHoverText() const +{ + bool visited = wasMyColorVisited (cb->getLocalPlayer()); + hoverName = getName() + "\n" + visitedTxt(visited); + return hoverName; +} + + const std::string CGKeys::getName() const { std::string name; @@ -6260,16 +6254,6 @@ const std::string CGKeys::getName() const return name; } -const std::string & CGKeymasterTent::getHoverText() const -{ - hoverName = getName(); - if (wasMyColorVisited (cb->getCurrentPlayer()) )//TODO: use local player, not current - hoverName += "\n" + VLC->generaltexth->allTexts[352]; - else - hoverName += "\n" + VLC->generaltexth->allTexts[353]; - return hoverName; -} - bool CGKeymasterTent::wasVisited (ui8 player) const { return wasMyColorVisited (player); @@ -6294,16 +6278,6 @@ void CGBorderGuard::initObj() blockVisit = true; } -const std::string & CGBorderGuard::getHoverText() const -{ - hoverName = getName(); - if (wasMyColorVisited (cb->getCurrentPlayer()) )//TODO: use local player, not current - hoverName += "\n" + VLC->generaltexth->allTexts[352]; - else - hoverName += "\n" + VLC->generaltexth->allTexts[353]; - return hoverName; -} - void CGBorderGuard::getVisitText (MetaString &text, std::vector &components, bool isCustom, bool FirstVisit, const CGHeroInstance * h) const { text << std::pair(11,18); @@ -6543,8 +6517,8 @@ void IBoatGenerator::getProblemText(MetaString &out, const CGHeroInstance *visit void IShipyard::getBoatCost( std::vector &cost ) const { cost.resize(GameConstants::RESOURCE_QUANTITY); - cost[0] = 10; - cost[6] = 1000; + cost[Res::WOOD] = 10; + cost[Res::GOLD] = 1000; } IShipyard::IShipyard(const CGObjectInstance *O) @@ -6707,11 +6681,8 @@ void CGObelisk::initObj() const std::string & CGObelisk::getHoverText() const { - hoverName = VLC->generaltexth->names[ID]; - if(wasVisited(cb->getCurrentPlayer())) - hoverName += " " + VLC->generaltexth->allTexts[352]; //not visited - else - hoverName += " " + VLC->generaltexth->allTexts[353]; //visited + bool visited = wasVisited(cb->getLocalPlayer()); + hoverName = VLC->generaltexth->names[ID] + " " + visitedTxt(visited); return hoverName; } @@ -6805,11 +6776,11 @@ CArmedInstance::CArmedInstance() battle = NULL; } -int CArmedInstance::valOfGlobalBonuses(CSelector selector) const -{ - //if (tempOwner != NEUTRAL_PLAYER) - return cb->gameState()->players[tempOwner].valOfBonuses(selector); -} +//int CArmedInstance::valOfGlobalBonuses(CSelector selector) const +//{ +//// if (tempOwner != NEUTRAL_PLAYER) +// return cb->gameState()->players[tempOwner].valOfBonuses(selector); +//} void CArmedInstance::updateMoraleBonusFromArmy() { diff --git a/lib/CObjectHandler.h b/lib/CObjectHandler.h index 5415c779e..7c87ed093 100644 --- a/lib/CObjectHandler.h +++ b/lib/CObjectHandler.h @@ -163,9 +163,6 @@ public: class DLL_LINKAGE CGObjectInstance : public IObjectInterface { -protected: - void getNameVis(std::string &hname) const; - void giveDummyBonus(int heroID, ui8 duration = Bonus::ONE_DAY) const; public: mutable std::string hoverName; int3 pos; //h3m pos @@ -201,11 +198,10 @@ public: //CGObjectInstance& operator=(const CGObjectInstance & right); virtual const std::string & getHoverText() const; - ////////////////////////////////////////////////////////////////////////// - void initObj(); - void onHeroVisit(const CGHeroInstance * h) const; - void setProperty(ui8 what, ui32 val);//synchr - virtual void setPropertyDer(ui8 what, ui32 val);//synchr + ///IObjectInterface + void initObj() override; + void onHeroVisit(const CGHeroInstance * h) const override; + void setProperty(ui8 what, ui32 val) override;//synchr friend class CGameHandler; @@ -215,6 +211,11 @@ public: h & hoverName & pos & ID & subID & id & animPhaseShift & tempOwner & blockVisit & defInfo; //definfo is handled by map serializer } +protected: + virtual void setPropertyDer(ui8 what, ui32 val);//synchr + + void getNameVis(std::string &hname) const; + void giveDummyBonus(int heroID, ui8 duration = Bonus::ONE_DAY) const; }; class CGHeroPlaceholder : public CGObjectInstance { @@ -235,7 +236,7 @@ public: std::set players; //players that visited this object bool wasVisited(ui8 player) const; - virtual void setPropertyDer( ui8 what, ui32 val ); + void setPropertyDer(ui8 what, ui32 val) override; template void serialize(Handler &h, const int version) { @@ -252,10 +253,10 @@ public: void randomizeArmy(int type); void updateMoraleBonusFromArmy(); - void armyChanged() OVERRIDE; + void armyChanged() override; ////////////////////////////////////////////////////////////////////////// - int valOfGlobalBonuses(CSelector selector) const; //used only for castle interface ??? +// int valOfGlobalBonuses(CSelector selector) const; //used only for castle interface ??? virtual CBonusSystemNode *whereShouldBeAttached(CGameState *gs); virtual CBonusSystemNode *whatShouldBeAttached(); ////////////////////////////////////////////////////////////////////////// @@ -417,15 +418,17 @@ public: virtual ~CGHeroInstance(); ////////////////////////////////////////////////////////////////////////// // - ui8 bearerType() const OVERRIDE; + ui8 bearerType() const override; ////////////////////////////////////////////////////////////////////////// - virtual CBonusSystemNode *whereShouldBeAttached(CGameState *gs) OVERRIDE; - virtual std::string nodeName() const OVERRIDE; + CBonusSystemNode *whereShouldBeAttached(CGameState *gs) override; + std::string nodeName() const override; void deserializationFix(); - void setPropertyDer(ui8 what, ui32 val);//synchr - void initObj(); - void onHeroVisit(const CGHeroInstance * h) const; + + void initObj() override; + void onHeroVisit(const CGHeroInstance * h) const override; +protected: + void setPropertyDer(ui8 what, ui32 val) override;//synchr }; class DLL_LINKAGE CSpecObjInfo @@ -466,10 +469,12 @@ public: h & static_cast(*this) & creatures; } - void initObj(); - void setProperty(ui8 what, ui32 val); - void onHeroVisit(const CGHeroInstance * h) const; - void newTurn() const; + void initObj() override; + void onHeroVisit(const CGHeroInstance * h) const override; + void newTurn() const override; +protected: + void setPropertyDer(ui8 what, ui32 val) override; +private: void heroAcceptsCreatures(const CGHeroInstance *h, ui32 answer) const; void fightOver(const CGHeroInstance *h, BattleResult *result) const; void wantsFight(const CGHeroInstance *h, ui32 answer) const; @@ -481,22 +486,26 @@ class DLL_LINKAGE CGVisitableOPH : public CGObjectInstance //objects visitable o public: std::set visitors; //ids of heroes who have visited this obj si8 ttype; //tree type - used only by trees of knowledge: 0 - give level for free; 1 - take 2000 gold; 2 - take 10 gems - const std::string & getHoverText() const; - void setPropertyDer(ui8 what, ui32 val);//synchr - void onHeroVisit(const CGHeroInstance * h) const; - void onNAHeroVisit(int heroID, bool alreadyVisited) const; - void initObj(); - bool wasVisited (const CGHeroInstance * h) const; - void treeSelected(int heroID, int resType, int resVal, TExpType expVal, ui32 result) const; //handle player's anwer to the Tree of Knowledge dialog - void schoolSelected(int heroID, ui32 which) const; - void arenaSelected(int heroID, int primSkill) const; + const std::string & getHoverText() const override; + void onHeroVisit(const CGHeroInstance * h) const override; + void initObj() override; + bool wasVisited (const CGHeroInstance * h) const override; + template void serialize(Handler &h, const int version) { h & static_cast(*this); h & visitors & ttype; } +protected: + void setPropertyDer(ui8 what, ui32 val) override;//synchr +private: + void onNAHeroVisit(int heroID, bool alreadyVisited) const; + ///dialog callbacks + void treeSelected(int heroID, int resType, int resVal, TExpType expVal, ui32 result) const; + void schoolSelected(int heroID, ui32 which) const; + void arenaSelected(int heroID, int primSkill) const; }; class DLL_LINKAGE CGTownBuilding : public IObjectInterface { @@ -515,8 +524,8 @@ class DLL_LINKAGE COPWBonus : public CGTownBuilding {///used for OPW bonusing structures public: std::set visitors; - void setProperty(ui8 what, ui32 val); - void onHeroVisit (const CGHeroInstance * h) const; + void setProperty(ui8 what, ui32 val) override; + void onHeroVisit (const CGHeroInstance * h) const override; COPWBonus (int index, CGTownInstance *TOWN); COPWBonus (){ID = 0; town = NULL;}; @@ -533,8 +542,8 @@ class DLL_LINKAGE CTownBonus : public CGTownBuilding ///feel free to merge inheritance tree public: std::set visitors; - void setProperty(ui8 what, ui32 val); - void onHeroVisit (const CGHeroInstance * h) const; + void setProperty(ui8 what, ui32 val) override; + void onHeroVisit (const CGHeroInstance * h) const override; CTownBonus (int index, CGTownInstance *TOWN); CTownBonus (){ID = 0; town = NULL;}; @@ -604,8 +613,8 @@ public: } ////////////////////////////////////////////////////////////////////////// - virtual CBonusSystemNode *whatShouldBeAttached() OVERRIDE; - std::string nodeName() const OVERRIDE; + CBonusSystemNode *whatShouldBeAttached() override; + std::string nodeName() const override; void deserializationFix(); void recreateBuildingsBonuses(); bool addBonusIfBuilt(int building, int type, int val, TPropagatorPtr prop, int subtype = -1); //returns true if building is built and bonus has been added @@ -622,11 +631,10 @@ public: int getSightRadious() const; //returns sight distance int getBoatType() const; //0 - evil (if a ship can be evil...?), 1 - good, 2 - neutral void getOutOffsets(std::vector &offsets) const; //offsets to obj pos when we boat can be placed - int getMarketEfficiency() const; //=market count + int getMarketEfficiency() const override; //=market count bool allowsTrade(EMarketMode::EMarketMode mode) const; std::vector availableItemsIds(EMarketMode::EMarketMode mode) const; - void setPropertyDer(ui8 what, ui32 val); - void newTurn() const; + ////////////////////////////////////////////////////////////////////////// @@ -651,13 +659,16 @@ public: CGTownInstance(); virtual ~CGTownInstance(); - ////////////////////////////////////////////////////////////////////////// - - + ///IObjectInterface overrides + void newTurn() const override; + void onHeroVisit(const CGHeroInstance * h) const override; + void onHeroLeave(const CGHeroInstance * h) const override; + void initObj() override; +protected: + void setPropertyDer(ui8 what, ui32 val) override; +private: + ///dialog callbacks void fightOver(const CGHeroInstance *h, BattleResult *result) const; - void onHeroVisit(const CGHeroInstance * h) const; - void onHeroLeave(const CGHeroInstance * h) const; - void initObj(); }; class DLL_LINKAGE CGPandoraBox : public CArmedInstance { @@ -677,13 +688,8 @@ public: std::vector spells; //gained spells CCreatureSet creatures; //gained creatures - void initObj(); - void onHeroVisit(const CGHeroInstance * h) const; - void open (const CGHeroInstance * h, ui32 accept) const; - void endBattle(const CGHeroInstance *h, BattleResult *result) const; - void giveContents(const CGHeroInstance *h, bool afterBattle) const; - void getText( InfoWindow &iw, bool &afterBattle, int val, int negative, int positive, const CGHeroInstance * h ) const; - void getText( InfoWindow &iw, bool &afterBattle, int text, const CGHeroInstance * h ) const; + void initObj() override; + void onHeroVisit(const CGHeroInstance * h) const override; template void serialize(Handler &h, const int version) { @@ -691,6 +697,13 @@ public: h & message & gainedExp & manaDiff & moraleDiff & luckDiff & resources & primskills & abilities & abilityLevels & artifacts & spells & creatures; } +protected: + void endBattle(const CGHeroInstance *h, BattleResult *result) const; + void giveContents(const CGHeroInstance *h, bool afterBattle) const; +private: + void open (const CGHeroInstance * h, ui32 accept) const; + void getText( InfoWindow &iw, bool &afterBattle, int val, int negative, int positive, const CGHeroInstance * h ) const; + void getText( InfoWindow &iw, bool &afterBattle, int text, const CGHeroInstance * h ) const; }; class DLL_LINKAGE CGEvent : public CGPandoraBox //event objects @@ -707,9 +720,9 @@ public: h & removeAfterVisit & availableFor & computerActivate & humanActivate; } - void onHeroVisit(const CGHeroInstance * h) const; + void onHeroVisit(const CGHeroInstance * h) const override; +private: void activated(const CGHeroInstance * h) const; - }; class DLL_LINKAGE CGCreature : public CArmedInstance //creatures on map @@ -724,18 +737,12 @@ public: ui8 notGrowingTeam; //if true, number of units won't grow ui64 temppower; //used to handle fractional stack growth for tiny stacks - void fight(const CGHeroInstance *h) const; - void onHeroVisit(const CGHeroInstance * h) const; - const std::string & getHoverText() const; - void flee( const CGHeroInstance * h ) const; - void endBattle(BattleResult *result) const; - void fleeDecision(const CGHeroInstance *h, ui32 pursue) const; - void joinDecision(const CGHeroInstance *h, int cost, ui32 accept) const; - void initObj(); - void newTurn() const; - void setPropertyDer(ui8 what, ui32 val); - int takenAction(const CGHeroInstance *h, bool allowJoin=true) const; //action on confrontation: -2 - fight, -1 - flee, >=0 - will join for given value of gold (may be 0) + void onHeroVisit(const CGHeroInstance * h) const override; + const std::string & getHoverText() const override; + void initObj() override; + void newTurn() const override; + struct DLL_LINKAGE RestoredCreature // info about merging stacks after battle back into one { @@ -751,6 +758,18 @@ public: h & static_cast(*this); h & identifier & character & message & resources & gainedArtifact & neverFlees & notGrowingTeam & temppower & restore; } +protected: + void setPropertyDer(ui8 what, ui32 val) override; +private: + + void fight(const CGHeroInstance *h) const; + void flee( const CGHeroInstance * h ) const; + void endBattle(BattleResult *result) const; + void fleeDecision(const CGHeroInstance *h, ui32 pursue) const; + void joinDecision(const CGHeroInstance *h, int cost, ui32 accept) const; + + int takenAction(const CGHeroInstance *h, bool allowJoin=true) const; //action on confrontation: -2 - fight, -1 - flee, >=0 - will join for given value of gold (may be 0) + }; @@ -759,8 +778,8 @@ class DLL_LINKAGE CGSignBottle : public CGObjectInstance //signs and ocean bottl public: std::string message; - void onHeroVisit(const CGHeroInstance * h) const; - void initObj(); + void onHeroVisit(const CGHeroInstance * h) const override; + void initObj() override; template void serialize(Handler &h, const int version) { @@ -793,11 +812,10 @@ public: std::string seerName; CGSeerHut() : IQuestObject(){}; - void initObj(); - const std::string & getHoverText() const; - void setPropertyDer (ui8 what, ui32 val); - void newTurn() const; - void onHeroVisit (const CGHeroInstance * h) const; + void initObj() override; + const std::string & getHoverText() const override; + void newTurn() const override; + void onHeroVisit(const CGHeroInstance * h) const override; int checkDirection() const; //calculates the region of map where monster is placed void setObjToKill(); //remember creatures / heroes to kill after they are initialized @@ -813,13 +831,15 @@ public: h & static_cast(*this) & static_cast(*this); h & rewardType & rID & rVal & seerName; } +protected: + void setPropertyDer(ui8 what, ui32 val) override; }; class DLL_LINKAGE CGQuestGuard : public CGSeerHut { public: CGQuestGuard() : CGSeerHut(){}; - void initObj(); + void initObj() override; void completeQuest (const CGHeroInstance * h) const; template void serialize(Handler &h, const int version) @@ -834,9 +854,9 @@ public: std::vector allowedAbilities; ui32 ability; - const std::string & getHoverText() const; - void onHeroVisit(const CGHeroInstance * h) const; - void initObj(); + const std::string & getHoverText() const override; + void onHeroVisit(const CGHeroInstance * h) const override; + void initObj() override; template void serialize(Handler &h, const int version) { h & static_cast(*this); @@ -851,9 +871,9 @@ public: ui8 bonusType; //255 - random, 0 - primary skill, 1 - secondary skill, 2 - spell ui16 bonusID; //ID of skill/spell - void giveAnyBonus(const CGHeroInstance * h) const; //FIXME: unused? - void onHeroVisit(const CGHeroInstance * h) const; - void initObj(); +// void giveAnyBonus(const CGHeroInstance * h) const; //TODO: remove + void onHeroVisit(const CGHeroInstance * h) const override; + void initObj() override; template void serialize(Handler &h, const int version) { h & static_cast(*this); @@ -867,7 +887,7 @@ public: ui8 removableUnits; ui8 getPassableness() const; - void onHeroVisit (const CGHeroInstance *h) const; + void onHeroVisit(const CGHeroInstance * h) const override; void fightOver (const CGHeroInstance *h, BattleResult *result) const; template void serialize(Handler &h, const int version) @@ -883,11 +903,11 @@ public: CArtifactInstance *storedArtifact; std::string message; - void onHeroVisit(const CGHeroInstance * h) const; + void onHeroVisit(const CGHeroInstance * h) const override; void fightForArt(ui32 agreed, const CGHeroInstance *h) const; void endBattle(BattleResult *result, const CGHeroInstance *h) const; void pick( const CGHeroInstance * h ) const; - void initObj(); + void initObj() override; template void serialize(Handler &h, const int version) { @@ -902,9 +922,10 @@ public: ui32 amount; //0 if random std::string message; - void onHeroVisit(const CGHeroInstance * h) const; + void onHeroVisit(const CGHeroInstance * h) const override; + void initObj() override; + void collectRes(int player) const; - void initObj(); void fightForRes(ui32 agreed, const CGHeroInstance *h) const; void endBattle(BattleResult *result, const CGHeroInstance *h) const; @@ -920,8 +941,8 @@ class DLL_LINKAGE CGPickable : public CGObjectInstance //campfire, treasure ches public: ui32 type, val1, val2; - void onHeroVisit(const CGHeroInstance * h) const; - void initObj(); + void onHeroVisit(const CGHeroInstance * h) const override; + void initObj() override; void chosen(int which, int heroID) const; template void serialize(Handler &h, const int version) @@ -935,9 +956,9 @@ class DLL_LINKAGE CGShrine : public CPlayersVisited { public: ui8 spell; //number of spell or 255 if random - void onHeroVisit(const CGHeroInstance * h) const; - void initObj(); - const std::string & getHoverText() const; + void onHeroVisit(const CGHeroInstance * h) const override; + void initObj() override; + const std::string & getHoverText() const override; template void serialize(Handler &h, const int version) { @@ -956,11 +977,11 @@ public: void endBattle(BattleResult *result, ui8 attackingPlayer) const; void fight(ui32 agreed, const CGHeroInstance *h) const; - void onHeroVisit(const CGHeroInstance * h) const; + void onHeroVisit(const CGHeroInstance * h) const override; void flagMine(ui8 player) const; - void newTurn() const; - void initObj(); + void newTurn() const override; + void initObj() override; template void serialize(Handler &h, const int version) { h & static_cast(*this); @@ -974,16 +995,17 @@ class DLL_LINKAGE CGVisitableOPW : public CGObjectInstance //objects visitable O public: ui8 visited; //true if object has been visited this week - void setPropertyDer(ui8 what, ui32 val);//synchr bool wasVisited(ui8 player) const; - void onHeroVisit(const CGHeroInstance * h) const; - void newTurn() const; + void onHeroVisit(const CGHeroInstance * h) const override; + void newTurn() const override; template void serialize(Handler &h, const int version) { h & static_cast(*this); h & visited; } +protected: + void setPropertyDer(ui8 what, ui32 val) override; }; class DLL_LINKAGE CGTeleport : public CGObjectInstance //teleports and subterranean gates @@ -991,8 +1013,8 @@ class DLL_LINKAGE CGTeleport : public CGObjectInstance //teleports and subterran public: static std::map > > objs; //teleports: map[ID][subID] => vector of ids static std::vector > gates; //subterranean gates: pairs of ids - void onHeroVisit(const CGHeroInstance * h) const; - void initObj(); + void onHeroVisit(const CGHeroInstance * h) const override; + void initObj() override; static void postInit(); static int getMatchingGate(int id); //receives id of one subterranean gate and returns id of the paired one, -1 if none @@ -1006,9 +1028,9 @@ class DLL_LINKAGE CGBonusingObject : public CGObjectInstance //objects giving bo { public: bool wasVisited (const CGHeroInstance * h) const; - void onHeroVisit(const CGHeroInstance * h) const; - const std::string & getHoverText() const; - void initObj(); + void onHeroVisit(const CGHeroInstance * h) const override; + const std::string & getHoverText() const override; + void initObj() override; template void serialize(Handler &h, const int version) { @@ -1019,8 +1041,8 @@ public: class DLL_LINKAGE CGMagicSpring : public CGVisitableOPW {///unfortunatelly, this one is quite different than others public: - void onHeroVisit(const CGHeroInstance * h) const; - const std::string & getHoverText() const; + void onHeroVisit(const CGHeroInstance * h) const override; + const std::string & getHoverText() const override; template void serialize(Handler &h, const int version) { @@ -1032,8 +1054,8 @@ public: class DLL_LINKAGE CGMagicWell : public CGObjectInstance //objects giving bonuses to luck/morale/movement { public: - void onHeroVisit(const CGHeroInstance * h) const; - const std::string & getHoverText() const; + void onHeroVisit(const CGHeroInstance * h) const override; + const std::string & getHoverText() const override; template void serialize(Handler &h, const int version) { @@ -1044,9 +1066,9 @@ public: class DLL_LINKAGE CGSirens : public CGObjectInstance { public: - void onHeroVisit(const CGHeroInstance * h) const; - const std::string & getHoverText() const; - void initObj(); + void onHeroVisit(const CGHeroInstance * h) const override; + const std::string & getHoverText() const override; + void initObj() override; template void serialize(Handler &h, const int version) { @@ -1057,7 +1079,7 @@ public: class DLL_LINKAGE CGObservatory : public CGObjectInstance //Redwood observatory { public: - void onHeroVisit(const CGHeroInstance * h) const; + void onHeroVisit(const CGHeroInstance * h) const override; template void serialize(Handler &h, const int version) { @@ -1072,21 +1094,24 @@ public: static std::map > playerKeyMap; //[players][keysowned] //SubID 0 - lightblue, 1 - green, 2 - red, 3 - darkblue, 4 - brown, 5 - purple, 6 - white, 7 - black - void setPropertyDer (ui8 what, ui32 val); const std::string getName() const; //depending on color bool wasMyColorVisited (int player) const; + + const std::string & getHoverText() const override; + template void serialize(Handler &h, const int version) { h & static_cast(*this); } +protected: + void setPropertyDer(ui8 what, ui32 val) override; }; class DLL_LINKAGE CGKeymasterTent : public CGKeys { public: bool wasVisited (ui8 player) const; - void onHeroVisit(const CGHeroInstance * h) const; - const std::string & getHoverText() const; + void onHeroVisit(const CGHeroInstance * h) const override; template void serialize(Handler &h, const int version) { @@ -1098,12 +1123,13 @@ class DLL_LINKAGE CGBorderGuard : public CGKeys, public IQuestObject { public: CGBorderGuard() : IQuestObject(){}; - void initObj(); - const std::string & getHoverText() const; + void initObj() override; + void onHeroVisit(const CGHeroInstance * h) const override; + void getVisitText (MetaString &text, std::vector &components, bool isCustom, bool FirstVisit, const CGHeroInstance * h = NULL) const; void getRolloverText (MetaString &text, bool onHover) const; bool checkQuest (const CGHeroInstance * h) const; - void onHeroVisit(const CGHeroInstance * h) const; + void openGate(const CGHeroInstance *h, ui32 accept) const; template void serialize(Handler &h, const int version) @@ -1118,8 +1144,9 @@ class DLL_LINKAGE CGBorderGate : public CGBorderGuard { public: CGBorderGate() : CGBorderGuard(){}; - void onHeroVisit(const CGHeroInstance * h) const; - ui8 getPassableness() const; + void onHeroVisit(const CGHeroInstance * h) const override; + + ui8 getPassableness() const override; template void serialize(Handler &h, const int version) { @@ -1133,7 +1160,7 @@ public: ui8 direction; const CGHeroInstance *hero; //hero on board - void initObj(); + void initObj() override; CGBoat() { @@ -1154,9 +1181,10 @@ public: ui32 bonusType, //id of res or artifact bonusVal; //resource amount (or not used) - void onHeroVisit(const CGHeroInstance * h) const; - const std::string & getHoverText() const; - void initObj(); + void onHeroVisit(const CGHeroInstance * h) const override; + const std::string & getHoverText() const override; + void initObj() override; + void searchTomb(const CGHeroInstance *h, ui32 accept) const; template void serialize(Handler &h, const int version) @@ -1175,14 +1203,14 @@ class DLL_LINKAGE CBank : public CArmedInstance std::vector artifacts; //fixed and deterministic ui32 daycounter; - void initObj(); - const std::string & getHoverText() const; - void setPropertyDer (ui8 what, ui32 val); + void initObj() override; + const std::string & getHoverText() const override; void initialize() const; void reset(ui16 var1); - void newTurn() const; - bool wasVisited (ui8 player) const; - virtual void onHeroVisit (const CGHeroInstance * h) const; + void newTurn() const override; + bool wasVisited (ui8 player) const override; + void onHeroVisit(const CGHeroInstance * h) const override; + virtual void fightGuards (const CGHeroInstance *h, ui32 accept) const; virtual void endBattle (const CGHeroInstance *h, const BattleResult *result) const; @@ -1191,17 +1219,20 @@ class DLL_LINKAGE CBank : public CArmedInstance h & static_cast(*this); h & index & multiplier & artifacts & daycounter & bc; } +protected: + void setPropertyDer(ui8 what, ui32 val) override; }; class DLL_LINKAGE CGPyramid : public CBank { public: ui16 spell; - void initObj(); - const std::string & getHoverText() const; - void newTurn() const {}; //empty, no reset - void onHeroVisit (const CGHeroInstance * h) const; - void endBattle (const CGHeroInstance *h, const BattleResult *result) const; + void initObj() override; + const std::string & getHoverText() const override; + void newTurn() const override {}; //empty, no reset + void onHeroVisit(const CGHeroInstance * h) const override; + + void endBattle (const CGHeroInstance *h, const BattleResult *result) const override; template void serialize(Handler &h, const int version) { @@ -1215,7 +1246,7 @@ class CGShipyard : public CGObjectInstance, public IShipyard public: void getOutOffsets(std::vector &offsets) const; //offsets to obj pos when we boat can be placed CGShipyard(); - void onHeroVisit(const CGHeroInstance * h) const; + void onHeroVisit(const CGHeroInstance * h) const override; }; class DLL_LINKAGE CGMagi : public CGObjectInstance @@ -1223,8 +1254,8 @@ class DLL_LINKAGE CGMagi : public CGObjectInstance public: static std::map > eyelist; //[subID][id], supports multiple sets as in H5 - void initObj(); - void onHeroVisit(const CGHeroInstance * h) const; + void initObj() override; + void onHeroVisit(const CGHeroInstance * h) const override; template void serialize(Handler &h, const int version) { @@ -1238,7 +1269,7 @@ class DLL_LINKAGE CCartographer : public CPlayersVisited { ///behaviour varies depending on surface and floor public: - void onHeroVisit( const CGHeroInstance * h ) const; + void onHeroVisit(const CGHeroInstance * h) const override; void buyMap (const CGHeroInstance *h, ui32 accept) const; template void serialize(Handler &h, const int version) @@ -1249,7 +1280,7 @@ public: class DLL_LINKAGE CGDenOfthieves : public CGObjectInstance { - void onHeroVisit (const CGHeroInstance * h) const; + void onHeroVisit(const CGHeroInstance * h) const override; }; class DLL_LINKAGE CGObelisk : public CPlayersVisited @@ -1258,23 +1289,24 @@ public: static ui8 obeliskCount; //how many obelisks are on map static std::map visited; //map: team_id => how many obelisks has been visited - void setPropertyDer (ui8 what, ui32 val); - void onHeroVisit(const CGHeroInstance * h) const; - void initObj(); - const std::string & getHoverText() const; + void onHeroVisit(const CGHeroInstance * h) const override; + void initObj() override; + const std::string & getHoverText() const override; template void serialize(Handler &h, const int version) { h & static_cast(*this); } +protected: + void setPropertyDer(ui8 what, ui32 val) override; }; class DLL_LINKAGE CGLighthouse : public CGObjectInstance { public: - void onHeroVisit(const CGHeroInstance * h) const; - void initObj(); - const std::string & getHoverText() const; + void onHeroVisit(const CGHeroInstance * h) const override; + void initObj() override; + const std::string & getHoverText() const override; template void serialize(Handler &h, const int version) { @@ -1287,12 +1319,14 @@ class DLL_LINKAGE CGMarket : public CGObjectInstance, public IMarket { public: CGMarket(); - void onHeroVisit(const CGHeroInstance * h) const; //open trading window + ///IObjectIntercae + void onHeroVisit(const CGHeroInstance * h) const override; //open trading window - int getMarketEfficiency() const; - bool allowsTrade(EMarketMode::EMarketMode mode) const; - int availableUnits(EMarketMode::EMarketMode mode, int marketItemSerial) const; //-1 if unlimited - std::vector availableItemsIds(EMarketMode::EMarketMode mode) const; + ///IMarket + int getMarketEfficiency() const override; + bool allowsTrade(EMarketMode::EMarketMode mode) const override; + int availableUnits(EMarketMode::EMarketMode mode, int marketItemSerial) const override; //-1 if unlimited + std::vector availableItemsIds(EMarketMode::EMarketMode mode) const override; template void serialize(Handler &h, const int version) { @@ -1305,8 +1339,8 @@ class DLL_LINKAGE CGBlackMarket : public CGMarket public: std::vector artifacts; //available artifacts - void newTurn() const; //reset artifacts for black market every month - std::vector availableItemsIds(EMarketMode::EMarketMode mode) const; + void newTurn() const override; //reset artifacts for black market every month + std::vector availableItemsIds(EMarketMode::EMarketMode mode) const override; template void serialize(Handler &h, const int version) { @@ -1321,8 +1355,8 @@ public: std::vector skills; //available skills std::vector availableItemsIds(EMarketMode::EMarketMode mode) const; - void initObj();//set skills for trade - void onHeroVisit(const CGHeroInstance * h) const; //open window + void initObj() override;//set skills for trade + void onHeroVisit(const CGHeroInstance * h) const override; //open window template void serialize(Handler &h, const int version) { diff --git a/lib/Mapping/CMapService.cpp b/lib/Mapping/CMapService.cpp index 22c59073b..197f9ae5b 100644 --- a/lib/Mapping/CMapService.cpp +++ b/lib/Mapping/CMapService.cpp @@ -993,7 +993,7 @@ void CMapLoaderH3M::readDefInfo() //add holes - they always can appear for(int i = 0; i < 8 ; ++i) { - map->customDefs.push_back(VLC->dobjinfo->gobjs[124][i]); + map->customDefs.push_back(VLC->dobjinfo->gobjs[Obj::HOLE][i]); } } @@ -1147,7 +1147,7 @@ void CMapLoaderH3M::readObjects() nobj = new CGVisitableOPW(); break; } - case Obj::MONOLITH1: + case Obj::MONOLITH1: case Obj::MONOLITH2: case Obj::MONOLITH3: case Obj::SUBTERRANEAN_GATE: @@ -1166,13 +1166,13 @@ void CMapLoaderH3M::readObjects() break; } case Obj::MONSTER: //Monster - case Obj::RANDOM_MONSTER: - case Obj::RANDOM_MONSTER_L1: + case Obj::RANDOM_MONSTER: + case Obj::RANDOM_MONSTER_L1: case Obj::RANDOM_MONSTER_L2: - case Obj::RANDOM_MONSTER_L3: + case Obj::RANDOM_MONSTER_L3: case Obj::RANDOM_MONSTER_L4: - case Obj::RANDOM_MONSTER_L5: - case Obj::RANDOM_MONSTER_L6: + case Obj::RANDOM_MONSTER_L5: + case Obj::RANDOM_MONSTER_L6: case Obj::RANDOM_MONSTER_L7: { CGCreature * cre = new CGCreature(); @@ -1248,7 +1248,7 @@ void CMapLoaderH3M::readObjects() pos += 2; break; } - case Obj::OCEAN_BOTTLE: + case Obj::OCEAN_BOTTLE: case Obj::SIGN: { CGSignBottle * sb = new CGSignBottle(); @@ -1263,7 +1263,7 @@ void CMapLoaderH3M::readObjects() map->addQuest(nobj); break; } - case Obj::WITCH_HUT: + case Obj::WITCH_HUT: { CGWitchHut * wh = new CGWitchHut(); nobj = wh; @@ -1306,7 +1306,7 @@ void CMapLoaderH3M::readObjects() pos += 6; break; } - case Obj::GARRISON: + case Obj::GARRISON: case Obj::GARRISON2: { CGGarrison * gar = new CGGarrison(); @@ -1327,9 +1327,9 @@ void CMapLoaderH3M::readObjects() break; } case Obj::ARTIFACT: - case Obj::RANDOM_ART: - case Obj::RANDOM_TREASURE_ART: - case Obj::RANDOM_MINOR_ART: + case Obj::RANDOM_ART: + case Obj::RANDOM_TREASURE_ART: + case Obj::RANDOM_MINOR_ART: case Obj::RANDOM_MAJOR_ART: case Obj::RANDOM_RELIC_ART: case Obj::SPELL_SCROLL: @@ -1366,7 +1366,7 @@ void CMapLoaderH3M::readObjects() art->storedArtifact = createArtifact(artID, spellID); break; } - case Obj::RANDOM_RESOURCE: + case Obj::RANDOM_RESOURCE: case Obj::RESOURCE: { CGResource * res = new CGResource(); @@ -1394,7 +1394,7 @@ void CMapLoaderH3M::readObjects() break; } - case Obj::RANDOM_TOWN: + case Obj::RANDOM_TOWN: case Obj::TOWN: { nobj = readTown(defInfo->subid); @@ -1408,9 +1408,9 @@ void CMapLoaderH3M::readObjects() pos += 3; break; } - case Obj::CREATURE_GENERATOR1: - case Obj::CREATURE_GENERATOR2: - case Obj::CREATURE_GENERATOR3: + case Obj::CREATURE_GENERATOR1: + case Obj::CREATURE_GENERATOR2: + case Obj::CREATURE_GENERATOR3: case Obj::CREATURE_GENERATOR4: { nobj = new CGDwelling(); @@ -1424,8 +1424,8 @@ void CMapLoaderH3M::readObjects() nobj = new CGDwelling(); break; } - case Obj::SHRINE_OF_MAGIC_INCANTATION: - case Obj::SHRINE_OF_MAGIC_GESTURE: + case Obj::SHRINE_OF_MAGIC_INCANTATION: + case Obj::SHRINE_OF_MAGIC_GESTURE: case Obj::SHRINE_OF_MAGIC_THOUGHT: { CGShrine * shr = new CGShrine(); @@ -1519,7 +1519,7 @@ void CMapLoaderH3M::readObjects() continue; } case Obj::RANDOM_DWELLING: //same as castle + level range - case Obj::RANDOM_DWELLING_LVL: //same as castle, fixed level + case Obj::RANDOM_DWELLING_LVL: //same as castle, fixed level case Obj::RANDOM_DWELLING_FACTION: //level range, fixed faction { nobj = new CGDwelling(); @@ -1601,7 +1601,7 @@ void CMapLoaderH3M::readObjects() nobj = new CGObservatory(); break; } - case Obj::CORPSE: + case Obj::CORPSE: case Obj::LEAN_TO: case Obj::WAGON: case Obj::WARRIORS_TOMB: @@ -1665,16 +1665,16 @@ void CMapLoaderH3M::readObjects() map->addQuest (nobj); break; } - case Obj::EYE_OF_MAGI: + case Obj::EYE_OF_MAGI: case Obj::HUT_OF_MAGI: { nobj = new CGMagi(); break; } - case Obj::CREATURE_BANK: - case Obj::DERELICT_SHIP: - case Obj::DRAGON_UTOPIA: - case Obj::CRYPT: + case Obj::CREATURE_BANK: + case Obj::DERELICT_SHIP: + case Obj::DRAGON_UTOPIA: + case Obj::CRYPT: case Obj::SHIPWRECK: { nobj = new CBank(); @@ -1691,7 +1691,7 @@ void CMapLoaderH3M::readObjects() //WoG object //TODO: possible special handling nobj = new CGObjectInstance(); - } + } break; } case Obj::CARTOGRAPHER: @@ -1699,7 +1699,7 @@ void CMapLoaderH3M::readObjects() nobj = new CCartographer(); break; } - case Obj::MAGIC_SPRING: + case Obj::MAGIC_SPRING: { nobj = new CGMagicSpring(); break; @@ -1721,9 +1721,9 @@ void CMapLoaderH3M::readObjects() pos += 4; break; } - case Obj::ALTAR_OF_SACRIFICE: - case Obj::TRADING_POST: - case Obj::FREELANCERS_GUILD: + case Obj::ALTAR_OF_SACRIFICE: + case Obj::TRADING_POST: + case Obj::FREELANCERS_GUILD: case Obj::TRADING_POST_SNOW: { nobj = new CGMarket();