Discover chr anim run speeds

This commit is contained in:
Ryan Dwyer 2024-08-18 11:00:56 +10:00
parent 6d1ab5e6e9
commit 504cdb1f78
9 changed files with 81 additions and 93 deletions

View File

@ -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);

View File

@ -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);
}
}

View File

@ -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

View File

@ -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;

View File

@ -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);

View File

@ -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

View File

@ -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);

View File

@ -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;
};

View File

@ -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);