diff --git a/forge-ai/src/main/java/forge/ai/simulation/GameCopier.java b/forge-ai/src/main/java/forge/ai/simulation/GameCopier.java index 82766928065..45c25611530 100644 --- a/forge-ai/src/main/java/forge/ai/simulation/GameCopier.java +++ b/forge-ai/src/main/java/forge/ai/simulation/GameCopier.java @@ -98,6 +98,7 @@ public class GameCopier { newPlayer.setCounters(Maps.newHashMap(origPlayer.getCounters())); newPlayer.setBlessing(origPlayer.hasBlessing()); newPlayer.setRevolt(origPlayer.hasRevolt()); + newPlayer.setDescended(origPlayer.getDescended()); newPlayer.setLibrarySearched(origPlayer.getLibrarySearched()); newPlayer.setSpellsCastLastTurn(origPlayer.getSpellsCastLastTurn()); for (int j = 0; j < origPlayer.getSpellsCastThisTurn(); j++) { diff --git a/forge-game/src/main/java/forge/game/ability/AbilityUtils.java b/forge-game/src/main/java/forge/game/ability/AbilityUtils.java index cacd25b5c38..ee4a0930f74 100644 --- a/forge-game/src/main/java/forge/game/ability/AbilityUtils.java +++ b/forge-game/src/main/java/forge/game/ability/AbilityUtils.java @@ -2254,6 +2254,10 @@ public class AbilityUtils { return doXMath(player.getSurveilThisTurn(), expr, c, ctb); } + if (sq[0].equals("YouDescendedThisTurn")) { + return doXMath(player.getDescended(), expr, c, ctb); + } + if (sq[0].equals("YouCastThisGame")) { return doXMath(player.getSpellsCastThisGame(), expr, c, ctb); } 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 ea1f59306e8..bebe1b7a3dc 100644 --- a/forge-game/src/main/java/forge/game/player/Player.java +++ b/forge-game/src/main/java/forge/game/player/Player.java @@ -182,6 +182,7 @@ public class Player extends GameEntity implements Comparable { private final Map notedNum = Maps.newHashMap(); private boolean revolt = false; + private int descended = 0; private List sacrificedThisTurn = new ArrayList<>(); @@ -2132,6 +2133,16 @@ public class Player extends GameEntity implements Comparable { revolt = val; } + public final int getDescended() { + return descended; + } + public final void descend() { + descended++; + } + public final void setDescended(final int n) { + descended = n; + } + public final boolean hasDelirium() { return CardFactoryUtil.getCardTypesFromList(getCardsIn(ZoneType.Graveyard)) >= 4; } @@ -2526,6 +2537,7 @@ public class Player extends GameEntity implements Comparable { resetSacrificedThisTurn(); resetVenturedThisTurn(); setRevolt(false); + setDescended(0); setSpellsCastLastTurn(getSpellsCastThisTurn()); resetSpellsCastThisTurn(); setLifeLostLastTurn(getLifeLostThisTurn()); diff --git a/forge-game/src/main/java/forge/game/player/PlayerProperty.java b/forge-game/src/main/java/forge/game/player/PlayerProperty.java index 022cf4fc09b..2d5cc3e3a2c 100644 --- a/forge-game/src/main/java/forge/game/player/PlayerProperty.java +++ b/forge-game/src/main/java/forge/game/player/PlayerProperty.java @@ -79,6 +79,10 @@ public class PlayerProperty { if (!player.equals(source.getOwner())) { return false; } + } else if (property.equals("descended")) { + if (!(player.getDescended() > 0)) { + return false; + } } else if (property.equals("isMonarch")) { if (!player.isMonarch()) { return false; diff --git a/forge-game/src/main/java/forge/game/zone/Zone.java b/forge-game/src/main/java/forge/game/zone/Zone.java index 14a5e5f4a42..d8912111bdb 100644 --- a/forge-game/src/main/java/forge/game/zone/Zone.java +++ b/forge-game/src/main/java/forge/game/zone/Zone.java @@ -121,6 +121,10 @@ public class Zone implements java.io.Serializable, Iterable { c.setTapped(false); } + if (zoneType == (ZoneType.Graveyard) && c.isPermanent() && !c.isToken()) { + c.getOwner().descend(); + } + c.setZone(this); if ((zoneType == ZoneType.Battlefield || !c.isToken()) || (zoneType == ZoneType.Stack && c.getCopiedPermanent() != null)) { diff --git a/forge-gui/res/cardsfolder/upcoming/broodrage_mycoid.txt b/forge-gui/res/cardsfolder/upcoming/broodrage_mycoid.txt new file mode 100644 index 00000000000..620aaaf186f --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/broodrage_mycoid.txt @@ -0,0 +1,9 @@ +Name:Broodrage Mycoid +ManaCost:3 B +Types:Creature Fungus +PT:4/3 +T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You.descended | TriggerZones$ Battlefield | Execute$ TrigToken | TriggerDescription$ At the beginning of your end step, if you descended this turn, create a 1/1 black Fungus creature token with "This creature can't block." (You descended if a permanent card was put into your graveyard from anywhere.) +SVar:TrigToken:DB$ Token | TokenScript$ b_1_1_fungus_noblock +DeckHas:Ability$Token & Type$Fungus +DeckHints:Ability$Sacrifice +Oracle:At the beginning of your end step, if you descended this turn, create a 1/1 black Fungus creature token with "This creature can't block." (You descended if a permanent card was put into your graveyard from anywhere.) diff --git a/forge-gui/res/cardsfolder/upcoming/enterprising_scallywag.txt b/forge-gui/res/cardsfolder/upcoming/enterprising_scallywag.txt new file mode 100644 index 00000000000..4ef5b8a2811 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/enterprising_scallywag.txt @@ -0,0 +1,9 @@ +Name:Enterprising Scallywag +ManaCost:1 R +Types:Creature Goblin Pirate +PT:2/2 +T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You.descended | TriggerZones$ Battlefield | Execute$ TrigTreasure | TriggerDescription$ At the beginning of your end step, if you descended this turn, create a Treasure token. (You descended if a permanent card was put into your graveyard from anywhere.) +SVar:TrigTreasure:DB$ Token | TokenScript$ c_a_treasure_sac +DeckHas:Ability$Token|Sacrifice & Type$Treasure|Artifact +DeckHints:Ability$Sacrifice +Oracle:At the beginning of your end step, if you descended this turn, create a Treasure token. (You descended if a permanent card was put into your graveyard from anywhere.) diff --git a/forge-gui/res/cardsfolder/upcoming/stalactite_stalker.txt b/forge-gui/res/cardsfolder/upcoming/stalactite_stalker.txt new file mode 100644 index 00000000000..996c2dc3b1b --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/stalactite_stalker.txt @@ -0,0 +1,12 @@ +Name:Stalactite Stalker +ManaCost:B +Types:Creature Goblin Rogue +PT:1/1 +K:Menace +T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You.descended | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ At the beginning of your end step, if you descended this turn, put a +1/+1 counter on CARDNAME. +SVar:TrigPutCounter:DB$ PutCounter | CounterType$ P1P1 +A:AB$ Pump | Cost$ 2 B Sac<1/CARDNAME> | ValidTgts$ Creature | IsCurse$ True | NumAtt$ -X | NumDef$ -X | StackDescription$ REP Target creature_{c:Targeted} | SpellDescription$ Target creature gets -X/-X until end of turn, where X is CARDNAME's power. +SVar:X:Sacrificed$CardPower +DeckHas:Ability$Counters|Sacrifice +DeckHints:Ability$Sacrifice +Oracle:Menace\nAt the beginning of your end step, if you descended this turn, put a +1/+1 counter on Stalactite Stalker.\n{2}{B}, Sacrifice Stalactite Stalker: Target creature gets -X/-X until end of turn, where X is Stalactite Stalker's power. diff --git a/forge-gui/res/cardsfolder/upcoming/the_mycotyrant.txt b/forge-gui/res/cardsfolder/upcoming/the_mycotyrant.txt new file mode 100644 index 00000000000..553aa5eeea6 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/the_mycotyrant.txt @@ -0,0 +1,13 @@ +Name:The Mycotyrant +ManaCost:1 B G +Types:Legendary Creature Elder Fungus +PT:*/* +K:Trample +S:Mode$ Continuous | EffectZone$ All | CharacteristicDefining$ True | SetPower$ Y | SetToughness$ Y | Description$ CARDNAME's power and toughness are each equal to the number of creatures you control that are Fungi and/or Saprolings. +SVar:Y:Count$Valid Creature.Fungus+YouCtrl,Creature.Saproling+YouCtrl +T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigToken | TriggerDescription$ At the beginning of your end step, create X 1/1 black Fungus creature tokens with "This creature can't block," where X is the number of times you descended this turn. (You descend each time a permanent card is put into your graveyard from anywhere.) +SVar:TrigToken:DB$ Token | TokenAmount$ X | TokenScript$ b_1_1_fungus_noblock +SVar:X:Count$YouDescendedThisTurn +DeckHas:Ability$Token & Type$Fungus +DeckHints:Type$Fungus|Saproling & Ability$Sacrifice +Oracle:Trample\nThe Mycotyrant's power and toughness are each equal to the number of creatures you control that are Fungi and/or Saprolings.\nAt the beginning of your end step, create X 1/1 black Fungus creature tokens with "This creature can't block," where X is the number of times you descended this turn. (You descend each time a permanent card is put into your graveyard from anywhere.) diff --git a/forge-gui/res/tokenscripts/b_1_1_fungus_noblock.txt b/forge-gui/res/tokenscripts/b_1_1_fungus_noblock.txt new file mode 100644 index 00000000000..8a67b71a864 --- /dev/null +++ b/forge-gui/res/tokenscripts/b_1_1_fungus_noblock.txt @@ -0,0 +1,7 @@ +Name:Fungus Token +ManaCost:no cost +Types:Creature Fungus +Colors:black +PT:1/1 +S:Mode$ CantBlockBy | ValidBlocker$ Creature.Self | Description$ This creature can't block. +Oracle:This creature can't block.