|
|
@@ -0,0 +1,96 @@
|
|
|
+package eu.oschl.gui.actions;
|
|
|
+
|
|
|
+import eu.oschl.gui.Output;
|
|
|
+import eu.oschl.textadventure.Game;
|
|
|
+import eu.oschl.textadventure.exceptions.InvalidGameState;
|
|
|
+import eu.oschl.textadventure.map.Passage;
|
|
|
+import javafx.scene.paint.Color;
|
|
|
+
|
|
|
+public class Enter implements Action {
|
|
|
+ private final Game game;
|
|
|
+
|
|
|
+ public Enter(Game game) {
|
|
|
+ this.game = game;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public String getId() {
|
|
|
+ return "enter";
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public String getName() {
|
|
|
+ return "Enter";
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public String getDescription() {
|
|
|
+ return "walk through a passage";
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void execute(String[] args) {
|
|
|
+ String input = String.join(" ", args);
|
|
|
+
|
|
|
+ var passages = this.game.getCurrentRoom().getPassages();
|
|
|
+ Passage passage = null;
|
|
|
+
|
|
|
+ for (Passage p : passages) {
|
|
|
+ if (p.getName().equalsIgnoreCase(input)) {
|
|
|
+ passage = p;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ var printEnterText = !passage.getOtherRoom(game.getCurrentRoom()).wasEntered();
|
|
|
+
|
|
|
+ var result = passage.passThrough(false);
|
|
|
+
|
|
|
+ if (!result) {
|
|
|
+ if (game.getCurrentRoom().getEnemy().isPresent()) {
|
|
|
+ Output.print(
|
|
|
+ game.getCurrentRoom().getEnemy().get().getName() + " blocks the way. It is only possible to go back.",
|
|
|
+ Color.RED
|
|
|
+ );
|
|
|
+ } else if (passage.getBlockage().isPresent()) {
|
|
|
+ Output.print(passage.getBlockage().get().getDescription(), Color.RED);
|
|
|
+ } else {
|
|
|
+ Output.print("The passage is blocked.", Color.RED);
|
|
|
+ }
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ printSuccessfulPassage(printEnterText);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Prints a message indicating that the player has successfully passed through a passage.
|
|
|
+ *
|
|
|
+ * @param printEnterText whether to print the enter text of the current room
|
|
|
+ */
|
|
|
+ private void printSuccessfulPassage(boolean printEnterText) {
|
|
|
+ if (game.getLastPassage().isEmpty()) {
|
|
|
+ throw new InvalidGameState("Last passages stack is empty even though a passage was passed");
|
|
|
+ }
|
|
|
+
|
|
|
+ Output.print("Passed through the ");
|
|
|
+ Output.print(game.getLastPassage().get().getName(), Color.YELLOW);
|
|
|
+ Output.print(" and entered ");
|
|
|
+ Output.print(game.getCurrentRoom().getName(), Color.BLUE);
|
|
|
+ Output.print(".");
|
|
|
+
|
|
|
+ if (game.getCurrentRoom().isBlockedByEnemy()) {
|
|
|
+ Output.printLine();
|
|
|
+ Output.print("...", Color.WHITE);
|
|
|
+ Output.printLine();
|
|
|
+ Output.print("There is somebody in here.", Color.WHITE);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (printEnterText && game.getCurrentRoom().getEnterText().isPresent()) {
|
|
|
+ Output.printLine();
|
|
|
+ Output.printLine();
|
|
|
+ Output.print(game.getCurrentRoom().getEnterText().get());
|
|
|
+ Output.printLine();
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|