diff --git a/projects/mtg/include/GameObserver.h b/projects/mtg/include/GameObserver.h index b9c52770c..0216e529a 100644 --- a/projects/mtg/include/GameObserver.h +++ b/projects/mtg/include/GameObserver.h @@ -11,6 +11,7 @@ #include "PhaseRing.h" #include "ReplacementEffects.h" #include "GuiStatic.h" +#include class MTGGamePhase; class MTGAbility; @@ -18,13 +19,14 @@ class MTGCardInstance; struct CardGui; class Player; class TargetChooser; - +using namespace std; class GameObserver{ protected: int reaction; static GameObserver * mInstance; MTGCardInstance * cardWaitingForTargets; + queue eventsQueue; int nbPlayers; int currentPlayerId; diff --git a/projects/mtg/src/ActionStack.cpp b/projects/mtg/src/ActionStack.cpp index 91768f6f9..bb0cde420 100644 --- a/projects/mtg/src/ActionStack.cpp +++ b/projects/mtg/src/ActionStack.cpp @@ -192,7 +192,7 @@ void Spell::Render(){ if (quad){ quad->SetColor(ARGB(255,255,255,255)); float scale = mHeight / quad->mHeight; - renderer->RenderQuad(quad, x , y , 0,scale,scale); + renderer->RenderQuad(quad, x+10*scale , y+15*scale , 0,scale,scale); }else{ // } @@ -209,7 +209,7 @@ void Spell::Render(){ if (quad){ quad->SetColor(ARGB(220,255,255,255)); float scale = 257.f / quad->mHeight; - renderer->RenderQuad(quad, 10 , 20 , 0.0f,scale,scale); + renderer->RenderQuad(quad, 10+100*scale , 20+145*scale , 0.0f,scale,scale); } else { @@ -220,7 +220,7 @@ void Spell::Render(){ if (quad){ float scale = 250 / quad->mHeight; quad->SetColor(ARGB(40,255,255,255)); - renderer->RenderQuad(quad, 20, 20, 0.0f, scale, scale); + renderer->RenderQuad(quad, 20+15*scale, 20+20*scale, 0.0f, scale, scale); } } diff --git a/projects/mtg/src/Damage.cpp b/projects/mtg/src/Damage.cpp index 245e65a74..d5348a739 100644 --- a/projects/mtg/src/Damage.cpp +++ b/projects/mtg/src/Damage.cpp @@ -56,7 +56,7 @@ int Damage::resolve(){ //Send (Damage/Replaced effect) event to listeners g->receiveEvent(e); - SAFE_DELETE(e); + //SAFE_DELETE(e); return a; } diff --git a/projects/mtg/src/GameObserver.cpp b/projects/mtg/src/GameObserver.cpp index f86c1892c..d2ab0a29f 100644 --- a/projects/mtg/src/GameObserver.cpp +++ b/projects/mtg/src/GameObserver.cpp @@ -462,7 +462,15 @@ void GameObserver::untapPhase(){ int GameObserver::receiveEvent(WEvent * e){ if (!e) return 0; - return mLayers->receiveEvent(e); + eventsQueue.push(e); + if (eventsQueue.size() > 1) return -1; + int result = 0; + while(eventsQueue.size()){ + WEvent * ev = eventsQueue.front(); + result += mLayers->receiveEvent(ev); + SAFE_DELETE(ev); + eventsQueue.pop(); + } } diff --git a/projects/mtg/src/MTGAbility.cpp b/projects/mtg/src/MTGAbility.cpp index c818ffbae..99a8a7f73 100644 --- a/projects/mtg/src/MTGAbility.cpp +++ b/projects/mtg/src/MTGAbility.cpp @@ -1890,7 +1890,7 @@ int ActivatedAbility::reactToClick(MTGCardInstance * card){ game->currentlyActing()->getManaPool()->pay(cost); cost->doPayExtra(); } - if (needsTapping) source->tap(); + if (needsTapping && source->isInPlay()) source->tap(); fireAbility(); return 1; @@ -1899,7 +1899,6 @@ int ActivatedAbility::reactToClick(MTGCardInstance * card){ int ActivatedAbility::reactToTargetClick(Targetable * object){ if (!isReactingToTargetClick(object)) return 0; - if (needsTapping) source->tap(); if (cost){ if (object->typeAsTarget() == TARGET_CARD) cost->setExtraCostsAction(this, (MTGCardInstance *) object); OutputDebugString("React To click 2\n"); @@ -1911,6 +1910,7 @@ int ActivatedAbility::reactToTargetClick(Targetable * object){ game->currentlyActing()->getManaPool()->pay(cost); cost->doPayExtra(); } + if (needsTapping && source->isInPlay()) source->tap(); fireAbility(); return 1; @@ -2407,8 +2407,8 @@ void AManaProducer::Render(){ { for (int cost = output->getCost(i); cost > 0; --cost) { - WEventEngageMana e(i, source); - GameObserver::GetInstance()->receiveEvent(&e); + WEvent * e = NEW WEventEngageMana(i, source); + GameObserver::GetInstance()->receiveEvent(e); } } diff --git a/projects/mtg/src/MTGCardInstance.cpp b/projects/mtg/src/MTGCardInstance.cpp index acd24623e..87832eb4f 100644 --- a/projects/mtg/src/MTGCardInstance.cpp +++ b/projects/mtg/src/MTGCardInstance.cpp @@ -182,7 +182,7 @@ void MTGCardInstance::tap(){ WEvent * e = NEW WEventCardTap(this, 0, 1); GameObserver * game = GameObserver::GetInstance(); game->receiveEvent(e); - delete e; + //delete e; } void MTGCardInstance::untap(){ @@ -191,7 +191,7 @@ void MTGCardInstance::untap(){ WEvent * e = NEW WEventCardTap(this, 1, 0); GameObserver * game = GameObserver::GetInstance(); game->receiveEvent(e); - delete e; + //delete e; } @@ -409,7 +409,7 @@ int MTGCardInstance::setAttacker(int value){ attacker = value; WEvent * e = NEW WEventCreatureAttacker(this,previousTarget, target); GameObserver::GetInstance()->receiveEvent(e); - delete e; + //delete e; return 1; } @@ -475,7 +475,7 @@ int MTGCardInstance::moveBlockerInRow(MTGCardInstance * blocker){ std::iter_swap(it1,it2); WEvent* e = NEW WEventCreatureBlockerRank(blocker,*it2,this); GameObserver::GetInstance()->receiveEvent(e); - delete(e); + //delete(e); return 1; } @@ -528,7 +528,7 @@ int MTGCardInstance::setDefenser(MTGCardInstance * opponent){ } g->blockersSorted = false; g->receiveEvent(e); - delete e; + //delete e; return 1; } diff --git a/projects/mtg/src/MTGGameZones.cpp b/projects/mtg/src/MTGGameZones.cpp index 38c844c56..2e9352f99 100644 --- a/projects/mtg/src/MTGGameZones.cpp +++ b/projects/mtg/src/MTGGameZones.cpp @@ -78,7 +78,7 @@ void MTGPlayerCards::drawFromLibrary(){ GameObserver *g = GameObserver::GetInstance(); WEvent * e = NEW WEventZoneChange(drownCard,library,hand); g->receiveEvent(e); - delete e; + //delete e; } } @@ -115,7 +115,7 @@ MTGCardInstance * MTGPlayerCards::putInPlay(MTGCardInstance * card){ GameObserver *g = GameObserver::GetInstance(); WEvent * e = NEW WEventZoneChange(copy, from, inPlay); g->receiveEvent(e); - delete e; + //delete e; return copy; } @@ -169,7 +169,7 @@ MTGCardInstance * MTGPlayerCards::putInZone(MTGCardInstance * card, MTGGameZone GameObserver *g = GameObserver::GetInstance(); WEvent * e = NEW WEventZoneChange(copy, from, to); g->receiveEvent(e); - delete e; + //delete e; return ret; } return card; //Error diff --git a/projects/mtg/src/PhaseRing.cpp b/projects/mtg/src/PhaseRing.cpp index dc2d60d5b..7b9b30e70 100644 --- a/projects/mtg/src/PhaseRing.cpp +++ b/projects/mtg/src/PhaseRing.cpp @@ -39,7 +39,7 @@ Phase * PhaseRing::forward(){ //Warn the layers about the phase Change WEvent * e = NEW WEventPhaseChange(cPhaseOld, *current); GameObserver::GetInstance()->receiveEvent(e); - delete e; + //delete e; return *current; }