From 9e00090c4208880491b03658cc8ce92b5655b295 Mon Sep 17 00:00:00 2001 From: mateuszb Date: Wed, 13 Feb 2013 23:55:42 +0000 Subject: [PATCH] * refactoring, a few intriguing problems remain --- AI/VCAI/VCAI.cpp | 52 +++++------ AI/VCAI/VCAI.h | 9 +- CCallback.cpp | 2 +- client/CCastleInterface.cpp | 6 +- client/CCastleInterface.h | 2 +- client/CPlayerInterface.cpp | 14 +-- client/CPlayerInterface.h | 2 +- client/CSpellWindow.cpp | 4 +- client/Client.h | 20 ++--- client/GUIClasses.cpp | 4 +- client/GUIClasses.h | 2 +- client/NetPacksClient.cpp | 46 +++++----- lib/BattleState.cpp | 2 +- lib/CArtHandler.cpp | 6 +- lib/CArtHandler.h | 5 +- lib/CBattleCallback.cpp | 4 +- lib/CBattleCallback.h | 2 +- lib/CGameState.cpp | 22 ++--- lib/CGameState.h | 2 +- lib/CObjectHandler.cpp | 147 ++++++++++++++++---------------- lib/CObjectHandler.h | 28 +++--- lib/GameConstants.cpp | 5 ++ lib/GameConstants.h | 90 ++++++++++++++++++- lib/IGameCallback.cpp | 53 ++++++++---- lib/IGameCallback.h | 44 +++++----- lib/IGameEventsReceiver.h | 6 +- lib/Mapping/CMap.cpp | 6 +- lib/Mapping/CMap.h | 2 +- lib/Mapping/CMapEditManager.cpp | 2 +- lib/Mapping/MapFormatH3M.cpp | 6 +- lib/Mapping/MapFormatH3M.h | 2 +- lib/NetPacks.h | 135 +++++++++++++++-------------- lib/NetPacksLib.cpp | 32 +++---- server/CGameHandler.cpp | 138 +++++++++++++++--------------- server/CGameHandler.h | 60 ++++++------- server/NetPacksServer.cpp | 2 +- 36 files changed, 544 insertions(+), 420 deletions(-) diff --git a/AI/VCAI/VCAI.cpp b/AI/VCAI/VCAI.cpp index 0f9b40d6d..4faa103ea 100644 --- a/AI/VCAI/VCAI.cpp +++ b/AI/VCAI/VCAI.cpp @@ -656,7 +656,7 @@ void VCAI::tileRevealed(const boost::unordered_set &pos) addVisitableObj(obj); } -void VCAI::heroExchangeStarted(si32 hero1, si32 hero2) +void VCAI::heroExchangeStarted(ObjectInstanceID hero1, ObjectInstanceID hero2) { NET_EVENT_HANDLER; LOG_ENTRY; @@ -1541,7 +1541,7 @@ void VCAI::wander(HeroPtr h) { if(!dest) { - BNLOG("Visit attempt made the object (id=%d) gone...", dest.id); + BNLOG("Visit attempt made the object (id=%d) gone...", dest.id.getNum()); } else { @@ -1968,7 +1968,7 @@ void VCAI::tryRealize(CGoal g) if(cb->getResourceAmount(static_cast(g.resID)) >= g.value) throw cannotFulfillGoalException("Goal is already fulfilled!"); - if(const CGObjectInstance *obj = cb->getObj(g.objid, false)) + if(const CGObjectInstance *obj = cb->getObj(ObjectInstanceID(g.objid), false)) { if(const IMarket *m = IMarket::castFrom(obj, false)) { @@ -2069,7 +2069,7 @@ bool VCAI::fulfillsGoal (CGoal &goal, CGoal &mainGoal) { if (mainGoal.goalType == GET_OBJ && goal.goalType == VISIT_TILE) //deduce that GET_OBJ was completed by visiting object's tile { //TODO: more universal mechanism - if (cb->getObj(mainGoal.objid)->visitablePos() == goal.tile) + if (cb->getObj(ObjectInstanceID(mainGoal.objid))->visitablePos() == goal.tile) return true; } return false; @@ -2078,7 +2078,7 @@ bool VCAI::fulfillsGoal (CGoal &goal, const CGoal &mainGoal) { if (mainGoal.goalType == GET_OBJ && goal.goalType == VISIT_TILE) //deduce that GET_OBJ was completed by visiting object's tile { //TODO: more universal mechanism - if (cb->getObj(mainGoal.objid)->visitablePos() == goal.tile) + if (cb->getObj(ObjectInstanceID(mainGoal.objid))->visitablePos() == goal.tile) return true; } return false; @@ -2226,7 +2226,7 @@ void VCAI::striveToQuest (const QuestInfo &q) { if (q.quest->checkQuest(hero)) { - striveToGoal (CGoal(GET_OBJ).setobjid(q.obj->id).sethero(hero)); + striveToGoal (CGoal(GET_OBJ).setobjid(q.obj->id.getNum()).sethero(hero)); return; } } @@ -2243,7 +2243,7 @@ void VCAI::striveToQuest (const QuestInfo &q) { if (q.quest->checkQuest(hero)) { - striveToGoal (CGoal(GET_OBJ).setobjid(q.obj->id).sethero(hero)); + striveToGoal (CGoal(GET_OBJ).setobjid(q.obj->id.getNum()).sethero(hero)); return; } } @@ -2257,7 +2257,7 @@ void VCAI::striveToQuest (const QuestInfo &q) { if (q.quest->checkQuest(hero)) //veyr bad info - stacks can be split between multiple heroes :( { - striveToGoal (CGoal(GET_OBJ).setobjid(q.obj->id).sethero(hero)); + striveToGoal (CGoal(GET_OBJ).setobjid(q.obj->id.getNum()).sethero(hero)); return; } } @@ -2295,7 +2295,7 @@ void VCAI::striveToQuest (const QuestInfo &q) { auto obj = cb->getObjByQuestIdentifier(q.quest->m13489val); if (obj) - striveToGoal (CGoal(GET_OBJ).setobjid(obj->id)); + striveToGoal (CGoal(GET_OBJ).setobjid(obj->id.getNum())); else striveToGoal (CGoal(VISIT_TILE).settile(q.tile)); //visit seer hut break; @@ -2307,7 +2307,7 @@ void VCAI::striveToQuest (const QuestInfo &q) { if (q.quest->checkQuest(hero)) { - striveToGoal (CGoal(GET_OBJ).setobjid(q.obj->id).sethero(hero)); + striveToGoal (CGoal(GET_OBJ).setobjid(q.obj->id.getNum()).sethero(hero)); return; } } @@ -2772,9 +2772,9 @@ TSubgoal CGoal::whatToDoToAchieve() case EVictoryConditionType::ARTIFACT: return CGoal(GET_ART_TYPE).setaid(vc.objectId); case EVictoryConditionType::BEATHERO: - return CGoal(GET_OBJ).setobjid(vc.obj->id); + return CGoal(GET_OBJ).setobjid(vc.obj->id.getNum()); case EVictoryConditionType::BEATMONSTER: - return CGoal(GET_OBJ).setobjid(vc.obj->id); + return CGoal(GET_OBJ).setobjid(vc.obj->id.getNum()); case EVictoryConditionType::BUILDCITY: //TODO build castle/capitol break; @@ -2812,14 +2812,14 @@ TSubgoal CGoal::whatToDoToAchieve() } //TODO: use FIND_OBJ else if(const CGObjectInstance * obj = ai->getUnvisitedObj(objWithID)) //there are unvisited Obelisks { - return CGoal(GET_OBJ).setobjid(obj->id); + return CGoal(GET_OBJ).setobjid(obj->id.getNum()); } else return CGoal(EXPLORE); } break; case EVictoryConditionType::CAPTURECITY: - return CGoal(GET_OBJ).setobjid(vc.obj->id); + return CGoal(GET_OBJ).setobjid(vc.obj->id.getNum()); case EVictoryConditionType::GATHERRESOURCE: return CGoal(COLLECT_RES).setresID(static_cast(vc.objectId)).setvalue(vc.count); //TODO mines? piles? marketplace? @@ -2867,14 +2867,14 @@ TSubgoal CGoal::whatToDoToAchieve() } } if (o && isReachable(o)) - return CGoal(GET_OBJ).setobjid(o->id); + return CGoal(GET_OBJ).setobjid(o->id.getNum()); else return CGoal(EXPLORE); } break; case GET_OBJ: { - const CGObjectInstance * obj = cb->getObj(objid); + const CGObjectInstance * obj = cb->getObj(ObjectInstanceID(objid)); if(!obj) return CGoal(EXPLORE); int3 pos = obj->visitablePos(); @@ -2883,7 +2883,7 @@ TSubgoal CGoal::whatToDoToAchieve() break; case VISIT_HERO: { - const CGObjectInstance * obj = cb->getObj(objid); + const CGObjectInstance * obj = cb->getObj(ObjectInstanceID(objid)); if(!obj) return CGoal(EXPLORE); int3 pos = obj->visitablePos(); @@ -3189,8 +3189,8 @@ TSubgoal CGoal::whatToDoToAchieve() auto backObj = backOrNull(cb->getVisitableObjs(m->o->visitablePos())); //it'll be a hero if we have one there; otherwise marketplace assert(backObj); if(backObj->tempOwner != ai->playerID) - return CGoal(GET_OBJ).setobjid(m->o->id); - return setobjid(m->o->id).setisElementar(true); + return CGoal(GET_OBJ).setobjid(m->o->id.getNum()); + return setobjid(m->o->id.getNum()).setisElementar(true); } } } @@ -3238,7 +3238,7 @@ TSubgoal CGoal::whatToDoToAchieve() if (dwellings.size()) { boost::sort(dwellings, isCloser); - return CGoal(GET_OBJ).setobjid (dwellings.front()->id); //TODO: consider needed resources + return CGoal(GET_OBJ).setobjid (dwellings.front()->id.getNum()); //TODO: consider needed resources } else return CGoal(EXPLORE); @@ -3315,7 +3315,7 @@ TSubgoal CGoal::whatToDoToAchieve() ai->reserveObject(h, obj); //no one else will capture same object until we fail if (obj->ID == Obj::HERO) - return CGoal(VISIT_HERO).sethero(h).setobjid(obj->id).setisAbstract(true); //track enemy hero + return CGoal(VISIT_HERO).sethero(h).setobjid(obj->id.getNum()).setisAbstract(true); //track enemy hero else return CGoal(VISIT_TILE).sethero(h).settile(obj->visitablePos()); } @@ -3375,9 +3375,9 @@ TSubgoal CGoal::whatToDoToAchieve() secondaryPath = cb->getPathInfo(hero->visitablePos())->turns; if (primaryPath < secondaryPath) - return CGoal(VISIT_HERO).setisAbstract(true).setobjid(h->id).sethero(hero); //go to the other hero if we are faster + return CGoal(VISIT_HERO).setisAbstract(true).setobjid(h->id.getNum()).sethero(hero); //go to the other hero if we are faster else - return CGoal(VISIT_HERO).setisAbstract(true).setobjid(hero->id).sethero(h); //let the other hero come to us + return CGoal(VISIT_HERO).setisAbstract(true).setobjid(hero->id.getNum()).sethero(h); //let the other hero come to us } } @@ -3426,7 +3426,7 @@ TSubgoal CGoal::whatToDoToAchieve() TSubgoal CGoal::goVisitOrLookFor(const CGObjectInstance *obj) { if(obj) - return CGoal(GET_OBJ).setobjid(obj->id); + return CGoal(GET_OBJ).setobjid(obj->id.getNum()); else return CGoal(EXPLORE); } @@ -3901,7 +3901,7 @@ ObjectIdRef::operator const CGObjectInstance*() const return cb->getObj(id, false); } -ObjectIdRef::ObjectIdRef(int _id) : id(_id) +ObjectIdRef::ObjectIdRef(ObjectInstanceID _id) : id(_id) { } @@ -3935,7 +3935,7 @@ HeroPtr::HeroPtr(const CGHeroInstance *H) HeroPtr::HeroPtr() { h = nullptr; - hid = -1; + hid = ObjectInstanceID(); } HeroPtr::~HeroPtr() diff --git a/AI/VCAI/VCAI.h b/AI/VCAI/VCAI.h index dc72e3ffb..250665471 100644 --- a/AI/VCAI/VCAI.h +++ b/AI/VCAI/VCAI.h @@ -29,7 +29,7 @@ typedef const std::string& crstring; struct HeroPtr { const CGHeroInstance *h; - int hid; //hero id (object subID or type ID) + ObjectInstanceID hid; public: std::string name; @@ -138,7 +138,6 @@ struct CGoal isElementar = false; isAbstract = false; value = 0; - objid = -1; aid = -1; resID = -1; tile = int3(-1, -1, -1); @@ -220,12 +219,12 @@ struct CIssueCommand : CGoal // This class stores object id, so we can detect when we lose access to the underlying object. struct ObjectIdRef { - int id; + ObjectInstanceID id; const CGObjectInstance *operator->() const; operator const CGObjectInstance *() const; - ObjectIdRef(int _id); + ObjectIdRef(ObjectInstanceID _id); ObjectIdRef(const CGObjectInstance *obj); bool operator<(const ObjectIdRef &rhs) const; @@ -315,7 +314,7 @@ public: virtual void availableArtifactsChanged(const CGBlackMarket *bm = NULL) OVERRIDE; virtual void heroVisitsTown(const CGHeroInstance* hero, const CGTownInstance * town) OVERRIDE; virtual void tileRevealed(const boost::unordered_set &pos) OVERRIDE; - virtual void heroExchangeStarted(si32 hero1, si32 hero2) OVERRIDE; + virtual void heroExchangeStarted(ObjectInstanceID hero1, ObjectInstanceID hero2) OVERRIDE; virtual void heroPrimarySkillChanged(const CGHeroInstance * hero, int which, si64 val) OVERRIDE; virtual void showRecruitmentDialog(const CGDwelling *dwelling, const CArmedInstance *dst, int level) OVERRIDE; virtual void heroMovePointsChanged(const CGHeroInstance * hero) OVERRIDE; diff --git a/CCallback.cpp b/CCallback.cpp index 03b48a616..144a29d07 100644 --- a/CCallback.cpp +++ b/CCallback.cpp @@ -259,7 +259,7 @@ void CCallback::recruitHero(const CGObjectInstance *townOrTavern, const CGHeroIn { if(gs->players[*player].availableHeroes[i] == hero) { - HireHero pack(i,townOrTavern->id); + HireHero pack(i, townOrTavern->id); pack.player = *player; sendRequest(&pack); return; diff --git a/client/CCastleInterface.cpp b/client/CCastleInterface.cpp index a1ccd2036..b8635762d 100644 --- a/client/CCastleInterface.cpp +++ b/client/CCastleInterface.cpp @@ -746,7 +746,7 @@ void CCastleBuildings::enterCastleGate() if (t->id != this->town->id && t->visitingHero == NULL && //another town, empty and this is t->hasBuilt(BuildingID::CASTLE_GATE, ETownType::INFERNO)) { - availableTowns.push_back(t->id);//add to the list + availableTowns.push_back(t->id.getNum());//add to the list } } CPicture *titlePic = new CPicture (LOCPLINT->castleInt->bicons->ourImages[BuildingID::CASTLE_GATE].bitmap, 0,0, false);//will be deleted by selection window @@ -909,7 +909,7 @@ void CCastleInterface::close() void CCastleInterface::castleTeleport(int where) { - const CGTownInstance * dest = LOCPLINT->cb->getTown(where); + const CGTownInstance * dest = LOCPLINT->cb->getTown(ObjectInstanceID(where)); LOCPLINT->cb->teleportHero(town->visitingHero, dest); } @@ -1653,7 +1653,7 @@ void CMageGuildScreen::Scroll::hover(bool on) } -CBlacksmithDialog::CBlacksmithDialog(bool possible, int creMachineID, ArtifactID aid, int hid): +CBlacksmithDialog::CBlacksmithDialog(bool possible, CreatureID creMachineID, ArtifactID aid, ObjectInstanceID hid): CWindowObject(PLAYER_COLORED, "TPSMITH") { OBJ_CONSTRUCTION_CAPTURING_ALL; diff --git a/client/CCastleInterface.h b/client/CCastleInterface.h index da3c45005..6a4e65515 100644 --- a/client/CCastleInterface.h +++ b/client/CCastleInterface.h @@ -369,5 +369,5 @@ class CBlacksmithDialog : public CWindowObject CGStatusBar *statusBar; public: - CBlacksmithDialog(bool possible, int creMachineID, ArtifactID aid, int hid); + CBlacksmithDialog(bool possible, CreatureID creMachineID, ArtifactID aid, ObjectInstanceID hid); }; diff --git a/client/CPlayerInterface.cpp b/client/CPlayerInterface.cpp index a0dbe23cb..dc065823d 100644 --- a/client/CPlayerInterface.cpp +++ b/client/CPlayerInterface.cpp @@ -200,22 +200,22 @@ void CPlayerInterface::yourTurn() acceptTurn(); } -STRONG_INLINE void subRect(const int & x, const int & y, const int & z, const SDL_Rect & r, const int & hid) +STRONG_INLINE void subRect(const int & x, const int & y, const int & z, const SDL_Rect & r, const ObjectInstanceID & hid) { TerrainTile2 & hlp = CGI->mh->ttiles[x][y][z]; for(int h=0; hid==hid) + if(hlp.objects[h].first->id == hid) { hlp.objects[h].second = r; return; } } -STRONG_INLINE void delObjRect(const int & x, const int & y, const int & z, const int & hid) +STRONG_INLINE void delObjRect(const int & x, const int & y, const int & z, const ObjectInstanceID & hid) { TerrainTile2 & hlp = CGI->mh->ttiles[x][y][z]; for(int h=0; hid==hid) + if(hlp.objects[h].first->id == hid) { hlp.objects.erase(hlp.objects.begin()+h); return; @@ -1156,7 +1156,7 @@ template void CPlayerInterface::serializeTempl( Handler &h, c h & sleepingSize; for (int i = 0; i < sleepingSize; i++) { - si32 hid; + ObjectInstanceID hid; if (h.saving) hid = sleepingHeroes[i]->id; h & hid; @@ -1176,7 +1176,7 @@ template void CPlayerInterface::serializeTempl( Handler &h, c h & heroListSize; for (int i = 0; i < heroListSize; i++) { - si32 hid; + ObjectInstanceID hid; if (h.saving) hid = wanderingHeroes[i]->id; h & hid; @@ -1381,7 +1381,7 @@ void CPlayerInterface::requestRealized( PackageApplied *pa ) stillMoveHero.setn(CONTINUE_MOVE); } -void CPlayerInterface::heroExchangeStarted(si32 hero1, si32 hero2) +void CPlayerInterface::heroExchangeStarted(ObjectInstanceID hero1, ObjectInstanceID hero2) { EVENT_HANDLER_CALLED_BY_CLIENT; GH.pushInt(new CExchangeWindow(hero1, hero2)); diff --git a/client/CPlayerInterface.h b/client/CPlayerInterface.h index ba38591ee..b60660a46 100644 --- a/client/CPlayerInterface.h +++ b/client/CPlayerInterface.h @@ -175,7 +175,7 @@ public: void heroBonusChanged(const CGHeroInstance *hero, const Bonus &bonus, bool gain) OVERRIDE;//if gain hero received bonus, else he lost it void playerBonusChanged(const Bonus &bonus, bool gain) OVERRIDE; void requestRealized(PackageApplied *pa) OVERRIDE; - void heroExchangeStarted(si32 hero1, si32 hero2) OVERRIDE; + void heroExchangeStarted(ObjectInstanceID hero1, ObjectInstanceID hero2) OVERRIDE; void centerView (int3 pos, int focusTime) OVERRIDE; void objectPropertyChanged(const SetObjectProperty * sop) OVERRIDE; void objectRemoved(const CGObjectInstance *obj) OVERRIDE; diff --git a/client/CSpellWindow.cpp b/client/CSpellWindow.cpp index 5848dab0c..56f01e38c 100644 --- a/client/CSpellWindow.cpp +++ b/client/CSpellWindow.cpp @@ -586,7 +586,7 @@ Uint8 CSpellWindow::pagesWithinCurrentTab() void CSpellWindow::teleportTo( int town, const CGHeroInstance * hero ) { - const CGTownInstance * dest = LOCPLINT->cb->getTown(town); + const CGTownInstance * dest = LOCPLINT->cb->getTown(ObjectInstanceID(town)); LOCPLINT->cb->castSpell(hero, SpellID::TOWN_PORTAL, dest->visitablePos()); } @@ -761,7 +761,7 @@ void CSpellWindow::SpellArea::clickLeft(tribool down, bool previousState) const CGTownInstance *t = Towns[i]; if (t->visitingHero == NULL) //empty town and this is { - availableTowns.push_back(t->id);//add to the list + availableTowns.push_back(t->id.getNum());//add to the list } } if (availableTowns.empty()) diff --git a/client/Client.h b/client/Client.h index 947d340f6..d34028087 100644 --- a/client/Client.h +++ b/client/Client.h @@ -164,19 +164,19 @@ public: //not working yet, will be implement somewhen later with support for local-sim-based gameplay void changeSpells(const CGHeroInstance * hero, bool give, const std::set &spells) OVERRIDE {}; bool removeObject(const CGObjectInstance * obj) OVERRIDE {return false;}; - void setBlockVis(int objid, bool bv) OVERRIDE {}; + void setBlockVis(ObjectInstanceID objid, bool bv) OVERRIDE {}; void setOwner(const CGObjectInstance * obj, TPlayerColor owner) OVERRIDE {}; void setHoverName(const CGObjectInstance * obj, MetaString * name) OVERRIDE {}; void changePrimSkill(const CGHeroInstance * hero, PrimarySkill::PrimarySkill which, si64 val, bool abs=false) OVERRIDE {}; void changeSecSkill(const CGHeroInstance * hero, SecondarySkill which, int val, bool abs=false) OVERRIDE {}; void showBlockingDialog(BlockingDialog *iw, const CFunctionList &callback) OVERRIDE {}; ui32 showBlockingDialog(BlockingDialog *iw) OVERRIDE {return 0;}; //synchronous version of above - void showGarrisonDialog(int upobj, int hid, bool removableUnits, const boost::function &cb) OVERRIDE {}; - void showThievesGuildWindow(TPlayerColor player, int requestingObjId) OVERRIDE {}; + void showGarrisonDialog(ObjectInstanceID upobj, ObjectInstanceID hid, bool removableUnits, const boost::function &cb) OVERRIDE {}; + void showThievesGuildWindow(TPlayerColor player, ObjectInstanceID requestingObjId) OVERRIDE {}; void giveResource(TPlayerColor player, Res::ERes which, int val) OVERRIDE {}; void giveCreatures(const CArmedInstance * objid, const CGHeroInstance * h, const CCreatureSet &creatures, bool remove) OVERRIDE {}; - void takeCreatures(int objid, const std::vector &creatures) OVERRIDE {}; + void takeCreatures(ObjectInstanceID objid, const std::vector &creatures) OVERRIDE {}; bool changeStackType(const StackLocation &sl, CCreature *c) OVERRIDE {return false;}; bool changeStackCount(const StackLocation &sl, TQuantity count, bool absoluteValue = false) OVERRIDE {return false;}; bool insertNewStack(const StackLocation &sl, const CCreature *c, TQuantity count) OVERRIDE {return false;}; @@ -200,15 +200,15 @@ public: void startBattleI(const CArmedInstance *army1, const CArmedInstance *army2, int3 tile, const CGHeroInstance *hero1, const CGHeroInstance *hero2, bool creatureBank = false, boost::function cb = 0, const CGTownInstance *town = NULL) OVERRIDE {}; //use hero=NULL for no hero void startBattleI(const CArmedInstance *army1, const CArmedInstance *army2, int3 tile, boost::function cb = 0, bool creatureBank = false) OVERRIDE {}; //if any of armies is hero, hero will be used void startBattleI(const CArmedInstance *army1, const CArmedInstance *army2, boost::function cb = 0, bool creatureBank = false) OVERRIDE {}; //if any of armies is hero, hero will be used, visitable tile of second obj is place of battle - void setAmount(int objid, ui32 val) OVERRIDE {}; - bool moveHero(si32 hid, int3 dst, ui8 instant, TPlayerColor asker = GameConstants::NEUTRAL_PLAYER) OVERRIDE {return false;}; + void setAmount(ObjectInstanceID objid, ui32 val) OVERRIDE {}; + bool moveHero(ObjectInstanceID hid, int3 dst, ui8 instant, TPlayerColor asker = GameConstants::NEUTRAL_PLAYER) OVERRIDE {return false;}; void giveHeroBonus(GiveBonus * bonus) OVERRIDE {}; void setMovePoints(SetMovePoints * smp) OVERRIDE {}; - void setManaPoints(int hid, int val) OVERRIDE {}; - void giveHero(int id, TPlayerColor player) OVERRIDE {}; - void changeObjPos(int objid, int3 newPos, ui8 flags) OVERRIDE {}; + void setManaPoints(ObjectInstanceID hid, int val) OVERRIDE {}; + void giveHero(ObjectInstanceID id, TPlayerColor player) OVERRIDE {}; + void changeObjPos(ObjectInstanceID objid, int3 newPos, ui8 flags) OVERRIDE {}; void sendAndApply(CPackForClient * info) OVERRIDE {}; - void heroExchange(si32 hero1, si32 hero2) OVERRIDE {}; + void heroExchange(ObjectInstanceID hero1, ObjectInstanceID hero2) OVERRIDE {}; ////////////////////////////////////////////////////////////////////////// friend class CCallback; //handling players actions diff --git a/client/GUIClasses.cpp b/client/GUIClasses.cpp index 1e7443bb7..2b198bbd3 100644 --- a/client/GUIClasses.cpp +++ b/client/GUIClasses.cpp @@ -2710,7 +2710,7 @@ void CMarketplaceWindow::makeDeal() leftIdToSend = hLeft->serial; break; case EMarketMode::ARTIFACT_RESOURCE: - leftIdToSend = hLeft->getArtInstance()->id; + leftIdToSend = hLeft->getArtInstance()->id.getNum(); break; default: leftIdToSend = hLeft->id; @@ -5071,7 +5071,7 @@ void CExchangeWindow::prepareBackground() new CAnimImage("PortraitsLarge", heroInst[1]->portrait, 0, 485, 13); } -CExchangeWindow::CExchangeWindow(si32 hero1, si32 hero2): +CExchangeWindow::CExchangeWindow(ObjectInstanceID hero1, ObjectInstanceID hero2): CWindowObject(PLAYER_COLORED | BORDERED, "TRADE2") { OBJ_CONSTRUCTION_CAPTURING_ALL; diff --git a/client/GUIClasses.h b/client/GUIClasses.h index bd841e35b..a7981a7b0 100644 --- a/client/GUIClasses.h +++ b/client/GUIClasses.h @@ -1034,7 +1034,7 @@ public: void prepareBackground(); //prepares or redraws bg - CExchangeWindow(si32 hero1, si32 hero2); //c-tor + CExchangeWindow(ObjectInstanceID hero1, ObjectInstanceID hero2); //c-tor ~CExchangeWindow(); //d-tor }; diff --git a/client/NetPacksClient.cpp b/client/NetPacksClient.cpp index d6e32e981..453b01c9e 100644 --- a/client/NetPacksClient.cpp +++ b/client/NetPacksClient.cpp @@ -111,7 +111,7 @@ void SetPrimSkill::applyCl( CClient *cl ) const CGHeroInstance *h = cl->getHero(id); if(!h) { - tlog1 << "Cannot find hero with ID " << id << std::endl; + tlog1 << "Cannot find hero with ID " << id.getNum() << std::endl; return; } INTERFACE_CALL_IF_PRESENT(h->tempOwner,heroPrimarySkillChanged,h,which,val); @@ -255,7 +255,7 @@ void GiveBonus::applyCl( CClient *cl ) { case HERO: { - const CGHeroInstance *h = GS(cl)->getHero(id); + const CGHeroInstance *h = GS(cl)->getHero(ObjectInstanceID(id)); INTERFACE_CALL_IF_PRESENT(h->tempOwner, heroBonusChanged, h, *h->getBonusList().back(),true); } break; @@ -270,13 +270,13 @@ void GiveBonus::applyCl( CClient *cl ) void ChangeObjPos::applyFirstCl( CClient *cl ) { - CGObjectInstance *obj = GS(cl)->map->objects[objid]; + CGObjectInstance *obj = GS(cl)->getObjInstance(objid); if(flags & 1) CGI->mh->hideObject(obj); } void ChangeObjPos::applyCl( CClient *cl ) { - CGObjectInstance *obj = GS(cl)->map->objects[objid]; + CGObjectInstance *obj = GS(cl)->getObjInstance(objid); if(flags & 1) CGI->mh->printObject(obj); @@ -295,7 +295,7 @@ void RemoveBonus::applyCl( CClient *cl ) { case HERO: { - const CGHeroInstance *h = GS(cl)->getHero(id); + const CGHeroInstance *h = GS(cl)->getHero(ObjectInstanceID(id)); INTERFACE_CALL_IF_PRESENT(h->tempOwner, heroBonusChanged, h, bonus,false); } break; @@ -527,9 +527,9 @@ void InfoWindow::applyCl( CClient *cl ) void SetObjectProperty::applyCl( CClient *cl ) { //inform all players that see this object - for(std::map::const_iterator it = cl->playerint.begin(); it != cl->playerint.end(); ++it) + for(auto it = cl->playerint.cbegin(); it != cl->playerint.cend(); ++it) { - if(GS(cl)->isVisible(GS(cl)->map->objects[id], it->first)) + if(GS(cl)->isVisible(GS(cl)->getObjInstance(id), it->first)) INTERFACE_CALL_IF_PRESENT(it->first, objectPropertyChanged, this); } } @@ -826,46 +826,46 @@ void OpenWindow::applyCl(CClient *cl) { case EXCHANGE_WINDOW: { - const CGHeroInstance *h = cl->getHero(id1); - const CGObjectInstance *h2 = cl->getHero(id2); + const CGHeroInstance *h = cl->getHero(ObjectInstanceID(id1)); + const CGObjectInstance *h2 = cl->getHero(ObjectInstanceID(id2)); assert(h && h2); - INTERFACE_CALL_IF_PRESENT(h->tempOwner,heroExchangeStarted, id1, id2); + INTERFACE_CALL_IF_PRESENT(h->tempOwner,heroExchangeStarted, ObjectInstanceID(id1), ObjectInstanceID(id2)); } break; case RECRUITMENT_FIRST: case RECRUITMENT_ALL: { - const CGDwelling *dw = dynamic_cast(cl->getObj(id1)); - const CArmedInstance *dst = dynamic_cast(cl->getObj(id2)); + const CGDwelling *dw = dynamic_cast(cl->getObj(ObjectInstanceID(id1))); + const CArmedInstance *dst = dynamic_cast(cl->getObj(ObjectInstanceID(id2))); INTERFACE_CALL_IF_PRESENT(dst->tempOwner,showRecruitmentDialog, dw, dst, window == RECRUITMENT_FIRST ? 0 : -1); } break; case SHIPYARD_WINDOW: { - const IShipyard *sy = IShipyard::castFrom(cl->getObj(id1)); + const IShipyard *sy = IShipyard::castFrom(cl->getObj(ObjectInstanceID(id1))); INTERFACE_CALL_IF_PRESENT(sy->o->tempOwner, showShipyardDialog, sy); } break; case THIEVES_GUILD: { //displays Thieves' Guild window (when hero enters Den of Thieves) - const CGObjectInstance *obj = cl->getObj(id2); + const CGObjectInstance *obj = cl->getObj(ObjectInstanceID(id2)); INTERFACE_CALL_IF_PRESENT(id1, showThievesGuildWindow, obj); } break; case UNIVERSITY_WINDOW: { //displays University window (when hero enters University on adventure map) - const IMarket *market = IMarket::castFrom(cl->getObj(id1)); - const CGHeroInstance *hero = cl->getHero(id2); + const IMarket *market = IMarket::castFrom(cl->getObj(ObjectInstanceID(id1))); + const CGHeroInstance *hero = cl->getHero(ObjectInstanceID(id2)); INTERFACE_CALL_IF_PRESENT(hero->tempOwner,showUniversityWindow, market, hero); } break; case MARKET_WINDOW: { //displays Thieves' Guild window (when hero enters Den of Thieves) - const CGObjectInstance *obj = cl->getObj(id1); - const CGHeroInstance *hero = cl->getHero(id2); + const CGObjectInstance *obj = cl->getObj(ObjectInstanceID(id1)); + const CGHeroInstance *hero = cl->getHero(ObjectInstanceID(id2)); const IMarket *market = IMarket::castFrom(obj); INTERFACE_CALL_IF_PRESENT(cl->getTile(obj->visitablePos())->visitableObjects.back()->tempOwner, showMarketWindow, market, hero); } @@ -873,8 +873,8 @@ void OpenWindow::applyCl(CClient *cl) case HILL_FORT_WINDOW: { //displays Hill fort window - const CGObjectInstance *obj = cl->getObj(id1); - const CGHeroInstance *hero = cl->getHero(id2); + const CGObjectInstance *obj = cl->getObj(ObjectInstanceID(id1)); + const CGHeroInstance *hero = cl->getHero(ObjectInstanceID(id2)); INTERFACE_CALL_IF_PRESENT(cl->getTile(obj->visitablePos())->visitableObjects.back()->tempOwner, showHillFortWindow, obj, hero); } break; @@ -884,8 +884,8 @@ void OpenWindow::applyCl(CClient *cl) } break; case TAVERN_WINDOW: - const CGObjectInstance *obj1 = cl->getObj(id1), - *obj2 = cl->getObj(id2); + const CGObjectInstance *obj1 = cl->getObj(ObjectInstanceID(id1)), + *obj2 = cl->getObj(ObjectInstanceID(id2)); INTERFACE_CALL_IF_PRESENT(obj1->tempOwner, showTavernWindow, obj2); break; } @@ -920,7 +920,7 @@ void SetAvailableArtifacts::applyCl(CClient *cl) } else { - const CGBlackMarket *bm = dynamic_cast(cl->getObj(id)); + const CGBlackMarket *bm = dynamic_cast(cl->getObj(ObjectInstanceID(id))); assert(bm); INTERFACE_CALL_IF_PRESENT(cl->getTile(bm->visitablePos())->visitableObjects.back()->tempOwner, availableArtifactsChanged, bm); } diff --git a/lib/BattleState.cpp b/lib/BattleState.cpp index 3730698d5..41e5c1af2 100644 --- a/lib/BattleState.cpp +++ b/lib/BattleState.cpp @@ -1119,7 +1119,7 @@ std::string CStack::nodeName() const oss << " from slot " << (int)slot; if(base && base->armyObj) - oss << " of armyobj=" << base->armyObj->id; + oss << " of armyobj=" << base->armyObj->id.getNum(); return oss.str(); } diff --git a/lib/CArtHandler.cpp b/lib/CArtHandler.cpp index feadf2350..72f1d73b8 100644 --- a/lib/CArtHandler.cpp +++ b/lib/CArtHandler.cpp @@ -561,7 +561,7 @@ ArtifactID CArtHandler::getRandomArt(int flags) } ArtifactID CArtHandler::getArtSync (ui32 rand, int flags, bool erasePicked) { - auto erasePickedArt = [&]( TArtifactInstanceID id ) + auto erasePickedArt = [&]( ArtifactID id ) { std::vector* ptr; CArtifact *art = artifacts[id]; @@ -867,7 +867,7 @@ CArtifactInstance * CArtifactInstance::createScroll( const CSpell *s) void CArtifactInstance::init() { - id = -1; + id = ArtifactInstanceID(); setNodeType(ARTIFACT_INSTANCE); } @@ -1260,7 +1260,7 @@ ArtifactPosition CArtifactSet::getArtPos(const CArtifactInstance *art) const return ArtifactPosition::PRE_FIRST; } -const CArtifactInstance * CArtifactSet::getArtByInstanceId( TArtifactInstanceID artInstId ) const +const CArtifactInstance * CArtifactSet::getArtByInstanceId( ArtifactInstanceID artInstId ) const { BOOST_FOREACH(auto i, artifactsWorn) if(i.second.artifact->id == artInstId) diff --git a/lib/CArtHandler.h b/lib/CArtHandler.h index 1732d0ca3..a520fe041 100644 --- a/lib/CArtHandler.h +++ b/lib/CArtHandler.h @@ -110,7 +110,7 @@ public: CArtifactInstance(); ConstTransitivePtr artType; - TArtifactInstanceID id; + ArtifactInstanceID id; //CArtifactInstance(int aid); @@ -217,7 +217,6 @@ public: bool legalArtifact(ArtifactID id); void getAllowedArts(std::vector > &out, std::vector *arts, int flag); void getAllowed(std::vector > &out, int flags); - void erasePickedArt (TArtifactInstanceID id); bool isBigArtifact (ArtifactID artID) const {return bigArtifacts.find(artID) != bigArtifacts.end();} void initAllowedArtifactsList(const std::vector &allowed); //allowed[art_id] -> 0 if not allowed, 1 if allowed static ArtifactID creatureToMachineID(CreatureID id); @@ -274,7 +273,7 @@ public: CArtifactInstance* getArt(ArtifactPosition pos, bool excludeLocked = true); //NULL - no artifact ArtifactPosition getArtPos(int aid, bool onlyWorn = true) const; //looks for equipped artifact with given ID and returns its slot ID or -1 if none(if more than one such artifact lower ID is returned) ArtifactPosition getArtPos(const CArtifactInstance *art) const; - const CArtifactInstance *getArtByInstanceId(TArtifactInstanceID artInstId) const; + const CArtifactInstance *getArtByInstanceId(ArtifactInstanceID artInstId) const; bool hasArt(ui32 aid, bool onlyWorn = false) const; //checks if hero possess artifact of given id (either in backack or worn) bool isPositionFree(ArtifactPosition pos, bool onlyLockCheck = false) const; si32 getArtTypeId(ArtifactPosition pos) const; diff --git a/lib/CBattleCallback.cpp b/lib/CBattleCallback.cpp index 93dbd0e62..729ababc2 100644 --- a/lib/CBattleCallback.cpp +++ b/lib/CBattleCallback.cpp @@ -467,7 +467,7 @@ std::set CBattleInfoCallback::battleGetAttackedHexes(const CStack* at return attackedHexes; } -si32 CBattleInfoCallback::battleGetRandomStackSpell(const CStack * stack, ERandomSpell mode) const +SpellID CBattleInfoCallback::battleGetRandomStackSpell(const CStack * stack, ERandomSpell mode) const { switch (mode) { @@ -479,7 +479,7 @@ si32 CBattleInfoCallback::battleGetRandomStackSpell(const CStack * stack, ERando break; default: tlog1 << "Incorrect mode of battleGetRandomSpell (" << mode <<")\n"; - return -1; + return SpellID::NONE; } } diff --git a/lib/CBattleCallback.h b/lib/CBattleCallback.h index e8ae17b41..675d0ac82 100644 --- a/lib/CBattleCallback.h +++ b/lib/CBattleCallback.h @@ -259,7 +259,7 @@ public: ui32 calculateSpellDmg(const CSpell * sp, const CGHeroInstance * caster, const CStack * affectedCreature, int spellSchoolLevel, int usedSpellPower) const; //calculates damage inflicted by spell std::set getAffectedCreatures(const CSpell * s, int skillLevel, ui8 attackerOwner, BattleHex destinationTile); //calculates stack affected by given spell - si32 battleGetRandomStackSpell(const CStack * stack, ERandomSpell mode) const; + SpellID battleGetRandomStackSpell(const CStack * stack, ERandomSpell mode) const; SpellID getRandomBeneficialSpell(const CStack * subject) const; SpellID getRandomCastedSpell(const CStack * caster) const; //called at the beginning of turn for Faerie Dragon diff --git a/lib/CGameState.cpp b/lib/CGameState.cpp index 323f9e2c2..7c7e92d7e 100644 --- a/lib/CGameState.cpp +++ b/lib/CGameState.cpp @@ -1083,7 +1083,7 @@ void CGameState::init(StartInfo * si) it->second.hero = h; CGHeroInstance * nnn = static_cast(createObject(Obj::HERO,h,hpos,it->first)); - nnn->id = map->objects.size(); + nnn->id = ObjectInstanceID(map->objects.size()); nnn->initHero(); map->heroes.push_back(nnn); map->objects.push_back(nnn); @@ -1094,10 +1094,10 @@ void CGameState::init(StartInfo * si) /*************************replace hero placeholders*****************************/ tlog4 << "\tReplacing hero placeholders"; - std::vector > campHeroReplacements; //instance, id in vector + std::vector > campHeroReplacements; //instance, id in vector if (scenarioOps->campState) { - auto replaceHero = [&](int objId, CGHeroInstance * ghi) + auto replaceHero = [&](ObjectInstanceID objId, CGHeroInstance * ghi) { campHeroReplacements.push_back(std::make_pair(ghi, objId)); // ghi->tempOwner = getHumanPlayerInfo()[0]->color; @@ -1120,6 +1120,7 @@ void CGameState::init(StartInfo * si) //selecting heroes by type for(int g=0; gobjects.size(); ++g) { + const ObjectInstanceID gid = ObjectInstanceID(g); CGObjectInstance * obj = map->objects[g]; if (obj->ID != Obj::HERO_PLACEHOLDER) { @@ -1135,7 +1136,7 @@ void CGameState::init(StartInfo * si) if (ghi->subID == hp->subID) { found = true; - replaceHero(g, ghi); + replaceHero(gid, ghi); Xheroes -= ghi; break; } @@ -1144,7 +1145,7 @@ void CGameState::init(StartInfo * si) { CGHeroInstance * nh = new CGHeroInstance(); nh->initHero(hp->subID); - replaceHero(g, nh); + replaceHero(gid, nh); } } } @@ -1158,6 +1159,7 @@ void CGameState::init(StartInfo * si) for(int g=0; gobjects.size(); ++g) { + const ObjectInstanceID gid = ObjectInstanceID(g); CGObjectInstance * obj = map->objects[g]; if (obj->ID != Obj::HERO_PLACEHOLDER) { @@ -1168,7 +1170,7 @@ void CGameState::init(StartInfo * si) if (hp->subID == 0xFF) //select by power { if(Xheroes.size() > hp->power - 1) - replaceHero(g, Xheroes[hp->power - 1]); + replaceHero(gid, Xheroes[hp->power - 1]); else { tlog3 << "Warning, no hero to replace!\n"; @@ -1242,7 +1244,7 @@ void CGameState::init(StartInfo * si) //Replace placeholders with heroes from previous missions BOOST_FOREACH(auto obj, campHeroReplacements) { - CGHeroPlaceholder *placeholder = dynamic_cast(&*map->objects[obj.second]); + CGHeroPlaceholder *placeholder = dynamic_cast(getObjInstance(obj.second)); CGHeroInstance *heroToPlace = obj.first; heroToPlace->id = obj.second; @@ -1257,7 +1259,7 @@ void CGameState::init(StartInfo * si) { art->artType = VLC->arth->artifacts[art->artType->id]; gs->map->artInstances.push_back(art); - art->id = gs->map->artInstances.size() - 1; + art->id = ArtifactInstanceID(gs->map->artInstances.size() - 1); }; BOOST_FOREACH(auto &&i, heroToPlace->artifactsWorn) @@ -1266,7 +1268,7 @@ void CGameState::init(StartInfo * si) fixArtifact(i.artifact); map->heroes.push_back(heroToPlace); - map->objects[heroToPlace->id] = heroToPlace; + map->objects[heroToPlace->id.getNum()] = heroToPlace; map->addBlockVisTiles(heroToPlace); //const auto & travelOptions = scenarioOps->campState->getCurrentScenario().travelOptions; @@ -2270,7 +2272,7 @@ int CGameState::victoryCheck( ui8 player ) const } break; case EVictoryConditionType::BEATMONSTER: - if(!map->objects[map->victoryCondition.obj->id]) //target monster not present on map + if(!getObj(map->victoryCondition.obj->id)) //target monster not present on map return 1; break; case EVictoryConditionType::TAKEDWELLINGS: diff --git a/lib/CGameState.h b/lib/CGameState.h index 19d8a58c1..1823a6098 100644 --- a/lib/CGameState.h +++ b/lib/CGameState.h @@ -165,7 +165,7 @@ struct DLL_LINKAGE PlayerState : public CBonusSystemNode public: TPlayerColor color; bool human; //true if human controlled player, false for AI - ui32 currentSelection; //id of hero/town, 0xffffffff if none + ObjectInstanceID currentSelection; //id of hero/town, 0xffffffff if none ui8 team; TResources resources; std::vector > heroes; diff --git a/lib/CObjectHandler.cpp b/lib/CObjectHandler.cpp index 15d414262..c89e35da4 100644 --- a/lib/CObjectHandler.cpp +++ b/lib/CObjectHandler.cpp @@ -39,12 +39,12 @@ using namespace boost::assign; #define USE_COVERAGE_MAP 0 -std::map > > CGTeleport::objs; -std::vector > CGTeleport::gates; +std::map > > CGTeleport::objs; +std::vector > CGTeleport::gates; IGameCallback * IObjectInterface::cb = NULL; extern boost::rand48 ran; -std::map > CGKeys::playerKeyMap; -std::map > CGMagi::eyelist; +std::map > CGKeys::playerKeyMap; +std::map > CGMagi::eyelist; ui8 CGObelisk::obeliskCount; //how many obelisks are on map std::map CGObelisk::visited; //map: team_id => how many obelisks has been visited @@ -52,7 +52,7 @@ std::vector CGTownInstance::merchantArtifacts; std::vector CGTownInstance::universitySkills; ///helpers -static void openWindow(const OpenWindow::EWindow type, const ui32 id1, const ui32 id2 = 0) +static void openWindow(const OpenWindow::EWindow type, const int id1, const int id2 = -1) { OpenWindow ow; ow.window = type; @@ -70,7 +70,7 @@ static void showInfoDialog(const TPlayerColor playerID, const ui32 txtID, const IObjectInterface::cb->sendAndApply(&iw); } -static void showInfoDialog(const int heroID, const ui32 txtID, const ui16 soundID) +static void showInfoDialog(const ObjectInstanceID heroID, const ui32 txtID, const ui16 soundID) { const TPlayerColor playerID = IObjectInterface::cb->getOwner(heroID); showInfoDialog(playerID,txtID,soundID); @@ -263,7 +263,7 @@ CGObjectInstance::CGObjectInstance(): animPhaseShift(rand()%0xff) //std::cout << "Tworze obiekt "< &tile { cb->getTilesInRange(tiles, getSightCenter(), getSightRadious(), tempOwner, 1); } -void CGObjectInstance::hideTiles(int ourplayer, int radius) const +void CGObjectInstance::hideTiles(TPlayerColor ourplayer, int radius) const { for (auto i = cb->gameState()->teams.begin(); i != cb->gameState()->teams.end(); i++) { @@ -476,11 +476,11 @@ void CGObjectInstance::getNameVis( std::string &hname ) const } } -void CGObjectInstance::giveDummyBonus(int heroID, ui8 duration) const +void CGObjectInstance::giveDummyBonus(ObjectInstanceID heroID, ui8 duration) const { GiveBonus gbonus; gbonus.bonus.type = Bonus::NONE; - gbonus.id = heroID; + gbonus.id = heroID.getNum(); gbonus.bonus.duration = duration; gbonus.bonus.source = Bonus::OBJECT; gbonus.bonus.sid = ID; @@ -493,7 +493,7 @@ void CGObjectInstance::onHeroVisit( const CGHeroInstance * h ) const { case Obj::HILL_FORT: { - openWindow(OpenWindow::HILL_FORT_WINDOW,id,h->id); + openWindow(OpenWindow::HILL_FORT_WINDOW,id.getNum(),h->id.getNum()); } break; case Obj::SANCTUARY: @@ -504,7 +504,7 @@ void CGObjectInstance::onHeroVisit( const CGHeroInstance * h ) const break; case Obj::TAVERN: { - openWindow(OpenWindow::TAVERN_WINDOW,h->id,id); + openWindow(OpenWindow::TAVERN_WINDOW,h->id.getNum(),id.getNum()); } break; } @@ -536,7 +536,7 @@ static int lowestSpeed(const CGHeroInstance * chi) { if(!chi->Slots().size()) { - tlog1 << "Error! Hero " << chi->id << " ("<name<<") has no army!\n"; + tlog1 << "Error! Hero " << chi->id.getNum() << " ("<name<<") has no army!\n"; return 20; } TSlots::const_iterator i = chi->Slots().begin(); @@ -949,7 +949,7 @@ void CGHeroInstance::initObj() //TODO: use bonus system { Bonus *bonus = new Bonus(); bonus->val = spec.val; - bonus->sid = id; //from the hero, specialty has no unique id + bonus->sid = id.getNum(); //from the hero, specialty has no unique id bonus->duration = Bonus::PERMANENT; bonus->source = Bonus::HERO_SPECIAL; switch (spec.type) @@ -1274,7 +1274,7 @@ void CGHeroInstance::updateSkill(SecondarySkill which, int val) } else { - Bonus *bonus = new Bonus(Bonus::PERMANENT, Bonus::SECONDARY_SKILL_PREMY, Bonus::SECONDARY_SKILL, skillVal, id, which, skillValType); + Bonus *bonus = new Bonus(Bonus::PERMANENT, Bonus::SECONDARY_SKILL_PREMY, Bonus::SECONDARY_SKILL, skillVal, id.getNum(), which, skillValType); bonus->source = Bonus::SECONDARY_SKILL; addNewBonus(bonus); } @@ -1493,7 +1493,7 @@ int CGHeroInstance::getSpellCost(const CSpell *sp) const void CGHeroInstance::pushPrimSkill( PrimarySkill::PrimarySkill which, int val ) { - addNewBonus(new Bonus(Bonus::PERMANENT, Bonus::PRIMARY_SKILL, Bonus::HERO_BASE_SKILL, val, id, which)); + addNewBonus(new Bonus(Bonus::PERMANENT, Bonus::PRIMARY_SKILL, Bonus::HERO_BASE_SKILL, val, id.getNum(), which)); } EAlignment::EAlignment CGHeroInstance::getAlignment() const @@ -1837,8 +1837,8 @@ void CGDwelling::heroAcceptsCreatures( const CGHeroInstance *h, ui32 answer ) co } OpenWindow ow; - ow.id1 = id; - ow.id2 = h->id; + ow.id1 = id.getNum(); + ow.id2 = h->id.getNum(); ow.window = (ID == Obj::CREATURE_GENERATOR1 || ID == Obj::REFUGEE_CAMP) ? OpenWindow::RECRUITMENT_FIRST : OpenWindow::RECRUITMENT_ALL; @@ -1878,13 +1878,13 @@ void CGTownInstance::setPropertyDer(ui8 what, ui32 val) switch (what) { case 11: //add visitor of town building - bonusingBuildings[val]->setProperty (ObjProperty::VISITORS, visitingHero->id); + bonusingBuildings[val]->setProperty (ObjProperty::VISITORS, visitingHero->id.getNum()); break; case 12: bonusingBuildings[val]->setProperty (12, 0); break; case 13: //add garrisoned hero to visitors - bonusingBuildings[val]->setProperty (ObjProperty::VISITORS, garrisonHero->id); + bonusingBuildings[val]->setProperty (ObjProperty::VISITORS, garrisonHero->id.getNum()); break; case 14: bonusValue.first = val; @@ -2537,7 +2537,7 @@ bool CGVisitableOPH::wasVisited (const CGHeroInstance * h) const void CGVisitableOPH::onHeroVisit( const CGHeroInstance * h ) const { - if(visitors.find(h->id)==visitors.end()) + if(!vstd::contains(visitors, h->id)) { onNAHeroVisit(h->id, false); switch(ID) @@ -2549,7 +2549,7 @@ void CGVisitableOPH::onHeroVisit( const CGHeroInstance * h ) const case Obj::SCHOOL_OF_WAR: break; default: - cb->setObjProperty(id, ObjProperty::VISITORS, h->id); //add to the visitors + cb->setObjProperty(id, ObjProperty::VISITORS, h->id.getNum()); //add to the visitors break; } } @@ -2567,16 +2567,16 @@ void CGVisitableOPH::initObj() ttype = -1; } -void CGVisitableOPH::treeSelected( int heroID, int resType, int resVal, TExpType expVal, ui32 result ) const +void CGVisitableOPH::treeSelected( ObjectInstanceID heroID, int resType, int resVal, TExpType expVal, ui32 result ) const { if(result) //player agreed to give res for exp { cb->giveResource(cb->getOwner(heroID), static_cast(resType), -resVal); //take resource cb->changePrimSkill(cb->getHero(heroID), PrimarySkill::EXPERIENCE, expVal); - cb->setObjProperty(id, ObjProperty::VISITORS, heroID); //add to the visitors + cb->setObjProperty(id, ObjProperty::VISITORS, heroID.getNum()); //add to the visitors } } -void CGVisitableOPH::onNAHeroVisit(int heroID, bool alreadyVisited) const +void CGVisitableOPH::onNAHeroVisit(ObjectInstanceID heroID, bool alreadyVisited) const { Component::EComponentType c_id = Component::PRIM_SKILL; //most used here int subid=0, ot=0, sound = 0; @@ -2682,7 +2682,7 @@ void CGVisitableOPH::onNAHeroVisit(int heroID, bool alreadyVisited) const val = VLC->heroh->reqExp(h->level+val) - VLC->heroh->reqExp(h->level); if(!ttype) { - cb->setObjProperty(id, ObjProperty::VISITORS, heroID); //add to the visitors + cb->setObjProperty(id, ObjProperty::VISITORS, heroID.getNum()); //add to the visitors InfoWindow iw; iw.soundID = sound; iw.components.push_back(Component(c_id,subid,1,0)); @@ -2735,7 +2735,7 @@ void CGVisitableOPH::onNAHeroVisit(int heroID, bool alreadyVisited) const } else { - cb->setObjProperty(id, ObjProperty::VISITORS, heroID); //add to the visitors + cb->setObjProperty(id, ObjProperty::VISITORS, heroID.getNum()); //add to the visitors cb->changePrimSkill(h,PrimarySkill::ATTACK,2); cb->changePrimSkill(h,PrimarySkill::DEFENSE,2); cb->changePrimSkill(h,PrimarySkill::KNOWLEDGE,2); @@ -2823,25 +2823,25 @@ const std::string & CGVisitableOPH::getHoverText() const return hoverName; } -void CGVisitableOPH::arenaSelected( int heroID, int primSkill ) const +void CGVisitableOPH::arenaSelected( ObjectInstanceID heroID, int primSkill ) const { - cb->setObjProperty(id, ObjProperty::VISITORS, heroID); //add to the visitors + cb->setObjProperty(id, ObjProperty::VISITORS, heroID.getNum()); //add to the visitors cb->changePrimSkill(cb->getHero(heroID), static_cast(primSkill-1), 2); } void CGVisitableOPH::setPropertyDer( ui8 what, ui32 val ) { if(what == ObjProperty::VISITORS) - visitors.insert(val); + visitors.insert(ObjectInstanceID(val)); } -void CGVisitableOPH::schoolSelected(int heroID, ui32 which) const +void CGVisitableOPH::schoolSelected(ObjectInstanceID heroID, ui32 which) const { if(!which) //player refused to pay return; int base = (ID == Obj::SCHOOL_OF_MAGIC ? 2 : 0); - cb->setObjProperty(id, ObjProperty::VISITORS, heroID); //add to the visitors + cb->setObjProperty(id, ObjProperty::VISITORS, heroID.getNum()); //add to the visitors cb->giveResource(cb->getOwner(heroID),Res::GOLD,-1000); //take 1000 gold cb->changePrimSkill(cb->getHero(heroID), static_cast(base + which-1), +1); //give appropriate skill } @@ -2866,7 +2866,7 @@ void COPWBonus::setProperty(ui8 what, ui32 val) } void COPWBonus::onHeroVisit (const CGHeroInstance * h) const { - int heroID = h->id; + ObjectInstanceID heroID = h->id; if (town->hasBuilt(ID)) { InfoWindow iw; @@ -2878,7 +2878,7 @@ void COPWBonus::onHeroVisit (const CGHeroInstance * h) const { GiveBonus gb; gb.bonus = Bonus(Bonus::ONE_WEEK, Bonus::LAND_MOVEMENT, Bonus::OBJECT, 600, 94, VLC->generaltexth->arraytxt[100]); - gb.id = heroID; + gb.id = heroID.getNum(); cb->giveHeroBonus(&gb); iw.text << VLC->generaltexth->allTexts[580]; cb->showInfoDialog(&iw); @@ -2888,7 +2888,8 @@ void COPWBonus::onHeroVisit (const CGHeroInstance * h) const if (visitors.empty() && h->mana <= h->manaLimit() * 2) { cb->setManaPoints (heroID, 2 * h->manaLimit()); - cb->setObjProperty (id, ObjProperty::VISITED, true); + //TODO: investigate line below + //cb->setObjProperty (town->id, ObjProperty::VISITED, true); iw.text << VLC->generaltexth->allTexts[579]; cb->showInfoDialog(&iw); cb->setObjProperty (town->id, 11, id); //add to visitors @@ -2906,11 +2907,11 @@ CTownBonus::CTownBonus (BuildingID index, CGTownInstance *TOWN) void CTownBonus::setProperty (ui8 what, ui32 val) { if(what == 4) - visitors.insert(val); + visitors.insert(ObjectInstanceID(val)); } void CTownBonus::onHeroVisit (const CGHeroInstance * h) const { - int heroID = h->id; + ObjectInstanceID heroID = h->id; if (town->hasBuilt(ID) && visitors.find(heroID) == visitors.end()) { InfoWindow iw; @@ -3183,13 +3184,14 @@ int CGCreature::takenAction(const CGHeroInstance *h, bool allowJoin) const else powerFactor = -3; - std::set myKindCres; //what creatures are the same kind as we - myKindCres.insert(subID); //we - myKindCres.insert(VLC->creh->creatures[subID]->upgrades.begin(),VLC->creh->creatures[subID]->upgrades.end()); //our upgrades + std::set myKindCres; //what creatures are the same kind as we + const CCreature * myCreature = VLC->creh->creatures[subID]; + myKindCres.insert(myCreature->idNumber); //we + myKindCres.insert(myCreature->upgrades.begin(), myCreature->upgrades.end()); //our upgrades BOOST_FOREACH(ConstTransitivePtr &crea, VLC->creh->creatures) { - if(vstd::contains(crea->upgrades, (ui32) id)) //it's our base creatures + if(vstd::contains(crea->upgrades, myCreature->idNumber)) //it's our base creatures myKindCres.insert(crea->idNumber); } @@ -3656,7 +3658,7 @@ void CGVisitableOPW::setPropertyDer( ui8 what, ui32 val ) void CGTeleport::onHeroVisit( const CGHeroInstance * h ) const { - int destinationid=-1; + ObjectInstanceID destinationid; switch(ID) { case Obj::MONOLITH1: //one way - find corresponding exit monolith @@ -3705,14 +3707,14 @@ void CGTeleport::onHeroVisit( const CGHeroInstance * h ) const case Obj::SUBTERRANEAN_GATE: //find nearest subterranean gate on the other level { destinationid = getMatchingGate(id); - if(destinationid < 0) //no exit + if(destinationid == ObjectInstanceID()) //no exit { showInfoDialog(h,153,0);//Just inside the entrance you find a large pile of rubble blocking the tunnel. You leave discouraged. } break; } } - if(destinationid < 0) + if(destinationid == ObjectInstanceID()) { tlog2 << "Cannot find exit... (obj at " << pos << ") :( \n"; return; @@ -3779,18 +3781,18 @@ void CGTeleport::postInit() //matches subterranean gates into pairs if(best.first >= 0) //found pair { - gates.push_back(std::pair(cur->id, gatesSplit[1][best.first]->id)); + gates.push_back(std::make_pair(cur->id, gatesSplit[1][best.first]->id)); gatesSplit[1][best.first] = NULL; } else { - gates.push_back(std::pair(cur->id, -1)); + gates.push_back(std::make_pair(cur->id, ObjectInstanceID())); } } objs.erase(103); } -int CGTeleport::getMatchingGate(int id) +ObjectInstanceID CGTeleport::getMatchingGate(ObjectInstanceID id) { for(int i=0; i < gates.size(); i++) { @@ -3800,7 +3802,7 @@ int CGTeleport::getMatchingGate(int id) return gates[i].first; } - return -1; + return ObjectInstanceID(); } void CGArtifact::initObj() @@ -4089,7 +4091,7 @@ void CGPickable::onHeroVisit( const CGHeroInstance * h ) const cb->removeObject(this); } -void CGPickable::chosen( int which, int heroID ) const +void CGPickable::chosen( int which, ObjectInstanceID heroID ) const { const CGHeroInstance *h = cb->getHero(heroID); switch(which) @@ -4715,9 +4717,9 @@ void CGSeerHut::completeQuest (const CGHeroInstance * h) const //reward case MORALE_BONUS: case LUCK_BONUS: { Bonus hb(Bonus::ONE_WEEK, (rewardType == 3 ? Bonus::MORALE : Bonus::LUCK), - Bonus::OBJECT, rVal, h->id, "", -1); + Bonus::OBJECT, rVal, h->id.getNum(), "", -1); GiveBonus gb; - gb.id = h->id; + gb.id = h->id.getNum(); gb.bonus = hb; cb->giveHeroBonus(&gb); } @@ -4853,7 +4855,7 @@ void CGBonusingObject::onHeroVisit( const CGHeroInstance * h ) const InfoWindow iw; iw.player = h->tempOwner; GiveBonus gbonus; - gbonus.id = h->id; + gbonus.id = h->id.getNum(); gbonus.bonus.duration = Bonus::ONE_BATTLE; gbonus.bonus.source = Bonus::OBJECT; gbonus.bonus.sid = ID; @@ -5250,8 +5252,8 @@ void CGPandoraBox::giveContents( const CGHeroInstance *h, bool afterBattle ) con iw.components.push_back(Component(Component::MORALE,0,moraleDiff,0)); cb->showInfoDialog(&iw); GiveBonus gb; - gb.bonus = Bonus(Bonus::ONE_BATTLE,Bonus::MORALE,Bonus::OBJECT,moraleDiff,id,""); - gb.id = h->id; + gb.bonus = Bonus(Bonus::ONE_BATTLE,Bonus::MORALE,Bonus::OBJECT,moraleDiff,id.getNum(),""); + gb.id = h->id.getNum(); cb->giveHeroBonus(&gb); } @@ -5261,8 +5263,8 @@ void CGPandoraBox::giveContents( const CGHeroInstance *h, bool afterBattle ) con iw.components.push_back(Component(Component::LUCK,0,luckDiff,0)); cb->showInfoDialog(&iw); GiveBonus gb; - gb.bonus = Bonus(Bonus::ONE_BATTLE,Bonus::LUCK,Bonus::OBJECT,luckDiff,id,""); - gb.id = h->id; + gb.bonus = Bonus(Bonus::ONE_BATTLE,Bonus::LUCK,Bonus::OBJECT,luckDiff,id.getNum(),""); + gb.id = h->id.getNum(); cb->giveHeroBonus(&gb); } @@ -5842,8 +5844,8 @@ void CGOnceVisitable::searchTomb(const CGHeroInstance *h, ui32 accept) const { //ruin morale GiveBonus gb; - gb.id = h->id; - gb.bonus = Bonus(Bonus::ONE_BATTLE,Bonus::MORALE,Bonus::OBJECT,-3,id,""); + gb.id = h->id.getNum(); + gb.bonus = Bonus(Bonus::ONE_BATTLE,Bonus::MORALE,Bonus::OBJECT,-3,id.getNum(),""); gb.bdescr.addTxt(MetaString::ARRAY_TXT,104); //Warrior Tomb Visited -3 cb->giveHeroBonus(&gb); } @@ -6053,7 +6055,7 @@ void CBank::onHeroVisit (const CGHeroInstance * h) const if (ID == Obj::CRYPT) //morale penalty for empty Crypt { GiveBonus gbonus; - gbonus.id = h->id; + gbonus.id = h->id.getNum(); gbonus.bonus.duration = Bonus::ONE_BATTLE; gbonus.bonus.source = Bonus::OBJECT; gbonus.bonus.sid = ID; @@ -6099,7 +6101,7 @@ void CBank::endBattle (const CGHeroInstance *h, const BattleResult *result) cons else { GiveBonus gbonus; - gbonus.id = h->id; + gbonus.id = h->id.getNum(); gbonus.bonus.duration = Bonus::ONE_BATTLE; gbonus.bonus.source = Bonus::OBJECT; gbonus.bonus.sid = ID; @@ -6118,7 +6120,7 @@ void CBank::endBattle (const CGHeroInstance *h, const BattleResult *result) cons { iw.components.push_back (Component (Component::MORALE, 0 , -1, 0)); GiveBonus gbonus; - gbonus.id = h->id; + gbonus.id = h->id.getNum(); gbonus.bonus.duration = Bonus::ONE_BATTLE; gbonus.bonus.source = Bonus::OBJECT; gbonus.bonus.sid = ID; @@ -6244,8 +6246,8 @@ void CGPyramid::onHeroVisit (const CGHeroInstance * h) const iw.text << VLC->generaltexth->advobtxt[107]; iw.components.push_back (Component (Component::LUCK, 0 , -2, 0)); GiveBonus gb; - gb.bonus = Bonus(Bonus::ONE_BATTLE,Bonus::LUCK,Bonus::OBJECT,-2,id,VLC->generaltexth->arraytxt[70]); - gb.id = h->id; + gb.bonus = Bonus(Bonus::ONE_BATTLE,Bonus::LUCK,Bonus::OBJECT,-2,id.getNum(),VLC->generaltexth->arraytxt[70]); + gb.id = h->id.getNum(); cb->giveHeroBonus(&gb); cb->showInfoDialog(&iw); } @@ -6411,10 +6413,9 @@ void CGMagi::onHeroVisit(const CGHeroInstance * h) const showInfoDialog(h,61,soundBase::LIGHTHOUSE); fw.mode = 1; - std::vector::iterator it; - for (it = eyelist[subID].begin(); it < eyelist[subID].end(); it++) + BOOST_FOREACH(auto it, eyelist[subID]) { - const CGObjectInstance *eye = cb->getObj(*it); + const CGObjectInstance *eye = cb->getObj(it); cb->getTilesInRange (fw.tiles, eye->pos, 10, h->tempOwner, 1); cb->sendAndApply(&fw); @@ -6630,7 +6631,7 @@ void CGShipyard::onHeroVisit( const CGHeroInstance * h ) const } else { - openWindow(OpenWindow::SHIPYARD_WINDOW,id,h->id); + openWindow(OpenWindow::SHIPYARD_WINDOW,id.getNum(),h->id.getNum()); } } @@ -6768,7 +6769,7 @@ void CGLighthouse::onHeroVisit( const CGHeroInstance * h ) const RemoveBonus rb(RemoveBonus::PLAYER); rb.whoID = oldOwner; rb.source = Bonus::OBJECT; - rb.id = id; + rb.id = id.getNum(); cb->sendAndApply(&rb); } } @@ -6797,7 +6798,7 @@ void CGLighthouse::giveBonusTo( ui8 player ) const gb.id = player; gb.bonus.duration = Bonus::PERMANENT; gb.bonus.source = Bonus::OBJECT; - gb.bonus.sid = id; + gb.bonus.sid = id.getNum(); cb->sendAndApply(&gb); } @@ -7091,7 +7092,7 @@ std::vector IMarket::availableModes() const void CGMarket::onHeroVisit(const CGHeroInstance * h) const { - openWindow(OpenWindow::MARKET_WINDOW,id,h->id); + openWindow(OpenWindow::MARKET_WINDOW,id.getNum(),h->id.getNum()); } int CGMarket::getMarketEfficiency() const @@ -7177,7 +7178,7 @@ void CGBlackMarket::newTurn() const return; SetAvailableArtifacts saa; - saa.id = id; + saa.id = id.getNum(); cb->pickAllowedArtsSet(saa.arts); cb->sendAndApply(&saa); } @@ -7216,7 +7217,7 @@ std::vector CGUniversity::availableItemsIds(EMarketMode::EMarketMode mode) void CGUniversity::onHeroVisit(const CGHeroInstance * h) const { - openWindow(OpenWindow::UNIVERSITY_WINDOW,id,h->id); + openWindow(OpenWindow::UNIVERSITY_WINDOW,id.getNum(),h->id.getNum()); } GrowthInfo::Entry::Entry(const std::string &format, int _count) diff --git a/lib/CObjectHandler.h b/lib/CObjectHandler.h index 80d31dc10..eee0121be 100644 --- a/lib/CObjectHandler.h +++ b/lib/CObjectHandler.h @@ -170,7 +170,7 @@ public: int3 pos; //h3m pos Obj ID; si32 subID; //normal subID (this one from OH3 maps ;]) - si32 id;//number of object in map's vector + ObjectInstanceID id;//number of object in map's vector CGDefInfo * defInfo; ui8 animPhaseShift; @@ -194,7 +194,7 @@ public: std::set getBlockedPos() const; //returns set of positions blocked by this object bool isVisitable() const; //returns true if object is visitable bool operator<(const CGObjectInstance & cmp) const; //screen printing priority comparing - void hideTiles(int ourplayer, int radius) const; + void hideTiles(TPlayerColor ourplayer, int radius) const; CGObjectInstance(); virtual ~CGObjectInstance(); //CGObjectInstance(const CGObjectInstance & right); @@ -218,7 +218,7 @@ 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; + void giveDummyBonus(ObjectInstanceID heroID, ui8 duration = Bonus::ONE_DAY) const; }; class CGHeroPlaceholder : public CGObjectInstance { @@ -484,7 +484,7 @@ private: class DLL_LINKAGE CGVisitableOPH : public CGObjectInstance //objects visitable only once per hero { public: - std::set visitors; //ids of heroes who have visited this obj + 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 override; @@ -501,11 +501,11 @@ public: protected: void setPropertyDer(ui8 what, ui32 val) override;//synchr private: - void onNAHeroVisit(int heroID, bool alreadyVisited) const; + void onNAHeroVisit(ObjectInstanceID 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; + void treeSelected(ObjectInstanceID heroID, int resType, int resVal, TExpType expVal, ui32 result) const; + void schoolSelected(ObjectInstanceID heroID, ui32 which) const; + void arenaSelected(ObjectInstanceID heroID, int primSkill) const; }; class DLL_LINKAGE CGTownBuilding : public IObjectInterface { @@ -541,7 +541,7 @@ class DLL_LINKAGE CTownBonus : public CGTownBuilding ///used for one-time bonusing structures ///feel free to merge inheritance tree public: - std::set visitors; + std::set visitors; void setProperty(ui8 what, ui32 val) override; void onHeroVisit (const CGHeroInstance * h) const override; @@ -945,7 +945,7 @@ public: void onHeroVisit(const CGHeroInstance * h) const override; void initObj() override; - void chosen(int which, int heroID) const; + void chosen(int which, ObjectInstanceID heroID) const; template void serialize(Handler &h, const int version) { @@ -1013,12 +1013,12 @@ protected: class DLL_LINKAGE CGTeleport : public CGObjectInstance //teleports and subterranean gates { public: - static std::map > > objs; //teleports: map[ID][subID] => vector of ids - static std::vector > gates; //subterranean gates: pairs of ids + 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 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 + static ObjectInstanceID getMatchingGate(ObjectInstanceID id); //receives id of one subterranean gate and returns id of the paired one, -1 if none template void serialize(Handler &h, const int version) { @@ -1254,7 +1254,7 @@ public: class DLL_LINKAGE CGMagi : public CGObjectInstance { public: - static std::map > eyelist; //[subID][id], supports multiple sets as in H5 + static std::map > eyelist; //[subID][id], supports multiple sets as in H5 void initObj() override; void onHeroVisit(const CGHeroInstance * h) const override; diff --git a/lib/GameConstants.cpp b/lib/GameConstants.cpp index ce7301e01..5e92fa8a9 100644 --- a/lib/GameConstants.cpp +++ b/lib/GameConstants.cpp @@ -8,6 +8,8 @@ * */ +#define INSTANTIATE_BASE_FOR_ID_HERE + #include "StdInc.h" #include "VCMI_Lib.h" @@ -86,3 +88,6 @@ CSpell * SpellID::toSpell() const { return VLC->spellh->spells[*this]; } + +template std::ostream & operator << (std::ostream & os, BaseForID id); +template std::ostream & operator << (std::ostream & os, BaseForID id); diff --git a/lib/GameConstants.h b/lib/GameConstants.h index 18550b07e..472952e25 100644 --- a/lib/GameConstants.h +++ b/lib/GameConstants.h @@ -94,9 +94,12 @@ namespace GameConstants } class CArtifact; +class CArtifactInstance; class CGDefInfo; class CCreature; class CSpell; +class CGameInfoCallback; +class CNonConstInfoCallback; #define ID_LIKE_CLASS_COMMON(CLASS_NAME, ENUM_NAME) \ CLASS_NAME(const CLASS_NAME & other) \ @@ -144,6 +147,86 @@ bool DLL_LINKAGE operator>=(const A & a, const B & b); ID_LIKE_OPERATORS_INTERNAL_DECLS(ENUM_NAME, CLASS_NAME) +#define OP_DECL_INT(CLASS_NAME, OP) \ +bool operator OP (const CLASS_NAME & b) const \ +{ \ + return num OP b.num; \ +} + +#define INSTID_LIKE_CLASS_COMMON(CLASS_NAME) \ +public: \ +CLASS_NAME() : BaseForID(-1) {} \ +CLASS_NAME(const CLASS_NAME & other) \ +{ \ + num = other.num; \ +} \ +CLASS_NAME & operator=(const CLASS_NAME & other) \ +{ \ + num = other.num; \ + return *this; \ +} \ +explicit CLASS_NAME(si32 id) \ + : BaseForID(id) \ +{} + +template < typename Derived> +class BaseForID +{ +protected: + si32 num; +public: + si32 getNum() const + { + return num; + } + template void serialize(Handler &h, const int version) + { + h & num; + } + + explicit BaseForID(si32 _num = -1) + { + num = _num; + } + + OP_DECL_INT(BaseForID, ==) + OP_DECL_INT(BaseForID, !=) + OP_DECL_INT(BaseForID, <) + OP_DECL_INT(BaseForID, >) + OP_DECL_INT(BaseForID, <=) + OP_DECL_INT(BaseForID, >=) +}; + +template +DLL_LINKAGE std::ostream & operator << (std::ostream & os, BaseForID id); + +template +std::ostream & operator << (std::ostream & os, BaseForID id) +{ + return os << id; +} + +class ArtifactInstanceID : public BaseForID +{ + INSTID_LIKE_CLASS_COMMON(ArtifactInstanceID) + + friend class CGameInfoCallback; + friend class CNonConstInfoCallback; +}; + + +class ObjectInstanceID : public BaseForID +{ + INSTID_LIKE_CLASS_COMMON(ObjectInstanceID) + + friend class CGameInfoCallback; + friend class CNonConstInfoCallback; +}; + +#ifndef INSTANTIATE_BASE_FOR_ID_HERE +extern template std::ostream & operator << (std::ostream & os, BaseForID id); +extern template std::ostream & operator << (std::ostream & os, BaseForID id); +#endif // Enum declarations namespace PrimarySkill @@ -762,10 +845,15 @@ typedef ui8 TBonusType; typedef si32 TBonusSubtype; typedef si32 TSlot; typedef si32 TQuantity; -typedef si32 TArtifactInstanceID; typedef ui8 TPlayerColor; #undef ID_LIKE_CLASS_COMMON #undef ID_LIKE_OPERATORS_DECLS #undef ID_LIKE_OPERATORS_INTERNAL_DECLS +#undef INSTID_LIKE_CLASS_COMMON +#undef OP_DECL_INT + + + + diff --git a/lib/IGameCallback.cpp b/lib/IGameCallback.cpp index adabc12fd..53c3b082f 100644 --- a/lib/IGameCallback.cpp +++ b/lib/IGameCallback.cpp @@ -41,11 +41,11 @@ CGameState * CPrivilagedInfoCallback::gameState () return gs; } -int CGameInfoCallback::getOwner(int heroID) const +TPlayerColor CGameInfoCallback::getOwner(ObjectInstanceID heroID) const { const CGObjectInstance *obj = getObj(heroID); ERROR_RET_VAL_IF(!obj, "No such object!", -1); - return gs->map->objects[heroID]->tempOwner; + return obj->tempOwner; } int CGameInfoCallback::getResource(TPlayerColor Player, Res::ERes which) const @@ -241,34 +241,35 @@ const CGObjectInstance * CGameInfoCallback::getObjByQuestIdentifier(int identifi /* */ /************************************************************************/ -const CGObjectInstance* CGameInfoCallback::getObj(int objid, bool verbose) const +const CGObjectInstance* CGameInfoCallback::getObj(ObjectInstanceID objid, bool verbose) const { - if(objid < 0 || objid >= gs->map->objects.size()) + si32 oid = objid.num; + if(oid < 0 || oid >= gs->map->objects.size()) { if(verbose) - tlog1 << "Cannot get object with id " << objid << std::endl; + tlog1 << "Cannot get object with id " << oid << std::endl; return NULL; } - const CGObjectInstance *ret = gs->map->objects[objid]; + const CGObjectInstance *ret = gs->map->objects[oid]; if(!ret) { if(verbose) - tlog1 << "Cannot get object with id " << objid << ". Object was removed.\n"; + tlog1 << "Cannot get object with id " << oid << ". Object was removed.\n"; return NULL; } if(!isVisible(ret, player)) { if(verbose) - tlog1 << "Cannot get object with id " << objid << ". Object is not visible.\n"; + tlog1 << "Cannot get object with id " << oid << ". Object is not visible.\n"; return NULL; } return ret; } -const CGHeroInstance* CGameInfoCallback::getHero(int objid) const +const CGHeroInstance* CGameInfoCallback::getHero(ObjectInstanceID objid) const { const CGObjectInstance *obj = getObj(objid, false); if(obj) @@ -276,11 +277,11 @@ const CGHeroInstance* CGameInfoCallback::getHero(int objid) const else return NULL; } -const CGTownInstance* CGameInfoCallback::getTown(int objid) const +const CGTownInstance* CGameInfoCallback::getTown(ObjectInstanceID objid) const { const CGObjectInstance *obj = getObj(objid, false); if(obj) - return dynamic_cast(gs->map->objects[objid].get()); + return dynamic_cast(obj); else return NULL; } @@ -352,7 +353,7 @@ void CGameInfoCallback::getThievesGuildInfo(SThievesGuildInfo & thi, const CGObj } } -int CGameInfoCallback::howManyTowns(int Player) const +int CGameInfoCallback::howManyTowns(TPlayerColor Player) const { ERROR_RET_VAL_IF(!hasAccess(Player), "Access forbidden!", -1); return gs->players[Player].towns.size(); @@ -846,12 +847,12 @@ TResources CPlayerSpecificInfoCallback::getResourceAmount() const return gs->players[*player].resources; } -CGHeroInstance *CNonConstInfoCallback::getHero(int objid) +CGHeroInstance *CNonConstInfoCallback::getHero(ObjectInstanceID objid) { return const_cast(CGameInfoCallback::getHero(objid)); } -CGTownInstance *CNonConstInfoCallback::getTown(int objid) +CGTownInstance *CNonConstInfoCallback::getTown(ObjectInstanceID objid) { return const_cast(CGameInfoCallback::getTown(objid)); @@ -872,6 +873,16 @@ PlayerState * CNonConstInfoCallback::getPlayer( TPlayerColor color, bool verbose return const_cast(CGameInfoCallback::getPlayer(color, verbose)); } +CArtifactInstance * CNonConstInfoCallback::getArtInstance( ArtifactInstanceID aid ) +{ + return gs->map->artInstances[aid.num]; +} + +CGObjectInstance * CNonConstInfoCallback::getObjInstance( ObjectInstanceID oid ) +{ + return gs->map->objects[oid.num]; +} + const TeamState * CGameInfoCallback::getTeam( ui8 teamID ) const { ERROR_RET_VAL_IF(!vstd::contains(gs->teams, teamID), "Cannot find info for team " << int(teamID), NULL); @@ -907,12 +918,22 @@ bool CGameInfoCallback::isInTheMap(const int3 &pos) const return gs->map->isInTheMap(pos); } +const CArtifactInstance * CGameInfoCallback::getArtInstance( ArtifactInstanceID aid ) const +{ + return gs->map->artInstances[aid.num]; +} + +const CGObjectInstance * CGameInfoCallback::getObjInstance( ObjectInstanceID oid ) const +{ + return gs->map->objects[oid.num]; +} + void IGameEventRealizer::showInfoDialog( InfoWindow *iw ) { commitPackage(iw); } -void IGameEventRealizer::showInfoDialog(const std::string &msg, int player) +void IGameEventRealizer::showInfoDialog(const std::string &msg, TPlayerColor player) { InfoWindow iw; iw.player = player; @@ -920,7 +941,7 @@ void IGameEventRealizer::showInfoDialog(const std::string &msg, int player) showInfoDialog(&iw); } -void IGameEventRealizer::setObjProperty(int objid, int prop, si64 val) +void IGameEventRealizer::setObjProperty(ObjectInstanceID objid, int prop, si64 val) { SetObjectProperty sob; sob.id = objid; diff --git a/lib/IGameCallback.h b/lib/IGameCallback.h index e4c0c77b9..ddd5df773 100644 --- a/lib/IGameCallback.h +++ b/lib/IGameCallback.h @@ -95,7 +95,7 @@ public: void getUpgradeInfo(const CArmedInstance *obj, int stackPos, UpgradeInfo &out)const; //hero - const CGHeroInstance* getHero(int objid) const; + const CGHeroInstance* getHero(ObjectInstanceID objid) const; const CGHeroInstance* getHeroWithSubid(int subid) const; int getHeroCount(TPlayerColor player, bool includeGarrisoned) const; bool getHeroInfo(const CGObjectInstance *hero, InfoAboutHero &dest) const; @@ -103,14 +103,16 @@ public: int estimateSpellDamage(const CSpell * sp, const CGHeroInstance * hero) const; //estimates damage of given spell; returns 0 if spell causes no dmg const CGHeroInstance* getSelectedHero(TPlayerColor player) const; //NULL if no hero is selected const CGHeroInstance* getSelectedHero() const; //of current (active) player + const CArtifactInstance * getArtInstance(ArtifactInstanceID aid) const; + const CGObjectInstance * getObjInstance(ObjectInstanceID oid) const; //objects - const CGObjectInstance* getObj(int objid, bool verbose = true) const; + const CGObjectInstance* getObj(ObjectInstanceID objid, bool verbose = true) const; std::vector getBlockingObjs(int3 pos)const; std::vector getVisitableObjs(int3 pos, bool verbose = true)const; std::vector getFlaggableObjects(int3 pos) const; std::vector getObjDescriptions(int3 pos)const; //returns descriptions of objects at pos in order from the lowest to the highest - int getOwner(int heroID) const; + TPlayerColor getOwner(ObjectInstanceID heroID) const; const CGObjectInstance *getObjByQuestIdentifier(int identifier) const; //NULL if object has been removed (eg. killed) //map @@ -122,8 +124,8 @@ public: bool isInTheMap(const int3 &pos) const; //town - const CGTownInstance* getTown(int objid) const; - int howManyTowns(int Player) const; + const CGTownInstance* getTown(ObjectInstanceID objid) const; + int howManyTowns(TPlayerColor Player) const; const CGTownInstance * getTownInfo(int val, bool mode)const; //mode = 0 -> val = player town serial; mode = 1 -> val = object id (serial) std::vector getAvailableHeroes(const CGObjectInstance * townOrTavern) const; //heroes that can be recruited std::string getTavernGossip(const CGObjectInstance * townOrTavern) const; @@ -135,7 +137,7 @@ public: //from gs const TeamState *getTeam(ui8 teamID) const; const TeamState *getPlayerTeam(TPlayerColor color) const; - std::set getBuildingRequiments(const CGTownInstance *t, int ID) const; + std::set getBuildingRequiments(const CGTownInstance *t, BuildingID ID) const; EBuildingState::EBuildingState canBuildStructure(const CGTownInstance *t, BuildingID ID) const;// 0 - no more than one capitol, 1 - lack of water, 2 - forbidden, 3 - Add another level to Mage Guild, 4 - already built, 5 - cannot build, 6 - cannot afford, 7 - build, 8 - lack of requirements }; @@ -182,9 +184,11 @@ public: PlayerState *getPlayer(TPlayerColor color, bool verbose = true); TeamState *getTeam(ui8 teamID);//get team by team ID TeamState *getPlayerTeam(TPlayerColor color);// get team by player color - CGHeroInstance *getHero(int objid); - CGTownInstance *getTown(int objid); + CGHeroInstance *getHero(ObjectInstanceID objid); + CGTownInstance *getTown(ObjectInstanceID objid); TerrainTile * getTile(int3 pos); + CArtifactInstance * getArtInstance(ArtifactInstanceID aid); + CGObjectInstance * getObjInstance(ObjectInstanceID oid); }; class DLL_LINKAGE IGameEventRealizer @@ -193,10 +197,10 @@ public: virtual void commitPackage(CPackForClient *pack) = 0; virtual void showInfoDialog(InfoWindow *iw); - virtual void setObjProperty(int objid, int prop, si64 val); + virtual void setObjProperty(ObjectInstanceID objid, int prop, si64 val); - virtual void showInfoDialog(const std::string &msg, int player); + virtual void showInfoDialog(const std::string &msg, TPlayerColor player); }; class DLL_LINKAGE IGameEventCallback : public IGameEventRealizer @@ -204,19 +208,19 @@ class DLL_LINKAGE IGameEventCallback : public IGameEventRealizer public: virtual void changeSpells(const CGHeroInstance * hero, bool give, const std::set &spells)=0; virtual bool removeObject(const CGObjectInstance * obj)=0; - virtual void setBlockVis(int objid, bool bv)=0; + virtual void setBlockVis(ObjectInstanceID objid, bool bv)=0; virtual void setOwner(const CGObjectInstance * objid, TPlayerColor owner)=0; virtual void setHoverName(const CGObjectInstance * obj, MetaString * name)=0; virtual void changePrimSkill(const CGHeroInstance * hero, PrimarySkill::PrimarySkill which, si64 val, bool abs=false)=0; virtual void changeSecSkill(const CGHeroInstance * hero, SecondarySkill which, int val, bool abs=false)=0; virtual void showBlockingDialog(BlockingDialog *iw, const CFunctionList &callback)=0; virtual ui32 showBlockingDialog(BlockingDialog *iw) =0; //synchronous version of above //TODO: - virtual void showGarrisonDialog(int upobj, int hid, bool removableUnits, const boost::function &cb) =0; //cb will be called when player closes garrison window - virtual void showThievesGuildWindow(TPlayerColor player, int requestingObjId) =0; + virtual void showGarrisonDialog(ObjectInstanceID upobj, ObjectInstanceID hid, bool removableUnits, const boost::function &cb) =0; //cb will be called when player closes garrison window + virtual void showThievesGuildWindow(TPlayerColor player, ObjectInstanceID requestingObjId) =0; virtual void giveResource(TPlayerColor player, Res::ERes which, int val)=0; virtual void giveCreatures(const CArmedInstance *objid, const CGHeroInstance * h, const CCreatureSet &creatures, bool remove) =0; - virtual void takeCreatures(int objid, const std::vector &creatures) =0; + virtual void takeCreatures(ObjectInstanceID objid, const std::vector &creatures) =0; virtual bool changeStackCount(const StackLocation &sl, TQuantity count, bool absoluteValue = false) =0; virtual bool changeStackType(const StackLocation &sl, CCreature *c) =0; virtual bool insertNewStack(const StackLocation &sl, const CCreature *c, TQuantity count = -1) =0; //count -1 => moves whole stack @@ -238,15 +242,15 @@ public: virtual void startBattleI(const CArmedInstance *army1, const CArmedInstance *army2, int3 tile, const CGHeroInstance *hero1, const CGHeroInstance *hero2, bool creatureBank = false, boost::function cb = 0, const CGTownInstance *town = NULL)=0; //use hero=NULL for no hero virtual void startBattleI(const CArmedInstance *army1, const CArmedInstance *army2, int3 tile, boost::function cb = 0, bool creatureBank = false)=0; //if any of armies is hero, hero will be used virtual void startBattleI(const CArmedInstance *army1, const CArmedInstance *army2, boost::function cb = 0, bool creatureBank = false)=0; //if any of armies is hero, hero will be used, visitable tile of second obj is place of battle - virtual void setAmount(int objid, ui32 val)=0; - virtual bool moveHero(si32 hid, int3 dst, ui8 instant, TPlayerColor asker = GameConstants::NEUTRAL_PLAYER)=0; + virtual void setAmount(ObjectInstanceID objid, ui32 val)=0; + virtual bool moveHero(ObjectInstanceID hid, int3 dst, ui8 instant, TPlayerColor asker = GameConstants::NEUTRAL_PLAYER)=0; virtual void giveHeroBonus(GiveBonus * bonus)=0; virtual void setMovePoints(SetMovePoints * smp)=0; - virtual void setManaPoints(int hid, int val)=0; - virtual void giveHero(int id, TPlayerColor player)=0; - virtual void changeObjPos(int objid, int3 newPos, ui8 flags)=0; + virtual void setManaPoints(ObjectInstanceID hid, int val)=0; + virtual void giveHero(ObjectInstanceID id, TPlayerColor player)=0; + virtual void changeObjPos(ObjectInstanceID objid, int3 newPos, ui8 flags)=0; virtual void sendAndApply(CPackForClient * info)=0; - virtual void heroExchange(si32 hero1, si32 hero2)=0; //when two heroes meet on adventure map + virtual void heroExchange(ObjectInstanceID hero1, ObjectInstanceID hero2)=0; //when two heroes meet on adventure map virtual void addQuest(int player, QuestInfo & quest){}; }; diff --git a/lib/IGameEventsReceiver.h b/lib/IGameEventsReceiver.h index 365d4c227..1abcc4b31 100644 --- a/lib/IGameEventsReceiver.h +++ b/lib/IGameEventsReceiver.h @@ -124,11 +124,11 @@ public: virtual void playerBonusChanged(const Bonus &bonus, bool gain){};//if gain hero received bonus, else he lost it virtual void requestSent(const CPackForServer *pack, int requestID){}; virtual void requestRealized(PackageApplied *pa){}; - virtual void heroExchangeStarted(si32 hero1, si32 hero2){}; + virtual void heroExchangeStarted(ObjectInstanceID hero1, ObjectInstanceID hero2){}; virtual void objectPropertyChanged(const SetObjectProperty * sop){}; //eg. mine has been flagged virtual void objectRemoved(const CGObjectInstance *obj){}; //eg. collected resource, picked artifact, beaten hero virtual void playerBlocked(int reason){}; //reason: 0 - upcoming battle - virtual void gameOver(ui8 player, bool victory){}; //player lost or won the game - virtual void playerStartsTurn(ui8 player){}; + virtual void gameOver(TPlayerColor player, bool victory){}; //player lost or won the game + virtual void playerStartsTurn(TPlayerColor player){}; virtual void showComp(const Component &comp, std::string message) {}; //display component in the advmapint infobox }; \ No newline at end of file diff --git a/lib/Mapping/CMap.cpp b/lib/Mapping/CMap.cpp index b78378876..840427f55 100644 --- a/lib/Mapping/CMap.cpp +++ b/lib/Mapping/CMap.cpp @@ -283,14 +283,14 @@ void CMap::checkForObjectives() void CMap::addNewArtifactInstance(CArtifactInstance * art) { - art->id = artInstances.size(); + art->id = ArtifactInstanceID(artInstances.size()); artInstances.push_back(art); } void CMap::eraseArtifactInstance(CArtifactInstance * art) { - assert(artInstances[art->id] == art); - artInstances[art->id].dellNull(); + assert(artInstances[art->id.getNum()] == art); + artInstances[art->id.getNum()].dellNull(); } void CMap::addQuest(CGObjectInstance * quest) diff --git a/lib/Mapping/CMap.h b/lib/Mapping/CMap.h index a996a3a87..ef0df0186 100644 --- a/lib/Mapping/CMap.h +++ b/lib/Mapping/CMap.h @@ -767,7 +767,7 @@ public: std::vector< ConstTransitivePtr > quests; /** associative list to identify which hero/creature id belongs to which object id(index for objects) */ - bmap questIdentifierToId; + bmap questIdentifierToId; /** * Serialize method. diff --git a/lib/Mapping/CMapEditManager.cpp b/lib/Mapping/CMapEditManager.cpp index a8f30f073..357f2e05d 100644 --- a/lib/Mapping/CMapEditManager.cpp +++ b/lib/Mapping/CMapEditManager.cpp @@ -414,7 +414,7 @@ TerrainViewPattern CMapEditManager::getFlippedPattern(const TerrainViewPattern & void CMapEditManager::insertObject(CGObjectInstance * obj, int posx, int posy, bool underground) { obj->pos = int3(posx, posy, underground ? 1 : 0); - obj->id = map->objects.size(); + obj->id = ObjectInstanceID(map->objects.size()); map->objects.push_back(obj); if(obj->ID == Obj::TOWN) { diff --git a/lib/Mapping/MapFormatH3M.cpp b/lib/Mapping/MapFormatH3M.cpp index 45393d4dc..2f79c07e4 100644 --- a/lib/Mapping/MapFormatH3M.cpp +++ b/lib/Mapping/MapFormatH3M.cpp @@ -815,7 +815,7 @@ void CMapLoaderH3M::readObjects() int3 objPos = readInt3(); int defnum = reader.readUInt32(); - int idToBeGiven = map->objects.size(); + ObjectInstanceID idToBeGiven = ObjectInstanceID(map->objects.size()); CGDefInfo * defInfo = map->customDefs.at(defnum); reader.skip(5); @@ -1460,7 +1460,7 @@ void CMapLoaderH3M::readObjects() nobj->subID = defInfo->subid; } nobj->defInfo = defInfo; - assert(idToBeGiven == map->objects.size()); + assert(idToBeGiven == ObjectInstanceID(map->objects.size())); map->objects.push_back(nobj); if(nobj->ID == Obj::TOWN) { @@ -1521,7 +1521,7 @@ void CMapLoaderH3M::readCreatureSet(CCreatureSet * out, int number) out->validTypes(true); } -CGObjectInstance * CMapLoaderH3M::readHero(int idToBeGiven) +CGObjectInstance * CMapLoaderH3M::readHero(ObjectInstanceID idToBeGiven) { CGHeroInstance * nhi = new CGHeroInstance(); diff --git a/lib/Mapping/MapFormatH3M.h b/lib/Mapping/MapFormatH3M.h index 4bfddeb18..484b07061 100644 --- a/lib/Mapping/MapFormatH3M.h +++ b/lib/Mapping/MapFormatH3M.h @@ -171,7 +171,7 @@ private: * @param idToBeGiven the object id which should be set for the hero * @return a object instance */ - CGObjectInstance * readHero(int idToBeGiven); + CGObjectInstance * readHero(ObjectInstanceID idToBeGiven); /** * Reads a seer hut. diff --git a/lib/NetPacks.h b/lib/NetPacks.h index 4fe18f99c..7278e87b8 100644 --- a/lib/NetPacks.h +++ b/lib/NetPacks.h @@ -240,7 +240,7 @@ struct PlayerBlocked : public CPackForClient //96 enum EReason { UPCOMING_BATTLE }; - ui8 reason; + EReason reason; TPlayerColor player; template void serialize(Handler &h, const int version) @@ -255,7 +255,7 @@ struct YourTurn : public CPackForClient //100 void applyCl(CClient *cl); DLL_LINKAGE void applyGs(CGameState *gs); - ui8 player; + TPlayerColor player; template void serialize(Handler &h, const int version) { @@ -300,7 +300,7 @@ struct SetPrimSkill : public CPackForClient //105 DLL_LINKAGE void applyGs(CGameState *gs); ui8 abs; //0 - changes by value; 1 - sets to value - si32 id; + ObjectInstanceID id; PrimarySkill::PrimarySkill which; si64 val; @@ -316,7 +316,7 @@ struct SetSecSkill : public CPackForClient //106 DLL_LINKAGE void applyGs(CGameState *gs); ui8 abs; //0 - changes by value; 1 - sets to value - si32 id; + ObjectInstanceID id; SecondarySkill which; ui16 val; @@ -332,7 +332,7 @@ struct HeroVisitCastle : public CPackForClient //108 DLL_LINKAGE void applyGs(CGameState *gs); ui8 flags; //1 - start - ui32 tid, hid; + ObjectInstanceID tid, hid; bool start() //if hero is entering castle (if false - leaving) { @@ -354,7 +354,7 @@ struct ChangeSpells : public CPackForClient //109 DLL_LINKAGE void applyGs(CGameState *gs); ui8 learn; //1 - gives spell, 0 - takes - ui32 hid; + ObjectInstanceID hid; std::set spells; template void serialize(Handler &h, const int version) @@ -370,7 +370,8 @@ struct SetMana : public CPackForClient //110 DLL_LINKAGE void applyGs(CGameState *gs); - si32 hid, val; + ObjectInstanceID hid; + si32 val; template void serialize(Handler &h, const int version) { @@ -384,7 +385,8 @@ struct SetMovePoints : public CPackForClient //111 void applyCl(CClient *cl); DLL_LINKAGE void applyGs(CGameState *gs); - ui32 hid, val; + ObjectInstanceID hid; + si32 val; template void serialize(Handler &h, const int version) { @@ -420,7 +422,7 @@ struct SetAvailableHeroes : public CPackForClient //113 void applyCl(CClient *cl); DLL_LINKAGE void applyGs(CGameState *gs); - ui8 player; + TPlayerColor player; si32 hid[GameConstants::AVAILABLE_HEROES_PER_PLAYER]; //-1 if no hero CSimpleArmy army[GameConstants::AVAILABLE_HEROES_PER_PLAYER]; template void serialize(Handler &h, const int version) @@ -442,7 +444,7 @@ struct GiveBonus : public CPackForClient //115 enum {HERO, PLAYER, TOWN}; ui8 who; //who receives bonus, uses enum above - ui32 id; //hero. town or player id - whoever receives it + si32 id; //hero. town or player id - whoever receives it Bonus bonus; MetaString bdescr; @@ -463,7 +465,7 @@ struct ChangeObjPos : public CPackForClient //116 void applyCl(CClient *cl); DLL_LINKAGE void applyGs(CGameState *gs); - ui32 objid; + ObjectInstanceID objid; int3 nPos; ui8 flags; //bit flags: 1 - redraw @@ -483,7 +485,7 @@ struct PlayerEndsGame : public CPackForClient //117 void applyCl(CClient *cl); DLL_LINKAGE void applyGs(CGameState *gs); - ui8 player; + TPlayerColor player; ui8 victory; template void serialize(Handler &h, const int version) @@ -544,7 +546,7 @@ struct SetCommanderProperty : public CPackForClient //120 void applyCl(CClient *cl){}; DLL_LINKAGE void applyGs(CGameState *gs); - si32 heroid; //for commander attached to hero + ObjectInstanceID heroid; //for commander attached to hero StackLocation sl; //for commander not on the hero? ECommanderProperty which; @@ -585,12 +587,12 @@ struct PrepareForAdvancingCampaign : public CPackForClient //122 struct RemoveObject : public CPackForClient //500 { RemoveObject(){type = 500;}; - RemoveObject(si32 ID){id = ID;type = 500;}; + RemoveObject(ObjectInstanceID ID){id = ID;type = 500;}; void applyFirstCl(CClient *cl); void applyCl(CClient *cl); DLL_LINKAGE void applyGs(CGameState *gs); - si32 id; + ObjectInstanceID id; template void serialize(Handler &h, const int version) { @@ -609,7 +611,8 @@ struct TryMoveHero : public CPackForClient //501 FAILED, SUCCESS, TELEPORTATION, RESERVED___, BLOCKING_VISIT, EMBARK, DISEMBARK }; - ui32 id, movePoints; + ObjectInstanceID id; + ui32 movePoints; EResult result; //uses EResult int3 start, end; //h3m format boost::unordered_set fowRevealed; //revealed tiles @@ -643,7 +646,7 @@ struct NewStructures : public CPackForClient //504 void applyCl(CClient *cl); DLL_LINKAGE void applyGs(CGameState *gs); - si32 tid; + ObjectInstanceID tid; std::set bid; si16 builded; @@ -658,7 +661,7 @@ struct RazeStructures : public CPackForClient //505 void applyCl (CClient *cl); DLL_LINKAGE void applyGs(CGameState *gs); - si32 tid; + ObjectInstanceID tid; std::set bid; si16 destroyed; @@ -673,7 +676,7 @@ struct SetAvailableCreatures : public CPackForClient //506 void applyCl(CClient *cl); DLL_LINKAGE void applyGs(CGameState *gs); - si32 tid; + ObjectInstanceID tid; std::vector > > creatures; template void serialize(Handler &h, const int version) @@ -687,7 +690,7 @@ struct SetHeroesInTown : public CPackForClient //508 void applyCl(CClient *cl); DLL_LINKAGE void applyGs(CGameState *gs); - si32 tid, visiting, garrison; //id of town, visiting hero, hero in garrison + ObjectInstanceID tid, visiting, garrison; //id of town, visiting hero, hero in garrison template void serialize(Handler &h, const int version) { @@ -721,7 +724,8 @@ struct HeroRecruited : public CPackForClient //515 void applyCl(CClient *cl); DLL_LINKAGE void applyGs(CGameState *gs); - si32 hid, tid; //subID of hero + si32 hid;//subID of hero + ObjectInstanceID tid; int3 tile; TPlayerColor player; @@ -738,7 +742,7 @@ struct GiveHero : public CPackForClient //516 void applyCl(CClient *cl); DLL_LINKAGE void applyGs(CGameState *gs); - ui32 id; //object id + ObjectInstanceID id; //object id TPlayerColor player; template void serialize(Handler &h, const int version) @@ -755,7 +759,7 @@ struct OpenWindow : public CPackForClient //517 enum EWindow {EXCHANGE_WINDOW, RECRUITMENT_FIRST, RECRUITMENT_ALL, SHIPYARD_WINDOW, THIEVES_GUILD, UNIVERSITY_WINDOW, HILL_FORT_WINDOW, MARKET_WINDOW, PUZZLE_MAP, TAVERN_WINDOW}; ui8 window; - ui32 id1, id2; + si32 id1, id2; template void serialize(Handler &h, const int version) { @@ -768,7 +772,6 @@ struct NewObject : public CPackForClient //518 NewObject() { type = 518; - id = -1; } void applyCl(CClient *cl); DLL_LINKAGE void applyGs(CGameState *gs); @@ -777,7 +780,7 @@ struct NewObject : public CPackForClient //518 ui32 subID; int3 pos; - int id; //used locally, filled during applyGs + ObjectInstanceID id; //used locally, filled during applyGs template void serialize(Handler &h, const int version) { @@ -1061,7 +1064,8 @@ struct NewTurn : public CPackForClient //101 struct Hero { - ui32 id, move, mana; //id is a general serial id + ObjectInstanceID id; + ui32 move, mana; //id is a general serial id template void serialize(Handler &h, const int version) { h & id & move & mana; @@ -1141,11 +1145,11 @@ struct SetObjectProperty : public CPackForClient//1001 DLL_LINKAGE void applyGs(CGameState *gs); void applyCl(CClient *cl); - ui32 id; + ObjectInstanceID id; ui8 what; //1 - owner; 2 - blockvis; 3 - first stack count; 4 - visitors; 5 - visited; 6 - ID (if 34 then also def is replaced) ui32 val; SetObjectProperty(){type = 1001;}; - SetObjectProperty(ui32 ID, ui8 What, ui32 Val):id(ID),what(What),val(Val){type = 1001;}; + SetObjectProperty(ObjectInstanceID ID, ui8 What, ui32 Val):id(ID),what(What),val(Val){type = 1001;}; template void serialize(Handler &h, const int version) { @@ -1157,10 +1161,10 @@ struct SetHoverName : public CPackForClient//1002 { DLL_LINKAGE void applyGs(CGameState *gs); - ui32 id; + ObjectInstanceID id; MetaString name; SetHoverName(){type = 1002;}; - SetHoverName(ui32 ID, MetaString& Name):id(ID),name(Name){type = 1002;}; + SetHoverName(ObjectInstanceID ID, MetaString& Name):id(ID),name(Name){type = 1002;}; template void serialize(Handler &h, const int version) { @@ -1172,7 +1176,7 @@ struct HeroLevelUp : public Query//2000 void applyCl(CClient *cl); DLL_LINKAGE void applyGs(CGameState *gs); - si32 heroid; + ObjectInstanceID heroid; PrimarySkill::PrimarySkill primskill; ui8 level; std::vector skills; @@ -1190,7 +1194,7 @@ struct CommanderLevelUp : public Query void applyCl(CClient *cl); DLL_LINKAGE void applyGs(CGameState *gs); - si32 heroid; //for commander attached to hero + ObjectInstanceID heroid; //for commander attached to hero StackLocation sl; //for commander not on the hero? std::vector skills; //0-5 - secondary skills, val-100 - special skill @@ -1268,7 +1272,7 @@ struct GarrisonDialog : public Query//2004 { GarrisonDialog(){type = 2004;} void applyCl(CClient *cl); - si32 objid, hid; + ObjectInstanceID objid, hid; bool removableUnits; template void serialize(Handler &h, const int version) @@ -1336,7 +1340,7 @@ struct BattleResult : public CPackForClient//3003 ui8 winner; //0 - attacker, 1 - defender, [2 - draw (should be possible?)] std::map casualties[2]; //first => casualties of attackers - map crid => number TExpType exp[2]; //exp for attacker and defender - std::set artifacts; //artifacts taken from loser to winner - currently unused + std::set artifacts; //artifacts taken from loser to winner - currently unused template void serialize(Handler &h, const int version) { @@ -1765,8 +1769,8 @@ struct EndTurn : public CPackForServer struct DismissHero : public CPackForServer { DismissHero(){}; - DismissHero(si32 HID) : hid(HID) {}; - si32 hid; + DismissHero(ObjectInstanceID HID) : hid(HID) {}; + ObjectInstanceID hid; bool applyGh(CGameHandler *gh); template void serialize(Handler &h, const int version) @@ -1778,9 +1782,9 @@ struct DismissHero : public CPackForServer struct MoveHero : public CPackForServer { MoveHero(){}; - MoveHero(const int3 &Dest, si32 HID) : dest(Dest), hid(HID){}; + MoveHero(const int3 &Dest, ObjectInstanceID HID) : dest(Dest), hid(HID){}; int3 dest; - si32 hid; + ObjectInstanceID hid; bool applyGh(CGameHandler *gh); template void serialize(Handler &h, const int version) @@ -1792,9 +1796,9 @@ struct MoveHero : public CPackForServer struct CastleTeleportHero : public CPackForServer { CastleTeleportHero(){}; - CastleTeleportHero(const si32 HID, si32 Dest, ui8 Source ) : dest(Dest), hid(HID), source(Source){}; - si32 dest; - si32 hid; + CastleTeleportHero(const ObjectInstanceID HID, ObjectInstanceID Dest, ui8 Source ) : dest(Dest), hid(HID), source(Source){}; + ObjectInstanceID dest; + ObjectInstanceID hid; si8 source;//who give teleporting, 1=castle gate bool applyGh(CGameHandler *gh); @@ -1807,12 +1811,12 @@ struct CastleTeleportHero : public CPackForServer struct ArrangeStacks : public CPackForServer { ArrangeStacks(){}; - ArrangeStacks(ui8 W, ui8 P1, ui8 P2, si32 ID1, si32 ID2, si32 VAL) + ArrangeStacks(ui8 W, ui8 P1, ui8 P2, ObjectInstanceID ID1, ObjectInstanceID ID2, si32 VAL) :what(W),p1(P1),p2(P2),id1(ID1),id2(ID2),val(VAL) {}; ui8 what; //1 - swap; 2 - merge; 3 - split ui8 p1, p2; //positions of first and second stack - si32 id1, id2; //ids of objects with garrison + ObjectInstanceID id1, id2; //ids of objects with garrison si32 val; bool applyGh(CGameHandler *gh); template void serialize(Handler &h, const int version) @@ -1824,9 +1828,9 @@ struct ArrangeStacks : public CPackForServer struct DisbandCreature : public CPackForServer { DisbandCreature(){}; - DisbandCreature(ui8 Pos, si32 ID):pos(Pos),id(ID){}; + DisbandCreature(ui8 Pos, ObjectInstanceID ID):pos(Pos),id(ID){}; ui8 pos; //stack pos - si32 id; //object id + ObjectInstanceID id; //object id bool applyGh(CGameHandler *gh); template void serialize(Handler &h, const int version) @@ -1838,8 +1842,8 @@ struct DisbandCreature : public CPackForServer struct BuildStructure : public CPackForServer { BuildStructure(){}; - BuildStructure(si32 TID, BuildingID BID):tid(TID), bid(BID){}; - si32 tid; //town id + BuildStructure(ObjectInstanceID TID, BuildingID BID):tid(TID), bid(BID){}; + ObjectInstanceID tid; //town id BuildingID bid; //structure id bool applyGh(CGameHandler *gh); @@ -1858,8 +1862,8 @@ struct RazeStructure : public BuildStructure struct RecruitCreatures : public CPackForServer { RecruitCreatures(){}; - RecruitCreatures(si32 TID, CreatureID CRID, si32 Amount, si32 Level):tid(TID),crid(CRID),amount(Amount),level(Level){}; - si32 tid; //town id + RecruitCreatures(ObjectInstanceID TID, CreatureID CRID, si32 Amount, si32 Level):tid(TID),crid(CRID),amount(Amount),level(Level){}; + ObjectInstanceID tid; //town id CreatureID crid; ui32 amount;//creature amount si32 level;//dwelling level to buy from, -1 if any @@ -1873,9 +1877,9 @@ struct RecruitCreatures : public CPackForServer struct UpgradeCreature : public CPackForServer { UpgradeCreature(){}; - UpgradeCreature(ui8 Pos, si32 ID, CreatureID CRID):pos(Pos),id(ID), cid(CRID){}; + UpgradeCreature(ui8 Pos, ObjectInstanceID ID, CreatureID CRID):pos(Pos),id(ID), cid(CRID){}; ui8 pos; //stack pos - si32 id; //object id + ObjectInstanceID id; //object id CreatureID cid; //id of type to which we want make upgrade bool applyGh(CGameHandler *gh); @@ -1888,8 +1892,8 @@ struct UpgradeCreature : public CPackForServer struct GarrisonHeroSwap : public CPackForServer { GarrisonHeroSwap(){}; - GarrisonHeroSwap(si32 TID):tid(TID){}; - si32 tid; + GarrisonHeroSwap(ObjectInstanceID TID):tid(TID){}; + ObjectInstanceID tid; bool applyGh(CGameHandler *gh); template void serialize(Handler &h, const int version) @@ -1914,9 +1918,9 @@ struct ExchangeArtifacts : public CPackForServer struct AssembleArtifacts : public CPackForServer { AssembleArtifacts(){}; - AssembleArtifacts(si32 _heroID, ArtifactPosition _artifactSlot, bool _assemble, ui32 _assembleTo) + AssembleArtifacts(ObjectInstanceID _heroID, ArtifactPosition _artifactSlot, bool _assemble, ui32 _assembleTo) : heroID(_heroID), artifactSlot(_artifactSlot), assemble(_assemble), assembleTo(_assembleTo){}; - si32 heroID; + ObjectInstanceID heroID; ArtifactPosition artifactSlot; bool assemble; // True to assemble artifact, false to disassemble. ui32 assembleTo; // Artifact to assemble into. @@ -1931,8 +1935,8 @@ struct AssembleArtifacts : public CPackForServer struct BuyArtifact : public CPackForServer { BuyArtifact(){}; - BuyArtifact(si32 HID, ArtifactID AID):hid(HID),aid(AID){}; - si32 hid; + BuyArtifact(ObjectInstanceID HID, ArtifactID AID):hid(HID),aid(AID){}; + ObjectInstanceID hid; ArtifactID aid; bool applyGh(CGameHandler *gh); @@ -1962,8 +1966,8 @@ struct TradeOnMarketplace : public CPackForServer struct SetFormation : public CPackForServer { SetFormation(){}; - SetFormation(si32 HID, ui8 Formation):hid(HID),formation(Formation){}; - si32 hid; + SetFormation(ObjectInstanceID HID, ui8 Formation):hid(HID),formation(Formation){}; + ObjectInstanceID hid; ui8 formation; bool applyGh(CGameHandler *gh); @@ -1976,8 +1980,9 @@ struct SetFormation : public CPackForServer struct HireHero : public CPackForServer { HireHero(){}; - HireHero(si32 HID, si32 TID):hid(HID),tid(TID){}; - si32 hid, tid; //available hero serial and town (tavern) id + HireHero(si32 HID, ObjectInstanceID TID):hid(HID),tid(TID){}; + si32 hid; //available hero serial + ObjectInstanceID tid; //town (tavern) id TPlayerColor player; bool applyGh(CGameHandler *gh); @@ -1990,7 +1995,7 @@ struct HireHero : public CPackForServer struct BuildBoat : public CPackForServer { BuildBoat(){}; - si32 objid; //where player wants to buy a boat + ObjectInstanceID objid; //where player wants to buy a boat bool applyGh(CGameHandler *gh); template void serialize(Handler &h, const int version) @@ -2043,7 +2048,7 @@ struct MakeCustomAction : public CPackForServer struct DigWithHero : public CPackForServer { DigWithHero(){} - si32 id; //digging hero id + ObjectInstanceID id; //digging hero id bool applyGh(CGameHandler *gh); template void serialize(Handler &h, const int version) @@ -2055,7 +2060,7 @@ struct DigWithHero : public CPackForServer struct CastAdvSpell : public CPackForServer { CastAdvSpell(){} - si32 hid; //hero id + ObjectInstanceID hid; //hero id SpellID sid; //spell id int3 pos; //selected tile (not always used) @@ -2111,7 +2116,7 @@ struct SetSelection : public CPackForClient, public CPackForServer //514 void applyCl(CClient *cl); TPlayerColor player; - ui32 id; + ObjectInstanceID id; template void serialize(Handler &h, const int version) { diff --git a/lib/NetPacksLib.cpp b/lib/NetPacksLib.cpp index b73d35bb6..5c0da340c 100644 --- a/lib/NetPacksLib.cpp +++ b/lib/NetPacksLib.cpp @@ -201,13 +201,13 @@ DLL_LINKAGE void GiveBonus::applyGs( CGameState *gs ) switch(who) { case HERO: - cbsn = gs->getHero(id); + cbsn = gs->getHero(ObjectInstanceID(id)); break; case PLAYER: cbsn = gs->getPlayer(id); break; case TOWN: - cbsn = gs->getTown(id); + cbsn = gs->getTown(ObjectInstanceID(id)); break; } @@ -234,10 +234,10 @@ DLL_LINKAGE void GiveBonus::applyGs( CGameState *gs ) DLL_LINKAGE void ChangeObjPos::applyGs( CGameState *gs ) { - CGObjectInstance *obj = gs->map->objects[objid]; + CGObjectInstance *obj = gs->getObjInstance(objid); if(!obj) { - tlog1 << "Wrong ChangeObjPos: object " << objid << " doesn't exist!\n"; + tlog1 << "Wrong ChangeObjPos: object " << objid.getNum() << " doesn't exist!\n"; return; } gs->map->removeBlockVisTiles(obj); @@ -255,7 +255,7 @@ DLL_LINKAGE void RemoveBonus::applyGs( CGameState *gs ) { CBonusSystemNode *node; if (who == HERO) - node = gs->getHero(whoID); + node = gs->getHero(ObjectInstanceID(whoID)); else node = gs->getPlayer(whoID); @@ -275,7 +275,7 @@ DLL_LINKAGE void RemoveBonus::applyGs( CGameState *gs ) DLL_LINKAGE void RemoveObject::applyGs( CGameState *gs ) { - CGObjectInstance *obj = gs->map->objects[id]; + CGObjectInstance *obj = gs->getObjInstance(id); //unblock tiles if(obj->defInfo) { @@ -305,7 +305,7 @@ DLL_LINKAGE void RemoveObject::applyGs( CGameState *gs ) if(!vstd::contains(gs->hpool.pavailable, h->subID)) gs->hpool.pavailable[h->subID] = 0xff; - gs->map->objects[id] = NULL; + gs->map->objects[id.getNum()] = NULL; return; @@ -328,7 +328,7 @@ DLL_LINKAGE void RemoveObject::applyGs( CGameState *gs ) //gs->map->quests[quest->qid].dellNull(); } - gs->map->objects[id].dellNull(); + gs->map->objects[id.getNum()].dellNull(); } static int getDir(int3 src, int3 dst) @@ -434,7 +434,7 @@ DLL_LINKAGE void RazeStructures::applyGs( CGameState *gs ) DLL_LINKAGE void SetAvailableCreatures::applyGs( CGameState *gs ) { - CGDwelling *dw = dynamic_cast(gs->map->objects[tid].get()); + CGDwelling *dw = dynamic_cast(gs->getObjInstance(tid)); assert(dw); dw->creatures = creatures; } @@ -479,13 +479,13 @@ DLL_LINKAGE void HeroRecruited::applyGs( CGameState *gs ) h->movement = h->maxMovePoints(true); gs->hpool.heroesPool.erase(hid); - if(h->id < 0) + if(h->id == ObjectInstanceID()) { - h->id = gs->map->objects.size(); + h->id = ObjectInstanceID(gs->map->objects.size()); gs->map->objects.push_back(h); } else - gs->map->objects[h->id] = h; + gs->map->objects[h->id.getNum()] = h; h->initHeroDefInfo(); gs->map->heroes.push_back(h); @@ -548,7 +548,7 @@ DLL_LINKAGE void NewObject::applyGs( CGameState *gs ) o->subID = subID; o->pos = pos; o->defInfo = VLC->dobjinfo->gobjs[ID][subID]; - id = o->id = gs->map->objects.size(); + id = o->id = ObjectInstanceID(gs->map->objects.size()); o->hoverName = VLC->generaltexth->names[ID]; switch(ID) @@ -911,7 +911,7 @@ DLL_LINKAGE void NewTurn::applyGs( CGameState *gs ) DLL_LINKAGE void SetObjectProperty::applyGs( CGameState *gs ) { - CGObjectInstance *obj = gs->map->objects[id]; + CGObjectInstance *obj = gs->getObjInstance(id); if(!obj) { tlog1 << "Wrong object ID - property cannot be set!\n"; @@ -943,7 +943,7 @@ DLL_LINKAGE void SetObjectProperty::applyGs( CGameState *gs ) DLL_LINKAGE void SetHoverName::applyGs( CGameState *gs ) { - name.toString(gs->map->objects[id]->hoverName); + name.toString(gs->getObj(id)->hoverName); } DLL_LINKAGE void HeroLevelUp::applyGs( CGameState *gs ) @@ -1017,7 +1017,7 @@ DLL_LINKAGE void BattleTriggerEffect::applyGs( CGameState *gs ) break; case Bonus::MANA_DRAIN: { - CGHeroInstance * h = gs->getHero(additionalInfo); + CGHeroInstance * h = gs->getHero(ObjectInstanceID(additionalInfo)); st->state.insert (EBattleStackState::DRAINED_MANA); h->mana -= val; vstd::amax(h->mana, 0); diff --git a/server/CGameHandler.cpp b/server/CGameHandler.cpp index 13c524d1e..e39976b37 100644 --- a/server/CGameHandler.cpp +++ b/server/CGameHandler.cpp @@ -1296,7 +1296,7 @@ void CGameHandler::newTurn() } } // townID, creatureID, amount - std::map > newCreas;//creatures that needs to be added by town events + std::map > newCreas;//creatures that needs to be added by town events BOOST_FOREACH(CGTownInstance *t, gs->map->towns) { @@ -1346,7 +1346,7 @@ void CGameHandler::newTurn() } //add creatures from town events if (vstd::contains(newCreas, t->id)) - for(std::map::iterator i=newCreas[t->id].begin() ; i!=newCreas[t->id].end(); i++) + for(auto i=newCreas[t->id].begin() ; i!=newCreas[t->id].end(); i++) sac.creatures[i->first].first += i->second; n.cres.push_back(sac); @@ -1648,7 +1648,7 @@ void CGameHandler::giveSpells( const CGTownInstance *t, const CGHeroInstance *h sendAndApply(&cs); } -void CGameHandler::setBlockVis(int objid, bool bv) +void CGameHandler::setBlockVis(ObjectInstanceID objid, bool bv) { SetObjectProperty sop(objid,2,bv); sendAndApply(&sop); @@ -1670,13 +1670,13 @@ bool CGameHandler::removeObject( const CGObjectInstance * obj ) return true; } -void CGameHandler::setAmount(int objid, ui32 val) +void CGameHandler::setAmount(ObjectInstanceID objid, ui32 val) { SetObjectProperty sop(objid,3,val); sendAndApply(&sop); } -bool CGameHandler::moveHero( si32 hid, int3 dst, ui8 instant, TPlayerColor asker /*= 255*/ ) +bool CGameHandler::moveHero( ObjectInstanceID hid, int3 dst, ui8 instant, TPlayerColor asker /*= 255*/ ) { const CGHeroInstance *h = getHero(hid); @@ -1687,7 +1687,7 @@ bool CGameHandler::moveHero( si32 hid, int3 dst, ui8 instant, TPlayerColor asker return false; } - tlog5 << "Player " <pos << " to " << dst << std::endl; + tlog5 << "Player " <pos << " to " << dst << std::endl; int3 hmpos = dst + int3(-1,0,0); if(!gs->map->isInTheMap(hmpos)) @@ -1835,7 +1835,7 @@ bool CGameHandler::moveHero( si32 hid, int3 dst, ui8 instant, TPlayerColor asker } } -bool CGameHandler::teleportHero(si32 hid, si32 dstid, ui8 source, TPlayerColor asker/* = 255*/) +bool CGameHandler::teleportHero(ObjectInstanceID hid, ObjectInstanceID dstid, ui8 source, TPlayerColor asker/* = 255*/) { const CGHeroInstance *h = getHero(hid); const CGTownInstance *t = getTown(dstid); @@ -1947,7 +1947,7 @@ void CGameHandler::giveCreatures(const CArmedInstance *obj, const CGHeroInstance tryJoiningArmy(obj, h, remove, true); } -void CGameHandler::takeCreatures(int objid, const std::vector &creatures) +void CGameHandler::takeCreatures(ObjectInstanceID objid, const std::vector &creatures) { std::vector cres = creatures; if (cres.size() <= 0) @@ -2079,7 +2079,7 @@ void CGameHandler::setMovePoints( SetMovePoints * smp ) sendAndApply(smp); } -void CGameHandler::setManaPoints( int hid, int val ) +void CGameHandler::setManaPoints( ObjectInstanceID hid, int val ) { SetMana sm; sm.hid = hid; @@ -2087,7 +2087,7 @@ void CGameHandler::setManaPoints( int hid, int val ) sendAndApply(&sm); } -void CGameHandler::giveHero( int id, TPlayerColor player ) +void CGameHandler::giveHero( ObjectInstanceID id, TPlayerColor player ) { GiveHero gh; gh.id = id; @@ -2095,7 +2095,7 @@ void CGameHandler::giveHero( int id, TPlayerColor player ) sendAndApply(&gh); } -void CGameHandler::changeObjPos( int objid, int3 newPos, ui8 flags ) +void CGameHandler::changeObjPos( ObjectInstanceID objid, int3 newPos, ui8 flags ) { ChangeObjPos cop; cop.objid = objid; @@ -2104,7 +2104,7 @@ void CGameHandler::changeObjPos( int objid, int3 newPos, ui8 flags ) sendAndApply(&cop); } -void CGameHandler::useScholarSkill(si32 fromHero, si32 toHero) +void CGameHandler::useScholarSkill(ObjectInstanceID fromHero, ObjectInstanceID toHero) { const CGHeroInstance * h1 = getHero(fromHero); const CGHeroInstance * h2 = getHero(toHero); @@ -2193,17 +2193,17 @@ void CGameHandler::useScholarSkill(si32 fromHero, si32 toHero) } } -void CGameHandler::heroExchange(si32 hero1, si32 hero2) +void CGameHandler::heroExchange(ObjectInstanceID hero1, ObjectInstanceID hero2) { - ui8 player1 = getHero(hero1)->tempOwner; - ui8 player2 = getHero(hero2)->tempOwner; + TPlayerColor player1 = getHero(hero1)->tempOwner; + TPlayerColor player2 = getHero(hero2)->tempOwner; if( gameState()->getPlayerRelations( player1, player2)) { OpenWindow hex; hex.window = OpenWindow::EXCHANGE_WINDOW; - hex.id1 = hero1; - hex.id2 = hero2; + hex.id1 = hero1.getNum(); + hex.id2 = hero2.getNum(); sendAndApply(&hex); useScholarSkill(hero1,hero2); } @@ -2341,10 +2341,10 @@ void CGameHandler::close() //exit(0); } -bool CGameHandler::arrangeStacks( si32 id1, si32 id2, ui8 what, ui8 p1, ui8 p2, si32 val, TPlayerColor player ) +bool CGameHandler::arrangeStacks( ObjectInstanceID id1, ObjectInstanceID id2, ui8 what, ui8 p1, ui8 p2, si32 val, TPlayerColor player ) { - const CArmedInstance *s1 = static_cast(gs->map->objects[id1].get()), - *s2 = static_cast(gs->map->objects[id2].get()); + const CArmedInstance *s1 = static_cast(gs->getObjInstance(id1)), + *s2 = static_cast(gs->getObjInstance(id2)); const CCreatureSet &S1 = *s1, &S2 = *s2; StackLocation sl1(s1, p1), sl2(s2, p2); if(!sl1.validSlot() || !sl2.validSlot()) @@ -2449,9 +2449,9 @@ TPlayerColor CGameHandler::getPlayerAt( CConnection *c ) const } } -bool CGameHandler::disbandCreature( si32 id, ui8 pos ) +bool CGameHandler::disbandCreature( ObjectInstanceID id, ui8 pos ) { - CArmedInstance *s1 = static_cast(gs->map->objects[id].get()); + CArmedInstance *s1 = static_cast(gs->getObjInstance(id)); if(!vstd::contains(s1->stacks,pos)) { complain("Illegal call to disbandCreature - no such stack in army!"); @@ -2462,9 +2462,9 @@ bool CGameHandler::disbandCreature( si32 id, ui8 pos ) return true; } -bool CGameHandler::buildStructure( si32 tid, BuildingID bid, bool force /*=false*/ ) +bool CGameHandler::buildStructure( ObjectInstanceID tid, BuildingID bid, bool force /*=false*/ ) { - CGTownInstance * t = static_cast(gs->map->objects[tid].get()); + CGTownInstance * t = gs->getTown(tid); CBuilding * b = t->town->buildings[bid]; if(!force) @@ -2574,11 +2574,11 @@ bool CGameHandler::buildStructure( si32 tid, BuildingID bid, bool force /*=false checkLossVictory(t->tempOwner); return true; } -bool CGameHandler::razeStructure (si32 tid, BuildingID bid) +bool CGameHandler::razeStructure (ObjectInstanceID tid, BuildingID bid) { ///incomplete, simply erases target building - CGTownInstance * t = static_cast(gs->map->objects[tid].get()); - if (t->builtBuildings.find(bid) == t->builtBuildings.end()) + const CGTownInstance * t = getTown(tid); + if (!vstd::contains(t->builtBuildings, bid)) return false; RazeStructures rs; rs.tid = tid; @@ -2604,9 +2604,9 @@ void CGameHandler::sendMessageToAll( const std::string &message ) sendToAllClients(&sm); } -bool CGameHandler::recruitCreatures( si32 objid, CreatureID crid, ui32 cram, si32 fromLvl ) +bool CGameHandler::recruitCreatures( ObjectInstanceID objid, CreatureID crid, ui32 cram, si32 fromLvl ) { - const CGDwelling *dw = static_cast(gs->map->objects[objid].get()); + const CGDwelling *dw = static_cast(gs->getObj(objid)); const CArmedInstance *dst = NULL; const CCreature *c = VLC->creh->creatures[crid]; bool warMachine = c->hasBonusOfType(Bonus::SIEGE_WEAPON); @@ -2697,9 +2697,9 @@ bool CGameHandler::recruitCreatures( si32 objid, CreatureID crid, ui32 cram, si3 return true; } -bool CGameHandler::upgradeCreature( ui32 objid, ui8 pos, CreatureID upgID ) +bool CGameHandler::upgradeCreature( ObjectInstanceID objid, ui8 pos, CreatureID upgID ) { - CArmedInstance *obj = static_cast(gs->map->objects[objid].get()); + CArmedInstance *obj = static_cast(gs->getObjInstance(objid)); assert(obj->hasStackAtSlot(pos)); UpgradeInfo ui = gs->getUpgradeInfo(obj->getStack(pos)); int player = obj->tempOwner; @@ -2773,7 +2773,7 @@ void CGameHandler::moveArmy(const CArmedInstance *src, const CArmedInstance *dst } } -bool CGameHandler::garrisonSwap( si32 tid ) +bool CGameHandler::garrisonSwap( ObjectInstanceID tid ) { CGTownInstance *town = gs->getTown(tid); if(!town->garrisonHero && town->visitingHero) //visiting => garrison, merge armies: town army => hero army @@ -2789,7 +2789,7 @@ bool CGameHandler::garrisonSwap( si32 tid ) SetHeroesInTown intown; intown.tid = tid; - intown.visiting = -1; + intown.visiting = ObjectInstanceID(); intown.garrison = town->visitingHero->id; sendAndApply(&intown); return true; @@ -2805,7 +2805,7 @@ bool CGameHandler::garrisonSwap( si32 tid ) SetHeroesInTown intown; intown.tid = tid; - intown.garrison = -1; + intown.garrison = ObjectInstanceID(); intown.visiting = town->garrisonHero->id; sendAndApply(&intown); return true; @@ -2888,7 +2888,7 @@ bool CGameHandler::moveArtifact(const ArtifactLocation &al1, const ArtifactLocat * @param assembleTo If assemble is true, this represents the artifact ID of the combination * artifact to assemble to. Otherwise it's not used. */ -bool CGameHandler::assembleArtifacts (si32 heroID, ArtifactPosition artifactSlot, bool assemble, ui32 assembleTo) +bool CGameHandler::assembleArtifacts (ObjectInstanceID heroID, ArtifactPosition artifactSlot, bool assemble, ui32 assembleTo) { CGHeroInstance *hero = gs->getHero(heroID); @@ -2923,7 +2923,7 @@ bool CGameHandler::assembleArtifacts (si32 heroID, ArtifactPosition artifactSlot return false; } -bool CGameHandler::buyArtifact( ui32 hid, ArtifactID aid ) +bool CGameHandler::buyArtifact( ObjectInstanceID hid, ArtifactID aid ) { CGHeroInstance *hero = gs->getHero(hid); CGTownInstance *town = hero->visitedTown; @@ -2989,7 +2989,7 @@ bool CGameHandler::buyArtifact(const IMarket *m, const CGHeroInstance *h, Res::E } else if(const CGBlackMarket *bm = dynamic_cast(m->o)) //black market { - saa.id = bm->id; + saa.id = bm->id.getNum(); saa.arts = bm->artifacts; } else @@ -3015,7 +3015,7 @@ bool CGameHandler::buyArtifact(const IMarket *m, const CGHeroInstance *h, Res::E return true; } -bool CGameHandler::sellArtifact( const IMarket *m, const CGHeroInstance *h, TArtifactInstanceID aid, Res::ERes rid ) +bool CGameHandler::sellArtifact( const IMarket *m, const CGHeroInstance *h, ArtifactInstanceID aid, Res::ERes rid ) { const CArtifactInstance *art = h->getArtByInstanceId(aid); if(!art) @@ -3184,7 +3184,7 @@ bool CGameHandler::sendResources(ui32 val, TPlayerColor player, Res::ERes r1, TP return true; } -bool CGameHandler::setFormation( si32 hid, ui8 formation ) +bool CGameHandler::setFormation( ObjectInstanceID hid, ui8 formation ) { gs->getHero(hid)-> formation = formation; return true; @@ -3730,7 +3730,7 @@ bool CGameHandler::makeBattleAction( BattleAction &ba ) sendAndApply(&start_action); const CStack * stack = gs->curB->battleGetStackByID(ba.stackNumber); - int spellID = ba.additionalInfo; + SpellID spellID = SpellID(ba.additionalInfo); BattleHex destination(ba.destinationTile); const Bonus *randSpellcaster = stack->getBonusLocalFirst(Selector::type(Bonus::RANDOM_SPELLCASTER)); @@ -3910,7 +3910,7 @@ void CGameHandler::playerMessage( TPlayerColor player, const std::string &messag } } -void CGameHandler::handleSpellCasting( int spellID, int spellLvl, BattleHex destination, ui8 casterSide, TPlayerColor casterColor, const CGHeroInstance * caster, const CGHeroInstance * secHero, +void CGameHandler::handleSpellCasting( SpellID spellID, int spellLvl, BattleHex destination, ui8 casterSide, TPlayerColor casterColor, const CGHeroInstance * caster, const CGHeroInstance * secHero, int usedSpellPower, ECastingMode::ECastingMode mode, const CStack * stack, si32 selectedStack) { const CSpell *spell = SpellID(spellID).toSpell(); @@ -3925,7 +3925,7 @@ void CGameHandler::handleSpellCasting( int spellID, int spellLvl, BattleHex dest : 0; auto obstacle = make_shared(); - switch(spellID) // :/ + switch(spellID.toEnum()) // :/ { case SpellID::QUICKSAND: obstacle->obstacleType = CObstacleInstance::QUICKSAND; @@ -4044,7 +4044,7 @@ void CGameHandler::handleSpellCasting( int spellID, int spellLvl, BattleHex dest int spellDamage = 0; if (stack && mode != ECastingMode::MAGIC_MIRROR) { - int unitSpellPower = stack->valOfBonuses(Bonus::SPECIFIC_SPELL_POWER, spellID); + int unitSpellPower = stack->valOfBonuses(Bonus::SPECIFIC_SPELL_POWER, spellID.toEnum()); if (unitSpellPower) sc.dmgToDisplay = spellDamage = stack->count * unitSpellPower; //TODO: handle immunities else //Faerie Dragon @@ -4155,7 +4155,7 @@ void CGameHandler::handleSpellCasting( int spellID, int spellLvl, BattleHex dest } if (caster && caster->hasBonusOfType(Bonus::SPECIAL_BLESS_DAMAGE, spellID)) //TODO: better handling of bonus percentages { - int damagePercent = caster->level * caster->valOfBonuses(Bonus::SPECIAL_BLESS_DAMAGE, spellID) / tier; + int damagePercent = caster->level * caster->valOfBonuses(Bonus::SPECIAL_BLESS_DAMAGE, spellID.toEnum()) / tier; Bonus specialBonus = CStack::featureGenerator(Bonus::CREATURE_DAMAGE, 0, damagePercent, pseudoBonus.turnsRemain); specialBonus.valType = Bonus::PERCENT_TO_ALL; specialBonus.sid = spellID; @@ -4172,7 +4172,7 @@ void CGameHandler::handleSpellCasting( int spellID, int spellLvl, BattleHex dest int hpGained = 0; if (stack) { - int unitSpellPower = stack->valOfBonuses(Bonus::SPECIFIC_SPELL_POWER, spellID); + int unitSpellPower = stack->valOfBonuses(Bonus::SPECIFIC_SPELL_POWER, spellID.toEnum()); if (unitSpellPower) hpGained = stack->count * unitSpellPower; //Archangel else //Faerie Dragon-like effect - unused fo far @@ -4288,7 +4288,7 @@ void CGameHandler::handleSpellCasting( int spellID, int spellLvl, BattleHex dest bsa.pos = gs->curB->getAvaliableHex(creID, !(bool)casterSide); //TODO: unify it //TODO stack casting -> probably power will be zero; set the proper number of creatures manually - int percentBonus = caster ? caster->valOfBonuses(Bonus::SPECIFIC_SPELL_DAMAGE, spellID) : 0; + int percentBonus = caster ? caster->valOfBonuses(Bonus::SPECIFIC_SPELL_DAMAGE, spellID.toEnum()) : 0; bsa.amount = usedSpellPower * SpellID(spellID).toSpell()->powers[spellLvl] @@ -4458,7 +4458,7 @@ bool CGameHandler::makeCustomAction( BattleAction &ba ) StartAction start_action(ba); sendAndApply(&start_action); //start spell casting - handleSpellCasting (ba.additionalInfo, skill, ba.destinationTile, ba.side, h->tempOwner, + handleSpellCasting (SpellID(ba.additionalInfo), skill, ba.destinationTile, ba.side, h->tempOwner, h, secondHero, h->getPrimSkillLevel(PrimarySkill::SPELL_POWER), ECastingMode::HERO_CASTING, NULL, ba.selectedStack); @@ -4560,7 +4560,7 @@ void CGameHandler::stackTurnTrigger(const CStack * st) { bte.effect = Bonus::MANA_DRAIN; bte.val = manaDrained; - bte.additionalInfo = enemy->id; //for sanity + bte.additionalInfo = enemy->id.getNum(); //for sanity sendAndApply(&bte); } } @@ -4590,7 +4590,7 @@ void CGameHandler::stackTurnTrigger(const CStack * st) if (bl.size() && st->casts && !gs->curB->enchanterCounter[side]) { int index = rand() % bl.size(); - int spellID = bl[index]->subtype; //spell ID + SpellID spellID = SpellID(bl[index]->subtype); if (gs->curB->battleCanCastThisSpell(st->owner, SpellID(spellID).toSpell(), ECastingMode::ENCHANTER_CASTING)) //TODO: select another? { int spellLeveL = bl[index]->val; //spell level @@ -4751,7 +4751,7 @@ void CGameHandler::handleTimeEvents() } } -void CGameHandler::handleTownEvents(CGTownInstance * town, NewTurn &n, std::map > &newCreas) +void CGameHandler::handleTownEvents(CGTownInstance * town, NewTurn &n, std::map > &newCreas) { //TODO event removing desync!!! town->events.sort(evntCmp); @@ -4837,7 +4837,7 @@ ui32 CGameHandler::getQueryResult( TPlayerColor player, int queryID ) return 0; } -void CGameHandler::showGarrisonDialog( int upobj, int hid, bool removableUnits, const boost::function &cb ) +void CGameHandler::showGarrisonDialog( ObjectInstanceID upobj, ObjectInstanceID hid, bool removableUnits, const boost::function &cb ) { ui8 player = getOwner(hid); GarrisonDialog gd; @@ -4859,17 +4859,17 @@ void CGameHandler::showGarrisonDialog( int upobj, int hid, bool removableUnits, allowedExchanges.erase(gd.queryID); }; - allowedExchanges[gd.queryID] = std::pair(upobj,hid); + allowedExchanges[gd.queryID] = std::make_pair(upobj,hid); sendAndApply(&gd); } } -void CGameHandler::showThievesGuildWindow(TPlayerColor player, int requestingObjId) +void CGameHandler::showThievesGuildWindow(TPlayerColor player, ObjectInstanceID requestingObjId) { OpenWindow ow; ow.window = OpenWindow::THIEVES_GUILD; ow.id1 = player; - ow.id2 = requestingObjId; + ow.id2 = requestingObjId.getNum(); sendAndApply(&ow); } @@ -4878,9 +4878,9 @@ bool CGameHandler::isAllowedArrangePack(const ArrangeStacks *pack) return isAllowedExchangeForQuery(pack->id1, pack->id2); } -bool CGameHandler::isAllowedExchangeForQuery(int id1, int id2) { +bool CGameHandler::isAllowedExchangeForQuery(ObjectInstanceID id1, ObjectInstanceID id2) { boost::unique_lock lock(gsm); - for(std::map >::const_iterator i = allowedExchanges.begin(); i!=allowedExchanges.end(); i++) + for(auto i = allowedExchanges.cbegin(); i!=allowedExchanges.cend(); i++) if((id1 == i->second.first && id2 == i->second.second) || (id2 == i->second.first && id1 == i->second.second)) return true; @@ -4888,7 +4888,7 @@ bool CGameHandler::isAllowedExchangeForQuery(int id1, int id2) { return false; } -bool CGameHandler::isAllowedExchange( int id1, int id2 ) +bool CGameHandler::isAllowedExchange( ObjectInstanceID id1, ObjectInstanceID id2 ) { if(id1 == id2) return true; @@ -4941,7 +4941,7 @@ void CGameHandler::objectVisited( const CGObjectInstance * obj, const CGHeroInst sendAndApply(&hv); } -bool CGameHandler::buildBoat( ui32 objid ) +bool CGameHandler::buildBoat( ObjectInstanceID objid ) { const IShipyard *obj = IShipyard::castFrom(getObj(objid)); @@ -5269,13 +5269,13 @@ void CGameHandler::attackCasting(const BattleAttack & bat, Bonus::BonusType atta { if(attacker->hasBonusOfType(attackMode)) { - std::set spellsToCast; + std::set spellsToCast; TBonusListPtr spells = attacker->getBonuses(Selector::type(attackMode)); BOOST_FOREACH(const Bonus *sf, *spells) { - spellsToCast.insert (sf->subtype); + spellsToCast.insert (SpellID(sf->subtype)); } - BOOST_FOREACH(ui32 spellID, spellsToCast) + BOOST_FOREACH(SpellID spellID, spellsToCast) { const CStack * oneOfAttacked = NULL; for (int g=0; gid; + gb.id = h->id.getNum(); gb.bonus = Bonus(Bonus::ONE_DAY, Bonus::NONE, Bonus::SPELL_EFFECT, 0, SpellID::DIMENSION_DOOR); sendAndApply(&gb); @@ -5532,7 +5532,7 @@ bool CGameHandler::castSpell(const CGHeroInstance *h, SpellID spellID, const int int subtype = schoolLevel >= 2 ? 1 : 2; //adv or expert GiveBonus gb; - gb.id = h->id; + gb.id = h->id.getNum(); gb.bonus = Bonus(Bonus::ONE_DAY, Bonus::FLYING_MOVEMENT, Bonus::SPELL_EFFECT, 0, SpellID::FLY, subtype); sendAndApply(&gb); } @@ -5542,7 +5542,7 @@ bool CGameHandler::castSpell(const CGHeroInstance *h, SpellID spellID, const int int subtype = schoolLevel >= 2 ? 1 : 2; //adv or expert GiveBonus gb; - gb.id = h->id; + gb.id = h->id.getNum(); gb.bonus = Bonus(Bonus::ONE_DAY, Bonus::WATER_WALKING, Bonus::SPELL_EFFECT, 0, SpellID::WATER_WALK, subtype); sendAndApply(&gb); } @@ -5565,11 +5565,11 @@ bool CGameHandler::castSpell(const CGHeroInstance *h, SpellID spellID, const int if (h->getSpellSchoolLevel(s) < 2) { double dist = town->pos.dist2d(h->pos); - int nearest = town->id; //nearest town's ID + ObjectInstanceID nearest = town->id; //nearest town's ID BOOST_FOREACH(const CGTownInstance * currTown, gs->getPlayer(h->tempOwner)->towns) { double curDist = currTown->pos.dist2d(h->pos); - if (nearest == -1 || curDist < dist) + if (nearest == ObjectInstanceID() || curDist < dist) { nearest = town->id; dist = curDist; @@ -5848,7 +5848,7 @@ void CGameHandler::runBattle() TBonusListPtr bl = gs->curB->heroes[i]->getBonuses(Selector::type(Bonus::OPENING_BATTLE_SPELL)); BOOST_FOREACH (Bonus *b, *bl) { - handleSpellCasting(b->subtype, 3, -1, 0, gs->curB->heroes[i]->tempOwner, NULL, gs->curB->heroes[1-i], b->val, ECastingMode::HERO_CASTING, NULL); + handleSpellCasting(SpellID(b->subtype), 3, -1, 0, gs->curB->heroes[i]->tempOwner, NULL, gs->curB->heroes[1-i], b->val, ECastingMode::HERO_CASTING, NULL); } } } @@ -6189,7 +6189,7 @@ void CGameHandler::removeObstacle(const CObstacleInstance &obstacle) CasualtiesAfterBattle::CasualtiesAfterBattle(const CArmedInstance *army, BattleInfo *bat) { - heroWithDeadCommander = -1; + heroWithDeadCommander = ObjectInstanceID(); int color = army->tempOwner; if(color == GameConstants::UNFLAGGABLE_PLAYER) @@ -6230,7 +6230,7 @@ void CasualtiesAfterBattle::takeFromArmy(CGameHandler *gh) else gh->eraseStack(ncount.first, true); } - if (heroWithDeadCommander > -1) + if (heroWithDeadCommander != ObjectInstanceID()) { SetCommanderProperty scp; scp.heroid = heroWithDeadCommander; diff --git a/server/CGameHandler.h b/server/CGameHandler.h index 4e59e09bd..8c3a4fb10 100644 --- a/server/CGameHandler.h +++ b/server/CGameHandler.h @@ -75,7 +75,7 @@ struct CasualtiesAfterBattle typedef std::pair TStackAndItsNewCount; enum {ERASE = -1}; std::vector newStackCounts; - si32 heroWithDeadCommander; //TODO: unify stack loactions + ObjectInstanceID heroWithDeadCommander; //TODO: unify stack loactions CasualtiesAfterBattle(const CArmedInstance *army, BattleInfo *bat); void takeFromArmy(CGameHandler *gh); @@ -85,7 +85,7 @@ class CGameHandler : public IGameCallback, CBattleInfoCallback { private: void makeStackDoNothing(const CStack * next); - bool isAllowedExchangeForQuery(int id1, int id2); + bool isAllowedExchangeForQuery(ObjectInstanceID id1, ObjectInstanceID id2); public: CVCMIServer *s; std::map connections; //player color -> connection to client with interface of that player @@ -98,10 +98,10 @@ public: //TODO get rid of cfunctionlist (or similar) and use serialziable callback structure std::map > callbacks; //query id => callback function - for selection and yes/no dialogs - std::map > allowedExchanges; + std::map > allowedExchanges; bool isBlockedByQueries(const CPack *pack, int packType, TPlayerColor player); - bool isAllowedExchange(int id1, int id2); + bool isAllowedExchange(ObjectInstanceID id1, ObjectInstanceID id2); bool isAllowedArrangePack(const ArrangeStacks *pack); void giveSpells(const CGTownInstance *t, const CGHeroInstance *h); int moveStack(int stack, BattleHex dest); //returned value - travelled distance @@ -131,7 +131,7 @@ public: //do sth void changeSpells(const CGHeroInstance * hero, bool give, const std::set &spells) OVERRIDE; bool removeObject(const CGObjectInstance * obj) OVERRIDE; - void setBlockVis(int objid, bool bv) OVERRIDE; + void setBlockVis(ObjectInstanceID objid, bool bv) OVERRIDE; void setOwner(const CGObjectInstance * obj, TPlayerColor owner) OVERRIDE; void setHoverName(const CGObjectInstance * objid, MetaString * name) OVERRIDE; void changePrimSkill(const CGHeroInstance * hero, PrimarySkill::PrimarySkill which, si64 val, bool abs=false) OVERRIDE; @@ -139,12 +139,12 @@ public: //void showInfoDialog(InfoWindow *iw) OVERRIDE; void showBlockingDialog(BlockingDialog *iw, const CFunctionList &callback) OVERRIDE; ui32 showBlockingDialog(BlockingDialog *iw) OVERRIDE; //synchronous version of above - void showGarrisonDialog(int upobj, int hid, bool removableUnits, const boost::function &cb) OVERRIDE; - void showThievesGuildWindow(TPlayerColor player, int requestingObjId) OVERRIDE; + void showGarrisonDialog(ObjectInstanceID upobj, ObjectInstanceID hid, bool removableUnits, const boost::function &cb) OVERRIDE; + void showThievesGuildWindow(TPlayerColor player, ObjectInstanceID requestingObjId) OVERRIDE; void giveResource(TPlayerColor player, Res::ERes which, int val) OVERRIDE; void giveCreatures(const CArmedInstance *objid, const CGHeroInstance * h, const CCreatureSet &creatures, bool remove) OVERRIDE; - void takeCreatures(int objid, const std::vector &creatures) OVERRIDE; + void takeCreatures(ObjectInstanceID objid, const std::vector &creatures) OVERRIDE; bool changeStackType(const StackLocation &sl, CCreature *c) OVERRIDE; bool changeStackCount(const StackLocation &sl, TQuantity count, bool absoluteValue = false) OVERRIDE; bool insertNewStack(const StackLocation &sl, const CCreature *c, TQuantity count) OVERRIDE; @@ -167,20 +167,20 @@ public: void startBattleI(const CArmedInstance *army1, const CArmedInstance *army2, int3 tile, const CGHeroInstance *hero1, const CGHeroInstance *hero2, bool creatureBank = false, boost::function cb = 0, const CGTownInstance *town = NULL) OVERRIDE; //use hero=NULL for no hero void startBattleI(const CArmedInstance *army1, const CArmedInstance *army2, int3 tile, boost::function cb = 0, bool creatureBank = false) OVERRIDE; //if any of armies is hero, hero will be used void startBattleI(const CArmedInstance *army1, const CArmedInstance *army2, boost::function cb = 0, bool creatureBank = false) OVERRIDE; //if any of armies is hero, hero will be used, visitable tile of second obj is place of battle//void startBattleI(int heroID, CCreatureSet army, int3 tile, boost::function cb) OVERRIDE; //for hero<=>neutral army - void setAmount(int objid, ui32 val) OVERRIDE; - bool moveHero(si32 hid, int3 dst, ui8 instant, TPlayerColor asker = GameConstants::NEUTRAL_PLAYER) OVERRIDE; + void setAmount(ObjectInstanceID objid, ui32 val) OVERRIDE; + bool moveHero(ObjectInstanceID hid, int3 dst, ui8 instant, TPlayerColor asker = GameConstants::NEUTRAL_PLAYER) OVERRIDE; void giveHeroBonus(GiveBonus * bonus) OVERRIDE; void setMovePoints(SetMovePoints * smp) OVERRIDE; - void setManaPoints(int hid, int val) OVERRIDE; - void giveHero(int id, TPlayerColor player) OVERRIDE; - void changeObjPos(int objid, int3 newPos, ui8 flags) OVERRIDE; - void heroExchange(si32 hero1, si32 hero2) OVERRIDE; + void setManaPoints(ObjectInstanceID hid, int val) OVERRIDE; + void giveHero(ObjectInstanceID id, TPlayerColor player) OVERRIDE; + void changeObjPos(ObjectInstanceID objid, int3 newPos, ui8 flags) OVERRIDE; + void heroExchange(ObjectInstanceID hero1, ObjectInstanceID hero2) OVERRIDE; ////////////////////////////////////////////////////////////////////////// - void useScholarSkill(si32 hero1, si32 hero2); + void useScholarSkill(ObjectInstanceID hero1, ObjectInstanceID hero2); void setPortalDwelling(const CGTownInstance * town, bool forced, bool clear); bool tryAttackingGuard(const int3 &guardPos, const CGHeroInstance * h); void visitObjectOnTile(const TerrainTile &t, const CGHeroInstance * h); - bool teleportHero(si32 hid, si32 dstid, ui8 source, TPlayerColor asker = GameConstants::NEUTRAL_PLAYER); + bool teleportHero(ObjectInstanceID hid, ObjectInstanceID dstid, ui8 source, TPlayerColor asker = GameConstants::NEUTRAL_PLAYER); void vistiCastleObjects (const CGTownInstance *t, const CGHeroInstance *h); void levelUpHero(const CGHeroInstance * hero, SecondarySkill skill);//handle client respond and send one more request if needed void levelUpHero(const CGHeroInstance * hero);//initial call - check if hero have remaining levelups & handle them @@ -198,7 +198,7 @@ public: void playerMessage( TPlayerColor player, const std::string &message); bool makeBattleAction(BattleAction &ba); bool makeAutomaticAction(const CStack *stack, BattleAction &ba); //used when action is taken by stack without volition of player (eg. unguided catapult attack) - void handleSpellCasting(int spellID, int spellLvl, BattleHex destination, ui8 casterSide, TPlayerColor casterColor, const CGHeroInstance * caster, const CGHeroInstance * secHero, + void handleSpellCasting(SpellID spellID, int spellLvl, BattleHex destination, ui8 casterSide, TPlayerColor casterColor, const CGHeroInstance * caster, const CGHeroInstance * secHero, int usedSpellPower, ECastingMode::ECastingMode mode, const CStack * stack, si32 selectedStack = -1); bool makeCustomAction(BattleAction &ba); void stackTurnTrigger(const CStack * stack); @@ -206,30 +206,30 @@ public: void removeObstacle(const CObstacleInstance &obstacle); bool queryReply( ui32 qid, ui32 answer, TPlayerColor player ); bool hireHero( const CGObjectInstance *obj, ui8 hid, TPlayerColor player ); - bool buildBoat( ui32 objid ); - bool setFormation( si32 hid, ui8 formation ); + bool buildBoat( ObjectInstanceID objid ); + bool setFormation( ObjectInstanceID hid, ui8 formation ); bool tradeResources(const IMarket *market, ui32 val, TPlayerColor player, ui32 id1, ui32 id2); bool sacrificeCreatures(const IMarket *market, const CGHeroInstance *hero, TSlot slot, ui32 count); bool sendResources(ui32 val, TPlayerColor player, Res::ERes r1, TPlayerColor r2); bool sellCreatures(ui32 count, const IMarket *market, const CGHeroInstance * hero, ui32 slot, Res::ERes resourceID); bool transformInUndead(const IMarket *market, const CGHeroInstance * hero, ui32 slot); - bool assembleArtifacts (si32 heroID, ArtifactPosition artifactSlot, bool assemble, ui32 assembleTo); - bool buyArtifact( ui32 hid, ArtifactID aid ); //for blacksmith and mage guild only -> buying for gold in common buildings + bool assembleArtifacts (ObjectInstanceID heroID, ArtifactPosition artifactSlot, bool assemble, ui32 assembleTo); + bool buyArtifact( ObjectInstanceID hid, ArtifactID aid ); //for blacksmith and mage guild only -> buying for gold in common buildings bool buyArtifact( const IMarket *m, const CGHeroInstance *h, Res::ERes rid, ArtifactID aid); //for artifact merchant and black market -> buying for any resource in special building / advobject - bool sellArtifact( const IMarket *m, const CGHeroInstance *h, TArtifactInstanceID aid, Res::ERes rid); //for artifact merchant selling + bool sellArtifact( const IMarket *m, const CGHeroInstance *h, ArtifactInstanceID aid, Res::ERes rid); //for artifact merchant selling //void lootArtifacts (TArtHolder source, TArtHolder dest, std::vector &arts); //after battle - move al arts to winer bool buySecSkill( const IMarket *m, const CGHeroInstance *h, SecondarySkill skill); - bool garrisonSwap(si32 tid); - bool upgradeCreature( ui32 objid, ui8 pos, CreatureID upgID ); - bool recruitCreatures(si32 objid, CreatureID crid, ui32 cram, si32 level); - bool buildStructure(si32 tid, BuildingID bid, bool force=false);//force - for events: no cost, no checkings - bool razeStructure(si32 tid, BuildingID bid); - bool disbandCreature( si32 id, ui8 pos ); - bool arrangeStacks( si32 id1, si32 id2, ui8 what, ui8 p1, ui8 p2, si32 val, TPlayerColor player); + bool garrisonSwap(ObjectInstanceID tid); + bool upgradeCreature( ObjectInstanceID objid, ui8 pos, CreatureID upgID ); + bool recruitCreatures(ObjectInstanceID objid, CreatureID crid, ui32 cram, si32 level); + bool buildStructure(ObjectInstanceID tid, BuildingID bid, bool force=false);//force - for events: no cost, no checkings + bool razeStructure(ObjectInstanceID tid, BuildingID bid); + bool disbandCreature( ObjectInstanceID id, ui8 pos ); + bool arrangeStacks( ObjectInstanceID id1, ObjectInstanceID id2, ui8 what, ui8 p1, ui8 p2, si32 val, TPlayerColor player); void save(const std::string &fname); void close(); void handleTimeEvents(); - void handleTownEvents(CGTownInstance *town, NewTurn &n, std::map > &newCreas); + void handleTownEvents(CGTownInstance *town, NewTurn &n, std::map > &newCreas); bool complain(const std::string &problem); //sends message to all clients, prints on the logs and return true void objectVisited( const CGObjectInstance * obj, const CGHeroInstance * h ); void engageIntoBattle( TPlayerColor player ); diff --git a/server/NetPacksServer.cpp b/server/NetPacksServer.cpp index efe1df5a9..f8aa80635 100644 --- a/server/NetPacksServer.cpp +++ b/server/NetPacksServer.cpp @@ -188,7 +188,7 @@ bool TradeOnMarketplace::applyGh( CGameHandler *gh ) case EMarketMode::ARTIFACT_RESOURCE: if(!hero) COMPLAIN_AND_RETURN("Only hero can sell artifacts!"); - return gh->sellArtifact(m, hero, r1, static_cast(r2)); + return gh->sellArtifact(m, hero, ArtifactInstanceID(r1), static_cast(r2)); case EMarketMode::CREATURE_UNDEAD: return gh->transformInUndead(m, hero, r1); case EMarketMode::RESOURCE_SKILL: