mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-17 19:28:01 +00:00
Merge pull request #1231 from kevlahnota/master
Starter deck for AdventurePlayer
This commit is contained in:
@@ -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.
|
||||
|
||||
|
||||
@@ -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");
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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<>();
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user