diff --git a/projects/mtg/bin/Res/sets/primitives/borderline.txt b/projects/mtg/bin/Res/sets/primitives/borderline.txt index 6e37b9424..069a8f3ce 100644 --- a/projects/mtg/bin/Res/sets/primitives/borderline.txt +++ b/projects/mtg/bin/Res/sets/primitives/borderline.txt @@ -81333,8 +81333,11 @@ toughness=3 [card] name=Spark Rupture auto=draw:1 controller -auto=lord(planeswalker[counter{0/0.1.Loyatly}]|battlefield) loseabilities -auto=lord(planeswalker[counter{0/0.1.Loyatly}]|battlefield) transforms((Creature,setpower=hascntloyalty,settoughness=hascntloyalty)) +auto=lord(planeswalker[counter{0/0.1.Loyalty}]|battlefield) loseabilities +auto=lord(planeswalker[counter{0/0.1.Loyalty}]|battlefield) noloyaltydamage +auto=lord(planeswalker[counter{0/0.1.Loyalty}]|battlefield) transforms((Creature,setpower=hascntloyalty,settoughness=hascntloyalty)) +auto=@counterremoved(0/0,1,Loyalty) from(planeswalker[counter{0/0.1.Loyalty}]|battlefield):lord(planeswalker[counter{0/0.1.Loyalty}]|battlefield) transforms((Creature,setpower=hascntloyalty,settoughness=hascntloyalty)) +auto=@counteradded(0/0,1,Loyalty) from(planeswalker[counter{0/0.1.Loyalty}]|battlefield):lord(planeswalker[counter{0/0.1.Loyalty}]|battlefield) transforms((Creature,setpower=hascntloyalty,settoughness=hascntloyalty)) text=When Spark Rupture enters the battlefield, draw a card. -- Each planeswalker with one or more loyalty counters on it loses all abilities and is a creature with power and toughness each equal to the number of loyalty counters on it. mana={2}{W} type=Enchantment @@ -90712,7 +90715,7 @@ otherrestriction=can play equipment,compare(isflipped)~equalto~1 restriction=compare(isflipped)~equalto~0 anyzone={0}:doubleside(Toralf's Hammer) autostack=if paid(alternative) then flip(Toralf's Hammer) forcetype(Legendary Artifact) -auto=@noncombatdamaged(*[creature;planeswalker]|opponentbattlefield) restriction{compare(isflipped)~equalto~0}:name(Deals damage) target(player,creature,planeswalker) damage:excessdamage +auto=@noncombatdamaged(*[creature;planeswalker]|opponentbattlefield) restriction{compare(isflipped)~equalto~0,compare(excessdamage)~morethan~0}:name(Deals damage) target(player,creature,planeswalker) damage:excessdamage text=Trample -- Whenever a creature or planeswalker an opponent controls is dealt excess noncombat damage, Toralf, God of Fury deals damage equal to the excess to any target other than that permanent. // {1}{R} Toralf's Hammer mana={2}{R}{R} type=Legendary Creature diff --git a/projects/mtg/include/AllAbilities.h b/projects/mtg/include/AllAbilities.h index 8e31178e8..00ff5063b 100644 --- a/projects/mtg/include/AllAbilities.h +++ b/projects/mtg/include/AllAbilities.h @@ -1240,6 +1240,10 @@ public: e->damage->target->exceededDamage = e->damage->target->life; e->damage->source->exceededDamage = e->damage->target->life; this->source->exceededDamage = e->damage->target->life; + } else { + e->damage->target->exceededDamage = 0; + e->damage->source->exceededDamage = 0; + this->source->exceededDamage = 0; } triggeredTurn = game->turn; diff --git a/projects/mtg/include/Damage.h b/projects/mtg/include/Damage.h index 213b44a93..2c8507709 100644 --- a/projects/mtg/include/Damage.h +++ b/projects/mtg/include/Damage.h @@ -33,7 +33,7 @@ public: DamageableType type_as_damageable; Damageable(GameObserver* observer, int _life) : Targetable(observer), life(_life), handsize(0), - poisonCount(0), damageCount(0), preventable(0), thatmuch(0), + poisonCount(0), damageCount(0), preventable(0), thatmuch(0), exceededDamage(0), lifeLostThisTurn(0), lifeGainedThisTurn(0), type_as_damageable(DAMAGEABLE_MTGCARDINSTANCE) {} int getLife(){return life;} diff --git a/projects/mtg/include/MTGDefinitions.h b/projects/mtg/include/MTGDefinitions.h index 1f9a85177..e5ab76d80 100644 --- a/projects/mtg/include/MTGDefinitions.h +++ b/projects/mtg/include/MTGDefinitions.h @@ -341,7 +341,9 @@ class Constants NODAMAGEREMOVED = 213, BACKGROUNDPARTNER = 214, BOTTOMLIBRARYDEATH = 215, - NB_BASIC_ABILITIES = 216, + NOLOYALTYDAMAGE = 216, + NODEFENSEDAMAGE = 217, + NB_BASIC_ABILITIES = 218, RARITY_S = 'S', //Special Rarity RARITY_M = 'M', //Mythics diff --git a/projects/mtg/src/AllAbilities.cpp b/projects/mtg/src/AllAbilities.cpp index 100b3975a..770047103 100644 --- a/projects/mtg/src/AllAbilities.cpp +++ b/projects/mtg/src/AllAbilities.cpp @@ -3962,8 +3962,18 @@ ADrawReplacer::~ADrawReplacer() int AAResetDamage::resolve() { MTGCardInstance * _target = (MTGCardInstance *)target; - if(!_target->has(Constants::NODAMAGEREMOVED)) // Added to avoid damage is removed from a card (e.g. "Patient Zero"). - _target->life = _target->toughness; + if(!_target->has(Constants::NODAMAGEREMOVED)){ // Added to avoid damage is removed from a card (e.g. "Patient Zero"). + if (!_target->isCreature() && _target->hasType(Subtypes::TYPE_PLANESWALKER)){ // Fix life calculation for planeswalker damage. + if (_target->counters && _target->counters->hasCounter("loyalty", 0, 0)) { + _target->life = _target->counters->hasCounter("loyalty", 0, 0)->nb; + } + } else if (!_target->isCreature() && _target->hasType(Subtypes::TYPE_BATTLE)){ // Fix life calculation for battle damage. + if (_target->counters && _target->counters->hasCounter("defense", 0, 0)) { + _target->life = _target->counters->hasCounter("defense", 0, 0)->nb; + } + } else + _target->life = _target->toughness; + } return 1; } @@ -7824,6 +7834,9 @@ int ATransformer::addToGame() else _target->addbaseT(val->getValue()); delete val; + + if(_target->isCreature() && (_target->hasType(Subtypes::TYPE_BATTLE) || _target->hasType(Subtypes::TYPE_PLANESWALKER)) && _target->life > _target->toughness) + _target->life = _target->toughness; // Fix for a Planeswalker or a Battle that becomes a creature (e.g. "Spark Rupture"). } //remove manacost if(removemc) diff --git a/projects/mtg/src/CardDescriptor.cpp b/projects/mtg/src/CardDescriptor.cpp index dac9630c9..805c5a1f9 100644 --- a/projects/mtg/src/CardDescriptor.cpp +++ b/projects/mtg/src/CardDescriptor.cpp @@ -189,7 +189,7 @@ MTGCardInstance * CardDescriptor::match_or(MTGCardInstance * card) if (powerComparisonMode && !valueInRange(powerComparisonMode, card->getPower(), power)) return NULL; if (toughnessComparisonMode){ // Toughness comparison has a different meaning for planeswalkers and battles. - if(card->counters && (card->hasType(Subtypes::TYPE_PLANESWALKER) || card->hasType(Subtypes::TYPE_BATTLE))){ + if(!card->isCreature() && card->counters && (card->hasType(Subtypes::TYPE_PLANESWALKER) || card->hasType(Subtypes::TYPE_BATTLE))){ for(size_t i = 0; i < card->counters->counters.size(); ++i){ if((card->counters->counters[i]->name == "loyalty" && card->hasType(Subtypes::TYPE_PLANESWALKER)) || (card->counters->counters[i]->name == "defense" && card->hasType(Subtypes::TYPE_BATTLE))){ if(!valueInRange(toughnessComparisonMode, card->counters->counters[i]->nb, toughness)) @@ -246,7 +246,7 @@ MTGCardInstance * CardDescriptor::match_and(MTGCardInstance * card) if (powerComparisonMode && !valueInRange(powerComparisonMode, card->getPower(), power)) match = NULL; if (toughnessComparisonMode){ // Toughness comparison has a different meaning for planeswalkers and battles. - if(card->counters && (card->hasType(Subtypes::TYPE_PLANESWALKER) || card->hasType(Subtypes::TYPE_BATTLE))){ + if(!card->isCreature() && card->counters && (card->hasType(Subtypes::TYPE_PLANESWALKER) || card->hasType(Subtypes::TYPE_BATTLE))){ for(size_t i = 0; i < card->counters->counters.size(); ++i){ if((card->counters->counters[i]->name == "loyalty" && card->hasType(Subtypes::TYPE_PLANESWALKER)) || (card->counters->counters[i]->name == "defense" && card->hasType(Subtypes::TYPE_BATTLE))){ if(!valueInRange(toughnessComparisonMode, card->counters->counters[i]->nb, toughness)) diff --git a/projects/mtg/src/Damage.cpp b/projects/mtg/src/Damage.cpp index cf7a4f30a..b92f90a47 100644 --- a/projects/mtg/src/Damage.cpp +++ b/projects/mtg/src/Damage.cpp @@ -297,32 +297,6 @@ int Damage::resolve() observer->setLoser(((MTGCardInstance*)source)->controller()->opponent()); } } - - if (target->type_as_damageable == Damageable::DAMAGEABLE_MTGCARDINSTANCE && ((MTGCardInstance*)target)->hasType(Subtypes::TYPE_PLANESWALKER)){ // Fix life calculation for planeswalker damage. - if (((MTGCardInstance*)target)->counters){ - Counters * counters = ((MTGCardInstance*)target)->counters; - for(size_t i = 0; i < counters->counters.size(); ++i){ - Counter * counter = counters->counters[i]; - if(counter->name == "loyalty"){ - target->life = counter->nb - target->damageCount; - break; - } - } - } - } - - if (target->type_as_damageable == Damageable::DAMAGEABLE_MTGCARDINSTANCE && ((MTGCardInstance*)target)->hasType(Subtypes::TYPE_BATTLE)){ // Fix life calculation for battle damage. - if (((MTGCardInstance*)target)->counters){ - Counters * counters = ((MTGCardInstance*)target)->counters; - for(size_t i = 0; i < counters->counters.size(); ++i){ - Counter * counter = counters->counters[i]; - if(counter->name == "defense"){ - target->life = counter->nb - target->damageCount; - break; - } - } - } - } //Send (Damage/Replaced effect) event to listeners observer->receiveEvent(e); return a; diff --git a/projects/mtg/src/GameObserver.cpp b/projects/mtg/src/GameObserver.cpp index c4f4d61b3..49851d97a 100644 --- a/projects/mtg/src/GameObserver.cpp +++ b/projects/mtg/src/GameObserver.cpp @@ -738,6 +738,17 @@ void GameObserver::gameStateBasedEffects() card->mPropertiesChangedSinceLastUpdate = false; if(card->hasType(Subtypes::TYPE_PLANESWALKER) && (!card->counters||!card->counters->hasCounter("loyalty",0,0))) players[i]->game->putInGraveyard(card); + if(card->hasType(Subtypes::TYPE_BATTLE) && (!card->counters||!card->counters->hasCounter("defense",0,0))){ + if(!card->isDefeated){ + card->isDefeated = true; + WEvent * e = NEW WEventCardDefeated(card); + receiveEvent(e); + } + } + if(!card->isCreature() && card->hasType(Subtypes::TYPE_PLANESWALKER) && card->counters->hasCounter("loyalty", 0, 0)) + card->life = card->counters->hasCounter("loyalty", 0, 0)->nb; + if(!card->isCreature() && card->hasType(Subtypes::TYPE_BATTLE) && card->counters->hasCounter("defense", 0, 0)) + card->life = card->counters->hasCounter("defense", 0, 0)->nb; if(card->myPair && !isInPlay(card->myPair)) { card->myPair->myPair = NULL; diff --git a/projects/mtg/src/MTGDefinitions.cpp b/projects/mtg/src/MTGDefinitions.cpp index 3fa1f1ce7..2809e3792 100644 --- a/projects/mtg/src/MTGDefinitions.cpp +++ b/projects/mtg/src/MTGDefinitions.cpp @@ -246,7 +246,9 @@ const char* Constants::MTGBasicAbilities[] = { "nonight", //It can't become night (e.g. "Angel of Eternal Dawn"). "nodamageremoved", //Damage is not removed from card (e.g. "Patient Zero"). "backgroundpartner", //Can choose a backgorund partner as commander (e.g. "Faceless One"). - "bottomlibrarydeath" //It goes to bottom of library after death (e.g. "Quintorius, Loremaster"). + "bottomlibrarydeath", //It goes to bottom of library after death (e.g. "Quintorius, Loremaster"). + "noloyaltydamage", //Damage does not cause loyalty counter to be removed from a Planeswalker (e.g. "Spark Rupture"). + "nodefensedamage" //Damage does not cause defense counter to be removed from a Battle. }; map Constants::MTGBasicAbilitiesMap; diff --git a/projects/mtg/src/MTGRules.cpp b/projects/mtg/src/MTGRules.cpp index e27feb348..1992fbb6b 100644 --- a/projects/mtg/src/MTGRules.cpp +++ b/projects/mtg/src/MTGRules.cpp @@ -3970,8 +3970,11 @@ int MTGPlaneswalkerDamage::receiveEvent(WEvent * event) int howMany = d->damage; for(int k = 0; k < howMany; k++) { - card->counters->removeCounter("loyalty", 0, 0); + if(!card->basicAbilities[Constants::NOLOYALTYDAMAGE]) + card->counters->removeCounter("loyalty", 0, 0); } + if(!card->isCreature() && card->counters->hasCounter("loyalty", 0, 0)) + card->life = card->counters->hasCounter("loyalty", 0, 0)->nb; return 1; } if (d->damage > 0 && card && card->hasType(Subtypes::TYPE_BATTLE)) @@ -3979,8 +3982,11 @@ int MTGPlaneswalkerDamage::receiveEvent(WEvent * event) int howMany = d->damage; for(int k = 0; k < howMany; k++) { - card->counters->removeCounter("defense", 0, 0); + if(!card->basicAbilities[Constants::NODEFENSEDAMAGE]) + card->counters->removeCounter("defense", 0, 0); } + if(!card->isCreature() && card->counters->hasCounter("defense", 0, 0)) + card->life = card->counters->hasCounter("defense", 0, 0)->nb; return 1; } }