public static void Open(Player player, AreaData area, out bool opened, Action <Overworld> callback = null) { opened = false; if (overworldWrapper?.Scene == Engine.Scene || player.StateMachine.State == Player.StDummy) { return; } player.StateMachine.State = Player.StDummy; opened = true; Level level = player.Scene as Level; level.Entities.FindFirst <TotalStrawberriesDisplay>().Active = false; overworldWrapper = new SceneWrappingEntity <Overworld>(new Overworld(new OverworldLoader((Overworld.StartMode)(-1), new HiresSnow() { Alpha = 0f, ParticleAlpha = 0.25f, } ))); overworldWrapper.OnBegin += (overworld) => { overworld.RendererList.Remove(overworld.RendererList.Renderers.Find(r => r is MountainRenderer)); overworld.RendererList.Remove(overworld.RendererList.Renderers.Find(r => r is ScreenWipe)); overworld.RendererList.UpdateLists(); }; overworldWrapper.OnEnd += (overworld) => { if (overworldWrapper?.WrappedScene == overworld) { overworldWrapper = null; } }; level.Add(overworldWrapper); new DynData <Overworld>(overworldWrapper.WrappedScene).Set("collabInGameForcedArea", area); callback?.Invoke(overworldWrapper.WrappedScene); overworldWrapper.Add(new Coroutine(UpdateRoutine(overworldWrapper))); }
private static IEnumerator UpdateRoutine(SceneWrappingEntity <Overworld> wrapper) { Level level = wrapper.Scene as Level; Overworld overworld = wrapper.WrappedScene; while (overworldWrapper?.Scene == Engine.Scene) { if (overworld.Next is OuiChapterSelect) { overworld.Next.RemoveSelf(); overworldWrapper.Add(new Coroutine(DelayedCloseRoutine(level))); } overworld.Snow.ParticleAlpha = 0.25f; if (overworld.Current != null || overworld.Next?.Scene != null) { overworld.Snow.Alpha = Calc.Approach(overworld.Snow.Alpha, 1f, Engine.DeltaTime * 2f); } else { overworld.Snow.Alpha = Calc.Approach(overworld.Snow.Alpha, 0, Engine.DeltaTime * 2f); if (overworld.Snow.Alpha <= 0.01f) { Close(level, true, true); } } yield return(null); } if (wrapper.Scene != null) { wrapper.RemoveSelf(); } }