async public Task PerformMovement(int nextNodeID) { Vector3 nextLocation = pathService.GetNodeLocation(nextNodeID); if (pathService.CheckIfTeleportable(playerNodeID, nextNodeID)) { pathService.HighlightTeleportNodes(nextNodeID); } //else { // pathService.UnhighlightTeleportableNodes(); //} await MoveToLocation(nextLocation); playerNodeID = nextNodeID; if (interactableService.CheckForInteractable(nextNodeID)) { IInteractableController interactableController = interactableService.ReturnInteractableController(nextNodeID); PerformInteractableAction(interactableController); } if (IsGameFinished()) { playerService.FireLevelFinishedSignal(); } else if (GetPlayerState() != PlayerStates.WAIT_FOR_INPUT) { gameService.ChangeToEnemyState(); } }
async private Task NewWaitForTask(IInteractableController _interactableController, PlayerStates playerState) { int nodeID; while (stateMachine.GetPlayerState() == this.currentStateType) { nodeID = playerService.GetTargetNode(); if (nodeID != -1) { //bool inRange = playerService.CheckForRange(nodeID); bool inRange = _interactableController.CanTakeAction(playerService.GetPlayerNodeID(), nodeID); if (inRange) { stateMachine.ChangePlayerState(playerState, PlayerStates.NONE); _interactableController.TakeAction(nodeID); stateMachine.ChangePlayerState(PlayerStates.END_TURN, PlayerStates.NONE); playerService.ChangeToEnemyState(); break; } else { await new WaitForEndOfFrame(); } } else { await new WaitForEndOfFrame(); } } }
async public Task OnStateEnter(PlayerStates playerStates = PlayerStates.NONE, IInteractableController controller = null) { playerView.PlayAnimation(currentStateType); if (controller != null && playerStates != PlayerStates.NONE) { await new WaitForEndOfFrame(); } }
async public Task ChangePlayerState(PlayerStates _state, PlayerStates stateToChange, IInteractableController interactableController = null) { previousState = currentState; if (previousState != null) { previousState.OnStateExit(); } switch (_state) { case PlayerStates.AMBUSH: currentState = new PlayerAmbushState(playerView, this, playerService); break; case PlayerStates.DISGUISE: currentState = new PlayerDisguiseState(playerView, this, playerService); break; case PlayerStates.IDLE: currentState = new PlayerIdleState(playerView, this, playerService); break; case PlayerStates.SHOOTING: currentState = new PlayerShootingState(playerView, this, playerService); break; case PlayerStates.UNLOCK_DOOR: currentState = new PlayerDoorUnlock(playerView, this, playerService); break; case PlayerStates.WAIT_FOR_INPUT: currentState = new PlayerWaitingForInputState(playerView, this, playerService); break; case PlayerStates.THROWING: currentState = new PlayerThrowingState(playerView, this, playerService); break; case PlayerStates.END_TURN: currentState = new PlayerEndTurnState(playerView, this, playerService); break; case PlayerStates.INTERMEDIATE_MOVE: currentState = new PlayerIntermediateMoveState(playerView, this, playerService); break; default: currentState = new PlayerIdleState(playerView, this, playerService); break; } if (interactableController != null && stateToChange != PlayerStates.NONE) { await currentState.OnStateEnter(stateToChange, interactableController); } else { await currentState.OnStateEnter(); } }
async public Task OnStateEnter(PlayerStates playerStates = PlayerStates.NONE, IInteractableController controller = null) { if (controller != null && playerStates != PlayerStates.NONE) { await new WaitForEndOfFrame(); } }
async public Task ChangePlayerState(PlayerStates _state, PlayerStates stateToChange, IInteractableController interactableController = null) { await playerStateMachine.ChangePlayerState(_state, stateToChange, interactableController); }
async public void PerformInteractableAction(IInteractableController _interactableController) { int nodeID = playerService.GetTargetNode(); switch (_interactableController.GetInteractablePickup()) { case InteractablePickup.AMBUSH_PLANT: await ChangePlayerState(PlayerStates.AMBUSH, PlayerStates.NONE); _interactableController.TakeAction(playerNodeID); break; case InteractablePickup.BONE: pathService.ShowThrowableNodes(playerNodeID); playerService.SetTargetTap(-1); await ChangePlayerState(PlayerStates.WAIT_FOR_INPUT, PlayerStates.THROWING, _interactableController); break; case InteractablePickup.BREIFCASE: await ChangePlayerState(PlayerStates.IDLE, PlayerStates.NONE); _interactableController.TakeAction(playerNodeID); await new WaitForEndOfFrame(); break; case InteractablePickup.COLOR_KEY: await ChangePlayerState(PlayerStates.IDLE, PlayerStates.NONE); _interactableController.TakeAction(playerNodeID); break; case InteractablePickup.DUAL_GUN: await ChangePlayerState(PlayerStates.IDLE, PlayerStates.NONE); _interactableController.TakeAction(playerNodeID); break; case InteractablePickup.GUARD_DISGUISE: await ChangePlayerState(PlayerStates.DISGUISE, PlayerStates.NONE); _interactableController.TakeAction(playerNodeID); break; case InteractablePickup.SNIPER_GUN: playerService.SetTargetTap(-1); currentPlayerView.PlayAnimation(PlayerStates.SHOOTING); await ChangePlayerState(PlayerStates.WAIT_FOR_INPUT, PlayerStates.SHOOTING, _interactableController); break; case InteractablePickup.STONE: pathService.ShowThrowableNodes(playerNodeID); playerService.SetTargetTap(-1); await ChangePlayerState(PlayerStates.WAIT_FOR_INPUT, PlayerStates.THROWING, _interactableController); break; case InteractablePickup.TRAP_DOOR: playerService.SetTargetTap(-1); await ChangePlayerState(PlayerStates.WAIT_FOR_INPUT, PlayerStates.UNLOCK_DOOR, _interactableController); break; } await new WaitForEndOfFrame(); }