From 467a1371cf72ccb279c42a83dc9d6de2fa323cb6 Mon Sep 17 00:00:00 2001 From: queueRAM Date: Wed, 4 Mar 2026 07:26:49 +0000 Subject: [PATCH 1/2] Decompile app/balls - Decompile func_802CAD00 - Decompile func_802CADE8 - Decompile func_802CAF50 - Decompile func_802CB094 - Decompile func_802CB2FC - Decompile func_802CB35C - Decompile func_802CB3F8 - Decompile func_802CB56C - Decompile func_802CB6D4 - Decompile func_802CB9B4 - Decompile func_802CC064 - Decompile func_802CC0D4 - Decompile func_802CC13C - Decompile func_802CC1B0 - Decompile func_802CC270 - Decompile func_802CC39C - Decompile func_802CC51C - Decompile func_802CC55C - Decompile func_802CD0F8 - Decompile func_802CD2E8 - Decompile func_802CE0A4 - Decompile func_802DB050 - Decompile func_802DBF10 - Decompile func_803342F0 - Decompile func_803342FC - Decompile func_803343D8 - Decompile func_80334454 - Decompile ballsCollision - Decompile ballsPhysics - Name balls functions and variables - Add LevelBALS struct - Redo Unk802D3658_Arg0 structs - Name birdman functions Co-authored-by: inspectredc <78732756+inspectredc@users.noreply.github.com> Co-authored-by: Dominik Peters --- config/us/sym/symbol_addrs_app.txt | 30 +- include/uv_level.h | 135 +-- include/uv_model.h | 2 +- src/app/balls.c | 1334 +++++++++++++++++++++++++++- src/app/balls.h | 71 +- src/app/bmsound.c | 1 + src/app/bmsound.h | 7 + src/app/cannonball.c | 10 +- src/app/code_556C0.c | 1 + src/app/code_556C0.h | 10 + src/app/code_5A6A0.c | 44 +- src/app/code_5A6A0.h | 2 - src/app/code_61A60.c | 89 +- src/app/code_61A60.h | 6 +- src/app/code_66160.c | 4 +- src/app/code_66160.h | 6 + src/app/code_72B70.h | 129 +++ src/app/code_7FED0.h | 1 + src/app/code_B2900.c | 2 +- src/app/fdr.h | 5 +- src/app/hud.h | 1 + src/app/shadow.c | 48 +- src/app/shadow.h | 9 + src/app/snap.h | 2 + src/app/task.c | 16 +- src/app/test_menu.c | 4 +- 26 files changed, 1824 insertions(+), 145 deletions(-) create mode 100644 src/app/bmsound.h create mode 100644 src/app/code_556C0.h diff --git a/config/us/sym/symbol_addrs_app.txt b/config/us/sym/symbol_addrs_app.txt index aa59deda..2086e22e 100644 --- a/config/us/sym/symbol_addrs_app.txt +++ b/config/us/sym/symbol_addrs_app.txt @@ -6,8 +6,31 @@ app_firstfunc = 0x802CA900; // type:func +ballsInit = 0x802CAD00; // type:func +ballsInitBall = 0x802CADE8; // type:func +balls_802CAF50 = 0x802CAF50; // type:func +ballsLoad = 0x802CB094; // type:func +ballsMotionUpdate = 0x802CB2FC; // type:func +ballsDeinit = 0x802CB35C; // type:func +ballsFrameUpdate = 0x802CB3F8; // type:func +ballsFrameUpdateOne = 0x802CB56C; // type:func +balls_802CB6D4 = 0x802CB6D4; // type:func +balls_802CB9B4 = 0x802CB9B4; // type:func ballsCollision = 0x802CBC9C; // type:func -ballsPhysics = 0x802CBE94; // type:func +ballsPopped = 0x802CBE94; // type:func +ballsGet_802CC064 = 0x802CC064; // type:func +balls_802CC0D4 = 0x802CC0D4; // type:func +ballsGetCount = 0x802CC13C; // type:func +ballsGet_802CC15C = 0x802CC15C; // type:func + +bird_802CC1B0 = 0x802CC1B0; // type:func +bird_802CC270 = 0x802CC270; // type:func +bird_802CC39C = 0x802CC39C; // type:func +bird_802CC51C = 0x802CC51C; // type:func +bird_802CC55C = 0x802CC55C; // type:func +bird_802CD0F8 = 0x802CD0F8; // type:func +bird_802CD2E8 = 0x802CD2E8; // type:func +bird_802CE0A4 = 0x802CE0A4; // type:func bonusStar_802D25AC = 0x802D25AC; // type:func @@ -362,6 +385,11 @@ gClassShortNames = 0x80350988; // size:0x10 gVehShortNames = 0x80350998; // size:0x1C gCurTestIdx = 0x803509B4; +gBallCount = 0x80357210; +gBallSplitCount = 0x80357211; +gBalls = 0x80357218; // size:0x2170 +sRefBALS = 0x8035938C; + sOptionsPanel = 0x8036C120; // type:s16 sStickHeld = 0x8036C124; sGameComplete = 0x8036C128; diff --git a/include/uv_level.h b/include/uv_level.h index d2895af1..14347fad 100644 --- a/include/uv_level.h +++ b/include/uv_level.h @@ -69,17 +69,32 @@ typedef struct Unk802D3658_Unk230 { typedef struct { s32 unk0; - u8 pad4[0x18]; + Vec3F unk4; + Vec3F unk10; Vec3F unk1C; Vec3F unk28; -} Unk802D3658_Unk1120; +} Unk802D3658_Unk1120; // size = 0x34 typedef struct { s32 unk0; - u8 pad4[0x24]; + Unk802D3658_Unk1120 unk4[5]; +} Unk802D3658_Unk111C; // size = 0x108 + +typedef struct { + s32 unk0; + s32 unk4; + s32 unk8; + u8 pad8[0xC]; + f32 unk18; + Vec3F unk1C; Vec3F unk28; Vec3F unk34; -} Unk802D3658_Unk1228; +} Unk802D3658_Unk1228; // size = 0x40 + +typedef struct { + s32 unk0; + Unk802D3658_Unk1228 unk4[5]; +} Unk802D3658_Unk1224; // size = 0x144 typedef struct { u8 unk0; @@ -118,9 +133,7 @@ typedef struct { f32 unk5C; f32 unk60; f32 unk64; - f32 unk68; - f32 unk6C; - f32 unk70; + Vec3F unk68; f32 unk74; f32 unk78; f32 unk7C; @@ -159,13 +172,8 @@ typedef struct { u8 pad1108[0x1114 - 0x1108]; u8 unk1114; u8 pad1115[0x111C - 0x1115]; - - s32 unk111C; - Unk802D3658_Unk1120 unk1120[5]; // 1120:1223 - - s32 unk1224; - Unk802D3658_Unk1228 unk1228[5]; // 1228:1367 - + Unk802D3658_Unk111C unk111C; + Unk802D3658_Unk1224 unk1224; f32 unk1368; f32 unk136C; f32 unk1370; @@ -217,6 +225,33 @@ typedef struct { s32 unkA8; } Unk80362690; +typedef struct { + Vec3F pos; + u8 padC[0x18 - 0xC]; + s32 unk18; + f32 unk1C; + u8 type; // 0x20 + u8 unk21; + u8 pad22[0x24 - 0x22]; + f32 unk24; + f32 unk28; + f32 unk2C; + f32 scale; // 0x30 + s32 unk34; + s32 unk38; + f32 unk3C; + f32 unk40; + u8 pad44[4]; + f32 unk48; + f32 unk4C; + f32 unk50; + s32 unk54; + s32 unk58; + f32 unk5C; + f32 unk60; + f32 unk64; +} LevelBALS; + typedef struct { Vec3F pos; Vec3F angle; @@ -329,42 +364,42 @@ typedef struct { f32 unk404; f32 unk408; u8 unk40C[0x10]; - u8 countTHER; // count THER - u8 countLWIN; // count LWIN - u8 countTPAD; // count TPAD - u8 countLPAD; // count LPAD - u8 countLSTP; // count LSTP - u8 countRNGS; // count RNGS - u8 countBALS; // count BALS - u8 countTARG; // count TARG - u8 countHPAD; // count HPAD - u8 countBTGT; // count BTGT - u8 countPHTS; // count PHTS - u8 countFALC; // count FALC - u8 countSDFM; // count SDFM - u8 countCNTG; // count CNTG - u8 countHOPD; // count HOPD - u8 countOBSV; // count OBSV + u8 countTHER; + u8 countLWIN; + u8 countTPAD; + u8 countLPAD; + u8 countLSTP; + u8 countRNGS; + u8 countBALS; + u8 countTARG; + u8 countHPAD; + u8 countBTGT; + u8 countPHTS; + u8 countFALC; + u8 countSDFM; + u8 countCNTG; + u8 countHOPD; + u8 countOBSV; } comm; - void* dataNAME; // ptr NAME - void* dataINFO; // ptr INFO - void* dataJPTX; // ptr JPTX - LevelTHER* dataTHER; // ptr THER - void* dataLWIN; // ptr LWIN - void* dataTPAD; // ptr TPAD - void* dataLPAD; // ptr LPAD - void* dataLSTP; // ptr LSTP - void* dataRNGS; // ptr RNGS - void* dataBALS; // ptr BALS - void* dataTARG; // ptr TARG - void* dataHPAD; // ptr HPAD - void* dataBTGT; // ptr BTGT - void* dataPHTS; // ptr PHTS - void* dataFALC; // ptr FALC - void* dataSDFM; // ptr SDFM - void* dataCNTG; // ptr CNTG - void* dataHOPD; // ptr HOPD - LevelOBSV* dataOBSV; // ptr OBSV + void* dataNAME; + void* dataINFO; + void* dataJPTX; + LevelTHER* dataTHER; + void* dataLWIN; + void* dataTPAD; + void* dataLPAD; + void* dataLSTP; + void* dataRNGS; + LevelBALS* dataBALS; + void* dataTARG; + void* dataHPAD; + void* dataBTGT; + void* dataPHTS; + void* dataFALC; + void* dataSDFM; + void* dataCNTG; + void* dataHOPD; + LevelOBSV* dataOBSV; } LevelCommObjects; extern Unk80362690* D_80362690; @@ -416,7 +451,7 @@ s32 levelDataGetOBSV(LevelOBSV** data); s32 levelDataGetLPAD(void** data); s32 levelDataGetLSTP(void** data); s32 levelDataGetRNGS(void** data); -s32 levelDataGetBALS(void** data); +s32 levelDataGetBALS(LevelBALS** data); s32 levelDataGetTARG(void** data); s32 levelDataGetHPAD(void** data); s32 levelDataGetBTGT(LevelBTGT** data); diff --git a/include/uv_model.h b/include/uv_model.h index 5b75fcf5..b1be4ab7 100644 --- a/include/uv_model.h +++ b/include/uv_model.h @@ -4,7 +4,7 @@ #include s32 uvModelGet(s32, s32); -void uvModelGetProps(s32, s32, void*, s32); +void uvModelGetProps(s32, ...); void uvModelGetPosm(s32 model, s32 part, Mtx4F*); #endif // UV_MODEL_H diff --git a/src/app/balls.c b/src/app/balls.c index ac7bce0c..14d6a969 100644 --- a/src/app/balls.c +++ b/src/app/balls.c @@ -1,66 +1,1344 @@ #include "common.h" +#include +#include +#include +#include +#include +#include +#include #include "balls.h" +#include "birdman.h" +#include "bmsound.h" +#include "code_556C0.h" +#include "code_5A6A0.h" +#include "code_61A60.h" +#include "code_66160.h" +#include "code_72B70.h" +#include "code_7FED0.h" +#include "code_9A960.h" +#include "demo.h" +#include "fdr.h" +#include "hud.h" +#include "shadow.h" +#include "snap.h" +#include "snd.h" // .data // list of model ids s32 D_8034E810[] = { 0xF4, 0xF5, 0xF6 }; -#pragma GLOBAL_ASM("asm/nonmatchings/app/balls/func_802CAD00.s") +// .bss +extern f32 D_80359388; // always set to 5.3241148? +extern LevelBALS* sRefBALS; +// part of split file? +extern Unk803599D0 D_80359390; +extern u8 D_803593E4; -#pragma GLOBAL_ASM("asm/nonmatchings/app/balls/func_802CADE8.s") +// forward declarations +void ballsMotionUpdate(ParsedBALS*); +void ballsFrameUpdateOne(ParsedBALS*); +s32 balls_802CB6D4(ParsedBALS*); +s32 balls_802CC0D4(u8 objId); +void bird_802CD0F8(Unk80367704*); +void bird_802CD2E8(u8, Unk80367704*); +void bird_802CE0A4(Unk80367704*); -#pragma GLOBAL_ASM("asm/nonmatchings/app/balls/func_802CAF50.s") +// called during startup, during test load menu, and while init any level +void ballsInit(void) { + ParsedBALS* pb; + s32 i; + + for (pb = gBalls, i = 0; i < ARRAY_COUNT(gBalls); i++, pb++) { + pb->idx = i; + pb->objId = 0xFFFF; + pb->unk95 = 0; + pb->unk94 = 0; + pb->unk64 = 0.0f; + pb->unk97 = 0; + pb->unk80 = 0.0f; + pb->unk1A8 = 0xFF; + pb->unk5C = 1e7f; + } + gBallCount = 0; + sRefBALS = NULL; + gBallSplitCount = 0; +} + +// called during init of test that has a ball (e.g. RP Balloon tests) +// called for once for each ball (Balloon Rush 1x, Balloon Bonanza 2x) +void ballsInitBall(ParsedBALS* pb) { + f32 temp_fv1; + f32 temp_fa0; + pb->unk5C = 1e7f; + pb->unkA0.unk0 = 3; + temp_fv1 = D_80359388; + temp_fa0 = -D_80359388; + pb->unkA0.unk4[0].unk0 = 1; + pb->unkA0.unk4[0].unk28.x = temp_fa0; + pb->unkA0.unk4[1].unk0 = 1; + pb->unkA0.unk4[1].unk28.y = temp_fa0; + pb->unkA0.unk4[2].unk0 = 1; + pb->unkA0.unk4[2].unk28.z = temp_fa0; + pb->unkA0.unk4[0].unk1C.x = temp_fv1; + pb->unkA0.unk4[1].unk1C.y = temp_fv1; + pb->unkA0.unk4[2].unk1C.z = temp_fv1; + pb->unkA0.unk4[0].unk28.y = 0.0f; + pb->unkA0.unk4[0].unk28.z = 0.0f; + pb->unkA0.unk4[0].unk1C.y = 0.0f; + pb->unkA0.unk4[0].unk1C.z = 0.0f; + pb->unkA0.unk4[1].unk28.x = 0.0f; + pb->unkA0.unk4[1].unk28.z = 0.0f; + pb->unkA0.unk4[1].unk1C.x = 0.0f; + pb->unkA0.unk4[1].unk1C.z = 0.0f; + pb->unkA0.unk4[2].unk28.x = 0.0f; + pb->unkA0.unk4[2].unk28.y = 0.0f; + pb->unkA0.unk4[2].unk1C.x = 0.0f; + pb->unkA0.unk4[2].unk1C.y = 0.0f; + pb->objId = uvDobjAllocIdx(); + if (pb->unk96 != 0) { + pb->unk8A = 3; + } else { + pb->unk8A = 0; + } + uvDobjState(pb->objId, pb->unk8A); + if (pb->unk78 >= 3u) { + _uvDebugPrintf("balls: bad vrep %d for ball\n", pb->unk78); + pb->unk78 = 0; + } + uvDobjModel(pb->objId, D_8034E810[pb->unk78]); + uvDobjProps(pb->objId, 3, (f64)pb->unk7C, 0); + if (pb->unk95 == 0) { + uvMat4Scale(&pb->unk4, pb->unk7C, pb->unk7C, pb->unk7C); + } + uvDobjPosm(pb->objId, 0, &pb->unk4); +} + +// called once during test init if balls loaded +void balls_802CAF50(void) { + s32 i; + + for (i = 0; i < (gBallCount + gBallSplitCount); i++) { + if (D_80362690->unk0[D_80362690->unk9C].unkC.unk8 == gBalls[i].unk60) { + gBalls[i].unk96 = 1; + if (gBalls[i].objId != 0xFFFF) { + uvDobjSetState(gBalls[i].objId, 3); + } + if (gBalls[i].unk1A8 != 0xFF) { + hud_8031A874(gBalls[i].unk1A8); + } + } else { + gBalls[i].unk96 = 0; + if (gBalls[i].objId != 0xFFFF) { + uvDobjClearState(gBalls[i].objId, 3); + } + if (gBalls[i].unk1A8 != 0xFF) { + hud_8031A810(gBalls[i].unk1A8); + } + } + } +} + +// called from task.c to load BALS data for test. always called no matter veh, class, test +// even called again after pause + check-map + continue +void ballsLoad(void) { + s32 i; + ParsedBALS* pb; + LevelBALS* ball; + + if (D_80362690->unkA0) { + gBallCount = levelDataGetBALS(&sRefBALS); + if (gBallCount >= 0x15) { + _uvDebugPrintf("balls : too many balls defined in level [%d]\n", gBallCount); + gBallCount = 0; + } else if (gBallCount != 0) { + uvLevelAppend(0x11); + uvModelGetProps(0xF4, 1, &D_80359388, 0); + for (i = 0; i < (gBallCount + gBallSplitCount); i++) { + ball = &sRefBALS[i]; + pb = &gBalls[i]; + if (pb->unk94 != 0) { + continue; + } + + if (pb->unk95 == 0) { + pb->unk94 = 0; + pb->unk44.z = 0.0f; + pb->unk44.y = 0.0f; + pb->unk44.x = 0.0f; + pb->unk50.z = 0.0f; + pb->unk50.y = 0.0f; + pb->unk50.x = 0.0f; + pb->unk60 = (u8)ball->unk18; + pb->unk96 = 1; + if (ball->unk21 != 0) { + pb->unk79 = 5; + } else { + pb->unk79 = 0; + } + pb->unk84 = ball->unk1C; + pb->unk70 = ball->unk24; + pb->unk6C = ball->unk28; + pb->unk68 = ball->unk2C; + pb->unk8C = ball->unk34; + pb->unk90 = ball->unk38; + pb->unk7C = ball->scale; + pb->unk78 = ball->type; + pb->unk98 = ball->unk3C; + pb->unk9C = ball->unk40; + uvMat4SetIdentity(&pb->unk4); + pb->unk4.m[3][0] = ball->pos.x; + pb->unk4.m[3][1] = ball->pos.y; + pb->unk4.m[3][2] = ball->pos.z; + ballsInitBall(&gBalls[i]); + pb->unk95 = 1; + pb->unk1A8 = hud_8031A6C8(ball->pos.x, ball->pos.y, ball->pos.z); + } else { + ballsInitBall(&gBalls[i]); + } + } + balls_802CAF50(); + } + } +} + +// called for each ball with motion +// not called prior to splitting, called 5x per frame after split +// ball pushing test called 1x per frame +void ballsMotionUpdate(ParsedBALS* pb) { + f32 dx; + f32 dy; + + dx = -pb->unk98 * pb->unk44.x * pb->unk44.x; + if (pb->unk44.x < 0.0f) { + dx = -dx; + } + + dy = -pb->unk98 * pb->unk44.y * pb->unk44.y; + if (pb->unk44.y < 0.0f) { + dy = -dy; + } + + pb->unk50.x += dx; + pb->unk50.y += dy; +} + +// called from task.c at level exit +// deinits and balls loaded +void ballsDeinit(void) { + s32 i; + + for (i = 0; i < gBallCount + gBallSplitCount; i++) { + if (gBalls[i].objId != 0xFFFF) { + uvDobjModel(gBalls[i].objId, 0xFFFF); + gBalls[i].objId = 0xFFFF; + } + } +} + +// called every frame regardless of vehicle +// iterates through balls loaded and updates +void ballsFrameUpdate(void) { + ParsedBALS* ptr; + s32 i; + + if (D_80362690->unkA0) { + for (i = 0; i < gBallCount + gBallSplitCount; i++) { + ptr = &gBalls[i]; + if (ptr->objId == 0xFFFF) { + continue; + } + if (ptr->unk96 == 0) { + continue; + } + if (ptr->unk80 > 0.0f) { + ptr->unk80 -= D_8034F854; + } + if ((ptr->unk6C > 0.0f) && (ptr->unk94 == 0)) { + ballsFrameUpdateOne(ptr); + } + } + } +} + +// updates ball motion +// not called for balls that are motionless +void ballsFrameUpdateOne(ParsedBALS* pb) { + f32 ts; + f32 temp_fv0_2; + f32 grav; + + pb->unk50.x = 0.0f; + pb->unk50.y = 0.0f; + pb->unk50.z = 0.0f; + + ts = D_8034F854; + + ballsMotionUpdate(pb); + if (balls_802CB6D4(pb) == 0) { + if (pb->unk9C == 0.0f) { + grav = 9.8f; + } else { + grav = pb->unk9C; + } + pb->unk50.z -= grav; + } + + temp_fv0_2 = pb->unk44.z; + pb->unk44.x += pb->unk50.x * ts; + pb->unk44.y += pb->unk50.y * ts; + pb->unk44.z += pb->unk50.z * ts; + pb->unk4.m[3][0] += pb->unk44.x * ts; + pb->unk4.m[3][1] += pb->unk44.y * ts; + pb->unk4.m[3][2] += pb->unk44.z * ts; + if ((pb->unk44.z < 0.0f) && ((pb->unk44.z * temp_fv0_2) < 0.0f)) { + pb->unk5C = pb->unk4.m[3][2]; + } + + func_802E07D8(&pb->unk4); + uvDobjPosm(pb->objId, 0, &pb->unk4); + if (pb->unk1A8 != 0xFF) { + hud_8031A794(pb->unk1A8, pb->unk4.m[3][0], pb->unk4.m[3][1], pb->unk4.m[3][2]); + } +} + +s32 balls_802CB6D4(ParsedBALS* pb) { + f32 temp_fv0; + Vec3F sp1B8; + Vec3F sp1AC; + f32 var_fa0; + f32 var_fv1; + f32 temp_fv1; + Unk802D3658_Unk1224 sp5C; + s32 pad; + s32 pad2; + u8 obj_id; + u8 idx; + + if (func_802DB050(&pb->unkA0, &sp5C, pb->objId, pb->unk8A, &pb->unk4) <= 0) { + return 0; + } + idx = func_802DBF10(&pb->unkA0, &sp5C, &sp1B8, &sp1AC); + if ((sp5C.unk4[idx].unk4 != 1) && (sp5C.unk4[idx].unk4 != 4)) { + var_fv1 = pb->unk6C; + } else { + if (pb->unk5C - sp1B8.z < (10.0f + D_80359388 * pb->unk7C)) { + var_fv1 = 1.25f; + } else if (pb->unk5C - sp1B8.z < (11.0f + D_80359388 * pb->unk7C)) { + var_fv1 = 1.0f; + } else { + var_fv1 = pb->unk6C; + } + } + var_fa0 = uvVec3Dot(&pb->unk44, &sp1AC); + if (uvAbs((s32)var_fa0) < 5.0f) { + var_fa0 = -5.0f; + } + if (var_fa0 < 0.0f) { + pb->unk44.x -= (2.0f * var_fa0) * sp1AC.x; + pb->unk44.y -= (2.0f * var_fa0) * sp1AC.y; + pb->unk44.z -= (2.0f * var_fa0) * sp1AC.z; + pb->unk50.x = 0.0f; + pb->unk50.y = 0.0f; + pb->unk50.z = 0.0f; + pb->unk44.x *= var_fv1; + pb->unk44.y *= var_fv1; + pb->unk44.z *= var_fv1; + } + if (uvVec3Len(&pb->unk44) > 1.0f) { + if (((uvVec3Len(&pb->unk44) / var_fa0) < 0.5f) && ((pb->unk64 + 0.25f) < D_8034F850)) { + pb->unk64 = D_8034F850; + obj_id = uvEmitterLookup(); + uvEmitterFromModel(obj_id, 0x37); + uvEmitterProp(obj_id, 1, 0.0f, 2, 500.0f, 5, 0x38, 0); + uvEmitterSetMatrix(obj_id, &pb->unk4); + uvEmitterTrigger(obj_id); + } + } + return 1; +} + +void balls_802CB9B4(ParsedBALS* pb) { + LevelBALS* ball; + ParsedBALS* alloc; + f32 temp_fs0; + s32 i; + s32 pad; + f32 sp90; + f32 sp8C; + f32 sp88; + + for (i = 0; i < pb->unk79; i++) { + if ((gBallCount + gBallSplitCount) < ARRAY_COUNT(gBalls)) { + alloc = &gBalls[gBallSplitCount + gBallCount]; + gBallSplitCount++; + *alloc = *pb; + ball = &sRefBALS[pb->idx]; + alloc->unk70 = ball->unk48; + alloc->unk6C = ball->unk4C; + alloc->unk68 = ball->unk50; + alloc->unk8C = ball->unk54; + alloc->unk90 = ball->unk58; + alloc->unk7C = ball->unk5C; + alloc->unk78 = ball->pad44[0]; + alloc->unk98 = ball->unk60; + alloc->unk9C = ball->unk64; + alloc->unk79 = 0; + + temp_fs0 = i * (6.2831855f / pb->unk79); // 2*pi or DEG_TO_RAD(360) + func_803134D0(pb->unk7C * D_80359388, temp_fs0, 0.0f, &sp90, &sp8C, &sp88); + uvMat4LocalTranslate(&alloc->unk4, sp90, sp8C, sp88); + func_803134D0(alloc->unk84, temp_fs0, 0.0f, &sp90, &sp8C, &sp88); + alloc->unk44.x = sp90; + alloc->unk44.y = sp8C; + alloc->unk44.z = 0.0f; + alloc->unk1A8 = hud_8031A6C8(sp90, sp8C, sp88); + if (alloc->unk6C == 0) { + alloc->unk6C = 1.0f; + } + alloc->unk80 = 0.5f; + alloc->unk97 = 1; + alloc->unk95 = 0; + ballsInitBall(alloc); + alloc->unk95 = 1; + } + } +} -#pragma GLOBAL_ASM("asm/nonmatchings/app/balls/func_802CB094.s") +s32 ballsCollision(ParsedBALS* pb, Unk802D3658_Unk1228* arg1, Vec3F* arg2) { + f32 temp_fv0_2; + Vec3F sp48; + u8 sp47; -#pragma GLOBAL_ASM("asm/nonmatchings/app/balls/func_802CB2FC.s") + if (pb->unk96 == 0) { + return 0; + } + sp48.x = pb->unk44.x - arg2->x; + sp48.y = pb->unk44.y - arg2->y; + sp48.z = pb->unk44.z - arg2->z; + pb->unk74 = uvVec3Len(&sp48); + if (pb->unk70 < pb->unk74) { + func_802F996C(pb->unk4.m[3][0], pb->unk4.m[3][1], pb->unk4.m[3][2], (2.0f * D_80359388 * pb->unk7C)); + uvDobjModel(pb->objId, 0xFFFF); + pb->objId = 0xFFFF; + if (pb->unk1A8 != 0xFF) { + hud_8031A8E0(pb->unk1A8); + pb->unk1A8 = 0xFF; + } + if (pb->unk79 != 0) { + hudText_8031D8E0(0x16C, 1.5f, 8.0f); + balls_802CB9B4(pb); + } else { + hudText_8031D8E0(8, 1.5f, 8.0f); + } + pb->unk94 = 1; + sp47 = uvEmitterLookup(); + uvEmitterFromModel(sp47, 0x38); + uvEmitterProp(sp47, 1, 0.0f, 2, 500.0f, 5, 0x38, 0); + uvEmitterSetMatrix(sp47, &pb->unk4); + uvEmitterTrigger(sp47); + return 1; + } else { + temp_fv0_2 = (pb->unk74 / (1.0f + pb->unk68)); + pb->unk44.x -= temp_fv0_2 * arg1->unk1C.x; + pb->unk44.y -= temp_fv0_2 * arg1->unk1C.y; + pb->unk44.z -= temp_fv0_2 * arg1->unk1C.z; + return 0; + } +} -#pragma GLOBAL_ASM("asm/nonmatchings/app/balls/func_802CB35C.s") +f32 ballsPopped(u8 objId, Vec3F* arg1, Unk802D3658_Unk1224* arg2) { + Unk802D3658_Unk1228* unk4; + s32 j; // var_s0; + s32 i; // var_s3; + s32 count; + f32 temp_fv1; + u8 var_s2; -#pragma GLOBAL_ASM("asm/nonmatchings/app/balls/func_802CB3F8.s") + var_s2 = 0; + count = arg2->unk0; -#pragma GLOBAL_ASM("asm/nonmatchings/app/balls/func_802CB56C.s") + for (i = 0; i < count; i++) { + unk4 = &arg2->unk4[i]; + if ((unk4->unk4 == 2) && (var_s2 == 0)) { + for (j = 0; j < gBallCount + gBallSplitCount; j++) { + if ((unk4->unk8 == gBalls[j].objId) && (gBalls[j].unk80 <= 0.0f)) { + if (ballsCollision(&gBalls[j], unk4, arg1) != 0) { + return 0.0f; + } + var_s2++; + break; + } + } + } + } -#pragma GLOBAL_ASM("asm/nonmatchings/app/balls/func_802CB6D4.s") + if (balls_802CC0D4(objId) == 0) { + return 1.0f; + } + if ((gBalls[j].unk70 < gBalls[j].unk74) || (gBalls[j].unk80 > 0.0f)) { + return 0.0f; + } -#pragma GLOBAL_ASM("asm/nonmatchings/app/balls/func_802CB9B4.s") + temp_fv1 = gBalls[j].unk68; + return temp_fv1 / (1.0f + temp_fv1); +} -#pragma GLOBAL_ASM("asm/nonmatchings/app/balls/ballsCollision.s") +s32 ballsGet_802CC064(void) { + s32 count; + s32 i; -#pragma GLOBAL_ASM("asm/nonmatchings/app/balls/ballsPhysics.s") + count = 0; + for (i = 0; i < gBallCount + gBallSplitCount; i++) { + if (gBalls[i].unk94 != 0) { + count += gBalls[i].unk8C; + } + } + return count; +} -#pragma GLOBAL_ASM("asm/nonmatchings/app/balls/func_802CC064.s") +s32 balls_802CC0D4(u8 objId) { + s32 i; -#pragma GLOBAL_ASM("asm/nonmatchings/app/balls/func_802CC0D4.s") + for (i = 0; i < gBallCount + gBallSplitCount; i++) { + if (objId == gBalls[i].objId) { + break; + } + } + if (i == gBallCount + gBallSplitCount) { + return FALSE; + } + return TRUE; +} -#pragma GLOBAL_ASM("asm/nonmatchings/app/balls/func_802CC13C.s") +u8 ballsGetCount(void) { + return gBallCount + gBallSplitCount; +} -u8 func_802CC15C(void) { +u8 ballsGet_802CC15C(void) { s32 i; s32 ret; - ret = 1; - for (i = 0; i < D_80357210 + D_80357211; i++) { - if (D_80357218[i].unk94 == 0) { - ret = 0; + ret = TRUE; + for (i = 0; i < gBallCount + gBallSplitCount; i++) { + if (gBalls[i].unk94 == 0) { + ret = FALSE; break; } } return ret; } -#pragma GLOBAL_ASM("asm/nonmatchings/app/balls/func_802CC1B0.s") +// called during game boot +void bird_802CC1B0(void) { + D_80359390.unk0 = 8; + D_80359390.unk4 = 0.0f; + D_80359390.unk8 = 0.0f; + D_80359390.unkC = 0.2f; + D_80359390.unk10 = 0.04f; + D_80359390.unk14 = 0.4f; + D_80359390.unk18 = 0.16f; + D_80359390.unk1C = 0.6f; + D_80359390.unk20 = 0.36f; + D_80359390.unk24 = 0.7f; + D_80359390.unk28 = 0.49f; + D_80359390.unk2C = 0.8f; + D_80359390.unk30 = 0.64f; + D_80359390.unk34 = 0.9f; + D_80359390.unk38 = 0.81f; + D_80359390.unk40 = 1.0f; + D_80359390.unk3C = 1.0f; +} + +// called when starting one of the birdman levels, either from bonus menu or bonus star +void bird_802CC270(u8 arg0, u8 pilot, Unk80367704* arg2, Unk802D3658_Arg0* arg3) { + uvMemSet(arg2, 0, 0x424); + bird_802CD2E8(pilot, arg2); + arg2->unk0 = uvDobjAllocIdx(); + arg2->unk2 = 2; + uvDobjModel(arg2->unk0, arg2->unk3F4); + uvDobjPosm(arg2->unk0, 0, &arg2->unk10); + uvDobjState(arg2->unk0, arg2->unk2); + uvMat4Copy(&arg2->unk50, &arg2->unk10); + func_80334454(0x13D, 0x13C); + func_803342F0(1.0f); + func_803342FC(-2.0f); + func_803343D8(1); + arg2->controller = arg0; + arg2->unk2F0 = 0; + arg2->unk2CC = 0x1A; + arg2->unk4 = 0; + arg2->unkD4 = arg3; + arg2->unk2BC = 0.0f; + arg2->unk2C4 = 0.0f; + arg2->unk2D0 = 0.0f; + arg2->unk2D4 = 0.0f; + arg2->unk2D8 = 0.0f; + arg2->unk2DC = 0.0f; + uvModelGetProps(arg2->unk3F4, 1, &arg3->unk8, 0); + func_802CEBA0(arg2); + func_802D0BF0(arg2); +} + +// called when entering or exiting a birdman level +void bird_802CC39C(Unk80367704* arg0) { + db_getstart(&arg0->unk10, &arg0->unk200, NULL, NULL); + uvDobjPosm((s32)arg0->unk0, 0, &arg0->unk10); + uvMat4Copy(&arg0->unk50, &arg0->unk10); + func_802CECB8(arg0); + arg0->unk104 = 0; + arg0->unk105 = 0; + arg0->unk2 = 2; + arg0->unk290 = 1; + arg0->unkEC = 0.0f; + arg0->unkF0 = 0.0f; + arg0->unk8 = 0.0f; + arg0->unk2FC = 0.0f; + arg0->unk300 = 0.0f; + arg0->unk304 = 0.0f; + arg0->unk308 = 0.0f; + arg0->unk2E8 = 0.0f; + arg0->unk2E0 = 0.0f; + arg0->unk2EC = 0.0f; + arg0->unk2E4 = 0.0f; + bird_802CE0A4(arg0); + arg0->unkD8 = 0; + arg0->unkDC = 1.0f; + arg0->unkD4->unk1 = arg0->unkD8; + arg0->unkD4->unk4 = arg0->unk0; + arg0->unkD4->unk6 = arg0->unk2; + arg0->unkD4->unk0 = 1; + arg0->unkD4->unk74 = 0.0f; + arg0->unkD4->unk5C = 0; + arg0->unkD4->unk60 = -3.5f; + arg0->unkD4->unk64 = 0.5f; + arg0->unkD4->unk54 = 3.0f; + arg0->unkD4->unk58 = 6.5f; + arg0->unkD4->unk48 = 0.0125f; + arg0->unkD4->unk4C = 1.0f; + arg0->unkD4->unk50 = 0.0f; + arg0->unkD4->unk228 = 0.0f; + D_803593E4 = 0; + func_802D45C4(arg0->unkD4, arg0->unkDC); +} + +// called when exiting a birdman level +void bird_802CC51C(Unk802CC51C* arg0) { + uvDobjModel(arg0->objId, 0xFFFF); + arg0->unkC = 0xFFFF; + arg0->objId = 0xFFFF; + func_80334C70(); +} -#pragma GLOBAL_ASM("asm/nonmatchings/app/balls/func_802CC270.s") +// called every frame in a birdman stage +// handles controller input and motion updates +void bird_802CC55C(Unk80367704* arg0, u8 arg1) { + f32 sp7C; + f32 sp78; + f32 pad; + s32 buttons; + HUDState* sp6C; + s32 sp68; + f32 temp_fv0; + f32 sp4C[6]; + f32 var_fa0; + s32 pad2; + f32 var_fv0; + f32 var_fv1; -#pragma GLOBAL_ASM("asm/nonmatchings/app/balls/func_802CC39C.s") + sp68 = 0; + if (arg0->unk104 == 2) { + bird_802CD0F8(arg0); + return; + } + if (func_802E6B5C() != 4) { + arg0->unk8 += D_8034F854; + if (D_80362690->unk0[D_80362690->unk9C].unkC.unk7B == 0) { + func_80339E1C(arg0); + } + if (arg1 == 6) { + func_802E65AC(&arg0->unk10, &D_80362690->unk0[0].unk6, &sp7C, &sp78, &buttons); + } else { + sp7C = demoGetInputs(arg0->controller, INPUT_AXIS_X); + sp78 = demoGetInputs(arg0->controller, INPUT_AXIS_Y); + buttons = demoGetButtons(arg0->controller); + if (sp7C > 0.0f) { + var_fv0 = sp7C; + } else { + var_fv0 = -sp7C; + } + temp_fv0 = func_80313F08(&D_80359390, var_fv0); + if (sp7C >= 0.0f) { + sp7C = temp_fv0; + } else { + sp7C = -temp_fv0; + } + if (sp78 > 0.0f) { + var_fv0 = sp78; + } else { + var_fv0 = -sp78; + } + temp_fv0 = func_80313F08(&D_80359390, var_fv0); + if (sp78 >= 0.0f) { + sp78 = temp_fv0; + } else { + sp78 = -temp_fv0; + } + } + if (D_803593E4 != 0) { + arg0->unkE4 = func_80313AF4(0.0f, arg0->unkE4, 3.0f); + arg0->unkE8 = func_80313AF4(0.0f, arg0->unkE8, 3.0f); + } else { + arg0->unkE4 = func_80313AF4(sp7C, arg0->unkE4, 3.0f); + arg0->unkE8 = func_80313AF4(sp78, arg0->unkE8, 3.0f); + } + if (demoButtonPress(arg0->controller, A_BUTTON)) { + sp68 = 1; + arg0->unk2DC -= 0.25f; + } + if (demoButtonPress(arg0->controller, B_BUTTON)) { + sp68 = 1; + arg0->unk2DC += 0.25f; + } + arg0->unk2DC = func_80313AF4(0.0f, arg0->unk2DC, 1.0f); + arg0->unk2D4 += arg0->unk2DC * D_8034F854; + if (arg0->unk2D4 < 0.f) { + arg0->unk2D4 = 0.f; + } + if (arg0->unk2D4 > 1.5707f) { + arg0->unk2D4 = 1.5707f; + } + if (sp68 != 0) { + arg0->unk2D0 += 9.0f * D_8034F854; + if (arg0->unk2D0 > 3.8f) { + arg0->unk2D0 = 3.8f; + } + } else { + arg0->unk2D0 = func_80313AF4(0.0f, arg0->unk2D0, 0.5f); + arg0->unk2D4 = func_80313AF4(0.0f, arg0->unk2D4, 0.4f); + } + if (arg1 != 6) { + func_802CEDF8(arg0); + } + func_802CE190(arg0, arg1); + if (arg1 != 6) { + sp4C[0] = arg0->unkD0; + sp4C[1] = arg0->unk2D0; + sp4C[2] = arg0->unk2D4; + sp4C[3] = (f32)arg0->unk2C0; + sp4C[4] = arg0->unk304; + sp4C[5] = arg0->unk308; + func_802E682C(sp4C, ARRAY_COUNT(sp4C), 0); + } else { + func_802E6870(sp4C, ARRAY_COUNT(sp4C), NULL); + arg0->unkD0 = sp4C[0]; + arg0->unk2D0 = sp4C[1]; + arg0->unk2D4 = sp4C[2]; + arg0->unk2C0 = (u8)sp4C[3]; + arg0->unk304 = sp4C[4]; + arg0->unk308 = sp4C[5]; + } + if (arg1 != 6) { + arg0->unkD0 = -1.57f; + if (arg0->unk224 < 25.0f) { + var_fa0 = (((25.0f - arg0->unk224) * 1.57f) / 25.0f) + -1.57f; + if ((arg0->unk16C < 4.0f) && (arg0->unk224 < 10.0f)) { + arg0->unkD0 = (((4.0f - arg0->unk16C) * 1.57f) / 2.5f) + -1.57f; + } + if (var_fa0 < arg0->unkD0) { + arg0->unkD0 = arg0->unkD0; + } else { + arg0->unkD0 = var_fa0; + } + } + if (arg0->unkD0 > 0.0f) { + arg0->unkD0 = 0.0f; + } + } + uvMat4SetIdentity(&arg0->unk90); + uvMat4RotateAxis(&arg0->unk90, arg0->unkD0, 'x'); + uvMat4Mul(&arg0->unk50, &arg0->unk90, &arg0->unk10); + uvDobjPosm(arg0->unk0, 0, &arg0->unk50); + func_803344BC(&arg0->unk10, arg0->unk16C); + if (arg0->unk224 > 25.0f) { + arg0->unkD4->unk48 = 0.0125f; + arg0->unkD4->unk5C = 0.0f; + arg0->unkD4->unk60 = -3.5f; + arg0->unkD4->unk64 = 0.5f; + } else { + var_fa0 = -arg0->unkD0 / 1.57f; + var_fv1 = arg0->unk224 / 25.0f; + if (var_fa0 < 0.0f) { + var_fa0 = 0.0f; + } else if (var_fa0 > 1.0f) { + var_fa0 = 1.0f; + } + if (var_fv1 < 0.0f) { + var_fv1 = 0.0f; + } else if (var_fv1 > 1.0f) { + var_fv1 = 1.0f; + } + if (var_fv1 < var_fa0) { + var_fv0 = var_fa0; + } else { + var_fv0 = var_fv1; + } + arg0->unkD4->unk48 = ((1.0f - var_fv0) * 0.15f) + (var_fv0 * 0.0125f); + arg0->unkD4->unk5C = 0 * var_fv0; -#pragma GLOBAL_ASM("asm/nonmatchings/app/balls/func_802CC51C.s") + arg0->unkD4->unk60 = (2.5f * var_fv0) + -6.0f; + arg0->unkD4->unk64 = (0.4f * var_fv0) + 0.1f; + } + if (D_803593E4 == 0) { + if (buttons & L_CBUTTONS) { + var_fa0 = 1.5707963f; + } else if (buttons & R_CBUTTONS) { + var_fa0 = -1.5707963f; + } else { + var_fa0 = 0.0f; + } + arg0->unkEC = func_80313AF4(var_fa0, arg0->unkEC, 1.1f); + if (buttons & D_CBUTTONS) { + var_fa0 = 1.5707963f; + } else if (buttons & U_CBUTTONS) { + var_fa0 = -1.5707963f; + } else { + var_fa0 = 0.0f; + } + arg0->unkF0 = func_80313AF4(var_fa0, arg0->unkF0, 1.1f); + } else { + arg0->unkEC = func_80313AF4(demoGetInputs(arg0->controller, 0) * -1.5707963f, arg0->unkEC, 3.0f); + arg0->unkF0 = func_80313AF4(demoGetInputs(arg0->controller, 1) * -1.5707963f, arg0->unkF0, 3.0f); + } + if (demoButtonPress(arg0->controller, R_TRIG) && (arg1 != 6) && (arg0->unk104 != 1)) { + D_803593E4 = 0; + if (arg0->unkD8 == 1) { + func_8033F758(0x6A, 1.0f, 0.5f, 0.0f); + arg0->unkD8 = 0; + arg0->unkDC = 1.0f; + func_80334454(0x13D, 0x13C); + arg0->unk290 = 1; + bird_802CE0A4(arg0); + } else { + func_8033F758(0x6A, 1.0f, 0.5f, 0.0f); + arg0->unkD8 = 1; + arg0->unkDC = 0.8f; + func_80334454(0x13D, 0x13C); + arg0->unk290 = 0; + bird_802CE0A4(arg0); + } + func_802D5884(arg0->unkD4, arg0->unkD8); + func_802D45C4(arg0->unkD4, arg0->unkDC); + } + if (arg1 != 6) { + arg0->unkD4->unk4 = arg0->unk0; + arg0->unkD4->unk6 = arg0->unk2; + arg0->unkD4->unk78 = arg0->unkEC; + arg0->unkD4->unk7C = arg0->unkF0; + arg0->unkD4->unk228 = arg0->unk16C; + uvMat4LocalToWorld(&arg0->unk90, &arg0->unkD4->unk68, &arg0->unk294); + uvMat4Copy(&arg0->unkD4->unk80, &arg0->unk10); + if (arg0->unk104 == 1) { + func_802D5884(arg0->unkD4, 6); + arg0->unk2 = 2; + uvDobjState(arg0->unk0, arg0->unk2); + } else { + func_802D5884(arg0->unkD4, arg0->unkD8); + } + func_802D45C4(arg0->unkD4, arg0->unkDC); + } + if ((arg0->unkD8 == 1) && (arg0->unk104 != 1) && (arg1 != 6)) { + arg0->unk290 = 0; + } else { + arg0->unk290 = 1; + } + if (arg0->unkD4->unk148 != 0) { + arg0->unk290 = 1; + } + bird_802CE0A4(arg0); + if (arg1 != 6) { + sp6C = hudGetState(); + uvMat4Copy(&sp6C->unk28, &arg0->unk10); + sp6C->renderFlags = 0x80; + sp6C->att.heading = arg0->unk10.m[3][2]; + sp6C->elapsedTime = arg0->unk8; + sp6C->unk8C = arg0->unk220 * 4.0f * 0.7f; + sp6C->altitude = arg0->unk16C * 0.7f; + sp6C->altSeaLevel = arg0->unk10.m[3][2] * 0.7f; + sp6C->speed = arg0->unk224 * 3.6f * 0.7f; + } + if ((arg0->unk104 == 1) || (arg0->unk104 == 2)) { + sp6C->renderFlags = 0; + } + func_802E06AC(&arg0->unk10); + if (arg1 != 6) { + if (arg0->unk104 == 2) { + func_802E66DC(); + } + func_802E65AC(&arg0->unk10, &D_80362690->unk0[0].unk6, &sp7C, &sp78, &buttons); + } + } +} -#pragma GLOBAL_ASM("asm/nonmatchings/app/balls/func_802CC55C.s") +void bird_802CD0F8(Unk80367704* arg0) { + f32 x; + f32 y; + f32 z; + Vec3F sp60; + Vec3F sp54; + Mtx4F* temp_a0; + Vec3F* var_a1; + f32 sp48; + Mtx4F* sp2C; + f32 sp40; + s32 sp3C; + s32 sp38; + u8 sp37; + u8 temp_v0; + u8 temp6; -#pragma GLOBAL_ASM("asm/nonmatchings/app/balls/func_802CD0F8.s") + if (arg0->unk2F0 == 0) { + arg0->unk2F0 = 1; + sp60.x = arg0->unk10.m[3][0]; + sp54.x = arg0->unk400; + sp60.y = arg0->unk10.m[3][1]; + sp54.y = arg0->unk404; + sp60.z = arg0->unk10.m[3][2]; + sp54.z = arg0->unk408; + sp38 = arg0->unk40C; + temp_v0 = db_getgnd(&sp54, &sp60, &sp38, &sp3C, &sp40, &sp48); + sp37 = temp_v0; + if (temp_v0 != 0) { + var_a1 = func_802E02EC(); + } else { + var_a1 = &sp60; + sp60.z = sp40; + } + temp_a0 = &arg0->unk10; + sp2C = temp_a0; + func_802E05CC(temp_a0, var_a1, &sp48, 1); + if (func_802E0C30(sp37, sp3C) != 0) { + arg0->unk15C = 1; + } + uvDobjPosm(arg0->unk0, 0, sp2C); + uvMat4Copy(&arg0->unkD4->unk80, sp2C); + if (arg0->unk15C != 0) { + snd_play_sfx(0x1A); + uvEventPost(0x12, 0); + x = arg0->unk10.m[3][0]; + y = arg0->unk10.m[3][1]; + z = arg0->unk10.m[3][2]; + func_802F8AB8(x, y, z, 1.0f, &arg0->unk218); + arg0->unkD4->unk6 = arg0->unk2 = 0; + uvDobjState(arg0->unk0, arg0->unk2); + uvMat4Copy(&arg0->unkD4->unk80, sp2C); + } else { + arg0->unk2 = 2; + uvDobjState(arg0->unk0, arg0->unk2); + } + arg0->unk290 = 1; + bird_802CE0A4(arg0); + func_803343D8(0); + } + func_802D5884(arg0->unkD4, 3); + hudGetState()->renderFlags = 0; + if (arg0->unk15C != 0) { + arg0->unkD4->unk190 = 12.0f; + } else { + arg0->unkD4->unk190 = 6.0f; + } + func_802CEA60(arg0); +} -#pragma GLOBAL_ASM("asm/nonmatchings/app/balls/func_802CD2E8.s") +// called during birdman init to setup pilot specific parameters +void bird_802CD2E8(u8 pilot, Unk80367704* arg1) { + switch (pilot) { + case PILOT_LARK: + arg1->unk294.x = 0; + arg1->unk294.y = -0.1625f; + arg1->unk294.z = 0.2869f; + arg1->unk3F4 = 0x13B; + arg1->unk3F7 = 0x16; + arg1->unk3F6 = 1; + arg1->unk3F8 = 2; + arg1->unk3F9 = 5; + arg1->unk2F8 = 0xF; + arg1->unk2F9 = 8; + arg1->unk2A0 = 0.6f; + arg1->unk2A4 = 1.0f; + arg1->unk2B0 = 0.8f; + arg1->unk2B4 = 0.8f; + arg1->unk2B8 = 0x44; + arg1->unk2C0 = 0x45; + arg1->unk2AC = 1.2f; + arg1->unk2A8 = 1.2f; + arg1->unk320 = 0.0f; + arg1->unk324 = 0.021f; + arg1->unk328 = 0.675f; + arg1->unk32C = -4.281f; + arg1->unk330 = -0.972f; + arg1->unk334 = 0.596f; + arg1->unk338 = 4.277f; + arg1->unk33C = -0.972f; + arg1->unk348 = 0.0f; + arg1->unk344 = 0.0f; + arg1->unk340 = 0.596f; + arg1->unk34C = -0.745f; + arg1->unk350 = 7; + arg1->unk354 = 0.0f; + arg1->unk358 = -1.426f; + arg1->unk35C = -0.098f; + arg1->unk360 = -0.018f; + arg1->unk364 = 0.125f; + arg1->unk368 = -1.368f; + arg1->unk36C = -0.401f; + arg1->unk370 = -0.084f; + arg1->unk374 = 0.25f; + arg1->unk378 = -1.019f; + arg1->unk37C = -0.815f; + arg1->unk380 = -0.234f; + arg1->unk384 = 0.625f; + arg1->unk388 = -1.271f; + arg1->unk38C = -0.175f; + arg1->unk390 = -0.158f; + arg1->unk394 = 0.75f; + arg1->unk398 = -1.133f; + arg1->unk39C = 0.561f; + arg1->unk3A0 = -0.274f; + arg1->unk3A4 = 0.875f; + arg1->unk3A8 = -1.12f; + arg1->unk3AC = 0.6f; + arg1->unk3B0 = -0.127f; + arg1->unk3B4 = 1.0f; + arg1->unk3B8 = -1.426f; + arg1->unk3BC = -0.098f; + arg1->unk3C0 = -0.018f; + break; + case PILOT_GOOSE: + arg1->unk294.x = 0; + arg1->unk294.y = -0.0994f; + arg1->unk294.z = 0.2577f; + arg1->unk3F4 = 0x13E; + arg1->unk3F7 = 0x16; + arg1->unk3F6 = 1; + arg1->unk3F8 = 2; + arg1->unk3F9 = 5; + arg1->unk2F8 = 0xF; + arg1->unk2F9 = 8; + arg1->unk2A0 = 0.6f; + arg1->unk2A4 = 1.0f; + arg1->unk2AC = 1.0f; + arg1->unk2A8 = 1.0f; + arg1->unk2B0 = 1.0f; + arg1->unk2B4 = 1.0f; + arg1->unk2B8 = 0x46; + arg1->unk2C0 = 0x47; + arg1->unk320 = 0.0f; + arg1->unk324 = 0.108f; + arg1->unk328 = 0.653f; + arg1->unk32C = -3.724f; + arg1->unk330 = -0.808f; + arg1->unk334 = 0.499f; + arg1->unk338 = 3.714f; + arg1->unk33C = -0.808f; + arg1->unk340 = 0.499f; + arg1->unk348 = 0.0f; + arg1->unk344 = 0.0f; + arg1->unk34C = -1.645f; + arg1->unk350 = 7; + arg1->unk354 = 0.0f; + arg1->unk358 = -1.457f; + arg1->unk35C = -0.05f; + arg1->unk360 = 0.491f; + arg1->unk364 = 0.125f; + arg1->unk368 = -1.416f; + arg1->unk36C = -0.426f; + arg1->unk370 = 0.377f; + arg1->unk374 = 0.25f; + arg1->unk378 = -0.864f; + arg1->unk37C = -1.022f; + arg1->unk380 = 0.137f; + arg1->unk384 = 0.625f; + arg1->unk388 = -1.439f; + arg1->unk38C = -0.011f; + arg1->unk390 = 0.486f; + arg1->unk394 = 0.75f; + arg1->unk398 = -1.249f; + arg1->unk39C = 0.762f; + arg1->unk3A0 = 0.202f; + arg1->unk3A4 = 0.875f; + arg1->unk3A8 = -1.152f; + arg1->unk3AC = 0.767f; + arg1->unk3B0 = 0.312f; + arg1->unk3B4 = 1.0f; + arg1->unk3B8 = -1.457f; + arg1->unk3BC = -0.05f; + arg1->unk3C0 = 0.491f; + break; + case PILOT_HAWK: + arg1->unk294.x = 0; + arg1->unk294.y = -0.07084f; + arg1->unk294.z = 0.57865f; + arg1->unk3F4 = 0x13F; + arg1->unk3F7 = 0x16; + arg1->unk3F6 = 1; + arg1->unk3F8 = 2; + arg1->unk3F9 = 5; + arg1->unk2F8 = 0xF; + arg1->unk2F9 = 8; + arg1->unk2A0 = 0.6f; + arg1->unk2A4 = 1.0f; + arg1->unk2B0 = 1.2f; + arg1->unk2B4 = 1.2f; + arg1->unk2B8 = 0x48; + arg1->unk2C0 = 0x49; + arg1->unk2AC = 0.8f; + arg1->unk2A8 = 0.8f; + arg1->unk320 = 0.0f; + arg1->unk324 = 0.108f; + arg1->unk328 = 0.627f; + arg1->unk32C = -3.643f; + arg1->unk330 = -0.796f; + arg1->unk334 = 0.476f; + arg1->unk338 = 3.643f; + arg1->unk33C = -0.796f; + arg1->unk340 = 0.476f; + arg1->unk348 = 0.0f; + arg1->unk344 = 0.0f; + arg1->unk34C = -1.228f; + arg1->unk350 = 7; + arg1->unk354 = 0.0f; + arg1->unk358 = -1.826f; + arg1->unk35C = -0.06f; + arg1->unk360 = 0.217f; + arg1->unk364 = 0.125f; + arg1->unk368 = -1.689f; + arg1->unk36C = -0.606f; + arg1->unk370 = 0.158f; + arg1->unk374 = 0.25f; + arg1->unk378 = -1.074f; + arg1->unk37C = -1.247f; + arg1->unk380 = -0.01f; + arg1->unk384 = 0.625f; + arg1->unk388 = -1.804f; + arg1->unk38C = -0.068f; + arg1->unk390 = 0.407f; + arg1->unk394 = 0.75f; + arg1->unk398 = -1.519f; + arg1->unk39C = 0.881f; + arg1->unk3A0 = 0.208f; + arg1->unk3A4 = 0.875f; + arg1->unk3A8 = -1.415f; + arg1->unk3AC = 0.89f; + arg1->unk3B0 = 0.392f; + arg1->unk3B8 = -1.826f; + arg1->unk3BC = -0.06f; + arg1->unk3B4 = 1.0f; + arg1->unk3C0 = 0.217f; + break; + case PILOT_KIWI: + arg1->unk294.x = 0; + arg1->unk294.y = 0.0015f; + arg1->unk294.z = 0.1942f; + arg1->unk3F4 = 0x140; + arg1->unk3F7 = 0x16; + arg1->unk3F6 = 1; + arg1->unk3F8 = 2; + arg1->unk3F9 = 5; + arg1->unk2F8 = 0xF; + arg1->unk2F9 = 8; + arg1->unk2A0 = 0.6f; + arg1->unk2A4 = 1.0f; + arg1->unk2B0 = 0.8f; + arg1->unk2B4 = 0.8f; + arg1->unk2B8 = 0x4A; + arg1->unk2C0 = 0x45; + arg1->unk2AC = 1.2f; + arg1->unk2A8 = 1.2f; + arg1->unk320 = 0.0f; + arg1->unk324 = 0.021f; + arg1->unk328 = 0.672f; + arg1->unk32C = -4.34f; + arg1->unk330 = -1.029f; + arg1->unk334 = 0.57f; + arg1->unk338 = 4.34f; + arg1->unk33C = -1.029f; + arg1->unk348 = 0.0f; + arg1->unk344 = 0.0f; + arg1->unk340 = 0.57f; + arg1->unk34C = -0.861f; + arg1->unk350 = 7; + arg1->unk354 = 0.0f; + arg1->unk358 = -1.426f; + arg1->unk35C = -0.098f; + arg1->unk360 = -0.018f; + arg1->unk364 = 0.125f; + arg1->unk368 = -1.368f; + arg1->unk36C = -0.401f; + arg1->unk370 = -0.084f; + arg1->unk374 = 0.25f; + arg1->unk378 = -1.019f; + arg1->unk37C = -0.815f; + arg1->unk380 = -0.234f; + arg1->unk384 = 0.625f; + arg1->unk388 = -1.271f; + arg1->unk38C = -0.175f; + arg1->unk390 = -0.158f; + arg1->unk394 = 0.75f; + arg1->unk398 = -1.133f; + arg1->unk39C = 0.561f; + arg1->unk3A0 = -0.274f; + arg1->unk3A4 = 0.875f; + arg1->unk3A8 = -1.12f; + arg1->unk3AC = 0.6f; + arg1->unk3B0 = -0.127f; + arg1->unk3B4 = 1.0f; + arg1->unk3B8 = -1.426f; + arg1->unk3BC = -0.098f; + arg1->unk3C0 = -0.018f; + break; + case PILOT_IBIS: + arg1->unk294.x = 0; + arg1->unk294.y = 0.0024f; + arg1->unk294.z = 0.3577f; + arg1->unk3F4 = 0x141; + arg1->unk3F7 = 0x16; + arg1->unk3F6 = 1; + arg1->unk3F8 = 2; + arg1->unk3F9 = 5; + arg1->unk2F8 = 0xF; + arg1->unk2F9 = 8; + arg1->unk2A0 = 0.6f; + arg1->unk2A4 = 1.0f; + arg1->unk2AC = 1.0f; + arg1->unk2A8 = 1.0f; + arg1->unk2B0 = 1.0f; + arg1->unk2B4 = 1.0f; + arg1->unk2B8 = 0x4B; + arg1->unk2C0 = 0x47; + arg1->unk320 = 0.0f; + arg1->unk324 = 0.108f; + arg1->unk328 = 0.731f; + arg1->unk32C = -4.225f; + arg1->unk330 = -0.89f; + arg1->unk334 = 0.715f; + arg1->unk338 = 4.226f; + arg1->unk33C = -0.89f; + arg1->unk340 = 0.666f; + arg1->unk348 = 0.0f; + arg1->unk344 = 0.0f; + arg1->unk34C = -1.427f; + arg1->unk350 = 7; + arg1->unk354 = 0.0f; + arg1->unk358 = -1.457f; + arg1->unk35C = -0.05f; + arg1->unk360 = 0.491f; + arg1->unk364 = 0.125f; + arg1->unk368 = -1.416f; + arg1->unk36C = -0.426f; + arg1->unk370 = 0.377f; + arg1->unk374 = 0.25f; + arg1->unk378 = -0.864f; + arg1->unk37C = -1.022f; + arg1->unk380 = 0.137f; + arg1->unk384 = 0.625f; + arg1->unk388 = -1.439f; + arg1->unk38C = -0.011f; + arg1->unk390 = 0.486f; + arg1->unk394 = 0.75f; + arg1->unk398 = -1.249f; + arg1->unk39C = 0.762f; + arg1->unk3A0 = 0.202f; + arg1->unk3A4 = 0.875f; + arg1->unk3A8 = -1.152f; + arg1->unk3AC = 0.767f; + arg1->unk3B0 = 0.312f; + arg1->unk3B4 = 1.0f; + arg1->unk3B8 = -1.457f; + arg1->unk3BC = -0.05f; + arg1->unk3C0 = 0.491f; + break; + case PILOT_ROBIN: + arg1->unk294.x = 0; + arg1->unk294.y = -0.0991f; + arg1->unk294.z = 0.4056f; + arg1->unk3F4 = 0x142; + arg1->unk3F7 = 0x16; + arg1->unk3F6 = 1; + arg1->unk3F8 = 2; + arg1->unk3F9 = 5; + arg1->unk2F8 = 0xF; + arg1->unk2F9 = 8; + arg1->unk2A0 = 0.6f; + arg1->unk2A4 = 1.0f; + arg1->unk2AC = 0.8f; + arg1->unk2A8 = 0.8f; + arg1->unk2B0 = 1.2f; + arg1->unk2B8 = 0x4C; + arg1->unk2C0 = 0x49; + arg1->unk2B4 = 1.2f; + arg1->unk320 = 0.0f; + arg1->unk324 = 0.108f; + arg1->unk328 = 0.782f; + arg1->unk32C = -4.206f; + arg1->unk330 = -0.202f; + arg1->unk334 = 0.574f; + arg1->unk338 = 4.207f; + arg1->unk33C = -0.202f; + arg1->unk348 = 0.0f; + arg1->unk344 = 0.0f; + arg1->unk340 = 0.574f; + arg1->unk34C = -1.138f; + arg1->unk350 = 7; + arg1->unk354 = 0.0f; + arg1->unk358 = -1.826f; + arg1->unk35C = -0.06f; + arg1->unk360 = 0.217f; + arg1->unk364 = 0.125f; + arg1->unk368 = -1.689f; + arg1->unk36C = -0.606f; + arg1->unk370 = 0.158f; + arg1->unk374 = 0.25f; + arg1->unk378 = -1.074f; + arg1->unk37C = -1.247f; + arg1->unk380 = -0.01f; + arg1->unk384 = 0.625f; + arg1->unk388 = -1.804f; + arg1->unk38C = -0.068f; + arg1->unk390 = 0.407f; + arg1->unk394 = 0.75f; + arg1->unk398 = -1.519f; + arg1->unk39C = 0.881f; + arg1->unk3A0 = 0.208f; + arg1->unk3A4 = 0.875f; + arg1->unk3A8 = -1.415f; + arg1->unk3AC = 0.89f; + arg1->unk3B0 = 0.392f; + arg1->unk3B4 = 1.0f; + arg1->unk3B8 = -1.826f; + arg1->unk3BC = -0.06f; + arg1->unk3C0 = 0.217f; + break; + default: + break; + } +} -#pragma GLOBAL_ASM("asm/nonmatchings/app/balls/func_802CE0A4.s") +// called every frame during birdman +void bird_802CE0A4(Unk80367704* arg0) { + if (arg0->unk290 != 0) { + arg0->unk2 &= 0xFFFB; + uvDobjProps(arg0->unk0, 4, arg0->unk3F7, 0); + if (arg0->unk3F4 == 0x140) { + uvDobjProps(arg0->unk0, 4, 0x17, 0); + uvDobjProps(arg0->unk0, 4, 0x18, 0); + } + } else { + arg0->unk2 |= 4; + uvDobjProps(arg0->unk0, 5, arg0->unk3F7, 0); + if (arg0->unk3F4 == 0x140) { + uvDobjProps(arg0->unk0, 5, 0x17, 0); + uvDobjProps(arg0->unk0, 5, 0x18, 0); + } + } + uvDobjState(arg0->unk0, arg0->unk2); +} diff --git a/src/app/balls.h b/src/app/balls.h index 1dce98ac..6f0e754a 100644 --- a/src/app/balls.h +++ b/src/app/balls.h @@ -2,22 +2,69 @@ #define APP_BALLS_H #include +#include +#include +#include "code_72B70.h" typedef struct { - u8 pad0[0x94]; + u8 idx; + u8 pad1[3]; + Mtx4F unk4; + Vec3F unk44; + Vec3F unk50; // ball velocity + f32 unk5C; + u8 unk60; + u8 pad61[3]; + f32 unk64; + f32 unk68; + f32 unk6C; + f32 unk70; + f32 unk74; + u8 unk78; + u8 unk79; + u8 pad7A[2]; + f32 unk7C; + f32 unk80; // time related + f32 unk84; + u16 objId; + u8 unk8A; + u8 pad8B[1]; + s32 unk8C; + s32 unk90; u8 unk94; - u8 pad95[0x1AC - 0x95]; -} Unk80357218; + u8 unk95; + u8 unk96; + u8 unk97; + f32 unk98; + f32 unk9C; + Unk802D3658_Unk111C unkA0; + u8 unk1A8; + u8 pad1A9[0x1AC - 0x1A9]; +} ParsedBALS; // size: 0x1AC -extern u8 D_80357210; -extern u8 D_80357211; -extern Unk80357218 D_80357218[]; +typedef struct { + u16 objId; + u8 pad2[0xA]; + u16 unkC; +} Unk802CC51C; + +extern u8 gBallCount; // initial ball count. never decremented +extern u8 gBallSplitCount; // split ball count (5 after first split, 10 after second). never decremented +extern ParsedBALS gBalls[20]; // array of balls loaded + +void ballsInit(void); +void balls_802CAF50(void); +void ballsLoad(void); +void ballsDeinit(void); +void ballsFrameUpdate(void); +u8 ballsGet_802CC15C(void); -void func_802CAD00(void); -void func_802CAF50(void); -void func_802CB094(void); -void func_802CB35C(void); -void func_802CB3F8(void); -u8 func_802CC15C(void); +// these should be split from this file +void bird_802CC1B0(void); +void bird_802CC270(u8, u8 pilot, Unk80367704*, Unk802D3658_Arg0*); +void bird_802CC39C(Unk80367704*); +void bird_802CC51C(Unk802CC51C*); +void bird_802CC55C(Unk80367704*, u8); +void bird_802CD0F8(Unk80367704*); #endif // APP_BALLS_H diff --git a/src/app/bmsound.c b/src/app/bmsound.c index 0e83c258..2fb89ca6 100644 --- a/src/app/bmsound.c +++ b/src/app/bmsound.c @@ -1,4 +1,5 @@ #include "common.h" +#include "bmsound.h" #pragma GLOBAL_ASM("asm/nonmatchings/app/bmsound/func_802D0BF0.s") diff --git a/src/app/bmsound.h b/src/app/bmsound.h new file mode 100644 index 00000000..0c32ba8f --- /dev/null +++ b/src/app/bmsound.h @@ -0,0 +1,7 @@ +#ifndef APP_BMSOUND_H +#define APP_BMSOUND_H + +#include +void func_802D0BF0(void*); + +#endif // APP_BMSOUND_H diff --git a/src/app/cannonball.c b/src/app/cannonball.c index 5b0f32b9..b91743da 100644 --- a/src/app/cannonball.c +++ b/src/app/cannonball.c @@ -126,9 +126,9 @@ void cannon_802D5C5C(Unk802D5C5C_Arg0* arg0) { arg0->unkB0->unk4 = arg0->unk54; arg0->unkB0->unk6 = arg0->unk56; arg0->unkB0->unk0 = 0x20; - arg0->unkB0->unk68 = arg0->unk26C; - arg0->unkB0->unk6C = arg0->unk270; - arg0->unkB0->unk70 = arg0->unk274; + arg0->unkB0->unk68.x = arg0->unk26C; + arg0->unkB0->unk68.y = arg0->unk270; + arg0->unkB0->unk68.z = arg0->unk274; arg0->unkB0->unk74 = 0.0f; arg0->unkB0->unk5C = 0; arg0->unkB0->unk60 = -1.0f; @@ -193,9 +193,9 @@ void cannonMovementFrame(Unk802D5C5C_Arg0* arg0, u8 arg1) { spC8[0] = arg0->zAxis; spC8[1] = arg0->xAxis; spC7 = (arg0->unkD4 * 2) | (arg0->unkC4 & 1); - func_802E682C(&spC8, 2, spC7); + func_802E682C(spC8, ARRAY_COUNT(spC8), spC7); } else { - func_802E6870(&spC8, 2, &spC7); + func_802E6870(spC8, ARRAY_COUNT(spC8), &spC7); arg0->zAxis = spC8[0]; arg0->xAxis = spC8[1]; arg0->unkD4 = spC7 >> 1; diff --git a/src/app/code_556C0.c b/src/app/code_556C0.c index 4f352ffa..aba70a05 100644 --- a/src/app/code_556C0.c +++ b/src/app/code_556C0.c @@ -1,4 +1,5 @@ #include "common.h" +#include "code_556C0.h" #pragma GLOBAL_ASM("asm/nonmatchings/app/code_556C0/func_802CE190.s") diff --git a/src/app/code_556C0.h b/src/app/code_556C0.h new file mode 100644 index 00000000..07cf4698 --- /dev/null +++ b/src/app/code_556C0.h @@ -0,0 +1,10 @@ +#ifndef APP_CODE_556C0_H +#define APP_CODE_556C0_H + +#include +#include "code_72B70.h" + +void func_802CE190(Unk80367704*, u8); +void func_802CEA60(void*); + +#endif // APP_CODE_556C0_H diff --git a/src/app/code_5A6A0.c b/src/app/code_5A6A0.c index c8a1192f..677e3139 100644 --- a/src/app/code_5A6A0.c +++ b/src/app/code_5A6A0.c @@ -67,10 +67,10 @@ void func_802D3170(u8 arg0, Unk802D3658_Arg0* arg1) { arg1->unk54 = 1.8f; arg1->unk58 = 10.0f; arg1->unk50 = 0.0f; - arg1->unk68 = 0; + arg1->unk68.x = 0; arg1->unkD = 1; - arg1->unk6C = -1.2f; - arg1->unk70 = -0.2f; + arg1->unk68.y = -1.2f; + arg1->unk68.z = -0.2f; arg1->unk74 = -0.1f; arg1->unk190 = 6.0f; arg1->unk194 = 0.0f; @@ -280,7 +280,7 @@ static void func_802D3790(Unk802D3658_Arg0* arg0) { arg0->unk108.m[3][0] = spBC.x; arg0->unk108.m[3][1] = spBC.y; arg0->unk108.m[3][2] = spBC.z; - uvMat4LocalTranslate(&arg0->unk108, arg0->unk68, arg0->unk6C, arg0->unk70); + uvMat4LocalTranslate(&arg0->unk108, arg0->unk68.x, arg0->unk68.y, arg0->unk68.z); uvMat4RotateAxis(&arg0->unk108, arg0->unk78 * 0.5f, 'z'); uvMat4RotateAxis(&arg0->unk108, arg0->unk7C * 0.5f, 'x'); } @@ -382,7 +382,7 @@ static void func_802D3FA4(Unk802D3658_Arg0* arg0) { Vec3F sp24; uvMat4Copy(&arg0->unk108, &arg0->unk80); - uvMat4LocalTranslate(&arg0->unk108, arg0->unk68, arg0->unk6C, arg0->unk70); + uvMat4LocalTranslate(&arg0->unk108, arg0->unk68.x, arg0->unk68.y, arg0->unk68.z); uvMat4RotateAxis(&arg0->unk108, arg0->unk74, 'x'); if (arg0->unk0 & 0x04) { sp24.x = arg0->unk108.m[2][0] * 0.2f; @@ -529,21 +529,21 @@ void func_802D4514(Unk802D3658_Arg0* arg0) { temp4 = (var_fv0 * 1.1f) * arg0->unk38; ptr = arg0; - ptr->unk111C = 2; - arg0->unk1120[0].unk28.f[2] = 0.0f; - arg0->unk1120[0].unk28.f[1] = ptr->unk3C * 1.5f; - arg0->unk1120[0].unk28.f[0] = temp; - arg0->unk1120[0].unk1C.f[1] = ptr->unk3C * 1.5f; - arg0->unk1120[0].unk1C.f[0] = temp2; - arg0->unk1120[0].unk1C.f[2] = 0.0f; - arg0->unk1120[0].unk0 = 1; - arg0->unk1120[1].unk28.f[2] = temp3; - arg0->unk1120[1].unk28.f[1] = arg0->unk3C * 1.5f; - arg0->unk1120[1].unk1C.f[1] = arg0->unk3C * 1.5f; - arg0->unk1120[1].unk28.f[0] = 0.0f; - arg0->unk1120[1].unk1C.f[0] = 0.0f; - arg0->unk1120[1].unk1C.f[2] = temp4; - arg0->unk1120[1].unk0 = 1; + ptr->unk111C.unk0 = 2; + arg0->unk111C.unk4[0].unk28.f[2] = 0.0f; + arg0->unk111C.unk4[0].unk28.f[1] = ptr->unk3C * 1.5f; + arg0->unk111C.unk4[0].unk28.f[0] = temp; + arg0->unk111C.unk4[0].unk1C.f[1] = ptr->unk3C * 1.5f; + arg0->unk111C.unk4[0].unk1C.f[0] = temp2; + arg0->unk111C.unk4[0].unk1C.f[2] = 0.0f; + arg0->unk111C.unk4[0].unk0 = 1; + arg0->unk111C.unk4[1].unk28.f[2] = temp3; + arg0->unk111C.unk4[1].unk28.f[1] = arg0->unk3C * 1.5f; + arg0->unk111C.unk4[1].unk1C.f[1] = arg0->unk3C * 1.5f; + arg0->unk111C.unk4[1].unk28.f[0] = 0.0f; + arg0->unk111C.unk4[1].unk1C.f[0] = 0.0f; + arg0->unk111C.unk4[1].unk1C.f[2] = temp4; + arg0->unk111C.unk4[1].unk0 = 1; } void func_802D45C4(Unk802D3658_Arg0* arg0, f32 arg1) { @@ -695,8 +695,8 @@ s32 func_802D4A30(Unk802D3658_Arg0* arg0, Mtx4F* arg1) { uvMat4InvertTranslationRotation(&spB0, &spF0); for (i = 0; i < sp2A4; i++) { - var_s3 = &arg0->unk1228[i]; - temp_s2 = &arg0->unk1120[var_s3->unk0]; + var_s3 = &arg0->unk1224.unk4[i]; + temp_s2 = &arg0->unk111C.unk4[var_s3->unk0]; func_802DBE64(&arg0->unk111C, &arg0->unk1224, i, &spB0); func_802DCA5C(&temp_s2->unk28, &temp_s2->unk1C, &var_s3->unk28, &var_s3->unk34, &sp148); sp13C.x = arg1->m[3][0] + (arg1->m[1][0] * 1.5f * arg0->unk3C); diff --git a/src/app/code_5A6A0.h b/src/app/code_5A6A0.h index 8ca0d5cf..7b978545 100644 --- a/src/app/code_5A6A0.h +++ b/src/app/code_5A6A0.h @@ -105,7 +105,5 @@ void func_802D3170(u8, Unk802D3658_Arg0*); void func_802D3444(Unk802D3658_Arg0*); void func_802D50D0(Unk802D3658_Arg0*); void func_802D4514(Unk802D3658_Arg0*); -void func_802D45C4(Unk802D3658_Arg0*, f32); -s32 func_802D472C(Unk802D3658_Arg0*, Mtx4F*); #endif // CODE_5A6A0_H diff --git a/src/app/code_61A60.c b/src/app/code_61A60.c index 0dbab554..d5310f36 100644 --- a/src/app/code_61A60.c +++ b/src/app/code_61A60.c @@ -1,4 +1,7 @@ #include "common.h" +#include +#include +#include #include "code_61A60.h" #include "code_9A960.h" @@ -30,6 +33,12 @@ s32 D_8034EA7C[] = { 0x35, 0x14C, 0x9C, 0x1A7, 0x85, 0x128 }; s32 D_8034EA94[] = { 2, 2, 2, 2, 2, 2 }; Unk803599D0 D_8034EAAC = { 8, 0.36f, 0.0f, 0.412f, 0.1f, 0.465f, 0.25f, 0.517f, 0.475f, 0.568f, 0.5f, 0.62f, 0.475f, 0.673f, 0.25f, 0.725f, 0.0f, 0, 0, 0, 0 }; +// forward declarations +s32 func_802DB38C(Unk802D3658_Unk1228*, Vec3F*, Vec3F*); +s32 func_802DB6D4(Unk802D3658_Unk1228*, Vec3F*, Vec3F*); +s32 func_802DB9B8(Unk802D3658_Unk1228*, Vec3F*, Vec3F*); +s32 func_802DBCB0(Unk802D3658_Unk1228*, Vec3F*, Vec3F*); + #pragma GLOBAL_ASM("asm/nonmatchings/app/code_61A60/func_802DA530.s") #pragma GLOBAL_ASM("asm/nonmatchings/app/code_61A60/func_802DA54C.s") @@ -48,7 +57,43 @@ Unk803599D0 D_8034EAAC = { 8, 0.36f, 0.0f, 0.412f, 0.1f, 0.465f, 0.25f, 0.517f, #pragma GLOBAL_ASM("asm/nonmatchings/app/code_61A60/func_802DAB18.s") -#pragma GLOBAL_ASM("asm/nonmatchings/app/code_61A60/func_802DB050.s") +s32 func_802DB050(Unk802D3658_Unk111C* arg0, Unk802D3658_Unk1224* arg1, u16 arg2, u8 arg3, Mtx4F* arg4) { + Unk802D3658_Unk1120* var_s5; + Vec3F* var_s4; + s32 i; + Unk802D3658_Unk1228* temp_s0; + + if ((arg2 != 0xFFFF) && (arg3 & 1)) { + uvDobjState(arg2, arg3 - 1); + } + arg1->unk0 = 0; + for (i = 0; i < arg0->unk0; i++) { + var_s5 = &arg0->unk4[i]; + if (var_s5->unk0 != 0) { + uvMat4LocalToWorld(arg4, &var_s5->unk4, &var_s5->unk1C); + uvMat4LocalToWorld(arg4, &var_s5->unk10, &var_s5->unk28); + } + var_s4 = &var_s5->unk4; + temp_s0 = &arg1->unk4[arg1->unk0]; + if (func_802DB6D4(temp_s0, &var_s5->unk10, var_s4) != 0) { + temp_s0->unk0 = i; + arg1->unk0++; + } else if (func_802DB9B8(temp_s0, &var_s5->unk10, var_s4) != 0) { + temp_s0->unk0 = i; + arg1->unk0++; + } else if (func_802DB38C(temp_s0, &var_s5->unk10, var_s4) != 0) { + temp_s0->unk0 = i; + arg1->unk0++; + } else if (func_802DBCB0(temp_s0, &var_s5->unk10, var_s4) != 0) { + temp_s0->unk0 = i; + arg1->unk0++; + } + } + if (arg2 != 0xFFFF) { + uvDobjState(arg2, (s32)arg3); + } + return arg1->unk0; +} #pragma GLOBAL_ASM("asm/nonmatchings/app/code_61A60/func_802DB224.s") @@ -64,7 +109,47 @@ Unk803599D0 D_8034EAAC = { 8, 0.36f, 0.0f, 0.412f, 0.1f, 0.465f, 0.25f, 0.517f, #pragma GLOBAL_ASM("asm/nonmatchings/app/code_61A60/func_802DBE64.s") -#pragma GLOBAL_ASM("asm/nonmatchings/app/code_61A60/func_802DBF10.s") +s32 func_802DBF10(Unk802D3658_Unk111C* arg0, Unk802D3658_Unk1224* arg1, Vec3F* arg2, Vec3F* arg3) { + s32 pad[8]; + s32 ret; + Unk802D3658_Unk1228* unk4; + Vec3F* temp_v0; + Vec3F* temp_v1; + f32 temp_fa1; + f32 temp_fs0; + f32 temp_fs1; + f32 temp_fs2; + f32 temp_ft4; + f32 temp_fv0; + f32 curLen; + f32 emp_fv1; + f32 minLen; + s32 i; + + minLen = 1000000.0f; + + for (i = 0; i < arg1->unk0; i++) { + unk4 = &arg1->unk4[i]; + temp_fv0 = unk4->unk18; + temp_v0 = &arg0->unk4[unk4->unk0].unk10; + temp_v1 = &arg0->unk4[unk4->unk0].unk4; + temp_fs0 = temp_v0->x + ((temp_v1->x - temp_v0->x) * temp_fv0); + temp_fs1 = temp_v0->y + ((temp_v1->y - temp_v0->y) * temp_fv0); + temp_fs2 = temp_v0->z + ((temp_v1->z - temp_v0->z) * temp_fv0); + curLen = uvSqrtF(SQ(temp_fs0) + SQ(temp_fs1) + SQ(temp_fs2)); + if (curLen < minLen) { + ret = i; + arg2->x = temp_fs0; + arg2->y = temp_fs1; + arg2->z = temp_fs2; + minLen = curLen; + arg3->x = unk4->unk1C.x; + arg3->y = unk4->unk1C.y; + arg3->z = unk4->unk1C.z; + } + } + return ret; +} #pragma GLOBAL_ASM("asm/nonmatchings/app/code_61A60/func_802DC074.s") diff --git a/src/app/code_61A60.h b/src/app/code_61A60.h index 007162f8..975ff46c 100644 --- a/src/app/code_61A60.h +++ b/src/app/code_61A60.h @@ -2,12 +2,14 @@ #define APP_CODE_61A60_H #include -#include +#include #include +#include -s32 func_802DB050(s32*, s32*, u16, u8, Mtx4F*); +s32 func_802DB050(Unk802D3658_Unk111C*, Unk802D3658_Unk1224*, u16, u8, Mtx4F*); s32 func_802DB224(s32*, s32, u16, u8, Vec3F*, Vec3F*); void func_802DBE64(void*, void*, s32, Mtx4F*); +s32 func_802DBF10(Unk802D3658_Unk111C*, Unk802D3658_Unk1224*, Vec3F*, Vec3F*); s32 func_802DC8E4(s32); void func_802DCA5C(Vec3F*, Vec3F*, Vec3F*, Vec3F*, Vec3F*); diff --git a/src/app/code_66160.c b/src/app/code_66160.c index d68e98e0..240509fa 100644 --- a/src/app/code_66160.c +++ b/src/app/code_66160.c @@ -9,7 +9,7 @@ #include "code_66160.h" #include "code_9A960.h" -extern s32 D_80359D70; +extern Vec3F D_80359D70; extern s32 D_80359D7C; void func_802DEC30(s32 arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4, s32 arg5, s32 arg6, s32 arg7, s32 arg8, s32 arg9, s32 arg10, s32 arg11, s32 arg12, @@ -76,7 +76,7 @@ void func_802DFA18(void) { #pragma GLOBAL_ASM("asm/nonmatchings/app/code_66160/db_getgnd.s") -s32* func_802E02EC(void) { +Vec3F* func_802E02EC(void) { return &D_80359D70; } diff --git a/src/app/code_66160.h b/src/app/code_66160.h index 782e5438..ce556b0d 100644 --- a/src/app/code_66160.h +++ b/src/app/code_66160.h @@ -11,5 +11,11 @@ void screenDrawBox2(s32, s32, s32, s32, s32, s32, s32, s32); void screenDrawBoxSetup(void); void db_getstart(Mtx4F*, Vec3F*, u8*, f32*); void func_802DFA18(void); +u8 db_getgnd(Vec3F*, Vec3F*, s32*, s32*, f32*, f32*); +Vec3F* func_802E02EC(void); +void func_802E05CC(Mtx4F*, Vec3F*, f32*, s32); +void func_802E06AC(Mtx4F*); +void func_802E07D8(Mtx4F*); +u8 func_802E0C30(u8, s32); #endif // APP_CODE_66160_H diff --git a/src/app/code_72B70.h b/src/app/code_72B70.h index 4247b6ec..41ae955b 100644 --- a/src/app/code_72B70.h +++ b/src/app/code_72B70.h @@ -9,6 +9,135 @@ typedef struct { u8 pad1[0x157]; } Unk80367710; +// D_3067708 is pointer to this struct passed to other functions +typedef struct { + u16 unk0; + u8 unk2; + u16 unk4; + u8 pad6[0x8-6]; + f32 unk8; + u16 controller; + u8 padE[2]; + Mtx4F unk10; + Mtx4F unk50; + Mtx4F unk90; + f32 unkD0; + Unk802D3658_Arg0* unkD4; + u8 unkD8; + u8 padD9[3]; + f32 unkDC; + u8 padE0[0x4]; + f32 unkE4; + f32 unkE8; + f32 unkEC; + f32 unkF0; + u8 padF4[0x10]; + u8 unk104; + u8 unk105; + u8 pad106[0x15C - 0x106]; + u8 unk15C; + u8 pad160[0x16C - 0x160]; + f32 unk16C; + u8 pad170[0x200 - 0x170]; + Vec3F unk200; + u8 pad20C[0x218 - 0x20C]; + f32 unk218; + u8 pad21C[0x220 - 0x21C]; + f32 unk220; + f32 unk224; + u8 pad228[0x290 - 0x228]; + u8 unk290; + u8 pad291[0x294 - 0x291]; + Vec3F unk294; + f32 unk2A0; + f32 unk2A4; + f32 unk2A8; + f32 unk2AC; + f32 unk2B0; + f32 unk2B4; + u8 unk2B8; + u8 pad2B9[3]; + f32 unk2BC; + u8 unk2C0; + u8 pad2C1[3]; + f32 unk2C4; + u8 pad2C8[4]; + u8 unk2CC; + u8 pad2CD[3]; + f32 unk2D0; + f32 unk2D4; + f32 unk2D8; + f32 unk2DC; + f32 unk2E0; + f32 unk2E4; + f32 unk2E8; + f32 unk2EC; + u8 unk2F0; + u8 pad2F1[0x2F8 - 0x2F1]; + u8 unk2F8; + u8 unk2F9; + u8 pad2FA[0x2FC - 0x2FA]; + f32 unk2FC; + f32 unk300; + f32 unk304; + f32 unk308; + u8 pad30C[0x320 - 0x30C]; + f32 unk320; + f32 unk324; + f32 unk328; + f32 unk32C; + f32 unk330; + f32 unk334; + f32 unk338; + f32 unk33C; + f32 unk340; + f32 unk344; + f32 unk348; + f32 unk34C; + s32 unk350; + f32 unk354; + f32 unk358; + f32 unk35C; + f32 unk360; + f32 unk364; + f32 unk368; + f32 unk36C; + f32 unk370; + f32 unk374; + f32 unk378; + f32 unk37C; + f32 unk380; + f32 unk384; + f32 unk388; + f32 unk38C; + f32 unk390; + f32 unk394; + f32 unk398; + f32 unk39C; + f32 unk3A0; + f32 unk3A4; + f32 unk3A8; + f32 unk3AC; + f32 unk3B0; + f32 unk3B4; + f32 unk3B8; + f32 unk3BC; + f32 unk3C0; + u8 pad3C4[0x3F4 - 0x3C4]; + u16 unk3F4; + u8 unk3F6; + u8 unk3F7; + u8 unk3F8; + u8 unk3F9; + u8 pad3FA[0x3FE - 0x3FA]; + u8 unk3FE; + u8 unk3FF; + f32 unk400; + f32 unk404; + f32 unk408; + s32 unk40C; +} Unk80367704; + void func_802EB9C0(void); void func_802EBC30(void); void func_802EDDEC(Mtx4F*); diff --git a/src/app/code_7FED0.h b/src/app/code_7FED0.h index 7f0806da..0baf8ced 100644 --- a/src/app/code_7FED0.h +++ b/src/app/code_7FED0.h @@ -6,6 +6,7 @@ extern s32 D_8034F390; void func_802F8AB8(f32, f32, f32, f32, f32*); +void func_802F996C(f32, f32, f32, f32); void func_802F9BF8(s32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32); #endif // APP_CODE_7FED0_H diff --git a/src/app/code_B2900.c b/src/app/code_B2900.c index b5c6eb41..cf4c7891 100644 --- a/src/app/code_B2900.c +++ b/src/app/code_B2900.c @@ -45,7 +45,7 @@ u8 func_8032BF54(void) { if (levelGet_80346364() != 2) { return 0; } - return (func_80324AF4() != levelDataGetRNGS(&tmp) || func_803448F4() != levelDataGetTARG(&tmp) || func_802CC15C() == 0 || + return (func_80324AF4() != levelDataGetRNGS(&tmp) || func_803448F4() != levelDataGetTARG(&tmp) || ballsGet_802CC15C() == 0 || func_8030A080() != levelDataGetHPAD(&tmp) || func_802E57C4() != D_8035A5F0 || func_802D30B4() != levelDataGetBTGT((LevelBTGT**)&tmp) || func_802FB5A0() != levelDataGetHOPD((LevelHOPD**)&tmp)); } diff --git a/src/app/fdr.h b/src/app/fdr.h index c2ed486c..21d6562b 100644 --- a/src/app/fdr.h +++ b/src/app/fdr.h @@ -5,7 +5,8 @@ s32 func_802E6B5C(void); void func_802E65AC(Mtx4F*, u16*, f32*, f32*, s32*); -void func_802E682C(f32(*)[2], s32, u8); -void func_802E6870(f32(*)[2], s32, u8*); +void func_802E66DC(void); +void func_802E682C(f32*, s32 count, u8); +void func_802E6870(f32*, s32 count, u8*); #endif // APP_FDR_H diff --git a/src/app/hud.h b/src/app/hud.h index 294d4374..425a8777 100644 --- a/src/app/hud.h +++ b/src/app/hud.h @@ -131,6 +131,7 @@ void hud_8031A2CC(void); void hud_8031A794(s32 idx, f32 arg1, f32 arg2, f32 arg3); void hud_8031A874(s32 idx); s32 hud_8031A6C8(f32 arg0, f32 arg1, f32 arg2); +void hud_8031A810(s32 idx); void hud_8031A8E0(s32 idx); #endif // APP_HUD_H diff --git a/src/app/shadow.c b/src/app/shadow.c index 26aa6a06..7043b5a5 100644 --- a/src/app/shadow.c +++ b/src/app/shadow.c @@ -1,15 +1,53 @@ #include "common.h" +#include #include "shadow.h" -#pragma GLOBAL_ASM("asm/nonmatchings/app/shadow/func_803342F0.s") +extern s32 D_80350460; +extern s32 D_80350464; +extern s32 D_80350468; +extern s32 D_80350470; +extern f32 D_80350474; +extern f32 D_80350478; -#pragma GLOBAL_ASM("asm/nonmatchings/app/shadow/func_803342FC.s") +// forward declarations +void func_80334308(u16, u16); -#pragma GLOBAL_ASM("asm/nonmatchings/app/shadow/func_80334308.s") +void func_803342F0(f32 arg0) { + D_80350474 = arg0; +} + +void func_803342FC(f32 arg0) { + D_80350478 = arg0; +} -#pragma GLOBAL_ASM("asm/nonmatchings/app/shadow/func_803343D8.s") +#pragma GLOBAL_ASM("asm/nonmatchings/app/shadow/func_80334308.s") -#pragma GLOBAL_ASM("asm/nonmatchings/app/shadow/func_80334454.s") +void func_803343D8(s32 arg0) { + if (D_80350470 != 0xFFFF) { + if (arg0 != 0) { + if (D_80350460 == 0) { + uvDobjState(D_80350470, 2); + } + D_80350460 = 2; + } else { + if (D_80350460 != 0) { + uvDobjState(D_80350470, 0); + } + D_80350460 = 0; + } + } +} + +void func_80334454(u16 arg0, u16 arg1) { + D_80350468 = arg0; + D_80350464 = arg1; + if (arg0 != 0xFFFF) { + func_80334308(arg0, arg1); + } else if (arg1 != 0xFFFF) { + u32 a0 = arg1; + func_80334308(a0, arg1); + } +} #pragma GLOBAL_ASM("asm/nonmatchings/app/shadow/func_803344BC.s") diff --git a/src/app/shadow.h b/src/app/shadow.h index b46b5f5f..9ec6e5c5 100644 --- a/src/app/shadow.h +++ b/src/app/shadow.h @@ -1,6 +1,15 @@ #ifndef APP_SHADOW_H #define APP_SHADOW_H +#include +#include + +void func_803342F0(f32); +void func_803342FC(f32); +void func_803343D8(s32); +void func_80334454(u16, u16); +void func_803344BC(Mtx4F*, f32); +void func_80334C70(void); void func_80335B94(void); void func_80335BE4(void); void func_80335E44(void); diff --git a/src/app/snap.h b/src/app/snap.h index dea9b5a3..0a53edbc 100644 --- a/src/app/snap.h +++ b/src/app/snap.h @@ -2,10 +2,12 @@ #define APP_SNAP_H #include +#include "code_72B70.h" void func_80337D50(void); void func_80337DB8(void); void func_803383FC(void); +void func_80339E1C(Unk80367704*); s32 func_8033E3A8(s32); s32 func_8033F62C(void); s32 snapGetPhotoCount(void); diff --git a/src/app/task.c b/src/app/task.c index 35d8346e..55f361d9 100644 --- a/src/app/task.c +++ b/src/app/task.c @@ -84,7 +84,7 @@ void level_803449B0(void) { func_803232F0(); func_8034CD60(); func_802D22B0(); - func_802CAD00(); + ballsInit(); func_80316DC0(); func_80344290(); func_803097E0(); @@ -252,7 +252,7 @@ s32 level_80344FC8(s32 classIdx, s32 vehicle, s32 testIdx, u16* map, u16* arg4, func_803232F0(); func_8034CD60(); func_802D22B0(); - func_802CAD00(); + ballsInit(); func_80316DC0(); func_80344290(); func_803097E0(); @@ -291,7 +291,7 @@ void level_8034528C(void) { func_802EB598(); if (D_803507A0 == 0) { func_803239B4(); - func_802CB094(); + ballsLoad(); func_803442F8(); func_80309A64(); func_802D2ACC(); @@ -318,7 +318,7 @@ void level_803453AC(void) { veh = D_80362690->unk0[D_80362690->unk9C].unkC.veh; if (D_8035079C != 0) { func_80324A34(); - func_802CB35C(); + ballsDeinit(); func_8034467C(); func_80309FFC(); func_802D3030(); @@ -342,7 +342,7 @@ s32 level_80345464(Mtx4F* arg0, s32 arg1) { therm_8034695C(); func_8034D548(); func_802E15F0(); - func_802CB3F8(); + ballsFrameUpdate(); func_802E3F7C(); func_80317634(arg0); func_8034450C(arg0); @@ -483,7 +483,7 @@ void level_80345A24(void) { if ((veh != VEHICLE_CANNONBALL) && (veh != VEHICLE_SKY_DIVING)) { func_802D22D8(); } - func_802CAF50(); + balls_802CAF50(); func_80309868(); func_802D28D8(); func_802FAFF0(); @@ -534,7 +534,7 @@ s32 levelDataGetRNGS(void** data) { return D_8035078C->comm.countRNGS; } -s32 levelDataGetBALS(void** data) { +s32 levelDataGetBALS(LevelBALS** data) { *data = D_8035078C->dataBALS; return D_8035078C->comm.countBALS; } @@ -620,7 +620,7 @@ LevelCommObjects* levelLoadCommObj(u32 arg0) { dst->dataLWIN = mem_get(dst->comm.countLWIN * 0x54); dst->dataRNGS = mem_get(dst->comm.countRNGS * 0x84); dst->dataTHER = mem_get(dst->comm.countTHER * sizeof(LevelTHER)); - dst->dataBALS = mem_get(dst->comm.countBALS * 0x68); + dst->dataBALS = mem_get(dst->comm.countBALS * sizeof(LevelBALS)); dst->dataTARG = mem_get(dst->comm.countTARG * 0x20); dst->dataHPAD = mem_get(dst->comm.countHPAD * 0x40); dst->dataBTGT = mem_get(dst->comm.countBTGT * 0x1C); diff --git a/src/app/test_menu.c b/src/app/test_menu.c index b9c29e6c..4ad3d918 100644 --- a/src/app/test_menu.c +++ b/src/app/test_menu.c @@ -374,12 +374,12 @@ u8 testMenuHandler(Unk80367710* arg0) { D_80362690->unkA0 = 1; func_803239B4(); func_80309A64(); - func_802CB094(); + ballsLoad(); func_802E3A5C(); func_802E3E6C(); func_80324A34(); func_80309FFC(); - func_802CB35C(); + ballsDeinit(); D_80362690->unkA0 = 0; func_8030FE80(D_80362690, 1); testMenuInit(arg0, 2); From af5da30c904556e3db55a9ef6bb6062041f9303a Mon Sep 17 00:00:00 2001 From: queueRAM Date: Thu, 5 Mar 2026 09:02:11 +0000 Subject: [PATCH 2/2] Rename birdman files and decompile birdman1 and some of birdman2 Three birdman files: - 0x536E0/birdman0 - formerly end of balls.c - 0x556C0/birdman1 - formerly code_556C0 - 0x560D0/birdman2 - formerly birdman.c Decompile birdman1: - Decompile bird_802CEB68 - Decompile bird_802CEA60 - Decompile bird_802CE190 Decompile some of birdman2: - Decompile bird_802CEBA0 - Decompile bird_802CECB8 - Decompile bird_802CEDF8 - Decompile bird_802CF5B4 - Decompile bird_802CF640 - Decompile bird_802CF76C - Decompile bird_802CFEA8 - Decompile bird_802CFF74 - Decompile bird_802D0A28 - Decompile bird_802D08F8 - Decompile bird_802D0ABC - Update Unk80367704 struct --- config/us/pilotwings64.us.yaml | 12 +- config/us/sym/symbol_addrs_app.txt | 23 + include/uv_janim.h | 2 + src/app/balls.c | 831 ---------------------------- src/app/balls.h | 14 - src/app/birdman.c | 47 -- src/app/birdman.h | 22 +- src/app/birdman0.c | 841 +++++++++++++++++++++++++++++ src/app/birdman1.c | 186 +++++++ src/app/birdman2.c | 473 ++++++++++++++++ src/app/code_556C0.c | 8 - src/app/code_556C0.h | 10 - src/app/code_61A60.h | 1 + src/app/code_72B70.h | 63 ++- src/app/code_9A960.h | 10 +- 15 files changed, 1596 insertions(+), 947 deletions(-) delete mode 100644 src/app/birdman.c create mode 100644 src/app/birdman0.c create mode 100644 src/app/birdman1.c create mode 100644 src/app/birdman2.c delete mode 100644 src/app/code_556C0.c delete mode 100644 src/app/code_556C0.h diff --git a/config/us/pilotwings64.us.yaml b/config/us/pilotwings64.us.yaml index 8bf8b028..99299a07 100644 --- a/config/us/pilotwings64.us.yaml +++ b/config/us/pilotwings64.us.yaml @@ -365,8 +365,9 @@ segments: subsegments: - [0x51E30, c, app/code_51E30] - [0x52230, c, app/balls] - - [0x556C0, c, app/code_556C0] - - [0x560D0, c, app/birdman] + - [0x536E0, c, app/birdman0] + - [0x556C0, c, app/birdman1] + - [0x560D0, c, app/birdman2] - [0x58120, c, app/bmsound] - [0x58B00, c, app/code_58B00] - [0x597E0, c, app/bonus] @@ -465,7 +466,7 @@ segments: - [0xD5C40, data] # app/code_51E30 - [0xD5D40, .data, app/balls] - - [0xD5D50, .data, app/birdman] + - [0xD5D50, .data, app/birdman2] - [0xD5F10, .data, app/code_5A6A0] - [0xD5F20, .data, app/cannonball] - [0xD5F40, .data, app/code_60020] @@ -529,8 +530,9 @@ segments: - [0xD7F20, .data, app/code_D3810] - [0xD7F40, .rodata, app/code_51E30] - [0xD7F60, .rodata, app/balls] - - [0xD8340, .rodata, app/code_556C0] - - [0xD83B0, .rodata, app/birdman] + - [0xD7FC0, .rodata, app/birdman0] + - [0xD8340, .rodata, app/birdman1] + - [0xD83B0, .rodata, app/birdman2] - [0xD84A0, .rodata, app/bmsound] - [0xD8590, .rodata, app/code_58B00] - [0xD85D0, .rodata, app/bonus] diff --git a/config/us/sym/symbol_addrs_app.txt b/config/us/sym/symbol_addrs_app.txt index 2086e22e..0ea329a9 100644 --- a/config/us/sym/symbol_addrs_app.txt +++ b/config/us/sym/symbol_addrs_app.txt @@ -23,6 +23,7 @@ balls_802CC0D4 = 0x802CC0D4; // type:func ballsGetCount = 0x802CC13C; // type:func ballsGet_802CC15C = 0x802CC15C; // type:func +// birdman0 bird_802CC1B0 = 0x802CC1B0; // type:func bird_802CC270 = 0x802CC270; // type:func bird_802CC39C = 0x802CC39C; // type:func @@ -32,6 +33,28 @@ bird_802CD0F8 = 0x802CD0F8; // type:func bird_802CD2E8 = 0x802CD2E8; // type:func bird_802CE0A4 = 0x802CE0A4; // type:func +// birdman1 +bird_802CE190 = 0x802CE190; // type:func +bird_802CEA60 = 0x802CEA60; // type:func +bird_802CEB68 = 0x802CEB68; // type:func + +// birdman2 +bird_802CEBA0 = 0x802CEBA0; // type:func +bird_802CECB8 = 0x802CECB8; // type:func +bird_802CEDF8 = 0x802CEDF8; // type:func +bird_802CF24C = 0x802CF24C; // type:func +bird_802CF5B4 = 0x802CF5B4; // type:func +bird_802CF640 = 0x802CF640; // type:func +bird_802CF76C = 0x802CF76C; // type:func +bird_802CF8A4 = 0x802CF8A4; // type:func +bird_802CFAC8 = 0x802CFAC8; // type:func +bird_802CFEA8 = 0x802CFEA8; // type:func +bird_802CFF74 = 0x802CFF74; // type:func +bird_802D0080 = 0x802D0080; // type:func +bird_802D08F8 = 0x802D08F8; // type:func +bird_802D0A28 = 0x802D0A28; // type:func +bird_802D0ABC = 0x802D0ABC; // type:func + bonusStar_802D25AC = 0x802D25AC; // type:func cannon_802D5A90 = 0x802D5A90; // type:func diff --git a/include/uv_janim.h b/include/uv_janim.h index 476df1a2..3d4511a5 100644 --- a/include/uv_janim.h +++ b/include/uv_janim.h @@ -5,6 +5,8 @@ #include void* uvJanimLoad(s32); +void func_80200638(s32, Unk80371120*); +void func_802006FC(Unk80371120*, Unk80371120*, Unk80371120*, f32); void func_80200B00(s32, s32, f32); void uvJanimPoseLine(Unk80371120*, s32, f32); void uvJanimPoseGrid(Unk80371120*, s32, f32, f32); diff --git a/src/app/balls.c b/src/app/balls.c index 14d6a969..6ce396c2 100644 --- a/src/app/balls.c +++ b/src/app/balls.c @@ -7,21 +7,11 @@ #include #include #include "balls.h" -#include "birdman.h" -#include "bmsound.h" -#include "code_556C0.h" -#include "code_5A6A0.h" #include "code_61A60.h" #include "code_66160.h" -#include "code_72B70.h" #include "code_7FED0.h" #include "code_9A960.h" -#include "demo.h" -#include "fdr.h" #include "hud.h" -#include "shadow.h" -#include "snap.h" -#include "snd.h" // .data // list of model ids @@ -30,18 +20,12 @@ s32 D_8034E810[] = { 0xF4, 0xF5, 0xF6 }; // .bss extern f32 D_80359388; // always set to 5.3241148? extern LevelBALS* sRefBALS; -// part of split file? -extern Unk803599D0 D_80359390; -extern u8 D_803593E4; // forward declarations void ballsMotionUpdate(ParsedBALS*); void ballsFrameUpdateOne(ParsedBALS*); s32 balls_802CB6D4(ParsedBALS*); s32 balls_802CC0D4(u8 objId); -void bird_802CD0F8(Unk80367704*); -void bird_802CD2E8(u8, Unk80367704*); -void bird_802CE0A4(Unk80367704*); // called during startup, during test load menu, and while init any level void ballsInit(void) { @@ -527,818 +511,3 @@ u8 ballsGet_802CC15C(void) { } return ret; } - -// called during game boot -void bird_802CC1B0(void) { - D_80359390.unk0 = 8; - D_80359390.unk4 = 0.0f; - D_80359390.unk8 = 0.0f; - D_80359390.unkC = 0.2f; - D_80359390.unk10 = 0.04f; - D_80359390.unk14 = 0.4f; - D_80359390.unk18 = 0.16f; - D_80359390.unk1C = 0.6f; - D_80359390.unk20 = 0.36f; - D_80359390.unk24 = 0.7f; - D_80359390.unk28 = 0.49f; - D_80359390.unk2C = 0.8f; - D_80359390.unk30 = 0.64f; - D_80359390.unk34 = 0.9f; - D_80359390.unk38 = 0.81f; - D_80359390.unk40 = 1.0f; - D_80359390.unk3C = 1.0f; -} - -// called when starting one of the birdman levels, either from bonus menu or bonus star -void bird_802CC270(u8 arg0, u8 pilot, Unk80367704* arg2, Unk802D3658_Arg0* arg3) { - uvMemSet(arg2, 0, 0x424); - bird_802CD2E8(pilot, arg2); - arg2->unk0 = uvDobjAllocIdx(); - arg2->unk2 = 2; - uvDobjModel(arg2->unk0, arg2->unk3F4); - uvDobjPosm(arg2->unk0, 0, &arg2->unk10); - uvDobjState(arg2->unk0, arg2->unk2); - uvMat4Copy(&arg2->unk50, &arg2->unk10); - func_80334454(0x13D, 0x13C); - func_803342F0(1.0f); - func_803342FC(-2.0f); - func_803343D8(1); - arg2->controller = arg0; - arg2->unk2F0 = 0; - arg2->unk2CC = 0x1A; - arg2->unk4 = 0; - arg2->unkD4 = arg3; - arg2->unk2BC = 0.0f; - arg2->unk2C4 = 0.0f; - arg2->unk2D0 = 0.0f; - arg2->unk2D4 = 0.0f; - arg2->unk2D8 = 0.0f; - arg2->unk2DC = 0.0f; - uvModelGetProps(arg2->unk3F4, 1, &arg3->unk8, 0); - func_802CEBA0(arg2); - func_802D0BF0(arg2); -} - -// called when entering or exiting a birdman level -void bird_802CC39C(Unk80367704* arg0) { - db_getstart(&arg0->unk10, &arg0->unk200, NULL, NULL); - uvDobjPosm((s32)arg0->unk0, 0, &arg0->unk10); - uvMat4Copy(&arg0->unk50, &arg0->unk10); - func_802CECB8(arg0); - arg0->unk104 = 0; - arg0->unk105 = 0; - arg0->unk2 = 2; - arg0->unk290 = 1; - arg0->unkEC = 0.0f; - arg0->unkF0 = 0.0f; - arg0->unk8 = 0.0f; - arg0->unk2FC = 0.0f; - arg0->unk300 = 0.0f; - arg0->unk304 = 0.0f; - arg0->unk308 = 0.0f; - arg0->unk2E8 = 0.0f; - arg0->unk2E0 = 0.0f; - arg0->unk2EC = 0.0f; - arg0->unk2E4 = 0.0f; - bird_802CE0A4(arg0); - arg0->unkD8 = 0; - arg0->unkDC = 1.0f; - arg0->unkD4->unk1 = arg0->unkD8; - arg0->unkD4->unk4 = arg0->unk0; - arg0->unkD4->unk6 = arg0->unk2; - arg0->unkD4->unk0 = 1; - arg0->unkD4->unk74 = 0.0f; - arg0->unkD4->unk5C = 0; - arg0->unkD4->unk60 = -3.5f; - arg0->unkD4->unk64 = 0.5f; - arg0->unkD4->unk54 = 3.0f; - arg0->unkD4->unk58 = 6.5f; - arg0->unkD4->unk48 = 0.0125f; - arg0->unkD4->unk4C = 1.0f; - arg0->unkD4->unk50 = 0.0f; - arg0->unkD4->unk228 = 0.0f; - D_803593E4 = 0; - func_802D45C4(arg0->unkD4, arg0->unkDC); -} - -// called when exiting a birdman level -void bird_802CC51C(Unk802CC51C* arg0) { - uvDobjModel(arg0->objId, 0xFFFF); - arg0->unkC = 0xFFFF; - arg0->objId = 0xFFFF; - func_80334C70(); -} - -// called every frame in a birdman stage -// handles controller input and motion updates -void bird_802CC55C(Unk80367704* arg0, u8 arg1) { - f32 sp7C; - f32 sp78; - f32 pad; - s32 buttons; - HUDState* sp6C; - s32 sp68; - f32 temp_fv0; - f32 sp4C[6]; - f32 var_fa0; - s32 pad2; - f32 var_fv0; - f32 var_fv1; - - sp68 = 0; - if (arg0->unk104 == 2) { - bird_802CD0F8(arg0); - return; - } - if (func_802E6B5C() != 4) { - arg0->unk8 += D_8034F854; - if (D_80362690->unk0[D_80362690->unk9C].unkC.unk7B == 0) { - func_80339E1C(arg0); - } - if (arg1 == 6) { - func_802E65AC(&arg0->unk10, &D_80362690->unk0[0].unk6, &sp7C, &sp78, &buttons); - } else { - sp7C = demoGetInputs(arg0->controller, INPUT_AXIS_X); - sp78 = demoGetInputs(arg0->controller, INPUT_AXIS_Y); - buttons = demoGetButtons(arg0->controller); - if (sp7C > 0.0f) { - var_fv0 = sp7C; - } else { - var_fv0 = -sp7C; - } - temp_fv0 = func_80313F08(&D_80359390, var_fv0); - if (sp7C >= 0.0f) { - sp7C = temp_fv0; - } else { - sp7C = -temp_fv0; - } - if (sp78 > 0.0f) { - var_fv0 = sp78; - } else { - var_fv0 = -sp78; - } - temp_fv0 = func_80313F08(&D_80359390, var_fv0); - if (sp78 >= 0.0f) { - sp78 = temp_fv0; - } else { - sp78 = -temp_fv0; - } - } - if (D_803593E4 != 0) { - arg0->unkE4 = func_80313AF4(0.0f, arg0->unkE4, 3.0f); - arg0->unkE8 = func_80313AF4(0.0f, arg0->unkE8, 3.0f); - } else { - arg0->unkE4 = func_80313AF4(sp7C, arg0->unkE4, 3.0f); - arg0->unkE8 = func_80313AF4(sp78, arg0->unkE8, 3.0f); - } - if (demoButtonPress(arg0->controller, A_BUTTON)) { - sp68 = 1; - arg0->unk2DC -= 0.25f; - } - if (demoButtonPress(arg0->controller, B_BUTTON)) { - sp68 = 1; - arg0->unk2DC += 0.25f; - } - arg0->unk2DC = func_80313AF4(0.0f, arg0->unk2DC, 1.0f); - arg0->unk2D4 += arg0->unk2DC * D_8034F854; - if (arg0->unk2D4 < 0.f) { - arg0->unk2D4 = 0.f; - } - if (arg0->unk2D4 > 1.5707f) { - arg0->unk2D4 = 1.5707f; - } - if (sp68 != 0) { - arg0->unk2D0 += 9.0f * D_8034F854; - if (arg0->unk2D0 > 3.8f) { - arg0->unk2D0 = 3.8f; - } - } else { - arg0->unk2D0 = func_80313AF4(0.0f, arg0->unk2D0, 0.5f); - arg0->unk2D4 = func_80313AF4(0.0f, arg0->unk2D4, 0.4f); - } - if (arg1 != 6) { - func_802CEDF8(arg0); - } - func_802CE190(arg0, arg1); - if (arg1 != 6) { - sp4C[0] = arg0->unkD0; - sp4C[1] = arg0->unk2D0; - sp4C[2] = arg0->unk2D4; - sp4C[3] = (f32)arg0->unk2C0; - sp4C[4] = arg0->unk304; - sp4C[5] = arg0->unk308; - func_802E682C(sp4C, ARRAY_COUNT(sp4C), 0); - } else { - func_802E6870(sp4C, ARRAY_COUNT(sp4C), NULL); - arg0->unkD0 = sp4C[0]; - arg0->unk2D0 = sp4C[1]; - arg0->unk2D4 = sp4C[2]; - arg0->unk2C0 = (u8)sp4C[3]; - arg0->unk304 = sp4C[4]; - arg0->unk308 = sp4C[5]; - } - if (arg1 != 6) { - arg0->unkD0 = -1.57f; - if (arg0->unk224 < 25.0f) { - var_fa0 = (((25.0f - arg0->unk224) * 1.57f) / 25.0f) + -1.57f; - if ((arg0->unk16C < 4.0f) && (arg0->unk224 < 10.0f)) { - arg0->unkD0 = (((4.0f - arg0->unk16C) * 1.57f) / 2.5f) + -1.57f; - } - if (var_fa0 < arg0->unkD0) { - arg0->unkD0 = arg0->unkD0; - } else { - arg0->unkD0 = var_fa0; - } - } - if (arg0->unkD0 > 0.0f) { - arg0->unkD0 = 0.0f; - } - } - uvMat4SetIdentity(&arg0->unk90); - uvMat4RotateAxis(&arg0->unk90, arg0->unkD0, 'x'); - uvMat4Mul(&arg0->unk50, &arg0->unk90, &arg0->unk10); - uvDobjPosm(arg0->unk0, 0, &arg0->unk50); - func_803344BC(&arg0->unk10, arg0->unk16C); - if (arg0->unk224 > 25.0f) { - arg0->unkD4->unk48 = 0.0125f; - arg0->unkD4->unk5C = 0.0f; - arg0->unkD4->unk60 = -3.5f; - arg0->unkD4->unk64 = 0.5f; - } else { - var_fa0 = -arg0->unkD0 / 1.57f; - var_fv1 = arg0->unk224 / 25.0f; - if (var_fa0 < 0.0f) { - var_fa0 = 0.0f; - } else if (var_fa0 > 1.0f) { - var_fa0 = 1.0f; - } - if (var_fv1 < 0.0f) { - var_fv1 = 0.0f; - } else if (var_fv1 > 1.0f) { - var_fv1 = 1.0f; - } - if (var_fv1 < var_fa0) { - var_fv0 = var_fa0; - } else { - var_fv0 = var_fv1; - } - arg0->unkD4->unk48 = ((1.0f - var_fv0) * 0.15f) + (var_fv0 * 0.0125f); - arg0->unkD4->unk5C = 0 * var_fv0; - - arg0->unkD4->unk60 = (2.5f * var_fv0) + -6.0f; - arg0->unkD4->unk64 = (0.4f * var_fv0) + 0.1f; - } - if (D_803593E4 == 0) { - if (buttons & L_CBUTTONS) { - var_fa0 = 1.5707963f; - } else if (buttons & R_CBUTTONS) { - var_fa0 = -1.5707963f; - } else { - var_fa0 = 0.0f; - } - arg0->unkEC = func_80313AF4(var_fa0, arg0->unkEC, 1.1f); - if (buttons & D_CBUTTONS) { - var_fa0 = 1.5707963f; - } else if (buttons & U_CBUTTONS) { - var_fa0 = -1.5707963f; - } else { - var_fa0 = 0.0f; - } - arg0->unkF0 = func_80313AF4(var_fa0, arg0->unkF0, 1.1f); - } else { - arg0->unkEC = func_80313AF4(demoGetInputs(arg0->controller, 0) * -1.5707963f, arg0->unkEC, 3.0f); - arg0->unkF0 = func_80313AF4(demoGetInputs(arg0->controller, 1) * -1.5707963f, arg0->unkF0, 3.0f); - } - if (demoButtonPress(arg0->controller, R_TRIG) && (arg1 != 6) && (arg0->unk104 != 1)) { - D_803593E4 = 0; - if (arg0->unkD8 == 1) { - func_8033F758(0x6A, 1.0f, 0.5f, 0.0f); - arg0->unkD8 = 0; - arg0->unkDC = 1.0f; - func_80334454(0x13D, 0x13C); - arg0->unk290 = 1; - bird_802CE0A4(arg0); - } else { - func_8033F758(0x6A, 1.0f, 0.5f, 0.0f); - arg0->unkD8 = 1; - arg0->unkDC = 0.8f; - func_80334454(0x13D, 0x13C); - arg0->unk290 = 0; - bird_802CE0A4(arg0); - } - func_802D5884(arg0->unkD4, arg0->unkD8); - func_802D45C4(arg0->unkD4, arg0->unkDC); - } - if (arg1 != 6) { - arg0->unkD4->unk4 = arg0->unk0; - arg0->unkD4->unk6 = arg0->unk2; - arg0->unkD4->unk78 = arg0->unkEC; - arg0->unkD4->unk7C = arg0->unkF0; - arg0->unkD4->unk228 = arg0->unk16C; - uvMat4LocalToWorld(&arg0->unk90, &arg0->unkD4->unk68, &arg0->unk294); - uvMat4Copy(&arg0->unkD4->unk80, &arg0->unk10); - if (arg0->unk104 == 1) { - func_802D5884(arg0->unkD4, 6); - arg0->unk2 = 2; - uvDobjState(arg0->unk0, arg0->unk2); - } else { - func_802D5884(arg0->unkD4, arg0->unkD8); - } - func_802D45C4(arg0->unkD4, arg0->unkDC); - } - if ((arg0->unkD8 == 1) && (arg0->unk104 != 1) && (arg1 != 6)) { - arg0->unk290 = 0; - } else { - arg0->unk290 = 1; - } - if (arg0->unkD4->unk148 != 0) { - arg0->unk290 = 1; - } - bird_802CE0A4(arg0); - if (arg1 != 6) { - sp6C = hudGetState(); - uvMat4Copy(&sp6C->unk28, &arg0->unk10); - sp6C->renderFlags = 0x80; - sp6C->att.heading = arg0->unk10.m[3][2]; - sp6C->elapsedTime = arg0->unk8; - sp6C->unk8C = arg0->unk220 * 4.0f * 0.7f; - sp6C->altitude = arg0->unk16C * 0.7f; - sp6C->altSeaLevel = arg0->unk10.m[3][2] * 0.7f; - sp6C->speed = arg0->unk224 * 3.6f * 0.7f; - } - if ((arg0->unk104 == 1) || (arg0->unk104 == 2)) { - sp6C->renderFlags = 0; - } - func_802E06AC(&arg0->unk10); - if (arg1 != 6) { - if (arg0->unk104 == 2) { - func_802E66DC(); - } - func_802E65AC(&arg0->unk10, &D_80362690->unk0[0].unk6, &sp7C, &sp78, &buttons); - } - } -} - -void bird_802CD0F8(Unk80367704* arg0) { - f32 x; - f32 y; - f32 z; - Vec3F sp60; - Vec3F sp54; - Mtx4F* temp_a0; - Vec3F* var_a1; - f32 sp48; - Mtx4F* sp2C; - f32 sp40; - s32 sp3C; - s32 sp38; - u8 sp37; - u8 temp_v0; - u8 temp6; - - if (arg0->unk2F0 == 0) { - arg0->unk2F0 = 1; - sp60.x = arg0->unk10.m[3][0]; - sp54.x = arg0->unk400; - sp60.y = arg0->unk10.m[3][1]; - sp54.y = arg0->unk404; - sp60.z = arg0->unk10.m[3][2]; - sp54.z = arg0->unk408; - sp38 = arg0->unk40C; - temp_v0 = db_getgnd(&sp54, &sp60, &sp38, &sp3C, &sp40, &sp48); - sp37 = temp_v0; - if (temp_v0 != 0) { - var_a1 = func_802E02EC(); - } else { - var_a1 = &sp60; - sp60.z = sp40; - } - temp_a0 = &arg0->unk10; - sp2C = temp_a0; - func_802E05CC(temp_a0, var_a1, &sp48, 1); - if (func_802E0C30(sp37, sp3C) != 0) { - arg0->unk15C = 1; - } - uvDobjPosm(arg0->unk0, 0, sp2C); - uvMat4Copy(&arg0->unkD4->unk80, sp2C); - if (arg0->unk15C != 0) { - snd_play_sfx(0x1A); - uvEventPost(0x12, 0); - x = arg0->unk10.m[3][0]; - y = arg0->unk10.m[3][1]; - z = arg0->unk10.m[3][2]; - func_802F8AB8(x, y, z, 1.0f, &arg0->unk218); - arg0->unkD4->unk6 = arg0->unk2 = 0; - uvDobjState(arg0->unk0, arg0->unk2); - uvMat4Copy(&arg0->unkD4->unk80, sp2C); - } else { - arg0->unk2 = 2; - uvDobjState(arg0->unk0, arg0->unk2); - } - arg0->unk290 = 1; - bird_802CE0A4(arg0); - func_803343D8(0); - } - func_802D5884(arg0->unkD4, 3); - hudGetState()->renderFlags = 0; - if (arg0->unk15C != 0) { - arg0->unkD4->unk190 = 12.0f; - } else { - arg0->unkD4->unk190 = 6.0f; - } - func_802CEA60(arg0); -} - -// called during birdman init to setup pilot specific parameters -void bird_802CD2E8(u8 pilot, Unk80367704* arg1) { - switch (pilot) { - case PILOT_LARK: - arg1->unk294.x = 0; - arg1->unk294.y = -0.1625f; - arg1->unk294.z = 0.2869f; - arg1->unk3F4 = 0x13B; - arg1->unk3F7 = 0x16; - arg1->unk3F6 = 1; - arg1->unk3F8 = 2; - arg1->unk3F9 = 5; - arg1->unk2F8 = 0xF; - arg1->unk2F9 = 8; - arg1->unk2A0 = 0.6f; - arg1->unk2A4 = 1.0f; - arg1->unk2B0 = 0.8f; - arg1->unk2B4 = 0.8f; - arg1->unk2B8 = 0x44; - arg1->unk2C0 = 0x45; - arg1->unk2AC = 1.2f; - arg1->unk2A8 = 1.2f; - arg1->unk320 = 0.0f; - arg1->unk324 = 0.021f; - arg1->unk328 = 0.675f; - arg1->unk32C = -4.281f; - arg1->unk330 = -0.972f; - arg1->unk334 = 0.596f; - arg1->unk338 = 4.277f; - arg1->unk33C = -0.972f; - arg1->unk348 = 0.0f; - arg1->unk344 = 0.0f; - arg1->unk340 = 0.596f; - arg1->unk34C = -0.745f; - arg1->unk350 = 7; - arg1->unk354 = 0.0f; - arg1->unk358 = -1.426f; - arg1->unk35C = -0.098f; - arg1->unk360 = -0.018f; - arg1->unk364 = 0.125f; - arg1->unk368 = -1.368f; - arg1->unk36C = -0.401f; - arg1->unk370 = -0.084f; - arg1->unk374 = 0.25f; - arg1->unk378 = -1.019f; - arg1->unk37C = -0.815f; - arg1->unk380 = -0.234f; - arg1->unk384 = 0.625f; - arg1->unk388 = -1.271f; - arg1->unk38C = -0.175f; - arg1->unk390 = -0.158f; - arg1->unk394 = 0.75f; - arg1->unk398 = -1.133f; - arg1->unk39C = 0.561f; - arg1->unk3A0 = -0.274f; - arg1->unk3A4 = 0.875f; - arg1->unk3A8 = -1.12f; - arg1->unk3AC = 0.6f; - arg1->unk3B0 = -0.127f; - arg1->unk3B4 = 1.0f; - arg1->unk3B8 = -1.426f; - arg1->unk3BC = -0.098f; - arg1->unk3C0 = -0.018f; - break; - case PILOT_GOOSE: - arg1->unk294.x = 0; - arg1->unk294.y = -0.0994f; - arg1->unk294.z = 0.2577f; - arg1->unk3F4 = 0x13E; - arg1->unk3F7 = 0x16; - arg1->unk3F6 = 1; - arg1->unk3F8 = 2; - arg1->unk3F9 = 5; - arg1->unk2F8 = 0xF; - arg1->unk2F9 = 8; - arg1->unk2A0 = 0.6f; - arg1->unk2A4 = 1.0f; - arg1->unk2AC = 1.0f; - arg1->unk2A8 = 1.0f; - arg1->unk2B0 = 1.0f; - arg1->unk2B4 = 1.0f; - arg1->unk2B8 = 0x46; - arg1->unk2C0 = 0x47; - arg1->unk320 = 0.0f; - arg1->unk324 = 0.108f; - arg1->unk328 = 0.653f; - arg1->unk32C = -3.724f; - arg1->unk330 = -0.808f; - arg1->unk334 = 0.499f; - arg1->unk338 = 3.714f; - arg1->unk33C = -0.808f; - arg1->unk340 = 0.499f; - arg1->unk348 = 0.0f; - arg1->unk344 = 0.0f; - arg1->unk34C = -1.645f; - arg1->unk350 = 7; - arg1->unk354 = 0.0f; - arg1->unk358 = -1.457f; - arg1->unk35C = -0.05f; - arg1->unk360 = 0.491f; - arg1->unk364 = 0.125f; - arg1->unk368 = -1.416f; - arg1->unk36C = -0.426f; - arg1->unk370 = 0.377f; - arg1->unk374 = 0.25f; - arg1->unk378 = -0.864f; - arg1->unk37C = -1.022f; - arg1->unk380 = 0.137f; - arg1->unk384 = 0.625f; - arg1->unk388 = -1.439f; - arg1->unk38C = -0.011f; - arg1->unk390 = 0.486f; - arg1->unk394 = 0.75f; - arg1->unk398 = -1.249f; - arg1->unk39C = 0.762f; - arg1->unk3A0 = 0.202f; - arg1->unk3A4 = 0.875f; - arg1->unk3A8 = -1.152f; - arg1->unk3AC = 0.767f; - arg1->unk3B0 = 0.312f; - arg1->unk3B4 = 1.0f; - arg1->unk3B8 = -1.457f; - arg1->unk3BC = -0.05f; - arg1->unk3C0 = 0.491f; - break; - case PILOT_HAWK: - arg1->unk294.x = 0; - arg1->unk294.y = -0.07084f; - arg1->unk294.z = 0.57865f; - arg1->unk3F4 = 0x13F; - arg1->unk3F7 = 0x16; - arg1->unk3F6 = 1; - arg1->unk3F8 = 2; - arg1->unk3F9 = 5; - arg1->unk2F8 = 0xF; - arg1->unk2F9 = 8; - arg1->unk2A0 = 0.6f; - arg1->unk2A4 = 1.0f; - arg1->unk2B0 = 1.2f; - arg1->unk2B4 = 1.2f; - arg1->unk2B8 = 0x48; - arg1->unk2C0 = 0x49; - arg1->unk2AC = 0.8f; - arg1->unk2A8 = 0.8f; - arg1->unk320 = 0.0f; - arg1->unk324 = 0.108f; - arg1->unk328 = 0.627f; - arg1->unk32C = -3.643f; - arg1->unk330 = -0.796f; - arg1->unk334 = 0.476f; - arg1->unk338 = 3.643f; - arg1->unk33C = -0.796f; - arg1->unk340 = 0.476f; - arg1->unk348 = 0.0f; - arg1->unk344 = 0.0f; - arg1->unk34C = -1.228f; - arg1->unk350 = 7; - arg1->unk354 = 0.0f; - arg1->unk358 = -1.826f; - arg1->unk35C = -0.06f; - arg1->unk360 = 0.217f; - arg1->unk364 = 0.125f; - arg1->unk368 = -1.689f; - arg1->unk36C = -0.606f; - arg1->unk370 = 0.158f; - arg1->unk374 = 0.25f; - arg1->unk378 = -1.074f; - arg1->unk37C = -1.247f; - arg1->unk380 = -0.01f; - arg1->unk384 = 0.625f; - arg1->unk388 = -1.804f; - arg1->unk38C = -0.068f; - arg1->unk390 = 0.407f; - arg1->unk394 = 0.75f; - arg1->unk398 = -1.519f; - arg1->unk39C = 0.881f; - arg1->unk3A0 = 0.208f; - arg1->unk3A4 = 0.875f; - arg1->unk3A8 = -1.415f; - arg1->unk3AC = 0.89f; - arg1->unk3B0 = 0.392f; - arg1->unk3B8 = -1.826f; - arg1->unk3BC = -0.06f; - arg1->unk3B4 = 1.0f; - arg1->unk3C0 = 0.217f; - break; - case PILOT_KIWI: - arg1->unk294.x = 0; - arg1->unk294.y = 0.0015f; - arg1->unk294.z = 0.1942f; - arg1->unk3F4 = 0x140; - arg1->unk3F7 = 0x16; - arg1->unk3F6 = 1; - arg1->unk3F8 = 2; - arg1->unk3F9 = 5; - arg1->unk2F8 = 0xF; - arg1->unk2F9 = 8; - arg1->unk2A0 = 0.6f; - arg1->unk2A4 = 1.0f; - arg1->unk2B0 = 0.8f; - arg1->unk2B4 = 0.8f; - arg1->unk2B8 = 0x4A; - arg1->unk2C0 = 0x45; - arg1->unk2AC = 1.2f; - arg1->unk2A8 = 1.2f; - arg1->unk320 = 0.0f; - arg1->unk324 = 0.021f; - arg1->unk328 = 0.672f; - arg1->unk32C = -4.34f; - arg1->unk330 = -1.029f; - arg1->unk334 = 0.57f; - arg1->unk338 = 4.34f; - arg1->unk33C = -1.029f; - arg1->unk348 = 0.0f; - arg1->unk344 = 0.0f; - arg1->unk340 = 0.57f; - arg1->unk34C = -0.861f; - arg1->unk350 = 7; - arg1->unk354 = 0.0f; - arg1->unk358 = -1.426f; - arg1->unk35C = -0.098f; - arg1->unk360 = -0.018f; - arg1->unk364 = 0.125f; - arg1->unk368 = -1.368f; - arg1->unk36C = -0.401f; - arg1->unk370 = -0.084f; - arg1->unk374 = 0.25f; - arg1->unk378 = -1.019f; - arg1->unk37C = -0.815f; - arg1->unk380 = -0.234f; - arg1->unk384 = 0.625f; - arg1->unk388 = -1.271f; - arg1->unk38C = -0.175f; - arg1->unk390 = -0.158f; - arg1->unk394 = 0.75f; - arg1->unk398 = -1.133f; - arg1->unk39C = 0.561f; - arg1->unk3A0 = -0.274f; - arg1->unk3A4 = 0.875f; - arg1->unk3A8 = -1.12f; - arg1->unk3AC = 0.6f; - arg1->unk3B0 = -0.127f; - arg1->unk3B4 = 1.0f; - arg1->unk3B8 = -1.426f; - arg1->unk3BC = -0.098f; - arg1->unk3C0 = -0.018f; - break; - case PILOT_IBIS: - arg1->unk294.x = 0; - arg1->unk294.y = 0.0024f; - arg1->unk294.z = 0.3577f; - arg1->unk3F4 = 0x141; - arg1->unk3F7 = 0x16; - arg1->unk3F6 = 1; - arg1->unk3F8 = 2; - arg1->unk3F9 = 5; - arg1->unk2F8 = 0xF; - arg1->unk2F9 = 8; - arg1->unk2A0 = 0.6f; - arg1->unk2A4 = 1.0f; - arg1->unk2AC = 1.0f; - arg1->unk2A8 = 1.0f; - arg1->unk2B0 = 1.0f; - arg1->unk2B4 = 1.0f; - arg1->unk2B8 = 0x4B; - arg1->unk2C0 = 0x47; - arg1->unk320 = 0.0f; - arg1->unk324 = 0.108f; - arg1->unk328 = 0.731f; - arg1->unk32C = -4.225f; - arg1->unk330 = -0.89f; - arg1->unk334 = 0.715f; - arg1->unk338 = 4.226f; - arg1->unk33C = -0.89f; - arg1->unk340 = 0.666f; - arg1->unk348 = 0.0f; - arg1->unk344 = 0.0f; - arg1->unk34C = -1.427f; - arg1->unk350 = 7; - arg1->unk354 = 0.0f; - arg1->unk358 = -1.457f; - arg1->unk35C = -0.05f; - arg1->unk360 = 0.491f; - arg1->unk364 = 0.125f; - arg1->unk368 = -1.416f; - arg1->unk36C = -0.426f; - arg1->unk370 = 0.377f; - arg1->unk374 = 0.25f; - arg1->unk378 = -0.864f; - arg1->unk37C = -1.022f; - arg1->unk380 = 0.137f; - arg1->unk384 = 0.625f; - arg1->unk388 = -1.439f; - arg1->unk38C = -0.011f; - arg1->unk390 = 0.486f; - arg1->unk394 = 0.75f; - arg1->unk398 = -1.249f; - arg1->unk39C = 0.762f; - arg1->unk3A0 = 0.202f; - arg1->unk3A4 = 0.875f; - arg1->unk3A8 = -1.152f; - arg1->unk3AC = 0.767f; - arg1->unk3B0 = 0.312f; - arg1->unk3B4 = 1.0f; - arg1->unk3B8 = -1.457f; - arg1->unk3BC = -0.05f; - arg1->unk3C0 = 0.491f; - break; - case PILOT_ROBIN: - arg1->unk294.x = 0; - arg1->unk294.y = -0.0991f; - arg1->unk294.z = 0.4056f; - arg1->unk3F4 = 0x142; - arg1->unk3F7 = 0x16; - arg1->unk3F6 = 1; - arg1->unk3F8 = 2; - arg1->unk3F9 = 5; - arg1->unk2F8 = 0xF; - arg1->unk2F9 = 8; - arg1->unk2A0 = 0.6f; - arg1->unk2A4 = 1.0f; - arg1->unk2AC = 0.8f; - arg1->unk2A8 = 0.8f; - arg1->unk2B0 = 1.2f; - arg1->unk2B8 = 0x4C; - arg1->unk2C0 = 0x49; - arg1->unk2B4 = 1.2f; - arg1->unk320 = 0.0f; - arg1->unk324 = 0.108f; - arg1->unk328 = 0.782f; - arg1->unk32C = -4.206f; - arg1->unk330 = -0.202f; - arg1->unk334 = 0.574f; - arg1->unk338 = 4.207f; - arg1->unk33C = -0.202f; - arg1->unk348 = 0.0f; - arg1->unk344 = 0.0f; - arg1->unk340 = 0.574f; - arg1->unk34C = -1.138f; - arg1->unk350 = 7; - arg1->unk354 = 0.0f; - arg1->unk358 = -1.826f; - arg1->unk35C = -0.06f; - arg1->unk360 = 0.217f; - arg1->unk364 = 0.125f; - arg1->unk368 = -1.689f; - arg1->unk36C = -0.606f; - arg1->unk370 = 0.158f; - arg1->unk374 = 0.25f; - arg1->unk378 = -1.074f; - arg1->unk37C = -1.247f; - arg1->unk380 = -0.01f; - arg1->unk384 = 0.625f; - arg1->unk388 = -1.804f; - arg1->unk38C = -0.068f; - arg1->unk390 = 0.407f; - arg1->unk394 = 0.75f; - arg1->unk398 = -1.519f; - arg1->unk39C = 0.881f; - arg1->unk3A0 = 0.208f; - arg1->unk3A4 = 0.875f; - arg1->unk3A8 = -1.415f; - arg1->unk3AC = 0.89f; - arg1->unk3B0 = 0.392f; - arg1->unk3B4 = 1.0f; - arg1->unk3B8 = -1.826f; - arg1->unk3BC = -0.06f; - arg1->unk3C0 = 0.217f; - break; - default: - break; - } -} - -// called every frame during birdman -void bird_802CE0A4(Unk80367704* arg0) { - if (arg0->unk290 != 0) { - arg0->unk2 &= 0xFFFB; - uvDobjProps(arg0->unk0, 4, arg0->unk3F7, 0); - if (arg0->unk3F4 == 0x140) { - uvDobjProps(arg0->unk0, 4, 0x17, 0); - uvDobjProps(arg0->unk0, 4, 0x18, 0); - } - } else { - arg0->unk2 |= 4; - uvDobjProps(arg0->unk0, 5, arg0->unk3F7, 0); - if (arg0->unk3F4 == 0x140) { - uvDobjProps(arg0->unk0, 5, 0x17, 0); - uvDobjProps(arg0->unk0, 5, 0x18, 0); - } - } - uvDobjState(arg0->unk0, arg0->unk2); -} diff --git a/src/app/balls.h b/src/app/balls.h index 6f0e754a..fb7f40a7 100644 --- a/src/app/balls.h +++ b/src/app/balls.h @@ -42,12 +42,6 @@ typedef struct { u8 pad1A9[0x1AC - 0x1A9]; } ParsedBALS; // size: 0x1AC -typedef struct { - u16 objId; - u8 pad2[0xA]; - u16 unkC; -} Unk802CC51C; - extern u8 gBallCount; // initial ball count. never decremented extern u8 gBallSplitCount; // split ball count (5 after first split, 10 after second). never decremented extern ParsedBALS gBalls[20]; // array of balls loaded @@ -59,12 +53,4 @@ void ballsDeinit(void); void ballsFrameUpdate(void); u8 ballsGet_802CC15C(void); -// these should be split from this file -void bird_802CC1B0(void); -void bird_802CC270(u8, u8 pilot, Unk80367704*, Unk802D3658_Arg0*); -void bird_802CC39C(Unk80367704*); -void bird_802CC51C(Unk802CC51C*); -void bird_802CC55C(Unk80367704*, u8); -void bird_802CD0F8(Unk80367704*); - #endif // APP_BALLS_H diff --git a/src/app/birdman.c b/src/app/birdman.c deleted file mode 100644 index 2a7791a5..00000000 --- a/src/app/birdman.c +++ /dev/null @@ -1,47 +0,0 @@ -#include "common.h" -#include "birdman.h" - -f32 D_8034E820 = 0.175f; - -f32 D_8034E824[] = { -1.570797f, 0.0f, -0.26179948f, 0.005f, -0.2094396f, 0.01f, -0.1570797f, 0.02f, -0.0872665f, 0.05f, 0.0f, 0.1f, - 0.0523599f, 0.15f, 0.0698132f, 0.2f, 0.07679452f, 0.5f, 0.08028518f, 0.85f, 0.08552117f, 1.05f, 0.090757154f, 1.0f, - 0.1047198f, 0.85f, 0.1221731f, 1.05f, 0.1396264f, 1.43f, 0.1570797f, 1.65f, 0.174533f, 1.85f, 0.1919863f, 1.85f, - 0.2094396f, 1.15f, 0.26179948f, 0.8f, 0.31415939f, 0.5f, 0.52359897f, 0.5f, 1.570797f, 0.5f, 0.0f, 0.0f, - 0.5f, 0.1f, 5.0f, 0.25f, 10.0f, 0.8f, 20.0f, 1.0f, 30.0f, 0.9f, 35.0f, 0.75f, - 40.0f, 0.54f, 50.0f, 0.35f, 60.0f, 0.22f, 100.0f, 0.0f }; - -f32 D_8034E934[] = { 0.0f, 0.0f, 0.3f, 0.0f, 1.7f, 0.0f, 3.0f, 0.0f, 7.0f, 0.6f, 13.0f, -1.3f, 15.0f, -2.0f, 18.0f, -2.2f, 20.0f, -2.5f, 21.0f, -1.8f, - 23.9f, -1.0f, 24.0f, 0.0f, 24.1f, 1.0f, 25.0f, 2.0f, 33.5f, 2.2f, 36.0f, 2.0f, 51.0f, 1.8f, 67.0f, 1.3f, 81.5f, 20.0f, 100.0f, 50.0f }; - -// used in func_802CEBA0 -f32 D_8034E9D4[3] = { 0.0f }; - -#pragma GLOBAL_ASM("asm/nonmatchings/app/birdman/func_802CEBA0.s") - -#pragma GLOBAL_ASM("asm/nonmatchings/app/birdman/func_802CECB8.s") - -#pragma GLOBAL_ASM("asm/nonmatchings/app/birdman/func_802CEDF8.s") - -#pragma GLOBAL_ASM("asm/nonmatchings/app/birdman/func_802CF24C.s") - -#pragma GLOBAL_ASM("asm/nonmatchings/app/birdman/func_802CF5B4.s") - -#pragma GLOBAL_ASM("asm/nonmatchings/app/birdman/func_802CF640.s") - -#pragma GLOBAL_ASM("asm/nonmatchings/app/birdman/func_802CF76C.s") - -#pragma GLOBAL_ASM("asm/nonmatchings/app/birdman/func_802CF8A4.s") - -#pragma GLOBAL_ASM("asm/nonmatchings/app/birdman/func_802CFAC8.s") - -#pragma GLOBAL_ASM("asm/nonmatchings/app/birdman/func_802CFEA8.s") - -#pragma GLOBAL_ASM("asm/nonmatchings/app/birdman/func_802CFF74.s") - -#pragma GLOBAL_ASM("asm/nonmatchings/app/birdman/func_802D0080.s") - -#pragma GLOBAL_ASM("asm/nonmatchings/app/birdman/func_802D08F8.s") - -#pragma GLOBAL_ASM("asm/nonmatchings/app/birdman/func_802D0A28.s") - -#pragma GLOBAL_ASM("asm/nonmatchings/app/birdman/func_802D0ABC.s") diff --git a/src/app/birdman.h b/src/app/birdman.h index 57bb1690..07d4d83c 100644 --- a/src/app/birdman.h +++ b/src/app/birdman.h @@ -1,8 +1,24 @@ #ifndef APP_BIRDMAN_H #define APP_BIRDMAN_H -void func_802CEBA0(void*); -void func_802CECB8(void*); -void func_802CEDF8(void*); +#include "code_72B70.h" + +typedef struct { + u16 objId; + u8 pad2[0xA]; + u16 unkC; +} Unk802CC51C; + +void bird_802CC1B0(void); +void bird_802CC270(u8, u8 pilot, Unk80367704*, Unk802D3658_Arg0*); +void bird_802CC39C(Unk80367704*); +void bird_802CC51C(Unk802CC51C*); +void bird_802CC55C(Unk80367704*, u8); +void bird_802CD0F8(Unk80367704*); +void bird_802CE190(Unk80367704*, u8); +void bird_802CEA60(Unk80367704*); +void bird_802CEBA0(Unk80367704*); +void bird_802CECB8(Unk80367704*); +void bird_802CEDF8(Unk80367704*); #endif // APP_BIRDMAN_H diff --git a/src/app/birdman0.c b/src/app/birdman0.c new file mode 100644 index 00000000..1c4403ba --- /dev/null +++ b/src/app/birdman0.c @@ -0,0 +1,841 @@ +#include "common.h" +#include +#include +#include +#include +#include "birdman.h" +#include "bmsound.h" +#include "code_5A6A0.h" +#include "code_66160.h" +#include "code_72B70.h" +#include "code_7FED0.h" +#include "code_9A960.h" +#include "demo.h" +#include "fdr.h" +#include "hud.h" +#include "shadow.h" +#include "snap.h" +#include "snd.h" + +extern Unk803599D0 D_80359390; +extern u8 D_803593E4; + +// forward declarations +void bird_802CD0F8(Unk80367704*); +void bird_802CD2E8(u8, Unk80367704*); +void bird_802CE0A4(Unk80367704*); + +// called during game boot +void bird_802CC1B0(void) { + D_80359390.unk0 = 8; + D_80359390.unk4 = 0.0f; + D_80359390.unk8 = 0.0f; + D_80359390.unkC = 0.2f; + D_80359390.unk10 = 0.04f; + D_80359390.unk14 = 0.4f; + D_80359390.unk18 = 0.16f; + D_80359390.unk1C = 0.6f; + D_80359390.unk20 = 0.36f; + D_80359390.unk24 = 0.7f; + D_80359390.unk28 = 0.49f; + D_80359390.unk2C = 0.8f; + D_80359390.unk30 = 0.64f; + D_80359390.unk34 = 0.9f; + D_80359390.unk38 = 0.81f; + D_80359390.unk40 = 1.0f; + D_80359390.unk3C = 1.0f; +} + +// called when starting one of the birdman levels, either from bonus menu or bonus star +void bird_802CC270(u8 arg0, u8 pilot, Unk80367704* arg2, Unk802D3658_Arg0* arg3) { + uvMemSet(arg2, 0, 0x424); + bird_802CD2E8(pilot, arg2); + arg2->unk0 = uvDobjAllocIdx(); + arg2->unk2 = 2; + uvDobjModel(arg2->unk0, arg2->unk3F4); + uvDobjPosm(arg2->unk0, 0, &arg2->unk10); + uvDobjState(arg2->unk0, arg2->unk2); + uvMat4Copy(&arg2->unk50, &arg2->unk10); + func_80334454(0x13D, 0x13C); + func_803342F0(1.0f); + func_803342FC(-2.0f); + func_803343D8(1); + arg2->controller = arg0; + arg2->unk2F0 = 0; + arg2->unk2CC = 0x1A; + arg2->unk4 = 0; + arg2->unkD4 = arg3; + arg2->unk2BC = 0.0f; + arg2->unk2C4 = 0.0f; + arg2->unk2D0 = 0.0f; + arg2->unk2D4 = 0.0f; + arg2->unk2D8 = 0.0f; + arg2->unk2DC = 0.0f; + uvModelGetProps(arg2->unk3F4, 1, &arg3->unk8, 0); + bird_802CEBA0(arg2); + func_802D0BF0(arg2); +} + +// called when entering or exiting a birdman level +void bird_802CC39C(Unk80367704* arg0) { + db_getstart(&arg0->unk10, &arg0->unk200, NULL, NULL); + uvDobjPosm((s32)arg0->unk0, 0, &arg0->unk10); + uvMat4Copy(&arg0->unk50, &arg0->unk10); + bird_802CECB8(arg0); + arg0->unk104 = 0; + arg0->unk105 = 0; + arg0->unk2 = 2; + arg0->unk290 = 1; + arg0->unkEC = 0.0f; + arg0->unkF0 = 0.0f; + arg0->unk8 = 0.0f; + arg0->unk2FC = 0.0f; + arg0->unk300 = 0.0f; + arg0->unk304 = 0.0f; + arg0->unk308 = 0.0f; + arg0->unk2E8 = 0.0f; + arg0->unk2E0 = 0.0f; + arg0->unk2EC = 0.0f; + arg0->unk2E4 = 0.0f; + bird_802CE0A4(arg0); + arg0->unkD8 = 0; + arg0->unkDC = 1.0f; + arg0->unkD4->unk1 = arg0->unkD8; + arg0->unkD4->unk4 = arg0->unk0; + arg0->unkD4->unk6 = arg0->unk2; + arg0->unkD4->unk0 = 1; + arg0->unkD4->unk74 = 0.0f; + arg0->unkD4->unk5C = 0; + arg0->unkD4->unk60 = -3.5f; + arg0->unkD4->unk64 = 0.5f; + arg0->unkD4->unk54 = 3.0f; + arg0->unkD4->unk58 = 6.5f; + arg0->unkD4->unk48 = 0.0125f; + arg0->unkD4->unk4C = 1.0f; + arg0->unkD4->unk50 = 0.0f; + arg0->unkD4->unk228 = 0.0f; + D_803593E4 = 0; + func_802D45C4(arg0->unkD4, arg0->unkDC); +} + +// called when exiting a birdman level +void bird_802CC51C(Unk802CC51C* arg0) { + uvDobjModel(arg0->objId, 0xFFFF); + arg0->unkC = 0xFFFF; + arg0->objId = 0xFFFF; + func_80334C70(); +} + +// called every frame in a birdman stage +// handles controller input and motion updates +void bird_802CC55C(Unk80367704* arg0, u8 arg1) { + f32 sp7C; + f32 sp78; + f32 pad; + s32 buttons; + HUDState* sp6C; + s32 sp68; + f32 temp_fv0; + f32 sp4C[6]; + f32 var_fa0; + s32 pad2; + f32 var_fv0; + f32 var_fv1; + + sp68 = 0; + if (arg0->unk104 == 2) { + bird_802CD0F8(arg0); + return; + } + if (func_802E6B5C() != 4) { + arg0->unk8 += D_8034F854; + if (D_80362690->unk0[D_80362690->unk9C].unkC.unk7B == 0) { + func_80339E1C(arg0); + } + if (arg1 == 6) { + func_802E65AC(&arg0->unk10, &D_80362690->unk0[0].unk6, &sp7C, &sp78, &buttons); + } else { + sp7C = demoGetInputs(arg0->controller, INPUT_AXIS_X); + sp78 = demoGetInputs(arg0->controller, INPUT_AXIS_Y); + buttons = demoGetButtons(arg0->controller); + if (sp7C > 0.0f) { + var_fv0 = sp7C; + } else { + var_fv0 = -sp7C; + } + temp_fv0 = func_80313F08(&D_80359390, var_fv0); + if (sp7C >= 0.0f) { + sp7C = temp_fv0; + } else { + sp7C = -temp_fv0; + } + if (sp78 > 0.0f) { + var_fv0 = sp78; + } else { + var_fv0 = -sp78; + } + temp_fv0 = func_80313F08(&D_80359390, var_fv0); + if (sp78 >= 0.0f) { + sp78 = temp_fv0; + } else { + sp78 = -temp_fv0; + } + } + if (D_803593E4 != 0) { + arg0->unkE4 = func_80313AF4(0.0f, arg0->unkE4, 3.0f); + arg0->unkE8 = func_80313AF4(0.0f, arg0->unkE8, 3.0f); + } else { + arg0->unkE4 = func_80313AF4(sp7C, arg0->unkE4, 3.0f); + arg0->unkE8 = func_80313AF4(sp78, arg0->unkE8, 3.0f); + } + if (demoButtonPress(arg0->controller, A_BUTTON)) { + sp68 = 1; + arg0->unk2DC -= 0.25f; + } + if (demoButtonPress(arg0->controller, B_BUTTON)) { + sp68 = 1; + arg0->unk2DC += 0.25f; + } + arg0->unk2DC = func_80313AF4(0.0f, arg0->unk2DC, 1.0f); + arg0->unk2D4 += arg0->unk2DC * D_8034F854; + if (arg0->unk2D4 < 0.f) { + arg0->unk2D4 = 0.f; + } + if (arg0->unk2D4 > 1.5707f) { + arg0->unk2D4 = 1.5707f; + } + if (sp68 != 0) { + arg0->unk2D0 += 9.0f * D_8034F854; + if (arg0->unk2D0 > 3.8f) { + arg0->unk2D0 = 3.8f; + } + } else { + arg0->unk2D0 = func_80313AF4(0.0f, arg0->unk2D0, 0.5f); + arg0->unk2D4 = func_80313AF4(0.0f, arg0->unk2D4, 0.4f); + } + if (arg1 != 6) { + bird_802CEDF8(arg0); + } + bird_802CE190(arg0, arg1); + if (arg1 != 6) { + sp4C[0] = arg0->unkD0; + sp4C[1] = arg0->unk2D0; + sp4C[2] = arg0->unk2D4; + sp4C[3] = (f32)arg0->unk2C0; + sp4C[4] = arg0->unk304; + sp4C[5] = arg0->unk308; + func_802E682C(sp4C, ARRAY_COUNT(sp4C), 0); + } else { + func_802E6870(sp4C, ARRAY_COUNT(sp4C), NULL); + arg0->unkD0 = sp4C[0]; + arg0->unk2D0 = sp4C[1]; + arg0->unk2D4 = sp4C[2]; + arg0->unk2C0 = (u8)sp4C[3]; + arg0->unk304 = sp4C[4]; + arg0->unk308 = sp4C[5]; + } + if (arg1 != 6) { + arg0->unkD0 = -1.57f; + if (arg0->unk224 < 25.0f) { + var_fa0 = (((25.0f - arg0->unk224) * 1.57f) / 25.0f) + -1.57f; + if ((arg0->unk16C < 4.0f) && (arg0->unk224 < 10.0f)) { + arg0->unkD0 = (((4.0f - arg0->unk16C) * 1.57f) / 2.5f) + -1.57f; + } + if (var_fa0 < arg0->unkD0) { + arg0->unkD0 = arg0->unkD0; + } else { + arg0->unkD0 = var_fa0; + } + } + if (arg0->unkD0 > 0.0f) { + arg0->unkD0 = 0.0f; + } + } + uvMat4SetIdentity(&arg0->unk90); + uvMat4RotateAxis(&arg0->unk90, arg0->unkD0, 'x'); + uvMat4Mul(&arg0->unk50, &arg0->unk90, &arg0->unk10); + uvDobjPosm(arg0->unk0, 0, &arg0->unk50); + func_803344BC(&arg0->unk10, arg0->unk16C); + if (arg0->unk224 > 25.0f) { + arg0->unkD4->unk48 = 0.0125f; + arg0->unkD4->unk5C = 0.0f; + arg0->unkD4->unk60 = -3.5f; + arg0->unkD4->unk64 = 0.5f; + } else { + var_fa0 = -arg0->unkD0 / 1.57f; + var_fv1 = arg0->unk224 / 25.0f; + if (var_fa0 < 0.0f) { + var_fa0 = 0.0f; + } else if (var_fa0 > 1.0f) { + var_fa0 = 1.0f; + } + if (var_fv1 < 0.0f) { + var_fv1 = 0.0f; + } else if (var_fv1 > 1.0f) { + var_fv1 = 1.0f; + } + if (var_fv1 < var_fa0) { + var_fv0 = var_fa0; + } else { + var_fv0 = var_fv1; + } + arg0->unkD4->unk48 = ((1.0f - var_fv0) * 0.15f) + (var_fv0 * 0.0125f); + arg0->unkD4->unk5C = 0 * var_fv0; + + arg0->unkD4->unk60 = (2.5f * var_fv0) + -6.0f; + arg0->unkD4->unk64 = (0.4f * var_fv0) + 0.1f; + } + if (D_803593E4 == 0) { + if (buttons & L_CBUTTONS) { + var_fa0 = 1.5707963f; + } else if (buttons & R_CBUTTONS) { + var_fa0 = -1.5707963f; + } else { + var_fa0 = 0.0f; + } + arg0->unkEC = func_80313AF4(var_fa0, arg0->unkEC, 1.1f); + if (buttons & D_CBUTTONS) { + var_fa0 = 1.5707963f; + } else if (buttons & U_CBUTTONS) { + var_fa0 = -1.5707963f; + } else { + var_fa0 = 0.0f; + } + arg0->unkF0 = func_80313AF4(var_fa0, arg0->unkF0, 1.1f); + } else { + arg0->unkEC = func_80313AF4(demoGetInputs(arg0->controller, 0) * -1.5707963f, arg0->unkEC, 3.0f); + arg0->unkF0 = func_80313AF4(demoGetInputs(arg0->controller, 1) * -1.5707963f, arg0->unkF0, 3.0f); + } + if (demoButtonPress(arg0->controller, R_TRIG) && (arg1 != 6) && (arg0->unk104 != 1)) { + D_803593E4 = 0; + if (arg0->unkD8 == 1) { + func_8033F758(0x6A, 1.0f, 0.5f, 0.0f); + arg0->unkD8 = 0; + arg0->unkDC = 1.0f; + func_80334454(0x13D, 0x13C); + arg0->unk290 = 1; + bird_802CE0A4(arg0); + } else { + func_8033F758(0x6A, 1.0f, 0.5f, 0.0f); + arg0->unkD8 = 1; + arg0->unkDC = 0.8f; + func_80334454(0x13D, 0x13C); + arg0->unk290 = 0; + bird_802CE0A4(arg0); + } + func_802D5884(arg0->unkD4, arg0->unkD8); + func_802D45C4(arg0->unkD4, arg0->unkDC); + } + if (arg1 != 6) { + arg0->unkD4->unk4 = arg0->unk0; + arg0->unkD4->unk6 = arg0->unk2; + arg0->unkD4->unk78 = arg0->unkEC; + arg0->unkD4->unk7C = arg0->unkF0; + arg0->unkD4->unk228 = arg0->unk16C; + uvMat4LocalToWorld(&arg0->unk90, &arg0->unkD4->unk68, &arg0->unk294); + uvMat4Copy(&arg0->unkD4->unk80, &arg0->unk10); + if (arg0->unk104 == 1) { + func_802D5884(arg0->unkD4, 6); + arg0->unk2 = 2; + uvDobjState(arg0->unk0, arg0->unk2); + } else { + func_802D5884(arg0->unkD4, arg0->unkD8); + } + func_802D45C4(arg0->unkD4, arg0->unkDC); + } + if ((arg0->unkD8 == 1) && (arg0->unk104 != 1) && (arg1 != 6)) { + arg0->unk290 = 0; + } else { + arg0->unk290 = 1; + } + if (arg0->unkD4->unk148 != 0) { + arg0->unk290 = 1; + } + bird_802CE0A4(arg0); + if (arg1 != 6) { + sp6C = hudGetState(); + uvMat4Copy(&sp6C->unk28, &arg0->unk10); + sp6C->renderFlags = 0x80; + sp6C->att.heading = arg0->unk10.m[3][2]; + sp6C->elapsedTime = arg0->unk8; + sp6C->unk8C = arg0->unk218.z * 4.0f * 0.7f; + sp6C->altitude = arg0->unk16C * 0.7f; + sp6C->altSeaLevel = arg0->unk10.m[3][2] * 0.7f; + sp6C->speed = arg0->unk224 * 3.6f * 0.7f; + } + if ((arg0->unk104 == 1) || (arg0->unk104 == 2)) { + sp6C->renderFlags = 0; + } + func_802E06AC(&arg0->unk10); + if (arg1 != 6) { + if (arg0->unk104 == 2) { + func_802E66DC(); + } + func_802E65AC(&arg0->unk10, &D_80362690->unk0[0].unk6, &sp7C, &sp78, &buttons); + } + } +} + +void bird_802CD0F8(Unk80367704* arg0) { + f32 x; + f32 y; + f32 z; + Vec3F sp60; + Vec3F sp54; + Mtx4F* temp_a0; + Vec3F* var_a1; + f32 sp48; + Mtx4F* sp2C; + f32 sp40; + s32 sp3C; + s32 sp38; + u8 sp37; + u8 temp_v0; + u8 temp6; + + if (arg0->unk2F0 == 0) { + arg0->unk2F0 = 1; + sp60.x = arg0->unk10.m[3][0]; + sp54.x = arg0->unk400.x; + sp60.y = arg0->unk10.m[3][1]; + sp54.y = arg0->unk400.y; + sp60.z = arg0->unk10.m[3][2]; + sp54.z = arg0->unk400.z; + sp38 = arg0->unk40C; + temp_v0 = db_getgnd(&sp54, &sp60, &sp38, &sp3C, &sp40, &sp48); + sp37 = temp_v0; + if (temp_v0 != 0) { + var_a1 = func_802E02EC(); + } else { + var_a1 = &sp60; + sp60.z = sp40; + } + temp_a0 = &arg0->unk10; + sp2C = temp_a0; + func_802E05CC(temp_a0, var_a1, &sp48, 1); + if (func_802E0C30(sp37, sp3C) != 0) { + arg0->unk15C = 1; + } + uvDobjPosm(arg0->unk0, 0, sp2C); + uvMat4Copy(&arg0->unkD4->unk80, sp2C); + if (arg0->unk15C != 0) { + snd_play_sfx(0x1A); + uvEventPost(0x12, 0); + x = arg0->unk10.m[3][0]; + y = arg0->unk10.m[3][1]; + z = arg0->unk10.m[3][2]; + func_802F8AB8(x, y, z, 1.0f, &arg0->unk218.x); + arg0->unkD4->unk6 = arg0->unk2 = 0; + uvDobjState(arg0->unk0, arg0->unk2); + uvMat4Copy(&arg0->unkD4->unk80, sp2C); + } else { + arg0->unk2 = 2; + uvDobjState(arg0->unk0, arg0->unk2); + } + arg0->unk290 = 1; + bird_802CE0A4(arg0); + func_803343D8(0); + } + func_802D5884(arg0->unkD4, 3); + hudGetState()->renderFlags = 0; + if (arg0->unk15C != 0) { + arg0->unkD4->unk190 = 12.0f; + } else { + arg0->unkD4->unk190 = 6.0f; + } + bird_802CEA60(arg0); +} + +// called during birdman init to setup pilot specific parameters +void bird_802CD2E8(u8 pilot, Unk80367704* arg1) { + switch (pilot) { + case PILOT_LARK: + arg1->unk294.x = 0; + arg1->unk294.y = -0.1625f; + arg1->unk294.z = 0.2869f; + arg1->unk3F4 = 0x13B; + arg1->unk3F7 = 0x16; + arg1->unk3F6 = 1; + arg1->unk3F8 = 2; + arg1->unk3F9 = 5; + arg1->unk2F8 = 0xF; + arg1->unk2F9 = 8; + arg1->unk2A0 = 0.6f; + arg1->unk2A4 = 1.0f; + arg1->unk2B0 = 0.8f; + arg1->unk2B4 = 0.8f; + arg1->unk2B8 = 0x44; + arg1->unk2C0 = 0x45; + arg1->unk2AC = 1.2f; + arg1->unk2A8 = 1.2f; + arg1->unk320.x = 0.0f; + arg1->unk320.y = 0.021f; + arg1->unk320.z = 0.675f; + arg1->unk32C.x = -4.281f; + arg1->unk32C.y = -0.972f; + arg1->unk32C.z = 0.596f; + arg1->unk338.x = 4.277f; + arg1->unk338.y = -0.972f; + arg1->unk344.y = 0.0f; + arg1->unk344.x = 0.0f; + arg1->unk338.z = 0.596f; + arg1->unk344.z = -0.745f; + arg1->unk350 = 7; + arg1->unk354 = 0.0f; + arg1->unk358 = -1.426f; + arg1->unk35C = -0.098f; + arg1->unk360 = -0.018f; + arg1->unk364 = 0.125f; + arg1->unk368 = -1.368f; + arg1->unk36C = -0.401f; + arg1->unk370 = -0.084f; + arg1->unk374 = 0.25f; + arg1->unk378 = -1.019f; + arg1->unk37C = -0.815f; + arg1->unk380 = -0.234f; + arg1->unk384 = 0.625f; + arg1->unk388 = -1.271f; + arg1->unk38C = -0.175f; + arg1->unk390 = -0.158f; + arg1->unk394 = 0.75f; + arg1->unk398 = -1.133f; + arg1->unk39C = 0.561f; + arg1->unk3A0 = -0.274f; + arg1->unk3A4 = 0.875f; + arg1->unk3A8 = -1.12f; + arg1->unk3AC = 0.6f; + arg1->unk3B0 = -0.127f; + arg1->unk3B4 = 1.0f; + arg1->unk3B8 = -1.426f; + arg1->unk3BC = -0.098f; + arg1->unk3C0 = -0.018f; + break; + case PILOT_GOOSE: + arg1->unk294.x = 0; + arg1->unk294.y = -0.0994f; + arg1->unk294.z = 0.2577f; + arg1->unk3F4 = 0x13E; + arg1->unk3F7 = 0x16; + arg1->unk3F6 = 1; + arg1->unk3F8 = 2; + arg1->unk3F9 = 5; + arg1->unk2F8 = 0xF; + arg1->unk2F9 = 8; + arg1->unk2A0 = 0.6f; + arg1->unk2A4 = 1.0f; + arg1->unk2AC = 1.0f; + arg1->unk2A8 = 1.0f; + arg1->unk2B0 = 1.0f; + arg1->unk2B4 = 1.0f; + arg1->unk2B8 = 0x46; + arg1->unk2C0 = 0x47; + arg1->unk320.x = 0.0f; + arg1->unk320.y = 0.108f; + arg1->unk320.z = 0.653f; + arg1->unk32C.x = -3.724f; + arg1->unk32C.y = -0.808f; + arg1->unk32C.z = 0.499f; + arg1->unk338.x = 3.714f; + arg1->unk338.y = -0.808f; + arg1->unk338.z = 0.499f; + arg1->unk344.y = 0.0f; + arg1->unk344.x = 0.0f; + arg1->unk344.z = -1.645f; + arg1->unk350 = 7; + arg1->unk354 = 0.0f; + arg1->unk358 = -1.457f; + arg1->unk35C = -0.05f; + arg1->unk360 = 0.491f; + arg1->unk364 = 0.125f; + arg1->unk368 = -1.416f; + arg1->unk36C = -0.426f; + arg1->unk370 = 0.377f; + arg1->unk374 = 0.25f; + arg1->unk378 = -0.864f; + arg1->unk37C = -1.022f; + arg1->unk380 = 0.137f; + arg1->unk384 = 0.625f; + arg1->unk388 = -1.439f; + arg1->unk38C = -0.011f; + arg1->unk390 = 0.486f; + arg1->unk394 = 0.75f; + arg1->unk398 = -1.249f; + arg1->unk39C = 0.762f; + arg1->unk3A0 = 0.202f; + arg1->unk3A4 = 0.875f; + arg1->unk3A8 = -1.152f; + arg1->unk3AC = 0.767f; + arg1->unk3B0 = 0.312f; + arg1->unk3B4 = 1.0f; + arg1->unk3B8 = -1.457f; + arg1->unk3BC = -0.05f; + arg1->unk3C0 = 0.491f; + break; + case PILOT_HAWK: + arg1->unk294.x = 0; + arg1->unk294.y = -0.07084f; + arg1->unk294.z = 0.57865f; + arg1->unk3F4 = 0x13F; + arg1->unk3F7 = 0x16; + arg1->unk3F6 = 1; + arg1->unk3F8 = 2; + arg1->unk3F9 = 5; + arg1->unk2F8 = 0xF; + arg1->unk2F9 = 8; + arg1->unk2A0 = 0.6f; + arg1->unk2A4 = 1.0f; + arg1->unk2B0 = 1.2f; + arg1->unk2B4 = 1.2f; + arg1->unk2B8 = 0x48; + arg1->unk2C0 = 0x49; + arg1->unk2AC = 0.8f; + arg1->unk2A8 = 0.8f; + arg1->unk320.x = 0.0f; + arg1->unk320.y = 0.108f; + arg1->unk320.z = 0.627f; + arg1->unk32C.x = -3.643f; + arg1->unk32C.y = -0.796f; + arg1->unk32C.z = 0.476f; + arg1->unk338.x = 3.643f; + arg1->unk338.y = -0.796f; + arg1->unk338.z = 0.476f; + arg1->unk344.y = 0.0f; + arg1->unk344.x = 0.0f; + arg1->unk344.z = -1.228f; + arg1->unk350 = 7; + arg1->unk354 = 0.0f; + arg1->unk358 = -1.826f; + arg1->unk35C = -0.06f; + arg1->unk360 = 0.217f; + arg1->unk364 = 0.125f; + arg1->unk368 = -1.689f; + arg1->unk36C = -0.606f; + arg1->unk370 = 0.158f; + arg1->unk374 = 0.25f; + arg1->unk378 = -1.074f; + arg1->unk37C = -1.247f; + arg1->unk380 = -0.01f; + arg1->unk384 = 0.625f; + arg1->unk388 = -1.804f; + arg1->unk38C = -0.068f; + arg1->unk390 = 0.407f; + arg1->unk394 = 0.75f; + arg1->unk398 = -1.519f; + arg1->unk39C = 0.881f; + arg1->unk3A0 = 0.208f; + arg1->unk3A4 = 0.875f; + arg1->unk3A8 = -1.415f; + arg1->unk3AC = 0.89f; + arg1->unk3B0 = 0.392f; + arg1->unk3B8 = -1.826f; + arg1->unk3BC = -0.06f; + arg1->unk3B4 = 1.0f; + arg1->unk3C0 = 0.217f; + break; + case PILOT_KIWI: + arg1->unk294.x = 0; + arg1->unk294.y = 0.0015f; + arg1->unk294.z = 0.1942f; + arg1->unk3F4 = 0x140; + arg1->unk3F7 = 0x16; + arg1->unk3F6 = 1; + arg1->unk3F8 = 2; + arg1->unk3F9 = 5; + arg1->unk2F8 = 0xF; + arg1->unk2F9 = 8; + arg1->unk2A0 = 0.6f; + arg1->unk2A4 = 1.0f; + arg1->unk2B0 = 0.8f; + arg1->unk2B4 = 0.8f; + arg1->unk2B8 = 0x4A; + arg1->unk2C0 = 0x45; + arg1->unk2AC = 1.2f; + arg1->unk2A8 = 1.2f; + arg1->unk320.x = 0.0f; + arg1->unk320.y = 0.021f; + arg1->unk320.z = 0.672f; + arg1->unk32C.x = -4.34f; + arg1->unk32C.y = -1.029f; + arg1->unk32C.z = 0.57f; + arg1->unk338.x = 4.34f; + arg1->unk338.y = -1.029f; + arg1->unk344.y = 0.0f; + arg1->unk344.x = 0.0f; + arg1->unk338.z = 0.57f; + arg1->unk344.z = -0.861f; + arg1->unk350 = 7; + arg1->unk354 = 0.0f; + arg1->unk358 = -1.426f; + arg1->unk35C = -0.098f; + arg1->unk360 = -0.018f; + arg1->unk364 = 0.125f; + arg1->unk368 = -1.368f; + arg1->unk36C = -0.401f; + arg1->unk370 = -0.084f; + arg1->unk374 = 0.25f; + arg1->unk378 = -1.019f; + arg1->unk37C = -0.815f; + arg1->unk380 = -0.234f; + arg1->unk384 = 0.625f; + arg1->unk388 = -1.271f; + arg1->unk38C = -0.175f; + arg1->unk390 = -0.158f; + arg1->unk394 = 0.75f; + arg1->unk398 = -1.133f; + arg1->unk39C = 0.561f; + arg1->unk3A0 = -0.274f; + arg1->unk3A4 = 0.875f; + arg1->unk3A8 = -1.12f; + arg1->unk3AC = 0.6f; + arg1->unk3B0 = -0.127f; + arg1->unk3B4 = 1.0f; + arg1->unk3B8 = -1.426f; + arg1->unk3BC = -0.098f; + arg1->unk3C0 = -0.018f; + break; + case PILOT_IBIS: + arg1->unk294.x = 0; + arg1->unk294.y = 0.0024f; + arg1->unk294.z = 0.3577f; + arg1->unk3F4 = 0x141; + arg1->unk3F7 = 0x16; + arg1->unk3F6 = 1; + arg1->unk3F8 = 2; + arg1->unk3F9 = 5; + arg1->unk2F8 = 0xF; + arg1->unk2F9 = 8; + arg1->unk2A0 = 0.6f; + arg1->unk2A4 = 1.0f; + arg1->unk2AC = 1.0f; + arg1->unk2A8 = 1.0f; + arg1->unk2B0 = 1.0f; + arg1->unk2B4 = 1.0f; + arg1->unk2B8 = 0x4B; + arg1->unk2C0 = 0x47; + arg1->unk320.x = 0.0f; + arg1->unk320.y = 0.108f; + arg1->unk320.z = 0.731f; + arg1->unk32C.x = -4.225f; + arg1->unk32C.y = -0.89f; + arg1->unk32C.z = 0.715f; + arg1->unk338.x = 4.226f; + arg1->unk338.y = -0.89f; + arg1->unk338.z = 0.666f; + arg1->unk344.y = 0.0f; + arg1->unk344.x = 0.0f; + arg1->unk344.z = -1.427f; + arg1->unk350 = 7; + arg1->unk354 = 0.0f; + arg1->unk358 = -1.457f; + arg1->unk35C = -0.05f; + arg1->unk360 = 0.491f; + arg1->unk364 = 0.125f; + arg1->unk368 = -1.416f; + arg1->unk36C = -0.426f; + arg1->unk370 = 0.377f; + arg1->unk374 = 0.25f; + arg1->unk378 = -0.864f; + arg1->unk37C = -1.022f; + arg1->unk380 = 0.137f; + arg1->unk384 = 0.625f; + arg1->unk388 = -1.439f; + arg1->unk38C = -0.011f; + arg1->unk390 = 0.486f; + arg1->unk394 = 0.75f; + arg1->unk398 = -1.249f; + arg1->unk39C = 0.762f; + arg1->unk3A0 = 0.202f; + arg1->unk3A4 = 0.875f; + arg1->unk3A8 = -1.152f; + arg1->unk3AC = 0.767f; + arg1->unk3B0 = 0.312f; + arg1->unk3B4 = 1.0f; + arg1->unk3B8 = -1.457f; + arg1->unk3BC = -0.05f; + arg1->unk3C0 = 0.491f; + break; + case PILOT_ROBIN: + arg1->unk294.x = 0; + arg1->unk294.y = -0.0991f; + arg1->unk294.z = 0.4056f; + arg1->unk3F4 = 0x142; + arg1->unk3F7 = 0x16; + arg1->unk3F6 = 1; + arg1->unk3F8 = 2; + arg1->unk3F9 = 5; + arg1->unk2F8 = 0xF; + arg1->unk2F9 = 8; + arg1->unk2A0 = 0.6f; + arg1->unk2A4 = 1.0f; + arg1->unk2AC = 0.8f; + arg1->unk2A8 = 0.8f; + arg1->unk2B0 = 1.2f; + arg1->unk2B8 = 0x4C; + arg1->unk2C0 = 0x49; + arg1->unk2B4 = 1.2f; + arg1->unk320.x = 0.0f; + arg1->unk320.y = 0.108f; + arg1->unk320.z = 0.782f; + arg1->unk32C.x = -4.206f; + arg1->unk32C.y = -0.202f; + arg1->unk32C.z = 0.574f; + arg1->unk338.x = 4.207f; + arg1->unk338.y = -0.202f; + arg1->unk344.y = 0.0f; + arg1->unk344.x = 0.0f; + arg1->unk338.z = 0.574f; + arg1->unk344.z = -1.138f; + arg1->unk350 = 7; + arg1->unk354 = 0.0f; + arg1->unk358 = -1.826f; + arg1->unk35C = -0.06f; + arg1->unk360 = 0.217f; + arg1->unk364 = 0.125f; + arg1->unk368 = -1.689f; + arg1->unk36C = -0.606f; + arg1->unk370 = 0.158f; + arg1->unk374 = 0.25f; + arg1->unk378 = -1.074f; + arg1->unk37C = -1.247f; + arg1->unk380 = -0.01f; + arg1->unk384 = 0.625f; + arg1->unk388 = -1.804f; + arg1->unk38C = -0.068f; + arg1->unk390 = 0.407f; + arg1->unk394 = 0.75f; + arg1->unk398 = -1.519f; + arg1->unk39C = 0.881f; + arg1->unk3A0 = 0.208f; + arg1->unk3A4 = 0.875f; + arg1->unk3A8 = -1.415f; + arg1->unk3AC = 0.89f; + arg1->unk3B0 = 0.392f; + arg1->unk3B4 = 1.0f; + arg1->unk3B8 = -1.826f; + arg1->unk3BC = -0.06f; + arg1->unk3C0 = 0.217f; + break; + default: + break; + } +} + +// called every frame during birdman +void bird_802CE0A4(Unk80367704* arg0) { + if (arg0->unk290 != 0) { + arg0->unk2 &= 0xFFFB; + uvDobjProps(arg0->unk0, 4, arg0->unk3F7, 0); + if (arg0->unk3F4 == 0x140) { + uvDobjProps(arg0->unk0, 4, 0x17, 0); + uvDobjProps(arg0->unk0, 4, 0x18, 0); + } + } else { + arg0->unk2 |= 4; + uvDobjProps(arg0->unk0, 5, arg0->unk3F7, 0); + if (arg0->unk3F4 == 0x140) { + uvDobjProps(arg0->unk0, 5, 0x17, 0); + uvDobjProps(arg0->unk0, 5, 0x18, 0); + } + } + uvDobjState(arg0->unk0, arg0->unk2); +} diff --git a/src/app/birdman1.c b/src/app/birdman1.c new file mode 100644 index 00000000..d550e280 --- /dev/null +++ b/src/app/birdman1.c @@ -0,0 +1,186 @@ +#include "common.h" +#include +#include +#include +#include +#include +#include "birdman.h" +#include "code_9A960.h" +#include "demo.h" + +void bird_802CE190(Unk80367704* arg0, u8 arg1) { + Mtx4F sp558; + Unk80371120 sp3A8; + Unk80371120 sp1F8; + Unk80371120 sp48; + f32 temp_fv1_2; + f32 sp40; + f32 var_fa0; + s32 pad; + f32 sp34; + f32 sp30; + + if (arg0->unk2D0 <= 0.1f) { + if ((arg0->unk2BC > 0.195f) || (arg0->unk2BC < 0.175f)) { + arg0->unk2BC += (0.1f * D_8034F854); + arg0->unk2D0 = 0.1f; + } else { + arg0->unk2BC += (arg0->unk2D0 * D_8034F854); + } + } else { + arg0->unk2BC += arg0->unk2D0 * D_8034F854; + } + if (arg0->unk2BC >= 1.0f) { + arg0->unk2BC -= (s32)arg0->unk2BC; + } + if ((arg0->unk224 > 47.5f) && (arg0->unkE8 > 0.7f)) { + temp_fv1_2 = (arg0->unk224 / 20.0f) + 1.1f; + switch (arg0->unk2CC) { + case 26: + arg0->unk2C4 += temp_fv1_2 * D_8034F854; + if (arg0->unk2C4 > 1.0f) { + arg0->unk2C4 = 1.0f; + arg0->unk2CC = 27; + arg0->unk2C8 = (f32)(demoRandF() + 25.0f); + } + break; + case 27: + arg0->unk2C8 = (f32)(arg0->unk2C8 - D_8034F854); + if (arg0->unk2C8 < 0.0f) { + arg0->unk2CC = 28; + } + break; + case 28: + arg0->unk2C4 -= temp_fv1_2 * D_8034F854; + if (arg0->unk2C4 < 0.0f) { + arg0->unk2CC = 26; + arg0->unk2C4 = 0.0f; + } + break; + } + } else { + if (arg0->unk2C4 > 0.0f) { + arg0->unk2C4 = arg0->unk2C4 - (1.1f * D_8034F854); + if (arg0->unk2C4 < 0.0f) { + arg0->unk2C4 = 0.0f; + arg0->unk2CC = 26; + } + } + } + func_80200B00(arg0->unk0, arg0->unk2B8, arg0->unk2BC); + uvDobjGetPosm(arg0->unk0, arg0->unk2F8, &sp558); + uvMat4RotateAxis(&sp558, arg0->unk2D4 * 0.66f, 'x'); + uvDobjPosm(arg0->unk0, arg0->unk2F8, &sp558); + uvDobjGetPosm(arg0->unk0, arg0->unk2F9, &sp558); + uvMat4RotateAxis(&sp558, arg0->unk2D4 * 0.66f, 'x'); + uvDobjPosm(arg0->unk0, arg0->unk2F9, &sp558); + arg0->unk2D8 = arg0->unk2D4; + if (arg0->unk2C4 != 0.0f) { + uvDobj_802180DC(arg0->unk0, &sp3A8); + uvJanimPoseLine(&sp1F8, arg0->unk2C0, 0.0f); + func_802006FC(&sp48, &sp3A8, &sp1F8, arg0->unk2C4); + func_80200638(arg0->unk0, &sp48); + } + uvModelGetPosm(arg0->unk3F4, arg0->unk3F7, &sp558); + uvMat4RotateAxis(&sp558, ((arg0->unkE8 * -0.5f) + arg0->unkF0) - (0.7f * arg0->unkD0), 'x'); + uvMat4RotateAxis(&sp558, arg0->unkEC - arg0->unkE4, 'z'); + uvDobjPosm(arg0->unk0, arg0->unk3F7, &sp558); + if (arg0->unk3F4 == 320) { + sp34 = arg0->unk200.z / 5.0f; + if (sp34 < -1.0f) { + sp34 = -1.0f; + } else if (sp34 > 1.0f) { + sp34 = 1.0f; + } + sp30 = ((uvCosF(arg0->unkE4) * arg0->unk200.x) / 10.0f) + ((uvSinF(arg0->unkE4) * arg0->unk200.y) / 10.0f); + if (sp30 < -1.5f) { + sp30 = -1.5f; + } else if (sp30 > 1.5f) { + sp30 = 1.5f; + } + arg0->unk2E0 = func_80313AF4(((uvRandF_RANLUX() * 0.2f) + 0.8f) * sp34, arg0->unk2E0, 15.0f); + uvRandF_RANLUX(); + arg0->unk2E8 = func_80313AF4(sp30, arg0->unk2E8, 15.0f); + arg0->unk2E4 = func_80313AF4(((uvRandF_RANLUX() * 0.2f) + 0.8f) * sp34, arg0->unk2E4, 15.0f); + uvRandF_RANLUX(); + arg0->unk2EC = func_80313AF4(sp30, arg0->unk2EC, 15.0f); + uvModelGetPosm(arg0->unk3F4, 0x18, &sp558); + uvMat4RotateAxis(&sp558, arg0->unk2E0, 'x'); + uvMat4RotateAxis(&sp558, arg0->unk2E8, 'z'); + uvDobjPosm(arg0->unk0, 0x18, &sp558); + uvModelGetPosm(arg0->unk3F4, 0x17, &sp558); + uvMat4RotateAxis(&sp558, arg0->unk2E4, 'x'); + uvMat4RotateAxis(&sp558, arg0->unk2EC, 'z'); + uvDobjPosm(arg0->unk0, 0x17, &sp558); + } + if (arg1 != 6) { + arg0->unk2FC = func_80313AF4(uvSinF(arg0->unkD0) * (2.0f * arg0->unk24C), arg0->unk2FC, 0.5f); + if (arg0->unk2FC < -1.047f) { + arg0->unk2FC = -1.047f; + } else if (arg0->unk2FC > 1.047f) { + arg0->unk2FC = 1.047f; + } + arg0->unk300 = func_80313AF4(-arg0->unk228.z, arg0->unk300, 2.0f); + if (arg0->unk300 > 12.0f) { + arg0->unk300 = 12.0f; + } else if (arg0->unk300 < -12.0f) { + arg0->unk300 = -12.0f; + } + sp40 = arg0->unk300 * -0.07f; + if (sp40 < -1.5707961f) { // DEG_TO_RAD(-90) + sp40 = -1.5707961f; + } else if (sp40 > 1.0471975f) { // DEG_TO_RAD(60) + sp40 = 1.0471975f; + } + var_fa0 = arg0->unk228.x * 0.02f; + if (var_fa0 < -0.3490658f) { // DEG_TO_RAD(-20) + var_fa0 = -0.3490658f; + } else if (var_fa0 > 0.3490658f) { // DEG_TO_RAD(20) + var_fa0 = 0.3490658f; + } + arg0->unk308 = func_80313AF4(var_fa0, arg0->unk308, 2.0f); + arg0->unk304 = func_80313AF4(sp40, arg0->unk304, 5.0f); + } + uvModelGetPosm(arg0->unk3F4, arg0->unk3F8, &sp558); + uvMat4RotateAxis(&sp558, arg0->unk304, 'x'); + uvMat4RotateAxis(&sp558, arg0->unk308, 'y'); + uvDobjPosm(arg0->unk0, arg0->unk3F8, &sp558); + uvModelGetPosm(arg0->unk3F4, arg0->unk3F9, &sp558); + uvMat4RotateAxis(&sp558, arg0->unk304, 'x'); + uvMat4RotateAxis(&sp558, arg0->unk308, 'y'); + uvDobjPosm(arg0->unk0, arg0->unk3F9, &sp558); + uvModelGetPosm(arg0->unk3F4, arg0->unk3F6, &sp558); + uvMat4RotateAxis(&sp558, arg0->unk2FC, 'z'); + uvDobjPosm(arg0->unk0, arg0->unk3F6, &sp558); + if (arg0->unk105 != 0) { + uvModelGetPosm(arg0->unk3F4, arg0->unk3F8, &sp558); + uvDobjPosm(arg0->unk0, arg0->unk3F8, &sp558); + uvModelGetPosm(arg0->unk3F4, arg0->unk3F9, &sp558); + uvDobjPosm(arg0->unk0, arg0->unk3F9, &sp558); + uvModelGetPosm(arg0->unk3F4, arg0->unk3F6, &sp558); + uvDobjPosm(arg0->unk0, arg0->unk3F6, &sp558); + uvModelGetPosm(arg0->unk3F4, 5, &sp558); + uvDobjPosm(arg0->unk0, 5, &sp558); + } +} + +void bird_802CEA60(Unk80367704* arg0) { + Mtx4F sp28; + f32 sp24; + f32 sp20; + + sp20 = uvCosF(12.5f * D_8034F850); + sp24 = uvSinF(10.3f * D_8034F850) * (0.8f * sp20); + uvModelGetPosm(arg0->unk3F4, arg0->unk3F8, &sp28); + uvMat4RotateAxis(&sp28, sp24 + 0.2f, 'x'); + uvDobjPosm(arg0->unk0, arg0->unk3F8, &sp28); + uvModelGetPosm(arg0->unk3F4, arg0->unk3F9, &sp28); + uvMat4RotateAxis(&sp28, 0.2f - sp24, 'x'); + uvDobjPosm(arg0->unk0, arg0->unk3F9, &sp28); +} + +void bird_802CEB68(Unk80367704* arg0, s32 arg1) { + if (arg0->unk104 == 2) { + bird_802CEA60(arg0); + } +} diff --git a/src/app/birdman2.c b/src/app/birdman2.c new file mode 100644 index 00000000..436fbb4e --- /dev/null +++ b/src/app/birdman2.c @@ -0,0 +1,473 @@ +#include "common.h" +#include +#include +#include +#include "birdman.h" +#include "code_61A60.h" +#include "code_66160.h" +#include "code_9A960.h" +#include "environment.h" + +typedef struct { + s32 unk0; + s32 unk4; +} Unk803593F0; + +typedef struct { + Vec2F unk0[23]; + Vec2F unkB8[11]; +} Unk8034E824; + +typedef struct { + Vec2F unk0[20]; +} Unk8034E934; + +f32 D_8034E820 = 0.175f; + +Unk8034E824 D_8034E824 = { + { + + { -1.570797f, 0.0f }, { -0.26179948f, 0.005f }, { -0.2094396f, 0.01f }, { -0.1570797f, 0.02f }, { -0.0872665f, 0.05f }, { 0.0f, 0.1f }, + { 0.0523599f, 0.15f }, { 0.0698132f, 0.2f }, { 0.07679452f, 0.5f }, { 0.08028518f, 0.85f }, { 0.08552117f, 1.05f }, { 0.090757154f, 1.0f }, + { 0.1047198f, 0.85f }, { 0.1221731f, 1.05f }, { 0.1396264f, 1.43f }, { 0.1570797f, 1.65f }, { 0.174533f, 1.85f }, { 0.1919863f, 1.85f }, + { 0.2094396f, 1.15f }, { 0.26179948f, 0.8f }, { 0.31415939f, 0.5f }, { 0.52359897f, 0.5f }, { 1.570797f, 0.5f } }, + { + + { 0.0f, 0.0f }, + { 0.5f, 0.1f }, + { 5.0f, 0.25f }, + { 10.0f, 0.8f }, + { 20.0f, 1.0f }, + { 30.0f, 0.9f }, + { 35.0f, 0.75f }, + { 40.0f, 0.54f }, + { 50.0f, 0.35f }, + { 60.0f, 0.22f }, + { 100.0f, 0.0f } } +}; + +Unk8034E934 D_8034E934 = { + { { 0.0f, 0.0f }, { 0.3f, 0.0f }, { 1.7f, 0.0f }, { 3.0f, 0.0f }, { 7.0f, 0.6f }, { 13.0f, -1.3f }, { 15.0f, -2.0f }, + { 18.0f, -2.2f }, { 20.0f, -2.5f }, { 21.0f, -1.8f }, { 23.9f, -1.0f }, { 24.0f, 0.0f }, { 24.1f, 1.0f }, { 25.0f, 2.0f }, + { 33.5f, 2.2f }, { 36.0f, 2.0f }, { 51.0f, 1.8f }, { 67.0f, 1.3f }, { 81.5f, 20.0f }, { 100.0f, 50.0f } } +}; + +// used in bird_802CEBA0 +Vec3F D_8034E9D4 = { 0.0f, 0.0f, 0.0f }; + +extern Unk803593F0 D_803593F0; +extern Vec3F D_80359410; +extern Vec3F D_8035941C; +extern s32 D_80359428; +extern Vec3F D_80359444; +extern Vec3F D_80359450; +extern s32 D_8035945C; +extern Vec3F D_80359478; +extern Vec3F D_80359484; +extern s32 D_80359490; +extern Vec3F D_803594AC; +extern Vec3F D_803594B8; +extern u16 D_8035963C; + +// forward declarations +void bird_802CF24C(Unk80367704*); +void bird_802CF5B4(Unk80367704*); +void bird_802CF640(Unk80367704*); +s32 bird_802CF76C(Unk80367704*); +void bird_802CF8A4(Unk80367704*); +void bird_802CFAC8(Unk80367704*); +void bird_802CFEA8(Unk80367704*); +void bird_802CFF74(Unk80367704*); +void bird_802D0080(Unk80367704*); +void bird_802D0ABC(Unk80367704*); +f32 bird_802D08F8(Unk8034E824*, f32, f32); +f32 bird_802D0A28(Unk8034E934*, f32); + +void bird_802CEBA0(Unk80367704* arg0) { + Vec3F sp2C; + s32 pad; + + sp2C = D_8034E9D4; + D_803593F0.unk0 = 4; + D_803593F0.unk4 = 1; + uvVec3Copy(&D_8035941C, &arg0->unk32C); + uvVec3Copy(&D_80359410, &arg0->unk320); + D_80359428 = 1; + uvVec3Copy(&D_80359450, &arg0->unk338); + uvVec3Copy(&D_80359444, &arg0->unk320); + D_8035945C = 1; + uvVec3Copy(&D_80359484, &sp2C); + uvVec3Copy(&D_80359478, &arg0->unk320); + D_80359490 = 1; + uvVec3Copy(&D_803594B8, &sp2C); + uvVec3Copy(&D_803594AC, &arg0->unk344); + bird_802CECB8(arg0); + D_8035963C = 0xF7F8; +} + +void bird_802CECB8(Unk80367704* arg0) { + s32 pad; + + arg0->unk170 = 0; + arg0->unk17C = 1.0f; + arg0->unk168 = 0.0f; + arg0->unk16C = 0.0f; + arg0->unk178 = 0.0f; + arg0->unk174 = 0.0f; + arg0->unk228.z = 0.0f; + arg0->unk228.y = 0.0f; + arg0->unk228.x = 0.0f; + arg0->unk218.z = 0.0f; + arg0->unk218.y = 0.0f; + arg0->unk218.x = 0.0f; + arg0->unk234.z = 0.0f; + arg0->unk234.y = 0.0f; + arg0->unk234.x = 0.0f; + arg0->unk258 = 0.0f; + arg0->unk254 = 0.0f; + arg0->unk250 = 0.0f; + arg0->unk25C.y = 0.0f; + arg0->unk24C = 0.0f; + arg0->unk248 = arg0->unk24C; + arg0->unk244 = arg0->unk24C; + arg0->unk25C.x = 0.0f; + arg0->unk268.y = 0.0f; + arg0->unk268.x = 0.0f; + arg0->unk25C.z = 1.0f; + arg0->unk268.z = -9.8f; + arg0->unk274 = 0.0f; + arg0->unk278 = 0.0f; + arg0->unk27C = 0.0f; + arg0->unk224 = 0.0f; + arg0->unk240 = 0.0f; + arg0->unk280 = 0.0f; + arg0->unk106 = 0; + arg0->unk15C = 0; + arg0->unkE0 = 0; + arg0->unk160 = 0.0f; + + uvMat4Copy(&arg0->unk1C0, &arg0->unk10); + arg0->unk1C0.m[3][0] = 0.0f; + arg0->unk1C0.m[3][1] = 0.0f; + arg0->unk1C0.m[3][2] = 0.0f; + uvMat4LocalToWorld(&arg0->unk1C0, &arg0->unk218, &arg0->unk200); + uvVec3Normal(&arg0->unk20C, &arg0->unk200); + arg0->unk224 = uvVec3Len(&arg0->unk218); + arg0->unk40C = 1; + arg0->unk400.x = arg0->unk10.m[3][0]; + arg0->unk400.y = arg0->unk10.m[3][1]; + arg0->unk400.z = arg0->unk10.m[3][2]; +} + +void bird_802CEDF8(Unk80367704* arg0) { + Vec3F sp44; + s32 pad; + + uvMat4Copy(&arg0->unk1C0, &arg0->unk10); + arg0->unk1C0.m[3][0] = 0.0f; + arg0->unk1C0.m[3][1] = 0.0f; + arg0->unk1C0.m[3][2] = 0.0f; + uvMat4InvertTranslationRotation(&arg0->unk180, &arg0->unk1C0); + uvMat4LocalToWorld(&arg0->unk180, &arg0->unk200, &arg0->unk218); + bird_802CF8A4(arg0); + bird_802CFF74(arg0); + bird_802CFEA8(arg0); + if (arg0->unk104 != 1) { + bird_802CFAC8(arg0); + } + if (arg0->unk105 == 0) { + switch (arg0->unk104) { + case 2: + return; + case 0: + bird_802CF24C(arg0); + break; + case 1: + bird_802CF640(arg0); + break; + case 3: + bird_802CF5B4(arg0); + break; + default: + break; + } + } else { + arg0->unk258 = -arg0->unk2B4 * 5.6f * arg0->unkE4; + func_80313E18(&arg0->unk25C, &arg0->unk10); + arg0->unk200.x = func_80313AF4(0.0f, arg0->unk200.x, 10.0f); + arg0->unk200.y = func_80313AF4(0.0f, arg0->unk200.y, 10.0f); + arg0->unk200.z = func_80313AF4(0.0f, arg0->unk200.z, 10.0f); + arg0->unk244 = func_80313AF4(0.0f, arg0->unk244, 10.0f); + arg0->unk248 = func_80313AF4(0.0f, arg0->unk248, 10.0f); + arg0->unk24C = func_80313AF4(0.0f, arg0->unk24C, 10.0f); + arg0->unk218.x = func_80313AF4(0.0f, arg0->unk218.x, 10.0f); + arg0->unk218.y = func_80313AF4(0.0f, arg0->unk218.y, 10.0f); + arg0->unk218.z = func_80313AF4(0.0f, arg0->unk218.z, 10.0f); + arg0->unk234.z = 0.0f; + arg0->unk234.y = 0.0f; + arg0->unk234.x = 0.0f; + arg0->unk228.z = 0.0f; + arg0->unk228.y = 0.0f; + arg0->unk228.x = 0.0f; + arg0->unk254 = 0.0f; + arg0->unk250 = 0.0f; + if (arg0->unk2D0 > 1.9f) { + arg0->unk105 = 0; + arg0->unk164 = 2.5f; + } + } + + if (arg0->unk105 == 0) { + sp44.x = arg0->unk10.m[2][0]; + sp44.y = arg0->unk10.m[2][1]; + sp44.z = arg0->unk10.m[2][2]; + } else { + sp44.x = arg0->unk174; + sp44.y = arg0->unk178; + sp44.z = arg0->unk17C; + } + func_80313C94(&sp44, &arg0->unk25C, 2.0f); + uvMat4LocalToWorld(&arg0->unk1C0, &arg0->unk234, &arg0->unk228); + arg0->unk218.x += D_8034F854 * arg0->unk234.x; + arg0->unk218.y += D_8034F854 * arg0->unk234.y; + arg0->unk218.z += D_8034F854 * arg0->unk234.z; + arg0->unk244 += D_8034F854 * arg0->unk250; + arg0->unk248 += D_8034F854 * arg0->unk254; + arg0->unk24C += D_8034F854 * arg0->unk258; + uvMat4LocalTranslate(&arg0->unk10, arg0->unk200.x * D_8034F854, arg0->unk200.y * D_8034F854, arg0->unk200.z * D_8034F854); + uvMat4RotateAxis(&arg0->unk10, arg0->unk24C * D_8034F854, 'z'); + uvMat4RotateAxis(&arg0->unk10, arg0->unk244 * D_8034F854, 'x'); + uvMat4RotateAxis(&arg0->unk10, arg0->unk248 * D_8034F854, 'y'); + arg0->unk228.x = 0.0f; + arg0->unk228.y = 0.0f; + arg0->unk228.z = 0.0f; + arg0->unk250 = 0.0f; + arg0->unk254 = 0.0f; + arg0->unk258 = 0.0f; + if (arg0->unk104 != 3) { + bird_802D0ABC(arg0); + } + bird_802CF76C(arg0); + if (arg0->unk104 != 2) { + bird_802D0080(arg0); + } + arg0->unk224 = uvVec3Len(&arg0->unk218); + arg0->unk240 = uvVec3Len(&arg0->unk234); +} + +#pragma GLOBAL_ASM("asm/nonmatchings/app/birdman2/bird_802CF24C.s") + +void bird_802CF5B4(Unk80367704* arg0) { + arg0->unk228.x = arg0->unk200.x * -0.2f; + arg0->unk228.y = arg0->unk200.y * -0.2f; + arg0->unk228.z = arg0->unk200.z * -0.2f; + arg0->unk244 = func_80313AF4(0.0f, arg0->unk244, 3.0f); + arg0->unk248 = func_80313AF4(0.0f, arg0->unk248, 3.0f); + arg0->unk24C = func_80313AF4(0.0f, arg0->unk24C, 3.0f); +} + +void bird_802CF640(Unk80367704* arg0) { + Vec3F sp3C; + Vec3F sp30; + + if (arg0->unk160 == 0.0f) { + arg0->unk160 = D_8034F850; + } + sp3C.x = 0.0f; + sp3C.y = 0.0f; + sp3C.z = -0.5f; + sp30.x = arg0->unk268.x * 0.2f; + sp30.y = arg0->unk268.y * 0.2f; + sp30.z = arg0->unk268.z * 0.2f; + func_802DC1DC(&arg0->unk250, &sp3C, &sp30, 0.5f, 0.5f, 0.5f); + arg0->unk244 = func_80313AF4(0.0f, arg0->unk244, 0.35f); + arg0->unk248 = func_80313AF4(0.0f, arg0->unk248, 0.35f); + arg0->unk24C = func_80313AF4(0.0f, arg0->unk24C, 0.35f); + if ((D_8034F850 - arg0->unk160) > 3.75f) { + arg0->unk104 = 2; + } + arg0->unk105 = 0; +} + +s32 bird_802CF76C(Unk80367704* arg0) { + s32 pad; + u8 temp_v0_2; + f32* temp_s1; // TODO: double-check unk10 types + s32 sp38; + Vec3F* sp34; + + temp_s1 = arg0->unk10.m[3]; + sp38 = arg0->unk40C; + temp_v0_2 = db_getgnd(&arg0->unk400, (Vec3F*)temp_s1, &sp38, &arg0->unk170, &arg0->unk168, &arg0->unk174); + arg0->unk16C = temp_s1[2] - arg0->unk168; + if (temp_v0_2 != 0) { + arg0->unk106 = temp_v0_2; + if (arg0->unk106 == 4) { + arg0->unk15C = 1; + arg0->unk104 = 2; + } else { + arg0->unk104 = 1; + } + sp34 = func_802E02EC(); + func_802E05CC(&arg0->unk10, sp34, &arg0->unk174, 0); + uvVec3Copy(&arg0->unk150, sp34); + arg0->unk4 = D_8035963C; + } + if (arg0->unk104 != 2) { + arg0->unk400.x = temp_s1[0]; + arg0->unk400.y = temp_s1[1]; + arg0->unk400.z = temp_s1[2]; + } + if (arg0->unk15C != 0) { + return 0; + } + if (arg0->unk16C > 2.5f) { + return 0; + } + return 1; +} + +#pragma GLOBAL_ASM("asm/nonmatchings/app/birdman2/bird_802CF8A4.s") + +#pragma GLOBAL_ASM("asm/nonmatchings/app/birdman2/bird_802CFAC8.s") + +void bird_802CFEA8(Unk80367704* arg0) { + Vec3F sp2C; + Vec3F sp20; + + if (arg0->unk105 == 0) { + if (arg0->unk104 != 1) { + func_802E1754(arg0->unk10.m[3][0], arg0->unk10.m[3][1], arg0->unk10.m[3][2], &sp20); + sp20.z *= arg0->unk2A8; + uvMat4LocalToWorld(&arg0->unk180, &sp2C, &sp20); + } else { + sp2C.z = 0.0f; + sp2C.y = 0.0f; + sp2C.x = 0.0f; + sp20.z = 0.0f; + sp20.y = 0.0f; + sp20.x = 0.0f; + } + arg0->unk274 = sp2C.x - arg0->unk200.x; + arg0->unk278 = sp2C.y - arg0->unk200.y; + arg0->unk27C = sp2C.z - arg0->unk200.z; + } +} + +void bird_802CFF74(Unk80367704* arg0) { + Vec3F sp24; + f32 temp_fv0; + + if (arg0->unk105 == 0) { + sp24.x = 0.0f; + sp24.y = 0.0f; + sp24.z = -arg0->unk2A4 * 9.8f; + uvMat4LocalToWorld(&arg0->unk180, &arg0->unk268, &sp24); + if (arg0->unk164 > 0.0f) { + if (arg0->unk16C < 3.0f) { + temp_fv0 = arg0->unk16C / 3.0f; + arg0->unk268.x *= temp_fv0; + arg0->unk268.y *= temp_fv0; + arg0->unk268.z *= temp_fv0; + } + arg0->unk164 -= D_8034F854; + } + arg0->unk228.x += arg0->unk268.x; + arg0->unk228.y += arg0->unk268.y; + arg0->unk228.z += arg0->unk268.z; + } +} + +#pragma GLOBAL_ASM("asm/nonmatchings/app/birdman2/bird_802D0080.s") + +f32 bird_802D08F8(Unk8034E824* arg0, f32 arg1, f32 arg2) { + s32 i; + Vec2F p0; + Vec2F p1; + f32 a; + Vec2F q0; + Vec2F q1; + f32 sum0; + f32 sum1; + + for (i = 0; i < ARRAY_COUNT(arg0->unk0); i++) { + if (arg1 < arg0->unk0[i].x) { + break; + } + } + if ((i == 0) || (i == ARRAY_COUNT(arg0->unk0))) { + return 0.0f; + } + p0.x = arg0->unk0[i - 1].x; + p1.x = arg0->unk0[i].x; + p0.y = arg0->unk0[i - 1].y; + p1.y = arg0->unk0[i].y; + a = (p1.x - arg1) / (p1.x - p0.x); + sum0 = (a * p0.y) + ((1.0f - a) * p1.y); + + for (i = 0; i < ARRAY_COUNT(arg0->unkB8); i++) { + if (arg2 < arg0->unkB8[i].x) { + break; + } + } + if ((i == 0) || (i == ARRAY_COUNT(arg0->unkB8))) { + return 0.0f; + } + q0.x = arg0->unkB8[i - 1].x; + q1.x = arg0->unkB8[i].x; + q0.y = arg0->unkB8[i - 1].y; + q1.y = arg0->unkB8[i].y; + a = (q1.x - arg2) / (q1.x - q0.x); + sum1 = (a * q0.y) + ((1.0f - a) * q1.y); + return sum1 * sum0; +} + +f32 bird_802D0A28(Unk8034E934* arg0, f32 arg1) { + f32 x1; + f32 x0; + f32 y0; + f32 y1; + f32 a; + f32 b; + s32 i; + + for (i = 0; i < ARRAY_COUNT(arg0->unk0); i++) { + if (arg1 < arg0->unk0[i].x) { + break; + } + } + if ((i == 0) || (i == ARRAY_COUNT(arg0->unk0))) { + return 0.0f; + } + + x0 = arg0->unk0[i - 1].x; + x1 = arg0->unk0[i].x; + y0 = arg0->unk0[i - 1].y; + y1 = arg0->unk0[i].y; + a = (x1 - arg1) / (x1 - x0); + b = 1.0f - a; + return (a * y0) + (b * y1); +} + +void bird_802D0ABC(Unk80367704* arg0) { + Mtx4F* temp_s2; + Mtx4F sp44; + Vec3F sp38; + + func_80313FD0(&arg0->unk350, arg0->unk2BC, &sp38); + temp_s2 = &arg0->unk90; + uvMat4LocalToWorld(temp_s2, &D_8035941C, &sp38); + uvVec3Copy(&sp38, &arg0->unk320); + uvMat4LocalToWorld(temp_s2, &D_80359410, &sp38); + func_80313FD0(&arg0->unk350, arg0->unk2BC, &sp38); + sp38.x = -sp38.x; + uvMat4LocalToWorld(temp_s2, &D_80359450, &sp38); + uvVec3Copy(&sp38, &arg0->unk320); + uvMat4LocalToWorld(temp_s2, &D_80359444, &sp38); + uvMat4Copy(&sp44, temp_s2); + uvMat4RotateAxis(&sp44, arg0->unk304, 'x'); + uvMat4RotateAxis(&sp44, arg0->unk308, 'y'); + uvMat4LocalToWorld(&sp44, &D_803594AC, &arg0->unk344); + uvVec3Copy(&sp38, &arg0->unk320); + uvMat4LocalToWorld(temp_s2, &D_80359478, &sp38); +} diff --git a/src/app/code_556C0.c b/src/app/code_556C0.c deleted file mode 100644 index aba70a05..00000000 --- a/src/app/code_556C0.c +++ /dev/null @@ -1,8 +0,0 @@ -#include "common.h" -#include "code_556C0.h" - -#pragma GLOBAL_ASM("asm/nonmatchings/app/code_556C0/func_802CE190.s") - -#pragma GLOBAL_ASM("asm/nonmatchings/app/code_556C0/func_802CEA60.s") - -#pragma GLOBAL_ASM("asm/nonmatchings/app/code_556C0/func_802CEB68.s") diff --git a/src/app/code_556C0.h b/src/app/code_556C0.h deleted file mode 100644 index 07cf4698..00000000 --- a/src/app/code_556C0.h +++ /dev/null @@ -1,10 +0,0 @@ -#ifndef APP_CODE_556C0_H -#define APP_CODE_556C0_H - -#include -#include "code_72B70.h" - -void func_802CE190(Unk80367704*, u8); -void func_802CEA60(void*); - -#endif // APP_CODE_556C0_H diff --git a/src/app/code_61A60.h b/src/app/code_61A60.h index 975ff46c..d06c45c6 100644 --- a/src/app/code_61A60.h +++ b/src/app/code_61A60.h @@ -10,6 +10,7 @@ s32 func_802DB050(Unk802D3658_Unk111C*, Unk802D3658_Unk1224*, u16, u8, Mtx4F*); s32 func_802DB224(s32*, s32, u16, u8, Vec3F*, Vec3F*); void func_802DBE64(void*, void*, s32, Mtx4F*); s32 func_802DBF10(Unk802D3658_Unk111C*, Unk802D3658_Unk1224*, Vec3F*, Vec3F*); +void func_802DC1DC(f32*, Vec3F*, Vec3F*, f32, f32, f32); // a0 might be Vec3F s32 func_802DC8E4(s32); void func_802DCA5C(Vec3F*, Vec3F*, Vec3F*, Vec3F*, Vec3F*); diff --git a/src/app/code_72B70.h b/src/app/code_72B70.h index 41ae955b..332fdfc8 100644 --- a/src/app/code_72B70.h +++ b/src/app/code_72B70.h @@ -26,7 +26,8 @@ typedef struct { u8 unkD8; u8 padD9[3]; f32 unkDC; - u8 padE0[0x4]; + u8 unkE0; + u8 padE1[3]; f32 unkE4; f32 unkE8; f32 unkEC; @@ -34,18 +35,40 @@ typedef struct { u8 padF4[0x10]; u8 unk104; u8 unk105; - u8 pad106[0x15C - 0x106]; + u8 unk106; + u8 pad107[0x150 - 0x107]; + Vec3F unk150; u8 unk15C; - u8 pad160[0x16C - 0x160]; + f32 unk160; + f32 unk164; + f32 unk168; f32 unk16C; - u8 pad170[0x200 - 0x170]; + s32 unk170; + f32 unk174; + f32 unk178; + f32 unk17C; + Mtx4F unk180; + Mtx4F unk1C0; Vec3F unk200; - u8 pad20C[0x218 - 0x20C]; - f32 unk218; - u8 pad21C[0x220 - 0x21C]; - f32 unk220; + Vec3F unk20C; + Vec3F unk218; f32 unk224; - u8 pad228[0x290 - 0x228]; + Vec3F unk228; + Vec3F unk234; + f32 unk240; + f32 unk244; + f32 unk248; + f32 unk24C; + f32 unk250; + f32 unk254; + f32 unk258; + Vec3F unk25C; + Vec3F unk268; + f32 unk274; + f32 unk278; + f32 unk27C; + f32 unk280; + u8 pad284[0x290 - 0x284]; u8 unk290; u8 pad291[0x294 - 0x291]; Vec3F unk294; @@ -61,7 +84,7 @@ typedef struct { u8 unk2C0; u8 pad2C1[3]; f32 unk2C4; - u8 pad2C8[4]; + f32 unk2C8; u8 unk2CC; u8 pad2CD[3]; f32 unk2D0; @@ -82,18 +105,10 @@ typedef struct { f32 unk304; f32 unk308; u8 pad30C[0x320 - 0x30C]; - f32 unk320; - f32 unk324; - f32 unk328; - f32 unk32C; - f32 unk330; - f32 unk334; - f32 unk338; - f32 unk33C; - f32 unk340; - f32 unk344; - f32 unk348; - f32 unk34C; + Vec3F unk320; + Vec3F unk32C; + Vec3F unk338; + Vec3F unk344; s32 unk350; f32 unk354; f32 unk358; @@ -132,9 +147,7 @@ typedef struct { u8 pad3FA[0x3FE - 0x3FA]; u8 unk3FE; u8 unk3FF; - f32 unk400; - f32 unk404; - f32 unk408; + Vec3F unk400; s32 unk40C; } Unk80367704; diff --git a/src/app/code_9A960.h b/src/app/code_9A960.h index 514c76a8..6bb1be6f 100644 --- a/src/app/code_9A960.h +++ b/src/app/code_9A960.h @@ -13,16 +13,18 @@ extern f32 D_8034F850; // related to time extern f32 D_8034F854; // dynamic frame time? void func_80313430(f32 arg0, f32 arg1, f32 arg2, f32* arg3, f32* arg4, f32* arg5); +void func_803134D0(f32, f32, f32, f32*, f32*, f32*); void func_80313570(Mtx4F*, f32*, f32*, f32*, f32*, f32*, f32*); void func_80313640(f32 tx, f32 ty, f32 tz, f32 rz, f32 rx, f32 ry, Mtx4F* mat); void func_803136C4(Unk803136C4_Arg0*, Mtx4F*); +void func_803138A0(Mtx4F*, Mtx4F*, Mtx4F*, f32); f32 func_80313AF4(f32, f32, f32); -f32 func_80313F08(Unk803599D0*, f32); -void func_80313E0C(f32); +void func_80313C94(Vec3F*, Vec3F*, f32); void func_80313D74(void); -void func_803138A0(Mtx4F*, Mtx4F*, Mtx4F*, f32); -void func_803134D0(f32, f32, f32, f32*, f32*, f32*); +void func_80313E0C(f32); void func_80313E18(Vec3F*, Mtx4F*); +f32 func_80313F08(Unk803599D0*, f32); +void func_80313FD0(s32*, f32, Vec3F*); // a0 may be struct void func_80314154(void); void func_803141E4(void);