From 3df3c16cce925cc5a5ece7ade9e546ea66c21a1c Mon Sep 17 00:00:00 2001 From: Siphalor Date: Fri, 24 Jul 2020 15:20:56 +0200 Subject: [PATCH] Add preview for valid targets --- .../java/de/siphalor/was/game/Options.java | 14 ++++++ .../de/siphalor/was/visual/JFXVisual.java | 47 +++++++++++++++++++ .../visual/jfx/controller/GameController.java | 3 ++ .../jfx/controller/OptionsController.java | 3 ++ .../jfx/controller/QuestController.java | 10 ++++ .../was/visual/jfx/util/JFXStorageSlot.java | 5 ++ src/main/resources/assets/jfx/main.css | 7 ++- src/main/resources/assets/jfx/options.fxml | 27 +++++------ .../resources/assets/jfx/quest_widget.fxml | 12 ++--- .../resources/content/lang/de_de.properties | 1 + .../resources/content/lang/en_us.properties | 1 + 11 files changed, 107 insertions(+), 23 deletions(-) diff --git a/src/main/java/de/siphalor/was/game/Options.java b/src/main/java/de/siphalor/was/game/Options.java index 23ef1a7..61ea0b4 100644 --- a/src/main/java/de/siphalor/was/game/Options.java +++ b/src/main/java/de/siphalor/was/game/Options.java @@ -10,6 +10,10 @@ import java.util.prefs.Preferences; * Holds the game's options and is responsible for saving and loading them. */ public class Options { + /** + * Whether valid targets for quests/products should be highlighted + */ + private boolean previewValidTargets; /** * Whether quest should get automatically added when fulfilled */ @@ -71,6 +75,14 @@ public class Options { this.soundEnabled = soundEnabled; } + public boolean getPreviewValidTargets() { + return previewValidTargets; + } + + public void setPreviewValidTargets(boolean previewValidTargets) { + this.previewValidTargets = previewValidTargets; + } + /** * Gets a reference to the preferences object used for session independent storage. * @return The preferences object @@ -84,6 +96,7 @@ public class Options { */ public void load() { Preferences preferences = getPreferences(); + previewValidTargets = preferences.getBoolean("preview-valid-targets", true); autoRefillQuests = preferences.getBoolean("auto-refill-quests", false); allowQuestResolving = preferences.getBoolean("allow-quest-resolving", true); soundEnabled = preferences.getBoolean("sound-enabled", false); @@ -97,6 +110,7 @@ public class Options { */ public void save() { Preferences preferences = getPreferences(); + preferences.putBoolean("preview-valid-targets", previewValidTargets); preferences.putBoolean("auto-refill-quests", autoRefillQuests); preferences.putBoolean("allow-quest-resolving", allowQuestResolving); preferences.putBoolean("sound-enabled", soundEnabled); diff --git a/src/main/java/de/siphalor/was/visual/JFXVisual.java b/src/main/java/de/siphalor/was/visual/JFXVisual.java index e078567..a799799 100644 --- a/src/main/java/de/siphalor/was/visual/JFXVisual.java +++ b/src/main/java/de/siphalor/was/visual/JFXVisual.java @@ -44,6 +44,7 @@ public class JFXVisual extends Application implements Visual { private static GameController gameController; private static JFXStorageSlot[][] storageSlots; private static int width, height, depth; + private static int currentQuestPreview = -1; private static Scene optionsScene; private static OptionsController optionsController; @@ -370,4 +371,50 @@ public class JFXVisual extends Application implements Visual { slot.getImages()[dz].setTooltip(null); GridPane.setConstraints(slot.getImages()[dz], GridPane.getColumnIndex(slot.getImages()[dz]), dz, 1, 1); } + + public static void previewQuestSources(int questIndex) { + WhatAStorage instance = WhatAStorage.getInstance(); + + if (currentQuestPreview == questIndex) { + clearPreviews(); + } else { + for (int x = 0; x < storageSlots.length; x++) { + for (int y = 0; y < storageSlots.length; y++) { + JFXUtil.setStyleClass(storageSlots[y][x].getGrid(), "preview", instance.canDeliverProduct(questIndex, x, y)); + } + } + } + } + + public static void previewQuestTargets(int questIndex) { + WhatAStorage instance = WhatAStorage.getInstance(); + + if (instance.getOptions().getPreviewValidTargets()) { + for (int x = 0; x < storageSlots.length; x++) { + for (int y = 0; y < storageSlots.length; y++) { + JFXUtil.setStyleClass(storageSlots[y][x].getGrid(), "preview", instance.canStoreProduct(questIndex, x, y)); + } + } + } + } + + public static void previewStorageTargets(int sx, int sy) { + WhatAStorage instance = WhatAStorage.getInstance(); + + if (instance.getOptions().getPreviewValidTargets()) { + for (int x = 0; x < storageSlots.length; x++) { + for (int y = 0; y < storageSlots.length; y++) { + JFXUtil.setStyleClass(storageSlots[y][x].getGrid(), "preview", instance.canMoveProduct(sx, sy, x, y)); + } + } + } + } + + public static void clearPreviews() { + for (int x = 0; x < storageSlots.length; x++) { + for (JFXStorageSlot[] storageSlot : storageSlots) { + JFXUtil.setStyleClass(storageSlot[x].getGrid(), "preview", false); + } + } + } } 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 76d2608..7aeb73f 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 @@ -2,6 +2,7 @@ package de.siphalor.was.visual.jfx.controller; import de.siphalor.was.WhatAStorage; import de.siphalor.was.assets.AssetsManager; +import de.siphalor.was.visual.JFXVisual; import de.siphalor.was.visual.jfx.util.DraggedProduct; import de.siphalor.was.visual.jfx.util.JFXUtil; import javafx.animation.FadeTransition; @@ -90,6 +91,7 @@ public class GameController { dragEvent.consume(); JFXUtil.playAudio("destroy"); + JFXVisual.clearPreviews(); return; } else if (origin instanceof DraggedProduct.Slot) { was.userDestroyProduct(((DraggedProduct.Slot) origin).x, ((DraggedProduct.Slot) origin).y); @@ -97,6 +99,7 @@ public class GameController { dragEvent.setDropCompleted(true); dragEvent.consume(); JFXUtil.playAudio("destroy"); + JFXVisual.clearPreviews(); return; } } 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 09b34d6..6de38c8 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 @@ -17,6 +17,7 @@ public class OptionsController { public ToggleButton soundsEnabledToggle; public ToggleButton allowQuestResolvingToggle; public ToggleButton autoQuestRefillToggle; + public ToggleButton previewValidTargetsToggle; public void beforeOpen(@NotNull Runnable exitRunnable) { Options options = WhatAStorage.getInstance().getOptions(); @@ -39,6 +40,7 @@ public class OptionsController { soundsEnabledToggle.setSelected(options.getSoundEnabled()); allowQuestResolvingToggle.setSelected(options.getAllowQuestResolving()); autoQuestRefillToggle.setSelected(options.getAutoRefillQuests()); + previewValidTargetsToggle.setSelected(options.getPreviewValidTargets()); } @FXML @@ -50,6 +52,7 @@ public class OptionsController { options.setSoundEnabled(soundsEnabledToggle.isSelected()); options.setAllowQuestResolving(allowQuestResolvingToggle.isSelected()); options.setAutoRefillQuests(autoQuestRefillToggle.isSelected()); + options.setPreviewValidTargets(previewValidTargetsToggle.isSelected()); options.save(); 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 7b3b157..68c9eaa 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 @@ -2,6 +2,7 @@ package de.siphalor.was.visual.jfx.controller; import de.siphalor.was.WhatAStorage; import de.siphalor.was.content.quest.Quest; +import de.siphalor.was.visual.JFXVisual; import de.siphalor.was.visual.jfx.util.DraggedProduct; import de.siphalor.was.visual.jfx.util.JFXUtil; import javafx.fxml.FXML; @@ -32,6 +33,11 @@ public class QuestController { WhatAStorage.getInstance().userAbandonQuest(getIndex()); } + @FXML + private void onPreviewRequest() { + JFXVisual.previewQuestSources(getIndex()); + } + private boolean canDropHere(DragEvent dragEvent) { if (type != Quest.Type.OUT) { return false; @@ -60,6 +66,8 @@ public class QuestController { ClipboardContent content = new ClipboardContent(); content.put(DraggedProduct.FORMAT, new DraggedProduct.Quest(getIndex())); dragboard.setContent(content); + + JFXVisual.previewQuestTargets(getIndex()); } event.consume(); @@ -93,6 +101,7 @@ public class QuestController { if (WhatAStorage.getInstance().userDeliverProduct(getIndex(), slot.x, slot.y)) { dragEvent.setDropCompleted(true); dragEvent.consume(); + JFXVisual.clearPreviews(); return; } } else if (product instanceof DraggedProduct.Quest) { @@ -100,6 +109,7 @@ public class QuestController { if (WhatAStorage.getInstance().userResolveQuests(quest.index, getIndex())) { dragEvent.setDropCompleted(true); dragEvent.consume(); + JFXVisual.clearPreviews(); return; } } diff --git a/src/main/java/de/siphalor/was/visual/jfx/util/JFXStorageSlot.java b/src/main/java/de/siphalor/was/visual/jfx/util/JFXStorageSlot.java index 44aded5..81dbe66 100644 --- a/src/main/java/de/siphalor/was/visual/jfx/util/JFXStorageSlot.java +++ b/src/main/java/de/siphalor/was/visual/jfx/util/JFXStorageSlot.java @@ -2,6 +2,7 @@ package de.siphalor.was.visual.jfx.util; import de.siphalor.was.WhatAStorage; import de.siphalor.was.content.lang.I18n; +import de.siphalor.was.visual.JFXVisual; import de.siphalor.was.visual.jfx.component.ScalingImagePane; import javafx.geometry.HPos; import javafx.geometry.VPos; @@ -115,6 +116,8 @@ public class JFXStorageSlot { content.put(DraggedProduct.FORMAT, new DraggedProduct.Slot(x, y)); dragboard.setContent(content); + JFXVisual.previewStorageTargets(x, y); + event.consume(); } @@ -140,12 +143,14 @@ public class JFXStorageSlot { WhatAStorage.getInstance().userStoreProduct(((DraggedProduct.Quest) origin).index, x, y); dragEvent.setDropCompleted(true); JFXUtil.playAudio("place"); + JFXVisual.clearPreviews(); return; } else if (origin instanceof DraggedProduct.Slot) { DraggedProduct.Slot slot = (DraggedProduct.Slot) origin; WhatAStorage.getInstance().userMoveProduct(slot.x, slot.y, x, y); dragEvent.setDropCompleted(true); JFXUtil.playAudio("place"); + JFXVisual.clearPreviews(); return; } } diff --git a/src/main/resources/assets/jfx/main.css b/src/main/resources/assets/jfx/main.css index 6fcace2..a2eac7c 100644 --- a/src/main/resources/assets/jfx/main.css +++ b/src/main/resources/assets/jfx/main.css @@ -132,8 +132,13 @@ Label.green { -fx-background-color: #dddddd; } +#storage-grid > .preview { + -fx-border-color: #aaaaaa; + -fx-background-insets: 1; + -fx-padding: -1; +} #storage-grid > .drop-hover { - -fx-background-color: #eeeeee; + -fx-background-color: #dddddd; } .storage-slot-item-title { -fx-padding: 0 0 0 5; diff --git a/src/main/resources/assets/jfx/options.fxml b/src/main/resources/assets/jfx/options.fxml index 6b9fc8d..53d8bbb 100644 --- a/src/main/resources/assets/jfx/options.fxml +++ b/src/main/resources/assets/jfx/options.fxml @@ -1,18 +1,10 @@ - - - - - - - - - - - + + + - + @@ -34,6 +26,7 @@ + @@ -47,12 +40,14 @@ diff --git a/src/main/resources/assets/jfx/quest_widget.fxml b/src/main/resources/assets/jfx/quest_widget.fxml index 7006dbc..d1c96d9 100644 --- a/src/main/resources/assets/jfx/quest_widget.fxml +++ b/src/main/resources/assets/jfx/quest_widget.fxml @@ -1,12 +1,12 @@ - - - - + + + - - + + + diff --git a/src/main/resources/content/lang/de_de.properties b/src/main/resources/content/lang/de_de.properties index 54f220e..b3203d0 100644 --- a/src/main/resources/content/lang/de_de.properties +++ b/src/main/resources/content/lang/de_de.properties @@ -7,6 +7,7 @@ menu.options.back = Anwenden und zur\u00fcck menu.options.general = Allgemein menu.options.general.sounds = Geräusche menu.options.gameplay = Spielmechanik +menu.options.gameplay.preview-valid-targets = G\u00fcltige Ablageorte anzeigen (Sieht ein bisschen h\u00e4sslich aus) menu.options.gameplay.quest-resolving = Erlauben Auftr\u00e4ge gegeneinander aufzul\u00f6sen menu.options.gameplay.auto-quest-refill = Automatisch neue Auftr\u00e4ge akzeptieren menu.options.imprint = Impressum diff --git a/src/main/resources/content/lang/en_us.properties b/src/main/resources/content/lang/en_us.properties index 8333b87..aac3aab 100644 --- a/src/main/resources/content/lang/en_us.properties +++ b/src/main/resources/content/lang/en_us.properties @@ -10,6 +10,7 @@ menu.options.back = Apply & Leave menu.options.general = General menu.options.general.sounds = Sounds menu.options.gameplay = Gameplay +menu.options.gameplay.preview-valid-targets = Preview valid targets (It's a bit ugly) menu.options.gameplay.quest-resolving = Allow quest resolving menu.options.gameplay.auto-quest-refill = Automatically refill quests menu.options.imprint = Imprint