From 314df20711d003b0be443a1e3e1ccf4fcb8652b4 Mon Sep 17 00:00:00 2001 From: Northmoc Date: Fri, 10 Sep 2021 10:33:07 -0400 Subject: [PATCH 1/5] enduring_angel_angelic_enforcer.txt --- .../enduring_angel_angelic_enforcer.txt | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 forge-gui/res/cardsfolder/upcoming/enduring_angel_angelic_enforcer.txt diff --git a/forge-gui/res/cardsfolder/upcoming/enduring_angel_angelic_enforcer.txt b/forge-gui/res/cardsfolder/upcoming/enduring_angel_angelic_enforcer.txt new file mode 100644 index 00000000000..11cebfb7dd1 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/enduring_angel_angelic_enforcer.txt @@ -0,0 +1,31 @@ +Name:Enduring Angel +ManaCost:2 W W W +Types:Creature Angel +PT:3/3 +K:Flying +K:Double Strike +S:Mode$ Continuous | Affected$ You | AddKeyword$ Hexproof | Description$ You have hexproof. +R:Event$ LifeReduced | ValidPlayer$ You | Result$ LE0 | ReplaceWith$ Transform | Description$ If your life total would be reduced to 0 or less, instead transform CARDNAME and your life total becomes 3. Then if CARDNAME didn't transform this way, you lose the game. +SVar:Transform:DB$ SetState | Defined$ Self | Mode$ Transform | RememberChanged$ True | SubAbility$ DBSetLife +SVar:DBSetLife:DB$ SetLife | Defined$ You | LifeAmount$ 3 | SubAbility$ DBLoseGame +SVar:DBLoseGame:DB$ LosesGame | Defined$ You | ConditionDefined$ Remembered | ConditionPresent$ Card | ConditionCompare$ NE1 | SubAbility$ DBCleanup +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +AlternateMode:DoubleFaced +Oracle:Flying, double strike\nYou have hexproof.\nIf your life total would be reduced to 0 or less, instead transform Enduring Angel and your life total becomes 3. Then if Enduring Angel didn't transform this way, you lose the game. + +ALTERNATE + +Name:Angelic Enforcer +ManaCost:no cost +Colors:white +Types:Creature Angel +PT:*/* +K:Flying +S:Mode$ Continuous | Affected$ You | AddKeyword$ Hexproof | Description$ You have hexproof. +S:Mode$ Continuous | EffectZone$ All | CharacteristicDefining$ True | SetPower$ X | SetToughness$ X | Description$ CARDNAME's power and toughness are each equal to your life total. +T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigDoubleLife | TriggerDescription$ Whenever CARDNAME attacks, double your life total. +SVar:TrigDoubleLife:DB$ GainLife | LifeAmount$ X +SVar:X:Count$YourLifeTotal +SVar:HasAttackEffect:TRUE +DeckHas:Ability$LifeGain +Oracle:Flying\nYou have hexproof.\nAngelic Enforcer's power and toughness are each equal to your life total.\nWhenever Angelic Enforcer attacks, double your life total. From 0df55264522fbd9344994f35155cb79f33d12d9c Mon Sep 17 00:00:00 2001 From: Northmoc Date: Fri, 10 Sep 2021 10:42:58 -0400 Subject: [PATCH 2/5] add ReplaceLifeReduced --- .../game/replacement/ReplaceLifeReduced.java | 44 +++++++++++++++++++ .../game/replacement/ReplacementType.java | 1 + 2 files changed, 45 insertions(+) create mode 100644 forge-game/src/main/java/forge/game/replacement/ReplaceLifeReduced.java diff --git a/forge-game/src/main/java/forge/game/replacement/ReplaceLifeReduced.java b/forge-game/src/main/java/forge/game/replacement/ReplaceLifeReduced.java new file mode 100644 index 00000000000..d6b6f770ec7 --- /dev/null +++ b/forge-game/src/main/java/forge/game/replacement/ReplaceLifeReduced.java @@ -0,0 +1,44 @@ +package forge.game.replacement; + +import java.util.Map; + +import forge.game.ability.AbilityKey; +import forge.game.card.Card; +import forge.util.Expressions; + +/** + * TODO: Write javadoc for this type. + * + */ +public class ReplaceLifeReduced extends ReplacementEffect { + + /** + * Instantiates a new replace life reduced. + * + * @param map the map + * @param host the host + */ + public ReplaceLifeReduced(Map map, Card host, boolean intrinsic) { + super(map, host, intrinsic); + } + + /* (non-Javadoc) + * @see forge.card.replacement.ReplacementEffect#canReplace(java.util.HashMap) + */ + @Override + public boolean canReplace(Map runParams) { + if (!matchesValidParam("ValidPlayer", runParams.get(AbilityKey.Affected))) { + return false; + } + if (hasParam("Result")) { + final int n = (Integer)runParams.get(AbilityKey.Result); + String comparator = getParam("Result"); + final String operator = comparator.substring(0, 2); + final int operandValue = Integer.parseInt(comparator.substring(2)); + if (!Expressions.compare(n, operator, operandValue)) { + return false; + } + } + return true; + } +} diff --git a/forge-game/src/main/java/forge/game/replacement/ReplacementType.java b/forge-game/src/main/java/forge/game/replacement/ReplacementType.java index 335564f6c62..4a15d9aa846 100644 --- a/forge-game/src/main/java/forge/game/replacement/ReplacementType.java +++ b/forge-game/src/main/java/forge/game/replacement/ReplacementType.java @@ -29,6 +29,7 @@ public enum ReplacementType { GainLife(ReplaceGainLife.class), GameLoss(ReplaceGameLoss.class), Learn(ReplaceLearn.class), + LifeReduced(ReplaceLifeReduced.class), Mill(ReplaceMill.class), Moved(ReplaceMoved.class), ProduceMana(ReplaceProduceMana.class), From be9c1d7c91173b1242eb9d7af7d5fa29fed0018c Mon Sep 17 00:00:00 2001 From: Northmoc Date: Fri, 10 Sep 2021 10:43:20 -0400 Subject: [PATCH 3/5] fix desc --- .../src/main/java/forge/game/replacement/ReplaceGameLoss.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-game/src/main/java/forge/game/replacement/ReplaceGameLoss.java b/forge-game/src/main/java/forge/game/replacement/ReplaceGameLoss.java index c39f669d26e..0b3d35d3e33 100644 --- a/forge-game/src/main/java/forge/game/replacement/ReplaceGameLoss.java +++ b/forge-game/src/main/java/forge/game/replacement/ReplaceGameLoss.java @@ -12,7 +12,7 @@ import forge.game.card.Card; public class ReplaceGameLoss extends ReplacementEffect { /** - * Instantiates a new replace gain life. + * Instantiates a new replace game loss. * * @param map the map * @param host the host From eb25257a182327924461f2b5ab616cf4ffa038b4 Mon Sep 17 00:00:00 2001 From: Northmoc Date: Fri, 10 Sep 2021 10:45:39 -0400 Subject: [PATCH 4/5] Player.java - add replacement to loseLife --- forge-game/src/main/java/forge/game/player/Player.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/forge-game/src/main/java/forge/game/player/Player.java b/forge-game/src/main/java/forge/game/player/Player.java index 3a6ae63f5e8..963ed5be703 100644 --- a/forge-game/src/main/java/forge/game/player/Player.java +++ b/forge-game/src/main/java/forge/game/player/Player.java @@ -551,6 +551,13 @@ public class Player extends GameEntity implements Comparable { } if (toLose > 0) { int oldLife = life; + // Run applicable replacement effects + final Map repParams = AbilityKey.mapFromAffected(this); + repParams.put(AbilityKey.Result, oldLife-toLose); + if (game.getReplacementHandler().run(ReplacementType.LifeReduced, repParams) + != ReplacementResult.NotReplaced) { + return 0; + } life -= toLose; view.updateLife(this); lifeLost = toLose; From 60d4d143204dcc69bd9d02181ad2c98b3ad7c41e Mon Sep 17 00:00:00 2001 From: Northmoc Date: Sat, 11 Sep 2021 22:58:59 -0400 Subject: [PATCH 5/5] SetLife instead of GainLife --- forge-gui/res/cardsfolder/b/beacon_of_immortality.txt | 7 +++---- forge-gui/res/cardsfolder/r/revival_revenge.txt | 9 +++++---- .../upcoming/enduring_angel_angelic_enforcer.txt | 4 ++-- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/forge-gui/res/cardsfolder/b/beacon_of_immortality.txt b/forge-gui/res/cardsfolder/b/beacon_of_immortality.txt index 6311a3817fd..8294d127e6f 100644 --- a/forge-gui/res/cardsfolder/b/beacon_of_immortality.txt +++ b/forge-gui/res/cardsfolder/b/beacon_of_immortality.txt @@ -1,8 +1,7 @@ Name:Beacon of Immortality ManaCost:5 W Types:Instant -A:SP$ GainLife | Cost$ 5 W | ValidTgts$ Player | TgtPrompt$ Select target player | LifeAmount$ X | SubAbility$ DBShuffle | SpellDescription$ Double target player's life total. Shuffle CARDNAME into its owner's library. -SVar:DBShuffle:DB$ChangeZone | Origin$ Stack | Destination$ Library | Shuffle$ True -SVar:X:TargetedPlayer$LifeTotal -SVar:Picture:http://www.wizards.com/global/images/magic/general/beacon_of_immortality.jpg +A:SP$ SetLife | ValidTgts$ Player | TgtPrompt$ Select target player | LifeAmount$ X | SubAbility$ DBShuffle | SpellDescription$ Double target player's life total. Shuffle CARDNAME into its owner's library. +SVar:DBShuffle:DB$ ChangeZone | Origin$ Stack | Destination$ Library | Shuffle$ True +SVar:X:TargetedPlayer$LifeTotal/Twice Oracle:Double target player's life total. Shuffle Beacon of Immortality into its owner's library. diff --git a/forge-gui/res/cardsfolder/r/revival_revenge.txt b/forge-gui/res/cardsfolder/r/revival_revenge.txt index 0c21541fdc5..00c1c485b06 100644 --- a/forge-gui/res/cardsfolder/r/revival_revenge.txt +++ b/forge-gui/res/cardsfolder/r/revival_revenge.txt @@ -1,8 +1,9 @@ Name:Revival ManaCost:WB WB -AlternateMode: Split +AlternateMode:Split Types:Sorcery -A:SP$ ChangeZone | Cost$ WB WB | Origin$ Graveyard | Destination$ Battlefield | TgtPrompt$ Choose target creature in your graveyard | ValidTgts$ Creature.YouOwn+cmcLE3 | SpellDescription$ Return target creature card with mana value 3 or less from your graveyard to the battlefield. +A:SP$ ChangeZone | Origin$ Graveyard | Destination$ Battlefield | TgtPrompt$ Select target creature card in your graveyard with mana value 3 or less | ValidTgts$ Creature.YouOwn+cmcLE3 | SpellDescription$ Return target creature card with mana value 3 or less from your graveyard to the battlefield. +DeckHas:Ability$Graveyard Oracle:Return target creature card with mana value 3 or less from your graveyard to the battlefield. ALTERNATE @@ -10,8 +11,8 @@ ALTERNATE Name:Revenge ManaCost:4 W B Types:Sorcery -A:SP$ GainLife | Cost$ 4 W B | LifeAmount$ X | SubAbility$ DBLoseHalf | SpellDescription$ Double your life total. Target opponent loses half their life, rounded up. +A:SP$ SetLife | LifeAmount$ X | SubAbility$ DBLoseHalf | SpellDescription$ Double your life total. Target opponent loses half their life, rounded up. SVar:DBLoseHalf:DB$ LoseLife | ValidTgts$ Opponent | LifeAmount$ Y -SVar:X:Count$YourLifeTotal +SVar:X:Count$YourLifeTotal/Twice SVar:Y:Count$TargetedLifeTotal/HalfUp Oracle:Double your life total. Target opponent loses half their life, rounded up. diff --git a/forge-gui/res/cardsfolder/upcoming/enduring_angel_angelic_enforcer.txt b/forge-gui/res/cardsfolder/upcoming/enduring_angel_angelic_enforcer.txt index 11cebfb7dd1..9848f14e4bc 100644 --- a/forge-gui/res/cardsfolder/upcoming/enduring_angel_angelic_enforcer.txt +++ b/forge-gui/res/cardsfolder/upcoming/enduring_angel_angelic_enforcer.txt @@ -24,8 +24,8 @@ K:Flying S:Mode$ Continuous | Affected$ You | AddKeyword$ Hexproof | Description$ You have hexproof. S:Mode$ Continuous | EffectZone$ All | CharacteristicDefining$ True | SetPower$ X | SetToughness$ X | Description$ CARDNAME's power and toughness are each equal to your life total. T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigDoubleLife | TriggerDescription$ Whenever CARDNAME attacks, double your life total. -SVar:TrigDoubleLife:DB$ GainLife | LifeAmount$ X +SVar:TrigDoubleLife:DB$ SetLife | LifeAmount$ Y SVar:X:Count$YourLifeTotal +SVar:Y:Count$YourLifeTotal/Twice SVar:HasAttackEffect:TRUE -DeckHas:Ability$LifeGain Oracle:Flying\nYou have hexproof.\nAngelic Enforcer's power and toughness are each equal to your life total.\nWhenever Angelic Enforcer attacks, double your life total.