private bool IsLastFrame(BaseGameFrame frame) { var attrs = frame.GetType().GetCustomAttributes(typeof(GameFrameAttribute), true); foreach (var attr in attrs) { if (((GameFrameAttribute)attr).IsLastFrame) { return(true); } } return(false); }
/// <summary> /// Starts the game! Uses whatever screen is currently configured /// </summary> /// <param name="new_character"></param> public void Run(bool new_character = false) { BaseGameFrame current_frame = null; var character = GameManager.Get <ICharacter>(); if (!character.IsInitialized || new_character || character.Count() < 1) { logger.Info("No valid character was found or new character parameter was true. Requesting new character be created"); character = GameManager.NewCharacter(); current_frame = this.FindFirstFrame(); } else { var last_decision = character.OrderBy(x => x.DecisionHistoryOrder).Last(); current_frame = this.Frames[last_decision.ChosenFrame]; } var screen = GameManager.Get <IScreen>(); while (true) { var opt = screen.GetDecision(current_frame); if (this.IsLastFrame(current_frame)) { logger.InfoFormat("Game ended because current frame is set as last frame - {0}", current_frame.ID); break; } current_frame.MakeDecision(opt, character); if (opt == GameLoop.ExitOptionCode) { logger.Info("Screen requested exit"); break; } if (opt == GameLoop.GotoExitFrameOptionCode) { logger.Info("Screen requested go to last frame"); var f = this.Frames.Values.FirstOrDefault(x => this.IsLastFrame(x)); if (f == null) { logger.Info("No last frame found. Exiting"); break; } current_frame = f; continue; } if (opt == GameLoop.NewGameOptionCode) { logger.Info("Screen requested new game"); character = GameManager.NewCharacter(); current_frame = this.FindFirstFrame(); continue; } if (opt == GameLoop.SaveOverCharacterOptionCode) { logger.Info("Screen requested save over character. Frame not advanced this loop"); GameManager.SaveCurrentCharacter(false); continue; } if (opt == GameLoop.SaveOverCharacterOptionCode) { logger.Info("Screen requested save character with backup. Frame not advanced this loop"); GameManager.SaveCurrentCharacter(); continue; } if (!current_frame.Choices.ContainsKey(opt)) { logger.InfoFormat("Game ended because no option could be found with ID {0}", opt); break; } var next_id = current_frame.Choices[opt].NextFrameID; if (!this.Frames.ContainsKey(next_id)) { logger.InfoFormat("Game ended because no frame could be found with ID {0}", next_id); break; } current_frame = this.Frames[current_frame.Choices[opt].NextFrameID]; character.StoreDecision(current_frame.ID); } GameManager.Quit(); }