diff --git a/forge-core/src/main/java/forge/card/DeckHints.java b/forge-core/src/main/java/forge/card/DeckHints.java index a55426cfd95..e6ce28f9fea 100644 --- a/forge-core/src/main/java/forge/card/DeckHints.java +++ b/forge-core/src/main/java/forge/card/DeckHints.java @@ -42,7 +42,7 @@ public class DeckHints { } private boolean valid = false; - private List> filters = null; + public List> filters = null; /** * Construct a DeckHints from the SVar string. diff --git a/forge-gui-mobile/src/forge/adventure/data/RewardData.java b/forge-gui-mobile/src/forge/adventure/data/RewardData.java index 88d755b6a8e..23c4cc6d0d0 100644 --- a/forge-gui-mobile/src/forge/adventure/data/RewardData.java +++ b/forge-gui-mobile/src/forge/adventure/data/RewardData.java @@ -45,6 +45,8 @@ public class RewardData { public boolean matchAllSubTypes; public boolean matchAllColors; public RewardData[] cardUnion; + public String[] deckNeeds; + public RewardData[] rotation; public RewardData() { } @@ -69,6 +71,8 @@ public class RewardData { matchAllSubTypes =rewardData.matchAllSubTypes; matchAllColors =rewardData.matchAllColors; cardUnion =rewardData.cardUnion==null?null:rewardData.cardUnion.clone(); + rotation =rewardData.rotation==null?null:rewardData.rotation.clone(); + deckNeeds =rewardData.deckNeeds==null?null:rewardData.deckNeeds.clone(); } private static Iterable allCards; @@ -131,8 +135,10 @@ public class RewardData { } ArrayList finalPool = new ArrayList(pool); - for(int i = 0; i < count; i++) { - ret.add(new Reward(finalPool.get(WorldSave.getCurrentSave().getWorld().getRandom().nextInt(finalPool.size())))); + if (finalPool.size() > 0){ + for (int i = 0; i < count; i++) { + ret.add(new Reward(finalPool.get(WorldSave.getCurrentSave().getWorld().getRandom().nextInt(finalPool.size())))); + } } break; case "card": diff --git a/forge-gui-mobile/src/forge/adventure/pointofintrest/PointOfInterestChanges.java b/forge-gui-mobile/src/forge/adventure/pointofintrest/PointOfInterestChanges.java index ef7200287b8..61c79b43f9a 100644 --- a/forge-gui-mobile/src/forge/adventure/pointofintrest/PointOfInterestChanges.java +++ b/forge-gui-mobile/src/forge/adventure/pointofintrest/PointOfInterestChanges.java @@ -107,6 +107,13 @@ public class PointOfInterestChanges implements SaveFileContent { cardsBought.put(objectID, new HashSet<>()); //Allows cards to appear in slots of previous purchases } + public void setRotatingShopSeed(int objectID, long seed){ + if (shopSeeds.containsKey(objectID) && shopSeeds.get(objectID) != seed) { + cardsBought.put(objectID, new HashSet<>()); //Allows cards to appear in slots of previous purchases + } + shopSeeds.put(objectID, seed); + } + public float getShopPriceModifier(int objectID){ if (!shopModifiers.containsKey(objectID)) { diff --git a/forge-gui-mobile/src/forge/adventure/scene/RewardScene.java b/forge-gui-mobile/src/forge/adventure/scene/RewardScene.java index a51ffe94c8d..7d3dd5e62c4 100644 --- a/forge-gui-mobile/src/forge/adventure/scene/RewardScene.java +++ b/forge-gui-mobile/src/forge/adventure/scene/RewardScene.java @@ -231,12 +231,16 @@ public class RewardScene extends UIScene { } void updateRestockButton(){ + if (!shopActor.canRestock()) + return; int price = shopActor.getRestockPrice(); restockButton.setText("Refresh\n " + price + "[+shards]"); restockButton.setDisabled(WorldSave.getCurrentSave().getPlayer().getShards() < price); } void restockShop(){ + if (!shopActor.canRestock()) + return; int price = shopActor.getRestockPrice(); if(changes!=null) changes.generateNewShopSeed(shopActor.getObjectId()); @@ -329,6 +333,10 @@ public class RewardScene extends UIScene { if (shopActor.canRestock()) { restockButton.setVisible(true); } + else{ + restockButton.setVisible(false); + restockButton.setDisabled(true); + } break; case Loot: shopNameLabel.setVisible(false); diff --git a/forge-gui-mobile/src/forge/adventure/scene/ShardTraderScene.java b/forge-gui-mobile/src/forge/adventure/scene/ShardTraderScene.java index 90f993d3b68..967b6dff26d 100644 --- a/forge-gui-mobile/src/forge/adventure/scene/ShardTraderScene.java +++ b/forge-gui-mobile/src/forge/adventure/scene/ShardTraderScene.java @@ -15,7 +15,7 @@ public class ShardTraderScene extends UIScene { private static ShardTraderScene object; public static final String spriteAtlas = "maps/tileset/buildings.atlas"; - public static final String sprite = "shard_trader"; + public static final String sprite = "ShardTrader"; public static ShardTraderScene instance() { if(object==null) diff --git a/forge-gui-mobile/src/forge/adventure/stage/MapStage.java b/forge-gui-mobile/src/forge/adventure/stage/MapStage.java index e6c24f1bf90..f687c4bd7f5 100644 --- a/forge-gui-mobile/src/forge/adventure/stage/MapStage.java +++ b/forge-gui-mobile/src/forge/adventure/stage/MapStage.java @@ -46,6 +46,7 @@ import forge.sound.SoundEffectType; import forge.sound.SoundSystem; import java.util.Map; +import java.util.Random; /** @@ -392,6 +393,8 @@ public class MapStage extends GameStage { continue; boolean hidden = !obj.isVisible(); //Check if the object is invisible. + String rotatingShop = ""; + switch (type) { case "entry": float x = Float.parseFloat(prop.get("x").toString()); @@ -536,35 +539,70 @@ public class MapStage extends GameStage { addMapActor(obj, dialog); } break; - case "shop": - String shopList = ""; - int restockPrice = 0; - int rarity = WorldSave.getCurrentSave().getWorld().getRandom().nextInt(100); - if (rarity > 95 & prop.containsKey("mythicShopList")) { - shopList = prop.get("mythicShopList").toString(); - restockPrice = 5; + case "Rotating": + String rotation = ""; + if (prop.containsKey("rotation")) { + rotation = prop.get("rotation").toString(); } - if (shopList.isEmpty() && (rarity > 85 & prop.containsKey("rareShopList"))) { - shopList = prop.get("rareShopList").toString(); - restockPrice = 4; + + Array possibleShops = new Array<>(rotation.split(",")); + + if (possibleShops.size > 0){ + long rotatingRandomSeed = WorldSave.getCurrentSave().getWorld().getRandom().nextLong() + java.time.LocalDate.now().plusDays(5).toEpochDay(); + Random rotatingShopRandom = new Random(rotatingRandomSeed); + rotatingShop = possibleShops.get(rotatingShopRandom.nextInt(possibleShops.size)); + changes.setRotatingShopSeed(id, rotatingRandomSeed); } - if (shopList.isEmpty() && (rarity > 55 & prop.containsKey("uncommonShopList"))) { - shopList = prop.get("uncommonShopList").toString(); - restockPrice = 3; + + //Intentionally not breaking here. + //Flow continues into "shop" case with above data overriding base logic. + + case "shop": + + int restockPrice = 0; + String shopList = ""; + + boolean isRotatingShop = !rotatingShop.isEmpty(); + + if (isRotatingShop){ + shopList = rotatingShop; + restockPrice = 7; } - if (shopList.isEmpty() && prop.containsKey("commonShopList")) { - shopList = prop.get("commonShopList").toString(); - restockPrice = 2; + else{ + int rarity = WorldSave.getCurrentSave().getWorld().getRandom().nextInt(100); + if (rarity > 95 & prop.containsKey("mythicShopList")) { + shopList = prop.get("mythicShopList").toString(); + restockPrice = 5; + } + if (shopList.isEmpty() && (rarity > 85 & prop.containsKey("rareShopList"))) { + shopList = prop.get("rareShopList").toString(); + restockPrice = 4; + } + if (shopList.isEmpty() && (rarity > 55 & prop.containsKey("uncommonShopList"))) { + shopList = prop.get("uncommonShopList").toString(); + restockPrice = 3; + } + if (shopList.isEmpty() && prop.containsKey("commonShopList")) { + shopList = prop.get("commonShopList").toString(); + restockPrice = 2; + } + if (shopList.trim().isEmpty() && prop.containsKey("shopList")) { + shopList = prop.get("shopList").toString(); //removed but included to not break existing custom planes + restockPrice = 0; //Tied to restock button + } + shopList = shopList.replaceAll("\\s", ""); + } - if (shopList.trim().isEmpty() && prop.containsKey("shopList")) { - shopList = prop.get("shopList").toString(); //removed but included to not break existing custom planes - restockPrice = 0; //Tied to restock button + + if (prop.containsKey("noRestock") && (boolean)prop.get("noRestock")){ + restockPrice = 0; } - shopList = shopList.replaceAll("\\s", ""); - Array possibleShops = new Array<>(shopList.split(",")); + + possibleShops = new Array<>(shopList.split(",")); Array filteredPossibleShops = possibleShops; - filteredPossibleShops.removeAll(shopsAlreadyPresent, false); + if (!isRotatingShop) + filteredPossibleShops.removeAll(shopsAlreadyPresent, false); if (filteredPossibleShops.notEmpty()){ possibleShops = filteredPossibleShops; } diff --git a/forge-gui-mobile/src/forge/adventure/util/CardUtil.java b/forge-gui-mobile/src/forge/adventure/util/CardUtil.java index e9d90fbd5f3..b2413349d25 100644 --- a/forge-gui-mobile/src/forge/adventure/util/CardUtil.java +++ b/forge-gui-mobile/src/forge/adventure/util/CardUtil.java @@ -19,10 +19,7 @@ import forge.item.PaperCard; import forge.model.FModel; import java.io.File; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.List; +import java.util.*; import java.util.regex.Pattern; import static forge.adventure.data.RewardData.generateAllCards; @@ -52,6 +49,7 @@ public class CardUtil { private int colors; private final ColorType colorType; private final boolean shouldBeEqual; + private final List deckNeeds=new ArrayList<>(); @Override public boolean apply(final PaperCard card) { @@ -171,6 +169,28 @@ public class CardUtil { return !this.shouldBeEqual; } + if(!this.deckNeeds.isEmpty()) + { + boolean found = false; + for(String need:this.deckNeeds) + { + //FormatExpected: X$Y, where X is DeckHints.Type and Y is a string descriptor + String[] parts = need.split("\\$"); + + if (parts.length != 2){ + continue; + } + DeckHints.Type t = DeckHints.Type.valueOf(parts[0].toUpperCase()); + + DeckHints hints = card.getRules().getAiHints().getDeckHints(); + if (hints != null && hints.contains(t, parts[1])){ + found=true; + break; + } + } + if(!found) + return !this.shouldBeEqual; + } return this.shouldBeEqual; @@ -237,6 +257,9 @@ public class CardUtil { { this.colorType=ColorType.Any; } + if(type.deckNeeds!=null&&type.deckNeeds.length!=0){ + deckNeeds.addAll(Arrays.asList(type.deckNeeds)); + } } } @@ -244,6 +267,9 @@ public class CardUtil { { List result = new ArrayList<>(); CardPredicate pre = new CardPredicate(data, true); + + java.util.Map tempMap = new HashMap<>(); + for (final PaperCard item : cards) { if(pre.apply(item)) diff --git a/forge-gui/res/adventure/Shandalar/custom_card_pics/Cursed Treasure.png b/forge-gui/res/adventure/Shandalar/custom_card_pics/Cursed Treasure.png new file mode 100644 index 00000000000..beedb8ac146 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/custom_card_pics/Cursed Treasure.png differ diff --git a/forge-gui/res/adventure/Shandalar/custom_card_pics/Farmer's Tools.png b/forge-gui/res/adventure/Shandalar/custom_card_pics/Farmer's Tools.png new file mode 100644 index 00000000000..01c5db34a99 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/custom_card_pics/Farmer's Tools.png differ diff --git a/forge-gui/res/adventure/Shandalar/custom_card_pics/Hill Giant Club.png b/forge-gui/res/adventure/Shandalar/custom_card_pics/Hill Giant Club.png new file mode 100644 index 00000000000..ba7778c612b Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/custom_card_pics/Hill Giant Club.png differ diff --git a/forge-gui/res/adventure/Shandalar/custom_card_pics/Sleep Wand.png b/forge-gui/res/adventure/Shandalar/custom_card_pics/Sleep Wand.png new file mode 100644 index 00000000000..c080cf94a11 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/custom_card_pics/Sleep Wand.png differ diff --git a/forge-gui/res/adventure/Shandalar/custom_cards/cursed_treasure.txt b/forge-gui/res/adventure/Shandalar/custom_cards/cursed_treasure.txt new file mode 100644 index 00000000000..f230c847d32 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/custom_cards/cursed_treasure.txt @@ -0,0 +1,8 @@ +Name:Cursed Treasure +ManaCost:no cost +Types:Artifact +S:Mode$ Continuous | Description$ Provided by Cursed Treasure (Equipped Item - Right) +StackDescription$ Create a Treasure token. You lose 2 life. | SpellDescription$ Create a Treasure token. You lose 2 life. +A:AB$ Token | Cost$ PayShards<1> Sac<1/CARDNAME> | TokenScript$ c_a_treasure_sac | SubAbility$ DBLoseLife2 | SpellDescription$ Create a Treasure token. +SVar:DBLoseLife2:DB$ LoseLife | LifeAmount$ 2 | Defined$ You +Oracle: Provided by Cursed Treasure. Pay {M}, sacrifice Cursed Treasure: Create a Treasure token. You lose 2 life. \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/custom_cards/farmers_tools.txt b/forge-gui/res/adventure/Shandalar/custom_cards/farmers_tools.txt new file mode 100644 index 00000000000..aaa555d121b --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/custom_cards/farmers_tools.txt @@ -0,0 +1,6 @@ +Name:Farmer's Tools +ManaCost:no cost +Types:Artifact +S:Mode$ Continuous | Description$ Provided by Farmer's Tools (Equipped Item - Left) +A:AB$ ChangeZone | Cost$ PayShards<2> Sac<1/CARDNAME> | ExileOnMoved$ Battlefield | Optional$ True | Origin$ Hand | Destination$ Battlefield | ChangeType$ Land | DefinedPlayer$ Player | ChangeNum$ 1 | StackDescription$ Each player may put a land card from their hand onto the battlefield. +Oracle: Provided by Farmer's Tools. Pay {M}{M}, sacrifice Farmer's Tools: Starting with you, each player may place a land card from their hand onto the battlefield. \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/custom_cards/hill_giant_club.txt b/forge-gui/res/adventure/Shandalar/custom_cards/hill_giant_club.txt new file mode 100644 index 00000000000..f01e05754ab --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/custom_cards/hill_giant_club.txt @@ -0,0 +1,10 @@ +Name:Hill Giant Club +ManaCost:no cost +Types:Artifact +S:Mode$ Continuous | Description$ Provided by Hill Giant Club (Equipped Item - Right) +A:AB$ Effect | Cost$ PayShards<2> Sac<1/CARDNAME> | ValidTgts$ Creature | TgtPrompt$ Select target creature | ExileOnMoved$ Battlefield | StaticAbilities$ UnblockableLE2 | RememberObjects$ Targeted | StackDescription$ {c:Targeted} can't be blocked by creatures with power 2 or less this turn. | SpellDescription$ Targe creature can't be blocked by creatures with power 2 or less this turn. +SVar:UnblockableLE2:Mode$ CantBlockBy | ValidAttacker$ Card.IsRemembered | ValidBlocker$ Creature.powerLE2 | Description$ {c:Targeted} can't be blocked by creatures with power 2 or less this turn. +Oracle: Provided by Hill Giant Club. Pay {M}{M}, sacrifice Hill Giant Club: Target creature can't be blocked by creatures with power 2 or less this turn. + + + diff --git a/forge-gui/res/adventure/Shandalar/custom_cards/sleep_wand.txt b/forge-gui/res/adventure/Shandalar/custom_cards/sleep_wand.txt new file mode 100644 index 00000000000..3af0901add6 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/custom_cards/sleep_wand.txt @@ -0,0 +1,6 @@ +Name:Sleep Wand +ManaCost:no cost +Types:Artifact +S:Mode$ Continuous | Description$ Provided by Sleep Wand (Equipped Item - Left) +A:AB$ PutCounter | Cost$ PayShards<2> Sac<1/CARDNAME> | ValidTgts$ Creature | ExileOnMoved$ Battlefield ValidTgts$ Creature | TgtPrompt$ Select target creature | CounterType$ Stun | CounterNum$ 1 | StackDescription$ Put a stun counter on target creature. (If a permanent with a stun counter would become untapped, remove one from it instead.) +Oracle: Provided by Sleep Wand. Pay {M}, sacrifice Sleep Wand: Put a stun counter on target creature. \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/maps/map/forest_town_generic.tmx b/forge-gui/res/adventure/Shandalar/maps/map/forest_town_generic.tmx index 98fce33f685..94151873838 100644 --- a/forge-gui/res/adventure/Shandalar/maps/map/forest_town_generic.tmx +++ b/forge-gui/res/adventure/Shandalar/maps/map/forest_town_generic.tmx @@ -82,6 +82,7 @@ + diff --git a/forge-gui/res/adventure/Shandalar/maps/map/forest_town_identity.tmx b/forge-gui/res/adventure/Shandalar/maps/map/forest_town_identity.tmx index 3426d7ce52b..a8957c9e992 100644 --- a/forge-gui/res/adventure/Shandalar/maps/map/forest_town_identity.tmx +++ b/forge-gui/res/adventure/Shandalar/maps/map/forest_town_identity.tmx @@ -1,5 +1,5 @@ - + @@ -82,6 +82,7 @@ + @@ -90,14 +91,6 @@ - - - - - - - - @@ -106,5 +99,10 @@ + + + + + diff --git a/forge-gui/res/adventure/Shandalar/maps/map/forest_town_tribal.tmx b/forge-gui/res/adventure/Shandalar/maps/map/forest_town_tribal.tmx index 67d2d067d54..d79c673ba0b 100644 --- a/forge-gui/res/adventure/Shandalar/maps/map/forest_town_tribal.tmx +++ b/forge-gui/res/adventure/Shandalar/maps/map/forest_town_tribal.tmx @@ -82,6 +82,7 @@ + diff --git a/forge-gui/res/adventure/Shandalar/maps/map/island_town_generic.tmx b/forge-gui/res/adventure/Shandalar/maps/map/island_town_generic.tmx index 1f96d42437b..accd42e41bc 100644 --- a/forge-gui/res/adventure/Shandalar/maps/map/island_town_generic.tmx +++ b/forge-gui/res/adventure/Shandalar/maps/map/island_town_generic.tmx @@ -82,6 +82,7 @@ + diff --git a/forge-gui/res/adventure/Shandalar/maps/map/island_town_identity.tmx b/forge-gui/res/adventure/Shandalar/maps/map/island_town_identity.tmx index 8a65b6bb021..e8a8eaeec1f 100644 --- a/forge-gui/res/adventure/Shandalar/maps/map/island_town_identity.tmx +++ b/forge-gui/res/adventure/Shandalar/maps/map/island_town_identity.tmx @@ -1,5 +1,5 @@ - + @@ -82,6 +82,7 @@ + @@ -98,12 +99,11 @@ - + - - - - + + + diff --git a/forge-gui/res/adventure/Shandalar/maps/map/island_town_tribal.tmx b/forge-gui/res/adventure/Shandalar/maps/map/island_town_tribal.tmx index 160d5262e4a..447840cd6a9 100644 --- a/forge-gui/res/adventure/Shandalar/maps/map/island_town_tribal.tmx +++ b/forge-gui/res/adventure/Shandalar/maps/map/island_town_tribal.tmx @@ -82,6 +82,7 @@ + diff --git a/forge-gui/res/adventure/Shandalar/maps/map/main_story/forest_capital.tmx b/forge-gui/res/adventure/Shandalar/maps/map/main_story/forest_capital.tmx index 382e308b98f..5dc9cb8b2dd 100644 --- a/forge-gui/res/adventure/Shandalar/maps/map/main_story/forest_capital.tmx +++ b/forge-gui/res/adventure/Shandalar/maps/map/main_story/forest_capital.tmx @@ -1,5 +1,5 @@ - + @@ -17,7 +17,7 @@ - eJzNmElOw0AQAOcEkRIUKywfSHAC5gY3+Ah3lnBn+wAETogHwBsA8QFIAgjEK3gBOxcQbcWjdIbu2eyEtNSSl/G43Nu0JywIEYGGoFXQYZDphCdKtAzaAm0PCV8TOCoJY8x2D7pZFGJrSHS72GWUPi0FQowPiU4EXTu2Fb4p0PN/0kmFD0uJuFdl4qORF+IA6WG+9/5+nn7OJBQDdc80fzPJpxaTV4Pgk+9YjfRzlgmeIzg/Tq6tKc/PzwmxMNd7rebIJ4h36kT9ngew56NHrXLhi32IGevIDpQN1O/BzFhm0bG0rRznwpeFYL6Kxfh+8FG2pPgoUWPbhU+Na1+hGO+YsYPw7wkk42nNPK4ffFd+r9UKjg8fvnpGfraRNPZrMGtZWsFxnoZP9oxxv/MOc34Y7PoNMfjjGIeufDj/mxn1sLranjY/cN+i+vkZmp0XruGxFB8+XKukDeO+9qqQfSy68lG1da/QicWoD/9TafyrxiJlw0VY/JeSBuATxn8xObTOXM9y/cCMOB6jUbvnscic8eWbNjBiX9dz0J+OdHQj58bpwsf1Ja/gmzfG12puc30AN3ca/+r6GZzXXN7YrN22fDeGeThWLm+k3KLj5Rk9Q9uCXeYs12cSr3CuPevM+ivXAh0fJab/OXUdpMavWNQX+Z22fOUxninUIxu5OL6Q4Nv13M+JJe0e007RzJdmPyerPSbKv2eB217OJTq+CP7Ocek437kyn2o/X3mq6c99heJTa85/Slb2cxHZvuJ1r0WMi2vftSefTS15cJ+2pzeXbNGA7afuax4QTKoOUmTNoDhCZDN8/gsMt+8u + eJzNmElOw0AQAOcEkRKUKCwfSHAC5gY3+Ah3lnBn+wAETogHwBsA8QFwAgjEK3gBOxcQbcWjdIbu2eyEtNSSl/G43Nu0JygIEYIGoDXQYZDphCdMtALaAm0PCV8EHNWEMWa7B90sCrE1JLpd7DJKn5ZLQowPiU6UunZsK3xToOf/pJMKH5Yyca/GxEczL8QB0sN87/39PP2cSSgG6p5p/ijJpxaTV4Pgk+9YDfVzVgieIzg/Tq6tKc/PzwmxMNd7re7IJ4h36kT9ngew56NHrXLhi32IGRvIDpQN1O/BzFhm0bG0rRznwpeFYL6qxfh+8FG2pPgoUWPbhU+Na1+hGO+YsYPw7wkk42ndPK4ffFd+r9UKjg8fvkZGfraRNPZrMmtZWsFxnoZP9oxxv/MOc34Y7PoNMfjjGIcufGruRxn1sLranjY/cN+i+vkZmp0XruGxFB8+XKukDeO+9qqQfSy68lG1da/QicWwD/9TafyL4zFibLgIi/9S0gB8wvgvJofWmetZrh+YEcdjOGr3PBaZM7580wZG7OtGDvrTkY5u5Nw4Xfi4vuQVfPPG+FrNba4P4OZO419dP4Pzmssbm7Xblu/GMA/HyuWNlFt0vDyjZ2hbsMuc5fpM4hXOtWedWX/lWqDjo8T0P6eug9T4FYv6Ir/Tlq8yxjMFemQjF8cXEHy7nvs5saTdY9opmvnS7OdktcdE+fes5LaXc4mOL0p/57h0nO9cmU+1n6881fXnvkLxqTXnPyUr+7mIbF/xutcixsW179qTz6aWPLhP29ObS7ZwwPZT9zUPCCZVBymyZlAcAbIZPv8FDvfvLg== @@ -39,6 +39,7 @@ + @@ -47,6 +48,7 @@ + @@ -60,14 +62,16 @@ - + + - + + @@ -76,6 +80,7 @@ + @@ -84,6 +89,7 @@ + @@ -92,6 +98,7 @@ + @@ -100,6 +107,7 @@ + @@ -108,6 +116,7 @@ + @@ -116,6 +125,7 @@ + @@ -124,6 +134,7 @@ + @@ -204,7 +215,7 @@ - + @@ -214,5 +225,22 @@ + + + + + + + + + + + + + + + + + diff --git a/forge-gui/res/adventure/Shandalar/maps/map/main_story/island_capital.tmx b/forge-gui/res/adventure/Shandalar/maps/map/main_story/island_capital.tmx index ff66ef87724..638e4bc681f 100644 --- a/forge-gui/res/adventure/Shandalar/maps/map/main_story/island_capital.tmx +++ b/forge-gui/res/adventure/Shandalar/maps/map/main_story/island_capital.tmx @@ -1,5 +1,5 @@ - + @@ -7,17 +7,17 @@ - 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 @@ -44,6 +44,7 @@ + @@ -52,6 +53,7 @@ + @@ -60,6 +62,7 @@ + @@ -68,6 +71,7 @@ + @@ -77,6 +81,7 @@ + @@ -85,6 +90,7 @@ + @@ -93,6 +99,7 @@ + @@ -101,6 +108,7 @@ + @@ -108,6 +116,7 @@ + @@ -171,14 +180,16 @@ - + + - + + @@ -192,6 +203,7 @@ + @@ -200,8 +212,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/forge-gui/res/adventure/Shandalar/maps/map/main_story/mountain_capital.tmx b/forge-gui/res/adventure/Shandalar/maps/map/main_story/mountain_capital.tmx index d898cf53f01..c3d4ae7e0b1 100644 --- a/forge-gui/res/adventure/Shandalar/maps/map/main_story/mountain_capital.tmx +++ b/forge-gui/res/adventure/Shandalar/maps/map/main_story/mountain_capital.tmx @@ -1,5 +1,5 @@ - + @@ -12,12 +12,12 @@ - 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 @@ -39,39 +39,44 @@ + - + + - + + - + + - + + @@ -80,14 +85,16 @@ + - + + @@ -95,6 +102,7 @@ + @@ -173,22 +181,25 @@ - - + + + - - + + + - + + @@ -197,10 +208,10 @@ - + - + @@ -208,6 +219,7 @@ + @@ -216,8 +228,28 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/forge-gui/res/adventure/Shandalar/maps/map/main_story/plains_capital.tmx b/forge-gui/res/adventure/Shandalar/maps/map/main_story/plains_capital.tmx index 9735b778741..0c7fdce210e 100644 --- a/forge-gui/res/adventure/Shandalar/maps/map/main_story/plains_capital.tmx +++ b/forge-gui/res/adventure/Shandalar/maps/map/main_story/plains_capital.tmx @@ -1,5 +1,5 @@ - + @@ -12,12 +12,12 @@ - eJztmF1OwkAQgPfJbssl9I0ERa9gjOI99CLic9FwBdRj6FUU9BkQDuBOyqSToVtmu7tSEyeZsCnN9uv8b5Vqn8y1UmeZUqN03yTVkqcFW0y+y0SpqwY6SErbxeSbmed8NtCvpGT71u3lA7aTTPasYafUpnyDrlLX3WLNhfNVsUHOnJprC/O71NtcXF35bgzbrZCvym40Zx5IXDZhq+I7MHsmFfqSbvNViZRPKtL4Oze2WvWUWvfq+XrmvrUu+PrEz65cTfgk9gMZExtyO/7z/X0+miMu9XEffI+evS80H51pfH0bgy8PGHvINyG117ZGPrwm5Qvh3/es7BMflvXFZj3N3PigRi895pvY/vW1YUg+nhuh+ELFH/TelWE8Jj04RH0OGX8o6Oc21Oc5i3/qZzrD7IsvZ/7jOeJjw9B8YLu6MyHEr8s58TD140NfosDsUvfOfJ9QauMbk/MlsraNr5+V61GL7Ldg31/yjS3bwkdzFPn6O/xLa61En4X3TWv4MP6wfwDfm7n+Ksw9F7tQferY/6N8vH8B31Eqrw27+OBdh7pQyTvD/ffa3v/vdLmfjwIL8NFaK9mbsvn21zqZJdt8NuFnMpxPfOfjUHz0TAtMmAuxbOfKZ/vuE1Oa8MWMNy4ufOBPmIt/iw3EhW+X/ADqlHWN + eJztmF1OwkAQgPfJ7pZL6BsJilyBGMV76EXEZ9BwharHwKso6jMgHMCdlEknQ7s/3a3UxEkmbEu7/To/O7MVon2ylEIMUiGm6tAk5TJROVuTfJeJEFc1dJQUtmuS70M/57OGfiUF27dsLx+wnaVuzxp3Cq3LN+oKcd3Nx1w4Xxkb5My5PrfSv2u5z8XVl+9Gs9068pXZjebMA4lL5MmUnw0535G+PynRF7XPVyY2vmEa5t8qhXk3PSG2PTNfT1+3lTlfn/jZN+7q8LnYD2RGbMjt+M/39/lojvisj4fgewysfbH5aE+TWXybKfMx8mVkbasau/JR28E9Jr5haj5GPvps2xh/Xfhi+fctLerEe8X4YjdeePLBGr0O6G9ixx/nC7Whb/zhuTI+mhsx+WLFH9TejWY8JTU4xvocM/5Q0M9tWJ+XLP6pn2kPcyi+CfMfz5EQG8bmA9uZ9oSQXz77xGMVxoe+RIHexfTOfJ5YWsU3I/tLZG0bXz8txtMW2W/Fvr9MdrZsCx/NUeTrW/xL11oXfXa8bmHgw/jD+gF8r/r83DH3fOxC9alT/R/l4/UL+E6U+9pg44N3HctcXd4Zrr+X1fX/Thbzheh81+PStdZlbsoWWl9Ngr2LrdaD8D0Z9ieh/XEsPrqnBSbMhaZs58tX9d2nSanD12S8cfHhA39CX/xbbCA+fDb5AV5mcmA= - eJztlMsKwjAQRS/daQXzAdK6LKW60T9R975AP0P8chtKsQ5BSpvaId4Dw0wekMOQBCC+eMb+gn708+W3y4B9GYdMp5/2/tGPfqH4rXJgnev168O/+W0KYFt8r2tcc0P7+YZ+uvx4/+in1e8SfY6vkXvfWH5dSGfAsozppMp1LEyVE/Nes1nWzTkX90aPTi36pYmzAl9557RyFJ43Bd7SSY7bvF/iRvZySB7z350VKvY/tyRmXA9CQucFNwz/RA== + eJztl80KwjAMgIM3f8A+gEyPY0wv+ibqXaeojyE+uStzOMomTc3a0OWD0J8d+pGMLQUQqHhN6SIGv+uItx8Wn37FJ3c3RA67ztqnAIcyjinOD1s/V78h1peT34mozj7zd3ZwDlnfu4WvD791BrDJ8P6+/Lq4MMnfP1D7bXOAXf57XtO217cfNeLHy0/eP/Hj6mf+L2x6We75W84AVmVMxtVYx0JVY6K+z/Rozpt7bTwaOXLpr0JSMPC16VE4YPb7Nr1p35hO5pr6LjokqO53Njzn/s6KFf091yQqrIcgxM4bns4Cfg== @@ -25,12 +25,12 @@ - eJztmMkOgjAQhudgYiDB90CjV3E5aDzrA7pw8Z3Um8sj+ARCsLHidGNYSuyfTGg7mekHpZO0AO3QNgDYWWL74Jcv6gFM3jZP7EywWYEcM27+aU/Oh/lNFBXIoZo/4t750gDfifuOIj7qdysjlyi27XxHjz4HJVaVc+nT56DEOj5aLD/+HHzGWZvxYT5+rA6+W8LS9TK7v9sr/7vPtx++3hyphn2AUZ/Gh8mm9cVkE986BNiEenzjZK2i3HpVzYfVYp4v78/369wfzFbIvmBmsj/K4MNk0/+HySY+WX3O+7F+k/XZ/X/t5Ysl572UT/cMegiq4ROdCdPzUsp3EvhFMWXzYeOLTva8+t/9qlTH+Ygix0dTm/liyf2RSlvk/gkbU8WLahP1fgiLN8mpcz/E/KI6rarJMj5VTiyel0nt1a3NRXNS78+cnP5FLxlP310= + eJztmEsOwiAQhlmYmJLUe1ijW6t1oXHvAX1tvFN15+MInkCJEsc6QNvpAyJ/MhFmMsPXWiYBxtzQOmRsY4ltw1++uMfY5G2zpx0JlpSokYD1pz09HxYvorhEDdP6MXjmUwt8KXiPKj7qe6uilirXdb5DQF+DkmuqueD0NSi5no+WC/33wccvx5IPi0FfE3yXJ0s3eNn1PV7y7zkc33i+NYSGEWOjiMaHyab/F5NNfKLXrfpqPtgLx9Fvb6ybD3tX0JeNZ+dN7g9pS2RfSCuyP6rgw2TT94fJJj5df87GsXmb/dl/f+7y7TXnPcGX9wy6C+vhU50JxXlJ8KWKuCqnaj7MP++8fs/8e16XmjgfUeT5aHKZb6+5PzJpjdw/YT5Tvqo3Ue+HsPwiNfPcD8m4qk+berKOz1QTy4cq0nvz9uayNan3Z15e/6IHVk/fZg== - eJzt1E0KwjAQBeAHHqDoRqGCLtumm7rRoofyBK3LnsNDaY/jLP1JAlLqJPV9EEjaLB6ZZAAiGmKfAQcZdaadhGzuBuiNdopXXa6dYDw3Y5+7/r3vidm8ABaFdor/Vsnb2jne10Zqs32qTyrztaNeyxJYlf65be8QR8ly4v0hjHf/fP3Z9m1K/ZnoW00CtDIuiXaST9eZfx2bc+5fh6IONFcs50ekJeR+TkS/8wCuWBuR + eJxjYBgFo2AUUALMNRgYLIDYUmOgXTIKsIHr2gwMN7QH2hWooENzoF1AO3BNGzsblxy6mqEMBLUYGIS0BtoVIxsYAvOWEY78JQ+MGwWk+JEGsmVwxJe4DgODhA5+Nja1hIAvnrxvDXSLDZp7LEbT04gEtEp/+MpnbGLDqXweBaOAVFDHz8BQD8QN/APtEkywiBk/f6iBAk38/MECLAepu4ZK+I2CUTBQYDCX56NgFIwC+gEAuogcaQ== @@ -39,6 +39,7 @@ + @@ -47,6 +48,7 @@ + @@ -55,6 +57,7 @@ + @@ -63,6 +66,7 @@ + @@ -72,6 +76,7 @@ + @@ -80,6 +85,7 @@ + @@ -88,6 +94,7 @@ + @@ -96,6 +103,7 @@ + @@ -103,7 +111,8 @@ - + + @@ -167,15 +176,17 @@ } - + + + @@ -200,6 +211,7 @@ + @@ -208,8 +220,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/forge-gui/res/adventure/Shandalar/maps/map/main_story/swamp_capital.tmx b/forge-gui/res/adventure/Shandalar/maps/map/main_story/swamp_capital.tmx index 02106894862..9d9df53923f 100644 --- a/forge-gui/res/adventure/Shandalar/maps/map/main_story/swamp_capital.tmx +++ b/forge-gui/res/adventure/Shandalar/maps/map/main_story/swamp_capital.tmx @@ -1,5 +1,5 @@ - + @@ -12,12 +12,12 @@ - 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 @@ -25,12 +25,12 @@ - eJztzsEJgDAMBdAsIHQA8d7OrZPpDnr0JAXBQxEV4T0I5EM+JAIAuGsuEUupec0RW/7uHwCAt0xd2xzGxt65/4Q+1X1I13cAwD/scwwWyg== + eJzt0sEJwCAMheG3gOAA0rvOXSdrd9BjT8UiFipFRPg/CCSQQCCRAADAX0eQzlDq5KXs5+0DzPL8/S851sJ9AbRE0xe3vXOunh/B2ZJv9r0PAACs4QIr1ijS - eJzt0rENgzAQBdC/ASNAh+x1IAnThKwWGtgBGtIkG5AyV6SwBCIUdk62/pMsnb9k+aQ7gIiISE9lgdqu87tknZP3Ug/OfTTAZML3R2snmcN5Y2YXyZqNnPxyd/9I/W+L/Ps2x2vfctnBIuI9DDnfp7x5mf36F+35xmwugUep3YUeH/tHabhmQPs9t0y7GyIiIkrdB4cVPLM= + eJzt0sEJg0AQheHXgSWYm6ztRGOqibZmLqYHc0kuWkbmEGHBJeTgsiT+HwizD4SBeRIAAOkcS6kq13lv2dXLB5tv3nt00t3F3w9rtd3hFLhZY9k5kGNbfve/mfcmtw4efriHMe872T+z+zwjnkchPYvUW6RD/7C4ZFL7/ros9TYAAODfvQDOSyqr @@ -39,7 +39,8 @@ - + + @@ -107,14 +108,16 @@ - + + - + + @@ -123,6 +126,7 @@ + @@ -131,6 +135,7 @@ + @@ -139,6 +144,8 @@ + + @@ -147,6 +154,7 @@ + @@ -155,6 +163,7 @@ + @@ -163,6 +172,7 @@ + @@ -171,6 +181,7 @@ + @@ -179,6 +190,7 @@ + @@ -192,6 +204,7 @@ + @@ -200,8 +213,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/forge-gui/res/adventure/Shandalar/maps/map/mountain_town_generic.tmx b/forge-gui/res/adventure/Shandalar/maps/map/mountain_town_generic.tmx index 4fc55b951db..8218036aab1 100644 --- a/forge-gui/res/adventure/Shandalar/maps/map/mountain_town_generic.tmx +++ b/forge-gui/res/adventure/Shandalar/maps/map/mountain_town_generic.tmx @@ -82,6 +82,7 @@ + diff --git a/forge-gui/res/adventure/Shandalar/maps/map/mountain_town_identity.tmx b/forge-gui/res/adventure/Shandalar/maps/map/mountain_town_identity.tmx index dbba9428589..2817288db35 100644 --- a/forge-gui/res/adventure/Shandalar/maps/map/mountain_town_identity.tmx +++ b/forge-gui/res/adventure/Shandalar/maps/map/mountain_town_identity.tmx @@ -1,5 +1,5 @@ - + @@ -82,6 +82,7 @@ + @@ -95,15 +96,13 @@ - + - - - - + + - + diff --git a/forge-gui/res/adventure/Shandalar/maps/map/mountain_town_tribal.tmx b/forge-gui/res/adventure/Shandalar/maps/map/mountain_town_tribal.tmx index 10c885e3be1..bfb7c2bb2b6 100644 --- a/forge-gui/res/adventure/Shandalar/maps/map/mountain_town_tribal.tmx +++ b/forge-gui/res/adventure/Shandalar/maps/map/mountain_town_tribal.tmx @@ -82,6 +82,7 @@ + diff --git a/forge-gui/res/adventure/Shandalar/maps/map/plains_town_generic.tmx b/forge-gui/res/adventure/Shandalar/maps/map/plains_town_generic.tmx index 71e660cf965..4e5b6f4587f 100644 --- a/forge-gui/res/adventure/Shandalar/maps/map/plains_town_generic.tmx +++ b/forge-gui/res/adventure/Shandalar/maps/map/plains_town_generic.tmx @@ -56,16 +56,17 @@ - - - - + + + + + @@ -88,10 +89,10 @@ - - - - + + + + @@ -116,6 +117,7 @@ + diff --git a/forge-gui/res/adventure/Shandalar/maps/map/plains_town_identity.tmx b/forge-gui/res/adventure/Shandalar/maps/map/plains_town_identity.tmx index 635ebb42636..db50dd886e2 100644 --- a/forge-gui/res/adventure/Shandalar/maps/map/plains_town_identity.tmx +++ b/forge-gui/res/adventure/Shandalar/maps/map/plains_town_identity.tmx @@ -1,5 +1,5 @@ - + @@ -66,18 +66,11 @@ + - - - - - - - - @@ -116,6 +109,7 @@ + @@ -125,5 +119,11 @@ + + + + + + diff --git a/forge-gui/res/adventure/Shandalar/maps/map/plains_town_tribal.tmx b/forge-gui/res/adventure/Shandalar/maps/map/plains_town_tribal.tmx index e0061f8d3f8..1f1302c01b2 100644 --- a/forge-gui/res/adventure/Shandalar/maps/map/plains_town_tribal.tmx +++ b/forge-gui/res/adventure/Shandalar/maps/map/plains_town_tribal.tmx @@ -66,6 +66,7 @@ + @@ -116,6 +117,7 @@ + diff --git a/forge-gui/res/adventure/Shandalar/maps/map/swamp_town_generic.tmx b/forge-gui/res/adventure/Shandalar/maps/map/swamp_town_generic.tmx index b58d4ee1dd1..92f1f48eade 100644 --- a/forge-gui/res/adventure/Shandalar/maps/map/swamp_town_generic.tmx +++ b/forge-gui/res/adventure/Shandalar/maps/map/swamp_town_generic.tmx @@ -82,6 +82,7 @@ + diff --git a/forge-gui/res/adventure/Shandalar/maps/map/swamp_town_identity.tmx b/forge-gui/res/adventure/Shandalar/maps/map/swamp_town_identity.tmx index f585a2d7eb6..d5c7cbd5a7b 100644 --- a/forge-gui/res/adventure/Shandalar/maps/map/swamp_town_identity.tmx +++ b/forge-gui/res/adventure/Shandalar/maps/map/swamp_town_identity.tmx @@ -1,5 +1,5 @@ - + @@ -82,6 +82,7 @@ + @@ -99,13 +100,11 @@ - + - - - + - + diff --git a/forge-gui/res/adventure/Shandalar/maps/map/swamp_town_tribal.tmx b/forge-gui/res/adventure/Shandalar/maps/map/swamp_town_tribal.tmx index 4d2b8e2962f..50309361a8a 100644 --- a/forge-gui/res/adventure/Shandalar/maps/map/swamp_town_tribal.tmx +++ b/forge-gui/res/adventure/Shandalar/maps/map/swamp_town_tribal.tmx @@ -82,6 +82,7 @@ + diff --git a/forge-gui/res/adventure/Shandalar/maps/map/waste_town_generic.tmx b/forge-gui/res/adventure/Shandalar/maps/map/waste_town_generic.tmx index 05abdb6f347..0b57007a35e 100644 --- a/forge-gui/res/adventure/Shandalar/maps/map/waste_town_generic.tmx +++ b/forge-gui/res/adventure/Shandalar/maps/map/waste_town_generic.tmx @@ -98,6 +98,7 @@ + diff --git a/forge-gui/res/adventure/Shandalar/maps/map/waste_town_identity.tmx b/forge-gui/res/adventure/Shandalar/maps/map/waste_town_identity.tmx index 8ce59811b5c..81d527ab343 100644 --- a/forge-gui/res/adventure/Shandalar/maps/map/waste_town_identity.tmx +++ b/forge-gui/res/adventure/Shandalar/maps/map/waste_town_identity.tmx @@ -98,6 +98,7 @@ + diff --git a/forge-gui/res/adventure/Shandalar/maps/map/waste_town_tribal.tmx b/forge-gui/res/adventure/Shandalar/maps/map/waste_town_tribal.tmx index 784135366c5..d73d04210c0 100644 --- a/forge-gui/res/adventure/Shandalar/maps/map/waste_town_tribal.tmx +++ b/forge-gui/res/adventure/Shandalar/maps/map/waste_town_tribal.tmx @@ -98,6 +98,7 @@ + diff --git a/forge-gui/res/adventure/Shandalar/maps/obj/RotatingShop.tx b/forge-gui/res/adventure/Shandalar/maps/obj/RotatingShop.tx new file mode 100644 index 00000000000..07b5c17c2db --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/maps/obj/RotatingShop.tx @@ -0,0 +1,13 @@ + + diff --git a/forge-gui/res/adventure/Shandalar/maps/obj/shop.tx b/forge-gui/res/adventure/Shandalar/maps/obj/shop.tx index 8b23476b05d..be6c5a1f872 100644 --- a/forge-gui/res/adventure/Shandalar/maps/obj/shop.tx +++ b/forge-gui/res/adventure/Shandalar/maps/obj/shop.tx @@ -6,6 +6,7 @@ + diff --git a/forge-gui/res/adventure/Shandalar/maps/tileset/buildings.atlas b/forge-gui/res/adventure/Shandalar/maps/tileset/buildings.atlas index e14915c3aee..a5e8412b8d7 100644 --- a/forge-gui/res/adventure/Shandalar/maps/tileset/buildings.atlas +++ b/forge-gui/res/adventure/Shandalar/maps/tileset/buildings.atlas @@ -125,8 +125,8 @@ EquipmentShop xy: 304, 784 size: 16, 16 ItemShop - xy: 304, 800 - size: 16, 16 + xy: 288, 912 + size: 16, 16 CapitalShop xy: 304, 816 size: 16, 16 @@ -253,6 +253,9 @@ DnDShop DemonShop xy: 384, 864 size: 16, 16 +RotatingShop + xy: 288, 880 + size: 16, 16 DruidShop xy: 304, 880 size: 16, 16 @@ -289,6 +292,9 @@ WizardShop LegendShop xy: 384, 896 size: 16, 16 +ShardTrader + xy: 288, 896 + size: 16, 16 Overlay8Black xy: 400, 704 size: 5, 16 @@ -576,7 +582,4 @@ red_castle size: 64, 64 final_castle xy: 128, 864 - size: 64, 64 -shard_trader - xy: 288, 896 - size: 16, 16 \ No newline at end of file + size: 64, 64 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/maps/tileset/buildings.png b/forge-gui/res/adventure/Shandalar/maps/tileset/buildings.png index a6820808c90..4431012121b 100644 Binary files a/forge-gui/res/adventure/Shandalar/maps/tileset/buildings.png and b/forge-gui/res/adventure/Shandalar/maps/tileset/buildings.png differ diff --git a/forge-gui/res/adventure/Shandalar/maps/tileset/buildings.xcf b/forge-gui/res/adventure/Shandalar/maps/tileset/buildings.xcf index 95902336c73..a8a5b09f6a2 100644 Binary files a/forge-gui/res/adventure/Shandalar/maps/tileset/buildings.xcf and b/forge-gui/res/adventure/Shandalar/maps/tileset/buildings.xcf differ diff --git a/forge-gui/res/adventure/Shandalar/maps/tileset/main.png b/forge-gui/res/adventure/Shandalar/maps/tileset/main.png index 3f8b743971a..e5696d5f42a 100644 Binary files a/forge-gui/res/adventure/Shandalar/maps/tileset/main.png and b/forge-gui/res/adventure/Shandalar/maps/tileset/main.png differ diff --git a/forge-gui/res/adventure/Shandalar/maps/tileset/main.xcf b/forge-gui/res/adventure/Shandalar/maps/tileset/main.xcf index 4a2442bb5a6..d0dad957076 100644 Binary files a/forge-gui/res/adventure/Shandalar/maps/tileset/main.xcf and b/forge-gui/res/adventure/Shandalar/maps/tileset/main.xcf differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/items.atlas b/forge-gui/res/adventure/Shandalar/sprites/items.atlas index 5a110368b00..39c48b00d57 100644 --- a/forge-gui/res/adventure/Shandalar/sprites/items.atlas +++ b/forge-gui/res/adventure/Shandalar/sprites/items.atlas @@ -51,6 +51,21 @@ Status Menu xy: 32, 64 size: 16, 16 +CursedTreasure + xy: 336, 64 + size: 16, 16 +PipersCharm + xy: 240, 976 + size: 16, 16 +HillGiantClub + xy: 192, 576 + size: 16, 16 +SleepWand + xy: 304, 544 + size: 16, 16 +FarmersTools + xy: 288, 976 + size: 16, 16 SolRing xy: 320, 144 size: 16, 16 diff --git a/forge-gui/res/adventure/Shandalar/world/items.json b/forge-gui/res/adventure/Shandalar/world/items.json index 57ca724ba4c..19781353bae 100644 --- a/forge-gui/res/adventure/Shandalar/world/items.json +++ b/forge-gui/res/adventure/Shandalar/world/items.json @@ -1,13 +1,49 @@ [ { - "name": "PCharm", + "name": "Piper's Charm", "equipmentSlot": "Neck", - "iconName": "SolRing", + "iconName": "PipersCharm", "effect": { "startBattleWithCard": [ "Piper's Charm" ] } + },{ + "name": "Sleep Wand", + "equipmentSlot": "Left", + "iconName": "SleepWand", + "effect": { + "startBattleWithCard": [ + "Sleep Wand" + ] + } + },{ + "name": "Hill Giant Club", + "equipmentSlot": "Right", + "iconName": "HillGiantClub", + "effect": { + "startBattleWithCard": [ + "Hill Giant Club" + ] + } + },{ + "name": "Cursed Treasure", + "equipmentSlot": "Right", + "iconName": "CursedTreasure", + "effect": { + "startBattleWithCard": [ + "Cursed Treasure" + ] + } + },{ + "name": "Farmer's Tools", + "equipmentSlot": "Left", + "iconName": "FarmersTools", + "effect": { + "startBattleWithCard": [ + "Farmer's Tools" + ] + } },{ "name": "Sol Ring", "equipmentSlot": "Left", diff --git a/forge-gui/res/adventure/Shandalar/world/shops.json b/forge-gui/res/adventure/Shandalar/world/shops.json index d40f6e9713b..ad4ca8c0719 100644 --- a/forge-gui/res/adventure/Shandalar/world/shops.json +++ b/forge-gui/res/adventure/Shandalar/world/shops.json @@ -1,7 +1,553 @@ -[{ +[ +{ +"name":"Black1", +"description":"Certain Death", +"spriteAtlas":"maps/tileset/buildings.atlas", +"sprite":"RotatingShop", +"overlaySprite":"Overlay6Black", + "rewards": [ + { + "count":6, + "cardText": "(destroy|exile) target|sacrifice", + "colors": ["black"] + }, + { + "count":2, + "cardText": "(destroy|exile) target|sacrifice" + }] +},{ +"name":"Black2", +"description":"March of the Returned", +"spriteAtlas":"maps/tileset/buildings.atlas", +"sprite":"RotatingShop", +"overlaySprite":"Overlay6Black", + "rewards": [ + { + "count":6, + "cardText": "destroyed|dies|return.*(hand|battlefield|library|to play)|put.*battlefield from", + "colors": ["black"] + }, + { + "count":2, + "cardText": "destroyed|dies|return.*(hand|battlefield|library|to play)|put.*battlefield from" + }] +},{ +"name":"Black3", +"description":"Essence Extraction", +"spriteAtlas":"maps/tileset/buildings.atlas", +"sprite":"RotatingShop", +"overlaySprite":"Overlay6Black", + "rewards": [ + { + "count":6, + "cardText": "pay.*life.*:|(lose|gain).*life|deal.*damage", + "colors": ["black"] + }, + { + "count":2, + "cardText": "pay.*life.*:|(lose|gain).*life|deal.*damage" + }] +},{ +"name":"Black4", +"description":"Demonic Tutor", +"spriteAtlas":"maps/tileset/buildings.atlas", +"sprite":"RotatingShop", +"overlaySprite":"Overlay6Black", + "rewards": [ + { + "count":6, + "cardText": "search|seek|reveal.*library|choose|choice|unless", + "colors": ["black"] + }, + { + "count":2, + "cardText": "search|seek|reveal.*library|choose|choice|unless" + }] +},{ +"name":"Black5", +"description":"Grotesque Mutations", +"spriteAtlas":"maps/tileset/buildings.atlas", +"sprite":"RotatingShop", +"overlaySprite":"Overlay6Black", + "rewards": [ + { + "count":6, + "cardText": "deathtouch|fear|intimidate|menace|ninjitsu|regenerate\b", + "colors": ["black"] + }, + { + "count":2, + "cardText": "deathtouch|fear|intimidate|menace|ninjitsu|regenerate\b" + }] +},{ +"name":"Black6", +"description":"Phyrexian Boons", +"spriteAtlas":"maps/tileset/buildings.atlas", +"sprite":"RotatingShop", +"overlaySprite":"Overlay6Black", + "rewards": [ + { + "count":6, + "cardText": "([+-])\\d?/([+-])\\d?", + "colors": ["black"] + }, + { + "count":2, + "cardText": "([+-])\\d?/([+-])\\d?" + }] +},{ +"name":"Blue1", +"description":"Control Magic", +"spriteAtlas":"maps/tileset/buildings.atlas", +"sprite":"RotatingShop", +"overlaySprite":"Overlay6Blue", + "rewards": [ + { + "count":6, + "cardText": "return.*to.*(hand|top of.*library)|gain(s)? control of|mill|tap |untap|counter target", + "colors": ["blue"] + }, + { + "count":2, + "cardText": "return.*to.*(hand|top of.*library)|gain(s)? control of|mill|tap |untap|counter target" + }] +},{ +"name":"Blue2", +"description":"Tolarian Digsite", +"spriteAtlas":"maps/tileset/buildings.atlas", +"sprite":"RotatingShop", +"overlaySprite":"Overlay6Blue", + "rewards": [ + { + "count":6, + "cardText": "artifact|historic|explores|connive|clue token|investigate", + "colors": ["blue"] + }, + { + "count":2, + "cardText": "artifact|historic|explores|connive|clue token|investigate" + }] +},{ +"name":"Blue3", +"description":"Cloaks of Invisibility", +"spriteAtlas":"maps/tileset/buildings.atlas", +"sprite":"RotatingShop", +"overlaySprite":"Overlay6Blue", + "rewards": [ + { + "count":6, + "cardText": "flying|prowess|unblockable|hexproof|shroud|morph|ninjitsu|phas(ing|(es (in|out)))", + "colors": ["blue"] + }, + { + "count":2, + "cardText": "flying|prowess|unblockable|hexproof|shroud|morph|ninjitsu|phas(ing|(es (in|out)))" + }] +},{ +"name":"Blue4", +"description":"Sleights of Mind", +"spriteAtlas":"maps/tileset/buildings.atlas", +"sprite":"RotatingShop", +"overlaySprite":"Overlay6Blue", + "rewards": [ + { + "count":6, + "cardText": "(change|copy).*(that|target)|color(s|ed)?\\b|land type|mana|name|flashback|overload|splice|rebound|buyback|morph|madness|delve|instead", + "colors": ["blue"] + }, + { + "count":2, + "cardText": "(change|copy).*(that|target)|color(s|ed)?\\b|land type|mana|name|flashback|overload|splice|rebound|buyback|morph|madness|delve|instead" + }] +},{ +"name":"Blue5", +"description":"Library of Lat-Nam", +"spriteAtlas":"maps/tileset/buildings.atlas", +"sprite":"RotatingShop", +"overlaySprite":"Overlay6Blue", + "rewards": [ + { + "count":6, + "cardText": "draw(s)?|(exile|reveal|look|search).*library|scry|seek|conjure ", + "colors": ["blue"] + }, + { + "count":2, + "cardText": "draw(s)?|(exile|reveal|look|search).*library|scry|seek|conjure " + }] +}, +{ +"name":"Blue6", +"description":"Rules & Regulations", +"spriteAtlas":"maps/tileset/buildings.atlas", +"sprite":"RotatingShop", +"overlaySprite":"Overlay6Blue", + "rewards": [ + { + "count":6, + "cardText": "can't|must|whenever|unless|becomes|until|upkeep|(leave|enter)(s)|doesn't? .*(play|battlefield)|each", + "colors": ["blue"] + }, + { + "count":2, + "cardText": "can't|must|whenever|unless|becomes|until|upkeep|(leave|enter)(s)|doesn't? .*(play|battlefield)|each" + }] +},{ +"name":"Green1", +"description":"Explosive Growth", +"spriteAtlas":"maps/tileset/buildings.atlas", +"sprite":"RotatingShop", +"overlaySprite":"Overlay6Green", + "rewards": [ + { + "count":6, + "type":"Union", + "cardUnion": [ + { + "count":1, + "cardText": "counter.*on |counter.*distribute|distribute.*counter|proliferate|creature(s)? from", + "colors": ["green"] + }, + { + "count":1, + "cardText": "([+-])\\d?/([+-])\\d?", + "colors": ["green"] + } + ] + + }, + { + "count":2, + "type":"Union", + "cardUnion": [ + { + "count":1, + "cardText": "counter.*on |counter.*distribute|distribute.*counter|proliferate|creature(s)? from", + }, + { + "count":1, + "cardText": "([+-])\\d?/([+-])\\d?", + } + ] + }] +},{ +"name":"Green2", +"description":"Jungle Expeditions", +"spriteAtlas":"maps/tileset/buildings.atlas", +"sprite":"RotatingShop", +"overlaySprite":"Overlay6Green", + "rewards": [ + { + "count":6, + "cardText": "still a land|(exile|reveal|look|search).*library|scry|explores|additional land|land from.*(graveyard|hand)|put.*land(s)?from|landfall", + "colors": ["green"] + + }, + { + "count":2, + "cardText": "still a land|(exile|reveal|look|search).*library|scry|explores|additional land|land from.*(graveyard|hand)|put.*land(s)?from|landfall" + }] +},{ +"name":"Green3", +"description":"Dominant Predators", +"spriteAtlas":"maps/tileset/buildings.atlas", +"sprite":"RotatingShop", +"overlaySprite":"Overlay6Green", + "rewards": [ + { + "count":6, + "cardText": " fight(s)?|deal(s)? damage equal|(power|toughness) equal to the number", + "colors": ["green"] + + }, + { + "count":2, + "cardText": " fight(s)?|deal(s)? damage equal|(power|toughness) equal to the number" + }] +},{ +"name":"Green4", +"description":"Natural Selection", +"spriteAtlas":"maps/tileset/buildings.atlas", +"sprite":"RotatingShop", +"overlaySprite":"Overlay6Green", + "rewards": [ + { + "count":6, + "cardText": "trample|reach|hexproof|regenerate|shroud|deathtouch", + "colors": ["green"] + + }, + { + "count":2, + "cardText": "trample|reach|hexproof|regenerate|shroud|deathtouch" + }] +},{ +"name":"Green5", +"description":"Cycle of Life", +"spriteAtlas":"maps/tileset/buildings.atlas", +"sprite":"RotatingShop", +"overlaySprite":"Overlay6Green", + "rewards": [ + { + "count":6, + "cardText": "gain.*life|token|draw|food", + "colors": ["green"] + }, + { + "count":2, + "cardText": "gain.*life|token|draw|food" + }] +},{ +"name":"Green6", +"description":"Verdant Haven", +"spriteAtlas":"maps/tileset/buildings.atlas", +"sprite":"RotatingShop", +"overlaySprite":"Overlay6Green", + "rewards": [ + { + "count":6, + "cardText": "tap.*mana|:.*add.*(\\{[gburw]\\}|to your mana)|untap", + "colors": ["green"] + }, + { + "count":2, + "cardText": "tap.*mana|:.*add.*(\\{[gburw]\\}|to your mana)|untap" + }] +},{ +"name":"Red1", +"description":"Burn Baby Burn", +"spriteAtlas":"maps/tileset/buildings.atlas", +"sprite":"RotatingShop", +"overlaySprite":"Overlay6Red", + "rewards": [ + { + "count":6, + "cardText": "deal.*damage|destroy", + "colors": ["red"] + + }, + { + "count":2, + "cardText": "deal.*damage|destroy" + }] +}, +{ +"name":"Red2", +"description":"Weaponize the Monsters", +"spriteAtlas":"maps/tileset/buildings.atlas", +"sprite":"RotatingShop", +"overlaySprite":"Overlay6Red", + "rewards": [ + { + "count":68, + "cardText": "haste|(first |double )strike | prowess|return .* to hand at end of turn|At the beginning of (your|the) end step, (sacrifice|return .* to (your|its owner).*hand)", + "colors": ["red"] + + }, + { + "count":2, + "cardText": "haste|(first |double )strike | prowess|return .* to hand at end of turn|At the beginning of (your|the) end step, (sacrifice|return .* to (your|its owner).*hand)" + }] +},{ +"name":"Red3", +"description":"Mana Cache", +"spriteAtlas":"maps/tileset/buildings.atlas", +"sprite":"RotatingShop", +"overlaySprite":"Overlay6Red", + "rewards": [ + { + "count":6, + "cardText": "each creature|each player|any player may|unless|choose|choice", + "colors": ["red"] + }, + { + "count":2, + "cardText": "each creature|each player|any player may|unless|choose|choice" + }] +},{ +"name":"Red4", +"description":"Seismic Strike", +"spriteAtlas":"maps/tileset/buildings.atlas", +"sprite":"RotatingShop", +"overlaySprite":"Overlay6Red", + "rewards": [ + { + "count":6, + "cardText": "each mountain|number of mountains|sacrifice.*:", + "colors": ["red"] + }, + { + "count":2, + "cardText": "each mountain|number of mountains|sacrifice.*:" + }] +},{ +"name":"Red5", +"description":"Destructive Urge", +"spriteAtlas":"maps/tileset/buildings.atlas", +"sprite":"RotatingShop", +"overlaySprite":"Overlay6Red", + "rewards": [ + { + "count":6, + "cardText": "gain control of|when.*(cast|copy).*spell|if able", + "colors": ["red"] + }, + { + "count":2, + "cardText": "gain control of|when.*(cast|copy).*spell|if able" + }] +},{ +"name":"Red6", +"description":"Wheel of Fate", +"spriteAtlas":"maps/tileset/buildings.atlas", +"sprite":"RotatingShop", +"overlaySprite":"Overlay6Red", + "rewards": [ + { + "count":6, + "cardText": "top of your library|random|roll.*di(c)?e|flip .*coin|coin .*flip|draw .*discard|discard .*draw", + "colors": ["red"] + }, + { + "count":2, + "cardText": "top of your library|random|roll.*di(c)?e|flip .*coin|coin .*flip|draw .*discard|discard .*draw" + }] +},{ +"name":"White1", +"description":"Ounce of Prevention", +"spriteAtlas":"maps/tileset/buildings.atlas", +"sprite":"RotatingShop", +"overlaySprite":"Overlay6White", + "rewards": [ + { + "count":6, + "cardText": "Prevent.*Damage", + "colors": ["white"] + }, + { + "count":2, + "cardText": "Prevent.*Damage" + }] + +},{ +"name":"White2", +"description":"Pound of Cure", +"spriteAtlas":"maps/tileset/buildings.atlas", +"sprite":"RotatingShop", +"overlaySprite":"Overlay6White", + "rewards": [ + { + "count":6, + "cardText": "gain.*life|life total", + "colors": ["white"] + }, + { + "count":2, + "cardText": "gain.*life|life total" + }] +},{ +"name":"White3", +"description":"Swords, Plowshares, and Beyond", +"spriteAtlas":"maps/tileset/buildings.atlas", +"sprite":"RotatingShop", +"overlaySprite":"Overlay6White", + "rewards": [ + { + "count":6, + "cardText": "(Destroy|exile).*(attacking|defending|tapped|with)", + "colors": ["white"] + + }, + { + "count":2, + "cardText": "(Destroy|exile).*(attacking|defending|tapped|with)" + }] +},{ +"name":"White4", +"description":"Only mostly dead", +"spriteAtlas":"maps/tileset/buildings.atlas", +"sprite":"RotatingShop", +"overlaySprite":"Overlay6White", + "rewards": [ + { + "count":6, + "cardText": "Return.*to.*(your hand|battlefield|play)", + "colors": ["white"] + }, + { + "count":2, + "cardText": "Return.*to.*(your hand|battlefield|play)" + }] +},{ +"name":"White5", +"description":"Weights and Measures", +"spriteAtlas":"maps/tileset/buildings.atlas", +"sprite":"RotatingShop", +"overlaySprite":"Overlay6White", + "rewards": [ + { + "count":6, + "cardText":"pays|more|less|tap target creature", + "colors": ["white"] + + }, + { + "count":2, + "cardText": "pays|more|less|tap target creature" + }] +},{ +"name":"White6", +"description":"Strict dogma", +"spriteAtlas":"maps/tileset/buildings.atlas", +"sprite":"RotatingShop", +"overlaySprite":"Overlay6White", + "rewards": [ + { + "count":6, + "type":"Union", + "cardUnion": [ + { + "count":1, + "cardText": "(Vigilance|Lifelink|Protection|First Strike|Double Strike|Flying)", + "colors": ["white"] + }, + { + "count":1, + "cardText": "([+-])\\d?/([+-])\\d?", + "colors": ["white"] + } + ] + + }, + { + "count":2, + "type":"Union", + "cardUnion": [ + { + "count":1, + "cardText": "(Vigilance|Lifelink|Protection|First Strike|Double Strike|Flying)", + }, + { + "count":1, + "cardText": "([+-])\\d?/([+-])\\d?", + } + ] + }] +},{ +"name":"Graveyard", +"description":"Better Call Sol", +"spriteAtlas":"maps/tileset/buildings.atlas", +"sprite":"BlackShop", +"overlaySprite":"Overlay8Red", + "rewards": [ + { + "count":8, + "deckNeeds": ["Ability$Graveyard"] + }] +},{ "name":"WhiteEquipment", "spriteAtlas":"maps/tileset/buildings.atlas", -"sprite":"CapitalShop", +"sprite":"EquipmentShop", "rewards": [ { "type": "item","count":1, "itemName": "Life Amulet" }, { "type": "item","count":1, "itemName": "Gold Armor" }, @@ -19,7 +565,11 @@ "rewards": [ { "type": "item","count":1, "itemName": "White rune" }, { "type": "item","count":1, "itemName": "White Staff" }, - { "type": "mana","count":2 }, + { "type": "item","count":1, "itemName": "Cursed Treasure" }, + { "type": "item","count":1, "itemName": "Farmer's Tools" }, + { "type": "item","count":1, "itemName": "Piper's Charm" }, + { "type": "item","count":1, "itemName": "Sleep Wand" }, + { "type": "item","count":1, "itemName": "Hill Giant Club" }, { "type": "life","count":1 } ] @@ -27,7 +577,7 @@ },{ "name":"RedEquipment", "spriteAtlas":"maps/tileset/buildings.atlas", -"sprite":"CapitalShop", +"sprite":"EquipmentShop", "rewards": [ { "type": "item","count":1, "itemName": "Axt" }, { "type": "item","count":1, "itemName": "Aladdin's Ring" }, @@ -45,15 +595,18 @@ "rewards": [ { "type": "item","count":1, "itemName": "Red rune" }, { "type": "item","count":1, "itemName": "Red Staff" }, - { "type": "mana","count":2 }, + { "type": "item","count":1, "itemName": "Cursed Treasure" }, + { "type": "item","count":1, "itemName": "Farmer's Tools" }, + { "type": "item","count":1, "itemName": "Piper's Charm" }, + { "type": "item","count":1, "itemName": "Sleep Wand" }, + { "type": "item","count":1, "itemName": "Hill Giant Club" }, { "type": "life","count":1 } - ] },{ "name":"BlueEquipment", "spriteAtlas":"maps/tileset/buildings.atlas", -"sprite":"CapitalShop", +"sprite":"EquipmentShop", "rewards": [ { "type": "item","count":1, "itemName": "Traveler's Amulet" }, { "type": "item","count":1, "itemName": "Magic Shard" }, @@ -71,7 +624,11 @@ "rewards": [ { "type": "item","count":1, "itemName": "Blue rune" }, { "type": "item","count":1, "itemName": "Blue Staff" }, - { "type": "mana","count":2 }, + { "type": "item","count":1, "itemName": "Cursed Treasure" }, + { "type": "item","count":1, "itemName": "Farmer's Tools" }, + { "type": "item","count":1, "itemName": "Piper's Charm" }, + { "type": "item","count":1, "itemName": "Sleep Wand" }, + { "type": "item","count":1, "itemName": "Hill Giant Club" }, { "type": "life","count":1 } ] @@ -80,7 +637,7 @@ { "name":"BlackEquipment", "spriteAtlas":"maps/tileset/buildings.atlas", -"sprite":"CapitalShop", +"sprite":"EquipmentShop", "rewards": [ { "type": "item","count":1, "itemName": "Death Ring" }, { "type": "item","count":1, "itemName": "Dark Amulet" }, @@ -98,7 +655,11 @@ "rewards": [ { "type": "item","count":1, "itemName": "Black rune" }, { "type": "item","count":1, "itemName": "Black Staff" }, - { "type": "mana","count":2 }, + { "type": "item","count":1, "itemName": "Cursed Treasure" }, + { "type": "item","count":1, "itemName": "Farmer's Tools" }, + { "type": "item","count":1, "itemName": "Piper's Charm" }, + { "type": "item","count":1, "itemName": "Sleep Wand" }, + { "type": "item","count":1, "itemName": "Hill Giant Club" }, { "type": "life","count":1 } ] @@ -107,7 +668,7 @@ { "name":"GreenEquipment", "spriteAtlas":"maps/tileset/buildings.atlas", -"sprite":"CapitalShop", +"sprite":"EquipmentShop", "rewards": [ { "type": "item","count":1, "itemName": "Jungle Shield" }, { "type": "item","count":1, "itemName": "Ring of Three Wishes" }, @@ -125,7 +686,11 @@ "rewards": [ { "type": "item","count":1, "itemName": "Green rune" }, { "type": "item","count":1, "itemName": "Green Staff" }, - { "type": "mana","count":2 }, + { "type": "item","count":1, "itemName": "Cursed Treasure" }, + { "type": "item","count":1, "itemName": "Farmer's Tools" }, + { "type": "item","count":1, "itemName": "Piper's Charm" }, + { "type": "item","count":1, "itemName": "Sleep Wand" }, + { "type": "item","count":1, "itemName": "Hill Giant Club" }, { "type": "life","count":1 } ] @@ -1468,7 +2033,7 @@ }] },{ "name":"Sliver2Green", - "description":"Venomous Hive", + "description":"Mighty Hive", "spriteAtlas":"maps/tileset/buildings.atlas", "sprite":"SliverShop", "overlaySprite":"Overlay2Green", @@ -1542,7 +2107,7 @@ }] },{ "name":"Sliver2White", - "description":"Warded Hive", + "description":"Plated Hive", "spriteAtlas":"maps/tileset/buildings.atlas", "sprite":"SliverShop", "overlaySprite":"Overlay2White", @@ -1577,6 +2142,191 @@ } ] }] +},{ + "name":"Sliver4Black", + "description":"Spectral Hive", + "spriteAtlas":"maps/tileset/buildings.atlas", + "sprite":"SliverShop", + "overlaySprite":"Overlay4Black", + "rewards": [ + { + "count":4, + "type":"Union", + "cardUnion": [ + { + "count":1, + "subTypes": ["Sliver"] + }, + { + "count":1, + "cardText": "Sliver" + } + ] + }, + { + "count":4, + "type":"Union", + "cardUnion": [ + { + "count":1, + "subTypes": ["Sliver"], + "colors": ["black"] + }, + { + "count":1, + "cardText": "Sliver", + "colors": ["black"] + } + ] + }] +},{ + "name":"Sliver4Blue", + "description":"Mistform Hive", + "spriteAtlas":"maps/tileset/buildings.atlas", + "sprite":"SliverShop", + "overlaySprite":"Overlay2Blue", + "rewards": [ + { + "count":4, + "type":"Union", + "cardUnion": [ + { + "count":1, + "subTypes": ["Sliver"] + }, + { + "count":1, + "cardText": "Sliver" + } + ] + }, + { + "count":4, + "type":"Union", + "cardUnion": [ + { + "count":1, + "subTypes": ["Sliver"], + "colors": ["blue"] + }, + { + "count":1, + "cardText": "Sliver", + "colors": ["blue"] + } + ] + }] +},{ + "name":"Sliver4Green", + "description":"Venemous Hive", + "spriteAtlas":"maps/tileset/buildings.atlas", + "sprite":"SliverShop", + "overlaySprite":"Overlay4Green", + "rewards": [ + { + "count":4, + "type":"Union", + "cardUnion": [ + { + "count":1, + "subTypes": ["Sliver"] + }, + { + "count":1, + "cardText": "Sliver" + } + ] + }, + { + "count":4, + "type":"Union", + "cardUnion": [ + { + "count":1, + "subTypes": ["Sliver"], + "colors": ["green"] + }, + { + "count":1, + "cardText": "Sliver", + "colors": ["green"] + } + ] + }] +},{ + "name":"Sliver4Red", + "description":"Furious Hive", + "spriteAtlas":"maps/tileset/buildings.atlas", + "sprite":"SliverShop", + "overlaySprite":"Overlay2Red", + "rewards": [ + { + "count":4, + "type":"Union", + "cardUnion": [ + { + "count":1, + "subTypes": ["Sliver"] + }, + { + "count":1, + "cardText": "Sliver" + } + ] + }, + { + "count":4, + "type":"Union", + "cardUnion": [ + { + "count":1, + "subTypes": ["Sliver"], + "colors": ["red"] + }, + { + "count":1, + "cardText": "Sliver", + "colors": ["red"] + } + ] + }] +},{ + "name":"Sliver4White", + "description":"Warded Hive", + "spriteAtlas":"maps/tileset/buildings.atlas", + "sprite":"SliverShop", + "overlaySprite":"Overlay2White", + "rewards": [ + { + "count":4, + "type":"Union", + "cardUnion": [ + { + "count":1, + "subTypes": ["Sliver"] + }, + { + "count":1, + "cardText": "Sliver" + } + ] + }, + { + "count":4, + "type":"Union", + "cardUnion": [ + { + "count":1, + "subTypes": ["Sliver"], + "colors": ["white"] + }, + { + "count":1, + "cardText": "Sliver", + "colors": ["white"] + } + ] + }] },{ "name":"Assassin", "description":"Guild of Nightshade", @@ -1904,11 +2654,28 @@ "sprite":"MultiColorShop", "overlaySprite":"Overlay8Black", "rewards": [ - { - "count":8, - "colorType": "MultiColor", - "colors": ["Black"] - }] + { + "count":8, + "type":"Union", + "cardUnion": [ + { + "colorType": "MultiColor", + "colors": ["Black","Blue"] + }, + { + "colorType": "MultiColor", + "colors": ["Black","Green"] + }, + { + "colorType": "MultiColor", + "colors": ["Black","Red"] + }, + { + "colorType": "MultiColor", + "colors": ["Black","White"] + } + ] + }] },{ "name":"Multicolor8Blue", "description":"The Goldsmith", @@ -1916,11 +2683,28 @@ "sprite":"MultiColorShop", "overlaySprite":"Overlay8Blue", "rewards": [ - { - "count":8, - "colorType": "MultiColor", - "colors": ["Blue"] - }] + { + "count":8, + "type":"Union", + "cardUnion": [ + { + "colorType": "MultiColor", + "colors": ["Blue","Black"] + }, + { + "colorType": "MultiColor", + "colors": ["Blue","Green"] + }, + { + "colorType": "MultiColor", + "colors": ["Blue","Red"] + }, + { + "colorType": "MultiColor", + "colors": ["Blue","White"] + } + ] + }] },{ "name":"Multicolor8Green", "description":"The Goldsmith", @@ -1928,11 +2712,28 @@ "sprite":"MultiColorShop", "overlaySprite":"Overlay8Green", "rewards": [ - { - "count":8, - "colorType": "MultiColor", - "colors": ["Green"] - }] + { + "count":8, + "type":"Union", + "cardUnion": [ + { + "colorType": "MultiColor", + "colors": ["Green","Black"] + }, + { + "colorType": "MultiColor", + "colors": ["Green","Blue"] + }, + { + "colorType": "MultiColor", + "colors": ["Green","Red"] + }, + { + "colorType": "MultiColor", + "colors": ["Green","White"] + } + ] + }] },{ "name":"Multicolor8Red", "description":"The Goldsmith", @@ -1940,11 +2741,28 @@ "sprite":"MultiColorShop", "overlaySprite":"Overlay8Red", "rewards": [ - { - "count":8, - "colorType": "MultiColor", - "colors": ["Red"] - }] + { + "count":8, + "type":"Union", + "cardUnion": [ + { + "colorType": "MultiColor", + "colors": ["Red","Black"] + }, + { + "colorType": "MultiColor", + "colors": ["Red","Blue"] + }, + { + "colorType": "MultiColor", + "colors": ["Red","Green"] + }, + { + "colorType": "MultiColor", + "colors": ["Red","White"] + } + ] + }] },{ "name":"Multicolor8White", "description":"The Goldsmith", @@ -1952,11 +2770,28 @@ "sprite":"MultiColorShop", "overlaySprite":"Overlay8White", "rewards": [ - { - "count":8, - "colorType": "MultiColor", - "colors": ["White"] - }] + { + "count":8, + "type":"Union", + "cardUnion": [ + { + "colorType": "MultiColor", + "colors": ["White","Black"] + }, + { + "colorType": "MultiColor", + "colors": ["White","Blue"] + }, + { + "colorType": "MultiColor", + "colors": ["White","Green"] + }, + { + "colorType": "MultiColor", + "colors": ["White","Red"] + } + ] + }] },{ "name":"SpaceMarine", "description":"The Codex",