public void Move( Tile.Direction direction, Player movingPlayer, Player destinationTilePlayer, MoveDetails moveDetails ) { Tile currentTile = GetTile(movingPlayer); Wall wall = currentTile.GetWall(direction); if (wall == null) { moveDetails.Status = MoveDetails.MoveStatus.ABORTED; } else { wall.GoThrough( movingPlayer, destinationTilePlayer, moveDetails ); if (moveDetails.Status != MoveDetails.MoveStatus.FAILURE) { movingPlayer.Pos.Move(direction); } } }
public static List<SoundFX> GetNextPlayerSounds(MoveDetails moveDetails, Game game) { if (game.GameOver()) { return new List<SoundFX> { SoundFX.DEFEAT }; } else { if (moveDetails.PlayAgain) { return new List<SoundFX> { SoundFX.PLAY_AGAIN }; } else { return GetWelcomeSounds(game.CurrentPlayer()); } } }
public static List<SoundFX> GetMoveSounds(MoveDetails moveDetails) { if (moveDetails.Status == MoveDetails.MoveStatus.ABORTED) { return new List<SoundFX> { SoundFX.BORDER }; } else { // First insert the purely move-related sounds return new List<SoundFX> { GetWallSound(moveDetails.WallType), moveDetails.Status == MoveDetails.MoveStatus.FAILURE ? SoundFX.THOU_SHALT_NOT_PASS : SoundFX.THOU_SHALT_PASS }; } }
public void Update() { switch (m_stateMachine.CurrentState) { case GameManagerStateMachine.State.WAIT_FOR_INPUT: Tile.Direction input = m_gameInput.GetNewInput(); if (input != Tile.Direction.NONE) { Debug.Log("Input detected : " + input); MoveDetails moveDetails = m_game.Move(input); List <SoundMixer.SoundFX> allSounds = SoundMixer.GetMoveSounds(moveDetails); if (moveDetails.Status != MoveDetails.MoveStatus.ABORTED) { allSounds.AddRange(SoundMixer.GetNextPlayerSounds( moveDetails, m_game )); } m_soundManager.PlayAllSounds(allSounds); m_stateMachine.MoveNext( GameManagerStateMachine.Event.INPUT_RECEIVED ); } break; case GameManagerStateMachine.State.PLAYING_SOUNDS: if (m_soundManager.Done()) { m_stateMachine.MoveNext( GameManagerStateMachine.Event.SOUND_FINISHED ); } break; default: Debug.LogError("Unknown state: " + m_stateMachine.CurrentState); break; } }
public virtual void GoThrough(Player player, Player destinationTilePlayer, MoveDetails moveDetails) { MoveDetails.MoveStatus successStatus = m_traversed ? MoveDetails.MoveStatus.SUCCESS_KNOWN : MoveDetails.MoveStatus.SUCCESS_NEW; moveDetails.WallType = WallType; switch (WallType) { case Wall.Type.OPEN: moveDetails.Status = successStatus; break; case Wall.Type.CLOSED: moveDetails.Status = MoveDetails.MoveStatus.FAILURE; break; case Wall.Type.MOUSE_HOLE: moveDetails.Status = (player.AnimalType == Player.Animal.MOUSE) ? successStatus : MoveDetails.MoveStatus.FAILURE; break; case Wall.Type.RABBIT_HOLE: moveDetails.Status = (player.AnimalType == Player.Animal.RABBIT) ? successStatus : MoveDetails.MoveStatus.FAILURE; break; case Wall.Type.MAGIC_DOOR: moveDetails.Status = m_traversed || (destinationTilePlayer != null) ? successStatus : MoveDetails.MoveStatus.FAILURE; break; } m_traversed = moveDetails.Status != MoveDetails.MoveStatus.FAILURE; }
public MoveDetails Move(Tile.Direction direction) { Player currentPlayer = m_players[m_currentPlayerIndex]; MoveDetails moveDetails = new MoveDetails(currentPlayer); m_board.Move( direction, currentPlayer, m_players.Find(x => x.Pos == currentPlayer.Pos.OffsetPosition(direction)), moveDetails ); if (moveDetails.Status == MoveDetails.MoveStatus.SUCCESS_KNOWN && !m_currentPlayerAlreadyMoved) { // let the same player play again m_currentPlayerAlreadyMoved = true; moveDetails.PlayAgain = true; } else if (moveDetails.Status != MoveDetails.MoveStatus.ABORTED) { NextPlayer(); } return(moveDetails); }