From 4bae4c7491ee1018d13e940ca571859a0e1b32c6 Mon Sep 17 00:00:00 2001 From: Agetian Date: Wed, 18 Apr 2018 09:25:58 +0300 Subject: [PATCH 01/12] - Basic AI for Torgaar (currently won't sac anything as a part of cost payment) - Fixed references in the script for Torgaar. --- forge-ai/src/main/java/forge/ai/AiCostDecision.java | 9 +++++++++ forge-ai/src/main/java/forge/ai/ability/LifeSetAi.java | 10 ++++++++-- .../res/cardsfolder/t/torgaar_famine_incarnate.txt | 7 +++---- 3 files changed, 20 insertions(+), 6 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/AiCostDecision.java b/forge-ai/src/main/java/forge/ai/AiCostDecision.java index 2d93d12cf52..1d7179b017f 100644 --- a/forge-ai/src/main/java/forge/ai/AiCostDecision.java +++ b/forge-ai/src/main/java/forge/ai/AiCostDecision.java @@ -510,6 +510,15 @@ public class AiCostDecision extends CostDecisionMakerBase { Integer c = cost.convertAmount(); if (c == null) { if (ability.getSVar(cost.getAmount()).equals("XChoice")) { + if ("SacToReduceCost".equals(ability.getParam("AILogic"))) { + // e.g. Torgaar, Famine Incarnate + // TODO: currently returns an empty list, so the AI doesn't sacrifice anything. Trying to make + // the AI decide on creatures to sac makes the AI sacrifice them, but the cost is not reduced and the + // AI pays the full mana cost anyway (despite sacrificing creatures). + return PaymentDecision.card(new CardCollection()); + } + + // Other cards are assumed to be flagged RemAIDeck for now return null; } diff --git a/forge-ai/src/main/java/forge/ai/ability/LifeSetAi.java b/forge-ai/src/main/java/forge/ai/ability/LifeSetAi.java index eb849eb92c9..6f4a821870c 100644 --- a/forge-ai/src/main/java/forge/ai/ability/LifeSetAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/LifeSetAi.java @@ -124,6 +124,13 @@ public class LifeSetAi extends SpellAbilityAi { amount = AbilityUtils.calculateAmount(sa.getHostCard(), amountStr, sa); } + // special cases when amount can't be calculated without targeting first + if (amount == 0 && "TargetedPlayer$StartingLife/HalfDown".equals(source.getSVar(amountStr))) { + // TODO: this assumes equal starting life for all players, which is not true e.g. for Archenemy + amount = ai.getStartingLife() / 2; + } + + if (sourceName.equals("Eternity Vessel") && (opponent.isCardInPlay("Vampire Hexmage") || (source.getCounters(CounterType.CHARGE) == 0))) { return false; @@ -131,8 +138,7 @@ public class LifeSetAi extends SpellAbilityAi { // If the Target is gaining life, target self. // if the Target is modifying how much life is gained, this needs to - // be - // handled better + // be handled better final TargetRestrictions tgt = sa.getTargetRestrictions(); if (tgt != null) { sa.resetTargets(); diff --git a/forge-gui/res/cardsfolder/t/torgaar_famine_incarnate.txt b/forge-gui/res/cardsfolder/t/torgaar_famine_incarnate.txt index f87381c9654..78d418b99ee 100644 --- a/forge-gui/res/cardsfolder/t/torgaar_famine_incarnate.txt +++ b/forge-gui/res/cardsfolder/t/torgaar_famine_incarnate.txt @@ -2,12 +2,11 @@ Name:Torgaar, Famine Incarnate ManaCost:6 B B Types:Legendary Creature Avatar PT:7/6 -A:SP$ PermanentCreature | Cost$ 6 B B Sac | Announce$ X -S:Mode$ ReduceCost | ValidCard$ Card.Self | Type$ Spell | Amount$ Y | EffectZone$ All | Description$ As an additional cost to cast this spell, you may sacrifice any number of creatures. This spell costs {2} less to cast for each creature sacrificed as an additional cost. +A:SP$ PermanentCreature | Cost$ 6 B B Sac | Announce$ X | References$ X,Y | AILogic$ SacToReduceCost +S:Mode$ ReduceCost | ValidCard$ Card.Self | Type$ Spell | Amount$ Y | EffectZone$ All | References$ Y | Description$ As an additional cost to cast this spell, you may sacrifice any number of creatures. This spell costs {2} less to cast for each creature sacrificed as an additional cost. SVar:X:XChoice SVar:Y:SVar$X/Times.2 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigSetLife | TriggerDescription$ When CARDNAME enters the battlefield, up to one target player’s life total becomes half their starting life total, rounded down. -SVar:TrigSetLife:DB$ SetLife | ValidTgts$ Player | LifeAmount$ HalfLife | TargetMin$ 0 | TargetMax$ 1 +SVar:TrigSetLife:DB$ SetLife | ValidTgts$ Player | LifeAmount$ HalfLife | TargetMin$ 0 | TargetMax$ 1 | References$ HalfLife SVar:HalfLife:TargetedPlayer$StartingLife/HalfDown -SVar:RemAIDeck:True Oracle:As an additional cost to cast this spell, you may sacrifice any number of creatures. This spell costs {2} less to cast for each creature sacrificed as an additional cost.\nWhen Torgaar, Famine Incarnate enters the battlefield, up to one target player’s life total becomes half their starting life total, rounded down. \ No newline at end of file From 6c0112262e47764c2e839240a51933a03c45e87f Mon Sep 17 00:00:00 2001 From: Agetian Date: Wed, 18 Apr 2018 09:45:00 +0300 Subject: [PATCH 02/12] - Somewhat better LifeSetAi logic for Torgaar which accounts for possible different starting life. --- .../main/java/forge/ai/ability/LifeSetAi.java | 37 +++++++++++++++++-- 1 file changed, 34 insertions(+), 3 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/ability/LifeSetAi.java b/forge-ai/src/main/java/forge/ai/ability/LifeSetAi.java index 6f4a821870c..20a77ad08f9 100644 --- a/forge-ai/src/main/java/forge/ai/ability/LifeSetAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/LifeSetAi.java @@ -126,11 +126,10 @@ public class LifeSetAi extends SpellAbilityAi { // special cases when amount can't be calculated without targeting first if (amount == 0 && "TargetedPlayer$StartingLife/HalfDown".equals(source.getSVar(amountStr))) { - // TODO: this assumes equal starting life for all players, which is not true e.g. for Archenemy - amount = ai.getStartingLife() / 2; + // e.g. Torgaar, Famine Incarnate + return doHalfStartingLifeLogic(ai, opponent, sa); } - if (sourceName.equals("Eternity Vessel") && (opponent.isCardInPlay("Vampire Hexmage") || (source.getCounters(CounterType.CHARGE) == 0))) { return false; @@ -160,4 +159,36 @@ public class LifeSetAi extends SpellAbilityAi { return true; } + private boolean doHalfStartingLifeLogic(Player ai, Player opponent, SpellAbility sa) { + int aiAmount = ai.getStartingLife() / 2; + int oppAmount = opponent.getStartingLife() / 2; + int aiLife = ai.getLife(); + int oppLife = opponent.getLife(); + + sa.resetTargets(); + + final TargetRestrictions tgt = sa.getTargetRestrictions(); + if (tgt != null) { + if (tgt.canOnlyTgtOpponent()) { + if (oppLife > oppAmount) { + sa.getTargets().add(opponent); + } else { + return false; + } + } else { + if (aiAmount > ai.getLife() && aiLife <= 10) { + sa.getTargets().add(ai); + } else if (oppLife > oppAmount) { + sa.getTargets().add(opponent); + } else if (aiAmount > aiLife) { + sa.getTargets().add(ai); + } else { + return false; + } + } + } + + return true; + } + } From 694ac39e897eb05390d4b7305a763d8c5a2e9358 Mon Sep 17 00:00:00 2001 From: Agetian Date: Wed, 18 Apr 2018 09:25:58 +0300 Subject: [PATCH 03/12] - Basic AI for Torgaar (currently won't sac anything as a part of cost payment) - Fixed references in the script for Torgaar. --- forge-ai/src/main/java/forge/ai/AiCostDecision.java | 9 +++++++++ forge-ai/src/main/java/forge/ai/ability/LifeSetAi.java | 10 ++++++++-- .../res/cardsfolder/t/torgaar_famine_incarnate.txt | 3 +-- 3 files changed, 18 insertions(+), 4 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/AiCostDecision.java b/forge-ai/src/main/java/forge/ai/AiCostDecision.java index 2d93d12cf52..1d7179b017f 100644 --- a/forge-ai/src/main/java/forge/ai/AiCostDecision.java +++ b/forge-ai/src/main/java/forge/ai/AiCostDecision.java @@ -510,6 +510,15 @@ public class AiCostDecision extends CostDecisionMakerBase { Integer c = cost.convertAmount(); if (c == null) { if (ability.getSVar(cost.getAmount()).equals("XChoice")) { + if ("SacToReduceCost".equals(ability.getParam("AILogic"))) { + // e.g. Torgaar, Famine Incarnate + // TODO: currently returns an empty list, so the AI doesn't sacrifice anything. Trying to make + // the AI decide on creatures to sac makes the AI sacrifice them, but the cost is not reduced and the + // AI pays the full mana cost anyway (despite sacrificing creatures). + return PaymentDecision.card(new CardCollection()); + } + + // Other cards are assumed to be flagged RemAIDeck for now return null; } diff --git a/forge-ai/src/main/java/forge/ai/ability/LifeSetAi.java b/forge-ai/src/main/java/forge/ai/ability/LifeSetAi.java index eb849eb92c9..6f4a821870c 100644 --- a/forge-ai/src/main/java/forge/ai/ability/LifeSetAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/LifeSetAi.java @@ -124,6 +124,13 @@ public class LifeSetAi extends SpellAbilityAi { amount = AbilityUtils.calculateAmount(sa.getHostCard(), amountStr, sa); } + // special cases when amount can't be calculated without targeting first + if (amount == 0 && "TargetedPlayer$StartingLife/HalfDown".equals(source.getSVar(amountStr))) { + // TODO: this assumes equal starting life for all players, which is not true e.g. for Archenemy + amount = ai.getStartingLife() / 2; + } + + if (sourceName.equals("Eternity Vessel") && (opponent.isCardInPlay("Vampire Hexmage") || (source.getCounters(CounterType.CHARGE) == 0))) { return false; @@ -131,8 +138,7 @@ public class LifeSetAi extends SpellAbilityAi { // If the Target is gaining life, target self. // if the Target is modifying how much life is gained, this needs to - // be - // handled better + // be handled better final TargetRestrictions tgt = sa.getTargetRestrictions(); if (tgt != null) { sa.resetTargets(); diff --git a/forge-gui/res/cardsfolder/t/torgaar_famine_incarnate.txt b/forge-gui/res/cardsfolder/t/torgaar_famine_incarnate.txt index 1493069b325..78d418b99ee 100644 --- a/forge-gui/res/cardsfolder/t/torgaar_famine_incarnate.txt +++ b/forge-gui/res/cardsfolder/t/torgaar_famine_incarnate.txt @@ -2,12 +2,11 @@ Name:Torgaar, Famine Incarnate ManaCost:6 B B Types:Legendary Creature Avatar PT:7/6 -A:SP$ PermanentCreature | Cost$ 6 B B Sac | Announce$ X | References$ X,Y +A:SP$ PermanentCreature | Cost$ 6 B B Sac | Announce$ X | References$ X,Y | AILogic$ SacToReduceCost S:Mode$ ReduceCost | ValidCard$ Card.Self | Type$ Spell | Amount$ Y | EffectZone$ All | References$ Y | Description$ As an additional cost to cast this spell, you may sacrifice any number of creatures. This spell costs {2} less to cast for each creature sacrificed as an additional cost. SVar:X:XChoice SVar:Y:SVar$X/Times.2 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigSetLife | TriggerDescription$ When CARDNAME enters the battlefield, up to one target player’s life total becomes half their starting life total, rounded down. SVar:TrigSetLife:DB$ SetLife | ValidTgts$ Player | LifeAmount$ HalfLife | TargetMin$ 0 | TargetMax$ 1 | References$ HalfLife SVar:HalfLife:TargetedPlayer$StartingLife/HalfDown -SVar:RemAIDeck:True Oracle:As an additional cost to cast this spell, you may sacrifice any number of creatures. This spell costs {2} less to cast for each creature sacrificed as an additional cost.\nWhen Torgaar, Famine Incarnate enters the battlefield, up to one target player’s life total becomes half their starting life total, rounded down. \ No newline at end of file From 6a47d10d7bed479928d432f3942328212bcd6f8b Mon Sep 17 00:00:00 2001 From: Agetian Date: Wed, 18 Apr 2018 09:45:00 +0300 Subject: [PATCH 04/12] - Somewhat better LifeSetAi logic for Torgaar which accounts for possible different starting life. --- .../main/java/forge/ai/ability/LifeSetAi.java | 37 +++++++++++++++++-- 1 file changed, 34 insertions(+), 3 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/ability/LifeSetAi.java b/forge-ai/src/main/java/forge/ai/ability/LifeSetAi.java index 6f4a821870c..20a77ad08f9 100644 --- a/forge-ai/src/main/java/forge/ai/ability/LifeSetAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/LifeSetAi.java @@ -126,11 +126,10 @@ public class LifeSetAi extends SpellAbilityAi { // special cases when amount can't be calculated without targeting first if (amount == 0 && "TargetedPlayer$StartingLife/HalfDown".equals(source.getSVar(amountStr))) { - // TODO: this assumes equal starting life for all players, which is not true e.g. for Archenemy - amount = ai.getStartingLife() / 2; + // e.g. Torgaar, Famine Incarnate + return doHalfStartingLifeLogic(ai, opponent, sa); } - if (sourceName.equals("Eternity Vessel") && (opponent.isCardInPlay("Vampire Hexmage") || (source.getCounters(CounterType.CHARGE) == 0))) { return false; @@ -160,4 +159,36 @@ public class LifeSetAi extends SpellAbilityAi { return true; } + private boolean doHalfStartingLifeLogic(Player ai, Player opponent, SpellAbility sa) { + int aiAmount = ai.getStartingLife() / 2; + int oppAmount = opponent.getStartingLife() / 2; + int aiLife = ai.getLife(); + int oppLife = opponent.getLife(); + + sa.resetTargets(); + + final TargetRestrictions tgt = sa.getTargetRestrictions(); + if (tgt != null) { + if (tgt.canOnlyTgtOpponent()) { + if (oppLife > oppAmount) { + sa.getTargets().add(opponent); + } else { + return false; + } + } else { + if (aiAmount > ai.getLife() && aiLife <= 10) { + sa.getTargets().add(ai); + } else if (oppLife > oppAmount) { + sa.getTargets().add(opponent); + } else if (aiAmount > aiLife) { + sa.getTargets().add(ai); + } else { + return false; + } + } + } + + return true; + } + } From 8b0a5e886e69f27fee4a9d56d4a29ee733450653 Mon Sep 17 00:00:00 2001 From: Agetian Date: Wed, 18 Apr 2018 09:25:58 +0300 Subject: [PATCH 05/12] - Basic AI for Torgaar (currently won't sac anything as a part of cost payment) - Fixed references in the script for Torgaar. --- forge-ai/src/main/java/forge/ai/AiCostDecision.java | 9 +++++++++ forge-ai/src/main/java/forge/ai/ability/LifeSetAi.java | 10 ++++++++-- .../res/cardsfolder/t/torgaar_famine_incarnate.txt | 3 +-- 3 files changed, 18 insertions(+), 4 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/AiCostDecision.java b/forge-ai/src/main/java/forge/ai/AiCostDecision.java index 2d93d12cf52..1d7179b017f 100644 --- a/forge-ai/src/main/java/forge/ai/AiCostDecision.java +++ b/forge-ai/src/main/java/forge/ai/AiCostDecision.java @@ -510,6 +510,15 @@ public class AiCostDecision extends CostDecisionMakerBase { Integer c = cost.convertAmount(); if (c == null) { if (ability.getSVar(cost.getAmount()).equals("XChoice")) { + if ("SacToReduceCost".equals(ability.getParam("AILogic"))) { + // e.g. Torgaar, Famine Incarnate + // TODO: currently returns an empty list, so the AI doesn't sacrifice anything. Trying to make + // the AI decide on creatures to sac makes the AI sacrifice them, but the cost is not reduced and the + // AI pays the full mana cost anyway (despite sacrificing creatures). + return PaymentDecision.card(new CardCollection()); + } + + // Other cards are assumed to be flagged RemAIDeck for now return null; } diff --git a/forge-ai/src/main/java/forge/ai/ability/LifeSetAi.java b/forge-ai/src/main/java/forge/ai/ability/LifeSetAi.java index eb849eb92c9..6f4a821870c 100644 --- a/forge-ai/src/main/java/forge/ai/ability/LifeSetAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/LifeSetAi.java @@ -124,6 +124,13 @@ public class LifeSetAi extends SpellAbilityAi { amount = AbilityUtils.calculateAmount(sa.getHostCard(), amountStr, sa); } + // special cases when amount can't be calculated without targeting first + if (amount == 0 && "TargetedPlayer$StartingLife/HalfDown".equals(source.getSVar(amountStr))) { + // TODO: this assumes equal starting life for all players, which is not true e.g. for Archenemy + amount = ai.getStartingLife() / 2; + } + + if (sourceName.equals("Eternity Vessel") && (opponent.isCardInPlay("Vampire Hexmage") || (source.getCounters(CounterType.CHARGE) == 0))) { return false; @@ -131,8 +138,7 @@ public class LifeSetAi extends SpellAbilityAi { // If the Target is gaining life, target self. // if the Target is modifying how much life is gained, this needs to - // be - // handled better + // be handled better final TargetRestrictions tgt = sa.getTargetRestrictions(); if (tgt != null) { sa.resetTargets(); diff --git a/forge-gui/res/cardsfolder/t/torgaar_famine_incarnate.txt b/forge-gui/res/cardsfolder/t/torgaar_famine_incarnate.txt index 1493069b325..78d418b99ee 100644 --- a/forge-gui/res/cardsfolder/t/torgaar_famine_incarnate.txt +++ b/forge-gui/res/cardsfolder/t/torgaar_famine_incarnate.txt @@ -2,12 +2,11 @@ Name:Torgaar, Famine Incarnate ManaCost:6 B B Types:Legendary Creature Avatar PT:7/6 -A:SP$ PermanentCreature | Cost$ 6 B B Sac | Announce$ X | References$ X,Y +A:SP$ PermanentCreature | Cost$ 6 B B Sac | Announce$ X | References$ X,Y | AILogic$ SacToReduceCost S:Mode$ ReduceCost | ValidCard$ Card.Self | Type$ Spell | Amount$ Y | EffectZone$ All | References$ Y | Description$ As an additional cost to cast this spell, you may sacrifice any number of creatures. This spell costs {2} less to cast for each creature sacrificed as an additional cost. SVar:X:XChoice SVar:Y:SVar$X/Times.2 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigSetLife | TriggerDescription$ When CARDNAME enters the battlefield, up to one target player’s life total becomes half their starting life total, rounded down. SVar:TrigSetLife:DB$ SetLife | ValidTgts$ Player | LifeAmount$ HalfLife | TargetMin$ 0 | TargetMax$ 1 | References$ HalfLife SVar:HalfLife:TargetedPlayer$StartingLife/HalfDown -SVar:RemAIDeck:True Oracle:As an additional cost to cast this spell, you may sacrifice any number of creatures. This spell costs {2} less to cast for each creature sacrificed as an additional cost.\nWhen Torgaar, Famine Incarnate enters the battlefield, up to one target player’s life total becomes half their starting life total, rounded down. \ No newline at end of file From 4b6162053813bd7eaf033c158d2cbf3dd08e3e8c Mon Sep 17 00:00:00 2001 From: Agetian Date: Wed, 18 Apr 2018 09:45:00 +0300 Subject: [PATCH 06/12] - Somewhat better LifeSetAi logic for Torgaar which accounts for possible different starting life. --- .../main/java/forge/ai/ability/LifeSetAi.java | 37 +++++++++++++++++-- 1 file changed, 34 insertions(+), 3 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/ability/LifeSetAi.java b/forge-ai/src/main/java/forge/ai/ability/LifeSetAi.java index 6f4a821870c..20a77ad08f9 100644 --- a/forge-ai/src/main/java/forge/ai/ability/LifeSetAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/LifeSetAi.java @@ -126,11 +126,10 @@ public class LifeSetAi extends SpellAbilityAi { // special cases when amount can't be calculated without targeting first if (amount == 0 && "TargetedPlayer$StartingLife/HalfDown".equals(source.getSVar(amountStr))) { - // TODO: this assumes equal starting life for all players, which is not true e.g. for Archenemy - amount = ai.getStartingLife() / 2; + // e.g. Torgaar, Famine Incarnate + return doHalfStartingLifeLogic(ai, opponent, sa); } - if (sourceName.equals("Eternity Vessel") && (opponent.isCardInPlay("Vampire Hexmage") || (source.getCounters(CounterType.CHARGE) == 0))) { return false; @@ -160,4 +159,36 @@ public class LifeSetAi extends SpellAbilityAi { return true; } + private boolean doHalfStartingLifeLogic(Player ai, Player opponent, SpellAbility sa) { + int aiAmount = ai.getStartingLife() / 2; + int oppAmount = opponent.getStartingLife() / 2; + int aiLife = ai.getLife(); + int oppLife = opponent.getLife(); + + sa.resetTargets(); + + final TargetRestrictions tgt = sa.getTargetRestrictions(); + if (tgt != null) { + if (tgt.canOnlyTgtOpponent()) { + if (oppLife > oppAmount) { + sa.getTargets().add(opponent); + } else { + return false; + } + } else { + if (aiAmount > ai.getLife() && aiLife <= 10) { + sa.getTargets().add(ai); + } else if (oppLife > oppAmount) { + sa.getTargets().add(opponent); + } else if (aiAmount > aiLife) { + sa.getTargets().add(ai); + } else { + return false; + } + } + } + + return true; + } + } From dcacdf65ce6ba67d90bd936da00bc6383da6cb94 Mon Sep 17 00:00:00 2001 From: Agetian Date: Wed, 18 Apr 2018 17:14:55 +0300 Subject: [PATCH 07/12] - Reduced the life threshold for healing self with Torgaar. --- forge-ai/src/main/java/forge/ai/ability/LifeSetAi.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-ai/src/main/java/forge/ai/ability/LifeSetAi.java b/forge-ai/src/main/java/forge/ai/ability/LifeSetAi.java index 20a77ad08f9..fb8c0797711 100644 --- a/forge-ai/src/main/java/forge/ai/ability/LifeSetAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/LifeSetAi.java @@ -176,7 +176,7 @@ public class LifeSetAi extends SpellAbilityAi { return false; } } else { - if (aiAmount > ai.getLife() && aiLife <= 10) { + if (aiAmount > ai.getLife() && aiLife < 5) { sa.getTargets().add(ai); } else if (oppLife > oppAmount) { sa.getTargets().add(opponent); From d0a279e04ea135cd461a99a7afca371145162e03 Mon Sep 17 00:00:00 2001 From: Agetian Date: Thu, 19 Apr 2018 09:39:40 +0300 Subject: [PATCH 08/12] - Adding Dominaria achievements suggested by Marek (with minor modifications for style consistency and to fit into the relevant boxes). --- forge-gui/res/lists/altwin-achievements.txt | 1 + forge-gui/res/lists/planeswalker-achievements.txt | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/forge-gui/res/lists/altwin-achievements.txt b/forge-gui/res/lists/altwin-achievements.txt index b4848462c93..5b04a34798c 100644 --- a/forge-gui/res/lists/altwin-achievements.txt +++ b/forge-gui/res/lists/altwin-achievements.txt @@ -13,6 +13,7 @@ Hedron Alignment|The Alignment|The hedrons are right! Helix Pinnacle|The Tower|The view from the top is great! Hellkite Tyrant|The Hoard|You made your bed of treasure, now lie in it! Laboratory Maniac|The Insanity|No more questions? I'm omniscient now! +Lich's Mastery|The Absence of Lifeforce|Life's a lich, then you die. Mayael's Aria|The Gargantuan|Just my shadow weighs a ton! Maze's End|The Labyrinth|What? No bossfight? Mechanized Production|The Rise of Replicas|Welcome to the future of mass production! diff --git a/forge-gui/res/lists/planeswalker-achievements.txt b/forge-gui/res/lists/planeswalker-achievements.txt index 60a28d0d53f..da2c1c2f2a9 100644 --- a/forge-gui/res/lists/planeswalker-achievements.txt +++ b/forge-gui/res/lists/planeswalker-achievements.txt @@ -11,6 +11,7 @@ Arlinn, Embraced by the Moon|Arlinn's Hunt|Fair fight? What fair fight? Ashiok, Nightmare Weaver|Ashiok's Identity|I subscribe to the theory of blank slate! Chandra Ablaze|Chandra's Bargain|I feel like I've seen those before... Chandra Nalaar|Chandra's Rage|Feel the power of my wrath! +Chandra, Bold Pyromancer|Chandra's Flame Wave|Let's have a campfire! Chandra, Flamecaller|Chandra's Sea of Flames|You didn't activate this for 0 just to get the achievement, did you? Chandra, Pyrogenius|Chandra's Warm Embrace|Did I say 'warm'? I meant 'red hot'. Chandra, Pyromaster|Chandra's Vengeance|Please file in triplicate! @@ -49,6 +50,7 @@ Jace, Telepath Unbound|Jace's Erasure|First empty your mind and then... nope, th Jace, the Living Guildpact|Jace's Timetwister|Symmetry? What symmetry? Jace, the Mind Sculptor|Jace's Lobotomy|What do you mean, "overpowered"? Jace, Unraveler of Secrets|Jace's Perfect Plan|So, I've read about this neat guy named Erayo... +Jaya Ballard|Jaya's Flashback|Fire is easily rekindled. Karn Liberated|Karn's Reset|Let's do this again! Kaya, Ghost Assassin|Kaya's Syphon|You don't MIND, do you? Kiora, Master of the Depths|Kiora's Fight Club|First rule is not to talk about the sucker punches @@ -90,7 +92,9 @@ Sorin, Lord of Innistrad|Sorin's Recruitment|My favorite game is Shogi! Sorin, Solemn Visitor|Sorin's Abyss|Don't get so close to the edge! Tamiyo, Field Researcher|Tamiyo's Omniscience|I know exactly how your story ends... Tamiyo, the Moon Sage|Tamiyo's Recycling|Wash, rinse, repeat! +Teferi, Hero of Dominaria|Teferi's Oblivion|Don't worry. It's just a phase. Teferi, Temporal Archmage|Teferi's Time Slip|Let's speed this up a bit! +Teferi, Timebender|Teferi's Time Warp|Let's do that again! Tezzeret the Schemer|Tezzeret's Assembly Line|Smashing, isn't it? Tezzeret the Seeker|Tezzeret's Robots|You can't stop the progress! Tezzeret, Agent of Bolas|Tezzeret's Drain|Technological superiority for the win! From 65aad0b09a777663ce4de4450ae1323ff5aa2901 Mon Sep 17 00:00:00 2001 From: Agetian Date: Thu, 19 Apr 2018 11:21:06 +0300 Subject: [PATCH 09/12] - Adding Dominaria to Standard and Modern format definitions. --- forge-gui/res/formats/Modern.txt | 2 +- forge-gui/res/formats/standard.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/forge-gui/res/formats/Modern.txt b/forge-gui/res/formats/Modern.txt index e0c1018a5ff..a652b831929 100644 --- a/forge-gui/res/formats/Modern.txt +++ b/forge-gui/res/formats/Modern.txt @@ -2,5 +2,5 @@ Name:Modern Order:102 Type:Sanctioned -Sets:8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, EVE, SHM, MOR, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, BNG, JOU, M15, KTK, FRF, DTK, MM2, ORI, BFZ, OGW, SOI, EMN, KLD, AER, AKH, W17, HOU, XLN, RIX +Sets:8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, EVE, SHM, MOR, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, BNG, JOU, M15, KTK, FRF, DTK, MM2, ORI, BFZ, OGW, SOI, EMN, KLD, AER, AKH, W17, HOU, XLN, RIX, DOM Banned:Ancient Den; Birthing Pod; Blazing Shoal; Chrome Mox; Cloudpost; Dark Depths; Deathrite Shaman; Dig Through Time; Dread Return; Eye of Ugin; Gitaxian Probe; Glimpse of Nature; Golgari Grave-Troll; Great Furnace; Green Sun's Zenith; Hypergenesis; Mental Misstep; Ponder; Preordain; Punishing Fire; Rite of Flame; Seat of the Synod; Second Sunrise; Seething Song; Sensei's Divining Top; Skullclamp; Splinter Twin; Stoneforge Mystic; Summer Bloom; Treasure Cruise; Tree of Tales; Umezawa's Jitte; Vault of Whispers diff --git a/forge-gui/res/formats/standard.txt b/forge-gui/res/formats/standard.txt index 9a1a44de978..6e14dec9cb1 100644 --- a/forge-gui/res/formats/standard.txt +++ b/forge-gui/res/formats/standard.txt @@ -2,5 +2,5 @@ Name:Standard Order:101 Type:Sanctioned -Sets:KLD, AER, AKH, W17, HOU, XLN, RIX +Sets:KLD, AER, AKH, W17, HOU, XLN, RIX, DOM Banned: Attune with Aether; Rogue Refiner; Rampaging Ferocidon; Ramunap Ruins; Smuggler's Copter; Aetherworks Marvel; Felidar Guardian From 90a2e0a9e1a5585b1fa0fad6287577237a6aab81 Mon Sep 17 00:00:00 2001 From: swordshine Date: Thu, 19 Apr 2018 18:03:47 +0800 Subject: [PATCH 10/12] - Fixed some cards --- forge-gui/res/cardsfolder/b/benalish_honor_guard.txt | 2 +- forge-gui/res/cardsfolder/c/charge.txt | 2 +- forge-gui/res/cardsfolder/n/naban_dean_of_iteration.txt | 7 +++++++ forge-gui/res/cardsfolder/s/shanna_sisays_legacy.txt | 2 +- 4 files changed, 10 insertions(+), 3 deletions(-) create mode 100644 forge-gui/res/cardsfolder/n/naban_dean_of_iteration.txt diff --git a/forge-gui/res/cardsfolder/b/benalish_honor_guard.txt b/forge-gui/res/cardsfolder/b/benalish_honor_guard.txt index fcda0022dcb..11ee77442cd 100644 --- a/forge-gui/res/cardsfolder/b/benalish_honor_guard.txt +++ b/forge-gui/res/cardsfolder/b/benalish_honor_guard.txt @@ -4,5 +4,5 @@ Types:Creature Human Knight PT:2/2 S:Mode$ Continuous | Affected$ Card.Self | AddPower$ X | References$ X | Description$ CARDNAME gets +1/+0 for each legendary creature you control. SVar:X:Count$Valid Creature.Legendary+YouCtrl -SVar:BuffedBy:Legendary Creature +SVar:BuffedBy:Creature.Legendary Oracle:Benalish Honor Guard gets +1/+0 for each legendary creature you control. diff --git a/forge-gui/res/cardsfolder/c/charge.txt b/forge-gui/res/cardsfolder/c/charge.txt index 40a587fec75..c1907df0d34 100644 --- a/forge-gui/res/cardsfolder/c/charge.txt +++ b/forge-gui/res/cardsfolder/c/charge.txt @@ -1,6 +1,6 @@ Name:Charge ManaCost:W Types:Instant -A:SP$ PumpAll | Cost$ W | ValidCards$ Creature.YouCtrl | NumAtt$ +1 | SpellDescription$ Creatures you control get +1/+1 until end of turn. +A:SP$ PumpAll | Cost$ W | ValidCards$ Creature.YouCtrl | NumAtt$ +1 | NumDef$ +1 | SpellDescription$ Creatures you control get +1/+1 until end of turn. SVar:Picture:http://www.wizards.com/global/images/magic/general/charge.jpg Oracle:Creatures you control get +1/+1 until end of turn. diff --git a/forge-gui/res/cardsfolder/n/naban_dean_of_iteration.txt b/forge-gui/res/cardsfolder/n/naban_dean_of_iteration.txt new file mode 100644 index 00000000000..cbd17299770 --- /dev/null +++ b/forge-gui/res/cardsfolder/n/naban_dean_of_iteration.txt @@ -0,0 +1,7 @@ +Name:Naban, Dean of Iteration +ManaCost:1 U +Types:Legendary Creature Human Wizard +PT:2/1 +S:Mode$ Continuous | Affected$ You | AddKeyword$ Panharmonicon:Wizard.YouCtrl | Description$ If a Wizard entering the battlefield under your control causes a triggered ability of a permanent you control to trigger, that ability triggers an additional time. +SVar:Picture:http://www.wizards.com/global/images/magic/general/naban_dean_of_iteration.jpg +Oracle:If a Wizard entering the battlefield under your control causes a triggered ability of a permanent you control to trigger, that ability triggers an additional time. diff --git a/forge-gui/res/cardsfolder/s/shanna_sisays_legacy.txt b/forge-gui/res/cardsfolder/s/shanna_sisays_legacy.txt index 7722d9d99d8..6dc93068ba4 100644 --- a/forge-gui/res/cardsfolder/s/shanna_sisays_legacy.txt +++ b/forge-gui/res/cardsfolder/s/shanna_sisays_legacy.txt @@ -1,6 +1,6 @@ Name:Shanna, Sisay's Legacy ManaCost:G W -Types:Creature Human Warrior +Types:Legendary Creature Human Warrior PT:0/0 S:Mode$ CantTarget | ValidCard$ Card.Self | ValidSource$ Card | ValidSA$ Activated,Triggered | Activator$ Player.Opponent | Description$ CARDNAME can't be the target of abilities your opponents control. S:Mode$ Continuous | Affected$ Card.Self | AddPower$ X | AddToughness$ X | References$ X | Description$ CARDNAME gets +1/+1 for each creature you control. From 1dcb56d223f30a0bf97f4fd6b3996b24534c24e5 Mon Sep 17 00:00:00 2001 From: swordshine Date: Thu, 19 Apr 2018 18:11:25 +0800 Subject: [PATCH 11/12] - Fixed Gift of Growth --- forge-gui/res/cardsfolder/g/gift_of_growth.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/forge-gui/res/cardsfolder/g/gift_of_growth.txt b/forge-gui/res/cardsfolder/g/gift_of_growth.txt index 3addb8a2b03..07eb845c445 100644 --- a/forge-gui/res/cardsfolder/g/gift_of_growth.txt +++ b/forge-gui/res/cardsfolder/g/gift_of_growth.txt @@ -1,8 +1,8 @@ Name:Gift of Growth ManaCost:1 G Types:Instant -K:Kicker:1 G +K:Kicker:2 A:SP$ Untap | Cost$ 1 G | ValidTgts$ Creature | TgtPrompt$ Select target creature | SubAbility$ DBPump | SpellDescription$ Untap target creature. It gets +2/+2 until end of turn. If this spell was kicked, that creature gets +4/+4 until end of turn instead. SVar:DBPump:DB$ Pump | Defined$ Targeted | NumAtt$ +X | NumDef$ +X | References$ X SVar:X:Count$Kicked.4.2 -Oracle:Kicker {2} (You may pay an additional {2} as you cast this spell.)\nUntap target creature. It gets +2/+2 until end of turn. If this spell was kicked, that creature gets +4/+4 until end of turn instead. \ No newline at end of file +Oracle:Kicker {2} (You may pay an additional {2} as you cast this spell.)\nUntap target creature. It gets +2/+2 until end of turn. If this spell was kicked, that creature gets +4/+4 until end of turn instead. From c829915948a5649465c26a5e891ac1627e88f8c1 Mon Sep 17 00:00:00 2001 From: swordshine Date: Thu, 19 Apr 2018 18:25:18 +0800 Subject: [PATCH 12/12] - Update more scripts --- forge-gui/res/cardsfolder/g/goblin_warchief.txt | 4 ++-- forge-gui/res/cardsfolder/l/llanowar_envoy.txt | 4 ++-- forge-gui/res/cardsfolder/m/marwyn_the_nurturer.txt | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/forge-gui/res/cardsfolder/g/goblin_warchief.txt b/forge-gui/res/cardsfolder/g/goblin_warchief.txt index 905e7ef8ca0..7306ee29cb1 100644 --- a/forge-gui/res/cardsfolder/g/goblin_warchief.txt +++ b/forge-gui/res/cardsfolder/g/goblin_warchief.txt @@ -3,8 +3,8 @@ ManaCost:1 R R Types:Creature Goblin Warrior PT:2/2 S:Mode$ ReduceCost | ValidCard$ Goblin | Type$ Spell | Activator$ You | Amount$ 1 | Description$ Goblin spells you cast cost {1} less to cast. -S:Mode$ Continuous | Affected$ Creature.Goblin+YouCtrl | AddKeyword$ Haste | Description$ Goblin creatures you control have haste. +S:Mode$ Continuous | Affected$ Goblin.YouCtrl | AddKeyword$ Haste | Description$ Goblins you control have haste. SVar:PlayMain1:TRUE SVar:BuffedBy:Goblin SVar:Picture:http://www.wizards.com/global/images/magic/general/goblin_warchief.jpg -Oracle:Goblin spells you cast cost {1} less to cast.\nGoblin creatures you control have haste. +Oracle:Goblin spells you cast cost {1} less to cast.\nGoblins you control have haste. diff --git a/forge-gui/res/cardsfolder/l/llanowar_envoy.txt b/forge-gui/res/cardsfolder/l/llanowar_envoy.txt index 3506271e86b..fcbf77b130b 100644 --- a/forge-gui/res/cardsfolder/l/llanowar_envoy.txt +++ b/forge-gui/res/cardsfolder/l/llanowar_envoy.txt @@ -2,6 +2,6 @@ Name:Llanowar Envoy ManaCost:2 G Types:Creature Elf Scout PT:3/2 -A:AB$ Mana | Cost$ 1 G | Produced$ Any | SpellDescription$ Add one mana of any color to your mana pool. +A:AB$ Mana | Cost$ 1 G | Produced$ Any | SpellDescription$ Add one mana of any color. SVar:RemAIDeck:True -Oracle:{1}{G}: Add one mana of any color to your mana pool. +Oracle:{1}{G}: Add one mana of any color. diff --git a/forge-gui/res/cardsfolder/m/marwyn_the_nurturer.txt b/forge-gui/res/cardsfolder/m/marwyn_the_nurturer.txt index 3626316e479..700e991016f 100644 --- a/forge-gui/res/cardsfolder/m/marwyn_the_nurturer.txt +++ b/forge-gui/res/cardsfolder/m/marwyn_the_nurturer.txt @@ -6,6 +6,6 @@ T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Elf.Ot SVar:TrigPutCounter:DB$ PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 A:AB$ Mana | Cost$ T | Produced$ G | Amount$ X | References$ X | SpellDescription$ Add an amount of {G} equal to CARDNAME's power. SVar:X:Count$CardPower -DeckHints:Type$Eldrazi +DeckHints:Type$Elf SVar:Picture:http://www.wizards.com/global/images/magic/general/marwyn_the_nurturer.jpg Oracle:Whenever another Elf enters the battlefield under your control, put a +1/+1 counter on Marwyn, the Nurturer.\n{T}: Add an amount of {G} equal to Marwyn's power.