mourning-ember / src / main / java / dev / llan / view / View.java
View.java
Raw
package dev.llan.view;

import dev.llan.controller.Controller;
import dev.llan.events.GameEvent;
import dev.llan.model.GameRecord;
import dev.llan.model.state.State;
import dev.llan.receivers.Observer;
import dev.llan.receivers.Receiver;
import dev.llan.view.game.EndView;
import dev.llan.view.game.GameView;
import dev.llan.view.game.TitleScreenView;
import dev.llan.view.game.WinView;
import dev.llan.view.game.modals.ModalManager;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

import static dev.llan.view.game.map.Constants.*;

public class View implements RenderComponent, Observer {
  private final Controller pc;
  private final Stage stage;

  private Scene scene;
  private StackPane layout;
  private final TitleScreenView titleView;
  private final GameView gameView;
  private final EndView endView;
  private final WinView winView;

  private final ModalManager modalManager;

  private boolean gameControlsEnabled = false;
  private boolean newGameCalled = false;

  public View(Receiver receiver, Controller pc, Stage stage) {
    this.pc = pc;
    this.stage = stage;
    layout = new StackPane();
    initScene();
    titleView = new TitleScreenView(this, receiver);
    gameView = new GameView(this, pc, scene, layout);
    endView = new EndView(this);
    winView = new WinView(this);
    layout.getChildren().add(titleView.render());

    modalManager = new ModalManager(this, gameView, pc, layout);
  }

  private void initScene() {
    this.scene = new Scene(this.render(), BASE_WIDTH, BASE_HEIGHT);
    scene.getStylesheets().add("styles/main.css");
  }

  public Scene getScene() {
    return scene;
  }

  public ModalManager getModalManager() {
    return modalManager;
  }

  public void returnToHome() {
    layout.getChildren().clear();
    titleView.update();
    layout.getChildren().add(titleView.render());
  }

  public void setGameView(boolean on) {
    if (on) {
      titleView.setLoading(true);
      newGameCalled = true;
      pc.newGame();
    }
  }

  public boolean isGameControlsEnabled() {
    return gameControlsEnabled;
  }

  @Override
  public void update(GameEvent event) {
    GameRecord gameRecord = event.getGame();
    if (gameRecord.getGameState() == State.END) {
      gameView.removeHandlers();
      layout.getChildren().clear();
      layout.getChildren().add(endView.render());
    } else if (gameRecord.getGameState() == State.WIN) {
      gameView.removeHandlers();
      layout.getChildren().clear();
      layout.getChildren().add(winView.render());
    } else {
      gameView.updateGameRecord(gameRecord);
      modalManager.updateGameRecord(gameRecord);
    }

    if(newGameCalled) {
      layout.getChildren().clear();
      layout.getChildren().add(gameView.render());
      gameControlsEnabled = true;
      gameView.initHandlers();
      newGameCalled = false;
      titleView.setLoading(false);
    }

    if (event.getDisableControls()) {
      gameControlsEnabled = false;
      gameView.setControlsEnabled(false);
    }

    if(event.getEnableControls()) {
      gameControlsEnabled = true;
      gameView.setControlsEnabled(true);
    }
  }

  @Override
  public Parent render() {
    return layout;
  }
}