예제 #1
0
        public static void Reload(bool recrawl)
        {
            SaveData saveData = SaveData.Instance;

            // ChapterSelect only updates the ID.
            string lastAreaSID = saveData == null ? null : (AreaData.Get(saveData.LastArea.ID)?.ToKey().GetSID() ?? AreaKey.Default.GetSID());

            // Note: SaveData.Instance.LastArea is reset by AreaData.Interlude_Safe -> SaveData.LevelSetStats realizing that AreaOffset == -1
            // Store the "resolved" last selected area in a local variable, then re-set it after reloading.

            // Reload all maps.
            if (recrawl)
            {
                Everest.Content.Recrawl();
            }

            lock (AreaReloadLock) { // prevent anything from calling AreaData.Get during this.
                AreaData.Unload();
                AreaData.Load();
                AreaData.ReloadMountainViews();

                // Fake a save data reload to resync the save data to the new area list.
                if (saveData != null)
                {
                    AreaData lastArea = AreaDataExt.Get(lastAreaSID);
                    saveData.LastArea = lastArea?.ToKey() ?? AreaKey.Default;
                    saveData.BeforeSave();
                    saveData.AfterInitialize();
                }
            }

            if (Engine.Scene is Overworld overworld)
            {
                if (overworld.Mountain.Area >= AreaData.Areas.Count)
                {
                    overworld.Mountain.EaseCamera(0, AreaData.Areas[0].MountainIdle, null, true);
                }

                OuiChapterSelect chapterSelect = overworld.GetUI <OuiChapterSelect>();
                overworld.UIs.Remove(chapterSelect);
                overworld.Remove(chapterSelect);

                chapterSelect         = new OuiChapterSelect();
                chapterSelect.Visible = false;
                overworld.Add(chapterSelect);
                overworld.UIs.Add(chapterSelect);
                chapterSelect.IsStart(overworld, (Overworld.StartMode)(-1));
            }
        }
예제 #2
0
        private void HideAltSides(On.Celeste.OuiChapterSelect.orig_Added orig, OuiChapterSelect self, Scene scene)
        {
            orig(self, scene);
            var icons = new DynData <OuiChapterSelect>(self).Get <List <OuiChapterSelectIcon> >("icons");

            for (int i = icons.Count - 1; i >= 0; i--)
            {
                var meta = GetMetaForAreaData(AreaData.Get(icons[i].Area));
                if (meta?.AltSideData.IsAltSide ?? false)
                {
                    icons[i].Area = -1;
                    icons[i].Hide();
                }
            }
        }
예제 #3
0
        private bool ReturnToAltSide(On.Celeste.OuiChapterSelect.orig_IsStart orig, OuiChapterSelect self, Overworld overworld, Overworld.StartMode start)
        {
            if (start == Overworld.StartMode.AreaComplete || start == Overworld.StartMode.AreaQuit)
            {
                AreaData area = AreaData.Get(SaveData.Instance.LastArea.ID);
                var      meta = GetMetaForAreaData(area);
                if (meta?.AltSideData.IsAltSide ?? false)
                {
                    area = AreaData.Get(meta.AltSideData.For) ?? area;
                    if (area != null)
                    {
                        SaveData.Instance.LastArea.ID = area.ID;
                    }
                }
            }

            return(orig(self, overworld, start));
        }
예제 #4
0
        private static int OnChapterSelectGetArea(orig_OuiChapterSelect_get_area orig, OuiChapterSelect self)
        {
            int prevArea = orig(self);
            var meta     = GetMetaForAreaData(AreaData.Areas[prevArea]);

            if (meta?.AltSideData.IsAltSide ?? false)
            {
                prevArea = AreaData.Areas.IndexOf(AreaData.Get(meta.AltSideData.For));
            }
            return(prevArea);
        }