From c1a6313b1e68acc708608488d4611adf80f7894a Mon Sep 17 00:00:00 2001 From: Grimm Date: Tue, 9 Aug 2022 13:33:06 +0200 Subject: [PATCH] reworked starting deck to jumpstart, constructed or chaos support localization in UIData and removed it from code (only NewGameScene for now) --- .../src/main/java/forge/card/PrintSheet.java | 12 ++ .../src/forge/adventure/data/ConfigData.java | 3 +- .../forge/adventure/data/DifficultyData.java | 6 + .../adventure/data/GeneratedDeckData.java | 2 + .../adventure/player/AdventurePlayer.java | 60 +++------ .../forge/adventure/scene/NewGameScene.java | 114 ++++-------------- .../adventure/scene/PlayerStatisticScene.java | 15 +-- .../src/forge/adventure/util/CardUtil.java | 68 +++++++++-- .../src/forge/adventure/util/Config.java | 36 ++++-- .../src/forge/adventure/util/MapDialog.java | 4 +- .../src/forge/adventure/util/UIActor.java | 28 ++++- .../src/forge/adventure/world/WorldSave.java | 14 +-- forge-gui/res/adventure/Shandalar/config.json | 71 ++++++++--- .../decks/starter/Adventure - Low Azorius.dck | 33 +++++ .../decks/starter/Adventure - Low Black.dck | 32 +++++ .../decks/starter/Adventure - Low Blue.dck | 32 +++++ .../decks/starter/Adventure - Low Boros.dck | 33 +++++ .../decks/starter/Adventure - Low Dimir.dck | 33 +++++ .../decks/starter/Adventure - Low Golgari.dck | 33 +++++ .../decks/starter/Adventure - Low Green.dck | 31 +++++ .../decks/starter/Adventure - Low Gruul.dck | 34 ++++++ .../decks/starter/Adventure - Low Izzet.dck | 33 +++++ .../decks/starter/Adventure - Low Orzhov.dck | 34 ++++++ .../decks/starter/Adventure - Low Rakdos.dck | 33 +++++ .../decks/starter/Adventure - Low Red.dck | 27 +++++ .../starter/Adventure - Low Selesnya.dck | 33 +++++ .../decks/starter/Adventure - Low Simic.dck | 33 +++++ .../decks/starter/Adventure - Low White.dck | 31 +++++ .../Shandalar/decks/starter/black_e.json | 6 + .../res/adventure/Shandalar/ui/new_game.json | 83 +++++++------ .../Shandalar/ui/new_game_portrait.json | 109 +++++++++-------- .../res/adventure/Shandalar/world/waste.json | 1 - 32 files changed, 842 insertions(+), 275 deletions(-) create mode 100644 forge-gui/res/adventure/Shandalar/decks/starter/Adventure - Low Azorius.dck create mode 100644 forge-gui/res/adventure/Shandalar/decks/starter/Adventure - Low Black.dck create mode 100644 forge-gui/res/adventure/Shandalar/decks/starter/Adventure - Low Blue.dck create mode 100644 forge-gui/res/adventure/Shandalar/decks/starter/Adventure - Low Boros.dck create mode 100644 forge-gui/res/adventure/Shandalar/decks/starter/Adventure - Low Dimir.dck create mode 100644 forge-gui/res/adventure/Shandalar/decks/starter/Adventure - Low Golgari.dck create mode 100644 forge-gui/res/adventure/Shandalar/decks/starter/Adventure - Low Green.dck create mode 100644 forge-gui/res/adventure/Shandalar/decks/starter/Adventure - Low Gruul.dck create mode 100644 forge-gui/res/adventure/Shandalar/decks/starter/Adventure - Low Izzet.dck create mode 100644 forge-gui/res/adventure/Shandalar/decks/starter/Adventure - Low Orzhov.dck create mode 100644 forge-gui/res/adventure/Shandalar/decks/starter/Adventure - Low Rakdos.dck create mode 100644 forge-gui/res/adventure/Shandalar/decks/starter/Adventure - Low Red.dck create mode 100644 forge-gui/res/adventure/Shandalar/decks/starter/Adventure - Low Selesnya.dck create mode 100644 forge-gui/res/adventure/Shandalar/decks/starter/Adventure - Low Simic.dck create mode 100644 forge-gui/res/adventure/Shandalar/decks/starter/Adventure - Low White.dck create mode 100644 forge-gui/res/adventure/Shandalar/decks/starter/black_e.json diff --git a/forge-core/src/main/java/forge/card/PrintSheet.java b/forge-core/src/main/java/forge/card/PrintSheet.java index 573c834e158..17c79d4a2ce 100644 --- a/forge-core/src/main/java/forge/card/PrintSheet.java +++ b/forge-core/src/main/java/forge/card/PrintSheet.java @@ -100,6 +100,18 @@ public class PrintSheet { } return result; } + public boolean containsCardNamed(String name) { + for (Entry kv : cardsWithWeights) { + for (int i = 0; i < kv.getValue(); i++) { + if(kv.getKey().getName().equals(name)) + return true; + } + } + return false; + } + public String getName() { + return name; + } public List random(int number, boolean wantUnique) { List result = new ArrayList<>(); diff --git a/forge-gui-mobile/src/forge/adventure/data/ConfigData.java b/forge-gui-mobile/src/forge/adventure/data/ConfigData.java index e904058a6e3..035a2c3272b 100644 --- a/forge-gui-mobile/src/forge/adventure/data/ConfigData.java +++ b/forge-gui-mobile/src/forge/adventure/data/ConfigData.java @@ -14,7 +14,8 @@ public class ConfigData { public String fontColor; public int minDeckSize; public float playerBaseSpeed; - public String[] starterDecks; + public String[] colorIds; + public String[] colorIdNames; public DifficultyData[] difficulties; public RewardData legalCards; public String[] restrictedCards; diff --git a/forge-gui-mobile/src/forge/adventure/data/DifficultyData.java b/forge-gui-mobile/src/forge/adventure/data/DifficultyData.java index c7429767a3d..2175fff0afa 100644 --- a/forge-gui-mobile/src/forge/adventure/data/DifficultyData.java +++ b/forge-gui-mobile/src/forge/adventure/data/DifficultyData.java @@ -1,5 +1,7 @@ package forge.adventure.data; +import com.badlogic.gdx.utils.ObjectMap; + /** * Data class that will be used to read Json configuration files * BiomeData @@ -13,6 +15,10 @@ public class DifficultyData { public boolean startingDifficulty; public int spawnRank = 1; //0 for "easy", 1 for "normal", 2 for "hard". To filter map spawns based on this. public float sellFactor=0.2f; + public float goldLoss=0.2f; + public float lifeLoss=0.2f; public String[] startItems=new String[0]; + public ObjectMap starterDecks = null; + public ObjectMap constructedStarterDecks= null; } diff --git a/forge-gui-mobile/src/forge/adventure/data/GeneratedDeckData.java b/forge-gui-mobile/src/forge/adventure/data/GeneratedDeckData.java index abd80dfa232..dcf18d8d3cb 100644 --- a/forge-gui-mobile/src/forge/adventure/data/GeneratedDeckData.java +++ b/forge-gui-mobile/src/forge/adventure/data/GeneratedDeckData.java @@ -14,4 +14,6 @@ public class GeneratedDeckData { public RewardData[] mainDeck; public RewardData[] sideBoard; + public String[] jumpstartPacks; + } diff --git a/forge-gui-mobile/src/forge/adventure/player/AdventurePlayer.java b/forge-gui-mobile/src/forge/adventure/player/AdventurePlayer.java index 3c1301ae7e5..d21929434a5 100644 --- a/forge-gui-mobile/src/forge/adventure/player/AdventurePlayer.java +++ b/forge-gui-mobile/src/forge/adventure/player/AdventurePlayer.java @@ -11,6 +11,7 @@ import forge.adventure.data.HeroListData; import forge.adventure.data.ItemData; import forge.adventure.util.*; import forge.adventure.world.WorldSave; +import forge.card.ColorSet; import forge.deck.CardPool; import forge.deck.Deck; import forge.deck.DeckProxy; @@ -38,7 +39,7 @@ public class AdventurePlayer implements Serializable, SaveFileContent { private int heroRace; private int avatarIndex; private boolean isFemale; - private ColorID colorIdentity = ColorID.COLORLESS; + private ColorSet colorIdentity = ColorSet.ALL_COLORS; // Deck data private Deck deck; @@ -106,7 +107,7 @@ public class AdventurePlayer implements Serializable, SaveFileContent { private final CardPool cards=new CardPool(); private final ItemPool newCards=new ItemPool<>(InventoryItem.class); - public void create(String n, int startingColorIdentity, Deck startingDeck, boolean male, int race, int avatar, boolean isFantasy, DifficultyData difficultyData) { + public void create(String n, ColorSet startingColorIdentity, Deck startingDeck, boolean male, int race, int avatar, boolean isFantasy, DifficultyData difficultyData) { clear(); announceFantasy = fantasyMode = isFantasy; //Set Chaos mode first. @@ -131,7 +132,9 @@ public class AdventurePlayer implements Serializable, SaveFileContent { if (fantasyMode){ //Set a random ColorID in fantasy mode. setColorIdentity(MyRandom.getRandom().nextInt(5)); // MyRandom to not interfere with the unstable RNG. - } else setColorIdentity(startingColorIdentity + 1); // +1 because index 0 is colorless. + } + else + this.colorIdentity=startingColorIdentity; life = maxLife = difficultyData.startingLife; @@ -177,26 +180,12 @@ public class AdventurePlayer implements Serializable, SaveFileContent { public Collection getEquippedItems() { return equippedItems.values(); } public ItemPool getNewCards() { return newCards; } - public String getColorIdentity(){ - switch (colorIdentity){ - case BLUE : return "U"; - case GREEN : return "G"; - case RED : return "R"; - case BLACK : return "B"; - case WHITE : return "W"; - case COLORLESS: default: return "C"; //You are either Ugin or an Eldrazi. Nice. - } + public byte getColorIdentity(){ + return colorIdentity.getColor(); } public String getColorIdentityLong(){ - switch (colorIdentity){ - case BLUE : return "blue"; - case GREEN : return "green"; - case RED : return "red"; - case BLACK : return "black"; - case WHITE : return "white"; - case COLORLESS: default: return "colorless"; - } + return colorIdentity.toString(); } @@ -209,25 +198,11 @@ public class AdventurePlayer implements Serializable, SaveFileContent { } public void setColorIdentity(String C){ - switch (C.toUpperCase()){ - case "B": this.colorIdentity = ColorID.BLACK; break; - case "G": this.colorIdentity = ColorID.GREEN; break; - case "R": this.colorIdentity = ColorID.RED; break; - case "U": this.colorIdentity = ColorID.BLUE; break; - case "W": this.colorIdentity = ColorID.WHITE; break; - case "C": default: this.colorIdentity = ColorID.COLORLESS; break; - } + colorIdentity= ColorSet.fromNames(C.toCharArray()); } public void setColorIdentity(int C){ - switch (C){ - case 2: this.colorIdentity = ColorID.BLACK; break; - case 5: this.colorIdentity = ColorID.GREEN; break; - case 4: this.colorIdentity = ColorID.RED; break; - case 3: this.colorIdentity = ColorID.BLUE; break; - case 1: this.colorIdentity = ColorID.WHITE; break; - case 0: default: this.colorIdentity = ColorID.COLORLESS; break; - } + colorIdentity= ColorSet.fromMask(C); } @@ -250,8 +225,10 @@ public class AdventurePlayer implements Serializable, SaveFileContent { heroRace = data.readInt("heroRace"); avatarIndex = data.readInt("avatarIndex"); isFemale = data.readBool("isFemale"); - if(data.containsKey("colorIdentity")) setColorIdentity(data.readString("colorIdentity")); - else colorIdentity = ColorID.COLORLESS; + if(data.containsKey("colorIdentity")) + setColorIdentity(data.readString("colorIdentity")); + else + colorIdentity = ColorSet.ALL_COLORS; gold = data.readInt("gold"); maxLife = data.readInt("maxLife"); @@ -342,7 +319,7 @@ public class AdventurePlayer implements Serializable, SaveFileContent { data.store("heroRace",heroRace); data.store("avatarIndex",avatarIndex); data.store("isFemale",isFemale); - data.store("colorIdentity", getColorIdentity()); + data.store("colorIdentity", colorIdentity.getColor()); data.store("fantasyMode",fantasyMode); data.store("announceFantasy",announceFantasy); @@ -466,9 +443,8 @@ public class AdventurePlayer implements Serializable, SaveFileContent { onLifeTotalChangeList.emit(); } public void defeated() { - int percentLoss = 10; - gold=gold-(gold*percentLoss/100); - life=Math.max(1,(int)(life-(maxLife*0.2f))); + gold= (int) (gold-(gold*difficultyData.goldLoss)); + life=Math.max(1,(int)(life-(maxLife*difficultyData.lifeLoss))); onLifeTotalChangeList.emit(); onGoldChangeList.emit(); } diff --git a/forge-gui-mobile/src/forge/adventure/scene/NewGameScene.java b/forge-gui-mobile/src/forge/adventure/scene/NewGameScene.java index 4730ced2e6a..ba94e3261b4 100644 --- a/forge-gui-mobile/src/forge/adventure/scene/NewGameScene.java +++ b/forge-gui-mobile/src/forge/adventure/scene/NewGameScene.java @@ -11,10 +11,13 @@ import com.badlogic.gdx.utils.Array; import forge.Forge; import forge.adventure.data.DifficultyData; import forge.adventure.data.HeroListData; +import forge.adventure.data.UIData; import forge.adventure.util.Config; import forge.adventure.util.Controls; import forge.adventure.util.Selector; +import forge.adventure.util.UIActor; import forge.adventure.world.WorldSave; +import forge.card.ColorSet; import forge.deck.Deck; import forge.deck.DeckProxy; import forge.localinstance.properties.ForgePreferences; @@ -30,20 +33,14 @@ import java.util.Random; */ public class NewGameScene extends UIScene { TextField selectedName; - Deck[] starterDeck; + ColorSet[] starterDeck; private Image avatarImage; private int avatarIndex = 0; private Selector race; - private Selector deck; + private Selector colorId; private Selector gender; + private Selector mode; private Selector difficulty; - private ScrollPane scrollPane; - private Label titleL, avatarL, nameL, raceL, genderL, difficultyL, deckL; - private ImageButton leftArrow, rightArrow; - private TextButton backButton, startButton; - boolean fantasyMode = false; - boolean easyMode = false; - private CheckBox box, box2; public NewGameScene() { super(Forge.isLandscapeMode() ? "ui/new_game.json" : "ui/new_game_portrait.json"); @@ -59,9 +56,9 @@ public class NewGameScene extends UIScene { gender.getCurrentIndex() == 0, race.getCurrentIndex(), avatarIndex, - deck.getCurrentIndex(), + starterDeck[colorId.getCurrentIndex()], Config.instance().getConfigData().difficulties[difficulty.getCurrentIndex()], - fantasyMode, easyMode, deck.getText(), 0); + mode.getCurrentIndex()==2, mode.getCurrentIndex()==1, 0);//maybe replace with enum GamePlayerUtil.getGuiPlayer().setName(selectedName.getText()); Forge.clearTransitionScreen(); Forge.switchScene(SceneType.GameScene.instance); @@ -82,20 +79,27 @@ public class NewGameScene extends UIScene { selectedName.setText(NameGenerator.getRandomName("Any", "Any", "")); avatarImage = ui.findActor("avatarPreview"); gender = ui.findActor("gender"); + mode = ui.findActor("mode"); + mode.setTextList(new String[]{"Standard", "Constructed","Chaos"}); gender.setTextList(new String[]{"Male", "Female"}); gender.addListener(event -> NewGameScene.this.updateAvatar()); Random rand = new Random(); - deck = ui.findActor("deck"); - starterDeck = Config.instance().starterDecks(); + colorId = ui.findActor("colorId"); + String[] colorSet=Config.instance().colorIds(); + String[] colorIdNames=Config.instance().colorIdNames(); + starterDeck= new ColorSet[colorSet.length]; + for(int i=0;i stringList = new Array<>(starterDeck.length); - for (Deck deck : starterDeck) - stringList.add(deck.getName()); + for (String idName : colorIdNames) + stringList.add(UIActor.localize(idName)); Array chaos = new Array<>(); chaos.add("Preconstructed"); Array easyDecks = new Array<>(); for (DeckProxy deckProxy : DeckProxy.getAllEasyStarterDecks()) easyDecks.add(deckProxy.getName()); - deck.setTextList(stringList); + colorId.setTextList(stringList); race = ui.findActor("race"); race.addListener(event -> NewGameScene.this.updateAvatar()); race.setTextList(HeroListData.getRaces()); @@ -114,86 +118,14 @@ public class NewGameScene extends UIScene { difficulty.setCurrentIndex(startingDifficulty); avatarIndex = rand.nextInt(); gender.setCurrentIndex(rand.nextInt()); - deck.setCurrentIndex(rand.nextInt()); + colorId.setCurrentIndex(rand.nextInt()); race.setCurrentIndex(rand.nextInt()); ui.onButtonPress("back", () -> NewGameScene.this.back()); ui.onButtonPress("start", () -> NewGameScene.this.start()); ui.onButtonPress("leftAvatar", () -> NewGameScene.this.leftAvatar()); ui.onButtonPress("rightAvatar", () -> NewGameScene.this.rightAvatar()); - scrollPane = ui.findActor("scroll"); - titleL = ui.findActor("titleL"); - titleL.setScale(2, 2); - titleL.setText(Forge.getLocalizer().getMessage("lblCreateACharacter")); - titleL.setX(scrollPane.getX() + 20); - avatarL = ui.findActor("avatarL"); - avatarL.setText(Forge.getLocalizer().getMessage("lblAvatar")); - nameL = ui.findActor("nameL"); - nameL.setText(Forge.getLocalizer().getMessage("lblName")); - raceL = ui.findActor("raceL"); - raceL.setText(Forge.getLocalizer().getMessage("lblRace")); - genderL = ui.findActor("genderL"); - genderL.setText(Forge.getLocalizer().getMessage("lblGender")); - difficultyL = ui.findActor("difficultyL"); - difficultyL.setText(Forge.getLocalizer().getMessage("lblDifficulty")); - deckL = ui.findActor("deckL"); - deckL.setText(Forge.getLocalizer().getMessage("lblDeck")); - box2 = Controls.newCheckBox(""); - box2.addListener(new ChangeListener() { - @Override - public void changed(ChangeEvent changeEvent, Actor actor) { - if (((CheckBox) actor).isChecked()) { - box.setChecked(false); - easyMode = true; - fantasyMode = false; - deck.setTextList(easyDecks); - } else { - easyMode = false; - deck.setTextList(stringList); - } - } - }); - box = Controls.newCheckBox(""); - box.addListener(new ChangeListener() { - @Override - public void changed(ChangeEvent event, Actor actor) { - if (((CheckBox) actor).isChecked()) { - box2.setChecked(false); - fantasyMode = true; - easyMode = false; - deck.setTextList(chaos); - } else { - fantasyMode = false; - deck.setTextList(stringList); - } - } - }); - //easy mode - box2.setBounds(deckL.getX()-box2.getHeight(), deckL.getY()-box2.getHeight(), deckL.getHeight(), deckL.getHeight()); - Label label2 = Controls.newLabel("Starter"); - label2.setColor(Color.BLACK); - label2.setBounds(box2.getX()+22, box2.getY(), box2.getWidth(), box2.getHeight()); - ui.addActor(box2); - ui.addActor(label2); - //chaos mode - box.setBounds(label2.getX()+25, label2.getY(), box2.getWidth(), box2.getHeight()); - Label label = Controls.newLabel("Chaos"); - label.setColor(Color.BLACK); - label.setBounds(box.getX()+22, box.getY(), box.getWidth(), box.getHeight()); - ui.addActor(box); - ui.addActor(label); - if (easyDecks.isEmpty()) { - box2.setDisabled(true); - box2.getColor().a = 0.5f; - label2.getColor().a = 0.5f; - } - leftArrow = ui.findActor("leftAvatar"); - rightArrow = ui.findActor("rightAvatar"); - backButton = ui.findActor("back"); - backButton.getLabel().setText(Forge.getLocalizer().getMessage("lblBack")); - startButton = ui.findActor("start"); - startButton.getLabel().setText(Forge.getLocalizer().getMessage("lblStart")); } @@ -230,9 +162,9 @@ public class NewGameScene extends UIScene { gender.getCurrentIndex() == 0, race.getCurrentIndex(), avatarIndex, - deck.getCurrentIndex(), + starterDeck[colorId.getCurrentIndex()], Config.instance().getConfigData().difficulties[difficulty.getCurrentIndex()], - fantasyMode, easyMode, deck.getText(), 0); + mode.getCurrentIndex()==2, mode.getCurrentIndex()==1, 0);//maybe replace with enum GamePlayerUtil.getGuiPlayer().setName(selectedName.getText()); Forge.switchScene(SceneType.GameScene.instance); } diff --git a/forge-gui-mobile/src/forge/adventure/scene/PlayerStatisticScene.java b/forge-gui-mobile/src/forge/adventure/scene/PlayerStatisticScene.java index 05a8a1ee183..9f6f9ee01d4 100644 --- a/forge-gui-mobile/src/forge/adventure/scene/PlayerStatisticScene.java +++ b/forge-gui-mobile/src/forge/adventure/scene/PlayerStatisticScene.java @@ -17,6 +17,7 @@ import forge.adventure.util.Config; import forge.adventure.util.Controls; import forge.adventure.util.Current; import forge.adventure.world.WorldSave; +import forge.card.MagicColor; import forge.player.GamePlayerUtil; import org.apache.commons.lang3.tuple.Pair; @@ -59,16 +60,16 @@ public class PlayerStatisticScene extends UIScene { Forge.switchToLast(); return true; } - private TextureRegion getColorFrame(String C){ + private TextureRegion getColorFrame(byte C){ int x, y; switch(C){ - case "B": { x = 0 ; y = 0 ; break; } - case "G": { x = 64; y = 0 ; break; } - case "R": { x = 0 ; y = 32; break; } - case "U": { x = 32; y = 32; break; } - case "W": { x = 64; y = 32; break; } + case MagicColor.BLACK: { x = 0 ; y = 0 ; break; } + case MagicColor.GREEN: { x = 64; y = 0 ; break; } + case MagicColor.RED: { x = 0 ; y = 32; break; } + case MagicColor.BLUE: { x = 32; y = 32; break; } + case MagicColor.WHITE: { x = 64; y = 32; break; } default: - case "C": { x = 32; y = 0 ; break; } + case MagicColor.COLORLESS: { x = 32; y = 0 ; break; } } TextureRegion result = new TextureRegion(colorFrames, x, y, 32, 32); return result; diff --git a/forge-gui-mobile/src/forge/adventure/util/CardUtil.java b/forge-gui-mobile/src/forge/adventure/util/CardUtil.java index 3b00e893719..087227d5473 100644 --- a/forge-gui-mobile/src/forge/adventure/util/CardUtil.java +++ b/forge-gui-mobile/src/forge/adventure/util/CardUtil.java @@ -1,23 +1,33 @@ package forge.adventure.util; import com.badlogic.gdx.files.FileHandle; +import com.badlogic.gdx.utils.Array; import com.badlogic.gdx.utils.Json; import com.google.common.base.Predicate; +import com.google.common.base.Predicates; +import com.google.common.collect.ImmutableList; import com.google.common.collect.Iterables; +import com.sun.org.apache.xerces.internal.xs.StringList; +import forge.StaticData; import forge.adventure.data.GeneratedDeckData; import forge.adventure.data.GeneratedDeckTemplateData; import forge.adventure.data.RewardData; import forge.adventure.world.WorldSave; -import forge.card.CardRarity; -import forge.card.CardType; -import forge.card.MagicColor; +import forge.card.*; import forge.card.mana.ManaCostShard; import forge.deck.Deck; import forge.deck.DeckSection; import forge.deck.DeckgenUtil; import forge.deck.io.DeckSerializer; +import forge.item.BoosterPack; +import forge.item.InventoryItem; import forge.item.PaperCard; +import forge.item.SealedProduct; +import forge.item.generation.BoosterGenerator; +import forge.item.generation.BoosterSlots; import forge.model.FModel; +import forge.util.Aggregates; +import org.apache.commons.lang3.tuple.Pair; import java.io.File; import java.util.ArrayList; @@ -287,23 +297,55 @@ public class CardUtil { public static Deck generateDeck(GeneratedDeckData data) { Deck deck= new Deck(data.name); - if(data.template==null) + if(data.mainDeck!=null) { deck.getOrCreate(DeckSection.Main).addAllFlat(generateAllCards(Arrays.asList(data.mainDeck), true)); if(data.sideBoard!=null) deck.getOrCreate(DeckSection.Sideboard).addAllFlat(generateAllCards(Arrays.asList(data.sideBoard), true)); return deck; } - float count=data.template.count; - float lands=count*0.4f; - float spells=count-lands; - List dataArray= generateRewards(data.template,spells*0.5f,new int[]{1,2}); - dataArray.addAll(generateRewards(data.template,spells*0.3f,new int[]{3,4,5})); - dataArray.addAll(generateRewards(data.template,spells*0.2f,new int[]{6,7,8})); - List nonLand= generateAllCards(dataArray, true); + if(data.jumpstartPacks!=null) + { + deck.getOrCreate(DeckSection.Main); + for(int i=0;i candidates=new ArrayList<>(); + for(PrintSheet sheet : StaticData.instance().getPrintSheets()) + { + if(sheet.containsCardNamed(targetName)&&sheet.getName().startsWith("JMP")) + { + candidates.add(sheet); + } + } + deck.getOrCreate(DeckSection.Main).addAllFlat(candidates.get(Current.world().getRandom().nextInt(candidates.size())).all()); + } + return deck; + } + if(data.template!=null) + { + float count=data.template.count; + float lands=count*0.4f; + float spells=count-lands; + List dataArray= generateRewards(data.template,spells*0.5f,new int[]{1,2}); + dataArray.addAll(generateRewards(data.template,spells*0.3f,new int[]{3,4,5})); + dataArray.addAll(generateRewards(data.template,spells*0.2f,new int[]{6,7,8})); + List nonLand= generateAllCards(dataArray, true); + + nonLand.addAll(fillWithLands(nonLand,data.template)); + deck.getOrCreate(DeckSection.Main).addAllFlat(nonLand); + } return deck; } diff --git a/forge-gui-mobile/src/forge/adventure/util/Config.java b/forge-gui-mobile/src/forge/adventure/util/Config.java index eabc723e176..e7aa30b2a39 100644 --- a/forge-gui-mobile/src/forge/adventure/util/Config.java +++ b/forge-gui-mobile/src/forge/adventure/util/Config.java @@ -4,9 +4,12 @@ import com.badlogic.gdx.files.FileHandle; import com.badlogic.gdx.graphics.g2d.TextureAtlas; import com.badlogic.gdx.utils.Json; import com.badlogic.gdx.utils.JsonWriter; +import com.badlogic.gdx.utils.ObjectMap; import forge.Forge; import forge.adventure.data.ConfigData; +import forge.adventure.data.DifficultyData; import forge.adventure.data.SettingData; +import forge.card.ColorSet; import forge.deck.Deck; import forge.gui.GuiBase; import forge.localinstance.properties.ForgeConstants; @@ -26,7 +29,7 @@ public class Config { private static Config currentConfig; private final String prefix; private final HashMap Cache = new HashMap(); - private final ConfigData configData; + private ConfigData configData; private final String[] adventures; private SettingData settingsData; private String Lang = "en-us"; @@ -83,7 +86,16 @@ public class Config { prefix = path + "/res/adventure/" + plane + "/"; if (FModel.getPreferences() != null) Lang = FModel.getPreferences().getPref(ForgePreferences.FPref.UI_LANGUAGE); - configData = new Json().fromJson(ConfigData.class, new FileHandle(prefix + "config.json")); + try + { + configData = new Json().fromJson(ConfigData.class, new FileHandle(prefix + "config.json")); + + } + catch (Exception e) + { + e.printStackTrace(); + configData=new ConfigData(); + } } @@ -121,13 +133,23 @@ public class Config { return plane; } - public Deck[] starterDecks() { + public String[] colorIdNames() { - Deck[] deck = new Deck[configData.starterDecks.length]; - for (int i = 0; i < configData.starterDecks.length; i++) { - deck[i] = CardUtil.getDeck(configData.starterDecks[i], false, false, "", false, false); + return configData.colorIdNames; + } + public String[] colorIds() { + + return configData.colorIds; + } + public Deck starterDeck(ColorSet color, DifficultyData difficultyData) { + for(ObjectMap.Entry entry:difficultyData.starterDecks) + { + if(ColorSet.fromNames(entry.key.toCharArray()).getColor()==color.getColor()) + { + return CardUtil.getDeck(entry.value, false, false, "", false, false); + } } - return deck; + return null; } public TextureAtlas getAtlas(String spriteAtlas) { diff --git a/forge-gui-mobile/src/forge/adventure/util/MapDialog.java b/forge-gui-mobile/src/forge/adventure/util/MapDialog.java index 28d987171e2..3b4bfbb1cb9 100644 --- a/forge-gui-mobile/src/forge/adventure/util/MapDialog.java +++ b/forge-gui-mobile/src/forge/adventure/util/MapDialog.java @@ -9,6 +9,7 @@ import forge.adventure.character.EnemySprite; import forge.adventure.data.DialogData; import forge.adventure.player.AdventurePlayer; import forge.adventure.stage.MapStage; +import forge.card.ColorSet; import forge.util.Localizer; /** @@ -154,7 +155,8 @@ public class MapDialog { } else if(condition.not) return false; } if(condition.colorIdentity != null && !condition.colorIdentity.isEmpty()) { //Check for player's color ID. - if(!player.getColorIdentity().equals(condition.colorIdentity.toUpperCase())){ + if(player.getColorIdentity()!=(ColorSet.fromNames(condition.colorIdentity.toCharArray()).getColor())) + { if(!condition.not) return false; } else if(condition.not) return false; } diff --git a/forge-gui-mobile/src/forge/adventure/util/UIActor.java b/forge-gui-mobile/src/forge/adventure/util/UIActor.java index 840fa8e4661..62ded063338 100644 --- a/forge-gui-mobile/src/forge/adventure/util/UIActor.java +++ b/forge-gui-mobile/src/forge/adventure/util/UIActor.java @@ -13,8 +13,12 @@ import com.badlogic.gdx.scenes.scene2d.utils.TextureRegionDrawable; import com.badlogic.gdx.utils.Json; import com.badlogic.gdx.utils.ObjectMap; import com.badlogic.gdx.utils.OrderedMap; +import forge.Forge; import forge.adventure.data.UIData; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + /** * Group of controls that will be loaded from a configuration file */ @@ -86,6 +90,9 @@ public class UIActor extends Group { float yValue = 0; for (ObjectMap.Entry property : new OrderedMap.OrderedMapEntries<>(element)) { switch (property.key.toString()) { + case "scale": + newActor.setScale((Float) property.value); + break; case "width": newActor.setWidth((Float) property.value); break; @@ -152,7 +159,8 @@ public class UIActor extends Group { for (ObjectMap.Entry property : entries) { switch (property.key.toString()) { case "text": - newActor.setText(property.value.toString()); + + newActor.setText(localize(property.value.toString())); break; case "align": newActor.setAlignment(((Float) property.value).intValue()); @@ -161,6 +169,18 @@ public class UIActor extends Group { } } + public static String localize(String str) { + Pattern regex=Pattern.compile("\\{[^\\}]*\\}"); + for(int i=0;i<100;i++) + { + Matcher matcher= regex.matcher(str); + if(!matcher.find()) + return str; + str=matcher.replaceAll(Forge.getLocalizer().getMessage(matcher.group().substring(1,matcher.group().length()-1))); + } + return str; + } + private void readImageButtonProperties(ImageButton newActor, ObjectMap.Entries entries) { for (ObjectMap.Entry property : entries) { switch (property.key.toString()) { @@ -176,7 +196,7 @@ public class UIActor extends Group { for (ObjectMap.Entry property : entries) { switch (property.key.toString()) { case "text": - newActor.setText(property.value.toString()); + newActor.setText(localize(property.value.toString())); break; case "font"://legacy style.font = Controls.getBitmapFont(property.value.toString()); @@ -221,7 +241,7 @@ public class UIActor extends Group { for (ObjectMap.Entry property : entries) { switch (property.key.toString()) { case "text": - newActor.setText(property.value.toString()); + newActor.setText(localize(property.value.toString())); break; } } @@ -231,7 +251,7 @@ public class UIActor extends Group { for (ObjectMap.Entry property : entries) { switch (property.key.toString()) { case "text": - newActor.setText(property.value.toString()); + newActor.setText(localize(property.value.toString())); break; } } diff --git a/forge-gui-mobile/src/forge/adventure/world/WorldSave.java b/forge-gui-mobile/src/forge/adventure/world/WorldSave.java index ca606512ecb..5fa2207eee2 100644 --- a/forge-gui-mobile/src/forge/adventure/world/WorldSave.java +++ b/forge-gui-mobile/src/forge/adventure/world/WorldSave.java @@ -7,6 +7,7 @@ import forge.adventure.stage.WorldStage; import forge.adventure.util.Config; import forge.adventure.util.SaveFileData; import forge.adventure.util.SignalList; +import forge.card.ColorSet; import forge.deck.Deck; import forge.deck.DeckProxy; import forge.deck.DeckgenUtil; @@ -122,24 +123,23 @@ public class WorldSave { return currentSave; } - public static WorldSave generateNewWorld(String name, boolean male, int race, int avatarIndex, int startingColorIdentity, DifficultyData diff, boolean isFantasy, boolean isEasy, String starter, long seed) { + public static WorldSave generateNewWorld(String name, boolean male, int race, int avatarIndex, ColorSet startingColorIdentity, DifficultyData diff, boolean isFantasy, boolean isEasy, long seed) { currentSave.world.generateNew(seed); currentSave.pointOfInterestChanges.clear(); Deck starterDeck; - int identity = startingColorIdentity; if (isEasy) { - DeckProxy dp = DeckProxy.getAllEasyStarterDecks().get(startingColorIdentity); + DeckProxy dp = DeckProxy.getAllEasyStarterDecks().get(0); starterDeck = dp.getDeck(); - identity = dp.getColorIdentityforAdventure(); + startingColorIdentity = dp.getColorIdentity(); } else { - starterDeck = isFantasy ? DeckgenUtil.getRandomOrPreconOrThemeDeck("", false, false, false) : Config.instance().starterDecks()[startingColorIdentity]; + starterDeck = isFantasy ? DeckgenUtil.getRandomOrPreconOrThemeDeck("", false, false, false) : Config.instance().starterDeck(startingColorIdentity,diff); } currentSave.player.create(name, startingColorIdentity, starterDeck, male, race, avatarIndex, isFantasy, diff); currentSave.player.setWorldPosY((int) (currentSave.world.getData().playerStartPosY * currentSave.world.getData().height * currentSave.world.getTileSize())); currentSave.player.setWorldPosX((int) (currentSave.world.getData().playerStartPosX * currentSave.world.getData().width * currentSave.world.getTileSize())); //after getting deck override starting color identity to match - if (identity != startingColorIdentity) - currentSave.player.setColorIdentity(identity); + //if (identity != startingColorIdentity) + // currentSave.player.setColorIdentity(identity); currentSave.onLoadList.emit(); return currentSave; //return currentSave = ret; diff --git a/forge-gui/res/adventure/Shandalar/config.json b/forge-gui/res/adventure/Shandalar/config.json index 6380a7c71e4..1ad952fb260 100644 --- a/forge-gui/res/adventure/Shandalar/config.json +++ b/forge-gui/res/adventure/Shandalar/config.json @@ -3,14 +3,9 @@ "screenHeight": 270, "skin": "skin/ui_skin.json", "playerBaseSpeed": 32, - "minDeckSize": 40, - "starterDecks": [ - "decks/starter/white.json", - "decks/starter/black.json", - "decks/starter/blue.json", - "decks/starter/red.json", - "decks/starter/green.json" - ], + "minDeckSize": 40, + "colorIds":["W","U","B","R","G"], + "colorIdNames":["{lblWhite}","{lblBlue}","{lblBlack}","{lblRed}","{lblGreen}"], "restrictedCards": [ "Black Lotus", "Mox Emerald", @@ -48,8 +43,24 @@ "startingLife": 16, "staringMoney": 500, "enemyLifeFactor": 0.8, - "spawnRank": 0, - "sellFactor": 0.6, + "spawnRank": 0, + "goldLoss": 0.02, + "lifeLoss": 0.1, + "sellFactor": 0.6, + "starterDecks": { + "W":"decks/starter/white_e.json", + "B":"decks/starter/black_e.json", + "U":"decks/starter/blue_e.json", + "R":"decks/starter/red_e.json", + "G":"decks/starter/green_e.json" + }, + "constructedStarterDecks": { + "W":"decks/starter/Adventure - Low White.dck", + "B":"decks/starter/Adventure - Low Black.dck", + "U":"decks/starter/Adventure - Low Blue.dck", + "R":"decks/starter/Adventure - Low Red.dck", + "G":"decks/starter/Adventure - Low Green.dck" + }, "startItems": [ "Manasight Amulet", "Leather Boots" @@ -60,8 +71,24 @@ "staringMoney": 250, "startingDifficulty": true, "enemyLifeFactor": 1.0, - "spawnRank": 1, - "sellFactor": 0.5, + "spawnRank": 1, + "goldLoss": 0.1, + "lifeLoss": 0.2, + "sellFactor": 0.5, + "starterDecks": { + "W":"decks/starter/white_n.json", + "B":"decks/starter/black_n.json", + "U":"decks/starter/blue_n.json", + "R":"decks/starter/red_n.json", + "G":"decks/starter/green_n.json" + }, + "constructedStarterDecks": { + "W":"decks/starter/Adventure - Low Azorius.dck", + "B":"decks/starter/Adventure - Low Rakdos.dck", + "U":"decks/starter/Adventure - Low Dimir.dck", + "R":"decks/starter/Adventure - Low Gruul.dck", + "G":"decks/starter/Adventure - Low Selesnya.dck" + }, "startItems": [ "Leather Boots" ] @@ -70,8 +97,24 @@ "startingLife": 8, "staringMoney": 125, "enemyLifeFactor": 1.5, - "spawnRank": 2, - "sellFactor": 0.25 + "spawnRank": 2, + "goldLoss": 0.5, + "lifeLoss": 0.3, + "sellFactor": 0.25, + "starterDecks": { + "W":"decks/starter/white_h.json", + "B":"decks/starter/black_h.json", + "U":"decks/starter/blue_h.json", + "R":"decks/starter/red_h.json", + "G":"decks/starter/green_h.json" + }, + "constructedStarterDecks": { + "W":"decks/starter/Adventure - Low Orzhov.dck", + "B":"decks/starter/Adventure - Low Golgari.dck", + "U":"decks/starter/Adventure - Low Izzet.dck", + "R":"decks/starter/Adventure - Low Boros.dck", + "G":"decks/starter/Adventure - Low Simic.dck" + } } ] } diff --git a/forge-gui/res/adventure/Shandalar/decks/starter/Adventure - Low Azorius.dck b/forge-gui/res/adventure/Shandalar/decks/starter/Adventure - Low Azorius.dck new file mode 100644 index 00000000000..23467ae6296 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/decks/starter/Adventure - Low Azorius.dck @@ -0,0 +1,33 @@ +[metadata] +Name=Adventure - Low Azorius +[Avatar] + +[Main] +2 Aqueous Form|CMR|1 +1 Ardenn, Intrepid Archaeologist|CMR|1 +1 Auramancer's Guise|PLC|1 +2 Azorius Locket|C19|1 +2 Cartouche of Knowledge|AKH|1 +2 Cartouche of Solidarity|AKH|1 +1 Danitha Capashen, Paragon|CMR|1 +1 Dawn Evangel|THB|1 +2 Ethereal Armor|Q06|1 +1 Face of Divinity|JMP|1 +1 Graceblade Artisan|DTK|1 +2 Heliod's Pilgrim|THB|1 +1 Ironclad Slayer|CMR|1 +7 Island|GK2|1 +4 Meandering River|GS1|1 +7 Plains|GK2|1 +1 Sovereigns of Lost Alara|UMA|1 +2 Transcendent Envoy|THB|1 +[Sideboard] + +[Planes] + +[Schemes] + +[Conspiracy] + +[Dungeon] + diff --git a/forge-gui/res/adventure/Shandalar/decks/starter/Adventure - Low Black.dck b/forge-gui/res/adventure/Shandalar/decks/starter/Adventure - Low Black.dck new file mode 100644 index 00000000000..39319cfbd01 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/decks/starter/Adventure - Low Black.dck @@ -0,0 +1,32 @@ +[metadata] +Name=Adventure - Low Black +[Avatar] + +[Main] +1 Animate Dead|MB1|1 +1 Archfiend of Depravity|E01|1 +1 Banewhip Punisher|HOU|1 +2 Cartouche of Ambition|AKR|1 +2 Chainer's Edict|HA3|1 +1 Clattering Augur|MH2|1 +1 Dance of the Dead|ME2|1 +1 Deadly Dispute|AFR|1 +2 Doom Blade|STA|1 +1 Draugr Recruiter|KHM|1 +2 Ecstatic Awakener|MID|1 +1 Indulgent Tormentor|IMA|1 +1 Reassembling Skeleton|AFC|1 +2 Sanitarium Skeleton|CMR|1 +2 Soldevi Adnate|ALL|1 +1 Stab Wound|JMP|1 +18 Swamp|GK1|2 +[Sideboard] + +[Planes] + +[Schemes] + +[Conspiracy] + +[Dungeon] + diff --git a/forge-gui/res/adventure/Shandalar/decks/starter/Adventure - Low Blue.dck b/forge-gui/res/adventure/Shandalar/decks/starter/Adventure - Low Blue.dck new file mode 100644 index 00000000000..2030340b842 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/decks/starter/Adventure - Low Blue.dck @@ -0,0 +1,32 @@ +[metadata] +Name=Adventure - Low Blue +[Avatar] + +[Main] +1 Acquisition Octopus|NEO|1 +2 Armguard Familiar|NEO|1 +2 Boomerang|DPA|1 +1 Broodstar|HOP|1 +1 Callaphe, Beloved of the Sea|THB|1 +2 Disruption Protocol|NEO|1 +1 Ensoul Artifact|M15|1 +2 Etherium Sculptor|NEC|1 +2 Faerie Mechanist|2XM|1 +2 Into the Roil|ZNR|1 +13 Island|GK2|1 +1 Mysterious Tome|MID|1 +1 Replication Specialist|NEO|1 +4 Seat of the Synod|C18|1 +2 Silver Myr|NEC|1 +2 Sky Diamond|KHC|1 +1 Trickster's Talisman|AFR|1 +[Sideboard] + +[Planes] + +[Schemes] + +[Conspiracy] + +[Dungeon] + diff --git a/forge-gui/res/adventure/Shandalar/decks/starter/Adventure - Low Boros.dck b/forge-gui/res/adventure/Shandalar/decks/starter/Adventure - Low Boros.dck new file mode 100644 index 00000000000..93fbdd4ed46 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/decks/starter/Adventure - Low Boros.dck @@ -0,0 +1,33 @@ +[metadata] +Name=Adventure - Low Boros +[Avatar] + +[Main] +1 Balefire Liege|HOP|1 +2 Battlegate Mimic|EVE|1 +1 Boros Charm|NCC|1 +2 Boros Locket|C21|1 +2 Boros Recruit|RAV|1 +2 Double Cleave|UMA|1 +1 Faith Unbroken|CMR|1 +1 Flamewright|CNS|1 +1 Highspire Mantis|KTK|1 +2 Impetuous Sunchaser|BNG|1 +1 Lightning Helix|DDH|1 +7 Mountain|GK1|2 +7 Plains|GK1|1 +2 Scourge of the Nobilis|EVE|1 +1 Spitemare|DDH|1 +1 Squee's Embrace|APC|1 +4 Stone Quarry|M19|1 +2 Temur Battle Rage|CMR|1 +[Sideboard] + +[Planes] + +[Schemes] + +[Conspiracy] + +[Dungeon] + diff --git a/forge-gui/res/adventure/Shandalar/decks/starter/Adventure - Low Dimir.dck b/forge-gui/res/adventure/Shandalar/decks/starter/Adventure - Low Dimir.dck new file mode 100644 index 00000000000..6154f269b26 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/decks/starter/Adventure - Low Dimir.dck @@ -0,0 +1,33 @@ +[metadata] +Name=Adventure - Low Dimir +[Avatar] + +[Main] +1 Animate Dead|MB1|1 +2 Canal Courier|CN2|1 +2 Chainer's Edict|VMA|1 +2 Deathcult Rogue|GTC|1 +1 Deepchannel Mentor|SHM|1 +2 Dimir Locket|GRN|1 +2 Gravelgill Duo|SHM|1 +2 Hideous End|MB1|1 +2 Infiltrate|NMS|1 +1 Inkfathom Infiltrator|SHM|1 +7 Island|GK1|1 +1 Krydle of Baldur's Gate|AFR|1 +2 Library Larcenist|M21|1 +1 Soaring Thought-Thief|ZNR|1 +4 Submerged Boneyard|M19|1 +1 Sure-Footed Infiltrator|ZNR|1 +6 Swamp|GK1|1 +1 Zareth San, the Trickster|ZNR|1 +[Sideboard] + +[Planes] + +[Schemes] + +[Conspiracy] + +[Dungeon] + diff --git a/forge-gui/res/adventure/Shandalar/decks/starter/Adventure - Low Golgari.dck b/forge-gui/res/adventure/Shandalar/decks/starter/Adventure - Low Golgari.dck new file mode 100644 index 00000000000..1f76f0ef502 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/decks/starter/Adventure - Low Golgari.dck @@ -0,0 +1,33 @@ +[metadata] +Name=Adventure - Low Golgari +[Avatar] + +[Main] +1 Aspect of Lamprey|THB|1 +2 Elvish Vanguard|EMA|1 +1 Fell Specter|M19|1 +7 Forest|GK1|1 +4 Foul Orchard|M19|1 +1 Ghost-Lit Stalker|DDD|1 +2 Golgari Locket|GRN|1 +2 Headless Specter|MH1|1 +2 Hideous End|MB1|1 +2 Ivy Lane Denizen|GTC|1 +1 Liliana's Caress|M11|1 +2 Mind Drain|ZNR|1 +1 Nath of the Gilt-Leaf|C16|1 +1 Nullmage Shepherd|KHC|1 +1 Poison-Tip Archer|M19|1 +1 Raiders' Wake|XLN|1 +7 Swamp|GK1|2 +2 Winnower Patrol|MOR|1 +[Sideboard] + +[Planes] + +[Schemes] + +[Conspiracy] + +[Dungeon] + diff --git a/forge-gui/res/adventure/Shandalar/decks/starter/Adventure - Low Green.dck b/forge-gui/res/adventure/Shandalar/decks/starter/Adventure - Low Green.dck new file mode 100644 index 00000000000..23e42348c0c --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/decks/starter/Adventure - Low Green.dck @@ -0,0 +1,31 @@ +[metadata] +Name=Adventure - Low Green +[Avatar] + +[Main] +2 Ancient Animus|DOM|1 +2 Aquastrand Spider|DIS|1 +1 Armorcraft Judge|CMR|1 +2 Baloth Packhunter|ANB|1 +2 Big Play|STX|1 +1 Biogenic Upgrade|MIC|1 +1 Blessings of Nature|AVR|1 +1 Bramblewood Paragon|MOR|1 +1 Cytoplast Root-Kin|MM2|1 +2 Deepwood Denizen|MH2|1 +2 Earthen Arms|BFZ|1 +2 Forced Adaptation|GTC|1 +18 Forest|GK1|2 +1 Leyline Invocation|STX|1 +1 Paradox Zone|C21|1 +1 Renata, Called to the Hunt|THB|2 +[Sideboard] + +[Planes] + +[Schemes] + +[Conspiracy] + +[Dungeon] + diff --git a/forge-gui/res/adventure/Shandalar/decks/starter/Adventure - Low Gruul.dck b/forge-gui/res/adventure/Shandalar/decks/starter/Adventure - Low Gruul.dck new file mode 100644 index 00000000000..23f40f63507 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/decks/starter/Adventure - Low Gruul.dck @@ -0,0 +1,34 @@ +[metadata] +Name=Adventure - Low Gruul +[Avatar] + +[Main] +2 Annoyed Altisaur|CMR|1 +1 Charging Tuskodon|RIX|1 +2 Commune with Dinosaurs|JMP|1 +1 Dinosaur Stampede|XLN|1 +7 Forest|GK2|1 +2 Grazing Whiptail|XLN|1 +2 Gruul Locket|RNA|1 +2 Knight of the Stampede|RIX|1 +1 Manamorphose|SHM|1 +1 Momentum Rumbler|IKO|1 +6 Mountain|GK2|2 +1 Pyretic Ritual|M11|1 +2 Pyroceratops|IKO|1 +1 Raging Regisaur|RIX|1 +1 Raging Swordtooth|XLN|1 +2 Ram Through|IKO|1 +1 Regisaur Alpha|XLN|1 +1 Savage Stomp|JMP|1 +4 Timber Gorge|DOM|1 +[Sideboard] + +[Planes] + +[Schemes] + +[Conspiracy] + +[Dungeon] + diff --git a/forge-gui/res/adventure/Shandalar/decks/starter/Adventure - Low Izzet.dck b/forge-gui/res/adventure/Shandalar/decks/starter/Adventure - Low Izzet.dck new file mode 100644 index 00000000000..b756ac54cbf --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/decks/starter/Adventure - Low Izzet.dck @@ -0,0 +1,33 @@ +[metadata] +Name=Adventure - Low Izzet +[Avatar] + +[Main] +2 Careful Study|ODY|1 +2 Electrickery|RTR|1 +2 Goblin Wizardry|M21|1 +4 Highland Lake|M19|1 +1 Incursion Specialist|GTC|1 +6 Island|GK1|2 +1 Izzet Charm|2XM|1 +2 Izzet Locket|C19|1 +1 Izzet Staticaster|RTR|1 +1 Jori En, Ruin Diver|OGW|1 +2 Lotus Path Djinn|FRF|1 +2 Mage-Ring Bully|ORI|1 +7 Mountain|GK1|1 +1 Pyromancer's Assault|OGW|1 +1 Quicksilver Dagger|A25|1 +2 Thorned Moloch|HOU|1 +2 Thunder Drake|WAR|1 +1 Wizard Class|AFR|1 +[Sideboard] + +[Planes] + +[Schemes] + +[Conspiracy] + +[Dungeon] + diff --git a/forge-gui/res/adventure/Shandalar/decks/starter/Adventure - Low Orzhov.dck b/forge-gui/res/adventure/Shandalar/decks/starter/Adventure - Low Orzhov.dck new file mode 100644 index 00000000000..ed4dcdf9b79 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/decks/starter/Adventure - Low Orzhov.dck @@ -0,0 +1,34 @@ +[metadata] +Name=Adventure - Low Orzhov +[Avatar] + +[Main] +2 Basilica Screecher|GTC|1 +1 Blood Artist|JMP|1 +1 Exile|VMA|1 +1 Faith Unbroken|CMR|1 +4 Forsaken Sanctuary|M19|1 +2 Herald of Hadar|AFR|1 +2 Hideous End|MB1|1 +2 Marauding Blight-Priest|ZNR|1 +1 Obzedat, Ghost Council|MM3|1 +1 Okiba Reckoner Raid|NEO|1 +2 Orzhov Locket|RNA|1 +4 Plains|GK2|2 +1 Restless Bloodseeker|VOW|2 +1 Retreat to Hagra|BFZ|1 +1 Sanguine Bond|IMA|1 +2 Sovereign's Bite|M19|1 +2 Suture Priest|NPH|1 +9 Swamp|GK2|1 +1 Vizkopa Guildmage|GTC|1 +[Sideboard] + +[Planes] + +[Schemes] + +[Conspiracy] + +[Dungeon] + diff --git a/forge-gui/res/adventure/Shandalar/decks/starter/Adventure - Low Rakdos.dck b/forge-gui/res/adventure/Shandalar/decks/starter/Adventure - Low Rakdos.dck new file mode 100644 index 00000000000..4ef1c845620 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/decks/starter/Adventure - Low Rakdos.dck @@ -0,0 +1,33 @@ +[metadata] +Name=Adventure - Low Rakdos +[Avatar] + +[Main] +4 Cinder Barrens|M19|1 +1 Falkenrath Exterminator|AVR|1 +1 Florian, Voldaren Scion|MID|1 +2 Gift of Fangs|VOW|1 +2 Hideous End|MB1|1 +1 Hungry for More|MID|1 +2 Mark of the Vampire|M13|1 +2 Midnight Assassin|SNC|1 +6 Mountain|GK2|1 +2 Nocturnal Feeder|JMP|1 +2 Rakdos Locket|RNA|1 +1 Rakish Heir|VOC|1 +1 Stromkirk Captain|DKA|1 +7 Swamp|GK2|2 +1 Vampire Nighthawk|C21|1 +1 Vampire Socialite|MID|1 +2 Vampire Spawn|AFR|1 +2 Vampire's Kiss|VOW|1 +[Sideboard] + +[Planes] + +[Schemes] + +[Conspiracy] + +[Dungeon] + diff --git a/forge-gui/res/adventure/Shandalar/decks/starter/Adventure - Low Red.dck b/forge-gui/res/adventure/Shandalar/decks/starter/Adventure - Low Red.dck new file mode 100644 index 00000000000..c620f36338a --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/decks/starter/Adventure - Low Red.dck @@ -0,0 +1,27 @@ +[metadata] +Name=Adventure - Low Red +[Avatar] + +[Main] +10 Dragon's Approach|STX|1 +1 Fire Servant|M11|1 +1 Guttersnipe|MB1|1 +2 Kiln Fiend|IMA|1 +17 Mountain|GK2|2 +2 Pyre Hound|A25|1 +1 Pyromancer Ascension|SS3|1 +1 Red Dragon|AFR|1 +1 Syr Carah, the Bold|ELD|1 +2 Thermo-Alchemist|EMN|1 +1 Voltaic Visionary|VOW|1 +1 Young Pyromancer|MB1|1 +[Sideboard] + +[Planes] + +[Schemes] + +[Conspiracy] + +[Dungeon] + diff --git a/forge-gui/res/adventure/Shandalar/decks/starter/Adventure - Low Selesnya.dck b/forge-gui/res/adventure/Shandalar/decks/starter/Adventure - Low Selesnya.dck new file mode 100644 index 00000000000..f4dc4bea4f2 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/decks/starter/Adventure - Low Selesnya.dck @@ -0,0 +1,33 @@ +[metadata] +Name=Adventure - Low Selesnya +[Avatar] + +[Main] +1 Abzan Beastmaster|FRF|1 +1 Archon of Valor's Reach|C20|1 +2 Armadillo Cloak|ARC|1 +1 Assault Formation|PLIST|1 +1 Belligerent Brontodon|MB1|1 +2 Cartouche of Strength|AKH|1 +7 Forest|GK1|2 +2 Looming Altisaur|XLN|1 +7 Plains|GK1|2 +1 Qasali Ambusher|ALA|1 +2 Savage Punch|KTK|1 +2 Selesnya Locket|GRN|1 +1 Selesnya Sagittars|RAV|1 +1 Shinen of Life's Roar|SOK|1 +2 Stampeding Elk Herd|DTK|1 +4 Tranquil Expanse|M19|1 +2 Treefolk Umbra|MH1|1 +1 Unflinching Courage|DGM|1 +[Sideboard] + +[Planes] + +[Schemes] + +[Conspiracy] + +[Dungeon] + diff --git a/forge-gui/res/adventure/Shandalar/decks/starter/Adventure - Low Simic.dck b/forge-gui/res/adventure/Shandalar/decks/starter/Adventure - Low Simic.dck new file mode 100644 index 00000000000..84614829267 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/decks/starter/Adventure - Low Simic.dck @@ -0,0 +1,33 @@ +[metadata] +Name=Adventure - Low Simic +[Avatar] + +[Main] +1 Briarbridge Patrol|SOI|1 +1 Byway Courier|SOI|1 +2 Confront the Unknown|SOI|1 +2 Drownyard Explorers|SOI|1 +1 Erdwal Illuminator|SOI|1 +2 Floodhound|MH2|1 +7 Forest|GK2|2 +2 Funnel-Web Recluse|MH2|1 +1 Graf Mole|SOI|1 +7 Island|GK2|2 +1 Lonis, Cryptozoologist|PLIST|1 +1 Magnifying Glass|C18|1 +1 Ongoing Investigation|SOI|1 +2 Secrets of the Key|MID|1 +2 Simic Locket|RNA|1 +1 Ulvenwald Mysteries|PLIST|1 +2 Wavesifter|MH2|1 +4 Woodland Stream|CMR|1 +[Sideboard] + +[Planes] + +[Schemes] + +[Conspiracy] + +[Dungeon] + diff --git a/forge-gui/res/adventure/Shandalar/decks/starter/Adventure - Low White.dck b/forge-gui/res/adventure/Shandalar/decks/starter/Adventure - Low White.dck new file mode 100644 index 00000000000..ee183f4b2ed --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/decks/starter/Adventure - Low White.dck @@ -0,0 +1,31 @@ +[metadata] +Name=Adventure - Low White +[Avatar] + +[Main] +1 Angel of Vitality|M20|1 +2 Answered Prayers|MH1|1 +1 Blessed Alliance|EMN|1 +1 Cleric Class|AFR|1 +2 Faith's Fetters|C15|1 +1 Glorious Enforcer|MH2|1 +1 Goldnight Redeemer|DDQ|1 +2 Inspiring Overseer|SNC|1 +2 Invoke the Divine|DOM|1 +1 Ixalan's Binding|XLN|1 +2 Martyr of Sands|UMA|1 +18 Plains|GK2|2 +1 Righteous Valkyrie|KHM|1 +2 Seraph of Dawn|CMR|1 +2 Suture Priest|NPH|1 +1 You're Ambushed on the Road|AFR|1 +[Sideboard] + +[Planes] + +[Schemes] + +[Conspiracy] + +[Dungeon] + diff --git a/forge-gui/res/adventure/Shandalar/decks/starter/black_e.json b/forge-gui/res/adventure/Shandalar/decks/starter/black_e.json new file mode 100644 index 00000000000..56de9d0d563 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/decks/starter/black_e.json @@ -0,0 +1,6 @@ +{ +"name":"Black", +"jumpstartPacks":["black","black","black"] + +} + diff --git a/forge-gui/res/adventure/Shandalar/ui/new_game.json b/forge-gui/res/adventure/Shandalar/ui/new_game.json index f9c05431def..aa9a1b6cd71 100644 --- a/forge-gui/res/adventure/Shandalar/ui/new_game.json +++ b/forge-gui/res/adventure/Shandalar/ui/new_game.json @@ -21,73 +21,74 @@ { "type": "Label", "name" : "titleL", - "text": "Create a Character", + "text": "{lblCreateACharacter}", "width": 128, - "height": 32, + "height": 16, + "scale": 2, "fontSize": 1.5, "fontColor": "0x000000FF", - "x": 104, + "x": 76, "y": 16 - }, - { - "type": "Label", - "name" : "avatarL", - "text": "Avatar:", - "width": 128, - "height": 32, - "font" : "black", - "x": 75, - "y": 58 - }, + } , { "type": "Label", "name" : "nameL", - "text": "Name:", + "text": "{lblName}:", "width": 128, - "height": 32, + "height": 16, "font" : "black", "x": 75, - "y": 90 + "y": 96 }, { "type": "Label", "name" : "raceL", - "text": "Race:", + "text": "{lblRace}:", "width": 128, - "height": 32, + "height": 16, "font" : "black", "x": 75, - "y": 124 + "yOffset": 8 }, { "type": "Label", "name" : "genderL", - "text": "Gender:", + "text": "{lblGender}:", "width": 128, - "height": 32, + "height": 16, "font" : "black", "x": 75, - "y": 154 + "yOffset": 8 }, { "type": "Label", "name" : "difficultyL", - "text": "Difficulty:", + "text": "{lblDifficulty}:", "width": 128, - "height": 32, + "height": 16, "font" : "black", "x": 75, - "y": 186 + "yOffset": 8 }, { "type": "Label", - "name" : "deckL", - "text": "Deck:", + "name" : "colorIdL", + "text": "{lblColors}:", "width": 128, - "height": 32, + "height": 16, "font" : "black", "x": 75, - "y": 218 + "yOffset": 8 + }, + { + "type": "Label", + "name" : "modeL", + "text": "{lblMode}", + "width": 128, + "height": 16, + "font" : "black", + "x": 75, + "yOffset": 8 }, { "type": "ImageButton", @@ -130,7 +131,7 @@ "width": 112, "height": 16, "x": 164, - "y": 128 + "yOffset": 8 }, { "type": "Selector", @@ -138,7 +139,7 @@ "width": 112, "height": 16, "x": 164, - "y": 160 + "yOffset": 8 }, { "type": "Selector", @@ -146,20 +147,28 @@ "width": 112, "height": 16, "x": 164, - "y": 192 + "yOffset": 8 }, { "type": "Selector", - "name": "deck", + "name": "colorId", "width": 112, "height": 16, "x": 164, - "y": 224 + "yOffset": 8 + }, + { + "type": "Selector", + "name": "mode", + "width": 112, + "height": 16, + "x": 164, + "yOffset": 8 }, { "type": "TextButton", "name": "back", - "text": "Back", + "text": "{lblBack}", "width": 100, "height": 30, "x": 348, @@ -168,7 +177,7 @@ { "type": "TextButton", "name": "start", - "text": "Start", + "text": "{lblStart}", "width": 100, "height": 30, "x": 348, diff --git a/forge-gui/res/adventure/Shandalar/ui/new_game_portrait.json b/forge-gui/res/adventure/Shandalar/ui/new_game_portrait.json index 58c54edcaf0..de87ca45ca3 100644 --- a/forge-gui/res/adventure/Shandalar/ui/new_game_portrait.json +++ b/forge-gui/res/adventure/Shandalar/ui/new_game_portrait.json @@ -13,38 +13,29 @@ "type": "Scroll", "name" : "scroll", "style": "paper", - "x": 10, + "x": 5, "y": 60, "width": 256, - "height": 318 + "height": 323 }, { "type": "Label", "name" : "titleL", - "text": "Create a Character", + "text": "{lblCreateACharacter}", "width": 128, "height": 32, + "scale": 2, "fontSize": 1.5, "fontColor": "0x000000FF", - "x": 16, + "x": 30, "y": 66 - }, - { - "type": "Label", - "name" : "avatarL", - "text": "Avatar:", - "width": 128, - "height": 32, - "fontColor": "0x000000FF", - "x": 16, - "y": 108 - }, + } , { "type": "Label", "name" : "nameL", - "text": "Name:", + "text": "{lblName}:", "width": 128, - "height": 32, + "height": 24, "fontColor": "0x000000FF", "x": 16, "y": 140 @@ -52,42 +43,52 @@ { "type": "Label", "name" : "raceL", - "text": "Race:", + "text": "{lblRace}:", "width": 128, - "height": 32, + "height": 24, "fontColor": "0x000000FF", "x": 16, - "y": 174 + "yOffset": 8 }, { "type": "Label", "name" : "genderL", - "text": "Gender:", + "text": "{lblGender}:", "width": 128, - "height": 32, + "height": 24, "fontColor": "0x000000FF", "x": 16, - "y": 204 + "yOffset": 8 }, { "type": "Label", "name" : "difficultyL", - "text": "Difficulty:", + "text": "{lblDifficulty}:", "width": 128, - "height": 32, + "height": 24, "fontColor": "0x000000FF", "x": 16, - "y": 236 + "yOffset": 8 }, { "type": "Label", - "name" : "deckL", - "text": "Deck:", + "name" : "colorIdL", + "text": "{lblColors}:", "width": 128, - "height": 32, + "height": 24, "font" : "black", "x": 16, - "y": 268 + "yOffset": 8 + }, + { + "type": "Label", + "name" : "modeL", + "text": "{lblMode}", + "width": 128, + "height": 24, + "font" : "black", + "x": 16, + "yOffset": 8 }, { "type": "ImageButton", @@ -118,60 +119,68 @@ { "type": "TextField", "name": "nameField", - "width": 165, - "height": 28, + "width": 160, + "height": 24, "x": 96, "y": 146 }, { "type": "Selector", "name": "race", - "width": 170, - "height": 28, + "width": 168, + "height": 24, "x": 96, - "y": 178 + "yOffset": 8 }, { "type": "Selector", "name": "gender", - "width": 170, - "height": 28, + "width": 168, + "height": 24, "x": 96, - "y": 210 + "yOffset": 8 }, { "type": "Selector", "name": "difficulty", - "width": 170, - "height": 28, + "width": 168, + "height": 24, "x": 96, - "y": 242 + "yOffset": 8 }, { "type": "Selector", - "name": "deck", - "width": 170, - "height": 28, + "name": "colorId", + "width": 168, + "height": 24, "x": 96, - "y": 274 + "yOffset": 8 + }, + { + "type": "Selector", + "name": "mode", + "width": 168, + "height": 24, + "x": 96, + "yOffset": 8 }, { "type": "TextButton", "name": "back", - "text": "Back", + "text": "{lblBack}", "width": 64, "height": 28, "x": 32, - "y": 320 + "y": 344 }, { "type": "TextButton", "name": "start", - "text": "Start", + "text": "{lblStart}", "width": 64, - "height": 32, + "height": 28, "x": 165, - "y": 320 + "y": 344 } ] } \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/world/waste.json b/forge-gui/res/adventure/Shandalar/world/waste.json index c52a5808958..093a1823e78 100644 --- a/forge-gui/res/adventure/Shandalar/world/waste.json +++ b/forge-gui/res/adventure/Shandalar/world/waste.json @@ -122,7 +122,6 @@ "maskPath": "world/tilesets/ring.png", "height": 0.5, "width": 0.5, - "symmetry": 8, "periodicOutput": false, "mappingInfo": [ {