Add recovery frames after sliding and after cancelling a glide

This commit is contained in:
Lucas S. Vieira 2025-04-17 01:23:09 -03:00
parent 43afec6ae2
commit 3c64597f21
2 changed files with 20 additions and 4 deletions

View file

@ -46,7 +46,9 @@ typedef enum {
ACTION_FLY, ACTION_FLY,
// Knuckles actions // Knuckles actions
ACTION_GLIDE, ACTION_GLIDE,
ACTION_GLIDERECOVER,
ACTION_DROP, ACTION_DROP,
ACTION_DROPRECOVER,
ACTION_CLIMB, ACTION_CLIMB,
ACTION_CLAMBER, ACTION_CLAMBER,
} PlayerAction; } PlayerAction;

View file

@ -668,9 +668,11 @@ _player_update_collision_tb(Player *player)
// When gliding, apply friction // When gliding, apply friction
player->sliding = 0; player->sliding = 0;
if(player->action == ACTION_GLIDE) { if(player->action == ACTION_GLIDE) {
if(abs(player->vel.vx) <= KNUX_GLIDE_FRICTION) if(abs(player->vel.vx) <= KNUX_GLIDE_FRICTION) {
player_set_action(player, ACTION_GLIDERECOVER);
player->framecount = 12;
player->vel.vx = 0; player->vel.vx = 0;
else { } else {
player->sliding = 1; player->sliding = 1;
player->glide_turn_dir = 0; player->glide_turn_dir = 0;
player->vel.vx -= KNUX_GLIDE_FRICTION * player->anim_dir; player->vel.vx -= KNUX_GLIDE_FRICTION * player->anim_dir;
@ -733,7 +735,8 @@ _player_update_collision_tb(Player *player)
sound_play_vag(sfx_relea, 0); sound_play_vag(sfx_relea, 0);
camera.lag = 0x8000 >> 12; camera.lag = 0x8000 >> 12;
} else if(player->action == ACTION_DROP) { } else if(player->action == ACTION_DROP) {
player_set_action(player, ACTION_NONE); player_set_action(player, ACTION_DROPRECOVER);
player->framecount = 12;
player->vel.vz = 0; player->vel.vz = 0;
player->airdirlock = 0; player->airdirlock = 0;
} }
@ -958,6 +961,12 @@ player_update(Player *player)
} else if(player->action == ACTION_CLAMBER) { } else if(player->action == ACTION_CLAMBER) {
// Do not move while clambering // Do not move while clambering
player->vel.vx = player->vel.vy = player->vel.vz = 0; player->vel.vx = player->vel.vy = player->vel.vz = 0;
} else if((player->action == ACTION_DROPRECOVER)
|| (player->action == ACTION_GLIDERECOVER)) {
if(player->framecount > 0) {
player->framecount--;
player->vel.vx = player->vel.vz = 0;
} else player_set_action(player, ACTION_NONE);
} else { } else {
// Default physics // Default physics
player_set_action(player, ACTION_NONE); player_set_action(player, ACTION_NONE);
@ -1295,6 +1304,10 @@ player_update(Player *player)
if(player->push) { if(player->push) {
player_set_animation_direct(player, ANIM_PUSHING); player_set_animation_direct(player, ANIM_PUSHING);
player->idle_timer = ANIM_IDLE_TIMER_MAX; player->idle_timer = ANIM_IDLE_TIMER_MAX;
} else if(player->action == ACTION_GLIDERECOVER) {
player_set_animation_direct(player, ANIM_GLIDERISE);
} else if(player->action == ACTION_DROPRECOVER) {
player_set_animation_direct(player, ANIM_CROUCHDOWN);
} else if(player->vel.vz == 0) { } else if(player->vel.vz == 0) {
if(player->action == ACTION_SPINDASH) { if(player->action == ACTION_SPINDASH) {
player_set_animation_direct(player, ANIM_SPINDASH); player_set_animation_direct(player, ANIM_SPINDASH);
@ -1707,7 +1720,8 @@ player_draw(Player *player, VECTOR *pos)
{ {
uint8_t is_rolling_angle = uint8_t is_rolling_angle =
(player_get_current_animation_hash(player) == ANIM_ROLLING) (player_get_current_animation_hash(player) == ANIM_ROLLING)
|| (player_get_current_animation_hash(player) == ANIM_GLIDELAND); || (player_get_current_animation_hash(player) == ANIM_GLIDELAND)
|| (player_get_current_animation_hash(player) == ANIM_GLIDERISE);
uint8_t is_rolling = uint8_t is_rolling =
is_rolling_angle is_rolling_angle
|| (player_get_current_animation_hash(player) == ANIM_SPINDASH); || (player_get_current_animation_hash(player) == ANIM_SPINDASH);