From efedb1a55ae5933760db6848fbe8d5a3ec90280f Mon Sep 17 00:00:00 2001 From: mateuszb Date: Sat, 4 Dec 2010 19:15:20 +0000 Subject: [PATCH] * minor cleanup --- AI/GeniusAI/BattleLogic.cpp | 2 +- AI/GeniusAI/BattleLogic.h | 6 +++--- AI/GeniusAI/CGeniusAI.cpp | 12 ++++++------ AI/GeniusAI/CGeniusAI.h | 4 ++-- CGameInterface.h | 4 ++-- client/CBattleInterface.cpp | 20 +++++++++---------- client/CPlayerInterface.cpp | 5 +---- client/CPlayerInterface.h | 3 +-- lib/BattleAction.h | 4 ++++ lib/NetPacksLib.cpp | 10 ++++++---- server/CGameHandler.cpp | 39 +++++++++++++++++++++++-------------- server/CGameHandler.h | 4 ++++ 12 files changed, 64 insertions(+), 49 deletions(-) diff --git a/AI/GeniusAI/BattleLogic.cpp b/AI/GeniusAI/BattleLogic.cpp index 2b4583ad5..be7c00672 100644 --- a/AI/GeniusAI/BattleLogic.cpp +++ b/AI/GeniusAI/BattleLogic.cpp @@ -41,7 +41,7 @@ ui8 side; //who made this action: false - left, true - right player /** * Implementation of CBattleLogic class. */ -CBattleLogic::CBattleLogic(ICallback *cb, const CCreatureSet *army1, const CCreatureSet *army2, int3 tile, CGHeroInstance *hero1, CGHeroInstance *hero2, bool side) : +CBattleLogic::CBattleLogic(ICallback *cb, const CCreatureSet *army1, const CCreatureSet *army2, int3 tile, const CGHeroInstance *hero1, const CGHeroInstance *hero2, bool side) : m_iCurrentTurn(-2), m_bIsAttacker(!side), m_cb(cb), diff --git a/AI/GeniusAI/BattleLogic.h b/AI/GeniusAI/BattleLogic.h index d9d9b127e..4b4667819 100644 --- a/AI/GeniusAI/BattleLogic.h +++ b/AI/GeniusAI/BattleLogic.h @@ -63,7 +63,7 @@ private: int leftHitPoint_for_min; // scenario }; public: - CBattleLogic(ICallback *cb, const CCreatureSet *army1, const CCreatureSet *army2, int3 tile, CGHeroInstance *hero1, CGHeroInstance *hero2, bool side); + CBattleLogic(ICallback *cb, const CCreatureSet *army1, const CCreatureSet *army2, int3 tile, const CGHeroInstance *hero1, const CGHeroInstance *hero2, bool side); ~CBattleLogic(); void SetCurrentTurn(int turn); @@ -80,8 +80,8 @@ private: const CCreatureSet *m_army1; const CCreatureSet *m_army2; int3 m_tile; - CGHeroInstance *m_hero1; - CGHeroInstance *m_hero2; + const CGHeroInstance *m_hero1; + const CGHeroInstance *m_hero2; bool m_side; // statistics diff --git a/AI/GeniusAI/CGeniusAI.cpp b/AI/GeniusAI/CGeniusAI.cpp index 848f7d85d..ad2e6a172 100644 --- a/AI/GeniusAI/CGeniusAI.cpp +++ b/AI/GeniusAI/CGeniusAI.cpp @@ -1253,7 +1253,7 @@ void CGeniusAI::battleStacksAttacked(std::set& bsa) /** * called by engine when battle starts; side=0 - left, side=1 - right */ -void CGeniusAI::battleStart(const CCreatureSet *army1, const CCreatureSet *army2, int3 tile, CGHeroInstance *hero1, CGHeroInstance *hero2, bool side) +void CGeniusAI::battleStart(const CCreatureSet *army1, const CCreatureSet *army2, int3 tile, const CGHeroInstance *hero1, const CGHeroInstance *hero2, bool side) { // TODO: Battle logic what... assert(!m_battleLogic); @@ -1331,11 +1331,11 @@ void CGeniusAI::battleSpellCast(BattleSpellCast *sc) /** * called when battlefield is prepared, prior the battle beginning */ -void CGeniusAI::battlefieldPrepared(int battlefieldType, - std::vector obstacles) -{ - DbgBox("CGeniusAI::battlefieldPrepared"); -} +// void CGeniusAI::battlefieldPrepared(int battlefieldType, +// std::vector obstacles) +// { +// DbgBox("CGeniusAI::battlefieldPrepared"); +// } /** diff --git a/AI/GeniusAI/CGeniusAI.h b/AI/GeniusAI/CGeniusAI.h index 08bcfbca0..b620e744d 100644 --- a/AI/GeniusAI/CGeniusAI.h +++ b/AI/GeniusAI/CGeniusAI.h @@ -207,8 +207,8 @@ public: virtual void battleNewRound(int round); //called at the beggining of each turn, round=-1 is the tactic phase, round=0 is the first "normal" turn virtual void battleStackMoved(int ID, int dest, int distance, bool end); virtual void battleSpellCast(BattleSpellCast *sc); - virtual void battleStart(const CCreatureSet *army1, const CCreatureSet *army2, int3 tile, CGHeroInstance *hero1, CGHeroInstance *hero2, bool side); //called by engine when battle starts; side=0 - left, side=1 - right - virtual void battlefieldPrepared(int battlefieldType, std::vector obstacles); //called when battlefield is prepared, prior the battle beginning + virtual void battleStart(const CCreatureSet *army1, const CCreatureSet *army2, int3 tile, const CGHeroInstance *hero1, const CGHeroInstance *hero2, bool side); //called by engine when battle starts; side=0 - left, side=1 - right + //virtual void battlefieldPrepared(int battlefieldType, std::vector obstacles); //called when battlefield is prepared, prior the battle beginning // virtual void battleStackMoved(int ID, int dest, bool startMoving, bool endMoving); virtual void battleStackAttacking(int ID, int dest); diff --git a/CGameInterface.h b/CGameInterface.h index 72a105d6c..918c52517 100644 --- a/CGameInterface.h +++ b/CGameInterface.h @@ -120,8 +120,8 @@ public: virtual void battleStackMoved(int ID, int dest, int distance, bool end){}; virtual void battleSpellCast(BattleSpellCast *sc){}; virtual void battleStacksEffectsSet(SetStackEffect & sse){};//called when a specific effect is set to stacks - virtual void battleStart(const CCreatureSet *army1, const CCreatureSet *army2, int3 tile, CGHeroInstance *hero1, CGHeroInstance *hero2, bool side){}; //called by engine when battle starts; side=0 - left, side=1 - right - virtual void battlefieldPrepared(int battlefieldType, std::vector obstacles){}; //called when battlefield is prepared, prior the battle beginning + virtual void battleStart(const CCreatureSet *army1, const CCreatureSet *army2, int3 tile, const CGHeroInstance *hero1, const CGHeroInstance *hero2, bool side){}; //called by engine when battle starts; side=0 - left, side=1 - right + //virtual void battlefieldPrepared(int battlefieldType, std::vector obstacles){}; //called when battlefield is prepared, prior the battle beginning virtual void battleStacksHealedRes(const std::vector > & healedStacks, bool lifeDrain, si32 lifeDrainFrom){}; //called when stacks are healed / resurrected first element of pair - stack id, second - healed hp virtual void battleNewStackAppeared(int stackID){}; //not called at the beginning of a battle or by resurrection; called eg. when elemental is summoned virtual void battleObstaclesRemoved(const std::set & removedObstacles){}; //called when a certain set of obstacles is removed from batlefield; IDs of them are given diff --git a/client/CBattleInterface.cpp b/client/CBattleInterface.cpp index 1b1704554..595e8b147 100644 --- a/client/CBattleInterface.cpp +++ b/client/CBattleInterface.cpp @@ -2819,7 +2819,7 @@ void CBattleInterface::battleStacksEffectsSet(const SetStackEffect & sse) void CBattleInterface::castThisSpell(int spellID) { BattleAction * ba = new BattleAction; - ba->actionType = 1; + ba->actionType = BattleAction::HERO_SPELL; ba->additionalInfo = spellID; //spell number ba->destinationTile = -1; ba->stackNumber = (attackingHeroInstance->tempOwner == curInt->playerID) ? -1 : -2; @@ -3009,7 +3009,7 @@ void CBattleInterface::showAliveStack(int ID, const std::map & stac if(curStack.count > 0 //don't print if stack is not alive && (!curInt->curAction || (curInt->curAction->stackNumber != ID //don't print if stack is currently taking an action - && (curInt->curAction->actionType != 6 || curStack.position != curInt->curAction->additionalInfo) //nor if it's an object of attack + && (curInt->curAction->actionType != BattleAction::WALK_AND_ATTACK || curStack.position != curInt->curAction->additionalInfo) //nor if it's an object of attack && (curInt->curAction->destinationTile != curStack.position) //nor if it's on destination tile for current action ) ) @@ -3227,18 +3227,18 @@ void CBattleInterface::endAction(const BattleAction* action) // { // activate(); // } - if(action->actionType == 1) + if(action->actionType == BattleAction::HERO_SPELL) { if(action->side) defendingHero->setPhase(0); else attackingHero->setPhase(0); } - if(action->actionType == 2 && creAnims[action->stackNumber]->getType() != 2) //walk or walk & attack + if(action->actionType == BattleAction::WALK && creAnims[action->stackNumber]->getType() != 2) //walk or walk & attack { pendingAnims.push_back(std::make_pair(new CBattleMoveEnd(this, action->stackNumber, action->destinationTile), false)); } - if(action->actionType == 9) //catapult + if(action->actionType == BattleAction::CATAPULT) //catapult { } queue->update(); @@ -3280,11 +3280,11 @@ void CBattleInterface::startAction(const BattleAction* action) } else { - assert(action->actionType == 1); //only cast spell is valid action without acting stack number + assert(action->actionType == BattleAction::HERO_SPELL); //only cast spell is valid action without acting stack number } - if(action->actionType == 2 - || (action->actionType == 6 && action->destinationTile != stack->position)) + if(action->actionType == BattleAction::WALK + || (action->actionType == BattleAction::WALK_AND_ATTACK && action->destinationTile != stack->position)) { moveStarted = true; if(creAnims[action->stackNumber]->framesInGroup(20)) @@ -3298,7 +3298,7 @@ void CBattleInterface::startAction(const BattleAction* action) char txt[400]; - if(action->actionType == 1) //when hero casts spell + if(action->actionType == BattleAction::HERO_SPELL) //when hero casts spell { if(action->side) defendingHero->setPhase(4); @@ -3339,7 +3339,7 @@ void CBattleInterface::startAction(const BattleAction* action) } //displaying heal animation - if (action->actionType == 12) + if (action->actionType == BattleAction::STACK_HEAL) { displayEffect(50, action->destinationTile); } diff --git a/client/CPlayerInterface.cpp b/client/CPlayerInterface.cpp index faa026524..2d5e65b0e 100644 --- a/client/CPlayerInterface.cpp +++ b/client/CPlayerInterface.cpp @@ -537,7 +537,7 @@ void CPlayerInterface::buildChanged(const CGTownInstance *town, int buildingID, } } -void CPlayerInterface::battleStart(const CCreatureSet *army1, const CCreatureSet *army2, int3 tile, CGHeroInstance *hero1, CGHeroInstance *hero2, bool side) +void CPlayerInterface::battleStart(const CCreatureSet *army1, const CCreatureSet *army2, int3 tile, const CGHeroInstance *hero1, const CGHeroInstance *hero2, bool side) { if(LOCPLINT != this) { //another local interface should do this @@ -552,9 +552,6 @@ void CPlayerInterface::battleStart(const CCreatureSet *army1, const CCreatureSet GH.pushInt(battleInt); } -void CPlayerInterface::battlefieldPrepared(int battlefieldType, std::vector obstacles) //called when battlefield is prepared, prior the battle beginning -{ -} void CPlayerInterface::battleStacksHealedRes(const std::vector > & healedStacks, bool lifeDrain, si32 lifeDrainFrom) { diff --git a/client/CPlayerInterface.h b/client/CPlayerInterface.h index aedd84481..f3e035040 100644 --- a/client/CPlayerInterface.h +++ b/client/CPlayerInterface.h @@ -212,8 +212,7 @@ public: void battleSpellCast(BattleSpellCast *sc); void battleStacksEffectsSet(SetStackEffect & sse); //called when a specific effect is set to stacks void battleStacksAttacked(std::vector & bsa); - void battleStart(const CCreatureSet *army1, const CCreatureSet *army2, int3 tile, CGHeroInstance *hero1, CGHeroInstance *hero2, bool side); //called by engine when battle starts; side=0 - left, side=1 - right - void battlefieldPrepared(int battlefieldType, std::vector obstacles); //called when battlefield is prepared, prior the battle beginning + void battleStart(const CCreatureSet *army1, const CCreatureSet *army2, int3 tile, const CGHeroInstance *hero1, const CGHeroInstance *hero2, bool side); //called by engine when battle starts; side=0 - left, side=1 - right void battleStacksHealedRes(const std::vector > & healedStacks, bool lifeDrain, si32 lifeDrainFrom); //called when stacks are healed / resurrected void battleNewStackAppeared(int stackID); //not called at the beginning of a battle or by resurrection; called eg. when elemental is summoned void battleObstaclesRemoved(const std::set & removedObstacles); //called when a certain set of obstacles is removed from batlefield; IDs of them are given diff --git a/lib/BattleAction.h b/lib/BattleAction.h index 23f231fa7..5d1d63f6f 100644 --- a/lib/BattleAction.h +++ b/lib/BattleAction.h @@ -15,6 +15,10 @@ struct BattleAction { ui8 side; //who made this action: false - left, true - right player ui32 stackNumber;//stack ID, -1 left hero, -2 right hero, + enum ActionType + { + NO_ACTION = 0, HERO_SPELL, WALK, DEFEND, RETREAT, SURRENDER, WALK_AND_ATTACK, SHOOT, WAIT, CATAPULT, MONSTER_SPELL, BAD_MORALE, STACK_HEAL + }; ui8 actionType; // 0 = No action; 1 = Hero cast a spell 2 = Walk 3 = Defend 4 = Retreat from the battle //5 = Surrender 6 = Walk and Attack 7 = Shoot 8 = Wait 9 = Catapult //10 = Monster casts a spell (i.e. Faerie Dragons) 11 - Bad morale freeze 12 - stacks heals another stack diff --git a/lib/NetPacksLib.cpp b/lib/NetPacksLib.cpp index 7994b06da..ff1d5b85b 100644 --- a/lib/NetPacksLib.cpp +++ b/lib/NetPacksLib.cpp @@ -901,18 +901,20 @@ DLL_EXPORT void StartAction::applyGs( CGameState *gs ) { CStack *st = gs->curB->getStack(ba.stackNumber); - if(ba.actionType != 1) //don't check for stack if it's custom action by hero + if(ba.actionType != BattleAction::HERO_SPELL) //don't check for stack if it's custom action by hero assert(st); switch(ba.actionType) { - case 3: + case BattleAction::DEFEND: st->state.insert(DEFENDING); break; - case 8: + case BattleAction::WAIT: st->state.insert(WAITING); return; - case 0: case 2: case 6: case 7: case 9: case 10: case 11: case 12: + case BattleAction::NO_ACTION: case BattleAction::WALK: case BattleAction::WALK_AND_ATTACK: + case BattleAction::SHOOT: case BattleAction::CATAPULT: case BattleAction::MONSTER_SPELL: + case BattleAction::BAD_MORALE: case BattleAction::STACK_HEAL: st->state.insert(MOVED); break; } diff --git a/server/CGameHandler.cpp b/server/CGameHandler.cpp index 6aa8cee46..12fd7f2d0 100644 --- a/server/CGameHandler.cpp +++ b/server/CGameHandler.cpp @@ -347,16 +347,15 @@ void CGameHandler::startBattle(const CArmedInstance *army1, const CArmedInstance setupBattle(curB, tile, army1, army2, hero1, hero2, creatureBank, town); //initializes stacks, places creatures on battlefield, blocks and informs player interfaces } - NEW_ROUND; //TODO: pre-tactic stuff, call scripts etc. //tactic round { - NEW_ROUND; if( (hero1 && hero1->getSecSkillLevel(19)>0) || ( hero2 && hero2->getSecSkillLevel(19)>0) )//someone has tactics { //TODO: tactic round (round -1) + NEW_ROUND; } } @@ -402,7 +401,7 @@ void CGameHandler::startBattle(const CArmedInstance *army1, const CArmedInstance { //unit loses its turn - empty freeze action BattleAction ba; - ba.actionType = 11; + ba.actionType = BattleAction::BAD_MORALE; ba.additionalInfo = 1; ba.side = !next->attackerOwned; ba.stackNumber = next->ID; @@ -419,7 +418,7 @@ void CGameHandler::startBattle(const CArmedInstance *army1, const CArmedInstance if(attackInfo.first != NULL) { BattleAction attack; - attack.actionType = 6; + attack.actionType = BattleAction::WALK_AND_ATTACK; attack.side = !next->attackerOwned; attack.stackNumber = next->ID; @@ -430,6 +429,10 @@ void CGameHandler::startBattle(const CArmedInstance *army1, const CArmedInstance checkForBattleEnd(stacks); } + else + { + makeStackDoNothing(next); + } continue; } @@ -439,7 +442,7 @@ void CGameHandler::startBattle(const CArmedInstance *army1, const CArmedInstance || (next->type->idNumber == 146 && (!curOwner || curOwner->getSecSkillLevel(20) == 0))) //ballista, hero has no artillery { BattleAction attack; - attack.actionType = 7; + attack.actionType = BattleAction::SHOOT; attack.side = !next->attackerOwned; attack.stackNumber = next->ID; @@ -464,7 +467,7 @@ void CGameHandler::startBattle(const CArmedInstance *army1, const CArmedInstance static const int wallHexes[] = {50, 183, 182, 130, 62, 29, 12, 95}; attack.destinationTile = wallHexes[ rand()%ARRAY_COUNT(wallHexes) ]; - attack.actionType = 9; + attack.actionType = BattleAction::CATAPULT; attack.additionalInfo = 0; attack.side = !next->attackerOwned; attack.stackNumber = next->ID; @@ -490,21 +493,15 @@ void CGameHandler::startBattle(const CArmedInstance *army1, const CArmedInstance if(possibleStacks.size() == 0) { //nothing to heal - BattleAction doNothing; - doNothing.actionType = 0; - doNothing.additionalInfo = 0; - doNothing.destinationTile = -1; - doNothing.side = !next->attackerOwned; - doNothing.stackNumber = next->ID; - sendAndApply(&StartAction(doNothing)); - sendAndApply(&EndAction()); + makeStackDoNothing(next); + continue; } else { //heal random creature const CStack * toBeHealed = possibleStacks[ rand()%possibleStacks.size() ]; - heal.actionType = 12; + heal.actionType = BattleAction::STACK_HEAL; heal.additionalInfo = 0; heal.destinationTile = toBeHealed->position; heal.side = !next->attackerOwned; @@ -5317,3 +5314,15 @@ bool CGameHandler::sacrificeArtifact(const IMarket * m, const CGHeroInstance * h changePrimSkill(hero->id, 4, expToGive); return true; } + +void CGameHandler::makeStackDoNothing(const CStack * next) +{ + BattleAction doNothing; + doNothing.actionType = 0; + doNothing.additionalInfo = 0; + doNothing.destinationTile = -1; + doNothing.side = !next->attackerOwned; + doNothing.stackNumber = next->ID; + sendAndApply(&StartAction(doNothing)); + sendAndApply(&EndAction()); +} diff --git a/server/CGameHandler.h b/server/CGameHandler.h index 771e82ca6..a76a1843b 100644 --- a/server/CGameHandler.h +++ b/server/CGameHandler.h @@ -76,6 +76,8 @@ public: class CGameHandler : public IGameCallback { +private: + void makeStackDoNothing(const CStack * next); public: CVCMIServer *s; std::map connections; //player color -> connection to client with interface of that player @@ -229,3 +231,5 @@ public: }; #endif // __CGAMEHANDLER_H__ + +void makeStackDoNothing(); \ No newline at end of file