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;
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.

View File

@@ -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<String> stringList = new Array<>(starterDeck.length);
for (Deck deck : starterDeck)
stringList.add(deck.getName());
Array<String> chaos = new Array<>();
chaos.add("Preconstructed");
Array<String> 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");

View File

@@ -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;

View File

@@ -244,10 +244,10 @@ public class Assets implements Disposable {
@SuppressWarnings("unchecked")
@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 (parameter == null) {
parameter = (AssetLoaderParameters<T>) 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

View File

@@ -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<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() {
return getDeck().getUnplayableAICards();
}
@@ -619,6 +664,13 @@ public class DeckProxy implements InventoryItem {
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")
public static List<DeckProxy> getAllSealedDecks() {
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 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;

View File

@@ -46,6 +46,7 @@ public class CardCollections {
private IStorage<Deck> tinyLeaders;
private IStorage<Deck> brawl;
private IStorage<Deck> genetic;
private IStorage<Deck> easy;
public CardCollections() {
}
@@ -154,4 +155,12 @@ public class CardCollections {
}
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;
}
}