public RoomsAreas() : base("Rooms/Areas", "Rooms/Areas", "Add Revit Rooms & Areas", "Extra", "Hummingbird") { this.areaMode = AreaMode.Areas; this.Menu_AreaClicked(null, null); this.Message = "Areas"; this.Hidden = false; }
public Dictionary <String, RandoConfigRoom> GetRoomMapping(AreaMode mode) { List <RandoConfigRoom> rooms; switch (mode) { case AreaMode.Normal: default: rooms = this.ASide; break; case AreaMode.BSide: rooms = this.BSide; break; case AreaMode.CSide: rooms = this.CSide; break; } if (rooms == null) { return(null); } var result = new Dictionary <String, RandoConfigRoom>(); foreach (RandoConfigRoom room in rooms) { result.Add(room.Room, room); } return(result); }
public new void CleanCheckpoints() { AreaData area = AreaData.Get(ID); for (int i = 0; i < Modes.Length; i++) { AreaMode areaMode = (AreaMode)i; AreaModeStats areaModeStats = Modes[i]; ModeProperties modeProperties = null; if (area.HasMode(areaMode)) { modeProperties = area.Mode[i]; } HashSet <string> checkpoints = new HashSet <string>(areaModeStats.Checkpoints); areaModeStats.Checkpoints.Clear(); if (modeProperties != null && modeProperties.Checkpoints != null) { foreach (CheckpointData checkpointData in modeProperties.Checkpoints) { if (checkpoints.Contains(checkpointData.Level)) { areaModeStats.Checkpoints.Add(checkpointData.Level); } } } } }
public new void CleanCheckpoints() { if (string.IsNullOrEmpty(SID) && (ID_Unsafe < 0 || AreaData.Areas.Count <= ID_Unsafe)) { throw new Exception($"SaveData contains invalid AreaStats with no SID and out-of-range ID of {ID_Unsafe} / {AreaData.Areas.Count}"); } AreaData area = AreaData.Get(ID); for (int i = 0; i < Modes.Length; i++) { AreaMode areaMode = (AreaMode)i; AreaModeStats areaModeStats = Modes[i]; ModeProperties modeProperties = null; if (area.HasMode(areaMode)) { modeProperties = area.Mode[i]; } HashSet <string> checkpoints = new HashSet <string>(areaModeStats.Checkpoints); areaModeStats.Checkpoints.Clear(); if (modeProperties != null && modeProperties.Checkpoints != null) { foreach (CheckpointData checkpointData in modeProperties.Checkpoints) { if (checkpoints.Contains(checkpointData.Level)) { areaModeStats.Checkpoints.Add(checkpointData.Level); } } } } }
private static void loadMapBySID(string sid, string room, AreaMode mode, Action <int, string> vanillaLoadFunction) { if (sid == null) { Engine.Commands.Log("Please specify a map ID or SID."); return; } AreaData areaData = patch_AreaData.Get(sid); MapData mapData = null; if (areaData?.Mode.Length > (int)mode) { mapData = areaData?.Mode[(int)mode]?.MapData; } if (areaData == null) { Engine.Commands.Log($"Map {sid} does not exist!"); } else if (mapData == null) { Engine.Commands.Log($"Map {sid} has no {mode} mode!"); } else if (room != null && (mapData.Levels?.All(level => level.Name != room) ?? false)) { Engine.Commands.Log($"Map {sid} / mode {mode} has no room named {room}!"); } else { // go on with the vanilla load/hard/rmx2 function. vanillaLoadFunction(areaData.ID, room); } }
/// <summary> /// Apply the metadata of the mode to the area if OverrideASideMeta is enabled. /// </summary> public static void OverrideASideMeta(this AreaData self, AreaMode value) { patch_AreaData areaData = (patch_AreaData)self; if (areaData.LevelSet == "Celeste") { return; } if (value == AreaMode.Normal) { return; } if (!(self.Mode[(int)value]?.GetMapMeta() is MapMeta mapMeta)) { return; } if (!(mapMeta.OverrideASideMeta ?? false)) { return; } mapMeta.ApplyToForOverride(areaData); }
// Better support for loading checkpoint room and fix vanilla game crashes when the bside/cside level does not exist private static void LoadIdLevel(AreaMode areaMode, int id = 0, string level = null) { SaveData.InitializeDebugMode(); AreaKey areaKey = new AreaKey(id, areaMode); ((patch_SaveData)SaveData.Instance).LastArea_Safe = areaKey; Session session = new Session(areaKey); if (level != null && session.MapData.Get(level) != null) { if (AreaData.GetCheckpoint(areaKey, level) != null) { session = new Session(areaKey, level) { StartCheckpoint = null }; } else { session.Level = level; } bool firstLevel = level == session.MapData.StartLevel().Name; session.FirstLevel = firstLevel; session.StartedFromBeginning = firstLevel; } Engine.Scene = new LevelLoader(session); }
public override bool Read(GH_IReader reader) { int num = 2; reader.TryGetInt32("AreaMode", ref num); this.areaMode = (AreaMode)num; return(base.Read(reader)); }
private static void Load(AreaMode mode, int levelID, Vector2 spawnPoint) { Session session = new Session(new AreaKey(levelID, mode)); session.Level = session.MapData.GetAt(spawnPoint)?.Name; session.FirstLevel = false; Manager.controller.resetSpawn = spawnPoint; Engine.Scene = new LevelLoader(session); }
private void Menu_RoomClicked(object sender, EventArgs e) { if (this.areaMode != AreaMode.Rooms) { this.RecordUndoEvent("Rooms"); this.areaMode = AreaMode.Rooms; this.ExpireSolution(true); } }
private static void ParseName(string sid, out int?order, out AreaMode side, out string name) { int indexOfSlash = sid.Replace('\\', '/').LastIndexOf('/'); if (indexOfSlash != -1) { sid = sid.Substring(indexOfSlash + 1); } if (sid.EndsWith(".bin")) { sid = sid.Substring(0, sid.Length - 4); } Match match; if (!ParseNameCache.TryGetValue(sid, out match)) { ParseNameCache[sid] = match = ParseNameRegex.Match(sid); } string rawOrder = match.Groups["order"].Value; string rawSide = match.Groups["side"].Value; if (string.IsNullOrEmpty(rawSide)) { rawSide = match.Groups["sideAlt"].Value; } string rawName = match.Groups["name"].Value; // Special case: 1-B, where 1 is order but should be name, and B is name but should be side if (!string.IsNullOrEmpty(rawOrder) && !string.IsNullOrEmpty(rawName) && string.IsNullOrEmpty(rawSide) && ParseNameModes.ContainsKey(rawName)) { rawSide = rawName; rawName = rawOrder; rawOrder = null; } int orderTmp; if (int.TryParse(rawOrder, out orderTmp)) { order = orderTmp; } else { order = null; } if (!ParseNameModes.TryGetValue(rawSide, out side)) { side = AreaMode.Normal; } name = rawName; }
public GhostData(Session session) : this() { if (session != null) { SID = session.Area.GetSID(); Mode = session.Area.Mode; Level = session.Level; } }
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); } 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 GhostData(Session session) : this() { if (session != null) { SID = session.Area.GetSID(); Mode = session.Area.Mode; Level = session.Level; RespawnPoint = session.RespawnPoint ?? default; } }
public void Inspect(AreaData area, AreaMode mode = AreaMode.Normal) { Focused = false; Audio.Play(SFX.ui_world_icon_select); SaveData.Instance.LastArea = area.ToKey(mode); if (OuiIcons != null && area.ID < OuiIcons.Count) { OuiIcons[area.ID].Select(); } Overworld.Mountain.Model.EaseState(area.MountainState); Overworld.Goto <OuiChapterPanel>(); }
/// <summary> /// Get the custom metadata of the mode if OverrideASideMeta is enabled. /// </summary> public static MapMeta GetModeMeta(this AreaData self, AreaMode value) { if (self.Mode[(int)value]?.GetMapMeta() is MapMeta mapMeta) { if (value != AreaMode.Normal && (mapMeta.OverrideASideMeta ?? false)) { return(mapMeta); } } return(self.GetMeta()); }
private IEnumerator StartRoutine(AreaData area, AreaMode mode = AreaMode.Normal, string checkpoint = null) { Overworld.Maddy.Hide(false); area.Wipe(Overworld, false, null); Audio.SetMusic(null, true, true); Audio.SetAmbience(null, true); if ((area.ID == 0 || area.ID == 9) && checkpoint == null && mode == AreaMode.Normal) { Overworld.RendererList.UpdateLists(); Overworld.RendererList.MoveToFront(Overworld.Snow); } yield return(0.5f); LevelEnter.Go(new Session(area.ToKey(mode), checkpoint), false); }
private static void LoadCommand(string command, string[] args) { try { 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 { } }
private static void Load(AreaMode mode, int levelID, string screen = null, int checkpoint = 0) { Session session = new Session(new AreaKey(levelID, mode)); if (screen != null) { session.Level = screen; session.FirstLevel = false; } if (checkpoint != 0) { LevelData levelData = session.MapData.Get(screen); Manager.controller.resetSpawn = levelData.Spawns[checkpoint]; } Engine.Scene = new LevelLoader(session); }
public patch_AreaKey(int id, AreaMode mode = AreaMode.Normal) { Mode = mode; ID = id; SIDID = id; // Only set SID if this AreaKey isn't AreaKey.Default or AreaKey.None if (id != -1 && AreaData.Areas != null && AreaData.Areas.Count > 0) { // We don't actually check if we're in bounds as we want an exception. string sid = AreaData.Areas[id].GetSID(); // Only set sid after load. During load, sid is still null. if (sid != null) { SID = sid; } } }
private string GetSideText(AreaMode areaMode) { switch (areaMode) { case AreaMode.Normal: return("A"); case AreaMode.BSide: return("B"); case AreaMode.CSide: return("C"); default: return("Unknown"); } }
private static void Load(AreaMode mode, int levelId, Vector2 spawnPoint, Vector2 remainder, Vector2 speed) { AreaKey areaKey = new(levelId, mode); Session session = new(areaKey); session.Level = session.MapData.GetAt(spawnPoint)?.Name; if (AreaData.GetCheckpoint(areaKey, session.Level) != null) { session = new Session(areaKey, session.Level); } session.FirstLevel = false; session.StartedFromBeginning = false; session.RespawnPoint = spawnPoint; resetRemainder = remainder; initSpeed = speed; Engine.Scene = new LevelLoader(session); }
private void ProcessMeta(BinaryPacker.Element meta) { AreaData area = AreaData.Get(Area); AreaMode mode = Area.Mode; if (mode == AreaMode.Normal) { new MapMeta(meta).ApplyTo(area); Area = area.ToKey(); } meta = meta.Children?.FirstOrDefault(el => el.Name == "mode"); if (meta == null) { return; } new MapMetaModeProperties(meta).ApplyTo(area, mode); }
private static void Load(AreaMode mode, int levelId, string screen = null, int checkpoint = 0) { Session session = new Session(new AreaKey(levelId, mode)); if (screen != null) { session.Level = screen; session.FirstLevel = session.LevelData == session.MapData.StartLevel(); } if (checkpoint != 0) { LevelData levelData = session.MapData.Get(screen); Manager.Controller.ResetSpawn = levelData.Spawns[checkpoint]; } session.StartedFromBeginning = checkpoint == 0 && session.FirstLevel; Engine.Scene = new LevelLoader(session); }
public void ApplyTo(AreaData area, AreaMode mode) { area.GetMeta().Modes[(int)mode] = this; ModeProperties props = area.Mode[(int)mode]; if (props != null) { props.AudioState = AudioState?.Convert() ?? props.AudioState; props.Checkpoints = MapMeta.Convert(Checkpoints) ?? props.Checkpoints; props.IgnoreLevelAudioLayerData = IgnoreLevelAudioLayerData ?? props.IgnoreLevelAudioLayerData; props.Inventory = MapMeta.GetInventory(Inventory) ?? props.Inventory; props.Path = Path ?? props.Path; props.PoemID = PoemID ?? props.PoemID; } else { props = Convert(); } area.Mode[(int)mode] = props; }
public void Read(BinaryReader reader) { IsCached = false; IsEcho = reader.ReadBoolean(); Name = reader.ReadNullTerminatedString(); SID = reader.ReadNullTerminatedString(); Mode = (AreaMode)reader.ReadByte(); Level = reader.ReadNullTerminatedString(); LevelCompleted = reader.ReadBoolean(); if (reader.ReadBoolean()) { LevelExit = (LevelExit.Mode)reader.ReadByte(); } Idle = reader.ReadBoolean(); }
public static Rect GetAreaRectByMode(AreaMode mode) { var viewRect = Rect.zero; switch (mode) { case AreaMode.Screen: viewRect = new Rect(Vector2.zero, UnityExtension.GetScaledScreenAreaSize(Responsive.ViewportAreaSize)); break; case AreaMode.Safe: viewRect = UnityExtension.GetCalculatedSafeAreaRect(Responsive.ViewportAreaSize); break; case AreaMode.Viewport: viewRect = new Rect(Vector2.zero, Responsive.ViewportAreaSize); break; } return(viewRect); }
private void ProcessMeta(BinaryPacker.Element meta) { AreaData area = AreaData.Get(Area); AreaMode mode = Area.Mode; if (mode == AreaMode.Normal) { new MapMeta(meta).ApplyTo(area); Area = area.ToKey(); // Backup A-Side's Metadata. Only back up useful data. area.SetASideAreaDataBackup(new AreaData { IntroType = area.IntroType, ColorGrade = area.ColorGrade, DarknessAlpha = area.DarknessAlpha, BloomBase = area.BloomBase, BloomStrength = area.BloomStrength, CoreMode = area.CoreMode, Dreaming = area.Dreaming }); } BinaryPacker.Element modeMeta = meta.Children?.FirstOrDefault(el => el.Name == "mode"); if (modeMeta == null) { return; } new MapMetaModeProperties(modeMeta).ApplyTo(area, mode); // Metadata for B-Side and C-Side are parsed and stored. if (mode != AreaMode.Normal) { MapMeta mapMeta = new MapMeta(meta) { Modes = area.GetMeta().Modes }; area.Mode[(int)mode].SetMapMeta(mapMeta); } }
private static void Load(AreaMode mode, int levelId, string screen = null, int?spawnPoint = null) { AreaKey areaKey = new(levelId, mode); Session session = AreaData.GetCheckpoint(areaKey, screen) != null ? new Session(areaKey, screen) : new Session(areaKey); if (screen != null) { session.Level = screen; session.FirstLevel = session.LevelData == session.MapData.StartLevel(); } Vector2?startPosition = null; if (spawnPoint != null) { LevelData levelData = session.MapData.Get(screen); startPosition = levelData.Spawns[spawnPoint.Value]; } session.StartedFromBeginning = spawnPoint == null && session.FirstLevel; Engine.Scene = new LevelLoader(session, startPosition); }
private AreaMode _PatchHeartGemBehavior(AreaMode levelMode) { if (Session.Area.GetLevelSet() == "Celeste") { // do not mess with vanilla. return(levelMode); } MapMetaModeProperties properties = Session.MapData.GetMeta(); if (properties != null && (properties.HeartIsEnd ?? false)) { // heart ends the level: this is like B-Sides. // the heart will appear even if it was collected, to avoid a softlock if we save & quit after collecting it. return(AreaMode.BSide); } else { // heart does not end the level: this is like A-Sides. // the heart will disappear after it is collected. return(AreaMode.Normal); } }