diff --git a/projects/mtg/include/MTGAbility.h b/projects/mtg/include/MTGAbility.h index 11814fe8e..7c1f94dd2 100644 --- a/projects/mtg/include/MTGAbility.h +++ b/projects/mtg/include/MTGAbility.h @@ -274,8 +274,9 @@ class ActivatedAbility:public MTGAbility{ virtual int reactToClick(MTGCardInstance * card); virtual int isReactingToClick(MTGCardInstance * card, ManaCost * mana = NULL); virtual int reactToTargetClick(Targetable * object); + virtual int activateAbility(); virtual int resolve() = 0; - void activeSideEffect(); + void activateSideEffect(); virtual ActivatedAbility* clone() const = 0; virtual ostream& toString(ostream& out) const; }; diff --git a/projects/mtg/src/AllAbilities.cpp b/projects/mtg/src/AllAbilities.cpp index 144ce8799..6f80df016 100644 --- a/projects/mtg/src/AllAbilities.cpp +++ b/projects/mtg/src/AllAbilities.cpp @@ -2938,14 +2938,22 @@ void APhaseAction::Update(float dt) { if(newPhase == phase && next ) { - MTGCardInstance * _target = (MTGCardInstance *) target; + MTGCardInstance * _target = NULL; + if(target) + _target = (MTGCardInstance *) target; if (_target) { while (_target->next) _target = _target->next; } - if(!sAbility.size()) + if(!sAbility.size() || !target || !_target->isInPlay()) { + //im aware that adding the isinplay check restricts this ability to having targets + //which are in play..however after reviewing all the coded cards which use this + //none of them targeted this effect at something that is not inplay. + //the reason for this abilities that use this are generally combat abilities, and + //without this check, the ability contenues on forever, when used in a trigger which + //sets its ability to oneshot=0. this->forceDestroy = 1; return; } diff --git a/projects/mtg/src/MTGAbility.cpp b/projects/mtg/src/MTGAbility.cpp index 63dc519f0..6ae5c3918 100644 --- a/projects/mtg/src/MTGAbility.cpp +++ b/projects/mtg/src/MTGAbility.cpp @@ -4091,49 +4091,7 @@ int ActivatedAbility::reactToClick(MTGCardInstance * card) abilityCost = previousManaPool->Diff(player->getManaPool()); delete previousManaPool; } - MTGAbility * fmp = NULL; - if(GenericActivatedAbility * gaa = dynamic_cast(this)) - { - AForeach * fea = dynamic_cast(gaa->ability); - if(fea) - fmp = fea->ability; - } - //taking foreach manaproducers off the stack and sending tapped for mana events. - AManaProducer * amp = dynamic_cast (fmp); - if(amp) - { - needsTapping = amp->tap; - } - if (needsTapping && source->isInPlay()) - { - if (amp) - { - GameObserver *g = GameObserver::GetInstance(); - WEvent * e = NEW WEventCardTappedForMana(source, 0, 1); - g->receiveEvent(e); - } - source->tap(); - } - if (amp) - { - counters++; - if(sideEffect && usesBeforeSideEffects.size()) - { - activeSideEffect(); - } - this->resolve(); - return 1; - } - if (needsTapping && source->isInPlay()) - source->tap(); - counters++; - if(sideEffect && usesBeforeSideEffects.size()) - { - activeSideEffect(); - } - fireAbility(); - return 1; - + return ActivatedAbility::activateAbility(); } int ActivatedAbility::reactToTargetClick(Targetable * object) @@ -4157,7 +4115,20 @@ int ActivatedAbility::reactToTargetClick(Targetable * object) abilityCost = previousManaPool->Diff(player->getManaPool()); delete previousManaPool; } - AManaProducer * amp = dynamic_cast (this); + return ActivatedAbility::activateAbility(); +} + +int ActivatedAbility::activateAbility() +{ + MTGAbility * fmp = NULL; + if(GenericActivatedAbility * gaa = dynamic_cast(this)) + { + AForeach * fea = dynamic_cast(gaa->ability); + if(fea) + fmp = fea->ability; + } + //taking foreach manaproducers off the stack and sending tapped for mana events. + AManaProducer * amp = dynamic_cast (fmp); if(amp) { needsTapping = amp->tap; @@ -4177,22 +4148,23 @@ int ActivatedAbility::reactToTargetClick(Targetable * object) counters++; if(sideEffect && usesBeforeSideEffects.size()) { - activeSideEffect(); + activateSideEffect(); } this->resolve(); return 1; } + if (needsTapping && source->isInPlay()) + source->tap(); counters++; if(sideEffect && usesBeforeSideEffects.size()) { - activeSideEffect(); + activateSideEffect(); } fireAbility(); return 1; - } -void ActivatedAbility::activeSideEffect() +void ActivatedAbility::activateSideEffect() { WParsedInt * use = NEW WParsedInt(usesBeforeSideEffects.c_str(),NULL,source); uses = use->getValue();