diff --git a/src/main/java/de/siphalor/was/Start.java b/src/main/java/de/siphalor/was/Start.java index 7dab63d..67d47c3 100644 --- a/src/main/java/de/siphalor/was/Start.java +++ b/src/main/java/de/siphalor/was/Start.java @@ -11,7 +11,6 @@ public class Start { was.reload(); was.setup(); - I18n.getInstance().setLang("de_de", was.getContentManager()); Util.LOGGER.log(Level.INFO, I18n.getInstance().getString("test.hello-world")); was.run(); diff --git a/src/main/java/de/siphalor/was/WhatAStorage.java b/src/main/java/de/siphalor/was/WhatAStorage.java index 9c232fe..c957b6d 100644 --- a/src/main/java/de/siphalor/was/WhatAStorage.java +++ b/src/main/java/de/siphalor/was/WhatAStorage.java @@ -9,13 +9,12 @@ 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.Balance; -import de.siphalor.was.game.Options; -import de.siphalor.was.game.Storage; +import de.siphalor.was.game.*; +import de.siphalor.was.util.Pair; import de.siphalor.was.util.Util; import de.siphalor.was.visual.JFXVisual; import de.siphalor.was.visual.Visual; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.io.File; @@ -90,6 +89,7 @@ public class WhatAStorage { } } + options.load(); I18n.getInstance().reload(contentManager); productManager.clear(); @@ -137,16 +137,34 @@ public class WhatAStorage { }).toArray(String[]::new); } - private void addTransaction(Balance.Transaction transaction, int change) { - balance.add(transaction, change); - visual.onBalanceChanged(balance.getBudget(), transaction, change, balance.getTotalIncome(), balance.getTotalLoss()); + private void addTransaction(@NotNull Transaction.Type type, int change, @Nullable Product product) { + Transaction transaction = balance.add(type, change, product); + visual.onBalanceChanged(balance.getBudget(), transaction, balance.getTotalIncome(), balance.getTotalLoss()); } - public boolean requestQuest() { + public void invalidateI18n() { + visual.invalidateI18n(); + } + + public void resendVisualGameData() { + for (int x = 0; x < storage.getWidth(); x++) { + for (int y = 0; y < storage.getHeight(); y++) { + for (Pair entry : storage.get(x, y).getProductsIndexed()) { + visual.onProductSet(x, y, entry.getFirst(), entry.getSecond()); + } + } + } + for (Quest quest : quests) { + visual.onQuestAdded(quest, quests.size() < MAX_QUESTS); + } + visual.onBalanceChanged(balance.getBudget(), new Transaction(Transaction.Type.NOOP, 0, ""), balance.getTotalIncome(), balance.getTotalLoss()); + } + + public boolean userRequestQuest() { if (quests.size() >= MAX_QUESTS) return false; if (!questGenerator.hasMoreElements()) { - return false; + questGenerator.restart(); } Quest next = questGenerator.nextElement(); @@ -156,14 +174,14 @@ public class WhatAStorage { return true; } - public void abandonQuest(int index) { + public void userAbandonQuest(int index) { if (index >= quests.size()) { Util.LOGGER.log(Level.SEVERE, "Attempted to abandon non-existent quest!"); return; } Quest quest = quests.remove(index); - addTransaction(Balance.Transaction.ABANDON, -quest.getReward()); + addTransaction(Transaction.Type.ABANDON, -quest.getReward(), quest.getProduct()); visual.onQuestRemoved(index); } @@ -180,7 +198,7 @@ public class WhatAStorage { return canStoreProduct(storage.get(x1, y1).front(), x2, y2); } - public void storeProduct(int questIndex, int x, int y) { + public void userStoreProduct(int questIndex, int x, int y) { Quest quest = quests.get(questIndex); if (quest != null && quest.getType() == Quest.Type.IN) { Product product = quest.getProduct(); @@ -188,7 +206,7 @@ public class WhatAStorage { int z = storage.get(x, y).add(product); if (z >= 0 && product.testY(y)) { quests.remove(questIndex); - addTransaction(Balance.Transaction.STORE, quest.getReward()); + addTransaction(Transaction.Type.STORE, quest.getReward(), product); visual.onQuestRemoved(questIndex); visual.onProductSet(x, y, z, quest.getProduct()); } @@ -203,11 +221,11 @@ public class WhatAStorage { return false; } - public boolean deliverProduct(int questIndex, int x, int y) { + public boolean userDeliverProduct(int questIndex, int x, int y) { if (canDeliverProduct(questIndex, x, y)) { Product product = storage.get(x, y).front(); int z = storage.get(x, y).pop(); - addTransaction(Balance.Transaction.DELIVER, quests.get(questIndex).getReward()); + addTransaction(Transaction.Type.DELIVER, quests.get(questIndex).getReward(), product); quests.remove(questIndex); visual.onQuestRemoved(questIndex); visual.onProductCleared(x, y, z, product); @@ -227,15 +245,15 @@ public class WhatAStorage { return false; } - public boolean resolveQuests(int in, int out) { + public boolean userResolveQuests(int in, int out) { if (options.getAllowQuestResolving()) { int s = quests.size(); if (in < s && in >= 0 && out < s && out >= 0) { if (quests.get(in).getType() == Quest.Type.IN && quests.get(out).getType() == Quest.Type.OUT) { Product product = quests.get(in).getProduct(); if (product.equals(quests.get(out).getProduct())) { - addTransaction(Balance.Transaction.STORE, quests.get(in).getReward()); - addTransaction(Balance.Transaction.DELIVER, quests.get(out).getReward()); + addTransaction(Transaction.Type.STORE, quests.get(in).getReward(), product); + addTransaction(Transaction.Type.DELIVER, quests.get(out).getReward(), product); if (out > in) out--; quests.remove(in); @@ -251,25 +269,25 @@ public class WhatAStorage { return false; } - public void moveProduct(int x1, int y1, int x2, int y2) { + public void userMoveProduct(int x1, int y1, int x2, int y2) { Product product = storage.get(x1, y1).front(); if (product != null && product.testY(y2)) { int z2 = storage.get(x2, y2).add(product); if (z2 >= 0) { int z1 = storage.get(x1, y1).pop(); - addTransaction(Balance.Transaction.MOVE, -100); + addTransaction(Transaction.Type.MOVE, -100, product); visual.onProductCleared(x1, y1, z1, product); visual.onProductSet(x2, y2, z2, product); } } } - public void destroyProduct(int x, int y) { + public void userDestroyProduct(int x, int y) { Product product = storage.get(x, y).front(); int z = storage.get(x, y).pop(); if (z >= 0) { - addTransaction(Balance.Transaction.DESTROY, -500); + addTransaction(Transaction.Type.DESTROY, -500, product); visual.onProductCleared(x, y, z, product); } } diff --git a/src/main/java/de/siphalor/was/game/Balance.java b/src/main/java/de/siphalor/was/game/Balance.java index c6eef5d..90a458c 100644 --- a/src/main/java/de/siphalor/was/game/Balance.java +++ b/src/main/java/de/siphalor/was/game/Balance.java @@ -1,8 +1,9 @@ package de.siphalor.was.game; -import de.siphalor.was.util.Pair; +import de.siphalor.was.content.product.Product; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; -import java.util.Locale; import java.util.Queue; import java.util.concurrent.ConcurrentLinkedQueue; @@ -10,21 +11,27 @@ public class Balance { private int budget = 0; private int totalIncome = 0; private int totalLoss = 0; - private final Queue> history = new ConcurrentLinkedQueue<>(); + private final Queue history = new ConcurrentLinkedQueue<>(); - public void add(Transaction transaction, int change) { - history.add(Pair.of(transaction, change)); - - budget += change; - - if (change < 0) { - totalLoss -= change; - } else { - totalIncome += change; - } + public Transaction add(@NotNull Transaction.Type type, int change, @Nullable Product product) { + return add(new Transaction(type, change, product != null ? product.getTranslationKey() : "")); } - public Queue> getHistory() { + public Transaction add(@NotNull Transaction transaction) { + history.add(transaction); + + budget += transaction.getChange(); + + if (transaction.getChange() < 0) { + totalLoss -= transaction.getChange(); + } else { + totalIncome += transaction.getChange(); + } + return transaction; + } + + @NotNull + public Queue getHistory() { return history; } @@ -40,11 +47,4 @@ public class Balance { return totalLoss; } - public enum Transaction { - ABANDON, DESTROY, MOVE, NOOP, DELIVER, STORE; - - public String getTranslationKey() { - return "game.balance.history.type." + name().toLowerCase(Locale.ENGLISH); - } - } } diff --git a/src/main/java/de/siphalor/was/game/Options.java b/src/main/java/de/siphalor/was/game/Options.java index 904bce6..caf843a 100644 --- a/src/main/java/de/siphalor/was/game/Options.java +++ b/src/main/java/de/siphalor/was/game/Options.java @@ -1,5 +1,11 @@ package de.siphalor.was.game; +import de.siphalor.was.WhatAStorage; +import de.siphalor.was.content.lang.I18n; + +import java.util.Locale; +import java.util.prefs.Preferences; + public class Options { private boolean autoRefillQuests; private boolean allowQuestResolving; @@ -19,4 +25,24 @@ public class Options { public void setAutoRefillQuests(boolean autoRefillQuests) { this.autoRefillQuests = autoRefillQuests; } + + private Preferences getPreferences() { + return Preferences.userNodeForPackage(WhatAStorage.class); + } + + public void load() { + Preferences preferences = getPreferences(); + autoRefillQuests = preferences.getBoolean("auto-refill-quests", false); + allowQuestResolving = preferences.getBoolean("allow-quest-resolving", true); + + String lang = preferences.get("preferred-lang", Locale.getDefault().getLanguage() + "_" + Locale.getDefault().getCountry()); + I18n.getInstance().setLang(lang, WhatAStorage.getInstance().getContentManager()); + } + + public void save() { + Preferences preferences = getPreferences(); + preferences.putBoolean("auto-refill-quests", autoRefillQuests); + preferences.putBoolean("allow-quest-resolving", allowQuestResolving); + preferences.put("preferred-lang", I18n.getInstance().getLang().getCode()); + } } diff --git a/src/main/java/de/siphalor/was/game/StorageSlot.java b/src/main/java/de/siphalor/was/game/StorageSlot.java index d0275f2..9b7ef2c 100644 --- a/src/main/java/de/siphalor/was/game/StorageSlot.java +++ b/src/main/java/de/siphalor/was/game/StorageSlot.java @@ -1,10 +1,14 @@ package de.siphalor.was.game; import de.siphalor.was.content.product.Product; +import de.siphalor.was.util.Pair; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.Arrays; +import java.util.Collection; +import java.util.Queue; +import java.util.concurrent.ConcurrentLinkedQueue; public class StorageSlot { final int depth; @@ -20,6 +24,21 @@ public class StorageSlot { return products; } + @NotNull + public Collection> getProductsIndexed() { + Queue> queue = new ConcurrentLinkedQueue<>(); + int index = 0; + for (int i = 0; i < depth; i++) { + if (products[i] == null) { + break; + } + + queue.add(Pair.of(index, products[i])); + index += products[i].getDepth(); + } + return queue; + } + public void clear() { Arrays.fill(products, null); } diff --git a/src/main/java/de/siphalor/was/game/Transaction.java b/src/main/java/de/siphalor/was/game/Transaction.java new file mode 100644 index 0000000..75b9d75 --- /dev/null +++ b/src/main/java/de/siphalor/was/game/Transaction.java @@ -0,0 +1,39 @@ +package de.siphalor.was.game; + +import org.jetbrains.annotations.NotNull; + +import java.util.Locale; + +public class Transaction { + private final Type type; + private final int change; + private final String productKey; + + public Transaction(@NotNull Type type, int change, @NotNull String productKey) { + this.type = type; + this.change = change; + this.productKey = productKey; + } + + @NotNull + public Type getType() { + return type; + } + + public int getChange() { + return change; + } + + @NotNull + public String getProductKey() { + return productKey; + } + + public enum Type { + ABANDON, DESTROY, MOVE, NOOP, DELIVER, STORE; + + public String getTranslationKey() { + return "game.balance.history.type." + name().toLowerCase(Locale.ENGLISH); + } + } +} diff --git a/src/main/java/de/siphalor/was/visual/CanvasVisual.java b/src/main/java/de/siphalor/was/visual/CanvasVisual.java index bff1168..39cf1e1 100644 --- a/src/main/java/de/siphalor/was/visual/CanvasVisual.java +++ b/src/main/java/de/siphalor/was/visual/CanvasVisual.java @@ -4,7 +4,7 @@ import de.siphalor.was.WhatAStorage; import de.siphalor.was.assets.AssetsManager; 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 de.siphalor.was.visual.canvas.layout.FixedAspectLayout; import de.siphalor.was.visual.canvas.layout.FulfillingLayout; import org.jetbrains.annotations.NotNull; @@ -155,7 +155,12 @@ public class CanvasVisual implements Visual { } @Override - public void onBalanceChanged(int budget, Balance.Transaction transaction, int change, int totalIncome, int totalLoss) { + public void invalidateI18n() { + + } + + @Override + public void onBalanceChanged(int budget, Transaction transaction, int totalIncome, int totalLoss) { } diff --git a/src/main/java/de/siphalor/was/visual/JFXVisual.java b/src/main/java/de/siphalor/was/visual/JFXVisual.java index 3b678bf..482c91a 100644 --- a/src/main/java/de/siphalor/was/visual/JFXVisual.java +++ b/src/main/java/de/siphalor/was/visual/JFXVisual.java @@ -7,14 +7,14 @@ 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.content.resource.Resource; -import de.siphalor.was.game.Balance; +import de.siphalor.was.game.Transaction; import de.siphalor.was.util.Util; import de.siphalor.was.visual.jfx.controller.BalanceController; import de.siphalor.was.visual.jfx.controller.MainController; import de.siphalor.was.visual.jfx.controller.OptionsController; import de.siphalor.was.visual.jfx.controller.QuestController; import de.siphalor.was.visual.jfx.util.JFXUtil; -import de.siphalor.was.visual.jfx.util.StorageSlot; +import de.siphalor.was.visual.jfx.util.JFXStorageSlot; import javafx.animation.FadeTransition; import javafx.animation.Interpolator; import javafx.application.Application; @@ -37,12 +37,13 @@ import java.util.Optional; import java.util.logging.Level; public class JFXVisual extends Application implements Visual { + private static boolean i18nInvalidated = false; private static Stage primaryStage; - private static Scene mainScene; - private static MainController mainController; + private static Scene gameScene; + private static MainController gameController; private static GridPane storageGrid; - private static StorageSlot[][] storageSlots; + private static JFXStorageSlot[][] storageSlots; private static Scene optionsScene; private static OptionsController optionsController; @@ -85,14 +86,19 @@ public class JFXVisual extends Application implements Visual { } @Override - public void onBalanceChanged(int budget, Balance.Transaction transaction, int change, int totalIncome, int totalLoss) { + public void invalidateI18n() { + i18nInvalidated = true; + } + + @Override + public void onBalanceChanged(int budget, Transaction transaction, int totalIncome, int totalLoss) { I18n i18n = I18n.getInstance(); - mainController.budgetLabel.setText(i18n.format("game.budget", budget)); - JFXUtil.setStyleClass(mainController.budgetLabel, "red", budget < 0); + gameController.budgetLabel.setText(i18n.format("game.budget", budget)); + JFXUtil.setStyleClass(gameController.budgetLabel, "red", budget < 0); if (balanceController != null) { - balanceController.onBalanceChanged(budget, transaction, change, totalIncome, totalLoss); + balanceController.onBalanceChanged(budget, transaction, totalIncome, totalLoss); } } @@ -100,24 +106,24 @@ public class JFXVisual extends Application implements Visual { public void onQuestAdded(Quest newQuest, boolean canCreateMore) { addQuest(newQuest); - mainController.nextQuestButton.setDisable(!canCreateMore); + gameController.nextQuestButton.setDisable(!canCreateMore); } @Override public void onQuestRemoved(int index) { - mainController.questBox.getChildren().remove(index); + gameController.questBox.getChildren().remove(index); - mainController.nextQuestButton.setDisable(false); + gameController.nextQuestButton.setDisable(false); } @Override public void start(Stage primaryStage) throws Exception { JFXVisual.primaryStage = primaryStage; + primaryStage.setTitle(WhatAStorage.TITLE); primaryStage.setMinWidth(850); primaryStage.setMinHeight(500); - primaryStage.setTitle(WhatAStorage.TITLE); - loadMainScene(); + loadGameScene(); loadOptionsScene(); primaryStage.setOnCloseRequest(event -> { @@ -125,31 +131,50 @@ public class JFXVisual extends Application implements Visual { balanceStage.hide(); }); - primaryStage.setScene(mainScene); + changeScene(gameScene); primaryStage.show(); } - public void loadMainScene() { - mainController = new MainController(WhatAStorage.getInstance()); + private void changeScene(Scene nextScene) { + primaryStage.setScene(nextScene); + } - mainScene = JFXUtil.loadScene("game", mainController, I18n.getInstance()); + public void loadGameScene() { + gameController = new MainController(WhatAStorage.getInstance()); + + gameScene = JFXUtil.loadScene("game", gameController, I18n.getInstance()); prepareStorageGrid(3, 3, 3); AssetsManager.getStream("textures/bin_closed.png").ifPresent(inputStream -> { - mainController.trash.setImage(new Image(inputStream)); + gameController.trash.setImage(new Image(inputStream)); }); - onBalanceChanged(0, Balance.Transaction.NOOP, 0, 0, 0); + onBalanceChanged(0, new Transaction(Transaction.Type.NOOP, 0, ""), 0, 0); - mainController.balanceButton.setOnAction(event -> { + gameController.balanceButton.setOnAction(event -> { if (balanceStage != null && balanceStage.isShowing()) { return; } balanceStage = new Stage(); + setupBalanceStage(); + + balanceStage.show(); + }); + + gameController.optionsButton.setOnAction(event -> openOptionsScene()); + } + + private void loadOptionsScene() { + optionsController = new OptionsController(); + optionsScene = JFXUtil.loadScene("options", optionsController, I18n.getInstance()); + } + + private void setupBalanceStage() { + if (balanceStage != null) { balanceController = new BalanceController(); Scene scene = JFXUtil.loadScene("balance", balanceController, I18n.getInstance()); @@ -160,23 +185,25 @@ public class JFXVisual extends Application implements Visual { balanceController = null; }); - balanceStage.setAlwaysOnTop(true); balanceStage.setScene(scene); balanceStage.setTitle(I18n.getInstance().getString("game.balance")); - balanceStage.show(); - }); - - mainController.optionsButton.setOnAction(event -> openOptionsScene()); - } - - private void loadOptionsScene() { - optionsController = new OptionsController(); - optionsScene = JFXUtil.loadScene("options", optionsController, I18n.getInstance()); + } } private void openOptionsScene() { - optionsController.beforeOpen(() -> primaryStage.setScene(mainScene)); - primaryStage.setScene(optionsScene); + optionsController.beforeOpen(() -> { + if (i18nInvalidated) { + loadGameScene(); + WhatAStorage.getInstance().resendVisualGameData(); + changeScene(gameScene); + loadOptionsScene(); + setupBalanceStage(); + i18nInvalidated = false; + } else { + changeScene(gameScene); + } + }); + changeScene(optionsScene); } private void addQuest(Quest quest) { @@ -192,7 +219,7 @@ public class JFXVisual extends Application implements Visual { transition.setByValue(1D); transition.setInterpolator(Interpolator.EASE_OUT); - mainController.questBox.getChildren().add(parent); + gameController.questBox.getChildren().add(parent); transition.play(); Product product = quest.getProduct(); @@ -232,10 +259,10 @@ public class JFXVisual extends Application implements Visual { RowConstraints rowConstraints = new RowConstraints(); rowConstraints.setPercentHeight(100D / height); - storageSlots = new StorageSlot[width][height]; + storageSlots = new JFXStorageSlot[width][height]; for (int y = 0; y < height; y++) { for (int x = 0; x < width; x++) { - StorageSlot storageSlot = new StorageSlot(x, y, depth); + JFXStorageSlot storageSlot = new JFXStorageSlot(x, y, depth); storageSlots[y][x] = storageSlot; storageGrid.add(storageSlot.getGrid(), x, y); } @@ -245,7 +272,7 @@ public class JFXVisual extends Application implements Visual { storageGrid.getColumnConstraints().add(columnConstraints); } - mainController.storagePane.getChildren().add(storageGrid); + gameController.storagePane.getChildren().add(storageGrid); } @Override @@ -253,7 +280,7 @@ public class JFXVisual extends Application implements Visual { ContentManager contentManager = WhatAStorage.getInstance().getContentManager(); I18n i18n = I18n.getInstance(); - StorageSlot slot = storageSlots[y][x]; + JFXStorageSlot slot = storageSlots[y][x]; int depth = product.getDepth(); int dz = z + depth - 1; @@ -273,7 +300,7 @@ public class JFXVisual extends Application implements Visual { @Override public void onProductCleared(int x, int y, int z, Product product) { - StorageSlot slot = storageSlots[y][x]; + JFXStorageSlot slot = storageSlots[y][x]; String empty = I18n.getInstance().getString("game.storage.empty"); int dz = z + product.getDepth() - 1; diff --git a/src/main/java/de/siphalor/was/visual/Visual.java b/src/main/java/de/siphalor/was/visual/Visual.java index dca1808..1791fa5 100644 --- a/src/main/java/de/siphalor/was/visual/Visual.java +++ b/src/main/java/de/siphalor/was/visual/Visual.java @@ -3,14 +3,16 @@ package de.siphalor.was.visual; import de.siphalor.was.WhatAStorage; 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; public interface Visual { void setup(WhatAStorage whatAStorage); void run(); void onScheduleStop(); - void onBalanceChanged(int budget, Balance.Transaction transaction, int change, int totalIncome, int totalLoss); + void invalidateI18n(); + + void onBalanceChanged(int budget, Transaction transaction, int totalIncome, int totalLoss); void onQuestAdded(Quest newQuest, boolean canCreateMore); void onQuestRemoved(int index); diff --git a/src/main/java/de/siphalor/was/visual/jfx/controller/BalanceController.java b/src/main/java/de/siphalor/was/visual/jfx/controller/BalanceController.java index 9c51f1a..ee636d5 100644 --- a/src/main/java/de/siphalor/was/visual/jfx/controller/BalanceController.java +++ b/src/main/java/de/siphalor/was/visual/jfx/controller/BalanceController.java @@ -3,7 +3,7 @@ package de.siphalor.was.visual.jfx.controller; import de.siphalor.was.WhatAStorage; import de.siphalor.was.content.lang.I18n; import de.siphalor.was.game.Balance; -import de.siphalor.was.util.Pair; +import de.siphalor.was.game.Transaction; import de.siphalor.was.visual.jfx.util.BalanceEntry; import javafx.collections.ObservableList; import javafx.scene.chart.LineChart; @@ -32,38 +32,42 @@ public class BalanceController { columns.get(0).setCellValueFactory(new PropertyValueFactory<>("index")); columns.get(1).setCellValueFactory(new PropertyValueFactory<>("change")); columns.get(2).setCellValueFactory(new PropertyValueFactory<>("description")); + columns.get(3).setCellValueFactory(new PropertyValueFactory<>("product")); + budgetChart.getData().clear(); //noinspection unchecked budgetChart.getData().add((XYChart.Series)(Object) budgetChartSeries); ObservableList> chartItems = budgetChartSeries.getData(); chartItems.add(new XYChart.Data<>(0, 0)); ObservableList tableItems = balanceHistoryTable.getItems(); + tableItems.clear(); I18n i18n = I18n.getInstance(); int i = 1; int budget = 0; - for (Pair entry : balance.getHistory()) { - budget += entry.getSecond(); + for (Transaction entry : balance.getHistory()) { + budget += entry.getChange(); - tableItems.add(new BalanceEntry(i, entry.getSecond(), i18n.getString(entry.getFirst().getTranslationKey()))); + tableItems.add(new BalanceEntry(i, entry.getChange(), i18n.getString(entry.getType().getTranslationKey()), i18n.getString(entry.getProductKey()))); chartItems.add(new XYChart.Data<>(i, budget)); i++; } + + updateTotalValues(balance.getTotalIncome(), balance.getTotalLoss(), i18n); } - public void onBalanceChanged(int budget, Balance.Transaction transaction, int change, int totalIncome, int totalLoss) { + public void onBalanceChanged(int budget, Transaction transaction, int totalIncome, int totalLoss) { I18n i18n = I18n.getInstance(); - totalIncomeLabel.setText(i18n.format("game.balance.total-income", totalIncome)); - totalLossLabel.setText(i18n.format("game.balance.total-loss", totalLoss)); + updateTotalValues(totalIncome, totalLoss, i18n); - if (transaction != Balance.Transaction.NOOP) { + if (transaction.getType() != Transaction.Type.NOOP) { ObservableList items = balanceHistoryTable.getItems(); - items.add(new BalanceEntry(items.size(), change, i18n.getString(transaction.getTranslationKey()))); + items.add(new BalanceEntry(items.size(), transaction.getChange(), i18n.getString(transaction.getType().getTranslationKey()), i18n.getString(transaction.getProductKey()))); balanceHistoryTable.sort(); } @@ -71,4 +75,9 @@ public class BalanceController { data.add(new XYChart.Data<>(data.size(), budget)); } + + private void updateTotalValues(int totalIncome, int totalLoss, I18n i18n) { + totalIncomeLabel.setText(i18n.format("game.balance.total-income", totalIncome)); + totalLossLabel.setText(i18n.format("game.balance.total-loss", totalLoss)); + } } diff --git a/src/main/java/de/siphalor/was/visual/jfx/controller/MainController.java b/src/main/java/de/siphalor/was/visual/jfx/controller/MainController.java index 6f38076..4159958 100644 --- a/src/main/java/de/siphalor/was/visual/jfx/controller/MainController.java +++ b/src/main/java/de/siphalor/was/visual/jfx/controller/MainController.java @@ -39,7 +39,7 @@ public class MainController { @FXML private void nextQuest() { - was.requestQuest(); + was.userRequestQuest(); } @FXML @@ -72,13 +72,13 @@ public class MainController { if (origin instanceof DraggedProduct.Quest) { DraggedProduct.Quest questOrigin = (DraggedProduct.Quest) origin; - was.abandonQuest(questOrigin.index); + was.userAbandonQuest(questOrigin.index); dragEvent.setDropCompleted(true); dragEvent.consume(); return; } else if (origin instanceof DraggedProduct.Slot) { - was.destroyProduct(((DraggedProduct.Slot) origin).x, ((DraggedProduct.Slot) origin).y); + was.userDestroyProduct(((DraggedProduct.Slot) origin).x, ((DraggedProduct.Slot) origin).y); dragEvent.setDropCompleted(true); dragEvent.consume(); diff --git a/src/main/java/de/siphalor/was/visual/jfx/controller/OptionsController.java b/src/main/java/de/siphalor/was/visual/jfx/controller/OptionsController.java index 188460f..a0f5e58 100644 --- a/src/main/java/de/siphalor/was/visual/jfx/controller/OptionsController.java +++ b/src/main/java/de/siphalor/was/visual/jfx/controller/OptionsController.java @@ -43,10 +43,17 @@ public class OptionsController { private void onLeaveClicked() { Options options = WhatAStorage.getInstance().getOptions(); + String oldLang = I18n.getInstance().getLang().getCode(); I18n.getInstance().setLang(languageChoice.getValue().getCode(), WhatAStorage.getInstance().getContentManager()); options.setAllowQuestResolving(allowQuestResolvingToggle.isSelected()); options.setAutoRefillQuests(autoQuestRefillToggle.isSelected()); + options.save(); + + if (!oldLang.equals(I18n.getInstance().getLang().getCode())) { + WhatAStorage.getInstance().invalidateI18n(); + } + exitRunnable.run(); } diff --git a/src/main/java/de/siphalor/was/visual/jfx/controller/QuestController.java b/src/main/java/de/siphalor/was/visual/jfx/controller/QuestController.java index 67dc17b..7b3b157 100644 --- a/src/main/java/de/siphalor/was/visual/jfx/controller/QuestController.java +++ b/src/main/java/de/siphalor/was/visual/jfx/controller/QuestController.java @@ -29,7 +29,7 @@ public class QuestController { @FXML private void abandon() { - WhatAStorage.getInstance().abandonQuest(getIndex()); + WhatAStorage.getInstance().userAbandonQuest(getIndex()); } private boolean canDropHere(DragEvent dragEvent) { @@ -90,14 +90,14 @@ public class QuestController { DraggedProduct product = (DraggedProduct) dragboard.getContent(DraggedProduct.FORMAT); if (product instanceof DraggedProduct.Slot) { DraggedProduct.Slot slot = (DraggedProduct.Slot) product; - if (WhatAStorage.getInstance().deliverProduct(getIndex(), slot.x, slot.y)) { + if (WhatAStorage.getInstance().userDeliverProduct(getIndex(), slot.x, slot.y)) { dragEvent.setDropCompleted(true); dragEvent.consume(); return; } } else if (product instanceof DraggedProduct.Quest) { DraggedProduct.Quest quest = (DraggedProduct.Quest) product; - if (WhatAStorage.getInstance().resolveQuests(quest.index, getIndex())) { + if (WhatAStorage.getInstance().userResolveQuests(quest.index, getIndex())) { dragEvent.setDropCompleted(true); dragEvent.consume(); return; diff --git a/src/main/java/de/siphalor/was/visual/jfx/util/BalanceEntry.java b/src/main/java/de/siphalor/was/visual/jfx/util/BalanceEntry.java index d113364..61ff673 100644 --- a/src/main/java/de/siphalor/was/visual/jfx/util/BalanceEntry.java +++ b/src/main/java/de/siphalor/was/visual/jfx/util/BalanceEntry.java @@ -1,14 +1,17 @@ package de.siphalor.was.visual.jfx.util; +@SuppressWarnings("unused") public class BalanceEntry { public final int index; public final int change; public final String description; + public final String product; - public BalanceEntry(int index, int change, String description) { + public BalanceEntry(int index, int change, String description, String product) { this.index = index; this.change = change; this.description = description; + this.product = product; } public int getIndex() { @@ -22,4 +25,8 @@ public class BalanceEntry { public String getDescription() { return description; } + + public String getProduct() { + return product; + } } diff --git a/src/main/java/de/siphalor/was/visual/jfx/util/StorageSlot.java b/src/main/java/de/siphalor/was/visual/jfx/util/JFXStorageSlot.java similarity index 92% rename from src/main/java/de/siphalor/was/visual/jfx/util/StorageSlot.java rename to src/main/java/de/siphalor/was/visual/jfx/util/JFXStorageSlot.java index 394b5c9..6d19fd0 100644 --- a/src/main/java/de/siphalor/was/visual/jfx/util/StorageSlot.java +++ b/src/main/java/de/siphalor/was/visual/jfx/util/JFXStorageSlot.java @@ -13,7 +13,7 @@ import javafx.scene.layout.GridPane; import javafx.scene.layout.RowConstraints; @SuppressWarnings("unused") -public class StorageSlot { +public class JFXStorageSlot { private final int x; private final int y; private final int depth; @@ -22,7 +22,7 @@ public class StorageSlot { private final ScalingImagePane[] images; private final Label[] labels; - public StorageSlot(int x, int y, int depth) { + public JFXStorageSlot(int x, int y, int depth) { this.x = x; this.y = y; this.depth = depth; @@ -66,7 +66,9 @@ public class StorageSlot { grid.getColumnConstraints().add(columnConstraints); } grid.getColumnConstraints().add(columnConstraints); - grid.getColumnConstraints().add(new ColumnConstraints(30D)); + ColumnConstraints lastCC = new ColumnConstraints(); + lastCC.setPercentWidth(30D); + grid.getColumnConstraints().add(lastCC); grid.getRowConstraints().add(rowConstraints); } @@ -135,12 +137,12 @@ public class StorageSlot { if (dragEvent.getGestureSource() != grid && dragEvent.getDragboard().hasContent(DraggedProduct.FORMAT)) { DraggedProduct origin = (DraggedProduct) dragEvent.getDragboard().getContent(DraggedProduct.FORMAT); if (origin instanceof DraggedProduct.Quest) { - WhatAStorage.getInstance().storeProduct(((DraggedProduct.Quest) origin).index, x, y); + WhatAStorage.getInstance().userStoreProduct(((DraggedProduct.Quest) origin).index, x, y); dragEvent.setDropCompleted(true); return; } else if (origin instanceof DraggedProduct.Slot) { DraggedProduct.Slot slot = (DraggedProduct.Slot) origin; - WhatAStorage.getInstance().moveProduct(slot.x, slot.y, x, y); + WhatAStorage.getInstance().userMoveProduct(slot.x, slot.y, x, y); dragEvent.setDropCompleted(true); return; } diff --git a/src/main/resources/assets/jfx/game.fxml b/src/main/resources/assets/jfx/game.fxml index 65bac9b..9cad3f8 100644 --- a/src/main/resources/assets/jfx/game.fxml +++ b/src/main/resources/assets/jfx/game.fxml @@ -15,7 +15,7 @@ - + diff --git a/src/main/resources/assets/jfx/options.fxml b/src/main/resources/assets/jfx/options.fxml new file mode 100644 index 0000000..bcdb07d --- /dev/null +++ b/src/main/resources/assets/jfx/options.fxml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + +