Files
perfect-dark/src/game/race.c
T
2023-08-20 16:48:35 +10:00

130 lines
3.0 KiB
C

#include <ultra64.h>
#include "constants.h"
#include "game/race.h"
#include "game/floor.h"
#include "bss.h"
#include "lib/anim.h"
#include "data.h"
#include "types.h"
u16 raceGetAnimSumAngleAsInt(s16 animnum, s32 frame, s32 endframe)
{
s16 inttranslate[3];
u16 sumangle = 0;
while (frame < endframe) {
sumangle += animGetPosAngleAsInt(0, false, &g_SkelChr, animnum, frame, inttranslate, false);
frame++;
}
return sumangle;
}
s32 raceGetAnimSumForwardAsInt(s16 animnum, s32 frame, s32 endframe)
{
s32 sumforward = 0;
s16 inttranslate[3];
while (frame < endframe) {
animGetPosAngleAsInt(0, false, &g_SkelChr, animnum, frame, inttranslate, false);
sumforward += inttranslate[2];
frame++;
}
return sumforward;
}
s32 raceInitAnimGroup(struct attackanimconfig *configs)
{
s32 count = 0;
struct attackanimconfig *config = configs;
while (config->animnum != 0) {
u16 angle = raceGetAnimSumAngleAsInt(config->animnum, 0, floor(config->unk04));
if (config->unk04 > 0) {
if (angle < 0x8000) {
config->unk08 = angle * 0.00009585853695171f / config->unk04;
} else {
config->unk08 = (angle * 0.00009585853695171f - M_BADTAU) / config->unk04;
}
} else {
config->unk08 = 0;
}
config++;
count++;
}
return count;
}
void raceInitAnimGroups(struct attackanimgroup **groups)
{
s32 i;
for (i = 0; i < 32; i++) {
if (groups[i]->len < 0) {
groups[i]->len = raceInitAnimGroup(groups[i]->animcfg);
}
}
}
s32 raceCountAnims(struct animtablerow *rows)
{
s32 i;
for (i = 0; rows[i].animnum > 0; i++);
return i;
}
f32 race0f0005c0(s16 animnum)
{
f32 avgforward = raceGetAnimSumForwardAsInt(animnum, 0, animGetNumFrames(animnum) - 1) / (f32) animGetNumFrames(animnum);
var8005f014[animnum] = avgforward;
return avgforward * 0.1000000089407f;
}
void raceInitAnims(void)
{
s32 race;
s32 i;
for (race = 0; race < ARRAYCOUNT(g_AnimTablesByRace); race++) {
for (i = 0; g_AnimTablesByRace[race][i].hitpart != -1; i++) {
if (g_AnimTablesByRace[race][i].deathanims) {
g_AnimTablesByRace[race][i].deathanimcount = raceCountAnims(g_AnimTablesByRace[race][i].deathanims);
} else {
g_AnimTablesByRace[race][i].deathanimcount = 0;
}
if (g_AnimTablesByRace[race][i].injuryanims) {
g_AnimTablesByRace[race][i].injuryanimcount = raceCountAnims(g_AnimTablesByRace[race][i].injuryanims);
} else {
g_AnimTablesByRace[race][i].injuryanimcount = 0;
}
}
for (i = 0; var80067fdc[race][i].animnum >= 0; i++) {
var80067fdc[race][i].value = race0f0005c0(var80067fdc[race][i].animnum);
}
}
raceCountAnims(g_AnimTableHumanSlumped);
for (race = 0; race < 2; race++) {
raceInitAnimGroups(g_StandHeavyAttackAnims[race]);
raceInitAnimGroups(g_StandLightAttackAnims[race]);
raceInitAnimGroups(g_StandDualAttackAnims[race]);
raceInitAnimGroups(g_KneelHeavyAttackAnims[race]);
raceInitAnimGroups(g_KneelLightAttackAnims[race]);
raceInitAnimGroups(g_KneelDualAttackAnims[race]);
}
raceInitAnimGroup(g_RollAttackAnims);
raceInitAnimGroup(g_WalkAttackAnims);
}