Beispiel #1
0
 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;
 }
Beispiel #2
0
        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);
        }
Beispiel #3
0
        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);
                        }
                    }
                }
            }
        }
Beispiel #4
0
        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);
                        }
                    }
                }
            }
        }
Beispiel #5
0
        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);
            }
        }
Beispiel #6
0
        /// <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);
        }
Beispiel #7
0
        // 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);
        }
Beispiel #8
0
        public override bool Read(GH_IReader reader)
        {
            int num = 2;

            reader.TryGetInt32("AreaMode", ref num);
            this.areaMode = (AreaMode)num;
            return(base.Read(reader));
        }
Beispiel #9
0
        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);
        }
Beispiel #10
0
 private void Menu_RoomClicked(object sender, EventArgs e)
 {
     if (this.areaMode != AreaMode.Rooms)
     {
         this.RecordUndoEvent("Rooms");
         this.areaMode = AreaMode.Rooms;
         this.ExpireSolution(true);
     }
 }
Beispiel #11
0
        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;
        }
Beispiel #12
0
 public GhostData(Session session)
     : this()
 {
     if (session != null)
     {
         SID   = session.Area.GetSID();
         Mode  = session.Area.Mode;
         Level = session.Level;
     }
 }
Beispiel #13
0
        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 { }
        }
Beispiel #14
0
 public GhostData(Session session)
     : this()
 {
     if (session != null)
     {
         SID          = session.Area.GetSID();
         Mode         = session.Area.Mode;
         Level        = session.Level;
         RespawnPoint = session.RespawnPoint ?? default;
     }
 }
Beispiel #15
0
 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>();
 }
Beispiel #16
0
        /// <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());
        }
Beispiel #17
0
        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);
        }
Beispiel #18
0
        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 { }
        }
Beispiel #19
0
        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");
            }
        }
Beispiel #22
0
        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);
        }
Beispiel #23
0
        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);
        }
Beispiel #25
0
        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;
        }
Beispiel #26
0
        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();
        }
Beispiel #27
0
        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);
        }
Beispiel #28
0
        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);
            }
        }
Beispiel #29
0
        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);
        }
Beispiel #30
0
        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);
            }
        }