/// <summary> /// /// </summary> /// <param name="evt"></param> /// <param name="chosenDifficulty"></param> /// <param name="client"></param> private void ChooseDifficultyHandler(string evt, byte[] chosenDifficulty, VMEODClient client) { if (GameState.Equals(FreeSOMazeStates.Lobby) && NextState.Equals(FreeSOMazeStates.Invalid)) { FreeSOMazePlayer caller = null; FreeSOMazePlayer partner = null; if (LogicPlayer != null && client.Equals(LogicPlayer.Client)) { caller = LogicPlayer; partner = CharismaPlayer; } else { caller = CharismaPlayer; partner = LogicPlayer; } int difficultyNum = BitConverter.ToInt32(chosenDifficulty, 0); FreeSOMazeDifficulties difficulty = FreeSOMazeDifficulties.Unselected; if (Enum.IsDefined(typeof(FreeSOMazeDifficulties), difficultyNum)) { difficulty = (FreeSOMazeDifficulties)Enum.ToObject(typeof(FreeSOMazeDifficulties), difficultyNum); } ValidateDifficulty(caller, difficulty, partner); } }
internal void Reset() { _BreadCrumbs = new List <AbstractMazeCell <FreeSOMazeData> >(); _Difficulty = FreeSOMazeDifficulties.Unselected; _Location = null; _Cooldown = 0; _TotalMoves = 0; _Payout = 0; DelayedEvents = new List <Tuple <string, byte[]> >(); }
/// <summary> /// Validates the difficulties of both players, triggering the start of the game only if they both agree. /// </summary> /// <param name="caller"></param> /// <param name="chosenDifficulty"></param> /// <param name="partner"></param> private void ValidateDifficulty(FreeSOMazePlayer caller, FreeSOMazeDifficulties chosenDifficulty, FreeSOMazePlayer partner) { lock (DifficultyLock) { if (GameState.Equals(FreeSOMazeStates.Lobby) && NextState.Equals(FreeSOMazeStates.Invalid)) { caller.Difficulty = chosenDifficulty; if (partner != null) { if (caller.Difficulty.Equals(partner.Difficulty)) { ChosenMazeDifficulty = chosenDifficulty; EnqueueGotoState(FreeSOMazeStates.GeneratingMaze); } else { partner.Send("FreeSOMaze_partner_difficulty", BitConverter.GetBytes((int)chosenDifficulty)); } } } } }
/// <summary> /// /// </summary> /// <param name="state"></param> private void GotoState(FreeSOMazeStates state) { GameState = state; Tock = 0; switch (state) { case FreeSOMazeStates.Lobby: { ChosenMazeDifficulty = FreeSOMazeDifficulties.Unselected; CharismaPlayer?.Reset(); if (CharismaPlayer?.IsLoaded ?? false) { SendLobbyInfoEvent(CharismaPlayer, LogicPlayer); } LogicPlayer?.Reset(); if (LogicPlayer?.IsLoaded ?? false) { SendLobbyInfoEvent(LogicPlayer, CharismaPlayer); } if (CurrentMaze != null) { CurrentMaze.OnMazeGenerated -= MazeGeneratedHandler; CurrentMaze.OnFinalProcessingCell -= OnProcessedCellHandler; CurrentMaze.OnDeadEndCreation -= OnDeadEndHandler; Solution = null; RawMaze = null; MazeTimeRemaining = 0; BroadcastSharedEvent("FreeSOMaze_time", BitConverter.GetBytes(MazeTimeRemaining)); } else { EveryDeadEndCell = new List <AbstractMazeCell <FreeSOMazeData> >(); } break; } case FreeSOMazeStates.GeneratingMaze: { CurrentMaze = AbstractMazeGenerator <FreeSOMazeData> .GetEmptyMaze(MazeSizes[ChosenMazeDifficulty], MazeSizes[ChosenMazeDifficulty]); CurrentMaze.OnMazeGenerated += MazeGeneratedHandler; CurrentMaze.OnFinalProcessingCell += OnProcessedCellHandler; CurrentMaze.OnDeadEndCreation += OnDeadEndHandler; var origin = ThankU.Next(0, (int)BuildFromOrigins.Dead_Center + 1); CurrentMaze.BuildFromOrigin(origin); BroadcastSharedEvent("FreeSOMaze_goto_maze", BitConverter.GetBytes((int)ChosenMazeDifficulty)); break; } case FreeSOMazeStates.LoadingMaze: { MazeTimeRemaining = 0; int cardinal = 0; if (CharismaPlayer != null) { cardinal = GetSolutionCardinal(CharismaPlayer); CharismaPlayer.CurrentFacingCardinal = (FreeSOMazeCardinals)Enum.ToObject(typeof(FreeSOMazeCardinals), cardinal); CharismaPlayer.Send("FreeSOMaze_show_maze", CharismaPlayer.GetLocationData((int)FreeSOMazeCardinals.Invalid)); } if (LogicPlayer != null) { cardinal = GetSolutionCardinal(LogicPlayer); LogicPlayer.CurrentFacingCardinal = (FreeSOMazeCardinals)Enum.ToObject(typeof(FreeSOMazeCardinals), cardinal); LogicPlayer.Send("FreeSOMaze_show_maze", LogicPlayer.GetLocationData((int)FreeSOMazeCardinals.Invalid)); } break; } case FreeSOMazeStates.NavigatingMaze: { CharismaPlayer.Cooldown = GLOBAL_COOLDOWN; LogicPlayer.Cooldown = GLOBAL_COOLDOWN; SendAllowMazeEvent(CharismaPlayer, false); SendAllowMazeEvent(LogicPlayer, false); MazeTimeRemaining = RoundTimes[ChosenMazeDifficulty]; BroadcastSharedEvent("FreeSOMaze_time", BitConverter.GetBytes(MazeTimeRemaining)); break; } case FreeSOMazeStates.Gameover: { MazeTimeRemaining = 0; break; } } }