From 712c80c6820de46ddd80f7d3718edeedf5a7fbe5 Mon Sep 17 00:00:00 2001 From: "Lucas S. Vieira" Date: Tue, 8 Apr 2025 22:54:13 -0300 Subject: [PATCH] Add a helper flag for ceiling collision --- include/player.h | 1 + src/object_state_update.c | 4 +++- src/player.c | 11 ++++++++--- src/screen_level.c | 4 +++- 4 files changed, 15 insertions(+), 5 deletions(-) diff --git a/include/player.h b/include/player.h index 1152259..63e776b 100644 --- a/include/player.h +++ b/include/player.h @@ -73,6 +73,7 @@ typedef struct { int8_t anim_dir; uint8_t idle_timer; uint8_t grnd; + uint8_t ceil; uint8_t push; uint32_t spinrev; uint8_t ctrllock; diff --git a/src/object_state_update.c b/src/object_state_update.c index 00bf379..d50b95c 100644 --- a/src/object_state_update.c +++ b/src/object_state_update.c @@ -65,9 +65,11 @@ static void _bubble_update(ObjectState *state, ObjectTableEntry *, VECTOR *); // Player hitbox information. Calculated once per frame. static int32_t player_vx, player_vy; // Top left corner of player hitbox +static uint8_t player_attacking; + +// TODO: ADJUST ACCORDING TO CHARACTER static int32_t player_width = 16; static int32_t player_height = HEIGHT_RADIUS_NORMAL << 1; -static uint8_t player_attacking; int player_hitbox_shown; diff --git a/src/player.c b/src/player.c index 367680e..02f83a4 100644 --- a/src/player.c +++ b/src/player.c @@ -147,7 +147,7 @@ load_player(Player *player, player->anim_frame = player->anim_timer = 0; player->anim_dir = 1; player->idle_timer = ANIM_IDLE_TIMER_MAX; - player->grnd = player->push = 0; + player->grnd = player->ceil = player->push = 0; player->ev_grnd1 = (CollisionEvent){ 0 }; player->ev_grnd2 = (CollisionEvent){ 0 }; @@ -701,7 +701,8 @@ _player_update_collision_tb(Player *player) new_coord = player->ev_ceil2.coord; player->pos.vy = (new_coord + 32) << 12; - } + player->ceil = 1; + } else player->ceil = 0; // Cancel drop dash if not holding jump if(player->action == ACTION_DROPDASH @@ -709,6 +710,10 @@ _player_update_collision_tb(Player *player) player_set_action(player, ACTION_JUMPING); } } else { + if(!player->ev_ceil1.collided && !player->ev_ceil2.collided) { + player->ceil = 0; + } + if(!player->ev_grnd1.collided && !player->ev_grnd2.collided) { player->grnd = 0; player->gsmode = player->psmode = CDIR_FLOOR; @@ -1343,7 +1348,7 @@ player_update(Player *player) player->ev_grnd2.collided ? "G" : " ", player->ev_left.collided ? "L" : " ", player->ev_right.collided ? "R" : " "); - font_draw_sm(buffer, 8, 67); + font_draw_sm(buffer, 8, 74); } // Reset sensors diff --git a/src/screen_level.c b/src/screen_level.c index b08102f..2c5b7b5 100644 --- a/src/screen_level.c +++ b/src/screen_level.c @@ -659,6 +659,7 @@ screen_level_draw(void *d) "ANG %08x G.P %s %s %3d\n" "POS %08x %08x\n" "ACT %02u\n" + "GRN CEI %01u %01u\n" , player.vel.vz, player.vel.vx, player.vel.vy, @@ -683,7 +684,8 @@ screen_level_draw(void *d) : " ", (int32_t)(((int32_t)player.angle * (int32_t)(360 << 12)) >> 24), // angle in deg player.pos.vx, player.pos.vy, - player.action + player.action, + player.grnd, player.ceil ); font_draw_sm(buffer, 8, 12); }