From 7214248494633536d84d0baa05421bd4a7ef362c Mon Sep 17 00:00:00 2001 From: "jean.chalard" Date: Thu, 3 Sep 2009 02:16:53 +0000 Subject: [PATCH] J : * Some more tweaking for combat. * This still doesn't work, but it's closer. --- projects/mtg/include/Damage.h | 17 +--- projects/mtg/include/GameObserver.h | 5 +- projects/mtg/include/GuiStatic.h | 4 +- projects/mtg/include/PhaseRing.h | 2 +- projects/mtg/src/AIPlayer.cpp | 22 ++--- projects/mtg/src/CardGui.cpp | 2 +- projects/mtg/src/Damage.cpp | 32 +------ projects/mtg/src/DamagerDamaged.cpp | 1 + projects/mtg/src/DuelLayers.cpp | 4 +- projects/mtg/src/GameObserver.cpp | 92 +++++++----------- projects/mtg/src/GuiAvatars.cpp | 2 - projects/mtg/src/GuiCombat.cpp | 135 +++++++++++++++------------ projects/mtg/src/GuiPlay.cpp | 1 + projects/mtg/src/GuiStatic.cpp | 18 ++-- projects/mtg/src/MTGCardInstance.cpp | 11 +-- 15 files changed, 145 insertions(+), 203 deletions(-) diff --git a/projects/mtg/include/Damage.h b/projects/mtg/include/Damage.h index c87770822..b02cdd1df 100644 --- a/projects/mtg/include/Damage.h +++ b/projects/mtg/include/Damage.h @@ -40,7 +40,7 @@ class Damage: public Interruptible { }; -class DamageStack :public GuiLayer, public Interruptible{ +class DamageStack : public GuiLayer, public Interruptible{ protected: int currentState; GameObserver* game; @@ -49,20 +49,7 @@ class DamageStack :public GuiLayer, public Interruptible{ int resolve(); void Render(); virtual ostream& toString(ostream& out) const; - DamageStack(GameObserver* game); + DamageStack(); }; -class StableDamageStack : public Interruptible { - protected: - vector damage; - - public: - int resolve(); - void Render(); - void Add(Damage*); - virtual ostream& toString(ostream& out) const; -}; - - - #endif diff --git a/projects/mtg/include/GameObserver.h b/projects/mtg/include/GameObserver.h index 0216e529a..70370dffb 100644 --- a/projects/mtg/include/GameObserver.h +++ b/projects/mtg/include/GameObserver.h @@ -31,11 +31,9 @@ class GameObserver{ int nbPlayers; int currentPlayerId; int currentRound; - int blockersAssigned; - public: - int blockersSorted; + CombatStep combatStep; int turn; int forceShuffleLibraries(); int targetListIsSet(MTGCardInstance * card); @@ -57,6 +55,7 @@ class GameObserver{ void cardClick(MTGCardInstance * card,Targetable * _object = NULL ); int enteringPhase(int phase); int getCurrentGamePhase(); + void nextCombatStep(); void userRequestNextGamePhase(); void nextGamePhase(); void cleanupPhase(); diff --git a/projects/mtg/include/GuiStatic.h b/projects/mtg/include/GuiStatic.h index 5c1f5e831..a206482cd 100644 --- a/projects/mtg/include/GuiStatic.h +++ b/projects/mtg/include/GuiStatic.h @@ -7,7 +7,7 @@ #include "CardGui.h" #include "GuiAvatars.h" -class TransientCardView; +class CardView; struct GuiStatic : public PlayGuiObject{ GuiAvatars* parent; @@ -35,7 +35,7 @@ struct GuiAvatar : public GuiStatic{ struct GuiGameZone : public GuiStatic{ static const int Width = 20; static const int Height = 25; - vector cards; + vector cards; public: MTGGameZone * zone; diff --git a/projects/mtg/include/PhaseRing.h b/projects/mtg/include/PhaseRing.h index 6936e7f2e..2169f7d2d 100644 --- a/projects/mtg/include/PhaseRing.h +++ b/projects/mtg/include/PhaseRing.h @@ -10,7 +10,7 @@ using std::list; class Player; -typedef enum { ORDER, FIRST_STRIKE, DAMAGE } CombatStep; +typedef enum { BLOCKERS, ORDER, FIRST_STRIKE, DAMAGE } CombatStep; class Phase{ public: int id; diff --git a/projects/mtg/src/AIPlayer.cpp b/projects/mtg/src/AIPlayer.cpp index b9b35ba0a..c4d4e049b 100644 --- a/projects/mtg/src/AIPlayer.cpp +++ b/projects/mtg/src/AIPlayer.cpp @@ -56,12 +56,9 @@ MTGCardInstance * AIPlayer::chooseCard(TargetChooser * tc, MTGCardInstance * sou int AIPlayer::Act(float dt){ GameObserver * gameObs = GameObserver::GetInstance(); - if (gameObs->currentPlayer == this){ + if (gameObs->currentPlayer == this) gameObs->userRequestNextGamePhase(); - return 1; - }else{ - return 1; - } + return 1; } @@ -498,14 +495,14 @@ int AIPlayer::chooseBlockers(){ } int AIPlayer::orderBlockers(){ - /* + GameObserver * g = GameObserver::GetInstance(); - DamageResolverLayer * drl = g->mLayers->combatLayer(); - if (drl->orderingIsNeeded && g->currentPlayer==this){ - drl->blockersOrderingDone(); //TODO clever rank of blockers - return 1; - } - */ + if (BLOCKERS == g->combatStep && g->currentPlayer==this) + { + g->userRequestNextGamePhase(); //TODO clever rank of blockers + return 1; + } + return 0; } @@ -716,6 +713,7 @@ int AIPlayerBaka::computeActions(){ break; } }else{ + cout << "my turn" << endl; switch(currentGamePhase){ case Constants::MTG_PHASE_COMBATBLOCKERS: chooseBlockers(); diff --git a/projects/mtg/src/CardGui.cpp b/projects/mtg/src/CardGui.cpp index 0b6a6be2c..b0334ffe5 100644 --- a/projects/mtg/src/CardGui.cpp +++ b/projects/mtg/src/CardGui.cpp @@ -76,7 +76,7 @@ void CardGui::Render() mFont->SetScale(DEFAULT_MAIN_FONT_SCALE * 0.5 * actZ); mFont->DrawString(card->getName().c_str(), actX - actZ * Width / 2 + 1, actY - actZ * Height / 2 + 1); if (icon) { icon->SetColor(ARGB(static_cast(actA),255,255,255)); renderer->RenderQuad(icon, actX, actY, 0); } - if (tc && !tc->canTarget(card)) renderer->FillRect(actX - actZ*Width/2, actY - actZ*Height/2, actZ*Width, actZ*Height, ARGB(200,0,0,0)); + if (tc && !tc->canTarget(card)) renderer->FillRect(actX - actZ*Width/2, actY - actZ*Height/2, actZ*Width, actZ*Height, ARGB((static_cast(actA*0.75)),0,0,0)); mFont->SetScale(DEFAULT_MAIN_FONT_SCALE); } diff --git a/projects/mtg/src/Damage.cpp b/projects/mtg/src/Damage.cpp index 54b59f0da..527b8135a 100644 --- a/projects/mtg/src/Damage.cpp +++ b/projects/mtg/src/Damage.cpp @@ -93,7 +93,7 @@ ostream& Damage::toString(ostream& out) const return out; } -DamageStack::DamageStack(GameObserver* game) : game(game){ +DamageStack::DamageStack() { currentState = -1; type = ACTION_DAMAGES; } @@ -130,33 +130,3 @@ ostream& DamageStack::toString(ostream& out) const { return (out << "DamageStack ::: currentState : " << currentState); } - - -int StableDamageStack::resolve() -{ - for (vector::iterator it = damage.begin(); it != damage.end(); ++it) - if ((*it)->state == NOT_RESOLVED) (*it)->resolve(); - for (vector::iterator it = damage.begin(); it != damage.end(); ++it) - if ((*it)->state == RESOLVED_OK) (*it)->target->afterDamage(); - return 1; -} - -void StableDamageStack::Render(){ - int currenty = y; - for (vector::iterator it = damage.begin(); it != damage.end(); ++it) - { - if ((*it)->state == NOT_RESOLVED){ - (*it)->x = x; - (*it)->y = currenty; - currenty += (*it)->mHeight; - (*it)->Render(); - } - } -} - -void StableDamageStack::Add(Damage* d) { damage.push_back(d); } - -ostream& StableDamageStack::toString(ostream& out) const -{ - return (out << "StableDamageStack ::: size : " << damage.size()); -} diff --git a/projects/mtg/src/DamagerDamaged.cpp b/projects/mtg/src/DamagerDamaged.cpp index 2720bf29b..b54494a18 100644 --- a/projects/mtg/src/DamagerDamaged.cpp +++ b/projects/mtg/src/DamagerDamaged.cpp @@ -56,6 +56,7 @@ void DamagerDamaged::Render(CombatStep mode) switch (mode) { + case BLOCKERS : case ORDER : mFont->SetColor(ARGB(92,255,255,255)); break; diff --git a/projects/mtg/src/DuelLayers.cpp b/projects/mtg/src/DuelLayers.cpp index 4f6a4d132..ab32ac53a 100644 --- a/projects/mtg/src/DuelLayers.cpp +++ b/projects/mtg/src/DuelLayers.cpp @@ -112,9 +112,9 @@ void DuelLayers::Render(){ int DuelLayers::receiveEvent(WEvent * e){ -#if 0 +#if 1 #define PRINT_IF(type) { type *foo = dynamic_cast(e); if (foo) cout << "Is a " << #type << endl; } - cout << "Received event " << e << endl; + cout << "Received event " << e << " "; PRINT_IF(WEventZoneChange); PRINT_IF(WEventDamage); PRINT_IF(WEventPhaseChange); diff --git a/projects/mtg/src/GameObserver.cpp b/projects/mtg/src/GameObserver.cpp index 598897ba5..b084d96f5 100644 --- a/projects/mtg/src/GameObserver.cpp +++ b/projects/mtg/src/GameObserver.cpp @@ -51,8 +51,7 @@ GameObserver::GameObserver(Player * _players[], int _nb_players){ gameOver = NULL; phaseRing = NEW PhaseRing(_players,_nb_players); replacementEffects = NEW ReplacementEffects(); - blockersSorted = false; - blockersAssigned = 0; + combatStep = BLOCKERS; } void GameObserver::setGamePhaseManager(MTGGamePhase * _phases){ @@ -79,23 +78,12 @@ void GameObserver::nextPlayer(){ currentPlayerId = (currentPlayerId+1)%nbPlayers; currentPlayer = players[currentPlayerId]; currentActionPlayer = currentPlayer; - blockersSorted = false; - blockersAssigned = 0; - + combatStep = BLOCKERS; } void GameObserver::nextGamePhase(){ Phase * cPhaseOld = phaseRing->getCurrentPhase(); - if (!blockersSorted && cPhaseOld->id == Constants::MTG_PHASE_COMBATBLOCKERS){ - blockersAssigned = 1; - receiveEvent(NEW WEventCombatStepChange(ORDER)); - /* - if (!mLayers->combatLayer()->autoOrderBlockers()){ - OutputDebugString("Player has To choose ordering!"); - return; - } - */ - } - + if (cPhaseOld->id == Constants::MTG_PHASE_COMBATBLOCKERS) + if (DAMAGE != combatStep) { nextCombatStep(); return; } phaseRing->forward(); Phase * cPhase = phaseRing->getCurrentPhase(); currentGamePhase = cPhase->id; @@ -107,6 +95,7 @@ void GameObserver::nextGamePhase(){ cleanupPhase(); currentPlayer->canPutLandsIntoPlay = 1; mLayers->actionLayer()->Update(0); + combatStep = BLOCKERS; return nextGamePhase(); } @@ -148,28 +137,30 @@ int GameObserver::cancelCurrentAction(){ return 1; } +void GameObserver::nextCombatStep() +{ + switch (combatStep) + { + case BLOCKERS : receiveEvent(NEW WEventCombatStepChange(combatStep = ORDER)); return; + case ORDER : receiveEvent(NEW WEventCombatStepChange(combatStep = FIRST_STRIKE)); return; + case FIRST_STRIKE : receiveEvent(NEW WEventCombatStepChange(combatStep = DAMAGE)); return; + case DAMAGE : ; // Nothing : go to next phase + } +} + void GameObserver::userRequestNextGamePhase(){ if (mLayers->stackLayer()->getNext(NULL,0,NOT_RESOLVED)) return; if (getCurrentTargetChooser()) return; // if (mLayers->combatLayer()->isDisplayed()) return; Phase * cPhaseOld = phaseRing->getCurrentPhase(); - if (!blockersSorted && cPhaseOld->id == Constants::MTG_PHASE_COMBATBLOCKERS){ - blockersAssigned = 1; - receiveEvent(NEW WEventCombatStepChange(ORDER)); - /* - if (!mLayers->combatLayer()->autoOrderBlockers()){ - OutputDebugString("Player has To choose ordering!"); - return; - } - */ - } + if (cPhaseOld->id == Constants::MTG_PHASE_COMBATBLOCKERS) + if (DAMAGE != combatStep) { nextCombatStep(); return; } if (cPhaseOld->id == Constants::MTG_PHASE_COMBATBLOCKERS || opponent()->isAI() || - options[GameOptions::phaseInterrupts[currentGamePhase]].number){ + options[GameOptions::phaseInterrupts[currentGamePhase]].number) mLayers->stackLayer()->AddNextGamePhase(); - }else{ + else nextGamePhase(); - } } int GameObserver::forceShuffleLibraries(){ @@ -238,15 +229,15 @@ void GameObserver::addObserver(MTGAbility * observer){ void GameObserver::removeObserver(ActionElement * observer){ - if (observer){ - if (mLayers->actionLayer()->getIndexOf(observer) != -1){ - observer->destroy(); - mLayers->actionLayer()->Remove(observer); + if (observer) + { + if (mLayers->actionLayer()->getIndexOf(observer) != -1){ + observer->destroy(); + mLayers->actionLayer()->Remove(observer); + } } - }else{ - //TODO log error - } - + else + {} //TODO log error } GameObserver::~GameObserver(){ @@ -256,17 +247,10 @@ GameObserver::~GameObserver(){ SAFE_DELETE(phaseRing); SAFE_DELETE(replacementEffects); LOG("==GameObserver Destroyed=="); - } void GameObserver::Update(float dt){ Player * player = currentPlayer; - if (currentGamePhase == Constants::MTG_PHASE_COMBATBLOCKERS && !blockersSorted){ - player = opponent(); - }else if (currentGamePhase == Constants::MTG_PHASE_COMBATDAMAGE){ - // DamageResolverLayer * drl = mLayers->combatLayer(); - // if (drl->currentChoosingPlayer && drl->mCount) player = drl->currentChoosingPlayer; - } currentActionPlayer = player; if (isInterrupting) player = isInterrupting; mLayers->Update(dt,player); @@ -275,13 +259,12 @@ void GameObserver::Update(float dt){ } stateEffects(); oldGamePhase = currentGamePhase; - } //applies damage to creatures after updates //Players life test -void GameObserver::stateEffects(){ - +void GameObserver::stateEffects() +{ if (mLayers->stackLayer()->count(0,NOT_RESOLVED) != 0) return; if (mLayers->actionLayer()->menuObject) return; if (targetChooser || mLayers->actionLayer()->isWaitingForAnswer()) return; @@ -292,23 +275,18 @@ void GameObserver::stateEffects(){ card->afterDamage(); } } - - for (int i =0; i < 2; i++){ + for (int i =0; i < 2; i++) if (players[i]->life <= 0) gameOver = players[i]; - } - } -void GameObserver::Render(){ +void GameObserver::Render() +{ mLayers->Render(); - if (targetChooser || mLayers->actionLayer()->isWaitingForAnswer()){ + if (targetChooser || mLayers->actionLayer()->isWaitingForAnswer()) JRenderer::GetInstance()->DrawRect(0,0,SCREEN_WIDTH,SCREEN_HEIGHT,ARGB(255,255,0,0)); - } - if (waitForExtraPayment){ + if (waitForExtraPayment) waitForExtraPayment->Render(); - } - } diff --git a/projects/mtg/src/GuiAvatars.cpp b/projects/mtg/src/GuiAvatars.cpp index 6daa06472..28806c05e 100644 --- a/projects/mtg/src/GuiAvatars.cpp +++ b/projects/mtg/src/GuiAvatars.cpp @@ -22,8 +22,6 @@ GuiAvatars::GuiAvatars(CardSelector* cs) : cs(cs), active(NULL) GuiAvatars::~GuiAvatars() { - cs->Remove(self); cs->Remove(selfGraveyard); cs->Remove(selfLibrary); - cs->Remove(opponent); cs->Remove(opponentGraveyard); cs->Remove(opponentLibrary); } void GuiAvatars::Activate(PlayGuiObject* c) diff --git a/projects/mtg/src/GuiCombat.cpp b/projects/mtg/src/GuiCombat.cpp index 9aec73ebf..9f8205b98 100644 --- a/projects/mtg/src/GuiCombat.cpp +++ b/projects/mtg/src/GuiCombat.cpp @@ -1,3 +1,4 @@ +#include #include "../include/config.h" #include "../include/GameApp.h" #include "../include/GuiCombat.h" @@ -138,11 +139,14 @@ bool GuiCombat::CheckUserInput(u32 key) cursor_pos = BLK; } else if (OK == cursor_pos) - switch (step) { - case ORDER : go->receiveEvent(NEW WEventCombatStepChange(FIRST_STRIKE)); break; - case FIRST_STRIKE : resolve(); go->receiveEvent(NEW WEventCombatStepChange(DAMAGE)); break; - case DAMAGE : resolve(); cursor_pos = NONE; go->userRequestNextGamePhase(); break; + switch (step) + { + case BLOCKERS : assert(false); break; // that should not happen + case ORDER : go->receiveEvent(NEW WEventCombatStepChange(FIRST_STRIKE)); break; + case FIRST_STRIKE : resolve(); go->receiveEvent(NEW WEventCombatStepChange(DAMAGE)); break; + case DAMAGE : resolve(); cursor_pos = NONE; go->userRequestNextGamePhase(); break; + } } break; case PSP_CTRL_TRIANGLE: @@ -242,16 +246,20 @@ void GuiCombat::Render() void GuiCombat::resolve() { - StableDamageStack stack; + DamageStack* stack = NEW DamageStack(); for (inner_iterator it = attackers.begin(); it != attackers.end(); ++it) { - for (vector::iterator q = (*it)->blockers.begin(); q != (*it)->blockers.end(); ++q) - for (vector::iterator d = (*q)->damages.begin(); d != (*q)->damages.end(); ++d) - stack.Add(&(*d)); + if ((*it)->blockers.empty()) + stack->Add(NEW Damage((*it)->card, go->opponent(), (*it)->card->stepPower(step))); + else + for (vector::iterator q = (*it)->blockers.begin(); q != (*it)->blockers.end(); ++q) + for (vector::iterator d = (*q)->damages.begin(); d != (*q)->damages.end(); ++d) + stack->Add(NEW Damage(*d)); for (vector::iterator d = (*it)->damages.begin(); d != (*it)->damages.end(); ++d) - stack.Add(&(*d)); + stack->Add(NEW Damage(*d)); } - stack.resolve(); + go->mLayers->stackLayer()->Add(stack); + go->mLayers->stackLayer()->resolve(); // This will delete the damage stack which will in turn delete the Damage it contains } int GuiCombat::receiveEventPlus(WEvent* e) @@ -306,7 +314,9 @@ int GuiCombat::receiveEventMinus(WEvent* e) for (inner_iterator it = attackers.begin(); it != attackers.end(); ++it) if ((*it)->card == event->card) { + AttackerDamaged* d = *it; attackers.erase(it); + SAFE_DELETE(d); return 1; } return 1; @@ -326,68 +336,77 @@ int GuiCombat::receiveEventMinus(WEvent* e) } return 0; } + else if (WEventPhaseChange* event = dynamic_cast(e)) + { + step = BLOCKERS; + } else if (WEventCombatStepChange* event = dynamic_cast(e)) switch (event->step) - { - case ORDER: { - if (ORDER == step) return 0; // Why do I take this twice ? >.> - if (!go->currentPlayer->displayStack()) { go->receiveEvent(NEW WEventCombatStepChange(FIRST_STRIKE)); return 1; } - for (inner_iterator it = attackers.begin(); it != attackers.end(); ++it) - { - (*it)->show = (1 < (*it)->blockers.size()); - autoaffectDamage(*it, DAMAGE); - } - active = NULL; - for (inner_iterator it = attackers.begin(); it != attackers.end(); ++it) - if ((*it)->show) + case BLOCKERS: + break; + case ORDER: + { + if (ORDER == step) return 0; // Why do I take this twice ? >.> + if (!go->currentPlayer->displayStack()) { go->nextCombatStep(); return 1; } + for (inner_iterator it = attackers.begin(); it != attackers.end(); ++it) { - (*it)->y = 210; - (*it)->zoom = 2.2; (*it)->t = 0; - if (!active) active = *it; + (*it)->show = (1 < (*it)->blockers.size()); + autoaffectDamage(*it, DAMAGE); } + active = NULL; + for (inner_iterator it = attackers.begin(); it != attackers.end(); ++it) + if ((*it)->show) + { + (*it)->y = 210; + (*it)->zoom = 2.2; (*it)->t = 0; + if (!active) active = *it; + } + repos(attackers.begin(), attackers.end(), 0); + if (active) + { + active->zoom = 2.7; // We know there is at least one, so this cannot be NULL + activeAtk = static_cast(active); + remaskBlkViews(NULL, static_cast(active)); + cursor_pos = ATK; + step = ORDER; + } + else + go->nextCombatStep(); + return 1; + } + case FIRST_STRIKE: + step = FIRST_STRIKE; + for (inner_iterator attacker = attackers.begin(); attacker != attackers.end(); ++attacker) + if ((*attacker)->card->has(Constants::FIRSTSTRIKE) || (*attacker)->card->has(Constants::DOUBLESTRIKE)) goto DAMAGE; + cout << "FIRST STRIKE" << endl; + resolve(); + go->nextCombatStep(); + return 1; + case DAMAGE: DAMAGE: + step = event->step; + if (!go->currentPlayer->displayStack()) { cout << "DAMAGE" << endl; resolve(); go->userRequestNextGamePhase(); return 1; } + for (inner_iterator attacker = attackers.begin(); attacker != attackers.end(); ++attacker) + autoaffectDamage(*attacker, step); + for (inner_iterator it = attackers.begin(); it != attackers.end(); ++it) + (*it)->show = ((*it)->card->has(Constants::DOUBLESTRIKE) || ((*it)->card->has(Constants::FIRSTSTRIKE) ^ (DAMAGE == step))) && (1 < (*it)->blockers.size()); repos(attackers.begin(), attackers.end(), 0); + active = NULL; + for (inner_iterator it = attackers.begin(); it != attackers.end(); ++it) if ((*it)->show) { active = *it; break; } if (active) { - active->zoom = 2.7; // We know there is at least one, so this cannot be NULL + active->zoom = 2.7; activeAtk = static_cast(active); remaskBlkViews(NULL, static_cast(active)); cursor_pos = ATK; - step = ORDER; } else - go->receiveEvent(NEW WEventCombatStepChange(FIRST_STRIKE)); + { + resolve(); + if (FIRST_STRIKE == step) go->nextCombatStep(); + else go->userRequestNextGamePhase(); + } return 1; } - case FIRST_STRIKE: - for (inner_iterator attacker = attackers.begin(); attacker != attackers.end(); ++attacker) - if ((*attacker)->card->has(Constants::FIRSTSTRIKE) || (*attacker)->card->has(Constants::DOUBLESTRIKE)) goto DAMAGE; - go->receiveEvent(NEW WEventCombatStepChange(DAMAGE)); - return 1; - case DAMAGE: DAMAGE: - if (!go->currentPlayer->displayStack()) { go->userRequestNextGamePhase(); return 1; } - step = event->step; - for (inner_iterator attacker = attackers.begin(); attacker != attackers.end(); ++attacker) - autoaffectDamage(*attacker, step); - for (inner_iterator it = attackers.begin(); it != attackers.end(); ++it) - (*it)->show = ((*it)->card->has(Constants::DOUBLESTRIKE) || ((*it)->card->has(Constants::FIRSTSTRIKE) ^ (DAMAGE == step))) && (1 < (*it)->blockers.size()); - repos(attackers.begin(), attackers.end(), 0); - active = NULL; - for (inner_iterator it = attackers.begin(); it != attackers.end(); ++it) if ((*it)->show) { active = *it; break; } - if (active) - { - active->zoom = 2.7; - activeAtk = static_cast(active); - remaskBlkViews(NULL, static_cast(active)); - cursor_pos = ATK; - } - else - { - resolve(); - if (FIRST_STRIKE == step) go->receiveEvent(NEW WEventCombatStepChange(DAMAGE)); - else go->userRequestNextGamePhase(); - } - return 1; - } return 0; } diff --git a/projects/mtg/src/GuiPlay.cpp b/projects/mtg/src/GuiPlay.cpp index 181c34d5a..9a73a7376 100644 --- a/projects/mtg/src/GuiPlay.cpp +++ b/projects/mtg/src/GuiPlay.cpp @@ -219,6 +219,7 @@ int GuiPlay::receiveEventMinus(WEvent * e) CardView* cv = *it; cs->Remove(cv); cards.erase(it); + cv->card->view = NULL; delete cv; Replace(); return 1; diff --git a/projects/mtg/src/GuiStatic.cpp b/projects/mtg/src/GuiStatic.cpp index f57c9dc7d..3ac5d2e3c 100644 --- a/projects/mtg/src/GuiStatic.cpp +++ b/projects/mtg/src/GuiStatic.cpp @@ -114,7 +114,7 @@ void GuiGameZone::Render(){ mFont->DrawString(buffer, actX, actY); if (showCards) cd->Render(); - for (vector::iterator it = cards.begin(); it != cards.end(); ++it) + for (vector::iterator it = cards.begin(); it != cards.end(); ++it) (*it)->Render(); PlayGuiObject::Render(); } @@ -124,7 +124,7 @@ void GuiGameZone::ButtonPressed(int controllerId, int controlId){ } void GuiGameZone::Update(float dt){ - for (vector::iterator it = cards.begin(); it != cards.end(); ++it) + for (vector::iterator it = cards.begin(); it != cards.end(); ++it) (*it)->Update(dt); if (showCards) cd->Update(dt); PlayGuiObject::Update(dt); @@ -137,9 +137,8 @@ GuiGameZone::GuiGameZone(float x, float y, bool hasFocus, MTGGameZone* zone, Gui GuiGameZone::~GuiGameZone(){ if (cd) delete cd; - for (vector::iterator it = cards.begin(); it != cards.end(); ++it){ + for (vector::iterator it = cards.begin(); it != cards.end(); ++it) delete(*it); - } } ostream& GuiGameZone::toString(ostream& out) const @@ -158,12 +157,11 @@ int GuiGraveyard::receiveEventPlus(WEvent* e) if (WEventZoneChange* event = dynamic_cast(e)) if (event->to == zone) { - cout << "Goes to Graveyard " << event->card->view << endl; - TransientCardView* t; + CardView* t; if (event->card->view) - t = NEW TransientCardView(event->card, *(event->card->view)); + t = NEW CardView(event->card, *(event->card->view)); else - t = NEW TransientCardView(event->card, x, y); + t = NEW CardView(event->card, x, y); t->x = x + Width / 2; t->y = y + Height / 2; t->zoom = 0.3; t->alpha = 0; cards.push_back(t); return 1; @@ -175,10 +173,10 @@ int GuiGraveyard::receiveEventMinus(WEvent* e) { if (WEventZoneChange* event = dynamic_cast(e)) if (event->from == zone) - for (vector::iterator it = cards.begin(); it != cards.end(); ++it) + for (vector::iterator it = cards.begin(); it != cards.end(); ++it) if (event->card->previous == (*it)->card) { - TransientCardView* cv = *it; + CardView* cv = *it; cards.erase(it); delete cv; return 1; diff --git a/projects/mtg/src/MTGCardInstance.cpp b/projects/mtg/src/MTGCardInstance.cpp index 549a5ba9b..df24ea13f 100644 --- a/projects/mtg/src/MTGCardInstance.cpp +++ b/projects/mtg/src/MTGCardInstance.cpp @@ -534,17 +534,10 @@ int MTGCardInstance::setDefenser(MTGCardInstance * opponent){ } } WEvent * e = NULL; - if (defenser != opponent){ - e = NEW WEventCreatureBlocker(this, defenser, opponent); - - } + if (defenser != opponent) e = NEW WEventCreatureBlocker(this, defenser, opponent); defenser = opponent; - if (defenser){ - defenser->blockers.push_back(this); - } - g->blockersSorted = false; + if (defenser) defenser->blockers.push_back(this); if (e) g->receiveEvent(e); - //delete e; return 1; }