diff --git a/src/game/chraction.c b/src/game/chraction.c index 305e4a91b..0f99e7084 100644 --- a/src/game/chraction.c +++ b/src/game/chraction.c @@ -1331,90 +1331,90 @@ s32 g_NumBgChrs = 0; s16 *g_TeamList = NULL; s16 *g_SquadronList = NULL; -struct var80067e6c var80067e6c[] = { - { ANIM_0028, 0 }, +struct animdist g_ChrAvgAnimMoveDistsHuman[] = { + { ANIM_0028, 0 }, { ANIM_RUNNING_TWOHANDGUN, 0 }, - { ANIM_0029, 0 }, - { ANIM_006B, 0 }, + { ANIM_0029, 0 }, + { ANIM_006B, 0 }, { ANIM_RUNNING_ONEHANDGUN, 0 }, - { ANIM_005A, 0 }, - { ANIM_0072, 0 }, - { ANIM_0073, 0 }, - { ANIM_005A, 0 }, - { ANIM_006C, 0 }, - { ANIM_0030, 0 }, - { ANIM_0031, 0 }, - { ANIM_0052, 0 }, - { ANIM_0055, 0 }, - { ANIM_006E, 0 }, - { ANIM_006F, 0 }, - { ANIM_0057, 0 }, - { ANIM_0056, 0 }, - { ANIM_006D, 0 }, + { ANIM_005A, 0 }, + { ANIM_0072, 0 }, + { ANIM_0073, 0 }, + { ANIM_005A, 0 }, + { ANIM_006C, 0 }, + { ANIM_0030, 0 }, + { ANIM_0031, 0 }, + { ANIM_0052, 0 }, + { ANIM_0055, 0 }, + { ANIM_006E, 0 }, + { ANIM_006F, 0 }, + { ANIM_0057, 0 }, + { ANIM_0056, 0 }, + { ANIM_006D, 0 }, { ANIM_RUNNING_ONEHANDGUN, 0 }, - { ANIM_020A, 0 }, - { ANIM_020D, 0 }, - { ANIM_01F9, 0 }, - { ANIM_01F8, 0 }, - { ANIM_021D, 0 }, - { ANIM_0016, 0 }, - { ANIM_0018, 0 }, - { ANIM_001B, 0 }, - { ANIM_001D, 0 }, - { ANIM_001E, 0 }, - { ANIM_005C, 0 }, - { ANIM_005D, 0 }, - { ANIM_005E, 0 }, - { ANIM_005F, 0 }, + { ANIM_020A, 0 }, + { ANIM_020D, 0 }, + { ANIM_01F9, 0 }, + { ANIM_01F8, 0 }, + { ANIM_021D, 0 }, + { ANIM_0016, 0 }, + { ANIM_0018, 0 }, + { ANIM_001B, 0 }, + { ANIM_001D, 0 }, + { ANIM_001E, 0 }, + { ANIM_005C, 0 }, + { ANIM_005D, 0 }, + { ANIM_005E, 0 }, + { ANIM_005F, 0 }, { -1 }, }; -struct var80067e6c var80067f84[] = { - { ANIM_0392, 0 }, - { ANIM_0393, 0 }, +struct animdist g_ChrAvgAnimMoveDistsSkedar[] = { + { ANIM_0392, 0 }, + { ANIM_0393, 0 }, { ANIM_SKEDAR_RUNNING, 0 }, { -1 }, }; -struct var80067e6c var80067fa4[] = { +struct animdist g_ChrAvgAnimMoveDistsDrCaroll[] = { { ANIM_015F, 0 }, { ANIM_0160, 0 }, { -1 }, }; -struct var80067e6c var80067fbc[] = { +struct animdist g_ChrAvgAnimMoveDistsEyespy[] = { { ANIM_015F, 0 }, { -1 }, }; -struct var80067e6c var80067fcc[] = { +struct animdist g_ChrAvgAnimMoveDistsRobot[] = { { ANIM_0238, 0 }, { -1 }, }; -struct var80067e6c *var80067fdc[] = { - var80067e6c, - var80067f84, - var80067fa4, - var80067fbc, - var80067fcc, +struct animdist *g_ChrAvgAnimMoveDists[] = { + g_ChrAvgAnimMoveDistsHuman, + g_ChrAvgAnimMoveDistsSkedar, + g_ChrAvgAnimMoveDistsDrCaroll, + g_ChrAvgAnimMoveDistsEyespy, + g_ChrAvgAnimMoveDistsRobot, }; -f32 func0f02dff0(s16 animnum) +f32 chr_get_anim_movedist_per_frame(s16 animnum) { s32 i; - for (i = 0; i < ARRAYCOUNT(var80067fdc); i++) { + for (i = 0; i < ARRAYCOUNT(g_ChrAvgAnimMoveDists); i++) { s32 j = 0; - s16 thisanimnum = var80067fdc[i][j].animnum; + s16 thisanimnum = g_ChrAvgAnimMoveDists[i][j].animnum; while (thisanimnum >= 0) { if (thisanimnum == animnum) { - return var80067fdc[i][j].value; + return g_ChrAvgAnimMoveDists[i][j].value; } j++; - thisanimnum = var80067fdc[i][j].animnum; + thisanimnum = g_ChrAvgAnimMoveDists[i][j].animnum; } } @@ -2169,28 +2169,16 @@ void chr_run_pos_choose_animation(struct chrdata *chr) if (race == RACE_HUMAN) { if (heavy) { f32 mult = 0.5; -#if PAL - chr->act_runpos.eta60 = 1.0f / (func0f02dff0(ANIM_RUNNING_TWOHANDGUN) * mult) * distance * 0.83333331346512f; -#else - chr->act_runpos.eta60 = 1.0f / (func0f02dff0(ANIM_RUNNING_TWOHANDGUN) * mult) * distance; -#endif + chr->act_runpos.eta60 = PALDOWNF(1.0f / (chr_get_anim_movedist_per_frame(ANIM_RUNNING_TWOHANDGUN) * mult) * distance); model_set_animation(chr->model, ANIM_RUNNING_TWOHANDGUN, flip, 0, mult, 16); } else { f32 mult = 0.5; -#if PAL - chr->act_runpos.eta60 = 1.0f / (func0f02dff0(ANIM_RUNNING_ONEHANDGUN) * mult) * distance * 0.83333331346512f; -#else - chr->act_runpos.eta60 = 1.0f / (func0f02dff0(ANIM_RUNNING_ONEHANDGUN) * mult) * distance; -#endif + chr->act_runpos.eta60 = PALDOWNF(1.0f / (chr_get_anim_movedist_per_frame(ANIM_RUNNING_ONEHANDGUN) * mult) * distance); model_set_animation(chr->model, ANIM_RUNNING_ONEHANDGUN, flip, 0, mult, 16); } } else if (race == RACE_SKEDAR) { f32 mult = 0.5; -#if PAL - chr->act_runpos.eta60 = 1.0f / (func0f02dff0(ANIM_SKEDAR_RUNNING) * mult) * distance * 0.83333331346512f; -#else - chr->act_runpos.eta60 = 1.0f / (func0f02dff0(ANIM_SKEDAR_RUNNING) * mult) * distance; -#endif + chr->act_runpos.eta60 = PALDOWNF(1.0f / (chr_get_anim_movedist_per_frame(ANIM_SKEDAR_RUNNING) * mult) * distance); model_set_animation(chr->model, ANIM_SKEDAR_RUNNING, flip, 0, mult, 16); } } @@ -5410,7 +5398,7 @@ void chr_go_pos_get_cur_waypoint_info(struct chrdata *chr, struct coord *pos, Ro chr_go_pos_get_cur_waypoint_info_with_flags(chr, pos, rooms, NULL); } -f32 func0f0370a8(struct chrdata *chr) +f32 chr_get_run_speed(struct chrdata *chr) { f32 result; @@ -5418,7 +5406,7 @@ f32 func0f0370a8(struct chrdata *chr) result = bot_calculate_max_speed(chr); } else { s16 animnum = model_get_anim_num(chr->model); - result = func0f02dff0(animnum) * (chr->model->scale * 9.999999f); + result = chr_get_anim_movedist_per_frame(animnum) * (chr->model->scale * 9.999999f); } return result; @@ -5446,7 +5434,7 @@ s32 chr_go_pos_calculate_base_ttl(struct chrdata *chr) zdiff = -zdiff; } - speed = func0f0370a8(chr); + speed = chr_get_run_speed(chr); if (chr->aibot == NULL) { speed *= model_get_abs_anim_speed(chr->model); @@ -6231,7 +6219,7 @@ void chr_patrol_choose_animation(struct chrdata *chr) if (race == RACE_SKEDAR) { model_set_animation(chr->model, ANIM_0392, flip, 0, 0.25f, 16); } else { - speed = 0.5f * func0f02dff0(ANIM_0028) / func0f02dff0(ANIM_006B); + speed = 0.5f * chr_get_anim_movedist_per_frame(ANIM_0028) / chr_get_anim_movedist_per_frame(ANIM_006B); if (heavy) { model_set_animation(chr->model, random() % 2 ? ANIM_0018 : ANIM_0028, flip, 0, speed, 16); @@ -11722,12 +11710,12 @@ void chr_tick_run_pos(struct chrdata *chr) if (race == RACE_HUMAN) { if (model_get_anim_num(model) == ANIM_RUNNING_ONEHANDGUN) { - fVar7 = func0f02dff0(ANIM_RUNNING_ONEHANDGUN); + fVar7 = chr_get_anim_movedist_per_frame(ANIM_RUNNING_ONEHANDGUN); } else { - fVar7 = func0f02dff0(ANIM_RUNNING_TWOHANDGUN); + fVar7 = chr_get_anim_movedist_per_frame(ANIM_RUNNING_TWOHANDGUN); } } else if (race == RACE_SKEDAR) { - fVar7 = func0f02dff0(ANIM_SKEDAR_RUNNING); + fVar7 = chr_get_anim_movedist_per_frame(ANIM_SKEDAR_RUNNING); } chr->act_runpos.neardist += fVar7 * g_Vars.lvupdate60freal * model_get_abs_anim_speed(model); @@ -12828,7 +12816,7 @@ void chr_tick_go_pos(struct chrdata *chr) return; } - chr_nav_tick_magic(chr, &chr->act_gopos.waydata, func0f0370a8(chr), &curwppos, curwprooms); + chr_nav_tick_magic(chr, &chr->act_gopos.waydata, chr_get_run_speed(chr), &curwppos, curwprooms); } else { bool advance = false; bool arrivingxyz; @@ -13069,7 +13057,7 @@ void chr_tick_patrol(struct chrdata *chr) func0f037580(chr); } else { // Continue magic - chr_nav_tick_magic(chr, &chr->act_patrol.waydata, func0f0370a8(chr), &sp58, sp48); + chr_nav_tick_magic(chr, &chr->act_patrol.waydata, chr_get_run_speed(chr), &sp58, sp48); } footstep_check_magic(chr); diff --git a/src/game/race.c b/src/game/race.c index ddf839b4b..ae544597d 100644 --- a/src/game/race.c +++ b/src/game/race.c @@ -43,10 +43,10 @@ s32 race_init_anim_group(struct attackanimconfig *configs) u16 angle = race_get_anim_sum_angle_as_int(config->animnum, 0, floor(config->unk04)); if (config->unk04 > 0) { - if (angle < 0x8000) { - config->unk08 = angle * 0.00009585853695171f / config->unk04; + if (angle < 32768) { + config->unk08 = angle * (1.0f / (32768 / M_BADPI)) / config->unk04; } else { - config->unk08 = (angle * 0.00009585853695171f - M_BADTAU) / config->unk04; + config->unk08 = (angle * (1.0f / (32768 / M_BADPI)) - M_BADTAU) / config->unk04; } } else { config->unk08 = 0; @@ -79,11 +79,11 @@ s32 race_count_anims(struct animtablerow *rows) return i; } -f32 race0f0005c0(s16 animnum) +f32 race_get_anim_avg_forward(s16 animnum) { f32 avgforward = race_get_anim_sum_forward_as_int(animnum, 0, anim_get_num_frames(animnum) - 1) / (f32) anim_get_num_frames(animnum); - var8005f014[animnum] = avgforward; + g_AnimAverageMoveDist[animnum] = avgforward; return avgforward * 0.1000000089407f; } @@ -108,8 +108,8 @@ void race_init_anims(void) } } - for (i = 0; var80067fdc[race][i].animnum >= 0; i++) { - var80067fdc[race][i].value = race0f0005c0(var80067fdc[race][i].animnum); + for (i = 0; g_ChrAvgAnimMoveDists[race][i].animnum >= 0; i++) { + g_ChrAvgAnimMoveDists[race][i].value = race_get_anim_avg_forward(g_ChrAvgAnimMoveDists[race][i].animnum); } } diff --git a/src/include/constants.h b/src/include/constants.h index 0648b08fa..7719db58a 100644 --- a/src/include/constants.h +++ b/src/include/constants.h @@ -109,11 +109,13 @@ #define TICKS(val) ((val) * 50 / 60) #define PALUP(val) ((val) * 60 / 50) #define PALUPF(val) ((val) * 1.2f) +#define PALDOWNF(val) ((val) * (1.0f / 1.2f)) #define FRAMEDURATION (1 / 50.0f) #else #define TICKS(val) (val) #define PALUP(val) (val) #define PALUPF(val) (val) +#define PALDOWNF(val) (val) #define FRAMEDURATION (1 / 60.0f) #endif diff --git a/src/include/data.h b/src/include/data.h index 3d5128891..449ac00c2 100644 --- a/src/include/data.h +++ b/src/include/data.h @@ -57,7 +57,7 @@ extern u32 g_NextAnimFrameIndex; extern s16 g_NumAnimations; extern struct animtableentry *g_Anims; extern u8 *g_AnimToHeaderSlot; -extern s16 *var8005f014; +extern s16 *g_AnimAverageMoveDist; extern s32 g_AnimMaxBytesPerFrame; extern s32 g_AnimMaxHeaderLength; extern bool g_AnimHostEnabled; @@ -180,7 +180,7 @@ extern s16 *g_BgChrnums; extern s32 g_NumBgChrs; extern s16 *g_TeamList; extern s16 *g_SquadronList; -extern struct var80067e6c *var80067fdc[]; +extern struct animdist *g_ChrAvgAnimMoveDists[]; extern s16 var80067ff0[]; extern f32 g_AutoAimScale; extern u32 g_TintedGlassEnabled; diff --git a/src/include/game/chraction.h b/src/include/game/chraction.h index e630e4387..eb6890a02 100644 --- a/src/include/game/chraction.h +++ b/src/include/game/chraction.h @@ -4,7 +4,7 @@ #include "data.h" #include "types.h" -f32 func0f02dff0(s16 animnum); +f32 chr_get_anim_movedist_per_frame(s16 animnum); bool chr_go_pos_is_waiting(struct chrdata *chr); bool weapon_is_one_handed(struct prop *prop); f32 chr_get_ranged_speed(struct chrdata *chr, f32 min, f32 max); @@ -68,7 +68,6 @@ bool chr_can_jump_in_direction(struct chrdata *chr, bool side, f32 distance); bool chr_is_room_off_screen(struct chrdata *chr, struct coord *waypos, RoomNum *wayrooms); void chr_go_pos_init_magic(struct chrdata *chr, struct waydata *waydata, struct coord *arg2, struct coord *prevpos); void chr_go_pos_get_cur_waypoint_info_with_flags(struct chrdata *chr, struct coord *pos, RoomNum *rooms, u32 *flags); -f32 func0f0370a8(struct chrdata *chr); s32 chr_go_pos_calculate_base_ttl(struct chrdata *chr); void chr_go_pos_consider_restart(struct chrdata *chr); void chr_go_pos_init_expensive(struct chrdata *chr); diff --git a/src/include/game/race.h b/src/include/game/race.h index 562121647..196f8989b 100644 --- a/src/include/game/race.h +++ b/src/include/game/race.h @@ -11,7 +11,6 @@ s32 race_get_anim_sum_forward_as_int(s16 animnum, s32 startframe, s32 endframe); s32 race_init_anim_group(struct attackanimconfig *configs); void race_init_anim_groups(struct attackanimgroup **groups); s32 race_count_anims(struct animtablerow *rows); -f32 race0f0005c0(s16 animnum); void race_init_anims(void); #endif diff --git a/src/include/lib/anim.h b/src/include/lib/anim.h index 8778522ab..8f4605e13 100644 --- a/src/include/lib/anim.h +++ b/src/include/lib/anim.h @@ -20,7 +20,7 @@ void anim_load_header(s16 animnum); s32 anim_read_bits(u8 *ptr, u8 readbitlen, u32 bitoffset); s32 anim_read_signed_short(u8 *arg0, u8 arg1, s32 arg2); void anim_get_rot_translate_scale(s32 part, bool flip, struct skeleton *skel, s16 animnum, u8 frameslot, struct coord *rot, struct coord *translate, struct coord *scale); -u16 anim_get_pos_angle_as_int(s32 part, bool flip, struct skeleton *skel, s16 animnum, s32 framenum, s16 inttranslate[3], bool arg6); +u16 anim_get_pos_angle_as_int(s32 part, bool flip, struct skeleton *skel, s16 animnum, s32 framenum, s16 inttranslate[3], bool use_cache); f32 anim_get_translate_angle(s32 part, bool flip, struct skeleton *skel, s16 animnum, s32 framenum, struct coord *pos, bool arg6); f32 anim_get_camera_value(s32 part, s16 animnum, u8 frameslot); diff --git a/src/include/types.h b/src/include/types.h index 8045441e1..dafeadc45 100644 --- a/src/include/types.h +++ b/src/include/types.h @@ -5294,7 +5294,7 @@ struct pakfileheader { u32 version : 1; // 0, but can be set to 1 using -forceversion argument }; -struct var80067e6c { +struct animdist { s16 animnum; f32 value; }; diff --git a/src/lib/anim.c b/src/lib/anim.c index 33725e29a..034e496ea 100644 --- a/src/lib/anim.c +++ b/src/lib/anim.c @@ -33,7 +33,7 @@ s32 g_NextAnimHeaderIndex = 0; s16 g_NumAnimations = 0; struct animtableentry *g_Anims = NULL; u8 *g_AnimToHeaderSlot = NULL; -s16 *var8005f014 = NULL; +s16 *g_AnimAverageMoveDist = NULL; s32 g_AnimMaxBytesPerFrame = 176; s32 g_AnimMaxHeaderLength = 608; bool g_AnimHostEnabled = false; @@ -71,7 +71,7 @@ void anims_init(void) g_AnimMaxBytesPerFrame = ALIGN16(g_AnimMaxBytesPerFrame + 34); g_AnimToHeaderSlot = memp_alloc(ALIGN64(g_NumAnimations), MEMPOOL_PERMANENT); - var8005f014 = memp_alloc(ALIGN64(g_NumAnimations * sizeof(*var8005f014)), MEMPOOL_PERMANENT); + g_AnimAverageMoveDist = memp_alloc(ALIGN64(g_NumAnimations * sizeof(*g_AnimAverageMoveDist)), MEMPOOL_PERMANENT); g_AnimFrameByteSlots = memp_alloc(ALIGN64(ANIM_FRAME_CACHE_SIZE * g_AnimMaxBytesPerFrame), MEMPOOL_PERMANENT); g_AnimFrameBytes = memp_alloc(ALIGN64(ANIM_FRAME_CACHE_SIZE * sizeof(*g_AnimFrameBytes)), MEMPOOL_PERMANENT); g_AnimFrameAnimNums = memp_alloc(ALIGN64(ANIM_FRAME_CACHE_SIZE * sizeof(*g_AnimFrameAnimNums)), MEMPOOL_PERMANENT); @@ -94,7 +94,7 @@ void anims_init_tables(void) for (i = 0; i < g_NumAnimations; i++) { g_AnimToHeaderSlot[i] = 0xff; - var8005f014[i] = 0; + g_AnimAverageMoveDist[i] = 0; } for (i = 0; i < ANIM_FRAME_CACHE_SIZE; i++) { @@ -610,7 +610,7 @@ void anim_get_rot_translate_scale(s32 part, bool flip, struct skeleton *skel, s1 * No data needs to be loaded by the caller - the function will ensure the * header and frame are loaded. */ -u16 anim_get_pos_angle_as_int(s32 part, bool flip, struct skeleton *skel, s16 animnum, s32 framenum, s16 inttranslate[3], bool arg6) +u16 anim_get_pos_angle_as_int(s32 part, bool flip, struct skeleton *skel, s16 animnum, s32 framenum, s16 inttranslate[3], bool use_cache) { u16 result = 0; s32 bitoffset; @@ -620,10 +620,10 @@ u16 anim_get_pos_angle_as_int(s32 part, bool flip, struct skeleton *skel, s16 an u8 *ptr; s32 i; - if (arg6) { + if (use_cache) { inttranslate[0] = 0; inttranslate[1] = 0; - inttranslate[2] = var8005f014[animnum]; + inttranslate[2] = g_AnimAverageMoveDist[animnum]; } else { anim_load_header(animnum); slot = anim_load_frame(animnum, framenum);