public static Color GetHue(Scene scene, Vector2 position) { if (crystalSpinner == null) { crystalSpinner = new CrystalStaticSpinner(Vector2.Zero, false, CrystalColor.Rainbow); } return(_getHue(scene, position)); }
public override void Update() { base.Update(); CrystalStaticSpinner murderSpinner = null; if (killCircle == null && CollideCheckConnections(ref murderSpinner)) { if (ActiveCompanion != null) { ActiveCompanion.DetachFromPlayer(); } StartKillCircle(murderSpinner); } connectionLineOffset += Engine.DeltaTime * connectionLineSpeed; if (connectionLineOffset > Math.PI * 2.0f) { connectionLineOffset -= (float)Math.PI * 2.0f; } if (killCircle != null) { if (Scene.OnInterval(0.05f)) { foreach (Companion companion in nearestCompanions) { if (manualResets.Contains(companion)) { continue; } float dir = Calc.Random.NextFloat((float)Math.PI * 2f); Vector2 towardsCompanion = (companion.Position - killCircle.Position).SafeNormalize() * (killCircle.Collider as Circle).Radius; SceneAs <Level>().ParticlesFG.Emit(requiresDash ? P_Burst : P_BurstNoDash, 1, killCircle.Position + towardsCompanion, Vector2.Zero, dir); } } (killCircle.Collider as Circle).Radius += killCircleExpansionSpeed * Engine.DeltaTime; foreach (Companion companion in nearestCompanions) { if (!manualResets.Contains(companion) && Collide.Check(companion, killCircle)) { companion.Reset(true); if (manualResets.Count == nearestCompanions.Length) { killCircle.RemoveSelf(); killCircle = null; ResetCompanions(); break; } } } } }
private static float getSpinnerOffset(CrystalStaticSpinner spinner) { if (spinnerOffsets.TryGetValue(spinner, out var holder)) { return(holder.value); } else { float offset = (float)spinnerOffset.GetValue(spinner); spinnerOffsets.Add(spinner, new ValueHolder <float>(offset)); return(offset); } }
private static void ChangeColor(On.Celeste.CrystalStaticSpinner.orig_ctor_EntityData_Vector2_CrystalColor orig, CrystalStaticSpinner self, EntityData data, Vector2 offset, CrystalColor color) { var savedColor = GetColorFromSession(); if (savedColor != null) { orig(self, data, offset, (CrystalColor)savedColor); } else { orig(self, data, offset, color); } self.SetExtendedDataValue("color", (CrystalColor?)color); }
private void StartKillCircle(CrystalStaticSpinner murderSpinner) { killCircleExpansionSpeed = Math.Max((murderSpinner.Position - nearestCompanions[0].Position).LengthSquared(), (murderSpinner.Position - nearestCompanions[1].Position).LengthSquared()); killCircleExpansionSpeed = (float)Math.Sqrt(killCircleExpansionSpeed) / killCircleExpansionTime; Audio.Play("event:/game/06_reflection/fall_spike_smash", murderSpinner.Position); for (int i = 0; i < 6; i++) { float dir = Calc.Random.NextFloat((float)Math.PI * 2f); SceneAs <Level>().ParticlesFG.Emit(requiresDash ? P_Burst : P_BurstNoDash, 1, murderSpinner.Position, Vector2.Zero, dir); } Scene.Add(killCircle = new Entity(murderSpinner.Position) { Collider = new Circle(1.0f) }); }
private bool CollideCheckConnections(ref CrystalStaticSpinner killer) { if (!AllCompanionsActive) { return(false); } for (int i = 0; i < companions.Length - 1; i++) { foreach (CrystalStaticSpinner spinner in Scene.Tracker.GetEntities <CrystalStaticSpinner>()) { if (spinner.Collidable && Collide.CheckLine(spinner, companions[i].Position, companions[i + 1].Position)) { nearestCompanions[0] = companions[i]; nearestCompanions[1] = companions[i + 1]; killer = spinner; return(true); } } } killer = null; return(false); }
public CoreModeListener(CrystalStaticSpinner parent) : base(true, false) { // no-op. MonoMod ignores this - we only need this to make the compiler shut up. }
private static void CrystalStaticSpinner_Update(On.Celeste.CrystalStaticSpinner.orig_Update orig, CrystalStaticSpinner self) { bool visibleBeforeOrig = self.Visible; orig(self); var players = self.Scene.Tracker.GetEntities <Player>(); if (players.Count > 1 && visibleBeforeOrig && !self.Collidable && self.Scene.OnInterval(0.05f, getSpinnerOffset(self))) { foreach (Player entity in players) { self.Collidable = self.Collidable || (Math.Abs(entity.X - self.X) < 128f && Math.Abs(entity.Y - self.Y) < 128f); } } }
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)); } }
private void CrystalStaticSpinner_CreateSprites(On.Celeste.CrystalStaticSpinner.orig_CreateSprites orig, CrystalStaticSpinner self) { if (Settings.SimplifiedGraphics) { SpinnerColor.SetValue(self, CrystalColor.Blue); } orig(self); }
private static Color getRainbowSpinnerHue(On.Celeste.CrystalStaticSpinner.orig_GetHue orig, CrystalStaticSpinner self, Vector2 position) { RainbowSpinnerColorAreaController controller = self.CollideFirst <RainbowSpinnerColorAreaController>(position); if (controller != null) { // apply the color from the controller we are in. return(RainbowSpinnerColorController.getModHue(controller.colors, controller.gradientSize, self.Scene, position, controller.loopColors, controller.center, controller.gradientSpeed)); } else { // we are not in a controller; apply the vanilla color. return(orig(self, position)); } }
private static Color getRainbowSpinnerHue(On.Celeste.CrystalStaticSpinner.orig_GetHue orig, CrystalStaticSpinner self, Vector2 position) { return(getEntityHue(() => orig(self, position), self, position)); }
public static Entity CreateEntityCopy(Entity savedEntity, string tag = "EntitiesSavedButNotLoaded") { Entity loadedEntity = null; Type savedType = savedEntity.GetType(); if (savedEntity.GetEntityData() != null) { // 一般 Entity 都是 EntityData + Vector2 loadedEntity = (savedType.GetConstructor(new[] { typeof(EntityData), typeof(Vector2) }) ?.Invoke(new object[] { savedEntity.GetEntityData(), Vector2.Zero })) as Entity; if (loadedEntity == null) { // 部分例如草莓则是 EntityData + Vector2 + EntityID loadedEntity = savedType .GetConstructor(new[] { typeof(EntityData), typeof(Vector2), typeof(EntityID) }) ?.Invoke(new object[] { savedEntity.GetEntityData(), Vector2.Zero, savedEntity.GetEntityId2().EntityId }) as Entity; } if (loadedEntity == null && savedType.IsType <CrystalStaticSpinner>()) { loadedEntity = new CrystalStaticSpinner(savedEntity.GetEntityData(), Vector2.Zero, (CrystalColor)savedEntity.GetField(typeof(CrystalStaticSpinner), "color")); } if (loadedEntity == null && savedType.IsType <TriggerSpikes>()) { loadedEntity = new TriggerSpikes(savedEntity.GetEntityData(), Vector2.Zero, (TriggerSpikes.Directions)savedEntity.GetField(typeof(TriggerSpikes), "direction")); } if (loadedEntity == null && savedType.IsType <Spikes>()) { loadedEntity = new Spikes(savedEntity.GetEntityData(), Vector2.Zero, ((Spikes)savedEntity).Direction); } if (loadedEntity == null && savedType.IsType <TriggerSpikes>()) { loadedEntity = new Spring(savedEntity.GetEntityData(), Vector2.Zero, ((Spring)savedEntity).Orientation); } if (loadedEntity != null) { loadedEntity.Position = savedEntity.Position; loadedEntity.CopyEntityData(savedEntity); loadedEntity.CopyEntityId2(savedEntity); return(loadedEntity); } } // TODO 如果是他们的子类该怎么办…… if (savedType.IsType <BadelineDummy>()) { loadedEntity = new BadelineDummy(savedEntity.GetStartPosition()); } else if (savedType.IsType <AngryOshiro>()) { loadedEntity = new AngryOshiro(savedEntity.GetStartPosition(), (bool)savedEntity.GetField("fromCutscene")); } else if (savedType.IsType <Snowball>()) { loadedEntity = new Snowball(); } else if (savedType.IsType <SlashFx>() && savedEntity is SlashFx slashFx) { loadedEntity = slashFx.Clone(); } else if (savedType.IsType <SpeedRing>() && savedEntity is SpeedRing speedRing) { loadedEntity = speedRing.Clone(); } else if (savedType.IsType <FinalBossShot>() && savedEntity is FinalBossShot finalBossShot) { loadedEntity = finalBossShot.Clone(); } else if (savedType.IsType <FinalBossBeam>() && savedEntity is FinalBossBeam finalBossBeam) { loadedEntity = finalBossBeam.Clone(); } else if (savedType.IsType <BirdTutorialGui>() && savedEntity is BirdTutorialGui birdTutorialGui) { loadedEntity = birdTutorialGui.Clone(); } else if (savedType.IsType <SoundEmitter>() && savedEntity is SoundEmitter soundEmitter) { loadedEntity = SoundEmitter.Play(soundEmitter.Source.EventName, new Entity(soundEmitter.Position)); if (SoundSourceAction.PlayingSoundSources.FirstOrDefault(source => source.EventName == soundEmitter.Source.EventName) == null) { (loadedEntity as SoundEmitter)?.Source.TryCopyObject(soundEmitter.Source); } else { (loadedEntity as SoundEmitter)?.Source.Stop(); } } else if (savedType.IsType <Debris>() && savedEntity is Debris debris) { loadedEntity = Engine.Pooler.Create <Debris>() .Init(debris.GetStartPosition(), (char)debris.GetField("tileset"), (bool)debris.GetField("playSound")); } else if (savedType == typeof(TalkComponent.TalkComponentUI)) { // ignore } else if (savedType.IsType <Entity>()) { loadedEntity = new Entity(savedEntity.GetStartPosition()); } else { if (savedEntity.GetType().FullName == "Celeste.MoveBlock+Debris") { loadedEntity = (savedEntity as Actor).CloneMoveBlockDebris(); } else if (savedEntity.ForceCreateInstance(tag) is Entity newEntity) { loadedEntity = newEntity; } } if (loadedEntity == null) { return(null); } loadedEntity.Position = savedEntity.Position; loadedEntity.CopyEntityId2(savedEntity); loadedEntity.CopyStartPosition(savedEntity); return(loadedEntity); }
private void CrystalStaticSpinner_ctor(On.Celeste.CrystalStaticSpinner.orig_ctor_Vector2_bool_CrystalColor orig, CrystalStaticSpinner self, Vector2 position, bool attachToSolid, CrystalColor color) { if (Settings.SimplifiedGraphics) { color = CrystalColor.Blue; } orig(self, position, attachToSolid, color); }
private void CrystalStaticSpinner_CreateSprites(On.Celeste.CrystalStaticSpinner.orig_CreateSprites orig, CrystalStaticSpinner self) { if (Settings.SimplifiedGraphics && Settings.SimplifiedSpinnerColor.Name != null) { SpinnerColorField.SetValue(self, Settings.SimplifiedSpinnerColor.Name); } orig(self); }
public ChangeColorComponent(CrystalStaticSpinner spinner, CrystalColor newColor) : base(true, false) { this.spinner = spinner; this.newColor = newColor; }