From f86c32ac6faa669c0d657234dac5b082476d6d6c Mon Sep 17 00:00:00 2001 From: Samah Date: Fri, 17 Jan 2025 15:06:03 +1030 Subject: [PATCH 1/2] Add checkbox to disable gravity helper support for purple boosters --- Code/Entities/LavenderBooster.cs | 7 +++++ Code/Entities/PurpleBooster.cs | 44 ++++++++++++++++++++++--------- Code/VortexHelperSession.cs | 1 + Loenn/entities/purple_booster.lua | 9 ++++++- Loenn/lang/en_gb.lang | 1 + 5 files changed, 49 insertions(+), 13 deletions(-) diff --git a/Code/Entities/LavenderBooster.cs b/Code/Entities/LavenderBooster.cs index 70f20ec..64f0d92 100644 --- a/Code/Entities/LavenderBooster.cs +++ b/Code/Entities/LavenderBooster.cs @@ -17,11 +17,17 @@ public class LavenderBooster : Booster private readonly DynData boosterData; private readonly bool QoL; + private readonly bool LegacyGravityHelper; + public LavenderBooster(EntityData data, Vector2 offset) : base(data.Position + offset, red: false) { this.boosterData = new DynData(this); QoL = data.Bool("QoL", false); + + // Unlike most legacy settings, this defaults to false so that old maps used the "fixed" functionality. + // If an older map specifically wants the jank interaction, they will need to replace the entities and rerelease. + LegacyGravityHelper = data.Bool("legacyGravityHelper", false); Sprite oldSprite = this.boosterData.Get("sprite"); Remove(oldSprite); @@ -62,6 +68,7 @@ private static void Booster_PlayerReleased(On.Celeste.Booster.orig_PlayerRelease Audio.Play(SFX.game_05_redbooster_end, player.Center); PurpleBooster.LaunchPlayerParticles(player, player.DashDir, P_BurstExplodeLavender); VortexHelperModule.SessionProperties.BoosterQoL = false; + VortexHelperModule.SessionProperties.BoosterLegacyGravityHelper = l.LegacyGravityHelper; PurpleBooster.PurpleBoosterExplodeLaunch(player, self.Center - player.DashDir, null, -1f); } } diff --git a/Code/Entities/PurpleBooster.cs b/Code/Entities/PurpleBooster.cs index 24ff11d..4faf3b3 100644 --- a/Code/Entities/PurpleBooster.cs +++ b/Code/Entities/PurpleBooster.cs @@ -48,9 +48,15 @@ public bool BoostingPlayer private readonly SoundSource loopingSfx; public readonly bool QoL; + public readonly bool LegacyGravityHelper; + public PurpleBooster(EntityData data, Vector2 offset) : this(data.Position + offset, data.Attr("spriteOverride", null)) { QoL = data.Bool("QoL"); + + // Unlike most legacy settings, this defaults to false so that old maps used the "fixed" functionality. + // If an older map specifically wants the jank interaction, they will need to replace the entities and rerelease. + LegacyGravityHelper = data.Bool("legacyGravityHelper", false); } public PurpleBooster(Vector2 position, string spriteOverride) @@ -149,6 +155,7 @@ public static void Boost(Player player, PurpleBooster booster) player.Speed = Vector2.Zero; player.boostTarget = booster.Center; VortexHelperModule.SessionProperties.BoosterQoL = booster.QoL; + VortexHelperModule.SessionProperties.BoosterLegacyGravityHelper = booster.LegacyGravityHelper; booster.StartedBoosting = true; } @@ -254,7 +261,7 @@ public override void Update() { base.Update(); - var inverted = GravityHelperInterop.IsPlayerInverted(); + var inverted = !this.LegacyGravityHelper && GravityHelperInterop.IsPlayerInverted(); this.actualLinkPercent = Calc.Approach(this.actualLinkPercent, this.linkPercent, 5f * Engine.DeltaTime); @@ -382,10 +389,11 @@ public static int PurpleBoostUpdate(Player player) Vector2 value = Input.Aim.Value * 3f; Vector2 vector = Calc.Approach(player.ExactPosition, boostTarget - player.Collider.Center + value, 80f * Engine.DeltaTime); - GravityHelperInterop.BeginOverride(); + var legacyGravityHelper = VortexHelperModule.SessionProperties.BoosterLegacyGravityHelper; + if (!legacyGravityHelper) GravityHelperInterop.BeginOverride(); player.MoveToX(vector.X, null); player.MoveToY(vector.Y, null); - GravityHelperInterop.EndOverride(); + if (!legacyGravityHelper) GravityHelperInterop.EndOverride(); if (Vector2.DistanceSquared(player.Center, boostTarget) >= 275f) { @@ -410,11 +418,12 @@ public static int PurpleBoostUpdate(Player player) public static void PurpleBoostEnd(Player player) { - GravityHelperInterop.BeginOverride(); + var legacyGravityHelper = VortexHelperModule.SessionProperties.BoosterLegacyGravityHelper; + if (!legacyGravityHelper) GravityHelperInterop.BeginOverride(); Vector2 vector = (player.boostTarget - player.Collider.Center).Floor(); player.MoveToX(vector.X, null); player.MoveToY(vector.Y, null); - GravityHelperInterop.EndOverride(); + if (!legacyGravityHelper) GravityHelperInterop.EndOverride(); } public static IEnumerator PurpleBoostCoroutine(Player player) @@ -428,7 +437,9 @@ public static void PurpleDashingBegin(Player player) { Celeste.Freeze(0.05f); // this freeze makes fastbubbling much more lenient DynamicData playerData = DynamicData.For(player); - player.DashDir = GravityHelperInterop.InvertIfRequired(Input.GetAimVector(player.Facing)); + player.DashDir = Input.GetAimVector(player.Facing); + if (!VortexHelperModule.SessionProperties.BoosterLegacyGravityHelper) + player.DashDir = GravityHelperInterop.InvertIfRequired(player.DashDir); playerData.Set(POSSIBLE_EARLY_DASHSPEED, Vector2.Zero); foreach (PurpleBooster b in player.Scene.Tracker.GetEntities()) @@ -478,14 +489,17 @@ public static IEnumerator PurpleDashingCoroutine(Player player) Vector2 origin = player.boostTarget; if(VortexHelperModule.SessionProperties.BoosterQoL) { yield return null; - player.DashDir = GravityHelperInterop.InvertIfRequired(player.lastAim); + player.DashDir = player.lastAim; + if (!VortexHelperModule.SessionProperties.BoosterLegacyGravityHelper) + player.DashDir = GravityHelperInterop.InvertIfRequired(player.DashDir); } Vector2 earlyExitBoost = Vector2.Zero; while (t < 1f) { t = Calc.Approach(t, 1.0f, Engine.DeltaTime * 1.5f); - float offset = GravityHelperInterop.IsPlayerInverted() ? -6f : 6f; + var inverted = !VortexHelperModule.SessionProperties.BoosterLegacyGravityHelper && GravityHelperInterop.IsPlayerInverted(); + float offset = inverted ? -6f : 6f; Vector2 vec = origin + Vector2.UnitY * offset + player.DashDir * 60f * (float) Math.Sin(t * Math.PI); if(VortexHelperModule.SessionProperties.BoosterQoL) @@ -494,7 +508,9 @@ public static IEnumerator PurpleDashingCoroutine(Player player) { // frame 0: mimics speed at launch exit exactly, Input.MoveX.Value == -Math.Sign(player.DashDir) ? 300 : 250 earlyExitBoost = 250f * -player.DashDir; - Vector2 aim = GravityHelperInterop.InvertIfRequired(Input.GetAimVector(player.Facing)); + Vector2 aim = Input.GetAimVector(player.Facing); + if (!VortexHelperModule.SessionProperties.BoosterLegacyGravityHelper) + aim = GravityHelperInterop.InvertIfRequired(aim); aim = aim.EightWayNormal().Sign(); if (aim.X == Math.Sign(earlyExitBoost.X)) earlyExitBoost.X *= 1.2f; if (aim.Y == Math.Sign(earlyExitBoost.Y)) earlyExitBoost.Y *= 1.2f; @@ -516,9 +532,11 @@ public static IEnumerator PurpleDashingCoroutine(Player player) player.StateMachine.State = Player.StNormal; yield break; } - GravityHelperInterop.BeginOverride(); + + var legacyGravityHelper = VortexHelperModule.SessionProperties.BoosterLegacyGravityHelper; + if (!legacyGravityHelper) GravityHelperInterop.BeginOverride(); player.MoveToX(vec.X); player.MoveToY(vec.Y); - GravityHelperInterop.EndOverride(); + if (!legacyGravityHelper) GravityHelperInterop.EndOverride(); yield return null; } @@ -529,10 +547,12 @@ public static IEnumerator PurpleDashingCoroutine(Player player) public static void PurpleDashingEnd(Player player) { VortexHelperModule.SessionProperties.BoosterQoL = false; + VortexHelperModule.SessionProperties.BoosterLegacyGravityHelper = false; } public static void PurpleBoosterExplodeLaunch(Player player, Vector2 from, Vector2? origin, float factor = 1f) { bool QoL = VortexHelperModule.SessionProperties.BoosterQoL; + bool legacyGravityHelper = VortexHelperModule.SessionProperties.BoosterLegacyGravityHelper; Input.Rumble(RumbleStrength.Strong, RumbleLength.Medium); Celeste.Freeze(QoL ? 0.05f : 0.1f); player.launchApproachX = null; @@ -544,7 +564,7 @@ public static void PurpleBoosterExplodeLaunch(Player player, Vector2 from, Vecto level.Shake(0.15f); Vector2 vector = (player.Center - from).SafeNormalize(-Vector2.UnitY); - vector = GravityHelperInterop.InvertIfRequired(vector); + if (!legacyGravityHelper) vector = GravityHelperInterop.InvertIfRequired(vector); if (Math.Abs(vector.X) < 1f && Math.Abs(vector.Y) < 1f) vector *= 1.1f; diff --git a/Code/VortexHelperSession.cs b/Code/VortexHelperSession.cs index 56f3aa6..a6d2716 100644 --- a/Code/VortexHelperSession.cs +++ b/Code/VortexHelperSession.cs @@ -12,4 +12,5 @@ public enum SwitchBlockColor public SwitchBlockColor SessionSwitchBlockColor { get; set; } = SwitchBlockColor.Blue; internal bool BoosterQoL { get; set; } = false; + internal bool BoosterLegacyGravityHelper { get; set; } = false; } diff --git a/Loenn/entities/purple_booster.lua b/Loenn/entities/purple_booster.lua index 6807660..0329171 100644 --- a/Loenn/entities/purple_booster.lua +++ b/Loenn/entities/purple_booster.lua @@ -11,6 +11,7 @@ purpleBooster.placements = { data = { lavender = false, QoL = true, + legacyGravityHelper = false, spriteOverride = "" } }, @@ -18,11 +19,17 @@ purpleBooster.placements = { name = "lavender", data = { lavender = true, - QoL = true + QoL = true, + legacyGravityHelper = false } } } +purpleBooster.fieldOrder = { + "x", "y", + "lavender", "QoL", "spriteOverride", "legacyGravityHelper" +} + function purpleBooster.texture(room, entity) return entity.lavender and "objects/VortexHelper/lavenderBooster/boosterLavender00" or "objects/VortexHelper/slingBooster/slingBooster00" diff --git a/Loenn/lang/en_gb.lang b/Loenn/lang/en_gb.lang index 8466e0e..cfc6e4f 100644 --- a/Loenn/lang/en_gb.lang +++ b/Loenn/lang/en_gb.lang @@ -77,6 +77,7 @@ entities.VortexHelper/PurpleBooster.placements.name.lavender=Booster (Lavender) entities.VortexHelper/PurpleBooster.attributes.description.lavender=Whether the booster should instead be lavender in color, and launch the player forward instead of arcing back. entities.VortexHelper/PurpleBooster.attributes.name.QoL=Version 2 entities.VortexHelper/PurpleBooster.attributes.description.QoL=Enables Wallbouncing during the windup animation.\nFixes speedboost not applying when dashing early from booster.\nReduces Freeze Timer upon launch exit and ensures a shorter dashCooldownTimer. +entities.VortexHelper/PurpleBooster.attributes.description.legacyGravityHelper=Disables explicit support for Gravity Helper and reverts to the janky interactions while upside down.\nDon't enable this, ever. Really. PLEASE DON'T. # Switch Block entities.VortexHelper/SwitchBlock.placements.name.switch_block_0=Switch Block (0 - Blue) From 6f85998fd16e27a82143bf8e4a73474fc32acd65 Mon Sep 17 00:00:00 2001 From: Samah Date: Fri, 17 Jan 2025 15:06:29 +1030 Subject: [PATCH 2/2] Fix QoL parameter not being honoured for lavender boosters --- Code/Entities/LavenderBooster.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Code/Entities/LavenderBooster.cs b/Code/Entities/LavenderBooster.cs index 64f0d92..e769551 100644 --- a/Code/Entities/LavenderBooster.cs +++ b/Code/Entities/LavenderBooster.cs @@ -67,7 +67,7 @@ private static void Booster_PlayerReleased(On.Celeste.Booster.orig_PlayerRelease { Audio.Play(SFX.game_05_redbooster_end, player.Center); PurpleBooster.LaunchPlayerParticles(player, player.DashDir, P_BurstExplodeLavender); - VortexHelperModule.SessionProperties.BoosterQoL = false; + VortexHelperModule.SessionProperties.BoosterQoL = l.QoL; VortexHelperModule.SessionProperties.BoosterLegacyGravityHelper = l.LegacyGravityHelper; PurpleBooster.PurpleBoosterExplodeLaunch(player, self.Center - player.DashDir, null, -1f); }