From f0964d9af8f2959af1fb4f341f88f407ffb77545 Mon Sep 17 00:00:00 2001 From: "wagic.the.homebrew" Date: Mon, 10 Oct 2011 12:29:52 +0000 Subject: [PATCH] Fix issue 563 (double strike VS regenerate) -- also made "blocked" variable a private. --- projects/mtg/bin/Res/test/_tests.txt | 1 + .../bin/Res/test/{bugs => }/double_strike_vs_regen_i563.txt | 2 -- projects/mtg/include/AllAbilities.h | 4 ++-- projects/mtg/include/MTGCardInstance.h | 4 +++- projects/mtg/src/ExtraCost.cpp | 2 +- projects/mtg/src/GuiCombat.cpp | 2 +- projects/mtg/src/MTGCardInstance.cpp | 5 ++++- projects/mtg/src/MTGRules.cpp | 4 ++-- 8 files changed, 14 insertions(+), 10 deletions(-) rename projects/mtg/bin/Res/test/{bugs => }/double_strike_vs_regen_i563.txt (93%) diff --git a/projects/mtg/bin/Res/test/_tests.txt b/projects/mtg/bin/Res/test/_tests.txt index 6df7f5b85..825430819 100644 --- a/projects/mtg/bin/Res/test/_tests.txt +++ b/projects/mtg/bin/Res/test/_tests.txt @@ -259,6 +259,7 @@ divergent_growth.txt doomed_necromancer.txt double_strike_i145.txt double_strike2_i145.txt +double_strike_vs_regen_i563.txt dragon_broodmother_i491.txt dragon_fodder.txt dragon_fodder2.txt diff --git a/projects/mtg/bin/Res/test/bugs/double_strike_vs_regen_i563.txt b/projects/mtg/bin/Res/test/double_strike_vs_regen_i563.txt similarity index 93% rename from projects/mtg/bin/Res/test/bugs/double_strike_vs_regen_i563.txt rename to projects/mtg/bin/Res/test/double_strike_vs_regen_i563.txt index c5b0ed4bd..3c3249ec4 100644 --- a/projects/mtg/bin/Res/test/bugs/double_strike_vs_regen_i563.txt +++ b/projects/mtg/bin/Res/test/double_strike_vs_regen_i563.txt @@ -19,8 +19,6 @@ Drudge skeletons next #damage first strike next -#damage -next #end of combat [ASSERT] COMBATEND diff --git a/projects/mtg/include/AllAbilities.h b/projects/mtg/include/AllAbilities.h index aaa6571aa..dd3ebbcdc 100644 --- a/projects/mtg/include/AllAbilities.h +++ b/projects/mtg/include/AllAbilities.h @@ -458,7 +458,7 @@ public: { if (!notblocked->card->didattacked) return 0; - if (notblocked->card->blocked) + if (notblocked->card->isBlocked()) return 0; if (!tc->canTarget(notblocked->card)) return 0; @@ -470,7 +470,7 @@ public: { if (!attackblocked->card->didattacked) return 0; - if (!attackblocked->card->blocked) + if (!attackblocked->card->isBlocked()) return 0; if (fromTc && !fromTc->canTarget(attackblocked->opponent)) return 0; diff --git a/projects/mtg/include/MTGCardInstance.h b/projects/mtg/include/MTGCardInstance.h index 2d1fe3f85..a7e67fe69 100644 --- a/projects/mtg/include/MTGCardInstance.h +++ b/projects/mtg/include/MTGCardInstance.h @@ -30,6 +30,8 @@ class MTGCardInstance: public CardPrimitive, public MTGCard, public Damageable #endif { +private: + bool blocked; //Blocked this turn or not? protected: int untapping; int nb_damages; @@ -128,7 +130,7 @@ public: //dangerranking is a hint to Ai which creatures are the ones it should be targetting for effects. int DangerRanking(); //Combat - bool blocked; //Blocked this turn or not? + bool isBlocked() {return blocked;}; //Blocked this turn or not? MTGCardInstance * defenser; listblockers; int attacker; diff --git a/projects/mtg/src/ExtraCost.cpp b/projects/mtg/src/ExtraCost.cpp index b9d25bbda..128ac37a6 100644 --- a/projects/mtg/src/ExtraCost.cpp +++ b/projects/mtg/src/ExtraCost.cpp @@ -503,7 +503,7 @@ ExtraCost("Select unblocked attacker", _tc) int Ninja::isPaymentSet() { - if (target && ((target->isAttacker() && target->blocked) || + if (target && ((target->isAttacker() && target->isBlocked()) || target->isAttacker() < 1 || target->getObserver()->getCurrentGamePhase() != Constants::MTG_PHASE_COMBATBLOCKERS)) { diff --git a/projects/mtg/src/GuiCombat.cpp b/projects/mtg/src/GuiCombat.cpp index bc35d592d..e93603c2b 100644 --- a/projects/mtg/src/GuiCombat.cpp +++ b/projects/mtg/src/GuiCombat.cpp @@ -429,7 +429,7 @@ int GuiCombat::resolve() // Returns the number of damage objects dealt this turn dmg -= (*q)->sumDamages(); } - if (dmg > 0 && ((!attacker->blocked) || attacker->has(Constants::TRAMPLE))) + if (dmg > 0 && ((!attacker->isBlocked()) || attacker->has(Constants::TRAMPLE))) stack->Add(NEW Damage(observer, (*it)->card, observer->opponent(), dmg, DAMAGE_COMBAT)); for (vector::iterator d = (*it)->damages.begin(); d != (*it)->damages.end(); ++d) stack->Add(NEW Damage(*d)); diff --git a/projects/mtg/src/MTGCardInstance.cpp b/projects/mtg/src/MTGCardInstance.cpp index cd2c5fa05..62e069d51 100644 --- a/projects/mtg/src/MTGCardInstance.cpp +++ b/projects/mtg/src/MTGCardInstance.cpp @@ -791,7 +791,10 @@ int MTGCardInstance::getDefenserRank(MTGCardInstance * blocker) int MTGCardInstance::removeBlocker(MTGCardInstance * blocker) { blockers.remove(blocker); - if (!blockers.size()) + // Blockers can be removed "manually" (by the blocking player) at the Blockers step, + // Or "automatically" in the damage phase, when they die and regenerate (see http://code.google.com/p/wagic/issues/detail?id=563 ) + // In the second case, we still want the card to be marked as "blocked" this turn + if (!blockers.size() && observer->currentGamePhase == Constants::MTG_PHASE_COMBATBLOCKERS) { blocked = false; } diff --git a/projects/mtg/src/MTGRules.cpp b/projects/mtg/src/MTGRules.cpp index 301d0e4fb..d032f1ace 100644 --- a/projects/mtg/src/MTGRules.cpp +++ b/projects/mtg/src/MTGRules.cpp @@ -1355,12 +1355,12 @@ int MTGCombatTriggersRule::receiveEvent(WEvent *e) for (int i = 0; i < z->nb_cards; i++) { MTGCardInstance * card = z->cards[i]; - if (card && card->isAttacker() && !card->blocked) + if (card && card->isAttacker() && !card->isBlocked()) { card->eventattackednotblocked(); card->notblocked = 1; } - if (card && card->isAttacker() && card->blocked) + if (card && card->isAttacker() && card->isBlocked()) { MTGCardInstance * opponent = card->getNextOpponent();