Exemple #1
0
        private void onLevelUpdate(On.Celeste.Level.orig_Update orig, Level self)
        {
            if (Input.Aim == null || Input.MoveX == null || SaveData.Instance?.Assists == null || Settings == null)
            {
                orig(self);
                return;
            }

            // this is vanilla behavior
            Input.Aim.InvertedX = SaveData.Instance.Assists.MirrorMode;

            // there may be Crow Control here. if so, it will mess with Input.Aim.InvertedX
            orig(self);

            // at this point, Input.Aim.InvertedX is either the vanilla value, or what Crow Control wants.
            // either way, we should keep it or invert it based on our settings.

            bool expectedValue = Input.Aim.InvertedX;

            if (Settings.InvertHorizontalControls)
            {
                expectedValue = !expectedValue;
            }

            Input.Aim.InvertedX  = expectedValue;
            Input.MoveX.Inverted = expectedValue;
        }
Exemple #2
0
        private static void onLevelUpdate(On.Celeste.Level.orig_Update orig, Level self)
        {
            orig(self);

            // check if the player is in a color grade fade trigger
            Player player = self.Tracker.GetEntity <Player>();
            ColorGradeFadeTrigger trigger = self.Tracker.GetEntities <ColorGradeFadeTrigger>().OfType <ColorGradeFadeTrigger>()
                                            .FirstOrDefault(t => t.evenDuringReflectionFall ? player?.Collider.Collide(t) ?? false : t.playerInside);

            if (player != null && trigger != null)
            {
                DynData <Level> selfData = new DynData <Level>(self);

                // the game fades from lastColorGrade to Session.ColorGrade using colorGradeEase as a lerp value.
                // let's hijack that!
                float positionLerp = trigger.GetPositionLerp(player, trigger.direction);
                if (positionLerp > 0.5f)
                {
                    // we are closer to B. let B be the target color grade when player exits the trigger / dies in it
                    selfData["lastColorGrade"] = trigger.colorGradeA;
                    self.Session.ColorGrade    = trigger.colorGradeB;
                    selfData["colorGradeEase"] = positionLerp;
                }
                else
                {
                    // we are closer to A. let A be the target color grade when player exits the trigger / dies in it
                    selfData["lastColorGrade"] = trigger.colorGradeB;
                    self.Session.ColorGrade    = trigger.colorGradeA;
                    selfData["colorGradeEase"] = 1 - positionLerp;
                }
                selfData["colorGradeEaseSpeed"] = 1f;
            }
        }
Exemple #3
0
 internal static void Level_Update(On.Celeste.Level.orig_Update orig, Level self)
 {
     //speed changing
     if (EmoteModMain.anim_by_game == 1)
     {
         foreach (Entity entity in self.Entities)
         {
             foreach (Sprite sprite in entity.Components.GetAll <Sprite>())
             {
                 if (sprite == player.Sprite && sprite.Animating)
                 {
                     DynData <Sprite> data = new DynData <Sprite>(sprite);
                     if (EmoteModMain.Settings.AnimationSpeed != 9)
                     {
                         (data["currentAnimation"] as Sprite.Animation).Delay = currentDelay /
                                                                                speeds[EmoteModMain.Settings.AnimationSpeed];
                     }
                     else
                     {
                         (data["currentAnimation"] as Sprite.Animation).Delay = sprite.Animations[sprite.CurrentAnimationID].Delay;
                     }
                 }
             }
         }
     }
     orig(self);
 }
