| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162 |
- package eu.oschl.gui;
- import eu.oschl.gui.actions.*;
- import eu.oschl.gui.exceptions.InvalidActionId;
- import javafx.event.ActionEvent;
- import javafx.fxml.FXML;
- import javafx.scene.control.Button;
- import javafx.scene.layout.VBox;
- import javafx.scene.text.TextFlow;
- import java.util.ArrayList;
- public class GameController implements Observer {
- @FXML
- private TextFlow output;
- @FXML
- private VBox inputButtonContainer;
- @FXML
- private VBox inventoryContainer;
- @FXML
- public void initialize() {
- Output.setOutputElement(output);
- Session.getActionProcessor().register(this);
- update();
- Output.print(Session.getGame().getPrologue());
- }
- @FXML
- private void exectuteAction(ActionEvent event) throws InvalidActionId {
- Button clickedButton = (Button) event.getSource();
- ButtonData buttonData = (ButtonData) clickedButton.getUserData();
- var actionProcessor = Session.getActionProcessor();
- actionProcessor.executeAction(buttonData.actionId(), buttonData.arguments());
- }
- @Override
- public void update() {
- renderActionButtons();
- renderInventoryItems();
- }
- private void renderActionButtons() {
- inputButtonContainer.getChildren().clear();
- var newButtons = new ArrayList<Button>();
- for (Action action : Session.getActionProcessor().getActions()) {
- switch (action) {
- case Enter enter -> {
- var room = Session.getGame().getCurrentRoom();
- var passages = room.getPassages();
- 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);
- button.getStyleClass().add("enter-button");
- newButtons.add(button);
- }
- }
- case PressButton pressButton -> {
- if (Session.getGame().getCurrentRoom().isBlockedByEnemy()) {
- continue;
- }
- var objects = Session.getGame().getCurrentRoom().getObjects();
- 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);
- }
- }
- }
- case Slay slay -> {
- var enemy = Session.getGame().getCurrentRoom().getEnemy();
- 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("slay-button");
- newButtons.add(button);
- }
- }
- case TakeItem takeItem -> {
- if (Session.getGame().getCurrentRoom().isBlockedByEnemy()) {
- continue;
- }
- var objects = Session.getGame().getCurrentRoom().getObjects();
- 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);
- button.getStyleClass().add("take-button");
- newButtons.add(button);
- }
- }
- }
- default -> newButtons.add(createActionButton(action.getName(), new ButtonData(action.getId())));
- }
- }
- inputButtonContainer.getChildren().addAll(newButtons);
- }
- private void renderInventoryItems() {
- inventoryContainer.getChildren().clear();
- var newItems = new ArrayList<Button>();
- for (var item : Session.getGame().getInventory().getItems()) {
- var label = item.getName();
- var buttonData = new ButtonData("inspectitem", item.getName());
- var button = createActionButton(label, buttonData);
- button.getStyleClass().add("inventory-item-button");
- newItems.add(button);
- }
- inventoryContainer.getChildren().addAll(newItems);
- }
- private Button createActionButton(String label, ButtonData buttonData) {
- Button actionButton = new Button(label);
- actionButton.setUserData(buttonData);
- actionButton.setOnAction(this::exectuteAction);
- actionButton.setMaxWidth(Double.MAX_VALUE);
- return actionButton;
- }
- }
|