From 2be8d833046f0ddb1fbfccf4084e0a395c4eb181 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Fri, 29 Jul 2022 04:42:55 +0800 Subject: [PATCH] Starter deck for AdventurePlayer --- .../adventure/player/AdventurePlayer.java | 2 +- .../forge/adventure/scene/NewGameScene.java | 126 +++++++++--------- .../src/forge/adventure/world/WorldSave.java | 16 ++- forge-gui-mobile/src/forge/assets/Assets.java | 6 +- .../src/main/java/forge/deck/DeckProxy.java | 54 +++++++- .../properties/ForgeConstants.java | 1 + .../java/forge/model/CardCollections.java | 9 ++ 7 files changed, 145 insertions(+), 69 deletions(-) diff --git a/forge-gui-mobile/src/forge/adventure/player/AdventurePlayer.java b/forge-gui-mobile/src/forge/adventure/player/AdventurePlayer.java index b3658b2dcf2..15c1b02b10c 100644 --- a/forge-gui-mobile/src/forge/adventure/player/AdventurePlayer.java +++ b/forge-gui-mobile/src/forge/adventure/player/AdventurePlayer.java @@ -122,7 +122,7 @@ public class AdventurePlayer implements Serializable, SaveFileContent { avatarIndex = avatar; isFemale = !male; - if(fantasyMode){ //Set a random ColorID in fantasy mode. + 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. diff --git a/forge-gui-mobile/src/forge/adventure/scene/NewGameScene.java b/forge-gui-mobile/src/forge/adventure/scene/NewGameScene.java index 6f836cbe6ea..74e37b2d57a 100644 --- a/forge-gui-mobile/src/forge/adventure/scene/NewGameScene.java +++ b/forge-gui-mobile/src/forge/adventure/scene/NewGameScene.java @@ -4,8 +4,6 @@ import com.badlogic.gdx.Gdx; import com.badlogic.gdx.Input; import com.badlogic.gdx.graphics.Color; import com.badlogic.gdx.scenes.scene2d.Actor; -import com.badlogic.gdx.scenes.scene2d.Event; -import com.badlogic.gdx.scenes.scene2d.EventListener; import com.badlogic.gdx.scenes.scene2d.ui.CheckBox; import com.badlogic.gdx.scenes.scene2d.ui.Image; import com.badlogic.gdx.scenes.scene2d.ui.ImageButton; @@ -24,6 +22,7 @@ import forge.adventure.util.Controls; import forge.adventure.util.Selector; import forge.adventure.world.WorldSave; import forge.deck.Deck; +import forge.deck.DeckProxy; import forge.localinstance.properties.ForgePreferences; import forge.model.FModel; import forge.player.GamePlayerUtil; @@ -49,7 +48,8 @@ public class NewGameScene extends UIScene { private ImageButton leftArrow, rightArrow; private TextButton backButton, startButton; boolean fantasyMode = false; - private CheckBox box; + boolean easyMode = false; + private CheckBox box, box2; public NewGameScene() { super(Forge.isLandscapeMode() ? "ui/new_game.json" : "ui/new_game_portrait.json"); @@ -59,21 +59,18 @@ public class NewGameScene extends UIScene { if (selectedName.getText().isEmpty()) { selectedName.setText(NameGenerator.getRandomName("Any", "Any", "")); } - Runnable runnable = new Runnable() { - @Override - public void run() { - FModel.getPreferences().setPref(ForgePreferences.FPref.UI_ENABLE_MUSIC, false); - WorldSave.generateNewWorld(selectedName.getText(), - gender.getCurrentIndex() == 0, - race.getCurrentIndex(), - avatarIndex, - deck.getCurrentIndex(), - Config.instance().getConfigData().difficulties[difficulty.getCurrentIndex()], - fantasyMode,0); - GamePlayerUtil.getGuiPlayer().setName(selectedName.getText()); - Forge.clearTransitionScreen(); - Forge.switchScene(SceneType.GameScene.instance); - } + Runnable runnable = () -> { + FModel.getPreferences().setPref(ForgePreferences.FPref.UI_ENABLE_MUSIC, false); + WorldSave.generateNewWorld(selectedName.getText(), + gender.getCurrentIndex() == 0, + race.getCurrentIndex(), + avatarIndex, + deck.getCurrentIndex(), + Config.instance().getConfigData().difficulties[difficulty.getCurrentIndex()], + fantasyMode, easyMode, deck.getText(), 0); + GamePlayerUtil.getGuiPlayer().setName(selectedName.getText()); + Forge.clearTransitionScreen(); + Forge.switchScene(SceneType.GameScene.instance); }; Forge.setTransitionScreen(new TransitionScreen(runnable, null, false, true)); return true; @@ -92,32 +89,21 @@ public class NewGameScene extends UIScene { avatarImage = ui.findActor("avatarPreview"); gender = ui.findActor("gender"); gender.setTextList(new String[]{"Male", "Female"}); - gender.addListener(new EventListener() { - @Override - public boolean handle(Event event) { - return NewGameScene.this.updateAvatar(); - } - }); + gender.addListener(event -> NewGameScene.this.updateAvatar()); Random rand = new Random(); - deck = ui.findActor("deck"); - starterDeck = Config.instance().starterDecks(); Array stringList = new Array<>(starterDeck.length); for (Deck deck : starterDeck) stringList.add(deck.getName()); Array chaos = new Array<>(); chaos.add("Preconstructed"); - + Array easyDecks = new Array<>(); + for (DeckProxy deckProxy : DeckProxy.getAllEasyStarterDecks()) + easyDecks.add(deckProxy.getName()); deck.setTextList(stringList); - race = ui.findActor("race"); - race.addListener(new EventListener() { - @Override - public boolean handle(Event event) { - return NewGameScene.this.updateAvatar(); - } - }); + race.addListener(event -> NewGameScene.this.updateAvatar()); race.setTextList(HeroListData.getRaces()); difficulty = ui.findActor("difficulty"); @@ -136,30 +122,10 @@ public class NewGameScene extends UIScene { gender.setCurrentIndex(rand.nextInt()); deck.setCurrentIndex(rand.nextInt()); race.setCurrentIndex(rand.nextInt()); - ui.onButtonPress("back", new Runnable() { - @Override - public void run() { - NewGameScene.this.back(); - } - }); - ui.onButtonPress("start", new Runnable() { - @Override - public void run() { - NewGameScene.this.start(); - } - }); - ui.onButtonPress("leftAvatar", new Runnable() { - @Override - public void run() { - NewGameScene.this.leftAvatar(); - } - }); - ui.onButtonPress("rightAvatar", new Runnable() { - @Override - public void run() { - NewGameScene.this.rightAvatar(); - } - }); + 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"); @@ -178,20 +144,56 @@ public class NewGameScene extends UIScene { 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) { - fantasyMode = ((CheckBox) actor).isChecked(); - deck.setTextList(fantasyMode ? chaos : stringList); + if (((CheckBox) actor).isChecked()) { + box2.setChecked(false); + fantasyMode = true; + easyMode = false; + deck.setTextList(chaos); + } else { + fantasyMode = false; + deck.setTextList(stringList); + } } }); - box.setBounds(deckL.getX()-box.getHeight(), deckL.getY()-box.getHeight(), deckL.getHeight(), deckL.getHeight()); - Label label = Controls.newLabel("Chaos Mode"); + //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"); diff --git a/forge-gui-mobile/src/forge/adventure/world/WorldSave.java b/forge-gui-mobile/src/forge/adventure/world/WorldSave.java index 228f878d15f..b14553cf56b 100644 --- a/forge-gui-mobile/src/forge/adventure/world/WorldSave.java +++ b/forge-gui-mobile/src/forge/adventure/world/WorldSave.java @@ -8,6 +8,7 @@ import forge.adventure.util.Config; import forge.adventure.util.SaveFileData; import forge.adventure.util.SignalList; import forge.deck.Deck; +import forge.deck.DeckProxy; import forge.deck.DeckgenUtil; import forge.localinstance.properties.ForgeConstants; import forge.player.GamePlayerUtil; @@ -119,13 +120,24 @@ public class WorldSave { return currentSave; } - public static WorldSave generateNewWorld(String name, boolean male, int race, int avatarIndex, int startingColorIdentity, DifficultyData diff, boolean isFantasy, long seed) { + public static WorldSave generateNewWorld(String name, boolean male, int race, int avatarIndex, int startingColorIdentity, DifficultyData diff, boolean isFantasy, boolean isEasy, String starter, long seed) { currentSave.world.generateNew(seed); currentSave.pointOfInterestChanges.clear(); - Deck starterDeck = isFantasy ? DeckgenUtil.getRandomOrPreconOrThemeDeck("", false, false, false) : Config.instance().starterDecks()[startingColorIdentity]; + Deck starterDeck; + int identity = startingColorIdentity; + if (isEasy) { + DeckProxy dp = DeckProxy.getAllEasyStarterDecks().get(startingColorIdentity); + starterDeck = dp.getDeck(); + identity = dp.setStarterDeckColorIdentity(); + } else { + starterDeck = isFantasy ? DeckgenUtil.getRandomOrPreconOrThemeDeck("", false, false, false) : Config.instance().starterDecks()[startingColorIdentity]; + } 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); currentSave.onLoadList.emit(); return currentSave; //return currentSave = ret; diff --git a/forge-gui-mobile/src/forge/assets/Assets.java b/forge-gui-mobile/src/forge/assets/Assets.java index 2e141b0d932..b4dd5364dae 100644 --- a/forge-gui-mobile/src/forge/assets/Assets.java +++ b/forge-gui-mobile/src/forge/assets/Assets.java @@ -244,10 +244,10 @@ public class Assets implements Disposable { @SuppressWarnings("unchecked") @Override - public synchronized void load(String fileName, Class type, AssetLoaderParameters parameter) { + public synchronized void load(String fileName, Class type) { if (type.equals(Texture.class)) { if (parameter == null) { - parameter = (AssetLoaderParameters) new TextureParameter(); + parameter = getTextureFilter(); } final AssetLoaderParameters.LoadedCallback prevCallback = parameter.loadedCallback; @@ -261,7 +261,7 @@ public class Assets implements Disposable { } - super.load(fileName, type, parameter); + super.load(fileName, type); } @Override diff --git a/forge-gui/src/main/java/forge/deck/DeckProxy.java b/forge-gui/src/main/java/forge/deck/DeckProxy.java index cdfa7172171..17fb2d400da 100644 --- a/forge-gui/src/main/java/forge/deck/DeckProxy.java +++ b/forge-gui/src/main/java/forge/deck/DeckProxy.java @@ -235,7 +235,52 @@ public class DeckProxy implements InventoryItem { } return deckIdentity; } - + public int setStarterDeckColorIdentity() { + int adventureColorIdentity = 0; + int w = 0, u = 0, b = 0, g = 0, r = 0, highest = -1; + for (final Entry deckEntry : getDeck()) { + switch (deckEntry.getKey()) { + case Main: + case Sideboard: + case Commander: + for (final Entry poolEntry : deckEntry.getValue()) { + if (poolEntry.getKey().getRules().getType().isLand()) + continue; + w += poolEntry.getKey().getRules().getManaCost().getShardCount(ManaCostShard.WHITE); + u += poolEntry.getKey().getRules().getManaCost().getShardCount(ManaCostShard.BLUE); + b += poolEntry.getKey().getRules().getManaCost().getShardCount(ManaCostShard.BLACK); + g += poolEntry.getKey().getRules().getManaCost().getShardCount(ManaCostShard.GREEN); + r += poolEntry.getKey().getRules().getManaCost().getShardCount(ManaCostShard.RED); + } + break; + default: + break; //ignore other sections + } + } + if (w > highest) { + highest = w; + adventureColorIdentity = 1; + } + if (u > highest) { + highest = u; + adventureColorIdentity = 3; + } + if (b > highest) { + highest = b; + adventureColorIdentity = 2; + } + if (g > highest) { + highest = g; + adventureColorIdentity = 5; + } + if (r > highest) { + highest = r; + adventureColorIdentity = 4; + } + if (highest == 0) + adventureColorIdentity = 0; + return adventureColorIdentity; + } public Deck.UnplayableAICards getAI() { return getDeck().getUnplayableAICards(); } @@ -619,6 +664,13 @@ public class DeckProxy implements InventoryItem { return decks; } + public static List getAllEasyStarterDecks() { + final List decks = new ArrayList<>(); + final IStorage easy = FModel.getDecks().getEasyStarterDecks(); + addDecksRecursivelly("Constructed", GameType.Constructed, decks, "", easy, null); + return decks; + } + @SuppressWarnings("unchecked") public static List getAllSealedDecks() { final List humanDecks = new ArrayList<>(); 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 c7954a1f9a0..e550aba36db 100644 --- a/forge-gui/src/main/java/forge/localinstance/properties/ForgeConstants.java +++ b/forge-gui/src/main/java/forge/localinstance/properties/ForgeConstants.java @@ -89,6 +89,7 @@ public final class ForgeConstants { public static final String TUTORIAL_DIR = RES_DIR + "tutorial" + PATH_SEPARATOR; public static final String DECK_GEN_DIR = RES_DIR + "deckgendecks" + PATH_SEPARATOR; public static final String GENETIC_AI_DECK_DIR = RES_DIR + "geneticaidecks" + PATH_SEPARATOR; + public static final String EASY_STARTER_DECK_DIR = RES_DIR + "easystarterdecks" + PATH_SEPARATOR; private static final String QUEST_DIR = RES_DIR + "quest" + PATH_SEPARATOR; diff --git a/forge-gui/src/main/java/forge/model/CardCollections.java b/forge-gui/src/main/java/forge/model/CardCollections.java index d254a51d87b..fe5a1868528 100644 --- a/forge-gui/src/main/java/forge/model/CardCollections.java +++ b/forge-gui/src/main/java/forge/model/CardCollections.java @@ -46,6 +46,7 @@ public class CardCollections { private IStorage tinyLeaders; private IStorage brawl; private IStorage genetic; + private IStorage easy; public CardCollections() { } @@ -154,4 +155,12 @@ public class CardCollections { } return genetic; } + + public final IStorage getEasyStarterDecks() { + if (easy == null) { + easy = new StorageImmediatelySerialized<>("Easy Starter decks", + new DeckStorage(new File(ForgeConstants.EASY_STARTER_DECK_DIR), ForgeConstants.RES_DIR)); + } + return easy; + } }