From 9dd60b6dbe88b171ff7e6cb980b3ab892f4cb079 Mon Sep 17 00:00:00 2001 From: mateuszb Date: Fri, 8 Feb 2013 21:17:39 +0000 Subject: [PATCH] * refactoring * moat damage went to config file --- client/BattleInterface/CBattleAnimations.cpp | 2 +- client/BattleInterface/CBattleInterface.cpp | 4 +- client/Client.h | 16 +-- config/factions/castle.json | 1 + config/factions/conflux.json | 1 + config/factions/dungeon.json | 1 + config/factions/fortress.json | 1 + config/factions/inferno.json | 1 + config/factions/necropolis.json | 1 + config/factions/rampart.json | 1 + config/factions/stronghold.json | 1 + config/factions/tower.json | 1 + lib/CBattleCallback.cpp | 18 +-- lib/CObjectHandler.cpp | 94 +++++++-------- lib/CTownHandler.cpp | 2 + lib/CTownHandler.h | 3 +- lib/IGameCallback.h | 16 +-- server/CGameHandler.cpp | 115 +++++++++---------- server/CGameHandler.h | 36 +++--- server/NetPacksServer.cpp | 2 +- 20 files changed, 157 insertions(+), 160 deletions(-) diff --git a/client/BattleInterface/CBattleAnimations.cpp b/client/BattleInterface/CBattleAnimations.cpp index 2bcae0f01..735617676 100644 --- a/client/BattleInterface/CBattleAnimations.cpp +++ b/client/BattleInterface/CBattleAnimations.cpp @@ -725,7 +725,7 @@ bool CShootingAnimation::init() // If the creature id is 149 then it's a arrow tower which has no additional info so get the // actual arrow tower shooter instead. const CCreature *shooterInfo = shooter->getCreature(); - if (shooterInfo->idNumber == 149) + if (shooterInfo->idNumber == CreatureID::ARROW_TOWERS) { int creID = owner->siegeH->town->town->clientInfo.siegeShooter; shooterInfo = CGI->creh->creatures[creID]; diff --git a/client/BattleInterface/CBattleInterface.cpp b/client/BattleInterface/CBattleInterface.cpp index 64b197fd7..48b6f47b8 100644 --- a/client/BattleInterface/CBattleInterface.cpp +++ b/client/BattleInterface/CBattleInterface.cpp @@ -295,7 +295,7 @@ CBattleInterface::CBattleInterface(const CCreatureSet * army1, const CCreatureSe CDefHandler *&projectile = idToProjectile[s->getCreature()->idNumber]; const CCreature * creature;//creature whose shots should be loaded - if (s->getCreature()->idNumber == 149) + if (s->getCreature()->idNumber == CreatureID::ARROW_TOWERS) creature = CGI->creh->creatures[siegeH->town->town->clientInfo.siegeShooter]; else creature = s->getCreature(); @@ -2179,7 +2179,7 @@ void CBattleInterface::showAliveStack(const CStack *stack, SDL_Surface * to) bool incrementFrame = (animCount%(4/affectingSpeed)==0) && animType!=CCreatureAnim::DEATH && animType!=CCreatureAnim::MOVE_START && animType!=CCreatureAnim::HOLDING; - if (creature->idNumber == 149) + if (creature->idNumber == CreatureID::ARROW_TOWERS) { // a turret creature has a limited height, so cut it at a certain position; turret creature has no standing anim unitRect.h = siegeH->town->town->clientInfo.siegeShooterCropHeight; diff --git a/client/Client.h b/client/Client.h index 92529dff8..daab17cc2 100644 --- a/client/Client.h +++ b/client/Client.h @@ -162,18 +162,18 @@ public: ////////////////////////////////////////////////////////////////////////// //not working yet, will be implement somewhen later with support for local-sim-based gameplay - void changeSpells(int hid, bool give, const std::set &spells) OVERRIDE {}; - bool removeObject(int objid) OVERRIDE {return false;}; + 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 setOwner(int objid, TPlayerColor owner) OVERRIDE {}; + void setOwner(const CGObjectInstance * obj, TPlayerColor owner) OVERRIDE {}; void setHoverName(int objid, MetaString * name) OVERRIDE {}; - void changePrimSkill(int ID, PrimarySkill::PrimarySkill which, si64 val, bool abs=false) OVERRIDE {}; + void changePrimSkill(const CGHeroInstance * hero, PrimarySkill::PrimarySkill which, si64 val, bool abs=false) OVERRIDE {}; void changeSecSkill(int ID, SecondarySkill::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(int player, int requestingObjId) OVERRIDE {}; - void giveResource(int player, Res::ERes which, int val) 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 {}; @@ -193,8 +193,8 @@ public: bool moveArtifact(const ArtifactLocation &al1, const ArtifactLocation &al2) OVERRIDE {return false;}; void showCompInfo(ShowInInfobox * comp) OVERRIDE {}; - void heroVisitCastle(int obj, int heroID) OVERRIDE {}; - void stopHeroVisitCastle(int obj, int heroID) OVERRIDE {}; + void heroVisitCastle(const CGTownInstance * obj, const CGHeroInstance * hero) OVERRIDE {}; + void stopHeroVisitCastle(const CGTownInstance * obj, const CGHeroInstance * hero) OVERRIDE {}; //void giveHeroArtifact(int artid, int hid, int position){}; //void giveNewArtifact(int hid, int position){}; 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 @@ -205,7 +205,7 @@ public: void giveHeroBonus(GiveBonus * bonus) OVERRIDE {}; void setMovePoints(SetMovePoints * smp) OVERRIDE {}; void setManaPoints(int hid, int val) OVERRIDE {}; - void giveHero(int id, int player) OVERRIDE {}; + void giveHero(int id, TPlayerColor player) OVERRIDE {}; void changeObjPos(int objid, int3 newPos, ui8 flags) OVERRIDE {}; void sendAndApply(CPackForClient * info) OVERRIDE {}; void heroExchange(si32 hero1, si32 hero2) OVERRIDE {}; diff --git a/config/factions/castle.json b/config/factions/castle.json index 070c40e3a..e2581fb99 100644 --- a/config/factions/castle.json +++ b/config/factions/castle.json @@ -148,6 +148,7 @@ "horde" : [ 2, -1 ], "mageGuild" : 4, "warMachine" : "ballista", + "moatDamage" : 70, "buildings" : [ diff --git a/config/factions/conflux.json b/config/factions/conflux.json index 55c1d68cc..a2ec80e37 100644 --- a/config/factions/conflux.json +++ b/config/factions/conflux.json @@ -151,6 +151,7 @@ "mageGuild" : 5, "primaryResource" : "mercury", "warMachine" : "ballista", + "moatDamage" : 70, "buildings" : [ diff --git a/config/factions/dungeon.json b/config/factions/dungeon.json index e86929f6f..6a6d29964 100644 --- a/config/factions/dungeon.json +++ b/config/factions/dungeon.json @@ -146,6 +146,7 @@ "mageGuild" : 5, "primaryResource" : "sulfur", "warMachine" : "ballista", + "moatDamage" : 90, "buildings" : [ diff --git a/config/factions/fortress.json b/config/factions/fortress.json index 452a7b91a..6bf9832c2 100644 --- a/config/factions/fortress.json +++ b/config/factions/fortress.json @@ -146,6 +146,7 @@ "horde" : [ 0, -1 ], "mageGuild" : 3, "warMachine" : "firstAidTent", + "moatDamage" : 90, "buildings" : [ diff --git a/config/factions/inferno.json b/config/factions/inferno.json index 29b97d21b..fbdba20fa 100644 --- a/config/factions/inferno.json +++ b/config/factions/inferno.json @@ -147,6 +147,7 @@ "mageGuild" : 5, "primaryResource" : "mercury", "warMachine" : "ballista", + "moatDamage" : 90, "buildings" : [ diff --git a/config/factions/necropolis.json b/config/factions/necropolis.json index 730d74059..8e749b8eb 100644 --- a/config/factions/necropolis.json +++ b/config/factions/necropolis.json @@ -150,6 +150,7 @@ "horde" : [ 0, -1 ], "mageGuild" : 5, "warMachine" : "firstAidTent", + "moatDamage" : 70, "buildings" : [ diff --git a/config/factions/rampart.json b/config/factions/rampart.json index 9c1af568d..07cd76a42 100644 --- a/config/factions/rampart.json +++ b/config/factions/rampart.json @@ -152,6 +152,7 @@ "mageGuild" : 5, "primaryResource" : "crystal", "warMachine" : "firstAidTent", + "moatDamage" : 70, "buildings" : [ diff --git a/config/factions/stronghold.json b/config/factions/stronghold.json index c42f41dbe..d7ef30af4 100644 --- a/config/factions/stronghold.json +++ b/config/factions/stronghold.json @@ -144,6 +144,7 @@ "horde" : [ 0, -1 ], "mageGuild" : 3, "warMachine" : "ammoCart", + "moatDamage" : 70, "buildings" : [ diff --git a/config/factions/tower.json b/config/factions/tower.json index 54bcfa722..175edecb8 100644 --- a/config/factions/tower.json +++ b/config/factions/tower.json @@ -147,6 +147,7 @@ "primaryResource" : "gems", "mageGuild" : 5, "warMachine" : "ammoCart", + "moatDamage" : -1, "buildings" : [ diff --git a/lib/CBattleCallback.cpp b/lib/CBattleCallback.cpp index 5cdf50d95..8f6409aa5 100644 --- a/lib/CBattleCallback.cpp +++ b/lib/CBattleCallback.cpp @@ -5,6 +5,7 @@ #include "NetPacks.h" #include "CSpellHandler.h" #include "VCMI_Lib.h" +#include "CTownHandler.h" /* * CBattleCallback.cpp, part of VCMI engine @@ -22,7 +23,7 @@ namespace SiegeStuffThatShouldBeMovedToHandlers // <=== TODO { static void retreiveTurretDamageRange(const CStack *turret, double &outMinDmg, double &outMaxDmg) { - assert(turret->getCreature()->idNumber == 149); //arrow turret + assert(turret->getCreature()->idNumber == CreatureID::ARROW_TOWERS); switch(turret->position) { @@ -58,19 +59,6 @@ namespace SiegeStuffThatShouldBeMovedToHandlers // <=== TODO return stackLeft != destLeft; } - static int getMoatDamage(int townType) - { - //TODO move to config file - static const int dmgs[] = {70, 70, -1, - 90, 70, 90, - 70, 90, 70}; - - if(townType >= 0 && townType < ARRAY_COUNT(dmgs)) - return dmgs[townType]; - - tlog1 << "No moat info for town " << townType << std::endl; - return 0; - } static EWallParts::EWallParts hexToWallPart(BattleHex hex) { //potentially attackable parts of wall @@ -214,7 +202,7 @@ int CBattleInfoEssentials::battleGetMoatDmg() const if(!town) return 0; - return getMoatDamage(town->subID); + return town->town->moatDamage; } const CGTownInstance * CBattleInfoEssentials::battleGetDefendedTown() const diff --git a/lib/CObjectHandler.cpp b/lib/CObjectHandler.cpp index 8c6d96a6d..6977272e1 100644 --- a/lib/CObjectHandler.cpp +++ b/lib/CObjectHandler.cpp @@ -1689,9 +1689,9 @@ void CGDwelling::onHeroVisit( const CGHeroInstance * h ) const return; } - int relations = cb->gameState()->getPlayerRelations( h->tempOwner, tempOwner ); + PlayerRelations::PlayerRelations relations = cb->gameState()->getPlayerRelations( h->tempOwner, tempOwner ); - if ( relations == 1 )//ally + if ( relations == PlayerRelations::ALLIES ) return;//do not allow recruiting or capturing if( !relations && stacksCount() > 0) //object is guarded, owned by enemy @@ -1708,7 +1708,7 @@ void CGDwelling::onHeroVisit( const CGHeroInstance * h ) const if(!relations && ID != Obj::WAR_MACHINE_FACTORY) { - cb->setOwner(id, h->tempOwner); + cb->setOwner(this, h->tempOwner); } BlockingDialog bd (true,false); @@ -2087,9 +2087,9 @@ void CGTownInstance::onHeroVisit(const CGHeroInstance * h) const } else { - cb->setOwner(id, h->tempOwner); + cb->setOwner(this, h->tempOwner); removeCapitols(h->getOwner()); - cb->heroVisitCastle(id, h->id); + cb->heroVisitCastle(this, h); } } else @@ -2102,13 +2102,13 @@ void CGTownInstance::onHeroVisit(const CGHeroInstance * h) const scp.amount = 1; cb->sendAndApply (&scp); } - cb->heroVisitCastle(id, h->id); + cb->heroVisitCastle(this, h); } } void CGTownInstance::onHeroLeave(const CGHeroInstance * h) const { - cb->stopHeroVisitCastle(id,h->id); + cb->stopHeroVisitCastle(this, h); } void CGTownInstance::initObj() @@ -2252,7 +2252,7 @@ void CGTownInstance::fightOver( const CGHeroInstance *h, BattleResult *result ) if(result->winner == 0) { removeCapitols (h->getOwner()); - cb->setOwner (id, h->tempOwner); //give control after checkout is done + cb->setOwner (this, h->tempOwner); //give control after checkout is done FoWChange fw; fw.player = h->tempOwner; fw.mode = 1; @@ -2572,7 +2572,7 @@ void CGVisitableOPH::treeSelected( int heroID, int resType, int resVal, TExpType if(result) //player agreed to give res for exp { cb->giveResource(cb->getOwner(heroID), static_cast(resType), -resVal); //take resource - cb->changePrimSkill(heroID, PrimarySkill::EXPERIENCE, expVal); + cb->changePrimSkill(cb->getHero(heroID), PrimarySkill::EXPERIENCE, expVal); cb->setObjProperty(id, ObjProperty::VISITORS, heroID); //add to the visitors } } @@ -2654,7 +2654,7 @@ void CGVisitableOPH::onNAHeroVisit(int heroID, bool alreadyVisited) const case Obj::STAR_AXIS: case Obj::GARDEN_OF_REVELATION: { - cb->changePrimSkill(heroID, static_cast(subid), val); + cb->changePrimSkill(cb->getHero(heroID), static_cast(subid), val); InfoWindow iw; iw.soundID = sound; iw.components.push_back(Component(c_id, subid, val, 0)); @@ -2673,7 +2673,7 @@ void CGVisitableOPH::onNAHeroVisit(int heroID, bool alreadyVisited) const iw.player = cb->getOwner(heroID); iw.text.addTxt(MetaString::ADVOB_TXT,ot); cb->showInfoDialog(&iw); - cb->changePrimSkill(heroID, PrimarySkill::EXPERIENCE, val); + cb->changePrimSkill(h, PrimarySkill::EXPERIENCE, val); break; } case Obj::TREE_OF_KNOWLEDGE: @@ -2689,7 +2689,7 @@ void CGVisitableOPH::onNAHeroVisit(int heroID, bool alreadyVisited) const iw.player = cb->getOwner(heroID); iw.text.addTxt(MetaString::ADVOB_TXT,148); cb->showInfoDialog(&iw); - cb->changePrimSkill(heroID, PrimarySkill::EXPERIENCE, val); + cb->changePrimSkill(h, PrimarySkill::EXPERIENCE, val); break; } else @@ -2736,10 +2736,10 @@ void CGVisitableOPH::onNAHeroVisit(int heroID, bool alreadyVisited) const else { cb->setObjProperty(id, ObjProperty::VISITORS, heroID); //add to the visitors - cb->changePrimSkill(heroID,PrimarySkill::ATTACK,2); - cb->changePrimSkill(heroID,PrimarySkill::DEFENSE,2); - cb->changePrimSkill(heroID,PrimarySkill::KNOWLEDGE,2); - cb->changePrimSkill(heroID,PrimarySkill::SPELL_POWER,2); + cb->changePrimSkill(h,PrimarySkill::ATTACK,2); + cb->changePrimSkill(h,PrimarySkill::DEFENSE,2); + cb->changePrimSkill(h,PrimarySkill::KNOWLEDGE,2); + cb->changePrimSkill(h,PrimarySkill::SPELL_POWER,2); } showInfoDialog(h,txt_id,sound); break; @@ -2826,7 +2826,7 @@ const std::string & CGVisitableOPH::getHoverText() const void CGVisitableOPH::arenaSelected( int heroID, int primSkill ) const { cb->setObjProperty(id, ObjProperty::VISITORS, heroID); //add to the visitors - cb->changePrimSkill(heroID, static_cast(primSkill-1), 2); + cb->changePrimSkill(cb->getHero(heroID), static_cast(primSkill-1), 2); } void CGVisitableOPH::setPropertyDer( ui8 what, ui32 val ) @@ -2843,7 +2843,7 @@ void CGVisitableOPH::schoolSelected(int heroID, ui32 which) const int base = (ID == Obj::SCHOOL_OF_MAGIC ? 2 : 0); cb->setObjProperty(id, ObjProperty::VISITORS, heroID); //add to the visitors cb->giveResource(cb->getOwner(heroID),Res::GOLD,-1000); //take 1000 gold - cb->changePrimSkill(heroID, static_cast(base + which-1), +1); //give appropriate skill + cb->changePrimSkill(cb->getHero(heroID), static_cast(base + which-1), +1); //give appropriate skill } COPWBonus::COPWBonus (int index, CGTownInstance *TOWN) @@ -2963,7 +2963,7 @@ void CTownBonus::onHeroVisit (const CGHeroInstance * h) const iw.player = cb->getOwner(heroID); iw.text << VLC->generaltexth->allTexts[mid]; cb->showInfoDialog(&iw); - cb->changePrimSkill (heroID, what, val); + cb->changePrimSkill (cb->getHero(heroID), what, val); if (town->visitingHero == h) cb->setObjProperty (town->id, 11, id); //add to visitors else @@ -3048,7 +3048,7 @@ void CGCreature::endBattle( BattleResult *result ) const { if(result->winner==0) { - cb->removeObject(id); + cb->removeObject(this); } else { @@ -3239,7 +3239,7 @@ void CGCreature::fleeDecision(const CGHeroInstance *h, ui32 pursue) const } else { - cb->removeObject(id); + cb->removeObject(this); } } @@ -3450,7 +3450,7 @@ void CGMine::endBattle(BattleResult *result, TPlayerColor attackingPlayer) const void CGMine::flagMine(TPlayerColor player) const { assert(tempOwner != player); - cb->setOwner(id,player); //not ours? flag it! + cb->setOwner(this, player); //not ours? flag it! MetaString ms; ms << std::pair(9,subID) << "\n(" << std::pair(6,23+player) << ")"; @@ -3543,7 +3543,7 @@ void CGResource::collectRes( int player ) const sii.text.addTxt(MetaString::ADVOB_TXT,113); sii.text.addReplacement(MetaString::RES_NAMES, subID); cb->showCompInfo(&sii); - cb->removeObject(id); + cb->removeObject(this); } void CGResource::fightForRes(ui32 agreed, const CGHeroInstance *h) const @@ -3877,7 +3877,7 @@ void CGArtifact::onHeroVisit( const CGHeroInstance * h ) const void CGArtifact::pick(const CGHeroInstance * h) const { cb->giveHeroArtifact(h, storedArtifact, ArtifactPosition::FIRST_AVAILABLE); - cb->removeObject(id); + cb->removeObject(this); } void CGArtifact::fightForArt( ui32 agreed, const CGHeroInstance *h ) const @@ -4086,7 +4086,7 @@ void CGPickable::onHeroVisit( const CGHeroInstance * h ) const } } } - cb->removeObject(id); + cb->removeObject(this); } void CGPickable::chosen( int which, int heroID ) const @@ -4098,12 +4098,12 @@ void CGPickable::chosen( int which, int heroID ) const cb->giveResource(cb->getOwner(heroID), Res::GOLD, val1); break; case 2: //player pick exp - cb->changePrimSkill(heroID, PrimarySkill::EXPERIENCE, h->calculateXp(val2)); + cb->changePrimSkill(cb->getHero(heroID), PrimarySkill::EXPERIENCE, h->calculateXp(val2)); break; default: throw std::runtime_error("Unhandled treasure choice"); } - cb->removeObject(id); + cb->removeObject(this); } bool CQuest::checkQuest (const CGHeroInstance * h) const @@ -4704,7 +4704,7 @@ void CGSeerHut::completeQuest (const CGHeroInstance * h) const //reward case EXPERIENCE: { TExpType expVal = h->calculateXp(rVal); - cb->changePrimSkill(h->id, PrimarySkill::EXPERIENCE, expVal, false); + cb->changePrimSkill(h, PrimarySkill::EXPERIENCE, expVal, false); break; } case MANA_POINTS: @@ -4726,7 +4726,7 @@ void CGSeerHut::completeQuest (const CGHeroInstance * h) const //reward cb->giveResource(h->getOwner(), static_cast(rID), rVal); break; case PRIMARY_SKILL: - cb->changePrimSkill(h->id, static_cast(rID), rVal, false); + cb->changePrimSkill(h, static_cast(rID), rVal, false); break; case SECONDARY_SKILL: cb->changeSecSkill(h->id, static_cast(rID), rVal, false); @@ -4738,7 +4738,7 @@ void CGSeerHut::completeQuest (const CGHeroInstance * h) const //reward { std::set spell; spell.insert (rID); - cb->changeSpells(h->id, true, spell); + cb->changeSpells(h, true, spell); } break; case CREATURE: @@ -4790,7 +4790,7 @@ void CGQuestGuard::initObj() } void CGQuestGuard::completeQuest(const CGHeroInstance *h) const { - cb->removeObject(id); + cb->removeObject(this); } void CGWitchHut::initObj() { @@ -5135,7 +5135,7 @@ void CGPandoraBox::open( const CGHeroInstance * h, ui32 accept ) const && gainedExp == 0 && manaDiff == 0 && moraleDiff == 0 && luckDiff == 0) //if it gives nothing without battle { showInfoDialog(h,15,0); - cb->removeObject(id); + cb->removeObject(this); } else //if it gives something without battle { @@ -5188,11 +5188,11 @@ void CGPandoraBox::giveContents( const CGHeroInstance *h, bool afterBattle ) con //give exp if(expVal) - cb->changePrimSkill(h->id, PrimarySkill::EXPERIENCE, expVal, false); + cb->changePrimSkill(h, PrimarySkill::EXPERIENCE, expVal, false); //give prim skills for(int i=0; ichangePrimSkill(h->id,static_cast(i),primskills[i],false); + cb->changePrimSkill(h,static_cast(i),primskills[i],false); //give sec skills for(int i=0; ichangeSpells(h->id,true,spellsToGive); + cb->changeSpells(h,true,spellsToGive); cb->showInfoDialog(&iw); } } @@ -5349,7 +5349,7 @@ void CGPandoraBox::giveContents( const CGHeroInstance *h, bool afterBattle ) con cb->showInfoDialog(&iw); } if (!creatures.Slots().size()) - cb->removeObject(id); //only when we don't need to display garrison window + cb->removeObject(this); //only when we don't need to display garrison window } void CGPandoraBox::getText( InfoWindow &iw, bool &afterBattle, int text, const CGHeroInstance * h ) const @@ -5477,7 +5477,7 @@ void CGShrine::onHeroVisit( const CGHeroInstance * h ) const { std::set spells; spells.insert(spell); - cb->changeSpells(h->id, true, spells); + cb->changeSpells(h, true, spells); iw.components.push_back(Component(Component::SPELL,spell,0,0)); } @@ -5538,7 +5538,7 @@ void CGSignBottle::onHeroVisit( const CGHeroInstance * h ) const cb->showInfoDialog(&iw); if(ID == Obj::OCEAN_BOTTLE) - cb->removeObject(id); + cb->removeObject(this); } //TODO: remove @@ -5573,7 +5573,7 @@ void CGScholar::onHeroVisit( const CGHeroInstance * h ) const switch (type) { case PRIM_SKILL: - cb->changePrimSkill(h->id,static_cast(bid),+1); + cb->changePrimSkill(h,static_cast(bid),+1); iw.components.push_back(Component(Component::PRIM_SKILL,bid,+1,0)); break; case SECONDARY_SKILL: @@ -5584,7 +5584,7 @@ void CGScholar::onHeroVisit( const CGHeroInstance * h ) const { std::set hlp; hlp.insert(bid); - cb->changeSpells(h->id,true,hlp); + cb->changeSpells(h,true,hlp); iw.components.push_back(Component(Component::SPELL,bid,0,0)); } break; @@ -5594,7 +5594,7 @@ void CGScholar::onHeroVisit( const CGHeroInstance * h ) const } cb->showInfoDialog(&iw); - cb->removeObject(id); + cb->removeObject(this); } void CGScholar::initObj() @@ -5632,7 +5632,7 @@ void CGGarrison::onHeroVisit (const CGHeroInstance *h) const //New owner. if (!ally) - cb->setOwner(id, h->tempOwner); + cb->setOwner(this, h->tempOwner); cb->showGarrisonDialog(id, h->id, removableUnits, 0); } @@ -6271,7 +6271,7 @@ void CGPyramid::endBattle (const CGHeroInstance *h, const BattleResult *result) { std::set spells; spells.insert (spell); - cb->changeSpells (h->id, true, spells); + cb->changeSpells (h, true, spells); iw.components.push_back(Component (Component::SPELL, spell, 0, 0)); } cb->showInfoDialog(&iw); @@ -6372,7 +6372,7 @@ void CGBorderGuard::onHeroVisit( const CGHeroInstance * h ) const void CGBorderGuard::openGate(const CGHeroInstance *h, ui32 accept) const { if (accept) - cb->removeObject(id); + cb->removeObject(this); } void CGBorderGate::onHeroVisit( const CGHeroInstance * h ) const //TODO: passability @@ -6480,7 +6480,7 @@ void CGSirens::onHeroVisit( const CGHeroInstance * h ) const xp = h->calculateXp(xp); iw.text.addTxt(MetaString::ADVOB_TXT,132); iw.text.addReplacement(xp); - cb->changePrimSkill(h->id, PrimarySkill::EXPERIENCE, xp, false); + cb->changePrimSkill(h, PrimarySkill::EXPERIENCE, xp, false); } else { @@ -6622,7 +6622,7 @@ void CGShipyard::getOutOffsets( std::vector &offsets ) const void CGShipyard::onHeroVisit( const CGHeroInstance * h ) const { if(!cb->gameState()->getPlayerRelations(tempOwner, h->tempOwner)) - cb->setOwner(id, h->tempOwner); + cb->setOwner(this, h->tempOwner); auto s = state(); if(s != IBoatGenerator::GOOD) @@ -6763,7 +6763,7 @@ void CGLighthouse::onHeroVisit( const CGHeroInstance * h ) const if(h->tempOwner != tempOwner) { ui8 oldOwner = tempOwner; - cb->setOwner(id,h->tempOwner); //not ours? flag it! + cb->setOwner(this,h->tempOwner); //not ours? flag it! showInfoDialog(h,69,soundBase::LIGHTHOUSE); giveBonusTo(h->tempOwner); diff --git a/lib/CTownHandler.cpp b/lib/CTownHandler.cpp index 023f6a4b0..2459a4f3a 100644 --- a/lib/CTownHandler.cpp +++ b/lib/CTownHandler.cpp @@ -421,6 +421,8 @@ void CTownHandler::loadTown(CTown &town, const JsonNode & source) town.warMachine = CArtHandler::creatureToMachineID(static_cast(creature)); }); + town.moatDamage = source["moatDamage"].Float(); + town.mageLevel = source["mageGuild"].Float(); town.names = source["names"].convertTo >(); diff --git a/lib/CTownHandler.h b/lib/CTownHandler.h index 33071d02e..972b9652c 100644 --- a/lib/CTownHandler.h +++ b/lib/CTownHandler.h @@ -102,6 +102,7 @@ public: ui32 mageLevel; //max available mage guild level ui16 primaryRes; ArtifactID::ArtifactID warMachine; + si32 moatDamage; // Client-only data. Should be moved away from lib struct ClientInfo @@ -150,7 +151,7 @@ public: template void serialize(Handler &h, const int version) { h & names & typeID & creatures & dwellings & dwellingNames & buildings & hordeLvl & mageLevel - & primaryRes & warMachine & clientInfo; + & primaryRes & warMachine & clientInfo & moatDamage; } }; diff --git a/lib/IGameCallback.h b/lib/IGameCallback.h index 02dac04e6..c16e7bd6a 100644 --- a/lib/IGameCallback.h +++ b/lib/IGameCallback.h @@ -203,18 +203,18 @@ public: class DLL_LINKAGE IGameEventCallback : public IGameEventRealizer { public: - virtual void changeSpells(int hid, bool give, const std::set &spells)=0; - virtual bool removeObject(int objid)=0; + 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 setOwner(int objid, TPlayerColor owner)=0; + virtual void setOwner(const CGObjectInstance * objid, TPlayerColor owner)=0; virtual void setHoverName(int objid, MetaString * name)=0; - virtual void changePrimSkill(int ID, PrimarySkill::PrimarySkill which, si64 val, bool abs=false)=0; + virtual void changePrimSkill(const CGHeroInstance * hero, PrimarySkill::PrimarySkill which, si64 val, bool abs=false)=0; virtual void changeSecSkill(int ID, SecondarySkill::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(int player, int requestingObjId) =0; - virtual void giveResource(int player, Res::ERes which, int val)=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; @@ -234,8 +234,8 @@ public: virtual bool moveArtifact(const ArtifactLocation &al1, const ArtifactLocation &al2) = 0; virtual void showCompInfo(ShowInInfobox * comp)=0; - virtual void heroVisitCastle(int obj, int heroID)=0; - virtual void stopHeroVisitCastle(int obj, int heroID)=0; + virtual void heroVisitCastle(const CGTownInstance * obj, const CGHeroInstance * hero)=0; + virtual void stopHeroVisitCastle(const CGTownInstance * obj, const CGHeroInstance * hero)=0; 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 @@ -244,7 +244,7 @@ public: 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, int player)=0; + virtual void giveHero(int id, TPlayerColor player)=0; virtual void changeObjPos(int 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 diff --git a/server/CGameHandler.cpp b/server/CGameHandler.cpp index 5613cd2df..74835c9b4 100644 --- a/server/CGameHandler.cpp +++ b/server/CGameHandler.cpp @@ -460,10 +460,10 @@ void CGameHandler::levelUpCommander(const CCommanderInstance * c) } } -void CGameHandler::changePrimSkill(int ID, PrimarySkill::PrimarySkill which, si64 val, bool abs) +void CGameHandler::changePrimSkill(const CGHeroInstance * hero, PrimarySkill::PrimarySkill which, si64 val, bool abs) { SetPrimSkill sps; - sps.id = ID; + sps.id = hero->id; sps.which = which; sps.abs = abs; sps.val = val; @@ -472,16 +472,15 @@ void CGameHandler::changePrimSkill(int ID, PrimarySkill::PrimarySkill which, si6 //only for exp - hero may level up if (which == PrimarySkill::EXPERIENCE) { - levelUpHero(ID); - CGHeroInstance *h = static_cast(gs->map->objects[ID].get()); - if (h->commander && h->commander->alive) + levelUpHero(hero->id); + if (hero->commander && hero->commander->alive) { SetCommanderProperty scp; - scp.heroid = h->id; + scp.heroid = hero->id; scp.which = SetCommanderProperty::EXPERIENCE; scp.amount = val; sendAndApply (&scp); - levelUpCommander (h->commander); + levelUpCommander (hero->commander); CBonusSystemNode::treeHasChanged(); } } @@ -717,9 +716,9 @@ void CGameHandler::endBattle(int3 tile, const CGHeroInstance *hero1, const CGHer //give exp if (battleResult.data->exp[0] && hero1) - changePrimSkill(hero1->id, PrimarySkill::EXPERIENCE, battleResult.data->exp[0]); + changePrimSkill(hero1, PrimarySkill::EXPERIENCE, battleResult.data->exp[0]); else if (battleResult.data->exp[1] && hero2) - changePrimSkill(hero2->id, PrimarySkill::EXPERIENCE, battleResult.data->exp[1]); + changePrimSkill(hero2, PrimarySkill::EXPERIENCE, battleResult.data->exp[1]); else afterBattleCallback(); } @@ -799,7 +798,7 @@ void CGameHandler::prepareAttack(BattleAttack &bat, const CStack *att, const CSt bat.flags |= BattleAttack::DEATH_BLOW; } - if(att->getCreature()->idNumber == 146) + if(att->getCreature()->idNumber == CreatureID::BALLISTA) { static const int artilleryLvlToChance[] = {0, 50, 75, 100}; const CGHeroInstance * owner = gs->curB->getHero(att->owner); @@ -1177,7 +1176,7 @@ void CGameHandler::newTurn() { if (obj && obj->ID == Obj::PRISON) //give imprisoned hero 0 exp to level him up. easiest to do at this point { - changePrimSkill (obj->id, PrimarySkill::EXPERIENCE, 0); + changePrimSkill (getHero(obj->id), PrimarySkill::EXPERIENCE, 0); } } } @@ -1658,16 +1657,16 @@ void CGameHandler::setBlockVis(int objid, bool bv) sendAndApply(&sop); } -bool CGameHandler::removeObject( int objid ) +bool CGameHandler::removeObject( const CGObjectInstance * obj ) { - if(!getObj(objid)) + if(!obj || !getObj(obj->id)) { tlog1 << "Something wrong, that object already has been removed or hasn't existed!\n"; return false; } RemoveObject ro; - ro.id = objid; + ro.id = obj->id; sendAndApply(&ro); winLoseHandle(255); //eg if monster escaped (removing objs after battle is done dircetly by endBattle, not this function) @@ -1680,11 +1679,11 @@ void CGameHandler::setAmount(int objid, ui32 val) sendAndApply(&sop); } -bool CGameHandler::moveHero( si32 hid, int3 dst, ui8 instant, ui8 asker /*= 255*/ ) +bool CGameHandler::moveHero( si32 hid, int3 dst, ui8 instant, TPlayerColor asker /*= 255*/ ) { const CGHeroInstance *h = getHero(hid); - if(!h || (asker != 255 && (instant || h->getOwner() != gs->currentPlayer)) //not turn of that hero or player can't simply teleport hero (at least not with this function) + if(!h || (asker != GameConstants::NEUTRAL_PLAYER && (instant || h->getOwner() != gs->currentPlayer)) //not turn of that hero or player can't simply teleport hero (at least not with this function) ) { tlog1 << "Illegal call to move hero!\n"; @@ -1839,7 +1838,7 @@ bool CGameHandler::moveHero( si32 hid, int3 dst, ui8 instant, ui8 asker /*= 255* } } -bool CGameHandler::teleportHero(si32 hid, si32 dstid, ui8 source, ui8 asker/* = 255*/) +bool CGameHandler::teleportHero(si32 hid, si32 dstid, ui8 source, TPlayerColor asker/* = 255*/) { const CGHeroInstance *h = getHero(hid); const CGTownInstance *t = getTown(dstid); @@ -1861,16 +1860,16 @@ bool CGameHandler::teleportHero(si32 hid, si32 dstid, ui8 source, ui8 asker/* = return true; } -void CGameHandler::setOwner(int objid, ui8 owner) +void CGameHandler::setOwner(const CGObjectInstance * obj, TPlayerColor owner) { - ui8 oldOwner = getOwner(objid); - SetObjectProperty sop(objid,1,owner); + ui8 oldOwner = getOwner(obj->id); + SetObjectProperty sop(obj->id,1,owner); sendAndApply(&sop); winLoseHandle(1<(obj)) //town captured { - const CGTownInstance * town = getTown(objid); + const CGTownInstance * town = dynamic_cast(obj); if (town->hasBuilt(EBuilding::PORTAL_OF_SUMMON, ETownType::DUNGEON)) setPortalDwelling(town, true, false); @@ -1883,7 +1882,6 @@ void CGameHandler::setOwner(int objid, ui8 owner) } } - const CGObjectInstance * obj = getObj(objid); const PlayerState * p = gs->getPlayer(owner); if((obj->ID == Obj::CREATURE_GENERATOR1 || obj->ID == Obj::CREATURE_GENERATOR4 ) && p && p->dwellings.size()==1)//first dwelling captured @@ -1923,7 +1921,7 @@ ui32 CGameHandler::showBlockingDialog( BlockingDialog *iw ) return 0; } -void CGameHandler::giveResource(int player, Res::ERes which, int val) //TODO: cap according to Bersy's suggestion +void CGameHandler::giveResource(TPlayerColor player, Res::ERes which, int val) //TODO: cap according to Bersy's suggestion { if(!val) return; //don't waste time on empty call SetResource sr; @@ -1937,7 +1935,7 @@ void CGameHandler::giveCreatures(const CArmedInstance *obj, const CGHeroInstance { boost::function removeOrNot = 0; if(remove) - removeOrNot = boost::bind(&CGameHandler::removeObject, this, obj->id); + removeOrNot = boost::bind(&CGameHandler::removeObject, this, obj); COMPLAIN_RET_IF(!creatures.stacksCount(), "Strange, giveCreatures called without args!"); COMPLAIN_RET_IF(obj->stacksCount(), "Cannot give creatures from not-cleared object!"); @@ -1990,19 +1988,18 @@ void CGameHandler::showCompInfo(ShowInInfobox * comp) { sendToAllClients(comp); } -void CGameHandler::heroVisitCastle(int obj, int heroID) +void CGameHandler::heroVisitCastle(const CGTownInstance * obj, const CGHeroInstance * hero) { HeroVisitCastle vc; - vc.hid = heroID; - vc.tid = obj; + vc.hid = hero->id; + vc.tid = obj->id; vc.flags |= 1; sendAndApply(&vc); - const CGHeroInstance *h = getHero(heroID); - vistiCastleObjects (getTown(obj), h); - giveSpells (getTown(obj), getHero(heroID)); + vistiCastleObjects (obj, hero); + giveSpells (obj, hero); if(gs->map->victoryCondition.condition == EVictoryConditionType::TRANSPORTITEM) - checkLossVictory(h->tempOwner); //transported artifact? + checkLossVictory(hero->tempOwner); //transported artifact? } void CGameHandler::vistiCastleObjects (const CGTownInstance *t, const CGHeroInstance *h) @@ -2012,11 +2009,11 @@ void CGameHandler::vistiCastleObjects (const CGTownInstance *t, const CGHeroInst (*i)->onHeroVisit (h); } -void CGameHandler::stopHeroVisitCastle(int obj, int heroID) +void CGameHandler::stopHeroVisitCastle(const CGTownInstance * obj, const CGHeroInstance * hero) { HeroVisitCastle vc; - vc.hid = heroID; - vc.tid = obj; + vc.hid = hero->id; + vc.tid = obj->id; sendAndApply(&vc); } @@ -2058,10 +2055,10 @@ void CGameHandler::startBattleI( const CArmedInstance *army1, const CArmedInstan startBattleI(army1, army2, army2->visitablePos(), cb, creatureBank); } -void CGameHandler::changeSpells( int hid, bool give, const std::set &spells ) +void CGameHandler::changeSpells( const CGHeroInstance * hero, bool give, const std::set &spells ) { ChangeSpells cs; - cs.hid = hid; + cs.hid = hero->id; cs.spells = spells; cs.learn = give; sendAndApply(&cs); @@ -2093,7 +2090,7 @@ void CGameHandler::setManaPoints( int hid, int val ) sendAndApply(&sm); } -void CGameHandler::giveHero( int id, int player ) +void CGameHandler::giveHero( int id, TPlayerColor player ) { GiveHero gh; gh.id = id; @@ -2215,7 +2212,7 @@ void CGameHandler::heroExchange(si32 hero1, si32 hero2) } } -void CGameHandler::prepareNewQuery(Query * queryPack, ui8 player, const boost::function &callback) +void CGameHandler::prepareNewQuery(Query * queryPack, TPlayerColor player, const boost::function &callback) { boost::unique_lock lock(gsm); tlog4 << "Creating a query for player " << (int)player << " with ID=" << QID << std::endl; @@ -2225,14 +2222,14 @@ void CGameHandler::prepareNewQuery(Query * queryPack, ui8 player, const boost::f QID++; } -void CGameHandler::applyAndAsk( Query * sel, ui8 player, boost::function &callback ) +void CGameHandler::applyAndAsk( Query * sel, TPlayerColor player, boost::function &callback ) { boost::unique_lock lock(gsm); prepareNewQuery(sel, player, callback); sendAndApply(sel); } -void CGameHandler::ask( Query * sel, ui8 player, const CFunctionList &callback ) +void CGameHandler::ask( Query * sel, TPlayerColor player, const CFunctionList &callback ) { boost::unique_lock lock(gsm); prepareNewQuery(sel, player, callback); @@ -2347,7 +2344,7 @@ void CGameHandler::close() //exit(0); } -bool CGameHandler::arrangeStacks( si32 id1, si32 id2, ui8 what, ui8 p1, ui8 p2, si32 val, ui8 player ) +bool CGameHandler::arrangeStacks( si32 id1, si32 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()); @@ -3075,7 +3072,7 @@ bool CGameHandler::buySecSkill( const IMarket *m, const CGHeroInstance *h, Secon return true; } -bool CGameHandler::tradeResources(const IMarket *market, ui32 val, ui8 player, ui32 id1, ui32 id2) +bool CGameHandler::tradeResources(const IMarket *market, ui32 val, TPlayerColor player, ui32 id1, ui32 id2) { int r1 = gs->getPlayer(player)->resources[id1], r2 = gs->getPlayer(player)->resources[id2]; @@ -3196,7 +3193,7 @@ bool CGameHandler::setFormation( si32 hid, ui8 formation ) return true; } -bool CGameHandler::hireHero(const CGObjectInstance *obj, ui8 hid, ui8 player) +bool CGameHandler::hireHero(const CGObjectInstance *obj, ui8 hid, TPlayerColor player) { const PlayerState *p = gs->getPlayer(player); const CGTownInstance *t = gs->getTown(obj->id); @@ -3270,7 +3267,7 @@ bool CGameHandler::hireHero(const CGObjectInstance *obj, ui8 hid, ui8 player) return true; } -bool CGameHandler::queryReply(ui32 qid, ui32 answer, ui8 player) +bool CGameHandler::queryReply(ui32 qid, ui32 answer, TPlayerColor player) { boost::unique_lock lock(gsm); states.removeQuery(player, qid); @@ -3517,7 +3514,7 @@ bool CGameHandler::makeBattleAction( BattleAction &ba ) } //ballista & artillery handling - if(destStack->alive() && stack->getCreature()->idNumber == 146) + if(destStack->alive() && stack->getCreature()->idNumber == CreatureID::BALLISTA) { BattleAttack bat2; bat2.flags |= BattleAttack::SHOT; @@ -3888,7 +3885,7 @@ void CGameHandler::playerMessage( TPlayerColor player, const std::string &messag else if(message == "vcmiglorfindel") //selected hero gains a new level { CGHeroInstance *hero = gs->getHero(gs->getPlayer(player)->currentSelection); - changePrimSkill(hero->id, PrimarySkill::EXPERIENCE, VLC->heroh->reqExp(hero->level+1) - VLC->heroh->reqExp(hero->level)); + changePrimSkill(hero, PrimarySkill::EXPERIENCE, VLC->heroh->reqExp(hero->level+1) - VLC->heroh->reqExp(hero->level)); } else if(message == "vcmisilmaril") //player wins { @@ -4542,7 +4539,7 @@ void CGameHandler::stackTurnTrigger(const CStack * st) if(st->hasBonusOfType(Bonus::POISON)) { - const Bonus * b = st->getBonusLocalFirst(Selector::source(Bonus::SPELL_EFFECT, 71) && Selector::type(Bonus::STACK_HEALTH)); + const Bonus * b = st->getBonusLocalFirst(Selector::source(Bonus::SPELL_EFFECT, Spells::POISON) && Selector::type(Bonus::STACK_HEALTH)); if (b) //TODO: what if not?... { bte.val = std::max (b->val - 10, -(st->valOfBonuses(Bonus::POISON))); @@ -4833,7 +4830,7 @@ bool CGameHandler::complain( const std::string &problem ) return true; } -ui32 CGameHandler::getQueryResult( ui8 player, int queryID ) +ui32 CGameHandler::getQueryResult( TPlayerColor player, int queryID ) { //TODO: write return 0; @@ -5059,12 +5056,12 @@ void CGameHandler::checkLossVictory( TPlayerColor player ) { auto hlp = p->heroes; for (auto i = hlp.cbegin(); i != hlp.cend(); i++) //eliminate heroes - removeObject((*i)->id); + removeObject(*i); for (auto i = gs->map->objects.cbegin(); i != gs->map->objects.cend(); i++) //unflag objs { if(*i && (*i)->tempOwner == player) - setOwner((**i).id,GameConstants::NEUTRAL_PLAYER); + setOwner(*i,GameConstants::NEUTRAL_PLAYER); } //eliminating one player may cause victory of another: @@ -5629,7 +5626,7 @@ bool CGameHandler::sacrificeCreatures(const IMarket *market, const CGHeroInstanc int dump, exp; market->getOffer(crid, 0, dump, exp, EMarketMode::CREATURE_EXP); exp *= count; - changePrimSkill(hero->id, PrimarySkill::EXPERIENCE, hero->calculateXp(exp)); + changePrimSkill(hero, PrimarySkill::EXPERIENCE, hero->calculateXp(exp)); return true; } @@ -5647,7 +5644,7 @@ bool CGameHandler::sacrificeArtifact(const IMarket * m, const CGHeroInstance * h m->getOffer(hero->getArtTypeId(slot), 0, dmp, expToGive, EMarketMode::ARTIFACT_EXP); removeArtifact(al); - changePrimSkill(hero->id, PrimarySkill::EXPERIENCE, expToGive); + changePrimSkill(hero, PrimarySkill::EXPERIENCE, expToGive); return true; } @@ -5759,14 +5756,14 @@ void CGameHandler::tryJoiningArmy(const CArmedInstance *src, const CArmedInstanc } boost::function removeOrNot = 0; if(removeObjWhenFinished) - removeOrNot = boost::bind(&IGameCallback::removeObject,this,src->id); + removeOrNot = boost::bind(&IGameCallback::removeObject,this,src); showGarrisonDialog(src->id, dst->id, true, removeOrNot); //show garrison window and optionally remove ourselves from map when player ends } else //merge { moveArmy(src, dst, allowMerging); if(removeObjWhenFinished) - removeObject(src->id); + removeObject(src); } } @@ -5906,7 +5903,7 @@ void CGameHandler::runBattle() const CGHeroInstance * curOwner = gs->curB->battleGetOwner(next); - if( (next->position < 0 || next->getCreature()->idNumber == 146) //arrow turret or ballista + if( (next->position < 0 || next->getCreature()->idNumber == CreatureID::BALLISTA) //arrow turret or ballista && (!curOwner || curOwner->getSecSkillLevel(SecondarySkill::ARTILLERY) == 0)) //hero has no artillery { BattleAction attack; @@ -5927,7 +5924,7 @@ void CGameHandler::runBattle() continue; } - if(next->getCreature()->idNumber == 145 && (!curOwner || curOwner->getSecSkillLevel(SecondarySkill::BALLISTICS) == 0)) //catapult, hero has no ballistics + if(next->getCreature()->idNumber == CreatureID::CATAPULT && (!curOwner || curOwner->getSecSkillLevel(SecondarySkill::BALLISTICS) == 0)) //catapult, hero has no ballistics { BattleAction attack; static const int wallHexes[] = {50, 183, 182, 130, 62, 29, 12, 95}; @@ -5943,7 +5940,7 @@ void CGameHandler::runBattle() } - if(next->getCreature()->idNumber == 147) //first aid tent + if(next->getCreature()->idNumber == CreatureID::FIRST_AID_TENT) { std::vector< const CStack * > possibleStacks; @@ -6155,7 +6152,7 @@ void CGameHandler::spawnWanderingMonsters(CreatureID::CreatureID creatureID) } } -bool CGameHandler::isBlockedByQueries(const CPack *pack, int packType, ui8 player) +bool CGameHandler::isBlockedByQueries(const CPack *pack, int packType, TPlayerColor player) { //it's always legal to send query reply (we'll check later if it makes sense) if(packType == typeList.getTypeID()) diff --git a/server/CGameHandler.h b/server/CGameHandler.h index 1004c14e4..f761a876f 100644 --- a/server/CGameHandler.h +++ b/server/CGameHandler.h @@ -100,7 +100,7 @@ public: std::map > callbacks; //query id => callback function - for selection and yes/no dialogs std::map > allowedExchanges; - bool isBlockedByQueries(const CPack *pack, int packType, ui8 player); + bool isBlockedByQueries(const CPack *pack, int packType, TPlayerColor player); bool isAllowedExchange(int id1, int id2); bool isAllowedArrangePack(const ArrangeStacks *pack); void giveSpells(const CGTownInstance *t, const CGHeroInstance *h); @@ -129,19 +129,19 @@ public: ////////////////////////////////////////////////////////////////////////// //from IGameCallback //do sth - void changeSpells(int hid, bool give, const std::set &spells) OVERRIDE; - bool removeObject(int objid) OVERRIDE; + 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 setOwner(int objid, ui8 owner) OVERRIDE; + void setOwner(const CGObjectInstance * obj, TPlayerColor owner) OVERRIDE; void setHoverName(int objid, MetaString * name) OVERRIDE; - void changePrimSkill(int ID, PrimarySkill::PrimarySkill which, si64 val, bool abs=false) OVERRIDE; + void changePrimSkill(const CGHeroInstance * hero, PrimarySkill::PrimarySkill which, si64 val, bool abs=false) OVERRIDE; void changeSecSkill(int ID, SecondarySkill::SecondarySkill which, int val, bool abs=false) OVERRIDE; //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(int player, int requestingObjId) OVERRIDE; - void giveResource(int player, Res::ERes which, int val) 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; @@ -161,18 +161,18 @@ public: bool moveArtifact(const ArtifactLocation &al1, const ArtifactLocation &al2) OVERRIDE; void showCompInfo(ShowInInfobox * comp) OVERRIDE; - void heroVisitCastle(int obj, int heroID) OVERRIDE; - void stopHeroVisitCastle(int obj, int heroID) OVERRIDE; + void heroVisitCastle(const CGTownInstance * obj, const CGHeroInstance * hero) OVERRIDE; + void stopHeroVisitCastle(const CGTownInstance * obj, const CGHeroInstance * hero) OVERRIDE; //bool removeArtifact(const CArtifact* art, int hid) OVERRIDE; 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, ui8 asker = 255) OVERRIDE; + bool moveHero(si32 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, int player) OVERRIDE; + void giveHero(int id, TPlayerColor player) OVERRIDE; void changeObjPos(int objid, int3 newPos, ui8 flags) OVERRIDE; void heroExchange(si32 hero1, si32 hero2) OVERRIDE; ////////////////////////////////////////////////////////////////////////// @@ -180,7 +180,7 @@ public: 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, ui8 asker = 255); + bool teleportHero(si32 hid, si32 dstid, ui8 source, TPlayerColor asker = GameConstants::NEUTRAL_PLAYER); void vistiCastleObjects (const CGTownInstance *t, const CGHeroInstance *h); void levelUpHero(int ID, SecondarySkill::SecondarySkill skill);//handle client respond and send one more request if needed void levelUpHero(int ID);//initial call - check if hero have remaining levelups & handle them @@ -204,11 +204,11 @@ public: void stackTurnTrigger(const CStack * stack); void handleDamageFromObstacle(const CObstacleInstance &obstacle, const CStack * curStack); //checks if obstacle is land mine and handles possible consequences void removeObstacle(const CObstacleInstance &obstacle); - bool queryReply( ui32 qid, ui32 answer, ui8 player ); - bool hireHero( const CGObjectInstance *obj, ui8 hid, ui8 player ); + 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 tradeResources(const IMarket *market, ui32 val, ui8 player, ui32 id1, ui32 id2); + 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); @@ -225,7 +225,7 @@ public: bool buildStructure(si32 tid, si32 bid, bool force=false);//force - for events: no cost, no checkings bool razeStructure(si32 tid, si32 bid); bool disbandCreature( si32 id, ui8 pos ); - bool arrangeStacks( si32 id1, si32 id2, ui8 what, ui8 p1, ui8 p2, si32 val, ui8 player); + bool arrangeStacks( si32 id1, si32 id2, ui8 what, ui8 p1, ui8 p2, si32 val, TPlayerColor player); void save(const std::string &fname); void close(); void handleTimeEvents(); @@ -245,9 +245,9 @@ public: ui32 getQueryResult(TPlayerColor player, int queryID); void sendMessageToAll(const std::string &message); void sendMessageTo(CConnection &c, const std::string &message); - void applyAndAsk(Query * sel, ui8 player, boost::function &callback); - void prepareNewQuery(Query * queryPack, ui8 player, const boost::function &callback = 0); //generates unique query id and writes it to the pack; blocks the player till query is answered (then callback is called) - void ask(Query * sel, ui8 player, const CFunctionList &callback); + void applyAndAsk(Query * sel, TPlayerColor player, boost::function &callback); + void prepareNewQuery(Query * queryPack, TPlayerColor player, const boost::function &callback = 0); //generates unique query id and writes it to the pack; blocks the player till query is answered (then callback is called) + void ask(Query * sel, TPlayerColor player, const CFunctionList &callback); void sendToAllClients(CPackForClient * info); void sendAndApply(CPackForClient * info); void applyAndSend(CPackForClient * info); diff --git a/server/NetPacksServer.cpp b/server/NetPacksServer.cpp index d8b16d064..3674fcc63 100644 --- a/server/NetPacksServer.cpp +++ b/server/NetPacksServer.cpp @@ -79,7 +79,7 @@ bool EndTurn::applyGh( CGameHandler *gh ) bool DismissHero::applyGh( CGameHandler *gh ) { ERROR_IF_NOT_OWNS(hid); - return gh->removeObject(hid); + return gh->removeObject(gh->getObj(hid)); } bool MoveHero::applyGh( CGameHandler *gh )