public void ctor(ProcessManager manager, SlideShow.SlideShowID slideShowID) { Type[] constructorSignature = new Type[2]; constructorSignature[0] = typeof(ProcessManager); constructorSignature[1] = typeof(ProcessManager.ProcessID); RuntimeMethodHandle handle = typeof(Menu.Menu).GetConstructor(constructorSignature).MethodHandle; RuntimeHelpers.PrepareMethod(handle); IntPtr ptr = handle.GetFunctionPointer(); Action <ProcessManager, ProcessManager.ProcessID> funct = (Action <ProcessManager, ProcessManager.ProcessID>)Activator.CreateInstance(typeof(Action <ProcessManager, ProcessManager.ProcessID>), this, ptr); if (slideShowID != (SlideShow.SlideShowID)SlideShowID.WhiteOutro) { orig_ctor(manager, slideShowID); } else { this.current = -1; //Delegate to call the base constructor funct(manager, ProcessManager.ProcessID.SlideShow);//Menu Constructor this.slideShowID = (SlideShow.SlideShowID)slideShowID; this.pages.Add(new Page(this, null, "main", 0)); this.playList = new List <SlideShow.Scene>(); if (manager.musicPlayer != null) { this.waitForMusic = "RW_Outro_Theme"; this.stall = true; manager.musicPlayer.MenuRequestsSong(this.waitForMusic, 1.5f, 10f); } this.playList.Add(new SlideShow.Scene(MenuScene.SceneID.Empty, 0f, 0f, 0f)); this.playList.Add(new SlideShow.Scene(MenuScene.SceneID.Outro_1_Left_Swim, this.ConvertTime(0, 1, 20), this.ConvertTime(0, 5, 0), this.ConvertTime(0, 17, 0))); this.playList.Add(new SlideShow.Scene(MenuScene.SceneID.Outro_2_Up_Swim, this.ConvertTime(0, 21, 0), this.ConvertTime(0, 25, 0), this.ConvertTime(0, 37, 0))); this.playList.Add(new SlideShow.Scene(MenuScene.SceneID.Empty, this.ConvertTime(1, 1, 0), this.ConvertTime(1, 1, 0), this.ConvertTime(1, 6, 0))); for (int j = 1; j < this.playList.Count; j++) { this.playList[j].startAt -= 1.1f; this.playList[j].fadeInDoneAt -= 1.1f; this.playList[j].fadeOutStartAt -= 1.1f; } this.nextProcess = ProcessManager.ProcessID.Credits; this.preloadedScenes = new SlideShowMenuScene[this.playList.Count]; for (int k = 0; k < this.preloadedScenes.Length; k++) { this.preloadedScenes[k] = new SlideShowMenuScene(this, this.pages[0], this.playList[k].sceneID); this.preloadedScenes[k].Hide(); } manager.RemoveLoadingLabel(); this.NextScene(); } }
// Same as below, but for slideshows private static void SlideShow_ctor(On.Menu.SlideShow.orig_ctor orig, SlideShow self, ProcessManager manager, SlideShow.SlideShowID slideShowID) { // Automatically override slideshows if the current character has a slideshow by the same name SlugBaseCharacter currentPlayer; if (PlayerManager.UsingCustomCharacter) { currentPlayer = PlayerManager.CurrentCharacter; } else { int index; if (manager.currentMainLoop is RainWorldGame rwg) { index = rwg.StoryCharacter; } else { index = manager.rainWorld.progression.PlayingAsSlugcat; } currentPlayer = PlayerManager.GetCustomPlayer(index); } if (currentPlayer != null) { string slideshowName = self.slideShowID.ToString(); if (slideshowOverride == null && currentPlayer.HasSlideshow(slideshowName)) { OverrideNextSlideshow(currentPlayer, slideshowName); } } if (slideshowOverride == null) { orig(self, manager, slideShowID); return; } try { // Call the original constructor, save a reference to the loading label // This will always be empty, due to the ID of -1 FLabel loadingLabel = manager.loadingLabel; orig(self, manager, (SlideShow.SlideShowID)(-1)); // Undo RemoveLoadingLabel and NextScene manager.loadingLabel = loadingLabel; Futile.stage.AddChild(loadingLabel); self.current = -1; // Load a custom scene SlugBaseCharacter owner = slideshowOverride.Owner; List <SlideshowSlide> slides = slideshowOverride.Slides; // Chose a destination process if (slideshowOverride.NextProcess == null) { switch (slideShowID) { case SlideShow.SlideShowID.WhiteIntro: case SlideShow.SlideShowID.YellowIntro: self.nextProcess = ProcessManager.ProcessID.Game; break; case SlideShow.SlideShowID.WhiteOutro: case SlideShow.SlideShowID.YellowOutro: case SlideShow.SlideShowID.RedOutro: self.nextProcess = ProcessManager.ProcessID.Credits; break; default: // Take a best guess // Accidentally going to the game is better than accidentally going to the credits self.nextProcess = ProcessManager.ProcessID.Game; break; } } else { self.nextProcess = slideshowOverride.NextProcess.Value; } // Custom music if (manager.musicPlayer != null) { self.waitForMusic = slideshowOverride.Music; self.stall = true; manager.musicPlayer.MenuRequestsSong(self.waitForMusic, 1.5f, 40f); } // Custom playlist float time = 0f; float endTime; self.playList.Clear(); foreach (SlideshowSlide slide in slides) { if (!slide.Enabled) { continue; } endTime = time + slide.Duration; self.playList.Add(new SlideShow.Scene(MenuScene.SceneID.Empty, time, time + slide.FadeIn, endTime - slide.FadeOut)); time = endTime; } // Preload the scenes self.preloadedScenes = new SlideShowMenuScene[self.playList.Count]; try { for (int i = 0; i < self.preloadedScenes.Length; i++) { MenuScene.SceneID id = MenuScene.SceneID.Empty; if (slideshowOverride.Owner.HasScene(slides[i].SceneName)) { // Prioritize this character's scenes OverrideNextScene(slideshowOverride.Owner, slideshowOverride.Slides[i].SceneName); } else { ClearSceneOverride(); try { // ... then try existing scenes id = Custom.ParseEnum <MenuScene.SceneID>(slides[i].SceneName); } catch (Exception) { // ... and default to Empty id = MenuScene.SceneID.Empty; } } self.preloadedScenes[i] = new SlideShowMenuScene(self, self.pages[0], id); self.preloadedScenes[i].Hide(); List <Vector3> camPath = self.preloadedScenes[i].cameraMovementPoints; camPath.Clear(); camPath.AddRange(slides[i].CameraPath); } } finally { ClearSceneOverride(); } } finally { ClearSlideshowOverride(); } manager.RemoveLoadingLabel(); self.NextScene(); }
public extern void orig_ctor(ProcessManager manager, SlideShow.SlideShowID slideShowID);
public patch_SlideShow(ProcessManager manager, SlideShow.SlideShowID slideShowID) : base(manager, slideShowID) { }