Files
banjo-kazooie/src/core1/code_3A70.c
2022-07-31 19:44:09 -05:00

626 lines
18 KiB
C

#include <ultra64.h>
#include "functions.h"
#include "variables.h"
#include "n_libaudio.h"
void func_802444C0(N_AL_Struct81s *arg0);
void func_80244050(ALEventQueue *arg0, N_AL_Struct81s *arg1, u16 arg2);
extern Gfx D_80275880[];
extern f64 D_80277650;
extern f64 D_80277658;
/* .code */
void func_80241490(Gfx **gfx, Vtx **vtx, s32 *arg2[3], s32 arg3[3], s32 arg4[3], s32 arg5[3], s32 arg6, s32 arg7) {
s32 spB4[3];
s32 var_a0;
s32 var_v0;
s32 var_v1;
s32 sp78[3][4];
s32 i;
func_8024C5F0(&spB4);
gSPDisplayList((*gfx)++, D_80275880);
if (arg6 != 0) {
gSPSetGeometryMode((*gfx)++, G_ZBUFFER | G_CULL_BACK);
} else {
gSPSetGeometryMode((*gfx)++, G_ZBUFFER | G_CULL_FRONT);
}
gSPVertex((*gfx)++, *vtx, 8, 0);
for(i = 0; i < 2; i++){
for(var_a0 = 0; var_a0 < 2; var_a0++){
for(var_v1 = 0; var_v1 < 2; var_v1++){
var_v0 = (var_v1 == 0) ? arg2[0] : arg3[0];
(*vtx)->v.ob[0] = (s16) (var_v0 - spB4[0]);
var_v0 = (i == 0) ? arg2[1] : arg3[1];
(*vtx)->v.ob[1] = (s16) (var_v0 - spB4[1]);
var_v0 = (var_a0 == 0) ? arg2[2] : arg3[2];
(*vtx)->v.ob[2] = (s16) (var_v0 - spB4[2]);
(*vtx)->v.flag = 0;
(*vtx)->v.tc[0] = 0;
(*vtx)->v.tc[1] = 0;
(*vtx)->v.cn[0] = 0;
(*vtx)->v.cn[1] = 0;
(*vtx)->v.cn[2] = 0;
(*vtx)->v.cn[3] = 0;
(*vtx)++;
}
}
}
if (arg7 != 0) {
for(i = 0; i < 3; i++){
for(var_v1 = 0; var_v1 < 3; var_v1++){
sp78[i][var_v1] = (arg4[var_v1] * arg5[i]) / 255;
}
sp78[i][3] = 0xFF;
}
} else {
for(i = 0; i < 3; i++){
for(var_v1 = 0; var_v1 < 3; var_v1++){
sp78[i][var_v1] = arg4[var_v1];
}
sp78[i][3] = arg5[i];
}
}
gDPPipeSync((*gfx)++);
gDPSetPrimColor((*gfx)++, 0, 0, sp78[0][0], sp78[0][1], sp78[0][2], sp78[0][3]);
gSP2Triangles((*gfx)++, 7, 3, 5, 0, 5, 3, 1, 0);
gSP1Quadrangle((*gfx)++, 6, 4, 0, 2, 0);
gDPPipeSync((*gfx)++);
gDPSetPrimColor((*gfx)++, 0, 0, sp78[1][0], sp78[1][1], sp78[1][2], sp78[1][3]);
gSP1Quadrangle((*gfx)++, 7, 6, 2, 3, 0);
gSP2Triangles((*gfx)++, 4, 5, 0, 0, 5, 1, 0, 0);
gDPPipeSync((*gfx)++);
gDPSetPrimColor((*gfx)++, 0, 0, sp78[2][0], sp78[2][1], sp78[2][2], sp78[2][3]);
gSP1Quadrangle((*gfx)++, 5, 4, 6, 7, 0);
gSP2Triangles((*gfx)++, 0, 1, 2, 0, 1, 3, 2, 0);
}
#pragma GLOBAL_ASM("asm/nonmatchings/core1/code_3A70/func_80241928.s")
void func_802424D4(Gfx **gfx, Mtx **mtx, Vtx **vtx, f32 arg3[3], f32 arg4[3], f32 arg5, s32 arg6[4]) {
s32 var_a0;
s32 var_v0;
s32 var_v1;
f32 sp80[3];
f32 sp74[3];
f32 sp68[3];
f32 sp5C[3];
f32 sp50[3];
f32 sp44[3];
sp50[0] = arg4[0];
sp50[1] = arg4[1];
sp50[2] = arg4[2];
if ((arg3[0] != sp50[0]) || (arg3[1] != sp50[1]) || (arg3[2] != sp50[2])) {
if ((arg3[0] == sp50[0]) && (arg3[2] == sp50[2])) {
sp50[0] += D_80277658;
}
sp80[0] = sp50[0] - arg3[0];
sp80[1] = sp50[1] - arg3[1];
sp80[2] = sp50[2] - arg3[2];
ml_vec3f_normalize_copy(sp44, sp80);
sp74[0] = -sp44[2];
sp74[1] = 0.0f;
sp74[2] = sp44[0];
ml_vec3f_normalize(sp74);
sp74[0] *= arg5;
sp74[1] *= arg5;
sp74[2] *= arg5;
sp68[0] = (sp44[1] * sp74[2]) - (sp44[2]*sp74[1]);
sp68[1] = (sp44[2] * sp74[0]) - (sp44[0]*sp74[2]);
sp68[2] = (sp44[0] * sp74[1]) - (sp44[1]*sp74[0]);
ml_vec3f_normalize(sp68);
sp68[0] *= arg5;
sp68[1] *= arg5;
sp68[2] *= arg5;
func_8024C5CC(sp5C);
gSPDisplayList((*gfx)++, D_80275880);
gSPSetGeometryMode((*gfx)++, G_ZBUFFER);
gSPVertex((*gfx)++, *vtx, 8, 0);
for( var_a0 = 0; var_a0 < 2; var_a0++){
for(var_v0 = -1; var_v0 < 3; var_v0+=2) {
(*vtx)->v.ob[0] = (arg3[0] + (var_a0 * sp80[0]) + (var_v0 * sp74[0])) - sp5C[0];
(*vtx)->v.ob[1] = (arg3[1] + (var_a0 * sp80[1]) + (var_v0 * sp74[1])) - sp5C[1];
(*vtx)->v.ob[2] = (arg3[2] + (var_a0 * sp80[2]) + (var_v0 * sp74[2])) - sp5C[2];
(*vtx)->v.tc[0] = 0;
(*vtx)->v.tc[1] = 0;
(*vtx)->v.cn[0] = 0;
(*vtx)->v.cn[1] = 0;
(*vtx)->v.cn[2] = 0;
(*vtx)->v.cn[3] = 0;
(*vtx)++;
}
}
for( var_a0 = 0; var_a0 < 2; var_a0++){
for(var_v0 = -1; var_v0 < 3; var_v0+=2) {
(*vtx)->v.ob[0] = (arg3[0] + (var_a0 * sp80[0]) + (var_v0 * sp68[0])) - sp5C[0];
(*vtx)->v.ob[1] = (arg3[1] + (var_a0 * sp80[1]) + (var_v0 * sp68[1])) - sp5C[1];
(*vtx)->v.ob[2] = (arg3[2] + (var_a0 * sp80[2]) + (var_v0 * sp68[2])) - sp5C[2];
(*vtx)->v.tc[0] = 0;
(*vtx)->v.tc[1] = 0;
(*vtx)->v.cn[0] = 0;
(*vtx)->v.cn[1] = 0;
(*vtx)->v.cn[2] = 0;
(*vtx)->v.cn[3] = 0;
(*vtx)++;
}
}
gDPPipeSync((*gfx)++);
gDPSetPrimColor((*gfx)++, 0, 0, arg6[0], arg6[1], arg6[2], arg6[3]);
gSP1Quadrangle((*gfx)++, 0, 1, 3, 2, 0);
gSP1Quadrangle((*gfx)++, 4, 5, 7, 6, 0);
}
}
#pragma GLOBAL_ASM("asm/nonmatchings/core1/code_3A70/func_80242BE8.s")
// BREAK???===
extern struct{
N_AL_Struct81s *unk0;
N_AL_Struct81s *unk4;
N_AL_Struct81s *unk8;
}D_802758C0;
extern N_ALSndPlayer *D_802758CC;
extern s32 D_802758D0;
extern s16 D_802758D4;
extern ALEventUnknown;
u8 pad_8027EEC0[0x54];
u16 *D_8027EF14;
extern struct {
u8 pad0[4];
s32 volume[3];
}D_8027EF18;
#pragma GLOBAL_ASM("asm/nonmatchings/core1/code_3A70/func_80243070.s")
// void func_80243070(void *arg0) {
// s16 sp40;
// ALLink *temp_a0;
// s32 var_s1;
// s32 var_v0;
// u32 var_s0;
// u32 var_s0_2;
// void *temp_s0;
// void *temp_s0_2;
// void *temp_s0_3;
// D_802758CC->maxSounds = (s32) arg0->unk8;
// D_802758CC->target = NULL;
// D_802758CC->frameTime = 33000;
// ;
// D_802758CC->sndState = alHeapDBAlloc(NULL, 0, arg0->unkC, 1, arg0->unk0 * sizeof(N_AL_Struct81s));
// alEvtqNew(&D_802758CC->evtq, alHeapDBAlloc(NULL, 0, arg0->unkC, 1, arg0->unk4 * 0x1C), arg0->unk4);
// // var_s0 = 1;
// // var_s1 = 0x50;
// D_802758C0.unk8 = D_802758CC->sndState;
// if ((u32) arg0->unk0 >= 2U) {
// do {
// temp_a0 = var_s1 + D_802758CC->unk40;
// alLink(temp_a0, temp_a0 - 0x50);
// var_s0 += 1;
// var_s1 += 0x50;
// } while (var_s0 < (u32) arg0->unk0);
// }
// D_8027EF14 = alHeapDBAlloc(NULL, 0, arg0->unkC, 2, (s32) arg0->unk10);
// var_v0 = 0;
// var_s0_2 = 0;
// if (arg0->unk10 != 0) {
// do {
// var_s0_2 += 1;
// *(D_8027EF14 + var_v0) = 0x7FFF;
// var_v0 += 2;
// } while (var_s0_2 < (u16) arg0->unk10);
// }
// D_802758CC->unk0 = 0;
// D_802758CC->unk8 = &func_8024324C;
// temp_s0 = D_802758CC;
// temp_s0->unk4 = temp_s0;
// n_alSynAddSndPlayer(D_802758CC);
// temp_s0_2 = D_802758CC;
// sp40 = 0x20;
// alEvtqPostEvent(temp_s0_2 + 0x14, (ALEvent *) &sp40, temp_s0_2->unk48);
// temp_s0_3 = D_802758CC;
// D_802758CC->unk4C = alEvtqNextEvent(temp_s0_3 + 0x14, temp_s0_3 + 0x28);
// }
#ifndef NONMATCHING
#pragma GLOBAL_ASM("asm/nonmatchings/core1/code_3A70/func_8024324C.s")
#else
void func_8024324C(N_ALSndPlayer *arg0) {
N_ALEvent sp3C;
do {
if (arg0->nextEvent.type == 0x20) {
sp3C.type = 0x20;
alEvtqPostEvent(&arg0->evtq, (ALEvent *) &sp3C, arg0->frameTime);
func_80244190(arg0);
} else {
func_802432F8(arg0, &arg0->nextEvent);
}
arg0->nextDelta = alEvtqNextEvent(&arg0->evtq, &arg0->nextEvent);
} while (arg0->nextDelta == 0);
arg0->curTime += arg0->nextDelta;
}
#endif
#pragma GLOBAL_ASM("asm/nonmatchings/core1/code_3A70/func_802432F8.s")
void func_80243F84(N_AL_Struct81s *arg0) {
if (arg0->unk3F & 4) {
n_alSynStopVoice(&arg0->voice);
n_alSynFreeVoice(&arg0->voice);
}
func_802444C0(arg0);
func_80244050(&D_802758CC->evtq, arg0, 0xFFFF);
}
void func_80243FE4(N_AL_Struct81s *arg0) {
ALEvent evt;
f32 sp1C;
sp1C = alCents2Ratio(arg0->unk8->keyMap->detune)* arg0->unk2C;
evt.type = 0x10;
evt.msg.unk3A70.unk0 = arg0;
evt.msg.unk3A70.unk4 = reinterpret_cast(s32, sp1C);
alEvtqPostEvent(&D_802758CC->evtq, &evt, 33333);
}
void func_80244050(ALEventQueue *arg0, N_AL_Struct81s *arg1, u16 arg2) {
s32 pad[5];
u32 mask;
ALEventListItem *next_event_list;
ALEventListItem *event_list;
mask = osSetIntMask(OS_IM_NONE);
for(event_list = (ALEventListItem *)arg0->allocList.next; event_list != NULL; event_list = next_event_list) {
next_event_list = (ALEventListItem *)event_list->node.next;
if ((arg1 == event_list->evt.msg.unk3A70.unk0) && (reinterpret_cast(u16, event_list->evt.type) & arg2)) {
if (next_event_list != NULL) {
next_event_list->delta += event_list->delta;
}
alUnlink((ALLink *)event_list);
alLink((ALLink *)event_list, (ALLink *)arg0);
}
}
osSetIntMask(mask);
}
s32 func_80244110(u16 *arg0, u16 *arg1) {
N_AL_Struct81s *var_v0;
N_AL_Struct81s *var_v1_2;
N_AL_Struct81s *var_a2;
u16 var_a0;
u16 var_a3;
u16 var_v1;
var_v0 = D_802758C0.unk0;
var_v1_2 = D_802758C0.unk8;
var_a2 = D_802758C0.unk4;
for(var_a3 = 0; var_v0 != NULL; var_a3++){
var_v0 = (N_AL_Struct81s *) var_v0->node.next;
}
for(var_a0 = 0; var_v1_2 != NULL; var_a0++) {
var_v1_2 = (N_AL_Struct81s *) var_v1_2->node.next;
}
for(var_v1 = 0; var_a2 != NULL; var_v1++) {
var_a2 = (N_AL_Struct81s *) var_a2->node.prev;
}
*arg0 = var_a0;
*arg1 = var_a3;
return var_v1;
}
#ifndef NONMATCHING
#pragma GLOBAL_ASM("asm/nonmatchings/core1/code_3A70/func_80244190.s")
#else
void func_80244190(N_AL_Struct81s *arg0) {
ALMicroTime *temp_a1;
s32 prev_volume;
s32 temp_t1;
s32 temp_t5;
s32 var_t0;
ALMicroTime var_t1;
u8 temp_t6;
u8 var_a2;
ALEnvelope *envelope;
N_AL_Struct81s *var_v0;
N_AL_Struct81s *var_v1;
for(var_v0 = D_802758C0.unk0; var_v0 != NULL; var_v0 = (N_AL_Struct81s *)var_v0->node.next){
var_v1 = var_v0;
envelope = var_v0->unk8->envelope;
temp_a1 = &envelope->attackTime;
D_8027EF18.volume[AL_PHASE_ATTACK] = (s32) envelope->attackVolume;
D_8027EF18.volume[AL_PHASE_DECAY] = (s32) envelope->decayVolume;
while( var_v0->envPhase < AL_PHASE_RELEASE
&& var_v0->unk48 >= temp_a1[var_v0->envPhase]
&& temp_a1[var_v0->envPhase] != -1
){
var_v0->unk48 -= temp_a1[var_v0->envPhase];
var_v0->envPhase++;
}
if (var_v0->envPhase < AL_PHASE_RELEASE) {
if (temp_a1[var_v1->envPhase] != -1) {
var_v0->unk44 = D_8027EF18.volume[var_v0->envPhase - 1] + ((s32) ((D_8027EF18.volume[var_v0->envPhase] - D_8027EF18.volume[var_v0->envPhase - 1]) * var_v0->unk48) / temp_a1[var_v0->envPhase]);
} else {
var_v0->unk44 = D_8027EF18.volume[var_v0->envPhase - 1]; //
}
}
var_v0->unk48 += arg0->unk48;
}
}
#endif
#ifndef NONMATCHING
#pragma GLOBAL_ASM("asm/nonmatchings/core1/code_3A70/func_8024431C.s")
#else
N_AL_Struct81s *func_8024431C(ALBank *bank, ALSound *sound) {
s32 pad;
ALKeyMap *sp30;
N_AL_Struct81s *temp_s0;
OSIntMask mask;
s32 sp24;
temp_s0 = D_802758C0.unk8;
sp30 = sound->keyMap;
if (temp_s0 != NULL) {
mask = osSetIntMask(OS_IM_NONE);
D_802758C0.unk8 = (N_AL_Struct81s *) temp_s0->unk0.next;
alUnlink((ALLink *)temp_s0);
if (D_802758C0.unk0 != NULL) {
temp_s0->unk0.next = D_802758C0.unk0;
temp_s0->unk0.prev = NULL;
D_802758C0.unk0->unk0.prev = temp_s0;
D_802758C0.unk0 = temp_s0;
} else {
temp_s0->unk0.prev = NULL;
temp_s0->unk0.next = NULL;
D_802758C0.unk0 = temp_s0;
D_802758C0.unk4 = temp_s0;
}
osSetIntMask(mask);
sp24 = ((sound->envelope->decayTime + 1) == 0) + 0x40;
temp_s0->unk36 = sp24;
temp_s0->unk40 = 5;
temp_s0->unk38 = 2;
temp_s0->unk8 = sound;
temp_s0->unk2C = 1.0f;
temp_s0->unk3F = sp30->keyMax & 0xF0;
temp_s0->unk30 = 0;
temp_s0->envPhase = AL_PHASE_ATTACK;
temp_s0->unk44 = 0.0f;
temp_s0->unk48 = 0;
if (temp_s0->unk3F & 0x20) {
temp_s0->unk28 = alCents2Ratio((sp30->keyBase * 0x64) - 0x1770);
} else {
temp_s0->unk28 = alCents2Ratio(((sp30->keyBase * 0x64) + sp30->detune) - 0x1770);
}
if (sp24 != 0x40) {
temp_s0->unk3F |= 2;
}
temp_s0->unk3E = 0;
temp_s0->unk3D = 0x40;
temp_s0->unk34 = 0x7FFF;
}
return temp_s0;
}
#endif
void func_802444C0(N_AL_Struct81s *arg0){
N_AL_Struct81s *var_v0;
sizeof(ALVoice);
var_v0 = D_802758C0.unk0;
if(arg0 == D_802758C0.unk0){
D_802758C0.unk0 = (N_AL_Struct81s *)arg0->node.next;
}
if(arg0 == D_802758C0.unk4){
D_802758C0.unk4 = (N_AL_Struct81s *)arg0->node.prev;
}
alUnlink((ALLink *)arg0);
if(D_802758C0.unk8 != NULL){
arg0->node.next = (ALLink *)D_802758C0.unk8;
arg0->node.prev = NULL;
D_802758C0.unk8->node.prev = (ALLink *)arg0;
D_802758C0.unk8 = arg0;
}
else{
arg0->node.prev = NULL;
arg0->node.next = NULL;
D_802758C0.unk8 = arg0;
}
if(arg0->unk3F & 0x4){
D_802758D4--;
}
arg0->unk40 = 0;
if(arg0->unk30 != NULL){
if(*arg0->unk30 == arg0){
*arg0->unk30 = NULL;
}
arg0->unk30 = NULL;
}
}
void func_80244594(N_AL_Struct81s *arg0, u8 arg1){
if(arg0 != NULL)
arg0->unk36 = arg1;
}
s32 func_802445AC(N_AL_Struct81s *arg0){
if(arg0 != NULL)
return arg0->unk40;
return 0;
}
bool func_802445C4(ALBank *bank, s16 arg1){
ALSound *snd = bank->instArray[0]->soundArray[arg1-1];
if (snd->envelope->decayTime == -1)
return TRUE;
else
return FALSE;
}
void *func_80244608(ALBank *bank, s16 arg1, struct46s *arg2) {
ALKeyMap *temp_v0_2;
ALSound *temp_s2;
N_AL_Struct81s *temp_v0;
s32 var_s3;
s16 sp6E;
s32 sp68;
s32 var_s4;
N_AL_Struct81s *var_fp;
ALEvent sp50;
ALEvent sp40;
var_fp = NULL;
sp6E = 0;
var_s3 = 0;
if (arg1 == 0) {
return NULL;
}
do{
temp_s2 = bank->instArray[0]->soundArray[arg1-1];
temp_v0 = func_8024431C(bank, temp_s2);
if (temp_v0 != NULL) {
temp_v0->unk4C = (s32) (arg1 - 1);
D_802758CC->target = temp_v0;
sp50.type = AL_SEQ_MIDI_EVT;
((s32 *)&sp50.msg)[0] = temp_v0;
var_s4 = temp_s2->keyMap->velocityMax * 0x8235;
if (temp_v0->unk3F & 0x10) {
temp_v0->unk3F &= ~(0x10);
alEvtqPostEvent(&D_802758CC->evtq, (ALEvent *) &sp50, var_s3 + 1);
sp68 = var_s4 + 1;
sp6E = arg1;
} else {
alEvtqPostEvent(&D_802758CC->evtq, (ALEvent *) &sp50, var_s4 + 1);
}
var_fp = temp_v0;
}
temp_v0_2 = temp_s2->keyMap;
var_s3 += var_s4;
arg1 = temp_v0_2->velocityMin + ((temp_v0_2->keyMin & 0xC0) * 4);
} while (arg1 != 0 && temp_v0 != NULL);
if (var_fp != NULL) {
var_fp->unk3F |= 1;
var_fp->unk30 = arg2;
if (sp6E != 0) {
var_fp->unk3F |= 0x10;
sp40.type = 0x200;
((s32 *)&sp40.msg)[0] = var_fp;
((s32 *)&sp40.msg)[1] = sp6E;
((s32 *)&sp40.msg)[2] = bank;
alEvtqPostEvent(&D_802758CC->evtq, &sp40, sp68);
}
}
if (arg2 != NULL) {
arg2->unk0 = (s32) var_fp;
}
return var_fp;
}
void func_80244814(N_AL_Struct81s *arg0){
ALEvent evt;
evt.type = 0x400;
((s32 *)&evt.msg)[0] = arg0;
if(arg0 != NULL){
arg0->unk3F &= ~(0x10);
alEvtqPostEvent(&D_802758CC->evtq, &evt, 0);
}
}
void func_80244860(u8 arg0) {
OSIntMask mask;
ALEvent evt;
N_AL_Struct81s *var_s0;
mask = osSetIntMask(1U);
for(var_s0 = D_802758C0.unk0; var_s0 != NULL; var_s0 = (N_AL_Struct81s *)var_s0->node.next){
evt.type = 0x400;
((s32 *)&evt.msg)[0] = (s32)var_s0;
if ((var_s0->unk3F & arg0) == arg0) {
var_s0->unk3F &= ~(0x10);
alEvtqPostEvent(&D_802758CC->evtq, &evt, 0);
}
}
osSetIntMask(mask);
}
void func_80244918(void){
func_80244860(1);
}
void func_80244938(void){
func_80244860(0x11);
}
void func_80244958(void){
func_80244860(3);
}
void func_80244978(s32 arg0, s16 type, s32 arg2){
ALEvent sp18;
if(arg0){
sp18.type = type;
((s32 *)&sp18.msg)[0] = arg0;
((s32 *)&sp18.msg)[1] = arg2;
alEvtqPostEvent(&D_802758CC->evtq, &sp18, 0);
}
}
s32 func_802449C4(u8 arg0){
return D_8027EF14[arg0];
}
void func_802449E4(u8 arg0, u16 arg1) {
N_AL_Struct81s *var_s0;
s32 pad30;
ALEvent evt;
var_s0 = D_802758C0.unk0;
D_8027EF14[arg0] = arg1;
while(var_s0 != NULL){
if ((var_s0->unk8->keyMap->keyMin & 0x3F) == arg0) {
evt.type = 0x800;
((s32 *)&evt.msg)[0] = var_s0;
alEvtqPostEvent(&D_802758CC->evtq, &evt, 0);
}
var_s0 = (N_AL_Struct81s *)var_s0->node.next;
}
}
void func_80244A98(s32 arg0){
D_802758D0 = arg0;
}