Exemple #4
0
        private void ProcessButtons(On.Celeste.Level.orig_Update orig, Level self)
        {
            orig(self);
            if (!SpeedrunToolModule.Enabled)
            {
                return;
            }

            if (GetVirtualButton(Mappings.ResetRoomPb).Pressed&& !self.Paused)
            {
                GetVirtualButton(Mappings.ResetRoomPb).ConsumePress();
                ClearPbTimes();
            }

            if (GetVirtualButton(Mappings.SwitchRoomTimer).Pressed&& !self.Paused)
            {
                GetVirtualButton(Mappings.SwitchRoomTimer).ConsumePress();
                RoomTimerType roomTimerType = SpeedrunToolModule.Settings.RoomTimerType;
                SwitchRoomTimer(((int)roomTimerType + 1) % Enum.GetNames(typeof(RoomTimerType)).Length);
                SpeedrunToolModule.Instance.SaveSettings();
            }

            if (GetVirtualButton(Mappings.SetEndPoint).Pressed&& !self.Paused)
            {
                GetVirtualButton(Mappings.SetEndPoint).ConsumePress();
                ClearPbTimes();
                CreateEndPoint(self);
            }
        }
        private void Timing(On.Celeste.Level.orig_Update orig, Level self)
        {
            if (SpeedrunToolModule.LivesplitMode)
            {
                var currentRoom = Celeste.Instance.AutoSplitterInfo.Level;
                if (previousRoom != null && previousRoom != currentRoom)
                {
                    UpdateTimerState();
                }

                previousRoom = currentRoom;
            }
            else
            {
                if (!self.Completed && self.TimerStarted)
                {
                    nextRoomTimerData.Timing(self);
                    currentRoomTimerData.Timing(self);
                }
                else if (self.Completed)
                {
                    UpdateTimerState();
                }
            }

            orig(self);
        }
        private void onLevelUpdate(On.Celeste.Level.orig_Update orig, Level self)
        {
            orig(self);

            if (Settings.AnxietyEffect != -1)
            {
                anxietyCustomized = true;

                // set the anxiety intensity
                GFX.FxDistort.Parameters["anxiety"].SetValue(Celeste.Settings.Instance.DisableFlashes ? 0f : Settings.AnxietyEffect / 5f);

                Vector2 camera = self.Camera.Position;
                Player  player = self.Tracker.GetEntity <Player>();
                if (player != null)
                {
                    // the anxiety comes from the player
                    GFX.FxDistort.Parameters["anxietyOrigin"].SetValue(new Vector2((player.Center.X - camera.X) / 320f, (player.Center.Y - camera.Y) / 180f));
                }
                else
                {
                    // there is no player; the anxiety come from the screen center
                    GFX.FxDistort.Parameters["anxietyOrigin"].SetValue(new Vector2(0.5f, 0.5f));
                }
            }
            else if (anxietyCustomized)
            {
                // restore the anxiety to its default value
                anxietyCustomized     = false;
                Distort.Anxiety       = Distort.Anxiety;
                Distort.AnxietyOrigin = Distort.AnxietyOrigin;
            }
        }
        // cancel if not on level
        public static void Level_Update(On.Celeste.Level.orig_Update orig, Level self)
        {
            orig(self);

            if (!(Engine.Scene is Level) && EmoteModMain.anim_by_game == 1)
            {
                cancelEmote();
            }
        }
Exemple #8
0
        private static void LevelOnUpdate(On.Celeste.Level.orig_Update orig, Level self)
        {
            orig(self);

            if (transitionFrames > 0)
            {
                transitionFrames--;
            }
        }
Exemple #9
0
        private static void OnLevelUpdate(On.Celeste.Level.orig_Update orig, Level self)
        {
            orig(self);

            if (!self.Paused)
            {
                // progressively fade in or out.
                alphaFade = Calc.Approach(alphaFade, SpringCollab2020Module.Instance.Session.LightSourcesDisabled ? 0f : 1f, Engine.DeltaTime * 3f);
            }
        }
        private void CheckButtonsAndUpdateBackdrop(On.Celeste.Level.orig_Update orig, Level self)
        {
            orig(self);
            CheckButton(self);

            if (State == States.Waiting && self.Frozen)
            {
                self.Foreground.Update(self);
                self.Background.Update(self);
            }
        }
        private static void onLevelUpdate(On.Celeste.Level.orig_Update orig, Level self)
        {
            orig(self);

            float ambienceVolume = MaxHelpingHandModule.Instance.Session.AmbienceVolume;

            if (ambienceVolume < 1)
            {
                Audio.CurrentAmbienceEventInstance?.setVolume(ambienceVolume);
            }
        }
        private void Level_Update(On.Celeste.Level.orig_Update orig, Level self)
        {
            orig(self);

            // Seems modified the Settings.SimplifiedGraphics property will mess key config.
            if (lastSimplifiedGraphics != Settings.SimplifiedGraphics)
            {
                OnSimplifiedGraphicsChanged(Settings.SimplifiedGraphics);
                lastSimplifiedGraphics = Settings.SimplifiedGraphics;
            }
        }
