From d6acee5a66092f745224d0e4d0fd87e48c9b67c5 Mon Sep 17 00:00:00 2001 From: Noah Petherbridge Date: Thu, 7 Oct 2021 18:49:09 -0700 Subject: [PATCH] Adjust Gravity and Prevent Moonwalking * Tweak max gravity speed to match player max velocity. * Boy's script watches for his velocity to flip suddenly and stops animations, limiting the moonwalking a bit. * JS API: Self.GetVelocity() added. --- dev-assets/doodads/boy/boy.js | 12 ++++++++++-- pkg/balance/numbers.go | 2 +- pkg/play_scene_touch.go | 3 ++- pkg/uix/scripting.go | 1 + 4 files changed, 14 insertions(+), 4 deletions(-) diff --git a/dev-assets/doodads/boy/boy.js b/dev-assets/doodads/boy/boy.js index 02f877b..8c9f532 100644 --- a/dev-assets/doodads/boy/boy.js +++ b/dev-assets/doodads/boy/boy.js @@ -1,11 +1,9 @@ function main() { var playerSpeed = 12; - var gravity = 4; var Vx = Vy = 0; var animating = false; var animStart = animEnd = 0; - var animFrame = animStart; Self.SetMobile(true); Self.SetInventory(true); @@ -14,10 +12,20 @@ function main() { Self.AddAnimation("walk-left", 200, ["stand-left", "walk-left-1", "walk-left-2", "walk-left-3", "walk-left-2", "walk-left-1"]); Self.AddAnimation("walk-right", 200, ["stand-right", "walk-right-1", "walk-right-2", "walk-right-3", "walk-right-2", "walk-right-1"]); + // If the player suddenly changes direction, reset the animation state to quickly switch over. + var lastVelocity = Vector(0, 0); + Events.OnKeypress(function (ev) { Vx = 0; Vy = 0; + var curVelocity = Self.GetVelocity(); + if ((lastVelocity.X < 0 && curVelocity.X > 0) || + (lastVelocity.X > 0 && curVelocity.X < 0)) { + Self.StopAnimation(); + } + lastVelocity = curVelocity; + if (ev.Right) { if (!Self.IsAnimating()) { Self.PlayAnimation("walk-right", null); diff --git a/pkg/balance/numbers.go b/pkg/balance/numbers.go index b63abbe..6e0aa83 100644 --- a/pkg/balance/numbers.go +++ b/pkg/balance/numbers.go @@ -26,7 +26,7 @@ var ( PlayerMaxVelocity float64 = 7 PlayerJumpVelocity float64 = -20 PlayerAcceleration float64 = 0.12 - Gravity float64 = 6 + Gravity float64 = 7 GravityAcceleration float64 = 0.1 SlopeMaxHeight = 8 // max pixel height for player to walk up a slope diff --git a/pkg/play_scene_touch.go b/pkg/play_scene_touch.go index c9cf933..93a5248 100644 --- a/pkg/play_scene_touch.go +++ b/pkg/play_scene_touch.go @@ -31,7 +31,8 @@ func (s *PlayScene) LoopTouchable(ev *event.State) { // Idle means that they are not holding any directional or otherwise input key. // Keyboard inputs and touch events from this function will set these keys. // See if it stays unset long enough to consider idle. - if !ev.Up && !ev.Down && !ev.Right && !ev.Left && !ev.Space { + var isGrounded = (s.Player.HasGravity() && s.Player.Grounded()) || !s.Player.HasGravity() + if !ev.Up && !ev.Down && !ev.Right && !ev.Left && !ev.Space && isGrounded { if s.idleLastStart.IsZero() { s.idleLastStart = time.Now() } else if time.Since(s.idleLastStart) > balance.PlayModeIdleTimeout { diff --git a/pkg/uix/scripting.go b/pkg/uix/scripting.go index 3ca4daf..b093d56 100644 --- a/pkg/uix/scripting.go +++ b/pkg/uix/scripting.go @@ -26,6 +26,7 @@ func (w *Canvas) MakeSelfAPI(actor *Actor) map[string]interface{} { "SetHitbox": actor.SetHitbox, "Hitbox": actor.Hitbox, "SetVelocity": actor.SetVelocity, + "GetVelocity": actor.Velocity, "SetMobile": actor.SetMobile, "SetInventory": actor.SetInventory, "HasInventory": actor.HasInventory,