public override void SceneEnd(Scene scene) { base.SceneEnd(scene); // leaving level: forget about all controllers and clean up the hook if present. spinnerControllerOnScreen = null; nextSpinnerController = null; if (rainbowSpinnerHueHooked) { On.Celeste.CrystalStaticSpinner.GetHue -= getRainbowSpinnerHue; rainbowSpinnerHueHooked = false; } ; }
public override void Awake(Scene scene) { base.Awake(scene); // this is the controller for the next screen. nextSpinnerController = this; // enable the hook on rainbow spinner hue. if (!rainbowSpinnerHueHooked) { On.Celeste.CrystalStaticSpinner.GetHue += getRainbowSpinnerHue; rainbowSpinnerHueHooked = true; } }
private static Color getRainbowSpinnerHue(On.Celeste.CrystalStaticSpinner.orig_GetHue orig, CrystalStaticSpinner self, Vector2 position) { RainbowSpinnerColorAreaController controller = self.CollideFirst <RainbowSpinnerColorAreaController>(); if (controller != null) { // apply the color from the controller we are in. return(RainbowSpinnerColorController.getModHue(controller.colors, controller.gradientSize, self.Scene, position)); } else { // we are not in a controller; apply the vanilla color. return(orig(self, position)); } }
public override void Removed(Scene scene) { base.Removed(scene); // the "current" spinner controller is now the one from the next screen. spinnerControllerOnScreen = nextSpinnerController; nextSpinnerController = null; // the transition (if any) is over. transitionProgress = -1f; // if there is none, clean up the hook on the spinner hue. if (spinnerControllerOnScreen == null && rainbowSpinnerHueHooked) { On.Celeste.CrystalStaticSpinner.GetHue -= getRainbowSpinnerHue; rainbowSpinnerHueHooked = false; } }
private static Color getRainbowSpinnerHue(On.Celeste.CrystalStaticSpinner.orig_GetHue orig, CrystalStaticSpinner self, Vector2 position) { if (transitionProgress == -1f) { // no transition is ongoing. // if only nextSpinnerController is defined, move it into spinnerControllerOnScreen. if (spinnerControllerOnScreen == null) { spinnerControllerOnScreen = nextSpinnerController; nextSpinnerController = null; } return(getModHue(spinnerControllerOnScreen.colors, spinnerControllerOnScreen.gradientSize, self.Scene, self.Position)); } else { // get the spinner color in the room we're coming from. Color fromRoomColor; if (spinnerControllerOnScreen != null) { fromRoomColor = getModHue(spinnerControllerOnScreen.colors, spinnerControllerOnScreen.gradientSize, self.Scene, self.Position); } else { fromRoomColor = orig(self, position); } // get the spinner color in the room we're going to. Color toRoomColor; if (nextSpinnerController != null) { toRoomColor = getModHue(nextSpinnerController.colors, nextSpinnerController.gradientSize, self.Scene, self.Position); } else { toRoomColor = orig(self, position); } // transition smoothly between both. return(Color.Lerp(fromRoomColor, toRoomColor, transitionProgress)); } }