package dev.llan.controller;
import dev.llan.model.Game;
import dev.llan.model.Model;
import dev.llan.model.board.Point;
import dev.llan.model.board.Tile.TileType;
import dev.llan.model.board.Tile;
import dev.llan.model.cards.Card;
import dev.llan.model.state.State;
import dev.llan.model.state.combat.CombatManager.CombatPhase;
import java.util.Optional;
public class GameController implements Controller {
private final Model model;
private Game game;
private Optional<Tile> lastClicked;
private Optional<Card> selectedCard;
public GameController(Model model) {
this.model = model;
lastClicked = Optional.empty();
selectedCard = Optional.empty();
}
@Override
public void newGame() {
game = model.initGame();
lastClicked = Optional.empty();
}
@Override
public void tileClick(Tile tile) {
if (selectedCard.isEmpty()) {
if (tile.getType() == TileType.VACANT || tile.getType() == TileType.INTERACTABLE) {
if (tile.isVisible()) {
if (lastClicked.isPresent()) {
Point lastPoint = lastClicked.get().getPosition();
if (lastPoint.equals(tile.getPosition())) {
model.moveActivePath();
lastClicked = Optional.empty();
return;
}
}
model.tryMoveTo(tile.getPosition());
lastClicked = Optional.of(tile);
}
}
} else {
if (model.isInRange(tile.getPosition()) && tile.getType() == TileType.OCCUPIED) {
model.useCardOn(tile.getPosition());
selectedCard = Optional.empty();
}
}
}
@Override
public void equip(int index) {
model.equip(index);
}
@Override
public void swapEquipment(int first, int second) {
model.swapEquipment(first, second);
}
@Override
public void swapCard(int first, int second) {
model.swapCards(first, second);
}
@Override
public void cardClick(int index, Card card) {
Optional<Card> selected = model.selectCard(index);
selectedCard = selected;
}
@Override
public void removeCard(int index) {
model.removeCard(index);
}
@Override
public void endTurn() {
if (game.getState() == State.COMBAT) {
selectedCard = Optional.empty();
model.selectCard(-1);
model.endTurn();
}
}
@Override
public void waitTurn() {
if (game.getState() == State.COMBAT && game.getPhase() == CombatPhase.TURN) {
selectedCard = Optional.empty();
model.selectCard(-1);
model.waitTurn();
}
}
@Override
public void removeEquipment(int index) {
model.removeEquipment(index);
}
@Override
public void cancelSelectedCard() {
selectedCard = Optional.empty();
model.selectCard(-1);
}
@Override
public void setHighlighted(Point point, boolean highlighted) {
model.setHighlighted(point, highlighted);
}
}