diff --git a/forge-ai/src/main/java/forge/ai/AiCostDecision.java b/forge-ai/src/main/java/forge/ai/AiCostDecision.java index 168d5974951..664d5c6e533 100644 --- a/forge-ai/src/main/java/forge/ai/AiCostDecision.java +++ b/forge-ai/src/main/java/forge/ai/AiCostDecision.java @@ -792,6 +792,11 @@ public class AiCostDecision extends CostDecisionMakerBase { return PaymentDecision.number(0); } + @Override + public PaymentDecision visit(CostPayShards cost) { + return PaymentDecision.number(0); + } + @Override public PaymentDecision visit(CostUnattach cost) { final Card cardToUnattach = cost.findCardToUnattach(source, player, ability); 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-game/src/main/java/forge/game/Game.java b/forge-game/src/main/java/forge/game/Game.java index 4c4700752b4..e9551be1576 100644 --- a/forge-game/src/main/java/forge/game/Game.java +++ b/forge-game/src/main/java/forge/game/Game.java @@ -27,6 +27,7 @@ import java.util.List; import java.util.Map; import java.util.Set; +import forge.game.card.*; import org.apache.commons.lang3.tuple.Pair; import com.google.common.base.Predicate; @@ -45,16 +46,6 @@ import forge.card.CardRarity; import forge.card.CardStateName; import forge.card.CardType.Supertype; import forge.game.ability.AbilityKey; -import forge.game.card.Card; -import forge.game.card.CardCollection; -import forge.game.card.CardCollectionView; -import forge.game.card.CardDamageHistory; -import forge.game.card.CardLists; -import forge.game.card.CardPredicates; -import forge.game.card.CardUtil; -import forge.game.card.CardView; -import forge.game.card.CardZoneTable; -import forge.game.card.CounterType; import forge.game.combat.Combat; import forge.game.event.Event; import forge.game.event.GameEventDayTimeChanged; @@ -305,6 +296,9 @@ public class Game { pl.setMaxHandSize(psc.getStartingHand()); pl.setStartingHandSize(psc.getStartingHand()); + if (psc.getManaShards() > 0) { + pl.setCounters(CounterEnumType.MANASHARDS, psc.getManaShards(), true); + } int teamNum = psc.getTeamNumber(); if (teamNum == -1) { // RegisteredPlayer doesn't have an assigned team, set it to 1 higher than the highest found team number diff --git a/forge-game/src/main/java/forge/game/card/CounterEnumType.java b/forge-game/src/main/java/forge/game/card/CounterEnumType.java index dcee459ff1a..0bb3840d1cd 100644 --- a/forge-game/src/main/java/forge/game/card/CounterEnumType.java +++ b/forge-game/src/main/java/forge/game/card/CounterEnumType.java @@ -390,6 +390,7 @@ public enum CounterEnumType { POISON("POISN"), TICKET("TICKET"), + MANASHARDS("MANASHARDS"), //Adventure-specific mechanic // Keyword Counters /* diff --git a/forge-game/src/main/java/forge/game/cost/Cost.java b/forge-game/src/main/java/forge/game/cost/Cost.java index 894879a7e48..35221a8e753 100644 --- a/forge-game/src/main/java/forge/game/cost/Cost.java +++ b/forge-game/src/main/java/forge/game/cost/Cost.java @@ -324,6 +324,11 @@ public class Cost implements Serializable { final String[] splitStr = abCostParse(parse, 1); return new CostPayEnergy(splitStr[0]); } + if (parse.startsWith("PayShards<")) { //Adventure specific energy-esque tokens + // Payshards + final String[] splitStr = abCostParse(parse, 1); + return new CostPayShards(splitStr[0]); + } if (parse.startsWith("GainLife<")) { // PayLife diff --git a/forge-game/src/main/java/forge/game/cost/CostPayShards.java b/forge-game/src/main/java/forge/game/cost/CostPayShards.java new file mode 100644 index 00000000000..b8634951fcc --- /dev/null +++ b/forge-game/src/main/java/forge/game/cost/CostPayShards.java @@ -0,0 +1,99 @@ +/* + * Forge: Play Magic: the Gathering. + * Copyright (C) 2011 Forge Team + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package forge.game.cost; + +import com.google.common.base.Strings; +import forge.game.card.Card; +import forge.game.card.CounterEnumType; +import forge.game.player.Player; +import forge.game.spellability.SpellAbility; + + +public class CostPayShards extends CostPart { + /** + * Serializables need a version ID. + */ + private static final long serialVersionUID = 1L; + + int paidAmount = 0; + + /** + * Instantiates a new cost pay shards. + * + * @param amount + * the amount + */ + public CostPayShards(final String amount) { + this.setAmount(amount); + } + + @Override + public int paymentOrder() { return 7; } + + @Override + public Integer getMaxAmountX(final SpellAbility ability, final Player payer, final boolean effect) { + return payer.getCounters(CounterEnumType.MANASHARDS); + } + + /* + * (non-Javadoc) + * + * @see forge.card.cost.CostPart#toString() + */ + @Override + public final String toString() { + final StringBuilder sb = new StringBuilder(); + sb.append("Pay "); + sb.append(Strings.repeat("{M}", Integer.parseInt(getAmount()))); + return sb.toString(); + } + + /* + * (non-Javadoc) + * + * @see forge.card.cost.CostPart#refund(forge.Card) + */ + @Override + public final void refund(final Card source) { + // Really should be activating player + source.getController().loseShards(this.paidAmount * -1); + } + + /* + * (non-Javadoc) + * + * @see + * forge.card.cost.CostPart#canPay(forge.card.spellability.SpellAbility, + * forge.Card, forge.Player, forge.card.cost.Cost) + */ + @Override + public final boolean canPay(final SpellAbility ability, final Player payer, final boolean effect) { + return payer.getCounters(CounterEnumType.MANASHARDS) >= this.getAbilityAmount(ability); + } + + @Override + public boolean payAsDecided(Player ai, PaymentDecision decision, SpellAbility ability, final boolean effect) { + paidAmount = decision.c; + return ai.payShards(paidAmount, null); + } + + public T accept(ICostVisitor visitor) { + return visitor.visit(this); + } + +} diff --git a/forge-game/src/main/java/forge/game/cost/ICostVisitor.java b/forge-game/src/main/java/forge/game/cost/ICostVisitor.java index fab4d46e486..b7fd0acc468 100644 --- a/forge-game/src/main/java/forge/game/cost/ICostVisitor.java +++ b/forge-game/src/main/java/forge/game/cost/ICostVisitor.java @@ -34,6 +34,7 @@ public interface ICostVisitor { T visit(CostUntap cost); T visit(CostUnattach cost); T visit(CostTapType cost); + T visit(CostPayShards cost); class Base implements ICostVisitor { @@ -196,6 +197,11 @@ public interface ICostVisitor { public T visit(CostTapType cost) { return null; } + + @Override + public T visit(CostPayShards cost) { + return null; + } } } diff --git a/forge-game/src/main/java/forge/game/player/Player.java b/forge-game/src/main/java/forge/game/player/Player.java index 7955e1e2d71..0f4f3920368 100644 --- a/forge-game/src/main/java/forge/game/player/Player.java +++ b/forge-game/src/main/java/forge/game/player/Player.java @@ -661,6 +661,28 @@ public class Player extends GameEntity implements Comparable { return canPayEnergy(energyPayment) && loseEnergy(energyPayment) > -1; } + public final boolean canPayShards(final int shardPayment) { + int cnt = getCounters(CounterEnumType.MANASHARDS); + return cnt >= shardPayment; + } + + public final int loseShards(int lostShards) { + int cnt = getCounters(CounterEnumType.MANASHARDS); + if (lostShards > cnt) { + return -1; + } + cnt -= lostShards; + this.setCounters(CounterEnumType.MANASHARDS, cnt, true); + return cnt; + } + + public final boolean payShards(final int shardPayment, final Card source) { + if (shardPayment <= 0) + return true; + + return canPayShards(shardPayment) && loseShards(shardPayment) > -1; + } + // This function handles damage after replacement and prevention effects are applied @Override public final int addDamageAfterPrevention(final int amount, final Card source, final boolean isCombat, GameEntityCounterTable counterTable) { diff --git a/forge-game/src/main/java/forge/game/player/RegisteredPlayer.java b/forge-game/src/main/java/forge/game/player/RegisteredPlayer.java index 22644da012b..b41ba1238e5 100644 --- a/forge-game/src/main/java/forge/game/player/RegisteredPlayer.java +++ b/forge-game/src/main/java/forge/game/player/RegisteredPlayer.java @@ -26,6 +26,7 @@ public class RegisteredPlayer { private int startingLife = 20; private int startingHand = 7; + private int manaShards = 0; private Iterable cardsOnBattlefield = null; private Iterable extraCardsOnBattlefield = null; private Iterable schemes = null; @@ -58,6 +59,14 @@ public class RegisteredPlayer { this.startingLife = startingLife; } + public final int getManaShards() { + return manaShards; + } + + public final void setManaShards(int manaShards) { + this.manaShards = manaShards; + } + public final void setCardsOnBattlefield(Iterable cardsOnTable) { this.cardsOnBattlefield = cardsOnTable; } diff --git a/forge-gui-desktop/src/main/java/forge/toolbox/FSkin.java b/forge-gui-desktop/src/main/java/forge/toolbox/FSkin.java index 3cd930fb54a..042fdaf18d9 100644 --- a/forge-gui-desktop/src/main/java/forge/toolbox/FSkin.java +++ b/forge-gui-desktop/src/main/java/forge/toolbox/FSkin.java @@ -1466,6 +1466,7 @@ public class FSkin { addEncodingSymbol("TK", FSkinProp.IMG_TICKET); addEncodingSymbol("EXPERIENCE", FSkinProp.IMG_EXPERIENCE); addEncodingSymbol("A-", FSkinProp.IMG_ALCHEMY); + addEncodingSymbol("M", FSkinProp.ICO_MANASHARD); // Set look and feel after skin loaded FView.SINGLETON_INSTANCE.setSplashProgessBarMessage("Setting look and feel..."); diff --git a/forge-gui-mobile/src/forge/adventure/character/ShopActor.java b/forge-gui-mobile/src/forge/adventure/character/ShopActor.java index bb8be8212e2..1dd2d904e09 100644 --- a/forge-gui-mobile/src/forge/adventure/character/ShopActor.java +++ b/forge-gui-mobile/src/forge/adventure/character/ShopActor.java @@ -2,27 +2,33 @@ package forge.adventure.character; import com.badlogic.gdx.utils.Array; import forge.Forge; +import forge.adventure.data.ShopData; import forge.adventure.scene.RewardScene; import forge.adventure.stage.MapStage; import forge.adventure.util.Reward; + /** * Map actor that will open the Shop on collision */ public class ShopActor extends MapActor{ private final MapStage stage; - private final boolean unlimited; + private ShopData shopData; Array rewardData; - public ShopActor(MapStage stage, int id, Array rewardData, boolean unlimited) + float shopPriceModifier = 1.0f; + float townPriceModifier = 1.0f; + public ShopActor(MapStage stage, int id, Array rewardData, ShopData data) { super(id); this.stage = stage; + this.shopData = data; this.rewardData = rewardData; - this.unlimited = unlimited; - + this.shopPriceModifier = stage.getChanges().getShopPriceModifier(id) ; + this.townPriceModifier = stage.getChanges().getTownPriceModifier(); } + public float getPriceModifier() { return (shopPriceModifier > 0? shopPriceModifier:1.0f) * (townPriceModifier> 0? townPriceModifier:1.0f); } public MapStage getMapStage() { return stage; @@ -39,6 +45,28 @@ public class ShopActor extends MapActor{ public boolean isUnlimited() { - return unlimited; + return shopData.unlimited; } + + @Override + public String getName() { + return shopData.name; + } + + public String getDescription() { + return shopData.description; + } + + public int getRestockPrice() { + return shopData.restockPrice; + } + + public boolean canRestock() { + return getRestockPrice() > 0; + } + + public ShopData getShopData() { return shopData; } + + public void setRewardData(Array data) { rewardData = data; } + public Array getRewardData() { return rewardData;} } diff --git a/forge-gui-mobile/src/forge/adventure/data/DifficultyData.java b/forge-gui-mobile/src/forge/adventure/data/DifficultyData.java index 21a74974c17..9d6740f61de 100644 --- a/forge-gui-mobile/src/forge/adventure/data/DifficultyData.java +++ b/forge-gui-mobile/src/forge/adventure/data/DifficultyData.java @@ -10,7 +10,7 @@ import com.badlogic.gdx.utils.ObjectMap; public class DifficultyData { public String name=""; public int startingLife=10; - public int startingMana=100; + public int startingShards=1; public int staringMoney=10; public float enemyLifeFactor=1; public boolean startingDifficulty; @@ -18,6 +18,7 @@ public class DifficultyData { public float sellFactor=0.2f; public float goldLoss=0.2f; public float lifeLoss=0.2f; + public float shardSellRatio = 0.8f; public float rewardMaxFactor=1f; public String[] startItems=new String[0]; diff --git a/forge-gui-mobile/src/forge/adventure/data/EffectData.java b/forge-gui-mobile/src/forge/adventure/data/EffectData.java index 77c12986070..1b35fc83b49 100644 --- a/forge-gui-mobile/src/forge/adventure/data/EffectData.java +++ b/forge-gui-mobile/src/forge/adventure/data/EffectData.java @@ -19,6 +19,7 @@ public class EffectData implements Serializable { public float moveSpeed = 1.0f; //Change of movement speed. Map only. public float goldModifier = -1.0f; //Modifier for shop discounts. public int cardRewardBonus = 0; //Bonus "DeckCard" drops. Max 3. + public int extraManaShards = 0; //Mana Shard tokens available to spend in battle //Opponent field. public EffectData opponent; //Effects to be applied to the opponent's side. @@ -31,6 +32,7 @@ public class EffectData implements Serializable { startBattleWithCard=effect.startBattleWithCard; colorView=effect.colorView; opponent = (effect.opponent == null) ? null : new EffectData(effect.opponent); + extraManaShards = effect.extraManaShards; } public Array startBattleWithCards() { diff --git a/forge-gui-mobile/src/forge/adventure/data/ItemData.java b/forge-gui-mobile/src/forge/adventure/data/ItemData.java index b84df21fe66..e7fa777a746 100644 --- a/forge-gui-mobile/src/forge/adventure/data/ItemData.java +++ b/forge-gui-mobile/src/forge/adventure/data/ItemData.java @@ -27,7 +27,7 @@ public class ItemData { public boolean usableOnWorldMap; public boolean usableInPoi; public String commandOnUse; - public int manaNeeded; + public int shardsNeeded; public ItemData() @@ -46,7 +46,7 @@ public class ItemData { usableInPoi = cpy.usableInPoi; usableOnWorldMap = cpy.usableOnWorldMap; commandOnUse = cpy.commandOnUse; - manaNeeded = cpy.manaNeeded; + shardsNeeded = cpy.shardsNeeded; } public Sprite sprite() @@ -90,8 +90,8 @@ public class ItemData { result += "Slot: " + this.equipmentSlot + "\n"; if(effect != null) result += effect.getDescription(); - if(manaNeeded != 0) - result += manaNeeded+" [+Mana]"; + if(shardsNeeded != 0) + result += shardsNeeded+" [+Shards]"; return result; } diff --git a/forge-gui-mobile/src/forge/adventure/data/RewardData.java b/forge-gui-mobile/src/forge/adventure/data/RewardData.java index 07419adb8a2..23c4cc6d0d0 100644 --- a/forge-gui-mobile/src/forge/adventure/data/RewardData.java +++ b/forge-gui-mobile/src/forge/adventure/data/RewardData.java @@ -14,6 +14,7 @@ import forge.model.FModel; import java.util.ArrayList; import java.util.Arrays; +import java.util.HashSet; import java.util.List; /** @@ -42,6 +43,10 @@ public class RewardData { public String colorType; public String cardText; public boolean matchAllSubTypes; + public boolean matchAllColors; + public RewardData[] cardUnion; + public String[] deckNeeds; + public RewardData[] rotation; public RewardData() { } @@ -64,6 +69,10 @@ public class RewardData { colorType =rewardData.colorType; cardText =rewardData.cardText; 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; @@ -119,6 +128,19 @@ public class RewardData { int addedCount = (maxCount > 0 ? WorldSave.getCurrentSave().getWorld().getRandom().nextInt(maxCount) : 0); switch(type) { + case "Union": + HashSet pool = new HashSet<>(); + for (RewardData r : cardUnion) { + pool.addAll(CardUtil.getPredicateResult(allCards, r)); + } + ArrayList finalPool = new ArrayList(pool); + + 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": case "randomCard": if( cardName != null && !cardName.isEmpty() ) { @@ -156,8 +178,9 @@ public class RewardData { case "life": ret.add(new Reward(Reward.Type.Life, count + addedCount)); break; - case "mana": - ret.add(new Reward(Reward.Type.Mana, count + addedCount)); + case "mana": //backwards compatibility for reward data + case "shards": + ret.add(new Reward(Reward.Type.Shards, count + addedCount)); break; } } diff --git a/forge-gui-mobile/src/forge/adventure/data/ShopData.java b/forge-gui-mobile/src/forge/adventure/data/ShopData.java index 4f90b881733..a96386f553f 100644 --- a/forge-gui-mobile/src/forge/adventure/data/ShopData.java +++ b/forge-gui-mobile/src/forge/adventure/data/ShopData.java @@ -10,10 +10,13 @@ import com.badlogic.gdx.utils.Array; public class ShopData { public String name; + public String description; + public int restockPrice; public String spriteAtlas; public String sprite; public boolean unlimited; public Array rewards; + public String overlaySprite = ""; diff --git a/forge-gui-mobile/src/forge/adventure/player/AdventurePlayer.java b/forge-gui-mobile/src/forge/adventure/player/AdventurePlayer.java index b98a648b53e..291bb557180 100644 --- a/forge-gui-mobile/src/forge/adventure/player/AdventurePlayer.java +++ b/forge-gui-mobile/src/forge/adventure/player/AdventurePlayer.java @@ -50,8 +50,7 @@ public class AdventurePlayer implements Serializable, SaveFileContent { private int gold = 0; private int maxLife= 20; private int life = 20; - private int maxMana= 100; - private int mana = 100; + private int shards = 0; private EffectData blessing; //Blessing to apply for next battle. private final PlayerStatistic statistic = new PlayerStatistic(); private final Map questFlags = new HashMap<>(); @@ -67,7 +66,7 @@ public class AdventurePlayer implements Serializable, SaveFileContent { // Signals final SignalList onLifeTotalChangeList = new SignalList(); - final SignalList onManaTotalChangeList = new SignalList(); + final SignalList onShardsChangeList = new SignalList(); final SignalList onGoldChangeList = new SignalList(); final SignalList onPlayerChangeList = new SignalList(); final SignalList onEquipmentChange = new SignalList(); @@ -93,8 +92,7 @@ public class AdventurePlayer implements Serializable, SaveFileContent { gold = 0; maxLife = 20; life = 20; - maxMana = 10; - mana = 10; + shards = 0; clearDecks(); inventoryItems.clear(); equippedItems.clear(); @@ -129,6 +127,7 @@ public class AdventurePlayer implements Serializable, SaveFileContent { this.difficultyData.spawnRank = difficultyData.spawnRank; this.difficultyData.enemyLifeFactor = difficultyData.enemyLifeFactor; this.difficultyData.sellFactor = difficultyData.sellFactor; + this.difficultyData.shardSellRatio = difficultyData.shardSellRatio; gold = difficultyData.staringMoney; name = n; @@ -139,12 +138,12 @@ public class AdventurePlayer implements Serializable, SaveFileContent { setColorIdentity(DeckProxy.getColorIdentity(deck)); life = maxLife = difficultyData.startingLife; - mana = maxMana = difficultyData.startingMana; + shards = difficultyData.startingShards; inventoryItems.addAll(difficultyData.startItems); onGoldChangeList.emit(); onLifeTotalChangeList.emit(); - onManaTotalChangeList.emit(); + onShardsChangeList.emit(); } public void setSelectedDeckSlot(int slot) { @@ -156,8 +155,7 @@ public class AdventurePlayer implements Serializable, SaveFileContent { } public void updateDifficulty(DifficultyData diff) { maxLife = diff.startingLife; - maxMana = diff.startingMana; - this.difficultyData.startingMana = diff.startingMana; + this.difficultyData.startingShards = diff.startingShards; this.difficultyData.startingLife = diff.startingLife; this.difficultyData.staringMoney = diff.staringMoney; this.difficultyData.startingDifficulty = diff.startingDifficulty; @@ -165,6 +163,7 @@ public class AdventurePlayer implements Serializable, SaveFileContent { this.difficultyData.spawnRank = diff.spawnRank; this.difficultyData.enemyLifeFactor = diff.enemyLifeFactor; this.difficultyData.sellFactor = diff.sellFactor; + this.difficultyData.shardSellRatio = diff.shardSellRatio; fullHeal(); } @@ -180,8 +179,7 @@ public class AdventurePlayer implements Serializable, SaveFileContent { public int getGold() { return gold; } public int getLife() { return life; } public int getMaxLife() { return maxLife; } - public int getMana() { return mana; } - public int getMaxMana() { return maxMana; } + public int getShards() { return shards; } public @Null EffectData getBlessing() { return blessing; } public Collection getEquippedItems() { return equippedItems.values(); } @@ -228,6 +226,10 @@ public class AdventurePlayer implements Serializable, SaveFileContent { if(this.difficultyData.sellFactor==0) this.difficultyData.sellFactor=0.2f; + this.difficultyData.shardSellRatio=data.readFloat("sellFactor"); + if(this.difficultyData.shardSellRatio==0) + this.difficultyData.shardSellRatio=0.8f; + name = data.readString("name"); heroRace = data.readInt("heroRace"); avatarIndex = data.readInt("avatarIndex"); @@ -240,8 +242,7 @@ public class AdventurePlayer implements Serializable, SaveFileContent { gold = data.readInt("gold"); maxLife = data.readInt("maxLife"); life = data.readInt("life"); - maxMana = data.containsKey("maxMana")?data.readInt("maxMana"):100; - mana = data.containsKey("mana")?data.readInt("mana"):100; + shards = data.containsKey("shards")?data.readInt("shards"):0; worldPosX = data.readFloat("worldPosX"); worldPosY = data.readFloat("worldPosY"); @@ -310,7 +311,7 @@ public class AdventurePlayer implements Serializable, SaveFileContent { announceCustom = data.containsKey("announceCustom") ? data.readBool("announceCustom") : false; onLifeTotalChangeList.emit(); - onManaTotalChangeList.emit(); + onShardsChangeList.emit(); onGoldChangeList.emit(); onBlessing.emit(); } @@ -326,6 +327,7 @@ public class AdventurePlayer implements Serializable, SaveFileContent { data.store("difficultyName",this.difficultyData.name); data.store("enemyLifeFactor",this.difficultyData.enemyLifeFactor); data.store("sellFactor",this.difficultyData.sellFactor); + data.store("shardSellRatio", this.difficultyData.shardSellRatio); data.store("name",name); data.store("heroRace",heroRace); @@ -343,8 +345,7 @@ public class AdventurePlayer implements Serializable, SaveFileContent { data.store("gold",gold); data.store("life",life); data.store("maxLife",maxLife); - data.store("mana",mana); - data.store("maxMana",maxMana); + data.store("shards",shards); data.store("deckName",deck.getName()); data.storeObject("inventory",inventoryItems.toArray(String.class)); @@ -418,8 +419,8 @@ public class AdventurePlayer implements Serializable, SaveFileContent { case Life: addMaxLife(reward.getCount()); break; - case Mana: - addMaxMana(reward.getCount()); + case Shards: + addShards(reward.getCount()); break; } } @@ -428,8 +429,8 @@ public class AdventurePlayer implements Serializable, SaveFileContent { gold+=goldCount; onGoldChangeList.emit(); } - public void onManaChange(Runnable o) { - onManaTotalChangeList.add(o); + public void onShardsChange(Runnable o) { + onShardsChangeList.add(o); o.run(); } @@ -466,29 +467,23 @@ public class AdventurePlayer implements Serializable, SaveFileContent { return false; } - public void potionOfFalseLife() { + public boolean potionOfFalseLife() { if (gold >= falseLifeCost() && life == maxLife) { life = maxLife + 2; gold -= falseLifeCost(); onLifeTotalChangeList.emit(); onGoldChangeList.emit(); + return true; } else { System.out.println("Can't afford cost of false life " + falseLifeCost()); System.out.println("Only has this much gold " + gold); } + return false; } public int falseLifeCost() { - return 200 + (int)(50 * getStatistic().winLossRatio()); - } - - public void addMana(int addedValue) { - mana = Math.min(maxMana,Math.max(mana + addedValue, 0)); - onManaTotalChangeList.emit(); - } - public void addManaPercent(float percent) { - mana = Math.min(mana + (int)(maxMana*percent), maxMana); - onManaTotalChangeList.emit(); + int ret = 200 + (int)(50 * getStatistic().winLossRatio()); + return ret < 0?250:ret; } public void heal(int amount) { life = Math.min(life + amount, maxLife); @@ -505,18 +500,13 @@ public class AdventurePlayer implements Serializable, SaveFileContent { onGoldChangeList.emit(); } public void win() { - Current.player().addManaPercent(0.1f); + Current.player().addShards(1); } public void addMaxLife(int count) { maxLife += count; life += count; onLifeTotalChangeList.emit(); } - public void addMaxMana(int count) { - maxMana += count; - mana += count; - onManaTotalChangeList.emit(); - } public void giveGold(int price) { takeGold(-price); } @@ -524,6 +514,18 @@ public class AdventurePlayer implements Serializable, SaveFileContent { gold -= price; onGoldChangeList.emit(); } + public void addShards(int number) { + takeShards(-number); + } + public void takeShards(int number) { + shards -= number; + onShardsChangeList.emit(); + } + + public void setShards(int number) { + shards = number; + onShardsChangeList.emit(); + } public void addBlessing(EffectData bless){ blessing = bless; diff --git a/forge-gui-mobile/src/forge/adventure/pointofintrest/PointOfInterestChanges.java b/forge-gui-mobile/src/forge/adventure/pointofintrest/PointOfInterestChanges.java index 4e1478f690e..61c79b43f9a 100644 --- a/forge-gui-mobile/src/forge/adventure/pointofintrest/PointOfInterestChanges.java +++ b/forge-gui-mobile/src/forge/adventure/pointofintrest/PointOfInterestChanges.java @@ -1,5 +1,6 @@ package forge.adventure.pointofintrest; +import forge.adventure.util.Current; import forge.adventure.util.SaveFileContent; import forge.adventure.util.SaveFileData; @@ -14,6 +15,8 @@ public class PointOfInterestChanges implements SaveFileContent { private final HashSet deletedObjects=new HashSet<>(); private final HashMap> cardsBought = new HashMap<>(); private final java.util.Map mapFlags = new HashMap<>(); + private final java.util.Map shopSeeds = new HashMap<>(); + private final java.util.Map shopModifiers = new HashMap<>(); public static class Map extends HashMap implements SaveFileContent { @Override @@ -52,8 +55,12 @@ public class PointOfInterestChanges implements SaveFileContent { deletedObjects.addAll((HashSet) data.readObject("deletedObjects")); cardsBought.clear(); cardsBought.putAll((HashMap>) data.readObject("cardsBought")); + shopSeeds.clear(); + shopSeeds.putAll((java.util.Map) data.readObject("shopSeeds")); mapFlags.clear(); mapFlags.putAll((java.util.Map) data.readObject("mapFlags")); + shopModifiers.clear(); + shopModifiers.putAll((java.util.Map) data.readObject("shopModifiers")); } @Override @@ -62,6 +69,8 @@ public class PointOfInterestChanges implements SaveFileContent { data.storeObject("deletedObjects",deletedObjects); data.storeObject("cardsBought",cardsBought); data.storeObject("mapFlags", mapFlags); + data.storeObject("shopSeeds", shopSeeds); + data.storeObject("shopModifiers", shopModifiers); return data; } @@ -85,4 +94,48 @@ public class PointOfInterestChanges implements SaveFileContent { return cardsBought.get(objectID).contains(cardIndex); } + public long getShopSeed(int objectID){ + if (!shopSeeds.containsKey(objectID)) + { + generateNewShopSeed(objectID); + } + return shopSeeds.get(objectID); + } + + public void generateNewShopSeed(int objectID){ + shopSeeds.put(objectID, Current.world().getRandom().nextLong()); + 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)) + { + return -1.0f; + } + return shopModifiers.get(objectID); + } + + public void setShopModifier(int objectID, float mod){ + if (objectID!= 0) shopModifiers.put(objectID, mod); + } + + public float getTownPriceModifier(){ + if (!shopModifiers.containsKey(0)) + { + return -1.0f; + } + return shopModifiers.get(0); + } + + public void setTownModifier(float mod){ + shopModifiers.put(0, mod); + } + } diff --git a/forge-gui-mobile/src/forge/adventure/scene/DuelScene.java b/forge-gui-mobile/src/forge/adventure/scene/DuelScene.java index 862e3a36813..230e206f5e4 100644 --- a/forge-gui-mobile/src/forge/adventure/scene/DuelScene.java +++ b/forge-gui-mobile/src/forge/adventure/scene/DuelScene.java @@ -22,6 +22,7 @@ import forge.deck.Deck; import forge.deck.DeckProxy; import forge.game.GameRules; import forge.game.GameType; +import forge.game.card.CounterEnumType; import forge.game.player.Player; import forge.game.player.RegisteredPlayer; import forge.gamemodes.match.HostedMatch; @@ -87,6 +88,13 @@ public class DuelScene extends ForgeScene { boolean winner = false; try { winner = humanPlayer == hostedMatch.getGame().getMatch().getWinner(); + + //Persists expended (or potentially gained) shards back to Adventure + //TODO: Progress towards applicable Adventure quests also needs to be reported here. + List humans = hostedMatch.getHumanControllers(); + if (humans.size() == 1) { + Current.player().setShards(humans.get(0).getPlayer().getCounters(CounterEnumType.MANASHARDS)); + } } catch (Exception e) { e.printStackTrace(); } @@ -157,16 +165,19 @@ public class DuelScene extends ForgeScene { //Apply various combat effects. int lifeMod = 0; int changeStartCards = 0; + int extraManaShards = 0; Array startCards = new Array<>(); for (EffectData data : effects) { lifeMod += data.lifeModifier; changeStartCards += data.changeStartCards; startCards.addAll(data.startBattleWithCards()); + extraManaShards += data.extraManaShards; } player.addExtraCardsOnBattlefield(startCards); player.setStartingLife(Math.max(1, lifeMod + player.getStartingLife())); player.setStartingHand(player.getStartingHand() + changeStartCards); + player.setManaShards((player.getManaShards() + extraManaShards)); } public void setDungeonEffect(EffectData E) { @@ -197,6 +208,7 @@ public class DuelScene extends ForgeScene { humanPlayer.setPlayer(playerObject); humanPlayer.setTeamNumber(0); humanPlayer.setStartingLife(advPlayer.getLife()); + humanPlayer.setManaShards((advPlayer.getShards())); Array playerEffects = new Array<>(); Array oppEffects = new Array<>(); diff --git a/forge-gui-mobile/src/forge/adventure/scene/InnScene.java b/forge-gui-mobile/src/forge/adventure/scene/InnScene.java index 1bcad6681ac..d1d17a5db48 100644 --- a/forge-gui-mobile/src/forge/adventure/scene/InnScene.java +++ b/forge-gui-mobile/src/forge/adventure/scene/InnScene.java @@ -2,8 +2,10 @@ package forge.adventure.scene; import com.badlogic.gdx.scenes.scene2d.ui.Image; import com.github.tommyettinger.textra.TextraButton; +import com.github.tommyettinger.textra.TextraLabel; import forge.Forge; import forge.adventure.stage.GameHUD; +import forge.adventure.util.Controls; import forge.adventure.util.Current; /** @@ -20,6 +22,7 @@ public class InnScene extends UIScene { TextraButton tempHitPointCost, sell, leave; Image healIcon, sellIcon, leaveIcon; + private TextraLabel playerGold,playerShards; private InnScene() { @@ -30,7 +33,8 @@ public class InnScene extends UIScene { ui.onButtonPress("sell", InnScene.this::sell); leave = ui.findActor("done"); sell = ui.findActor("sell"); - + playerGold = Controls.newAccountingLabel(ui.findActor("playerGold"), false); + playerShards = Controls.newAccountingLabel(ui.findActor("playerShards"),true); leaveIcon = ui.findActor("leaveIcon"); healIcon = ui.findActor("healIcon"); @@ -45,7 +49,9 @@ public class InnScene extends UIScene { } public void potionOfFalseLife() { - Current.player().potionOfFalseLife(); + if (Current.player().potionOfFalseLife()){ + refreshStatus(); + } } @Override @@ -59,12 +65,16 @@ public class InnScene extends UIScene { super.render(); } + int tempHealthCost = 0; + @Override public void enter() { super.enter(); - int tempHealthCost = Current.player().falseLifeCost(); - if (tempHealthCost < 0) // if computed negative set 250 as minimum - tempHealthCost = 250; + refreshStatus(); + } + + private void refreshStatus(){ + tempHealthCost = Current.player().falseLifeCost(); boolean purchaseable = Current.player().getMaxLife() == Current.player().getLife() && tempHealthCost <= Current.player().getGold(); @@ -76,5 +86,4 @@ public class InnScene extends UIScene { Forge.switchScene(ShopScene.instance()); } - } diff --git a/forge-gui-mobile/src/forge/adventure/scene/InventoryScene.java b/forge-gui-mobile/src/forge/adventure/scene/InventoryScene.java index 940a9f27a5f..879691f6172 100644 --- a/forge-gui-mobile/src/forge/adventure/scene/InventoryScene.java +++ b/forge-gui-mobile/src/forge/adventure/scene/InventoryScene.java @@ -159,7 +159,7 @@ public class InventoryScene extends UIScene { ItemData data = ItemData.getItem(itemLocation.get(selected)); if(data==null)return; - Current.player().addMana(-data.manaNeeded); + Current.player().addShards(-data.shardsNeeded); done(); ConsoleCommandInterpreter.getInstance().command(data.commandOnUse); } @@ -192,12 +192,12 @@ public class InventoryScene extends UIScene { boolean isInPoi = MapStage.getInstance().isInMap(); useButton.setDisabled(!(isInPoi&&data.usableInPoi||!isInPoi&&data.usableOnWorldMap)); - if(data.manaNeeded==0) + if(data.shardsNeeded==0) useButton.setText("Use"); else - useButton.setText("Use "+data.manaNeeded+"[+Mana]"); + useButton.setText("Use "+data.shardsNeeded+"[+Shards]"); useButton.layout(); - if(Current.player().getMana() RewardScene.this.done()); ui.onButtonPress("detail",()->RewardScene.this.toggleToolTip()); + ui.onButtonPress("restock",()-> RewardScene.this.restockShop()); detailButton = ui.findActor("detail"); detailButton.setVisible(false); doneButton = ui.findActor("done"); + restockButton = ui.findActor("restock"); } @Override @@ -221,11 +230,52 @@ 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()); + + Current.player().takeShards(price); + + Gdx.input.vibrate(5); + SoundSystem.instance.play(SoundEffectType.Shuffle, false); + + updateBuyButtons(); + if(changes==null) + return; + + clearGenerated(); + + ShopData data = shopActor.getShopData(); + Array ret = new Array<>(); + + long shopSeed = changes.getShopSeed(shopActor.getObjectId()); + WorldSave.getCurrentSave().getWorld().getRandom().setSeed(shopSeed); + for (RewardData rdata : new Array.ArrayIterator<>(data.rewards)) { + ret.addAll(rdata.generate(false)); + } + shopActor.setRewardData(ret); + loadRewards(ret, RewardScene.Type.Shop,shopActor); + } public void loadRewards(Array newRewards, Type type, ShopActor shopActor) { clearSelectable(); this.type = type; doneClicked = false; + if (type==Type.Shop) { + this.shopActor = shopActor; + this.changes = shopActor.getMapStage().getChanges(); + } for (Actor actor : new Array.ArrayIterator<>(generated)) { actor.remove(); if (actor instanceof RewardActor) { @@ -234,15 +284,23 @@ public class RewardScene extends UIScene { } generated.clear(); - Actor card = ui.findActor("cards"); if(type==Type.Shop) { - goldLabel.setText(Current.player().getGold()+"[+Gold]"); + String shopName = shopActor.getDescription(); + if (shopName != null && !shopName.isEmpty()) { + shopNameLabel.setVisible(true); + shopNameLabel.setText(shopName); + } + else + { + shopNameLabel.setVisible(false); + } Actor background = ui.findActor("market_background"); if(background!=null) background.setVisible(true); } else { - goldLabel.setText(""); + shopNameLabel.setVisible(false); + shopNameLabel.setText(""); Actor background = ui.findActor("market_background"); if(background!=null) background.setVisible(false); @@ -266,10 +324,24 @@ public class RewardScene extends UIScene { switch (type) { case Shop: doneButton.setText(Forge.getLocalizer().getMessage("lblLeave")); - goldLabel.setText(Current.player().getGold()+"[+Gold]"); + String shopName = shopActor.getDescription(); + if ((shopName != null && !shopName.isEmpty())) { + shopNameLabel.setVisible(true); + shopNameLabel.setText(shopName); + } + + if (shopActor.canRestock()) { + restockButton.setVisible(true); + } + else{ + restockButton.setVisible(false); + restockButton.setDisabled(true); + } break; case Loot: - goldLabel.setText(""); + shopNameLabel.setVisible(false); + shopNameLabel.setText(""); + restockButton.setVisible(false); doneButton.setText(Forge.getLocalizer().getMessage("lblDone")); break; } @@ -334,7 +406,7 @@ public class RewardScene extends UIScene { for (Reward reward : new Array.ArrayIterator<>(newRewards)) { boolean skipCard = false; if (type == Type.Shop) { - if (shopActor.getMapStage().getChanges().wasCardBought(shopActor.getObjectId(), i)) { + if (changes.wasCardBought(shopActor.getObjectId(), i)) { skipCard = true; } } @@ -354,7 +426,7 @@ public class RewardScene extends UIScene { if (currentRow != ((i + 1) / numberOfColumns)) yOff += doneButton.getHeight(); - BuyButton buyCardButton = new BuyButton(shopActor.getObjectId(), i, shopActor.isUnlimited()?null:shopActor.getMapStage().getChanges(), actor, doneButton); + BuyButton buyCardButton = new BuyButton(shopActor.getObjectId(), i, actor, doneButton, shopActor.getPriceModifier()); generated.add(buyCardButton); if (!skipCard) { stage.addActor(buyCardButton); @@ -369,7 +441,10 @@ public class RewardScene extends UIScene { } i++; } - updateBuyButtons(); + if (type == Type.Shop) { + updateBuyButtons(); + updateRestockButton(); + } } @@ -380,11 +455,9 @@ public class RewardScene extends UIScene { } } } - private class BuyButton extends TextraButton { private final int objectID; private final int index; - private final PointOfInterestChanges changes; public RewardActor reward; int price; @@ -392,11 +465,10 @@ public class RewardScene extends UIScene { setDisabled(WorldSave.getCurrentSave().getPlayer().getGold() < price); } - public BuyButton(int id, int i, PointOfInterestChanges ch, RewardActor actor, TextraButton style) { + public BuyButton(int id, int i, RewardActor actor, TextraButton style, float shopModifier) { super("", style.getStyle(),Controls.getTextraFont()); this.objectID = id; this.index = i; - this.changes = ch; reward = actor; setHeight(style.getHeight()); setWidth(actor.getWidth()); @@ -404,13 +476,15 @@ public class RewardScene extends UIScene { setY(actor.getY() - getHeight()); price = CardUtil.getRewardPrice(actor.getReward()); price *= Current.player().goldModifier(); + price *= shopModifier; setText(price+"[+Gold]"); addListener(new ClickListener() { @Override public void clicked(InputEvent event, float x, float y) { if (Current.player().getGold() >= price) { - if(changes!=null) + if(!shopActor.isUnlimited()) changes.buyCard(objectID, index); + Current.player().takeGold(price); Current.player().addReward(reward.getReward()); @@ -418,7 +492,6 @@ public class RewardScene extends UIScene { SoundSystem.instance.play(SoundEffectType.FlipCoin, false); updateBuyButtons(); - goldLabel.setText(AdventurePlayer.current().getGold()+"[+Gold]"); if(changes==null) return; setDisabled(true); diff --git a/forge-gui-mobile/src/forge/adventure/scene/ShardTraderScene.java b/forge-gui-mobile/src/forge/adventure/scene/ShardTraderScene.java new file mode 100644 index 00000000000..967b6dff26d --- /dev/null +++ b/forge-gui-mobile/src/forge/adventure/scene/ShardTraderScene.java @@ -0,0 +1,97 @@ +package forge.adventure.scene; + +import com.badlogic.gdx.scenes.scene2d.ui.Image; +import com.github.tommyettinger.textra.TextraButton; +import com.github.tommyettinger.textra.TextraLabel; +import forge.Forge; +import forge.adventure.stage.GameHUD; +import forge.adventure.util.Controls; +import forge.adventure.util.Current; + +/** + * Scene for the Shard Trader in towns + */ +public class ShardTraderScene extends UIScene { + private static ShardTraderScene object; + + public static final String spriteAtlas = "maps/tileset/buildings.atlas"; + public static final String sprite = "ShardTrader"; + + public static ShardTraderScene instance() { + if(object==null) + object=new ShardTraderScene(); + return object; + } + + TextraButton buyShardsCost, sellShardsQuantity, leave; + Image leaveIcon; + + private TextraLabel playerGold, playerShards; + + int shardsToSell = 5; + + int shardsToBuy = 5; + + int shardPrice = Math.round(100 * Current.player().getDifficulty().shardSellRatio); + + int shardCost = 100; + + private ShardTraderScene() { + super(Forge.isLandscapeMode() ? "ui/shardtrader.json" : "ui/shardtrader_portrait.json"); + buyShardsCost = ui.findActor("btnBuyShardsCost"); + sellShardsQuantity = ui.findActor("btnSellShardsQuantity"); + ui.onButtonPress("done", ShardTraderScene.this::done); + ui.onButtonPress("btnBuyShardsCost", ShardTraderScene.this::buyShards); + ui.onButtonPress("btnSellShardsQuantity", ShardTraderScene.this::sellShards); + leave = ui.findActor("done"); + playerGold = Controls.newAccountingLabel(ui.findActor("playerGold"), false); + playerShards = Controls.newAccountingLabel(ui.findActor("playerShards"),true); + leaveIcon = ui.findActor("leaveIcon"); + } + + public void done() { + GameHUD.getInstance().getTouchpad().setVisible(false); + Forge.switchToLast(); + } + + public void buyShards() { + Current.player().addShards(shardsToBuy); + Current.player().takeGold(shardCost); + refreshStatus(-shardCost,shardsToBuy); + } + + public void sellShards() { + Current.player().takeShards(shardsToSell); + Current.player().giveGold(shardPrice); + refreshStatus(shardPrice,-shardsToSell); + } + + @Override + public void act(float delta) { + stage.act(delta); + } + + + @Override + public void render() { + super.render(); + } + + @Override + public void enter() { + super.enter(); + refreshStatus(0,0); + } + + private void refreshStatus(int goldAdded, int shardsAdded) { + int currentGold = Current.player().getGold(); + int currentShards = Current.player().getShards(); + + shardPrice = Math.round(100 * Current.player().getDifficulty().shardSellRatio); + + sellShardsQuantity.setDisabled(currentShards < shardsToSell); + buyShardsCost.setDisabled(currentGold < shardCost); + buyShardsCost.setText( "Buy " + shardsToBuy+ "[+Shards] for " + shardCost+"[+Gold]"); + sellShardsQuantity.setText("Sell " +shardsToSell+"[+Shards] for " +shardPrice+"[+Gold]"); + } +} diff --git a/forge-gui-mobile/src/forge/adventure/scene/SpellSmithScene.java b/forge-gui-mobile/src/forge/adventure/scene/SpellSmithScene.java index 09124f3b24a..b1b9daf3af0 100644 --- a/forge-gui-mobile/src/forge/adventure/scene/SpellSmithScene.java +++ b/forge-gui-mobile/src/forge/adventure/scene/SpellSmithScene.java @@ -12,10 +12,7 @@ import com.github.tommyettinger.textra.TextraLabel; import forge.Forge; import forge.StaticData; import forge.adventure.data.RewardData; -import forge.adventure.util.Config; -import forge.adventure.util.Current; -import forge.adventure.util.Reward; -import forge.adventure.util.RewardActor; +import forge.adventure.util.*; import forge.card.CardEdition; import forge.card.ColorSet; import forge.item.PaperCard; @@ -38,8 +35,8 @@ public class SpellSmithScene extends UIScene { } private List cardPool = new ArrayList<>(); - private final TextraLabel goldLabel; - private final TextraButton pullButton; + private TextraLabel playerGold, playerShards, poolSize; + private final TextraButton pullUsingGold, pullUsingShards; private final ScrollPane rewardDummy; private RewardActor rewardActor; SelectBox editionList; @@ -55,6 +52,7 @@ public class SpellSmithScene extends UIScene { //Other private final float basePrice = 125f; private int currentPrice = 0; + private int currentShardPrice = 0; private SpellSmithScene() { super(Forge.isLandscapeMode() ? "ui/spellsmith.json" : "ui/spellsmith_portrait.json"); @@ -68,7 +66,7 @@ public class SpellSmithScene extends UIScene { .filter(input2 -> input2.getEdition().equals(input.getCode())).collect(Collectors.toList()); if(it.size()==0) return false; - return(!Arrays.asList(Config.instance().getConfigData().restrictedEditions).contains(input.getCode())); + return (!Arrays.asList(Config.instance().getConfigData().restrictedEditions).contains(input.getCode())); }).collect(Collectors.toList()); editionList = ui.findActor("BSelectPlane"); rewardDummy = ui.findActor("RewardDummy"); @@ -86,44 +84,47 @@ public class SpellSmithScene extends UIScene { } }); - goldLabel = ui.findActor("gold"); - pullButton = ui.findActor("pull"); - pullButton.setDisabled(true); - goldLabel.setText("Gold: "+ Current.player().getGold()); - for(String i : new String[]{"BBlack", "BBlue", "BGreen", "BRed", "BWhite", "BColorless"} ){ + pullUsingGold = ui.findActor("pullUsingGold"); + pullUsingGold.setDisabled(true); + pullUsingShards = ui.findActor("pullUsingShards"); + pullUsingShards.setDisabled(true); + playerGold = Controls.newAccountingLabel(ui.findActor("playerGold"), false); + playerShards = Controls.newAccountingLabel(ui.findActor("playerShards"),true); + poolSize = ui.findActor("poolSize"); + for (String i : new String[]{"BBlack", "BBlue", "BGreen", "BRed", "BWhite", "BColorless"}) { TextraButton button = ui.findActor(i); - if(button != null){ + if (button != null) { colorButtons.put(i, button); button.addListener(new ClickListener() { @Override - public void clicked(InputEvent event, float x, float y){ + public void clicked(InputEvent event, float x, float y) { selectColor(i); filterResults(); } }); } } - for(String i : new String[]{"BCommon", "BUncommon", "BRare", "BMythic"} ){ + for (String i : new String[]{"BCommon", "BUncommon", "BRare", "BMythic"}) { TextraButton button = ui.findActor(i); - if(button != null) { + if (button != null) { rarityButtons.put(i, button); button.addListener(new ClickListener() { @Override public void clicked(InputEvent event, float x, float y) { - if(selectRarity(i)) button.setColor(Color.RED); + if (selectRarity(i)) button.setColor(Color.RED); filterResults(); } }); } } - for(String i : new String[]{"B02", "B35", "B68", "B9X"} ){ + for (String i : new String[]{"B02", "B35", "B68", "B9X"}) { TextraButton button = ui.findActor(i); - if(button != null) { + if (button != null) { costButtons.put(i, button); button.addListener(new ClickListener() { @Override public void clicked(InputEvent event, float x, float y) { - if(selectCost(i)) button.setColor(Color.RED); + if (selectCost(i)) button.setColor(Color.RED); filterResults(); } }); @@ -131,7 +132,8 @@ public class SpellSmithScene extends UIScene { } ui.onButtonPress("done", () -> SpellSmithScene.this.done()); - ui.onButtonPress("pull", () -> SpellSmithScene.this.pullCard()); + ui.onButtonPress("pullUsingGold", () -> SpellSmithScene.this.pullCard(false)); + ui.onButtonPress("pullUsingShards", () -> SpellSmithScene.this.pullCard(true)); ui.onButtonPress("BResetEdition", () -> { editionList.setColor(Color.WHITE); edition = ""; @@ -141,39 +143,57 @@ public class SpellSmithScene extends UIScene { public boolean done() { - if(rewardActor != null) rewardActor.remove(); + if (rewardActor != null) rewardActor.remove(); cardPool.clear(); //Get rid of cardPool, filtering is fast enough to justify keeping it cached. Forge.switchToLast(); return true; } - private boolean selectRarity(String what){ - for(Map.Entry B : rarityButtons.entrySet()) + private boolean selectRarity(String what) { + for (Map.Entry B : rarityButtons.entrySet()) B.getValue().setColor(Color.WHITE); - switch(what){ + switch (what) { case "BCommon": - if(rarity.equals("C")) { rarity = ""; return false; } - rarity = "C"; break; + if (rarity.equals("C")) { + rarity = ""; + return false; + } + rarity = "C"; + break; case "BUncommon": - if(rarity.equals("U")) { rarity = ""; return false; } - rarity = "U"; break; + if (rarity.equals("U")) { + rarity = ""; + return false; + } + rarity = "U"; + break; case "BRare": - if(rarity.equals("R")) { rarity = ""; return false; } - rarity = "R"; break; + if (rarity.equals("R")) { + rarity = ""; + return false; + } + rarity = "R"; + break; case "BMythic": - if(rarity.equals("M")) { rarity = ""; return false; } - rarity = "M"; break; + if (rarity.equals("M")) { + rarity = ""; + return false; + } + rarity = "M"; + break; default: - rarity = ""; break; + rarity = ""; + break; } return true; } - private void selectColor(String what){ + private void selectColor(String what) { TextraButton B = colorButtons.get(what); - switch(what){ + switch (what) { case "BColorless": - if(B.getColor().equals(Color.RED)) B.setColor(Color.WHITE); else { + if (B.getColor().equals(Color.RED)) B.setColor(Color.WHITE); + else { for (Map.Entry BT : colorButtons.entrySet()) BT.getValue().setColor(Color.WHITE); B.setColor(Color.RED); @@ -184,45 +204,71 @@ public class SpellSmithScene extends UIScene { case "BGreen": case "BRed": case "BWhite": - if(B.getColor().equals(Color.RED)) B.setColor(Color.WHITE); else B.setColor(Color.RED); + if (B.getColor().equals(Color.RED)) B.setColor(Color.WHITE); + else B.setColor(Color.RED); break; } } - private boolean selectCost(String what){ - for(Map.Entry B : costButtons.entrySet()) + private boolean selectCost(String what) { + for (Map.Entry B : costButtons.entrySet()) B.getValue().setColor(Color.WHITE); - switch(what){ + switch (what) { case "B02": - if(cost_low == 0 && cost_high == 2) { cost_low = -1; cost_high = 9999; return false; } - cost_low = 0; cost_high = 2; break; + if (cost_low == 0 && cost_high == 2) { + cost_low = -1; + cost_high = 9999; + return false; + } + cost_low = 0; + cost_high = 2; + break; case "B35": - if(cost_low == 3 && cost_high == 5) { cost_low = -1; cost_high = 9999; return false; } - cost_low = 3; cost_high = 5; break; + if (cost_low == 3 && cost_high == 5) { + cost_low = -1; + cost_high = 9999; + return false; + } + cost_low = 3; + cost_high = 5; + break; case "B68": - if(cost_low == 6 && cost_high == 8) { cost_low = -1; cost_high = 9999; return false; } - cost_low = 6; cost_high = 8; break; + if (cost_low == 6 && cost_high == 8) { + cost_low = -1; + cost_high = 9999; + return false; + } + cost_low = 6; + cost_high = 8; + break; case "B9X": - if(cost_low == 9 && cost_high == 9999) { cost_low = -1; cost_high = 9999; return false; } - cost_low = 9; cost_high = 9999; break; + if (cost_low == 9 && cost_high == 9999) { + cost_low = -1; + cost_high = 9999; + return false; + } + cost_low = 9; + cost_high = 9999; + break; default: - cost_low = -1; break; + cost_low = -1; + break; } return true; } @Override - public void enter(){ + public void enter() { edition = ""; - cost_low = -1; cost_high = 9999; + cost_low = -1; + cost_high = 9999; rarity = ""; - currentPrice = (int)basePrice; - goldLabel.setText(Current.player().getGold()+"[+Gold]"); + currentPrice = (int) basePrice; - for(Map.Entry B : colorButtons.entrySet()) B.getValue().setColor(Color.WHITE); - for(Map.Entry B : costButtons.entrySet()) B.getValue().setColor(Color.WHITE); - for(Map.Entry B : rarityButtons.entrySet()) B.getValue().setColor(Color.WHITE); + for (Map.Entry B : colorButtons.entrySet()) B.getValue().setColor(Color.WHITE); + for (Map.Entry B : costButtons.entrySet()) B.getValue().setColor(Color.WHITE); + for (Map.Entry B : rarityButtons.entrySet()) B.getValue().setColor(Color.WHITE); editionList.setColor(Color.WHITE); filterResults(); super.enter(); @@ -231,28 +277,27 @@ public class SpellSmithScene extends UIScene { public void filterResults() { Iterable P = RewardData.getAllCards(); - goldLabel.setText( Current.player().getGold()+"[+Gold]"); float totalCost = basePrice * Current.player().goldModifier(); final List colorFilter = new ArrayList<>(); - for(Map.Entry B : colorButtons.entrySet()) - switch (B.getKey()){ + for (Map.Entry B : colorButtons.entrySet()) + switch (B.getKey()) { case "BColorless": - if(B.getValue().getColor().equals(Color.RED)) colorFilter.add("Colorless"); + if (B.getValue().getColor().equals(Color.RED)) colorFilter.add("Colorless"); continue; case "BBlack": - if(B.getValue().getColor().equals(Color.RED)) colorFilter.add("Black"); + if (B.getValue().getColor().equals(Color.RED)) colorFilter.add("Black"); break; case "BBlue": - if(B.getValue().getColor().equals(Color.RED)) colorFilter.add("Blue"); + if (B.getValue().getColor().equals(Color.RED)) colorFilter.add("Blue"); break; case "BGreen": - if(B.getValue().getColor().equals(Color.RED)) colorFilter.add("Green"); + if (B.getValue().getColor().equals(Color.RED)) colorFilter.add("Green"); break; case "BRed": - if(B.getValue().getColor().equals(Color.RED)) colorFilter.add("Red"); + if (B.getValue().getColor().equals(Color.RED)) colorFilter.add("Red"); break; case "BWhite": - if(B.getValue().getColor().equals(Color.RED)) colorFilter.add("White"); + if (B.getValue().getColor().equals(Color.RED)) colorFilter.add("White"); break; } P = StreamSupport.stream(P.spliterator(), false).filter(input -> { @@ -260,43 +305,63 @@ public class SpellSmithScene extends UIScene { if (input == null) return false; final CardEdition cardEdition = FModel.getMagicDb().getEditions().get(edition); - if(cardEdition!=null&&cardEdition.getCardInSet(input.getName()).size()==0) return false; - if(colorFilter.size() > 0) if(input.getRules().getColor() != ColorSet.fromNames(colorFilter)) return false; - if(!rarity.isEmpty()) if (!input.getRarity().toString().equals(rarity)) return false; - if(cost_low > -1) { + if (cardEdition != null && cardEdition.getCardInSet(input.getName()).size() == 0) return false; + if (colorFilter.size() > 0) + if (input.getRules().getColor() != ColorSet.fromNames(colorFilter)) return false; + if (!rarity.isEmpty()) if (!input.getRarity().toString().equals(rarity)) return false; + if (cost_low > -1) { if (!(input.getRules().getManaCost().getCMC() >= cost_low && input.getRules().getManaCost().getCMC() <= cost_high)) return false; } return true; }).collect(Collectors.toList()); //Stream method is very fast, might not be necessary to precache anything. - if(!edition.isEmpty()) totalCost *= 4.0f; //Edition select cost multiplier. This is a huge factor, so it's most expensive. - if(colorFilter.size() > 0) totalCost *= Math.min(colorFilter.size() * 2.5f, 6.0f); //Color filter cost multiplier. - if(!rarity.isEmpty()){ //Rarity cost multiplier. - switch(rarity){ - case "C": totalCost *= 1.5f; break; - case "U": totalCost *= 2.5f; break; - case "R": totalCost *= 4.0f; break; - case "M": totalCost *= 5.5f; break; - default: break; + if (!edition.isEmpty()) + totalCost *= 4.0f; //Edition select cost multiplier. This is a huge factor, so it's most expensive. + if (colorFilter.size() > 0) + totalCost *= Math.min(colorFilter.size() * 2.5f, 6.0f); //Color filter cost multiplier. + if (!rarity.isEmpty()) { //Rarity cost multiplier. + switch (rarity) { + case "C": + totalCost *= 1.5f; + break; + case "U": + totalCost *= 2.5f; + break; + case "R": + totalCost *= 4.0f; + break; + case "M": + totalCost *= 5.5f; + break; + default: + break; } } - if(cost_low > -1) totalCost *= 2.5f; //And CMC cost multiplier. + if (cost_low > -1) totalCost *= 2.5f; //And CMC cost multiplier. + cardPool = StreamSupport.stream(P.spliterator(), false).collect(Collectors.toList()); - pullButton.setText("Pull (" + cardPool.size() + ") " + totalCost + "G"); - currentPrice = (int)totalCost; - pullButton.setDisabled(false); - if(!(cardPool.size() > 0) || Current.player().getGold() < totalCost) - pullButton.setDisabled(true); + poolSize.setText(((cardPool.size() > 0 ? "[LIME]" : "[RED]")) + cardPool.size() + " possible card" + (cardPool.size() != 1 ? "s" : "")); + currentPrice = (int) totalCost; + currentShardPrice = (int) (totalCost * 0.2f); //Intentionally rounding up via the cast to int + pullUsingGold.setText("Pull: " + currentPrice + "[+gold]"); + pullUsingShards.setText("Pull: " + currentShardPrice + "[+shards]"); + pullUsingGold.setDisabled(!(cardPool.size() > 0) || Current.player().getGold() < totalCost); + pullUsingShards.setDisabled(!(cardPool.size() > 0) || Current.player().getShards() < currentShardPrice); } - public void pullCard() { + public void pullCard(boolean usingShards) { PaperCard P = cardPool.get(MyRandom.getRandom().nextInt(cardPool.size())); //Don't use the standard RNG. Reward R = new Reward(P); Current.player().addReward(R); - Current.player().takeGold(currentPrice); - if(Current.player().getGold() < currentPrice) pullButton.setDisabled(true); - if(rewardActor != null) rewardActor.remove(); + if (usingShards) { + Current.player().takeShards(currentShardPrice); + } else { + Current.player().takeGold(currentPrice); + } + if (Current.player().getGold() < currentPrice) pullUsingGold.setDisabled(true); + if (Current.player().getShards() < currentShardPrice) pullUsingShards.setDisabled(true); + if (rewardActor != null) rewardActor.remove(); rewardActor = new RewardActor(R, true); rewardActor.flip(); //Make it flip so it draws visual attention, why not. rewardActor.setBounds(rewardDummy.getX(), rewardDummy.getY(), rewardDummy.getWidth(), rewardDummy.getHeight()); diff --git a/forge-gui-mobile/src/forge/adventure/stage/ConsoleCommandInterpreter.java b/forge-gui-mobile/src/forge/adventure/stage/ConsoleCommandInterpreter.java index 57517f54d76..ed0f81a6260 100644 --- a/forge-gui-mobile/src/forge/adventure/stage/ConsoleCommandInterpreter.java +++ b/forge-gui-mobile/src/forge/adventure/stage/ConsoleCommandInterpreter.java @@ -154,7 +154,7 @@ public static ConsoleCommandInterpreter getInstance() Current.player().giveGold(amount); return "Added "+amount+" gold"; }); - registerCommand(new String[]{"give", "mana"}, s -> { + registerCommand(new String[]{"give", "shards"}, s -> { if(s.length<1) return "Command needs 1 parameter: Amount."; int amount; try { @@ -163,8 +163,8 @@ public static ConsoleCommandInterpreter getInstance() catch (Exception e) { return "Can not convert " + s[0] + " to number"; } - Current.player().addMaxMana(amount); - return "Added " + amount + " max mana"; + Current.player().addShards(amount); + return "Added " + amount + " shards"; }); registerCommand(new String[]{"give", "life"}, s -> { if(s.length<1) return "Command needs 1 parameter: Amount."; @@ -279,26 +279,26 @@ public static ConsoleCommandInterpreter getInstance() return "Player healed to " + Current.player().getLife() + "/" + Current.player().getMaxLife(); }); - registerCommand(new String[]{"getMana", "amount"}, s -> { + registerCommand(new String[]{"getShards", "amount"}, s -> { if(s.length<1) return "Command needs 1 parameter: Amount"; int value; try { value = Integer.parseInt(s[0]); } catch (Exception e) { return "Can not convert " + s[0] + " to integer"; } - Current.player().addMana(value); - return "Player healed to " + Current.player().getLife() + "/" + Current.player().getMaxLife(); - }); - registerCommand(new String[]{"getMana", "percent"}, s -> { - if(s.length<1) return "Command needs 1 parameter: Amount"; - float value = 0; - try { value = Float.parseFloat(s[0]); } - catch (Exception e) { return "Can not convert " + s[0] + " to integer"; } - Current.player().addManaPercent(value); - return "Player healed to " + Current.player().getLife() + "/" + Current.player().getMaxLife(); - }); - registerCommand(new String[]{"getMana", "full"}, s -> { - Current.player().addManaPercent(1.0f); - return "Player healed to " + Current.player().getLife() + "/" + Current.player().getMaxLife(); + Current.player().addShards(value); + return "Player now has " + Current.player().getShards() + " shards"; }); +// registerCommand(new String[]{"getMana", "percent"}, s -> { +// if(s.length<1) return "Command needs 1 parameter: Amount"; +// float value = 0; +// try { value = Float.parseFloat(s[0]); } +// catch (Exception e) { return "Can not convert " + s[0] + " to integer"; } +// Current.player().addManaPercent(value); +// return "Player healed to " + Current.player().getLife() + "/" + Current.player().getMaxLife(); +// }); +// registerCommand(new String[]{"getMana", "full"}, s -> { +// Current.player().addManaPercent(1.0f); +// return "Player healed to " + Current.player().getLife() + "/" + Current.player().getMaxLife(); +// }); registerCommand(new String[]{"debug","map"}, s -> { GameHUD.getInstance().setDebug(true); return "Debug map ON"; @@ -356,7 +356,7 @@ public static ConsoleCommandInterpreter getInstance() if(!MapStage.getInstance().isInMap()) return "Only supported for PoI"; MapStage.getInstance().deleteObject(id); - return "Femoved enemy "+s[0]; + return "Removed enemy "+s[0]; }); } } diff --git a/forge-gui-mobile/src/forge/adventure/stage/GameHUD.java b/forge-gui-mobile/src/forge/adventure/stage/GameHUD.java index 591d147a42b..4384ae2e903 100644 --- a/forge-gui-mobile/src/forge/adventure/stage/GameHUD.java +++ b/forge-gui-mobile/src/forge/adventure/stage/GameHUD.java @@ -45,7 +45,7 @@ public class GameHUD extends Stage { private final Image miniMapPlayer; private final TextraLabel lifePoints; private final TextraLabel money; - private final TextraLabel mana; + private final TextraLabel shards; private final Image miniMap, gamehud, mapborder, avatarborder, blank; private final InputEvent eventTouchDown; private final InputEvent eventTouchUp; @@ -120,12 +120,12 @@ public class GameHUD extends Stage { ui.onButtonPress("deck", () -> openDeck()); ui.onButtonPress("exittoworldmap", () -> exitToWorldMap()); lifePoints = ui.findActor("lifePoints"); - mana = ui.findActor("mana"); + shards = ui.findActor("shards"); money = ui.findActor("money"); - mana.setText("{Scale=80%}0/0"); + shards.setText("{Scale=80%}0/0"); lifePoints.setText("{Scale=80%}20/20"); AdventurePlayer.current().onLifeChange(() -> lifePoints.setText("{Scale=80%}"+AdventurePlayer.current().getLife() + "/" + AdventurePlayer.current().getMaxLife())); - AdventurePlayer.current().onManaChange(() -> mana.setText("{Scale=80%}"+AdventurePlayer.current().getMana() + "/" + AdventurePlayer.current().getMaxMana())); + AdventurePlayer.current().onShardsChange(() -> shards.setText("{Scale=80%}"+AdventurePlayer.current().getShards())); WorldSave.getCurrentSave().getPlayer().onGoldChange(() -> money.setText("{Scale=80%}"+String.valueOf(AdventurePlayer.current().getGold()))); addActor(ui); @@ -219,7 +219,7 @@ public class GameHUD extends Stage { && !(Controls.actorContainsVector(openMapActor, touch)) //not inside openmap button && !(Controls.actorContainsVector(statsActor, touch)) //not inside stats button && !(Controls.actorContainsVector(inventoryActor, touch)) //not inside inventory button - && !(Controls.actorContainsVector(exitToWorldMapActor, touch)) //not inside deck button + && !(Controls.actorContainsVector(exitToWorldMapActor, touch)) //not inside exit button && (Controls.actorContainsVector(ui, touch)) //inside display bounds && pointer < 1) { //not more than 1 pointer touchpad.setBounds(touch.x - TOUCHPAD_SCALE / 2, touch.y - TOUCHPAD_SCALE / 2, TOUCHPAD_SCALE, TOUCHPAD_SCALE); @@ -349,7 +349,7 @@ public class GameHUD extends Stage { setVisibility(miniMapPlayer, visible); setVisibility(gamehud, visible); setVisibility(lifePoints, visible); - setVisibility(mana, visible); + setVisibility(shards, visible); setVisibility(money, visible); setVisibility(blank, visible); setVisibility(exitToWorldMapActor, GameScene.instance().isInDungeonOrCave()); diff --git a/forge-gui-mobile/src/forge/adventure/stage/MapStage.java b/forge-gui-mobile/src/forge/adventure/stage/MapStage.java index a56a3d0c8a6..dd9ff7e8e82 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; /** @@ -380,9 +381,9 @@ public class MapStage extends GameStage { if (difficultyData.spawnRank == 0 && !spawnEasy) return false; return true; } - private void loadObjects(MapLayer layer, String sourceMap) { player.setMoveModifier(2); + Array shopsAlreadyPresent = new Array<>(); for (MapObject obj : layer.getObjects()) { MapProperties prop = obj.getProperties(); String type = prop.get("type", String.class); @@ -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()); @@ -475,6 +478,21 @@ public class MapStage extends GameStage { case "spellsmith": addMapActor(obj, new OnCollide(() -> Forge.switchScene(SpellSmithScene.instance()))); break; + case "shardtrader": + MapActor shardTraderActor = new OnCollide(() -> Forge.switchScene(ShardTraderScene.instance())); + addMapActor(obj, shardTraderActor); + if (prop.containsKey("hasSign") && Boolean.parseBoolean(prop.get("hasSign").toString()) && prop.containsKey("signYOffset") && prop.containsKey("signXOffset")) { + try { + TextureSprite sprite = new TextureSprite(Config.instance().getAtlas(ShardTraderScene.spriteAtlas).createSprite(ShardTraderScene.sprite)); + sprite.setX(shardTraderActor.getX() + Float.parseFloat(prop.get("signXOffset").toString())); + sprite.setY(shardTraderActor.getY() + Float.parseFloat(prop.get("signYOffset").toString())); + addMapActor(sprite); + + } catch (Exception e) { + System.err.print("Can not create Texture for Shard Trader"); + } + } + break; case "arena": addMapActor(obj, new OnCollide(() -> { ArenaData arenaData = JSONStringLoader.parse(ArenaData.class, prop.get("arena").toString(), ""); @@ -496,10 +514,98 @@ public class MapStage extends GameStage { addMapActor(obj, dialog); } break; + case "quest": + DialogActor dialog; + if (prop.containsKey("questtype")){ + TiledMapTileMapObject tiledObj = (TiledMapTileMapObject) obj; + + String questOrigin = prop.containsKey("questtype") ? prop.get("questtype").toString() : ""; + + String placeholderText = "[" + + " {" + + " \"name\":\"Quest Offer\"," + + " \"text\":\"Please, help us!\\n((QUEST DESCRIPTION))\"," + + " \"condition\":[]," + + " \"options\":[" + + " { \"name\":\"No, I'm not ready yet.\nMaybe next snapshot.\" }," + + " ]" + + " }" + + "]"; + + { + dialog = new DialogActor(this, id, placeholderText,tiledObj.getTextureRegion()); + } + dialog.setVisible(false); + addMapActor(obj, dialog); + } + break; + + case "Rotating": + String rotation = ""; + if (prop.containsKey("rotation")) { + rotation = prop.get("rotation").toString(); + } + + Array possibleShops = new Array<>(rotation.split(",")); + + if (possibleShops.size > 0){ + long rotatingRandomSeed = WorldSave.getCurrentSave().getWorld().getRandom().nextLong() + java.time.LocalDate.now().toEpochDay(); + Random rotatingShopRandom = new Random(rotatingRandomSeed); + rotatingShop = possibleShops.get(rotatingShopRandom.nextInt(possibleShops.size)); + changes.setRotatingShopSeed(id, rotatingRandomSeed); + } + + //Intentionally not breaking here. + //Flow continues into "shop" case with above data overriding base logic. + case "shop": - String shopList = prop.get("shopList").toString(); - shopList = shopList.replaceAll("\\s", ""); - Array possibleShops = new Array<>(shopList.split(",")); + + int restockPrice = 0; + String shopList = ""; + + boolean isRotatingShop = !rotatingShop.isEmpty(); + + if (isRotatingShop){ + shopList = rotatingShop; + restockPrice = 7; + } + 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 (prop.containsKey("noRestock") && (boolean)prop.get("noRestock")){ + restockPrice = 0; + } + + possibleShops = new Array<>(shopList.split(",")); + Array filteredPossibleShops = possibleShops; + if (!isRotatingShop) + filteredPossibleShops.removeAll(shopsAlreadyPresent, false); + if (filteredPossibleShops.notEmpty()){ + possibleShops = filteredPossibleShops; + } Array shops; if (possibleShops.size == 0 || shopList.equals("")) shops = WorldData.getShopList(); @@ -507,6 +613,7 @@ public class MapStage extends GameStage { shops = new Array<>(); for (ShopData data : new Array.ArrayIterator<>(WorldData.getShopList())) { if (possibleShops.contains(data.name, false)) { + data.restockPrice = restockPrice; shops.add(data); } } @@ -514,18 +621,27 @@ public class MapStage extends GameStage { if (shops.size == 0) continue; ShopData data = shops.get(WorldSave.getCurrentSave().getWorld().getRandom().nextInt(shops.size)); + shopsAlreadyPresent.add(data.name); Array ret = new Array<>(); + WorldSave.getCurrentSave().getWorld().getRandom().setSeed(changes.getShopSeed(id)); for (RewardData rdata : new Array.ArrayIterator<>(data.rewards)) { ret.addAll(rdata.generate(false)); } - ShopActor actor = new ShopActor(this, id, ret, data.unlimited); + ShopActor actor = new ShopActor(this, id, ret, data); addMapActor(obj, actor); - if (prop.containsKey("signYOffset") && prop.containsKey("signXOffset")) { + if (prop.containsKey("hasSign") && (boolean)prop.get("hasSign") && prop.containsKey("signYOffset") && prop.containsKey("signXOffset")) { try { TextureSprite sprite = new TextureSprite(Config.instance().getAtlas(data.spriteAtlas).createSprite(data.sprite)); sprite.setX(actor.getX() + Float.parseFloat(prop.get("signXOffset").toString())); sprite.setY(actor.getY() + Float.parseFloat(prop.get("signYOffset").toString())); addMapActor(sprite); + + if (!(data.overlaySprite == null | data.overlaySprite.isEmpty())){ + TextureSprite overlay = new TextureSprite(Config.instance().getAtlas(data.spriteAtlas).createSprite(data.overlaySprite)); + overlay.setX(actor.getX() + Float.parseFloat(prop.get("signXOffset").toString())); + overlay.setY(actor.getY() + Float.parseFloat(prop.get("signYOffset").toString())); + addMapActor(overlay); + } } catch (Exception e) { System.err.print("Can not create Texture for " + data.sprite + " Obj:" + data); } diff --git a/forge-gui-mobile/src/forge/adventure/util/CardUtil.java b/forge-gui-mobile/src/forge/adventure/util/CardUtil.java index 50dc8999baf..aa6b462e48a 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; @@ -48,9 +45,11 @@ public class CardUtil { private final List manaCosts =new ArrayList<>(); private final Pattern text; private final boolean matchAllSubTypes; + private final boolean matchAllColors; private int colors; private final ColorType colorType; private final boolean shouldBeEqual; + private final List deckNeeds=new ArrayList<>(); @Override public boolean apply(final PaperCard card) { @@ -63,6 +62,14 @@ public class CardUtil { if(this.text!=null&& !this.text.matcher(card.getRules().getOracleText()).find()) return !this.shouldBeEqual; + if(this.matchAllColors) + { + if(!card.getRules().getColor().hasAllColors(this.colors)) + { + return !this.shouldBeEqual; + } + } + if(this.colors!= MagicColor.ALL_COLORS) { if(!card.getRules().getColor().hasNoColorsExcept(this.colors)||(this.colors != MagicColor.COLORLESS && card.getRules().getColor().isColorless())) @@ -162,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; @@ -169,6 +198,7 @@ public class CardUtil { public CardPredicate(final RewardData type, final boolean wantEqual) { this.matchAllSubTypes=type.matchAllSubTypes; + this.matchAllColors=type.matchAllColors; this.shouldBeEqual = wantEqual; for(int i=0;type.manaCosts!=null&&i getPredicateResult(Iterable cards,final RewardData data) + { + 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)) + result.add(item); + } + return result; + } + public static List generateCards(Iterable cards,final RewardData data, final int count) { - final List result = new ArrayList<>(); - - - for (int i=0;i pool = getPredicateResult(cards, data); + if (pool.size() > 0) { + for (int i = 0; i < count; i++) { + PaperCard candidate = pool.get(WorldSave.getCurrentSave().getWorld().getRandom().nextInt(pool.size())); + if (candidate != null) { + result.add(candidate); } } - if (card != null ) - result.add(card); } - return result; } public static int getCardPrice(PaperCard card) @@ -286,7 +321,7 @@ public class CardUtil { return reward.getItem().cost; if(reward.getType()== Reward.Type.Life) return reward.getCount()*500; - if(reward.getType()== Reward.Type.Mana) + if(reward.getType()== Reward.Type.Shards) return reward.getCount()*500; if(reward.getType()== Reward.Type.Gold) return reward.getCount(); @@ -320,15 +355,13 @@ public class CardUtil { case MagicColor.RED: targetName = "Mountain";break; case MagicColor.GREEN: targetName = "Forest"; break; } - if(jumpStartSheetsCandidates==null) + + jumpStartSheetsCandidates=new ArrayList<>(); + for(PrintSheet sheet : StaticData.instance().getPrintSheets()) { - jumpStartSheetsCandidates=new ArrayList<>(); - for(PrintSheet sheet : StaticData.instance().getPrintSheets()) + if(sheet.containsCardNamed(targetName,3) && sheet.getName().startsWith("JMP") && sheet.all().size() == 20)//dodge the rainbow jumpstart sheet and the sheet for every card { - if(sheet.containsCardNamed(targetName,3) && sheet.getName().startsWith("JMP") && sheet.all().size() == 20)//dodge the rainbow jumpstart sheet and the sheet for every card - { - jumpStartSheetsCandidates.add(sheet); - } + jumpStartSheetsCandidates.add(sheet); } } PrintSheet sheet=jumpStartSheetsCandidates.get(Current.world().getRandom().nextInt(jumpStartSheetsCandidates.size())); diff --git a/forge-gui-mobile/src/forge/adventure/util/Controls.java b/forge-gui-mobile/src/forge/adventure/util/Controls.java index 7c74bf36c80..e318fb1983d 100644 --- a/forge-gui-mobile/src/forge/adventure/util/Controls.java +++ b/forge-gui-mobile/src/forge/adventure/util/Controls.java @@ -4,10 +4,13 @@ import com.badlogic.gdx.files.FileHandle; import com.badlogic.gdx.graphics.Color; import com.badlogic.gdx.graphics.g2d.BitmapFont; import com.badlogic.gdx.graphics.g2d.TextureAtlas; +import com.badlogic.gdx.math.Interpolation; import com.badlogic.gdx.math.Rectangle; import com.badlogic.gdx.math.Vector2; import com.badlogic.gdx.scenes.scene2d.Actor; import com.badlogic.gdx.scenes.scene2d.InputEvent; +import com.badlogic.gdx.scenes.scene2d.actions.Actions; +import com.badlogic.gdx.scenes.scene2d.actions.SequenceAction; import com.badlogic.gdx.scenes.scene2d.ui.*; import com.badlogic.gdx.scenes.scene2d.utils.ChangeListener; import com.badlogic.gdx.scenes.scene2d.utils.ClickListener; @@ -15,11 +18,13 @@ import com.badlogic.gdx.scenes.scene2d.utils.Drawable; import com.badlogic.gdx.utils.Align; import com.badlogic.gdx.utils.Array; import com.badlogic.gdx.utils.Null; +import com.badlogic.gdx.utils.Timer; import com.github.tommyettinger.textra.Font; import com.github.tommyettinger.textra.TextraButton; import com.github.tommyettinger.textra.TextraLabel; import com.github.tommyettinger.textra.TypingLabel; import forge.Forge; +import forge.adventure.player.AdventurePlayer; import forge.card.ColorSet; import java.util.function.Function; @@ -404,4 +409,121 @@ public class Controls { } + + static public class AccountingLabel extends TextraLabel { + private TextraLabel label; + private final TextraLabel placeholder; + private String currencyIcon; + private boolean isShards; + private int currencyAmount; + private float animationDelay = 2f; //seconds to wait before replacing intermediate label + private final String NEGDECOR = "[RED]-"; + private final String POSDECOR = "[GREEN]+"; + private final Timer t = new Timer(); + + public AccountingLabel(TextraLabel target, boolean isShards) { + target.setVisible(false); + placeholder = target; + label = Controls.newTextraLabel(target.getName()+"Replacement"); + currencyAmount = isShards?Current.player().getShards():Current.player().getGold(); + this.isShards = isShards; + + if (isShards){ + currencyAmount = Current.player().getShards(); + currencyIcon = "[+Shards]"; + Current.player().onShardsChange(() -> update(AdventurePlayer.current().getShards(),true)); + } + else { + currencyAmount = Current.player().getGold(); + currencyIcon = "[+Gold]"; + Current.player().onGoldChange(() -> update(AdventurePlayer.current().getGold(),true)); + } + label.setText(getLabelText(currencyAmount)); + setName(label.getName()); + replaceLabel(label); + } + + public void setAnimationDelay(float animationDelay) { + this.animationDelay = animationDelay; + } + public float getAnimationDelay() { + return animationDelay; + } + public void update(int newAmount){ + update(newAmount, false); + } + public void update(int newAmount, boolean animate){ + + if (animate) { + TextraLabel temporaryLabel = getUpdateLabel(newAmount); + currencyAmount = newAmount; + replaceLabel(temporaryLabel); + + t.schedule(new AccountingLabelUpdater(temporaryLabel), animationDelay); + } + else{ + currencyAmount = newAmount; + drawFinalLabel(false); + } + } + + private void drawFinalLabel(boolean fadeIn){ + + TextraLabel finalLabel = getDefaultLabel(); + if (fadeIn) { + SequenceAction sequence = new SequenceAction(); + sequence.addAction(Actions.alpha(0.5f)); + sequence.addAction(Actions.alpha(1f, 2f, Interpolation.pow2Out)); + finalLabel.addAction(sequence); + } + replaceLabel(finalLabel); + } + + private TextraLabel getDefaultLabel(){ + return Controls.newTextraLabel(getLabelText(currencyAmount)); + } + private TextraLabel getUpdateLabel(int newAmount){ + int delta = newAmount - currencyAmount; + String updateText = delta==0?"":(delta<0?NEGDECOR + delta *-1:POSDECOR + delta); + return Controls.newTextraLabel(getLabelText(currencyAmount, updateText)); + } + + private String getLabelText(int amount){ + return getLabelText(amount, ""); + } + private String getLabelText(int amount, String updateText){ + return amount + " " + currencyIcon + updateText; + } + private void replaceLabel(TextraLabel newLabel) { + newLabel.setName(label.getName()); + newLabel.style = placeholder.style; + newLabel.setBounds(placeholder.getX(), placeholder.getY(), label.getWidth(), placeholder.getHeight()); + newLabel.setFont(label.getFont()); + newLabel.style = placeholder.style; + newLabel.layout.setBaseColor(label.layout.getBaseColor()); + newLabel.layout(); + + label.remove(); + label = newLabel; + placeholder.getStage().addActor(label); + } + + private class AccountingLabelUpdater extends Timer.Task{ + @Override + public void run() { + if (label.equals(target)){ + drawFinalLabel(true); + } + } + TextraLabel target; + AccountingLabelUpdater(TextraLabel replacement){ + this.target = replacement; + } + } + } + + public static TextraLabel newAccountingLabel(TextraLabel target, Boolean isShards) { + AccountingLabel label = new AccountingLabel(target, isShards); + return label; + } } diff --git a/forge-gui-mobile/src/forge/adventure/util/Reward.java b/forge-gui-mobile/src/forge/adventure/util/Reward.java index 39fa22782f6..4f471a7d166 100644 --- a/forge-gui-mobile/src/forge/adventure/util/Reward.java +++ b/forge-gui-mobile/src/forge/adventure/util/Reward.java @@ -12,7 +12,7 @@ public class Reward { Gold, Item, Life, - Mana + Shards } Type type; PaperCard card; diff --git a/forge-gui-mobile/src/forge/adventure/util/RewardActor.java b/forge-gui-mobile/src/forge/adventure/util/RewardActor.java index 04bf2b3eec1..dd6a4d9f885 100644 --- a/forge-gui-mobile/src/forge/adventure/util/RewardActor.java +++ b/forge-gui-mobile/src/forge/adventure/util/RewardActor.java @@ -257,7 +257,7 @@ public class RewardActor extends Actor implements Disposable, ImageFetcher.Callb break; } case Life: - case Mana: + case Shards: case Gold: { TextureAtlas atlas = Config.instance().getAtlas(ITEMS_ATLAS); Sprite backSprite = atlas.createSprite("CardBack"); diff --git a/forge-gui-mobile/src/forge/assets/FSkinImage.java b/forge-gui-mobile/src/forge/assets/FSkinImage.java index 9998d6bc8ae..b51c736928f 100644 --- a/forge-gui-mobile/src/forge/assets/FSkinImage.java +++ b/forge-gui-mobile/src/forge/assets/FSkinImage.java @@ -230,6 +230,9 @@ public enum FSkinImage implements FImage { QUEST_BIG_SWORD (FSkinProp.ICO_QUEST_BIG_SWORD, SourceFile.ICONS), QUEST_BIG_BAG (FSkinProp.ICO_QUEST_BIG_BAG, SourceFile.ICONS), + //adventure + MANASHARD (FSkinProp.ICO_MANASHARD, SourceFile.ADVENTURE), + //menu icon MENU_GALAXY (FSkinProp.ICO_MENU_GALAXY, SourceFile.ICONS), MENU_STATS (FSkinProp.ICO_MENU_STATS, SourceFile.ICONS), @@ -484,7 +487,9 @@ public enum FSkinImage implements FImage { WATERMARKS(ForgeConstants.SPRITE_WATERMARK_FILE), DRAFTRANKS(ForgeConstants.SPRITE_DRAFTRANKS_FILE), CRACKS(ForgeConstants.SPRITE_CRACKS_FILE), - PLANAR_CONQUEST(ForgeConstants.SPRITE_PLANAR_CONQUEST_FILE); + PLANAR_CONQUEST(ForgeConstants.SPRITE_PLANAR_CONQUEST_FILE), + ADVENTURE(ForgeConstants.SPRITE_ADVENTURE_FILE); + private final String filename; diff --git a/forge-gui-mobile/src/forge/assets/TextRenderer.java b/forge-gui-mobile/src/forge/assets/TextRenderer.java index d25b7b2fbd0..eb9cb9c57b4 100644 --- a/forge-gui-mobile/src/forge/assets/TextRenderer.java +++ b/forge-gui-mobile/src/forge/assets/TextRenderer.java @@ -76,6 +76,7 @@ public class TextRenderer { Forge.getAssets().symbolLookup().put("AE", FSkinImage.AETHER_SHARD); Forge.getAssets().symbolLookup().put("PW", FSkinImage.PW_BADGE_COMMON); Forge.getAssets().symbolLookup().put("CR", FSkinImage.QUEST_COINSTACK); + Forge.getAssets().symbolLookup().put("M", FSkinImage.MANASHARD); } public static String startColor(Color color) { diff --git a/forge-gui-mobile/src/forge/screens/match/views/VPlayerPanel.java b/forge-gui-mobile/src/forge/screens/match/views/VPlayerPanel.java index ea04c9746f3..b07a87251c6 100644 --- a/forge-gui-mobile/src/forge/screens/match/views/VPlayerPanel.java +++ b/forge-gui-mobile/src/forge/screens/match/views/VPlayerPanel.java @@ -468,6 +468,7 @@ public class VPlayerPanel extends FContainer { private int energyCounters = player.getCounters(CounterEnumType.ENERGY); private int experienceCounters = player.getCounters(CounterEnumType.EXPERIENCE); private int ticketCounters = player.getCounters(CounterEnumType.TICKET); + private int manaShards = player.getCounters(CounterEnumType.MANASHARDS); private String lifeStr = String.valueOf(life); private LifeLabel() { @@ -496,6 +497,7 @@ public class VPlayerPanel extends FContainer { energyCounters = player.getCounters(CounterEnumType.ENERGY); experienceCounters = player.getCounters(CounterEnumType.EXPERIENCE); + manaShards = player.getCounters(CounterEnumType.MANASHARDS); //when gui player loses life, vibrate device for a length of time based on amount of life lost if (vibrateDuration > 0 && MatchController.instance.isLocalPlayer(player) && @@ -516,7 +518,7 @@ public class VPlayerPanel extends FContainer { adjustHeight = 1; float divider = Gdx.app.getGraphics().getHeight() > 900 ? 1.2f : 2f; if(Forge.altPlayerLayout && !Forge.altZoneTabs && Forge.isLandscapeMode()) { - if (poisonCounters == 0 && energyCounters == 0 && experienceCounters == 0 && ticketCounters ==0) { + if (poisonCounters == 0 && energyCounters == 0 && experienceCounters == 0 && ticketCounters ==0 && manaShards == 0) { g.fillRect(Color.DARK_GRAY, 0, 0, INFO2_FONT.getBounds(lifeStr).width+1, INFO2_FONT.getBounds(lifeStr).height+1); g.drawText(lifeStr, INFO2_FONT, getInfoForeColor().getColor(), 0, 0, getWidth(), getHeight(), false, Align.left, false); } else { @@ -551,10 +553,16 @@ public class VPlayerPanel extends FContainer { g.drawText(String.valueOf(ticketCounters), INFO_FONT, getInfoForeColor().getColor(), textStart, (halfHeight*mod)+2, textWidth, halfHeight, false, Align.left, false); mod+=1; } + if (manaShards > 0) { + g.fillRect(Color.DARK_GRAY, 0, (halfHeight*mod)+2, INFO_FONT.getBounds(String.valueOf(manaShards)).width+halfHeight+1, INFO_FONT.getBounds(String.valueOf(manaShards)).height+1); + g.drawImage(FSkinImage.AETHER_SHARD, 0, (halfHeight*mod)+2, halfHeight, halfHeight); + g.drawText(String.valueOf(manaShards), INFO_FONT, getInfoForeColor().getColor(), textStart, (halfHeight*mod)+2, textWidth, halfHeight, false, Align.left, false); + mod+=1; + } adjustHeight = (mod > 2) && (avatar.getHeight() < halfHeight*mod)? mod : 1; } } else { - if (poisonCounters == 0 && energyCounters == 0) { + if (poisonCounters == 0 && energyCounters == 0 && manaShards == 0) { g.drawText(lifeStr, Forge.altZoneTabs ? LIFE_FONT_ALT : LIFE_FONT, getInfoForeColor(), 0, 0, getWidth(), getHeight(), false, Align.center, true); } else { float halfHeight = getHeight() / 2; @@ -565,10 +573,14 @@ public class VPlayerPanel extends FContainer { if (poisonCounters > 0) { //prioritize showing poison counters over energy counters g.drawImage(FSkinImage.POISON, 0, halfHeight, halfHeight, halfHeight); g.drawText(String.valueOf(poisonCounters), INFO_FONT, getInfoForeColor(), textStart, halfHeight, textWidth, halfHeight, false, Align.center, true); - } else { + } else if (energyCounters > 0) { //prioritize showing energy counters over mana shards g.drawImage(FSkinImage.ENERGY, 0, halfHeight, halfHeight, halfHeight); g.drawText(String.valueOf(energyCounters), INFO_FONT, getInfoForeColor(), textStart, halfHeight, textWidth, halfHeight, false, Align.center, true); } + else { + g.drawImage(FSkinImage.MANASHARD, 0, halfHeight, halfHeight, halfHeight); + g.drawText(String.valueOf(manaShards), INFO_FONT, getInfoForeColor(), textStart, halfHeight, textWidth, halfHeight, false, Align.center, true); + } } } } diff --git a/forge-gui/res/adventure/Shandalar/config.json b/forge-gui/res/adventure/Shandalar/config.json index c449a1e1de8..8055ffa07a2 100644 --- a/forge-gui/res/adventure/Shandalar/config.json +++ b/forge-gui/res/adventure/Shandalar/config.json @@ -58,14 +58,15 @@ { "name": "Easy", "startingLife": 16, - "startingMana": 32, + "startingShards": 5, "staringMoney": 500, "enemyLifeFactor": 0.8, "spawnRank": 0, "goldLoss": 0.02, "lifeLoss": 0.1, "rewardMaxFactor" : 1.5, - "sellFactor": 0.6, + "sellFactor": 0.6, + "shardSellRatio": 0.95, "starterDecks": { "W":"decks/starter/white_e.json", "B":"decks/starter/black_e.json", @@ -94,7 +95,7 @@ },{ "name": "Normal", "startingLife": 12, - "startingMana": 25, + "startingShards": 2, "staringMoney": 250, "startingDifficulty": true, "enemyLifeFactor": 1.0, @@ -103,6 +104,7 @@ "goldLoss": 0.1, "lifeLoss": 0.2, "sellFactor": 0.5, + "shardSellRatio": 0.8, "starterDecks": { "W":"decks/starter/white_n.json", "B":"decks/starter/black_n.json", @@ -130,14 +132,15 @@ },{ "name": "Hard", "startingLife": 8, - "startingMana": 10, + "startingShards": 0, "staringMoney": 125, "enemyLifeFactor": 1.5, "rewardMaxFactor" : 0.5, "spawnRank": 2, "goldLoss": 0.3, "lifeLoss": 0.3, - "sellFactor": 0.25, + "sellFactor": 0.25, + "shardSellRatio": 0.6, "starterDecks": { "W":"decks/starter/white_h.json", "B":"decks/starter/black_h.json", @@ -162,7 +165,7 @@ },{ "name": "Insane", "startingLife": 7, - "startingMana": 10, + "startingShards": 0, "staringMoney": 0, "enemyLifeFactor": 2.5, "rewardMaxFactor" : 0.0, @@ -170,6 +173,7 @@ "goldLoss": 0.5, "lifeLoss": 0.3, "sellFactor": 0.05, + "shardSellRatio": 0.3, "starterDecks": { "W":"decks/starter/white_h.json", "B":"decks/starter/black_h.json", 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/Piper's Charm.png b/forge-gui/res/adventure/Shandalar/custom_card_pics/Piper's Charm.png new file mode 100644 index 00000000000..3e4030d49b5 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/custom_card_pics/Piper's Charm.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/pipers_charm.txt b/forge-gui/res/adventure/Shandalar/custom_cards/pipers_charm.txt new file mode 100644 index 00000000000..3cc5ab5c7fb --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/custom_cards/pipers_charm.txt @@ -0,0 +1,7 @@ +Name:Piper's Charm +ManaCost:no cost +Types:Artifact +S:Mode$ Continuous | Description$ Provided by Piper's Charm (Equipped Item - Neck) +A:AB$ Effect | Cost$ PayShards<3> Sac<1/CARDNAME> | ValidTgts$ Creature | ExileOnMoved$ Battlefield | StaticAbilities$ MustBlock | RememberObjects$ Targeted | StackDescription$ {c:Targeted} blocks this turn if able. | SpellDescription$ Target creature blocks this turn if able. +SVar:MustBlock:Mode$ MustBlock | ValidCreature$ Card.IsRemembered | Description$ This creature blocks this turn if able. +Oracle: Provided by Piper's Charm. Pay {M}{M}{M}, sacrifice Piper's Charm: Target creature blocks this turn if able. \ No newline at end of file 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 new file mode 100644 index 00000000000..94151873838 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/maps/map/forest_town_generic.tmx @@ -0,0 +1,111 @@ + + + + + + + + + + eJztldEOgzAIRZuo0/GhOv1RO/Wj5CZrwpKu0K3dkw/nScMFLtDx7tz4JRMzKzTk3DHYY278767Qka4LloxaHoZ4FlbOb6D3elqqqys1oYd+B29+8c7S3014Aq+DN6i5jXhv9U6bKS2OnLsSmqXzu7CD+fbMk+kpDr6V1gw7hR2tuUeyRnk7/qEbu5G3xL2qqZsCOflXj2K9s/qf+x5Jgr4XXuX0o/lwE2u9vamen7FF4yE= + + + + + eJy1lVkKwjAQhqctdMF76IO4HEA8j3oC8RBuB1ChJ+mDSMELeBsb7NA4TmbSYgOhaZb58s/fJgDusggBrsF/6jJ0cwrSfglz2xYTqxDGbY27iJ8zTmTGg+nbRrJmH42lwu0Sm47Z2rDdJzcf/DJKB1fLexvuKgU4xADr+ontScXYpN9rcB8aX/JY87cU8q7lf0Ti3wXuqdJ2tvTZsTEnz6R5nypsly7aP8sA5hnP5fq0nNP4Q9K/jxtf7Yp+G5+p7/Y4/QawuDz2PaOo7jb/Fsfw5VIvfbzlGDTPPoVq1Nh4PnMM7RyVuMhG348xv47jFjXb5w7r47yU9mHqLfhwLx3uYnPPvQGEo2CM + + + + + + + + eJzT5mFg0AFieoE2bgh9EmjnKR7scqQCXW3K3EQICAPNF8Fix2Iy3EuuH2kFPiH5y1iHgcFEhzxz9GgQB5S4h572Z5FiJpZwGmh/UgtYazEw2GhRZsZgCQsjLPFESjwPBXAT6MdbePItrfz7FWjnNxqX2aSCHCDOReLTK665GBkYuBkx7aS1/QB3HhO+ + + + + + eJxjYBj8IAtKf9ViYPimhRA/CMSHoOxsIM5Bw7lUsl9Qm4FBSBvhDmSwnJGBYQUQ8wAxFxRzM5JuxzVtBFtch4FBQgdTzSFMIQZOCu3FB47jcQ/M3yC8ksr2ogNc4UFPe46SaeYxKK2FVxV1gTzQMgUKLUQOiywG7GmfGKDHSZk7BgKQ69eBsBuWvshx801gmXNLG1VsIP1ODsDm3hN0dwXxYLCELwD5Hxp7 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 new file mode 100644 index 00000000000..a8957c9e992 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/maps/map/forest_town_identity.tmx @@ -0,0 +1,108 @@ + + + + + + + + + + eJztldEOgzAIRZuo0/GhOv1RO/Wj5CZrwpKu0K3dkw/nScMFLtDx7tz4JRMzKzTk3DHYY278767Qka4LloxaHoZ4FlbOb6D3elqqqys1oYd+B29+8c7S3014Aq+DN6i5jXhv9U6bKS2OnLsSmqXzu7CD+fbMk+kpDr6V1gw7hR2tuUeyRnk7/qEbu5G3xL2qqZsCOflXj2K9s/qf+x5Jgr4XXuX0o/lwE2u9vamen7FF4yE= + + + + + eJy1lVkKwjAQhqctdMF76IO4HEA8j3oC8RBuB1ChJ+mDSMELeBsb7NA4TmbSYgOhaZb58s/fJgDusggBrsF/6jJ0cwrSfglz2xYTqxDGbY27iJ8zTmTGg+nbRrJmH42lwu0Sm47Z2rDdJzcf/DJKB1fLexvuKgU4xADr+ontScXYpN9rcB8aX/JY87cU8q7lf0Ti3wXuqdJ2tvTZsTEnz6R5nypsly7aP8sA5hnP5fq0nNP4Q9K/jxtf7Yp+G5+p7/Y4/QawuDz2PaOo7jb/Fsfw5VIvfbzlGDTPPoVq1Nh4PnMM7RyVuMhG348xv47jFjXb5w7r47yU9mHqLfhwLx3uYnPPvQGEo2CM + + + + + + + + eJzT5mFg0AFieoE2bgh9EmjnKR7scoMNCGszMIhoY4ovJsO9g82Pn5D8ZazDwGCiM3BuQQcD7R5i7c8ixUws6Wig/UktYK3FwGCjRZkZgzksSIlneoMsJEwsuAlMi7ewpEdkM4mxl1i1MPAVaOc3PPYSC15oUG4GDOQAcS4Sn15xzcXIwMDNiGknre0HAGN/FdI= + + + + + eJxjYBj8IAtKf9ViYPimhRA/CMSHoOxsIM5Bw7lUsl9Qm4FBSBvhDmSwnJGBYQUQ8wAxFxRzM5JuxzVtBFtch4FBQgdTzSFMIQZOCu3FB47jcQ/M3yC8ksr2ogNc4UFPe46SaeYxKK2FVxV1gTzQMgUKLUQOiywG7GmfGKDHSZk7BgKQ69eBsPsYYSU4wU1gmXNLG1WMHL+f0aDAETQAJwbaAXjAQKYtZAAAL4Yamw== + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 new file mode 100644 index 00000000000..d79c673ba0b --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/maps/map/forest_town_tribal.tmx @@ -0,0 +1,111 @@ + + + + + + + + + + eJztldEOgzAIRZuo0/GhOv1RO/Wj5CZrwpKu0K3dkw/nScMFLtDx7tz4JRMzKzTk3DHYY278767Qka4LloxaHoZ4FlbOb6D3elqqqys1oYd+B29+8c7S3014Aq+DN6i5jXhv9U6bKS2OnLsSmqXzu7CD+fbMk+kpDr6V1gw7hR2tuUeyRnk7/qEbu5G3xL2qqZsCOflXj2K9s/qf+x5Jgr4XXuX0o/lwE2u9vamen7FF4yE= + + + + + eJy1lVkKwjAQhqctdMF76IO4HEA8j3oC8RBuB1ChJ+mDSMELeBsb7NA4TmbSYgOhaZb58s/fJgDusggBrsF/6jJ0cwrSfglz2xYTqxDGbY27iJ8zTmTGg+nbRrJmH42lwu0Sm47Z2rDdJzcf/DJKB1fLexvuKgU4xADr+ontScXYpN9rcB8aX/JY87cU8q7lf0Ti3wXuqdJ2tvTZsTEnz6R5nypsly7aP8sA5hnP5fq0nNP4Q9K/jxtf7Yp+G5+p7/Y4/QawuDz2PaOo7jb/Fsfw5VIvfbzlGDTPPoVqpGzqMZ7PHEM7RyUustH3Y8yv47hFzfa5w/o4L6V9mHoLPtxLh7vY3HNv0GRgvg== + + + + + + + + eJzT5mFg0AFieoE2bgh9EmjnKR7scsiAkZn2biIEhLUZGES0oRwk9yzG4l5CAJsfBxJ80kawjXUYGEx0yDPnHxN13IMMKHEPPe3PIsFMbOE00P6kFrDWYmCw0aLMjEETFljKHVLimVLARIdy7yYw79/Sxi1PK/9+Bdr5DY+9AwFygDgXiU/LuP6PVAZwMTIwcDNi2knrtAYAUVAVYg== + + + + + eJxjYBj8IAtKf9ViYPimhRA/CMSHoOxsIM5Bw7lUsl9Qm4FBSBvhDmSwnJGBYQUQ8wAxFxRzM5JuxzVtBFtch4FBQgdTzSFMIQZOCu3FB47jcQ/M3yC8ksr2ogNc4UFPe46SaeYxKA1KttjSDy2APNAyBS3C6vAB5LDIYiDf7XqclLljIAC94okadsPSFyn6YGpvAsucW9rY5YYKwObeE3R3BfFgsIQvALDsG08= + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 new file mode 100644 index 00000000000..accd42e41bc --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/maps/map/island_town_generic.tmx @@ -0,0 +1,111 @@ + + + + + + + + + + eJzbwM7AsIHG2JiVgeEKEHdyIjBI3IiVtvZeR7MTZu8FEuwFub2EDROb4DHjIlDODIt/SbELPbxg+DIB94DstkDCxNhXyobdLmIwyD34woKYtEAuvkqCvdjSArm4mED808KvpIQ3Nf1KSngPlL3Y8hu90hcsv1HLflOgOWtIKOMo9TvIPiF2TDsJlXHE+N0UrSxCxrj8CMtfpNgPwpZIbiClXIDlU1LjHVv4k6IPW9lAqrs3spOmD9lOAPPDPGo= + + + + + eJxjYBgFQwHosw+MvWeB9pby0s78SWwMDJOx4AtI/tXHwSYHlBHwy1l2wmxagHPsCL/nciDYeRwQeULuJhfQyl/Y0ow+jvCEiaPTlAJYmF4gEKfoNKX2Z0PjLAcpHs9jiV90GhbX1AS0TrfIoIQXQdPTXmQwai9xAADlPiO/ + + + + + + + + eJxjYKAfKORgYCgC4mIOOloKBPycDAwCQCzISV97KQWdWgwMXVoQtrEOA4OJDu3s2qjOwLBJHcJeCrRzGRDrDZLwQvY7NcMhl4s8uZEI9LXJ02cNTEc2BNIwTBydphUgFLfLuBkYDMn0L0z/YAUmUH8ZUOC/4QiusDMwXGWnv70DUR+CAAAD6BOP + + + + + eJxjYBgFpABxHQYGCR3amT9VnYFhmjqE3anFwNClRTu7SAXIfqd1OIwC6gJ5YDpSgKYlXHEHE0enR8EoGAXDCwAAl/AHJQ== + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 new file mode 100644 index 00000000000..e8a8eaeec1f --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/maps/map/island_town_identity.tmx @@ -0,0 +1,110 @@ + + + + + + + + + + eJzbwM7AsIHG2JiVgeEKEHdyIjBI3IiVtvZeR7MTZu8FEuwFub2EDROb4DHjIlDODIt/SbELPbxg+DIB94DstkDCxNhXyobdLmIwyD34woKYtEAuvkqCvdjSArm4mED808KvpIQ3Nf1KSngPlL3Y8hu90hcsv1HLflOgOWtIKOMo9TvIPiF2TDsJlXHE+N0UrSxCxrj8CMtfpNgPwpZIbiClXIDlU1LjHVv4k6IPW9lAqrs3spOmD9lOAPPDPGo= + + + + + eJxjYBgFQwHosw+MvWeB9pby0s78SWwMDJOx4AtI/tXHwSYHlBHwy1l2wmxagHPsCL/nciDYeRwQeULuJhfQyl/Y0ow+jvCEiaPTlAJYmF4gEKfoNKX2Z0PjLAcpHs9jiV90GhbX1AS0TrfIoIQXQdPTXmQwai9xAADlPiO/ + + + + + + + + eJxjYKAfKORgYCgC4mIOOloKBPycDAwCQCzISV97KQWdWgwMXVoQtrEOA4OJDu3s2qjOwLBJHcJeCrRzGRDrDZLwQvY7NcMhl4s8uZEInmiQp88amI5s0NLwWTSzYOLoNLXBS6i9hOJ2GTdl9lCqfxTQH1xhZ2C4yk5/eweiPgQBAMi+FTE= + + + + + eJxjYBgFpABxHQYGCR3amT9VnYFhmjqE3anFwNClRTu7SAXIfqd1OIwC7OCEBnn65IHpSAGalnDFHUwcnR4Fo2AUDC8AAJuECBU= + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 new file mode 100644 index 00000000000..447840cd6a9 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/maps/map/island_town_tribal.tmx @@ -0,0 +1,111 @@ + + + + + + + + + + eJzbwM7AsIHG2JiVgeEKEHdyIjBI3IiVtvZeR7MTZu8FEuwFub2EDROb4DHjIlDODIt/SbELPbxg+DIB94DstkDCxNhXyobdLmIwyD34woKYtEAuvkqCvdjSArm4mED808KvpIQ3Nf1KSngPlL3Y8hu90hcsv1HLflOgOWtIKOMo9TvIPiF2TDsJlXHE+N0UrSxCxrj8CMtfpNgPwpZIbiClXIDlU1LjHVv4k6IPW9lAqrs3spOmD9lOAPPDPGo= + + + + + eJxjYBgFQwHosw+MvWeB9pby0s78SWwMDJOx4AtI/tXHwSYHlBHwy1l2wmxagHPsCL/nciDYeRwQeULuJhfQyl/Y0ow+jvCEiaPTlAJYmF4gEKfoNKX2Z0PjLAcpHs9jiV90GhbX1AS0TrfIoIQXQdPTXmQwai9xAADlPiO/ + + + + + + + + eJxjYKAfKORgYCgC4mIO+tn5n4mBgZ+TgUEAiAU56WcvzG5SwVR1BoZp6hB2pxYDQ5cWhG2sw8BgokM9t6GDjUA7N0HtXQq0cxkQ69E5vHABZL9TMxxyuciTG0qAkRm33D8y0iepwBqYjmxwpGGY/TBxdJpWgFDcLuOmzHxK9Y8C+oMr7AwMV4GYAU9+oQWgd30IAwDoJheh + + + + + eJxjYBgFpABxHQYGCR362NWpxcDQpUUfu4gByH6nZziMAsqBPDAdKUDTEq64g4mj06NgFIyC4QUAK4MFrA== + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 0aa96f20fa7..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,10 +1,10 @@ - + - + eJztzjENADAIADDeBWOzgn8DM0FgR4/+rRNRAAAAAACMubl/8PP7VdfvAWT0x+U= @@ -17,7 +17,7 @@ - eJzNmF1OwkAQx/cdDETUBCIPWlrQRi+lR/DrAgo8GRMRjiGGCyCgRoJnchu7YRhnvwv0n0zS7m63v87uzG43KjIWc4u4NbnlQWHKE6cWcJtym+WEb8I5GiljwvbN7arE2HVO7Ka0ZBRjultmrJIT2ysv/ThDfAfchluyfcQHtUvUNSXzo11grAOsW1itfyjQz+lEMVB1uv4naTxNJXG1CT7xjt6hus+A4Hnk909p2Qt6/qLO2GV9taxlyceId6qEv2fO/blwyFU2fMkYQsYB8APlA/w9kBnqFFwL34p2NnxZCPI1DNqvg4/yJcVHCc9tGz48r11FMX5J2m5ifBdVxn6qbs/68o3dXqsUnB8ufIOMxtlEPv5rS9YyX8F57sMXgj1syMcjksSs0FmNsfOaHastH4z/SUZ7WFVu942PtmLPcsRj9tgxbk0YZHUwVwkfJvvacTH7uWjLR+XW++LfXIzX8D/lM754Lup82ORzrCWJob4kZ2W5fkBG37wjYsaVL9QwZjXWNnyyfUnAyxqgHPsR+lK2D5D17TO+qv0MjGuZL03WblO+D00/MlZd3HyC6y6xtkCGmQF7D+2/sU6IMtvc05esv2ItUPFR0v3P4XWQav9skF/Ed5ryBTtypkiNrOWS8UUE353jeU4i3zOm25Kez+c8J6szJmp8X8t2ZzkjcP1W/t/HyLK/IeoP+89VlZr63lUUH84521RW/rOROK+D696UaJfkvndHPpNcMrfvdmVvLtjiDfsPn2t2CCZsm5TIGRRHBHwG738BVormxQ== + 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== @@ -30,20 +30,25 @@ - eJzt1DkKgDAQBdDfuAupp8h59FTqlfRytk4vBsHAyOQ/SJFUswYgInpnisAcraOwxRrkw1rmtQtwiHUU+XA+/qfTfvROe2I1b5XubO1obylt0BkbneyQxz/6KadG39qPuXqsFxGVaQnAqmcL1pHcnZK+E1G5Ls9cDMw= + eJzt1EsKgCAUBdC7g4Y1q1lirrHf5lpB/xaT0DCKIOuF3QOCjny+jwAR0TWhASIjHYUs5sAd5tKtSgG1ko7CHfbH94wZMGXSUTxDqt/aFOjS9++l98QaSPS2n+38LJ7MkI9/9NGbeluz4WbdfMwXEf1THgCFXWUgHcleo87PRPRfKyQjEbs= - + + + + + - + + @@ -56,49 +61,81 @@ - + + + - + + + - + + + + + - + - + + + + + - + + + + + - + + + + + - + + + + + - + + + + + - + + + + + @@ -163,5 +200,47 @@ } + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 7bb87209529..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,23 +1,28 @@ - + - + - eJztmEEOgjAQRbsAzmOiHse7cAQlKd5TTcSdbaRJGafDVFo6Jiz+poTw+n+npdPXSt0rpQ7NVA8z1tcydDU6VVPpAhy+T74/Uvh8Dh0Yj+Fz870h6+OXdRLiuxi9xvGn0WDUzfhvdWy+5wW1b6ZzoHgtxxD4vmPHfHNcHB4ub2z9OXbIbdlScGGcKWopB9tSL3N5RnFyGddmi2EsxcZlxPbBtRXad0t7R3kohS3EKCFXKmfJfNKyhRlL9M73cOPb+Epp18jmk+6fBncPSbL3oO4Pzo9/4JOWsZ+tNEaMTVLOVN+itIeUd6UZOWylGOfYXK/A/+d3/Y6cnFQvCqsLrN+Qy0vKM+gXrFt4f0rp5ehZS/Xv3H1D1zif/wyuy/OHtbXi8LoMx/fILCGHDvjDraW57GNqEvKFzhDOeuXu6bE97FB/d4lS8mH93TfVKOm8 + eJzNmEtOwzAQhrPIoxdhyUMFjsMJYAE36BGgbdpTcRmgtGwqMkp+MRnG9jhxCpVGVVPF/vzPwx5viix7z7PspuzbR/NsU/wP2zZ2l/et/gMOrhPX57/wcY7a8TyGD+t9U+JjSJy4+F4a++qe7xs7NLYM6E92W/5el7Trsr8GHy9xHBzzg92lG7FZeKy8sfkH9qVgwjhP1Xg2yTk2l9bN96po13tRtvyfiRmHaKn5kjhpHC2XUnBaGX1xVjty/VSMoRw4Vq1NwWdhDGkzNR/iaEz9IL6zBHXGZ7LGWdl2eVt/qBalzGNtjtD+q713zupBakbfvmXh47mbutbsHFwxviWmddHnjdGQGJ67PQo5Rt+Hzi/cn8RE+/UYDa7KuNiAPo9Vn49+0zrx/7z80WFovaX5Hqow307EFM4/nA9nGxlrWNMQvprNt/a8X7MzxmvDMZu54wH7PMaL8Y/Ug7QLsfGYJc77qn3POp/MQZo7FOs181GITc4F/11G1HbScOuJRfrgPIs4GppPqyLeX5xJqxf0OVb9c32Mbq64tdYkMPEc4z0AzgNjmDQ+i4b73F2zkZupzyqIX8t6fX3QWD9qhnpmHVfjs65tiMWcHV2+nersHsPni7sp+eAv5J4rh333FvweIbVh/4JRvyoZQzk7NaPUifvLwnZKRtITGlpqnezjUaen5MT+MDf2ldp9w1Racs34+VTTS+at7JNTatn1QQvf/R36Dd9+qOU5cXY9xILMwou+DL2HL84kR+3Qx5pLId/H5KTk097V7gBjxrT4wDpWqvvvlHza/e435SQojA== - eJzlWM1KA0EMHrGt0CL9wZM3xbvtU/gW4n0VFYpP4U1fwKpFqeIriHf1afTsDDY0DclusrvjKH4QxJ1k803+ZjvO/S1s953b6admIWN/4NzBIJ3/rV8cm/+Ajc00tlVwlcZtJXCcGxH9wbunwrr0PAV2PdmhUUYxg0d4tVvO3Xs5bOrkzut2WvXw5HqM43XU1L8zU/K09ndZXlItanlquWl4TYmNxh/lWYbja+ObmyWPwebd4Cubc7TYTAy+Pvz6J9KhNnSdg3VPGjuYvRd+/5fN5TrFdQXrAVIaqB8NVag97b6Cjzciki19HGytNSjV3oRXL+SXdz5banAN+dPoQ33hfsT9rqk/iz+rPq4vzg6v09jjmFI7KU9YH9dEq5gq60eLmHMJz2TsR5rVtBY1vcide9q+wnrAT9v/+IwK9YrPoqKzOMs5f2DejRrLsQZ+uP+xLrc36xkVADmQ8gzzBGYxzGX6d0jiQ/dombESuDzjeULnHhbp24LmtQpwnuk3cbuAH2cjxfTay00Fjtw3cR43Lo5YgFus336ZkmMdObQC5kBeHZb5HRALNJZSzOAcOk9wjwAcU+RTQui3W/R/2fP3p5DHb7xe7d1wL7jXzdc79usnjJx2F/zydLQ4Y/YTuBXdX856zj0QefLy2Fvwm82fUb2gU4SY98s4v9pvRopnz+0lEr+shnkX8/57pePcaqfed34BjJbWzg== + eJzVWEtOwzAQ9SI1iAr1cwMQC1ilnIJLIMS+IEBC3If+1KogroDYp1yCg2CLDJ1OZmwnTlN40ogm2Jnn+ctK/S8c95Q66e2ahYyrvlLX/d3pPxJs89wsDRF7uyawZXydbj5rbc6si+vSRKnzxL23CWSGw2cS/r5plOHXJF3wK/CYqU2fNmk/To3V3zb8DvTP30Ei/x4wsVgnaKynuf6FkZuWX+aIK5dLZcDlGPWVfV6V8N+Q4cnZs0x+a+QbayvMBfTdtvi9M/J8ecbzjLEl2Ah8GMKFq3mub8fkT5Zzk3hJezidUyPLmviNBF1jI5OK/Ch88RECly46S6RJsaZQP0dQKSBlcsIF8BeW2No89+jjYm/EL/fyG8dR/QXMXmV700Sv6wbk+9RROyAepFx32a4Kv5B9I7IuJgagt8IZQ8to6Lkov9C6CRii3umrAdLM4tJp48HGgo0Brf25SPuelAccwNZ41grRmaEzLXKuuBfFzNrYNmCLNuKEdWqhHmb5OWBdnaBxBhxXwkzIcchIjcVnDq1HUAfo3Ib5vaB3uP7h2ZBySxneVWoGtQuet/B8BPGGuWHfDpBe2M99s0q9mWh5Jl4lm/pAsG+BL8A1Z8fMCxzvuS72NSq+Ga2u3ocBdQD3NY6Xr8/Vgf2ANdSWUs2AVzDvN4khmg/qjKMY2Hl6ip7/yp2GBBe/x0P/fleowr3gRcf9jTvz/3tGHjprfq41oXhizmO5SfeXgGXX9Awib0Zeu2t+y/wdXWfX+FD2frlMfcL+rVpW3g23jy3df9eRH9u6/4YeHHtvQfENf1fcDQ== + + + + + eJzt1kkOgkAUhOG3cXYPW2fDbXC6FU4XxekAFkmTEMWYELVLUl/yNqz+hOY1ZiJSV53IrBv5rnhtgrYpcZ98xiowW7vZBL5rnl3QdHVzI+zbh2YHN8fQd40wi3F+F5gl4TnOpOg6Yc7qq6Ssj+meT7CftphdYU/pnv+9mHgHZFLCb6yBM9p055Sxb4C2IXFfUfKwA+os/7etqoV32v7ifsz/Hd/poaFf0jHCszHB/p6hYU7QISIi/+0OQfQkaQ== - eJzt1kEKgzAQheE5RDfq4W3PYXsKtbHozrbncBYBlWajjImU/4PZiCSPiUkUAQD8k7YQeRZ27wFLe76bTy7yzY+fB/GVmcjV1y1LneZXpZnuvh4nzOc0U+frdcJ8mMU+k46cr9Zxm8DYTp91nLtBvfZl2NCbUe+898Z7D/FY7y/+WdK6sNdW6Ed6lmvAegI2JkGoI2Y= + eJztlU0OQDAUhN9xcAXuhHPgFH5K2Pk5kYN4i25EF0SbtsyXvIUumjHTdogAAKZoI6Iuur8O/ECVX8zfCbI2zh/8/OI/riHRFtpW4Re+9EcaEGVy8sC2misFayrlVIb0vclEsKZezuCgf8AeJu96zfs2ir0Fr/UOvS8uMbIv0wNvZu68xfPee3MGXesq8G129OcJ+GEfnRkgTwD0cABSpCk/ @@ -30,55 +35,88 @@ - eJzt1jsOgzAMBmDfgBm4K/Qm0FPwFmy0PVFHPEQC0S60DjbR/0leUIitBCcQAVzHO9Z5F2CrSYnaVG5cKDR7LKT+/uW7eSZEr8R/HoC9gnuvdHE32Icd19S7GAzWB6uzzySf+Sqet/4yd8fPeqGcFu+9f2oaeV2mA2sz8533OHjvwXmk+wv/LLosnjeasB76JPcA+/kpi4hyF7dIuxoAGQufWSj0 + eJxjYBgFo2DogBMaqPxOLQaGLi1MddjE0fWOgsELsMWfPJCvQGRcjwLyASXhOZB5jBS7h2OamanJwDBLc6BdMbQAKfXHKMAN8oF5rwCKC2lUBlASJ91AN/VAce9oO2AUIAFa5vV2oLkdWMzuBor1UMnOwdiupcRN/cBwmUBC2EwH1nkzhni9R0kaHK2rRgE9wWAsbwYSjIbHwANqxsFofGKCOn4GhnoobuAfaNeMglFAHQAAkqgpdw== - + - + + + + + - + - + + + + + - + - + + + + + - + - + + + + + - + - + + + + + - + + + + + - + - + + + + + - + - + + + + + - + - + + @@ -141,15 +179,67 @@ - + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 cf003b44f5b..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,10 +1,10 @@ - + - + eJztmG0OwiAMhon/hufRGQ+ye0ydF/VjHkca10jIGF9CUfvjDckC6UMLZH3HRoiR9TPaKLUVcNi4Hkr3yvYBsc5SiJN8jTY+mLdVGqZ5t0J8kLOrpjk+3APO2SkdZXk+W9xefdsTsJl5WaoZ7mO19pe+PmSdKV++lBipsp09vcaUfCDX20LN53ozqPlc95Kaz+fOMx/zMR/zMR/zMV9ZPkq2b+CD3rGtmM/1j0/NBz1kzf/Qvv5GiMwYnUcM6MUOU8+NvoY+Lp3BEHWRfDon+gIujyNFGAe8B8hLiP+AvgCsRdZP82GcGE/p0rw9Fax7Dn8l9mz3mXjm8pCjLv/CV6pONekJ5zkFQw== @@ -12,12 +12,12 @@ - eJzdmc1u00AQx4dYFFo1uTT2IalDEEgFDkiIFs4InqDwJnAnLULio6SJaPkQ515KX6ag8gK0nFCbcMiZHbwrj9ez67VlgsNIf62TXa9/+Y+9XU9XGgCv62ltCanY8AGe+VG7qemp0OUgHntNzHejAalYrwG88QDGop1InQpte7HOSJ/SS4btRT15jUtBxIBtV6gnubpBks0WI4Zp4KXHjIlw/EojyXXd8PtpoI+h4DppurFh9KU/v2rpvqE2RrFha/JMjx1yrHy0eXfrHM+oe6aP63vJnLt65hpvHcdx/HrgPYvPwa7Qu4rpfT3yEvluC+9WK6Y1mU/Ma5X5MGaN767QlynrTg4+2jetsDHMKt/REkDgl6tvS+Xx+X75PpnmNDHsVJzP1qfmOt8CmGtFx+0OwHInPf9JCPAjjD+HbYBOW54j2uX23+Obmwe44KA9S9/FeZ5P/R2exv13byF7TJn+PW7mezaRL2vME8OekWP4uZjNnidc/DMFx4DvCqeL1eXD4PZXs8B3RawHV+Wa4HLM8X0X682xXHMOZLst28+yHYR2Pm7/h32uawrV/QXzulLUv6y+PGHK777m2b7mHXqbl6+M/OaJvHxF8vtA43veio8Hmnd9zdN/mV+X+J/4PhZ8X0W+ou/SH+rufEWE8yFfWe+Cs8Bn2h9Uhe+VrEEeNoq/tx7J9qvkO9S+LyqcD/cvx824jsfVlLCG9Iip2XGhP7/cuZ/cpvoTmN/NjFrjyFBTdOHDc7c8gIe1SJT1pqG+NiTHmN+ezzOuyzmxZmy6hgvfhNRr1Tyu+cD8bshack9jpPXiM3INm5ccH62HTwgnZRxCOtS9oWrJnSDp44jMperuWR6Y+MYap+136nlDLlWL75K6MlerpvV3vY7M8fUt/zvQPVRs1AvUb9TxixY= + eJzVmUtv00AQx7exVETU+NLYNyCc8iDiIaAc4ILgExTO0O8Ap4JEWi48SiCiLSCu8AlaOPAtCgpnqOBEaBJAObODd+TxenezdtzUjDRaZ3c9/vk/fqwnVZexx6W4r3FHW/EYu+8F7ark97gf98O5NR6v4bKYLRYYe+IwNuTtSPge96dO6H0yhv5QwfagFD3GMT9ggLbCvSW4Kn6UzWQDBdMzJz5nSBzmV90oV11z/tRAxyOc63vZjg2sLfT5VYiPdaQ5yAatTjPZ1sk26mjS7syMmlHWTJ7XdqI5t9XM1p5bzlPxywbXLNwHG9w3c+YvSoGWwHeWa3cuZ35e5BPymmc+sP+N7wL3j1P2hQR8dGxaZmI4aD73RDq+7jxjvpetf56P810upuPzvOy1wpigGbYmvvUD4qOMk+rXrfG81ILtH03Ges34cd/xvvek/2edr1XqYh/e9urRmG8OM3ZI+O6EfLMklsnfWszZ8oL2ajHQD9/D07j+IE/jDGPSuWnv31vlZPfmtsWc2+WQD68/HUNvbry2WeuH9qUY5lynH3wr7M3tL1+/ytft1fD3TIOxQiM+T8egWl9lrZ/cr5qXlO8UP8fT4jx/82fDH/F80PXjcS/ysUtifIs/b7abQf9d8ey5KX7fEb+XmmY+1foPxmyfKdSvFNX9X6X+3QT6jRtLYpi3D7PR/mWhEWq2LGkH2ibls8kp7ad8Se5jE4NpbJL8Yj6pjkuSdjckTaeZ3zS2X3x0jUjfH6p1XlZ8rxJ8p8L7FL9XQb8Nqd/WX5bs+dI4xFOt4yaJl3c+3fogL3yPRA1yx03/3doV7SfBtyP1p3WIB+uXb+WwjqeqKUEN6bqiZqcy+fmi2ve1Xah/BvldHVNrHGhqijZ8sO+aw9i1QuCU9aSmvtYh25DflqdmXBQxoWasO4YN34jUazGObT4gvyuiltySGGm9uE+OYdJSxUfr4SPCSRk7LG54bWAt+agf1XFAYmHdfZwGOr6hxGk6TzlvwIW1+AqpK6tq1bT+LteRVXxtw38HsobIRrUA/wuF8ano - eJzt1sEJwCAMheEMUCEDFNdw1dRpLfTmpRFSDPT/Ll48PCM8IgIAQKx+xN5DHGaOv2tld4K8ss3Gm8fuXrsc3ZbtfQDYS954um2VMXM59Tmr7s2Bb/C/AGYDsZYG7w== + eJzt1UEKgCAQhWG3QYEHiNZ1gm4a1mkLWkTBhMTYK/i/jSAuxlHehAAAgK+l9j0HP/QcCn2lruAwNuoKzgZ6Y8qtJ225Nmdk29fuB7yBuf9vd9n2dH6kgn9iMnLW2ldp4752UVsHyuB9AVytTOkIyg== @@ -30,55 +30,79 @@ - eJzt1DsKgDAMgOHoolvnWupR1dv5uIleQgMKDio4WErl/6AhfUEgEBEAAID/ma3IYvd89Rrq65tRzyd/7jMnkrvjT6XBha4SQCoKnQele5/f6XXeDP75HvF80V8Au8aItLo6E7sShEB/AaRmAzrgDb8= + eJzt1O8JgzAQh+HfBo5gv2nEGatb+GeTdolaLdQFdA4PbLFgP0hBRPs+EHI5ErgQchIAAMDxXELpGo7xLZaqeL6nsFz5kb87qXavMzZXbv06gb1pAukRTOvO/kn/B3/laXds3fL4zY+kUzTGmfWb/EsvwvZ+fV8Ac2dPSmyk3taVYA28L4C9GQDl9SK0 - + + + + + - + - + + + + + - + - + + + + + - + - + + + + + - + - + + + + + - + + + + + - + - - - - - - + + + + + - + - + + @@ -156,13 +180,74 @@ - - + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 c9c2ea4b63d..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,10 +1,10 @@ - + - + eJztzrENACAMwLAOSFzZ7zmEJ6qCwEPmOEdEqqQ174iPj4+Pj4+Pj4+Pj4+Pj+98fHx87/kq6/rw8f3s21DxrDk= @@ -12,12 +12,12 @@ - eJztmEtOwzAQQL0iTnqCLiqBYAcUroAQcCTYUtYpqHADPseAq0AL67bAAfAoHWU0jdNxbNMgMdKoVho5L/N3lGqfTLVSh5lSw3TdJNWSpwVbTL6TRKnTBnqWlLaLyTcxz3lvoB9Jyfap28sHbPuZ7FmDTqlN+c67Sl10izUXzlfFBjlzYK7NzO9cL3NxdeW7NWx3Qr4qu9GcuSZx2YStim/D7JlU6FO6zFclUj6pSOPvyNhqu6fUTq+eb9fc960Lvj7xsytXEz6J/UBGxIbcjv98f5+P5ohLfVwH341n7wvNR2caX9/G4MsDxh7y3ZPaa1sjH16T8oXw72tW9ok3y/p4sR5nbnxQo+ce801s//raMCQfz41QfKHiD3rvl2HcIz04RH0OGX8o6Oc21Ocpi3/qZzrDrIsvZ/7jOeJjw9B8YLu6MyHEr8s5cTP140NfosDsUvfOfJ9QauMbkfMlsraNr5+V62GL7Ddj31/yhS3bwkdzFPn6K/xLa61EH4X3jWv4MP6wfwDfi7n+LMw9F7tQfejY/6N8vH8B31Yqrw2r+OBdB7pQyTvD/Vfa3v8vdbmfjwIL8NFaK9mbsvn21zqZJMt8NuFnMpxPfOfjUHz0TAtMmAuxbOfKZ/vuE1Oa8MWMNy4ufOBPmIt/iw3EhW+V/AAJonRV + 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= - eJztlO0KgkAQRS/+y4L2r5jWixWaQj1G9PHeuYhkwyJSaw7bPTDM7AfsYdhdgPjiuvQX9KOfL79bAtybeCQ6/bT3j370C8VvnwKHVK/fN/ybX5UBdTZcd7jmpvbzDf10+fH+0U+rXxW9j+vIvW8uv0/YroBdE/GizV1sTJtz81qzWdb9ORfnXo/KEf3SxFGBr7xzWimE50mBt3SS4zHvl7iRvZySy/p3Z4WK/c8tuZnXg5DQeQKDcgII + eJztl80KwjAMgIM3f8A+gEyPY0wv+ibqXaeojyE+uStzOMomTc3a0OWD0J8d+pGMLQUQqHhN6SIGv+uItx8Wn37FJ3c3RA67ztqnAIcyjinOD1s/V78h1peT34mozj7zd3ZwDlnfu4WvD791BrDJ8P6+/Lq4MMnfP1D7bXOAXf57XtO217cfNeLHy0/eP/Hj6mf+L2x6We75W84AVmVMxtVYx0JVY6K+z/Rozpt7bTwaOXLpr0JSMPC16VE4YPb7Nr1p35hO5pr6LjokqO53Njzn/s6KFf091yQqrIcgxM4bns4Cfg== @@ -25,61 +25,94 @@ - eJztmEsOgjAQhmdnJMGVK4gbT4HixnAO3eol9CC+Nt4J3fk4iRBpLDh9wACW2D+ZpJ06088WhrQA3dDOBdgbYgf3my8YAEwymyV2IVhYIUfIzT8dyPmw8TIKKuRQzR9w//n6A76YW0cRH3Xd6sgliu0637lPn4MSq8o5d+hzUGItHy2W949HHz9rMz5sjPe1wXdPWHr9tz2yduTk+3z76ejNkWrhAyx9Gh8mk/YXk0l8Gw9g6+nxrZK9Whf2q2k+rBbL1q/4+zbfD2YR4mNW5v2ogw+TSc8fJpP4ZPW5OI71f1mfizXaPn96OU3gO0nOeymf7hn06DbDJzoTpuellC8WjIti6ubD/MPsO3dz8v2m1Mb5iCLLR1OX+U6S+yOVdsj9E+ZTxYtqE/V+CIsvk1PnfoiNi+q0qibL+FQ5sXheZWqvbm2umpN6f2Zl9S96AU0B1qI= + eJztmEsOwiAQhlmYmJLUe1ijW6t1oXHvAX1tvFN15+MInkCJEsc6QNvpAyJ/MhFmMsPXWiYBxtzQOmRsY4ltw1++uMfY5G2zpx0JlpSokYD1pz09HxYvorhEDdP6MXjmUwt8KXiPKj7qe6uilirXdb5DQF+DkmuqueD0NSi5no+WC/33wccvx5IPi0FfE3yXJ0s3eNn1PV7y7zkc33i+NYSGEWOjiMaHyab/F5NNfKLXrfpqPtgLx9Fvb6ybD3tX0JeNZ+dN7g9pS2RfSCuyP6rgw2TT94fJJj5df87GsXmb/dl/f+7y7TXnPcGX9wy6C+vhU50JxXlJ8KWKuCqnaj7MP++8fs/8e16XmjgfUeT5aHKZb6+5PzJpjdw/YT5Tvqo3Ue+HsPwiNfPcD8m4qk+berKOz1QTy4cq0nvz9uayNan3Z15e/6IHVk/fZg== - eJzt1E0OgjAQBeC3EnddF9LD6EYSvARswEsIx/JoLp2dEUqDkTKA70ua9G/xkmkHIKJf1BZoZNysdhLySRxwdNopPj1S7QTxHJx/PnbWv7Nlpww4Z9op/lspf6ua+L8KqdV1pF4XeZe5C899d4nmEOv9hfqzb29P/ZnoW3cDtDI6o51k6GnDayIieltzPyei5bwA2sMSFQ== + eJxjYBgFo2AUUALMNRgYLIDYUmOgXTIKsIHr2gwMN7QH2hWooENzoF1AO3BNGzsblxy6mqEMBLUYGIS0BtoVIxsYAvOWEY78JQ+MGwWk+JEGsmVwxJe4DgODhA5+Nja1hIAvnrxvDXSLDZp7LEbT04gEtEp/+MpnbGLDqXweBaOAVFDHz8BQD8QN/APtEkywiBk/f6iBAk38/MECLAepu4ZK+I2CUTBQYDCX56NgFIwC+gEAuogcaQ== - + + + + + - + + + + + - + + + + + - + + + + + - + + + + + - + + + + + - + + + + + - + + + + + - - + + + @@ -143,15 +176,17 @@ } - + - + + - + + @@ -166,5 +201,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 a5c2aac1b54..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,10 +1,10 @@ - + - + eJztw7ENAAAMAiB3l/5/rX80kNBLqqqqqqqq+ugA4iKowQ== @@ -12,12 +12,12 @@ - eJzNWMtS21AMveCEadg4yY7yDcCwhg5fAf2B1oUWvgE2rMtjSdOCyd/Qx7eUwppK1BqOFd3rm9RJrBmNh4skHx097DhLnUu6zrWVLpJ+SP3KPu/oOqSrSBaw1fHZ97b7ou/T0fuzX8vjq+0t1TloHILBirUEebHkYIf3z5W/cJJ3y/n51Iqp8ScG5qHCl6maCG8sLSOmT/fTclzxXYKcNGaspcZlxckgJ41v0priOZ4lETlbPu1IfFV9PG0VfBqHrx6xfTmJWrkLPpynp1fO7SyPquuMaugc/awr6kKnnLtgtfANyPbrjPVbx943Fr7c8D9ede5kdXb4BGMsvivC9mXG+ERi8FXGJ+zX/4H/WuHbpdq+hfry3pHdOwm+uvk7JzyXar/ILpkHPs2fcGjVV+b3huqVGzW7pbNhzb1o9d858If1ncd+sfjD+Zh3favmt2nzofHhO2MTnh9Nw1fVf22ocVP2iwi+N/CMNK2+WurAt7bi3PpKPfzhs25e/RfiD59108J3+rpZ9Z1m/zVtfrVs0e+BbdKkE75ug12LdNGws3zwXP5+sxyPLyR6lkQGBgcbPec2e3HxfHHHFZmlTH1LyIseQkyf+s4d9cPYzijWYzo6o1YOIdFc5Oq3seD7QTYH/bKtzkXkD539Tv240O5R+euYmgv5lobvPIyP7Q6Vrc4F7/uZzveAH+EB+RA75NAXE/+P3xcGY+4IFq7pRaHCofD/kfRX76UHmOf7ijr76iT4xtkRPmF8PwtlfMzdQ1Ffi0fElhTvYJzTXlquSz4Bf5Zwf3wnXHe9fz0i+BgX8/hg9OLz/aGeXJf7tGxbF3/cd1JbFsGH6uMQRc9eLH+hHmHR84VciIZ6UXaR9U4Rw1/V3FmiOQztS995XfX14WPOLgou9U6KkWnh+wtIU1uf + eJzNmM9u00AQxpc6qUgvTvISkXJBPbeIR4AL5QWKW/pH0Jb3gJZzAJm+TVt4FtLmCHQGPOrnyex6E5zEI42sbmfXv/1mZu04S51Lus61la+R76V+5zm7dL2kq1gWiNXr89xv3Qd/nU7fn+e1PHN1vOV6D5pDGKy11mFfbDnE4f1zNV80ybvl/fncWlPzJwbzpeLLVE5EN7aWsabP99PyujJ3HfakmTGXmstaJ4M9ab55c4rjOJZE7Nma047kq6rjRbvwaQ5fPmLrch639i582E9/Hjv3bGPaXWfaQ+M4z7qiP+qU9y6sFt+IYj8v2b907PPG4suN+c+Hzr0YLo9PGGP5DontaMl8YjF8Vf6W2N/9B/9XxfeScvsK8svnjpy98/DVrd858XxS54ucJavg0/qJhlZ+pX9PKF+nRs7OaOx9zbVo1d856If5XcX5YumH/bHq/Fb1b9P6Q/PhO2MTnh9N46uqvzbkuCnnixi+N3CPNC2/2urg+zVw7vegHv3wWbeq+gvph8+6JvItIr+L5Gta/2rbot8D2+RJJ3zdhrgW+ZoRZ83Bcfn76UY8X8h0L4mNDA2e9Jzb7MWt51t3VpNeytS3hLyoIWQ67Dt33A+zfaS1Jul0j1p7CJnWIle/jYXvhmLe9Muxei9itzT2M/VzYdxEzddrai3kWxq+8zAfxx2pWL0XvO8HGt8BfUQH1EPiUEPfmvh//L4wmvGMYOOcXhQuGor+B+Q/eg81wDqPK/Lsy5PwzXJG+Iz5vhfOfKzdXZFfS0dkS4p3MN7TTlrOSz6HfpZxfVwT11XvX40IH3OxjndGLf69P+ST8zJOy7F16cd1J7llEz50n4Zouvdi9QvVCJvuL9RCPFSLchZZ7xQx+lX1nWVaw9B56RuvK78+PtbsotBSn0kxtii+e9gCXBk= - eJztV21uwyAM9d+EkAu0UrMzbCeYmuxc066ytuutuia9R0EFxbKgITRQNvEkqwSS+uFn8wGQkZHxX/DNAXZPsj2f5vdeA3TCfiNbK2xbu/FzeW9puPrN/B7za3uvLwEu5Xy/fA1Qr8Pz+2QAh8L+HeYv24OwTpnLvB7ldxTcvpj9Ozwu51KI51LZSxWe31T8ML+puSzFT+sk7UNYq/QayG9HxmX73lyW4rcRujTVqBM1PMaKm6ayj0WK3xxITXXMZC60JL4DsY7UT2h+kpOtPkzxbpA2sn5i8otRH68rgLfVrc/Wpvzu6Ut1xm0ffXvynyYftH41P1xXum5MuupnH32xD1rD2kdDeJg0ddU6Rv61hji7roWh8++IdKTxDrG/9ZY8ozmO829uzfry++Fj/pnWLFM/U+uz7/3lwN34nWbeGwZh53rcP06qz+cOcg54Lsbrc4qYOn89G6nHz2fPjYnU9cXnvxSRev5tKrd9LCPjL+EKsTvNGA== + eJztV0tOwzAQHQk2iZtcoWFJrgArRIPoniPAPShXgZYeClRacw88aqwMlv9x06rKk0ZxHNvzMs/jD8CIESPOBe8FwMeRbFm4+d2VAI2wn4FtJuy+9OPn0y41fP2m4LfLAX7zsD5D8ntlAG8srE9ffiExofy+aoDvOszvi6W9iR/6XGXmfpQ/tp2JcuNp2K9v/NaZXTP6Hfll4j132ILtn1eT/vxc8aP8XP8isSBtVL8mjWk71Iy39pB3mnHl2SjfsWz7Fxe/eW3mSNtNRdyriVkf+o1le02xjiWInwmx6wtqKmMm84PGlyuGdcjPlB9zD31duBFj3NYdJ1d+0HhXRJsU+aEDzRnKzzc/YvzKdhciLpdtbExllZ9NX1VnWo5Z/3bKmDofppyleSXzRqerfI/Rl/pQc1j6qBQeOk19tT50/ur2NJ77r4WHmH8Ua6KjGm/U7+k6LT+6d5jmH63DOIXmbCy/z6Kbf7o1S1fP2vU59v6yKvz4bQLvDVzYtuz2j01bF3MH2QbO+8f6/9MG25lZHcdnvFBuz44xXeevlNxiEHPnGBIxe+6QcOl7bNDz3yni1OfftD2HjBhxTvgDGpfgIw== @@ -25,12 +25,12 @@ - eJzty0EGACAABMA+ED0gvb7+2SkRHYoOMcOyh90QAAAAAO60eJahHv7W/ws5zV7SfgcA/KEDgLsSbg== + eJzt0sEJwCAMheG3gOAA0rvOXSdrd9BjT8UiFipFRPg/CCSQQCCRAADAX0eQzlDq5KXs5+0DzPL8/S851sJ9AbRE0xe3vXOunh/B2ZJv9r0PAACs4QIr1ijS - eJzt0ksKhDAQRdGa2xB00kotQFdpC/3R7eoKrIETUVoRY4HcA4HiQUjIiwgAAH7eKvLRZd5bNqzk8Pe1Xn4r3bSWdXQWXWJv/ND989VKO7fS/TPmYvb7tD25/p+30O9xaSGSFd638HPG/8M91EHkNa0meN8GAADc3Qj2GhFY + eJzt0sEJg0AQheHXgSWYm6ztRGOqibZmLqYHc0kuWkbmEGHBJeTgsiT+HwizD4SBeRIAAOkcS6kq13lv2dXLB5tv3nt00t3F3w9rtd3hFLhZY9k5kGNbfve/mfcmtw4efriHMe872T+z+zwjnkchPYvUW6RD/7C4ZFL7/ros9TYAAODfvQDOSyqr @@ -38,8 +38,9 @@ - - + + + @@ -106,54 +107,137 @@ - + + + - + + + - - - - - - + + + + + - + + + + + - + + + + + + - + + + + + - + + + + + - + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 new file mode 100644 index 00000000000..8218036aab1 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/maps/map/mountain_town_generic.tmx @@ -0,0 +1,116 @@ + + + + + + + + + + eJzFlN0KgCAMRr3N9+n3rbLoRTPqcdrASMS1RWoXB4Rcx28rbaWUDdiA3XFEniMdMOl7H8VK1HPvG2E9MGf76qUyxGpTeZ/65mfGfUbLesx5JbNCdy+caVhnHOG8pD37in+Gkl4f9M7gb3/wlspcA43j8pbITH3bOd2YddH0P5XLLbm3cril93Rqt9Sb0s3NNpf7TdaU92jMewIfOqPa + + + + + eJytld0OwUAQhacX2HoAJC68AQnB0yDxSBJBvAYSXKifh/LPTNrGZM1ut2WSE9maPd8c29Y0DzBNqTGqW4CvqnoAtUhL1ApVQpVRFe/TQ+u0vE5BZlKt0W+D2nqfaws2A+8hH1eZeDsF8PJD7ZXc41JtL7mH86AI0PdDPTOyySuI/OjT5EF9nMc18OU9TUuenuZhmn8o8H7JrHNjn4CdYWDJyvfo592y5LXlyCLX7DfsO6n/sk3nLbHvqKNKN8NBhXu4yOeR4T5zzU9Mk39SnXPy9aQzT8N0fTdQ2TL/kjMuU14T28ZsaLku6H1lcp1jLLDpPh1F34+E/XXGnmj/McS+MX9bZqpext9X55JmeXM/zTFn6ziz/kxKeW3cN3fBlwQ= + + + + + + + + eJxjYBgFQwXsYGFgkMaDd7FQph8X/saKas4uNgYGeS0GBgUtCD+UFdMuZIAsr6uNaRYMZGoyMGQB8Xp1BoYN6hAxPaB6Yx0GBhMgPsvOwGANtNOGBHthekEAmQ0DepwMDK1AO9uAWJ8d1X05HAwMk4HuO88OofM4iLcXZBYMILORwVl2VBquXhu7ODH2wtwMwhdw2HsOzT+43EWsvV9YUdMgsn7kMMcljhy/yHxC9qK78SyOMMclro8W/jA+qfYih3kuEhuWbtDFYWwYTWy6QgbIYY5eBoD8Q0peR8/f5ABY+JPiB2qAUXvJAwB5S0IJ + + + + + eJxjYBgFowA7mKzOwDBFHcEX12FgkNAhzyxkvZSYMwrIA7jCHF+8jMbTKBgFwxMAAMK5BSc= + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 new file mode 100644 index 00000000000..2817288db35 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/maps/map/mountain_town_identity.tmx @@ -0,0 +1,114 @@ + + + + + + + + + + eJzFlN0KgCAMRr3N9+n3rbLoRTPqcdrASMS1RWoXB4Rcx28rbaWUDdiA3XFEniMdMOl7H8VK1HPvG2E9MGf76qUyxGpTeZ/65mfGfUbLesx5JbNCdy+caVhnHOG8pD37in+Gkl4f9M7gb3/wlspcA43j8pbITH3bOd2YddH0P5XLLbm3cril93Rqt9Sb0s3NNpf7TdaU92jMewIfOqPa + + + + + eJytld0OwUAQhacX2HoAJC68AQnB0yDxSBJBvAYSXKifh/LPTNrGZM1ut2WSE9maPd8c29Y0DzBNqTGqW4CvqnoAtUhL1ApVQpVRFe/TQ+u0vE5BZlKt0W+D2nqfaws2A+8hH1eZeDsF8PJD7ZXc41JtL7mH86AI0PdDPTOyySuI/OjT5EF9nMc18OU9TUuenuZhmn8o8H7JrHNjn4CdYWDJyvfo592y5LXlyCLX7DfsO6n/sk3nLbHvqKNKN8NBhXu4yOeR4T5zzU9Mk39SnXPy9aQzT8N0fTdQ2TL/kjMuU14T28ZsaLku6H1lcp1jLLDpPh1F34+E/XXGnmj/McS+MX9bZqpext9X55JmeXM/zTFn6ziz/kxKeW3cN3fBlwQ= + + + + + + + + eJxjYBgFQwXsYGFgkMaDd7FQph8X/saKas4uNlR+KJo8OsAnj2xWpiYDQxYQr1dnYNigjhA31mFgMAHis+wMDNZaDAw2WsTbC9OLbA4y0ONkYGgF2tkGxPrsqHI5HAwMk4HuO88OofM4iLcX2Sx0c2HgLDsqjUse2VxC9sLcDMIXcJh7Ds0/lNr7hRU1DSLrRw5zkPgrDUxx5PhF5hOyF92NZ3GEOS5xfbTwh/FJtRc5zHOR2LB0gy4OY8NoYtMVMkAOc/QyAOQfUvI6ev4mB8DCnxQ/UAOM2kseAAD38kEl + + + + + eJxjYBgFowA7mKzOwDBFHcEX12FgkNCBsOW1GBgUtIg3C1kvMnsU0Aegh/k5DUxxdDWj8TQKRsHwBADmvgaw + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 new file mode 100644 index 00000000000..bfb7c2bb2b6 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/maps/map/mountain_town_tribal.tmx @@ -0,0 +1,116 @@ + + + + + + + + + + eJzFlN0KgCAMRr3N9+n3rbLoRTPqcdrASMS1RWoXB4Rcx28rbaWUDdiA3XFEniMdMOl7H8VK1HPvG2E9MGf76qUyxGpTeZ/65mfGfUbLesx5JbNCdy+caVhnHOG8pD37in+Gkl4f9M7gb3/wlspcA43j8pbITH3bOd2YddH0P5XLLbm3cril93Rqt9Sb0s3NNpf7TdaU92jMewIfOqPa + + + + + eJytld0OwUAQhacX2HoAJC68AQnB0yDxSBJBvAYSXKifh/LPTNrGZM1ut2WSE9maPd8c29Y0DzBNqTGqW4CvqnoAtUhL1ApVQpVRFe/TQ+u0vE5BZlKt0W+D2nqfaws2A+8hH1eZeDsF8PJD7ZXc41JtL7mH86AI0PdDPTOyySuI/OjT5EF9nMc18OU9TUuenuZhmn8o8H7JrHNjn4CdYWDJyvfo592y5LXlyCLX7DfsO6n/sk3nLbHvqKNKN8NBhXu4yOeR4T5zzU9Mk39SnXPy9aQzT8N0fTdQ2TL/kjMuU14T28ZsaLku6H1lcp1jLLDpPh1F34+E/XXGnmj/McS+MX9bZqpext9X55JmeXM/zTFn6ziz/kxKeW3cN3fBlwQ= + + + + + + + + eJxjYKAf+MdEW/MZmSE0EzOqeI8mkGDGUE5T8J8Gft3BwsAgjQfvYqFMPy78jRXVnF1sqPxQNHl0gE8e2axMYDxlAfF6dQaGDerQMATGm7EOA4MJEJ9lZ2Cw1mJgsNEi3l6YXhBAZsOAHicDQyvQzjZNiPmMSOkkh4OBYTLQfefZIXQeB/H26rMj+MhsZHCWHZXGJY9sLiF7YW4G4Qs4zD2H5h9K7f3CipoGkfUjhzkuceT4ReYTshfdjWdxhDkucX208IfxSbUXOcxzkdiwdIMuDmPDaGLTFTJADnP0MgDkH1LyOnr+JgXAynRY+MP8gF4G0wog20svO9HtpSeglr0AD9lFhQ== + + + + + eJxjYBgFowA7mKzOwDBFHcEX12FgkNCBsOW1GBgUtIg3C1kvMnsU0AfgCnN88TIaT6NgFAxPAAAOuQW6 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 new file mode 100644 index 00000000000..4e5b6f4587f --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/maps/map/plains_town_generic.tmx @@ -0,0 +1,131 @@ + + + + + + + + + + eJzr5GRg6Bxk+AUHBJOqz28QuH0UY8dN3NTHg9He5xy0tbcNDcPs1OCiv72tSOyRYi+t0xU2e5W5aG+vChcqHuh8NGovde19zoGoV7HVrbSyF1QuoadnUuwlx20wsymxl5L4HUn2YiuvKGkbEKuHWvYi0/SydxSP4sGKARuK+bI= + + + + + eJztlUFOAkEQRb8xRGZwuAcHwKg7QjScg4UbQA6A8SDKkngdIBhlqURXcgi6Y3fSQHX3Z9I7+MlPZjpV81JVnRrguDWtArOEnlc57vkZ0EU6P5D11nLgMqGLnAQrvRTAq/K44HNS5F/XgRvl2/r/+yADHgkPMzmf1YeK/1Remjy297anu/laT6b2UaAH7p0+9H7Phbv8R9Y7cPqmnyfKF4TfnBy371ahWiVui+yzjvNxNfO5BFfrrgHcN7Zj3bMQ10qzfXX7uDEx3JAYru8s9XxTcCV1AtyvfP/utoWzFcFdK/8G6rV3VNoZfdODXibvDvtcZr5210nW+09zYzFluHbXSV4abiymDFeaaWy+3/n+rA9R7D9QmN3ExKUWu0tC6sRD0KwAVxU/94f4BhOzq4Vivge4J510zNoAyJKMbg== + + + + + + + + eJxjYBgFo4D2YAsLA4M4FfE2FuLsDWTFLl6gSRxfXouBQUGLsHmE7F3CTZw+GLAG2mlDBXthQE8bwf6kjUoTY14VL241lbzEu49YQKl/R7q9X4Fx+42E+CVXnbEOA4OJDuluoEU463FSz7zBHr/Dwd4qpHIDVBbpI5VLhkCsqw1hw8piEA3i66Cpg7GR7S3HU14R6z5SALJ5FVjshomRYq8gjnyFy1584AMr8XUqMXX1JyqGH8wP1I4TGKjEEh99moTtxaaPGgDZ3hxN/GppZe8oGAXYAAB7/jCB + + + + + eJxjYBhYMIuXgWE2DfEcXuz2WvDR1l9WOMwftXdw2dvKw8CgC2WfgvLpYS8IXNNGpellLzlgKNqrqcnAoKVJWIwSe3XwmGGuAVQPxJYauNXoovGJtRc9yYgDHSIBdUww0L4QIA6F2nsTqPgWmoZTZNqriqM8FcUXEEgAPX9hs3eX9uBOV/SwF1+9CKvTiFFDqr3IZREuNinqBns4j9o7au9QtvcaUPw6kRgZEKvnBo39NQoGFwAAZ+tPHw== + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + [{ + "text":"I am a big gate. Greetings.", + "options":[ { "name":"Okay..." } ], + "action": [ { "setMapFlag": {"key": "gate", "val": 1} } ] +}] + + + + + + + + + + + + + + + + + + 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 new file mode 100644 index 00000000000..db50dd886e2 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/maps/map/plains_town_identity.tmx @@ -0,0 +1,129 @@ + + + + + + + + + + eJzr5GRg6Bxk+AUHBJOqz28QuH0UY8dN3NTHg9He5xy0tbcNDcPs1OCiv72tSOyRYi+t0xU2e5W5aG+vChcqHuh8NGovde19zoGoV7HVrbSyF1QuoadnUuwlx20wsymxl5L4HUn2YiuvKGkbEKuHWvYi0/SydxSP4sGKARuK+bI= + + + + + eJztlUFOAkEQRb8xRGZwuAcHwKg7QjScg4UbQA6A8SDKkngdIBhlqURXcgi6Y3fSQHX3Z9I7+MlPZjpV81JVnRrguDWtArOEnlc57vkZ0EU6P5D11nLgMqGLnAQrvRTAq/K44HNS5F/XgRvl2/r/+yADHgkPMzmf1YeK/1Remjy297anu/laT6b2UaAH7p0+9H7Phbv8R9Y7cPqmnyfKF4TfnBy371ahWiVui+yzjvNxNfO5BFfrrgHcN7Zj3bMQ10qzfXX7uDEx3JAYru8s9XxTcCV1AtyvfP/utoWzFcFdK/8G6rV3VNoZfdODXibvDvtcZr5210nW+09zYzFluHbXSV4abiymDFeaaWy+3/n+rA9R7D9QmN3ExKUWu0tC6sRD0KwAVxU/94f4BhOzq4Vivge4J510zNoAyJKMbg== + + + + + + + + eJxjYBgFo4D2YAsLA4M4FfE2FuLsDWTFLl6gicp/rYFdXl6LgUFBi7B5hOxdwk2cPhiwBtppQwV7YUBPG8H+pI1KE2NeFS9uNZW8xLuPWECpf0e6vV+BcfuNhPglV52xDgODiQ7pbqBFOOtxUs+8wR6/w8HeKqRy4xOW8gnGhpXFIBqfOmR7y/GUV8S6jxSAbF4FFrthYqTYK4gjX+GyFx/4wEp8nUpMXf2JiuEH8wO14wQGKrHER58mYXux6aMGQLY3RxO/WlrZOwpGATYAADv+Lzo= + + + + + eJxjYBhYMIuXgWE2DfEcXuz2WvDR1l9WOMwftRc/OK9BX3tbeRgYdKHsU1A+PewFgWvaqDS97CUHDEV7NTUZGLQ0CYtRYq8OHjPMgWnZAogt8aRpXTQ+sfaiJxlxoEMkoI4JBtoXAsShUHtvAhXfQtNwikx7VXGUp6L4AgIJoOcvbPbu0h7c6Yoe9uKrF2F1GjFqSLUXuSzCxSZF3WAP51F7R+0dyvZeA4pfJxIjA2L13KCxv0bB4AIAgOhQFg== + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + [{ + "text":"I am a big gate. Greetings.", + "options":[ { "name":"Okay..." } ], + "action": [ { "setMapFlag": {"key": "gate", "val": 1} } ] +}] + + + + + + + + + + + + + + + + + + + + + + + + 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 new file mode 100644 index 00000000000..1f1302c01b2 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/maps/map/plains_town_tribal.tmx @@ -0,0 +1,131 @@ + + + + + + + + + + eJzr5GRg6Bxk+AUHBJOqz28QuH0UY8dN3NTHg9He5xy0tbcNDcPs1OCiv72tSOyRYi+t0xU2e5W5aG+vChcqHuh8NGovde19zoGoV7HVrbSyF1QuoadnUuwlx20wsymxl5L4HUn2YiuvKGkbEKuHWvYi0/SydxSP4sGKARuK+bI= + + + + + eJztlUFOAkEQRb8xRGZwuAcHwKg7QjScg4UbQA6A8SDKkngdIBhlqURXcgi6Y3fSQHX3Z9I7+MlPZjpV81JVnRrguDWtArOEnlc57vkZ0EU6P5D11nLgMqGLnAQrvRTAq/K44HNS5F/XgRvl2/r/+yADHgkPMzmf1YeK/1Remjy297anu/laT6b2UaAH7p0+9H7Phbv8R9Y7cPqmnyfKF4TfnBy371ahWiVui+yzjvNxNfO5BFfrrgHcN7Zj3bMQ10qzfXX7uDEx3JAYru8s9XxTcCV1AtyvfP/utoWzFcFdK/8G6rV3VNoZfdODXibvDvtcZr5210nW+09zYzFluHbXSV4abiymDFeaaWy+3/n+rA9R7D9QmN3ExKUWu0tC6sRD0KwAVxU/94f4BhOzq4Vivge4J510zNoAyJKMbg== + + + + + + + + eJxjYBgFo4D2YAsLA4M4FfE2FuLsDWTFLl6gSRqfkHmE1C3hJk4fDFhrMTDYaFFuLwzoaSPYn7RRaWLMq+LFraaSF6GOiZmwmcQASv1LKvjHNDD2kmoeseq+AuP2GwnxS646Yx0GBhMd0t1Aqr2MRKQrPU7ccv/JjF+YPkrBcElX1LS3Cqnc+ISlfIKxYWUxiManDtnecjzlFbHuIwUgm1eBxW6YGCn2CuLIV7jsxQc+sBJfpxJTV3+iYvjB/EDtOIGBSizx0adJ2F5s+qgBkO3NwdHOoLW9o2AUYAMAMPkxOA== + + + + + eJxjYBhYMIuXgWE2DfEcXuz2WvDR1l9WOMwftXdw2dvKw8CgC2WfgvKRgbwWA4OCFvXtBYFr2qg0MWCohvNA2KupycCgpUlYjBJ7dfCYYa4BVA/Elhq41eii8Ym1Fz3JiAMdIgF1TDDQvhAgDoXaexOo+BaahlNk2quKozwVxRcQSAA9f2Gzd5f24E5X9LAXX70Iq9OIUUOqvchlES42KeoGeziP2jtq71C29xpQ/DqRGBkQq+cGjf01CgYXAACumU+y + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + [{ + "text":"I am a big gate. Greetings.", + "options":[ { "name":"Okay..." } ], + "action": [ { "setMapFlag": {"key": "gate", "val": 1} } ] +}] + + + + + + + + + + + + + + + + + + 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 new file mode 100644 index 00000000000..92f1f48eade --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/maps/map/swamp_town_generic.tmx @@ -0,0 +1,113 @@ + + + + + + + + + + eJyL4GZgiBjFo3gUj+JRPIpH8YjAAH23xTs= + + + + + eJydVUtSg0AQ7QUkBCsnMH42uo0eQC8UPcKQFPfws9Rz6BY9gpp4D+0m82qaZkBwqrpggOnX7/VjppgRFT5+JkQ0DXMdxznRV0b1OOT776z9zZafHfG7D76e5vE8D5z/0WDc8fx+2swj+eW68zkxBHuhYmcwbV3IdcVxnTWfxWp3fL+eUWssE6LLpP1c6pF1pcGTHKXKjzpLo8fGY5UKV7AufOTck4NJmCNQC/SQ3KjFzYJ2de55s2dbpSnWLD3WW9IfUktMB8vBaoQa7aj+wOvDFl7gVms73/sAPo31UOs6FBfYWncZZynReRq4Sy8t/lBdY/HM627SfdymIecL37/6ufP/pnh/o7Qfo6uN947+CrdPz88pD68V7xXX9fRPvrq/0kvtH/Gu8HPmfx3r37GcoS9qsP6ufJ/GcEZfZY3FFR1P8rB/dnmr8jUP0Rt48FAV+Zec2ZeAC2+B90rl6cMWTO1ZfI864CV7Tuh+Fx37CTgMwYSeMd9aXJwhen+0AxzQvxgmOCw8D2gYO1/1t12YMe5dfo3h2/NV6vgFXcroBg== + + + + + + + + eJxjYKAcNPJSJk9tQG/7KAUNQPc6MDEwLGYkDzsxkW5nPTSM7kL1emqhYnxgETeqXmIBsh/rmBH2wgCI/VmdgeGLOm4zdLRJtxek3hpotg0ef+mzE2cOsQAUpzD1+Mw+iyRnrMPAYKKDySbHvzCzcZmJbK8+DjYl9uIyE9nec0D2ZDYIzuOg3N4coBm5QGzEjuDD2DB7dbVR3QACsHAh116YfpB9MP9cQLPXgB3hR1j+gYULufZiS1dn0eyFuckQS1hTEs4gc0BhC/IXiEa3F9k96GUbLO+Tai8MgOwH+QEW3yC/5SKFPcyPpPoPHdQw4y9zsfmNFP/VkVFP3YXaS6nfAKsYWFc= + + + + + eJxjYBg8oIZ3oF0wCmDgujoDww116psrr8XAoKAFYTcN0vgW12FgkNDBZNPKTD1Oys0fDoDSsKZWXCGDlkGSRgeLO4gB9VRwK8y/zUPI30MJAACVSQnZ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 new file mode 100644 index 00000000000..d5c7cbd5a7b --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/maps/map/swamp_town_identity.tmx @@ -0,0 +1,111 @@ + + + + + + + + + + eJyL4GZgiBjFo3gUj+JRPIpH8YjAAH23xTs= + + + + + eJydVUtSg0AQ7QUkBCsnMH42uo0eQC8UPcKQFPfws9Rz6BY9gpp4D+0m82qaZkBwqrpggOnX7/VjppgRFT5+JkQ0DXMdxznRV0b1OOT776z9zZafHfG7D76e5vE8D5z/0WDc8fx+2swj+eW68zkxBHuhYmcwbV3IdcVxnTWfxWp3fL+eUWssE6LLpP1c6pF1pcGTHKXKjzpLo8fGY5UKV7AufOTck4NJmCNQC/SQ3KjFzYJ2de55s2dbpSnWLD3WW9IfUktMB8vBaoQa7aj+wOvDFl7gVms73/sAPo31UOs6FBfYWncZZynReRq4Sy8t/lBdY/HM627SfdymIecL37/6ufP/pnh/o7Qfo6uN947+CrdPz88pD68V7xXX9fRPvrq/0kvtH/Gu8HPmfx3r37GcoS9qsP6ufJ/GcEZfZY3FFR1P8rB/dnmr8jUP0Rt48FAV+Zec2ZeAC2+B90rl6cMWTO1ZfI864CV7Tuh+Fx37CTgMwYSeMd9aXJwhen+0AxzQvxgmOCw8D2gYO1/1t12YMe5dfo3h2/NV6vgFXcroBg== + + + + + + + + eJxjYKAcNPJSJk9tQG/7KAUNQPc6MDEwLGYkDzsxkW5nPTSM7pKhdxE3eXqR/VjHjF3NZ3UGhi/q+M0h1V6QemstBgYbLdxq9NmJM4dYAIpTmHp8Zp9FkjPWYWAw0cFkk+NfmNm4zES2Vx8HmxJ7cZmJbO85IHsyGwTncVBubw7QjFwgNmJH8GHsszjcAAKwcCHXXph+kH0w/1xAs9eAHeFHWP6BhQu59mJLV2fR7IW5yRBLWFMSziBzQGEL8heIRrcX2T3oZRuuvE/IXhgA2Q/yAyy+QX7LRQp7mB/JKduQQQ0z/jIXm99I8V8dGfXUXai9lPoNAFBAVPY= + + + + + eJxjYBg8oIZ3oF0w8GAxIyqmF/DUQsXX1RkYbqhT3x55oNkKWhB2Ey/ELmQ3DAYgrsPAIKGDyaaVmXqclJs/HAClYY1L/wUN8s1soaBMekOBvdR0B71BPRXcCvNv8xDy91ACAEHHESc= + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 new file mode 100644 index 00000000000..50309361a8a --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/maps/map/swamp_town_tribal.tmx @@ -0,0 +1,113 @@ + + + + + + + + + + eJyL4GZgiBjFo3gUj+JRPIpH8YjAAH23xTs= + + + + + eJydVUtSg0AQ7QUkBCsnMH42uo0eQC8UPcKQFPfws9Rz6BY9gpp4D+0m82qaZkBwqrpggOnX7/VjppgRFT5+JkQ0DXMdxznRV0b1OOT776z9zZafHfG7D76e5vE8D5z/0WDc8fx+2swj+eW68zkxBHuhYmcwbV3IdcVxnTWfxWp3fL+eUWssE6LLpP1c6pF1pcGTHKXKjzpLo8fGY5UKV7AufOTck4NJmCNQC/SQ3KjFzYJ2de55s2dbpSnWLD3WW9IfUktMB8vBaoQa7aj+wOvDFl7gVms73/sAPo31UOs6FBfYWncZZynReRq4Sy8t/lBdY/HM627SfdymIecL37/6ufP/pnh/o7Qfo6uN947+CrdPz88pD68V7xXX9fRPvrq/0kvtH/Gu8HPmfx3r37GcoS9qsP6ufJ/GcEZfZY3FFR1P8rB/dnmr8jUP0Rt48FAV+Zec2ZeAC2+B90rl6cMWTO1ZfI864CV7Tuh+Fx37CTgMwYSeMd9aXJwhen+0AxzQvxgmOCw8D2gYO1/1t12YMe5dfo3h2/NV6vgFXcroBg== + + + + + + + + eJy1lU0KwjAQhacNWEE8R0EK9W+nC3HnXawnkKpn8AZ6nooX6Cl0rWYwQ9K0KU2iD4JTat43b1ojgL9OQ7/7v9Y/eCH7vSfpyPtdhQDXwG2tQ3vmQcyoFHs3o+qqScl/GVT3dpWaMWeSS8L6EQM843YfWy5+f8G9l025hNKom8+7IxufKfXZ5l0o92YJwDyp1y55ydvkqXJTQ+3DNXmq3Buvz73v2vX9uVvukfE1jeQ11YWhBxTNxZVL+5FHee4adxzJjPT7obm4cpveq0LjUk8Tbdb4HrtwX6H0xNliLvzUuQGT1/rZlluepXqfyMcM9LwxW6bMnjLa5tO1Z+1nblM2m3y5w/9UKbi+2T6mSVq2 + + + + + eJxjYBg8oIZ3oF0wCmDgujoDww116psrr8XAoKAFYTcN0vgW12FgkNDBZNPKTD1Oys0fDoDSsKZWXCGDlkGSRgeLO4gB9VRwK8y/zUPI30MJAACVSQnZ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 new file mode 100644 index 00000000000..0b57007a35e --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/maps/map/waste_town_generic.tmx @@ -0,0 +1,119 @@ + + + + + + + + + + eJzt1LEKACAIBND2fti5L291iLxAU+qG29SnBElvTRiGCc1QQWp0rdXnsdMulV10FmJluFn3VnAR+zXXsrPeN8KP/h883VWfNdPj1pN9boQuXbr/uhNtp9Ws + + + + + eJzVl0tOwzAQhg0skB33DIZ1OUNRBIEjcIDCQQpH4AAFCYFyJ5AQIWtWYY1HttWJm9jTxI3ESKO4TuLvn44fk4Vk7DBj7Ej7FLYUjN0Kw5ySe5BtmODn0ui4E/tjQqwL2eZOEbcfq/MPreV5Ym5q3s1su2+tGe+yHSe2x7QStthP1sfE+t0zD3F/jdopYsq48ZjdB+KqhNF41XP12y+ad0zwV+2nsp9bcqOL6+uJ3Ljgxl0brhBjjjRcC/MueIF+QzuP7AeO+0DItZJmPBHQiPXVAfYqa3N/zsLsWBxYXxFgK6sPuJTcXQhafi+FGfctMP9Ky6XEQnnGPVdG5vy+uDFboTnYzBn7nafhhtYvmMvxJyF31Px+WS7O77JDs/LWBOgovL2jtv9Jhfqxu7lb2bXMvb0DzqXYOa9ke406HTkaE69frLOL6c7+XesMhfYDf0x3H+9v/n3/LAQ+lV1aLmVv6zL//KfWOGO564E1x1gu2JA6JxU3xvRrpbHcZjasxkkR7xD7z1z3nbTL9wmVC/Oi6aijwf4AV6hrzg== + + + + + + + + eJxjYBgFo4B2YAcLA4M0jfEuFkx7Q1lJd+sUDtLUY7ODHHtJBdS211iHgcFEB5NtpA2hYeFCjr2khik2QK9wNoT610SbcnsnU+BvYuxFjicQsNZiYLDRwtSHK25R2FTwLyWAUnvfs6PShIAGI3Y7vpJgLyXpmhT/Hga61V2TgcEDiPU4MeWJiV9y7KUG2ME2MPYi24GeD2H2EhN/hPKwjjZue4kRI6aMgKVVYgA2O76wkleHklJvf0OyF91PhMIZ3c3kpAtyylpq2EsOIMVeatSd5NhLTUCuvZT6faj5d7DYCwAfmzHo + + + + + eJzt0bERgCAUBNHtQjNI4f/+e4FqDMzUMYaZfdEFly1IWsGRcOZ7a13PTqVD7f8/O+9jBMy4dzTI9v2zryRpZxerjQgF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 new file mode 100644 index 00000000000..81d527ab343 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/maps/map/waste_town_identity.tmx @@ -0,0 +1,119 @@ + + + + + + + + + + eJzt1LEKACAIBND2fti5L291iLxAU+qG29SnBElvTRiGCc1QQWp0rdXnsdMulV10FmJluFn3VnAR+zXXsrPeN8KP/h883VWfNdPj1pN9boQuXbr/uhNtp9Ws + + + + + eJzVl0tOwzAQhg0skB33DIZ1OUNRBIEjcIDCQQpH4AAFCYFyJ5AQIWtWYY1HttWJm9jTxI3ESKO4TuLvn44fk4Vk7DBj7Ej7FLYUjN0Kw5ySe5BtmODn0ui4E/tjQqwL2eZOEbcfq/MPreV5Ym5q3s1su2+tGe+yHSe2x7QStthP1sfE+t0zD3F/jdopYsq48ZjdB+KqhNF41XP12y+ad0zwV+2nsp9bcqOL6+uJ3Ljgxl0brhBjjjRcC/MueIF+QzuP7AeO+0DItZJmPBHQiPXVAfYqa3N/zsLsWBxYXxFgK6sPuJTcXQhafi+FGfctMP9Ky6XEQnnGPVdG5vy+uDFboTnYzBn7nafhhtYvmMvxJyF31Px+WS7O77JDs/LWBOgovL2jtv9Jhfqxu7lb2bXMvb0DzqXYOa9ke406HTkaE69frLOL6c7+XesMhfYDf0x3H+9v/n3/LAQ+lV1aLmVv6zL//KfWOGO564E1x1gu2JA6JxU3xvRrpbHcZjasxkkR7xD7z1z3nbTL9wmVC/Oi6aijwf4AV6hrzg== + + + + + + + + eJxjYBgFo4B2YAcLA4M0jfEuFkx7Q1lJd+sUDtLUY7ODHHtJBdS211iHgcFEB5MNA7BwIcdeUsMUGxiK4TyZAn8TYy96PFlrMTDYaGHqwxW32OJ5KIYzCLxnR6UJAQ1G7HZ8JcFeStI1Kf49DHSruyYDgwcQ63Fiyg/m+N3BRpm9pzUosx9kB3o+hNmLL/6eQ+0lNw8T619izIelVXLt/cJKXh1KSr39DcledD8RyifobiYnPZITT9SwlxxAir3UqDvJsZeagFx7KfX7UPPvYLEXAMqrMh0= + + + + + eJzt0bERgCAUBNHtQjNI4f/+e4FqDMzUMYaZfdEFly1IWsGRcOZ7a13PTqVD7f8/O+9jBMy4dzTI9v2zryRpZxerjQgF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 new file mode 100644 index 00000000000..d73d04210c0 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/maps/map/waste_town_tribal.tmx @@ -0,0 +1,119 @@ + + + + + + + + + + eJzt1LEKACAIBND2fti5L291iLxAU+qG29SnBElvTRiGCc1QQWp0rdXnsdMulV10FmJluFn3VnAR+zXXsrPeN8KP/h883VWfNdPj1pN9boQuXbr/uhNtp9Ws + + + + + eJzVl0tOwzAQhg0skB33DIZ1OUNRBIEjcIDCQQpH4AAFCYFyJ5AQIWtWYY1HttWJm9jTxI3ESKO4TuLvn44fk4Vk7DBj7Ej7FLYUjN0Kw5ySe5BtmODn0ui4E/tjQqwL2eZOEbcfq/MPreV5Ym5q3s1su2+tGe+yHSe2x7QStthP1sfE+t0zD3F/jdopYsq48ZjdB+KqhNF41XP12y+ad0zwV+2nsp9bcqOL6+uJ3Ljgxl0brhBjjjRcC/MueIF+QzuP7AeO+0DItZJmPBHQiPXVAfYqa3N/zsLsWBxYXxFgK6sPuJTcXQhafi+FGfctMP9Ky6XEQnnGPVdG5vy+uDFboTnYzBn7nafhhtYvmMvxJyF31Px+WS7O77JDs/LWBOgovL2jtv9Jhfqxu7lb2bXMvb0DzqXYOa9ke406HTkaE69frLOL6c7+XesMhfYDf0x3H+9v/n3/LAQ+lV1aLmVv6zL//KfWOGO564E1x1gu2JA6JxU3xvRrpbHcZjasxkkR7xD7z1z3nbTL9wmVC/Oi6aijwf4AV6hrzg== + + + + + + + + eJxjYBgFo4B2YAcLA4M0jfEuFkx7Q1lJd+sUDtLUY7ODHHtJBdS211iHgcFEB5MNA7BwIcdeUsMUGxiK4TyZAn8TYy96PFlrMTDYaGHqwxW32OJ5KIYzCLxnR6UJAQ1G7HZ8JcFeStI1Kf49DHSruyYDgwcQ63Fiyg/r+GXGL/2fCcFmxKIWZAd6PoTZiy3+kM0DAXS9TEh2/ENTi80OQmL4zIcBWFrFBtDdi82OL6zk1aGk1NvfkOxF9xOhfILuZnLSIzllLTXsJQeQYi816k5y7KUmINdeSv0+1Pw7WOwFAAL/M3E= + + + + + eJzt0SEOgEAQQ9GvuAI4sLsz9w9XgdMgcCwhOJbkP1VR0aQgqQdjwpRtVr+uP80Vlvrc8+f/2AL2OHMUyHLf89/WOny9QJL01gHnWwjD + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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/quest.tx b/forge-gui/res/adventure/Shandalar/maps/obj/quest.tx new file mode 100644 index 00000000000..5653e95da83 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/maps/obj/quest.tx @@ -0,0 +1,10 @@ + + diff --git a/forge-gui/res/adventure/Shandalar/maps/obj/shardtrader.tx b/forge-gui/res/adventure/Shandalar/maps/obj/shardtrader.tx new file mode 100644 index 00000000000..2427f4a6b7c --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/maps/obj/shardtrader.tx @@ -0,0 +1,12 @@ + + diff --git a/forge-gui/res/adventure/Shandalar/maps/obj/shop.tx b/forge-gui/res/adventure/Shandalar/maps/obj/shop.tx index ec06383a74c..be6c5a1f872 100644 --- a/forge-gui/res/adventure/Shandalar/maps/obj/shop.tx +++ b/forge-gui/res/adventure/Shandalar/maps/obj/shop.tx @@ -1,11 +1,17 @@ diff --git a/forge-gui/res/adventure/Shandalar/maps/obj/spellsmith.tx b/forge-gui/res/adventure/Shandalar/maps/obj/spellsmith.tx index abc9e0dfa82..cdb43d5d9bd 100644 --- a/forge-gui/res/adventure/Shandalar/maps/obj/spellsmith.tx +++ b/forge-gui/res/adventure/Shandalar/maps/obj/spellsmith.tx @@ -1,5 +1,12 @@ diff --git a/forge-gui/res/adventure/Shandalar/maps/tileset/buildings.atlas b/forge-gui/res/adventure/Shandalar/maps/tileset/buildings.atlas index 27ac14b97fe..a5e8412b8d7 100644 --- a/forge-gui/res/adventure/Shandalar/maps/tileset/buildings.atlas +++ b/forge-gui/res/adventure/Shandalar/maps/tileset/buildings.atlas @@ -18,7 +18,10 @@ ForestTown size: 32, 32 PlainsTown xy: 96, 0 - size: 48, 48 + size: 48, 48 +PirateShop + xy: 384, 704 + size: 16, 16 WasteTown xy: 272, 128 size: 48, 48 @@ -122,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 @@ -139,6 +142,231 @@ GolemShop SliverShop xy: 368, 784 size: 16, 16 +RWBShop + xy: 304, 800 + size: 16, 16 +RWUShop + xy: 320, 800 + size: 16, 16 +RWGShop + xy: 336, 800 + size: 16, 16 +EnchantmentShop + xy: 352, 800 + size: 16, 16 +WUBRGShop + xy: 368, 800 + size: 16, 16 +RogueShop + xy: 288, 816 + size: 16, 16 +NonbasicLandShop + xy: 304, 816 + size: 16, 16 +SpaceMarineShop + xy: 320, 816 + size: 16, 16 +NecronShop + xy: 336, 816 + size: 16, 16 +ChaosShop + xy: 352, 816 + size: 16, 16 +TyranidShop + xy: 368, 816 + size: 16, 16 +M22Shop + xy: 384, 720 + size: 16, 16 +M21Shop + xy: 384, 750 + size: 16, 16 +M20Shop + xy: 384, 766 + size: 16, 16 +AssassinShop + xy: 384, 784 + size: 16, 16 +SquirrelShop + xy: 384, 800 + size: 16, 16 +DragonShop + xy: 384, 816 + size: 16, 16 +AssemblyShop + xy: 288, 832 + size: 16, 16 +VampireShop + xy: 304, 832 + size: 16, 16 +VehicleShop + xy: 320, 832 + size: 16, 16 +RUBShop + xy: 336, 832 + size: 16, 16 +RGBShop + xy: 352, 832 + size: 16, 16 +RGUShop + xy: 368, 832 + size: 16, 16 +MinotaurShop + xy: 384, 832 + size: 16, 16 +DinosaurShop + xy: 288, 848 + size: 16, 16 +UWBShop + xy: 304, 848 + size: 16, 16 +UGBShop + xy: 320, 848 + size: 16, 16 +UWGShop + xy: 336, 848 + size: 16, 16 +GWBShop + xy: 352, 848 + size: 16, 16 +DwarfShop + xy: 368, 848 + size: 16, 16 +DevilShop + xy: 384, 848 + size: 16, 16 +OgreShop + xy: 288, 864 + size: 16, 16 +EquipShop + xy: 320, 864 + size: 16, 16 +SoldierShop + xy: 336, 864 + size: 16, 16 +CardShop + xy: 352, 864 + size: 16, 16 +DnDShop + xy: 368, 864 + size: 16, 16 +DemonShop + xy: 384, 864 + size: 16, 16 +RotatingShop + xy: 288, 880 + size: 16, 16 +DruidShop + xy: 304, 880 + size: 16, 16 +WandShop + xy: 320, 880 + size: 16, 16 +BirdShop + xy: 336, 880 + size: 16, 16 +WolfShop + xy: 352, 880 + size: 16, 16 +KnightShop + xy: 368, 880 + size: 16, 16 +WallShop + xy: 384, 880 + size: 16, 16 +PlaneswalkerShop + xy: 304, 896 + size: 16, 16 +SkeletonShop + xy: 320, 896 + size: 16, 16 +SpiritShop + xy: 336, 896 + size: 16, 16 +ShamanShop + xy: 352, 896 + size: 16, 16 +WizardShop + xy: 368, 896 + size: 16, 16 +LegendShop + xy: 384, 896 + size: 16, 16 +ShardTrader + xy: 288, 896 + size: 16, 16 +Overlay8Black + xy: 400, 704 + size: 5, 16 +Overlay6Black + xy: 405, 704 + size: 5, 16 +Overlay4Black + xy: 400, 800 + size: 5,16 +Overlay2Black + xy: 405, 800 + size: 5, 16 +Overlay8Green + xy: 400, 768 + size: 5, 16 +Overlay6Green + xy: 405, 768 + size: 5, 16 +Overlay4Green + xy: 405, 864 + size: 5, 16 +Overlay2Green + xy: 405, 864 + size: 5, 16 +Overlay8Colorless + xy: 400, 784 + size: 5, 16 +Overlay6Colorless + xy: 405, 784 + size: 5, 16 +Overlay4Colorless + xy: 400, 880 + size: 5, 16 +Overlay2Colorless + xy: 405, 880 + size: 5, 16 +Overlay8Blue + xy: 400, 720 + size: 5, 16 +Overlay6Blue + xy: 405, 720 + size: 5, 16 +Overlay4Blue + xy: 400, 816 + size: 5, 16 +Overlay2Blue + xy: 405, 816 + size: 5, 16 +Overlay8Red + xy: 400, 736 + size: 5, 16 +Overlay6Red + xy: 405, 736 + size: 5, 16 +Overlay4Red + xy: 400, 832 + size: 5, 16 +Overlay2Red + xy: 405, 832 + size: 5, 16 +Overlay8White + xy: 400, 752 + size: 5, 16 +Overlay6White + xy: 405, 752 + size: 5, 16 +Overlay4White + xy: 400, 848 + size: 5, 16 +Overlay2White + xy: 405, 848 + size: 5, 16 Test xy: 128, 48 size: 32, 32 diff --git a/forge-gui/res/adventure/Shandalar/maps/tileset/buildings.png b/forge-gui/res/adventure/Shandalar/maps/tileset/buildings.png index c12d53c9e1a..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 0b6de86d73c..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 40283ac7ea5..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.tsx b/forge-gui/res/adventure/Shandalar/maps/tileset/main.tsx index 2031d1df07c..c2c7fa70f43 100644 --- a/forge-gui/res/adventure/Shandalar/maps/tileset/main.tsx +++ b/forge-gui/res/adventure/Shandalar/maps/tileset/main.tsx @@ -1,6 +1,6 @@ - - + + @@ -7061,6 +7061,12 @@ + + + + + + @@ -7107,6 +7113,11 @@ + + + + + @@ -7123,6 +7134,23 @@ + + + + + + + + + + + + + + + + + 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 7b08f7c8dba..39c48b00d57 100644 --- a/forge-gui/res/adventure/Shandalar/sprites/items.atlas +++ b/forge-gui/res/adventure/Shandalar/sprites/items.atlas @@ -26,7 +26,10 @@ CardBack size: 48, 64 Gold xy: 48, 0 - size: 16, 16 + size: 16, 16 +Shards + xy: 32, 768 + size: 16, 16 Life xy: 48, 16 size: 16, 16 @@ -48,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/ui/buyshards.png b/forge-gui/res/adventure/Shandalar/ui/buyshards.png new file mode 100644 index 00000000000..983d93548e8 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/ui/buyshards.png differ diff --git a/forge-gui/res/adventure/Shandalar/ui/hud.json b/forge-gui/res/adventure/Shandalar/ui/hud.json index fcaaa2830f6..661e84274a4 100644 --- a/forge-gui/res/adventure/Shandalar/ui/hud.json +++ b/forge-gui/res/adventure/Shandalar/ui/hud.json @@ -66,7 +66,7 @@ }, { "type": "Label", - "name": "mana", + "name": "shards", "font": "default", "width": 64, "height": 16, diff --git a/forge-gui/res/adventure/Shandalar/ui/hud.png b/forge-gui/res/adventure/Shandalar/ui/hud.png index 1a2f2f27cd8..760b385f38a 100644 Binary files a/forge-gui/res/adventure/Shandalar/ui/hud.png and b/forge-gui/res/adventure/Shandalar/ui/hud.png differ diff --git a/forge-gui/res/adventure/Shandalar/ui/hud_landscape.json b/forge-gui/res/adventure/Shandalar/ui/hud_landscape.json index dc4e6e2bbec..8eeb1b5ac50 100644 --- a/forge-gui/res/adventure/Shandalar/ui/hud_landscape.json +++ b/forge-gui/res/adventure/Shandalar/ui/hud_landscape.json @@ -66,7 +66,7 @@ }, { "type": "Label", - "name": "mana", + "name": "shards", "font": "default", "width": 64, "height": 16, diff --git a/forge-gui/res/adventure/Shandalar/ui/hud_portrait.json b/forge-gui/res/adventure/Shandalar/ui/hud_portrait.json index e7878ada17c..39e0dbd4745 100644 --- a/forge-gui/res/adventure/Shandalar/ui/hud_portrait.json +++ b/forge-gui/res/adventure/Shandalar/ui/hud_portrait.json @@ -65,7 +65,7 @@ }, { "type": "Label", - "name": "mana", + "name": "shards", "font": "default", "width": 48, "height": 3, diff --git a/forge-gui/res/adventure/Shandalar/ui/hud_portrait.png b/forge-gui/res/adventure/Shandalar/ui/hud_portrait.png index 5271045a04e..f79b5162f67 100644 Binary files a/forge-gui/res/adventure/Shandalar/ui/hud_portrait.png and b/forge-gui/res/adventure/Shandalar/ui/hud_portrait.png differ diff --git a/forge-gui/res/adventure/Shandalar/ui/inn.json b/forge-gui/res/adventure/Shandalar/ui/inn.json index b81e557962d..853932ec5fb 100644 --- a/forge-gui/res/adventure/Shandalar/ui/inn.json +++ b/forge-gui/res/adventure/Shandalar/ui/inn.json @@ -75,6 +75,26 @@ "height": 30, "x": 320, "y": 200 + }, + { + "type": "Label", + "name": "playerGold", + "style":"background", + "text": "[+Gold]", + "width": 48, + "height": 30, + "x": 420, + "y": 200 + }, + { + "type": "Label", + "name": "playerShards", + "style":"background", + "text": "[+Shards]", + "width": 48, + "height": 30, + "x": 420, + "y": 240 } ] } \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/ui/inn_portrait.json b/forge-gui/res/adventure/Shandalar/ui/inn_portrait.json index 604322efd57..eb6ba344c16 100644 --- a/forge-gui/res/adventure/Shandalar/ui/inn_portrait.json +++ b/forge-gui/res/adventure/Shandalar/ui/inn_portrait.json @@ -75,6 +75,26 @@ "height": 30, "x": 165, "y": 335 + }, + { + "type": "Label", + "name": "playerGold", + "style":"background", + "text": "[+Gold]", + "width": 128, + "height": 32, + "x": 16, + "y": 405 + }, + { + "type": "Label", + "name": "playerShards", + "style":"background", + "text": "[+Shards]", + "width": 128, + "height": 32, + "x": 16, + "y": 435 } ] } \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/ui/items.json b/forge-gui/res/adventure/Shandalar/ui/items.json index 462619238f7..c6b1ec75cc7 100644 --- a/forge-gui/res/adventure/Shandalar/ui/items.json +++ b/forge-gui/res/adventure/Shandalar/ui/items.json @@ -46,13 +46,42 @@ } , { "type": "Label", - "name": "gold", + "name": "playerGold", "style":"background", "text": "[+Gold]", "width": 48, "height": 30, "x": 420, + "y": 200 + }, + { + "type": "TextButton", + "name": "restock", + "text": "Restock", + "width": 48, + "height": 30, + "x": 420, "y": 160 + }, + { + "type": "Label", + "name": "playerShards", + "style":"background", + "text": "[+Shards]", + "width": 48, + "height": 30, + "x": 420, + "y": 240 + }, + { + "type": "Label", + "name": "shopName", + "style":"background", + "text": "A Street Market", + "width": 48, + "height": 20, + "x": 200, + "y": 0 } ] } \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/ui/items_portrait.json b/forge-gui/res/adventure/Shandalar/ui/items_portrait.json index 7f82f3f5b69..46fa09a3c34 100644 --- a/forge-gui/res/adventure/Shandalar/ui/items_portrait.json +++ b/forge-gui/res/adventure/Shandalar/ui/items_portrait.json @@ -42,17 +42,46 @@ "width": 128, "height": 32, "x": 140, - "y": 405 + "y": 435 } , { "type": "Label", - "name": "gold", - "style":"background", + "name": "playerGold", "text": "[+Gold]", "width": 128, "height": 32, "x": 16, "y": 405 + }, + { + "type": "TextButton", + "name": "restock", + "text": "Restock", + "style":"background", + "width": 128, + "height": 30, + "x": 140, + "y": 405 + }, + { + "type": "Label", + "name": "playerShards", + "text": "[+Shards]", + "style":"background", + "width": 128, + "height": 32, + "x": 16, + "y": 435 + }, + { + "type": "Label", + "name": "shopName", + "style":"background", + "text": "A Street Market", + "width": 48, + "height": 20, + "x": 200, + "y": 0 } ] } \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/ui/shardtrader.json b/forge-gui/res/adventure/Shandalar/ui/shardtrader.json new file mode 100644 index 00000000000..26205d47f6a --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/ui/shardtrader.json @@ -0,0 +1,100 @@ +{ + "width": 480, + "height": 270, + "yDown": true, + "elements": [ + { + "type": "Image", + "image": "ui/market.png", + "width": 480, + "height": 270 + }, + { + "type": "Image", + "name": "shardIcon", + "image": "ui/buyshards.png", + "x": 60, + "y": 85, + "width": 100, + "height": 100 + }, + { + "type": "TextButton", + "name": "btnBuyShardsCost", + "text": "btnBuyShardsCost", + "binding": "Status", + "width": 100, + "height": 30, + "x": 60, + "y": 200 + }, + { + "type": "Image", + "name": "sellIcon", + "image": "ui/sell.png", + "x": 190, + "y": 85, + "width": 100, + "height": 100 + }, + { + "type": "TextButton", + "name": "btnSellShardsQuantity", + "text": "btnSellShardsQuantity", + "binding": "Equip", + "width": 100, + "height": 30, + "x": 190, + "y": 200 + }, + { + "type": "Image", + "name": "leaveIcon", + "image": "ui/leave.png", + "x": 320, + "y": 85, + "width": 100, + "height": 100 + }, + { + "type": "TextButton", + "name": "done", + "text": "tr(lblBack)", + "binding": "Back", + "width": 100, + "height": 30, + "x": 320, + "y": 200 + }, + { + "type": "Label", + "name": "shopName", + "style":"background", + "text": "Shard Trader", + "width": 48, + "height": 20, + "x": 200, + "y": 0 + }, + { + "type": "Label", + "name": "playerGold", + "style":"background", + "text": "[+Gold]", + "width": 48, + "height": 30, + "x": 420, + "y": 200 + }, + { + "type": "Label", + "name": "playerShards", + "style":"background", + "text": "[+Shards]", + "width": 48, + "height": 30, + "x": 420, + "y": 240 + } + ] +} \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/ui/shardtrader_portrait.json b/forge-gui/res/adventure/Shandalar/ui/shardtrader_portrait.json new file mode 100644 index 00000000000..67ca39c0390 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/ui/shardtrader_portrait.json @@ -0,0 +1,90 @@ +{ + "width": 270, + "height": 480, + "yDown": true, + "elements": [ + { + "type": "Image", + "image": "ui/market_portrait.png", + "width": 270, + "height": 480 + }, + { + "type": "Image", + "name": "shardIcon", + "image": "ui/buyshards.png", + "x": 60, + "y": 85, + "width": 100, + "height": 100 + }, + { + "type": "TextButton", + "name": "btnBuyShardsCost", + "text": "btnBuyShardsCost", + "binding": "Status", + "width": 100, + "height": 30, + "x": 165, + "y": 105 + }, + { + "type": "Image", + "name": "sellIcon", + "image": "ui/sell.png", + "x": 60, + "y": 200, + "width": 100, + "height": 100 + }, + { + "type": "TextButton", + "name": "btnSellShardsQuantity", + "text": "btnSellShardsQuantity", + "binding": "Equip", + "width": 100, + "height": 30, + "x": 165, + "y": 220 + }, + { + "type": "Image", + "name": "leaveIcon", + "image": "ui/leave.png", + "x": 60, + "y": 315, + "width": 100, + "height": 100 + }, + { + "type": "TextButton", + "name": "done", + "text": "tr(lblBack)", + "binding": "Back", + "width": 100, + "height": 30, + "x": 165, + "y": 335 + }, + { + "type": "Label", + "name": "playerGold", + "style":"background", + "text": "[+Gold]", + "width": 128, + "height": 32, + "x": 16, + "y": 405 + }, + { + "type": "Label", + "name": "playerShards", + "style":"background", + "text": "[+Shards]", + "width": 128, + "height": 32, + "x": 16, + "y": 435 + } + ] +} \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/ui/spellsmith.json b/forge-gui/res/adventure/Shandalar/ui/spellsmith.json index 6fa071c4584..56b13b03f7b 100644 --- a/forge-gui/res/adventure/Shandalar/ui/spellsmith.json +++ b/forge-gui/res/adventure/Shandalar/ui/spellsmith.json @@ -132,18 +132,47 @@ }, { "type": "Label", - "name": "gold", - "x": 0, - "y": 0, - "width": 120, + "name": "playerGold", + "style":"background", + "x": 5, + "y": 5, + "width": 80, "height": 20 }, { "type": "TextButton", "selectable": true, - "name": "pull", + "name": "pullUsingGold", + "binding": "Status", + "text": "tr(lblDraw) [+gold]", + "x": 70, + "y": 5, + "width": 90, + "height": 20 + }, + { + "type": "Label", + "name": "playerShards", + "style":"background", + "x": 280, + "y": 5, + "width": 80, + "height": 20 + }, + { + "type": "TextButton", + "selectable": true, + "name": "pullUsingShards", "binding": "Equip", - "text": "tr(lblDraw)", + "text": "tr(lblDraw) [+shards]", + "x": 345, + "y": 5, + "width": 90, + "height": 20 + }, + { + "type": "Label", + "name": "poolSize", "x": 360, "y": 180, "width": 90, diff --git a/forge-gui/res/adventure/Shandalar/ui/spellsmith_portrait.json b/forge-gui/res/adventure/Shandalar/ui/spellsmith_portrait.json index 516e4dada05..7d78451363f 100644 --- a/forge-gui/res/adventure/Shandalar/ui/spellsmith_portrait.json +++ b/forge-gui/res/adventure/Shandalar/ui/spellsmith_portrait.json @@ -65,9 +65,9 @@ "name": "done", "text": "tr(lblBack)", "binding": "Back", - "x": 175, + "x": 180, "y": 150, - "width": 70, + "width": 90, "height": 20 }, { @@ -139,11 +139,48 @@ "height": 20 }, { + "type": "Label", + "name": "playerGold", + "style":"background", + "x": 180, + "y": 0, + "width": 90, + "height": 20 + }, + { "type": "TextButton", - "name": "pull", - "text": "tr(lblDraw)", "selectable": true, + "name": "pullUsingGold", + "binding": "Status", + "text": "tr(lblDraw) [+gold]", + "x": 180, + "y": 25, + "width": 90, + "height": 20 + }, + { + "type": "Label", + "name": "playerShards", + "style":"background", + "x": 180, + "y": 50, + "width": 90, + "height": 20 + }, + { + "type": "TextButton", + "selectable": true, + "name": "pullUsingShards", "binding": "Equip", + "text": "tr(lblDraw) [+shards]", + "x": 180, + "y": 75, + "width": 90, + "height": 20 + }, + { + "type": "Label", + "name": "poolSize", "x": 16, "y": 150, "width": 97, diff --git a/forge-gui/res/adventure/Shandalar/world/black.json b/forge-gui/res/adventure/Shandalar/world/black.json index c41e184bf76..40e9fde4182 100644 --- a/forge-gui/res/adventure/Shandalar/world/black.json +++ b/forge-gui/res/adventure/Shandalar/world/black.json @@ -60,7 +60,9 @@ ], "pointsOfInterest": [ "Black Castle", - "Swamp Town", + "Swamp Town Generic", + "Swamp Town Identity", + "Swamp Town Tribal", "Swamp Capital", "Swamp Town2", "Zombie Town", diff --git a/forge-gui/res/adventure/Shandalar/world/blue.json b/forge-gui/res/adventure/Shandalar/world/blue.json index 47c3607466f..d5189972910 100644 --- a/forge-gui/res/adventure/Shandalar/world/blue.json +++ b/forge-gui/res/adventure/Shandalar/world/blue.json @@ -51,7 +51,9 @@ ], "pointsOfInterest": [ "Blue Castle", - "Island Town", + "Island Town Generic", + "Island Town Identity", + "Island Town Tribal", "Island Capital", "NestU", "MerfolkPool", diff --git a/forge-gui/res/adventure/Shandalar/world/green.json b/forge-gui/res/adventure/Shandalar/world/green.json index a0f4709b641..c5511eb891c 100644 --- a/forge-gui/res/adventure/Shandalar/world/green.json +++ b/forge-gui/res/adventure/Shandalar/world/green.json @@ -67,7 +67,9 @@ "pointsOfInterest": [ "Green Castle", "Forest Capital", - "Forest Town", + "Forest Town Generic", + "Forest Town Identity", + "Forest Town Tribal", "ElfTown", "WurmPond", "Kavu Lair", diff --git a/forge-gui/res/adventure/Shandalar/world/items.json b/forge-gui/res/adventure/Shandalar/world/items.json index 1acdf7d9dd8..19781353bae 100644 --- a/forge-gui/res/adventure/Shandalar/world/items.json +++ b/forge-gui/res/adventure/Shandalar/world/items.json @@ -1,5 +1,50 @@ [ { + "name": "Piper's Charm", + "equipmentSlot": "Neck", + "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", "iconName": "SolRing", @@ -765,7 +810,7 @@ "commandOnUse": "teleport to poi Spawn", "iconName": "ColorlessRune", "questItem": true, - "manaNeeded": 1, + "shardsNeeded": 1, "cost": 100 }, { @@ -778,7 +823,7 @@ "commandOnUse": "teleport to poi \"Plains Capital\"", "iconName": "WhiteRune", "questItem": true, - "manaNeeded": 1, + "shardsNeeded": 1, "cost": 100 }, { @@ -791,7 +836,7 @@ "commandOnUse": "teleport to poi \"Swamp Capital\"", "iconName": "BlackRune", "questItem": true, - "manaNeeded": 1, + "shardsNeeded": 1, "cost": 100 }, { @@ -804,7 +849,7 @@ "commandOnUse": "teleport to poi \"Island Capital\"", "iconName": "BlueRune", "questItem": true, - "manaNeeded": 1, + "shardsNeeded": 1, "cost": 100 }, { @@ -817,7 +862,7 @@ "commandOnUse": "teleport to poi \"Mountain Capital\"", "iconName": "RedRune", "questItem": true, - "manaNeeded": 1, + "shardsNeeded": 1, "cost": 100 }, { @@ -830,7 +875,7 @@ "commandOnUse": "teleport to poi \"Forest Capital\"", "iconName": "GreenRune", "questItem": true, - "manaNeeded": 1, + "shardsNeeded": 1, "cost": 100 }, { @@ -844,7 +889,7 @@ "commandOnUse": "heal percent 0.5", "iconName": "WhiteStaff", "questItem": true, - "manaNeeded": 5, + "shardsNeeded": 5, "cost": 1000 }, { @@ -858,7 +903,7 @@ "commandOnUse": "hide 10", "iconName": "BlackStaff", "questItem": true, - "manaNeeded": 5, + "shardsNeeded": 5, "cost": 1000 }, { @@ -871,7 +916,7 @@ "commandOnUse": "fly 10", "iconName": "BlueStaff", "questItem": true, - "manaNeeded": 5, + "shardsNeeded": 5, "cost": 1000 }, { @@ -884,7 +929,7 @@ "commandOnUse": "remove enemy nearest", "iconName": "RedStaff", "questItem": true, - "manaNeeded": 5, + "shardsNeeded": 5, "cost": 1000 }, { @@ -898,7 +943,7 @@ "commandOnUse": "sprint 10", "iconName": "GreenStaff", "questItem": true, - "manaNeeded": 5, + "shardsNeeded": 5, "cost": 1000 } ] \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/world/points_of_interest.json b/forge-gui/res/adventure/Shandalar/world/points_of_interest.json index a8938ae5a26..f09d8f820eb 100644 --- a/forge-gui/res/adventure/Shandalar/world/points_of_interest.json +++ b/forge-gui/res/adventure/Shandalar/world/points_of_interest.json @@ -129,12 +129,57 @@ "radiusFactor": 0.5 }, { - "name": "Waste Town", + "name": "Waste Town Generic", "type": "town", - "count": 100, + "count": 30, "spriteAtlas": "maps/tileset/buildings.atlas", "sprite": "WasteTown", - "map": "maps/map/waste_town.tmx", + "map": "maps/map/waste_town_generic.tmx", + "radiusFactor": 0.8 +}, +{ + "name": "Waste Town Identity", + "type": "town", + "count": 35, + "spriteAtlas": "maps/tileset/buildings.atlas", + "sprite": "WasteTown", + "map": "maps/map/waste_town_identity.tmx", + "radiusFactor": 0.8 +}, +{ + "name": "Waste Town Tribal", + "type": "town", + "count": 35, + "spriteAtlas": "maps/tileset/buildings.atlas", + "sprite": "WasteTown", + "map": "maps/map/waste_town_tribal.tmx", + "radiusFactor": 0.8 +}, +{ + "name": "Forest Town Generic", + "type": "town", + "count": 30, + "spriteAtlas": "maps/tileset/buildings.atlas", + "sprite": "ForestTown", + "map": "maps/map/forest_town_generic.tmx", + "radiusFactor": 0.8 +}, +{ + "name": "Forest Town Identity", + "type": "town", + "count": 35, + "spriteAtlas": "maps/tileset/buildings.atlas", + "sprite": "ForestTown", + "map": "maps/map/forest_town_identity.tmx", + "radiusFactor": 0.8 +}, +{ + "name": "Forest Town Tribal", + "type": "town", + "count": 35, + "spriteAtlas": "maps/tileset/buildings.atlas", + "sprite": "ForestTown", + "map": "maps/map/forest_town_tribal.tmx", "radiusFactor": 0.8 }, { @@ -147,6 +192,32 @@ "radiusFactor": 0.8 }, { + "name": "Plains Town Generic", + "type": "town", + "count": 30, + "spriteAtlas": "maps/tileset/buildings.atlas", + "sprite": "PlainsTown", + "map": "maps/map/plains_town_generic.tmx", + "radiusFactor": 0.8 +}, +{ + "name": "Plains Town Identity", + "type": "town", + "count": 35, + "spriteAtlas": "maps/tileset/buildings.atlas", + "sprite": "PlainsTown", + "map": "maps/map/plains_town_identity.tmx", + "radiusFactor": 0.8 +}, +{ + "name": "Plains Town Tribal", + "type": "town", + "count": 35, + "spriteAtlas": "maps/tileset/buildings.atlas", + "sprite": "PlainsTown", + "map": "maps/map/plains_town_tribal.tmx", + "radiusFactor": 0.8 +},{ "name": "Plains Town", "type": "town", "count": 100, @@ -156,6 +227,32 @@ "radiusFactor": 0.8 }, { + "name": "Island Town Generic", + "type": "town", + "count": 30, + "spriteAtlas": "maps/tileset/buildings.atlas", + "sprite": "IslandTown", + "map": "maps/map/island_town_generic.tmx", + "radiusFactor": 0.8 +}, +{ + "name": "Island Town Identity", + "type": "town", + "count": 35, + "spriteAtlas": "maps/tileset/buildings.atlas", + "sprite": "IslandTown", + "map": "maps/map/island_town_identity.tmx", + "radiusFactor": 0.8 +}, +{ + "name": "Island Town Tribal", + "type": "town", + "count": 35, + "spriteAtlas": "maps/tileset/buildings.atlas", + "sprite": "IslandTown", + "map": "maps/map/island_town_tribal.tmx", + "radiusFactor": 0.8 +},{ "name": "Island Town", "type": "town", "count": 100, @@ -165,6 +262,32 @@ "radiusFactor": 0.8 }, { + "name": "Mountain Town Generic", + "type": "town", + "count": 30, + "spriteAtlas": "maps/tileset/buildings.atlas", + "sprite": "MountainTown", + "map": "maps/map/mountain_town_generic.tmx", + "radiusFactor": 0.8 +}, +{ + "name": "Mountain Town Identity", + "type": "town", + "count": 35, + "spriteAtlas": "maps/tileset/buildings.atlas", + "sprite": "MountainTown", + "map": "maps/map/mountain_town_identity.tmx", + "radiusFactor": 0.8 +}, +{ + "name": "Mountain Town Tribal", + "type": "town", + "count": 35, + "spriteAtlas": "maps/tileset/buildings.atlas", + "sprite": "MountainTown", + "map": "maps/map/mountain_town_tribal.tmx", + "radiusFactor": 0.8 +},{ "name": "Mountain Town", "type": "town", "count": 100, @@ -173,6 +296,33 @@ "map": "maps/map/mountain_town.tmx", "radiusFactor": 0.8 }, +{ + "name": "Swamp Town Generic", + "type": "town", + "count": 30, + "spriteAtlas": "maps/tileset/buildings.atlas", + "sprite": "SwampTown", + "map": "maps/map/swamp_town_generic.tmx", + "radiusFactor": 0.8 +}, +{ + "name": "Swamp Town Identity", + "type": "town", + "count": 35, + "spriteAtlas": "maps/tileset/buildings.atlas", + "sprite": "SwampTown", + "map": "maps/map/swamp_town_identity.tmx", + "radiusFactor": 0.8 +}, +{ + "name": "Swamp Town Tribal", + "type": "town", + "count": 35, + "spriteAtlas": "maps/tileset/buildings.atlas", + "sprite": "SwampTown", + "map": "maps/map/Swamp_town_tribal.tmx", + "radiusFactor": 0.8 +}, { "name": "Swamp Town", "type": "town", diff --git a/forge-gui/res/adventure/Shandalar/world/red.json b/forge-gui/res/adventure/Shandalar/world/red.json index 463d7896250..a7aeb5413d4 100644 --- a/forge-gui/res/adventure/Shandalar/world/red.json +++ b/forge-gui/res/adventure/Shandalar/world/red.json @@ -65,7 +65,9 @@ ], "pointsOfInterest": [ "Red Castle", - "Mountain Town", + "Mountain Town Generic", + "Mountain Town Identity", + "Mountain Town Tribal", "Mountain Capital", "YuleTown", "BarbarianCamp", diff --git a/forge-gui/res/adventure/Shandalar/world/shops.json b/forge-gui/res/adventure/Shandalar/world/shops.json index d993df9465c..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 } ] @@ -144,8 +709,10 @@ ] -},{ -"name":"Swamp", +}, +{ +"name":"Swamp", +"description":"The Cartographer's Guild", "spriteAtlas":"maps/tileset/buildings.atlas", "sprite":"LandShop", "unlimited":true, @@ -158,7 +725,8 @@ }] },{ -"name":"Forest", +"name":"Forest", +"description":"The Cartographer's Guild", "spriteAtlas":"maps/tileset/buildings.atlas", "sprite":"LandShop", "unlimited":true, @@ -171,7 +739,8 @@ }] },{ -"name":"Mountain", +"name":"Mountain", +"description":"The Cartographer's Guild", "spriteAtlas":"maps/tileset/buildings.atlas", "sprite":"LandShop", "unlimited":true, @@ -185,6 +754,7 @@ },{ "name":"Island", +"description":"The Cartographer's Guild", "spriteAtlas":"maps/tileset/buildings.atlas", "sprite":"LandShop", "unlimited":true, @@ -198,6 +768,7 @@ },{ "name":"Plains", +"description":"The Cartographer's Guild", "spriteAtlas":"maps/tileset/buildings.atlas", "sprite":"LandShop", "unlimited":true, @@ -211,6 +782,7 @@ },{ "name":"Instant", +"description":"Buy-it-now!!!", "spriteAtlas":"maps/tileset/buildings.atlas", "sprite":"InstantShop", "rewards": [ @@ -219,8 +791,159 @@ "cardTypes": ["Instant","Sorcery"] }] +},{ +"name":"Instant4Black", +"description":"Sudden Death", +"spriteAtlas":"maps/tileset/buildings.atlas", +"sprite":"InstantShop", +"overlaySprite":"Overlay4Black", + "rewards": [ + { + "count":4, + "cardTypes": ["Instant","Sorcery"] + }, + { + "count":4, + "cardTypes": ["Instant","Sorcery"], + "colors": ["black"] + }] + +},{ +"name":"Instant4Blue", +"description":"Mind Games", +"spriteAtlas":"maps/tileset/buildings.atlas", +"sprite":"InstantShop", +"overlaySprite":"Overlay4Blue", + "rewards": [ + { + "count":4, + "cardTypes": ["Instant","Sorcery"] + }, + { + "count":4, + "cardTypes": ["Instant","Sorcery"], + "colors": ["blue"] + }] + +},{ +"name":"Instant4Green", +"description":"Primal Commands", +"spriteAtlas":"maps/tileset/buildings.atlas", +"sprite":"InstantShop", +"overlaySprite":"Overlay4Green", + "rewards": [ + { + "count":4, + "cardTypes": ["Instant","Sorcery"] + }, + { + "count":4, + "cardTypes": ["Instant","Sorcery"], + "colors": ["green"] + }] + +},{ +"name":"Instant4Red", +"description":"Furnace of Rath", +"spriteAtlas":"maps/tileset/buildings.atlas", +"sprite":"InstantShop", +"overlaySprite":"Overlay4Red", + "rewards": [ + { + "count":4, + "cardTypes": ["Instant","Sorcery"] + }, + { + "count":4, + "cardTypes": ["Instant","Sorcery"], + "colors": ["red"] + }] + +},{ +"name":"Instant4White", +"description":"Gerrard's Wisdom", +"spriteAtlas":"maps/tileset/buildings.atlas", +"sprite":"InstantShop", +"overlaySprite":"Overlay4White", + "rewards": [ + { + "count":4, + "cardTypes": ["Instant","Sorcery"] + }, + { + "count":4, + "cardTypes": ["Instant","Sorcery"], + "colors": ["white"] + }] + +},{ +"name":"Instant8Black", +"description":"Sudden Death", +"spriteAtlas":"maps/tileset/buildings.atlas", +"sprite":"InstantShop", +"overlaySprite":"Overlay8Black", + "rewards": [ + { + "count":8, + "cardTypes": ["Instant","Sorcery"], + "colors": ["black"] + }] + +},{ +"name":"Instant8Blue", +"description":"Mind Games", +"spriteAtlas":"maps/tileset/buildings.atlas", +"sprite":"InstantShop", +"overlaySprite":"Overlay8Blue", + "rewards": [ + { + "count":8, + "cardTypes": ["Instant","Sorcery"], + "colors": ["blue"] + }] + +},{ +"name":"Instant8Green", +"description":"Primal Commands", +"spriteAtlas":"maps/tileset/buildings.atlas", +"sprite":"InstantShop", +"overlaySprite":"Overlay8Green", + "rewards": [ + { + "count":8, + "cardTypes": ["Instant","Sorcery"], + "colors": ["green"] + }] + +},{ +"name":"Instant8Red", +"description":"Furnace of Rath", +"spriteAtlas":"maps/tileset/buildings.atlas", +"sprite":"InstantShop", +"overlaySprite":"Overlay8Red", + "rewards": [ + { + "count":8, + "cardTypes": ["Instant","Sorcery"], + "colors": ["red"] + }] + +},{ +"name":"Instant8White", +"description":"Gerrard's Wisdom", +"spriteAtlas":"maps/tileset/buildings.atlas", +"sprite":"InstantShop", +"overlaySprite":"Overlay8White", + "rewards": [ + { + "count":8, + "cardTypes": ["Instant","Sorcery"], + "colors": ["white"] + }] + },{ "name":"Creature", +"description":"The Menagerie", "spriteAtlas":"maps/tileset/buildings.atlas", "sprite":"CreatureShop", "rewards": [ @@ -229,44 +952,431 @@ "cardTypes": ["Creature"] }] },{ -"name":"Land", +"name":"Creature2Colorless", +"description":"Junk Market", "spriteAtlas":"maps/tileset/buildings.atlas", -"sprite":"LandShop", +"sprite":"CreatureShop", +"overlaySprite":"Overlay2Colorless", "rewards": [ { + "count":6, + "cardTypes": ["Creature"] + }, + { + "count":2, + "cardTypes": ["Creature"], + "colorType": "Colorless" + }] +},{ +"name":"Creature2Eldrazi", +"description": "Eldritch Emissaries" +"spriteAtlas":"maps/tileset/buildings.atlas", +"sprite":"CreatureShop", +"overlaySprite":"Overlay2Colorless", + "rewards": [ + { + "count":6, + "cardTypes": ["Creature"] + }, + { + "count":2, + "subTypes": ["Eldrazi"] + }] +},{ +"name":"Creature2Black", +"description":"The Boneyard", +"spriteAtlas":"maps/tileset/buildings.atlas", +"sprite":"CreatureShop", +"overlaySprite":"Overlay2Black", + "rewards": [ + { + "count":6, + "cardTypes": ["Creature"] + }, + { + "count":2, + "cardTypes": ["Creature"], + "colors": ["black"] + }] +},{ +"name":"Creature6Black", +"description":"Tomb Of Yawgmoth", +"spriteAtlas":"maps/tileset/buildings.atlas", +"sprite":"CreatureShop", +"overlaySprite":"Overlay6Black", + "rewards": [ + { + "count":2, + "cardTypes": ["Creature"] + }, + { + "count":6, + "cardTypes": ["Creature"], + "colors": ["black"] + }] +},{ +"name":"Creature8Black", +"description":"Tomb Of Yawgmoth", +"spriteAtlas":"maps/tileset/buildings.atlas", +"sprite":"CreatureShop", +"overlaySprite":"Overlay8Black", + "rewards": [ + { "count":8, + "cardTypes": ["Creature"], + "colors": ["black"] + }] +}, +{ +"name":"Creature2Blue", +"description":"Riverside Market", +"spriteAtlas":"maps/tileset/buildings.atlas", +"sprite":"CreatureShop", +"overlaySprite":"Overlay2Blue", + "rewards": [ + { + "count":6, + "cardTypes": ["Creature"] + }, + { + "count":2, + "cardTypes": ["Creature"], + "colors": ["blue"] + }] +},{ +"name":"Creature6Blue", +"description":"The Yawning Depths", +"spriteAtlas":"maps/tileset/buildings.atlas", +"sprite":"CreatureShop", +"overlaySprite":"Overlay6Blue", + "rewards": [ + { + "count":2, + "cardTypes": ["Creature"] + }, + { + "count":6, + "cardTypes": ["Creature"], + "colors": ["blue"] + }] +},{ +"name":"Creature8Blue", +"description":"The Yawning Depths", +"spriteAtlas":"maps/tileset/buildings.atlas", +"sprite":"CreatureShop", +"overlaySprite":"Overlay8Blue", + "rewards": [ + { + "count":8, + "cardTypes": ["Creature"], + "colors": ["blue"] + }] +},{ +"name":"Creature2Green", +"description":"Hunter's Glade", +"spriteAtlas":"maps/tileset/buildings.atlas", +"sprite":"CreatureShop", +"overlaySprite":"Overlay2Green", + "rewards": [ + { + "count":6, + "cardTypes": ["Creature"] + }, + { + "count":2, + "cardTypes": ["Creature"], + "colors": ["green"] + }] +},{ +"name":"Creature6Green", +"description":"Natural Order", +"spriteAtlas":"maps/tileset/buildings.atlas", +"sprite":"CreatureShop", +"overlaySprite":"Overlay6Green", + "rewards": [ + { + "count":2, + "cardTypes": ["Creature"] + }, + { + "count":6, + "cardTypes": ["Creature"], + "colors": ["green"] + }] +},{ +"name":"Creature8Green", +"description":"Natural Order", +"spriteAtlas":"maps/tileset/buildings.atlas", +"sprite":"CreatureShop", +"overlaySprite":"Overlay8Green", + "rewards": [ + { + "count":8, + "cardTypes": ["Creature"], + "colors": ["green"] + }] +},{ +"name":"Creature2Red", +"description":"Hillside Traders", +"spriteAtlas":"maps/tileset/buildings.atlas", +"sprite":"CreatureShop", +"overlaySprite":"Overlay2Red", + "rewards": [ + { + "count":6, + "cardTypes": ["Creature"] + }, + { + "count":2, + "cardTypes": ["Creature"], + "colors": ["red"] + }] +},{ +"name":"Creature6Red", +"description":"Furious Assault", +"spriteAtlas":"maps/tileset/buildings.atlas", +"sprite":"CreatureShop", +"overlaySprite":"Overlay6Red", + "rewards": [ + { + "count":2, + "cardTypes": ["Creature"] + }, + { + "count":6, + "cardTypes": ["Creature"], + "colors": ["red"] + }] +},{ +"name":"Creature8Red", +"description":"Furious Assault", +"spriteAtlas":"maps/tileset/buildings.atlas", +"sprite":"CreatureShop", +"overlaySprite":"Overlay8Red", + "rewards": [ + { + "count":2, + "cardTypes": ["Creature"] + }, + { + "count":8, + "cardTypes": ["Creature"], + "colors": ["red"] + }] +},{ +"name":"Creature2White", +"description":"Countryside Farms", +"spriteAtlas":"maps/tileset/buildings.atlas", +"sprite":"CreatureShop", +"overlaySprite":"Overlay2White", + "rewards": [ + { + "count":6, + "cardTypes": ["Creature"] + }, + { + "count":2, + "cardTypes": ["Creature"], + "colors": ["white"] + }] +},{ +"name":"Creature6White", +"description":"Heavenly Host", +"spriteAtlas":"maps/tileset/buildings.atlas", +"sprite":"CreatureShop", +"overlaySprite":"Overlay6White", + "rewards": [ + { + "count":2, + "cardTypes": ["Creature"] + }, + { + "count":6, + "cardTypes": ["Creature"], + "colors": ["white"] + }] +},{ +"name":"Creature8White", +"description":"Heavenly Host", +"spriteAtlas":"maps/tileset/buildings.atlas", +"sprite":"CreatureShop", +"overlaySprite":"Overlay8White", + "rewards": [ + { + "count":8, + "cardTypes": ["Creature"], + "colors": ["white"] + }] +},{ + "name":"Land4Blue", + "description":"Oceanside Property", + "spriteAtlas":"maps/tileset/buildings.atlas", + "sprite":"NonbasicLandShop", + "overlaySprite":"Overlay4Blue", + "rewards": [ + { + "count":4, + "cardTypes": ["Land"], + "cardText": "\\Q{\\EU\\Q\\E}" + }, + { + "count":4, "cardTypes": ["Land"] }] -},{ -"name":"Colorless", -"spriteAtlas":"maps/tileset/buildings.atlas", -"sprite":"ColorlessShop", +},{ + "name":"Land8Blue", + "description":"20,000 Leagues", + "spriteAtlas":"maps/tileset/buildings.atlas", + "sprite":"NonbasicLandShop", + "overlaySprite":"Overlay8Blue", "rewards": [ { "count":8, - "colorType": "Colorless" + "cardTypes": ["Land"], + "cardText": "\\Q{\\EU\\Q\\E}" }] -},{ -"name":"Artifact", -"spriteAtlas":"maps/tileset/buildings.atlas", -"sprite":"ArtifactShop", +},{ + "name":"Land4Black", + "description":"Boggy Depths", + "spriteAtlas":"maps/tileset/buildings.atlas", + "sprite":"NonbasicLandShop", + "overlaySprite":"Overlay4Black", + "rewards": [ + { + "count":4, + "cardTypes": ["Land"], + "cardText": "\\Q{\\EB\\Q\\E}" + }, + { + "count":4, + "cardTypes": ["Land"] + }] +},{ + "name":"Land8Black", + "description":"Heart of Darkness", + "spriteAtlas":"maps/tileset/buildings.atlas", + "sprite":"NonbasicLandShop", + "overlaySprite":"Overlay8Black", "rewards": [ { "count":8, - "colorType": "Colorless", - "cardTypes": ["Artifact"] + "cardTypes": ["Land"], + "cardText": "\\Q{\\EB\\Q\\E}" }] -},{ -"name":"Multicolor", -"spriteAtlas":"maps/tileset/buildings.atlas", -"sprite":"MultiColorShop", +},{ + "name":"Land4Red", + "description":"Mon's Warrens", + "spriteAtlas":"maps/tileset/buildings.atlas", + "sprite":"NonbasicLandShop", + "overlaySprite":"Overlay4Red", + "rewards": [ + { + "count":4, + "cardTypes": ["Land"], + "cardText": "\\Q{\\ER\\Q\\E}" + }, + { + "count":4, + "cardTypes": ["Land"] + }] +},{ + "name":"Land8Red", + "description":"Volcanic Vistas", + "spriteAtlas":"maps/tileset/buildings.atlas", + "sprite":"NonbasicLandShop", + "overlaySprite":"Overlay8Red", "rewards": [ { "count":8, - "colorType": "MultiColor" + "cardTypes": ["Land"], + "cardText": "\\Q{\\ER\\Q\\E}" }] +},{ + "name":"Land4Green", + "description":"Green Acres", + "spriteAtlas":"maps/tileset/buildings.atlas", + "sprite":"NonbasicLandShop", + "overlaySprite":"Overlay4Green", + "rewards": [ + { + "count":4, + "cardTypes": ["Land"], + "cardText": "\\Q{\\EG\\Q\\E}" + }, + { + "count":4, + "cardTypes": ["Land"] + }] +},{ + "name":"Land8Green", + "description":"Gaea's Gifts", + "spriteAtlas":"maps/tileset/buildings.atlas", + "sprite":"NonbasicLandShop", + "overlaySprite":"Overlay8Green", + "rewards": [ + { + "count":8, + "cardTypes": ["Land"], + "cardText": "\\Q{\\EG\\Q\\E}" + }] +},{ + "name":"Land4White", + "description":"Planes & Plowshares", + "spriteAtlas":"maps/tileset/buildings.atlas", + "sprite":"NonbasicLandShop", + "overlaySprite":"Overlay4White", + "rewards": [ + { + "count":4, + "cardTypes": ["Land"], + "cardText": "\\Q{\\EW\\Q\\E}" + }, + { + "count":4, + "cardTypes": ["Land"] + }] +},{ + "name":"Land8White", + "description":"Spiritual Sanctuary", + "spriteAtlas":"maps/tileset/buildings.atlas", + "sprite":"NonbasicLandShop", + "overlaySprite":"Overlay8White", + "rewards": [ + { + "count":8, + "cardTypes": ["Land"], + "cardText": "\\Q{\\EW\\Q\\E}" + }] +},{ + "name":"Land4Colorless", + "description":"The Flowering Wastes", + "spriteAtlas":"maps/tileset/buildings.atlas", + "sprite":"NonbasicLandShop", + "overlaySprite":"Overlay4Colorless", + "rewards": [ + { + "count":4, + "type":"Union", + "cardUnion": [ + { + "count":1, + "cardTypes": ["Land"], + "cardText": "\\Q{\\EC\\Q\\E}" + }, + { + "count":1, + "cardTypes": ["Land"], + "cardText": "\\Q{\\E1\\Q\\E}" + } + ] + }, + { + "count":4, + "cardTypes": ["Land"] + }] },{ "name":"Green", +"description":"Abundant Growth", "spriteAtlas":"maps/tileset/buildings.atlas", "sprite":"GreenShop", "rewards": [ @@ -276,6 +1386,7 @@ }] },{ "name":"Red", +"description":"Circle of Flame", "spriteAtlas":"maps/tileset/buildings.atlas", "sprite":"RedShop", "rewards": [ @@ -285,6 +1396,7 @@ }] },{ "name":"Black", +"description":"Font of Agonies", "spriteAtlas":"maps/tileset/buildings.atlas", "sprite":"BlackShop", "rewards": [ @@ -294,6 +1406,7 @@ }] },{ "name":"White", +"description":"Circle of Protection", "spriteAtlas":"maps/tileset/buildings.atlas", "sprite":"WhiteShop", "rewards": [ @@ -303,6 +1416,7 @@ }] },{ "name":"Blue", +"description":"Hermitic Study", "spriteAtlas":"maps/tileset/buildings.atlas", "sprite":"BlueShop", "rewards": [ @@ -310,8 +1424,9 @@ "count":8, "colors": ["blue"] }] -} ,{ +},{ "name":"Azorius", +"description":"Azorious Shop, LLC", "spriteAtlas":"maps/tileset/buildings.atlas", "sprite":"AzoriusShop", "rewards": [ @@ -326,6 +1441,7 @@ }] },{ "name":"Dimir", +"description":"Dimir Prospects", "spriteAtlas":"maps/tileset/buildings.atlas", "sprite":"DimirShop", "rewards": [ @@ -340,6 +1456,7 @@ }] },{ "name":"Rakdos", +"description":"The Rakdos Carnival", "spriteAtlas":"maps/tileset/buildings.atlas", "sprite":"RakdosShop", "rewards": [ @@ -354,6 +1471,7 @@ }] },{ "name":"Gruul", +"description":"Gruul Fire Sale", "spriteAtlas":"maps/tileset/buildings.atlas", "sprite":"GruulShop", "rewards": [ @@ -368,6 +1486,7 @@ }] },{ "name":"Selesnya", +"description":"A Token Selesnya Shop", "spriteAtlas":"maps/tileset/buildings.atlas", "sprite":"SelesnyaShop", "rewards": [ @@ -382,6 +1501,7 @@ }] },{ "name":"Orzhov", +"description":"Orzhov Extortion", "spriteAtlas":"maps/tileset/buildings.atlas", "sprite":"OrzhovShop", "rewards": [ @@ -396,6 +1516,7 @@ }] },{ "name":"Izzet", +"description":"Izzet For Sale?", "spriteAtlas":"maps/tileset/buildings.atlas", "sprite":"IzzetShop", "rewards": [ @@ -410,6 +1531,7 @@ }] } ,{ "name":"Golgari", +"description":"The Golgari Graveyard", "spriteAtlas":"maps/tileset/buildings.atlas", "sprite":"GolgariShop", "rewards": [ @@ -424,6 +1546,7 @@ }] },{ "name":"Boros", +"description":"Ravnican Foreign Legion", "spriteAtlas":"maps/tileset/buildings.atlas", "sprite":"BorosShop", "rewards": [ @@ -438,6 +1561,7 @@ }] },{ "name":"Simic", +"description":"Simic Research Lab", "spriteAtlas":"maps/tileset/buildings.atlas", "sprite":"SimicShop", "rewards": [ @@ -450,53 +1574,332 @@ "colors": ["blue","green"], "colorType": "MultiColor" }] +},{ + "name":"RWB", + "description":"Mardu Mercantile", + "spriteAtlas":"maps/tileset/buildings.atlas", + "sprite":"RWBShop", + "rewards": [ + { + "count":4, + "colors": ["red","white","black"], + "colorType": "MultiColor", + "matchAllColors": "true" + }, + { + "count":4, + "colors": ["red","white","black"], + "colorType": "MultiColor", + }] +},{ + "name":"RWU", + "description":"Jeskai Wayfinders", + "spriteAtlas":"maps/tileset/buildings.atlas", + "sprite":"RWUShop", + "rewards": [ + { + "count":4, + "colors": ["blue","red","white"], + "colorType": "MultiColor", + "matchAllColors": "true" + }, + { + "count":4, + "colors": ["blue","red","white"], + "colorType": "MultiColor", + }] +},{ + "name":"RWG", + "description":"Caberetti Curios", + "spriteAtlas":"maps/tileset/buildings.atlas", + "sprite":"RWGShop", + "rewards": [ + { + "count":4, + "colors": ["green","red","white"], + "colorType": "MultiColor", + "matchAllColors": "true" + }, + { + "count":4, + "colors": ["green","red","white"], + "colorType": "MultiColor" + }] +},{ + "name":"RUB", + "description":"Grixis General Store", + "spriteAtlas":"maps/tileset/buildings.atlas", + "sprite":"RUBShop", + "rewards": [ + { + "count":4, + "colors": ["red","blue","black"], + "colorType": "MultiColor", + "matchAllColors": "true" + }, + { + "count":4, + "colors": ["red","blue","black"], + "colorType": "MultiColor" + }] +},{ + "name":"RGB", + "description":"Rosie's Riveteers", + "spriteAtlas":"maps/tileset/buildings.atlas", + "sprite":"RGBShop", + "rewards": [ + { + "count":4, + "colors": ["red","green","black"], + "colorType": "MultiColor", + "matchAllColors": "true" + }, + { + "count":4, + "colors": ["red","green","black"], + "colorType": "MultiColor" + }] +},{ + "name":"RGU", + "description":"Frontier Necessities", + "spriteAtlas":"maps/tileset/buildings.atlas", + "sprite":"RGUShop", + "rewards": [ + { + "count":4, + "colors": ["red","blue","green"], + "colorType": "MultiColor", + "matchAllColors": "true" + }, + { + "count":4, + "colors": ["red","blue","green"], + "colorType": "MultiColor" + }] +},{ + "name":"UGB", + "description":"Sultai Supply", + "spriteAtlas":"maps/tileset/buildings.atlas", + "sprite":"UGBShop", + "rewards": [ + { + "count":4, + "colors": ["blue","green","black"], + "colorType": "MultiColor", + "matchAllColors": "true" + }, + { + "count":4, + "colors": ["blue","green","black"], + "colorType": "MultiColor" + }] +},{ + "name":"UWG", + "description":"Bant Bazaar", + "spriteAtlas":"maps/tileset/buildings.atlas", + "sprite":"UWGShop", + "rewards": [ + { + "count":4, + "colors": ["blue","white","green"], + "colorType": "MultiColor", + "matchAllColors": "true" + }, + { + "count":4, + "colors": ["blue","white","green"], + "colorType": "MultiColor" + }] +},{ + "name":"UWB", + "description":"Esper Etcetera", + "spriteAtlas":"maps/tileset/buildings.atlas", + "sprite":"UWBShop", + "rewards": [ + { + "count":4, + "colors": ["blue","white","black"], + "colorType": "MultiColor", + "matchAllColors": "true" + }, + { + "count":4, + "colors": ["blue","white","black"], + "colorType": "MultiColor" + }] +},{ + "name":"GWB", + "description":"Abzan Armory", + "spriteAtlas":"maps/tileset/buildings.atlas", + "sprite":"GWBShop", + "rewards": [ + { + "count":4, + "colors": ["green","white","black"], + "colorType": "MultiColor", + "matchAllColors": "true" + }, + { + "count":4, + "colors": ["green","white","black"], + "colorType": "MultiColor" + }] +},{ + "name":"WUBRG", + "description":"Domain of Dominaria", + "spriteAtlas":"maps/tileset/buildings.atlas", + "sprite":"WUBRGShop", + "rewards": [ + { + "count":8, + "colors": ["blue","green","red","white","black"], + "colorType": "MultiColor", + "matchAllColors": "true" + }] },{ -"name":"Goblin", +"name":"Goblin", +"description":"Squee's Sundries", "spriteAtlas":"maps/tileset/buildings.atlas", "sprite":"GoblinShop", "rewards": [ { - "count":8, - "subTypes": ["Goblin"] - }] + "count":8, + "type":"Union", + "cardUnion": [ + { + "count":1, + "subTypes": ["Goblin"] + }, + { + "count":1, + "cardText": "Goblin" + } + ] + }] } ,{ -"name":"Elf", +"name":"Elf", +"description":"Elf On A Shelf", "spriteAtlas":"maps/tileset/buildings.atlas", "sprite":"ElfShop", "rewards": [ { - "count":8, - "subTypes": ["Elf"] - }] + "count":8, + "type":"Union", + "cardUnion": [ + { + "count":1, + "subTypes": ["Elf"] + }, + { + "count":1, + "cardText": "Elf" + }, + { + "count":1, + "cardText": "Elves" + } + ] + }] },{ "name":"Merfolk", +"description":"Catch O' The Day", "spriteAtlas":"maps/tileset/buildings.atlas", "sprite":"MerfolkShop", "rewards": [ { - "count":8, - "subTypes": ["Merfolk"] - }] + "count":8, + "type":"Union", + "cardUnion": [ + { + "count":1, + "subTypes": ["Merfolk"] + }, + { + "count":1, + "cardText": "Merfolk" + } + ] + }] },{ "name":"Zombie", +"description":"Braaaaaains???", "spriteAtlas":"maps/tileset/buildings.atlas", "sprite":"ZombieShop", "rewards": [ { - "count":8, - "subTypes": ["Zombie"] - }] + "count":8, + "type":"Union", + "cardUnion": [ + { + "count":1, + "subTypes": ["Zombie"] + }, + { + "count":1, + "cardText": "Zombie" + } + ] + }] },{ "name":"Human", +"description":"Adam & Eve's", "spriteAtlas":"maps/tileset/buildings.atlas", "sprite":"HumanShop", "rewards": [ { - "count":8, - "subTypes": ["Human"] - }] + "count":8, + "type":"Union", + "cardUnion": [ + { + "count":1, + "subTypes": ["Human"] + }, + { + "count":1, + "cardText": "Human" + } + ] + }] +}, +{ +"name":"Human4White", +"description":"Fresh Volunteers", +"spriteAtlas":"maps/tileset/buildings.atlas", +"sprite":"HumanShop", + "rewards": [ + { + "count":4, + "type":"Union", + "cardUnion": [ + { + "count":1, + "subTypes": ["Human"] + }, + { + "count":1, + "cardText": "Human" + } + ] + }, + { + "count":4, + "type":"Union", + "cardUnion": [ + { + "count":1, + "subTypes": ["Human"], + "colors": ["white"] + }, + { + "count":1, + "cardText": "Human", + "colors": ["white"] + } + ] + }] },{ "name":"Angel", + "description":"Halos R' Us", "spriteAtlas":"maps/tileset/buildings.atlas", "sprite":"AngelShop", "rewards": [ @@ -506,6 +1909,7 @@ }] },{ "name":"Golem", + "description":"Karn's Workshop", "spriteAtlas":"maps/tileset/buildings.atlas", "sprite":"GolemShop", "rewards": [ @@ -514,13 +1918,2950 @@ "subTypes": ["Golem"] }] },{ - "name":"Sliver", + "name":"Assembly", + "description":"Assembly Required", "spriteAtlas":"maps/tileset/buildings.atlas", - "sprite":"SliverShop", + "sprite":"AssemblyShop", "rewards": [ { "count":8, - "subTypes": ["Sliver"] + "subTypes": ["Myr","Construct","Assembly-Worker"] + }] +},{ + "name":"Wall", + "description":"Wall Mart", + "spriteAtlas":"maps/tileset/buildings.atlas", + "sprite":"WallShop", + "rewards": [ + { + "count":8, + "subTypes": ["Wall"] + }] +},{ + "name":"Sliver", + "description":"Sliver Hive", + "spriteAtlas":"maps/tileset/buildings.atlas", + "sprite":"SliverShop", + "rewards": [ + { + "count":8, + "type":"Union", + "cardUnion": [ + { + "count":1, + "subTypes": ["Sliver"] + }, + { + "count":1, + "cardText": "Sliver" + } + ] + }] +},{ + "name":"Sliver2Black", + "description":"Plagued Hive", + "spriteAtlas":"maps/tileset/buildings.atlas", + "sprite":"SliverShop", + "overlaySprite":"Overlay2Black", + "rewards": [ + { + "count":6, + "type":"Union", + "cardUnion": [ + { + "count":1, + "subTypes": ["Sliver"] + }, + { + "count":1, + "cardText": "Sliver" + } + ] + }, + { + "count":2, + "type":"Union", + "cardUnion": [ + { + "count":1, + "subTypes": ["Sliver"], + "colors": ["black"] + }, + { + "count":1, + "cardText": "Sliver", + "colors": ["black"] + } + ] + }] +},{ + "name":"Sliver2Blue", + "description":"Shifting Hive", + "spriteAtlas":"maps/tileset/buildings.atlas", + "sprite":"SliverShop", + "overlaySprite":"Overlay2Blue", + "rewards": [ + { + "count":6, + "type":"Union", + "cardUnion": [ + { + "count":1, + "subTypes": ["Sliver"] + }, + { + "count":1, + "cardText": "Sliver" + } + ] + }, + { + "count":2, + "type":"Union", + "cardUnion": [ + { + "count":1, + "subTypes": ["Sliver"], + "colors": ["blue"] + }, + { + "count":1, + "cardText": "Sliver", + "colors": ["blue"] + } + ] + }] +},{ + "name":"Sliver2Green", + "description":"Mighty Hive", + "spriteAtlas":"maps/tileset/buildings.atlas", + "sprite":"SliverShop", + "overlaySprite":"Overlay2Green", + "rewards": [ + { + "count":6, + "type":"Union", + "cardUnion": [ + { + "count":1, + "subTypes": ["Sliver"] + }, + { + "count":1, + "cardText": "Sliver" + } + ] + }, + { + "count":2, + "type":"Union", + "cardUnion": [ + { + "count":1, + "subTypes": ["Sliver"], + "colors": ["green"] + }, + { + "count":1, + "cardText": "Sliver", + "colors": ["green"] + } + ] + }] +},{ + "name":"Sliver2Red", + "description":"Spiteful Hive", + "spriteAtlas":"maps/tileset/buildings.atlas", + "sprite":"SliverShop", + "overlaySprite":"Overlay2Red", + "rewards": [ + { + "count":6, + "type":"Union", + "cardUnion": [ + { + "count":1, + "subTypes": ["Sliver"] + }, + { + "count":1, + "cardText": "Sliver" + } + ] + }, + { + "count":2, + "type":"Union", + "cardUnion": [ + { + "count":1, + "subTypes": ["Sliver"], + "colors": ["red"] + }, + { + "count":1, + "cardText": "Sliver", + "colors": ["red"] + } + ] + }] +},{ + "name":"Sliver2White", + "description":"Plated Hive", + "spriteAtlas":"maps/tileset/buildings.atlas", + "sprite":"SliverShop", + "overlaySprite":"Overlay2White", + "rewards": [ + { + "count":6, + "type":"Union", + "cardUnion": [ + { + "count":1, + "subTypes": ["Sliver"] + }, + { + "count":1, + "cardText": "Sliver" + } + ] + }, + { + "count":2, + "type":"Union", + "cardUnion": [ + { + "count":1, + "subTypes": ["Sliver"], + "colors": ["white"] + }, + { + "count":1, + "cardText": "Sliver", + "colors": ["white"] + } + ] + }] +},{ + "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", +"spriteAtlas":"maps/tileset/buildings.atlas", +"sprite":"AssassinShop", + "rewards": [ + { + "count":8, + "subTypes": ["Assassin"] + }] +},{ + "name":"Enchantment", + "description":"Charms and Curiosities", + "spriteAtlas":"maps/tileset/buildings.atlas", + "sprite":"EnchantmentShop", + "rewards": [ + { + "count":8, + "cardTypes": ["Enchantment"] + }] +},{ + "name":"Enchantment4Black", + "description":"Open the Graves", + "spriteAtlas":"maps/tileset/buildings.atlas", + "sprite":"EnchantmentShop", + "overlaySprite":"Overlay4Black", + "rewards": [ + { + "count":4, + "cardTypes": ["Enchantment"] + }, + { + "count":4, + "cardTypes": ["Enchantment"], + "colors": ["black"] + }] +},{ + "name":"Enchantment4Blue", + "description":"Dream Halls", + "spriteAtlas":"maps/tileset/buildings.atlas", + "sprite":"EnchantmentShop", + "overlaySprite":"Overlay4Blue", + "rewards": [ + { + "count":4, + "cardTypes": ["Enchantment"] + }, + { + "count":4, + "cardTypes": ["Enchantment"], + "colors": ["blue"] + }] +},{ + "name":"Enchantment4Green", + "description":"Familiar Ground", + "spriteAtlas":"maps/tileset/buildings.atlas", + "sprite":"EnchantmentShop", + "overlaySprite":"Overlay4Green", + "rewards": [ + { + "count":4, + "cardTypes": ["Enchantment"] + }, + { + "count":4, + "cardTypes": ["Enchantment"], + "colors": ["green"] + }] +},{ + "name":"Enchantment4Red", + "description":"Crucible of Fire", + "spriteAtlas":"maps/tileset/buildings.atlas", + "sprite":"EnchantmentShop", + "overlaySprite":"Overlay4Red", + "rewards": [ + { + "count":4, + "cardTypes": ["Enchantment"] + }, + { + "count":4, + "cardTypes": ["Enchantment"], + "colors": ["red"] + }] +},{ + "name":"Enchantment4White", + "description":"Holy Strength", + "spriteAtlas":"maps/tileset/buildings.atlas", + "sprite":"EnchantmentShop", + "overlaySprite":"Overlay4White", + "rewards": [ + { + "count":4, + "cardTypes": ["Enchantment"] + }, + { + "count":4, + "cardTypes": ["Enchantment"], + "colors": ["white"] + }] +},{ + "name":"Enchantment6Black", + "description":"Open the Graves", + "spriteAtlas":"maps/tileset/buildings.atlas", + "sprite":"EnchantmentShop", + "overlaySprite":"Overlay6Black", + "rewards": [ + { + "count":2, + "cardTypes": ["Enchantment"] + }, + { + "count":6, + "cardTypes": ["Enchantment"], + "colors": ["black"] + }] +},{ + "name":"Enchantment6Blue", + "description":"Dream Halls", + "spriteAtlas":"maps/tileset/buildings.atlas", + "sprite":"EnchantmentShop", + "overlaySprite":"Overlay6Blue", + "rewards": [ + { + "count":2, + "cardTypes": ["Enchantment"] + }, + { + "count":6, + "cardTypes": ["Enchantment"], + "colors": ["blue"] + }] +},{ + "name":"Enchantment6Green", + "description":"Familiar Ground", + "spriteAtlas":"maps/tileset/buildings.atlas", + "sprite":"EnchantmentShop", + "overlaySprite":"Overlay6Green", + "rewards": [ + { + "count":2, + "cardTypes": ["Enchantment"] + }, + { + "count":6, + "cardTypes": ["Enchantment"], + "colors": ["green"] + }] +},{ + "name":"Enchantment6Red", + "description":"Crucible of Fire", + "spriteAtlas":"maps/tileset/buildings.atlas", + "sprite":"EnchantmentShop", + "overlaySprite":"Overlay6Red", + "rewards": [ + { + "count":2, + "cardTypes": ["Enchantment"] + }, + { + "count":6, + "cardTypes": ["Enchantment"], + "colors": ["red"] + }] +},{ + "name":"Enchantment6White", + "description":"Holy Strength", + "spriteAtlas":"maps/tileset/buildings.atlas", + "sprite":"EnchantmentShop", + "overlaySprite":"Overlay6White", + "rewards": [ + { + "count":2, + "cardTypes": ["Enchantment"] + }, + { + "count":6, + "cardTypes": ["Enchantment"], + "colors": ["white"] + }] +},{ + "name":"Squirrel", + "description":"Aww, Nuts", + "spriteAtlas":"maps/tileset/buildings.atlas", + "sprite":"SquirrelShop", + "rewards": [ + { + "count":8, + "type":"Union", + "cardUnion": [ + { + "count":1, + "subTypes": ["Squirrel"] + }, + { + "count":1, + "cardText": "Squirrel" + } + ] + }] +},{ + "name":"Land", + "description":"Exotic Lands", + "spriteAtlas":"maps/tileset/buildings.atlas", + "sprite":"NonbasicLandShop", + "rewards": [ + { + "count":8, + "cardTypes": ["Land"] + }] +},{ +"name":"Colorless", +"description":"One Size Fits All", +"spriteAtlas":"maps/tileset/buildings.atlas", +"sprite":"ColorlessShop", + "rewards": [ + { + "count":8, + "colorType": "Colorless" + }] +},{ +"name":"Artifact", +"description":"Antiquities", +"spriteAtlas":"maps/tileset/buildings.atlas", +"sprite":"ArtifactShop", + "rewards": [ + { + "count":8, + "cardTypes": ["Artifact"] + }] +},{ +"name":"Artifact4Black", +"description":"Antiquities", +"spriteAtlas":"maps/tileset/buildings.atlas", +"sprite":"ArtifactShop", +"overlaySprite":"Overlay4Black", + "rewards": [ + { + "count":4, + "cardTypes": ["Artifact"] + }, + { + "count":4, + "cardTypes": ["Artifact"], + "colors": ["black"] + }] +},{ +"name":"Artifact4Blue", +"description":"Antiquities", +"spriteAtlas":"maps/tileset/buildings.atlas", +"sprite":"ArtifactShop", +"overlaySprite":"Overlay4Blue", + "rewards": [ + { + "count":4, + "cardTypes": ["Artifact"] + }, + { + "count":4, + "cardTypes": ["Artifact"], + "colors": ["blue"] + }] +},{ +"name":"Artifact4Green", +"description":"Antiquities", +"spriteAtlas":"maps/tileset/buildings.atlas", +"sprite":"ArtifactShop", +"overlaySprite":"Overlay4Green", + "rewards": [ + { + "count":4, + "cardTypes": ["Artifact"] + }, + { + "count":4, + "cardTypes": ["Artifact"], + "colors": ["green"] + }] +},{ +"name":"Artifact4Red", +"description":"Antiquities", +"spriteAtlas":"maps/tileset/buildings.atlas", +"sprite":"ArtifactShop", +"overlaySprite":"Overlay4Red", + "rewards": [ + { + "count":4, + "cardTypes": ["Artifact"] + }, + { + "count":4, + "cardTypes": ["Artifact"], + "colors": ["red"] + }] +},{ +"name":"Artifact4White", +"description":"Antiquities", +"spriteAtlas":"maps/tileset/buildings.atlas", +"sprite":"ArtifactShop", +"overlaySprite":"Overlay4White", + "rewards": [ + { + "count":4, + "cardTypes": ["Artifact"] + }, + { + "count":4, + "cardTypes": ["Artifact"], + "colors": ["white"] + }] +},{ +"name":"Multicolor", +"description":"The Goldsmith", +"spriteAtlas":"maps/tileset/buildings.atlas", +"sprite":"MultiColorShop", + "rewards": [ + { + "count":8, + "colorType": "MultiColor" + }] +},{ +"name":"Multicolor8Black", +"description":"The Goldsmith", +"spriteAtlas":"maps/tileset/buildings.atlas", +"sprite":"MultiColorShop", +"overlaySprite":"Overlay8Black", + "rewards": [ + { + "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", +"spriteAtlas":"maps/tileset/buildings.atlas", +"sprite":"MultiColorShop", +"overlaySprite":"Overlay8Blue", + "rewards": [ + { + "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", +"spriteAtlas":"maps/tileset/buildings.atlas", +"sprite":"MultiColorShop", +"overlaySprite":"Overlay8Green", + "rewards": [ + { + "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", +"spriteAtlas":"maps/tileset/buildings.atlas", +"sprite":"MultiColorShop", +"overlaySprite":"Overlay8Red", + "rewards": [ + { + "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", +"spriteAtlas":"maps/tileset/buildings.atlas", +"sprite":"MultiColorShop", +"overlaySprite":"Overlay8White", + "rewards": [ + { + "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", + "spriteAtlas":"maps/tileset/buildings.atlas", + "sprite":"SpaceMarineShop", + "rewards": [ + { + "count":8, + "editions":["40K"] + }] +},{ + "name":"Necron", + "description":"Like-New Necrons", + "spriteAtlas":"maps/tileset/buildings.atlas", + "sprite":"NecronShop", + "rewards": [ + { + "count":8, + "editions":["40K"] + }] +},{ + "name":"Chaos", + "description":"Archon's Archive", + "spriteAtlas":"maps/tileset/buildings.atlas", + "sprite":"ChaosShop", + "rewards": [ + { + "count":8, + "editions":["40K"] + }] +},{ + "name":"Tyranid", + "description":"Gene's Steals", + "spriteAtlas":"maps/tileset/buildings.atlas", + "sprite":"TyranidShop", + "rewards": [ + { + "count":8, + "editions":["40K"] + }] +},{ + "name":"Dragon", + "description":"Here There Be Dragons", + "spriteAtlas":"maps/tileset/buildings.atlas", + "sprite":"DragonShop", + "rewards": [ + { + "count":8, + "type":"Union", + "cardUnion": [ + { + "count":1, + "subTypes": ["Dragon"] + }, + { + "count":1, + "cardText": "Dragon" + } + ] + }] +},{ + "name":"Vampire", + "description":"A Fly By Night Establishment", + "spriteAtlas":"maps/tileset/buildings.atlas", + "sprite":"VampireShop", + "rewards": [ + { + "count":8, + "type":"Union", + "cardUnion": [ + { + "count":1, + "subTypes": ["Vampire"] + }, + { + "count":1, + "cardText": "Vampire" + } + ] + }] +},{ + "name":"Vehicle", + "description":"Al's Used Artifacts", + "spriteAtlas":"maps/tileset/buildings.atlas", + "sprite":"VehicleShop", + "rewards": [ + { + "count":8, + "type":"Union", + "cardUnion": [ + { + "count":1, + "subTypes": ["Vehicle"] + }, + { + "count":1, + "cardText": "Vehicle" + }, + { + "count":1, + "cardText": "Pilot" + } + ] + }] +},{ + "name":"Vehicle2Black", + "description":"His & Hers Hearses", + "spriteAtlas":"maps/tileset/buildings.atlas", + "sprite":"VehicleShop", + "overlaySprite":"Overlay2Black", + "rewards": [ + { + "count":6, + "type":"Union", + "cardUnion": [ + { + "count":1, + "subTypes": ["Vehicle"] + }, + { + "count":1, + "cardText": "Vehicle" + }, + { + "count":1, + "cardText": "Pilot" + } + ] + }, + { + "count":2, + "type":"Union", + "cardUnion": [ + { + "count":1, + "subTypes": ["Vehicle"], + "colors": ["black"] + }, + { + "count":1, + "cardText": "Vehicle", + "colors": ["black"] + }, + { + "count":1, + "cardText": "Pilot", + "colors": ["black"] + } + ] + }] +},{ + "name":"Vehicle2Blue", + "description":"Wings & Things", + "spriteAtlas":"maps/tileset/buildings.atlas", + "sprite":"VehicleShop", + "overlaySprite":"Overlay2Blue", + "rewards": [ + { + "count":6, + "type":"Union", + "cardUnion": [ + { + "count":1, + "subTypes": ["Vehicle"] + }, + { + "count":1, + "cardText": "Vehicle" + }, + { + "count":1, + "cardText": "Pilot" + } + ] + }, + { + "count":2, + "type":"Union", + "cardUnion": [ + { + "count":1, + "subTypes": ["Vehicle"], + "colors": ["blue"] + }, + { + "count":1, + "cardText": "Vehicle", + "colors": ["blue"] + }, + { + "count":1, + "cardText": "Pilot", + "colors": ["blue"] + } + ] + }] +},{ + "name":"Vehicle2Green", + "description":"Mean Green Machines", + "spriteAtlas":"maps/tileset/buildings.atlas", + "sprite":"VehicleShop", + "overlaySprite":"Overlay2Green", + "rewards": [ + { + "count":6, + "type":"Union", + "cardUnion": [ + { + "count":1, + "subTypes": ["Vehicle"] + }, + { + "count":1, + "cardText": "Vehicle" + }, + { + "count":1, + "cardText": "Pilot" + } + ] + }, + { + "count":2, + "type":"Union", + "cardUnion": [ + { + "count":1, + "subTypes": ["Vehicle"], + "colors": ["green"] + }, + { + "count":1, + "cardText": "Vehicle", + "colors": ["green"] + }, + { + "count":1, + "cardText": "Pilot", + "colors": ["green"] + } + ] + }] +},{ + "name":"Vehicle2Red", + "description":"Goblin Rock Sleds", + "spriteAtlas":"maps/tileset/buildings.atlas", + "sprite":"VehicleShop", + "overlaySprite":"Overlay2Red", + "rewards": [ + { + "count":6, + "type":"Union", + "cardUnion": [ + { + "count":1, + "subTypes": ["Vehicle"] + }, + { + "count":1, + "cardText": "Vehicle" + }, + { + "count":1, + "cardText": "Pilot" + } + ] + }, + { + "count":2, + "type":"Union", + "cardUnion": [ + { + "count":1, + "subTypes": ["Vehicle"], + "colors": ["red"] + }, + { + "count":1, + "cardText": "Vehicle", + "colors": ["red"] + }, + { + "count":1, + "cardText": "Pilot", + "colors": ["red"] + } + ] + }] +},{ + "name":"Vehicle2White", + "description":"Sedans & Plowshares", + "spriteAtlas":"maps/tileset/buildings.atlas", + "sprite":"VehicleShop", + "overlaySprite":"Overlay2White", + "rewards": [ + { + "count":6, + "type":"Union", + "cardUnion": [ + { + "count":1, + "subTypes": ["Vehicle"] + }, + { + "count":1, + "cardText": "Vehicle" + }, + { + "count":1, + "cardText": "Pilot" + } + ] + }, + { + "count":2, + "type":"Union", + "cardUnion": [ + { + "count":1, + "subTypes": ["Vehicle"], + "colors": ["white"] + }, + { + "count":1, + "cardText": "Vehicle", + "colors": ["white"] + }, + { + "count":1, + "cardText": "Pilot", + "colors": ["white"] + } + ] + }] +},{ + "name":"Minotaur", + "description":"Ye Olde China Shoppe", + "spriteAtlas":"maps/tileset/buildings.atlas", + "sprite":"MinotaurShop", + "rewards": [ + { + "count":8, + "type":"Union", + "cardUnion": [ + { + "count":1, + "subTypes": ["Minotaur"] + }, + { + "count":1, + "cardText": "Minotaur" + } + ] + } + ] +}, +{ + "name":"Ogre", + "description":"Indentured Oafs", + "spriteAtlas":"maps/tileset/buildings.atlas", + "sprite":"OgreShop", + "rewards": [ + { + "count":8, + "type":"Union", + "cardUnion": [ + { + "count":1, + "subTypes": ["Ogre"] + }, + { + "count":1, + "cardText": "Ogre" + } + ] + } + ] +}, +{ + "name":"Ogre4Red", + "description":"Ogre Warriors", + "spriteAtlas":"maps/tileset/buildings.atlas", + "sprite":"OgreShop", + "rewards": [ + { + "count":4, + "type":"Union", + "cardUnion": [ + { + "count":1, + "subTypes": ["Ogre"] + }, + { + "count":1, + "cardText": "Ogre" + } + ] + }, + { + "count":4, + "type":"Union", + "cardUnion": [ + { + "count":1, + "subTypes": ["Ogre"], + "colors": ["red"] + }, + { + "count":1, + "cardText": "Ogre", + "colors": ["red"] + } + ] + } + ] +},{ + "name":"Dinosaur", + "description":"Huatli's Spurring", + "spriteAtlas":"maps/tileset/buildings.atlas", + "sprite":"DinosaurShop", + "rewards": [ + { + "count":8, + "type":"Union", + "cardUnion": [ + { + "count":1, + "subTypes": ["Dinosaur"] + }, + { + "count":1, + "cardText": "Dinosaur" + } + ] + } + ] +},{ + "name":"Dinosaur4Green", + "description":"Apex Predators", + "spriteAtlas":"maps/tileset/buildings.atlas", + "sprite":"DinosaurShop", + "overlaySprite":"Overlay4Green", + "rewards": [ + { + "count":4, + "type":"Union", + "cardUnion": [ + { + "count":1, + "subTypes": ["Dinosaur"] + }, + { + "count":1, + "cardText": "Dinosaur" + } + ] + }, + { + "count":4, + "type":"Union", + "cardUnion": [ + { + "count":1, + "subTypes": ["Dinosaur"], + "colors": ["green"] + }, + { + "count":1, + "cardText": "Dinosaur", + "colors": ["green"] + } + ] + } + ] +},{ + "name":"Dinosaur4Red", + "description":"Dinosaur Stampede", + "spriteAtlas":"maps/tileset/buildings.atlas", + "sprite":"DinosaurShop", + "rewards": [ + { + "count":4, + "type":"Union", + "cardUnion": [ + { + "count":1, + "subTypes": ["Dinosaur"] + }, + { + "count":1, + "cardText": "Dinosaur" + } + ] + }, + { + "count":4, + "type":"Union", + "cardUnion": [ + { + "count":1, + "subTypes": ["Dinosaur"], + "colors": ["red"] + }, + { + "count":1, + "cardText": "Dinosaur", + "colors": ["red"] + } + ] + } + ] +},{ + "name":"Dwarf", + "description":"Take Your Pick", + "spriteAtlas":"maps/tileset/buildings.atlas", + "sprite":"DwarfShop", + "rewards": [ + { + "count":8, + "type":"Union", + "cardUnion": [ + { + "count":1, + "subTypes": ["Dwarf"] + }, + { + "count":1, + "cardText": "Dwarf" + }, + { + "count":1, + "cardText": "Dwarves" + } + ] + } + ] +},{ + "name":"Devil", + "description":"Deal With the Devil", + "spriteAtlas":"maps/tileset/buildings.atlas", + "sprite":"DevilShop", + "rewards": [ + { + "count":8, + "type":"Union", + "cardUnion": [ + { + "count":1, + "subTypes": ["Devil"] + }, + { + "count":1, + "cardText": "Devil" + } + ] + } + ] +},{ +"name":"ToDo", + "description":"To Do", +"spriteAtlas":"maps/tileset/buildings.atlas", +"sprite":"ToDoShop", + "rewards": [ + { + "count":8 + }] +},{ +"name":"Equip", +"description":"Arms & Armor", +"spriteAtlas":"maps/tileset/buildings.atlas", +"sprite":"EquipShop", + "rewards": [ + { + "count":8, + "subTypes": ["Equipment"] + }] +},{ + "name":"Soldier", + "description":"The Garrison", + "spriteAtlas":"maps/tileset/buildings.atlas", + "sprite":"SoldierShop", + "rewards": [ + { + "count":8, + "type":"Union", + "cardUnion": [ + { + "count":1, + "subTypes": ["Soldier"] + }, + { + "count":1, + "cardText": "Soldier" + } + ] + } + ] +},{ + "name":"Soldier4Red", + "description":"Shock Troops", + "spriteAtlas":"maps/tileset/buildings.atlas", + "sprite":"SoldierShop", + "overlaySprite":"Overlay4Red", + "rewards": [ + { + "count":4, + "type":"Union", + "cardUnion": [ + { + "count":1, + "subTypes": ["Soldier"] + }, + { + "count":1, + "cardText": "Soldier" + } + ] + }, + { + "count":4, + "type":"Union", + "cardUnion": [ + { + "count":1, + "subTypes": ["Soldier"], + "colors":["red"] + }, + { + "count":1, + "cardText": "Soldier", + "colors":["red"] + } + ] + } + ] +},{ + "name":"Soldier4White", + "description":"Benalish Barracks", + "spriteAtlas":"maps/tileset/buildings.atlas", + "sprite":"SoldierShop", + "overlaySprite":"Overlay4White", + "rewards": [ + { + "count":4, + "type":"Union", + "cardUnion": [ + { + "count":1, + "subTypes": ["Soldier"] + }, + { + "count":1, + "cardText": "Soldier" + } + ] + }, + { + "count":4, + "type":"Union", + "cardUnion": [ + { + "count":1, + "subTypes": ["Soldier"], + "colors":["white"] + }, + { + "count":1, + "cardText": "Soldier", + "colors":["white"] + } + ] + } + ] +},{ + "name":"Card", + "description":"Sleight of Hand", + "spriteAtlas":"maps/tileset/buildings.atlas", + "sprite":"CardShop", + "rewards": [ + { + "count":8, + "type":"Union", + "cardUnion": [ + { + "count":1, + "cardText": "Draw" + }, + { + "count":1, + "cardText": "Discard" + }, + { + "count":1, + "cardText": "Hand" + } + ] + }] +},{ +"name":"DnD", +"description":"Boo's Bargains", +"spriteAtlas":"maps/tileset/buildings.atlas", +"sprite":"DnDShop", + "rewards": [ + { + "count":8, + "editions": ["AFR", "HBG", "CLB", "AFC"] + }] +},{ + "name":"Demon", + "description":"The Demonic Altar", + "spriteAtlas":"maps/tileset/buildings.atlas", + "sprite":"DemonShop", + "rewards": [ + { + "count":8, + "type":"Union", + "cardUnion": [ + { + "count":1, + "subTypes": ["Demon"] + }, + { + "count":1, + "cardText": "Demon" + } + ] + } + ] +},{ + "name":"Druid", + "description":"Discount Druids", + "spriteAtlas":"maps/tileset/buildings.atlas", + "sprite":"DruidShop", + "rewards": [ + { + "count":8, + "type":"Union", + "cardUnion": [ + { + "count":1, + "subTypes": ["Druid"] + }, + { + "count":1, + "cardText": "Druid" + } + ] + }] +},{ + "name":"Wand", + "description":"Ashnod's Artifacts", + "spriteAtlas":"maps/tileset/buildings.atlas", + "sprite":"WandShop", + "rewards": [ + { + "count":8, + "cardTypes": ["Artifact"], + "cardText": "\\Q{\\ET\\Q\\E}" + }] +},{ + "name":"Wand2Black", + "description":"Vault of Whispers", + "spriteAtlas":"maps/tileset/buildings.atlas", + "sprite":"WandShop", + "overlaySprite":"Overlay2Black", + "rewards": [ + { + "count":6, + "cardTypes": ["Artifact"], + "cardText": "\\Q{\\ET\\Q\\E}" + }, + { + "count":2, + "type":"Union", + "cardUnion": [ + { + "count":1, + "cardTypes": ["Artifact"], + "cardText": "\\Q{\\EB\\Q\\E}" + }, + { + "count":1, + "cardTypes": ["Artifact"], + "cardText": "Black" + } + ] + }] +},{ + "name":"Wand4Black", + "description":"Vault of Whispers", + "spriteAtlas":"maps/tileset/buildings.atlas", + "sprite":"WandShop", + "overlaySprite":"Overlay4Black", + "rewards": [ + { + "count":4, + "cardTypes": ["Artifact"], + "cardText": "\\Q{\\ET\\Q\\E}" + }, + { + "count":4, + "type":"Union", + "cardUnion": [ + { + "count":1, + "cardTypes": ["Artifact"], + "cardText": "\\Q{\\EB\\Q\\E}" + }, + { + "count":1, + "cardTypes": ["Artifact"], + "cardText": "Black" + } + ] + }] +},{ + "name":"Wand2Blue", + "description":"Seat of the Synod", + "spriteAtlas":"maps/tileset/buildings.atlas", + "sprite":"WandShop", + "overlaySprite":"Overlay2Blue", + "rewards": [ + { + "count":6, + "cardTypes": ["Artifact"], + "cardText": "\\Q{\\ET\\Q\\E}" + }, + { + "count":2, + "type":"Union", + "cardUnion": [ + { + "count":1, + "cardTypes": ["Artifact"], + "cardText": "\\Q{\\EU\\Q\\E}" + }, + { + "count":1, + "cardTypes": ["Artifact"], + "cardText": "Blue" + } + ] + }] +},{ + "name":"Wand4Blue", + "description":"Seat of the Synod", + "spriteAtlas":"maps/tileset/buildings.atlas", + "sprite":"WandShop", + "overlaySprite":"Overlay4Blue", + "rewards": [ + { + "count":4, + "cardTypes": ["Artifact"], + "cardText": "\\Q{\\ET\\Q\\E}" + }, + { + "count":4, + "type":"Union", + "cardUnion": [ + { + "count":1, + "cardTypes": ["Artifact"], + "cardText": "\\Q{\\EU\\Q\\E}" + }, + { + "count":1, + "cardTypes": ["Artifact"], + "cardText": "Blue" + } + ] + }] +},{ + "name":"Wand2Green", + "description":"Tree of Tales", + "spriteAtlas":"maps/tileset/buildings.atlas", + "sprite":"WandShop", + "overlaySprite":"Overlay2Green", + "rewards": [ + { + "count":6, + "cardTypes": ["Artifact"], + "cardText": "\\Q{\\ET\\Q\\E}" + }, + { + "count":2, + "type":"Union", + "cardUnion": [ + { + "count":1, + "cardTypes": ["Artifact"], + "cardText": "\\Q{\\EG\\Q\\E}" + }, + { + "count":1, + "cardTypes": ["Artifact"], + "cardText": "Green" + } + ] + }] +},{ + "name":"Wand4Green", + "description":"Tree of Tales", + "spriteAtlas":"maps/tileset/buildings.atlas", + "sprite":"WandShop", + "overlaySprite":"Overlay4Green", + "rewards": [ + { + "count":4, + "cardTypes": ["Artifact"], + "cardText": "\\Q{\\ET\\Q\\E}" + }, + { + "count":4, + "type":"Union", + "cardUnion": [ + { + "count":1, + "cardTypes": ["Artifact"], + "cardText": "\\Q{\\EG\\Q\\E}" + }, + { + "count":1, + "cardTypes": ["Artifact"], + "cardText": "Green" + } + ] + }] +},{ + "name":"Wand2Red", + "description":"The Great Furnace", + "spriteAtlas":"maps/tileset/buildings.atlas", + "sprite":"WandShop", + "overlaySprite":"Overlay2Red", + "rewards": [ + { + "count":6, + "cardTypes": ["Artifact"], + "cardText": "\\Q{\\ET\\Q\\E}" + }, + { + "count":2, + "type":"Union", + "cardUnion": [ + { + "count":1, + "cardTypes": ["Artifact"], + "cardText": "\\Q{\\ER\\Q\\E}" + }, + { + "count":1, + "cardTypes": ["Artifact"], + "cardText": "Red" + } + ] + }] +},{ + "name":"Wand4Red", + "description":"The Great Furnace", + "spriteAtlas":"maps/tileset/buildings.atlas", + "sprite":"WandShop", + "overlaySprite":"Overlay2Red", + "rewards": [ + { + "count":4, + "cardTypes": ["Artifact"], + "cardText": "\\Q{\\ET\\Q\\E}" + }, + { + "count":4, + "type":"Union", + "cardUnion": [ + { + "count":1, + "cardTypes": ["Artifact"], + "cardText": "\\Q{\\ER\\Q\\E}" + }, + { + "count":1, + "cardTypes": ["Artifact"], + "cardText": "Red" + } + ] + }] +},{ + "name":"Wand2White", + "description":"Ancient Den", + "spriteAtlas":"maps/tileset/buildings.atlas", + "sprite":"WandShop", + "overlaySprite":"Overlay2White", + "rewards": [ + { + "count":6, + "cardTypes": ["Artifact"], + "cardText": "\\Q{\\ET\\Q\\E}" + }, + { + "count":2, + "type":"Union", + "cardUnion": [ + { + "count":1, + "cardTypes": ["Artifact"], + "cardText": "\\Q{\\EW\\Q\\E}" + }, + { + "count":1, + "cardTypes": ["Artifact"], + "cardText": "White" + } + ] + }] +},{ + "name":"Wand4White", + "description":"Ancient Den", + "spriteAtlas":"maps/tileset/buildings.atlas", + "sprite":"WandShop", + "overlaySprite":"Overlay4White", + "rewards": [ + { + "count":4, + "cardTypes": ["Artifact"], + "cardText": "\\Q{\\ET\\Q\\E}" + }, + { + "count":4, + "type":"Union", + "cardUnion": [ + { + "count":1, + "cardTypes": ["Artifact"], + "cardText": "\\Q{\\EW\\Q\\E}" + }, + { + "count":1, + "cardTypes": ["Artifact"], + "cardText": "White" + } + ] + }] +},{ + "name":"Bird", + "description":"Birds Of A Feather", + "spriteAtlas":"maps/tileset/buildings.atlas", + "sprite":"BirdShop", + "rewards": [ + { + "count":8, + "type":"Union", + "cardUnion": [ + { + "count":1, + "subTypes": ["Bird"] + }, + { + "count":1, + "cardText": "Bird" + } + ] + }] +},{ + "name":"Bird4Blue", + "description":"Aven Windreaders", + "spriteAtlas":"maps/tileset/buildings.atlas", + "sprite":"BirdShop", + "overlaySprite":"Overlay4Blue", + "rewards": [ + { + "count":4, + "type":"Union", + "cardUnion": [ + { + "count":1, + "subTypes": ["Bird"] + }, + { + "count":1, + "cardText": "Bird" + } + ] + }, + { + "count":4, + "type":"Union", + "cardUnion": [ + { + "count":1, + "subTypes": ["Bird"], + "colors": ["blue"] + }, + { + "count":1, + "cardText": "Bird", + "colors": ["blue"] + } + ] + }] +},{ + "name":"Bird4White", + "description":"Wing Stop", + "spriteAtlas":"maps/tileset/buildings.atlas", + "sprite":"BirdShop", + "overlaySprite":"Overlay4White", + "rewards": [ + { + "count":4, + "type":"Union", + "cardUnion": [ + { + "count":1, + "subTypes": ["Bird"] + }, + { + "count":1, + "cardText": "Bird" + } + ] + }, + { + "count":4, + "type":"Union", + "cardUnion": [ + { + "count":1, + "subTypes": ["Bird"], + "colors": ["white"] + }, + { + "count":1, + "cardText": "Bird", + "colors": ["white"] + } + ] + }] +},{ + "name":"Spirit", + "description":"Spirit Halloween", + "spriteAtlas":"maps/tileset/buildings.atlas", + "sprite":"SpiritShop", + "rewards": [ + { + "count":8, + "type":"Union", + "cardUnion": [ + { + "count":1, + "subTypes": ["Spirit"] + }, + { + "count":1, + "cardText": "Spirit" + } + ] + }] +},{ + "name":"Spirit4Blue", + "description":"Dreamcatchers", + "spriteAtlas":"maps/tileset/buildings.atlas", + "sprite":"SpiritShop", + "overlaySprite":"Overlay4Blue", + "rewards": [ + { + "count":4, + "type":"Union", + "cardUnion": [ + { + "count":1, + "subTypes": ["Spirit"] + }, + { + "count":1, + "cardText": "Spirit" + } + ] + }, + { + "count":4, + "type":"Union", + "cardUnion": [ + { + "count":1, + "subTypes": ["Spirit"], + "colors": ["blue"] + }, + { + "count":1, + "cardText": "Spirit", + "colors": ["blue"] + } + ] + }] +},{ + "name":"Spirit4White", + "description":"Blessed Spirits", + "spriteAtlas":"maps/tileset/buildings.atlas", + "sprite":"SpiritShop", + "overlaySprite":"Overlay4White", + "rewards": [ + { + "count":4, + "type":"Union", + "cardUnion": [ + { + "count":1, + "subTypes": ["Spirit"] + }, + { + "count":1, + "cardText": "Spirit" + } + ] + }, + { + "count":4, + "type":"Union", + "cardUnion": [ + { + "count":1, + "subTypes": ["Spirit"], + "colors": ["white"] + }, + { + "count":1, + "cardText": "Spirit", + "colors": ["white"] + } + ] + }] +},{ + "name":"Wolf", + "description":"Spirit of the Hunt", + "spriteAtlas":"maps/tileset/buildings.atlas", + "sprite":"WolfShop", + "rewards": [ + { + "count":8, + "type":"Union", + "cardUnion": [ + { + "count":1, + "subTypes": ["Wolf", "Werewolf"] + }, + { + "count":1, + "cardText": "Wolf" + }, + { + "count":1, + "cardText": "Werewolf" + } + ] + }] +},{ + "name":"Wolf4Green", + "description":"Predator's Howl", + "spriteAtlas":"maps/tileset/buildings.atlas", + "sprite":"WolfShop", + "overlaySprite":"Overlay4Green", + "rewards": [ + { + "count":4, + "type":"Union", + "cardUnion": [ + { + "count":1, + "subTypes": ["Wolf", "Werewolf"] + }, + { + "count":1, + "cardText": "Wolf" + }, + { + "count":1, + "cardText": "Werewolf" + } + ] + }, + { + "count":4, + "type":"Union", + "cardUnion": [ + { + "count":1, + "subTypes": ["Wolf", "Werewolf"], + "colors": ["green"] + }, + { + "count":1, + "cardText": "Wolf", + "colors": ["red"] + }, + { + "count":1, + "cardText": "Werewolf", + "colors": ["green"] + } + ] + }] +},{ + "name":"Wolf4Red", + "description":"Assembled Alphas", + "spriteAtlas":"maps/tileset/buildings.atlas", + "sprite":"WolfShop", + "overlaySprite":"Overlay4Red", + "rewards": [ + { + "count":4, + "type":"Union", + "cardUnion": [ + { + "count":1, + "subTypes": ["Wolf", "Werewolf"] + }, + { + "count":1, + "cardText": "Wolf" + }, + { + "count":1, + "cardText": "Werewolf" + } + ] + }, + { + "count":4, + "type":"Union", + "cardUnion": [ + { + "count":1, + "subTypes": ["Wolf", "Werewolf"], + "colors": ["red"] + }, + { + "count":1, + "cardText": "Wolf", + "colors": ["red"] + }, + { + "count":1, + "cardText": "Werewolf", + "colors": ["red"] + } + ] + }] +},{ + "name":"Knight", + "description":"Knight Riders", + "spriteAtlas":"maps/tileset/buildings.atlas", + "sprite":"KnightShop", + "rewards": [ + { + "count":8, + "type":"Union", + "cardUnion": [ + { + "count":1, + "subTypes": ["Knight"] + }, + { + "count":1, + "cardText": "Knight" + } + ] + }] +},{ + "name":"Knight4Black", + "description":"Dread Riders", + "spriteAtlas":"maps/tileset/buildings.atlas", + "sprite":"KnightShop", + "overlaySprite":"Overlay4Black", + "rewards": [ + { + "count":4, + "type":"Union", + "cardUnion": [ + { + "count":1, + "subTypes": ["Knight"] + }, + { + "count":1, + "cardText": "Knight" + } + ] + }, + { + "count":4, + "type":"Union", + "cardUnion": [ + { + "count":1, + "subTypes": ["Knight"], + "colors": ["black"] + }, + { + "count":1, + "cardText": "Knight", + "colors": ["black"] + } + ] + }] +},{ + "name":"Knight4Red", + "description":"Defenders of Chaos", + "spriteAtlas":"maps/tileset/buildings.atlas", + "sprite":"KnightShop", + "overlaySprite":"Overlay4Red", + "rewards": [ + { + "count":4, + "type":"Union", + "cardUnion": [ + { + "count":1, + "subTypes": ["Knight"] + }, + { + "count":1, + "cardText": "Knight" + } + ] + }, + { + "count":4, + "type":"Union", + "cardUnion": [ + { + "count":1, + "subTypes": ["Knight"], + "colors": ["red"] + }, + { + "count":1, + "cardText": "Knight", + "colors": ["red"] + } + ] + }] +},{ + "name":"Knight4White", + "description":"Defenders of Law", + "spriteAtlas":"maps/tileset/buildings.atlas", + "sprite":"KnightShop", + "overlaySprite":"Overlay4White", + "rewards": [ + { + "count":4, + "type":"Union", + "cardUnion": [ + { + "count":1, + "subTypes": ["Knight"] + }, + { + "count":1, + "cardText": "Knight" + } + ] + }, + { + "count":4, + "type":"Union", + "cardUnion": [ + { + "count":1, + "subTypes": ["Knight"], + "colors": ["white"] + }, + { + "count":1, + "cardText": "Knight", + "colors": ["white"] + } + ] + }] +},{ + "name":"Random", + "description":"Pack Shop (?)", + "spriteAtlas":"maps/tileset/buildings.atlas", + "sprite":"RandomShop", + "rewards": [ + { + "count":8 + }] +},{ + "name":"Planeswalker", + "description":"Plain ol' Planeswalkers", + "spriteAtlas":"maps/tileset/buildings.atlas", + "sprite":"PlaneswalkerShop", + "rewards": [ + { + "count":8, + "cardTypes": ["Planeswalker"] + }] +},{ + "name":"Planeswalker4Black", + "description":"Sorin's Guidance", + "spriteAtlas":"maps/tileset/buildings.atlas", + "sprite":"PlaneswalkerShop", + "overlaySprite":"Overlay4Black", + "rewards": [ + { + "count":4, + "cardTypes": ["Planeswalker"] + }, + { + "count":4, + "cardTypes": ["Planeswalker"], + "colors": ["black"] + }] +},{ + "name":"Planeswalker4Blue", + "description":"Teferi's Isle", + "spriteAtlas":"maps/tileset/buildings.atlas", + "sprite":"PlaneswalkerShop", + "overlaySprite":"Overlay4Blue", + "rewards": [ + { + "count":4, + "cardTypes": ["Planeswalker"] + }, + { + "count":4, + "cardTypes": ["Planeswalker"], + "colors": ["blue"] + }] +},{ + "name":"Planeswalker4Green", + "description":"Garruk's Companions", + "spriteAtlas":"maps/tileset/buildings.atlas", + "sprite":"PlaneswalkerShop", + "overlaySprite":"Overlay4Green", + "rewards": [ + { + "count":4, + "cardTypes": ["Planeswalker"] + }, + { + "count":4, + "cardTypes": ["Planeswalker"], + "colors": ["green"] + }] +},{ + "name":"Planeswalker4Red", + "description":"Oath of Chandra", + "spriteAtlas":"maps/tileset/buildings.atlas", + "sprite":"PlaneswalkerShop", + "overlaySprite":"Overlay4Red", + "rewards": [ + { + "count":4, + "cardTypes": ["Planeswalker"] + }, + { + "count":4, + "cardTypes": ["Planeswalker"], + "colors": ["red"] + }] +},{ + "name":"Planeswalker4White", + "description":"Gideon's Company", + "spriteAtlas":"maps/tileset/buildings.atlas", + "sprite":"PlaneswalkerShop", + "overlaySprite":"Overlay4White", + "rewards": [ + { + "count":4, + "cardTypes": ["Planeswalker"] + }, + { + "count":4, + "cardTypes": ["Planeswalker"], + "colors": ["white"] + }] +},{ + "name":"Skeleton", + "description":"Bob's Bones", + "spriteAtlas":"maps/tileset/buildings.atlas", + "sprite":"SkeletonShop", + "rewards": [ + { + "count":8, + "type":"Union", + "cardUnion": [ + { + "count":1, + "subTypes": ["Skeleton"] + }, + { + "count":1, + "cardText": "Skeleton" + } + ] + }] +},{ + "name":"Pirate", + "description":"Marauding Looters", + "spriteAtlas":"maps/tileset/buildings.atlas", + "sprite":"PirateShop", + "rewards": [ + { + "count":8, + "type":"Union", + "cardUnion": [ + { + "count":1, + "subTypes": ["Pirate"] + }, + { + "count":1, + "cardText": "Pirate" + } + ] + }] +},{ + "name":"Pirate4Blue", + "description":"Merchant Raiders", + "spriteAtlas":"maps/tileset/buildings.atlas", + "sprite":"PirateShop", + "overlaySprite":"Overlay4Blue", + "rewards": [ + { + "count":4, + "type":"Union", + "cardUnion": [ + { + "count":1, + "subTypes": ["Pirate"] + }, + { + "count":1, + "cardText": "Pirate" + } + ] + }, + { + "count":4, + "type":"Union", + "cardUnion": [ + { + "count":1, + "subTypes": ["Pirate"], + "colors": ["blue"] + }, + { + "count":1, + "cardText": "Rogue", + "colors": ["Pirate"] + } + ] + } + ] +},{ + "name":"Rogue", + "description":"Bane Alley Brokers", + "spriteAtlas":"maps/tileset/buildings.atlas", + "sprite":"RogueShop", + "rewards": [ + { + "count":8, + "type":"Union", + "cardUnion": [ + { + "count":1, + "subTypes": ["Rogue"] + }, + { + "count":1, + "cardText": "Rogue" + } + ] + }] +},{ + "name":"Rogue4Black", + "description":"Acquisitions Experts", + "spriteAtlas":"maps/tileset/buildings.atlas", + "sprite":"RogueShop", + "overlaySprite":"Overlay4Black", + "rewards": [ + { + "count":4, + "type":"Union", + "cardUnion": [ + { + "count":1, + "subTypes": ["Rogue"] + }, + { + "count":1, + "cardText": "Rogue" + } + ] + }, + { + "count":4, + "type":"Union", + "cardUnion": [ + { + "count":1, + "subTypes": ["Rogue"], + "colors": ["black"] + }, + { + "count":1, + "cardText": "Rogue", + "colors": ["black"] + } + ] + } + ] +},{ + "name":"Rogue4Blue", + "description":"Keepers of Keys", + "spriteAtlas":"maps/tileset/buildings.atlas", + "sprite":"RogueShop", + "overlaySprite":"Overlay4Blue", + "rewards": [ + { + "count":4, + "type":"Union", + "cardUnion": [ + { + "count":1, + "subTypes": ["Rogue"] + }, + { + "count":1, + "cardText": "Rogue" + } + ] + }, + { + "count":4, + "type":"Union", + "cardUnion": [ + { + "count":1, + "subTypes": ["Rogue"], + "colors": ["blue"] + }, + { + "count":1, + "cardText": "Rogue", + "colors": ["blue"] + } + ] + } + ] +},{ + "name":"Shaman", + "description":"Shaman for ya man", + "spriteAtlas":"maps/tileset/buildings.atlas", + "sprite":"ShamanShop", + "rewards": [ + { + "count":8, + "type":"Union", + "cardUnion": [ + { + "count":1, + "subTypes": ["Shaman"] + }, + { + "count":1, + "cardText": "Shaman" + } + ] + } + ] +},{ + "name":"Wizard", + "description":"Tim's Prestidigitation", + "spriteAtlas":"maps/tileset/buildings.atlas", + "sprite":"WizardShop", + "rewards": [ + { + "count":8, + "type":"Union", + "cardUnion": [ + { + "count":1, + "subTypes": ["Wizard"] + }, + { + "count":1, + "cardText": "Wizard" + } + ] + } + ] +},{ + "name":"Legend", + "description":"Tome of Legends", + "spriteAtlas":"maps/tileset/buildings.atlas", + "sprite":"LegendShop", + "rewards": [ + { + "count":8, + "type":"Union", + "cardUnion": [ + { + "count":1, + "superTypes": ["Legend","Legendary"] + }, + { + "count":1, + "cardText": "Legendary" + }, + { + "count":1, + "cardText": "Historic" + } + ] + } + ] +},{ + "name":"Legend4Black", + "description":"Phyrexian Tower", + "spriteAtlas":"maps/tileset/buildings.atlas", + "sprite":"LegendShop", + "overlaySprite":"Overlay4Black", + "rewards": [ + { + "count":4, + "type":"Union", + "cardUnion": [ + { + "count":1, + "superTypes": ["Legend","Legendary"] + }, + { + "count":1, + "cardText": "Legendary" + }, + { + "count":1, + "cardText": "Historic" + } + ] + }, + { + "count":4, + "type":"Union", + "cardUnion": [ + { + "count":1, + "superTypes": ["Legend","Legendary"], + "colors":["black"] + }, + { + "count":1, + "cardText": "Legendary", + "colors":["black"] + }, + { + "count":1, + "cardText": "Historic", + "colors":["black"] + } + ] + }] +},{ + "name":"Legend4Blue", + "description":"Teferi's Insight", + "spriteAtlas":"maps/tileset/buildings.atlas", + "sprite":"LegendShop", + "overlaySprite":"Overlay4Blue", + "rewards": [ + { + "count":4, + "type":"Union", + "cardUnion": [ + { + "count":1, + "superTypes": ["Legend","Legendary"] + }, + { + "count":1, + "cardText": "Legendary" + }, + { + "count":1, + "cardText": "Historic" + } + ] + }, + { + "count":4, + "type":"Union", + "cardUnion": [ + { + "count":1, + "superTypes": ["Legend","Legendary"], + "colors":["blue"] + }, + { + "count":1, + "cardText": "Legendary", + "colors":["blue"] + }, + { + "count":1, + "cardText": "Historic", + "colors":["blue"] + } + ] + }] +},{ + "name":"Legend4Green", + "description":"History of Kamigawa", + "spriteAtlas":"maps/tileset/buildings.atlas", + "sprite":"LegendShop", + "overlaySprite":"Overlay4Green", + "rewards": [ + { + "count":4, + "type":"Union", + "cardUnion": [ + { + "count":1, + "superTypes": ["Legend","Legendary"] + }, + { + "count":1, + "cardText": "Legendary" + }, + { + "count":1, + "cardText": "Historic" + } + ] + }, + { + "count":4, + "type":"Union", + "cardUnion": [ + { + "count":1, + "superTypes": ["Legend","Legendary"], + "colors":["green"] + }, + { + "count":1, + "cardText": "Legendary", + "colors":["green"] + }, + { + "count":1, + "cardText": "Historic", + "colors":["green"] + } + ] + }] +},{ + "name":"Legend4Red", + "description":"Crucible of Defiance", + "spriteAtlas":"maps/tileset/buildings.atlas", + "sprite":"LegendShop", + "overlaySprite":"Overlay4Red", + "rewards": [ + { + "count":4, + "type":"Union", + "cardUnion": [ + { + "count":1, + "superTypes": ["Legend","Legendary"] + }, + { + "count":1, + "cardText": "Legendary" + }, + { + "count":1, + "cardText": "Historic" + } + ] + }, + { + "count":4, + "type":"Union", + "cardUnion": [ + { + "count":1, + "superTypes": ["Legend","Legendary"], + "colors":["red"] + }, + { + "count":1, + "cardText": "Legendary", + "colors":["red"] + }, + { + "count":1, + "cardText": "Historic", + "colors":["red"] + } + ] + }] +},{ + "name":"Legend4White", + "description":"Avacyn's Memorial", + "spriteAtlas":"maps/tileset/buildings.atlas", + "sprite":"LegendShop", + "overlaySprite":"Overlay4White", + "rewards": [ + { + "count":4, + "type":"Union", + "cardUnion": [ + { + "count":1, + "superTypes": ["Legend","Legendary"] + }, + { + "count":1, + "cardText": "Legendary" + }, + { + "count":1, + "cardText": "Historic" + } + ] + }, + { + "count":4, + "type":"Union", + "cardUnion": [ + { + "count":1, + "superTypes": ["Legend","Legendary"], + "colors":["white"] + }, + { + "count":1, + "cardText": "Legendary", + "colors":["white"] + }, + { + "count":1, + "cardText": "Historic", + "colors":["white"] + } + ] + }] +}, +{ + "name":"UnionTest", + "description":"Soldier text OR Soldier type OR black goblin", + "spriteAtlas":"maps/tileset/buildings.atlas", + "sprite":"LegendShop", + "overlaySprite":"Overlay8White", + "rewards": [ + { + "count":8, + "type":"Union", + "cardUnion": [ + { + "count":1, + "cardText": "Soldier" + }, + { + "count":1, + "subTypes": ["Soldier"], + }, + { + "count":1, + "subTypes": ["Goblin"], + "colors": ["black"] + } + ] }] } ] \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/world/waste.json b/forge-gui/res/adventure/Shandalar/world/waste.json index 1b4d3feab2d..0577f00ea50 100644 --- a/forge-gui/res/adventure/Shandalar/world/waste.json +++ b/forge-gui/res/adventure/Shandalar/world/waste.json @@ -59,7 +59,9 @@ "Final Castle", "Colorless Castle", "Skep", - "Waste Town", + "Waste Town Generic", + "Waste Town Identity", + "Waste Town Tribal", "Fort", "Fort1", "Fort2", diff --git a/forge-gui/res/adventure/Shandalar/world/white.json b/forge-gui/res/adventure/Shandalar/world/white.json index a237f818231..a76cbf59ba0 100644 --- a/forge-gui/res/adventure/Shandalar/world/white.json +++ b/forge-gui/res/adventure/Shandalar/world/white.json @@ -53,7 +53,9 @@ ], "pointsOfInterest": [ "White Castle", - "Plains Town", + "Plains Town Generic", + "Plains Town Identity", + "Plains Town Tribal", "Plains Capital", "Monastery", "Monastery1", diff --git a/forge-gui/res/languages/en-US.properties b/forge-gui/res/languages/en-US.properties index c62032ddb65..675da5849e8 100644 --- a/forge-gui/res/languages/en-US.properties +++ b/forge-gui/res/languages/en-US.properties @@ -1090,6 +1090,7 @@ lblAutoCacheSize=Enable Auto Cache Size nlAutoCacheSize=When enabled, Cache size are automatically determined on startup. (If unsure, turn OFF this option) lblUseLaserArrows=Use Laser Arrows nlUseLaserArrows=When enabled, Forge will use the new Targeting Arrows Overlay. +lblExpandedShops=Expanded card shops #MatchScreen.java lblPlayers=Players lblLog=Log @@ -2416,6 +2417,7 @@ lblCardChooseAnOpponentToGainNLife={0} - Choose an opponent to gain {1} life lblMillNCardsFromYourLibraryConfirm=Mill {0} card(s) from your library? lblPayNLifeConfirm=Pay {0} life? lblPayEnergyConfirm={0}?\n(You have {1} {2}) +lblPayShardsConfirm={0}?\n(You have {1} {2}) lblPutCardToLibraryConfirm=Put {0} to library? lblPutNCardsFromYourZone=Put {0} card(s) from your {1} lblFromZonePutToLibrary=Put from {0} to library diff --git a/forge-gui/res/skins/default/sprite_adventure.png b/forge-gui/res/skins/default/sprite_adventure.png new file mode 100644 index 00000000000..983d93548e8 Binary files /dev/null and b/forge-gui/res/skins/default/sprite_adventure.png differ diff --git a/forge-gui/src/main/java/forge/gamemodes/match/HostedMatch.java b/forge-gui/src/main/java/forge/gamemodes/match/HostedMatch.java index 8cca6f6bd9c..2fd44a8cd74 100644 --- a/forge-gui/src/main/java/forge/gamemodes/match/HostedMatch.java +++ b/forge-gui/src/main/java/forge/gamemodes/match/HostedMatch.java @@ -503,4 +503,8 @@ public class HostedMatch { }); } } + + public List getHumanControllers(){ + return humanControllers; + } } diff --git a/forge-gui/src/main/java/forge/localinstance/properties/ForgeConstants.java b/forge-gui/src/main/java/forge/localinstance/properties/ForgeConstants.java index d6857260cfc..a3470a9353c 100644 --- a/forge-gui/src/main/java/forge/localinstance/properties/ForgeConstants.java +++ b/forge-gui/src/main/java/forge/localinstance/properties/ForgeConstants.java @@ -127,6 +127,7 @@ public final class ForgeConstants { public static final String SPRITE_SLEEVES2_FILE = "sprite_sleeves2.png"; public static final String SPRITE_FAVICONS_FILE = "sprite_favicons.png"; public static final String SPRITE_PLANAR_CONQUEST_FILE = "sprite_planar_conquest.png"; + public static final String SPRITE_ADVENTURE_FILE = "sprite_adventure.png"; public static final String SPRITE_SETLOGO_FILE = "sprite_setlogo.png"; public static final String SPRITE_WATERMARK_FILE = "sprite_watermark.png"; public static final String SPRITE_DRAFTRANKS_FILE = "sprite_draftranks.png"; diff --git a/forge-gui/src/main/java/forge/localinstance/skin/FSkinProp.java b/forge-gui/src/main/java/forge/localinstance/skin/FSkinProp.java index d8f4f72fe2d..5585fa2f71d 100644 --- a/forge-gui/src/main/java/forge/localinstance/skin/FSkinProp.java +++ b/forge-gui/src/main/java/forge/localinstance/skin/FSkinProp.java @@ -267,6 +267,9 @@ public enum FSkinProp { ICO_QUEST_BIG_SWORD (new int[] {320, 1360, 160, 160}, PropType.ICON), ICO_QUEST_BIG_BAG (new int[] {480, 1360, 160, 160}, PropType.ICON), + //adventure icons + ICO_MANASHARD (new int[] {0,0, 100,100}, PropType.ICON), + //menu icon ICO_MENU_GALAXY (new int[] {0, 1520, 80, 80}, PropType.ICON), ICO_MENU_STATS (new int[] {80, 1520, 80, 80}, PropType.ICON), @@ -575,6 +578,7 @@ public enum FSkinProp { MANAICONS, PHYREXIAN, PLANAR_CONQUEST, + ADVENTURE, DECKBOX, SETLOGO, WATERMARKS, diff --git a/forge-gui/src/main/java/forge/player/HumanCostDecision.java b/forge-gui/src/main/java/forge/player/HumanCostDecision.java index 555dea22daa..f0523fc8057 100644 --- a/forge-gui/src/main/java/forge/player/HumanCostDecision.java +++ b/forge-gui/src/main/java/forge/player/HumanCostDecision.java @@ -596,6 +596,17 @@ public class HumanCostDecision extends CostDecisionMakerBase { return null; } + @Override + public PaymentDecision visit(final CostPayShards cost) { + Integer c = cost.getAbilityAmount(ability); + + if (player.canPayShards(c) && + confirmAction(cost, Localizer.getInstance().getMessage("lblPayShardsConfirm", cost.toString(), String.valueOf(player.getCounters(CounterEnumType.MANASHARDS)), "{M} (Mana Shards)"))) { + return PaymentDecision.number(c); + } + return null; + } + @Override public PaymentDecision visit(final CostPartMana cost) { // only interactive payment possible for now =( diff --git a/forge-gui/src/main/java/forge/player/HumanPlay.java b/forge-gui/src/main/java/forge/player/HumanPlay.java index db63beeaa83..f92473ef39d 100644 --- a/forge-gui/src/main/java/forge/player/HumanPlay.java +++ b/forge-gui/src/main/java/forge/player/HumanPlay.java @@ -519,6 +519,17 @@ public class HumanPlay { part.payAsDecided(p, PaymentDecision.card(source), sourceAbility, hcd.isEffect()); } + else if (part instanceof CostPayShards) { + CounterType counterType = CounterType.get(CounterEnumType.MANASHARDS); + int amount = getAmountFromPartX(part, source, sourceAbility); + + if (!mandatory && !p.getController().confirmPayment(part, Localizer.getInstance().getMessage("lblDoYouWantSpendNTargetTypeCounter", String.valueOf(amount), counterType.getName()), sourceAbility)) { + return false; + } + + p.payShards(amount, source); + } + else { throw new RuntimeException("GameActionUtil.payCostDuringAbilityResolve - An unhandled type of cost was met: " + part.getClass()); }