Merge pull request #1231 from kevlahnota/master

Starter deck for AdventurePlayer
This commit is contained in:
Anthony Calosa
2022-07-29 04:55:38 +08:00
committed by GitHub
7 changed files with 145 additions and 69 deletions

View File

@@ -122,7 +122,7 @@ public class AdventurePlayer implements Serializable, SaveFileContent {
avatarIndex = avatar; avatarIndex = avatar;
isFemale = !male; 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. setColorIdentity(MyRandom.getRandom().nextInt(5)); // MyRandom to not interfere with the unstable RNG.
} else setColorIdentity(startingColorIdentity + 1); // +1 because index 0 is colorless. } else setColorIdentity(startingColorIdentity + 1); // +1 because index 0 is colorless.

View File

@@ -4,8 +4,6 @@ import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.Input; import com.badlogic.gdx.Input;
import com.badlogic.gdx.graphics.Color; import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.scenes.scene2d.Actor; 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.CheckBox;
import com.badlogic.gdx.scenes.scene2d.ui.Image; import com.badlogic.gdx.scenes.scene2d.ui.Image;
import com.badlogic.gdx.scenes.scene2d.ui.ImageButton; 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.util.Selector;
import forge.adventure.world.WorldSave; import forge.adventure.world.WorldSave;
import forge.deck.Deck; import forge.deck.Deck;
import forge.deck.DeckProxy;
import forge.localinstance.properties.ForgePreferences; import forge.localinstance.properties.ForgePreferences;
import forge.model.FModel; import forge.model.FModel;
import forge.player.GamePlayerUtil; import forge.player.GamePlayerUtil;
@@ -49,7 +48,8 @@ public class NewGameScene extends UIScene {
private ImageButton leftArrow, rightArrow; private ImageButton leftArrow, rightArrow;
private TextButton backButton, startButton; private TextButton backButton, startButton;
boolean fantasyMode = false; boolean fantasyMode = false;
private CheckBox box; boolean easyMode = false;
private CheckBox box, box2;
public NewGameScene() { public NewGameScene() {
super(Forge.isLandscapeMode() ? "ui/new_game.json" : "ui/new_game_portrait.json"); 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()) { if (selectedName.getText().isEmpty()) {
selectedName.setText(NameGenerator.getRandomName("Any", "Any", "")); selectedName.setText(NameGenerator.getRandomName("Any", "Any", ""));
} }
Runnable runnable = new Runnable() { Runnable runnable = () -> {
@Override FModel.getPreferences().setPref(ForgePreferences.FPref.UI_ENABLE_MUSIC, false);
public void run() { WorldSave.generateNewWorld(selectedName.getText(),
FModel.getPreferences().setPref(ForgePreferences.FPref.UI_ENABLE_MUSIC, false); gender.getCurrentIndex() == 0,
WorldSave.generateNewWorld(selectedName.getText(), race.getCurrentIndex(),
gender.getCurrentIndex() == 0, avatarIndex,
race.getCurrentIndex(), deck.getCurrentIndex(),
avatarIndex, Config.instance().getConfigData().difficulties[difficulty.getCurrentIndex()],
deck.getCurrentIndex(), fantasyMode, easyMode, deck.getText(), 0);
Config.instance().getConfigData().difficulties[difficulty.getCurrentIndex()], GamePlayerUtil.getGuiPlayer().setName(selectedName.getText());
fantasyMode,0); Forge.clearTransitionScreen();
GamePlayerUtil.getGuiPlayer().setName(selectedName.getText()); Forge.switchScene(SceneType.GameScene.instance);
Forge.clearTransitionScreen();
Forge.switchScene(SceneType.GameScene.instance);
}
}; };
Forge.setTransitionScreen(new TransitionScreen(runnable, null, false, true)); Forge.setTransitionScreen(new TransitionScreen(runnable, null, false, true));
return true; return true;
@@ -92,32 +89,21 @@ public class NewGameScene extends UIScene {
avatarImage = ui.findActor("avatarPreview"); avatarImage = ui.findActor("avatarPreview");
gender = ui.findActor("gender"); gender = ui.findActor("gender");
gender.setTextList(new String[]{"Male", "Female"}); gender.setTextList(new String[]{"Male", "Female"});
gender.addListener(new EventListener() { gender.addListener(event -> NewGameScene.this.updateAvatar());
@Override
public boolean handle(Event event) {
return NewGameScene.this.updateAvatar();
}
});
Random rand = new Random(); Random rand = new Random();
deck = ui.findActor("deck"); deck = ui.findActor("deck");
starterDeck = Config.instance().starterDecks(); starterDeck = Config.instance().starterDecks();
Array<String> stringList = new Array<>(starterDeck.length); Array<String> stringList = new Array<>(starterDeck.length);
for (Deck deck : starterDeck) for (Deck deck : starterDeck)
stringList.add(deck.getName()); stringList.add(deck.getName());
Array<String> chaos = new Array<>(); Array<String> chaos = new Array<>();
chaos.add("Preconstructed"); chaos.add("Preconstructed");
Array<String> easyDecks = new Array<>();
for (DeckProxy deckProxy : DeckProxy.getAllEasyStarterDecks())
easyDecks.add(deckProxy.getName());
deck.setTextList(stringList); deck.setTextList(stringList);
race = ui.findActor("race"); race = ui.findActor("race");
race.addListener(new EventListener() { race.addListener(event -> NewGameScene.this.updateAvatar());
@Override
public boolean handle(Event event) {
return NewGameScene.this.updateAvatar();
}
});
race.setTextList(HeroListData.getRaces()); race.setTextList(HeroListData.getRaces());
difficulty = ui.findActor("difficulty"); difficulty = ui.findActor("difficulty");
@@ -136,30 +122,10 @@ public class NewGameScene extends UIScene {
gender.setCurrentIndex(rand.nextInt()); gender.setCurrentIndex(rand.nextInt());
deck.setCurrentIndex(rand.nextInt()); deck.setCurrentIndex(rand.nextInt());
race.setCurrentIndex(rand.nextInt()); race.setCurrentIndex(rand.nextInt());
ui.onButtonPress("back", new Runnable() { ui.onButtonPress("back", () -> NewGameScene.this.back());
@Override ui.onButtonPress("start", () -> NewGameScene.this.start());
public void run() { ui.onButtonPress("leftAvatar", () -> NewGameScene.this.leftAvatar());
NewGameScene.this.back(); ui.onButtonPress("rightAvatar", () -> NewGameScene.this.rightAvatar());
}
});
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();
}
});
scrollPane = ui.findActor("scroll"); scrollPane = ui.findActor("scroll");
titleL = ui.findActor("titleL"); titleL = ui.findActor("titleL");
@@ -178,20 +144,56 @@ public class NewGameScene extends UIScene {
difficultyL.setText(Forge.getLocalizer().getMessage("lblDifficulty")); difficultyL.setText(Forge.getLocalizer().getMessage("lblDifficulty"));
deckL = ui.findActor("deckL"); deckL = ui.findActor("deckL");
deckL.setText(Forge.getLocalizer().getMessage("lblDeck")); 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 = Controls.newCheckBox("");
box.addListener(new ChangeListener() { box.addListener(new ChangeListener() {
@Override @Override
public void changed(ChangeEvent event, Actor actor) { public void changed(ChangeEvent event, Actor actor) {
fantasyMode = ((CheckBox) actor).isChecked(); if (((CheckBox) actor).isChecked()) {
deck.setTextList(fantasyMode ? chaos : stringList); 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()); //easy mode
Label label = Controls.newLabel("Chaos 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.setColor(Color.BLACK);
label.setBounds(box.getX()+22, box.getY(), box.getWidth(), box.getHeight()); label.setBounds(box.getX()+22, box.getY(), box.getWidth(), box.getHeight());
ui.addActor(box); ui.addActor(box);
ui.addActor(label); ui.addActor(label);
if (easyDecks.isEmpty()) {
box2.setDisabled(true);
box2.getColor().a = 0.5f;
label2.getColor().a = 0.5f;
}
leftArrow = ui.findActor("leftAvatar"); leftArrow = ui.findActor("leftAvatar");
rightArrow = ui.findActor("rightAvatar"); rightArrow = ui.findActor("rightAvatar");
backButton = ui.findActor("back"); backButton = ui.findActor("back");

View File

@@ -8,6 +8,7 @@ import forge.adventure.util.Config;
import forge.adventure.util.SaveFileData; import forge.adventure.util.SaveFileData;
import forge.adventure.util.SignalList; import forge.adventure.util.SignalList;
import forge.deck.Deck; import forge.deck.Deck;
import forge.deck.DeckProxy;
import forge.deck.DeckgenUtil; import forge.deck.DeckgenUtil;
import forge.localinstance.properties.ForgeConstants; import forge.localinstance.properties.ForgeConstants;
import forge.player.GamePlayerUtil; import forge.player.GamePlayerUtil;
@@ -119,13 +120,24 @@ public class WorldSave {
return currentSave; 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.world.generateNew(seed);
currentSave.pointOfInterestChanges.clear(); 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.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.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())); 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(); currentSave.onLoadList.emit();
return currentSave; return currentSave;
//return currentSave = ret; //return currentSave = ret;

View File

@@ -244,10 +244,10 @@ public class Assets implements Disposable {
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
@Override @Override
public synchronized <T> void load(String fileName, Class<T> type, AssetLoaderParameters<T> parameter) { public synchronized <T> void load(String fileName, Class<T> type) {
if (type.equals(Texture.class)) { if (type.equals(Texture.class)) {
if (parameter == null) { if (parameter == null) {
parameter = (AssetLoaderParameters<T>) new TextureParameter(); parameter = getTextureFilter();
} }
final AssetLoaderParameters.LoadedCallback prevCallback = parameter.loadedCallback; 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 @Override

View File

@@ -235,7 +235,52 @@ public class DeckProxy implements InventoryItem {
} }
return deckIdentity; return deckIdentity;
} }
public int setStarterDeckColorIdentity() {
int adventureColorIdentity = 0;
int w = 0, u = 0, b = 0, g = 0, r = 0, highest = -1;
for (final Entry<DeckSection, CardPool> deckEntry : getDeck()) {
switch (deckEntry.getKey()) {
case Main:
case Sideboard:
case Commander:
for (final Entry<PaperCard, Integer> 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() { public Deck.UnplayableAICards getAI() {
return getDeck().getUnplayableAICards(); return getDeck().getUnplayableAICards();
} }
@@ -619,6 +664,13 @@ public class DeckProxy implements InventoryItem {
return decks; return decks;
} }
public static List<DeckProxy> getAllEasyStarterDecks() {
final List<DeckProxy> decks = new ArrayList<>();
final IStorage<Deck> easy = FModel.getDecks().getEasyStarterDecks();
addDecksRecursivelly("Constructed", GameType.Constructed, decks, "", easy, null);
return decks;
}
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public static List<DeckProxy> getAllSealedDecks() { public static List<DeckProxy> getAllSealedDecks() {
final List<DeckProxy> humanDecks = new ArrayList<>(); final List<DeckProxy> humanDecks = new ArrayList<>();

View File

@@ -89,6 +89,7 @@ public final class ForgeConstants {
public static final String TUTORIAL_DIR = RES_DIR + "tutorial" + PATH_SEPARATOR; 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 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 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; private static final String QUEST_DIR = RES_DIR + "quest" + PATH_SEPARATOR;

View File

@@ -46,6 +46,7 @@ public class CardCollections {
private IStorage<Deck> tinyLeaders; private IStorage<Deck> tinyLeaders;
private IStorage<Deck> brawl; private IStorage<Deck> brawl;
private IStorage<Deck> genetic; private IStorage<Deck> genetic;
private IStorage<Deck> easy;
public CardCollections() { public CardCollections() {
} }
@@ -154,4 +155,12 @@ public class CardCollections {
} }
return genetic; return genetic;
} }
public final IStorage<Deck> getEasyStarterDecks() {
if (easy == null) {
easy = new StorageImmediatelySerialized<>("Easy Starter decks",
new DeckStorage(new File(ForgeConstants.EASY_STARTER_DECK_DIR), ForgeConstants.RES_DIR));
}
return easy;
}
} }