diff --git a/forge-ai/src/main/java/forge/ai/AiCostDecision.java b/forge-ai/src/main/java/forge/ai/AiCostDecision.java index 210209a702e..85b18b19908 100644 --- a/forge-ai/src/main/java/forge/ai/AiCostDecision.java +++ b/forge-ai/src/main/java/forge/ai/AiCostDecision.java @@ -785,6 +785,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-game/src/main/java/forge/game/Game.java b/forge-game/src/main/java/forge/game/Game.java index aa22a6087f6..18fdbb21b50 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; @@ -304,6 +295,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 5361516179f..26e79284745 100644 --- a/forge-game/src/main/java/forge/game/cost/Cost.java +++ b/forge-game/src/main/java/forge/game/cost/Cost.java @@ -325,6 +325,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 29df064dd01..57deedfa2a5 100644 --- a/forge-game/src/main/java/forge/game/cost/ICostVisitor.java +++ b/forge-game/src/main/java/forge/game/cost/ICostVisitor.java @@ -33,6 +33,7 @@ public interface ICostVisitor { T visit(CostUntap cost); T visit(CostUnattach cost); T visit(CostTapType cost); + T visit(CostPayShards cost); class Base implements ICostVisitor { @@ -190,6 +191,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 448f0f6c859..c6b4c3cef0d 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 4efd296ce93..e75ea46d62c 100644 --- a/forge-gui-mobile/src/forge/adventure/character/ShopActor.java +++ b/forge-gui-mobile/src/forge/adventure/character/ShopActor.java @@ -7,6 +7,8 @@ import forge.adventure.scene.RewardScene; import forge.adventure.stage.MapStage; import forge.adventure.util.Reward; +import java.util.Random; + /** * Map actor that will open the Shop on collision */ @@ -15,15 +17,19 @@ public class ShopActor extends MapActor{ private ShopData shopData; Array rewardData; + 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.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; @@ -51,4 +57,17 @@ public class ShopActor extends MapActor{ 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 13a4843d834..88d755b6a8e 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; /** @@ -43,6 +44,7 @@ public class RewardData { public String cardText; public boolean matchAllSubTypes; public boolean matchAllColors; + public RewardData[] cardUnion; public RewardData() { } @@ -66,6 +68,7 @@ public class RewardData { cardText =rewardData.cardText; matchAllSubTypes =rewardData.matchAllSubTypes; matchAllColors =rewardData.matchAllColors; + cardUnion =rewardData.cardUnion==null?null:rewardData.cardUnion.clone(); } private static Iterable allCards; @@ -121,6 +124,17 @@ 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); + + 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() ) { @@ -158,8 +172,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 f90ed97c58c..a96386f553f 100644 --- a/forge-gui-mobile/src/forge/adventure/data/ShopData.java +++ b/forge-gui-mobile/src/forge/adventure/data/ShopData.java @@ -11,6 +11,7 @@ public class ShopData { public String name; public String description; + public int restockPrice; public String spriteAtlas; public String sprite; public boolean unlimited; diff --git a/forge-gui-mobile/src/forge/adventure/player/AdventurePlayer.java b/forge-gui-mobile/src/forge/adventure/player/AdventurePlayer.java index fd1f48855db..331cdf65e66 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..ef7200287b8 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,41 @@ 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 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 @@ -222,11 +230,48 @@ public class RewardScene extends UIScene { } } + void updateRestockButton(){ + int price = shopActor.getRestockPrice(); + restockButton.setText("Refresh\n " + price + "[+shards]"); + restockButton.setDisabled(WorldSave.getCurrentSave().getPlayer().getShards() < price); + } + + void restockShop(){ + 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) { @@ -235,10 +280,8 @@ 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); @@ -252,7 +295,6 @@ public class RewardScene extends UIScene { if(background!=null) background.setVisible(true); } else { - goldLabel.setText(""); shopNameLabel.setVisible(false); shopNameLabel.setText(""); Actor background = ui.findActor("market_background"); @@ -278,19 +320,20 @@ 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); + } break; case Loot: - goldLabel.setText(""); shopNameLabel.setVisible(false); shopNameLabel.setText(""); + restockButton.setVisible(false); doneButton.setText(Forge.getLocalizer().getMessage("lblDone")); break; } @@ -355,7 +398,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; } } @@ -375,7 +418,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); @@ -390,7 +433,10 @@ public class RewardScene extends UIScene { } i++; } - updateBuyButtons(); + if (type == Type.Shop) { + updateBuyButtons(); + updateRestockButton(); + } } @@ -401,11 +447,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; @@ -413,11 +457,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()); @@ -425,13 +468,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()); @@ -439,7 +484,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/SettingsScene.java b/forge-gui-mobile/src/forge/adventure/scene/SettingsScene.java index ac401019774..f9141425840 100644 --- a/forge-gui-mobile/src/forge/adventure/scene/SettingsScene.java +++ b/forge-gui-mobile/src/forge/adventure/scene/SettingsScene.java @@ -113,7 +113,6 @@ public class SettingsScene extends UIScene { addLabel(Forge.getLocalizer().getMessage("lblCreate")+Forge.getLocalizer().getMessage("lblWorld")); settingGroup.add(newPlane).align(Align.right).pad(2); - addCheckBox(Forge.getLocalizer().getMessage("lblExpandedShops"), ForgePreferences.FPref.EXPANDEDADVENTURESHOPS); if (!GuiBase.isAndroid()) { SelectBox videomode = Controls.newComboBox(new String[]{"720p", "768p", "900p", "1080p"}, Config.instance().getSettingData().videomode, o -> { String mode = (String) o; 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..90f993d3b68 --- /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 = "shard_trader"; + + 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 af6cc501447..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); @@ -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 f264ab848b6..5a1d832c364 100644 --- a/forge-gui-mobile/src/forge/adventure/stage/MapStage.java +++ b/forge-gui-mobile/src/forge/adventure/stage/MapStage.java @@ -382,9 +382,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); @@ -477,6 +477,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(), ""); @@ -498,40 +513,63 @@ 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 "shop": - String shopList = new String(); - if (FModel.getPreferences().getPrefBoolean(ForgePreferences.FPref.EXPANDEDADVENTURESHOPS)) - { - int rarity = WorldSave.getCurrentSave().getWorld().getRandom().nextInt(100); + String shopList = ""; + int restockPrice = 0; - if (rarity > 95 & prop.containsKey("mythicShopList")){ - shopList = prop.get("mythicShopList").toString(); - } - - if (shopList.isEmpty() && (rarity > 85 & prop.containsKey("rareShopList"))){ - shopList = prop.get("rareShopList").toString(); - } - - if (shopList.isEmpty() && (rarity > 55 & prop.containsKey("uncommonShopList"))){ - shopList = prop.get("uncommonShopList").toString(); - } - - if (shopList.isEmpty() & prop.containsKey("commonShopList")){ - shopList = prop.get("commonShopList").toString(); - } + int rarity = WorldSave.getCurrentSave().getWorld().getRandom().nextInt(100); + if (rarity > 95 & prop.containsKey("mythicShopList")) { + shopList = prop.get("mythicShopList").toString(); + restockPrice = 5; } - - if (shopList.trim().isEmpty()){ - shopList = prop.get("shopList").toString(); + if (shopList.isEmpty() && (rarity > 85 & prop.containsKey("rareShopList"))) { + shopList = prop.get("rareShopList").toString(); + restockPrice = 4; } - - //refactor to tag Universes Beyond shops in some way but still include in rarity list above. - if (FModel.getPreferences().getPrefBoolean(ForgePreferences.FPref.EXPANDEDADVENTURESHOPS) & prop.containsKey("universesBeyondShopList")) - { - shopList = String.join(",", shopList, prop.get("universesBeyondShopList").toString()); + 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", ""); Array possibleShops = new Array<>(shopList.split(",")); + Array filteredPossibleShops = possibleShops; + filteredPossibleShops.removeAll(shopsAlreadyPresent, false); + if (filteredPossibleShops.notEmpty()){ + possibleShops = filteredPossibleShops; + } Array shops; if (possibleShops.size == 0 || shopList.equals("")) shops = WorldData.getShopList(); @@ -539,6 +577,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); } } @@ -546,13 +585,15 @@ 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); 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())); diff --git a/forge-gui-mobile/src/forge/adventure/util/CardUtil.java b/forge-gui-mobile/src/forge/adventure/util/CardUtil.java index 5735ee47517..e9d90fbd5f3 100644 --- a/forge-gui-mobile/src/forge/adventure/util/CardUtil.java +++ b/forge-gui-mobile/src/forge/adventure/util/CardUtil.java @@ -240,31 +240,30 @@ public class CardUtil { } } + public static List getPredicateResult(Iterable cards,final RewardData data) + { + List result = new ArrayList<>(); + CardPredicate pre = new CardPredicate(data, true); + 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) @@ -296,7 +295,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(); 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/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_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/maps/map/forest_town_generic.tmx b/forge-gui/res/adventure/Shandalar/maps/map/forest_town_generic.tmx index 975d41b5a29..98fce33f685 100644 --- a/forge-gui/res/adventure/Shandalar/maps/map/forest_town_generic.tmx +++ b/forge-gui/res/adventure/Shandalar/maps/map/forest_town_generic.tmx @@ -1,5 +1,5 @@ - + @@ -12,7 +12,7 @@ - eJxjYMANbJgYGOYzUgfbMeG25yAa+yYetaQCkFkH8cgj+7GKmTw7jmMRq2DG72dq+pEUs9HltNmxs2lt70l27Gxa25vBwcDQzwbBZwjYSyg88MUxPjeh+xfdHkLhoY5m/lE89k4E+ncSB3ZzQWGhx46bjw3g8he6uD4nA4MBJ25z0cVgbsMV5ujmq+FxTx8bIo4zofGty44qBuPD5LM4sNuLK46Jzb/oYU5KWsdmB7H2khO32OzAF864AKF0hg5g5TM2OwiVo/jshdkNi/cJbNj1YbP3INRuYuowcssvYsIUmztAeAEjxN55ZNTFoHoOAIlHVtg= + eJy1lVkKwjAQhqctdMF76IO4HEA8j3oC8RBuB1ChJ+mDSMELeBsb7NA4TmbSYgOhaZb58s/fJgDusggBrsF/6jJ0cwrSfglz2xYTqxDGbY27iJ8zTmTGg+nbRrJmH42lwu0Sm47Z2rDdJzcf/DJKB1fLexvuKgU4xADr+ontScXYpN9rcB8aX/JY87cU8q7lf0Ti3wXuqdJ2tvTZsTEnz6R5nypsly7aP8sA5hnP5fq0nNP4Q9K/jxtf7Yp+G5+p7/Y4/QawuDz2PaOo7jb/Fsfw5VIvfbzlGDTPPoVq1Nh4PnMM7RyVuMhG348xv47jFjXb5w7r47yU9mHqLfhwLx3uYnPPvQGEo2CM @@ -20,12 +20,12 @@ - eJzT5mFg0AFieoE2bgh9EmjnKR7sckMFLCbDvYPNj5+0EWxjHQYGE52Bc8tgA8SGRxad7BkJYDCHBaXxPNjATWDev6WNW55W/v0KtPMbHnsHAuQAcS4Sn15xzcXIwMDNiGknre0HABP1EEs= + eJzT5mFg0AFieoE2bgh9EmjnKR7scqQCXW3K3EQICAPNF8Fix2Iy3EuuH2kFPiH5y1iHgcFEhzxz9GgQB5S4h572Z5FiJpZwGmh/UgtYazEw2GhRZsZgCQsjLPFESjwPBXAT6MdbePItrfz7FWjnNxqX2aSCHCDOReLTK665GBkYuBkx7aS1/QB3HhO+ - eJxjYBj8IAuH+EEgPgRlZwNxDhrOpYM7ljMyMKwAYh4g5oJibkbSzb6mjWCL6zAwSOhgqjmEKcTASaG9+MBxPHIwf4PwSirbiw5whQc97TlKppnHoLQWmfoHCiCHRRYD7jxICOhxUstF9APk+nUg7D5GWAlOcBNY5tzSRhUbSL9TC5wYaAfgAYMlfAGGKxXV + eJxjYBj8IAtKf9ViYPimhRA/CMSHoOxsIM5Bw7lUsl9Qm4FBSBvhDmSwnJGBYQUQ8wAxFxRzM5JuxzVtBFtch4FBQgdTzSFMIQZOCu3FB47jcQ/M3yC8ksr2ogNc4UFPe46SaeYxKK2FVxV1gTzQMgUKLUQOiywG7GmfGKDHSZk7BgKQ69eBsBuWvshx801gmXNLG1VsIP1ODsDm3hN0dwXxYLCELwD5Hxp7 @@ -35,7 +35,6 @@ - @@ -44,7 +43,6 @@ - @@ -53,7 +51,6 @@ - @@ -62,7 +59,6 @@ - @@ -71,7 +67,6 @@ - @@ -80,14 +75,35 @@ - - + + + + + + + + + + + + + + + + + + + + + + + diff --git a/forge-gui/res/adventure/Shandalar/maps/map/forest_town_identity.tmx b/forge-gui/res/adventure/Shandalar/maps/map/forest_town_identity.tmx index 6064da6ac3d..3426d7ce52b 100644 --- a/forge-gui/res/adventure/Shandalar/maps/map/forest_town_identity.tmx +++ b/forge-gui/res/adventure/Shandalar/maps/map/forest_town_identity.tmx @@ -1,5 +1,5 @@ - + @@ -12,7 +12,7 @@ - eJxjYMANbJgYGOYzUgfbMeG25yAa+yYetaQCkFkH8cgj+7GKmTw7jmMRq2DG72dq+pEUs9HltNmxs2lt70l27Gxa25vBwcDQzwbBZwjYSyg88MUxPjeh+xfdHkLhoY5m/lE89k4E+ncSB3ZzQWGhx46bjw3g8he6uD4nA4MBJ25z0cVgbsMV5ujmq+FxTx8bIo4zofGty44qBuPD5LM4sNuLK46Jzb/oYU5KWsdmB7H2khO32OzAF864AKF0hg5g5TM2OwiVo/jshdkNi/cJbNj1YbP3INRuYuowcssvYsIUmztAeAEjxN55ZNTFoHoOAIlHVtg= + eJy1lVkKwjAQhqctdMF76IO4HEA8j3oC8RBuB1ChJ+mDSMELeBsb7NA4TmbSYgOhaZb58s/fJgDusggBrsF/6jJ0cwrSfglz2xYTqxDGbY27iJ8zTmTGg+nbRrJmH42lwu0Sm47Z2rDdJzcf/DJKB1fLexvuKgU4xADr+ontScXYpN9rcB8aX/JY87cU8q7lf0Ti3wXuqdJ2tvTZsTEnz6R5nypsly7aP8sA5hnP5fq0nNP4Q9K/jxtf7Yp+G5+p7/Y4/QawuDz2PaOo7jb/Fsfw5VIvfbzlGDTPPoVq1Nh4PnMM7RyVuMhG348xv47jFjXb5w7r47yU9mHqLfhwLx3uYnPPvQGEo2CM @@ -20,12 +20,12 @@ - eJzT5mFg0AFieoE2bgh9EmjnKR7sckMFLCbDvYPNj5+0EWxjHQYGE52Bc8tgA8SGRxad7BkJYDCHBaXxPNjATWDev6WNW55W/v0KtPMbHnsHAuQAcS4Sn15xzcXIwMDNiGknre0HABP1EEs= + eJzT5mFg0AFieoE2bgh9EmjnKR7scoMNCGszMIhoY4ovJsO9g82Pn5D8ZazDwGCiM3BuQQcD7R5i7c8ixUws6Wig/UktYK3FwGCjRZkZgzksSIlneoMsJEwsuAlMi7ewpEdkM4mxl1i1MPAVaOc3PPYSC15oUG4GDOQAcS4Sn15xzcXIwMDNiGknre0HAGN/FdI= - eJxjYBj8IAuH+EEgPgRlZwNxDhrOpYM7ljMyMKwAYh4g5oJibkbSzb6mjWCL6zAwSOhgqjmEKcTASaG9+MBxPHIwf4PwSirbiw5whQc97TlKppnHoLQWmfoHCiCHRRYD7jxICOhxUstF9APk+nUg7D5GWAlOcBNY5tzSRhUbSL9TC5wYaAfgAYMlfAGGKxXV + eJxjYBj8IAtKf9ViYPimhRA/CMSHoOxsIM5Bw7lUsl9Qm4FBSBvhDmSwnJGBYQUQ8wAxFxRzM5JuxzVtBFtch4FBQgdTzSFMIQZOCu3FB47jcQ/M3yC8ksr2ogNc4UFPe46SaeYxKK2FVxV1gTzQMgUKLUQOiywG7GmfGKDHSZk7BgKQ69eBsPsYYSU4wU1gmXNLG1WMHL+f0aDAETQAJwbaAXjAQKYtZAAAL4Yamw== @@ -35,7 +35,6 @@ - @@ -44,7 +43,6 @@ - @@ -53,7 +51,6 @@ - @@ -62,7 +59,6 @@ - @@ -71,7 +67,6 @@ - @@ -80,14 +75,35 @@ - - + + + + + + + + + + + + + + + + + + + + + + + diff --git a/forge-gui/res/adventure/Shandalar/maps/map/forest_town_tribal.tmx b/forge-gui/res/adventure/Shandalar/maps/map/forest_town_tribal.tmx index 9fe1aa245bd..67d2d067d54 100644 --- a/forge-gui/res/adventure/Shandalar/maps/map/forest_town_tribal.tmx +++ b/forge-gui/res/adventure/Shandalar/maps/map/forest_town_tribal.tmx @@ -1,5 +1,5 @@ - + @@ -12,7 +12,7 @@ - eJxjYMANbJgYGOYzUgfbMeG25yAa+yYetaQCkFkH8cgj+7GKmTw7jmMRq2DG72dq+pEUs9HltNmxs2lt70l27Gxa25vBwcDQzwbBZwjYSyg88MUxPjeh+xfdHkLhoY5m/lE89k4E+ncSB3ZzQWGhx46bjw3g8he6uD4nA4MBJ25z0cVgbsMV5ujmq+FxTx8bIo4zofGty44qBuPD5LM4sNuLK46Jzb/oYU5KWsdmB7H2khO32OzAF864AKF0hg5g5TM2OwiVo/jshdkNi/cJbNj1YbP3INRuYuowcssvYsIUmztAeAEjxN55ZNTFoHoOAIlHVtg= + eJy1lVkKwjAQhqctdMF76IO4HEA8j3oC8RBuB1ChJ+mDSMELeBsb7NA4TmbSYgOhaZb58s/fJgDusggBrsF/6jJ0cwrSfglz2xYTqxDGbY27iJ8zTmTGg+nbRrJmH42lwu0Sm47Z2rDdJzcf/DJKB1fLexvuKgU4xADr+ontScXYpN9rcB8aX/JY87cU8q7lf0Ti3wXuqdJ2tvTZsTEnz6R5nypsly7aP8sA5hnP5fq0nNP4Q9K/jxtf7Yp+G5+p7/Y4/QawuDz2PaOo7jb/Fsfw5VIvfbzlGDTPPoVqpGzqMZ7PHEM7RyUustH3Y8yv47hFzfa5w/o4L6V9mHoLPtxLh7vY3HNv0GRgvg== @@ -20,12 +20,12 @@ - eJzT5mFg0AFieoE2bgh9EmjnKR7sckMFLCbDvYPNj5+0EWxjHQYGE52Bc8tgA8SGRxad7BkJYDCHBaXxPNjATWDev6WNW55W/v0KtPMbHnsHAuQAcS4Sn15xzcXIwMDNiGknre0HABP1EEs= + eJzT5mFg0AFieoE2bgh9EmjnKR7scsiAkZn2biIEhLUZGES0oRwk9yzG4l5CAJsfBxJ80kawjXUYGEx0yDPnHxN13IMMKHEPPe3PIsFMbOE00P6kFrDWYmCw0aLMjEETFljKHVLimVLARIdy7yYw79/Sxi1PK/9+Bdr5DY+9AwFygDgXiU/LuP6PVAZwMTIwcDNi2knrtAYAUVAVYg== - eJxjYBj8IAuH+EEgPgRlZwNxDhrOpYM7ljMyMKwAYh4g5oJibkbSzb6mjWCL6zAwSOhgqjmEKcTASaG9+MBxPHIwf4PwSirbiw5whQc97TlKppnHoLQWmfoHCiCHRRYD7jxICOhxUstF9APk+nUg7D5GWAlOcBNY5tzSRhUbSL9TC5wYaAfgAYMlfAGGKxXV + eJxjYBj8IAtKf9ViYPimhRA/CMSHoOxsIM5Bw7lUsl9Qm4FBSBvhDmSwnJGBYQUQ8wAxFxRzM5JuxzVtBFtch4FBQgdTzSFMIQZOCu3FB47jcQ/M3yC8ksr2ogNc4UFPe46SaeYxKA1KttjSDy2APNAyBS3C6vAB5LDIYiDf7XqclLljIAC94okadsPSFyn6YGpvAsucW9rY5YYKwObeE3R3BfFgsIQvALDsG08= @@ -35,7 +35,6 @@ - @@ -44,7 +43,6 @@ - @@ -53,7 +51,6 @@ - @@ -62,7 +59,6 @@ - @@ -71,7 +67,6 @@ - @@ -80,14 +75,35 @@ - - + + + + + + + + + + + + + + + + + + + + + + + diff --git a/forge-gui/res/adventure/Shandalar/maps/map/island_town_generic.tmx b/forge-gui/res/adventure/Shandalar/maps/map/island_town_generic.tmx index 6877db5c952..1f96d42437b 100644 --- a/forge-gui/res/adventure/Shandalar/maps/map/island_town_generic.tmx +++ b/forge-gui/res/adventure/Shandalar/maps/map/island_town_generic.tmx @@ -1,5 +1,5 @@ - + @@ -12,7 +12,7 @@ - eJxjYBgFowA/KOWljz2T2BgYJkOxETtCXB8HmxxQRsAvZ9kJs2kBzrEj/J7LgWDncUDkCbmbXEArf2FLM/o4whMmjk5TCxCKU3SaWiAHKR7PY4lfGA2LY1oAWqdbZFDCi6DpaS8yGLWXOAAAywwdJA== + eJxjYBgFQwHosw+MvWeB9pby0s78SWwMDJOx4AtI/tXHwSYHlBHwy1l2wmxagHPsCL/nciDYeRwQeULuJhfQyl/Y0ow+jvCEiaPTlAJYmF4gEKfoNKX2Z0PjLAcpHs9jiV90GhbX1AS0TrfIoIQXQdPTXmQwai9xAADlPiO/ @@ -20,12 +20,12 @@ - eJxjYKAfKORgYCgC4mIOOloKBPycDAwCQCzISV97KQWdWgwMXVr0t3cp0M5lQKw3SMLLWIeBwUQHk00pyOUiT24UkAdwxR1MHJ2mFaB13C7jpq35o4D64Ao7A8NVdvrbOxD1IQgAAJpJDjM= + eJxjYKAfKORgYCgC4mIOOloKBPycDAwCQCzISV97KQWdWgwMXVoQtrEOA4OJDu3s2qjOwLBJHcJeCrRzGRDrDZLwQvY7NcMhl4s8uZEI9LXJ02cNTEc2BNIwTBydphUgFLfLuBkYDMn0L0z/YAUmUH8ZUOC/4QiusDMwXGWnv70DUR+CAAAD6BOP - eJxjYBgFgxV0ajEwdGkNtCsQQFyHgUFCB5M9CoYWwBV3MHF0ehSMglEwvAAARWUEkg== + eJxjYBgFpABxHQYGCR3amT9VnYFhmjqE3anFwNClRTu7SAXIfqd1OIwC6gJ5YDpSgKYlXHEHE0enR8EoGAXDCwAAl/AHJQ== @@ -35,7 +35,6 @@ - @@ -44,7 +43,6 @@ - @@ -53,7 +51,6 @@ - @@ -62,7 +59,6 @@ - @@ -71,7 +67,6 @@ - @@ -80,14 +75,35 @@ - - + + + + + + + + + + + + + + + + + + + + + + + diff --git a/forge-gui/res/adventure/Shandalar/maps/map/island_town_identity.tmx b/forge-gui/res/adventure/Shandalar/maps/map/island_town_identity.tmx index 344a42bdf3c..8a65b6bb021 100644 --- a/forge-gui/res/adventure/Shandalar/maps/map/island_town_identity.tmx +++ b/forge-gui/res/adventure/Shandalar/maps/map/island_town_identity.tmx @@ -1,5 +1,5 @@ - + @@ -12,7 +12,7 @@ - eJxjYBgFowA/KOWljz2T2BgYJkOxETtCXB8HmxxQRsAvZ9kJs2kBzrEj/J7LgWDncUDkCbmbXEArf2FLM/o4whMmjk5TCxCKU3SaWiAHKR7PY4lfGA2LY1oAWqdbZFDCi6DpaS8yGLWXOAAAywwdJA== + eJxjYBgFQwHosw+MvWeB9pby0s78SWwMDJOx4AtI/tXHwSYHlBHwy1l2wmxagHPsCL/nciDYeRwQeULuJhfQyl/Y0ow+jvCEiaPTlAJYmF4gEKfoNKX2Z0PjLAcpHs9jiV90GhbX1AS0TrfIoIQXQdPTXmQwai9xAADlPiO/ @@ -20,12 +20,12 @@ - eJxjYKAfKORgYCgC4mIOOloKBPycDAwCQCzISV97KQWdWgwMXVr0t3cp0M5lQKw3SMLLWIeBwUQHk00pyOUiT24UkAdwxR1MHJ2mFaB13C7jpq35o4D64Ao7A8NVdvrbOxD1IQgAAJpJDjM= + eJxjYKAfKORgYCgC4mIOOloKBPycDAwCQCzISV97KQWdWgwMXVoQtrEOA4OJDu3s2qjOwLBJHcJeCrRzGRDrDZLwQvY7NcMhl4s8uZEInmiQp88amI5s0NLwWTSzYOLoNLXBS6i9hOJ2GTdl9lCqfxTQH1xhZ2C4yk5/eweiPgQBAMi+FTE= - eJxjYBgFgxV0ajEwdGkNtCsQQFyHgUFCB5M9CoYWwBV3MHF0ehSMglEwvAAARWUEkg== + eJxjYBgFpABxHQYGCR3amT9VnYFhmjqE3anFwNClRTu7SAXIfqd1OIwC7OCEBnn65IHpSAGalnDFHUwcnR4Fo2AUDC8AAJuECBU= @@ -35,7 +35,6 @@ - @@ -44,7 +43,6 @@ - @@ -53,7 +51,6 @@ - @@ -62,7 +59,6 @@ - @@ -71,7 +67,6 @@ - @@ -80,14 +75,35 @@ - - + + + + + + + + + + + + + + + + + + + + + + + diff --git a/forge-gui/res/adventure/Shandalar/maps/map/island_town_tribal.tmx b/forge-gui/res/adventure/Shandalar/maps/map/island_town_tribal.tmx index 854f9a467ea..160d5262e4a 100644 --- a/forge-gui/res/adventure/Shandalar/maps/map/island_town_tribal.tmx +++ b/forge-gui/res/adventure/Shandalar/maps/map/island_town_tribal.tmx @@ -1,5 +1,5 @@ - + @@ -12,7 +12,7 @@ - eJxjYBgFowA/KOWljz2T2BgYJkOxETtCXB8HmxxQRsAvZ9kJs2kBzrEj/J7LgWDncUDkCbmbXEArf2FLM/o4whMmjk5TCxCKU3SaWiAHKR7PY4lfGA2LY1oAWqdbZFDCi6DpaS8yGLWXOAAAywwdJA== + eJxjYBgFQwHosw+MvWeB9pby0s78SWwMDJOx4AtI/tXHwSYHlBHwy1l2wmxagHPsCL/nciDYeRwQeULuJhfQyl/Y0ow+jvCEiaPTlAJYmF4gEKfoNKX2Z0PjLAcpHs9jiV90GhbX1AS0TrfIoIQXQdPTXmQwai9xAADlPiO/ @@ -20,54 +20,90 @@ - eJxjYKAfKORgYCgC4mIOOloKBPycDAwCQCzISV97KQWdWgwMXVr0t3cp0M5lQKw3SMLLWIeBwUQHk00pyOUiT24UkAdwxR1MHJ2mFaB13C7jpq35o4D64Ao7A8NVdvrbOxD1IQgAAJpJDjM= + eJxjYKAfKORgYCgC4mIO+tn5n4mBgZ+TgUEAiAU56WcvzG5SwVR1BoZp6hB2pxYDQ5cWhG2sw8BgokM9t6GDjUA7N0HtXQq0cxkQ69E5vHABZL9TMxxyuciTG0qAkRm33D8y0iepwBqYjmxwpGGY/TBxdJpWgFDcLuOmzHxK9Y8C+oMr7AwMV4GYAU9+oQWgd30IAwDoJheh - eJxjYBgFgxV0ajEwdGkNtCsQQFyHgUFCB5M9CoYWwBV3MHF0ehSMglEwvAAARWUEkg== + 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..382e308b98f 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== + eJzNmElOw0AQAOcEkRIUKywfSHAC5gY3+Ah3lnBn+wAETogHwBsA8QFIAgjEK3gBOxcQbcWjdIbu2eyEtNSSl/G43Nu0JywIEYGGoFXQYZDphCdKtAzaAm0PCV8TOCoJY8x2D7pZFGJrSHS72GWUPi0FQowPiU4EXTu2Fb4p0PN/0kmFD0uJuFdl4qORF+IA6WG+9/5+nn7OJBQDdc80fzPJpxaTV4Pgk+9YjfRzlgmeIzg/Tq6tKc/PzwmxMNd7rebIJ4h36kT9ngew56NHrXLhi32IGevIDpQN1O/BzFhm0bG0rRznwpeFYL6Kxfh+8FG2pPgoUWPbhU+Na1+hGO+YsYPw7wkk42nNPK4ffFd+r9UKjg8fvnpGfraRNPZrMGtZWsFxnoZP9oxxv/MOc34Y7PoNMfjjGIeufDj/mxn1sLranjY/cN+i+vkZmp0XruGxFB8+XKukDeO+9qqQfSy68lG1da/QicWoD/9TafyrxiJlw0VY/JeSBuATxn8xObTOXM9y/cCMOB6jUbvnscic8eWbNjBiX9dz0J+OdHQj58bpwsf1Ja/gmzfG12puc30AN3ca/+r6GZzXXN7YrN22fDeGeThWLm+k3KLj5Rk9Q9uCXeYs12cSr3CuPevM+ivXAh0fJab/OXUdpMavWNQX+Z22fOUxninUIxu5OL6Q4Nv13M+JJe0e007RzJdmPyerPSbKv2eB217OJTq+CP7Ocek437kyn2o/X3mq6c99heJTa85/Slb2cxHZvuJ1r0WMi2vftSefTS15cJ+2pzeXbNGA7afuax4QTKoOUmTNoDhCZDN8/gsMt+8u @@ -30,20 +30,23 @@ - eJzt1DkKgDAQBdDfuAupp8h59FTqlfRytk4vBsHAyOQ/SJFUswYgInpnisAcraOwxRrkw1rmtQtwiHUU+XA+/qfTfvROe2I1b5XubO1obylt0BkbneyQxz/6KadG39qPuXqsFxGVaQnAqmcL1pHcnZK+E1G5Ls9cDMw= + eJzt1EsKgCAUBdC7g4Y1q1lirrHf5lpB/xaT0DCKIOuF3QOCjny+jwAR0TWhASIjHYUs5sAd5tKtSgG1ko7CHfbH94wZMGXSUTxDqt/aFOjS9++l98QaSPS2n+38LJ7MkI9/9NGbeluz4WbdfMwXEf1THgCFXWUgHcleo87PRPRfKyQjEbs= - + + + + - + @@ -56,49 +59,72 @@ - + + - + + - + + + + - + - + + + + - + + + + - + + + + - + + + + - + + + + - + + + + @@ -163,5 +189,30 @@ } + + + + + + + + + + + + + + + + + + + + + + + + + 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..ff66ef87724 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 @@ - + - + - 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 @@ -30,55 +35,79 @@ - eJzt1jsOgzAMBmDfgBm4K/Qm0FPwFmy0PVFHPEQC0S60DjbR/0leUIitBCcQAVzHO9Z5F2CrSYnaVG5cKDR7LKT+/uW7eSZEr8R/HoC9gnuvdHE32Icd19S7GAzWB6uzzySf+Sqet/4yd8fPeqGcFu+9f2oaeV2mA2sz8533OHjvwXmk+wv/LLosnjeasB76JPcA+/kpi4hyF7dIuxoAGQufWSj0 + eJxjYBgFo2DogBMaqPxOLQaGLi1MddjE0fWOgsELsMWfPJCvQGRcjwLyASXhOZB5jBS7h2OamanJwDBLc6BdMbQAKfXHKMAN8oF5rwCKC2lUBlASJ91AN/VAce9oO2AUIAFa5vV2oLkdWMzuBor1UMnOwdiupcRN/cBwmUBC2EwH1nkzhni9R0kaHK2rRgE9wWAsbwYSjIbHwANqxsFofGKCOn4GhnoobuAfaNeMglFAHQAAkqgpdw== - + - + + + + - + - + + + + - + - + + + + - + - + + + + - + - + + + + - + + + + - + - + + + + - + - + + + + - + - + @@ -141,15 +170,38 @@ - + + - + + + + + + + + + + + + + + + + + + + + + + + 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..d898cf53f01 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 @@ - 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 @@ -30,55 +30,71 @@ - eJzt1DsKgDAMgOHoolvnWupR1dv5uIleQgMKDio4WErl/6AhfUEgEBEAAID/ma3IYvd89Rrq65tRzyd/7jMnkrvjT6XBha4SQCoKnQele5/f6XXeDP75HvF80V8Au8aItLo6E7sShEB/AaRmAzrgDb8= + eJzt1O8JgzAQh+HfBo5gv2nEGatb+GeTdolaLdQFdA4PbLFgP0hBRPs+EHI5ErgQchIAAMDxXELpGo7xLZaqeL6nsFz5kb87qXavMzZXbv06gb1pAukRTOvO/kn/B3/laXds3fL4zY+kUzTGmfWb/EsvwvZ+fV8Ac2dPSmyk3taVYA28L4C9GQDl9SK0 - + + + + - + + + + - + + + + - + + + + - + + + + - + + + + - - - - - - + + + + - + - + @@ -156,15 +172,52 @@ - + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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..9735b778741 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 + eJztmF1OwkAQgPfJbssl9I0ERa9gjOI99CLic9FwBdRj6FUU9BkQDuBOyqSToVtmu7tSEyeZsCnN9uv8b5Vqn8y1UmeZUqN03yTVkqcFW0y+y0SpqwY6SErbxeSbmed8NtCvpGT71u3lA7aTTPasYafUpnyDrlLX3WLNhfNVsUHOnJprC/O71NtcXF35bgzbrZCvym40Zx5IXDZhq+I7MHsmFfqSbvNViZRPKtL4Oze2WvWUWvfq+XrmvrUu+PrEz65cTfgk9gMZExtyO/7z/X0+miMu9XEffI+evS80H51pfH0bgy8PGHvINyG117ZGPrwm5Qvh3/es7BMflvXFZj3N3PigRi895pvY/vW1YUg+nhuh+ELFH/TelWE8Jj04RH0OGX8o6Oc21Oc5i3/qZzrD7IsvZ/7jOeJjw9B8YLu6MyHEr8s58TD140NfosDsUvfOfJ9QauMbk/MlsraNr5+V61GL7Ldg31/yjS3bwkdzFPn6O/xLa61En4X3TWv4MP6wfwDfm7n+Ksw9F7tQferY/6N8vH8B31Eqrw27+OBdh7pQyTvD/ffa3v/vdLmfjwIL8NFaK9mbsvn21zqZJdt8NuFnMpxPfOfjUHz0TAtMmAuxbOfKZ/vuE1Oa8MWMNy4ufOBPmIt/iw3EhW+X/ADqlHWN - eJztlO0KgkAQRS/+y4L2r5jWixWaQj1G9PHeuYhkwyJSaw7bPTDM7AfsYdhdgPjiuvQX9KOfL79bAtybeCQ6/bT3j370C8VvnwKHVK/fN/ybX5UBdTZcd7jmpvbzDf10+fH+0U+rXxW9j+vIvW8uv0/YroBdE/GizV1sTJtz81qzWdb9ORfnXo/KEf3SxFGBr7xzWimE50mBt3SS4zHvl7iRvZySy/p3Z4WK/c8tuZnXg5DQeQKDcgII + eJztlMsKwjAQRS/daQXzAdK6LKW60T9R975AP0P8chtKsQ5BSpvaId4Dw0wekMOQBCC+eMb+gn708+W3y4B9GYdMp5/2/tGPfqH4rXJgnev168O/+W0KYFt8r2tcc0P7+YZ+uvx4/+in1e8SfY6vkXvfWH5dSGfAsozppMp1LEyVE/Nes1nWzTkX90aPTi36pYmzAl9557RyFJ43Bd7SSY7bvF/iRvZySB7z350VKvY/tyRmXA9CQucFNwz/RA== @@ -25,60 +25,84 @@ - eJztmEsOgjAQhmdnJMGVK4gbT4HixnAO3eol9CC+Nt4J3fk4iRBpLDh9wACW2D+ZpJ06088WhrQA3dDOBdgbYgf3my8YAEwymyV2IVhYIUfIzT8dyPmw8TIKKuRQzR9w//n6A76YW0cRH3Xd6sgliu0637lPn4MSq8o5d+hzUGItHy2W949HHz9rMz5sjPe1wXdPWHr9tz2yduTk+3z76ejNkWrhAyx9Gh8mk/YXk0l8Gw9g6+nxrZK9Whf2q2k+rBbL1q/4+zbfD2YR4mNW5v2ogw+TSc8fJpP4ZPW5OI71f1mfizXaPn96OU3gO0nOeymf7hn06DbDJzoTpuellC8WjIti6ubD/MPsO3dz8v2m1Mb5iCLLR1OX+U6S+yOVdsj9E+ZTxYtqE/V+CIsvk1PnfoiNi+q0qibL+FQ5sXheZWqvbm2umpN6f2Zl9S96AU0B1qI= + eJztmMkOgjAQhudgYiDB90CjV3E5aDzrA7pw8Z3Um8sj+ARCsLHidGNYSuyfTGg7mekHpZO0AO3QNgDYWWL74Jcv6gFM3jZP7EywWYEcM27+aU/Oh/lNFBXIoZo/4t750gDfifuOIj7qdysjlyi27XxHjz4HJVaVc+nT56DEOj5aLD/+HHzGWZvxYT5+rA6+W8LS9TK7v9sr/7vPtx++3hyphn2AUZ/Gh8mm9cVkE986BNiEenzjZK2i3HpVzYfVYp4v78/369wfzFbIvmBmsj/K4MNk0/+HySY+WX3O+7F+k/XZ/X/t5Ysl572UT/cMegiq4ROdCdPzUsp3EvhFMWXzYeOLTva8+t/9qlTH+Ygix0dTm/liyf2RSlvk/gkbU8WLahP1fgiLN8mpcz/E/KI6rarJMj5VTiyel0nt1a3NRXNS78+cnP5FLxlP310= - eJzt1E0OgjAQBeC3EnddF9LD6EYSvARswEsIx/JoLp2dEUqDkTKA70ua9G/xkmkHIKJf1BZoZNysdhLySRxwdNopPj1S7QTxHJx/PnbWv7Nlpww4Z9op/lspf6ua+L8KqdV1pF4XeZe5C899d4nmEOv9hfqzb29P/ZnoW3cDtDI6o51k6GnDayIieltzPyei5bwA2sMSFQ== + eJzt1E0KwjAQBeAHHqDoRqGCLtumm7rRoofyBK3LnsNDaY/jLP1JAlLqJPV9EEjaLB6ZZAAiGmKfAQcZdaadhGzuBuiNdopXXa6dYDw3Y5+7/r3vidm8ABaFdor/Vsnb2jne10Zqs32qTyrztaNeyxJYlf65be8QR8ly4v0hjHf/fP3Z9m1K/ZnoW00CtDIuiXaST9eZfx2bc+5fh6IONFcs50ekJeR+TkS/8wCuWBuR - + + + + - + + + + - + + + + - + + + + - + + + + - + + + + - + + + + - + + + + - + @@ -145,13 +169,13 @@ - + - + @@ -166,5 +190,26 @@ + + + + + + + + + + + + + + + + + + + + + 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..02106894862 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 @@ - 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 @@ -25,12 +25,12 @@ - eJzty0EGACAABMA+ED0gvb7+2SkRHYoOMcOyh90QAAAAAO60eJahHv7W/ws5zV7SfgcA/KEDgLsSbg== + eJztzsEJgDAMBdAsIHQA8d7OrZPpDnr0JAXBQxEV4T0I5EM+JAIAuGsuEUupec0RW/7uHwCAt0xd2xzGxt65/4Q+1X1I13cAwD/scwwWyg== - eJzt0ksKhDAQRdGa2xB00kotQFdpC/3R7eoKrIETUVoRY4HcA4HiQUjIiwgAAH7eKvLRZd5bNqzk8Pe1Xn4r3bSWdXQWXWJv/ND989VKO7fS/TPmYvb7tD25/p+30O9xaSGSFd638HPG/8M91EHkNa0meN8GAADc3Qj2GhFY + eJzt0rENgzAQBdC/ASNAh+x1IAnThKwWGtgBGtIkG5AyV6SwBCIUdk62/pMsnb9k+aQ7gIiISE9lgdqu87tknZP3Ug/OfTTAZML3R2snmcN5Y2YXyZqNnPxyd/9I/W+L/Ps2x2vfctnBIuI9DDnfp7x5mf36F+35xmwugUep3YUeH/tHabhmQPs9t0y7GyIiIkrdB4cVPLM= @@ -38,7 +38,7 @@ - + @@ -106,54 +106,101 @@ - + + - + + - - - - - - + + + + - + + + + - + + + + - + + + + - + + + + - + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/forge-gui/res/adventure/Shandalar/maps/map/mountain_town_generic.tmx b/forge-gui/res/adventure/Shandalar/maps/map/mountain_town_generic.tmx index 255a48410af..4fc55b951db 100644 --- a/forge-gui/res/adventure/Shandalar/maps/map/mountain_town_generic.tmx +++ b/forge-gui/res/adventure/Shandalar/maps/map/mountain_town_generic.tmx @@ -1,5 +1,5 @@ - + @@ -20,12 +20,12 @@ - eJxjYBgFQwXsYGFgkMaDd7FQph8X/saK39xQCuR3sSHYmZoMDFma+M0i1V5jHQYGEx0IH5kNA3qcDAytQDvbqGyvPjuCj8xGBmdxiFNibw4HA8NkNgi+QCd7v7CipkFk85HDHJc4LjYhe9HdeBZHmOMSx8Um1V7kMM9FYp9nxy6OzM7jIM9e5DBHLwNA/iUlrxPK38SGA8heUvxADTBqL3kAAOTKMnc= + eJxjYBgFQwXsYGFgkMaDd7FQph8X/saKas4uNgYGeS0GBgUtCD+UFdMuZIAsr6uNaRYMZGoyMGQB8Xp1BoYN6hAxPaB6Yx0GBhMgPsvOwGANtNOGBHthekEAmQ0DepwMDK1AO9uAWJ8d1X05HAwMk4HuO88OofM4iLcXZBYMILORwVl2VBquXhu7ODH2wtwMwhdw2HsOzT+43EWsvV9YUdMgsn7kMMcljhy/yHxC9qK78SyOMMclro8W/jA+qfYih3kuEhuWbtDFYWwYTWy6QgbIYY5eBoD8Q0peR8/f5ABY+JPiB2qAUXvJAwB5S0IJ - eJxjYBgFo4D2QFyHgUFCB5M9CugDcIU5rngZjaNRMAqGLwAAMLIDKw== + eJxjYBgFowA7mKzOwDBFHcEX12FgkNAhzyxkvZSYMwrIA7jCHF+8jMbTKBgFwxMAAMK5BSc= @@ -35,7 +35,6 @@ - @@ -44,7 +43,6 @@ - @@ -53,7 +51,6 @@ - @@ -62,7 +59,6 @@ - @@ -71,23 +67,48 @@ - - + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/forge-gui/res/adventure/Shandalar/maps/map/mountain_town_identity.tmx b/forge-gui/res/adventure/Shandalar/maps/map/mountain_town_identity.tmx index 297fc1cffac..dbba9428589 100644 --- a/forge-gui/res/adventure/Shandalar/maps/map/mountain_town_identity.tmx +++ b/forge-gui/res/adventure/Shandalar/maps/map/mountain_town_identity.tmx @@ -1,5 +1,5 @@ - + @@ -20,12 +20,12 @@ - eJxjYBgFQwXsYGFgkMaDd7FQph8X/saK39xQCuR3sSHYmZoMDFma+M0i1V5jHQYGEx0IH5kNA3qcDAytQDvbqGyvPjuCj8xGBmdxiFNibw4HA8NkNgi+QCd7v7CipkFk85HDHJc4LjYhe9HdeBZHmOMSx8Um1V7kMM9FYp9nxy6OzM7jIM9e5DBHLwNA/iUlrxPK38SGA8heUvxADTBqL3kAAOTKMnc= + eJxjYBgFQwXsYGFgkMaDd7FQph8X/saKas4uNlR+KJo8OsAnj2xWpiYDQxYQr1dnYNigjhA31mFgMAHis+wMDNZaDAw2WsTbC9OLbA4y0ONkYGgF2tkGxPrsqHI5HAwMk4HuO88OofM4iLcX2Sx0c2HgLDsqjUse2VxC9sLcDMIXcJh7Ds0/lNr7hRU1DSLrRw5zkPgrDUxx5PhF5hOyF92NZ3GEOS5xfbTwh/FJtRc5zHOR2LB0gy4OY8NoYtMVMkAOc/QyAOQfUvI6ev4mB8DCnxQ/UAOM2kseAAD38kEl - eJxjYBgFo4D2QFyHgUFCB5M9CugDcIU5rngZjaNRMAqGLwAAMLIDKw== + eJxjYBgFowA7mKzOwDBFHcEX12FgkNCBsOW1GBgUtIg3C1kvMnsU0Aegh/k5DUxxdDWj8TQKRsHwBADmvgaw @@ -35,7 +35,6 @@ - @@ -44,7 +43,6 @@ - @@ -53,7 +51,6 @@ - @@ -62,7 +59,6 @@ - @@ -71,23 +67,48 @@ - - + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/forge-gui/res/adventure/Shandalar/maps/map/mountain_town_tribal.tmx b/forge-gui/res/adventure/Shandalar/maps/map/mountain_town_tribal.tmx index 7a579047901..10c885e3be1 100644 --- a/forge-gui/res/adventure/Shandalar/maps/map/mountain_town_tribal.tmx +++ b/forge-gui/res/adventure/Shandalar/maps/map/mountain_town_tribal.tmx @@ -1,5 +1,5 @@ - + @@ -20,12 +20,12 @@ - eJxjYBgFQwXsYGFgkMaDd7FQph8X/saK39xQCuR3sSHYmZoMDFma+M0i1V5jHQYGEx0IH5kNA3qcDAytQDvbqGyvPjuCj8xGBmdxiFNibw4HA8NkNgi+QCd7v7CipkFk85HDHJc4LjYhe9HdeBZHmOMSx8Um1V7kMM9FYp9nxy6OzM7jIM9e5DBHLwNA/iUlrxPK38SGA8heUvxADTBqL3kAAOTKMnc= + eJxjYKAf+MdEW/MZmSE0EzOqeI8mkGDGUE5T8J8Gft3BwsAgjQfvYqFMPy78jRXVnF1sqPxQNHl0gE8e2axMYDxlAfF6dQaGDerQMATGm7EOA4MJEJ9lZ2Cw1mJgsNEi3l6YXhBAZsOAHicDQyvQzjZNiPmMSOkkh4OBYTLQfefZIXQeB/H26rMj+MhsZHCWHZXGJY9sLiF7YW4G4Qs4zD2H5h9K7f3CipoGkfUjhzkuceT4ReYTshfdjWdxhDkucX208IfxSbUXOcxzkdiwdIMuDmPDaGLTFTJADnP0MgDkH1LyOnr+JgXAynRY+MP8gF4G0wog20svO9HtpSeglr0AD9lFhQ== - eJxjYBgFo4D2QFyHgUFCB5M9CugDcIU5rngZjaNRMAqGLwAAMLIDKw== + eJxjYBgFowA7mKzOwDBFHcEX12FgkNCBsOW1GBgUtIg3C1kvMnsU0AfgCnN88TIaT6NgFAxPAAAOuQW6 @@ -35,7 +35,6 @@ - @@ -44,7 +43,6 @@ - @@ -53,7 +51,6 @@ - @@ -62,7 +59,6 @@ - @@ -71,23 +67,48 @@ - - + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/forge-gui/res/adventure/Shandalar/maps/map/plains_town_generic.tmx b/forge-gui/res/adventure/Shandalar/maps/map/plains_town_generic.tmx index d91e5be6a84..71e660cf965 100644 --- a/forge-gui/res/adventure/Shandalar/maps/map/plains_town_generic.tmx +++ b/forge-gui/res/adventure/Shandalar/maps/map/plains_town_generic.tmx @@ -1,5 +1,5 @@ - + @@ -20,12 +20,12 @@ - eJxjYBgFo4D2YAsLA4M4FfE2FuLsDWTFLl6gicp/rYFfnpB55KojFlBqr542gv1JG5UmxrwqXtxqKnkHn39Hur1fgXH7jYT4JVedsQ4Dg4kO6W6gRTjrcVLPvMEev8PB3iqkcuMTlvIJxoaVxSAanzpke8vxlFfEuo8UgGxeBRa7YWKk2CuII1/hshcf+MBKfJ1KTF39iYrhB/MDteMEBiqxxEefJmF7semjBkC2NwdHO4PW9o6CUYANAABgVy0t + eJxjYBgFo4D2YAsLA4M4FfE2FuLsDWTFLl6gSRxfXouBQUGLsHmE7F3CTZw+GLAG2mlDBXthQE8bwf6kjUoTY14VL241lbzEu49YQKl/R7q9X4Fx+42E+CVXnbEOA4OJDuluoEU463FSz7zBHr/Dwd4qpHIDVBbpI5VLhkCsqw1hw8piEA3i66Cpg7GR7S3HU14R6z5SALJ5FVjshomRYq8gjnyFy1584AMr8XUqMXX1JyqGH8wP1I4TGKjEEh99moTtxaaPGgDZ3hxN/GppZe8oGAXYAAB7/jCB - eJxjYBhYMIuXgWE2DfEcXuz2WvDR1l9WOMwftRc/OK9BX3tbeRgYdKHsU1A+PewFgWvaqDS97CUHDEV7NTUZGLQ0CYtRYq8OHjPMgWnZAogt8aRpXTQ+sfaiJxlxoEMkoI4JBtoXAsShUHtvAhXfQtNwikx7VXGUp6L4AgIJoOcvbPbu0h7c6Yoe9uKrF2F1GjFqSLUXuSzCxSZF3WAP51F7R+0dyvZeA4pfJxIjA2L13KCxv0bB4AIAgOhQFg== + eJxjYBhYMIuXgWE2DfEcXuz2WvDR1l9WOMwftXdw2dvKw8CgC2WfgvLpYS8IXNNGpellLzlgKNqrqcnAoKVJWIwSe3XwmGGuAVQPxJYauNXoovGJtRc9yYgDHSIBdUww0L4QIA6F2nsTqPgWmoZTZNqriqM8FcUXEEgAPX9hs3eX9uBOV/SwF1+9CKvTiFFDqr3IZREuNinqBns4j9o7au9QtvcaUPw6kRgZEKvnBo39NQoGFwAAZ+tPHw== @@ -35,7 +35,6 @@ - @@ -44,7 +43,6 @@ - @@ -53,7 +51,6 @@ - @@ -62,14 +59,13 @@ - - + @@ -79,7 +75,6 @@ - @@ -88,7 +83,6 @@ - @@ -97,7 +91,6 @@ - @@ -106,7 +99,6 @@ - @@ -123,9 +115,15 @@ - + + + + + + + diff --git a/forge-gui/res/adventure/Shandalar/maps/map/plains_town_identity.tmx b/forge-gui/res/adventure/Shandalar/maps/map/plains_town_identity.tmx index f6d0589cb19..635ebb42636 100644 --- a/forge-gui/res/adventure/Shandalar/maps/map/plains_town_identity.tmx +++ b/forge-gui/res/adventure/Shandalar/maps/map/plains_town_identity.tmx @@ -1,5 +1,5 @@ - + @@ -20,7 +20,7 @@ - eJxjYBgFo4D2YAsLA4M4FfE2FuLsDWTFLl6gicp/rYFfnpB55KojFlBqr542gv1JG5UmxrwqXtxqKnkHn39Hur1fgXH7jYT4JVedsQ4Dg4kO6W6gRTjrcVLPvMEev8PB3iqkcuMTlvIJxoaVxSAanzpke8vxlFfEuo8UgGxeBRa7YWKk2CuII1/hshcf+MBKfJ1KTF39iYrhB/MDteMEBiqxxEefJmF7semjBkC2NwdHO4PW9o6CUYANAABgVy0t + eJxjYBgFo4D2YAsLA4M4FfE2FuLsDWTFLl6gicp/rYFdXl6LgUFBi7B5hOxdwk2cPhiwBtppQwV7YUBPG8H+pI1KE2NeFS9uNZW8xLuPWECpf0e6vV+BcfuNhPglV52xDgODiQ7pbqBFOOtxUs+8wR6/w8HeKqRy4xOW8gnGhpXFIBqfOmR7y/GUV8S6jxSAbF4FFrthYqTYK4gjX+GyFx/4wEp8nUpMXf2JiuEH8wO14wQGKrHER58mYXux6aMGQLY3RxO/WlrZOwpGATYAADv+Lzo= @@ -35,7 +35,6 @@ - @@ -44,7 +43,6 @@ - @@ -53,7 +51,6 @@ - @@ -62,14 +59,13 @@ - - + @@ -79,7 +75,6 @@ - @@ -88,7 +83,6 @@ - @@ -97,7 +91,6 @@ - @@ -106,7 +99,6 @@ - @@ -123,9 +115,15 @@ - + + + + + + + diff --git a/forge-gui/res/adventure/Shandalar/maps/map/plains_town_tribal.tmx b/forge-gui/res/adventure/Shandalar/maps/map/plains_town_tribal.tmx index d97cdf9a66c..e0061f8d3f8 100644 --- a/forge-gui/res/adventure/Shandalar/maps/map/plains_town_tribal.tmx +++ b/forge-gui/res/adventure/Shandalar/maps/map/plains_town_tribal.tmx @@ -1,5 +1,5 @@ - + @@ -20,12 +20,12 @@ - eJxjYBgFo4D2YAsLA4M4FfE2FuLsDWTFLl6gicp/rYFfnpB55KojFlBqr542gv1JG5UmxrwqXtxqKnkHn39Hur1fgXH7jYT4JVedsQ4Dg4kO6W6gRTjrcVLPvMEev8PB3iqkcuMTlvIJxoaVxSAanzpke8vxlFfEuo8UgGxeBRa7YWKk2CuII1/hshcf+MBKfJ1KTF39iYrhB/MDteMEBiqxxEefJmF7semjBkC2NwdHO4PW9o6CUYANAABgVy0t + eJxjYBgFo4D2YAsLA4M4FfE2FuLsDWTFLl6gSRqfkHmE1C3hJk4fDFhrMTDYaFFuLwzoaSPYn7RRaWLMq+LFraaSF6GOiZmwmcQASv1LKvjHNDD2kmoeseq+AuP2GwnxS646Yx0GBhMd0t1Aqr2MRKQrPU7ccv/JjF+YPkrBcElX1LS3Cqnc+ISlfIKxYWUxiManDtnecjzlFbHuIwUgm1eBxW6YGCn2CuLIV7jsxQc+sBJfpxJTV3+iYvjB/EDtOIGBSizx0adJ2F5s+qgBkO3NwdHOoLW9o2AUYAMAMPkxOA== - eJxjYBhYMIuXgWE2DfEcXuz2WvDR1l9WOMwftRc/OK9BX3tbeRgYdKHsU1A+PewFgWvaqDS97CUHDEV7NTUZGLQ0CYtRYq8OHjPMgWnZAogt8aRpXTQ+sfaiJxlxoEMkoI4JBtoXAsShUHtvAhXfQtNwikx7VXGUp6L4AgIJoOcvbPbu0h7c6Yoe9uKrF2F1GjFqSLUXuSzCxSZF3WAP51F7R+0dyvZeA4pfJxIjA2L13KCxv0bB4AIAgOhQFg== + eJxjYBhYMIuXgWE2DfEcXuz2WvDR1l9WOMwftXdw2dvKw8CgC2WfgvKRgbwWA4OCFvXtBYFr2qg0MWCohvNA2KupycCgpUlYjBJ7dfCYYa4BVA/Elhq41eii8Ym1Fz3JiAMdIgF1TDDQvhAgDoXaexOo+BaahlNk2quKozwVxRcQSAA9f2Gzd5f24E5X9LAXX70Iq9OIUUOqvchlES42KeoGeziP2jtq71C29xpQ/DqRGBkQq+cGjf01CgYXAACumU+y @@ -35,7 +35,6 @@ - @@ -44,7 +43,6 @@ - @@ -53,7 +51,6 @@ - @@ -62,14 +59,13 @@ - - + @@ -79,7 +75,6 @@ - @@ -88,7 +83,6 @@ - @@ -97,7 +91,6 @@ - @@ -106,7 +99,6 @@ - @@ -123,9 +115,15 @@ - + + + + + + + diff --git a/forge-gui/res/adventure/Shandalar/maps/map/swamp_town_generic.tmx b/forge-gui/res/adventure/Shandalar/maps/map/swamp_town_generic.tmx index 07d47cd3cb6..b58d4ee1dd1 100644 --- a/forge-gui/res/adventure/Shandalar/maps/map/swamp_town_generic.tmx +++ b/forge-gui/res/adventure/Shandalar/maps/map/swamp_town_generic.tmx @@ -1,5 +1,5 @@ - + @@ -20,12 +20,12 @@ - eJxjYKAcNPJSJk9tQG/7KAUNQPc6MDEwLGYkDzsxkW5nPTSM7pKhdxE3eXqR/VjHjF3NZ3UGhi/q+M0h1V5i1OuzU8ccGADFKTHqzyLZa6zDwGCig8mmxL+4zES2Vx8HmxJ7cZmJbO85IHsyGwTncVDH3hygOUbsmOyzONwAArBwIddemH6QfTD/XECz14Ad1Y8gAAsXcu3FlmbPotkLc5MhlrAm116YmaCwBfkLRKPbi+we9LINV94nZC8MgOwH+QFE53JA/JaLFPYwP5JTtiGDGmb8ZS42v5Hivzoy6qm7UHsp9RsAxT9RKw== + eJxjYKAcNPJSJk9tQG/7KAUNQPc6MDEwLGYkDzsxkW5nPTSM7kL1emqhYnxgETeqXmIBsh/rmBH2wgCI/VmdgeGLOm4zdLRJtxek3hpotg0ef+mzE2cOsQAUpzD1+Mw+iyRnrMPAYKKDySbHvzCzcZmJbK8+DjYl9uIyE9nec0D2ZDYIzuOg3N4coBm5QGzEjuDD2DB7dbVR3QACsHAh116YfpB9MP9cQLPXgB3hR1j+gYULufZiS1dn0eyFuckQS1hTEs4gc0BhC/IXiEa3F9k96GUbLO+Tai8MgOwH+QEW3yC/5SKFPcyPpPoPHdQw4y9zsfmNFP/VkVFP3YXaS6nfAKsYWFc= - eJxjYBg8oIZ3oF0wCmDgujoDww112trRNEjjW1yHgUFCB5NNKzP1OCk3fzgASsOaWnGFDFoGSRodLO4gBtRTwa0w/zYPIX8PJQAAaYAJRg== + eJxjYBg8oIZ3oF0wCmDgujoDww116psrr8XAoKAFYTcN0vgW12FgkNDBZNPKTD1Oys0fDoDSsKZWXCGDlkGSRgeLO4gB9VRwK8y/zUPI30MJAACVSQnZ @@ -35,7 +35,6 @@ - @@ -44,7 +43,6 @@ - @@ -53,7 +51,6 @@ - @@ -62,7 +59,6 @@ - @@ -71,7 +67,6 @@ - @@ -80,14 +75,37 @@ - - + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/forge-gui/res/adventure/Shandalar/maps/map/swamp_town_identity.tmx b/forge-gui/res/adventure/Shandalar/maps/map/swamp_town_identity.tmx index 0de862d7005..f585a2d7eb6 100644 --- a/forge-gui/res/adventure/Shandalar/maps/map/swamp_town_identity.tmx +++ b/forge-gui/res/adventure/Shandalar/maps/map/swamp_town_identity.tmx @@ -1,5 +1,5 @@ - + @@ -20,12 +20,12 @@ - eJxjYKAcNPJSJk9tQG/7KAUNQPc6MDEwLGYkDzsxkW5nPTSM7pKhdxE3eXqR/VjHjF3NZ3UGhi/q+M0h1V5i1OuzU8ccGADFKTHqzyLZa6zDwGCig8mmxL+4zES2Vx8HmxJ7cZmJbO85IHsyGwTncVDH3hygOUbsmOyzONwAArBwIddemH6QfTD/XECz14Ad1Y8gAAsXcu3FlmbPotkLc5MhlrAm116YmaCwBfkLRKPbi+we9LINV94nZC8MgOwH+QFE53JA/JaLFPYwP5JTtiGDGmb8ZS42v5Hivzoy6qm7UHsp9RsAxT9RKw== + eJxjYKAcNPJSJk9tQG/7KAUNQPc6MDEwLGYkDzsxkW5nPTSM7pKhdxE3eXqR/VjHjF3NZ3UGhi/q+M0h1V6QemstBgYbLdxq9NmJM4dYAIpTmHp8Zp9FkjPWYWAw0cFkk+NfmNm4zES2Vx8HmxJ7cZmJbO85IHsyGwTncVBubw7QjFwgNmJH8GHsszjcAAKwcCHXXph+kH0w/1xAs9eAHeFHWP6BhQu59mJLV2fR7IW5yRBLWFMSziBzQGEL8heIRrcX2T3oZRuuvE/IXhgA2Q/yAyy+QX7LRQp7mB/JKduQQQ0z/jIXm99I8V8dGfXUXai9lPoNAFBAVPY= - eJxjYBg8oIZ3oF0wCmDgujoDww112trRNEjjW1yHgUFCB5NNKzP1OCk3fzgASsOaWnGFDFoGSRodLO4gBtRTwa0w/zYPIX8PJQAAaYAJRg== + eJxjYBg8oIZ3oF0w8GAxIyqmF/DUQsXX1RkYbqhT3x55oNkKWhB2Ey/ELmQ3DAYgrsPAIKGDyaaVmXqclJs/HAClYY1L/wUN8s1soaBMekOBvdR0B71BPRXcCvNv8xDy91ACAEHHESc= @@ -35,7 +35,6 @@ - @@ -44,7 +43,6 @@ - @@ -53,7 +51,6 @@ - @@ -62,7 +59,6 @@ - @@ -71,7 +67,6 @@ - @@ -80,14 +75,37 @@ - - + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/forge-gui/res/adventure/Shandalar/maps/map/swamp_town_tribal.tmx b/forge-gui/res/adventure/Shandalar/maps/map/swamp_town_tribal.tmx index f7b78bf00a5..4d2b8e2962f 100644 --- a/forge-gui/res/adventure/Shandalar/maps/map/swamp_town_tribal.tmx +++ b/forge-gui/res/adventure/Shandalar/maps/map/swamp_town_tribal.tmx @@ -1,5 +1,5 @@ - + @@ -20,12 +20,12 @@ - eJxjYKAcNPJSJk9tQG/7KAUNQPc6MDEwLGYkDzsxkW5nPTSM7pKhdxE3eXqR/VjHjF3NZ3UGhi/q+M0h1V5i1OuzU8ccGADFKTHqzyLZa6zDwGCig8mmxL+4zES2Vx8HmxJ7cZmJbO85IHsyGwTncVDH3hygOUbsmOyzONwAArBwIddemH6QfTD/XECz14Ad1Y8gAAsXcu3FlmbPotkLc5MhlrAm116YmaCwBfkLRKPbi+we9LINV94nZC8MgOwH+QFE53JA/JaLFPYwP5JTtiGDGmb8ZS42v5Hivzoy6qm7UHsp9RsAxT9RKw== + eJy1lU0KwjAQhacNWEE8R0EK9W+nC3HnXawnkKpn8AZ6nooX6Cl0rWYwQ9K0KU2iD4JTat43b1ojgL9OQ7/7v9Y/eCH7vSfpyPtdhQDXwG2tQ3vmQcyoFHs3o+qqScl/GVT3dpWaMWeSS8L6EQM843YfWy5+f8G9l025hNKom8+7IxufKfXZ5l0o92YJwDyp1y55ydvkqXJTQ+3DNXmq3Buvz73v2vX9uVvukfE1jeQ11YWhBxTNxZVL+5FHee4adxzJjPT7obm4cpveq0LjUk8Tbdb4HrtwX6H0xNliLvzUuQGT1/rZlluepXqfyMcM9LwxW6bMnjLa5tO1Z+1nblM2m3y5w/9UKbi+2T6mSVq2 - eJxjYBg8oIZ3oF0wCmDgujoDww112trRNEjjW1yHgUFCB5NNKzP1OCk3fzgASsOaWnGFDFoGSRodLO4gBtRTwa0w/zYPIX8PJQAAaYAJRg== + eJxjYBg8oIZ3oF0wCmDgujoDww116psrr8XAoKAFYTcN0vgW12FgkNDBZNPKTD1Oys0fDoDSsKZWXCGDlkGSRgeLO4gB9VRwK8y/zUPI30MJAACVSQnZ @@ -35,7 +35,6 @@ - @@ -44,7 +43,6 @@ - @@ -53,7 +51,6 @@ - @@ -62,7 +59,6 @@ - @@ -71,7 +67,6 @@ - @@ -80,14 +75,37 @@ - - + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/forge-gui/res/adventure/Shandalar/maps/map/waste_town_generic.tmx b/forge-gui/res/adventure/Shandalar/maps/map/waste_town_generic.tmx index 1bfc6f6b84f..05abdb6f347 100644 --- a/forge-gui/res/adventure/Shandalar/maps/map/waste_town_generic.tmx +++ b/forge-gui/res/adventure/Shandalar/maps/map/waste_town_generic.tmx @@ -1,5 +1,5 @@ - + @@ -20,12 +20,12 @@ - eJxjYBgFo4B2YAcLA4M0jfEuFkx7Q1lJd+sUDtLUY7ODHHtJBdS211iHgcFEB5MNA7BwIcdeUsMUGxiK4TyZAn8TYy+2eMIGcMUtNv1DMZxB4D07Kk0IaDBit+MrCfZSkq5J8e9hoFvdNRkYPIBYjxNTfiTELyX2oudDmL3ExB+5eZhY/xJjPiytkmvvF1by6lBS6u1vSPai+4lQOKO7mZx0QU48UcNecgAp9lKj7iTHXmoCcu2l1O9Dzb+DxV4AiyIukg== + eJxjYBgFo4B2YAcLA4M0jfEuFkx7Q1lJd+sUDtLUY7ODHHtJBdS211iHgcFEB5NtpA2hYeFCjr2khik2QK9wNoT610SbcnsnU+BvYuxFjicQsNZiYLDRwtSHK25R2FTwLyWAUnvfs6PShIAGI3Y7vpJgLyXpmhT/Hga61V2TgcEDiPU4MeWJiV9y7KUG2ME2MPYi24GeD2H2EhN/hPKwjjZue4kRI6aMgKVVYgA2O76wkleHklJvf0OyF91PhMIZ3c3kpAtyylpq2EsOIMVeatSd5NhLTUCuvZT6faj5d7DYCwAfmzHo - eJzt0bENwCAQBMHtAlpA//33AtU4cIgtET7STnTBZQuSKmgJPfetuk47/bW1c20zYMW7Y0CO7599JUk3ewCmfgdy + eJzt0bERgCAUBNHtQjNI4f/+e4FqDMzUMYaZfdEFly1IWsGRcOZ7a13PTqVD7f8/O+9jBMy4dzTI9v2zryRpZxerjQgF @@ -35,7 +35,6 @@ - @@ -44,7 +43,6 @@ - @@ -53,7 +51,6 @@ - @@ -62,7 +59,6 @@ - @@ -71,7 +67,6 @@ - @@ -80,7 +75,6 @@ - @@ -89,7 +83,6 @@ - @@ -98,14 +91,13 @@ - - + @@ -113,9 +105,14 @@ - + + + + + + diff --git a/forge-gui/res/adventure/Shandalar/maps/map/waste_town_identity.tmx b/forge-gui/res/adventure/Shandalar/maps/map/waste_town_identity.tmx index 5be6a6b2f94..0483ef5e5ed 100644 --- a/forge-gui/res/adventure/Shandalar/maps/map/waste_town_identity.tmx +++ b/forge-gui/res/adventure/Shandalar/maps/map/waste_town_identity.tmx @@ -1,5 +1,5 @@ - + @@ -20,12 +20,12 @@ - eJxjYBgFo4B2YAcLA4M0jfEuFkx7Q1lJd+sUDtLUY7ODHHtJBdS211iHgcFEB5MNA7BwIcdeUsMUGxiK4TyZAn8TYy+2eMIGcMUtNv1DMZxB4D07Kk0IaDBit+MrCfZSkq5J8e9hoFvdNRkYPIBYjxNTfiTELyX2oudDmL3ExB+5eZhY/xJjPiytkmvvF1by6lBS6u1vSPai+4lQOKO7mZx0QU48UcNecgAp9lKj7iTHXmoCcu2l1O9Dzb+DxV4AiyIukg== + eJxjYBgFo4B2YAcLA4M0jfEuFkx7Q1lJd+sUDtLUY7ODHHtJBdS211iHgcFEB5MNA7BwIcdeUsMUGxiK4TyZAn8TYy96PFlrMTDYaGHqwxW32OJ5KIYzCLxnR6UJAQ1G7HZ8JcFeStI1Kf49DHSruyYDgwcQ63Fiyg/m+N3BRpm9pzUosx9kB3o+hNmLL/6eQ+0lNw8T619izIelVXLt/cJKXh1KSr39DcledD8RyifobiYnPZITT9SwlxxAir3UqDvJsZeagFx7KfX7UPPvYLEXAMqrMh0= - eJzt0bENwCAQBMHtAlpA//33AtU4cIgtET7STnTBZQuSKmgJPfetuk47/bW1c20zYMW7Y0CO7599JUk3ewCmfgdy + eJzt0bERgCAUBNHtQjNI4f/+e4FqDMzUMYaZfdEFly1IWsGRcOZ7a13PTqVD7f8/O+9jBMy4dzTI9v2zryRpZxerjQgF @@ -35,7 +35,6 @@ - @@ -44,7 +43,6 @@ - @@ -53,7 +51,6 @@ - @@ -62,7 +59,6 @@ - @@ -71,7 +67,6 @@ - @@ -80,7 +75,6 @@ - @@ -89,7 +83,6 @@ - @@ -98,14 +91,13 @@ - - + @@ -113,9 +105,14 @@ - + + + + + + diff --git a/forge-gui/res/adventure/Shandalar/maps/map/waste_town_tribal.tmx b/forge-gui/res/adventure/Shandalar/maps/map/waste_town_tribal.tmx index 6214fccb1ee..784135366c5 100644 --- a/forge-gui/res/adventure/Shandalar/maps/map/waste_town_tribal.tmx +++ b/forge-gui/res/adventure/Shandalar/maps/map/waste_town_tribal.tmx @@ -1,5 +1,5 @@ - + @@ -20,12 +20,12 @@ - eJxjYBgFo4B2YAcLA4M0jfEuFkx7Q1lJd+sUDtLUY7ODHHtJBdS211iHgcFEB5MNA7BwIcdeUsMUGxiK4TyZAn8TYy+2eMIGcMUtNv1DMZxB4D07Kk0IaDBit+MrCfZSkq5J8e9hoFvdNRkYPIBYjxNTfiTELyX2oudDmL3ExB+5eZhY/xJjPiytkmvvF1by6lBS6u1vSPai+4lQOKO7mZx0QU48UcNecgAp9lKj7iTHXmoCcu2l1O9Dzb+DxV4AiyIukg== + eJxjYBgFo4B2YAcLA4M0jfEuFkx7Q1lJd+sUDtLUY7ODHHtJBdS211iHgcFEB5MNA7BwIcdeUsMUGxiK4TyZAn8TYy96PFlrMTDYaGHqwxW32OJ5KIYzCLxnR6UJAQ1G7HZ8JcFeStI1Kf49DHSruyYDgwcQ63Fiyg/r+GXGL/2fCcFmxKIWZAd6PoTZiy3+kM0DAXS9TEh2/ENTi80OQmL4zIcBWFrFBtDdi82OL6zk1aGk1NvfkOxF9xOhfILuZnLSIzllLTXsJQeQYi816k5y7KUmINdeSv0+1Pw7WOwFAAL/M3E= - eJzt0bENwCAQBMHtAlpA//33AtU4cIgtET7STnTBZQuSKmgJPfetuk47/bW1c20zYMW7Y0CO7599JUk3ewCmfgdy + eJzt0SEOgEAQQ9GvuAI4sLsz9w9XgdMgcCwhOJbkP1VR0aQgqQdjwpRtVr+uP80Vlvrc8+f/2AL2OHMUyHLf89/WOny9QJL01gHnWwjD @@ -35,7 +35,6 @@ - @@ -44,7 +43,6 @@ - @@ -53,7 +51,6 @@ - @@ -62,7 +59,6 @@ - @@ -71,7 +67,6 @@ - @@ -80,7 +75,6 @@ - @@ -89,7 +83,6 @@ - @@ -98,14 +91,13 @@ - - + @@ -113,9 +105,14 @@ - + + + + + + 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..8b23476b05d 100644 --- a/forge-gui/res/adventure/Shandalar/maps/obj/shop.tx +++ b/forge-gui/res/adventure/Shandalar/maps/obj/shop.tx @@ -1,11 +1,16 @@ 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 d064f8cc563..e14915c3aee 100644 --- a/forge-gui/res/adventure/Shandalar/maps/tileset/buildings.atlas +++ b/forge-gui/res/adventure/Shandalar/maps/tileset/buildings.atlas @@ -576,4 +576,7 @@ red_castle size: 64, 64 final_castle xy: 128, 864 - size: 64, 64 \ No newline at end of file + size: 64, 64 +shard_trader + xy: 288, 896 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/maps/tileset/buildings.png b/forge-gui/res/adventure/Shandalar/maps/tileset/buildings.png index 1c9b4894b9c..a6820808c90 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 2e601599f54..95902336c73 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..3f8b743971a 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/sprites/items.atlas b/forge-gui/res/adventure/Shandalar/sprites/items.atlas index 7b08f7c8dba..5a110368b00 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 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 e41abfe88f1..c6b1ec75cc7 100644 --- a/forge-gui/res/adventure/Shandalar/ui/items.json +++ b/forge-gui/res/adventure/Shandalar/ui/items.json @@ -46,13 +46,32 @@ } , { "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", 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/items.json b/forge-gui/res/adventure/Shandalar/world/items.json index 1acdf7d9dd8..57ca724ba4c 100644 --- a/forge-gui/res/adventure/Shandalar/world/items.json +++ b/forge-gui/res/adventure/Shandalar/world/items.json @@ -1,5 +1,14 @@ [ { + "name": "PCharm", + "equipmentSlot": "Neck", + "iconName": "SolRing", + "effect": { + "startBattleWithCard": [ + "Piper's Charm" + ] + } + },{ "name": "Sol Ring", "equipmentSlot": "Left", "iconName": "SolRing", @@ -765,7 +774,7 @@ "commandOnUse": "teleport to poi Spawn", "iconName": "ColorlessRune", "questItem": true, - "manaNeeded": 1, + "shardsNeeded": 1, "cost": 100 }, { @@ -778,7 +787,7 @@ "commandOnUse": "teleport to poi \"Plains Capital\"", "iconName": "WhiteRune", "questItem": true, - "manaNeeded": 1, + "shardsNeeded": 1, "cost": 100 }, { @@ -791,7 +800,7 @@ "commandOnUse": "teleport to poi \"Swamp Capital\"", "iconName": "BlackRune", "questItem": true, - "manaNeeded": 1, + "shardsNeeded": 1, "cost": 100 }, { @@ -804,7 +813,7 @@ "commandOnUse": "teleport to poi \"Island Capital\"", "iconName": "BlueRune", "questItem": true, - "manaNeeded": 1, + "shardsNeeded": 1, "cost": 100 }, { @@ -817,7 +826,7 @@ "commandOnUse": "teleport to poi \"Mountain Capital\"", "iconName": "RedRune", "questItem": true, - "manaNeeded": 1, + "shardsNeeded": 1, "cost": 100 }, { @@ -830,7 +839,7 @@ "commandOnUse": "teleport to poi \"Forest Capital\"", "iconName": "GreenRune", "questItem": true, - "manaNeeded": 1, + "shardsNeeded": 1, "cost": 100 }, { @@ -844,7 +853,7 @@ "commandOnUse": "heal percent 0.5", "iconName": "WhiteStaff", "questItem": true, - "manaNeeded": 5, + "shardsNeeded": 5, "cost": 1000 }, { @@ -858,7 +867,7 @@ "commandOnUse": "hide 10", "iconName": "BlackStaff", "questItem": true, - "manaNeeded": 5, + "shardsNeeded": 5, "cost": 1000 }, { @@ -871,7 +880,7 @@ "commandOnUse": "fly 10", "iconName": "BlueStaff", "questItem": true, - "manaNeeded": 5, + "shardsNeeded": 5, "cost": 1000 }, { @@ -884,7 +893,7 @@ "commandOnUse": "remove enemy nearest", "iconName": "RedStaff", "questItem": true, - "manaNeeded": 5, + "shardsNeeded": 5, "cost": 1000 }, { @@ -898,7 +907,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/shops.json b/forge-gui/res/adventure/Shandalar/world/shops.json index a5d5263d959..d40f6e9713b 100644 --- a/forge-gui/res/adventure/Shandalar/world/shops.json +++ b/forge-gui/res/adventure/Shandalar/world/shops.json @@ -1,4 +1,150 @@ -[ +[{ +"name":"WhiteEquipment", +"spriteAtlas":"maps/tileset/buildings.atlas", +"sprite":"CapitalShop", + "rewards": [ + { "type": "item","count":1, "itemName": "Life Amulet" }, + { "type": "item","count":1, "itemName": "Gold Armor" }, + { "type": "item","count":1, "itemName": "Mirror Shield" }, + { "type": "item","count":1, "itemName": "Entrancing Lyre" }, + { "type": "item","count":1, "itemName": "Nine-Ringed Bo" }, + { "type": "item","count":1, "itemName": "Kite Shield" } + + ] + +},{ +"name":"WhiteItems", +"spriteAtlas":"maps/tileset/buildings.atlas", +"sprite":"ItemShop", + "rewards": [ + { "type": "item","count":1, "itemName": "White rune" }, + { "type": "item","count":1, "itemName": "White Staff" }, + { "type": "mana","count":2 }, + { "type": "life","count":1 } + + ] + +},{ +"name":"RedEquipment", +"spriteAtlas":"maps/tileset/buildings.atlas", +"sprite":"CapitalShop", + "rewards": [ + { "type": "item","count":1, "itemName": "Axt" }, + { "type": "item","count":1, "itemName": "Aladdin's Ring" }, + { "type": "item","count":1, "itemName": "Flame Sword" }, + { "type": "item","count":1, "itemName": "Heavy Arbalest" }, + { "type": "item","count":1, "itemName": "Jeweled Amulet" }, + { "type": "item","count":1, "itemName": "Ring of Immortals" } + + ] + +},{ +"name":"RedItems", +"spriteAtlas":"maps/tileset/buildings.atlas", +"sprite":"ItemShop", + "rewards": [ + { "type": "item","count":1, "itemName": "Red rune" }, + { "type": "item","count":1, "itemName": "Red Staff" }, + { "type": "mana","count":2 }, + { "type": "life","count":1 } + + ] + +},{ +"name":"BlueEquipment", +"spriteAtlas":"maps/tileset/buildings.atlas", +"sprite":"CapitalShop", + "rewards": [ + { "type": "item","count":1, "itemName": "Traveler's Amulet" }, + { "type": "item","count":1, "itemName": "Magic Shard" }, + { "type": "item","count":1, "itemName": "Spell Book" }, + { "type": "item","count":1, "itemName": "Mithril Armor" }, + { "type": "item","count":1, "itemName": "Mithril Boots" }, + { "type": "item","count":1, "itemName": "Mithril Shield" } + + ] + +},{ +"name":"BlueItems", +"spriteAtlas":"maps/tileset/buildings.atlas", +"sprite":"ItemShop", + "rewards": [ + { "type": "item","count":1, "itemName": "Blue rune" }, + { "type": "item","count":1, "itemName": "Blue Staff" }, + { "type": "mana","count":2 }, + { "type": "life","count":1 } + + ] + +}, +{ +"name":"BlackEquipment", +"spriteAtlas":"maps/tileset/buildings.atlas", +"sprite":"CapitalShop", + "rewards": [ + { "type": "item","count":1, "itemName": "Death Ring" }, + { "type": "item","count":1, "itemName": "Dark Amulet" }, + { "type": "item","count":1, "itemName": "Mad Staff" }, + { "type": "item","count":1, "itemName": "Dark Armor" }, + { "type": "item","count":1, "itemName": "Dark Boots" }, + { "type": "item","count":1, "itemName": "Dark Shield" } + + ] + +},{ +"name":"BlackItems", +"spriteAtlas":"maps/tileset/buildings.atlas", +"sprite":"ItemShop", + "rewards": [ + { "type": "item","count":1, "itemName": "Black rune" }, + { "type": "item","count":1, "itemName": "Black Staff" }, + { "type": "mana","count":2 }, + { "type": "life","count":1 } + + ] + +}, +{ +"name":"GreenEquipment", +"spriteAtlas":"maps/tileset/buildings.atlas", +"sprite":"CapitalShop", + "rewards": [ + { "type": "item","count":1, "itemName": "Jungle Shield" }, + { "type": "item","count":1, "itemName": "Ring of Three Wishes" }, + { "type": "item","count":1, "itemName": "Heart-Piercer" }, + { "type": "item","count":1, "itemName": "Wood Bow" }, + { "type": "item","count":1, "itemName": "Steel Sword" }, + { "type": "item","count":1, "itemName": "Unerring Sling" } + + ] + +},{ +"name":"GreenItems", +"spriteAtlas":"maps/tileset/buildings.atlas", +"sprite":"ItemShop", + "rewards": [ + { "type": "item","count":1, "itemName": "Green rune" }, + { "type": "item","count":1, "itemName": "Green Staff" }, + { "type": "mana","count":2 }, + { "type": "life","count":1 } + + ] + +},{ +"name":"Equipment", +"spriteAtlas":"maps/tileset/buildings.atlas", +"sprite":"EquipmentShop", + "rewards": [ + { "type": "item","count":1, "itemName": "Steel Boots" }, + { "type": "item","count":1, "itemName": "Steel Shield" }, + { "type": "item","count":1, "itemName": "Steel Armor" }, + { "type": "item","count":1, "itemName": "Iron Boots" }, + { "type": "item","count":1, "itemName": "Iron Shield" }, + { "type": "item","count":1, "itemName": "Iron Armor" } + + ] + +}, { "name":"Swamp", "description":"The Cartographer's Guild", @@ -165,6 +311,71 @@ "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", @@ -239,6 +450,19 @@ "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", @@ -271,6 +495,18 @@ "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", @@ -303,6 +539,18 @@ "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", @@ -335,6 +583,22 @@ "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", @@ -366,6 +630,18 @@ "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", @@ -514,18 +790,74 @@ "overlaySprite":"Overlay4Colorless", "rewards": [ { - "count":2, - "cardTypes": ["Land"], - "cardText": "\\Q{\\EC\\Q\\E}" - }, + "count":4, + "type":"Union", + "cardUnion": [ + { + "count":1, + "cardTypes": ["Land"], + "cardText": "\\Q{\\EC\\Q\\E}" + }, + { + "count":1, + "cardTypes": ["Land"], + "cardText": "\\Q{\\E1\\Q\\E}" + } + ] + }, { - "count":2, - "cardTypes": ["Land"], - "cardText": "\\Q{\\E1\\Q\\E}" - }, - { - "count":4, - "cardTypes": ["Land"] + "count":4, + "cardTypes": ["Land"] + }] +},{ +"name":"Green", +"description":"Abundant Growth", +"spriteAtlas":"maps/tileset/buildings.atlas", +"sprite":"GreenShop", + "rewards": [ + { + "count":8, + "colors": ["green"] + }] +},{ +"name":"Red", +"description":"Circle of Flame", +"spriteAtlas":"maps/tileset/buildings.atlas", +"sprite":"RedShop", + "rewards": [ + { + "count":8, + "colors": ["red"] + }] +},{ +"name":"Black", +"description":"Font of Agonies", +"spriteAtlas":"maps/tileset/buildings.atlas", +"sprite":"BlackShop", + "rewards": [ + { + "count":8, + "colors": ["black"] + }] +},{ +"name":"White", +"description":"Circle of Protection", +"spriteAtlas":"maps/tileset/buildings.atlas", +"sprite":"WhiteShop", + "rewards": [ + { + "count":8, + "colors": ["white"] + }] +},{ +"name":"Blue", +"description":"Hermitic Study", +"spriteAtlas":"maps/tileset/buildings.atlas", +"sprite":"BlueShop", + "rewards": [ + { + "count":8, + "colors": ["blue"] }] },{ "name":"Azorius", @@ -679,7 +1011,7 @@ }] },{ "name":"RWB", - "description":"Mardu Mercantile" + "description":"Mardu Mercantile", "spriteAtlas":"maps/tileset/buildings.atlas", "sprite":"RWBShop", "rewards": [ @@ -781,7 +1113,7 @@ }] },{ "name":"UGB", - "description":"Sultai Supply" + "description":"Sultai Supply", "spriteAtlas":"maps/tileset/buildings.atlas", "sprite":"UGBShop", "rewards": [ @@ -849,7 +1181,7 @@ }] },{ "name":"WUBRG", - "description":"Domain of Dominaria" + "description":"Domain of Dominaria", "spriteAtlas":"maps/tileset/buildings.atlas", "sprite":"WUBRGShop", "rewards": [ @@ -866,9 +1198,19 @@ "sprite":"GoblinShop", "rewards": [ { - "count":8, - "subTypes": ["Goblin"] - }] + "count":8, + "type":"Union", + "cardUnion": [ + { + "count":1, + "subTypes": ["Goblin"] + }, + { + "count":1, + "cardText": "Goblin" + } + ] + }] } ,{ "name":"Elf", "description":"Elf On A Shelf", @@ -876,9 +1218,23 @@ "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", @@ -886,9 +1242,19 @@ "sprite":"MerfolkShop", "rewards": [ { - "count":8, - "subTypes": ["Merfolk"] - }] + "count":8, + "type":"Union", + "cardUnion": [ + { + "count":1, + "subTypes": ["Merfolk"] + }, + { + "count":1, + "cardText": "Merfolk" + } + ] + }] },{ "name":"Zombie", "description":"Braaaaaains???", @@ -896,9 +1262,19 @@ "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", @@ -906,9 +1282,19 @@ "sprite":"HumanShop", "rewards": [ { - "count":8, - "subTypes": ["Human"] - }] + "count":8, + "type":"Union", + "cardUnion": [ + { + "count":1, + "subTypes": ["Human"] + }, + { + "count":1, + "cardText": "Human" + } + ] + }] }, { "name":"Human4White", @@ -916,15 +1302,36 @@ "spriteAtlas":"maps/tileset/buildings.atlas", "sprite":"HumanShop", "rewards": [ - { - "count":4, - "subTypes": ["Human"] - }, { - "count":4, - "subTypes": ["Human"], - "colors": ["white"] - }] + "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", @@ -971,10 +1378,20 @@ "spriteAtlas":"maps/tileset/buildings.atlas", "sprite":"SliverShop", "rewards": [ - { - "count":8, - "subTypes": ["Sliver"] - }] + { + "count":8, + "type":"Union", + "cardUnion": [ + { + "count":1, + "subTypes": ["Sliver"] + }, + { + "count":1, + "cardText": "Sliver" + } + ] + }] },{ "name":"Sliver2Black", "description":"Plagued Hive", @@ -982,15 +1399,36 @@ "sprite":"SliverShop", "overlaySprite":"Overlay2Black", "rewards": [ - { - "count":6, - "subTypes": ["Sliver"] - }, { - "count":2, - "subTypes": ["Sliver"], - "colors": ["Black"] - }] + "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", @@ -998,15 +1436,36 @@ "sprite":"SliverShop", "overlaySprite":"Overlay2Blue", "rewards": [ - { - "count":6, - "subTypes": ["Sliver"] - }, { - "count":2, - "subTypes": ["Sliver"], - "colors": ["Blue"] - }] + "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":"Venomous Hive", @@ -1014,15 +1473,36 @@ "sprite":"SliverShop", "overlaySprite":"Overlay2Green", "rewards": [ - { - "count":6, - "subTypes": ["Sliver"] - }, { - "count":2, - "subTypes": ["Sliver"], - "colors": ["Green"] - }] + "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", @@ -1030,15 +1510,36 @@ "sprite":"SliverShop", "overlaySprite":"Overlay2Red", "rewards": [ - { - "count":6, - "subTypes": ["Sliver"] - }, { - "count":2, - "subTypes": ["Sliver"], - "colors": ["Red"] - }] + "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":"Warded Hive", @@ -1046,15 +1547,36 @@ "sprite":"SliverShop", "overlaySprite":"Overlay2White", "rewards": [ - { - "count":6, - "subTypes": ["Sliver"] - }, { - "count":2, - "subTypes": ["Sliver"], - "colors": ["White"] - }] + "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":"Assassin", "description":"Guild of Nightshade", @@ -1067,7 +1589,7 @@ }] },{ "name":"Enchantment", - "description":"Charms and Curiosities" + "description":"Charms and Curiosities", "spriteAtlas":"maps/tileset/buildings.atlas", "sprite":"EnchantmentShop", "rewards": [ @@ -1077,7 +1599,7 @@ }] },{ "name":"Enchantment4Black", - "description":"Open the Graves" + "description":"Open the Graves", "spriteAtlas":"maps/tileset/buildings.atlas", "sprite":"EnchantmentShop", "overlaySprite":"Overlay4Black", @@ -1093,7 +1615,7 @@ }] },{ "name":"Enchantment4Blue", - "description":"Dream Halls" + "description":"Dream Halls", "spriteAtlas":"maps/tileset/buildings.atlas", "sprite":"EnchantmentShop", "overlaySprite":"Overlay4Blue", @@ -1109,7 +1631,7 @@ }] },{ "name":"Enchantment4Green", - "description":"Familiar Ground" + "description":"Familiar Ground", "spriteAtlas":"maps/tileset/buildings.atlas", "sprite":"EnchantmentShop", "overlaySprite":"Overlay4Green", @@ -1125,7 +1647,7 @@ }] },{ "name":"Enchantment4Red", - "description":"Crucible of Fire" + "description":"Crucible of Fire", "spriteAtlas":"maps/tileset/buildings.atlas", "sprite":"EnchantmentShop", "overlaySprite":"Overlay4Red", @@ -1141,7 +1663,7 @@ }] },{ "name":"Enchantment4White", - "description":"Holy Strength" + "description":"Holy Strength", "spriteAtlas":"maps/tileset/buildings.atlas", "sprite":"EnchantmentShop", "overlaySprite":"Overlay4White", @@ -1155,23 +1677,109 @@ "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" + "description":"Aww, Nuts", "spriteAtlas":"maps/tileset/buildings.atlas", "sprite":"SquirrelShop", "rewards": [ - { - "count":4, - "cardText": "Squirrel" - }, { - "count":4, - "subTypes": ["Squirrel"] - }] + "count":8, + "type":"Union", + "cardUnion": [ + { + "count":1, + "subTypes": ["Squirrel"] + }, + { + "count":1, + "cardText": "Squirrel" + } + ] + }] },{ "name":"Land", - "description":"Exotic Lands" + "description":"Exotic Lands", "spriteAtlas":"maps/tileset/buildings.atlas", "sprite":"NonbasicLandShop", "rewards": [ @@ -1197,10 +1805,89 @@ "rewards": [ { "count":8, - "colorType": "Colorless", "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", @@ -1210,6 +1897,66 @@ "count":8, "colorType": "MultiColor" }] +},{ +"name":"Multicolor8Black", +"description":"The Goldsmith", +"spriteAtlas":"maps/tileset/buildings.atlas", +"sprite":"MultiColorShop", +"overlaySprite":"Overlay8Black", + "rewards": [ + { + "count":8, + "colorType": "MultiColor", + "colors": ["Black"] + }] +},{ +"name":"Multicolor8Blue", +"description":"The Goldsmith", +"spriteAtlas":"maps/tileset/buildings.atlas", +"sprite":"MultiColorShop", +"overlaySprite":"Overlay8Blue", + "rewards": [ + { + "count":8, + "colorType": "MultiColor", + "colors": ["Blue"] + }] +},{ +"name":"Multicolor8Green", +"description":"The Goldsmith", +"spriteAtlas":"maps/tileset/buildings.atlas", +"sprite":"MultiColorShop", +"overlaySprite":"Overlay8Green", + "rewards": [ + { + "count":8, + "colorType": "MultiColor", + "colors": ["Green"] + }] +},{ +"name":"Multicolor8Red", +"description":"The Goldsmith", +"spriteAtlas":"maps/tileset/buildings.atlas", +"sprite":"MultiColorShop", +"overlaySprite":"Overlay8Red", + "rewards": [ + { + "count":8, + "colorType": "MultiColor", + "colors": ["Red"] + }] +},{ +"name":"Multicolor8White", +"description":"The Goldsmith", +"spriteAtlas":"maps/tileset/buildings.atlas", +"sprite":"MultiColorShop", +"overlaySprite":"Overlay8White", + "rewards": [ + { + "count":8, + "colorType": "MultiColor", + "colors": ["White"] + }] },{ "name":"SpaceMarine", "description":"The Codex", @@ -1256,155 +2003,517 @@ "spriteAtlas":"maps/tileset/buildings.atlas", "sprite":"DragonShop", "rewards": [ - { - "count":8, - "subTypes": ["Dragon"] - }] + { + "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, - "subTypes": ["Vampire"] - }] + { + "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":4, - "subTypes": ["Vehicle"] - }, { - "count":4, - "subTypes": ["Vehicle", "Pilot"] - }] + "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" + "description":"Ye Olde China Shoppe", "spriteAtlas":"maps/tileset/buildings.atlas", "sprite":"MinotaurShop", "rewards": [ - { - "count":6, - "subTypes": ["Minotaur"] - }, - { - "count":2, - "cardText": "Minotaur" - }] + { + "count":8, + "type":"Union", + "cardUnion": [ + { + "count":1, + "subTypes": ["Minotaur"] + }, + { + "count":1, + "cardText": "Minotaur" + } + ] + } + ] }, { "name":"Ogre", - "description":"Indentured Oafs" + "description":"Indentured Oafs", "spriteAtlas":"maps/tileset/buildings.atlas", "sprite":"OgreShop", "rewards": [ - { - "count":8, - "subTypes": ["Ogre"] - }] + { + "count":8, + "type":"Union", + "cardUnion": [ + { + "count":1, + "subTypes": ["Ogre"] + }, + { + "count":1, + "cardText": "Ogre" + } + ] + } + ] }, { "name":"Ogre4Red", - "description":"Ogre Warriors" + "description":"Ogre Warriors", "spriteAtlas":"maps/tileset/buildings.atlas", "sprite":"OgreShop", "rewards": [ - { - "count":4, - "subTypes": ["Ogre"] - }, - { - "count":4, - "subTypes": ["Ogre"], - "colors": ["red"] - }] + { + "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" + "description":"Huatli's Spurring", "spriteAtlas":"maps/tileset/buildings.atlas", "sprite":"DinosaurShop", "rewards": [ - { - "count":6, - "subTypes": ["Dinosaur"] - }, - { - "count":2, - "cardText": "Dinosaur" - }] + { + "count":8, + "type":"Union", + "cardUnion": [ + { + "count":1, + "subTypes": ["Dinosaur"] + }, + { + "count":1, + "cardText": "Dinosaur" + } + ] + } + ] },{ "name":"Dinosaur4Green", - "description":"Apex Predators" + "description":"Apex Predators", "spriteAtlas":"maps/tileset/buildings.atlas", "sprite":"DinosaurShop", + "overlaySprite":"Overlay4Green", "rewards": [ - { - "count":2, - "subTypes": ["Dinosaur"] - }, - { - "count":4, - "subTypes": ["Dinosaur"], - "colors": ["green"] - }, - { - "count":2, - "cardText": "Dinosaur" - }] + { + "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" + "description":"Dinosaur Stampede", "spriteAtlas":"maps/tileset/buildings.atlas", "sprite":"DinosaurShop", "rewards": [ - { - "count":2, - "subTypes": ["Dinosaur"] - }, - { - "count":4, - "subTypes": ["Dinosaur"], - "colors": ["red"] - }, - { - "count":2, - "cardText": "Dinosaur" - }] + { + "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":6, - "subTypes": ["Dwarf"] - }, - { - "count":2, - "cardText": "Dwarf" - }] + { + "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":6, - "subTypes": ["Devil"] - }, - { - "count":2, - "cardText": "Devil" - }] + { + "count":8, + "type":"Union", + "cardUnion": [ + { + "count":1, + "subTypes": ["Devil"] + }, + { + "count":1, + "cardText": "Devil" + } + ] + } + ] },{ "name":"ToDo", "description":"To Do", @@ -1430,14 +2539,21 @@ "spriteAtlas":"maps/tileset/buildings.atlas", "sprite":"SoldierShop", "rewards": [ - { - "count":6, - "subTypes": ["Soldier"] - }, - { - "count":2, - "cardText": "Soldier" - }] + { + "count":8, + "type":"Union", + "cardUnion": [ + { + "count":1, + "subTypes": ["Soldier"] + }, + { + "count":1, + "cardText": "Soldier" + } + ] + } + ] },{ "name":"Soldier4Red", "description":"Shock Troops", @@ -1445,19 +2561,37 @@ "sprite":"SoldierShop", "overlaySprite":"Overlay4Red", "rewards": [ - { - "count":2, - "subTypes": ["Soldier"] - }, + { + "count":4, + "type":"Union", + "cardUnion": [ + { + "count":1, + "subTypes": ["Soldier"] + }, + { + "count":1, + "cardText": "Soldier" + } + ] + }, { - "count":4, - "subTypes": ["Soldier"], - "colors": ["red"] - }, - { - "count":2, - "cardText": "Soldier" - }] + "count":4, + "type":"Union", + "cardUnion": [ + { + "count":1, + "subTypes": ["Soldier"], + "colors":["red"] + }, + { + "count":1, + "cardText": "Soldier", + "colors":["red"] + } + ] + } + ] },{ "name":"Soldier4White", "description":"Benalish Barracks", @@ -1465,36 +2599,60 @@ "sprite":"SoldierShop", "overlaySprite":"Overlay4White", "rewards": [ - { - "count":2, - "subTypes": ["Soldier"] - }, + { + "count":4, + "type":"Union", + "cardUnion": [ + { + "count":1, + "subTypes": ["Soldier"] + }, + { + "count":1, + "cardText": "Soldier" + } + ] + }, { - "count":4, - "subTypes": ["Soldier"], - "colors": ["white"] - }, - { - "count":2, - "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":3, - "cardText": "draw" - }, - { - "count":3, - "cardText": "discard" - }, - { - "count":2, - "cardText": "hand" + { + "count":8, + "type":"Union", + "cardUnion": [ + { + "count":1, + "cardText": "Draw" + }, + { + "count":1, + "cardText": "Discard" + }, + { + "count":1, + "cardText": "Hand" + } + ] }] },{ "name":"DnD", @@ -1512,14 +2670,21 @@ "spriteAtlas":"maps/tileset/buildings.atlas", "sprite":"DemonShop", "rewards": [ - { - "count":6, - "subTypes": ["Demon"] - }, - { - "count":2, - "cardText": "Demon" - }] + { + "count":8, + "type":"Union", + "cardUnion": [ + { + "count":1, + "subTypes": ["Demon"] + }, + { + "count":1, + "cardText": "Demon" + } + ] + } + ] },{ "name":"Druid", "description":"Discount Druids", @@ -1527,13 +2692,19 @@ "sprite":"DruidShop", "rewards": [ { - "count":6, - "subTypes": ["Druid"] - }, - { - "count":2, - "cardText": "Druid" - }] + "count":8, + "type":"Union", + "cardUnion": [ + { + "count":1, + "subTypes": ["Druid"] + }, + { + "count":1, + "cardText": "Druid" + } + ] + }] },{ "name":"Wand", "description":"Ashnod's Artifacts", @@ -1545,6 +2716,286 @@ "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", @@ -1552,13 +3003,19 @@ "sprite":"BirdShop", "rewards": [ { - "count":6, - "subTypes": ["Bird"] - }, - { - "count":2, - "cardText": "Bird" - }] + "count":8, + "type":"Union", + "cardUnion": [ + { + "count":1, + "subTypes": ["Bird"] + }, + { + "count":1, + "cardText": "Bird" + } + ] + }] },{ "name":"Bird4Blue", "description":"Aven Windreaders", @@ -1567,18 +3024,35 @@ "overlaySprite":"Overlay4Blue", "rewards": [ { - "count":2, - "subTypes": ["Bird"] - }, + "count":4, + "type":"Union", + "cardUnion": [ + { + "count":1, + "subTypes": ["Bird"] + }, + { + "count":1, + "cardText": "Bird" + } + ] + }, { - "count":4, - "subTypes": ["Bird"], - "colors":["blue"] - }, - { - "count":2, - "cardText": "Bird" - }] + "count":4, + "type":"Union", + "cardUnion": [ + { + "count":1, + "subTypes": ["Bird"], + "colors": ["blue"] + }, + { + "count":1, + "cardText": "Bird", + "colors": ["blue"] + } + ] + }] },{ "name":"Bird4White", "description":"Wing Stop", @@ -1587,18 +3061,35 @@ "overlaySprite":"Overlay4White", "rewards": [ { - "count":2, - "subTypes": ["Bird"] - }, + "count":4, + "type":"Union", + "cardUnion": [ + { + "count":1, + "subTypes": ["Bird"] + }, + { + "count":1, + "cardText": "Bird" + } + ] + }, { - "count":4, - "subTypes": ["Bird"], - "colors":["white"] - }, - { - "count":2, - "cardText": "Bird" - }] + "count":4, + "type":"Union", + "cardUnion": [ + { + "count":1, + "subTypes": ["Bird"], + "colors": ["white"] + }, + { + "count":1, + "cardText": "Bird", + "colors": ["white"] + } + ] + }] },{ "name":"Spirit", "description":"Spirit Halloween", @@ -1606,13 +3097,19 @@ "sprite":"SpiritShop", "rewards": [ { - "count":6, - "subTypes": ["Spirit"] - }, - { - "count":2, - "cardText": "Spirit" - }] + "count":8, + "type":"Union", + "cardUnion": [ + { + "count":1, + "subTypes": ["Spirit"] + }, + { + "count":1, + "cardText": "Spirit" + } + ] + }] },{ "name":"Spirit4Blue", "description":"Dreamcatchers", @@ -1621,18 +3118,35 @@ "overlaySprite":"Overlay4Blue", "rewards": [ { - "count":2, - "subTypes": ["Spirit"] - }, + "count":4, + "type":"Union", + "cardUnion": [ + { + "count":1, + "subTypes": ["Spirit"] + }, + { + "count":1, + "cardText": "Spirit" + } + ] + }, { - "count":4, - "subTypes": ["Spirit"], - "colors":["blue"] - }, - { - "count":2, - "cardText": "Spirit" - }] + "count":4, + "type":"Union", + "cardUnion": [ + { + "count":1, + "subTypes": ["Spirit"], + "colors": ["blue"] + }, + { + "count":1, + "cardText": "Spirit", + "colors": ["blue"] + } + ] + }] },{ "name":"Spirit4White", "description":"Blessed Spirits", @@ -1641,18 +3155,35 @@ "overlaySprite":"Overlay4White", "rewards": [ { - "count":2, - "subTypes": ["Spirit"] - }, + "count":4, + "type":"Union", + "cardUnion": [ + { + "count":1, + "subTypes": ["Spirit"] + }, + { + "count":1, + "cardText": "Spirit" + } + ] + }, { - "count":4, - "subTypes": ["Spirit"], - "colors":["white"] - }, - { - "count":2, - "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", @@ -1660,9 +3191,23 @@ "sprite":"WolfShop", "rewards": [ { - "count":8, - "subTypes": ["Wolf", "Werewolf"] - }] + "count":8, + "type":"Union", + "cardUnion": [ + { + "count":1, + "subTypes": ["Wolf", "Werewolf"] + }, + { + "count":1, + "cardText": "Wolf" + }, + { + "count":1, + "cardText": "Werewolf" + } + ] + }] },{ "name":"Wolf4Green", "description":"Predator's Howl", @@ -1671,13 +3216,44 @@ "overlaySprite":"Overlay4Green", "rewards": [ { - "count":4, - "subTypes": ["Wolf", "Werewolf"] - },{ - "count":4, - "subTypes": ["Wolf", "Werewolf"], - "colors": ["green"] - }] + "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", @@ -1686,13 +3262,44 @@ "overlaySprite":"Overlay4Red", "rewards": [ { - "count":4, - "subTypes": ["Wolf", "Werewolf"] - },{ - "count":4, - "subTypes": ["Wolf", "Werewolf"], - "colors": ["red"] - }] + "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", @@ -1700,13 +3307,19 @@ "sprite":"KnightShop", "rewards": [ { - "count":6, - "subTypes": ["Knight"] - }, - { - "count":2, - "cardText": "Knight" - }] + "count":8, + "type":"Union", + "cardUnion": [ + { + "count":1, + "subTypes": ["Knight"] + }, + { + "count":1, + "cardText": "Knight" + } + ] + }] },{ "name":"Knight4Black", "description":"Dread Riders", @@ -1715,18 +3328,35 @@ "overlaySprite":"Overlay4Black", "rewards": [ { - "count":2, - "subTypes": ["Knight"] - }, + "count":4, + "type":"Union", + "cardUnion": [ + { + "count":1, + "subTypes": ["Knight"] + }, + { + "count":1, + "cardText": "Knight" + } + ] + }, { - "count":4, - "subTypes": ["Knight"], - "colors":["black"] - }, - { - "count":2, - "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", @@ -1735,18 +3365,35 @@ "overlaySprite":"Overlay4Red", "rewards": [ { - "count":2, - "subTypes": ["Knight"] - }, + "count":4, + "type":"Union", + "cardUnion": [ + { + "count":1, + "subTypes": ["Knight"] + }, + { + "count":1, + "cardText": "Knight" + } + ] + }, { - "count":4, - "subTypes": ["Knight"], - "colors":["red"] - }, - { - "count":2, - "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", @@ -1755,18 +3402,35 @@ "overlaySprite":"Overlay4White", "rewards": [ { - "count":2, - "subTypes": ["Knight"] - }, + "count":4, + "type":"Union", + "cardUnion": [ + { + "count":1, + "subTypes": ["Knight"] + }, + { + "count":1, + "cardText": "Knight" + } + ] + }, { - "count":4, - "subTypes": ["Knight"], - "colors":["white"] - }, - { - "count":2, - "cardText": "Knight" - }] + "count":4, + "type":"Union", + "cardUnion": [ + { + "count":1, + "subTypes": ["Knight"], + "colors": ["white"] + }, + { + "count":1, + "cardText": "Knight", + "colors": ["white"] + } + ] + }] },{ "name":"Random", "description":"Pack Shop (?)", @@ -1786,6 +3450,86 @@ "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", @@ -1793,13 +3537,19 @@ "sprite":"SkeletonShop", "rewards": [ { - "count":6, - "subTypes": ["Skeleton"] - }, - { - "count":2, - "cardText": "Skeleton" - }] + "count":8, + "type":"Union", + "cardUnion": [ + { + "count":1, + "subTypes": ["Skeleton"] + }, + { + "count":1, + "cardText": "Skeleton" + } + ] + }] },{ "name":"Pirate", "description":"Marauding Looters", @@ -1807,33 +3557,57 @@ "sprite":"PirateShop", "rewards": [ { - "count":6, - "subTypes": ["Pirate"] - }, - { - "count":2, - "cardText": "Pirate" - }] + "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" + "overlaySprite":"Overlay4Blue", "rewards": [ { - "count":2, - "subTypes": ["Pirate"] - }, + "count":4, + "type":"Union", + "cardUnion": [ + { + "count":1, + "subTypes": ["Pirate"] + }, + { + "count":1, + "cardText": "Pirate" + } + ] + }, { - "count":4, - "subTypes": ["Pirate"], - "colors":["blue"] - }, - { - "count":2, - "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", @@ -1841,13 +3615,19 @@ "sprite":"RogueShop", "rewards": [ { - "count":6, - "subTypes": ["Rogue"] - }, - { - "count":2, - "cardText": "Rogue" - }] + "count":8, + "type":"Union", + "cardUnion": [ + { + "count":1, + "subTypes": ["Rogue"] + }, + { + "count":1, + "cardText": "Rogue" + } + ] + }] },{ "name":"Rogue4Black", "description":"Acquisitions Experts", @@ -1856,18 +3636,36 @@ "overlaySprite":"Overlay4Black", "rewards": [ { - "count":2, - "subTypes": ["Rogue"] - }, + "count":4, + "type":"Union", + "cardUnion": [ + { + "count":1, + "subTypes": ["Rogue"] + }, + { + "count":1, + "cardText": "Rogue" + } + ] + }, { - "count":4, - "subTypes": ["Rogue"], - "colors": ["black"] - }, - { - "count":2, - "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", @@ -1876,64 +3674,103 @@ "overlaySprite":"Overlay4Blue", "rewards": [ { - "count":2, - "subTypes": ["Rogue"] - }, + "count":4, + "type":"Union", + "cardUnion": [ + { + "count":1, + "subTypes": ["Rogue"] + }, + { + "count":1, + "cardText": "Rogue" + } + ] + }, { - "count":4, - "subTypes": ["Rogue"], - "colors": ["blue"] - }, - { - "count":2, - "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":6, - "subTypes": ["Shaman"] - }, { - "count":2, - "cardText": "Shaman" - }] + "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":6, - "subTypes": ["Wizard"] - }, { - "count":2, - "cardText": "Wizard" - }] + "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":6, - "superTypes": ["Legendary", "Legend"] - }, { - "count":1, - "cardText": "Legendary" - }, - { - "count":1, - "cardText": "Historic" - }] + "count":8, + "type":"Union", + "cardUnion": [ + { + "count":1, + "superTypes": ["Legend","Legendary"] + }, + { + "count":1, + "cardText": "Legendary" + }, + { + "count":1, + "cardText": "Historic" + } + ] + } + ] },{ "name":"Legend4Black", "description":"Phyrexian Tower", @@ -1941,23 +3778,45 @@ "sprite":"LegendShop", "overlaySprite":"Overlay4Black", "rewards": [ - { - "count":2, - "superTypes": ["Legendary", "Legend"] - }, { - "count":4, - "superTypes": ["Legendary", "Legend"], - "colors":["black"] - } + "count":4, + "type":"Union", + "cardUnion": [ + { + "count":1, + "superTypes": ["Legend","Legendary"] + }, + { + "count":1, + "cardText": "Legendary" + }, + { + "count":1, + "cardText": "Historic" + } + ] + }, { - "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", @@ -1965,23 +3824,45 @@ "sprite":"LegendShop", "overlaySprite":"Overlay4Blue", "rewards": [ - { - "count":2, - "superTypes": ["Legendary", "Legend"] - }, { - "count":4, - "superTypes": ["Legendary", "Legend"], - "colors":["blue"] - } + "count":4, + "type":"Union", + "cardUnion": [ + { + "count":1, + "superTypes": ["Legend","Legendary"] + }, + { + "count":1, + "cardText": "Legendary" + }, + { + "count":1, + "cardText": "Historic" + } + ] + }, { - "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", @@ -1989,23 +3870,45 @@ "sprite":"LegendShop", "overlaySprite":"Overlay4Green", "rewards": [ - { - "count":2, - "superTypes": ["Legendary", "Legend"] - }, { - "count":4, - "superTypes": ["Legendary", "Legend"], - "colors":["green"] - } + "count":4, + "type":"Union", + "cardUnion": [ + { + "count":1, + "superTypes": ["Legend","Legendary"] + }, + { + "count":1, + "cardText": "Legendary" + }, + { + "count":1, + "cardText": "Historic" + } + ] + }, { - "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", @@ -2013,46 +3916,117 @@ "sprite":"LegendShop", "overlaySprite":"Overlay4Red", "rewards": [ - { - "count":2, - "superTypes": ["Legendary", "Legend"] - }, { - "count":4, - "superTypes": ["Legendary", "Legend"], - "colors":["red"] - } + "count":4, + "type":"Union", + "cardUnion": [ + { + "count":1, + "superTypes": ["Legend","Legendary"] + }, + { + "count":1, + "cardText": "Legendary" + }, + { + "count":1, + "cardText": "Historic" + } + ] + }, { - "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":2, - "superTypes": ["Legendary", "Legend"] - }, - { - "count":4, - "superTypes": ["Legendary", "Legend"], - "colors":["white"] - } - { - "count":1, - "cardText": "Legendary" - }, - { - "count":1, - "cardText": "Historic" + "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/languages/en-US.properties b/forge-gui/res/languages/en-US.properties index 5467530adcb..76acd6b8223 100644 --- a/forge-gui/res/languages/en-US.properties +++ b/forge-gui/res/languages/en-US.properties @@ -2415,6 +2415,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/properties/ForgePreferences.java b/forge-gui/src/main/java/forge/localinstance/properties/ForgePreferences.java index 15bf8fe4203..daefbe57780 100644 --- a/forge-gui/src/main/java/forge/localinstance/properties/ForgePreferences.java +++ b/forge-gui/src/main/java/forge/localinstance/properties/ForgePreferences.java @@ -189,7 +189,6 @@ public class ForgePreferences extends PreferencesStore { AUTO_UPDATE("none"), USE_SENTRY("false"), // this controls whether automated bug reporting is done or not - EXPANDEDADVENTURESHOPS("false"), MATCH_HOT_SEAT_MODE("false"), //this only applies to mobile game MATCHPREF_PROMPT_FREE_BLOCKS("false"), 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 fd43d74bb74..201c8f85774 100644 --- a/forge-gui/src/main/java/forge/player/HumanCostDecision.java +++ b/forge-gui/src/main/java/forge/player/HumanCostDecision.java @@ -587,6 +587,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 07cd9c0b126..e8c7645e0e7 100644 --- a/forge-gui/src/main/java/forge/player/HumanPlay.java +++ b/forge-gui/src/main/java/forge/player/HumanPlay.java @@ -516,6 +516,17 @@ public class HumanPlay { p.payEnergy(amount, source); } + 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()); }