From 5163f32f468871f519569776fbbc23c82a2f158a Mon Sep 17 00:00:00 2001 From: Daniel-Cortez Date: Sat, 24 Jan 2026 21:03:52 +0700 Subject: [PATCH 1/7] Revise changes made in 86cd79cb4724d2f64c601cf6fd58cff609435be4 --- Scripts/Gimmicks/WindCurrent.gd | 2 +- Scripts/Player/Player.gd | 7 ++++--- Scripts/Player/States/Air.gd | 2 +- Scripts/Player/States/AmyHammerSwing.gd | 2 +- Scripts/Player/States/Fly.gd | 2 +- Scripts/Player/States/Glide.gd | 15 +++++++-------- Scripts/Player/States/Normal.gd | 2 +- Scripts/Player/States/Respawn.gd | 3 ++- Scripts/Player/States/WallClimb.gd | 7 ++++--- 9 files changed, 22 insertions(+), 20 deletions(-) diff --git a/Scripts/Gimmicks/WindCurrent.gd b/Scripts/Gimmicks/WindCurrent.gd index 821eb122..3a3f85fc 100644 --- a/Scripts/Gimmicks/WindCurrent.gd +++ b/Scripts/Gimmicks/WindCurrent.gd @@ -76,7 +76,7 @@ func _physics_process(_delta: float) -> void: player.push_vertical() # force player direction - player.set_direction(PlayerChar.DIRECTIONS.RIGHT if current_vector.x > 0.0 else PlayerChar.DIRECTIONS.LEFT) + player.set_direction_signed(current_vector.x) # force slide state if the player isn't currently on a gimmick if player.get_state() != PlayerChar.STATES.GIMMICK and \ diff --git a/Scripts/Player/Player.gd b/Scripts/Player/Player.gd index d3898e46..b3dd446a 100644 --- a/Scripts/Player/Player.gd +++ b/Scripts/Player/Player.gd @@ -1464,9 +1464,10 @@ func set_direction(new_direction: PlayerChar.DIRECTIONS) -> void: ## [param change_sprite_direction] - if [code]false[/code], only the movement direction ## is changed, and the sprite direction ([code]sprite.flip_h[/code]) is kept the same. func set_direction_signed(new_direction: float, change_sprite_direction: bool = true) -> void: - _direction = signf(new_direction) - if change_sprite_direction: - sprite.flip_h = (_direction < 0.0) + if new_direction != 0.0: + _direction = signf(new_direction) + if change_sprite_direction: + sprite.flip_h = (_direction < 0.0) ## Flips player's movement direction.[br] diff --git a/Scripts/Player/States/Air.gd b/Scripts/Player/States/Air.gd index 0f5f6451..8f54bc4d 100644 --- a/Scripts/Player/States/Air.gd +++ b/Scripts/Player/States/Air.gd @@ -53,7 +53,7 @@ func state_physics_process(delta: float) -> void: # Change parent direction # Check that lock direction isn't on - if !lockDir and parent.inputs[parent.INPUTS.XINPUT] != 0: + if !lockDir: parent.set_direction_signed(parent.inputs[parent.INPUTS.XINPUT]) # Gravity diff --git a/Scripts/Player/States/AmyHammerSwing.gd b/Scripts/Player/States/AmyHammerSwing.gd index f421bc33..cc2c90ae 100644 --- a/Scripts/Player/States/AmyHammerSwing.gd +++ b/Scripts/Player/States/AmyHammerSwing.gd @@ -23,7 +23,7 @@ func state_physics_process(delta: float) -> void: if parent.inputs[parent.INPUTS.XINPUT] != 0: parent.set_direction_signed(parent.inputs[parent.INPUTS.XINPUT]) elif parent.movement.x != 0: - parent.set_direction_signed(signf(parent.movement.x)) + parent.set_direction_signed(parent.movement.x) # set to max speed based on direction parent.movement.x = parent.top*parent.get_direction_multiplier() diff --git a/Scripts/Player/States/Fly.gd b/Scripts/Player/States/Fly.gd index 49658c42..bee7058f 100644 --- a/Scripts/Player/States/Fly.gd +++ b/Scripts/Player/States/Fly.gd @@ -84,7 +84,7 @@ func state_physics_process(delta: float) -> void: carriedPlayer.movement = parent.movement carriedPlayer.get_state_object(parent.STATES.AIR).lockDir = true # set carried player direction - carriedPlayer.set_direction_signed(parent.get_direction_multiplier(),false) + carriedPlayer.set_direction_signed(parent.get_direction_multiplier()) # set immediate inputs if ai if parent.playerControl == 0: diff --git a/Scripts/Player/States/Glide.gd b/Scripts/Player/States/Glide.gd index 77200143..7a1985e2 100644 --- a/Scripts/Player/States/Glide.gd +++ b/Scripts/Player/States/Glide.gd @@ -93,15 +93,16 @@ func state_physics_process(delta: float) -> void: # check if not falling, if not then do glide routine if !is_fall and !sliding: # Turning + var direction: float = parent.get_direction_multiplier() # left - if parent.get_direction_multiplier() > 0.0: + if direction > 0.0: if turnTimer >= 180: speedPreservation = abs(parent.movement.x) if turnTimer > 0: turnTimer -= 2.8125*delta*60 parent.movement.x = speedPreservation*cos(deg_to_rad(turnTimer)) # right - elif parent.get_direction_multiplier() < 0.0: + elif direction < 0.0: if turnTimer <= 0: speedPreservation = abs(parent.movement.x) if turnTimer < 180: @@ -132,7 +133,7 @@ func state_physics_process(delta: float) -> void: # Go into sliding if on ground if parent.ground and !sliding and groundBuffer >= 1: animator.play("glideSlide") - parent.set_direction_signed(signf(parent.movement.x)) + parent.set_direction_signed(parent.movement.x) sliding = true parent.reflective = false $"../../SkidDustTimer".start(0.1) @@ -167,10 +168,8 @@ func state_physics_process(delta: float) -> void: # failure to climb up walls. # # This modification will be revisited later. - if (parent.movement.x != 0.0): - parent.set_direction_signed(signf(parent.movement.x)) - else: - parent.set_direction(parent.get_direction()) + parent.set_direction_signed(parent.movement.x) + parent.sprite.flip_h = (parent.get_direction_multiplier() < 0.0) parent.set_character_action_state(KnucklesAvatar.CHAR_STATES.KNUCKLES_CLIMB, parent.get_predefined_hitbox(PlayerChar.HITBOXES.GLIDE), @@ -190,7 +189,7 @@ func state_physics_process(delta: float) -> void: # if sliding then do sliding routine elif sliding: - parent.set_direction_signed(signf(parent.movement.x)) + parent.set_direction_signed(parent.movement.x) parent.movement.x = move_toward(parent.movement.x,0,friction/GlobalFunctions.div_by_delta(delta)) # set direction diff --git a/Scripts/Player/States/Normal.gd b/Scripts/Player/States/Normal.gd index c7849ad8..954aa481 100644 --- a/Scripts/Player/States/Normal.gd +++ b/Scripts/Player/States/Normal.gd @@ -186,7 +186,7 @@ func state_process(delta: float) -> void: if parent.inputs[parent.INPUTS.XINPUT] != 0 and !skid: parent.set_direction_signed(parent.inputs[parent.INPUTS.XINPUT], false) elif parent.movement.x != 0 and skid: - parent.set_direction_signed(signf(parent.movement.x), false) + parent.set_direction_signed(parent.movement.x, false) # water running parent.action_water_run_handle() diff --git a/Scripts/Player/States/Respawn.gd b/Scripts/Player/States/Respawn.gd index d86b7c92..5c5854b6 100644 --- a/Scripts/Player/States/Respawn.gd +++ b/Scripts/Player/States/Respawn.gd @@ -73,7 +73,8 @@ func state_physics_process(delta: float) -> void: if abs(distance)/16 > abs(parent.movement.x/60): parent.movement.x = (distance/16)*60 - parent.set_direction_signed(signf(distance)) + parent.set_direction_signed(distance, false) + parent.sprite.flip_h = (parent.get_direction_multiplier() < 0.0) else: # Go back to normal # restore layer parent.collision_layer = layerMemory diff --git a/Scripts/Player/States/WallClimb.gd b/Scripts/Player/States/WallClimb.gd index 2de73ac7..8a310a0d 100644 --- a/Scripts/Player/States/WallClimb.gd +++ b/Scripts/Player/States/WallClimb.gd @@ -30,14 +30,15 @@ func state_process(_delta: float) -> void: func state_physics_process(delta: float) -> void: # do climb logic if climbUp is false var animator: PlayerCharAnimationPlayer = parent.get_avatar().get_animator() + var camera: PlayerCamera = parent.get_camera() if !climbUp: # climbing parent.movement.y = (parent.inputs[parent.INPUTS.YINPUT]+int(parent.isSuper)*sign(parent.inputs[parent.INPUTS.YINPUT]))*60 #Prevent player from leaving play area via climbing. parent.global_position.y = clampf(parent.global_position.y, - parent.get_camera().target_limit_top+16, - parent.get_camera().target_limit_bottom) + camera.target_limit_top+16.0, + camera.target_limit_bottom) # check vertically (sometimes clinging can cause clipping) if parent.movement.y == 0: @@ -87,7 +88,7 @@ func state_physics_process(delta: float) -> void: else: # climb up # give camera time to follow so it doesn't snap - parent.get_camera().drag_lerp = 1.0 + camera.drag_lerp = 1.0 climbTimer += delta # stop current animations and play climb up animator.stop() From 357e83ef6e36418c0b8d7cad0f2b57565a653d9f Mon Sep 17 00:00:00 2001 From: Daniel-Cortez Date: Sat, 24 Jan 2026 21:31:13 +0700 Subject: [PATCH 2/7] AmyHammerSwing.gd: Fix undefined variable `top` --- Scripts/Player/States/AmyHammerSwing.gd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Scripts/Player/States/AmyHammerSwing.gd b/Scripts/Player/States/AmyHammerSwing.gd index cc2c90ae..424c3675 100644 --- a/Scripts/Player/States/AmyHammerSwing.gd +++ b/Scripts/Player/States/AmyHammerSwing.gd @@ -26,7 +26,7 @@ func state_physics_process(delta: float) -> void: parent.set_direction_signed(parent.movement.x) # set to max speed based on direction - parent.movement.x = parent.top*parent.get_direction_multiplier() + parent.movement.x = parent.get_physics().top_speed*parent.get_direction_multiplier() # decrease hammer time if hammerTime > 0: From 3b057fc0e68155e52a6a3479906e3889b4e5b40d Mon Sep 17 00:00:00 2001 From: Daniel-Cortez Date: Sat, 24 Jan 2026 21:35:52 +0700 Subject: [PATCH 3/7] AmyAvatar.gd: Use `set_deferred()` to disable Amy's hammer swing hitbox --- Scripts/Player/PlayerAvatars/AmyAvatar.gd | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/Scripts/Player/PlayerAvatars/AmyAvatar.gd b/Scripts/Player/PlayerAvatars/AmyAvatar.gd index 648f2fb7..80bdb6bf 100644 --- a/Scripts/Player/PlayerAvatars/AmyAvatar.gd +++ b/Scripts/Player/PlayerAvatars/AmyAvatar.gd @@ -41,9 +41,8 @@ func amy_jump_hammer_callback(_state: PlayerState, player: PlayerChar, _delta: f # set ability used to true to prevent multiple uses player.abilityUsed = true # enable insta shield hitbox if hammer drop dashing - player.shieldSprite.get_node("InstaShieldHitbox/HitBox").disabled = ( - get_animator().current_animation == "dropDash" - ) + player.shieldSprite.get_node(^"InstaShieldHitbox/HitBox").set_deferred( + &"disabled", (get_animator().current_animation == "dropDash")) # play hammer sound player.sfx[30].play() # play dropDash sound @@ -90,7 +89,7 @@ func amy_exit_jump_dropdash_callback(_exit_state: PlayerState, ): # Need to disable instashield hitbox on state exit regardless of other factors - player.shieldSprite.get_node("InstaShieldHitbox/HitBox").disabled = true + player.shieldSprite.get_node(^"InstaShieldHitbox/HitBox").set_deferred(&"disabled", true) # If we haven't been charging the drop dash long enough, we bail here. if drop_timer <= 1: From 4ecc8a6c13e1abaa17f957ddf878b499d59058ee Mon Sep 17 00:00:00 2001 From: Daniel-Cortez Date: Sat, 24 Jan 2026 22:05:17 +0700 Subject: [PATCH 4/7] WaterBar.gd: Fix typo (`player.avatar` => `avatar`) --- Scripts/Gimmicks/WaterBar.gd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Scripts/Gimmicks/WaterBar.gd b/Scripts/Gimmicks/WaterBar.gd index 3e4cc3a4..59ee79d5 100644 --- a/Scripts/Gimmicks/WaterBar.gd +++ b/Scripts/Gimmicks/WaterBar.gd @@ -97,7 +97,7 @@ func _process(delta): var horizontal_hitbox: Vector2 = player.get_predefined_hitbox(PlayerChar.HITBOXES.HORIZONTAL) player.set_hitbox(horizontal_hitbox) player.set_state(PlayerChar.STATES.GIMMICK, horizontal_hitbox) - player.avatar.get_animator().play(&"clingVerticalBar") + avatar.get_animator().play(&"clingVerticalBar") player.set_movement(Vector2(0.0, 0.0)) From 32f9f20c65bfb7d2e772e742f8c014743f63ed76 Mon Sep 17 00:00:00 2001 From: Daniel-Cortez Date: Thu, 29 Jan 2026 18:53:31 +0700 Subject: [PATCH 5/7] Score.gd: Use more simple and easier to read constructors for rects --- Scripts/Misc/Score.gd | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/Scripts/Misc/Score.gd b/Scripts/Misc/Score.gd index 56605339..99efdacf 100644 --- a/Scripts/Misc/Score.gd +++ b/Scripts/Misc/Score.gd @@ -2,18 +2,12 @@ class_name Score extends Node2D const SCORE: Array[int] = [10,100,200,500,1000,10000] const RECTS: Array[Rect2] = [ -# 10 - Rect2(Vector2(0, 0), Vector2(10, 8)), -# 100 - Rect2(Vector2(0, 0), Vector2(15, 8)), -# 200 - Rect2(Vector2(0, 8), Vector2(15, 8)), -# 500 - Rect2(Vector2(0, 18), Vector2(15, 8)), -# 1000 - Rect2(Vector2(0, 0), Vector2(20, 8)), -# 10000 - Rect2(Vector2(0, 0), Vector2(25, 8)) + Rect2(0.0, 0.0, 10.0, 8.0), # 10 + Rect2(0.0, 0.0, 15.0, 8.0), # 100 + Rect2(0.0, 8.0, 15.0, 8.0), # 200 + Rect2(0.0, 18.0, 15.0, 8.0), # 500 + Rect2(0.0, 0.0, 20.0, 8.0), # 1000 + Rect2(0.0, 0.0, 25.0, 8.0) # 10000 ] var score_id: int = 0 From 02c60e54f792177831981bd2861f97f23a841ef5 Mon Sep 17 00:00:00 2001 From: Daniel-Cortez Date: Fri, 30 Jan 2026 20:22:56 +0700 Subject: [PATCH 6/7] Global.gd: Use a formula to initialize `EMERALDS.ALL`, instead of a hardcoded constant. This also eliminates the need for having a safety (sanity?) check at initialization of variable `emeralds`, which was performed at run time. --- Scripts/Global/Global.gd | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/Scripts/Global/Global.gd b/Scripts/Global/Global.gd index c862baa5..d92929f3 100644 --- a/Scripts/Global/Global.gd +++ b/Scripts/Global/Global.gd @@ -73,14 +73,11 @@ enum EMERALDS { CYAN = 1 << 4, SILVER = 1 << 5, PURPLE = 1 << 6, - ALL = (1 << 7) - 1 + _END, + ALL = ((_END - 1) << 1) - 1 } # emeralds use bitwise flag operations, the equivalent for 7 emeralds would be 127 -var emeralds: int = (func() -> int: - # make sure EMERALDS.ALL holds a correct value - assert(EMERALDS.ALL == (1 << EMERALDS.size() - 1) - 1) - return 0 -).call() +var emeralds: int = 0 var specialStageID = 0 var level = null # reference to the currently active level var levelTime = 0 # the timer that counts down while the level isn't completed or in a special ring From 0de528f8a9d55031426372161b9fb0cd626eb49f Mon Sep 17 00:00:00 2001 From: Daniel-Cortez Date: Wed, 18 Mar 2026 23:47:50 +0700 Subject: [PATCH 7/7] Fix Base Zone Act 2's parent object being accidentally moved by (-1, -1) in the recent Catapult patch --- Scene/Zones/BaseZoneAct2.tscn | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/Scene/Zones/BaseZoneAct2.tscn b/Scene/Zones/BaseZoneAct2.tscn index 103613cc..5307b1c8 100644 --- a/Scene/Zones/BaseZoneAct2.tscn +++ b/Scene/Zones/BaseZoneAct2.tscn @@ -21,7 +21,7 @@ [ext_resource type="PackedScene" uid="uid://cioq5saowvqxj" path="res://Entities/MainObjects/Player.tscn" id="18"] [ext_resource type="Script" path="res://Scripts/Objects/CollapseLayer.gd" id="21_fdxp4"] [ext_resource type="PackedScene" uid="uid://urapmknlu0s5" path="res://Entities/Gimmicks/HorizontalBar.tscn" id="22_ethvu"] -[ext_resource type="PackedScene" uid="uid://blfw540cqicg3" path="res://Entities/Gimmicks/CatapultDEZ.tscn" id="23_6d3ti"] +[ext_resource type="PackedScene" path="res://Entities/Gimmicks/CatapultDEZ.tscn" id="23_6d3ti"] [ext_resource type="PackedScene" uid="uid://4q0hpddgto2k" path="res://Entities/Gimmicks/Spring.tscn" id="23_n1r7l"] [ext_resource type="PackedScene" uid="uid://ctg1aeiewvyvj" path="res://Entities/Gimmicks/ForceRoll.tscn" id="23_nxyu5"] [ext_resource type="Texture2D" uid="uid://b4cw5q2u4jyb8" path="res://Graphics/Gimmicks/HorizontalBarAlt.png" id="24_ipqgj"] @@ -38,12 +38,12 @@ [ext_resource type="PackedScene" uid="uid://xpsg8eoppqbo" path="res://Entities/Gimmicks/MonkeyBar/Hook.tscn" id="33_ix8uv"] [ext_resource type="PackedScene" uid="uid://c2esop5orct10" path="res://Entities/MainObjects/GoalPost.tscn" id="34"] [ext_resource type="PackedScene" uid="uid://chyrwm1qwvlyt" path="res://Entities/Gimmicks/Switch.tscn" id="36_bann4"] -[ext_resource type="PackedScene" uid="uid://cbix8ljuynffp" path="res://Entities/Gimmicks/CatapultWFZ.tscn" id="37_rbgxl"] +[ext_resource type="PackedScene" path="res://Entities/Gimmicks/CatapultWFZ.tscn" id="37_rbgxl"] [ext_resource type="PackedScene" uid="uid://dasp221fqgrno" path="res://Entities/Obstacles/Platform.tscn" id="38"] [ext_resource type="PackedScene" uid="uid://cfteqnft5ynr7" path="res://Entities/Hazards/Spikes.tscn" id="39_13rhf"] [ext_resource type="PackedScene" uid="uid://c1n8wnllp8pk2" path="res://Entities/Items/SpecialStageRing.tscn" id="40_mjl70"] [ext_resource type="PackedScene" path="res://Entities/Backgrounds/GHZWaterfall.tscn" id="41_mosa4"] -[ext_resource type="PackedScene" uid="uid://dneumyovipdy3" path="res://Entities/Gimmicks/CatapultFBZ.tscn" id="41_w8bgu"] +[ext_resource type="PackedScene" path="res://Entities/Gimmicks/CatapultFBZ.tscn" id="41_w8bgu"] [sub_resource type="Animation" id="1"] resource_name = "Glow" @@ -98,7 +98,6 @@ point_count = 4 size = Vector2(128, 24) [node name="BaseZoneAct2" type="Node2D"] -position = Vector2(1, -1) script = ExtResource("2") nextZone = "res://Scene/Zones/emerald_hill_zone.tscn" animal1 = 2 @@ -1183,11 +1182,11 @@ position = Vector2(-134, 546) [connection signal="pressed" from="HookSliderAssembly/MiddleSwitch" to="HookSliderAssembly/HookSlider" method="send_to_target" binds= [0]] [connection signal="pressed" from="HookSliderAssembly/MiddleSwitch" to="HookSliderAssembly/HookSlider/MobileHook/RetractibleChain" method="send_to_height" binds= [120]] [connection signal="target_reached" from="HookSliderAssembly/HookSlider/MobileHook/RetractibleChain" to="HookSliderAssembly/HookSlider" method="send_to_target" binds= [615]] -[connection signal="pressed" from="Switch" to="ChainedMonkeyBar/RetractibleChain" method="set_default_target" binds= [170]] [connection signal="pressed" from="Switch" to="ChainedMonkeyBar/RetractibleChain" method="send_to_height" binds= [609]] +[connection signal="pressed" from="Switch" to="ChainedMonkeyBar/RetractibleChain" method="set_default_target" binds= [170]] [connection signal="pressed" from="Switch2" to="ChainedMonkeyBar/RetractibleChain" method="set_home_height" binds= [170]] -[connection signal="pressed" from="Switch2" to="ChainedMonkeyBar/RetractibleChain" method="set_default_target" binds= [0]] [connection signal="pressed" from="Switch2" to="ChainedMonkeyBar/RetractibleChain" method="send_to_height" binds= [170]] +[connection signal="pressed" from="Switch2" to="ChainedMonkeyBar/RetractibleChain" method="set_default_target" binds= [0]] [editable path="ChainedMonkeyBar2"] [editable path="ChainedMonkeyBar3"]