Exemple #13
0
        private void Timing(On.Celeste.Level.orig_Update orig, Level self)
        {
            if (!self.Completed && self.TimerStarted)
            {
                nextRoomTimerData.Timing(self.Session);
                currentRoomTimerData.Timing(self.Session);
            }
            else if (self.Completed)
            {
                UpdateTimerState();
            }

            orig(self);
        }
        private void LevelOnUpdate(On.Celeste.Level.orig_Update orig, Level level)
        {
            orig(level);
            if (!SpeedrunToolModule.Enabled)
            {
                return;
            }

            if (level.Paused)
            {
                return;
            }

            CheckDeathStatisticsButton(level);
        }
        private static void AddedOpenDebugMapButton(On.Celeste.Level.orig_Update orig, Level self)
        {
            orig(self);

            if (!SpeedrunToolModule.Enabled)
            {
                return;
            }

            if (GetVirtualButton(Mappings.OpenDebugMap).Pressed&& !self.Paused)
            {
                GetVirtualButton(Mappings.OpenDebugMap).ConsumePress();
                Engine.Commands.FunctionKeyActions[5]();
            }
        }
Exemple #16
0
        private static void LevelOnUpdate(On.Celeste.Level.orig_Update orig, Level self)
        {
            orig(self);

            if (!SpeedrunToolModule.Enabled)
            {
                return;
            }

            if (GetVirtualButton(Mappings.LastRoom).Pressed&& !self.Paused)
            {
                GetVirtualButton(Mappings.LastRoom).ConsumePress();
                TeleportToLastRoom(self);
            }
            else if (GetVirtualButton(Mappings.NextRoom).Pressed&& !self.Paused)
            {
                GetVirtualButton(Mappings.NextRoom).ConsumePress();
                TeleportToNextRoom(self);
            }
        }
        private void ProcessButtons(On.Celeste.Level.orig_Update orig, Level self)
        {
            orig(self);
            if (!SpeedrunToolModule.Enabled || self.Paused)
            {
                return;
            }

            if (Mappings.ResetRoomPb.Pressed() && !self.Paused)
            {
                Mappings.ResetRoomPb.ConsumePress();
                ClearPbTimes();
            }

            if (Mappings.SwitchRoomTimer.Pressed() && !self.Paused)
            {
                Mappings.SwitchRoomTimer.ConsumePress();
                RoomTimerType roomTimerType = SpeedrunToolModule.Settings.RoomTimerType;
                SwitchRoomTimer(((int)roomTimerType + 1) % Enum.GetNames(typeof(RoomTimerType)).Length);
                SpeedrunToolModule.Instance.SaveSettings();
            }

            if (Mappings.SetEndPoint.Pressed() && !self.Paused)
            {
                Mappings.SetEndPoint.ConsumePress();
                ClearPbTimes();
                CreateEndPoint(self);
            }

            if (Mappings.SetAdditionalEndPoint.Pressed() && !self.Paused)
            {
                Mappings.SetAdditionalEndPoint.ConsumePress();
                if (!EndPoint.IsExist)
                {
                    ClearPbTimes();
                }

                CreateEndPoint(self, true);
            }
        }
