diff --git a/src/main/java/de/siphalor/was/WhatAStorage.java b/src/main/java/de/siphalor/was/WhatAStorage.java index b24aaab..3cb2563 100644 --- a/src/main/java/de/siphalor/was/WhatAStorage.java +++ b/src/main/java/de/siphalor/was/WhatAStorage.java @@ -179,6 +179,7 @@ public class WhatAStorage { questManager.clear(); productManager.reload(contentManager); questManager.reload(contentManager, productManager); + questManager.register("random", new RandomQuestGenerator()); Util.LOGGER.log(Level.INFO, "Reloaded game content"); } @@ -203,9 +204,8 @@ public class WhatAStorage { /** * Start a new game. */ - public void startGame() { - //questGenerator = questManager.get("example.test"); - questGenerator = new RandomQuestGenerator(); + public void startGame(String questGen) { + questGenerator = questManager.get(questGen); quests.clear(); storage = new Storage(GRID_SIZE, GRID_SIZE, GRID_SIZE); balance = new Balance(); diff --git a/src/main/java/de/siphalor/was/content/product/ProductManager.java b/src/main/java/de/siphalor/was/content/product/ProductManager.java index 3213b9b..a3ddda8 100644 --- a/src/main/java/de/siphalor/was/content/product/ProductManager.java +++ b/src/main/java/de/siphalor/was/content/product/ProductManager.java @@ -56,6 +56,11 @@ public class ProductManager implements ResourceManager> { return productTypes.get(id); } + @Override + public void register(String id, ProductType value) { + productTypes.put(id, value); + } + /** * Gets all loaded product types. * @return All loaded product types diff --git a/src/main/java/de/siphalor/was/content/quest/QuestManager.java b/src/main/java/de/siphalor/was/content/quest/QuestManager.java index 48b04d8..0221f6a 100644 --- a/src/main/java/de/siphalor/was/content/quest/QuestManager.java +++ b/src/main/java/de/siphalor/was/content/quest/QuestManager.java @@ -9,6 +9,7 @@ import java.io.IOException; import java.io.InputStream; import java.util.HashMap; import java.util.Map; +import java.util.Set; /** * This class handles the loading and access of quest generators. @@ -55,4 +56,17 @@ public class QuestManager implements ResourceManager { public QuestGenerator get(String id) { return questGenerators.get(id); } + + @Override + public void register(String id, QuestGenerator value) { + questGenerators.put(id, value); + } + + /** + * Gets all of the quest ids. + * @return The quest ids + */ + public Set ids() { + return questGenerators.keySet(); + } } diff --git a/src/main/java/de/siphalor/was/util/ResourceManager.java b/src/main/java/de/siphalor/was/util/ResourceManager.java index 1571891..aa54605 100644 --- a/src/main/java/de/siphalor/was/util/ResourceManager.java +++ b/src/main/java/de/siphalor/was/util/ResourceManager.java @@ -16,4 +16,11 @@ public interface ResourceManager { * @return The associated resource */ T get(String id); + + /** + * Registers a new resource. + * @param id The resource's id + * @param value The resource + */ + void register(String id, T value); } diff --git a/src/main/java/de/siphalor/was/visual/ConsoleVisual.java b/src/main/java/de/siphalor/was/visual/ConsoleVisual.java index bba8910..dd12143 100644 --- a/src/main/java/de/siphalor/was/visual/ConsoleVisual.java +++ b/src/main/java/de/siphalor/was/visual/ConsoleVisual.java @@ -50,7 +50,7 @@ public class ConsoleVisual implements Visual { break; } case "start": - was.startGame(); + was.startGame("random"); break; case "exit": was.scheduleStop(); diff --git a/src/main/java/de/siphalor/was/visual/JFXVisual.java b/src/main/java/de/siphalor/was/visual/JFXVisual.java index 0cb8f57..e078567 100644 --- a/src/main/java/de/siphalor/was/visual/JFXVisual.java +++ b/src/main/java/de/siphalor/was/visual/JFXVisual.java @@ -9,10 +9,7 @@ import de.siphalor.was.content.quest.Quest; 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.GameController; -import de.siphalor.was.visual.jfx.controller.OptionsController; -import de.siphalor.was.visual.jfx.controller.QuestController; +import de.siphalor.was.visual.jfx.controller.*; import de.siphalor.was.visual.jfx.util.JFXUtil; import de.siphalor.was.visual.jfx.util.JFXStorageSlot; import javafx.animation.FadeTransition; @@ -40,6 +37,9 @@ public class JFXVisual extends Application implements Visual { private static boolean i18nInvalidated = false; private static Stage primaryStage; + private static Scene mainMenuScene; + private static MainMenuController mainMenuController; + private static Scene gameScene; private static GameController gameController; private static JFXStorageSlot[][] storageSlots; @@ -86,6 +86,7 @@ public class JFXVisual extends Application implements Visual { primaryStage.setMinHeight(500); primaryStage.getIcons().add(JFXUtil.getIcon()); + loadMainMenuScene(); loadOptionsScene(); primaryStage.setOnCloseRequest(event -> { @@ -93,7 +94,7 @@ public class JFXVisual extends Application implements Visual { balanceStage.hide(); }); - WhatAStorage.getInstance().startGame(); + changeScene(mainMenuScene); } private void changeScene(Scene nextScene) { @@ -102,7 +103,25 @@ public class JFXVisual extends Application implements Visual { primaryStage.show(); } - public void loadGameScene() { + private void loadMainMenuScene() { + mainMenuController = new MainMenuController(); + + mainMenuScene = JFXUtil.loadScene("main_menu", mainMenuController, I18n.getInstance()); + + mainMenuController.optionsButton.setOnAction(event -> { + optionsController.beforeOpen(() -> { + if (i18nInvalidated) { + loadOptionsScene(); + loadMainMenuScene(); + i18nInvalidated = false; + } + changeScene(mainMenuScene); + }); + changeScene(optionsScene); + }); + } + + private void loadGameScene() { gameController = new GameController(WhatAStorage.getInstance()); gameScene = JFXUtil.loadScene("game", gameController, I18n.getInstance()); @@ -129,6 +148,14 @@ public class JFXVisual extends Application implements Visual { }); gameController.optionsButton.setOnAction(event -> openOptionsScene()); + + gameController.quitButton.setOnAction(event -> { + changeScene(mainMenuScene); + if (balanceStage != null) { + balanceStage.close(); + balanceStage = null; + } + }); } private void loadOptionsScene() { @@ -162,6 +189,7 @@ public class JFXVisual extends Application implements Visual { WhatAStorage.getInstance().resendVisualGameData(); changeScene(gameScene); loadOptionsScene(); + loadMainMenuScene(); setupBalanceStage(); i18nInvalidated = false; } else { diff --git a/src/main/java/de/siphalor/was/visual/jfx/controller/GameController.java b/src/main/java/de/siphalor/was/visual/jfx/controller/GameController.java index 5fe38ac..76d2608 100644 --- a/src/main/java/de/siphalor/was/visual/jfx/controller/GameController.java +++ b/src/main/java/de/siphalor/was/visual/jfx/controller/GameController.java @@ -25,6 +25,7 @@ public class GameController { public Label budgetChangeLabel; public Button balanceButton; public Button optionsButton; + public Button quitButton; public Pane storagePane; @@ -48,11 +49,6 @@ public class GameController { budgetChangeTransition.setInterpolator(Interpolator.EASE_BOTH); } - @FXML - private void scheduleStop() { - was.scheduleStop(); - } - @FXML private void nextQuest() { was.userRequestQuest(); diff --git a/src/main/java/de/siphalor/was/visual/jfx/controller/MainMenuController.java b/src/main/java/de/siphalor/was/visual/jfx/controller/MainMenuController.java new file mode 100644 index 0000000..babf923 --- /dev/null +++ b/src/main/java/de/siphalor/was/visual/jfx/controller/MainMenuController.java @@ -0,0 +1,45 @@ +package de.siphalor.was.visual.jfx.controller; + +import de.siphalor.was.WhatAStorage; +import de.siphalor.was.content.lang.I18n; +import javafx.collections.ObservableList; +import javafx.fxml.FXML; +import javafx.scene.control.Button; +import javafx.scene.control.ListCell; +import javafx.scene.control.ListView; +import javafx.scene.control.SelectionMode; + +import java.util.stream.Collectors; + +public class MainMenuController { + public ListView questSelection; + public Button optionsButton; + + @FXML + private void initialize() { + I18n i18n = I18n.getInstance(); + questSelection.setCellFactory(param -> new ListCell<>(){ + @Override + protected void updateItem(String item, boolean empty) { + super.updateItem(item, empty); + if (empty) { + setText(null); + } else { + setText(i18n.getString("quests." + item) + " (" + i18n.getString("quests." + item + ".description") + ")"); + } + } + }); + + ObservableList items = questSelection.getItems(); + items.clear(); + items.addAll(WhatAStorage.getInstance().getQuestManager().ids().stream().sorted().collect(Collectors.toList())); + questSelection.getSelectionModel().selectIndices(0); + questSelection.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE); + } + + @FXML + private void startGame() { + String selectedItem = questSelection.getSelectionModel().getSelectedItem(); + WhatAStorage.getInstance().startGame(selectedItem); + } +} diff --git a/src/main/resources/assets/jfx/game.fxml b/src/main/resources/assets/jfx/game.fxml index c6a85f5..7f4c7bf 100644 --- a/src/main/resources/assets/jfx/game.fxml +++ b/src/main/resources/assets/jfx/game.fxml @@ -47,7 +47,7 @@ - + + + diff --git a/src/main/resources/assets/jfx/options.fxml b/src/main/resources/assets/jfx/options.fxml index f78e9e6..6b9fc8d 100644 --- a/src/main/resources/assets/jfx/options.fxml +++ b/src/main/resources/assets/jfx/options.fxml @@ -50,9 +50,9 @@