private static void onSaveDataAfterInitialize(On.Celeste.SaveData.orig_AfterInitialize orig, SaveData self) { orig(self); foreach (string collabName in collabNames) { // be sure that all lobbies are unlocked. LevelSetStats stats = self.GetLevelSetStatsFor($"{collabName}/0-Lobbies"); if (stats != null && (stats.UnlockedAreas > 0 || AreaData.Get($"{collabName}/0-Lobbies/0-Prologue") == null)) // we at least completed Prologue. { stats.UnlockedAreas = stats.Areas.Count - 1; } } if (self.CurrentSession_Safe == null || !self.CurrentSession_Safe.InArea) { // we aren't in a level; check if we have a hidden level set selected (this should only happen with Alt-F4). string lobby = GetLobbyForLevelSet(self.LastArea_Safe.GetLevelSet()); if (lobby != null) { // we are! we should change the selected level to the matching lobby instead. self.LastArea_Safe = AreaData.Get(lobby).ToKey(); } } }
private static void CmdClearSave() { SaveData.TryDelete(-1); SaveData.Start(new SaveData { Name = "debug" }, -1); // Pretend that we've beaten Prologue. LevelSetStats stats = SaveData.Instance.GetLevelSetStatsFor("Celeste"); stats.UnlockedAreas = 1; stats.AreasIncludingCeleste[0].Modes[0].Completed = true; }
private static int countTotalHeartGemsForMapsThatHaveHearts(LevelSetStats levelSetStats) { return(levelSetStats.AreasIncludingCeleste.Sum((AreaStats area) => { int totalHeartGems = 0; ModeProperties[] propertiesOfAllModes = AreaData.Get(area.GetSID())?.Mode ?? new ModeProperties[0]; for (int i = 0; i < propertiesOfAllModes.Length && i < area.Modes.Length; i++) { if (area.Modes[i].HeartGem) { // the crystal heart of this map/mode was collected, so check if it has one before counting it in. ModeProperties modeProperties = propertiesOfAllModes[i]; if (modeProperties?.MapData != null && modeProperties.MapData.Area.Mode <= AreaMode.CSide) { totalHeartGems += (modeProperties.MapData.DetectedHeartGem ? 1 : 0); } } } return totalHeartGems; })); }
private static IEnumerator onAssistUnlockRoutine(On.Celeste.OuiChapterSelectIcon.orig_AssistModeUnlockRoutine orig, OuiChapterSelectIcon self, Action onComplete) { IEnumerator origRoutine = orig(self, onComplete); while (origRoutine.MoveNext()) { yield return(origRoutine.Current); } string collab = collabNames.FirstOrDefault(collabName => AreaData.Get(self.Area).GetLevelSet() == $"{collabName}/0-Lobbies"); if (collab != null) { // we just assist unlocked the lobbies! LevelSetStats stats = SaveData.Instance.GetLevelSetStatsFor($"{collab}/0-Lobbies"); stats.UnlockedAreas = stats.Areas.Count - 1; List <OuiChapterSelectIcon> icons = new DynData <OuiChapterSelect>((self.Scene as Overworld).GetUI <OuiChapterSelect>()).Get <List <OuiChapterSelectIcon> >("icons"); icons[self.Area + 1].AssistModeUnlockable = false; for (int i = self.Area + 2; i <= SaveData.Instance.MaxArea; i++) { icons[i].Show(); } } }
private void ReloadItems() { foreach (TextMenu.Item item in items) { menu.Remove(item); } items.Clear(); string filterSet = null; if (type == 0) { filterSet = "Celeste"; } else if (type >= 2) { filterSet = sets[type - 2]; } string lastLevelSet = null; LevelSetStats levelSetStats = null; int levelSetAreaOffset = 0; int levelSetUnlockedAreas = int.MaxValue; int levelSetUnlockedModes = int.MaxValue; string name; List <AreaStats> areaStatsAll = SaveData.Instance.Areas; for (int i = 0; i < AreaData.Areas.Count; i++) { AreaData area = AreaData.Areas[i]; if (!area.HasMode((AreaMode)side)) { continue; } string levelSet = area.GetLevelSet(); if ((filterSet == null && levelSet == "Celeste") || (filterSet != null && filterSet != levelSet)) { continue; } if (lastLevelSet != levelSet) { lastLevelSet = levelSet; levelSetStats = SaveData.Instance.GetLevelSetStatsFor(levelSet); levelSetAreaOffset = levelSetStats.AreaOffset; levelSetUnlockedAreas = levelSetStats.UnlockedAreas; levelSetUnlockedModes = levelSetStats.UnlockedModes; if (levelSet != "Celeste") { name = DialogExt.CleanLevelSet(levelSet); TextMenuExt.SubHeaderExt levelSetHeader = new TextMenuExt.SubHeaderExt(name); levelSetHeader.Alpha = 0f; menu.Add(levelSetHeader); items.Add(levelSetHeader); } } name = area.Name; name = name.DialogCleanOrNull() ?? name.SpacedPascalCase(); TextMenuExt.ButtonExt button = new TextMenuExt.ButtonExt(name); button.Alpha = 0f; if (area.Icon != "areas/null") { button.Icon = area.Icon; } button.IconWidth = 64f; if (levelSet == "Celeste" && i > levelSetAreaOffset + levelSetUnlockedAreas) { button.Disabled = true; } if (side == 1 && !areaStatsAll[i].Cassette) { button.Disabled = true; } if (side >= 2 && levelSetUnlockedModes < (side + 1)) { button.Disabled = true; } menu.Add(button.Pressed(() => { Inspect(area, (AreaMode)side); })); items.Add(button); } // Do this afterwards as the menu has now properly updated its size. for (int i = 0; i < items.Count; i++) { Add(new Coroutine(FadeIn(i, items[i]))); } if (menu.Height > menu.ScrollableMinSize) { menu.Position.Y = menu.ScrollTargetY; } }
private void ReloadItems() { foreach (TextMenu.Item item in items) { menu.Remove(item); } items.Clear(); string filterSet = null; if (type == 0) { filterSet = "Celeste"; } else if (type >= 3) { filterSet = sets[type - 3]; } string lastLevelSet = null; LevelSetStats levelSetStats = null; int levelSetAreaOffset = 0; int levelSetUnlockedAreas = int.MaxValue; int levelSetUnlockedModes = int.MaxValue; string name; SaveData save = SaveData.Instance; List <AreaStats> areaStatsAll = save.Areas; for (int i = 0; i < AreaData.Areas.Count; i++) { AreaData area = AreaData.Get(i); if (area == null || !area.HasMode((AreaMode)side)) { continue; } // TODO: Make subchapters hidden by default in the map list, even in debug mode. if (!save.DebugMode && !string.IsNullOrEmpty(area.GetMeta()?.Parent)) { continue; } string levelSet = area.GetLevelSet(); if (type != 1 && ((filterSet == null && levelSet == "Celeste") || (filterSet != null && filterSet != levelSet))) { continue; } name = area.Name; name = name.DialogCleanOrNull() ?? name.SpacedPascalCase(); if (lastLevelSet != levelSet) { lastLevelSet = levelSet; levelSetStats = SaveData.Instance.GetLevelSetStatsFor(levelSet); levelSetAreaOffset = levelSetStats.AreaOffset; levelSetUnlockedAreas = levelSetStats.UnlockedAreas; levelSetUnlockedModes = levelSetStats.UnlockedModes; string setname = DialogExt.CleanLevelSet(levelSet); TextMenuExt.SubHeaderExt levelSetHeader = new TextMenuExt.SubHeaderExt(setname); levelSetHeader.Alpha = 0f; menu.Add(levelSetHeader); items.Add(levelSetHeader); } TextMenuExt.ButtonExt button = new TextMenuExt.ButtonExt(name); button.Alpha = 0f; if (area.Icon != "areas/null") { button.Icon = area.Icon; } button.IconWidth = 64f; if (levelSet == "Celeste" && i > levelSetAreaOffset + levelSetUnlockedAreas) { button.Disabled = true; } if (side == 1 && !areaStatsAll[i].Cassette) { button.Disabled = true; } if (side >= 2 && levelSetUnlockedModes < (side + 1)) { button.Disabled = true; } menu.Add(button.Pressed(() => { Inspect(area, (AreaMode)side); })); items.Add(button); } // compute a delay so that options don't take more than a second to show up if many mods are installed. float delayBetweenOptions = 0.03f; if (items.Count > 0) { delayBetweenOptions = Math.Min(0.03f, 1f / items.Count); } // Do this afterwards as the menu has now properly updated its size. for (int i = 0; i < items.Count; i++) { Add(new Coroutine(FadeIn(i, delayBetweenOptions, items[i]))); } if (menu.Height > menu.ScrollableMinSize) { menu.Position.Y = menu.ScrollTargetY; } }
private static void LoadCommand(string command, string[] args) { try { if (SaveData.Instance == null || (!Manager.allowUnsafeInput && SaveData.Instance.FileSlot != -1)) { int slot = SaveData.Instance == null ? -1 : SaveData.Instance.FileSlot; SaveData data = UserIO.Load <SaveData>(SaveData.GetFilename(slot)); SaveData.Start(data, -1); // Complete Prologue if incomplete LevelSetStats stats = SaveData.Instance.GetLevelSetStatsFor("Celeste"); if (stats.UnlockedAreas == 0) { stats.UnlockedAreas = 1; stats.AreasIncludingCeleste[0].Modes[0].Completed = true; } } AreaMode mode = AreaMode.Normal; if (command == "hard") { mode = AreaMode.BSide; } else if (command == "rmx2") { mode = AreaMode.CSide; } int levelID = GetLevelID(args[0]); if (args.Length > 1) { if (!int.TryParse(args[1], out int x)) { string screen = args[1]; if (screen.StartsWith("lvl_")) { screen = screen.Substring(4); } if (args.Length > 2) { int checkpoint = int.Parse(args[2]); Load(mode, levelID, screen, checkpoint); } else { Load(mode, levelID, screen); } } else if (args.Length > 2) { int y = int.Parse(args[2]); Load(mode, levelID, new Vector2(x, y)); } } else { Load(mode, levelID); } } catch { } }
public OuiJournalCollabProgressInOverworld(OuiJournal journal) : base(journal) { bool displaySpeedBerryColumn = shouldDisplaySpeedBerryColumn(); PageTexture = "page"; table = new Table() .AddColumn(new TextCell(Dialog.Clean("journal_progress"), new Vector2(0f, 0.5f), 1f, Color.Black * 0.7f, 420f)) .AddColumn(new EmptyCell(20f)) .AddColumn(new EmptyCell(64f)) .AddColumn(new IconCell("strawberry", 150f)) .AddColumn(new IconCell("skullblue", 100f)) .AddColumn(new IconCell("CollabUtils2MinDeaths/SpringCollab2020/1-Beginner", 100f)); if (OuiJournalCollabProgressDashCountMod.IsDashCountEnabled()) { table.AddColumn(new IconCell("max480/DashCountMod/dashes", 80f)); } table .AddColumn(new IconCell("time", 220f)) .AddColumn(new IconCell("CollabUtils2/speed_berry_pbs_heading", 220f)) .AddColumn(new EmptyCell(30f)); int totalStrawberries = 0; int totalDeaths = 0; int sumOfBestDeaths = 0; int sumOfBestDashes = 0; long totalTime = 0; long sumOfBestTimes = 0; bool allLevelsDone = true; bool allSpeedBerriesDone = true; bool allMapsCompletedInSingleRun = true; foreach (AreaStats item in SaveData.Instance.Areas_Safe) { AreaData areaData = AreaData.Get(item.ID_Safe); if (areaData.GetLevelSet() == SaveData.Instance.LevelSet) { string lobbyMapLevelSetName = LobbyHelper.GetLobbyLevelSet(areaData.GetSID()); LevelSetStats lobbyMapLevelSet = null; if (lobbyMapLevelSetName != null) { lobbyMapLevelSet = SaveData.Instance.GetLevelSetStatsFor(lobbyMapLevelSetName); } int lobbyStrawberries = item.TotalStrawberries; int lobbyTotalStrawberries = areaData.Mode[0].TotalStrawberries; int lobbyDeaths = item.Modes[0].Deaths; int lobbySumOfBestDeaths = 0; int lobbySumOfBestDashes = OuiJournalCollabProgressDashCountMod.DisplaysTotalDashes() ? OuiJournalCollabProgressDashCountMod.GetLevelDashesForJournalProgress(item) : 0; long lobbyTotalTime = item.TotalTimePlayed; long lobbySumOfBestTimes = 0; bool lobbyLevelsDone = true; int lobbySpeedBerryLevel = 1; bool lobbySilverBerriesObtained = true; bool lobbyAllMapsCompletedInSingleRun = true; foreach (AreaStats lobbyMap in lobbyMapLevelSet?.Areas ?? new List <AreaStats>()) { AreaData lobbyAreaData = AreaData.Get(lobbyMap.ID_Safe); lobbyStrawberries += lobbyMap.TotalStrawberries; lobbyTotalStrawberries += lobbyAreaData.Mode[0].TotalStrawberries; lobbyDeaths += lobbyMap.Modes[0].Deaths; lobbyTotalTime += lobbyMap.TotalTimePlayed; lobbyAllMapsCompletedInSingleRun &= lobbyMap.Modes[0].SingleRunCompleted; if (displaySpeedBerryColumn) { if (CollabMapDataProcessor.SpeedBerries.TryGetValue(lobbyMap.GetSID(), out CollabMapDataProcessor.SpeedBerryInfo mapSpeedBerryInfo) && CollabModule.Instance.SaveData.SpeedBerryPBs.TryGetValue(lobbyMap.GetSID(), out long mapSpeedBerryPB)) { lobbySpeedBerryLevel = Math.Max(getRankLevel(mapSpeedBerryInfo, mapSpeedBerryPB), lobbySpeedBerryLevel); lobbySumOfBestTimes += mapSpeedBerryPB; } else { lobbySpeedBerryLevel = 4; } } else { if (lobbyMap.Modes[0].BestTime > 0f) { lobbySumOfBestTimes += lobbyMap.Modes[0].BestTime; } else { lobbySpeedBerryLevel = 4; } } bool goldenBerryNotObtained = !lobbyMap.Modes[0].Strawberries.Any(berry => lobbyAreaData.Mode[0].MapData.Goldenberries.Any(golden => golden.ID == berry.ID && golden.Level.Name == berry.Level)); bool silverBerryNotObtained = !CollabMapDataProcessor.SilverBerries.TryGetValue(lobbyMap.GetLevelSet(), out Dictionary <string, EntityID> levelSetBerries) || !levelSetBerries.TryGetValue(lobbyMap.GetSID(), out EntityID berryID) || !lobbyMap.Modes[0].Strawberries.Contains(berryID); if (goldenBerryNotObtained && silverBerryNotObtained) { lobbySilverBerriesObtained = false; lobbySumOfBestDeaths += lobbyMap.Modes[0].BestDeaths; } lobbySumOfBestDashes += OuiJournalCollabProgressDashCountMod.GetLevelDashesForJournalProgress(lobbyMap); if (!lobbyMap.Modes[0].HeartGem) { lobbyLevelsDone = false; } } string strawberryText = null; if (lobbyStrawberries > 0 || lobbyTotalStrawberries > 0) { strawberryText = lobbyStrawberries.ToString(); if (lobbyLevelsDone) { strawberryText = strawberryText + "/" + lobbyTotalStrawberries; } } else { strawberryText = "-"; } string heartTexturePath = lobbyMapLevelSetName ?? areaData.GetSID(); string heartTexture = MTN.Journal.Has("CollabUtils2Hearts/" + heartTexturePath) ? "CollabUtils2Hearts/" + heartTexturePath : "heartgem0"; string areaName = Dialog.Clean(areaData.Name); if (Dialog.Has(areaData.Name + "_journal")) { areaName = Dialog.Clean(areaData.Name + "_journal"); } Row row = table.AddRow() .Add(new TextCell(areaName, new Vector2(1f, 0.5f), 0.6f, TextColor)) .Add(null) .Add(new IconCell(item.Modes[0].HeartGem ? heartTexture : "dot")) .Add(new TextCell(strawberryText, TextJustify, 0.5f, TextColor)); if (lobbyTotalTime > 0) { row.Add(new TextCell(Dialog.Deaths(lobbyDeaths), TextJustify, 0.5f, TextColor)); } else { row.Add(new IconCell("dot")); } if (lobbyLevelsDone) { AreaStats stats = SaveData.Instance.GetAreaStatsFor(areaData.ToKey()); if (lobbyMapLevelSet == null) { row.Add(new TextCell(Dialog.Deaths(item.Modes[0].BestDeaths), TextJustify, 0.5f, TextColor)); sumOfBestDeaths += item.Modes[0].BestDeaths; } else if (lobbySilverBerriesObtained) { row.Add(new IconCell("CollabUtils2/golden_strawberry")); } else if (lobbyAllMapsCompletedInSingleRun) { row.Add(new TextCell(Dialog.Deaths(lobbySumOfBestDeaths), TextJustify, 0.5f, TextColor)); } else { row.Add(new IconCell("dot")); } } else { row.Add(new IconCell("dot")); allLevelsDone = false; } if (OuiJournalCollabProgressDashCountMod.IsDashCountEnabled()) { if (lobbyMapLevelSet == null) { if ((OuiJournalCollabProgressDashCountMod.DisplaysTotalDashes() && item.TotalTimePlayed > 0) || item.Modes[0].SingleRunCompleted) { row.Add(new TextCell(Dialog.Deaths(OuiJournalCollabProgressDashCountMod.GetLevelDashesForJournalProgress(item)), TextJustify, 0.5f, TextColor)); sumOfBestDashes += OuiJournalCollabProgressDashCountMod.GetLevelDashesForJournalProgress(item); } else { row.Add(new IconCell("dot")); } } else if ((OuiJournalCollabProgressDashCountMod.DisplaysTotalDashes() && item.TotalTimePlayed > 0) || lobbyAllMapsCompletedInSingleRun) { row.Add(new TextCell(Dialog.Deaths(lobbySumOfBestDashes), TextJustify, 0.5f, TextColor)); } else { row.Add(new IconCell("dot")); } } if (lobbyTotalTime > 0) { row.Add(new TextCell(Dialog.Time(lobbyTotalTime), TextJustify, 0.5f, TextColor)); } else { row.Add(new IconCell("dot")); } if (lobbyMapLevelSet == null) { row.Add(new TextCell("-", TextJustify, 0.5f, TextColor)).Add(null); } else if (lobbySpeedBerryLevel < 4) { if (displaySpeedBerryColumn) { row.Add(new TextCell(Dialog.Time(lobbySumOfBestTimes), TextJustify, 0.5f, getRankColor(lobbySpeedBerryLevel))); row.Add(new IconCell(getRankIcon(lobbySpeedBerryLevel))); sumOfBestTimes += lobbySumOfBestTimes; } else { row.Add(new TextCell(Dialog.Time(lobbySumOfBestTimes), TextJustify, 0.5f, TextColor)).Add(null); sumOfBestTimes += lobbySumOfBestTimes; } } else { row.Add(new IconCell("dot")).Add(null); allSpeedBerriesDone = false; } totalStrawberries += lobbyStrawberries; totalDeaths += lobbyDeaths; sumOfBestDeaths += lobbySumOfBestDeaths; sumOfBestDashes += lobbySumOfBestDashes; totalTime += lobbyTotalTime; allMapsCompletedInSingleRun &= lobbyAllMapsCompletedInSingleRun; if (!lobbyLevelsDone) { allLevelsDone = false; } } } table.AddRow(); Row totalsRow = table.AddRow() .Add(new TextCell(Dialog.Clean("journal_totals"), new Vector2(1f, 0.5f), 0.7f, TextColor)).Add(null) .Add(null) .Add(new TextCell(totalStrawberries.ToString(), TextJustify, 0.6f, TextColor)) .Add(new TextCell(Dialog.Deaths(totalDeaths), TextJustify, 0.6f, TextColor)) .Add(new TextCell(allLevelsDone && allMapsCompletedInSingleRun ? Dialog.Deaths(sumOfBestDeaths) : "-", TextJustify, 0.6f, TextColor)); if (OuiJournalCollabProgressDashCountMod.IsDashCountEnabled()) { totalsRow.Add(new TextCell(OuiJournalCollabProgressDashCountMod.DisplaysTotalDashes() || (allLevelsDone && allMapsCompletedInSingleRun) ? Dialog.Deaths(sumOfBestDashes) : "-", TextJustify, 0.6f, TextColor)); } totalsRow .Add(new TextCell(Dialog.Time(totalTime), TextJustify, 0.6f, TextColor)) .Add(new TextCell(allSpeedBerriesDone ? Dialog.Time(sumOfBestTimes) : "-", TextJustify, 0.6f, TextColor)).Add(null); for (int l = 1; l < SaveData.Instance.UnlockedModes; l++) { totalsRow.Add(null); } totalsRow.Add(new TextCell(Dialog.Time(SaveData.Instance.Time), TextJustify, 0.6f, TextColor)); table.AddRow(); }
private static void LoadCommand(string command, string[] args) { try { if (SaveData.Instance == null || !Manager.AllowUnsafeInput && SaveData.Instance.FileSlot != -1) { SaveData data = SaveData.Instance ?? UserIO.Load <SaveData>(SaveData.GetFilename(-1)) ?? new SaveData(); if (SaveData.Instance?.FileSlot is { } slot&& slot != -1) { SaveData.TryDelete(-1); SaveData.LoadedModSaveDataIndex = -1; foreach (EverestModule module in Everest.Modules) { if (module._Session != null) { module._Session.Index = -1; } if (module._SaveData != null) { module._SaveData.Index = -1; } } SaveData.Instance = data; SaveData.Instance.FileSlot = -1; UserIO.SaveHandler(true, true); } else { SaveData.Start(data, -1); } // Complete Prologue if incomplete and make sure the return to map menu item will be shown LevelSetStats stats = data.GetLevelSetStatsFor("Celeste"); if (!data.Areas[0].Modes[0].Completed) { data.Areas[0].Modes[0].Completed = true; stats.UnlockedAreas++; } } AreaMode mode = AreaMode.Normal; if (command.Equals("hard", StringComparison.InvariantCultureIgnoreCase)) { mode = AreaMode.BSide; } else if (command.Equals("rmx2", StringComparison.InvariantCultureIgnoreCase)) { mode = AreaMode.CSide; } int levelId = GetLevelId(args[0]); if (args.Length > 1) { if (!double.TryParse(args[1], out double x) || args.Length == 2) { string screen = args[1]; if (screen.StartsWith("lvl_")) { screen = screen.Substring(4); } if (args.Length > 2) { int spawnpoint = int.Parse(args[2]); Load(mode, levelId, screen, spawnpoint); } else { Load(mode, levelId, screen); } } else if (args.Length > 2 && double.TryParse(args[2], out double y)) { Vector2 position = new((int)Math.Round(x), (int)Math.Round(y)); Vector2 remainder = new((float)(x - position.X), (float)(y - position.Y)); Vector2 speed = Vector2.Zero; if (args.Length > 3 && float.TryParse(args[3], out float speedX)) { speed.X = speedX; } if (args.Length > 4 && float.TryParse(args[4], out float speedY)) { speed.Y = speedY; } Load(mode, levelId, position, remainder, speed); } } else { Load(mode, levelId); } } catch {
private static void LoadCommand(string command, string[] args) { try { if (SaveData.Instance == null || !Manager.AllowUnsafeInput && SaveData.Instance.FileSlot != -1) { int slot = SaveData.Instance == null ? -1 : SaveData.Instance.FileSlot; SaveData data = UserIO.Load <SaveData>(SaveData.GetFilename(slot)) ?? new SaveData(); SaveData.Start(data, -1); // Complete Prologue if incomplete LevelSetStats stats = SaveData.Instance.GetLevelSetStatsFor("Celeste"); if (stats.UnlockedAreas == 0) { stats.UnlockedAreas = 1; stats.AreasIncludingCeleste[0].Modes[0].Completed = true; } } AreaMode mode = AreaMode.Normal; if (command == "hard") { mode = AreaMode.BSide; } else if (command == "rmx2") { mode = AreaMode.CSide; } int levelId = GetLevelId(args[0]); if (args.Length > 1) { if (!double.TryParse(args[1], out double x) || args.Length == 2) { string screen = args[1]; if (screen.StartsWith("lvl_")) { screen = screen.Substring(4); } if (args.Length > 2) { int spawnpoint = int.Parse(args[2]); Load(mode, levelId, screen, spawnpoint); } else { Load(mode, levelId, screen); } } else if (args.Length > 2 && double.TryParse(args[2], out double y)) { Vector2 position = new((int)Math.Round(x), (int)Math.Round(y)); Vector2 remainder = new((float)(x - Math.Truncate(x) + (int)x - (int)Math.Round(x)), (float)(y - Math.Truncate(y) + (int)y - (int)Math.Round(y))); Vector2 speed = Vector2.Zero; if (args.Length > 3 && float.TryParse(args[3], out float speedX)) { speed.X = speedX; } if (args.Length > 4 && float.TryParse(args[4], out float speedY)) { speed.Y = speedY; } Load(mode, levelId, position, remainder, speed); } } else { Load(mode, levelId); } } catch { // ignored } }
private static int OnLevelSetStatsGetMaxArea(orig_LevelSetStats_get_MaxArea orig, LevelSetStats self) { int prevArea = orig(self); // take off any alt-sides return(prevArea - AreaData.Areas.Count((AreaData area) => area.GetLevelSet() == self.Name && !string.IsNullOrEmpty(GetMetaForAreaData(area)?.AltSideData.For))); }