Implement a console visual
This commit is contained in:
1
.gitignore
vendored
1
.gitignore
vendored
@@ -7,4 +7,5 @@ build/
|
||||
|
||||
# Logs
|
||||
*.log
|
||||
*.log.*
|
||||
*.log.lck
|
||||
|
||||
@@ -9,9 +9,11 @@ import de.siphalor.was.content.product.ProductManager;
|
||||
import de.siphalor.was.content.quest.Quest;
|
||||
import de.siphalor.was.content.quest.QuestGenerator;
|
||||
import de.siphalor.was.content.quest.QuestManager;
|
||||
import de.siphalor.was.content.quest.RandomQuestGenerator;
|
||||
import de.siphalor.was.game.*;
|
||||
import de.siphalor.was.util.Pair;
|
||||
import de.siphalor.was.util.Util;
|
||||
import de.siphalor.was.visual.ConsoleVisual;
|
||||
import de.siphalor.was.visual.JFXVisual;
|
||||
import de.siphalor.was.visual.Visual;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
@@ -58,7 +60,7 @@ public class WhatAStorage {
|
||||
questManager = new QuestManager();
|
||||
options = new Options();
|
||||
|
||||
visual = new JFXVisual();
|
||||
visual = new ConsoleVisual();
|
||||
}
|
||||
|
||||
public ContentManager getContentManager() {
|
||||
@@ -109,13 +111,13 @@ public class WhatAStorage {
|
||||
}
|
||||
|
||||
public void startGame() {
|
||||
questGenerator = questManager.get("example.test");
|
||||
//questGenerator = new RandomQuestGenerator();
|
||||
//questGenerator = questManager.get("example.test");
|
||||
questGenerator = new RandomQuestGenerator();
|
||||
quests.clear();
|
||||
storage = new Storage(GRID_SIZE, GRID_SIZE, GRID_SIZE);
|
||||
balance = new Balance();
|
||||
|
||||
visual.onGameStart();
|
||||
visual.onGameStart(GRID_SIZE, GRID_SIZE, GRID_SIZE);
|
||||
|
||||
if (options.getAutoRefillQuests()) {
|
||||
for (int i = 0; i < MAX_QUESTS; i++) {
|
||||
|
||||
@@ -26,11 +26,15 @@ public class I18n extends ResourceBundle {
|
||||
return DEFAULT_LANG;
|
||||
}
|
||||
|
||||
public void setLang(@NotNull String code, @NotNull ContentManager contentManager) {
|
||||
public boolean setLang(@NotNull String code, @NotNull ContentManager contentManager) {
|
||||
if (lang == null || !lang.getCode().equals(code)) {
|
||||
lang = new Lang(code);
|
||||
lang.load(contentManager);
|
||||
Lang l = new Lang(code);
|
||||
if (l.load(contentManager)) {
|
||||
lang = l;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public void reload(@NotNull ContentManager contentManager) {
|
||||
|
||||
@@ -24,7 +24,7 @@ public class Lang {
|
||||
return code;
|
||||
}
|
||||
|
||||
public void load(@NotNull ContentManager contentManager) {
|
||||
public boolean load(@NotNull ContentManager contentManager) {
|
||||
properties.clear();
|
||||
contentManager.getAllOfResource("lang/" + code + ".properties").forEachOrdered(resource -> {
|
||||
InputStream inputStream = resource.getInputStream();
|
||||
@@ -45,7 +45,9 @@ public class Lang {
|
||||
|
||||
if (properties.isEmpty()) {
|
||||
Util.LOGGER.log(Level.SEVERE, "Failed to load lang file for " + code);
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
|
||||
233
src/main/java/de/siphalor/was/visual/ConsoleVisual.java
Normal file
233
src/main/java/de/siphalor/was/visual/ConsoleVisual.java
Normal file
@@ -0,0 +1,233 @@
|
||||
package de.siphalor.was.visual;
|
||||
|
||||
import de.siphalor.was.WhatAStorage;
|
||||
import de.siphalor.was.content.lang.I18n;
|
||||
import de.siphalor.was.content.product.Product;
|
||||
import de.siphalor.was.content.quest.Quest;
|
||||
import de.siphalor.was.game.Balance;
|
||||
import de.siphalor.was.game.Transaction;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.Scanner;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
public class ConsoleVisual implements Visual {
|
||||
private final int CELL_WIDTH = 16;
|
||||
|
||||
private WhatAStorage was;
|
||||
private Scanner scanner;
|
||||
|
||||
private State state;
|
||||
|
||||
private String[][][] storage;
|
||||
private int budget;
|
||||
|
||||
private enum State {
|
||||
MENU, GAME,
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setup(WhatAStorage whatAStorage) {
|
||||
state = State.MENU;
|
||||
was = whatAStorage;
|
||||
scanner = new Scanner(System.in);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
loop:
|
||||
while (true) {
|
||||
String input = scanner.nextLine();
|
||||
String[] parts = input.split(" ");
|
||||
if (parts.length == 0) continue;
|
||||
switch (state) {
|
||||
case MENU:
|
||||
switch (parts[0]) {
|
||||
case "help": {
|
||||
I18n i18n = I18n.getInstance();
|
||||
System.out.println("start: " + i18n.getString("menu.start-game"));
|
||||
System.out.println("exit: " + i18n.getString("game.quit"));
|
||||
break;
|
||||
}
|
||||
case "start":
|
||||
was.startGame();
|
||||
break;
|
||||
case "exit":
|
||||
was.scheduleStop();
|
||||
break loop;
|
||||
default:
|
||||
printInvalidInput();
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case GAME:
|
||||
switch (parts[0]) {
|
||||
case "help": {
|
||||
I18n i18n = I18n.getInstance();
|
||||
System.out.println("status: " + i18n.getString("game.storage"));
|
||||
System.out.println("budget: " + i18n.getString("game.budget"));
|
||||
System.out.println("options: " + i18n.getString("menu.options"));
|
||||
System.out.println("exit: " + i18n.getString("game.quit"));
|
||||
break;
|
||||
}
|
||||
case "status": {
|
||||
showGame();
|
||||
System.out.println();
|
||||
Balance balance = WhatAStorage.getInstance().getBalance();
|
||||
showBudget(balance.getBudget(), balance.getTotalIncome(), balance.getTotalLoss());
|
||||
break;
|
||||
}
|
||||
case "budget": {
|
||||
Balance balance = WhatAStorage.getInstance().getBalance();
|
||||
showBudget(balance.getBudget(), balance.getTotalIncome(), balance.getTotalLoss());
|
||||
break;
|
||||
}
|
||||
case "exit":
|
||||
was.scheduleStop();
|
||||
break loop;
|
||||
case "options":
|
||||
if (parts.length == 1) {
|
||||
System.out.println(I18n.getInstance().getString("menu.options.available"));
|
||||
System.out.println("lang");
|
||||
} else {
|
||||
switch (parts[1]) {
|
||||
case "lang":
|
||||
if (parts.length == 2) {
|
||||
System.out.println(Arrays.stream(WhatAStorage.getInstance().getLangs()).map(s ->
|
||||
s + ": " + I18n.getInstance().getString("langs." + s)
|
||||
).collect(Collectors.joining(", ")));
|
||||
} else {
|
||||
if (I18n.getInstance().setLang(parts[2], WhatAStorage.getInstance().getContentManager())) {
|
||||
invalidateI18n();
|
||||
WhatAStorage.getInstance().getOptions().save();
|
||||
} else {
|
||||
printInvalidInput();
|
||||
}
|
||||
}
|
||||
break;
|
||||
default:
|
||||
printInvalidInput();
|
||||
break;
|
||||
}
|
||||
}
|
||||
break;
|
||||
default:
|
||||
printInvalidInput();
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void showGame() {
|
||||
int width = storage.length;
|
||||
int height = storage[0].length;
|
||||
int depth = storage[0][0].length;
|
||||
int index = 1;
|
||||
|
||||
final String empty = I18n.getInstance().getString("game.storage.empty");
|
||||
for (int y = 0; y < height; y++) {
|
||||
{
|
||||
StringBuilder stringBuilder = new StringBuilder();
|
||||
for (int x = 0; x < width; x++) {
|
||||
stringBuilder.append(index);
|
||||
stringBuilder.append(".");
|
||||
stringBuilder.append(" ".repeat(CELL_WIDTH * (x + 1) + x * 3 - stringBuilder.length()));
|
||||
if (x < width - 1) {
|
||||
stringBuilder.append(" | ");
|
||||
}
|
||||
|
||||
index++;
|
||||
}
|
||||
System.out.println(stringBuilder.toString());
|
||||
}
|
||||
|
||||
for (int z = 0; z < depth; z++) {
|
||||
StringBuilder stringBuilder = new StringBuilder();
|
||||
for (int x = 0; x < width; x++) {
|
||||
if (storage[x][y][z] != null) {
|
||||
stringBuilder.append(I18n.getInstance().getString(storage[x][y][z]));
|
||||
} else {
|
||||
stringBuilder.append(empty);
|
||||
}
|
||||
stringBuilder.append(" ".repeat(CELL_WIDTH * (x + 1) + x * 3 - stringBuilder.length()));
|
||||
if (x < width - 1) {
|
||||
stringBuilder.append(" | ");
|
||||
}
|
||||
}
|
||||
System.out.println(stringBuilder.toString());
|
||||
}
|
||||
|
||||
if (y < height - 1) {
|
||||
StringBuilder stringBuilder = new StringBuilder();
|
||||
for (int x = 0; x < width; x++) {
|
||||
stringBuilder.append("-".repeat(CELL_WIDTH));
|
||||
if (x < width - 1) {
|
||||
stringBuilder.append("-+-");
|
||||
}
|
||||
}
|
||||
System.out.println(stringBuilder.toString());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void showBudget(int budget, int totalIncome, int totalLoss) {
|
||||
I18n i18n = I18n.getInstance();
|
||||
|
||||
System.out.println(i18n.format("game.budget.label", budget) +
|
||||
" " +
|
||||
i18n.format("game.balance.total-income", totalIncome) +
|
||||
" " +
|
||||
i18n.format("game.balance.total-loss", totalLoss));
|
||||
}
|
||||
|
||||
private void printInvalidInput() {
|
||||
System.out.println(I18n.getInstance().getString("general.invalid-input"));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onGameStart(int width, int height, int depth) {
|
||||
storage = new String[width][height][depth];
|
||||
state = State.GAME;
|
||||
|
||||
showGame();
|
||||
System.out.println();
|
||||
showBudget(0, 0, 0);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onScheduleStop() {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void invalidateI18n() {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onBalanceChanged(int budget, Transaction transaction, int totalIncome, int totalLoss) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onQuestAdded(Quest newQuest, boolean canCreateMore) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onQuestRemoved(int index) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onProductSet(int x, int y, int z, Product product) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onProductCleared(int x, int y, int z, Product product) {
|
||||
|
||||
}
|
||||
}
|
||||
@@ -44,6 +44,7 @@ public class JFXVisual extends Application implements Visual {
|
||||
private static GameController gameController;
|
||||
private static GridPane storageGrid;
|
||||
private static JFXStorageSlot[][] storageSlots;
|
||||
private static int width, height, depth;
|
||||
|
||||
private static Scene optionsScene;
|
||||
private static OptionsController optionsController;
|
||||
@@ -79,7 +80,11 @@ public class JFXVisual extends Application implements Visual {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onGameStart() {
|
||||
public void onGameStart(int width, int height, int depth) {
|
||||
JFXVisual.width = width;
|
||||
JFXVisual.height = height;
|
||||
JFXVisual.depth = depth;
|
||||
loadGameScene();
|
||||
changeScene(gameScene);
|
||||
}
|
||||
|
||||
@@ -99,7 +104,7 @@ public class JFXVisual extends Application implements Visual {
|
||||
public void onBalanceChanged(int budget, Transaction transaction, int totalIncome, int totalLoss) {
|
||||
I18n i18n = I18n.getInstance();
|
||||
|
||||
gameController.budgetLabel.setText(i18n.format("game.budget", budget));
|
||||
gameController.budgetLabel.setText(i18n.format("game.budget.label", budget));
|
||||
JFXUtil.setStyleClass(gameController.budgetLabel, "red", budget < 0);
|
||||
|
||||
if (balanceController != null) {
|
||||
@@ -141,7 +146,6 @@ public class JFXVisual extends Application implements Visual {
|
||||
primaryStage.setMinWidth(850);
|
||||
primaryStage.setMinHeight(500);
|
||||
|
||||
loadGameScene();
|
||||
loadOptionsScene();
|
||||
|
||||
primaryStage.setOnCloseRequest(event -> {
|
||||
@@ -163,7 +167,7 @@ public class JFXVisual extends Application implements Visual {
|
||||
|
||||
gameScene = JFXUtil.loadScene("game", gameController, I18n.getInstance());
|
||||
|
||||
prepareStorageGrid(3, 3, 3);
|
||||
prepareStorageGrid();
|
||||
|
||||
AssetsManager.getStream("textures/bin_closed.png").ifPresent(inputStream -> {
|
||||
gameController.trash.setImage(new Image(inputStream));
|
||||
@@ -262,7 +266,7 @@ public class JFXVisual extends Application implements Visual {
|
||||
});
|
||||
}
|
||||
|
||||
private void prepareStorageGrid(int width, int height, int depth) {
|
||||
private void prepareStorageGrid() {
|
||||
storageGrid = new GridPane();
|
||||
storageGrid.setId("storage-grid");
|
||||
storageGrid.setPadding(new Insets(5D));
|
||||
|
||||
@@ -8,7 +8,7 @@ import de.siphalor.was.game.Transaction;
|
||||
public interface Visual {
|
||||
void setup(WhatAStorage whatAStorage);
|
||||
void run();
|
||||
void onGameStart();
|
||||
void onGameStart(int width, int height, int depth);
|
||||
void onScheduleStop();
|
||||
|
||||
void invalidateI18n();
|
||||
|
||||
@@ -22,7 +22,7 @@
|
||||
<ToolBar maxWidth="1.7976931348623157E308" prefHeight="40.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0">
|
||||
<items>
|
||||
<Button fx:id="balanceButton" mnemonicParsing="false" text="%game.balance" />
|
||||
<Label fx:id="budgetLabel" text="%game.budget">
|
||||
<Label fx:id="budgetLabel" text="%game.budget.label">
|
||||
<font>
|
||||
<Font size="19.0" />
|
||||
</font>
|
||||
|
||||
@@ -1,14 +1,18 @@
|
||||
test.hello-world = Hallo Welt!
|
||||
|
||||
menu.back = Zur\u00fcck
|
||||
menu.start-game = Spiel starten
|
||||
menu.options = Optionen
|
||||
menu.options.available = Verf\u00fcgbare Optionen:
|
||||
menu.options.back = Anwenden und zur\u00fcck
|
||||
menu.options.general = Allgemein
|
||||
menu.options.gameplay = Spielmechanik
|
||||
menu.options.gameplay.quest-resolving = Erlauben Auftr\u00e4ge gegeneinander aufzul\u00f6sen
|
||||
menu.options.gameplay.auto-quest-refill = Automatisch neue Auftr\u00e4ge akzeptieren
|
||||
|
||||
game.budget = Budget: %d\u20ac
|
||||
general.invalid-input = Ung\u00fcltige Eingabe
|
||||
|
||||
game.budget = Budget
|
||||
game.budget.label = Budget: %d\u20ac
|
||||
game.budget.change.income = +%d\u20ac
|
||||
game.budget.change.loss = %d\u20ac
|
||||
game.quit = Spiel beenden
|
||||
|
||||
@@ -3,14 +3,19 @@ test.hello-world = Hello World!
|
||||
langs.en_us = English (America)
|
||||
langs.de_de = Deutsch
|
||||
|
||||
menu.start-game = Start game
|
||||
menu.options = Options
|
||||
menu.options.available = Available options:
|
||||
menu.options.back = Apply & Leave
|
||||
menu.options.general = General
|
||||
menu.options.gameplay = Gameplay
|
||||
menu.options.gameplay.quest-resolving = Allow quest resolving
|
||||
menu.options.gameplay.auto-quest-refill = Automatically refill quests
|
||||
|
||||
game.budget = Budget: %d$
|
||||
general.invalid-input = Invalid input
|
||||
|
||||
game.budget = Budget
|
||||
game.budget.label = Budget: %d$
|
||||
game.budget.change.income = +%d$
|
||||
game.budget.change.loss = %d$
|
||||
game.quit = Quit Game
|
||||
|
||||
@@ -18,7 +18,7 @@ public class DummyVisual implements Visual {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onGameStart() {
|
||||
public void onGameStart(int width, int height, int depth) {
|
||||
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user