From 3519dba3e195137b1d5af10f7f9ad0b7d331dd20 Mon Sep 17 00:00:00 2001 From: Northmoc Date: Wed, 29 Mar 2023 12:52:12 -0400 Subject: [PATCH] IncubateEffect --- .../main/java/forge/game/ability/ApiType.java | 1 + .../game/ability/effects/IncubateEffect.java | 62 +++++++++++++++++++ .../upcoming/glissa_herald_of_predation.txt | 2 +- .../cardsfolder/upcoming/norns_inquisitor.txt | 2 + 4 files changed, 66 insertions(+), 1 deletion(-) create mode 100644 forge-game/src/main/java/forge/game/ability/effects/IncubateEffect.java diff --git a/forge-game/src/main/java/forge/game/ability/ApiType.java b/forge-game/src/main/java/forge/game/ability/ApiType.java index 04ef28b663b..06760ca1109 100644 --- a/forge-game/src/main/java/forge/game/ability/ApiType.java +++ b/forge-game/src/main/java/forge/game/ability/ApiType.java @@ -100,6 +100,7 @@ public enum ApiType { Investigate (InvestigateEffect.class), Intensify (IntensifyEffect.class), ImmediateTrigger (ImmediateTriggerEffect.class), + Incubate (IncubateEffect.class), Learn (LearnEffect.class), LookAt (LookAtEffect.class), LoseLife (LifeLoseEffect.class), diff --git a/forge-game/src/main/java/forge/game/ability/effects/IncubateEffect.java b/forge-game/src/main/java/forge/game/ability/effects/IncubateEffect.java new file mode 100644 index 00000000000..15358d80fa6 --- /dev/null +++ b/forge-game/src/main/java/forge/game/ability/effects/IncubateEffect.java @@ -0,0 +1,62 @@ +package forge.game.ability.effects; + +import forge.game.Game; +import forge.game.ability.AbilityUtils; +import forge.game.card.*; +import forge.game.event.GameEventCombatChanged; +import forge.game.event.GameEventTokenCreated; +import forge.game.player.Player; +import forge.game.spellability.SpellAbility; +import forge.util.Lang; + +import org.apache.commons.lang3.mutable.MutableBoolean; + +public class IncubateEffect extends TokenEffectBase { + + @Override + protected String getStackDescription(SpellAbility sa) { + final StringBuilder sb = new StringBuilder("Incubate "); + final Card card = sa.getHostCard(); + final int amount = AbilityUtils.calculateAmount(card, sa.getParamOrDefault("Amount", "1"), sa); + final int times = AbilityUtils.calculateAmount(card, sa.getParamOrDefault("Times", "1"), sa); + + sb.append(amount); + if (times > 1) { + sb.append(" ").append(times == 2 ? "twice" : Lang.nounWithNumeral(amount, "times")); + } + sb.append(".").append(" (Create an Incubator token with "); + sb.append(Lang.nounWithNumeral(amount, "+1/+1 counter")); + sb.append(" on it and \"{2}: Transform this artifact.\" It transforms into a 0/0 Phyrexian artifact creature.)"); + + return sb.toString(); + } + + @Override + public void resolve(SpellAbility sa) { + final Card card = sa.getHostCard(); + final Game game = card.getGame(); + final Player activator = sa.getActivatingPlayer(); + final String amtString = sa.getParamOrDefault("Amount", "1"); + final int times = AbilityUtils.calculateAmount(card, sa.getParamOrDefault("Times", "1"), sa); + + // create incubator token + CardZoneTable triggerList = new CardZoneTable(); + MutableBoolean combatChanged = new MutableBoolean(false); + + sa.putParam("WithCountersType", "P1P1"); + sa.putParam("WithCountersAmount", amtString); + + makeTokenTable(makeTokenTableInternal(activator, "incubator", times, sa), false, + triggerList, combatChanged, sa); + + triggerList.triggerChangesZoneAll(game, sa); + triggerList.clear(); + + game.fireEvent(new GameEventTokenCreated()); + + if (combatChanged.isTrue()) { + game.updateCombatForView(); + game.fireEvent(new GameEventCombatChanged()); + } + } +} diff --git a/forge-gui/res/cardsfolder/upcoming/glissa_herald_of_predation.txt b/forge-gui/res/cardsfolder/upcoming/glissa_herald_of_predation.txt index 14c0a67e725..b2d7a562688 100644 --- a/forge-gui/res/cardsfolder/upcoming/glissa_herald_of_predation.txt +++ b/forge-gui/res/cardsfolder/upcoming/glissa_herald_of_predation.txt @@ -9,4 +9,4 @@ SVar:Transform:DB$ SetState | Defined$ Valid Incubator.token+YouCtrl | Mode$ Tra SVar:PumpAll:DB$ PumpAll | ValidCards$ Phyrexian.YouCtrl | KW$ First Strike & Deathtouch | SpellDescription$ Phyrexians you control gain first strike and deathtouch until end of turn. DeckHas:Ability$Token|Counters & Type$Artifact DeckHints:Type$Phyrexian -Oracle:At the beginning of combat on your turn, choose one —\n• Incubate 2 twice. (To incubate 2, create an Incubator token with three +1/+1 counters on it and "{2}: Transform this artifact." It transforms into a 0/0 Phyrexian artifact creature.)\n• Transform all Incubator tokens you control.\n• Phyrexians you control gain first strike and deathtouch until end of turn. +Oracle:At the beginning of combat on your turn, choose one —\n• Incubate 2 twice. (To incubate 2, create an Incubator token with two +1/+1 counters on it and "{2}: Transform this artifact." It transforms into a 0/0 Phyrexian artifact creature.)\n• Transform all Incubator tokens you control.\n• Phyrexians you control gain first strike and deathtouch until end of turn. diff --git a/forge-gui/res/cardsfolder/upcoming/norns_inquisitor.txt b/forge-gui/res/cardsfolder/upcoming/norns_inquisitor.txt index 9d1318303d1..4c700446483 100644 --- a/forge-gui/res/cardsfolder/upcoming/norns_inquisitor.txt +++ b/forge-gui/res/cardsfolder/upcoming/norns_inquisitor.txt @@ -4,5 +4,7 @@ Types:Creature Phyrexian Knight PT:1/1 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigIncubate | TriggerDescription$ When CARDNAME enters the battlefield, incubate 2. SVar:TrigIncubate:DB$ Incubate | Amount$ 2 +T:Mode$ Transformed | ValidCard$ Phyrexian.YouCtrl | Execute$ TrigPutCounter | TriggerZones$ Battlefield | TriggerDescription$ Whenever a permanent you control transforms into a Phyrexian, put a +1/+1 counter on it. +SVar:TrigPutCounter:DB$ PutCounter | Defined$ TriggeredCard | CounterType$ P1P1 DeckHas:Ability$Token|Counters & Type$Artifact Oracle:When Norn's Inquisitor enters the battlefield, incubate 2.\nWhenever a permanent you control transforms into a Phyrexian, put a +1/+1 counter on it.