Exemple #18
0
        private void LevelOnUpdate(On.Celeste.Level.orig_Update orig, Level level)
        {
            if (!SpeedrunToolModule.Enabled)
            {
                orig(level);
                return;
            }

            Player player = level.Entities.FindFirst <Player>();

            if (CheckButton(level, player))
            {
                return;
            }

            // 章节切换时清除保存的状态以及房间计时器自定终点
            // Clear the savestate and custom end point when switching chapters
            if (IsSaved && (savedSession.Area.ID != level.Session.Area.ID ||
                            savedSession.Area.Mode != level.Session.Area.Mode))
            {
                ClearState();
                RoomTimerManager.Instance.ClearPbTimes();
            }

            // 尽快设置人物的位置与镜头,然后冻结游戏等待人物复活
            // Set player position ASAP, then freeze game and wait for the player to respawn (? - euni)
            if (IsSaved && IsLoadStart && player != null)
            {
                LoadStart(level);

                // 调用 Level.Update 多次使所有 Entity 更新绘完毕后后再冻结游戏
                // Wait for some frames so entities can be updated and rendered, then freeze game.
                for (int i = 0; i < 3; i++)
                {
                    orig(level);
                }

                // 等所有 Entity 创建完毕并渲染完成后再统一在此时机还原状态
                RestoreEntityUtils.AfterEntityAwake(level);

                // 冻结游戏等待 Madeline 复活
                // Freeze the game wait for madeline respawn.
                if (player.StateMachine.State == Player.StIntroRespawn)
                {
                    level.Frozen    = true;
                    level.PauseLock = true;
                    loadState       = SaveLoad.LoadState.Frozen;
                }
                else
                {
                    loadState = SaveLoad.LoadState.PlayerRespawned;
                }

                return;
            }

            // 冻结时允许人物 Update 以便复活
            // Allow player to respawn while level is frozen
            if (IsSaved && IsLoadFrozen)
            {
                UpdatePlayerWhenFreeze(level, player);
            }

            // 人物复活完毕后设置人物相关属性
            // Set more player data after the player respawns
            if (IsSaved && (IsPlayerRespawned || IsLoadFrozen) && player != null &&
                (player.StateMachine.State == Player.StNormal || player.StateMachine.State == Player.StSwim ||
                 player.StateMachine.State == Player.StFlingBird))
            {
                RestoreEntityUtils.AfterPlayerRespawn(level);

                level.Frozen    = false;
                level.PauseLock = false;
                // BadelinOldsite 追踪需要
                level.TimeActive = SavedLevel.TimeActive;
                loadState        = SaveLoad.LoadState.Complete;

                RestoreEntityUtils.OnLoadComplete(level);
            }

            orig(level);
        }
Exemple #19
0
        private void Level_Update(On.Celeste.Level.orig_Update orig, Level self)
        {
            Level newLevel = self;

            actionHelper.SetLevel(newLevel);
            spawnHelper.SetLevel(newLevel);
            currentLevel = newLevel;

            if (Settings.Blur && Settings.BlurEnabled)
            {
                BlurCurrentLevel(newLevel, Settings.BlurLevel);
            }
            else
            {
                BlurCurrentLevel(newLevel, 1);
            }

            if (Settings.DisableGrab && Settings.DisableGrabEnabled)
            {
                SaveData.Instance.Assists.NoGrabbing = true;
            }
            else
            {
                SaveData.Instance.Assists.NoGrabbing = false;
            }

            if (Settings.Mirror && Settings.MirrorEnabled)
            {
                SaveData.Instance.Assists.MirrorMode = true;
                if (Settings.Invert && Settings.InvertEnabled)
                {
                    Input.MoveX.Inverted = false;
                    Input.Aim.InvertedX  = false;
                }
                else
                {
                    Input.MoveX.Inverted = true;
                    Input.Aim.InvertedX  = true;
                }
            }
            else
            {
                SaveData.Instance.Assists.MirrorMode = false;
                if (Settings.Invert && Settings.InvertEnabled)
                {
                    Input.MoveX.Inverted = true;
                    Input.Aim.InvertedX  = true;
                }
                else
                {
                    Input.MoveX.Inverted = false;
                    Input.Aim.InvertedX  = false;
                }
            }

            if (Settings.Invisible && Settings.InvisibleEnabled)
            {
                SaveData.Instance.Assists.InvisibleMotion = true;
            }
            else
            {
                SaveData.Instance.Assists.InvisibleMotion = false;
            }

            if (Settings.LowFriction && Settings.LowFrictionEnabled)
            {
                SaveData.Instance.Assists.LowFriction = true;
            }
            else
            {
                SaveData.Instance.Assists.LowFriction = false;
            }

            if (Settings.GodMode && Settings.GodModeEnabled)
            {
                SaveData.Instance.Assists.Invincible = true;
            }
            else
            {
                SaveData.Instance.Assists.Invincible = false;
            }

            if (spawnKevin)
            {
                CrushBlock crushBlock = new CrushBlock(ply.Position - new Vector2(12, 50), 25, 25, CrushBlock.Axes.Vertical, false);
                currentLevel.Add(crushBlock);
                currentLevel.Entities.UpdateLists();
                crushBlock.OnDashCollide(ply, new Vector2(0, -1));
                spawnKevin = false;
            }

            if (newLevel.Entities.AmountOf <PlayerSeeker>() > 0 || inCredits || ascending)
            {
                disableCommands = true;
            }
            else
            {
                disableCommands = false;
            }

            orig(newLevel);
        }
 private void CheckButtonsOnLevelUpdate(On.Celeste.Level.orig_Update orig, Level self)
 {
     orig(self);
     CheckButton(self);
 }