Exemplo n.º 1
0
        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;
                        }
                    }
                }
            }
        }
Exemplo n.º 3
0
        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);
            }
        }
Exemplo n.º 4
0
        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);
        }
Exemplo n.º 7
0
 public CoreModeListener(CrystalStaticSpinner parent)
     : base(true, false)
 {
     // no-op. MonoMod ignores this - we only need this to make the compiler shut up.
 }
Exemplo n.º 8
0
        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);
        }
Exemplo n.º 11
0
        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));
            }
        }
Exemplo n.º 12
0
 private static Color getRainbowSpinnerHue(On.Celeste.CrystalStaticSpinner.orig_GetHue orig, CrystalStaticSpinner self, Vector2 position)
 {
     return(getEntityHue(() => orig(self, position), self, position));
 }
Exemplo n.º 13
0
        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);
        }
Exemplo n.º 16
0
 public ChangeColorComponent(CrystalStaticSpinner spinner, CrystalColor newColor)
     : base(true, false)
 {
     this.spinner  = spinner;
     this.newColor = newColor;
 }