package mightypork.rogue.world; import java.util.HashSet; import java.util.Set; import mightypork.gamecore.util.math.algo.Coord; import mightypork.gamecore.util.math.algo.Step; import mightypork.rogue.world.entity.Entity; import mightypork.rogue.world.entity.modules.EntityMoveListener; import mightypork.rogue.world.level.Level; public abstract class PlayerControl { protected Set playerMoveListeners = new HashSet<>(); private World lastWorld; /** * Implementing classes should return a world instance from this method. * * @return */ protected abstract World provideWorld(); public World getWorld() { final World newWorld = provideWorld(); lastWorld = newWorld; return newWorld; } public Entity getPlayerEntity() { if (getWorld() == null) return null; return getWorld().getPlayerEntity(); } public void goNorth() { go(Step.NORTH); } public void goSouth() { go(Step.SOUTH); } public void goEast() { go(Step.EAST); } public void goWest() { go(Step.WEST); } public void navigateTo(Coord pos) { if (!getLevel().getTile(pos).isExplored()) return; getPlayerEntity().pos.navigateTo(pos); } public Level getLevel() { return getWorld().getCurrentLevel(); } public Coord getCoord() { return getPlayerEntity().pos.getCoord(); } public boolean canGo(Step side) { return getLevel().getTile(getCoord().add(side)).isWalkable(); } /** * Click tile on player's side * * @param side * @return */ public boolean clickTile(Step side) { return clickTile(getCoord().add(side)); } public boolean clickTile(Coord pos) { if (pos.dist(getCoord()) > 8) return false; // too far return getLevel().getTile(pos).onClick(); } public void go(Step side) { getPlayerEntity().pos.cancelPath(); getPlayerEntity().pos.addStep(side); } public boolean tryGo(Step e) { if (!canGo(e)) return false; go(e); return true; } }