From a36ebab06efc748a0e44c24169eec7f1d0d64002 Mon Sep 17 00:00:00 2001 From: "Lucas S. Vieira" Date: Tue, 8 Apr 2025 20:04:01 -0300 Subject: [PATCH] Introduce Knuckles' values --- include/player.h | 9 ++++ src/object_state_update.c | 3 +- src/player.c | 21 ++++---- src/player_constants.c | 109 ++++++++++++++++++++++++++++++++++++-- src/screen_level.c | 3 +- 5 files changed, 127 insertions(+), 18 deletions(-) diff --git a/include/player.h b/include/player.h index e5b7c8c..1152259 100644 --- a/include/player.h +++ b/include/player.h @@ -44,6 +44,15 @@ typedef enum { // Alias to make things look less weird typedef LinecastDirection CollMode; +typedef enum { + PC_DEFAULT, + PC_UNDERWATER, + PC_SPEEDSHOES, +} PlayerConstantType; + +// declared in player_constants.c +PlayerConstants *getconstants(PlayerCharacter, PlayerConstantType); + typedef struct { InputState input; PlayerConstants *cnst; diff --git a/src/object_state_update.c b/src/object_state_update.c index aca8cb5..00bf379 100644 --- a/src/object_state_update.c +++ b/src/object_state_update.c @@ -22,7 +22,6 @@ // Extern elements extern Player player; extern Camera camera; -extern PlayerConstants CNST_SPEEDSHOES; extern TileMap16 map16; extern TileMap128 map128; extern LevelData leveldata; @@ -617,7 +616,7 @@ _monitor_image_update(ObjectState *state, ObjectTableEntry *, VECTOR *) case MONITOR_KIND_SPEEDSHOES: // Start speed shoes count player.speedshoes_frames = 1200; // 20 seconds - player.cnst = &CNST_SPEEDSHOES; + player.cnst = getconstants(player.character, PC_SPEEDSHOES); sound_bgm_play(BGM_SPEEDSHOES); break; default: break; diff --git a/src/player.c b/src/player.c index b8ddfe0..367680e 100644 --- a/src/player.c +++ b/src/player.c @@ -10,10 +10,7 @@ #include "camera.h" #include "collision.h" #include "basic_font.h" - -extern PlayerConstants CNST_DEFAULT; -extern PlayerConstants CNST_UNDERWATER; -extern PlayerConstants CNST_SPEEDSHOES; +#include "player_constants.h" #define TMP_ANIM_SPD 7 #define ANIM_IDLE_TIMER_MAX 180 @@ -125,11 +122,12 @@ load_player(Player *player, const char *chara_filename, TIM_IMAGE *sprites) { + player->character = character; player->input = (InputState){ 0 }; load_chara(&player->chara, chara_filename, sprites); player->cur_anim = NULL; player->tail_cur_anim = NULL; - player->cnst = &CNST_DEFAULT; + player->cnst = getconstants(character, PC_DEFAULT); player->pos = (VECTOR){ 0 }; player->vel = (VECTOR){ 0 }; player->angle = 0; @@ -160,7 +158,6 @@ load_player(Player *player, player->col_ledge = 0; player->action = ACTION_NONE; - player->character = character; if(sfx_jump.addr == 0) sfx_jump = sound_load_vag("\\SFX\\JUMP.VAG;1"); if(sfx_skid.addr == 0) sfx_skid = sound_load_vag("\\SFX\\SKIDDING.VAG;1"); @@ -1233,7 +1230,7 @@ player_update(Player *player) if(player->speedshoes_frames == 0) { // Reset constants. // Notice that speedshoes_frames is set to -1 by general level update. - player->cnst = player->underwater ? &CNST_UNDERWATER : &CNST_DEFAULT; + player->cnst = getconstants(player->character, player->underwater ? PC_UNDERWATER : PC_DEFAULT); } // Underwater / leaving water @@ -1245,16 +1242,18 @@ player_update(Player *player) // Change constants accordingly! if(player->underwater) { // Entered underwater state - player->cnst = &CNST_UNDERWATER; + player->cnst = getconstants(player->character, PC_UNDERWATER); // Halve player's X speed if(player->grnd) player->vel.vz = player->vel.vz >> 1; else player->vel.vx = player->vel.vx >> 1; // Quarter player's Y speed player->vel.vy = player->vel.vy >> 2; } else { - player->cnst = (player->speedshoes_frames > 0) - ? &CNST_SPEEDSHOES - : &CNST_DEFAULT; + player->cnst = getconstants( + player->character, + (player->speedshoes_frames > 0) + ? PC_SPEEDSHOES + : PC_DEFAULT); // Double Y speed, limiting it to -16.0 (0x00010000) player->vel.vy = MAX(player->vel.vy << 1, -0x10000); } diff --git a/src/player_constants.c b/src/player_constants.c index bde3df6..d40b42e 100644 --- a/src/player_constants.c +++ b/src/player_constants.c @@ -1,7 +1,8 @@ #include "player_constants.h" +#include "player.h" // Default player values -PlayerConstants CNST_DEFAULT = { +static PlayerConstants CNST_DEFAULT = { .x_accel = 0x000c0, .x_air_accel = 0x00180, .x_friction = 0x000c0, @@ -30,7 +31,7 @@ PlayerConstants CNST_DEFAULT = { // Underwater player values. // Most values are simply halved from base defaults -PlayerConstants CNST_UNDERWATER = { +static PlayerConstants CNST_UNDERWATER = { .x_accel = 0x00060, // Changed .x_air_accel = 0x000c0, // Changed .x_friction = 0x00060, // Changed @@ -58,7 +59,7 @@ PlayerConstants CNST_UNDERWATER = { }; // Speed shoes (only used outside water) -PlayerConstants CNST_SPEEDSHOES = { +static PlayerConstants CNST_SPEEDSHOES = { .x_accel = 0x00180, // Changed .x_air_accel = 0x00300, // Changed .x_friction = 0x00180, // Changed @@ -84,3 +85,105 @@ PlayerConstants CNST_SPEEDSHOES = { .x_hurt_force = 0x02000, .x_peelout_spd = 0x0c000 }; + + +/* Knuckles values */ +static PlayerConstants CNST_DEFAULT_K = { + .x_accel = 0x000c0, + .x_air_accel = 0x00180, + .x_friction = 0x000c0, + .x_decel = 0x00800, + .x_top_spd = 0x06000, + .y_gravity = 0x00380, + .y_hurt_gravity = 0x00300, + .y_min_jump = 0x04000, + .y_jump_strength = 0x06000, + .x_min_roll_spd = 0x01000, + .x_min_uncurl_spd = 0x00800, + .x_roll_friction = 0x00060, + .x_roll_decel = 0x00200, + .x_slope_min_spd = 0x000d0, + .x_slope_normal = 0x00200, + .x_slope_rollup = 0x00140, + .x_slope_rolldown = 0x00500, + .x_max_spd = 0x10000, + .x_map_slip_spd = 0x02800, + .x_drpspd = 0x08000, + .x_drpmax = 0x0c000, + .y_hurt_force = 0x04000, + .x_hurt_force = 0x02000, + .x_peelout_spd = 0x0c000 +}; + +static PlayerConstants CNST_UNDERWATER_K = { + .x_accel = 0x00060, // Changed + .x_air_accel = 0x000c0, // Changed + .x_friction = 0x00060, // Changed + .x_decel = 0x00400, // Changed + .x_top_spd = 0x03000, // Changed + .y_gravity = 0x00100, // Changed + .y_hurt_gravity = 0x000c0, // Changed, not documented, y_gravity - half diff on default + .y_min_jump = 0x02000, // Changed + .y_jump_strength = 0x03000, // Changed + .x_min_roll_spd = 0x01000, + .x_min_uncurl_spd = 0x00800, + .x_roll_friction = 0x00030, // Changed + .x_roll_decel = 0x00200, + .x_slope_min_spd = 0x000d0, + .x_slope_normal = 0x00200, + .x_slope_rollup = 0x00140, + .x_slope_rolldown = 0x00500, + .x_max_spd = 0x10000, + .x_map_slip_spd = 0x02800, + .x_drpspd = 0x08000, + .x_drpmax = 0x0c000, + .y_hurt_force = 0x02000, // Changed + .x_hurt_force = 0x01000, // Changed + .x_peelout_spd = 0x05fff // Changed +}; + +static PlayerConstants CNST_SPEEDSHOES_K = { + .x_accel = 0x00180, // Changed + .x_air_accel = 0x00300, // Changed + .x_friction = 0x00180, // Changed + .x_decel = 0x00800, + .x_top_spd = 0x0c000, // Changed + .y_gravity = 0x00380, + .y_hurt_gravity = 0x00300, + .y_min_jump = 0x04000, + .y_jump_strength = 0x06000, + .x_min_roll_spd = 0x01000, + .x_min_uncurl_spd = 0x00800, + .x_roll_friction = 0x000c0, // Changed + .x_roll_decel = 0x00200, + .x_slope_min_spd = 0x000d0, + .x_slope_normal = 0x00200, + .x_slope_rollup = 0x00140, + .x_slope_rolldown = 0x00500, + .x_max_spd = 0x10000, + .x_map_slip_spd = 0x02800, + .x_drpspd = 0x08000, + .x_drpmax = 0x0c000, + .y_hurt_force = 0x04000, + .x_hurt_force = 0x02000, + .x_peelout_spd = 0x0c000 +}; + + +PlayerConstants * +getconstants(PlayerCharacter c, PlayerConstantType pct) +{ + if(c == CHARA_KNUCKLES) { + switch(pct) { + default: return &CNST_DEFAULT_K; + case PC_UNDERWATER: return &CNST_UNDERWATER_K; + case PC_SPEEDSHOES: return &CNST_SPEEDSHOES_K; + } + } + + switch(pct) { + default: return &CNST_DEFAULT; + case PC_UNDERWATER: return &CNST_UNDERWATER; + case PC_SPEEDSHOES: return &CNST_SPEEDSHOES; + } +} diff --git a/src/screen_level.c b/src/screen_level.c index e20c1b7..b08102f 100644 --- a/src/screen_level.c +++ b/src/screen_level.c @@ -21,7 +21,6 @@ #include "demo.h" extern int debug_mode; -extern PlayerConstants CNST_DEFAULT; static uint8_t level = 0; static PlayerCharacter level_character = CHARA_SONIC; @@ -300,7 +299,7 @@ screen_level_update(void *d) player.vel.vx = player.vel.vy = player.vel.vz = 0; player.psmode = player.gsmode = CDIR_FLOOR; player.underwater = 0; - player.cnst = &CNST_DEFAULT; + player.cnst = getconstants(player.character, PC_DEFAULT); player.speedshoes_frames = (player.speedshoes_frames > 0) ? 0 : -1; }