/// <summary> /// Setup code called before game runs. /// </summary> protected override void BeginRun() { base.BeginRun(); var recordingpath = Options.RecordingPath ?? string.Empty; var recording = BuildRecording(recordingpath); if (recording != null) { m_subsystems.GetMainSystem <Menus.MenuSystem>().PostEvent(new Events.LoadReplay(recording)); m_subsystems.GetMainSystem <Menus.MenuSystem>().PostEvent(new Events.SwitchScreen(ScreenType.Replay)); return; } if (Options.Stage != null || Options.Player1 != null) { var p1 = GetPlayer(Options.Player1); var p2 = GetPlayer(Options.Player2); var p3 = Options.Player3 != null?GetPlayer(Options.Player3) : null; var p4 = Options.Player4 != null?GetPlayer(Options.Player4) : null; StageProfile stage = null; var stages = m_subsystems.GetMainSystem <Menus.MenuSystem>().GetSubSystem <ProfileLoader>().StageProfiles; if (Options.Stage != null) { var filePath = $"stages/{Options.Stage}.def"; stage = stages.FirstOrDefault(o => string.Equals(o.Filepath, $"stages/{Options.Stage}.def", StringComparison.OrdinalIgnoreCase)); if (stage == null) { throw new EvaluationException($"Error message: Can't open stage :{filePath}"); } } stage = stage ?? stages.FirstOrDefault(); var team1Mode = p3 != null ? TeamMode.Simul : TeamMode.Single; var team2Mode = p4 != null ? TeamMode.Simul : TeamMode.Single; var init = new Combat.EngineInitialization(CombatMode.Versus, team1Mode, team2Mode, p1.Profile, 0, PlayerMode.Human, p3?.Profile, 0, PlayerMode.Ai, p2.Profile, 0, PlayerMode.Human, p4?.Profile, 0, PlayerMode.Ai, stage); m_subsystems.GetMainSystem <Menus.MenuSystem>().PostEvent(new Events.SetupCombat(init)); m_subsystems.GetMainSystem <Menus.MenuSystem>().PostEvent(new Events.SwitchScreen(ScreenType.Versus)); return; } m_subsystems.GetMainSystem <Menus.MenuSystem>().PostEvent(new Events.SwitchScreen(ScreenType.Title)); }
Replay.Recording BuildRecording(String filepath) { if (filepath == null) { throw new ArgumentNullException("filepath"); } ProfileLoader profiles = m_subsystems.GetSubSystem <ProfileLoader>(); if (m_subsystems.GetSubSystem <IO.FileSystem>().DoesFileExist(filepath) == false) { return(null); } IO.TextFile text = m_subsystems.GetSubSystem <IO.FileSystem>().OpenTextFile(filepath); IO.TextSection header = text.GetSection("xnaMugen Replay Header"); IO.TextSection data = text.GetSection("xnaMugen Replay Data"); if (header == null || data == null) { return(null); } Int32 version = header.GetAttribute <Int32>("Version", 0); CombatMode mode = header.GetAttribute <CombatMode>("Combat Mode", CombatMode.None); String p1name = header.GetAttribute <String>("Player 1 Name", null); String p1version = header.GetAttribute <String>("Player 1 Version", null); Int32 p1palette = header.GetAttribute <Int32>("Player 1 Palette", Int32.MinValue); String p2name = header.GetAttribute <String>("Player 2 Name", null); String p2version = header.GetAttribute <String>("Player 2 Version", null); Int32 p2palette = header.GetAttribute <Int32>("Player 2 Palette", Int32.MinValue); String stagepath = header.GetAttribute <String>("Stage Path", null); Int32 seed = header.GetAttribute <Int32>("Seed", Int32.MinValue); if (version != 1 || mode == CombatMode.None || stagepath == null || seed == Int32.MinValue) { return(null); } if (p1name == null || p1version == null || p1palette == Int32.MinValue) { return(null); } PlayerProfile p1profile = profiles.FindPlayerProfile(p1name, p1version); PlayerProfile p2profile = profiles.FindPlayerProfile(p2name, p2version); StageProfile stageprofile = profiles.FindStageProfile(stagepath); if (p1profile == null || p2profile == null || stageprofile == null) { return(null); } Combat.EngineInitialization initsettings = new Combat.EngineInitialization(mode, p1profile, p1palette, p2profile, p2palette, stageprofile, seed); List <Replay.RecordingData> replaydata = new List <Replay.RecordingData>(); Regex line_regex = new Regex(@"^(\d+),\s*(\d+),\s*(\d+),\s*(\d+),\s*(\d+)$", RegexOptions.IgnoreCase); StringConverter converter = profiles.GetSubSystem <StringConverter>(); foreach (String dataline in data.Lines) { Match match = line_regex.Match(dataline); if (match.Success == false) { continue; } Replay.RecordingData inputdata = new Replay.RecordingData( converter.Convert <Int32>(match.Groups[1].Value), converter.Convert <Int32>(match.Groups[2].Value), converter.Convert <Int32>(match.Groups[3].Value), converter.Convert <Int32>(match.Groups[4].Value), converter.Convert <Int32>(match.Groups[5].Value) ); replaydata.Add(inputdata); } return(new Replay.Recording(initsettings, replaydata)); }