示例#1
0
        private void DontSpawnTwoOshiros(On.Celeste.AngryOshiro.orig_Added orig, AngryOshiro self, Scene scene)
        {
            orig(self, scene);
            var level = scene as Level;

            if (!level.Session.GetFlag("oshiro_resort_roof") && level.Session.Level.StartsWith("Celeste/3-CelestialResort/A/roof00"))
            {
                self.RemoveSelf();
            }
        }
        public void SpawnOshiro(bool addToList)
        {
            if (currentLevel == null)
            {
                return;
            }

            Vector2     position = new Vector2(currentLevel.Bounds.Left - 32, currentLevel.Bounds.Top + currentLevel.Bounds.Height / 2);
            AngryOshiro oshiro   = new AngryOshiro(position, false);

            if (addToList)
            {
                spawnedOshiros.Add(oshiro);
            }
            currentLevel.Add(oshiro);
        }
示例#3
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);
        }
示例#4
0
        private static void TrackOshiroBonks(On.Celeste.AngryOshiro.orig_HurtBegin orig, AngryOshiro self)
        {
            orig(self);

            var area = SaveData.Instance.CurrentSession.Area;

            try {
                BingoClient.Instance.ModSaveData.OshiroBonks[area.ID + (int)area.Mode * 11]++;
            } catch (IndexOutOfRangeException) { }
        }