diff --git a/forge-ai/src/main/java/forge/ai/AiBlockController.java b/forge-ai/src/main/java/forge/ai/AiBlockController.java index 16473ed204a..59f16a3a75d 100644 --- a/forge-ai/src/main/java/forge/ai/AiBlockController.java +++ b/forge-ai/src/main/java/forge/ai/AiBlockController.java @@ -570,7 +570,7 @@ public class AiBlockController { // Try to block a Menace attacker with two blockers, neither of which will die for (final Card attacker : attackersLeft) { - if (CombatUtil.getMinNumBlockersForAttacker(attacker, combat.getDefenderPlayerByAttacker(attacker)) <= 1) { + if (CombatUtil.getMinNumBlockersForAttacker(attacker, combat.getDefenderPlayerByAttacker(attacker)) != 2) { continue; } @@ -741,16 +741,14 @@ public class AiBlockController { combat.addBlocker(attacker, blocker); usedBlockers.add(blocker); if (CombatUtil.canAttackerBeBlockedWithAmount(attacker, usedBlockers.size(), combat)) { + attackersLeft.remove(attacker); + usedBlockers.clear(); break; } } } - if (CombatUtil.canAttackerBeBlockedWithAmount(attacker, usedBlockers.size(), combat)) { - attackersLeft.remove(attacker); - } else { - for (Card blocker : usedBlockers) { - combat.removeBlockAssignment(attacker, blocker); - } + for (Card blocker : usedBlockers) { + combat.removeBlockAssignment(attacker, blocker); } } } @@ -767,10 +765,7 @@ public class AiBlockController { tramplingAttackers = CardLists.filter(tramplingAttackers, Predicates.not(changesPTWhenBlocked(true))); for (final Card attacker : tramplingAttackers) { - boolean staticAssignCombatDamageAsUnblocked = StaticAbilityAssignCombatDamageAsUnblocked.assignCombatDamageAsUnblocked(attacker); - - if (CombatUtil.getMinNumBlockersForAttacker(attacker, combat.getDefenderPlayerByAttacker(attacker)) > combat.getBlockers(attacker).size() - || attacker.hasKeyword("CARDNAME can't be blocked unless all creatures defending player controls block it.")) { + if (CombatUtil.getMinNumBlockersForAttacker(attacker, combat.getDefenderPlayerByAttacker(attacker)) > combat.getBlockers(attacker).size()) { continue; } @@ -800,7 +795,7 @@ public class AiBlockController { } } - if (staticAssignCombatDamageAsUnblocked) { + if (!needsMoreChumpBlockers || StaticAbilityAssignCombatDamageAsUnblocked.assignCombatDamageAsUnblocked(attacker)) { continue; } @@ -935,21 +930,21 @@ public class AiBlockController { CardLists.sortByPowerAsc(chumpPWDefenders); if (!chumpPWDefenders.isEmpty()) { for (final Card attacker : attackers) { + if (attacker.hasKeyword(Keyword.TRAMPLE)) { + // don't bother trying to chump a trampling creature + continue; + } + if (!combat.getBlockers(attacker).isEmpty()) { + // already blocked by something, no need to chump + continue; + } GameEntity def = combat.getDefenderByAttacker(attacker); if (def instanceof Card && threatenedPWs.contains(def)) { - if (attacker.hasKeyword(Keyword.TRAMPLE)) { - // don't bother trying to chump a trampling creature - continue; - } - if (!combat.getBlockers(attacker).isEmpty()) { - // already blocked by something, no need to chump - continue; - } Card blockerDecided = null; for (final Card blocker : chumpPWDefenders) { if (CombatUtil.canBlock(attacker, blocker, combat)) { combat.addBlocker(attacker, blocker); - pwsWithChumpBlocks.add((Card) combat.getDefenderByAttacker(attacker)); + pwsWithChumpBlocks.add((Card) def); chosenChumpBlockers.add(blocker); blockerDecided = blocker; blockersLeft.remove(blocker); @@ -962,9 +957,9 @@ public class AiBlockController { // check to see if we managed to cover all the blockers of the planeswalker; if not, bail for (final Card pw : pwsWithChumpBlocks) { CardCollection pwAttackers = combat.getAttackersOf(pw); - CardCollection pwDefenders = new CardCollection(); - boolean isFullyBlocked = true; if (!pwAttackers.isEmpty()) { + CardCollection pwDefenders = new CardCollection(); + boolean isFullyBlocked = true; int damageToPW = 0; for (Card pwAtk : pwAttackers) { if (!combat.getBlockers(pwAtk).isEmpty()) { diff --git a/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java b/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java index 5b2e1834c62..5a949ebac44 100644 --- a/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java +++ b/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java @@ -23,7 +23,10 @@ import forge.game.ability.effects.CharmEffect; import forge.game.card.*; import forge.game.card.CardPredicates.Presets; import forge.game.combat.Combat; -import forge.game.cost.*; +import forge.game.cost.Cost; +import forge.game.cost.CostEnlist; +import forge.game.cost.CostPart; +import forge.game.cost.CostPartMana; import forge.game.keyword.Keyword; import forge.game.keyword.KeywordInterface; import forge.game.mana.Mana; @@ -257,9 +260,6 @@ public class PlayerControllerAi extends PlayerController { public boolean confirmTrigger(WrappedAbility wrapper) { final SpellAbility sa = wrapper.getWrappedAbility(); //final Trigger regtrig = wrapper.getTrigger(); - if (ComputerUtilAbility.getAbilitySourceName(sa).equals("Deathmist Raptor")) { - return true; - } if (wrapper.isMandatory()) { return true; } diff --git a/forge-ai/src/main/java/forge/ai/ability/ChooseGenericEffectAi.java b/forge-ai/src/main/java/forge/ai/ability/ChooseGenericEffectAi.java index dee1be9b1bc..9edb682eabc 100644 --- a/forge-ai/src/main/java/forge/ai/ability/ChooseGenericEffectAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/ChooseGenericEffectAi.java @@ -75,6 +75,9 @@ public class ChooseGenericEffectAi extends SpellAbilityAi { } return true; // perhaps the opponent(s) had Sigarda, Heron's Grace or another effect giving hexproof in play, still play the creature as 6/6 } + if (ComputerUtilAbility.getAbilitySourceName(sa).equals("Deathmist Raptor")) { + return true; + } return super.doTriggerAINoCost(aiPlayer, sa, mandatory); } diff --git a/forge-ai/src/main/java/forge/ai/ability/FightAi.java b/forge-ai/src/main/java/forge/ai/ability/FightAi.java index 3d1eb307a79..265b74cc85f 100644 --- a/forge-ai/src/main/java/forge/ai/ability/FightAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/FightAi.java @@ -1,7 +1,5 @@ package forge.ai.ability; -import java.util.List; - import forge.ai.*; import forge.game.ability.AbilityUtils; import forge.game.ability.ApiType; @@ -17,6 +15,8 @@ import forge.game.trigger.Trigger; import forge.game.trigger.TriggerType; import forge.util.MyRandom; +import java.util.List; + public class FightAi extends SpellAbilityAi { @Override protected boolean checkAiLogic(final Player ai, final SpellAbility sa, final String aiLogic) { @@ -31,10 +31,6 @@ public class FightAi extends SpellAbilityAi { // everything is defined or targeted above, can't do anything there unless a specific logic is set if (sa.hasParam("Defined") && !sa.usesTargeting()) { // TODO extend Logic for cards like Arena - if ("Grothama".equals(sa.getParam("AILogic"))) { // Grothama, All-Devouring - return SpecialCardAi.GrothamaAllDevouring.consider(ai, sa); - } - return true; } @@ -120,6 +116,11 @@ public class FightAi extends SpellAbilityAi { @Override protected boolean doTriggerAINoCost(Player ai, SpellAbility sa, boolean mandatory) { + final String aiLogic = sa.getParamOrDefault("AILogic", ""); + if (aiLogic.equals("Grothama")) { + return mandatory ? true : SpecialCardAi.GrothamaAllDevouring.consider(ai, sa); + } + if (checkApiLogic(ai, sa)) { return true; } diff --git a/forge-game/src/main/java/forge/game/ability/SpellAbilityEffect.java b/forge-game/src/main/java/forge/game/ability/SpellAbilityEffect.java index d6918135c25..dec1b885798 100644 --- a/forge-game/src/main/java/forge/game/ability/SpellAbilityEffect.java +++ b/forge-game/src/main/java/forge/game/ability/SpellAbilityEffect.java @@ -394,7 +394,7 @@ public abstract class SpellAbilityEffect { public static void addForgetOnMovedTrigger(final Card card, final String zone) { String trig = "Mode$ ChangesZone | ValidCard$ Card.IsRemembered | Origin$ " + zone + " | ExcludedDestinations$ Stack,Exile | Destination$ Any | TriggerZones$ Command | Static$ True"; - String trig2 = "Mode$ Exiled | ValidCard$ Card.IsRemembered | TriggerZones$ Command | Static$ True"; + String trig2 = "Mode$ Exiled | ValidCard$ Card.IsRemembered | ValidCause$ SpellAbility.!EffectSource | TriggerZones$ Command | Static$ True"; final Trigger parsedTrigger = TriggerHandler.parseTrigger(trig, card, true); final Trigger parsedTrigger2 = TriggerHandler.parseTrigger(trig2, card, true); diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerExiled.java b/forge-game/src/main/java/forge/game/trigger/TriggerExiled.java index 5cde2db1c35..0e952545a8c 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerExiled.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerExiled.java @@ -73,19 +73,8 @@ public class TriggerExiled extends Trigger { return false; } - if (hasParam("ValidCause")) { - if (!runParams.containsKey(AbilityKey.Cause)) { - return false; - } - SpellAbility cause = (SpellAbility) runParams.get(AbilityKey.Cause); - if (cause == null) { - return false; - } - if (!matchesValid(cause, getParam("ValidCause").split(","))) { - if (!matchesValid(cause.getHostCard(), getParam("ValidCause").split(","))) { - return false; - } - } + if (!matchesValidParam("ValidCause", runParams.get(AbilityKey.Cause))) { + return false; } return true; diff --git a/forge-gui/res/adventure/common/custom_card_pics/Hallowed Sigil.fullborder.jpg b/forge-gui/res/adventure/common/custom_card_pics/Hallowed Sigil.fullborder.jpg new file mode 100644 index 00000000000..73264fca8e8 Binary files /dev/null and b/forge-gui/res/adventure/common/custom_card_pics/Hallowed Sigil.fullborder.jpg differ diff --git a/forge-gui/res/adventure/common/custom_card_pics/Power of Valyx.fullborder.jpg b/forge-gui/res/adventure/common/custom_card_pics/Power of Valyx.fullborder.jpg new file mode 100644 index 00000000000..555669cb6c7 Binary files /dev/null and b/forge-gui/res/adventure/common/custom_card_pics/Power of Valyx.fullborder.jpg differ diff --git a/forge-gui/res/adventure/common/custom_card_pics/Sigil of Torment.fullborder.jpg b/forge-gui/res/adventure/common/custom_card_pics/Sigil of Torment.fullborder.jpg new file mode 100644 index 00000000000..2f2c0f9579e Binary files /dev/null and b/forge-gui/res/adventure/common/custom_card_pics/Sigil of Torment.fullborder.jpg differ diff --git a/forge-gui/res/adventure/common/custom_cards/hallowed_sigil.txt b/forge-gui/res/adventure/common/custom_cards/hallowed_sigil.txt new file mode 100644 index 00000000000..f5e6d9e9700 --- /dev/null +++ b/forge-gui/res/adventure/common/custom_cards/hallowed_sigil.txt @@ -0,0 +1,7 @@ +Name:Hallowed Sigil +ManaCost:no cost +Colors:white +Types:Enchantment +A:AB$ Pump | Cost$ PayShards<4> T | ValidTgts$ Creature.YouCtrl | KW$ Hexproof | SubAbility$ Eject | ActivationLimit$ 1 | SpellDescription$ Target creature you control gains hexproof until end of turn. Exile Hallowed Sigil. +SVar:Eject:DB$ ChangeZone | Defined$ Self | Origin$ Battlefield | Destination$ Exile +Oracle:{M},{T}:Target creature you control gains hexproof until end of turn. Exile Hallowed Sigil. diff --git a/forge-gui/res/adventure/common/custom_cards/sigil_of_torment.txt b/forge-gui/res/adventure/common/custom_cards/sigil_of_torment.txt new file mode 100644 index 00000000000..22e6086f09e --- /dev/null +++ b/forge-gui/res/adventure/common/custom_cards/sigil_of_torment.txt @@ -0,0 +1,8 @@ +Name:Sigil of Torment +ManaCost:no cost +Colors:black +Types:Enchantment +A:AB$ Destroy | Cost$ 4 B T PayShards<5> | ValidTgts$ Creature | TgtPrompt$ Select target creature | ActivationLimit$ 1 | SubAbility$ DBLifeGain | SpellDescription$ Destroy target creature. You gain 3 life. Exile Sigil of Torment. +SVar:DBLifeGain:DB$ GainLife | Defined$ You | LifeAmount$ 3 | SubAbility$ Eject +SVar:Eject:DB$ ChangeZone | Defined$ Self | Origin$ Battlefield | Destination$ Exile +Oracle:{M},{T}: Destroy target creature. You gain 3 life. Exile Sigil of Torment. diff --git a/forge-gui/res/adventure/common/custom_cards/valyx_boss_effect.txt b/forge-gui/res/adventure/common/custom_cards/valyx_boss_effect.txt new file mode 100644 index 00000000000..ce73b9bb2ae --- /dev/null +++ b/forge-gui/res/adventure/common/custom_cards/valyx_boss_effect.txt @@ -0,0 +1,8 @@ +Name:Power of Valyx +ManaCost:no cost +Colors:black +Types:Enchantment +K:Hexproof +A:AB$ Destroy | Cost$ 4 B T Sac<1/Creature.YouCtrl/creature you control>| ValidTgts$ Creature | TgtPrompt$ Select target creature | SubAbility$ DBLifeGain | SpellDescription$ Destroy target creature. You gain 3 life. +SVar:DBLifeGain:DB$ GainLife | Defined$ You | LifeAmount$ 3 +Oracle:{M},{T}, Sacrifice a creature: Destroy target creature. You gain 3 life. diff --git a/forge-gui/res/adventure/common/decks/miniboss/valyx.dck b/forge-gui/res/adventure/common/decks/miniboss/valyx.dck new file mode 100644 index 00000000000..71c1a9830b2 --- /dev/null +++ b/forge-gui/res/adventure/common/decks/miniboss/valyx.dck @@ -0,0 +1,23 @@ +[metadata] +Name=valyx +[Main] +3 Damnation|MM3|1 +2 Deathrender|CNS|1 +2 Deathrender|LRW|1 +1 Doomed Dissenter|DBL|1 +2 Doomed Dissenter|GN3|1 +1 Ecstatic Awakener|DBL|1 +2 Ecstatic Awakener|MID|1 +3 Indulgent Tormentor|PM15|1 +3 Lord of the Void|GTC|1 +4 Mark of the Oni|BOK|1 +3 Murder|CMR|1 +1 Phyrexian Reclamation|C15|1 +1 Phyrexian Reclamation|J22|1 +2 Reaper from the Abyss|J22|1 +3 Sign in Blood|SCD|1 +1 Skirsdag High Priest|C14|1 +2 Skirsdag High Priest|J22|1 +19 Swamp|MOM|1 +1 Swamp|MOM|3 +4 Westvale Abbey|SOI|1 diff --git a/forge-gui/res/adventure/common/decks/standard/cultist.dck b/forge-gui/res/adventure/common/decks/standard/cultist.dck new file mode 100644 index 00000000000..fb5a5e767f6 --- /dev/null +++ b/forge-gui/res/adventure/common/decks/standard/cultist.dck @@ -0,0 +1,48 @@ +[metadata] +Name=cultist +[Avatar] + +[Main] +2 Bloodgift Demon|SCD|1 +2 Bloodsoaked Champion|CLB|1 +2 Bloodsoaked Champion|NCC|1 +2 Demon of Catastrophes|J22|1 +1 Doomed Dissenter|BBD|1 +1 Doomed Dissenter|MB1|1 +2 Ecstatic Awakener|DBL|1 +2 Ecstatic Awakener|MID|1 +2 Feaster of Fools|MH1|1 +1 Grave Pact|10E|1 +2 Grave Pact|CM2|1 +1 Grave Pact|COM|1 +2 Graven Archfiend|YSNC|1 +1 Grim Haruspex|C19|1 +1 Grim Haruspex|CLB|1 +2 Harvester of Souls|CN2|1 +2 Herald of Torment|BNG|1 +1 Murder|CMR|1 +2 Murder|SNC|1 +2 Sign in Blood|ARC|1 +1 Sign in Blood|STA|1 +4 Skirsdag High Priest|2XM|1 +11 Swamp|MOM|1 +2 Swamp|SHM|1 +2 Swamp|SHM|2 +5 Swamp|SHM|3 +2 Swamp|SHM|4 +[Sideboard] +2 Culling Dais|2XM|1 +2 Furnace Celebration|CMR|1 +4 Glaring Spotlight|GTC|1 +2 Grim Return|M14|1 +1 Lord of the Void|GTC|1 +2 Ravenous Demon|DKA|1 +2 Reaper from the Abyss|C14|1 +[Planes] + +[Schemes] + +[Conspiracy] + +[Dungeon] + diff --git a/forge-gui/res/adventure/common/maps/map/desertbuildingtiles.tsx b/forge-gui/res/adventure/common/maps/map/desertbuildingtiles.tsx deleted file mode 100644 index f36c022034a..00000000000 --- a/forge-gui/res/adventure/common/maps/map/desertbuildingtiles.tsx +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/forge-gui/res/adventure/common/maps/map/naktamun.tmx b/forge-gui/res/adventure/common/maps/map/naktamun.tmx index 4a9104791b2..ff3edbae4ae 100644 --- a/forge-gui/res/adventure/common/maps/map/naktamun.tmx +++ b/forge-gui/res/adventure/common/maps/map/naktamun.tmx @@ -1,5 +1,5 @@ - + @@ -518,7 +518,82 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,4657,32,4184,4184,4184,4184,4184,4184,4184,32,4657,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74, @@ -933,73 +1008,6 @@ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -1052,7 +1060,7 @@ ] } ] - + @@ -1061,6 +1069,5 @@ - diff --git a/forge-gui/res/adventure/common/maps/map/gym.tmx b/forge-gui/res/adventure/common/maps/map/naktamun/gym.tmx similarity index 97% rename from forge-gui/res/adventure/common/maps/map/gym.tmx rename to forge-gui/res/adventure/common/maps/map/naktamun/gym.tmx index f7f2011477c..ae151d1f100 100644 --- a/forge-gui/res/adventure/common/maps/map/gym.tmx +++ b/forge-gui/res/adventure/common/maps/map/naktamun/gym.tmx @@ -1,9 +1,19 @@ - - - - + + + + + + + + + + + + + + 2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452, @@ -58,14 +68,6 @@ 2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452,2452 - - - - - - - - @@ -178,37 +180,37 @@ - + - + - + - + - + - + - + diff --git a/forge-gui/res/adventure/common/maps/map/unhallowed_abbey_1F.tmx b/forge-gui/res/adventure/common/maps/map/unhallowed_abbey_1F.tmx new file mode 100644 index 00000000000..ab32f4a5db2 --- /dev/null +++ b/forge-gui/res/adventure/common/maps/map/unhallowed_abbey_1F.tmx @@ -0,0 +1,196 @@ + + + + + + + + + + eJzt1dEJgCAQBmAfDW6DaJxs1GiEapxoj4o8uEwl9ZSIfriX5Pz4oUhVQqiXjxnOu1xxuTnj6/tF12WU6kt7x74nId66TwNC1HA9x2cLs40mNWzuES6bmkcmOAfPzGcctmmGJMW27WG3Wfcb4d7Xtx/rltj/+5brO8i43V6mf0vUftI31XTZvnCZITa3SW2cTt/fZvwf2XzTjc0GSO1G/w== + + + + + eJxjYBhZwI2TeEyJXkrwcLD3CTvxGARIUT+KR/EoHsWjeBSP4sGFARkE62E= + + + + + eJzt1M0NgzAMBWDfOCSZIHQI1imz0K7VH9img5AIWaRRRZ4NgqqqpXeAyHwxikL0/fWq3nOUu5cdncYfP++aulk8uSvprbMgPa0jetg5sdLns9vO5fVoPu3yP7sDtmRexERt1JWYiI24GrNkI+5JaXJ55bx/97fdIeRqdGYX+nqlWyttNj99V3JPSuwlU3pPonbJlLqpfTFTeA+dmd+VTI2b9/BZ94r9pxkBhlPcCw== + + + + + eJzt1TEOgCAQBMCrkQ9YGZ+KPNVY+wUbL8ELGljW7ja5hkCmgA0ibTnn+vydmuGuu2j2ILJNz1GzXDsC31zj974l8uxWk2n3miwbMa2NuiNx1923c2gXtINI0B6ivR+xGWavzTStrZPvu0vmj2KaNsm4eeDdXx51O/I= + + + + + + + + eJxjYBgFo2AU0AtIazEwyGihimlqMjBoadLWXnOgnRZo9roC7XSjsb3I4J8k/eyiF2hD4yvwQLAiD4Qvz4MQw6dvqAJi/TtUwWj8Du/4xQYKNPHzRwFuAABfLAtS + + + + + eJxjYBgFo2BkAwWegXbBKBgFo2AUjIJRMLQBAEtjAC0= + + + + + + + + + + + + [ + { + "type": "item", + "probability": 1, + "count": 1, + "itemName": "Cultist's Key" + } +] + + + + + + + [{ + "type": "randomCard", + "count": 2, + "colors": [ "colorID" ] +},{ + "type": "randomCard", + "count": 1, + "probability": 0.5, + "rarity": [ "rare" ], + "colors": [ "colorID" ] +},{ + "type": "randomCard", + "count": 3, + "addMaxCount": 2 +}] + + + + + [ + { + "editions": [ "SOI", "EMN", "MID", "VOW" ], + "type": "card", + "count": 10, + "rarity": [ "Common" ] + }, + { + "editions": [ "SOI", "EMN", "MID", "VOW" ], + "type": "card", + "count": 3, + "rarity": [ "Uncommon" ] + }, + { + "editions": [ "SOI", "EMN", "MID", "VOW" ], + "type": "card", + "count": 1, + "rarity": [ "Rare", "Mythic Rare" ] + } +] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + [{ + "text":"This door is locked", + "options":[ + { "name":"Leave" }, + { + "name":"Unlock with Cultist's Key", + "condition":[{"item":"Cultist's Key"}], + "text":"The gate is unlocked.", + "options":[{"name":"Continue.", "action":[ {"deleteMapObject":-1},{"removeItem":"Cultist's Key"}]} ] + } + ] +}] + + + + + + + + + + + diff --git a/forge-gui/res/adventure/common/maps/map/unhallowed_abbey_2F.tmx b/forge-gui/res/adventure/common/maps/map/unhallowed_abbey_2F.tmx new file mode 100644 index 00000000000..eae956d2c8d --- /dev/null +++ b/forge-gui/res/adventure/common/maps/map/unhallowed_abbey_2F.tmx @@ -0,0 +1,411 @@ + + + + + + + + + + + + + + eJxjYBi8wI2TMKaFnU8JmPuYynYTYye17SbFTmrZjctOdDOx2UGJ3SB903gxMUh8Nw9x6si1FxsAmYmPj6yfHLuxhScuc7DJDXV76aUfpG8lB3l6l3NQnpdgdhMbzpTaiW43MfZSy050u/EBatuJbDe+dEurOgnZHnz84WgvtcIWAIOHLCo= + + + + + eJx7ws7A8GQI4UJ54jE1zCAVD4Sd+Oynt33UjD9y7B6u4QyzE91uevkRXYxe4YzN/8MtXvHZTUt34Ms/tPY/NrMHMv8OZN1ArDtM+BhQQBM3+XaBzCIFIwNS9Q4GDAAw7Fue + + + + + eJzV1F0KwkAMBOB9788F2tIzCD2NnsIDqNeqtb2bK7IQFpvMBFcwMBS2bL/koZnrEOYfpM+C3Dk1ISz1fo7N99z0/mU+4lOrO2Az8yImaqMuYyI24npMy0bcQZjn0U5enXPeQZkV6aGEm2ytp1KuVaXcQ4e5U8u5W8yt8s16ifdW57y9007mp+8ye5KxNZPdk6htmawr7Wv1jvxP05lletz8jtwRbP8ybGn78R/qCRGT22E= + + + + + eJzl1G0OQDAMBuD+ZnoFcRXBwdzFvTDugcwSZsOqPhJv0tik2xM/CuCbkQFAGR5XH/CbidjviwWffdbktF1mFaky11y26zszXO9T3PZom+p2450S18/JLWYrR+Xa+q64tjTjne3s1qj2Puep7t3n/+hSZ0HPICXUOfT913DYHKavzWmatq5llu85TTM294m86ZpFzQDLEj8K + + + + + + + + eJxjYBgFo2AUDDZQKE89sx5rMjA80SRdjlLwH2SuFulyo4A0MBq/o2AU4AcAe0YOPQ== + + + + + + [{ + "type": "randomCard", + "count": 2, + "colors": [ "colorID" ] +},{ + "type": "randomCard", + "count": 1, + "probability": 0.5, + "rarity": [ "rare" ], + "colors": [ "colorID" ] +},{ + "type": "randomCard", + "count": 3, + "addMaxCount": 2 +}] + + + + + + + + + + + + + + + + + + [ + { + "editions": [ "VOW" ], + "type": "card", + "count": 10, + "rarity": [ "Common" ] + }, + { + "editions": [ "VOW" ], + "type": "card", + "count": 3, + "rarity": [ "Uncommon" ] + }, + { + "editions": [ "VOW" ], + "type": "card", + "count": 1, + "rarity": [ "Rare", "Mythic Rare" ] + } +] + + + + + + [{ + "type": "randomCard", + "count": 2, + "colors": [ "colorID" ] +},{ + "type": "randomCard", + "count": 1, + "probability": 0.5, + "rarity": [ "rare" ], + "colors": [ "colorID" ] +},{ + "type": "randomCard", + "count": 3, + "addMaxCount": 2 +}] + + + + + [ + { + "editions": [ "MID" ], + "type": "card", + "count": 10, + "rarity": [ "Common" ] + }, + { + "editions": [ "MID" ], + "type": "card", + "count": 3, + "rarity": [ "Uncommon" ] + }, + { + "editions": [ "MID" ], + "type": "card", + "count": 1, + "rarity": [ "Rare", "Mythic Rare" ] + } +] + + + + + + [{ + "type": "randomCard", + "count": 2, + "colors": [ "colorID" ] +},{ + "type": "randomCard", + "count": 1, + "probability": 0.5, + "rarity": [ "rare" ], + "colors": [ "colorID" ] +},{ + "type": "randomCard", + "count": 3, + "addMaxCount": 2 +}] + + + + + [{ + "type": "randomCard", + "count": 2, + "colors": [ "colorID" ] +},{ + "type": "randomCard", + "count": 1, + "probability": 0.5, + "rarity": [ "rare" ], + "colors": [ "colorID" ] +},{ + "type": "randomCard", + "count": 3, + "addMaxCount": 2 +}] + + + + + [ + { + "editions": [ "SOI" ], + "type": "card", + "count": 10, + "rarity": [ "Common" ] + }, + { + "editions": [ "SOI" ], + "type": "card", + "count": 3, + "rarity": [ "Uncommon" ] + }, + { + "editions": [ "SOI" ], + "type": "card", + "count": 1, + "rarity": [ "Rare", "Mythic Rare" ] + } +] + + + + + + [ + { + "editions": [ "EMN" ], + "type": "card", + "count": 10, + "rarity": [ "Common" ] + }, + { + "editions": [ "EMN" ], + "type": "card", + "count": 3, + "rarity": [ "Uncommon" ] + }, + { + "editions": [ "EMN" ], + "type": "card", + "count": 1, + "rarity": [ "Rare", "Mythic Rare" ] + } +] + + + + + + + + + + + + + + + + + + + + + + + + + + + + [{ + "text":"A translucent, shimmering red field blocks your path. Pained screams echo through the room behind you.", + "options":[ + { "name":"Leave." } + ] +}] + + + + + [ + { + "text":"A captive lies tied to the altar. Glowing red runes encircle them.", + "options":[ + { + "text":"As the third captive is freed, you hear the sound of shattering as the barrier in the center of the chamber fails. Time to end this.", + "action":[{"deleteMapObject":-1},{"advanceMapFlag":"gate"}], + "name":"Free them." + "options":[{ + "condition":[{"getMapFlag":{"key":"gate","op":">=","val":3}}], + "action":[{"deleteMapObject":108}], + "name":"ok" }] + }, + { "name":"Leave." } + ] + } + +] + + + + + [ + { + "text":"A captive lies tied to the altar. Glowing red runes encircle them.", + "options":[ + { + "text":"As the third captive is freed, you hear the sound of shattering as the barrier in the center of the chamber fails. Time to end this.", + "action":[{"deleteMapObject":-1},{"advanceMapFlag":"gate"}], + "name":"Free them." + "options":[{ + "condition":[{"getMapFlag":{"key":"gate","op":">=","val":3}}], + "action":[{"deleteMapObject":108}], + "name":"ok" }] + }, + { "name":"Leave." } + ] + } + +] + + + + + [ + { + "text":"A captive lies tied to the altar. Glowing red runes encircle them.", + "options":[ + { + "text":"As the third captive is freed, you hear the sound of shattering as the barrier in the center of the chamber fails. Time to end this.", + "action":[{"deleteMapObject":-1},{"advanceMapFlag":"gate"}], + "name":"Free them." + "options":[{ + "condition":[{"getMapFlag":{"key":"gate","op":">=","val":3}}], + "action":[{"deleteMapObject":108}], + "name":"ok" }] + }, + { "name":"Leave." } + ] + } + +] + + + + + [{ + "text":"*The large, imposing demon before you smirks*\n Ah, so you must be the one who's been freeing my sacrifices...and the volunteer to be my new one. Tell me, mortal, as your last words that aren't a howl of pain - why challenge me?", + "options":[{ + "name":"Because you're a monster, and you should be stopped!", + "text":"*The demon sneers.*\n Ah, a noble *hero*. I should have guessed. Your kind die like anyone else when your power runs dry - allow me to demonstrate!", + "options":[{ + "name":"End", + "action":[{"deleteMapObject":113}] + }] + }, + { + "name":"I want power. I'll take it from what's left of you.", + "text":"*The demon chuckles.*\n I'll commend your ambition, if not your sense. Fight hard enough, and I might let you replace that failure you dealt with upstairs.", + "options":[{ + "name":"End", + "action":[{"deleteMapObject":113}] + }] + }, + { + "name":"Honestly, you just looked like you'd be a good fight.", + "text":"*The demon blinks in surprise, then laughs.*\n Well, if that's what you seek, you'll find more than you bargained for here. I hope you enjoy the last battle of your life, *mortal*.", + "options":[{ + "name":"End", + "action":[{"deleteMapObject":113}] + }] + }, + { + "name":"...", + "text":"*The fiend's eyes narrow.*\n Too scared for words? So be it, mortal. You'll die all the same.", + "options":[{ + "name":"End", + "action":[{"deleteMapObject":113}] + }] + }] +}] + + + + + [{ + "text":"*With a snarl of pain, the demon collapses to the floor.* \n Congratulations, mortal, you've bested me. In exchange for my life, I offer a lesson - the same killing power I wield.", + "options":[{ + "name":"I have no need for power from something as vile as you. Die!", + "text":"*The demon's eyes widen in fear.* \n No! I will not be destroyed by- \n *A final blast of power reduces him to mana in the air of this place, and something clatters to the ground. A holy symbol of this place - or rather, what it once was. As the unholy energy around it fades, you can still feel magic coursing through it.*" + "options":[{ + "name":"End", + "action":[{"addItem":"Hallowed Sigil"},{"deleteMapObject":116}] + }] + }, + { + "name":"If you knew anything worth teaching me directly, I wouldn't have been able to defeat you.", + "text":"*The demon's eyes widen in fear.* \n No! I will not be destroyed by- \n *A final blast of power reduces him to mana in the air of this place, and something clatters to the ground. A holy symbol of this place - or rather, what it once was. As the unholy energy around it fades, you can still feel magic coursing through it.*" + "options":[{ + "name":"End", + "action":[{"addItem":"Hallowed Sigil"},{"deleteMapObject":116}] + }] + }, + { + "name":"...Very well, even a monster like you deserves mercy. *Once.*", + "text":"*The demon smiles, moving his hand in an arcane gesture.* \n *As you unconsciously mimic it, you feel a dark, repulsive power crystallize in your hand. \n *The demon smiles as he begins to fade into a cloud of smoke.* \n Very well, mortal. My power is yours to wield...until next time." + "options":[{ + "name":"End", + "action":[{"addItem":"Unhallowed Sigil"},{"deleteMapObject":116}] + }] + }, + { + "name":"As you should. I'll take your offer.", + "text":"*The demon smiles, moving his hand in an arcane gesture.* \n *As you unconsciously mimic it, you feel a dark, repulsive power crystallize in your hand. \n *The demon smiles as he begins to fade into a cloud of smoke.* \n Very well, mortal. My power is yours to wield...until next time." + "options":[{ + "name":"End", + "action":[{"addItem":"Unhallowed Sigil"},{"deleteMapObject":116}] + }] + }] +}] + + { "startBattleWithCard": [ "Mox Jet", "Power of Valyx"] +} + + + + + diff --git a/forge-gui/res/adventure/common/maps/tileset/DarkAbbeyTiles.png b/forge-gui/res/adventure/common/maps/tileset/DarkAbbeyTiles.png new file mode 100644 index 00000000000..2af614a0e4c Binary files /dev/null and b/forge-gui/res/adventure/common/maps/tileset/DarkAbbeyTiles.png differ diff --git a/forge-gui/res/adventure/common/maps/tileset/DarkAbbeyTiles.tsx b/forge-gui/res/adventure/common/maps/tileset/DarkAbbeyTiles.tsx new file mode 100644 index 00000000000..28524076808 --- /dev/null +++ b/forge-gui/res/adventure/common/maps/tileset/DarkAbbeyTiles.tsx @@ -0,0 +1,4 @@ + + + + diff --git a/forge-gui/res/adventure/common/maps/tileset/desertbuildingtiles.png b/forge-gui/res/adventure/common/maps/tileset/desertbuildingtiles.png index edacd848194..2a1f1ca3ea5 100644 Binary files a/forge-gui/res/adventure/common/maps/tileset/desertbuildingtiles.png and b/forge-gui/res/adventure/common/maps/tileset/desertbuildingtiles.png differ diff --git a/forge-gui/res/adventure/common/maps/tileset/desertbuildingtiles.tsx b/forge-gui/res/adventure/common/maps/tileset/desertbuildingtiles.tsx new file mode 100644 index 00000000000..cf06f6599b0 --- /dev/null +++ b/forge-gui/res/adventure/common/maps/tileset/desertbuildingtiles.tsx @@ -0,0 +1,1406 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/forge-gui/res/adventure/common/sprites/enemy/construct/golem.png b/forge-gui/res/adventure/common/sprites/enemy/construct/golem.png index a2e64d6d223..4dcec721bb4 100644 Binary files a/forge-gui/res/adventure/common/sprites/enemy/construct/golem.png and b/forge-gui/res/adventure/common/sprites/enemy/construct/golem.png differ diff --git a/forge-gui/res/adventure/common/sprites/enemy/construct/golem_2.png b/forge-gui/res/adventure/common/sprites/enemy/construct/golem_2.png index f6eb64de096..1f5cb6a8ceb 100644 Binary files a/forge-gui/res/adventure/common/sprites/enemy/construct/golem_2.png and b/forge-gui/res/adventure/common/sprites/enemy/construct/golem_2.png differ diff --git a/forge-gui/res/adventure/common/sprites/enemy/fiend/valyx.atlas b/forge-gui/res/adventure/common/sprites/enemy/fiend/valyx.atlas new file mode 100644 index 00000000000..8ca0984d795 --- /dev/null +++ b/forge-gui/res/adventure/common/sprites/enemy/fiend/valyx.atlas @@ -0,0 +1,68 @@ +valyx.png +size: 136,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 0, 0 + size: 16, 16 +Idle + xy: 0, 16 + size: 24, 24 +Idle + xy: 24, 16 + size: 24, 24 +Idle + xy: 48, 16 + size: 24, 24 +Idle + xy: 72, 16 + size: 24, 24 +Walk + xy: 0, 40 + size: 24, 24 +Walk + xy: 24, 40 + size: 24, 24 +Walk + xy: 48, 40 + size: 24, 24 +Walk + xy: 72, 40 + size: 24, 24 +Attack + xy: 0, 64 + size: 24, 24 +Attack + xy: 24, 64 + size: 24, 24 +Attack + xy: 48, 64 + size: 24, 24 +Attack + xy: 72, 64 + size: 24, 24 +Hit + xy: 0, 88 + size: 24, 24 +Hit + xy: 24, 88 + size: 24, 24 +Hit + xy: 48, 88 + size: 24, 24 +Hit + xy: 72, 88 + size: 24, 24 +Death + xy: 0, 112 + size: 24, 24 +Death + xy: 24, 112 + size: 24, 24 +Death + xy: 48, 112 + size: 24, 24 +Death + xy: 72, 112 + size: 24, 24 \ No newline at end of file diff --git a/forge-gui/res/adventure/common/sprites/enemy/fiend/valyx.png b/forge-gui/res/adventure/common/sprites/enemy/fiend/valyx.png new file mode 100644 index 00000000000..4dac80504b5 Binary files /dev/null and b/forge-gui/res/adventure/common/sprites/enemy/fiend/valyx.png differ diff --git a/forge-gui/res/adventure/common/sprites/enemy/humanoid/human/knight/false_knight.atlas b/forge-gui/res/adventure/common/sprites/enemy/humanoid/human/knight/false_knight.atlas new file mode 100644 index 00000000000..777f85e76d7 --- /dev/null +++ b/forge-gui/res/adventure/common/sprites/enemy/humanoid/human/knight/false_knight.atlas @@ -0,0 +1,68 @@ +false_knight.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 0, 0 + size: 16, 16 +Idle + xy: 0, 16 + size: 16, 16 +Idle + xy: 16, 16 + size: 16, 16 +Idle + xy: 32, 16 + size: 16, 16 +Idle + xy: 48, 16 + size: 16, 16 +Walk + xy: 0, 32 + size: 16, 16 +Walk + xy: 16, 32 + size: 16, 16 +Walk + xy: 32, 32 + size: 16, 16 +Walk + xy: 48, 32 + size: 16, 16 +Attack + xy: 0, 48 + size: 16, 16 +Attack + xy: 16, 48 + size: 16, 16 +Attack + xy: 32, 48 + size: 16, 16 +Attack + xy: 48, 48 + size: 16, 16 +Hit + xy: 0, 64 + size: 16, 16 +Hit + xy: 16, 64 + size: 16, 16 +Hit + xy: 32, 64 + size: 16, 16 +Hit + xy: 48, 64 + size: 16, 16 +Death + xy: 0, 80 + size: 16, 16 +Death + xy: 16, 80 + size: 16, 16 +Death + xy: 32, 80 + size: 16, 16 +Death + xy: 48, 80 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/common/sprites/enemy/humanoid/human/knight/false_knight.png b/forge-gui/res/adventure/common/sprites/enemy/humanoid/human/knight/false_knight.png new file mode 100644 index 00000000000..5211715edd2 Binary files /dev/null and b/forge-gui/res/adventure/common/sprites/enemy/humanoid/human/knight/false_knight.png differ diff --git a/forge-gui/res/adventure/common/sprites/enemy/humanoid/human/warlock/false_monk.atlas b/forge-gui/res/adventure/common/sprites/enemy/humanoid/human/warlock/false_monk.atlas new file mode 100644 index 00000000000..df33fba0a9d --- /dev/null +++ b/forge-gui/res/adventure/common/sprites/enemy/humanoid/human/warlock/false_monk.atlas @@ -0,0 +1,68 @@ +false_monk.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 0, 0 + size: 16, 16 +Idle + xy: 0, 16 + size: 16, 16 +Idle + xy: 16, 16 + size: 16, 16 +Idle + xy: 32, 16 + size: 16, 16 +Idle + xy: 48, 16 + size: 16, 16 +Walk + xy: 0, 32 + size: 16, 16 +Walk + xy: 16, 32 + size: 16, 16 +Walk + xy: 32, 32 + size: 16, 16 +Walk + xy: 48, 32 + size: 16, 16 +Attack + xy: 0, 48 + size: 16, 16 +Attack + xy: 16, 48 + size: 16, 16 +Attack + xy: 32, 48 + size: 16, 16 +Attack + xy: 48, 48 + size: 16, 16 +Hit + xy: 0, 64 + size: 16, 16 +Hit + xy: 16, 64 + size: 16, 16 +Hit + xy: 32, 64 + size: 16, 16 +Hit + xy: 48, 64 + size: 16, 16 +Death + xy: 0, 80 + size: 16, 16 +Death + xy: 16, 80 + size: 16, 16 +Death + xy: 32, 80 + size: 16, 16 +Death + xy: 48, 80 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/common/sprites/enemy/humanoid/human/warlock/false_monk.png b/forge-gui/res/adventure/common/sprites/enemy/humanoid/human/warlock/false_monk.png new file mode 100644 index 00000000000..112f3e06f75 Binary files /dev/null and b/forge-gui/res/adventure/common/sprites/enemy/humanoid/human/warlock/false_monk.png differ diff --git a/forge-gui/res/adventure/common/sprites/enemy/humanoid/human/warlock/high_cultist.atlas b/forge-gui/res/adventure/common/sprites/enemy/humanoid/human/warlock/high_cultist.atlas new file mode 100644 index 00000000000..c2c7608c554 --- /dev/null +++ b/forge-gui/res/adventure/common/sprites/enemy/humanoid/human/warlock/high_cultist.atlas @@ -0,0 +1,68 @@ +high_cultist.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 0, 0 + size: 16, 16 +Idle + xy: 0, 16 + size: 16, 16 +Idle + xy: 16, 16 + size: 16, 16 +Idle + xy: 32, 16 + size: 16, 16 +Idle + xy: 48, 16 + size: 16, 16 +Walk + xy: 0, 32 + size: 16, 16 +Walk + xy: 16, 32 + size: 16, 16 +Walk + xy: 32, 32 + size: 16, 16 +Walk + xy: 48, 32 + size: 16, 16 +Attack + xy: 0, 48 + size: 16, 16 +Attack + xy: 16, 48 + size: 16, 16 +Attack + xy: 32, 48 + size: 16, 16 +Attack + xy: 48, 48 + size: 16, 16 +Hit + xy: 0, 64 + size: 16, 16 +Hit + xy: 16, 64 + size: 16, 16 +Hit + xy: 32, 64 + size: 16, 16 +Hit + xy: 48, 64 + size: 16, 16 +Death + xy: 0, 80 + size: 16, 16 +Death + xy: 16, 80 + size: 16, 16 +Death + xy: 32, 80 + size: 16, 16 +Death + xy: 48, 80 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/common/sprites/enemy/humanoid/human/warlock/high_cultist.png b/forge-gui/res/adventure/common/sprites/enemy/humanoid/human/warlock/high_cultist.png new file mode 100644 index 00000000000..f90ebb16ff5 Binary files /dev/null and b/forge-gui/res/adventure/common/sprites/enemy/humanoid/human/warlock/high_cultist.png differ diff --git a/forge-gui/res/adventure/common/sprites/items.atlas b/forge-gui/res/adventure/common/sprites/items.atlas index cfec35a2852..a3a5d676160 100644 --- a/forge-gui/res/adventure/common/sprites/items.atlas +++ b/forge-gui/res/adventure/common/sprites/items.atlas @@ -468,4 +468,9 @@ CartoucheOfAmbition CartoucheOfZeal xy:320,240 size:16,16 - +HallowedSigil + xy:320,256 + size:16,16 +UnhallowedSigil + xy:320,272 + size:16,16 diff --git a/forge-gui/res/adventure/common/sprites/items.png b/forge-gui/res/adventure/common/sprites/items.png index c05441b3629..504fa8e2dad 100644 Binary files a/forge-gui/res/adventure/common/sprites/items.png and b/forge-gui/res/adventure/common/sprites/items.png differ diff --git a/forge-gui/res/adventure/common/world/biomes/luxa.json b/forge-gui/res/adventure/common/world/biomes/luxa.json index cf93e5705c9..82412d8857d 100644 --- a/forge-gui/res/adventure/common/world/biomes/luxa.json +++ b/forge-gui/res/adventure/common/world/biomes/luxa.json @@ -43,8 +43,8 @@ "x": 0.5, "y": 0.5, "structureAtlasPath": "world/tilesets/terrain.atlas", - "sourcePath": "world/models/fill.png", - "maskPath": "world/masks/fill.png", + "sourcePath": "world/structures/models/fill.png", + "maskPath": "world/structures/masks/fill.png", "height": 0.99, "width": 0.9, "periodicOutput": false, diff --git a/forge-gui/res/adventure/common/world/biomes/outlands.json b/forge-gui/res/adventure/common/world/biomes/outlands.json index ff3d4b8ceba..1c4173e964d 100644 --- a/forge-gui/res/adventure/common/world/biomes/outlands.json +++ b/forge-gui/res/adventure/common/world/biomes/outlands.json @@ -32,8 +32,8 @@ "x": 0.5, "y": 0.5, "structureAtlasPath": "world/structures/structures.atlas", - "sourcePath": "world/models/fill.png", - "maskPath": "world/masks/fill.png", + "sourcePath": "world/structures/models/fill.png", + "maskPath": "world/structures/masks/fill.png", "height": 0.99, "width": 0.9, "periodicOutput": false, diff --git a/forge-gui/res/adventure/common/world/biomes/white.json b/forge-gui/res/adventure/common/world/biomes/white.json index 6bf5c73f376..0f3ac671de3 100644 --- a/forge-gui/res/adventure/common/world/biomes/white.json +++ b/forge-gui/res/adventure/common/world/biomes/white.json @@ -107,7 +107,8 @@ "CaveW6", "OrthodoxyBasilica", "Nahiri Encampment", - "MageTower White" + "MageTower White", + "UnhallowedAbbey" ], "structures": [ { diff --git a/forge-gui/res/adventure/common/world/enemies.json b/forge-gui/res/adventure/common/world/enemies.json index 6596fe86d44..5b7ed284d30 100644 --- a/forge-gui/res/adventure/common/world/enemies.json +++ b/forge-gui/res/adventure/common/world/enemies.json @@ -7840,6 +7840,168 @@ "BiomeWhite" ] }, +{ + "name": "False Knight", + "sprite": "sprites/enemy/humanoid/human/knight/false_knight.atlas", + "deck": [ + "decks/standard/death_knight.dck" + ], + "ai": "", + "spawnRate": 1, + "difficulty": 0.1, + "speed": 30, + "life": 18, + "rewards": [ + { + "type": "deckCard", + "probability": 1, + "count": 2, + "addMaxCount": 4, + "rarity": [ + "common" + ] + }, + { + "type": "deckCard", + "probability": 0.5, + "count": 1, + "addMaxCount": 2, + "rarity": [ + "uncommon" + ], + "cardTypes": [ + "Creature", + "Artifact", + "Enchantment", + "Instant", + "Sorcery" + ] + }, + { + "type": "deckCard", + "probability": 0.25, + "count": 1, + "addMaxCount": 1, + "rarity": [ + "rare", + "mythicrare" + ], + "cardTypes": [ + "Creature", + "Artifact", + "Enchantment", + "Instant", + "Sorcery" + ] + }, + { + "type": "deckCard", + "probability": 0.1, + "count": 1, + "rarity": [ + "rare" + ], + "cardTypes": [ + "Land" + ] + }, + { + "type": "gold", + "probability": 0.3, + "count": 10, + "addMaxCount": 90 + } + ], + "colors": "B", + "questTags": [ + "Disguised", + "Soldier", + "Human", + "Knight", + "Unholy", + "IdentityBlack" + ] +}, +{ + "name": "False Monk", + "sprite": "sprites/enemy/humanoid/human/warlock/false_monk.atlas", + "deck": [ + "decks/standard/cultist.dck" + ], + "randomizeDeck": false, + "spawnRate": 1, + "difficulty": 0.1, + "speed": 24, + "life": 15, + "rewards": [ + { + "type": "deckCard", + "probability": 1 + "count": 2, + "addMaxCount": 2, + "rarity": [ + "common" + ] + }, + { + "type": "deckCard", + "probability": 0.5, + "count": 1, + "addMaxCount": 1, + "rarity": [ + "uncommon" + ], + "cardTypes": [ + "Creature", + "Artifact", + "Enchantment", + "Instant", + "Sorcery" + ] + }, + { + "type": "deckCard", + "probability": 0.25, + "count": 1, + "addMaxCount": 1, + "rarity": [ + "rare", + "mythicrare" + ], + "cardTypes": [ + "Creature", + "Artifact", + "Enchantment", + "Instant", + "Sorcery" + ] + }, + { + "type": "deckCard", + "probability": 0.1, + "count": 1, + "rarity": [ + "rare" + ], + "cardTypes": [ + "Land" + ] + }, + { + "type": "gold", + "probability": 0.3, + "count": 10, + "addMaxCount": 90 + } + ], + "colors": "B", + "questTags": [ + "Human", + "Disguised", + "Unholy", + "IdentityBlack", + ] +}, { "name": "Farmer", "nameOverride": "", @@ -11673,6 +11835,86 @@ null ] }, +{ + "name": "High Cultist", + "sprite": "sprites/enemy/humanoid/human/warlock/high_cultist.atlas", + "deck": [ + "decks/standard/cultist.dck" + ], + "randomizeDeck": false, + "spawnRate": 1, + "difficulty": 0.1, + "speed": 24, + "life": 30, + "rewards": [ + { + "type": "deckCard", + "probability": 1, + "count": 2, + "addMaxCount": 4, + "rarity": [ + "common" + ] + }, + { + "type": "deckCard", + "probability": 0.5, + "count": 1, + "addMaxCount": 2, + "rarity": [ + "uncommon" + ], + "cardTypes": [ + "Creature", + "Artifact", + "Enchantment", + "Instant", + "Sorcery" + ] + }, + { + "type": "deckCard", + "probability": 0.25, + "count": 1, + "addMaxCount": 1, + "rarity": [ + "rare", + "mythicrare" + ], + "cardTypes": [ + "Creature", + "Artifact", + "Enchantment", + "Instant", + "Sorcery" + ] + }, + { + "type": "deckCard", + "probability": 0.1, + "count": 1, + "rarity": [ + "rare" + ], + "cardTypes": [ + "Land" + ] + }, + { + "type": "gold", + "probability": 0.3, + "count": 10, + "addMaxCount": 90 + } + ], + "colors": "B", + "questTags": [ + "Human", + "Disguised", + "Unholy", + "IdentityBlack", + ] +}, { "name": "High Elf", "sprite": "sprites/enemy/humanoid/elf/druid_2.atlas", @@ -21035,6 +21277,69 @@ "BiomeRed" ] }, +{ + "name": "Valyx Feaster of Torment", + "sprite": "sprites/enemy/fiend/valyx.atlas", + "deck": [ + "decks/miniboss/valyx.dck" + ], + "ai": "", + "spawnRate": 1, + "difficulty": 0.1, + "speed": 31, + "life": 80, + "rewards": [ + { + "type": "deckCard", + "probability": 1, + "count": 2, + "addMaxCount": 4, + "rarity": [ + "common" + ] + }, + { + "type": "deckCard", + "probability": 1, + "count": 2, + "addMaxCount": 2, + "rarity": [ + "uncommon" + ], + "cardTypes": [ + "Creature", + "Artifact", + "Enchantment", + "Instant", + "Sorcery" + ] + }, + { + "type": "deckCard", + "probability": 1, + "count": 2, + "addMaxCount": 1, + "rarity": [ + "rare", + "mythicrare" + ], + "cardTypes": [ + "Creature", + "Artifact", + "Enchantment", + "Instant", + "Sorcery" + ] + } + ], + "colors": "B", + "questTags": [ + "Demon", + "Humanoid", + "Unholy", + "IdentityBlack" + ] +}, { "name": "Vampire", "sprite": "sprites/enemy/undead/vampire.atlas", diff --git a/forge-gui/res/adventure/common/world/items.json b/forge-gui/res/adventure/common/world/items.json index 434984aace0..dab5ea941ba 100644 --- a/forge-gui/res/adventure/common/world/items.json +++ b/forge-gui/res/adventure/common/world/items.json @@ -1234,5 +1234,32 @@ "Slobad's Iron Boots" ] } -} +}, + { + "name": "Hallowed Sigil", + "description": "Turn a creature hexproof until end of turn.", + "equipmentSlot": "Neck", + "iconName": "HallowedSigil", + "effect": { + "startBattleWithCard": [ + "Hallowed Sigil" + ] + } + }, + { + "name": "Unhallowed Sigil", + "description": "Devour the life of an enemy creature, killing it.", + "equipmentSlot": "Right", + "iconName": "UnhallowedSigil", + "effect": { + "startBattleWithCard": [ + "Sigil of Torment" + ] + } + }, + { + "name": "Cultist's Key", + "iconName": "StrangeKey", + "questItem": true + } ] diff --git a/forge-gui/res/adventure/common/world/points_of_interest.json b/forge-gui/res/adventure/common/world/points_of_interest.json index a877535b4c2..969e10f2d64 100644 --- a/forge-gui/res/adventure/common/world/points_of_interest.json +++ b/forge-gui/res/adventure/common/world/points_of_interest.json @@ -3130,6 +3130,18 @@ "Planeswalker" ] }, +{ + "name": "UnhallowedAbbey", + "type": "dungeon", + "count": 1, + "spriteAtlas": "maps/tileset/buildings.atlas", + "sprite": "Monastery", + "map": "../common/maps/map/unhallowed_abbey_1F.tmx", + "radiusFactor": 0.8, + "questTags": [ + "UnhallowedAbbey" + ] +}, { "name": "VampireCastle", "type": "dungeon", diff --git a/forge-gui/res/cardsfolder/s/scepter_of_celebration.txt b/forge-gui/res/cardsfolder/s/scepter_of_celebration.txt index fa4d06d973c..a6fb17bd071 100644 --- a/forge-gui/res/cardsfolder/s/scepter_of_celebration.txt +++ b/forge-gui/res/cardsfolder/s/scepter_of_celebration.txt @@ -1,7 +1,7 @@ Name:Scepter of Celebration ManaCost:2 G Types:Artifact Equipment -S:Mode$ Continuous | Affected$ Creature.EquippedBy | AddPower$ 2 | AddKeyword$ Trample | Description$ Equipped creature gets +2/+2 and has trample. +S:Mode$ Continuous | Affected$ Creature.EquippedBy | AddPower$ 2 | AddKeyword$ Trample | Description$ Equipped creature gets +2/+0 and has trample. T:Mode$ DamageDone | ValidSource$ Card.EquippedBy | Execute$ TrigToken | CombatDamage$ True | ValidTarget$ Player | TriggerZones$ Battlefield | TriggerDescription$ Whenever equipped creature deals combat damage to a player, create that many 1/1 green and white Citizen creature tokens. SVar:TrigToken:DB$ Token | TokenAmount$ X | TokenScript$ gw_1_1_citizen SVar:X:TriggerCount$DamageAmount diff --git a/forge-gui/res/cardsfolder/upcoming/bill_the_pony.txt b/forge-gui/res/cardsfolder/upcoming/bill_the_pony.txt index 69823147fb7..6412e132462 100644 --- a/forge-gui/res/cardsfolder/upcoming/bill_the_pony.txt +++ b/forge-gui/res/cardsfolder/upcoming/bill_the_pony.txt @@ -4,7 +4,7 @@ Types:Legendary Creature Horse PT:1/4 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigFood | TriggerDescription$ When CARDNAME enters the battlefield, create two Food tokens. (They’re artifacts with "{2}, Sacrifice this artifact: You gain 3 life.") SVar:TrigFood:DB$ Token | TokenAmount$ 2 | TokenScript$ c_a_food_sac | TokenOwner$ You -A:AB$ Effect | Cost$ Sac<2/Food> | ValidTgts$ Creature.YouCtrl | RememberObjects$ Targeted | StaticAbilities$ CombatDamageToughness | ForgetOnMoved$ Battlefield | TgtPrompt$ Select target creature you control | SpellDescription$ Until end of turn, target creature you control assigns combat damage equal to its toughness rather than its power. +A:AB$ Effect | Cost$ Sac<1/Food> | ValidTgts$ Creature.YouCtrl | RememberObjects$ Targeted | StaticAbilities$ CombatDamageToughness | ForgetOnMoved$ Battlefield | TgtPrompt$ Select target creature you control | SpellDescription$ Until end of turn, target creature you control assigns combat damage equal to its toughness rather than its power. SVar:CombatDamageToughness:Mode$ CombatDamageToughness | ValidCard$ Card.IsRemembered | Description$ This creature assigns combat damage equal to its toughness rather than its power. DeckHas:Ability$Token|LifeGain|Sacrifice & Type$Food DeckHints:Type$Food|Treefolk|Wall diff --git a/forge-gui/res/cardsfolder/upcoming/grima_sarumans_footman.txt b/forge-gui/res/cardsfolder/upcoming/grima_sarumans_footman.txt new file mode 100644 index 00000000000..058ddd75409 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/grima_sarumans_footman.txt @@ -0,0 +1,11 @@ +Name:Grima, Saruman's Footman +ManaCost:2 U B +Types:Legendary Creature Human Advisor +PT:1/4 +S:Mode$ CantBlockBy | ValidAttacker$ Creature.Self | Description$ CARDNAME can't be blocked. +T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigDigUntil | TriggerZones$ Battlefield | TriggerDescription$ Whenever NICKNAME deals combat damage to a player, that player exiles cards from the top of their library until they exile an instant or sorcery card. You may cast that card without paying its mana cost. Then that player puts the exiled cards that weren't cast this way on the bottom of their library in a random order. +SVar:TrigDigUntil:DB$ DigUntil | Defined$ TriggeredTarget | Valid$ Instant,Sorcery | ValidDescription$ instant or sorcery | FoundDestination$ Exile | RevealedDestination$ Exile | RememberFound$ True | IsCurse$ True | SubAbility$ DBPlay +SVar:DBPlay:DB$ Play | ValidZone$ Exile | Valid$ Instant.IsRemembered,Sorcery.IsRemembered | ValidSA$ Spell | WithoutManaCost$ True | Optional$ True | ForgetPlayed$ True | SubAbility$ DBRestRandomOrder +SVar:DBRestRandomOrder:DB$ ChangeZoneAll | ChangeType$ Card.IsRemembered | Origin$ Exile | Destination$ Library | LibraryPosition$ -1 | RandomOrder$ True | SubAbility$ DBCleanup +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +Oracle:Grima, Saruman's Footman can't be blocked.\nWhenever Grima deals combat damage to a player, that player exiles cards from the top of their library until they exile an instant or sorcery card. You may cast that card without paying its mana cost. Then that player puts the exiled cards that weren't cast this way on the bottom of their library in a random order. diff --git a/forge-gui/res/cardsfolder/upcoming/gwaihir_greatest_of_the_eagles.txt b/forge-gui/res/cardsfolder/upcoming/gwaihir_greatest_of_the_eagles.txt new file mode 100644 index 00000000000..b90e43a8695 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/gwaihir_greatest_of_the_eagles.txt @@ -0,0 +1,14 @@ +Name:Gwaihir, Greatest of the Eagles +ManaCost:4 W +Types:Legendary Creature Bird Noble +PT:5/5 +K:Flying +T:Mode$ Attacks | ValidCard$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ Whenever NICKNAME attacks, target attacking creature gains flying until end of turn. +SVar:TrigPump:DB$ Pump | ValidTgts$ Creature.attacking | TgtPrompt$ Select target attacking creature | KW$ Flying +T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | TriggerZones$ Battlefield | CheckSVar$ LifeGained | SVarCompare$ GE3 | Execute$ TrigToken | TriggerDescription$ At the beginning of your end step, if you gained 3 or more life this turn, create a 3/3 white Bird creature token with flying and "Whenever this creature attacks, target attacking creature gains flying until end of turn." +SVar:TrigToken:DB$ Token | TokenScript$ w_3_3_bird_flying_attacks +SVar:LifeGained:Count$LifeYouGainedThisTurn +SVar:HasAttackEffect:TRUE +DeckHints:Ability$LifeGain +DeckHas:Ability$Token +Oracle:Flying\nWhenever Gwaihir attacks, target attacking creature gains flying until end of turn.\nAt the beginning of your end step, if you gained 3 or more life this turn, create a 3/3 white Bird creature token with flying and "Whenever this creature attacks, target attacking creature gains flying until end of turn." diff --git a/forge-gui/res/cardsfolder/upcoming/haldir_lorien_lieutenant.txt b/forge-gui/res/cardsfolder/upcoming/haldir_lorien_lieutenant.txt new file mode 100644 index 00000000000..c0cec6ba29d --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/haldir_lorien_lieutenant.txt @@ -0,0 +1,11 @@ +Name:Haldir, Lorien Lieutenant +ManaCost:X G +Types:Legendary Creature Elf Soldier +PT:0/0 +K:Vigilance +K:etbCounter:P1P1:X +SVar:X:Count$xPaid +A:AB$ PumpAll | Cost$ 5 G | ValidCards$ Creature.Elf+StrictlyOther+YouCtrl | NumAtt$ Y | NumDef$ Y | KW$ Vigilance | SpellDescription$ Until end of turn, other Elves you control gain vigilance and get +1/+1 for each +1/+1 counter on NICKNAME. +SVar:Y:Count$CardCounters.P1P1 +DeckHas:Ability$Counters +Oracle:Haldir, Lorien Lieutenant enters the battlefield with X +1/+1 counters on it.\nVigilance\n{5}{G}: Until end of turn, other Elves you control gain vigilance and get +1/+1 for each +1/+1 counter on Haldir. diff --git a/forge-gui/res/cardsfolder/upcoming/lobelia_defender_of_bag_end.txt b/forge-gui/res/cardsfolder/upcoming/lobelia_defender_of_bag_end.txt new file mode 100644 index 00000000000..dc1ec2861e6 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/lobelia_defender_of_bag_end.txt @@ -0,0 +1,12 @@ +Name:Lobelia, Defender of Bag End +ManaCost:2 B +Types:Legendary Creature Halfling Citizen +PT:2/2 +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigExile | TriggerDescription$ When NICKNAME enters the battlefield, look at the top card of each opponent's library and exile those cards face down. +SVar:TrigExile:DB$ Dig | DigNum$ 1 | ChangeNum$ All | Defined$ Opponent | DestinationZone$ Exile | ExileFaceDown$ True +A:AB$ Charm | Cost$ T Sac<1/Artifact> | Choices$ DBEffect,DBLoseGain +SVar:DBEffect:DB$ Effect | StaticAbilities$ STPlay | SpellDescription$ Until end of turn, you may play a card exiled with NICKNAME without paying its mana cost. +SVar:STPlay:Mode$ Continuous | MayPlay$ True | WithoutManaCost$ True | Affected$ Card.ExiledWithEffectSource | AffectedZone$ Exile | MayPlayLimit$ 1 +SVar:DBLoseGain:DB$ LoseLife | Defined$ Opponent | LifeAmount$ 2 | SubAbility$ DBGain2 | SpellDescription$ Each opponent loses 2 life and you gain 2 life. +SVar:DBGain2:DB$ GainLife | Defined$ You | LifeAmount$ 2 +Oracle:When Lobelia enters the battlefield, look at the top card of each opponent's library and exile those cards face down.\n{T}, Sacrifice an artifact: Choose one —\n• Until end of turn, you may play a card exiled with Lobelia without paying its mana cost.\n• Each opponent loses 2 life and you gain 2 life. diff --git a/forge-gui/res/cardsfolder/upcoming/lord_of_the_nazgul.txt b/forge-gui/res/cardsfolder/upcoming/lord_of_the_nazgul.txt new file mode 100644 index 00000000000..a3dd4aaaf1e --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/lord_of_the_nazgul.txt @@ -0,0 +1,12 @@ +Name:Lord of the Nazgul +ManaCost:3 U B +Types:Legendary Creature Wraith Noble +PT:4/4 +K:Flying +S:Mode$ Continuous | Affected$ Creature.Wraith+YouCtrl | AddKeyword$ Protection from Ringbearers | Description$ Wraiths you control have protection from Ring-bearers. +T:Mode$ SpellCast | ValidCard$ Instant,Sorcery | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigToken | TriggerDescription$ Whenever you cast an instant or sorcery spell, create a 3/3 black Wraith creature token with menace. Then if you control nine or more Wraiths, Wraiths you control have base power and toughness 9/9 until end of turn. +SVar:TrigToken:DB$ Token | TokenAmount$ 1 | TokenScript$ b_3_3_wraith_menace | TokenOwner$ You | SubAbility$ DBAnimateAll +SVar:DBAnimateAll:DB$ AnimateAll | ValidCards$ Wraith.YouCtrl | Power$ 9 | Toughness$ 9 | ConditionPresent$ Card.Wraith+YouCtrl | ConditionCompare$ GE9 +SVar:BuffedBy:Instant,Sorcery +DeckHints:Type$Wraith +Oracle:Flying\nWraiths you control have protection from Ring-bearers.\nWhenever you cast an instant or sorcery spell, create a 3/3 black Wraith creature token with menace. Then if you control nine or more Wraiths, Wraiths you control have base power and toughness 9/9 until end of turn. diff --git a/forge-gui/res/cardsfolder/upcoming/shelob_dread_weaver.txt b/forge-gui/res/cardsfolder/upcoming/shelob_dread_weaver.txt new file mode 100644 index 00000000000..2c9ff92bfe5 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/shelob_dread_weaver.txt @@ -0,0 +1,13 @@ +Name:Shelob, Dread Weaver +ManaCost:3 B +Types:Legendary Creature Spider Demon +PT:3/3 +T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Creature.OppCtrl+nonToken | TriggerZones$ Battlefield | Execute$ TrigExile | TriggerDescription$ Whenever a nontoken creature an opponent controls dies, exile it. +SVar:TrigExile:DB$ ChangeZone | Defined$ TriggeredNewCardLKICopy | Origin$ Graveyard | Destination$ Exile +A:AB$ PutCounter | Cost$ 2 B ExiledMoveToGrave<1/Creature.ExiledWithSource> | CounterType$ P1P1 | CounterNum$ 2 | SubAbility$ TrigDraw | SpellDescription$ Put two +1/+1 counters on NICKNAME. +SVar:TrigDraw:DB$ Draw | NumCards$ 1 | SpellDescription$ Draw a card. +A:AB$ ChangeZone | Cost$ X 1 B | TgtPrompt$ Select target creature | Origin$ Exile | Destination$ Battlefield | Tapped$ True | ValidTgts$ Creature.ExiledWithSource+cmcEQX | Hidden$ True | Mandatory$ True | ChangeNum$ 1 | GainControl$ True | SpellDescription$ Put target creature card with mana value X exiled with NICKNAME onto the battlefield tapped under your control. +SVar:X:Count$xPaid +SVar:PlayMain1:TRUE +DeckHas:Ability$Counters +Oracle:Whenever a nontoken creature an opponent controls dies, exile it.\n{2}{B}, Put a creature card exiled with Shelob, Dread Weaver into its owner's graveyard: Put two +1/+1 counters on Shelob. Draw a card.\n{X}{1}{B}: Put target creature card with mana value X exiled with Shelob onto the battlefield tapped under your control. diff --git a/forge-gui/res/tokenscripts/b_3_3_wraith_menace.txt b/forge-gui/res/tokenscripts/b_3_3_wraith_menace.txt new file mode 100644 index 00000000000..2c3eae44304 --- /dev/null +++ b/forge-gui/res/tokenscripts/b_3_3_wraith_menace.txt @@ -0,0 +1,7 @@ +Name:Wraith Token +ManaCost:no cost +Types:Creature Wraith +Colors:black +PT:3/3 +K:Menace +Oracle:Menace diff --git a/forge-gui/res/tokenscripts/w_3_3_bird_flying_attacks.txt b/forge-gui/res/tokenscripts/w_3_3_bird_flying_attacks.txt new file mode 100644 index 00000000000..6a8856f7c6a --- /dev/null +++ b/forge-gui/res/tokenscripts/w_3_3_bird_flying_attacks.txt @@ -0,0 +1,10 @@ +Name:Bird Token +ManaCost:no cost +Types:Creature Bird +Colors:white +PT:3/3 +K:Flying +T:Mode$ Attacks | ValidCard$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ Whenever this creature attacks, target attacking creature gains flying until end of turn. +SVar:TrigPump:DB$ Pump | ValidTgts$ Creature.attacking | TgtPrompt$ Select target attacking creature | KW$ Flying +SVar:HasAttackEffect:TRUE +Oracle:Flying\nWhenever this creature attacks, target attacking creature gains flying until end of turn.