From d8c97d9c4e749ceb8827e11fbb0eda6c4cee2bdc Mon Sep 17 00:00:00 2001 From: Hanmac Date: Sat, 17 Dec 2016 18:03:43 +0000 Subject: [PATCH] CardFactoryUtil: moved "At the beginning of your upkeep, sacrifice" as "UpkeepCost" in CardFactoryUtil delete Upkeep class because its not needed anymore --- .gitattributes | 1 - .../main/java/forge/ai/CreatureEvaluator.java | 2 +- .../java/forge/ai/ability/PermanentAi.java | 6 +- forge-game/src/main/java/forge/game/Game.java | 7 +- .../src/main/java/forge/game/card/Card.java | 2 +- .../java/forge/game/card/CardFactoryUtil.java | 32 +++++++ .../main/java/forge/game/phase/Upkeep.java | 94 ------------------- 7 files changed, 40 insertions(+), 104 deletions(-) delete mode 100644 forge-game/src/main/java/forge/game/phase/Upkeep.java diff --git a/.gitattributes b/.gitattributes index fb3f4930df9..cf7e47c9e04 100644 --- a/.gitattributes +++ b/.gitattributes @@ -608,7 +608,6 @@ forge-game/src/main/java/forge/game/phase/Phase.java svneol=native#text/plain forge-game/src/main/java/forge/game/phase/PhaseHandler.java -text forge-game/src/main/java/forge/game/phase/PhaseType.java -text forge-game/src/main/java/forge/game/phase/Untap.java -text -forge-game/src/main/java/forge/game/phase/Upkeep.java svneol=native#text/plain forge-game/src/main/java/forge/game/phase/package-info.java svneol=native#text/plain forge-game/src/main/java/forge/game/player/AchievementTracker.java -text forge-game/src/main/java/forge/game/player/DelayedReveal.java -text diff --git a/forge-ai/src/main/java/forge/ai/CreatureEvaluator.java b/forge-ai/src/main/java/forge/ai/CreatureEvaluator.java index a6b04973743..03bebb81505 100644 --- a/forge-ai/src/main/java/forge/ai/CreatureEvaluator.java +++ b/forge-ai/src/main/java/forge/ai/CreatureEvaluator.java @@ -163,7 +163,7 @@ public class CreatureEvaluator implements Function { value -= subValue(50, "eot-leaves"); } else if (c.hasStartOfKeyword("Cumulative upkeep")) { value -= subValue(30, "cupkeep"); - } else if (c.hasStartOfKeyword("At the beginning of your upkeep, sacrifice CARDNAME unless you pay")) { + } else if (c.hasStartOfKeyword("UpkeepCost")) { value -= subValue(20, "sac-unless"); } else if (c.hasStartOfKeyword("Echo") && c.cameUnderControlSinceLastUpkeep()) { value -= subValue(10, "echo-unpaid"); diff --git a/forge-ai/src/main/java/forge/ai/ability/PermanentAi.java b/forge-ai/src/main/java/forge/ai/ability/PermanentAi.java index 51a6804e61c..3bc113cdfb2 100644 --- a/forge-ai/src/main/java/forge/ai/ability/PermanentAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/PermanentAi.java @@ -135,9 +135,9 @@ public class PermanentAi extends SpellAbilityAi { // don't play cards without being able to pay the upkeep for for (String ability : card.getKeywords()) { - if (ability.startsWith("At the beginning of your upkeep, sacrifice CARDNAME unless you pay")) { - final String[] k = ability.split(" pay "); - final String costs = k[1].replaceAll("[{]", "").replaceAll("[}]", " "); + if (ability.startsWith("UpkeepCost")) { + final String[] k = ability.split(":"); + final String costs = k[1]; final SpellAbility emptyAbility = new SpellAbility.EmptySa(card, ai); emptyAbility.setPayCosts(new Cost(costs, true)); diff --git a/forge-game/src/main/java/forge/game/Game.java b/forge-game/src/main/java/forge/game/Game.java index 5827d10250e..d5e248ca76c 100644 --- a/forge-game/src/main/java/forge/game/Game.java +++ b/forge-game/src/main/java/forge/game/Game.java @@ -43,7 +43,6 @@ import forge.game.phase.Phase; import forge.game.phase.PhaseHandler; import forge.game.phase.PhaseType; import forge.game.phase.Untap; -import forge.game.phase.Upkeep; import forge.game.player.IGameEntitiesFactory; import forge.game.player.Player; import forge.game.player.PlayerView; @@ -77,7 +76,7 @@ public class Game { public final Phase endOfCombat; public final Phase endOfTurn; public final Untap untap; - public final Upkeep upkeep; + public final Phase upkeep; public final MagicStack stack; public final CostPaymentStack costPaymentStack = new CostPaymentStack(); private final PhaseHandler phaseHandler; @@ -239,7 +238,7 @@ public class Game { phaseHandler = new PhaseHandler(this); untap = new Untap(this); - upkeep = new Upkeep(this); + upkeep = new Phase(PhaseType.UPKEEP); cleanup = new Phase(PhaseType.CLEANUP); endOfCombat = new Phase(PhaseType.COMBAT_END); endOfTurn = new Phase(PhaseType.END_OF_TURN); @@ -304,7 +303,7 @@ public class Game { public final Untap getUntap() { return untap; } - public final Upkeep getUpkeep() { + public final Phase getUpkeep() { return upkeep; } public final Phase getEndOfCombat() { diff --git a/forge-game/src/main/java/forge/game/card/Card.java b/forge-game/src/main/java/forge/game/card/Card.java index b8481d21228..798690fe5ee 100644 --- a/forge-game/src/main/java/forge/game/card/Card.java +++ b/forge-game/src/main/java/forge/game/card/Card.java @@ -1428,7 +1428,7 @@ public class Card extends GameEntity implements Comparable { || keyword.startsWith("Cycling") || keyword.startsWith("TypeCycling") || keyword.startsWith("ETBReplacement") || keyword.startsWith("MayEffectFromOpeningHand") || keyword.equals("Undaunted") || keyword.startsWith("Monstrosity") - || keyword.startsWith("Graft")) { + || keyword.startsWith("Graft") || keyword.startsWith("UpkeepCost")) { } else if (keyword.startsWith("Provoke") || keyword.startsWith("Devour") || keyword.equals("Unleash") || keyword.startsWith("Soulbond") || keyword.equals("Partner") || keyword.equals("Retrace") || keyword.equals("Living Weapon") || keyword.equals("Myriad") || keyword.equals("Exploit") diff --git a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java index 127797e6e3f..a8a2ae96eed 100644 --- a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java +++ b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java @@ -2248,6 +2248,8 @@ public class CardFactoryUtil { } else if (keyword.equals("Evolve")) { addTriggerAbility(keyword, card, null); + } else if (keyword.startsWith("UpkeepCost")) { + addTriggerAbility(keyword, card, null); } else if (keyword.startsWith("Dredge")) { final int dredgeAmount = card.getKeywordMagnitude("Dredge"); @@ -3249,6 +3251,36 @@ public class CardFactoryUtil { parsedTrigger.setOverridingAbility(AbilityFactory.getAbility(effect, card)); final Trigger cardTrigger = card.addTrigger(parsedTrigger); + if (!intrinsic) { + kws.addTrigger(cardTrigger); + } + } else if (keyword.startsWith("UpkeepCost")) { + final String[] k = keyword.split(":"); + final Cost cost = new Cost(k[1], true); + + final StringBuilder sb = new StringBuilder(); + sb.append("At the beginning of your upkeep, sacrifice CARDNAME unless you "); + if (cost.isOnlyManaCost()) { + sb.append("pay "); + } + final String costStr = k.length == 3 ? k[2] : cost.toSimpleString(); + + sb.append(costStr.substring(0,1).toLowerCase() + costStr.substring(1)); + sb.append("."); + + String upkeepTrig = "Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | " + + "TriggerDescription$ " + sb.toString(); + + String effect = "DB$ Sacrifice | SacValid$ Self | UnlessPayer$ You | UnlessCost$ " + k[1]; + + if (!StringUtils.isNumeric(k[1])) { + effect += " | References$ " + k[1]; + } + + final Trigger parsedTrigger = TriggerHandler.parseTrigger(upkeepTrig, card, intrinsic); + parsedTrigger.setOverridingAbility(AbilityFactory.getAbility(effect, card)); + final Trigger cardTrigger = card.addTrigger(parsedTrigger); + if (!intrinsic) { kws.addTrigger(cardTrigger); } diff --git a/forge-game/src/main/java/forge/game/phase/Upkeep.java b/forge-game/src/main/java/forge/game/phase/Upkeep.java deleted file mode 100644 index a9871d4aea3..00000000000 --- a/forge-game/src/main/java/forge/game/phase/Upkeep.java +++ /dev/null @@ -1,94 +0,0 @@ -/* - * Forge: Play Magic: the Gathering. - * Copyright (C) 2011 Forge Team - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that itinksidd will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -package forge.game.phase; - -import forge.game.Game; -import forge.game.ability.AbilityFactory; -import forge.game.card.Card; -import forge.game.card.CardCollectionView; -import forge.game.player.Player; -import forge.game.spellability.SpellAbility; -import forge.game.zone.ZoneType; - -/** - *

