package fr.lyrgard.hexScape.control; import com.jme3.app.Application; import com.jme3.app.state.AbstractAppState; import com.jme3.app.state.AppStateManager; import com.jme3.input.InputManager; import com.jme3.input.KeyInput; import com.jme3.input.MouseInput; import com.jme3.input.controls.ActionListener; import com.jme3.input.controls.KeyTrigger; import com.jme3.input.controls.MouseAxisTrigger; import com.jme3.input.controls.MouseButtonTrigger; import fr.lyrgard.hexScape.HexScapeCore; import fr.lyrgard.hexScape.bus.CoreMessageBus; import fr.lyrgard.hexScape.message.PieceMovedMessage; import fr.lyrgard.hexScape.message.PiecePlacedMessage; import fr.lyrgard.hexScape.message.PieceRemovedMessage; import fr.lyrgard.hexScape.message.PieceSelectedMessage; import fr.lyrgard.hexScape.message.PieceUnselectedMessage; import fr.lyrgard.hexScape.model.CurrentUserInfo; import fr.lyrgard.hexScape.model.map.Direction; import fr.lyrgard.hexScape.service.DirectionService; import fr.lyrgard.hexScape.service.PieceManager; public class PieceControlerAppState extends AbstractAppState implements ActionListener { private static final String CLICK_MAPPING = "ControlerAppState_click"; private static final String CANCEL_MAPPING = "ControlerAppState_cancel"; private static final String DELETE_MAPPING = "ControlerAppState_delete"; private static final String POV_MAPPING = "ControlerAppState_pov"; private static final String MOUSE_WHEEL_UP_MAPPING = "ControlerAppState_mouseWheelUp"; private static final String MOUSE_WHEEL_DOWN_MAPPING = "ControlerAppState_mouseWheelDown"; private PlacePieceByMouseAppState placePieceByMouseAppState = new PlacePieceByMouseAppState(); private SelectPieceByMouseAppState selectPieceByMouseAppState = new SelectPieceByMouseAppState(); private State currentState = State.WAITING; private InputManager inputManager; private enum State { WAITING, ADDING_PIECE, MOVING_PIECE, SELECTING_PIECE } @Override public void initialize(AppStateManager stateManager, Application app) { super.initialize(stateManager, app); placePieceByMouseAppState.initialize(stateManager, app); selectPieceByMouseAppState.initialize(stateManager, app); changeStateTo(State.WAITING); inputManager = app.getInputManager(); inputManager.addMapping(CLICK_MAPPING, new MouseButtonTrigger(MouseInput.BUTTON_LEFT)); inputManager.addMapping(CANCEL_MAPPING, new KeyTrigger(KeyInput.KEY_ESCAPE)); inputManager.addMapping(DELETE_MAPPING, new KeyTrigger(KeyInput.KEY_DELETE)); inputManager.addMapping(POV_MAPPING, new KeyTrigger(KeyInput.KEY_P)); inputManager.addMapping(MOUSE_WHEEL_UP_MAPPING, new MouseAxisTrigger(MouseInput.AXIS_WHEEL, true)); inputManager.addMapping(MOUSE_WHEEL_DOWN_MAPPING, new MouseAxisTrigger(MouseInput.AXIS_WHEEL, false)); inputManager.addListener(this, CLICK_MAPPING, CANCEL_MAPPING, DELETE_MAPPING, POV_MAPPING, MOUSE_WHEEL_UP_MAPPING, MOUSE_WHEEL_DOWN_MAPPING); } public void beginAddingPiece(PieceManager piece) { placePieceByMouseAppState.setPieceToPlace(piece); changeStateTo(State.ADDING_PIECE); } public void beginMovingSelectedPiece() { if (currentState == State.SELECTING_PIECE) { changeStateTo(State.MOVING_PIECE); } } @Override public void update(float tpf) { super.update(tpf); if (currentState == State.ADDING_PIECE || currentState == State.MOVING_PIECE) { placePieceByMouseAppState.update(tpf); } if (selectPieceByMouseAppState.isEnabled()) { selectPieceByMouseAppState.update(tpf); } } @Override public void onAction(String name, boolean keyPressed, float tpf) { PieceManager piece; if (!isEnabled()) { return; } if (name.equals(CLICK_MAPPING)) { switch (currentState) { case WAITING: if (keyPressed && selectPieceByMouseAppState.getPieceUnderMouse() != null) { changeStateTo(State.SELECTING_PIECE); if (selectPieceByMouseAppState.getSelectedPiece() != null) { changeStateTo(State.MOVING_PIECE); } } break; case ADDING_PIECE: if (keyPressed) { changeStateTo(State.SELECTING_PIECE); } break; case MOVING_PIECE: changeStateTo(State.SELECTING_PIECE); break; case SELECTING_PIECE: changeStateTo(State.SELECTING_PIECE); if (keyPressed && selectPieceByMouseAppState.getSelectedPiece() == selectPieceByMouseAppState.getPieceUnderMouse()) { changeStateTo(State.MOVING_PIECE); } break; } } else if (name.equals(CANCEL_MAPPING) && keyPressed) { switch (currentState) { case WAITING: // Nothing to do here break; case ADDING_PIECE: changeStateTo(State.WAITING); break; case MOVING_PIECE: changeStateTo(State.SELECTING_PIECE); break; case SELECTING_PIECE: changeStateTo(State.WAITING); break; } } else if (name.equals(MOUSE_WHEEL_UP_MAPPING)) { switch (currentState) { case WAITING: // Nothing to do here break; case ADDING_PIECE: rotatePiece(placePieceByMouseAppState.getPieceToPlace(), true); break; case MOVING_PIECE: rotatePiece(placePieceByMouseAppState.getPieceToPlace(), true); break; case SELECTING_PIECE: rotatePiece(selectPieceByMouseAppState.getSelectedPiece(), true); break; } } else if (name.equals(MOUSE_WHEEL_DOWN_MAPPING)) { switch (currentState) { case WAITING: // Nothing to do here break; case ADDING_PIECE: rotatePiece(placePieceByMouseAppState.getPieceToPlace(), false); break; case MOVING_PIECE: rotatePiece(placePieceByMouseAppState.getPieceToPlace(), false); break; case SELECTING_PIECE: rotatePiece(selectPieceByMouseAppState.getSelectedPiece(), false); break; } } else if (name.equals(DELETE_MAPPING) && keyPressed) { switch (currentState) { case WAITING: // Nothing to do here break; case ADDING_PIECE: changeStateTo(State.WAITING); break; case MOVING_PIECE: piece = placePieceByMouseAppState.getPieceToPlace(); if (piece != null) { HexScapeCore.getInstance().getMapManager().removePiece(piece); CoreMessageBus.post(new PieceRemovedMessage(CurrentUserInfo.getInstance().getPlayerId(), piece.getPiece().getId())); } changeStateTo(State.WAITING); break; case SELECTING_PIECE: piece = selectPieceByMouseAppState.getSelectedPiece(); if (piece != null) { HexScapeCore.getInstance().getMapManager().removePiece(piece); CoreMessageBus.post(new PieceRemovedMessage(CurrentUserInfo.getInstance().getPlayerId(), piece.getPiece().getId())); } changeStateTo(State.WAITING); break; } } else if (name.equals(POV_MAPPING) && !keyPressed) { if (currentState == State.SELECTING_PIECE) { HexScapeCore.getInstance().getHexScapeJme3Application().lookThroughEyesOf(selectPieceByMouseAppState.getSelectedPiece()); } } } public void rotatePiece(PieceManager pieceManager, boolean clockwise) { Direction newDir = DirectionService.getInstance().rotate(pieceManager.getPiece().getDirection(), clockwise); pieceManager.rotate(newDir); CoreMessageBus.post(new PieceMovedMessage(CurrentUserInfo.getInstance().getPlayerId(), pieceManager.getPiece().getId(), pieceManager.getPiece().getX(), pieceManager.getPiece().getY(),pieceManager.getPiece().getZ(), pieceManager.getPiece().getDirection())); } private void changeStateTo(State newState) { PieceManager piece; switch (newState) { case WAITING: switch (currentState) { case SELECTING_PIECE: piece = selectPieceByMouseAppState.getSelectedPiece(); CoreMessageBus.post(new PieceUnselectedMessage(CurrentUserInfo.getInstance().getPlayerId(), piece.getPiece().getId())); selectPieceByMouseAppState.cancelSelection(); break; case MOVING_PIECE: piece = selectPieceByMouseAppState.getSelectedPiece(); CoreMessageBus.post(new PieceUnselectedMessage(CurrentUserInfo.getInstance().getPlayerId(), piece.getPiece().getId())); selectPieceByMouseAppState.cancelSelection(); break; default: break; } placePieceByMouseAppState.setEnabled(false); selectPieceByMouseAppState.setEnabled(true); break; case ADDING_PIECE: switch (currentState) { case WAITING: // Nothing to do here break; case SELECTING_PIECE: piece = selectPieceByMouseAppState.getSelectedPiece(); CoreMessageBus.post(new PieceUnselectedMessage(CurrentUserInfo.getInstance().getPlayerId(), piece.getPiece().getId())); selectPieceByMouseAppState.cancelSelection(); break; case ADDING_PIECE: // Nothing to do here break; case MOVING_PIECE: // Nothing to do here break; default: break; } selectPieceByMouseAppState.setEnabled(false); placePieceByMouseAppState.setEnabled(true); break; case MOVING_PIECE: switch (currentState) { case SELECTING_PIECE: placePieceByMouseAppState.setPieceToPlace(selectPieceByMouseAppState.getSelectedPiece()); break; default: break; } selectPieceByMouseAppState.setEnabled(true); placePieceByMouseAppState.setEnabled(true); break; case SELECTING_PIECE: switch (currentState) { case WAITING: if (selectPieceByMouseAppState.selectPiece()) { piece = selectPieceByMouseAppState.getSelectedPiece(); CoreMessageBus.post(new PieceSelectedMessage(CurrentUserInfo.getInstance().getPlayerId(), piece.getPiece().getId())); } break; case SELECTING_PIECE: if (selectPieceByMouseAppState.selectPiece()) { piece = selectPieceByMouseAppState.getSelectedPiece(); CoreMessageBus.post(new PieceSelectedMessage(CurrentUserInfo.getInstance().getPlayerId(), piece.getPiece().getId())); } else { return; } break; case ADDING_PIECE: piece = placePieceByMouseAppState.getPieceToPlace(); if (placePieceByMouseAppState.placePiece()) { CoreMessageBus.post(new PiecePlacedMessage(CurrentUserInfo.getInstance().getPlayerId(), piece.getPiece().getCard().getId(), piece.getPiece().getId(), piece.getPiece().getModelId(), piece.getPiece().getX(), piece.getPiece().getY(),piece.getPiece().getZ(), piece.getPiece().getDirection())); selectPieceByMouseAppState.selectPiece(piece); CoreMessageBus.post(new PieceSelectedMessage(CurrentUserInfo.getInstance().getPlayerId(), piece.getPiece().getId())); } else { return; } break; case MOVING_PIECE: piece = placePieceByMouseAppState.getPieceToPlace(); if (placePieceByMouseAppState.hasMovedEnoughToInitMove()) { if (placePieceByMouseAppState.placePiece()) { CoreMessageBus.post(new PieceMovedMessage(CurrentUserInfo.getInstance().getPlayerId(), piece.getPiece().getId(), piece.getPiece().getX(), piece.getPiece().getY(),piece.getPiece().getZ(), piece.getPiece().getDirection())); selectPieceByMouseAppState.selectPiece(piece); } else { return; } } break; default: break; } placePieceByMouseAppState.setEnabled(false); selectPieceByMouseAppState.setEnabled(true); break; } currentState = newState; } }