Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 8 additions & 1 deletion Code/Entities/LavenderBooster.cs
Original file line number Diff line number Diff line change
Expand Up @@ -17,11 +17,17 @@ public class LavenderBooster : Booster

private readonly DynData<Booster> 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<Booster>(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>("sprite");
Remove(oldSprite);
Expand Down Expand Up @@ -61,7 +67,8 @@ 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);
}
}
Expand Down
44 changes: 32 additions & 12 deletions Code/Entities/PurpleBooster.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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;
}

Expand Down Expand Up @@ -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);

Expand Down Expand Up @@ -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)
{
Expand All @@ -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)
Expand All @@ -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<PurpleBooster>())
Expand Down Expand Up @@ -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)
Expand All @@ -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;
Expand All @@ -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;
}

Expand All @@ -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;
Expand All @@ -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;
Expand Down
1 change: 1 addition & 0 deletions Code/VortexHelperSession.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
9 changes: 8 additions & 1 deletion Loenn/entities/purple_booster.lua
Original file line number Diff line number Diff line change
Expand Up @@ -11,18 +11,25 @@ purpleBooster.placements = {
data = {
lavender = false,
QoL = true,
legacyGravityHelper = false,
spriteOverride = ""
}
},
{
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"
Expand Down
1 change: 1 addition & 0 deletions Loenn/lang/en_gb.lang
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
Loading