New Optional Animation States (#420)

* new animation states

additional conditional animation states, including:
- SkidAttack
- IdleAttack
- WalkAttack
- RunAttack
- CrouchJump
- CrouchMove
... along with a new set of animations, the Bump animations (play when hitting your head on a block)
- JumpBump
- CrouchBump
- SwimBump

* added fly animations & tweaked bump animation time

new anims for FlyIdle, FlyUp, FlyMove, FlyAttack, and FlyBump, which all fallback on their Swim counterparts if not found. also changed around some animation fallbacks which made more sense, like bumps using fall animations instead if applicable.

* added bump ignore checks and added a general bump animation

you can now define Bump which will define a bump animation for all bump animations. additionally, bump animations will only play if they can detect an animation. no more fallbacks needed
This commit is contained in:
SkyanUltra
2025-09-28 06:25:50 -04:00
committed by GitHub
parent 8c5ce9b99d
commit f6a31f8508
2 changed files with 77 additions and 12 deletions

View File

@@ -62,7 +62,12 @@ var character := "Mario"
var crouching := false var crouching := false
var skidding := false var skidding := false
var bumping := false
var can_bump_sfx := true var can_bump_sfx := true
var can_bump_jump = false
var can_bump_crouch = false
var can_bump_swim = false
var can_bump_fly = false
@export var player_id := 0 @export var player_id := 0
const ONE_UP_NOTE = preload("uid://dopxwjj37gu0l") const ONE_UP_NOTE = preload("uid://dopxwjj37gu0l")
@@ -131,6 +136,7 @@ static var CHARACTER_PALETTES := [
const ANIMATION_FALLBACKS := { const ANIMATION_FALLBACKS := {
"JumpFall": "Jump", "JumpFall": "Jump",
"JumpBump": "Bump",
"Fall": "Move", "Fall": "Move",
"Pipe": "Idle", "Pipe": "Idle",
"Walk": "Move", "Walk": "Move",
@@ -138,10 +144,24 @@ const ANIMATION_FALLBACKS := {
"PipeWalk": "Move", "PipeWalk": "Move",
"LookUp": "Idle", "LookUp": "Idle",
"CrouchFall": "Crouch", "CrouchFall": "Crouch",
"CrouchAttack": "Attack", "CrouchJump": "Crouch",
"CrouchBump": "Bump",
"CrouchMove": "Crouch",
"IdleAttack": "Attack",
"CrouchAttack": "IdleAttack",
"MoveAttack": "IdleAttack",
"WalkAttack": "MoveAttack",
"RunAttack": "MoveAttack",
"SkidAttack": "MoveAttack",
"FlyIdle": "SwimIdle",
"FlyUp": "SwimUp",
"FlyMove": "SwimMove",
"FlyAttack": "SwimAttack",
"FlyBump": "SwimBump",
"FlagSlide": "Climb", "FlagSlide": "Climb",
"WaterMove": "Move", "WaterMove": "Move",
"WaterIdle": "Idle", "WaterIdle": "Idle",
"SwimBump": "Bump",
"DieFreeze": "Die", "DieFreeze": "Die",
"StarJump": "Jump", "StarJump": "Jump",
"StarFall": "StarJump" "StarFall": "StarJump"
@@ -410,9 +430,12 @@ func bump_ceiling() -> void:
AudioManager.play_sfx("bump", global_position) AudioManager.play_sfx("bump", global_position)
velocity.y = CEILING_BUMP_SPEED velocity.y = CEILING_BUMP_SPEED
can_bump_sfx = false can_bump_sfx = false
bumping = true
await get_tree().create_timer(0.1).timeout await get_tree().create_timer(0.1).timeout
AudioManager.kill_sfx("small_jump") AudioManager.kill_sfx("small_jump")
AudioManager.kill_sfx("big_jump") AudioManager.kill_sfx("big_jump")
await get_tree().create_timer(0.1).timeout
bumping = false
func super_star() -> void: func super_star() -> void:
DiscoLevel.combo_meter += 1 DiscoLevel.combo_meter += 1
@@ -617,6 +640,10 @@ func set_power_state_frame() -> void:
$ResourceSetterNew.update_resource() $ResourceSetterNew.update_resource()
if %Sprite.sprite_frames != null: if %Sprite.sprite_frames != null:
can_pose = %Sprite.sprite_frames.has_animation("PoseDoor") can_pose = %Sprite.sprite_frames.has_animation("PoseDoor")
can_bump_jump = %Sprite.sprite_frames.has_animation("JumpBump")
can_bump_crouch = %Sprite.sprite_frames.has_animation("CrouchBump")
can_bump_swim = %Sprite.sprite_frames.has_animation("SwimBump")
can_bump_fly = %Sprite.sprite_frames.has_animation("FlyBump")
func get_power_up(power_name := "") -> void: func get_power_up(power_name := "") -> void:
if is_dead: if is_dead:

View File

@@ -186,22 +186,47 @@ func get_animation_name() -> String:
if player.attacking: if player.attacking:
if player.crouching: if player.crouching:
return "CrouchAttack" return "CrouchAttack"
if player.is_actually_on_floor(): elif player.is_actually_on_floor():
return "Attack" if player.skidding:
elif player.in_water or player.flight_meter > 0: return "SkidAttack"
elif abs(player.velocity.x) >= 5 and not player.is_actually_on_wall():
if player.in_water:
return "SwimAttack" return "SwimAttack"
elif player.flight_meter > 0:
return "FlyAttack"
elif abs(player.velocity.x) < player.RUN_SPEED - 10:
return "WalkAttack"
else:
return "RunAttack"
else:
return "IdleAttack"
else:
if player.in_water:
return "SwimAttack"
elif player.flight_meter > 0:
return "FlyAttack"
else: else:
return "AirAttack" return "AirAttack"
if player.crouching and not wall_pushing: if player.crouching and not wall_pushing:
if player.velocity.y > 0 and player.is_on_floor() == false: if player.bumping and player.can_bump_crouch:
return "CrouchBump"
elif player.is_on_floor() == false:
if player.velocity.y > 0:
return "CrouchFall" return "CrouchFall"
elif player.velocity.y < 0:
return "CrouchJump"
elif player.is_actually_on_floor():
if abs(player.velocity.x) >= 5 and not player.is_actually_on_wall():
return "CrouchMove"
return "Crouch" return "Crouch"
if player.is_actually_on_floor(): if player.is_actually_on_floor():
if player.skidding: if player.skidding:
return "Skid" return "Skid"
elif abs(player.velocity.x) >= 5 and not player.is_actually_on_wall(): elif abs(player.velocity.x) >= 5 and not player.is_actually_on_wall():
if player.in_water or player.flight_meter > 0: if player.in_water:
return "WaterMove" return "WaterMove"
elif player.flight_meter > 0:
return "FlyMove"
elif abs(player.velocity.x) < player.RUN_SPEED - 10: elif abs(player.velocity.x) < player.RUN_SPEED - 10:
return "Walk" return "Walk"
else: else:
@@ -213,13 +238,26 @@ func get_animation_name() -> String:
return "LookUp" return "LookUp"
return "Idle" return "Idle"
else: else:
if player.in_water or player.flight_meter > 0: if player.in_water:
if swim_up_meter > 0: if swim_up_meter > 0:
if player.bumping and player.can_bump_swim:
return "SwimBump"
else:
return "SwimUp" return "SwimUp"
else: else:
return "SwimIdle" return "SwimIdle"
elif player.flight_meter > 0:
if swim_up_meter > 0:
if player.bumping and player.can_bump_fly:
return "FlyBump"
else:
return "FlyUp"
else:
return "FlyIdle"
if player.has_jumped: if player.has_jumped:
if player.velocity.y < 0: if player.bumping and player.can_bump_jump:
return "JumpBump"
elif player.velocity.y < 0:
if player.is_invincible: if player.is_invincible:
return "StarJump" return "StarJump"
return "Jump" return "Jump"