Merge pull request #356 from Falkimore/physics

Add new physics parameters to Player.gd, give descriptions to old ones
This commit is contained in:
Joe H
2025-09-23 22:03:09 +01:00
committed by GitHub
7 changed files with 158 additions and 90 deletions

View File

@@ -1,23 +1,38 @@
{ {
"name": "CHAR_LUIGI", "name": "CHAR_LUIGI",
"physics": { "physics": {
"AIR_ACCEL": 3.0,
"AIR_SKID": 1.5,
"DECEL": 3.0,
"FALL_GRAVITY": 25.0,
"GROUND_RUN_ACCEL": 1.25,
"GROUND_WALK_ACCEL": 4.0,
"JUMP_GRAVITY": 11.0, "JUMP_GRAVITY": 11.0,
"JUMP_HEIGHT": 300.0, "JUMP_HEIGHT": 300.0,
"JUMP_INCR": 8.0, "JUMP_INCR": 8.0,
"SWIM_GRAVITY": 2.5, "JUMP_CANCEL_DIVIDE": 1.5,
"SWIM_SPEED": 95.0, "JUMP_HOLD_SPEED_THRESHOLD": 0.0,
"MAX_FALL_SPEED": 280,
"MAX_SWIM_FALL_SPEED": 200, "BOUNCE_HEIGHT": 200.0,
"RUN_SKID": 8.0, "BOUNCE_JUMP_HEIGHT": 300.0,
"RUN_SPEED": 160,
"FALL_GRAVITY": 25.0,
"MAX_FALL_SPEED": 280.0,
"CEILING_BUMP_SPEED": 45.0,
"WALK_SPEED": 96.0,
"GROUND_WALK_ACCEL": 4.0,
"WALK_SKID": 8.0, "WALK_SKID": 8.0,
"WALK_SPEED": 90.0
"RUN_SPEED": 160.0,
"GROUND_RUN_ACCEL": 1.25,
"RUN_SKID": 8.0,
"DECEL": 3.0,
"AIR_ACCEL": 3.0,
"AIR_SKID": 1.5,
"SWIM_SPEED": 95.0,
"SWIM_GROUND_SPEED": 45.0,
"SWIM_HEIGHT": 100.0,
"SWIM_GRAVITY": 2.5,
"MAX_SWIM_FALL_SPEED": 200.0,
"DEATH_JUMP_HEIGHT": 300.0
}, },
"small_hitbox_scale": [1.0, 1.0], "small_hitbox_scale": [1.0, 1.0],
"big_hitbox_scale": [1.0, 1.0] "big_hitbox_scale": [1.0, 1.0]

View File

@@ -1,23 +1,38 @@
{ {
"name": "CHAR_MARIO", "name": "CHAR_MARIO",
"physics": { "physics": {
"AIR_ACCEL": 3.0,
"AIR_SKID": 1.5,
"DECEL": 3.0,
"FALL_GRAVITY": 25.0,
"GROUND_RUN_ACCEL": 1.25,
"GROUND_WALK_ACCEL": 4.0,
"JUMP_GRAVITY": 11.0, "JUMP_GRAVITY": 11.0,
"JUMP_HEIGHT": 300.0, "JUMP_HEIGHT": 300.0,
"JUMP_INCR": 8.0, "JUMP_INCR": 8.0,
"SWIM_GRAVITY": 2.5, "JUMP_CANCEL_DIVIDE": 1.5,
"SWIM_SPEED": 95.0, "JUMP_HOLD_SPEED_THRESHOLD": 0.0,
"MAX_FALL_SPEED": 280,
"MAX_SWIM_FALL_SPEED": 200, "BOUNCE_HEIGHT": 200.0,
"RUN_SKID": 8.0, "BOUNCE_JUMP_HEIGHT": 300.0,
"RUN_SPEED": 160,
"FALL_GRAVITY": 25.0,
"MAX_FALL_SPEED": 280.0,
"CEILING_BUMP_SPEED": 45.0,
"WALK_SPEED": 96.0,
"GROUND_WALK_ACCEL": 4.0,
"WALK_SKID": 8.0, "WALK_SKID": 8.0,
"WALK_SPEED": 90.0
"RUN_SPEED": 160.0,
"GROUND_RUN_ACCEL": 1.25,
"RUN_SKID": 8.0,
"DECEL": 3.0,
"AIR_ACCEL": 3.0,
"AIR_SKID": 1.5,
"SWIM_SPEED": 95.0,
"SWIM_GROUND_SPEED": 45.0,
"SWIM_HEIGHT": 100.0,
"SWIM_GRAVITY": 2.5,
"MAX_SWIM_FALL_SPEED": 200.0,
"DEATH_JUMP_HEIGHT": 300.0
}, },
"small_hitbox_scale": [1.0, 1.0], "small_hitbox_scale": [1.0, 1.0],
"big_hitbox_scale": [1.0, 1.0] "big_hitbox_scale": [1.0, 1.0]

View File

@@ -1,23 +1,38 @@
{ {
"name": "CHAR_TOAD", "name": "CHAR_TOAD",
"physics": { "physics": {
"AIR_ACCEL": 3.0,
"AIR_SKID": 1.5,
"DECEL": 3.0,
"FALL_GRAVITY": 25.0,
"GROUND_RUN_ACCEL": 1.25,
"GROUND_WALK_ACCEL": 4.0,
"JUMP_GRAVITY": 11.0, "JUMP_GRAVITY": 11.0,
"JUMP_HEIGHT": 300.0, "JUMP_HEIGHT": 300.0,
"JUMP_INCR": 8.0, "JUMP_INCR": 8.0,
"SWIM_GRAVITY": 2.5, "JUMP_CANCEL_DIVIDE": 1.5,
"SWIM_SPEED": 95.0, "JUMP_HOLD_SPEED_THRESHOLD": 0.0,
"MAX_FALL_SPEED": 280,
"MAX_SWIM_FALL_SPEED": 200, "BOUNCE_HEIGHT": 200.0,
"RUN_SKID": 8.0, "BOUNCE_JUMP_HEIGHT": 300.0,
"RUN_SPEED": 160,
"FALL_GRAVITY": 25.0,
"MAX_FALL_SPEED": 280.0,
"CEILING_BUMP_SPEED": 45.0,
"WALK_SPEED": 96.0,
"GROUND_WALK_ACCEL": 4.0,
"WALK_SKID": 8.0, "WALK_SKID": 8.0,
"WALK_SPEED": 90.0
"RUN_SPEED": 160.0,
"GROUND_RUN_ACCEL": 1.25,
"RUN_SKID": 8.0,
"DECEL": 3.0,
"AIR_ACCEL": 3.0,
"AIR_SKID": 1.5,
"SWIM_SPEED": 95.0,
"SWIM_GROUND_SPEED": 45.0,
"SWIM_HEIGHT": 100.0,
"SWIM_GRAVITY": 2.5,
"MAX_SWIM_FALL_SPEED": 200.0,
"DEATH_JUMP_HEIGHT": 300.0
}, },
"small_hitbox_scale": [1.0, 1.0], "small_hitbox_scale": [1.0, 1.0],
"big_hitbox_scale": [1.0, 1.0] "big_hitbox_scale": [1.0, 1.0]

View File

@@ -1,23 +1,38 @@
{ {
"name": "CHAR_TOADETTE", "name": "CHAR_TOADETTE",
"physics": { "physics": {
"AIR_ACCEL": 3.0,
"AIR_SKID": 1.5,
"DECEL": 3.0,
"FALL_GRAVITY": 25.0,
"GROUND_RUN_ACCEL": 1.25,
"GROUND_WALK_ACCEL": 4.0,
"JUMP_GRAVITY": 11.0, "JUMP_GRAVITY": 11.0,
"JUMP_HEIGHT": 300.0, "JUMP_HEIGHT": 300.0,
"JUMP_INCR": 8.0, "JUMP_INCR": 8.0,
"SWIM_GRAVITY": 2.5, "JUMP_CANCEL_DIVIDE": 1.5,
"SWIM_SPEED": 95.0, "JUMP_HOLD_SPEED_THRESHOLD": 0.0,
"MAX_FALL_SPEED": 280,
"MAX_SWIM_FALL_SPEED": 200, "BOUNCE_HEIGHT": 200.0,
"RUN_SKID": 8.0, "BOUNCE_JUMP_HEIGHT": 300.0,
"RUN_SPEED": 160,
"FALL_GRAVITY": 25.0,
"MAX_FALL_SPEED": 280.0,
"CEILING_BUMP_SPEED": 45.0,
"WALK_SPEED": 96.0,
"GROUND_WALK_ACCEL": 4.0,
"WALK_SKID": 8.0, "WALK_SKID": 8.0,
"WALK_SPEED": 90.0
"RUN_SPEED": 160.0,
"GROUND_RUN_ACCEL": 1.25,
"RUN_SKID": 8.0,
"DECEL": 3.0,
"AIR_ACCEL": 3.0,
"AIR_SKID": 1.5,
"SWIM_SPEED": 95.0,
"SWIM_GROUND_SPEED": 45.0,
"SWIM_HEIGHT": 100.0,
"SWIM_GRAVITY": 2.5,
"MAX_SWIM_FALL_SPEED": 200.0,
"DEATH_JUMP_HEIGHT": 300.0
}, },
"small_hitbox_scale": [1.0, 1.0], "small_hitbox_scale": [1.0, 1.0],
"big_hitbox_scale": [1.0, 1.0] "big_hitbox_scale": [1.0, 1.0]

View File

@@ -1,24 +1,41 @@
class_name Player class_name Player
extends CharacterBody2D extends CharacterBody2D
var AIR_ACCEL := 3.0 #region Physics properies, these can be changed within a custom character's CharacterInfo.json
var AIR_SKID := 1.5 var JUMP_GRAVITY := 11.0 # The player's gravity while jumping, measured in px/frame
var DECEL := 3.0 var JUMP_HEIGHT := 300.0 # The strength of the player's jump, measured in px/sec
var FALL_GRAVITY := 25.0 var JUMP_INCR := 8.0 # How much the player's X velocity affects their jump speed
var GROUND_RUN_ACCEL := 1.25 var JUMP_CANCEL_DIVIDE := 1.5 # When the player cancels their jump, their Y velocity gets divided by this value
var GROUND_WALK_ACCEL := 4.0 var JUMP_HOLD_SPEED_THRESHOLD := 0.0 # When the player's Y velocity goes past this value while jumping, their gravity switches to FALL_GRAVITY
var JUMP_GRAVITY := 11.0
var JUMP_HEIGHT := 300.0 var BOUNCE_HEIGHT := 200.0 # The strength at which the player bounces off enemies, measured in px/sec
var JUMP_INCR := 8.0 var BOUNCE_JUMP_HEIGHT := 300.0 # The strength at which the player bounces off enemies while holding jump, measured in px/sec
var SWIM_GRAVITY := 2.5
var SWIM_SPEED := 95.0 var FALL_GRAVITY := 25.0 # The player's gravity while falling, measured in px/frame
var MAX_FALL_SPEED := 280 var MAX_FALL_SPEED := 280.0 # The player's maximum fall speed, measured in px/sec
var MAX_SWIM_FALL_SPEED := 200 var CEILING_BUMP_SPEED := 45.0 # The speed at which the player falls after hitting a ceiling, measured in px/sec
var RUN_SKID := 8.0
var RUN_SPEED := 160 var WALK_SPEED := 96.0 # The player's speed while walking, measured in px/sec
var WALK_SKID := 8.0 var GROUND_WALK_ACCEL := 4.0 # The player's acceleration while walking, measured in px/frame
var WALK_SPEED := 96.0 var WALK_SKID := 8.0 # The player's turning deceleration while running, measured in px/frame
var CEILING_BUMP_SPEED := 45.0
var RUN_SPEED := 160.0 # The player's speed while running, measured in px/sec
var GROUND_RUN_ACCEL := 1.25 # The player's acceleration while running, measured in px/frame
var RUN_SKID := 8.0 # The player's turning deceleration while running, measured in px/frame
var DECEL := 3.0 # The player's deceleration while no buttons are pressed, measured in px/frame
var AIR_ACCEL := 3.0 # The player's acceleration while in midair, measured in px/frame
var AIR_SKID := 1.5 # The player's turning deceleration while in midair, measured in px/frame
var SWIM_SPEED := 95.0 # The player's horizontal speed while swimming, measured in px/sec
var SWIM_GROUND_SPEED := 45.0 # The player's horizontal speed while grounded underwater, measured in px/sec
var SWIM_HEIGHT := 100.0 # The strength of the player's swim, measured in px/sec
var SWIM_GRAVITY := 2.5 # The player's gravity while swimming, measured in px/frame
var MAX_SWIM_FALL_SPEED := 200.0 # The player's maximum fall speed while swimming, measured in px/sec
var DEATH_JUMP_HEIGHT := 300.0 # The strength of the player's "jump" during the death animation, measured in px/sec
#endregion
@onready var camera_center_joint: Node2D = $CameraCenterJoint @onready var camera_center_joint: Node2D = $CameraCenterJoint
@onready var sprite: AnimatedSprite2D = %Sprite @onready var sprite: AnimatedSprite2D = %Sprite
@@ -125,7 +142,7 @@ const ANIMATION_FALLBACKS := {
"WaterIdle": "Idle", "WaterIdle": "Idle",
"DieFreeze": "Die", "DieFreeze": "Die",
"StarJump": "Jump", "StarJump": "Jump",
"StarFall": "JumpFall" "StarFall": "StarJump"
} }
var palette_transform := true var palette_transform := true
@@ -272,12 +289,8 @@ func apply_gravity(delta: float) -> void:
if in_water or flight_meter > 0: if in_water or flight_meter > 0:
gravity = SWIM_GRAVITY gravity = SWIM_GRAVITY
else: else:
if gravity_vector.y > 0: if sign(gravity_vector.y) * velocity.y + JUMP_HOLD_SPEED_THRESHOLD > 0.0:
if velocity.y > 0: gravity = FALL_GRAVITY
gravity = FALL_GRAVITY
elif gravity_vector.y < 0:
if velocity.y < 0:
gravity = FALL_GRAVITY
velocity += (gravity_vector * ((gravity / (1.5 if low_gravity else 1.0)) / delta)) * delta velocity += (gravity_vector * ((gravity / (1.5 if low_gravity else 1.0)) / delta)) * delta
var target_fall: float = MAX_FALL_SPEED var target_fall: float = MAX_FALL_SPEED
if in_water: if in_water:
@@ -369,11 +382,11 @@ func enemy_bounce_off(add_combo := true) -> void:
jump_cancelled = not Global.player_action_pressed("jump", player_id) jump_cancelled = not Global.player_action_pressed("jump", player_id)
await get_tree().physics_frame await get_tree().physics_frame
if Global.player_action_pressed("jump", player_id): if Global.player_action_pressed("jump", player_id):
velocity.y = -300 velocity.y = sign(gravity_vector.y) * -BOUNCE_JUMP_HEIGHT
gravity = JUMP_GRAVITY gravity = JUMP_GRAVITY
has_jumped = true has_jumped = true
else: else:
velocity.y = -200 velocity.y = sign(gravity_vector.y) * -BOUNCE_HEIGHT
func add_stomp_combo() -> void: func add_stomp_combo() -> void:
if stomp_combo >= 10: if stomp_combo >= 10:

View File

@@ -13,7 +13,7 @@ func enter(msg := {}) -> void:
player.set_collision_mask_value(i + 1, false) player.set_collision_mask_value(i + 1, false)
player.gravity = player.JUMP_GRAVITY player.gravity = player.JUMP_GRAVITY
if msg["Pit"] == false: if msg["Pit"] == false:
player.velocity.y = -300 player.velocity.y = -player.DEATH_JUMP_HEIGHT
func physics_update(delta: float) -> void: func physics_update(delta: float) -> void:
if can_fall: if can_fall:

View File

@@ -95,7 +95,7 @@ func handle_ground_movement(delta: float) -> void:
func ground_acceleration(delta: float) -> void: func ground_acceleration(delta: float) -> void:
var target_move_speed := player.WALK_SPEED var target_move_speed := player.WALK_SPEED
if player.in_water or player.flight_meter > 0: if player.in_water or player.flight_meter > 0:
target_move_speed = 45 target_move_speed = player.SWIM_GROUND_SPEED
var target_accel := player.GROUND_WALK_ACCEL var target_accel := player.GROUND_WALK_ACCEL
if (Global.player_action_pressed("run", player.player_id) and abs(player.velocity.x) >= player.WALK_SPEED) and (not player.in_water and player.flight_meter <= 0) and player.can_run: if (Global.player_action_pressed("run", player.player_id) and abs(player.velocity.x) >= player.WALK_SPEED) and (not player.in_water and player.flight_meter <= 0) and player.can_run:
target_move_speed = player.RUN_SPEED target_move_speed = player.RUN_SPEED
@@ -133,14 +133,9 @@ func handle_air_movement(delta: float) -> void:
if Global.player_action_pressed("jump", player.player_id) == false and player.has_jumped and not player.jump_cancelled: if Global.player_action_pressed("jump", player.player_id) == false and player.has_jumped and not player.jump_cancelled:
player.jump_cancelled = true player.jump_cancelled = true
if player.gravity_vector.y > 0: if sign(player.gravity_vector.y * player.velocity.y) < 0.0:
if player.velocity.y < 0: player.velocity.y /= player.JUMP_CANCEL_DIVIDE
player.velocity.y /= 1.5 player.gravity = player.FALL_GRAVITY
player.gravity = player.FALL_GRAVITY
elif player.gravity_vector.y < 0:
if player.velocity.y > 0:
player.velocity.y /= 1.5
player.gravity = player.FALL_GRAVITY
func air_acceleration(delta: float) -> void: func air_acceleration(delta: float) -> void:
var target_speed = player.WALK_SPEED var target_speed = player.WALK_SPEED
@@ -171,7 +166,7 @@ func swim_acceleration(delta: float) -> void:
func swim_up() -> void: func swim_up() -> void:
if player.swim_stroke: if player.swim_stroke:
player.play_animation("SwimIdle") player.play_animation("SwimIdle")
player.velocity.y = -100 * player.gravity_vector.y player.velocity.y = -player.SWIM_HEIGHT * player.gravity_vector.y
AudioManager.play_sfx("swim", player.global_position) AudioManager.play_sfx("swim", player.global_position)
swim_up_meter = 0.5 swim_up_meter = 0.5
player.crouching = false player.crouching = false