- * The Upkeep class handles ending effects with "until your next upkeep" and - * "until next upkeep". - * - * It also handles hardcoded triggers "At the beginning of upkeep". - *

- * - * @author Forge - * @version $Id$ - */ -public class Upkeep extends Phase { - private static final long serialVersionUID = 6906459482978819354L; - - protected final Game game; - public Upkeep(final Game game) { - super(PhaseType.UPKEEP); - this.game = game; - } - - /** - *

- * Handles all the hardcoded events that happen at the beginning of each - * Upkeep Phase. - * - * This will freeze the Stack at the start, and unfreeze the Stack at the - * end. - *

- */ - @Override - public final void executeAt() { - game.getStack().freezeStack(); - - Upkeep.upkeepUpkeepCost(game); // sacrifice unless upkeep cost is paid - - game.getStack().unfreezeStack(); - } - - private static void upkeepUpkeepCost(final Game game) { - final CardCollectionView list = game.getPhaseHandler().getPlayerTurn().getCardsIn(ZoneType.Battlefield); - - for (int i = 0; i < list.size(); i++) { - final Card c = list.get(i); - final Player controller = c.getController(); - for (String ability : c.getKeywords()) { - // sacrifice - if (ability.startsWith("At the beginning of your upkeep, sacrifice")) { - - final StringBuilder sb = new StringBuilder("Sacrifice upkeep for " + c); - final String[] k = ability.split(" pay "); - final String cost = k[1].replaceAll("[{]", "").replaceAll("[}]", " "); - - String effect = "AB$ Sacrifice | Cost$ 0 | SacValid$ Self" - + "| UnlessPayer$ You | UnlessCost$ " + cost; - - SpellAbility upkeepAbility = AbilityFactory.getAbility(effect, c); - upkeepAbility.setActivatingPlayer(controller); - upkeepAbility.setStackDescription(sb.toString()); - upkeepAbility.setDescription(sb.toString()); - upkeepAbility.setTrigger(true); - - game.getStack().addSimultaneousStackEntry(upkeepAbility); - } - } - } - } -}