Browse Source

WIP adding image

Ondřej Schlaichert 8 tháng trước cách đây
mục cha
commit
348976c039

+ 1 - 0
src/main/java/eu/oschl/gui/ActionProcessor.java

@@ -29,6 +29,7 @@ public class ActionProcessor extends Observable {
             new Explore(game),
             new Slay(game),
             new PressButton(game),
+            new TakeItem(game),
             new Enter(game)
         ));
 

+ 56 - 29
src/main/java/eu/oschl/gui/GameController.java

@@ -1,9 +1,6 @@
 package eu.oschl.gui;
 
-import eu.oschl.gui.actions.Action;
-import eu.oschl.gui.actions.Enter;
-import eu.oschl.gui.actions.PressButton;
-import eu.oschl.gui.actions.Slay;
+import eu.oschl.gui.actions.*;
 import eu.oschl.gui.exceptions.InvalidActionId;
 import javafx.event.ActionEvent;
 import javafx.fxml.FXML;
@@ -50,49 +47,79 @@ public class GameController implements Observer {
         var newButtons = new ArrayList<Button>();
 
         for (Action action : Session.getActionProcessor().getActions()) {
-            if (action instanceof Enter) {
-                var passages = Session.getGame().getCurrentRoom().getPassages();
+            switch (action) {
+                case Enter enter -> {
+                    var room = Session.getGame().getCurrentRoom();
+                    var passages = room.getPassages();
 
-                for (var passage : passages) {
-                    var label = action.getName() + " " + passage.getName() + " (>> " + passage.getOtherRoom(Session.getGame().getCurrentRoom()).getName() + ")";
-                    var buttonData = new ButtonData(action.getId(), passage.getName());
+                    for (var passage : passages) {
+                        var label = passage.isSeeThrough() || passage.getOtherRoom(room).wasEntered()
+                                ? enter.getName() + " " + passage.getName() + " (>> " + passage.getOtherRoom(Session.getGame().getCurrentRoom()).getName() + ")"
+                                : enter.getName() + " " + passage.getName() + " (>> ???)";
+                        var buttonData = new ButtonData(enter.getId(), passage.getName());
 
-                    var button = createActionButton(label, buttonData);
+                        var button = createActionButton(label, buttonData);
+
+                        button.getStyleClass().add("enter-button");
+
+                        newButtons.add(button);
+                    }
+                }
+                case PressButton pressButton -> {
+                    if (Session.getGame().getCurrentRoom().isBlockedByEnemy()) {
+                        continue;
+                    }
 
-                    button.getStyleClass().add("enter-button");
+                    var objects = Session.getGame().getCurrentRoom().getObjects();
 
-                    newButtons.add(button);
+                    for (var object : objects) {
+                        if (object instanceof eu.oschl.textadventure.objects.Button) {
+                            var label = pressButton.getName() + " " + object.getName();
+                            var buttonData = new ButtonData(pressButton.getId(), object.getName());
+
+                            var button = createActionButton(label, buttonData);
+
+                            button.getStyleClass().add("press-button");
+
+                            newButtons.add(button);
+                        }
+                    }
                 }
-            } else if (action instanceof PressButton) {
-                var objects = Session.getGame().getCurrentRoom().getObjects();
+                case Slay slay -> {
+                    var enemy = Session.getGame().getCurrentRoom().getEnemy();
 
-                for (var object : objects) {
-                    if (object instanceof eu.oschl.textadventure.objects.Button) {
-                        var label = action.getName() + " " + object.getName();
-                        var buttonData = new ButtonData(action.getId(), object.getName());
+                    if (enemy.isPresent() && enemy.get().isAlive()) {
+                        var label = slay.getName() + " " + enemy.get().getName();
+                        var buttonData = new ButtonData(slay.getId(), enemy.get().getName());
 
                         var button = createActionButton(label, buttonData);
 
-                        button.getStyleClass().add("press-button");
+                        button.getStyleClass().add("slay-button");
 
                         newButtons.add(button);
                     }
                 }
-            } else if (action instanceof Slay) {
-                var enemy = Session.getGame().getCurrentRoom().getEnemy();
+                case TakeItem takeItem -> {
+                    if (Session.getGame().getCurrentRoom().isBlockedByEnemy()) {
+                        continue;
+                    }
+
+                    var objects = Session.getGame().getCurrentRoom().getObjects();
 
-                if (enemy.isPresent() && enemy.get().isAlive()) {
-                    var label = action.getName() + " " + enemy.get().getName();
-                    var buttonData = new ButtonData(action.getId(), enemy.get().getName());
+                    for (var object : objects) {
+                        if (object instanceof eu.oschl.textadventure.objects.PickableObject) {
+                            var label = takeItem.getName() + " " + object.getName();
+                            var buttonData = new ButtonData(takeItem.getId(), object.getName());
 
-                    var button = createActionButton(label, buttonData);
+                            var button = createActionButton(label, buttonData);
 
-                    button.getStyleClass().add("slay-button");
+                            button.getStyleClass().add("take-button");
 
-                    newButtons.add(button);
+                            newButtons.add(button);
+                        }
+                    }
                 }
-            } else {
-                newButtons.add(createActionButton(action.getName(), new ButtonData(action.getId())));
+                default -> newButtons.add(createActionButton(action.getName(), new ButtonData(action.getId())));
             }
         }
 

+ 72 - 0
src/main/java/eu/oschl/gui/actions/TakeItem.java

@@ -0,0 +1,72 @@
+package eu.oschl.gui.actions;
+
+import eu.oschl.gui.Output;
+import eu.oschl.textadventure.Game;
+import eu.oschl.textadventure.objects.PickableObject;
+import eu.oschl.textadventure.objects.Weapon;
+import javafx.scene.paint.Color;
+
+public class TakeItem implements Action {
+    private final Game game;
+
+    public TakeItem(Game game) {
+        this.game = game;
+    }
+
+    @Override
+    public String getId() {
+        return "takeitem";
+    }
+
+    @Override
+    public String getName() {
+        return "Take";
+    }
+
+    @Override
+    public String getDescription() {
+        return "take an item";
+    }
+
+    @Override
+    public void execute(String[] args) {
+        if (game.getCurrentRoom().isBlockedByEnemy()) {
+            Output.print("The way is blocked. It's impossible to pick up items.", Color.RED);
+            return;
+        }
+
+        for (var object : this.game.getCurrentRoom().getObjects()) {
+            if (object.getName().equalsIgnoreCase(String.join(" ", args))) {
+                if (object instanceof PickableObject item) {
+                    var result = item.pickUp();
+
+                    if (item instanceof Weapon) {
+                        if (result) {
+                            Output.print("Weapon ", Color.MAGENTA);
+                            Output.print(item.getName(), Color.MAGENTA);
+                            Output.print(" obtained.", Color.MAGENTA);
+                        } else {
+                            Output.print("This weapon is weaker than the current one.", Color.RED);
+                        }
+                    } else {
+                        if (result) {
+                            Output.print("Item ", Color.MAGENTA);
+                            Output.print(item.getName(), Color.MAGENTA);
+                            Output.print(" added to inventory.", Color.MAGENTA);
+                        } else {
+                            Output.print("Carrying too many items.", Color.MAGENTA);
+                        }
+                    }
+
+                } else {
+                    Output.print("Can't pick up ", Color.RED);
+                    Output.print(object.getName(), Color.MAGENTA);
+                    Output.print(".", Color.RED);
+                }
+                return;
+            }
+        }
+
+        Output.print("That item is not here.", Color.RED);
+    }
+}

+ 4 - 0
src/main/resources/eu/oschl/gui/css/style.css

@@ -54,6 +54,10 @@
 	-fx-background-color: #2b1416 !important;
 }
 
+.take-button {
+	-fx-background-color: #1e142b !important;
+}
+
 .button:hover {
 	-fx-background-color: #333333;
 	-fx-border-color: #777777;

+ 42 - 21
src/main/resources/eu/oschl/gui/game.fxml

@@ -1,7 +1,4 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
 <?import javafx.geometry.Insets?>
-<?import javafx.scene.control.Button?>
 <?import javafx.scene.control.ScrollPane?>
 <?import javafx.scene.layout.ColumnConstraints?>
 <?import javafx.scene.layout.GridPane?>
@@ -9,39 +6,63 @@
 <?import javafx.scene.layout.VBox?>
 <?import javafx.scene.text.TextFlow?>
 
+<?import javafx.scene.layout.StackPane?>
+<?import javafx.scene.image.ImageView?>
+<?import javafx.scene.image.Image?>
 <GridPane fx:controller="eu.oschl.gui.GameController"
           xmlns:fx="http://javafx.com/fxml/1"
           xmlns="http://javafx.com/javafx/25">
-
     <columnConstraints>
         <ColumnConstraints hgrow="ALWAYS"/>
     </columnConstraints>
 
     <rowConstraints>
-        <RowConstraints minHeight="10.0" vgrow="ALWAYS" percentHeight="75.0" />
-        <RowConstraints minHeight="10.0" vgrow="ALWAYS" percentHeight="25.0" />
+        <RowConstraints minHeight="10.0" vgrow="ALWAYS" percentHeight="75.0"/>
+        <RowConstraints minHeight="10.0" vgrow="ALWAYS" percentHeight="25.0"/>
     </rowConstraints>
 
-    <ScrollPane fitToWidth="true" hbarPolicy="NEVER">
-        <TextFlow fx:id="output">
-            <padding>
-                <Insets top="10.0" right="10.0" bottom="10.0" left="10.0"/>
-            </padding>
-        </TextFlow>
-    </ScrollPane>
+    <GridPane>
+        <columnConstraints>
+            <ColumnConstraints minWidth="10.0" hgrow="ALWAYS" percentWidth="75.0"/>
+            <ColumnConstraints minWidth="10.0" hgrow="ALWAYS" percentWidth="25.0"/>
+        </columnConstraints>
 
-    <ScrollPane fitToWidth="true" GridPane.rowIndex="1">
-        <VBox fx:id="inputButtonContainer" spacing="5.0">
+        <rowConstraints>
+            <RowConstraints vgrow="ALWAYS"/>
+        </rowConstraints>
+
+        <ScrollPane fitToWidth="true" hbarPolicy="NEVER">
+            <TextFlow fx:id="output">
+                <padding>
+                    <Insets top="10.0" right="10.0" bottom="10.0" left="10.0"/>
+                </padding>
+            </TextFlow>
+        </ScrollPane>
+        <GridPane>
+            <columnConstraints>
+                <ColumnConstraints hgrow="ALWAYS"/>
+            </columnConstraints>
+
+            <rowConstraints>
+                <RowConstraints minHeight="10.0" vgrow="ALWAYS" percentHeight="50.0"/>
+                <RowConstraints minHeight="10.0" vgrow="ALWAYS" percentHeight="50.0"/>
+            </rowConstraints>
+
+            <ImageView p11reserveRatio="true">
+                <Image url="@images/rooms/well.png"/>
+            </ImageView>
 
-<!--            <Button maxWidth="1.7976931348623157E308" mnemonicParsing="false" text="Button 1" onAction="#onTestButtonClick"/>-->
-<!--            <Button maxWidth="1.7976931348623157E308" mnemonicParsing="false" text="Button 2" onAction="#onTestButtonClick"/>-->
-<!--            <Button maxWidth="1.7976931348623157E308" mnemonicParsing="false" text="Button 3" onAction="#onTestButtonClick"/>-->
-<!--            <Button maxWidth="1.7976931348623157E308" mnemonicParsing="false" text="Button 4" onAction="#onTestButtonClick"/>-->
-<!--            <Button maxWidth="1.7976931348623157E308" mnemonicParsing="false" text="Button 5" onAction="#onTestButtonClick"/>-->
+            <GridPane>
 
+            </GridPane>
+        </GridPane>
+    </GridPane>
+
+    <ScrollPane fitToWidth="true" GridPane.rowIndex="1">
+        <VBox fx:id="inputButtonContainer" spacing="5.0">
             <padding>
                 <Insets top="10.0" right="10.0" bottom="10.0" left="10.0"/>
             </padding>
         </VBox>
     </ScrollPane>
-</GridPane>
+</GridPane> 

BIN
src/main/resources/eu/oschl/gui/images/rooms/well.png