GameController.java 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. package eu.oschl.gui;
  2. import eu.oschl.gui.actions.*;
  3. import eu.oschl.gui.exceptions.InvalidActionId;
  4. import javafx.event.ActionEvent;
  5. import javafx.fxml.FXML;
  6. import javafx.scene.control.Button;
  7. import javafx.scene.layout.VBox;
  8. import javafx.scene.text.TextFlow;
  9. import java.util.ArrayList;
  10. public class GameController implements Observer {
  11. @FXML
  12. private TextFlow output;
  13. @FXML
  14. private VBox inputButtonContainer;
  15. @FXML
  16. private VBox inventoryContainer;
  17. @FXML
  18. public void initialize() {
  19. Output.setOutputElement(output);
  20. Session.getActionProcessor().register(this);
  21. update();
  22. Output.print(Session.getGame().getPrologue());
  23. }
  24. @FXML
  25. private void exectuteAction(ActionEvent event) throws InvalidActionId {
  26. Button clickedButton = (Button) event.getSource();
  27. ButtonData buttonData = (ButtonData) clickedButton.getUserData();
  28. var actionProcessor = Session.getActionProcessor();
  29. actionProcessor.executeAction(buttonData.actionId(), buttonData.arguments());
  30. }
  31. @Override
  32. public void update() {
  33. renderActionButtons();
  34. renderInventoryItems();
  35. }
  36. private void renderActionButtons() {
  37. inputButtonContainer.getChildren().clear();
  38. var newButtons = new ArrayList<Button>();
  39. for (Action action : Session.getActionProcessor().getActions()) {
  40. switch (action) {
  41. case Enter enter -> {
  42. var room = Session.getGame().getCurrentRoom();
  43. var passages = room.getPassages();
  44. for (var passage : passages) {
  45. var label = passage.isSeeThrough() || passage.getOtherRoom(room).wasEntered()
  46. ? enter.getName() + " " + passage.getName() + " (>> " + passage.getOtherRoom(Session.getGame().getCurrentRoom()).getName() + ")"
  47. : enter.getName() + " " + passage.getName() + " (>> ???)";
  48. var buttonData = new ButtonData(enter.getId(), passage.getName());
  49. var button = createActionButton(label, buttonData);
  50. button.getStyleClass().add("enter-button");
  51. newButtons.add(button);
  52. }
  53. }
  54. case PressButton pressButton -> {
  55. if (Session.getGame().getCurrentRoom().isBlockedByEnemy()) {
  56. continue;
  57. }
  58. var objects = Session.getGame().getCurrentRoom().getObjects();
  59. for (var object : objects) {
  60. if (object instanceof eu.oschl.textadventure.objects.Button) {
  61. var label = pressButton.getName() + " " + object.getName();
  62. var buttonData = new ButtonData(pressButton.getId(), object.getName());
  63. var button = createActionButton(label, buttonData);
  64. button.getStyleClass().add("press-button");
  65. newButtons.add(button);
  66. }
  67. }
  68. }
  69. case Slay slay -> {
  70. var enemy = Session.getGame().getCurrentRoom().getEnemy();
  71. if (enemy.isPresent() && enemy.get().isAlive()) {
  72. var label = slay.getName() + " " + enemy.get().getName();
  73. var buttonData = new ButtonData(slay.getId(), enemy.get().getName());
  74. var button = createActionButton(label, buttonData);
  75. button.getStyleClass().add("slay-button");
  76. newButtons.add(button);
  77. }
  78. }
  79. case TakeItem takeItem -> {
  80. if (Session.getGame().getCurrentRoom().isBlockedByEnemy()) {
  81. continue;
  82. }
  83. var objects = Session.getGame().getCurrentRoom().getObjects();
  84. for (var object : objects) {
  85. if (object instanceof eu.oschl.textadventure.objects.PickableObject) {
  86. var label = takeItem.getName() + " " + object.getName();
  87. var buttonData = new ButtonData(takeItem.getId(), object.getName());
  88. var button = createActionButton(label, buttonData);
  89. button.getStyleClass().add("take-button");
  90. newButtons.add(button);
  91. }
  92. }
  93. }
  94. default -> newButtons.add(createActionButton(action.getName(), new ButtonData(action.getId())));
  95. }
  96. }
  97. inputButtonContainer.getChildren().addAll(newButtons);
  98. }
  99. private void renderInventoryItems() {
  100. inventoryContainer.getChildren().clear();
  101. var newItems = new ArrayList<Button>();
  102. for (var item : Session.getGame().getInventory().getItems()) {
  103. var label = item.getName();
  104. var buttonData = new ButtonData("inspectitem", item.getName());
  105. var button = createActionButton(label, buttonData);
  106. button.getStyleClass().add("inventory-item-button");
  107. newItems.add(button);
  108. }
  109. inventoryContainer.getChildren().addAll(newItems);
  110. }
  111. private Button createActionButton(String label, ButtonData buttonData) {
  112. Button actionButton = new Button(label);
  113. actionButton.setUserData(buttonData);
  114. actionButton.setOnAction(this::exectuteAction);
  115. actionButton.setMaxWidth(Double.MAX_VALUE);
  116. return actionButton;
  117. }
  118. }