diff --git a/src/main/java/de/siphalor/was/WhatAStorage.java b/src/main/java/de/siphalor/was/WhatAStorage.java
index c957b6d..0e24726 100644
--- a/src/main/java/de/siphalor/was/WhatAStorage.java
+++ b/src/main/java/de/siphalor/was/WhatAStorage.java
@@ -102,19 +102,26 @@ public class WhatAStorage {
public void setup() {
visual.setup(this);
- loadGame();
}
public void run() {
visual.run();
}
- public void loadGame() {
+ public void startGame() {
questGenerator = questManager.get("example.test");
//questGenerator = new RandomQuestGenerator();
quests.clear();
storage = new Storage(GRID_SIZE, GRID_SIZE, GRID_SIZE);
balance = new Balance();
+
+ visual.onGameStart();
+
+ if (options.getAutoRefillQuests()) {
+ for (int i = 0; i < MAX_QUESTS; i++) {
+ nextQuest();
+ }
+ }
}
public void scheduleStop() {
@@ -160,7 +167,7 @@ public class WhatAStorage {
visual.onBalanceChanged(balance.getBudget(), new Transaction(Transaction.Type.NOOP, 0, ""), balance.getTotalIncome(), balance.getTotalLoss());
}
- public boolean userRequestQuest() {
+ private boolean nextQuest() {
if (quests.size() >= MAX_QUESTS) return false;
if (!questGenerator.hasMoreElements()) {
@@ -174,6 +181,10 @@ public class WhatAStorage {
return true;
}
+ public boolean userRequestQuest() {
+ return nextQuest();
+ }
+
public void userAbandonQuest(int index) {
if (index >= quests.size()) {
Util.LOGGER.log(Level.SEVERE, "Attempted to abandon non-existent quest!");
@@ -184,6 +195,8 @@ public class WhatAStorage {
addTransaction(Transaction.Type.ABANDON, -quest.getReward(), quest.getProduct());
visual.onQuestRemoved(index);
+
+ if (options.getAutoRefillQuests()) nextQuest();
}
public boolean canStoreProduct(@Nullable Product product, int x, int y) {
@@ -209,6 +222,8 @@ public class WhatAStorage {
addTransaction(Transaction.Type.STORE, quest.getReward(), product);
visual.onQuestRemoved(questIndex);
visual.onProductSet(x, y, z, quest.getProduct());
+
+ if (options.getAutoRefillQuests()) nextQuest();
}
}
}
@@ -229,6 +244,8 @@ public class WhatAStorage {
quests.remove(questIndex);
visual.onQuestRemoved(questIndex);
visual.onProductCleared(x, y, z, product);
+
+ if (options.getAutoRefillQuests()) nextQuest();
return true;
}
return false;
@@ -252,8 +269,7 @@ public class WhatAStorage {
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(Transaction.Type.STORE, quests.get(in).getReward(), product);
- addTransaction(Transaction.Type.DELIVER, quests.get(out).getReward(), product);
+ addTransaction(Transaction.Type.RESOLVE, quests.get(in).getReward() + quests.get(out).getReward(), product);
if (out > in) out--;
quests.remove(in);
@@ -261,6 +277,11 @@ public class WhatAStorage {
visual.onQuestRemoved(in);
visual.onQuestRemoved(out);
+
+ if (options.getAutoRefillQuests()) {
+ nextQuest();
+ nextQuest();
+ }
return true;
}
}
diff --git a/src/main/java/de/siphalor/was/game/Transaction.java b/src/main/java/de/siphalor/was/game/Transaction.java
index 75b9d75..6c697d6 100644
--- a/src/main/java/de/siphalor/was/game/Transaction.java
+++ b/src/main/java/de/siphalor/was/game/Transaction.java
@@ -30,7 +30,7 @@ public class Transaction {
}
public enum Type {
- ABANDON, DESTROY, MOVE, NOOP, DELIVER, STORE;
+ ABANDON, DESTROY, MOVE, NOOP, DELIVER, STORE, RESOLVE;
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 39cf1e1..bc36092 100644
--- a/src/main/java/de/siphalor/was/visual/CanvasVisual.java
+++ b/src/main/java/de/siphalor/was/visual/CanvasVisual.java
@@ -149,6 +149,11 @@ public class CanvasVisual implements Visual {
frame.dispose();
}
+ @Override
+ public void onGameStart() {
+
+ }
+
@Override
public void onScheduleStop() {
diff --git a/src/main/java/de/siphalor/was/visual/JFXVisual.java b/src/main/java/de/siphalor/was/visual/JFXVisual.java
index 482c91a..c3e4cf8 100644
--- a/src/main/java/de/siphalor/was/visual/JFXVisual.java
+++ b/src/main/java/de/siphalor/was/visual/JFXVisual.java
@@ -10,7 +10,7 @@ import de.siphalor.was.content.resource.Resource;
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.GameController;
import de.siphalor.was.visual.jfx.controller.OptionsController;
import de.siphalor.was.visual.jfx.controller.QuestController;
import de.siphalor.was.visual.jfx.util.JFXUtil;
@@ -41,7 +41,7 @@ public class JFXVisual extends Application implements Visual {
private static Stage primaryStage;
private static Scene gameScene;
- private static MainController gameController;
+ private static GameController gameController;
private static GridPane storageGrid;
private static JFXStorageSlot[][] storageSlots;
@@ -78,6 +78,11 @@ public class JFXVisual extends Application implements Visual {
launch();
}
+ @Override
+ public void onGameStart() {
+ changeScene(gameScene);
+ }
+
@Override
public void onScheduleStop() {
primaryStage.close();
@@ -100,6 +105,19 @@ public class JFXVisual extends Application implements Visual {
if (balanceController != null) {
balanceController.onBalanceChanged(budget, transaction, totalIncome, totalLoss);
}
+
+ if (transaction.getChange() != 0) {
+ gameController.budgetChangeLabel.getStyleClass().clear();
+ if (transaction.getChange() > 0) {
+ JFXUtil.setStyleClass(gameController.budgetChangeLabel, "green", true);
+ gameController.budgetChangeLabel.setText(i18n.format("game.budget.change.income", transaction.getChange()));
+ } else {
+ JFXUtil.setStyleClass(gameController.budgetChangeLabel, "red", true);
+ gameController.budgetChangeLabel.setText(i18n.format("game.budget.change.loss", transaction.getChange()));
+ }
+ gameController.budgetChangeLabel.setOpacity(1D);
+ gameController.budgetChangeTransition.playFromStart();
+ }
}
@Override
@@ -117,7 +135,7 @@ public class JFXVisual extends Application implements Visual {
}
@Override
- public void start(Stage primaryStage) throws Exception {
+ public void start(Stage primaryStage) {
JFXVisual.primaryStage = primaryStage;
primaryStage.setTitle(WhatAStorage.TITLE);
primaryStage.setMinWidth(850);
@@ -131,17 +149,17 @@ public class JFXVisual extends Application implements Visual {
balanceStage.hide();
});
- changeScene(gameScene);
-
- primaryStage.show();
+ WhatAStorage.getInstance().startGame();
}
private void changeScene(Scene nextScene) {
primaryStage.setScene(nextScene);
+ if (!primaryStage.isShowing())
+ primaryStage.show();
}
public void loadGameScene() {
- gameController = new MainController(WhatAStorage.getInstance());
+ gameController = new GameController(WhatAStorage.getInstance());
gameScene = JFXUtil.loadScene("game", gameController, I18n.getInstance());
@@ -214,7 +232,7 @@ public class JFXVisual extends Application implements Visual {
loader.setController(questController);
Parent parent = loader.load(is);
- FadeTransition transition = new FadeTransition(Duration.millis(250), parent);
+ FadeTransition transition = new FadeTransition(Duration.millis(750), parent);
transition.setFromValue(0D);
transition.setByValue(1D);
transition.setInterpolator(Interpolator.EASE_OUT);
diff --git a/src/main/java/de/siphalor/was/visual/Visual.java b/src/main/java/de/siphalor/was/visual/Visual.java
index 1791fa5..b7f7539 100644
--- a/src/main/java/de/siphalor/was/visual/Visual.java
+++ b/src/main/java/de/siphalor/was/visual/Visual.java
@@ -8,6 +8,7 @@ import de.siphalor.was.game.Transaction;
public interface Visual {
void setup(WhatAStorage whatAStorage);
void run();
+ void onGameStart();
void onScheduleStop();
void invalidateI18n();
diff --git a/src/main/java/de/siphalor/was/visual/jfx/controller/MainController.java b/src/main/java/de/siphalor/was/visual/jfx/controller/GameController.java
similarity index 79%
rename from src/main/java/de/siphalor/was/visual/jfx/controller/MainController.java
rename to src/main/java/de/siphalor/was/visual/jfx/controller/GameController.java
index 4159958..fc200fb 100644
--- a/src/main/java/de/siphalor/was/visual/jfx/controller/MainController.java
+++ b/src/main/java/de/siphalor/was/visual/jfx/controller/GameController.java
@@ -3,6 +3,8 @@ package de.siphalor.was.visual.jfx.controller;
import de.siphalor.was.WhatAStorage;
import de.siphalor.was.assets.AssetsManager;
import de.siphalor.was.visual.jfx.util.DraggedProduct;
+import javafx.animation.FadeTransition;
+import javafx.animation.Interpolator;
import javafx.fxml.FXML;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
@@ -12,12 +14,14 @@ import javafx.scene.input.DragEvent;
import javafx.scene.input.TransferMode;
import javafx.scene.layout.Pane;
import javafx.scene.layout.VBox;
+import javafx.util.Duration;
@SuppressWarnings("unused")
-public class MainController {
+public class GameController {
private final WhatAStorage was;
public Label budgetLabel;
+ public Label budgetChangeLabel;
public Button balanceButton;
public Button optionsButton;
@@ -28,10 +32,21 @@ public class MainController {
public VBox questBox;
public Button nextQuestButton;
- public MainController(WhatAStorage was) {
+ public FadeTransition budgetChangeTransition;
+
+ public GameController(WhatAStorage was) {
this.was = was;
}
+ @FXML
+ private void initialize() {
+ budgetChangeTransition = new FadeTransition(Duration.millis(1000), budgetChangeLabel);
+ budgetChangeTransition.setDelay(Duration.millis(250));
+ budgetChangeTransition.setFromValue(1D);
+ budgetChangeTransition.setByValue(-1D);
+ budgetChangeTransition.setInterpolator(Interpolator.EASE_BOTH);
+ }
+
@FXML
private void scheduleStop() {
was.scheduleStop();
diff --git a/src/main/resources/assets/jfx/game.fxml b/src/main/resources/assets/jfx/game.fxml
index 9cad3f8..218c864 100644
--- a/src/main/resources/assets/jfx/game.fxml
+++ b/src/main/resources/assets/jfx/game.fxml
@@ -30,6 +30,14 @@
+
diff --git a/src/main/resources/content/lang/de_de.properties b/src/main/resources/content/lang/de_de.properties
index a97dfb1..79e2f7f 100644
--- a/src/main/resources/content/lang/de_de.properties
+++ b/src/main/resources/content/lang/de_de.properties
@@ -2,24 +2,27 @@ test.hello-world = Hallo Welt!
menu.back = Zur\u00fcck
menu.options = 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
+game.budget.change.income = +%d\u20ac
+game.budget.change.loss = %d\u20ac
game.quit = Spiel beenden
game.quests = Auftr\u00e4ge
game.quests.next = N\u00e4chster Auftrag
game.quest.reward = %d\u20ac
game.trash = M\u00fclltonne
-game.trash.hover = Zerst\u00f6ren
+game.trash.hover = Produkte zerst\u00f6ren oder Auftr\u00e4ge aufgeben
game.storage = Lager
game.storage.empty = Leer
game.balance = Bilanz
game.balance.history = Buchungen
game.balance.history.no-data = Noch keine Buchungen
-game.balance.history.index =
+game.balance.history.index =
game.balance.history.change = Wert in \u20ac
game.balance.history.type = Beschreibung
game.balance.history.type.abandon = Auftrag abgelehnt
@@ -28,6 +31,7 @@ game.balance.history.type.move = Produkt bewegt
game.balance.history.type.noop = NOOP
game.balance.history.type.deliver = Produkt ausgelagert
game.balance.history.type.store = Produkt eingelagert
+game.balance.history.type.resolve = Zwei Auftr\u00e4ge miteinander aufgel\u00f6st
game.balance.history.product = Produkt
game.balance.chart = Bilanz
game.balance.chart.line = Budget
diff --git a/src/main/resources/content/lang/en_us.properties b/src/main/resources/content/lang/en_us.properties
index 3fd15ea..1e74c35 100644
--- a/src/main/resources/content/lang/en_us.properties
+++ b/src/main/resources/content/lang/en_us.properties
@@ -11,12 +11,14 @@ menu.options.gameplay.quest-resolving = Allow quest resolving
menu.options.gameplay.auto-quest-refill = Automatically refill quests
game.budget = Budget: %d$
+game.budget.change.income = +%d$
+game.budget.change.loss = %d$
game.quit = Quit Game
game.quests = Quests
game.quests.next = Next Quest
game.quest.reward = %d$
game.trash = Recycle Bin
-game.trash.hover = Destroy\n%d$
+game.trash.hover = Destroy products or abandon quests
game.storage = Storage
game.storage.empty = Empty
game.balance = Balance
@@ -31,6 +33,7 @@ game.balance.history.type.move = Product moved
game.balance.history.type.noop = NOOP
game.balance.history.type.deliver = Product delivered
game.balance.history.type.store = Product stored
+game.balance.history.type.resolve = Resolved two quests against each other
game.balance.history.product = Product
game.balance.chart = Balance
game.balance.chart.line = Budget
diff --git a/src/test/java/de/siphalor/was/dummy/DummyVisual.java b/src/test/java/de/siphalor/was/dummy/DummyVisual.java
index 13f4380..fad0a8d 100644
--- a/src/test/java/de/siphalor/was/dummy/DummyVisual.java
+++ b/src/test/java/de/siphalor/was/dummy/DummyVisual.java
@@ -17,6 +17,11 @@ public class DummyVisual implements Visual {
}
+ @Override
+ public void onGameStart() {
+
+ }
+
@Override
public void onScheduleStop() {