@@ -48,9 +48,15 @@ public bool BoostingPlayer
4848
4949 private readonly SoundSource loopingSfx ;
5050 public readonly bool QoL ;
51+ public readonly bool LegacyGravityHelper ;
52+
5153 public PurpleBooster ( EntityData data , Vector2 offset )
5254 : this ( data . Position + offset , data . Attr ( "spriteOverride" , null ) ) {
5355 QoL = data . Bool ( "QoL" ) ;
56+
57+ // Unlike most legacy settings, this defaults to false so that old maps used the "fixed" functionality.
58+ // If an older map specifically wants the jank interaction, they will need to replace the entities and rerelease.
59+ LegacyGravityHelper = data . Bool ( "legacyGravityHelper" , false ) ;
5460 }
5561
5662 public PurpleBooster ( Vector2 position , string spriteOverride )
@@ -149,6 +155,7 @@ public static void Boost(Player player, PurpleBooster booster)
149155 player . Speed = Vector2 . Zero ;
150156 player . boostTarget = booster . Center ;
151157 VortexHelperModule . SessionProperties . BoosterQoL = booster . QoL ;
158+ VortexHelperModule . SessionProperties . BoosterLegacyGravityHelper = booster . LegacyGravityHelper ;
152159 booster . StartedBoosting = true ;
153160 }
154161
@@ -254,7 +261,7 @@ public override void Update()
254261 {
255262 base . Update ( ) ;
256263
257- var inverted = GravityHelperInterop . IsPlayerInverted ( ) ;
264+ var inverted = ! this . LegacyGravityHelper && GravityHelperInterop . IsPlayerInverted ( ) ;
258265
259266 this . actualLinkPercent = Calc . Approach ( this . actualLinkPercent , this . linkPercent , 5f * Engine . DeltaTime ) ;
260267
@@ -382,10 +389,11 @@ public static int PurpleBoostUpdate(Player player)
382389 Vector2 value = Input . Aim . Value * 3f ;
383390 Vector2 vector = Calc . Approach ( player . ExactPosition , boostTarget - player . Collider . Center + value , 80f * Engine . DeltaTime ) ;
384391
385- GravityHelperInterop . BeginOverride ( ) ;
392+ var legacyGravityHelper = VortexHelperModule . SessionProperties . BoosterLegacyGravityHelper ;
393+ if ( ! legacyGravityHelper ) GravityHelperInterop . BeginOverride ( ) ;
386394 player . MoveToX ( vector . X , null ) ;
387395 player . MoveToY ( vector . Y , null ) ;
388- GravityHelperInterop . EndOverride ( ) ;
396+ if ( ! legacyGravityHelper ) GravityHelperInterop . EndOverride ( ) ;
389397
390398 if ( Vector2 . DistanceSquared ( player . Center , boostTarget ) >= 275f )
391399 {
@@ -410,11 +418,12 @@ public static int PurpleBoostUpdate(Player player)
410418
411419 public static void PurpleBoostEnd ( Player player )
412420 {
413- GravityHelperInterop . BeginOverride ( ) ;
421+ var legacyGravityHelper = VortexHelperModule . SessionProperties . BoosterLegacyGravityHelper ;
422+ if ( ! legacyGravityHelper ) GravityHelperInterop . BeginOverride ( ) ;
414423 Vector2 vector = ( player . boostTarget - player . Collider . Center ) . Floor ( ) ;
415424 player . MoveToX ( vector . X , null ) ;
416425 player . MoveToY ( vector . Y , null ) ;
417- GravityHelperInterop . EndOverride ( ) ;
426+ if ( ! legacyGravityHelper ) GravityHelperInterop . EndOverride ( ) ;
418427 }
419428
420429 public static IEnumerator PurpleBoostCoroutine ( Player player )
@@ -428,7 +437,9 @@ public static void PurpleDashingBegin(Player player)
428437 {
429438 Celeste . Freeze ( 0.05f ) ; // this freeze makes fastbubbling much more lenient
430439 DynamicData playerData = DynamicData . For ( player ) ;
431- player . DashDir = GravityHelperInterop . InvertIfRequired ( Input . GetAimVector ( player . Facing ) ) ;
440+ player . DashDir = Input . GetAimVector ( player . Facing ) ;
441+ if ( ! VortexHelperModule . SessionProperties . BoosterLegacyGravityHelper )
442+ player . DashDir = GravityHelperInterop . InvertIfRequired ( player . DashDir ) ;
432443 playerData . Set ( POSSIBLE_EARLY_DASHSPEED , Vector2 . Zero ) ;
433444
434445 foreach ( PurpleBooster b in player . Scene . Tracker . GetEntities < PurpleBooster > ( ) )
@@ -478,14 +489,17 @@ public static IEnumerator PurpleDashingCoroutine(Player player)
478489 Vector2 origin = player . boostTarget ;
479490 if ( VortexHelperModule . SessionProperties . BoosterQoL ) {
480491 yield return null ;
481- player . DashDir = GravityHelperInterop . InvertIfRequired ( player . lastAim ) ;
492+ player . DashDir = player . lastAim ;
493+ if ( ! VortexHelperModule . SessionProperties . BoosterLegacyGravityHelper )
494+ player . DashDir = GravityHelperInterop . InvertIfRequired ( player . DashDir ) ;
482495 }
483496
484497 Vector2 earlyExitBoost = Vector2 . Zero ;
485498 while ( t < 1f )
486499 {
487500 t = Calc . Approach ( t , 1.0f , Engine . DeltaTime * 1.5f ) ;
488- float offset = GravityHelperInterop . IsPlayerInverted ( ) ? - 6f : 6f ;
501+ var inverted = ! VortexHelperModule . SessionProperties . BoosterLegacyGravityHelper && GravityHelperInterop . IsPlayerInverted ( ) ;
502+ float offset = inverted ? - 6f : 6f ;
489503 Vector2 vec = origin + Vector2 . UnitY * offset + player . DashDir * 60f * ( float ) Math . Sin ( t * Math . PI ) ;
490504
491505 if ( VortexHelperModule . SessionProperties . BoosterQoL )
@@ -494,7 +508,9 @@ public static IEnumerator PurpleDashingCoroutine(Player player)
494508 {
495509 // frame 0: mimics speed at launch exit exactly, Input.MoveX.Value == -Math.Sign(player.DashDir) ? 300 : 250
496510 earlyExitBoost = 250f * - player . DashDir ;
497- Vector2 aim = GravityHelperInterop . InvertIfRequired ( Input . GetAimVector ( player . Facing ) ) ;
511+ Vector2 aim = Input . GetAimVector ( player . Facing ) ;
512+ if ( ! VortexHelperModule . SessionProperties . BoosterLegacyGravityHelper )
513+ aim = GravityHelperInterop . InvertIfRequired ( aim ) ;
498514 aim = aim . EightWayNormal ( ) . Sign ( ) ;
499515 if ( aim . X == Math . Sign ( earlyExitBoost . X ) ) earlyExitBoost . X *= 1.2f ;
500516 if ( aim . Y == Math . Sign ( earlyExitBoost . Y ) ) earlyExitBoost . Y *= 1.2f ;
@@ -516,9 +532,11 @@ public static IEnumerator PurpleDashingCoroutine(Player player)
516532 player . StateMachine . State = Player . StNormal ;
517533 yield break ;
518534 }
519- GravityHelperInterop . BeginOverride ( ) ;
535+
536+ var legacyGravityHelper = VortexHelperModule . SessionProperties . BoosterLegacyGravityHelper ;
537+ if ( ! legacyGravityHelper ) GravityHelperInterop . BeginOverride ( ) ;
520538 player . MoveToX ( vec . X ) ; player . MoveToY ( vec . Y ) ;
521- GravityHelperInterop . EndOverride ( ) ;
539+ if ( ! legacyGravityHelper ) GravityHelperInterop . EndOverride ( ) ;
522540 yield return null ;
523541 }
524542
@@ -529,10 +547,12 @@ public static IEnumerator PurpleDashingCoroutine(Player player)
529547 public static void PurpleDashingEnd ( Player player )
530548 {
531549 VortexHelperModule . SessionProperties . BoosterQoL = false ;
550+ VortexHelperModule . SessionProperties . BoosterLegacyGravityHelper = false ;
532551 }
533552 public static void PurpleBoosterExplodeLaunch ( Player player , Vector2 from , Vector2 ? origin , float factor = 1f )
534553 {
535554 bool QoL = VortexHelperModule . SessionProperties . BoosterQoL ;
555+ bool legacyGravityHelper = VortexHelperModule . SessionProperties . BoosterLegacyGravityHelper ;
536556 Input . Rumble ( RumbleStrength . Strong , RumbleLength . Medium ) ;
537557 Celeste . Freeze ( QoL ? 0.05f : 0.1f ) ;
538558 player . launchApproachX = null ;
@@ -544,7 +564,7 @@ public static void PurpleBoosterExplodeLaunch(Player player, Vector2 from, Vecto
544564 level . Shake ( 0.15f ) ;
545565
546566 Vector2 vector = ( player . Center - from ) . SafeNormalize ( - Vector2 . UnitY ) ;
547- vector = GravityHelperInterop . InvertIfRequired ( vector ) ;
567+ if ( ! legacyGravityHelper ) vector = GravityHelperInterop . InvertIfRequired ( vector ) ;
548568
549569 if ( Math . Abs ( vector . X ) < 1f && Math . Abs ( vector . Y ) < 1f )
550570 vector *= 1.1f ;
0 commit comments