From f45c8e1d410800310ecc63e630f7f67b4acf83c9 Mon Sep 17 00:00:00 2001 From: "Xawotihs@gmail.com" Date: Sat, 26 Jan 2013 16:42:16 +0000 Subject: [PATCH] Just won my first Wagic network game :) In details: - I removed my player swap idea, it caused tons of issues with randoms - instead I simply keep both peer on the exact same game and added one single parameter allowing to configure the view on the game. So, each peer is rendering the same game (gameObserver class) from a different player point of view (DuelLayers and related classes). - a lot of gui stuff are missing to prevent user forbidden interactions but it works fine on Windows --- projects/mtg/include/DuelLayers.h | 12 ++++-- projects/mtg/include/GameObserver.h | 11 +++-- projects/mtg/include/GuiAvatars.h | 2 +- projects/mtg/include/GuiLayers.h | 3 ++ projects/mtg/include/GuiPhaseBar.h | 3 +- projects/mtg/include/GuiPlay.h | 2 +- projects/mtg/src/DuelLayers.cpp | 63 ++++++++++++++++------------- projects/mtg/src/GameObserver.cpp | 40 +++++++----------- projects/mtg/src/GuiAvatars.cpp | 18 ++++----- projects/mtg/src/GuiLayers.cpp | 9 +++++ projects/mtg/src/GuiPhaseBar.cpp | 12 +++--- projects/mtg/src/GuiPlay.cpp | 31 +++++++------- 12 files changed, 112 insertions(+), 94 deletions(-) diff --git a/projects/mtg/include/DuelLayers.h b/projects/mtg/include/DuelLayers.h index 8093a3d5c..e0e09358b 100644 --- a/projects/mtg/include/DuelLayers.h +++ b/projects/mtg/include/DuelLayers.h @@ -29,9 +29,11 @@ protected: GuiAvatars * avatars; GameObserver* observer; MTGGamePhase* phaseHandler; + int mPlayerViewIndex; + CardSelectorBase* mCardSelector; public: - DuelLayers(); + DuelLayers(GameObserver* go, int playerViewIndex = 0); ~DuelLayers(); ActionLayer * actionLayer(); @@ -39,7 +41,6 @@ public: GuiCombat * combatLayer(); GuiAvatars * GetAvatars(); MTGGamePhase* getPhaseHandler() {return phaseHandler;}; - void init(GameObserver* go); virtual void Update(float dt, Player * player); void CheckUserInput(int isAI); void Render(); @@ -47,8 +48,11 @@ public: void Remove(); int receiveEvent(WEvent * e); float RightBoundary(); - - CardSelectorBase* mCardSelector; + int getPlayerViewIndex(){ return mPlayerViewIndex; }; + Player* getRenderedPlayer(); + Player* getRenderedPlayerOpponent(); + CardSelectorBase* getCardSelector() { return mCardSelector; }; + GameObserver* getObserver(){ return observer; }; }; #include "ActionLayer.h" diff --git a/projects/mtg/include/GameObserver.h b/projects/mtg/include/GameObserver.h index 3b438d383..41314108d 100644 --- a/projects/mtg/include/GameObserver.h +++ b/projects/mtg/include/GameObserver.h @@ -52,8 +52,8 @@ class GameObserver{ string startupGameSerialized; bool parseLine(const string& s); virtual void logAction(const string& s); - bool processAction(const string& s, bool swapPlayer = false); - bool processActions(bool undo, bool swapPlayer + bool processAction(const string& s); + bool processActions(bool undo #ifdef TESTSUITE , TestSuiteGame* testgame #endif @@ -143,7 +143,7 @@ class GameObserver{ logAction(players[playerId], s); }; void logAction(MTGCardInstance* card, MTGGameZone* zone, size_t index, int result); - bool load(const string& s, bool undo = false, bool swapPlayers = false + bool load(const string& s, bool undo = false, int controlledPlayerIndex = 0 #ifdef TESTSUITE , TestSuiteGame* testgame = 0 #endif @@ -155,7 +155,7 @@ class GameObserver{ bool isStarted() { return (mLayers!=NULL);}; RandomGenerator* getRandomGenerator() { return &randomGenerator; }; WResourceManager* getResourceManager() { if(this) return mResourceManager;else return 0;}; - CardSelectorBase* getCardSelector() { return mLayers->mCardSelector;}; + CardSelectorBase* getCardSelector() { return mLayers->getCardSelector();}; bool operator==(const GameObserver& aGame); JGE* getInput(){return mJGE;}; DeckManager* getDeckManager(){ return mDeckManager; }; @@ -180,6 +180,9 @@ class GameObserver{ return true; } }; + + DuelLayers *getView() { return mLayers; }; + }; #ifdef NETWORK_SUPPORT diff --git a/projects/mtg/include/GuiAvatars.h b/projects/mtg/include/GuiAvatars.h index d14a60772..2baf6822c 100644 --- a/projects/mtg/include/GuiAvatars.h +++ b/projects/mtg/include/GuiAvatars.h @@ -17,7 +17,7 @@ protected: GuiAvatar* active; public: - GuiAvatars(GameObserver *observer); + GuiAvatars(DuelLayers* duelLayers); ~GuiAvatars(); GuiAvatar* GetSelf(); diff --git a/projects/mtg/include/GuiLayers.h b/projects/mtg/include/GuiLayers.h index d5e572be2..4df7b41bc 100644 --- a/projects/mtg/include/GuiLayers.h +++ b/projects/mtg/include/GuiLayers.h @@ -11,12 +11,14 @@ class GameObserver; class Player; +class DuelLayers; class GuiLayer { protected: JButton mActionButton; GameObserver* observer; + DuelLayers* mpDuelLayers; public: int mCurr; vector mObjects; @@ -28,6 +30,7 @@ public: virtual void resetObjects(); int getMaxId(); GuiLayer(GameObserver *observer); + GuiLayer(DuelLayers *duelLayers); virtual ~GuiLayer(); virtual void Update(float dt); virtual bool CheckUserInput(JButton key) diff --git a/projects/mtg/include/GuiPhaseBar.h b/projects/mtg/include/GuiPhaseBar.h index 038256635..49dafac6e 100644 --- a/projects/mtg/include/GuiPhaseBar.h +++ b/projects/mtg/include/GuiPhaseBar.h @@ -11,9 +11,10 @@ protected: Phase* phase; float angle; float zoomFactor; + DuelLayers* mpDuelLayers; public: - GuiPhaseBar(GameObserver* observer); + GuiPhaseBar(DuelLayers* duelLayers); ~GuiPhaseBar(); void Update(float dt); virtual void Render(); diff --git a/projects/mtg/include/GuiPlay.h b/projects/mtg/include/GuiPlay.h index eacc5eeac..4eadc959a 100644 --- a/projects/mtg/include/GuiPlay.h +++ b/projects/mtg/include/GuiPlay.h @@ -81,7 +81,7 @@ protected: vector cards; public: - GuiPlay(GameObserver*); + GuiPlay(DuelLayers*); ~GuiPlay(); virtual void Render(); void Replace(); diff --git a/projects/mtg/src/DuelLayers.cpp b/projects/mtg/src/DuelLayers.cpp index 7c464320f..2c1713849 100644 --- a/projects/mtg/src/DuelLayers.cpp +++ b/projects/mtg/src/DuelLayers.cpp @@ -13,32 +13,6 @@ #include "Trash.h" #include "DuelLayers.h" -void DuelLayers::init(GameObserver* go) -{ - observer = go; - mCardSelector = NEW CardSelector(go, this); - //1 Action Layer - action = NEW ActionLayer(go); - action->Add(phaseHandler = NEW MTGGamePhase(go, action->getMaxId())); //Phases handler - action->Add(NEW OtherAbilitiesEventReceiver(go, -1)); //autohand, etc... handler - //Other display elements - action->Add(NEW HUDDisplay(go, -1)); - - Add(NEW GuiMana(20, 20, go->players[1])); - Add(NEW GuiMana(440, 20, go->players[0])); - Add(stack = NEW ActionStack(go)); - Add(combat = NEW GuiCombat(go)); - Add(action); - Add(mCardSelector); - Add(hand = NEW GuiHandSelf(go, go->players[0]->game->hand)); - Add(avatars = NEW GuiAvatars(go)); - Add(NEW GuiHandOpponent(go, go->players[1]->game->hand)); - Add(NEW GuiPlay(go)); - Add(NEW GuiPhaseBar(go)); - Add(NEW GuiFrame(go)); - Add(NEW GuiBackground(go)); -} - void DuelLayers::CheckUserInput(int isAI) { JButton key; @@ -111,9 +85,32 @@ GuiAvatars * DuelLayers::GetAvatars() return avatars; } -DuelLayers::DuelLayers() : - nbitems(0) +DuelLayers::DuelLayers(GameObserver* go, int playerViewIndex) : + nbitems(0), mPlayerViewIndex(playerViewIndex) { + observer = go; + observer->mLayers = this; + mCardSelector = NEW CardSelector(go, this); + //1 Action Layer + action = NEW ActionLayer(go); + action->Add(phaseHandler = NEW MTGGamePhase(go, action->getMaxId())); //Phases handler + action->Add(NEW OtherAbilitiesEventReceiver(go, -1)); //autohand, etc... handler + //Other display elements + action->Add(NEW HUDDisplay(go, -1)); + + Add(NEW GuiMana(20, 20, getRenderedPlayerOpponent())); + Add(NEW GuiMana(440, 20, getRenderedPlayer())); + Add(stack = NEW ActionStack(go)); + Add(combat = NEW GuiCombat(go)); + Add(action); + Add(mCardSelector); + Add(hand = NEW GuiHandSelf(go, getRenderedPlayer()->game->hand)); + Add(avatars = NEW GuiAvatars(this)); + Add(NEW GuiHandOpponent(go, getRenderedPlayerOpponent()->game->hand)); + Add(NEW GuiPlay(this)); + Add(NEW GuiPhaseBar(this)); + Add(NEW GuiFrame(go)); + Add(NEW GuiBackground(go)); } DuelLayers::~DuelLayers() @@ -216,3 +213,13 @@ float DuelLayers::RightBoundary() { return MIN (hand->LeftBoundary(), avatars->LeftBoundarySelf()); } + +Player* DuelLayers::getRenderedPlayer() +{ + return observer->players[mPlayerViewIndex]; +}; + +Player* DuelLayers::getRenderedPlayerOpponent() +{ + return observer->players[mPlayerViewIndex]->opponent(); +}; diff --git a/projects/mtg/src/GameObserver.cpp b/projects/mtg/src/GameObserver.cpp index f5dc1fb68..57c9ceb24 100644 --- a/projects/mtg/src/GameObserver.cpp +++ b/projects/mtg/src/GameObserver.cpp @@ -379,7 +379,6 @@ void GameObserver::resetStartupGame() DebugTrace(startupGameSerialized); } - void GameObserver::startGame(GameType gtype, Rules * rules) { mGameType = gtype; @@ -390,11 +389,10 @@ void GameObserver::startGame(GameType gtype, Rules * rules) options.automaticStyle(players[0], players[1]); - mLayers = NEW DuelLayers(); - mLayers->init(this); + mLayers = NEW DuelLayers(this); currentPlayerId = 0; - currentPlayer = players[0]; + currentPlayer = players[currentPlayerId]; currentActionPlayer = currentPlayer; phaseRing = NEW PhaseRing(this); @@ -1534,7 +1532,7 @@ bool GameObserver::parseLine(const string& s) return false; } -bool GameObserver::load(const string& ss, bool undo, bool swapPlayers +bool GameObserver::load(const string& ss, bool undo, int controlledPlayerIndex #ifdef TESTSUITE , TestSuiteGame* testgame #endif @@ -1629,16 +1627,8 @@ bool GameObserver::load(const string& ss, bool undo, bool swapPlayers case 3: if (s.compare("[end]") == 0) { - if(swapPlayers) { - std::swap(players[0], players[1]); - currentPlayerId = (currentPlayerId + 1) % players.size(); - currentPlayer = players[currentPlayerId]; - currentActionPlayer = currentPlayer; - } - turn = 0; - mLayers = NEW DuelLayers(); - mLayers->init(this); + mLayers = NEW DuelLayers(this, controlledPlayerIndex); currentPlayer = players[currentPlayerId]; phaseRing = NEW PhaseRing(this); startedAt = time(0); @@ -1655,7 +1645,7 @@ bool GameObserver::load(const string& ss, bool undo, bool swapPlayers testgame->initGame(); #endif //TESTSUITE - processActions(undo, swapPlayers + processActions(undo #ifdef TESTSUITE , testgame #endif //TESTSUITE @@ -1672,11 +1662,11 @@ bool GameObserver::load(const string& ss, bool undo, bool swapPlayers return true; } -bool GameObserver::processAction(const string& s, bool swapPlayer) +bool GameObserver::processAction(const string& s) { - Player* p = (swapPlayer)?players[0]:players[1]; + Player* p = players[1]; if (s.find("p1") != string::npos) - p = (swapPlayer)?players[1]:players[0]; + p = players[0]; MTGGameZone* zone = NULL; if(s.find(string(p->game->hand->getName())+"[") != string::npos) @@ -1729,7 +1719,7 @@ bool GameObserver::processAction(const string& s, bool swapPlayer) return true; } -bool GameObserver::processActions(bool undo, bool swapPlayer +bool GameObserver::processActions(bool undo #ifdef TESTSUITE , TestSuiteGame* testgame #endif @@ -1767,7 +1757,7 @@ bool GameObserver::processActions(bool undo, bool swapPlayer for(loadingite = loadingList.begin(); loadingite != loadingList.end(); loadingite++, cmdIndex++) { - processAction(*loadingite, swapPlayer); + processAction(*loadingite); size_t nb = actionsList.size(); @@ -2015,8 +2005,8 @@ void NetworkGameObserver::synchronize() void NetworkGameObserver::synchronize(void*pxThis, stringstream& in, stringstream& out) { NetworkGameObserver* pThis = (NetworkGameObserver*)pxThis; - // now, we need to swap players as player1 for host is player 2 for guest - pThis->load(in.str(), false, true); + // now, we need to load the game from player 2's perspective + pThis->load(in.str(), false, 1); out << *pThis; } @@ -2027,7 +2017,7 @@ void NetworkGameObserver::checkSynchro(void*pxThis, stringstream& in, stringstre GameObserver aGame; aGame.mRules = pThis->mRules; - aGame.load(in.str(), false, true); + aGame.load(in.str()); assert(aGame == *pThis); } @@ -2037,9 +2027,9 @@ void NetworkGameObserver::sendAction(void*pxThis, stringstream& in, stringstream NetworkGameObserver* pThis = (NetworkGameObserver*)pxThis; pThis->mForwardAction = false; - pThis->processAction(in.str(), true); + pThis->processAction(in.str()); pThis->mForwardAction = true; - out << *pThis; + //out << *pThis; } void NetworkGameObserver::logAction(const string& s) diff --git a/projects/mtg/src/GuiAvatars.cpp b/projects/mtg/src/GuiAvatars.cpp index 46186f8c3..e364bae3c 100644 --- a/projects/mtg/src/GuiAvatars.cpp +++ b/projects/mtg/src/GuiAvatars.cpp @@ -7,24 +7,24 @@ #define LIB_GRAVE_OFFSET 230 -GuiAvatars::GuiAvatars(GameObserver* observer) : - GuiLayer(observer), active(NULL) +GuiAvatars::GuiAvatars(DuelLayers* duelLayers) : + GuiLayer(duelLayers), active(NULL) { - Add(self = NEW GuiAvatar(SCREEN_WIDTH, SCREEN_HEIGHT, false, observer->players[0], GuiAvatar::BOTTOM_RIGHT, this)); + Add(self = NEW GuiAvatar(SCREEN_WIDTH, SCREEN_HEIGHT, false, mpDuelLayers->getRenderedPlayer(), GuiAvatar::BOTTOM_RIGHT, this)); self->zoom = 0.9f; - Add(selfGraveyard = NEW GuiGraveyard(SCREEN_WIDTH - GuiAvatar::Width - GuiGameZone::Width / 2 - 11, SCREEN_HEIGHT - GuiAvatar::Height - 1, false, observer->players[0], this)); - Add(selfLibrary = NEW GuiLibrary(SCREEN_WIDTH - GuiAvatar::Width - GuiGameZone::Width / 2 - 11, SCREEN_HEIGHT - GuiAvatar::Height - 5 + GuiGameZone::Height + 5, false, observer->players[0], this)); + Add(selfGraveyard = NEW GuiGraveyard(SCREEN_WIDTH - GuiAvatar::Width - GuiGameZone::Width / 2 - 11, SCREEN_HEIGHT - GuiAvatar::Height - 1, false, mpDuelLayers->getRenderedPlayer(), this)); + Add(selfLibrary = NEW GuiLibrary(SCREEN_WIDTH - GuiAvatar::Width - GuiGameZone::Width / 2 - 11, SCREEN_HEIGHT - GuiAvatar::Height - 5 + GuiGameZone::Height + 5, false, mpDuelLayers->getRenderedPlayer(), this)); - Add(opponent = NEW GuiAvatar(0, 0, false, observer->players[1], GuiAvatar::TOP_LEFT, this)); + Add(opponent = NEW GuiAvatar(0, 0, false, mpDuelLayers->getRenderedPlayerOpponent(), GuiAvatar::TOP_LEFT, this)); opponent->zoom = 0.9f; //opponenthandveiw button Add(opponentHand = NEW GuiOpponentHand(-30 + GuiAvatar::Width * 1.2 - GuiGameZone::Width / 2, 35 + GuiGameZone::Height - 10, - false, observer->players[1], this)); + false, mpDuelLayers->getRenderedPlayerOpponent(), this)); //opponenthandveiwends Add(opponentGraveyard = NEW GuiGraveyard(5 + GuiAvatar::Width * 1.4 - GuiGameZone::Width / 2, 5, false, - observer->players[1], this)); + mpDuelLayers->getRenderedPlayerOpponent(), this)); Add(opponentLibrary = NEW GuiLibrary(5 + GuiAvatar::Width * 1.4 - GuiGameZone::Width / 2, 5 + GuiGameZone::Height + 5, false, - observer->players[1], this)); + mpDuelLayers->getRenderedPlayerOpponent(), this)); observer->getCardSelector()->Add(self); observer->getCardSelector()->Add(selfGraveyard); diff --git a/projects/mtg/src/GuiLayers.cpp b/projects/mtg/src/GuiLayers.cpp index 262606735..7ac419768 100644 --- a/projects/mtg/src/GuiLayers.cpp +++ b/projects/mtg/src/GuiLayers.cpp @@ -13,6 +13,15 @@ GuiLayer::GuiLayer(GameObserver *observer) mActionButton = JGE_BTN_OK; } +GuiLayer::GuiLayer(DuelLayers *duelLayers) + : observer(duelLayers->getObserver()), mpDuelLayers(duelLayers) +{ + modal = 0; + hasFocus = false; + mCurr = 0; + mActionButton = JGE_BTN_OK; +} + GuiLayer::~GuiLayer() { resetObjects(); diff --git a/projects/mtg/src/GuiPhaseBar.cpp b/projects/mtg/src/GuiPhaseBar.cpp index 960ebc0d5..22d3e4ee9 100644 --- a/projects/mtg/src/GuiPhaseBar.cpp +++ b/projects/mtg/src/GuiPhaseBar.cpp @@ -41,9 +41,9 @@ namespace } } -GuiPhaseBar::GuiPhaseBar(GameObserver* observer) : - GuiLayer(observer), PlayGuiObject(0, 0, 106, 0, false), - phase(NULL), angle(0.0f), zoomFactor(ICONSCALE) +GuiPhaseBar::GuiPhaseBar(DuelLayers* duelLayers) : + GuiLayer(duelLayers->getObserver()), PlayGuiObject(0, 0, 106, 0, false), + phase(NULL), angle(0.0f), zoomFactor(ICONSCALE), mpDuelLayers(duelLayers) { JQuadPtr quad = WResourceManager::Instance()->GetQuad("phasebar"); if (quad.get() != NULL) @@ -55,7 +55,7 @@ GuiPhaseBar::GuiPhaseBar(GameObserver* observer) : GameApp::systemError = "Error loading phasebar texture : " __FILE__; zoom = ICONSCALE; - observer->getCardSelector()->Add(this); + mpDuelLayers->getCardSelector()->Add(this); } @@ -132,7 +132,7 @@ void GuiPhaseBar::Render() WFont * font = WResourceManager::Instance()->GetWFont(Fonts::MAIN_FONT); string currentP = _("your turn"); string interrupt = ""; - if (observer->currentPlayer == observer->players[1]) + if (observer->currentPlayer == mpDuelLayers->getRenderedPlayerOpponent()) { currentP = _("opponent's turn"); } @@ -143,7 +143,7 @@ void GuiPhaseBar::Render() } if (observer->currentlyActing() != observer->currentPlayer) { - if (observer->currentPlayer == observer->players[0]) + if (observer->currentPlayer == mpDuelLayers->getRenderedPlayer()) { interrupt = _(" - ") + _("opponent plays"); } diff --git a/projects/mtg/src/GuiPlay.cpp b/projects/mtg/src/GuiPlay.cpp index 471f96735..183bd581f 100644 --- a/projects/mtg/src/GuiPlay.cpp +++ b/projects/mtg/src/GuiPlay.cpp @@ -6,6 +6,7 @@ #include "Subtypes.h" #include "Trash.h" #include "ModRules.h" +#include "DuelLayers.h" #define CARD_WIDTH (31) @@ -123,7 +124,7 @@ void GuiPlay::BattleField::reset(float x, float y) void GuiPlay::BattleField::EnstackAttacker(CardView* card) { card->x = CARD_WIDTH + 20 + (currentAttacker * (HORZWIDTH) / (attackers+1)); - card->y = baseY + (card->card->getObserver()->players[0] == card->card->controller() ? 20 + y : -20 - y); + card->y = baseY + (card->card->getObserver()->getView()->getRenderedPlayer() == card->card->controller() ? 20 + y : -20 - y); ++currentAttacker; // JRenderer::GetInstance()->RenderQuad(WResourceManager::Instance()->GetQuad("BattleIcon"), card->actX, card->actY, 0, 0.5 + 0.1 * sinf(JGE::GetInstance()->GetTime()), 0.5 + 0.1 * sinf(JGE::GetInstance()->GetTime())); } @@ -138,7 +139,7 @@ void GuiPlay::BattleField::EnstackBlocker(CardView* card) offset = c->defenser->getDefenserRank(c); card->x = c->defenser->view->x + 5 * offset; } - card->y = baseY + (card->card->getObserver()->players[0] == card->card->controller() ? 20 + y + 6 * offset : -20 - y + 6 * offset); + card->y = baseY + (card->card->getObserver()->getView()->getRenderedPlayer() == card->card->controller() ? 20 + y + 6 * offset : -20 - y + 6 * offset); } void GuiPlay::BattleField::Update(float dt) { @@ -162,8 +163,8 @@ void GuiPlay::BattleField::Render() JRenderer::GetInstance()->FillRect(44, SCREEN_HEIGHT / 2 + 10 - height / 2, 318, height, ARGB(127, red, 0, 0)); } -GuiPlay::GuiPlay(GameObserver* game) : - GuiLayer(game) +GuiPlay::GuiPlay(DuelLayers* view) : + GuiLayer(view) { end_spells = cards.end(); } @@ -192,7 +193,7 @@ void GuiPlay::Replace() { if((!(*it)->card->hasSubtype(Subtypes::TYPE_AURA)|| ((*it)->card->hasSubtype(Subtypes::TYPE_AURA) && (*it)->card->playerTarget)) && !(*it)->card->hasType(Subtypes::TYPE_PLANESWALKER)) { - if (observer->players[0] == (*it)->card->controller()) + if (mpDuelLayers->getRenderedPlayer() == (*it)->card->controller()) ++selfSpellsN; else ++opponentSpellsN; @@ -206,14 +207,14 @@ void GuiPlay::Replace() ++battleFieldAttackersN; else if ((*it)->card->isDefenser()) ++battleFieldBlockersN; - else if (observer->players[0] == (*it)->card->controller()) + else if (mpDuelLayers->getRenderedPlayer() == (*it)->card->controller()) ++selfCreaturesN; else ++opponentCreaturesN; } else if ((*it)->card->isLand() || (*it)->card->hasType(Subtypes::TYPE_PLANESWALKER)) { - if (observer->players[0] == (*it)->card->controller()) + if (mpDuelLayers->getRenderedPlayer() == (*it)->card->controller()) ++selfLandsN; else ++opponentLandsN; @@ -228,7 +229,7 @@ void GuiPlay::Replace() { if((!(*it)->card->hasSubtype(Subtypes::TYPE_AURA)|| ((*it)->card->hasSubtype(Subtypes::TYPE_AURA) && (*it)->card->playerTarget)) && !(*it)->card->hasType(Subtypes::TYPE_PLANESWALKER)) { - if (observer->players[0] == (*it)->card->controller()) + if (mpDuelLayers->getRenderedPlayer() == (*it)->card->controller()) selfSpells.Enstack(*it); else opponentSpells.Enstack(*it); @@ -252,14 +253,14 @@ void GuiPlay::Replace() battleField.EnstackAttacker(*it); else if ((*it)->card->isDefenser()) battleField.EnstackBlocker(*it); - else if (observer->players[0] == (*it)->card->controller()) + else if (mpDuelLayers->getRenderedPlayer() == (*it)->card->controller()) selfCreatures.Enstack(*it); else opponentCreatures.Enstack(*it); } else if ((*it)->card->isLand()) { - if (observer->players[0] == (*it)->card->controller()) + if (mpDuelLayers->getRenderedPlayer() == (*it)->card->controller()) selfLands.Enstack(*it); else opponentLands.Enstack(*it); @@ -271,7 +272,7 @@ void GuiPlay::Replace() { if ((*it)->card->hasType(Subtypes::TYPE_PLANESWALKER)) { - if (observer->players[0] == (*it)->card->controller()) + if (mpDuelLayers->getRenderedPlayer() == (*it)->card->controller()) selfLands.Enstack(*it); else opponentLands.Enstack(*it); @@ -287,14 +288,14 @@ void GuiPlay::Render() { if ((*it)->card->isLand()) { - if (observer->players[0] == (*it)->card->controller()) + if (mpDuelLayers->getRenderedPlayer() == (*it)->card->controller()) selfLands.Render(*it, cards.begin(), end_spells); else opponentLands.Render(*it, cards.begin(), end_spells); } else if ((*it)->card->isCreature()) { - if (observer->players[0] == (*it)->card->controller()) + if (mpDuelLayers->getRenderedPlayer() == (*it)->card->controller()) selfCreatures.Render(*it, cards.begin(), end_spells); else opponentCreatures.Render(*it, cards.begin(), end_spells); @@ -303,7 +304,7 @@ void GuiPlay::Render() { if (!(*it)->card->target) { - if (observer->players[0] == (*it)->card->controller()) + if (mpDuelLayers->getRenderedPlayer() == (*it)->card->controller()) selfSpells.Render(*it, cards.begin(), end_spells); else opponentSpells.Render(*it, cards.begin(), end_spells); @@ -313,7 +314,7 @@ void GuiPlay::Render() { if (!(*it)->card->target) { - if (observer->players[0] == (*it)->card->controller()) + if (mpDuelLayers->getRenderedPlayer() == (*it)->card->controller()) selfPlaneswalker.Render(*it, cards.begin(), end_spells); else opponentPlaneswalker.Render(*it, cards.begin(), end_spells);