package views; import AdventureModel.AdventureGame; import AdventureModel.AdventureObject; import AdventureModel.GunAttack; import javafx.animation.PauseTransition; import javafx.application.Platform; import javafx.event.ActionEvent; import javafx.geometry.Insets; import javafx.geometry.Pos; import javafx.scene.Node; import javafx.scene.Scene; import javafx.scene.control.*; import javafx.scene.media.Media; import javafx.scene.media.MediaPlayer; import javafx.scene.paint.Color; import javafx.scene.layout.*; import javafx.scene.input.KeyEvent; //you will need these! import javafx.scene.input.KeyCode; import javafx.scene.text.Font; import javafx.stage.Stage; import javafx.scene.image.Image; import javafx.scene.image.ImageView; import javafx.util.Duration; import javafx.event.EventHandler; //you will need this too! import javafx.scene.AccessibleRole; import java.io.File; import java.util.ArrayList; /** * Class AdventureGameView. * * This is the Class that will visualize your model. * You are asked to demo your visualization via a Zoom * recording. Place a link to your recording below. * the URL IS GOOGLE DOCS * ZOOM LINK: https://drive.google.com/file/d/1znUSY2kmrN3liw8Lr000ng8XVHOrn55Y/view?usp=sharing * PASSWORD: */ public class AdventureGameView { AdventureGame model; //model of the game Stage stage; //stage on which all is rendered Button saveButton, loadButton, helpButton; //buttons Boolean helpToggle = false; //is help on display? GridPane gridPane = new GridPane(); //to hold images and buttons Label roomDescLabel = new Label(); //to hold room description and/or instructions VBox objectsInRoom = new VBox(); //to hold room items VBox objectsInInventory = new VBox(); //to hold inventory items ImageView roomImageView; //to hold room image TextField inputTextField; //for user input HBox attackButtons; VBox textEntry; GridPane menuPane = new GridPane(); //to hold main menu buttons and images Stage menuStage = new Stage(); //stage for menu private MediaPlayer mediaPlayer; //to play audio private boolean mediaPlaying; //to know if the audio is playing /** * Adventure Game View Constructor * __________________________ * Initializes attributes */ public AdventureGameView(AdventureGame model, Stage stage) { this.model = model; this.stage = stage; menuUI(); } public void menuUI(){ this.menuStage.setTitle("Group 73's Adventure Game Menu"); Image menuImageFile = new Image("Images/MainMenu.png"); BackgroundImage menuBackground = new BackgroundImage(menuImageFile, BackgroundRepeat.REPEAT, BackgroundRepeat.NO_REPEAT, BackgroundPosition.DEFAULT, BackgroundSize.DEFAULT); menuPane.setBackground(new Background(menuBackground)); menuPane.setPadding(new Insets(10, 10, 10, 10)); menuPane.setVgap(10); menuPane.setHgap(10); Button playButton = new Button("Play"); playButton.setFont(Font.font("Titillium Web", 18)); playButton.setMinSize(150, 50); playButton.setStyle("-fx-background-color: #F7E0C0; -fx-text-fill: #000000;"); makeButtonAccessible(playButton, "Play Button", "This button starts the actual game", "This button loads the game from a file. Click it in order to start the game."); playButton.setOnAction(e -> { intiUI(); }); Button settingsButton = new Button("Settings"); settingsButton.setFont(Font.font("Titillium Web", 18)); settingsButton.setMinSize(150, 50); settingsButton.setStyle("-fx-background-color: #F7E0C0; -fx-text-fill: #000000;"); Button backButton = new Button("Back"); backButton.setFont(Font.font("Titillium Web", 18)); backButton.setMinSize(150, 50); backButton.setStyle("-fx-background-color: #F7E0C0; -fx-text-fill: #000000;"); Button instructionsButton = new Button("Instructions"); instructionsButton.setFont(Font.font("Titillium Web", 18)); instructionsButton.setMinSize(150, 50); instructionsButton.setStyle("-fx-background-color: #F7E0C0; -fx-text-fill: #000000;"); Button loadGameButton = new Button("Load Game"); loadGameButton.setFont(Font.font("Titillium Web", 18)); loadGameButton.setMinSize(150, 50); loadGameButton.setStyle("-fx-background-color: #F7E0C0; -fx-text-fill: #000000;"); makeButtonAccessible(loadGameButton, "Load Button", "This button loads a game from a file.", "This button loads the game from a file. Click it in order to load a game that you saved at a prior date."); loadGameButton.setOnAction(e -> { menuPane.requestFocus(); LoadView loadView = new LoadView(this); }); Button saveGameButton = new Button("Save Game"); saveGameButton.setFont(Font.font("Titillium Web", 18)); saveGameButton.setMinSize(150, 50); saveGameButton.setStyle("-fx-background-color: #F7E0C0; -fx-text-fill: #000000;"); makeButtonAccessible(saveGameButton, "Save Button", "This button saves the game.", "This button saves the game. Click it in order to save your current progress, so you can play more later."); saveGameButton.setOnAction(e -> { menuPane.requestFocus(); SaveView saveView = new SaveView(this); }); instructionsButton.setOnAction(e -> { stopArticulation(); //if speaking, stop if (helpToggle){ removeNodeFromGridPane(menuPane, 2,1); removeNodeFromGridPane(menuPane, 2,2); menuPane.add(playButton, 1, 1); menuPane.add(settingsButton, 1, 2); menuPane.add(instructionsButton, 1, 3); menuPane.add(loadGameButton, 1, 4); menuPane.add(saveGameButton, 1, 5); helpToggle = false; } else { menuPane.getChildren().clear(); Label label = new Label(model.getInstructions()); label.setStyle("-fx-background-color: #F7E0C0; -fx-padding: 10px;"); removeNodeFromGridPane(menuPane, 2,1); menuPane.add(label, 2, 1); menuPane.add(backButton, 2, 2); helpToggle = true; } }); backButton.setOnAction(e -> { stopArticulation(); //if speaking, stop if (helpToggle){ removeNodeFromGridPane(menuPane, 2,1); removeNodeFromGridPane(menuPane, 2,2); menuPane.add(playButton, 1, 1); menuPane.add(settingsButton, 1, 2); menuPane.add(instructionsButton, 1, 3); menuPane.add(loadGameButton, 1, 4); menuPane.add(saveGameButton, 1, 5); helpToggle = false; } else { menuPane.getChildren().clear(); Label label = new Label(model.getInstructions()); label.setStyle("-fx-background-color: white; -fx-padding: 10px;"); removeNodeFromGridPane(menuPane, 2,1); menuPane.add(label, 2, 1); menuPane.add(backButton, 2, 2); helpToggle = true; } }); menuPane.add(playButton, 1, 1); menuPane.add(settingsButton, 1, 2); menuPane.add(instructionsButton, 1, 3); menuPane.add(loadGameButton, 1, 4); menuPane.add(saveGameButton, 1, 5); menuPane.setAlignment(Pos.CENTER); var scene = new Scene( menuPane , 1200, 675); this.stage.setScene(scene); this.stage.setResizable(true); this.stage.show(); } /** * Initialize the UI */ public void intiUI() { // setting up the stage this.stage.setTitle("Group 73's Adventure Game"); //Inventory + Room items objectsInInventory.setSpacing(10); objectsInInventory.setAlignment(Pos.TOP_CENTER); objectsInRoom.setSpacing(10); objectsInRoom.setAlignment(Pos.TOP_CENTER); // GridPane, anyone? gridPane.setPadding(new Insets(20)); gridPane.setBackground(new Background(new BackgroundFill( Color.valueOf("#000000"), new CornerRadii(0), new Insets(0) ))); //Three columns, three rows for the GridPane ColumnConstraints column1 = new ColumnConstraints(150); ColumnConstraints column2 = new ColumnConstraints(650); ColumnConstraints column3 = new ColumnConstraints(150); column3.setHgrow( Priority.SOMETIMES ); //let some columns grow to take any extra space column1.setHgrow( Priority.SOMETIMES ); // Row constraints RowConstraints row1 = new RowConstraints(); RowConstraints row2 = new RowConstraints( 550 ); RowConstraints row3 = new RowConstraints(); row1.setVgrow( Priority.SOMETIMES ); row3.setVgrow( Priority.SOMETIMES ); gridPane.getColumnConstraints().addAll( column1 , column2 , column1 ); gridPane.getRowConstraints().addAll( row1 , row2 , row1 ); // Buttons Button simpleMinigameButton = new Button("Train"); simpleMinigameButton.setId("Train"); customizeButton(simpleMinigameButton, 100, 50); simpleMinigameButton.setOnAction(e -> { openSimpleMinigame(); }); saveButton = new Button("Save"); saveButton.setId("Save"); customizeButton(saveButton, 100, 50); makeButtonAccessible(saveButton, "Save Button", "This button saves the game.", "This button saves the game. Click it in order to save your current progress, so you can play more later."); addSaveEvent(); loadButton = new Button("Load"); loadButton.setId("Load"); customizeButton(loadButton, 100, 50); makeButtonAccessible(loadButton, "Load Button", "This button loads a game from a file.", "This button loads the game from a file. Click it in order to load a game that you saved at a prior date."); addLoadEvent(); helpButton = new Button("Instructions"); helpButton.setId("Instructions"); customizeButton(helpButton, 200, 50); makeButtonAccessible(helpButton, "Help Button", "This button gives game instructions.", "This button gives instructions on the game controls. Click it to learn how to play."); addInstructionEvent(); HBox topButtons = new HBox(); topButtons.getChildren().addAll(simpleMinigameButton, saveButton, helpButton, loadButton); topButtons.setSpacing(10); topButtons.setAlignment(Pos.CENTER); inputTextField = new TextField(); inputTextField.setFont(new Font("Segoe UI", 16)); inputTextField.setFocusTraversable(true); inputTextField.setAccessibleRole(AccessibleRole.TEXT_AREA); inputTextField.setAccessibleRoleDescription("Text Entry Box"); inputTextField.setAccessibleText("Enter commands in this box."); inputTextField.setAccessibleHelp("This is the area in which you can enter commands you would like to play. Enter a command and hit return to continue."); addTextHandlingEvent(); //attach an event to this input field //labels for inventory and room items Label objLabel = new Label("Objects in Room"); objLabel.setAlignment(Pos.CENTER); objLabel.setStyle("-fx-text-fill: white;"); objLabel.setFont(new Font("Segoe UI", 16)); Label invLabel = new Label("Your Inventory"); invLabel.setAlignment(Pos.CENTER); invLabel.setStyle("-fx-text-fill: white;"); invLabel.setFont(new Font("Segoe UI", 16)); //add all the widgets to the GridPane gridPane.add( objLabel, 0, 0, 1, 1 ); // Add label gridPane.add( topButtons, 1, 0, 1, 1 ); // Add buttons gridPane.add( invLabel, 2, 0, 1, 1 ); // Add label Label commandLabel = new Label("What would you like to do?"); commandLabel.setStyle("-fx-text-fill: white;"); commandLabel.setFont(new Font("Segoe UI", 16)); updateScene(""); //method displays an image and whatever text is supplied updateItems(); //update items shows inventory and objects in rooms // adding the text area and submit button to a VBox VBox textEntry = new VBox(); textEntry.setStyle("-fx-background-color: #000000;"); textEntry.setPadding(new Insets(20, 20, 20, 20)); textEntry.getChildren().addAll(commandLabel, inputTextField); textEntry.setSpacing(10); textEntry.setAlignment(Pos.CENTER); this.textEntry = textEntry; // attack buttons Button GunButton = new Button("Shoot!"); GunButton.setId("GunButton"); customizeButton(GunButton, 100, 50); Button HandToHandButton = new Button("Punch!"); HandToHandButton.setId("HandtoHandButton"); customizeButton(HandToHandButton, 100, 50); Button MagicButton = new Button("Fireball!"); MagicButton.setId("MagicButton"); customizeButton(MagicButton, 100, 50); // attack button handlers GunButton.setOnAction(e -> { submitEvent("attack gun"); }); HandToHandButton.setOnAction(e -> { submitEvent("attack handtohand"); }); MagicButton.setOnAction(e -> { submitEvent("attack magic"); }); HBox attackButtons = new HBox(); attackButtons.getChildren().addAll(GunButton, HandToHandButton, MagicButton); attackButtons.setSpacing(10); attackButtons.setAlignment(Pos.CENTER); this.attackButtons = attackButtons; toggleAttackButtons(false); // Render everything var scene = new Scene( gridPane , 1000, 800); scene.setFill(Color.BLACK); this.stage.setScene(scene); this.stage.setResizable(false); this.stage.show(); } /** * makeButtonAccessible * __________________________ * For information about ARIA standards, see * https://www.w3.org/WAI/standards-guidelines/aria/ * * @param inputButton the button to add screenreader hooks to * @param name ARIA name * @param shortString ARIA accessible text * @param longString ARIA accessible help text */ public static void makeButtonAccessible(Button inputButton, String name, String shortString, String longString) { inputButton.setAccessibleRole(AccessibleRole.BUTTON); inputButton.setAccessibleRoleDescription(name); inputButton.setAccessibleText(shortString); inputButton.setAccessibleHelp(longString); inputButton.setFocusTraversable(true); } /** * customizeButton * __________________________ * * @param inputButton the button to make stylish :) * @param w width * @param h height */ private void customizeButton(Button inputButton, int w, int h) { inputButton.setPrefSize(w, h); inputButton.setFont(new Font("Segoe UI", 16)); inputButton.setStyle("-fx-background-color: #17871b; -fx-text-fill: white;"); } /** * addTextHandlingEvent * __________________________ * Add an event handler to the myTextField attribute * * Your event handler should respond when users * hits the ENTER or TAB KEY. If the user hits * the ENTER Key, strip white space from the * input to myTextField and pass the stripped * string to submitEvent for processing. * * If the user hits the TAB key, move the focus * of the scene onto any other node in the scene * graph by invoking requestFocus method. */ private void addTextHandlingEvent() { //add your code here! inputTextField.setOnKeyPressed(event -> { if (event.getCode() == KeyCode.ENTER){ String input = inputTextField.getText().strip(); //remove all white space submitEvent(input); } else if (event.getCode() == KeyCode.TAB) { inputTextField.getParent().requestFocus(); //change focus } }); } /** * submitEvent * __________________________ * * @param text the command that needs to be processed */ private void submitEvent(String text) { text = text.strip(); //get rid of white space stopArticulation(); //if speaking, stop if (text.equalsIgnoreCase("LOOK") || text.equalsIgnoreCase("L")) { String roomDesc = this.model.getPlayer().getCurrentRoom().getRoomDescription(); String objectString = this.model.getPlayer().getCurrentRoom().getObjectString(); if (!objectString.isEmpty()) roomDescLabel.setText(roomDesc + "\n\nObjects in this room:\n" + objectString); articulateRoomDescription(); //all we want, if we are looking, is to repeat description. return; } else if (text.equalsIgnoreCase("HELP") || text.equalsIgnoreCase("H")) { showInstructions(); return; } else if (text.equalsIgnoreCase("COMMANDS") || text.equalsIgnoreCase("C")) { showCommands(); //this is new! We did not have this command in A1 return; } inputTextField.setText(""); //try to move! String output = this.model.interpretAction(text); //process the command! if (output == null || (!output.equals("GAME OVER") && !output.equals("FORCED") && !output.equals("HELP"))) { updateScene(output); updateItems(); } else if (output.equals("GAME OVER")) { endGame(); } else if (output.equals("FORCED")) { //write code here to handle "FORCED" events! //Your code will need to display the image in the //current room and pause, then transition to //the forced room. moveToForcedRoom(20); } } public void endGame() { PauseTransition pause = new PauseTransition(Duration.seconds(5)); pause.setOnFinished(event -> { Platform.exit(); }); pause.play(); } public void moveToForcedRoom(int duration) { updateScene(model.getPlayer().getCurrentRoom().getRoomDescription()); articulateRoomDescription(); PauseTransition pause = new PauseTransition(Duration.seconds(duration)); pause.setOnFinished(event -> { //transition to forced room submitEvent("FORCED"); updateItems(); }); pause.play(); } public void toggleAttackButtons(boolean visible) { if (visible) { gridPane.getChildren().remove(textEntry); gridPane.add(attackButtons, 0, 3, 3, 1); } else { gridPane.getChildren().remove(attackButtons); gridPane.add( textEntry, 0, 2, 3, 1 ); } } /** * showCommands * __________________________ * * update the text in the GUI (within roomDescLabel) * to show all the moves that are possible from the * current room. */ private void showCommands() { //throw new UnsupportedOperationException("showCommands is not implemented!"); //model.getPlayer().getCurrentRoom().getMotionTable() roomDescLabel.setText("Commands Available : \n" + model.getPlayer().getCurrentRoom().getCommands()); } /** * updateScene * __________________________ * * Show the current room, and print some text below it. * If the input parameter is not null, it will be displayed * below the image. * Otherwise, the current room description will be dispplayed * below the image. * * @param textToDisplay the text to display below the image. */ public void updateScene(String textToDisplay) { getRoomImage(); //get the image of the current room formatText(textToDisplay); //format the text to display roomDescLabel.setPrefWidth(500); roomDescLabel.setPrefHeight(500); roomDescLabel.setTextOverrun(OverrunStyle.CLIP); roomDescLabel.setWrapText(true); VBox roomPane = new VBox(roomImageView,roomDescLabel); roomPane.setPadding(new Insets(10)); roomPane.setAlignment(Pos.TOP_CENTER); roomPane.setStyle("-fx-background-color: #000000;"); gridPane.add(roomPane, 1, 1); stage.sizeToScene(); //finally, articulate the description if (textToDisplay == null || textToDisplay.isBlank()) articulateRoomDescription(); } /** * formatText * __________________________ * * Format text for display. * * @param textToDisplay the text to be formatted for display. */ private void formatText(String textToDisplay) { if (textToDisplay == null || textToDisplay.isBlank()) { String roomDesc = this.model.getPlayer().getCurrentRoom().getRoomDescription() + "\n"; String objectString = this.model.getPlayer().getCurrentRoom().getObjectString(); if (objectString != null && !objectString.isEmpty()) roomDescLabel.setText(roomDesc + "\n\nObjects in this room:\n" + objectString); else roomDescLabel.setText(roomDesc); } else roomDescLabel.setText(textToDisplay); roomDescLabel.setStyle("-fx-text-fill: white;"); roomDescLabel.setFont(new Font("Segoe UI", 16)); roomDescLabel.setAlignment(Pos.CENTER); } /** * getRoomImage * __________________________ * * Get the image for the current room and place * it in the roomImageView */ private void getRoomImage() { int roomNumber = this.model.getPlayer().getCurrentRoom().getRoomNumber(); String roomImage = this.model.getDirectoryName() + "/room-images/" + roomNumber + ".png"; Image roomImageFile = new Image(roomImage); roomImageView = new ImageView(roomImageFile); roomImageView.setPreserveRatio(true); roomImageView.setFitWidth(400); roomImageView.setFitHeight(400); //set accessible text roomImageView.setAccessibleRole(AccessibleRole.IMAGE_VIEW); roomImageView.setAccessibleText(this.model.getPlayer().getCurrentRoom().getRoomDescription()); roomImageView.setFocusTraversable(true); } /** * updates Vbox * "Write code to update a vbox with buttons" ChatGPT, 3.5 version, OpenAI, 23 Oct. 2023, * chat.openai.com/chat. * I changed things a lot here */ private void updateVBox(VBox vbox, ArrayList objects) { vbox.getChildren().clear(); for (AdventureObject object : objects) { ImageView image = new ImageView(this.model.getDirectoryName() + "/objectImages/" + object.getName() + ".jpg"); image.setFitWidth(100); image.setFitHeight(100); Button button = new Button(); button.setGraphic(image); makeButtonAccessible(button, "Object", object.getName(), object.getDescription()); button.setOnAction(event -> { if (vbox == objectsInRoom) { //model.getPlayer().addToInventory(object); //model.getPlayer().getCurrentRoom().removeGameObject(object); submitEvent("TAKE " + object.getName()); } else if (vbox == objectsInInventory) { //model.getPlayer().inventory.remove(object); //model.getPlayer().getCurrentRoom().addGameObject(object); submitEvent("DROP " + object.getName()); } updateVBox(objectsInRoom, model.getPlayer().getCurrentRoom().objectsInRoom); updateVBox(objectsInInventory, model.getPlayer().inventory); }); vbox.getChildren().add(button); } } /** * updateItems * __________________________ * * This method is partially completed, but you are asked to finish it off. * * The method should populate the objectsInRoom and objectsInInventory Vboxes. * Each Vbox should contain a collection of nodes (Buttons, ImageViews, you can decide) * Each node represents a different object. * * Images of each object are in the assets * folders of the given adventure game. */ public void updateItems() { //write some code here to add images of objects in a given room to the objectsInRoom Vbox //write some code here to add images of objects in a player's inventory room to the objectsInInventory Vbox updateVBox(objectsInRoom, model.getPlayer().getCurrentRoom().objectsInRoom); updateVBox(objectsInInventory, model.getPlayer().inventory); inputTextField.setOnAction(event ->{ String instruction = inputTextField.getText().toLowerCase(); if (instruction.startsWith("take ")){ String object = instruction.substring(5).toUpperCase(); for (Node node : objectsInRoom.getChildren()) { if (node instanceof Button) { Button button = (Button) node; if (button.getText().equalsIgnoreCase(object)) { objectsInRoom.getChildren().remove(button); break; // Exit loop after finding the button } } } } if (instruction.startsWith("drop ")){ String object = instruction.substring(5).toUpperCase(); //use checkifobject in inventory if (model.getPlayer().checkIfObjectInInventory(object)){ //model.getPlayer().dropObject(object); //removed the object now we need to find object button //updateVBox(objectsInRoom, model.getPlayer().getCurrentRoom().objectsInRoom); //updateVBox(objectsInInventory, model.getPlayer().inventory); for (Node node : objectsInInventory.getChildren()) { if (node instanceof Button) { Button button = (Button) node; if (button.getText().equalsIgnoreCase(object)) { objectsInInventory.getChildren().remove(button); break; // Exit loop after finding the button } } } } } }); //please use setAccessibleText to add "alt" descriptions to your images! //the path to the image of any is as follows: //this.model.getDirectoryName() + "/objectImages/" + objectName + ".jpg"; ScrollPane scO = new ScrollPane(objectsInRoom); scO.setPadding(new Insets(10)); scO.setStyle("-fx-background: #000000; -fx-background-color:transparent;"); scO.setFitToWidth(true); gridPane.add(scO,0,1); ScrollPane scI = new ScrollPane(objectsInInventory); scI.setFitToWidth(true); scI.setStyle("-fx-background: #000000; -fx-background-color:transparent;"); gridPane.add(scI,2,1); } /* * remove the node from the grid pane * "Write java code that remove a node from a GridPane in javafx" ChatGPT, 3.5 version, OpenAI, 23 Oct. 2023, * chat.openai.com/chat. */ private void removeNodeFromGridPane(GridPane gridPane, int col, int row) { javafx.scene.Node nodeToRemove = null; for (javafx.scene.Node node : gridPane.getChildren()) { if (GridPane.getColumnIndex(node) == col && GridPane.getRowIndex(node) == row) { nodeToRemove = node; break; } } if (nodeToRemove != null) { gridPane.getChildren().remove(nodeToRemove); } } /* * Show the game instructions. * * If helpToggle is FALSE: * -- display the help text in the CENTRE of the gridPane (i.e. within cell 1,1) * -- use whatever GUI elements to get the job done! * -- set the helpToggle to TRUE * -- REMOVE whatever nodes are within the cell beforehand! * * If helpToggle is TRUE: * -- redraw the room image in the CENTRE of the gridPane (i.e. within cell 1,1) * -- set the helpToggle to FALSE * -- Again, REMOVE whatever nodes are within the cell beforehand! */ public void showInstructions() { //throw new UnsupportedOperationException("showInstructions is not implemented!"); //read help text //model.getInstructions(); is the help text if (helpToggle){ removeNodeFromGridPane(gridPane, 1,1); updateScene(""); //gridPane.add(roomImageView, 1,1); helpToggle = false; } else { //TextField text = new TextField(); //could also use a label Label label = new Label(model.getInstructions()); label.setStyle("-fx-background-color: white; -fx-padding: 10px;"); removeNodeFromGridPane(gridPane, 1,1); gridPane.add(label, 1,1); helpToggle = true; } } /** * This method handles the event related to the * help button. */ public void addInstructionEvent() { helpButton.setOnAction(e -> { stopArticulation(); //if speaking, stop showInstructions(); }); } /** * This method handles the event related to the * save button. */ public void addSaveEvent() { saveButton.setOnAction(e -> { gridPane.requestFocus(); SaveView saveView = new SaveView(this); }); } public void openSimpleMinigame() { gridPane.requestFocus(); SimpleMinigameView simpleMinigameView = new SimpleMinigameView(this, model); } /** * This method handles the event related to the * load button. */ public void addLoadEvent() { loadButton.setOnAction(e -> { gridPane.requestFocus(); LoadView loadView = new LoadView(this); }); } /** * This method articulates Room Descriptions */ public void articulateRoomDescription() { String musicFile; String adventureName = this.model.getDirectoryName(); String roomName = this.model.getPlayer().getCurrentRoom().getRoomName(); if (!this.model.getPlayer().getCurrentRoom().getVisited()) musicFile = "A2Game/" + adventureName + "/sounds/" + roomName.toLowerCase() + "-long.mp3" ; else musicFile = "A2Game" + adventureName + "/sounds/" + roomName.toLowerCase() + "-short.mp3" ; musicFile = musicFile.replace(" ","-"); Media sound = new Media(new File(musicFile).toURI().toString()); mediaPlayer = new MediaPlayer(sound); mediaPlayer.play(); mediaPlaying = true; } /** * This method stops articulations * (useful when transitioning to a new room or loading a new game) */ public void stopArticulation() { if (mediaPlaying) { mediaPlayer.stop(); //shush! mediaPlaying = false; } } }