summaryrefslogtreecommitdiff
path: root/src/code
diff options
context:
space:
mode:
Diffstat (limited to 'src/code')
-rw-r--r--src/code/code_80026B00.c26
-rw-r--r--src/code/fault.c76
-rw-r--r--src/code/fault_drawer.c21
-rw-r--r--src/code/gfxprint.c12
-rw-r--r--src/code/sys_cfb.c19
-rw-r--r--src/code/sys_matrix.c72
-rw-r--r--src/code/z_actor.c66
-rw-r--r--src/code/z_camera.c13
-rw-r--r--src/code/z_construct.c47
-rw-r--r--src/code/z_debug_display.c2
-rw-r--r--src/code/z_demo.c65
-rw-r--r--src/code/z_effect.c26
-rw-r--r--src/code/z_en_a_keep.c6
-rw-r--r--src/code/z_en_item00.c29
-rw-r--r--src/code/z_face_reaction.c (renamed from src/code/code_8006C360.c)8
-rw-r--r--src/code/z_horse.c27
-rw-r--r--src/code/z_kaleido_scope_call.c3
-rw-r--r--src/code/z_parameter.c356
-rw-r--r--src/code/z_path.c46
-rw-r--r--src/code/z_room.c37
-rw-r--r--src/code/z_sample.c9
-rw-r--r--src/code/z_scene.c6
-rw-r--r--src/code/z_scene_table.c5
-rw-r--r--src/code/z_skelanime.c1854
24 files changed, 2305 insertions, 526 deletions
diff --git a/src/code/code_80026B00.c b/src/code/code_80026B00.c
deleted file mode 100644
index beb5006ee..000000000
--- a/src/code/code_80026B00.c
+++ /dev/null
@@ -1,26 +0,0 @@
-#include <ultra64.h>
-#include <global.h>
-
-GlobalContext* func_80026B00(void) {
- return D_80157DA0;
-}
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/code_80026B00/func_80026B0C.s")
-
-void func_80026C1C(u8* arg0) {
- arg0[0] = 0;
- arg0[1] = 0;
- arg0[2] = 0;
-}
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/code_80026B00/func_80026C2C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/code_80026B00/Effect_Add.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/code_80026B00/func_80026E74.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/code_80026B00/func_80026F70.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/code_80026B00/func_8002709C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/code_80026B00/func_800271A8.s")
diff --git a/src/code/fault.c b/src/code/fault.c
index 7884c5057..05bee87d5 100644
--- a/src/code/fault.c
+++ b/src/code/fault.c
@@ -137,8 +137,9 @@ void Fault_AddClient(FaultClient* client, void* callback, void* param0, void* pa
end:
osSetIntMask(mask);
- if (alreadyExists)
+ if (alreadyExists) {
osSyncPrintf(VT_COL(RED, WHITE) "fault_AddClient: %08x は既にリスト中にある\n" VT_RST, client);
+ }
}
#else
#pragma GLOBAL_ASM("asm/non_matchings/code/fault/Fault_AddClient.s")
@@ -270,27 +271,34 @@ u32 Fault_WaitForInputImpl() {
kDown = curInput->padPressed;
- if (kDown == 0x20)
+ if (kDown == 0x20) {
sFaultStructPtr->faultActive = !sFaultStructPtr->faultActive;
+ }
- if (!sFaultStructPtr->faultActive)
+ if (!sFaultStructPtr->faultActive) {
break;
+ }
- if (count-- < 1)
+ if (count-- < 1) {
return false;
+ }
}
- if (kDown == 0x8000 || kDown == 0x100)
+ if (kDown == 0x8000 || kDown == 0x100) {
return false;
+ }
- if (kDown == 0x200)
+ if (kDown == 0x200) {
return true;
+ }
- if (kDown == 0x800)
+ if (kDown == 0x800) {
FaultDrawer_SetOsSyncPrintfEnabled(true);
+ }
- if (kDown == 0x400)
+ if (kDown == 0x400) {
FaultDrawer_SetOsSyncPrintfEnabled(false);
+ }
}
return false;
@@ -555,24 +563,28 @@ void Fault_DrawMemDump(u32 pc, u32 sp, u32 unk0, u32 unk1) {
s32 off;
while (true) {
- if (addr < 0x80000000)
+ if (addr < 0x80000000) {
addr = 0x80000000;
- if (addr > 0x807fff00)
+ }
+ if (addr > 0x807fff00) {
addr = 0x807fff00;
+ }
addr &= ~0xF;
Fault_DrawMemDumpPage("Dump", (u32*)addr, 0);
count = 600;
while (sFaultStructPtr->faultActive) {
- if (count == 0)
+ if (count == 0) {
return;
+ }
count--;
Fault_Sleep(0x10);
Fault_UpdatePadImpl();
- if (!~(curInput->padPressed | ~0x20))
+ if (!~(curInput->padPressed | ~0x20)) {
sFaultStructPtr->faultActive = false;
+ }
}
do {
@@ -580,31 +592,42 @@ void Fault_DrawMemDump(u32 pc, u32 sp, u32 unk0, u32 unk1) {
Fault_UpdatePadImpl();
} while (curInput->padPressed == 0);
- if (!~(curInput->padPressed | ~0x1000))
+ if (!~(curInput->padPressed | ~0x1000)) {
return;
+ }
- if (!~(curInput->raw.pad | ~0x8000))
+ if (!~(curInput->raw.pad | ~0x8000)) {
return;
+ }
off = 0x10;
- if (!~(curInput->raw.pad | ~0x2000))
+ if (!~(curInput->raw.pad | ~0x2000)) {
off = 0x100;
- if (!~(curInput->raw.pad | ~0x4000))
+ }
+ if (!~(curInput->raw.pad | ~0x4000)) {
off <<= 8;
- if (!~(curInput->raw.pad | ~0x800))
+ }
+ if (!~(curInput->raw.pad | ~0x800)) {
addr -= off;
- if (!~(curInput->raw.pad | ~0x400))
+ }
+ if (!~(curInput->raw.pad | ~0x400)) {
addr += off;
- if (!~(curInput->raw.pad | ~0x8))
+ }
+ if (!~(curInput->raw.pad | ~0x8)) {
addr = pc;
- if (!~(curInput->raw.pad | ~0x4))
+ }
+ if (!~(curInput->raw.pad | ~0x4)) {
addr = sp;
- if (!~(curInput->raw.pad | ~0x2))
+ }
+ if (!~(curInput->raw.pad | ~0x2)) {
addr = unk0;
- if (!~(curInput->raw.pad | ~0x1))
+ }
+ if (!~(curInput->raw.pad | ~0x1)) {
addr = unk1;
- if (!~(curInput->raw.pad | ~0x20))
+ }
+ if (!~(curInput->raw.pad | ~0x20)) {
break;
+ }
}
sFaultStructPtr->faultActive = true;
@@ -715,15 +738,16 @@ void Fault_ThreadEntry(void* arg) {
__osSetFpcCsr(__osGetFpcCsr() & -0xf81);
sFaultStructPtr->faultedThread = faultedThread;
- while (!sFaultStructPtr->faultHandlerEnabled)
+ while (!sFaultStructPtr->faultHandlerEnabled) {
Fault_Sleep(1000);
+ }
Fault_Sleep(500);
Fault_CommitFB();
- if (sFaultStructPtr->faultActive)
+ if (sFaultStructPtr->faultActive) {
Fault_Wait5Seconds();
- else {
+ } else {
Fault_DrawCornerRec(0xF801);
Fault_WaitForButtonCombo();
}
diff --git a/src/code/fault_drawer.c b/src/code/fault_drawer.c
index b17679d35..ef7a784ae 100644
--- a/src/code/fault_drawer.c
+++ b/src/code/fault_drawer.c
@@ -94,30 +94,32 @@ void FaultDrawer_DrawRecImpl(s32 xStart, s32 yStart, s32 xEnd, s32 yEnd, u16 col
}
}
-#ifdef NON_MATCHING
-// regalloc and minor ordering differences
void FaultDrawer_DrawChar(char c) {
u16* fb;
s32 x, y;
u32* dataPtr;
+ u32 data;
s32 cursorX = sFaultDrawerStruct.cursorX;
s32 cursorY = sFaultDrawerStruct.cursorY;
+ u32** fontData = &sFaultDrawerStruct.fontData;
+ s32 shift = c % 4;
- dataPtr = &sFaultDrawerStruct.fontData[((c & 4) >> 2) + ((c / 8) * 16)];
- fb = sFaultDrawerStruct.fb + sFaultDrawerStruct.w * cursorY + cursorX;
+ dataPtr = &fontData[0][(((c / 8) * 16) + ((c & 4) >> 2))];
+ fb = sFaultDrawerStruct.fb + (sFaultDrawerStruct.w * cursorY) + cursorX;
if ((sFaultDrawerStruct.xStart <= cursorX) &&
((sFaultDrawerStruct.charW + cursorX - 1) <= sFaultDrawerStruct.xEnd) &&
(sFaultDrawerStruct.yStart <= cursorY) &&
((sFaultDrawerStruct.charH + cursorY - 1) <= sFaultDrawerStruct.yEnd)) {
for (y = 0; y < sFaultDrawerStruct.charH; y++) {
- u32 mask = 0x10000000 << (c % 4);
- u32 data = *dataPtr;
+ u32 mask = 0x10000000 << shift;
+ data = *dataPtr;
for (x = 0; x < sFaultDrawerStruct.charW; x++) {
- if (mask & data)
+ if (mask & data) {
fb[x] = sFaultDrawerStruct.foreColor;
- else if (sFaultDrawerStruct.backColor & 1)
+ } else if (sFaultDrawerStruct.backColor & 1) {
fb[x] = sFaultDrawerStruct.backColor;
+ }
mask >>= 4;
}
fb += sFaultDrawerStruct.w;
@@ -125,9 +127,6 @@ void FaultDrawer_DrawChar(char c) {
}
}
}
-#else
-#pragma GLOBAL_ASM("asm/non_matchings/code/fault_drawer/FaultDrawer_DrawChar.s")
-#endif
s32 FaultDrawer_ColorToPrintColor(u16 color) {
s32 i;
diff --git a/src/code/gfxprint.c b/src/code/gfxprint.c
index fbcca3cee..9b7c6fa0f 100644
--- a/src/code/gfxprint.c
+++ b/src/code/gfxprint.c
@@ -223,7 +223,7 @@ void GfxPrint_SetBasePosPx(GfxPrint* this, s32 x, s32 y) {
#ifdef NON_MATCHING
// regalloc and ordering differences
-void GfxPrint_PrintCharImpl(GfxPrint* this, char c) {
+void GfxPrint_PrintCharImpl(GfxPrint* this, u8 c) {
if (this->flag & GFXPRINT_UPDATE_MODE) {
this->flag &= ~GFXPRINT_UPDATE_MODE;
@@ -246,22 +246,24 @@ void GfxPrint_PrintCharImpl(GfxPrint* this, char c) {
if (this->flag & GFXPRINT_FLAG4) {
gDPSetPrimColorMod(this->dlist++, 0, 0, 0);
- if (this->flag & GFXPRINT_FLAG64)
+ if (this->flag & GFXPRINT_FLAG64) {
gSPTextureRectangle(this->dlist++, (this->posX + 4) << 1, (this->posY + 4) << 1, (this->posX + 4 + 32) << 1,
(this->posY + 4 + 32) << 1, c * 2, (u16)(c & 4) * 64, (u16)(c >> 3) * 256, 512, 512);
- else
+ } else {
gSPTextureRectangle(this->dlist++, this->posX + 4, this->posY + 4, this->posX + 4 + 32, this->posY + 4 + 32,
c * 2, (u16)(c & 4) * 64, (u16)(c >> 3) * 256, 1024, 1024);
+ }
gDPSetPrimColorMod(this->dlist++, 0, 0, *(u32*)&this->color);
}
- if (this->flag & GFXPRINT_FLAG64)
+ if (this->flag & GFXPRINT_FLAG64) {
gSPTextureRectangle(this->dlist++, (this->posX) << 1, (this->posY) << 1, (this->posX + 32) << 1,
(this->posY + 32) << 1, c * 2, (u16)(c & 4) * 64, (u16)(c >> 3) * 256, 512, 512);
- else
+ } else {
gSPTextureRectangle(this->dlist++, this->posX, this->posY, this->posX + 32, this->posY + 32, c * 2,
(u16)(c & 4) * 64, (u16)(c >> 3) * 256, 1024, 1024);
+ }
this->posX += 32;
}
diff --git a/src/code/sys_cfb.c b/src/code/sys_cfb.c
index 454b63a58..421037c38 100644
--- a/src/code/sys_cfb.c
+++ b/src/code/sys_cfb.c
@@ -1,14 +1,15 @@
#include <global.h>
-volatile u32 sSysCfbFbPtr[2]; // may not be volatile but it currently gets SysCfb_Init closer from matching
+u32 sSysCfbFbPtr[2];
u32 sSysCfbEnd;
-// small reaordering
-#ifdef NON_MATCHING
void SysCfb_Init(s32 n64dd) {
+ u32 screenSize;
+ u32 tmpFbEnd;
if (osMemSize >= 0x800000U) {
// 8MB or more memory is installed
osSyncPrintf("8Mバイト以上のメモリが搭載されています\n");
+ tmpFbEnd = 0x8044BE80;
if (n64dd == 1) {
// RAM 8M mode (N64DD compatible)
osSyncPrintf("RAM 8M mode (N64DD対応)\n");
@@ -16,26 +17,24 @@ void SysCfb_Init(s32 n64dd) {
} else {
// The margin for this version is% dK bytes
osSyncPrintf("このバージョンのマージンは %dK バイトです\n", (0x4BC00 / 1024));
- sSysCfbEnd = 0x8044BE80;
+ sSysCfbEnd = tmpFbEnd;
}
} else if (osMemSize >= 0x400000U) {
- sSysCfbEnd = 0x80400000;
osSyncPrintf("RAM4M mode\n");
+ sSysCfbEnd = 0x80400000;
} else {
LogUtils_HungupThread("../sys_cfb.c", 0x162);
}
+ screenSize = SCREEN_WIDTH * SCREEN_HEIGHT;
sSysCfbEnd &= ~0x3f;
// The final address used by the system is% 08x
osSyncPrintf("システムが使用する最終アドレスは %08x です\n", sSysCfbEnd);
- sSysCfbFbPtr[0] = sSysCfbEnd - (SCREEN_WIDTH * SCREEN_HEIGHT * 4);
- sSysCfbFbPtr[1] = sSysCfbEnd - (SCREEN_WIDTH * SCREEN_HEIGHT * 2);
+ sSysCfbFbPtr[0] = sSysCfbEnd - (screenSize * 4);
+ sSysCfbFbPtr[1] = sSysCfbEnd - (screenSize * 2);
// Frame buffer addresses are% 08x and% 08x
osSyncPrintf("フレームバッファのアドレスは %08x と %08x です\n", sSysCfbFbPtr[0], sSysCfbFbPtr[1]);
}
-#else
-#pragma GLOBAL_ASM("asm/non_matchings/code/sys_cfb/SysCfb_Init.s")
-#endif
void SysCfb_Reset() {
sSysCfbFbPtr[0] = 0;
diff --git a/src/code/sys_matrix.c b/src/code/sys_matrix.c
index b300f189d..24c5768d0 100644
--- a/src/code/sys_matrix.c
+++ b/src/code/sys_matrix.c
@@ -8,6 +8,7 @@ Mtx gMtxClear = {
0, 0, 0, 0,
0, 0, 0, 0,
};
+
MtxF gMtxFClear = {
1.0f, 0.0f, 0.0f, 0.0f,
0.0f, 1.0f, 0.0f, 0.0f,
@@ -58,23 +59,28 @@ void Matrix_Mult(MtxF* mf, u8 mode) {
}
}
-#ifdef NON_MATCHING
-// minor ordering and regalloc differences
void Matrix_Translate(f32 x, f32 y, f32 z, u8 mode) {
MtxF* cmf = sCurrentMatrix;
+ f32 tx;
+ f32 ty;
if (mode == MTXMODE_APPLY) {
- cmf->wx += cmf->xx * x + cmf->yx * y + cmf->zx * z;
- cmf->wy += cmf->xy * x + cmf->yy * y + cmf->zy * z;
- cmf->wz += cmf->xz * x + cmf->yz * y + cmf->zz * z;
- cmf->ww += cmf->xw * x + cmf->yw * y + cmf->zw * z;
+ tx = cmf->xx;
+ ty = cmf->yx;
+ cmf->wx += tx * x + ty * y + cmf->zx * z;
+ tx = cmf->xy;
+ ty = cmf->yy;
+ cmf->wy += tx * x + ty * y + cmf->zy * z;
+ tx = cmf->xz;
+ ty = cmf->yz;
+ cmf->wz += tx * x + ty * y + cmf->zz * z;
+ tx = cmf->xw;
+ ty = cmf->yw;
+ cmf->ww += tx * x + ty * y + cmf->zw * z;
} else {
func_800A7A24(cmf, x, y, z);
}
}
-#else
-#pragma GLOBAL_ASM("asm/non_matchings/code/sys_matrix/Matrix_Translate.s")
-#endif
void Matrix_Scale(f32 x, f32 y, f32 z, u8 mode) {
MtxF* cmf = sCurrentMatrix;
@@ -289,7 +295,13 @@ void Matrix_RotateZ(f32 z, u8 mode) {
}
}
-void Matrix_RotateXYZ(s16 x, s16 y, s16 z, u8 mode) {
+/*
+ * Rotates the top of the matrix stack by `z` degrees, then
+ * rotates that matrix by `y` degrees, then rotates that matrix
+ * by `x` degrees.
+ * Original Name: Matrix_RotateXYZ, changed to reflect rotation order.
+ */
+void Matrix_RotateZYX(s16 x, s16 y, s16 z, u8 mode) {
MtxF* cmf = sCurrentMatrix;
f32 temp1;
f32 temp2;
@@ -374,43 +386,47 @@ void Matrix_RotateXYZ(s16 x, s16 y, s16 z, u8 mode) {
}
}
-void func_800D1340(Vec3f* arg0, Vec3s* arg1) {
+/*
+ * Translates the top of the matrix stack by `translation` units,
+ * then rotates that matrix by `rotation` in Z-Y-X order
+ */
+void Matrix_TranslateThenRotateZYX(Vec3f* translation, Vec3s* rotation) {
MtxF* cmf = sCurrentMatrix;
f32 sin;
f32 cos;
f32 temp1;
f32 temp2;
- sin = Math_Sins(arg1->z);
- cos = Math_Coss(arg1->z);
+ sin = Math_Sins(rotation->z);
+ cos = Math_Coss(rotation->z);
temp1 = cmf->xx;
temp2 = cmf->yx;
- cmf->wx += temp1 * arg0->x + temp2 * arg0->y + cmf->zx * arg0->z;
+ cmf->wx += temp1 * translation->x + temp2 * translation->y + cmf->zx * translation->z;
cmf->xx = temp1 * cos + temp2 * sin;
cmf->yx = temp2 * cos - temp1 * sin;
temp1 = cmf->xy;
temp2 = cmf->yy;
- cmf->wy += temp1 * arg0->x + temp2 * arg0->y + cmf->zy * arg0->z;
+ cmf->wy += temp1 * translation->x + temp2 * translation->y + cmf->zy * translation->z;
cmf->xy = temp1 * cos + temp2 * sin;
cmf->yy = temp2 * cos - temp1 * sin;
temp1 = cmf->xz;
temp2 = cmf->yz;
- cmf->wz += temp1 * arg0->x + temp2 * arg0->y + cmf->zz * arg0->z;
+ cmf->wz += temp1 * translation->x + temp2 * translation->y + cmf->zz * translation->z;
cmf->xz = temp1 * cos + temp2 * sin;
cmf->yz = temp2 * cos - temp1 * sin;
temp1 = cmf->xw;
temp2 = cmf->yw;
- cmf->ww += temp1 * arg0->x + temp2 * arg0->y + cmf->zw * arg0->z;
+ cmf->ww += temp1 * translation->x + temp2 * translation->y + cmf->zw * translation->z;
cmf->xw = temp1 * cos + temp2 * sin;
cmf->yw = temp2 * cos - temp1 * sin;
- if (arg1->y != 0) {
- sin = Math_Sins(arg1->y);
- cos = Math_Coss(arg1->y);
+ if (rotation->y != 0) {
+ sin = Math_Sins(rotation->y);
+ cos = Math_Coss(rotation->y);
temp1 = cmf->xx;
temp2 = cmf->zx;
@@ -433,9 +449,9 @@ void func_800D1340(Vec3f* arg0, Vec3s* arg1) {
cmf->zw = temp1 * sin + temp2 * cos;
}
- if (arg1->x != 0) {
- sin = Math_Sins(arg1->x);
- cos = Math_Coss(arg1->x);
+ if (rotation->x != 0) {
+ sin = Math_Sins(rotation->x);
+ cos = Math_Coss(rotation->x);
temp1 = cmf->yx;
temp2 = cmf->zx;
@@ -738,12 +754,13 @@ void func_800D20CC(MtxF* mf, Vec3s* vec, s32 flag) {
vec->y = Math_atan2f(mf->zx, mf->zz) * (32768 / M_PI);
- if (!flag)
+ if (!flag) {
vec->z = Math_atan2f(mf->xy, mf->yy) * (32768 / M_PI);
- else
+ } else {
vec->z = Math_atan2f(mf->xy / sqrtf(SQ(mf->xx) + SQ(mf->xz) + SQ(mf->xy)),
mf->yy / sqrtf(SQ(mf->yx) + SQ(mf->yz) + SQ(mf->yy))) *
(32768 / M_PI);
+ }
}
#else
#pragma GLOBAL_ASM("asm/non_matchings/code/sys_matrix/func_800D20CC.s")
@@ -762,12 +779,13 @@ void func_800D2264(MtxF* mf, Vec3s* vec, s32 flag) {
vec->z = Math_atan2f(mf->xy, mf->xx) * (32768 / M_PI);
- if (!flag)
+ if (!flag) {
vec->x = Math_atan2f(mf->yz, mf->zz) * (32768 / M_PI);
- else
+ } else {
vec->x = Math_atan2f(mf->yz / sqrtf(SQ(mf->yx) + SQ(mf->yy) + SQ(mf->yz)),
mf->zz / sqrtf(SQ(mf->zx) + SQ(mf->zy) + SQ(mf->zz))) *
(32768 / M_PI);
+ }
}
#else
#pragma GLOBAL_ASM("asm/non_matchings/code/sys_matrix/func_800D2264.s")
diff --git a/src/code/z_actor.c b/src/code/z_actor.c
index 5fa59e19b..49086f289 100644
--- a/src/code/z_actor.c
+++ b/src/code/z_actor.c
@@ -9,7 +9,7 @@ void ActorShape_Init(ActorShape* shape, f32 arg1, void* shadowDrawFunc, f32 arg3
shape->unk_14 = -1;
}
-void func_8002B200(Actor* actor, LightMapper* lightMapper, GlobalContext* globalCtx, u32 dlist, Color_RGBA8* color) {
+void func_8002B200(Actor* actor, LightMapper* lightMapper, GlobalContext* globalCtx, Gfx* dlist, Color_RGBA8* color) {
f32 temp1;
f32 temp2;
MtxF sp60;
@@ -41,7 +41,7 @@ void func_8002B200(Actor* actor, LightMapper* lightMapper, GlobalContext* global
func_80038A28(actor->floorPoly, actor->posRot.pos.x, actor->unk_80, actor->posRot.pos.z, &sp60);
Matrix_Put(&sp60);
- if (dlist != (u32)&D_04049210) {
+ if (dlist != D_04049210) {
Matrix_RotateY(actor->shape.rot.y * (M_PI / 32768), MTXMODE_APPLY);
}
@@ -156,16 +156,19 @@ void ActorShadow_DrawFunc_Teardrop(Actor* actor, LightMapper* lightMapper, Globa
if ((phi_f2 >= -1.0f) && (phi_f2 < 500.0f)) {
phi_s0 = lightMapper->lights;
- if (phi_f2 <= 0.0f)
+ if (phi_f2 <= 0.0f) {
actor->shape.unk_15++;
+ }
- if (30.0f < phi_f2)
+ if (30.0f < phi_f2) {
phi_f2 = 30.0f;
+ }
temp_f24 = actor->shape.unk_14 * (1.0f - (phi_f2 * (1.0f / 30)));
- if (30.0f < phi_f2)
+ if (30.0f < phi_f2) {
phi_f2 = 30.0f;
+ }
temp_f20_2 = 1.0f - (phi_f2 * (1.0f / 70));
temp_f22_2 = (actor->shape.unk_10 * temp_f20_2) * actor->scale.x;
@@ -187,8 +190,9 @@ void ActorShadow_DrawFunc_Teardrop(Actor* actor, LightMapper* lightMapper, Globa
if (phi_s0->l.dir[1] > 0) {
temp_a3 = (ABS(phi_s0->l.dir[1]) * ((phi_s0->l.col[0] + phi_s0->l.col[1]) + phi_s0->l.col[2])) -
(phi_s2 * 8);
- if (temp_a3 > 0)
+ if (temp_a3 > 0) {
func_8002B66C(globalCtx, phi_s0, &spE8, temp_a3, temp_f24, temp_f22_2, temp_f20_2);
+ }
}
phi_s0++;
}
@@ -335,18 +339,20 @@ void func_8002C124(TargetContext* targetCtx, GlobalContext* globalCtx) {
spCE = 0xFF;
var1 = 1.0f;
- if (targetCtx->unk_4B != 0)
+ if (targetCtx->unk_4B != 0) {
spB8 = 1;
- else
+ } else {
spB8 = 3;
+ }
if (actor != NULL) {
Math_Vec3f_Copy(&targetCtx->targetCenterPos, &actor->posRot2.pos);
var1 = (500.0f - targetCtx->unk_44) / 420.0f;
} else {
targetCtx->unk_48 -= 120;
- if (targetCtx->unk_48 < 0)
+ if (targetCtx->unk_48 < 0) {
targetCtx->unk_48 = 0;
+ }
spCE = targetCtx->unk_48;
}
@@ -361,8 +367,9 @@ void func_8002C124(TargetContext* targetCtx, GlobalContext* globalCtx) {
spBC.z = spBC.z * var1;
targetCtx->unk_4C--;
- if (targetCtx->unk_4C < 0)
+ if (targetCtx->unk_4C < 0) {
targetCtx->unk_4C = 2;
+ }
func_8002BE64(targetCtx, targetCtx->unk_4C, spBC.x, spBC.y, spBC.z);
@@ -373,10 +380,11 @@ void func_8002C124(TargetContext* targetCtx, GlobalContext* globalCtx) {
entry = &targetCtx->arr_50[spAC];
if (entry->unk_0C < 500.0f) {
- if (entry->unk_0C <= 120.0f)
+ if (entry->unk_0C <= 120.0f) {
var2 = 0.15f;
- else
+ } else {
var2 = ((entry->unk_0C - 120.0f) * 0.001f) + 0.15f;
+ }
Matrix_Translate(entry->pos.x, entry->pos.y, 0.0f, MTXMODE_NEW);
Matrix_Scale(var2, 0.15f, 1.0f, MTXMODE_APPLY);
@@ -398,8 +406,9 @@ void func_8002C124(TargetContext* targetCtx, GlobalContext* globalCtx) {
}
spCE = spCE - (0xFF / 3);
- if (spCE < 0)
+ if (spCE < 0) {
spCE = 0;
+ }
spAC = (spAC + 1) % 3;
}
}
@@ -900,7 +909,7 @@ void func_8002D9A4(Actor* actor, f32 arg1) {
void func_8002D9F8(Actor* actor, UNK_PTR arg1) {
Vec3f sp1C;
- func_800A54FC(arg1, &sp1C, actor->shape.rot.y, actor);
+ func_800A54FC(arg1, &sp1C, actor->shape.rot.y);
actor->posRot.pos.x += sp1C.x * actor->scale.x;
actor->posRot.pos.y += sp1C.y * actor->scale.y;
actor->posRot.pos.z += sp1C.z * actor->scale.z;
@@ -1437,14 +1446,16 @@ f32 func_8002EFC0(Actor* actor, Player* player, s16 arg2) {
abs_var = ABS(var);
if (player->unk_664 != NULL) {
- if ((abs_var > 0x4000) || (actor->flags & 0x8000000))
+ if ((abs_var > 0x4000) || (actor->flags & 0x8000000)) {
return FLT_MAX;
- else
+ } else {
return actor->waterSurfaceDist - actor->waterSurfaceDist * 0.8f * ((0x4000 - abs_var) * 3.0517578125e-05f);
+ }
}
- if (abs_var > 0x2AAA)
+ if (abs_var > 0x2AAA) {
return FLT_MAX;
+ }
return actor->waterSurfaceDist;
}
@@ -1822,10 +1833,11 @@ void func_8002FBAC(GlobalContext* globalCtx) {
func_800C6AC4(gfxArr, globalCtx->state.gfxCtx, "../z_actor.c", 5308);
if (gSaveContext.respawn[RESPAWN_MODE_TOP].data != 0) {
- if (LINK_IS_ADULT)
+ if (LINK_IS_ADULT) {
spD8 = 80.0f;
- else
+ } else {
spD8 = 60.0f;
+ }
spD0 = 0xFF;
spD4 = 1.0f;
@@ -3872,8 +3884,8 @@ Gfx* func_80034B54(GraphicsContext* gfxCtx) {
#pragma GLOBAL_ASM("asm/non_matchings/code/z_actor/func_80034B54.s")
#endif
-void func_80034BA0(GlobalContext* globalCtx, SkelAnime* skelAnime, void* unkFunc1, void* unkFunc2, Actor* actor,
- s16 alpha) {
+void func_80034BA0(GlobalContext* globalCtx, SkelAnime* skelAnime, SkelAnime_LimbUpdateMatrix2 unkFunc1,
+ SkelAnime_LimbAppendDlist2 unkFunc2, Actor* actor, s16 alpha) {
GraphicsContext* gfxCtx = globalCtx->state.gfxCtx;
Gfx* gfxArr[4];
@@ -3886,14 +3898,14 @@ void func_80034BA0(GlobalContext* globalCtx, SkelAnime* skelAnime, void* unkFunc
gDPPipeSync(gfxCtx->polyOpa.p++);
gSPSegment(gfxCtx->polyOpa.p++, 0x0C, func_80034B28(globalCtx->state.gfxCtx));
- gfxCtx->polyOpa.p = func_800A273C(globalCtx, skelAnime->limbIndex, skelAnime->actorDrawTbl, skelAnime->dListCount,
- unkFunc1, unkFunc2, actor, gfxCtx->polyOpa.p);
+ gfxCtx->polyOpa.p = SkelAnime_DrawSV2(globalCtx, skelAnime->skeleton, skelAnime->actorDrawTbl,
+ skelAnime->dListCount, unkFunc1, unkFunc2, actor, gfxCtx->polyOpa.p);
func_800C6B54(gfxArr, globalCtx->state.gfxCtx, "../z_actor.c", 8860);
}
-void func_80034CC4(GlobalContext* globalCtx, SkelAnime* skelAnime, void* unkFunc1, void* unkFunc2, Actor* actor,
- s16 alpha) {
+void func_80034CC4(GlobalContext* globalCtx, SkelAnime* skelAnime, SkelAnime_LimbUpdateMatrix2 unkFunc1,
+ SkelAnime_LimbAppendDlist2 unkFunc2, Actor* actor, s16 alpha) {
GraphicsContext* gfxCtx = globalCtx->state.gfxCtx;
Gfx* gfxArr[4];
@@ -3905,8 +3917,8 @@ void func_80034CC4(GlobalContext* globalCtx, SkelAnime* skelAnime, void* unkFunc
gDPSetEnvColor(gfxCtx->polyXlu.p++, 0x00, 0x00, 0x00, alpha);
gSPSegment(gfxCtx->polyXlu.p++, 0x0C, func_80034B54(globalCtx->state.gfxCtx));
- gfxCtx->polyXlu.p = func_800A273C(globalCtx, skelAnime->limbIndex, skelAnime->actorDrawTbl, skelAnime->dListCount,
- unkFunc1, unkFunc2, actor, gfxCtx->polyXlu.p);
+ gfxCtx->polyXlu.p = SkelAnime_DrawSV2(globalCtx, skelAnime->skeleton, skelAnime->actorDrawTbl,
+ skelAnime->dListCount, unkFunc1, unkFunc2, actor, gfxCtx->polyXlu.p);
func_800C6B54(gfxArr, globalCtx->state.gfxCtx, "../z_actor.c", 8904);
}
diff --git a/src/code/z_camera.c b/src/code/z_camera.c
index 9dd358ffc..b48b58321 100644
--- a/src/code/z_camera.c
+++ b/src/code/z_camera.c
@@ -224,8 +224,9 @@ s32 func_800443A0(Camera* camera, Vec3f* b, Vec3f* c) {
sp34 = NULL; // this is moved to the top when it should be done in the middle of the function args being loaded
if (func_8003DD6C(&camera->globalCtx->colCtx, b, c, &sp40, &sp34, 1, 1, 1, 0, &sp38) != 0) {
- if (func_80038B7C(sp34, b) < 0.0f)
+ if (func_80038B7C(sp34, b) < 0.0f) {
return 1;
+ }
}
return 0;
}
@@ -461,18 +462,20 @@ s32 func_800458D4(Camera* camera, struct_80045714* b, f32 c, f32* d, s16 e) {
sp60.z = 0.0f;
temp_s1 = &camera->unk_94;
- if (e != 0)
+ if (e != 0) {
sp60.y -= func_80045714(&camera->unk_108, temp_s1->rot.y, b->unk_06, OREG(9));
+ }
sp48 = temp_s1->pos.y - *d;
temp_ret = Math_atan2f(sp48, func_8007C028(&camera->unk_50, &camera->unk_5C)); // f2 and f14 are swapped
- if (OREG(32) * (M_PI / 180) < temp_ret)
+ if (OREG(32) * (M_PI / 180) < temp_ret) {
phi_f2 = 1.0f - sinf(temp_ret - OREG(32) * (M_PI / 180));
- else if (OREG(33) * (M_PI / 180) > temp_ret)
+ } else if (OREG(33) * (M_PI / 180) > temp_ret) {
phi_f2 = 1.0f - sinf(OREG(33) * (M_PI / 180) - temp_ret);
- else
+ } else {
phi_f2 = 1.0f;
+ }
sp60.y -= sp48 * phi_f2;
func_80043A3C(&sp60, &camera->unk_E4, OREG(29) * 0.01f, OREG(30) * 0.01f, 0.1f);
diff --git a/src/code/z_construct.c b/src/code/z_construct.c
index 59c6e11a4..d14e6ef8c 100644
--- a/src/code/z_construct.c
+++ b/src/code/z_construct.c
@@ -44,8 +44,9 @@ void func_801109B0(GlobalContext* globalCtx) {
osSyncPrintf("parameter->parameterSegment=%x", interfaceCtx->parameterSegment);
- if (interfaceCtx->parameterSegment == NULL)
+ if (interfaceCtx->parameterSegment == NULL) {
__assert("parameter->parameterSegment != NULL", "../z_construct.c", 161);
+ }
DmaMgr_SendRequest1(interfaceCtx->parameterSegment, parameterStart, parameterSize, "../z_construct.c", 162);
@@ -55,27 +56,30 @@ void func_801109B0(GlobalContext* globalCtx) {
osSyncPrintf("DOアクション テクスチャ初期=%x\n", 0x480);
osSyncPrintf("parameter->do_actionSegment=%x", interfaceCtx->do_actionSegment);
- if (interfaceCtx->do_actionSegment == NULL)
+ if (interfaceCtx->do_actionSegment == NULL) {
__assert("parameter->do_actionSegment != NULL", "../z_construct.c", 169);
+ }
do_actionStart = _do_action_staticSegmentRomStart;
- if (gSaveContext.language == 0)
+ if (gSaveContext.language == 0) {
do_actionOffset = 0;
- else if (gSaveContext.language == 1)
+ } else if (gSaveContext.language == 1) {
do_actionOffset = 0x2B80;
- else
+ } else {
do_actionOffset = 0x5700;
+ }
DmaMgr_SendRequest1(interfaceCtx->do_actionSegment, do_actionStart + do_actionOffset, 0x300, "../z_construct.c",
174);
- if (gSaveContext.language == 0)
+ if (gSaveContext.language == 0) {
do_actionOffset = 0x480;
- else if (gSaveContext.language == 1)
+ } else if (gSaveContext.language == 1) {
do_actionOffset = 0x3000;
- else
+ } else {
do_actionOffset = 0x5B80;
+ }
DmaMgr_SendRequest1((void*)((u32)interfaceCtx->do_actionSegment + 0x300), do_actionStart + do_actionOffset, 0x180,
"../z_construct.c", 178);
@@ -86,36 +90,41 @@ void func_801109B0(GlobalContext* globalCtx) {
osSyncPrintf("アイコンアイテム テクスチャ初期=%x\n", 0x4000);
osSyncPrintf("parameter->icon_itemSegment=%x\n", interfaceCtx->icon_itemSegment);
- if (interfaceCtx->icon_itemSegment == NULL)
+ if (interfaceCtx->icon_itemSegment == NULL) {
__assert("parameter->icon_itemSegment != NULL", "../z_construct.c", 193);
+ }
osSyncPrintf("Register_Item[%x, %x, %x, %x]\n", gSaveContext.equips.button_items[0],
gSaveContext.equips.button_items[1], gSaveContext.equips.button_items[2],
gSaveContext.equips.button_items[3]);
- if (gSaveContext.equips.button_items[0] < 0xF0)
+ if (gSaveContext.equips.button_items[0] < 0xF0) {
DmaMgr_SendRequest1(interfaceCtx->icon_itemSegment,
_icon_item_staticSegmentRomStart + gSaveContext.equips.button_items[0] * 0x80, 0x1000,
"../z_construct.c", 198);
- else if (gSaveContext.equips.button_items[0] != 0xFF)
+ } else if (gSaveContext.equips.button_items[0] != 0xFF) {
DmaMgr_SendRequest1(interfaceCtx->icon_itemSegment,
_icon_item_staticSegmentRomStart + gSaveContext.equips.button_items[0] * 0x80, 0x1000,
"../z_construct.c", 203);
+ }
- if (gSaveContext.equips.button_items[1] < 0xF0)
+ if (gSaveContext.equips.button_items[1] < 0xF0) {
DmaMgr_SendRequest1((void*)((u32)interfaceCtx->icon_itemSegment + 0x1000),
_icon_item_staticSegmentRomStart + gSaveContext.equips.button_items[1] * 0x80, 0x1000,
"../z_construct.c", 209);
+ }
- if (gSaveContext.equips.button_items[2] < 0xF0)
+ if (gSaveContext.equips.button_items[2] < 0xF0) {
DmaMgr_SendRequest1((void*)((u32)interfaceCtx->icon_itemSegment + 0x2000),
_icon_item_staticSegmentRomStart + gSaveContext.equips.button_items[2] * 0x80, 0x1000,
"../z_construct.c", 214);
+ }
- if (gSaveContext.equips.button_items[3] < 0xF0)
+ if (gSaveContext.equips.button_items[3] < 0xF0) {
DmaMgr_SendRequest1((void*)((u32)interfaceCtx->icon_itemSegment + 0x3000),
_icon_item_staticSegmentRomStart + gSaveContext.equips.button_items[3] * 0x80, 0x1000,
"../z_construct.c", 219);
+ }
osSyncPrintf("EVENT=%d\n", gSaveContext.timer_1_state);
@@ -131,17 +140,19 @@ void func_801109B0(GlobalContext* globalCtx) {
}
}
- if ((gSaveContext.timer_1_state == 4) || (gSaveContext.timer_1_state == 8))
+ if ((gSaveContext.timer_1_state == 4) || (gSaveContext.timer_1_state == 8)) {
temp = 0;
- else
+ } else {
temp = 1;
+ }
gSaveContext.timer_x[temp] = 26;
- if (gSaveContext.health_capacity > 0xA0)
+ if (gSaveContext.health_capacity > 0xA0) {
gSaveContext.timer_y[temp] = 54;
- else
+ } else {
gSaveContext.timer_y[temp] = 46;
+ }
}
if ((gSaveContext.timer_1_state >= 11) && (gSaveContext.timer_1_state < 16)) {
diff --git a/src/code/z_debug_display.c b/src/code/z_debug_display.c
index e27afafeb..e96ccdc2f 100644
--- a/src/code/z_debug_display.c
+++ b/src/code/z_debug_display.c
@@ -83,7 +83,7 @@ static void DebugDisplay_DrawSpriteI8(DebugDispObject* dispObj, u32 texture, Glo
Matrix_Translate(dispObj->pos.x, dispObj->pos.y, dispObj->pos.z, MTXMODE_NEW);
Matrix_Scale(dispObj->scale.x, dispObj->scale.y, dispObj->scale.z, MTXMODE_APPLY);
Matrix_Mult(&globalCtx->mf_11DA0, MTXMODE_APPLY);
- Matrix_RotateXYZ(dispObj->rot.x, dispObj->rot.y, dispObj->rot.z, MTXMODE_APPLY);
+ Matrix_RotateZYX(dispObj->rot.x, dispObj->rot.y, dispObj->rot.z, MTXMODE_APPLY);
gDPLoadTextureBlock(gfxCtx->polyXlu.p++, texture, G_IM_FMT_I, G_IM_SIZ_8b, 16, 16, 0, G_TX_NOMIRROR | G_TX_WRAP,
G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);
diff --git a/src/code/z_demo.c b/src/code/z_demo.c
index bbc125e26..dd47227d4 100644
--- a/src/code/z_demo.c
+++ b/src/code/z_demo.c
@@ -114,8 +114,9 @@ void func_800645A0(GlobalContext* globalCtx, CutsceneContext* csCtx) {
gSaveContext.cutscene_trigger = 1;
}
- if ((gSaveContext.cutscene_trigger != 0) && (globalCtx->sceneLoadFlag == 0x14))
+ if ((gSaveContext.cutscene_trigger != 0) && (globalCtx->sceneLoadFlag == 0x14)) {
gSaveContext.cutscene_trigger = 0;
+ }
if ((gSaveContext.cutscene_trigger != 0) && (csCtx->state == CS_STATE_IDLE)) {
// Translates to: "CUTSCENE START REQUEST ANNOUNCEMENT!"
@@ -172,13 +173,15 @@ void func_80064824(GlobalContext* globalCtx, CutsceneContext* csCtx, CsCmdBase*
sp3F = 0;
- if ((csCtx->frames < cmd->startFrame) || (csCtx->frames >= cmd->endFrame) && (cmd->endFrame != cmd->startFrame))
+ if ((csCtx->frames < cmd->startFrame) || (csCtx->frames >= cmd->endFrame) && (cmd->endFrame != cmd->startFrame)) {
return;
+ }
temp = func_8006F93C(cmd->endFrame - 1, cmd->startFrame, csCtx->frames);
- if (csCtx->frames == cmd->startFrame)
+ if (csCtx->frames == cmd->startFrame) {
sp3F = 1;
+ }
switch (cmd->base) {
case 1:
@@ -198,13 +201,15 @@ void func_80064824(GlobalContext* globalCtx, CutsceneContext* csCtx, CsCmdBase*
case 3:
if (sp3F != 0) {
func_8006C3D0(globalCtx, 0);
- if (gSaveContext.entrance_index == 0x0053)
+ if (gSaveContext.entrance_index == 0x0053) {
func_8006C3D0(globalCtx, 2);
+ }
}
break;
case 6:
- if (globalCtx->unk_10AC4 < 0x3200)
+ if (globalCtx->unk_10AC4 < 0x3200) {
globalCtx->unk_10AC4 += 0x23;
+ }
break;
case 7:
if (sp3F != 0) {
@@ -219,8 +224,9 @@ void func_80064824(GlobalContext* globalCtx, CutsceneContext* csCtx, CsCmdBase*
}
break;
case 8:
- if (globalCtx->unk_11D30[0] < 0x80)
+ if (globalCtx->unk_11D30[0] < 0x80) {
globalCtx->unk_11D30[0] += 4;
+ }
break;
case 9:
globalCtx->unk_10B12[3] = 0x10;
@@ -229,33 +235,40 @@ void func_80064824(GlobalContext* globalCtx, CutsceneContext* csCtx, CsCmdBase*
func_8006C3D0(globalCtx, 1);
break;
case 11:
- if (globalCtx->unk_11D30[0] < 0x672)
+ if (globalCtx->unk_11D30[0] < 0x672) {
globalCtx->unk_11D30[0] += 0x14;
- if (csCtx->frames == 0x30F)
+ }
+ if (csCtx->frames == 0x30F) {
func_80078884(NA_SE_EV_DEKU_DEATH);
- else if (csCtx->frames == 0x2CD)
+ } else if (csCtx->frames == 0x2CD) {
globalCtx->unk_11D30[0] = 0;
+ }
break;
case 12:
if (sp3F != 0) {
- if (csCtx->state != CS_STATE_UNSKIPPABLE_EXEC)
+ if (csCtx->state != CS_STATE_UNSKIPPABLE_EXEC) {
csCtx->state = CS_STATE_UNSKIPPABLE_INIT;
+ }
}
break;
case 13:
- if (globalCtx->unk_11D30[1] == 0)
+ if (globalCtx->unk_11D30[1] == 0) {
func_80078884(NA_SE_EV_TRIFORCE_FLASH);
- if (globalCtx->unk_11D30[1] < 0xFF)
+ }
+ if (globalCtx->unk_11D30[1] < 0xFF) {
globalCtx->unk_11D30[1] += 5;
+ }
break;
case 14:
- if (sp3F != 0)
+ if (sp3F != 0) {
func_800BC490(globalCtx, 1);
+ }
break;
case 15:
- if (sp3F != 0)
+ if (sp3F != 0) {
TitleCard_InitPlaceName(globalCtx, &globalCtx->actorCtx.titleCtx, player->unk_1B0, 0xA0, 0x78, 0x90,
0x18, 0x14);
+ }
break;
case 16:
if (sp3F != 0) {
@@ -266,14 +279,16 @@ void func_80064824(GlobalContext* globalCtx, CutsceneContext* csCtx, CsCmdBase*
}
break;
case 17:
- if (sp3F != 0)
+ if (sp3F != 0) {
func_80092FAC(D_8015FCCA);
+ }
break;
case 18:
globalCtx->unk_10B12[0] = 0;
globalCtx->gloomySkyEvent = 2;
- if (gSaveContext.day_time < 0x4AAB)
+ if (gSaveContext.day_time < 0x4AAB) {
gSaveContext.day_time += 30;
+ }
if (globalCtx->unk_10B12[1] == 0) {
D_8011FB30 = 0;
func_800F6D58(14, 1, 0);
@@ -305,17 +320,19 @@ void func_80064824(GlobalContext* globalCtx, CutsceneContext* csCtx, CsCmdBase*
break;
case 25:
gSaveContext.day_time += 30;
- if ((gSaveContext.day_time & 0xFFFF) > 0xCAAA)
+ if ((gSaveContext.day_time & 0xFFFF) > 0xCAAA) {
gSaveContext.day_time = 0xCAAA;
+ }
break;
case 26:
if ((gSaveContext.day_time < 0x3000) || (gSaveContext.day_time >= 0x4555)) {
- if ((gSaveContext.day_time >= 0x4555) && (gSaveContext.day_time < 0xAAAB))
+ if ((gSaveContext.day_time >= 0x4555) && (gSaveContext.day_time < 0xAAAB)) {
globalCtx->unk_10AE3 = 1;
- else if ((gSaveContext.day_time >= 0xAAAB) && (gSaveContext.day_time < 0xC556))
+ } else if ((gSaveContext.day_time >= 0xAAAB) && (gSaveContext.day_time < 0xC556)) {
globalCtx->unk_10AE3 = 2;
- else
+ } else {
globalCtx->unk_10AE3 = 3;
+ }
}
break;
case 27:
@@ -346,18 +363,20 @@ void func_80064824(GlobalContext* globalCtx, CutsceneContext* csCtx, CsCmdBase*
func_8006C3D0(globalCtx, 4);
break;
case 32:
- if (sp3F != 0)
+ if (sp3F != 0) {
globalCtx->unk_10B0A = 1;
+ }
func_800788CC(0x20C0);
break;
case 33:
gSaveContext.unk_1422 = 1;
break;
case 34:
- if (!gSaveContext.night_flag)
+ if (!gSaveContext.night_flag) {
gSaveContext.day_time -= D_8011FB40;
- else
+ } else {
gSaveContext.day_time -= D_8011FB40 * 2;
+ }
break;
case 35:
func_800EE824(csCtx);
diff --git a/src/code/z_effect.c b/src/code/z_effect.c
new file mode 100644
index 000000000..dfe367d13
--- /dev/null
+++ b/src/code/z_effect.c
@@ -0,0 +1,26 @@
+#include <ultra64.h>
+#include <global.h>
+
+GlobalContext* func_80026B00(void) {
+ return D_80157DA0;
+}
+
+#pragma GLOBAL_ASM("asm/non_matchings/code/z_effect/func_80026B0C.s")
+
+void func_80026C1C(u8* arg0) {
+ arg0[0] = 0;
+ arg0[1] = 0;
+ arg0[2] = 0;
+}
+
+#pragma GLOBAL_ASM("asm/non_matchings/code/z_effect/func_80026C2C.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/code/z_effect/Effect_Add.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/code/z_effect/func_80026E74.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/code/z_effect/func_80026F70.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/code/z_effect/func_8002709C.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/code/z_effect/func_800271A8.s")
diff --git a/src/code/z_en_a_keep.c b/src/code/z_en_a_keep.c
index ea67ceb05..85cc0e9c2 100644
--- a/src/code/z_en_a_keep.c
+++ b/src/code/z_en_a_keep.c
@@ -94,8 +94,9 @@ void En_A_Obj_Init(ActorEnAObj* this, GlobalContext* globalCtx) {
break;
}
- if (this->actor.params >= 9)
+ if (this->actor.params >= 9) {
sp28 = 12.0f;
+ }
ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawFunc_Circle, sp28);
@@ -154,8 +155,9 @@ void En_A_Obj_Init(ActorEnAObj* this, GlobalContext* globalCtx) {
break;
}
- if (this->actor.params < 5)
+ if (this->actor.params < 5) {
this->actor.sub_98.mass = 0xFF;
+ }
if (this->dynaPolyId != -1) {
DynaPolyInfo_Alloc(D_8011546C[this->dynaPolyId], &sp34);
diff --git a/src/code/z_en_item00.c b/src/code/z_en_item00.c
index 1945c75ff..348e983ba 100644
--- a/src/code/z_en_item00.c
+++ b/src/code/z_en_item00.c
@@ -289,8 +289,9 @@ void En_Item00_Init(ActorEnItem00* this, GlobalContext* globalCtx) {
break;
}
- if ((sp2C != 0) && !func_8002F410(&this->actor, globalCtx))
+ if ((sp2C != 0) && !func_8002F410(&this->actor, globalCtx)) {
func_8002F554(&this->actor, globalCtx, sp2C);
+ }
En_Item00_SetNewUpdate(this, (ActorFunc)func_8001E5C8);
this->updateFunc(this, globalCtx);
@@ -480,11 +481,13 @@ void En_Item00_Update(ActorEnItem00* this, GlobalContext* globalCtx) {
sp3C = 0;
sp3A = 0;
- if (this->unk_15A > 0)
+ if (this->unk_15A > 0) {
this->unk_15A--;
+ }
- if ((this->unk_15A > 0) && (this->unk_15A < 41) && (this->unk_154 <= 0))
+ if ((this->unk_15A > 0) && (this->unk_15A < 41) && (this->unk_154 <= 0)) {
this->unk_156 = this->unk_15A;
+ }
this->updateFunc(this, globalCtx);
@@ -533,23 +536,28 @@ void En_Item00_Update(ActorEnItem00* this, GlobalContext* globalCtx) {
(this->actor.params == DROP_TUNIC_ZORA) || (this->actor.params == DROP_TUNIC_GORON)) {
f32 newUnkBC = Math_Coss(this->actor.shape.rot.x) * 37.0f;
this->actor.shape.unk_08 = newUnkBC;
- if (newUnkBC >= 0.0f)
+ if (newUnkBC >= 0.0f) {
this->actor.shape.unk_08 = this->actor.shape.unk_08;
- else
+ } else {
this->actor.shape.unk_08 = -this->actor.shape.unk_08;
+ }
}
- if (this->unk_154 > 0)
+ if (this->unk_154 > 0) {
return;
+ }
// MISMATCH: The first function argument is loaded too early here
if (!((this->actor.xzDistanceFromLink <= 30.0f) && (this->actor.yDistanceFromLink >= -50.0f) &&
- (this->actor.yDistanceFromLink <= 50.0f)))
- if (!func_8002F410(&this->actor, globalCtx))
+ (this->actor.yDistanceFromLink <= 50.0f))) {
+ if (!func_8002F410(&this->actor, globalCtx)) {
return;
+ }
+ }
- if (globalCtx->unk_10A20 != 0)
+ if (globalCtx->unk_10A20 != 0) {
return;
+ }
switch (this->actor.params) {
case DROP_RUPEE_GREEN:
@@ -630,8 +638,9 @@ void En_Item00_Update(ActorEnItem00* this, GlobalContext* globalCtx) {
}
// MISMATCH: The first function argument is also loaded too early here
- if ((sp3C != 0) && !func_8002F410(&this->actor, globalCtx))
+ if ((sp3C != 0) && !func_8002F410(&this->actor, globalCtx)) {
func_8002F554(&this->actor, globalCtx, sp3C);
+ }
switch (this->actor.params) {
case DROP_HEART_PIECE:
diff --git a/src/code/code_8006C360.c b/src/code/z_face_reaction.c
index 01cf89b4d..1bfe18b7c 100644
--- a/src/code/code_8006C360.c
+++ b/src/code/z_face_reaction.c
@@ -1,7 +1,7 @@
#include <ultra64.h>
#include <global.h>
-u16 D_8011F3F0[60][9] = {
+u16 sReactionTextIds[60][9] = {
{ 0x0000, 0x7124, 0x7127, 0x7126, 0x7125, 0x7127, 0x7124, 0x7125, 0x7127 },
{ 0x0000, 0x7128, 0x7129, 0x7128, 0x7128, 0x7128, 0x7128, 0x712A, 0x712B },
{ 0x0000, 0x7128, 0x712B, 0x7128, 0x7128, 0x7129, 0x7128, 0x712B, 0x7128 },
@@ -64,7 +64,7 @@ u16 D_8011F3F0[60][9] = {
{ 0x0000, 0x7104, 0x7105, 0x7107, 0x7105, 0x710C, 0x7105, 0x7107, 0x7107 },
};
-u16 func_8006C360(GlobalContext* globalCtx, u32 idx) {
- u8 mask = func_8008F080(globalCtx);
- return D_8011F3F0[idx][mask];
+u16 Text_GetFaceReaction(GlobalContext* globalCtx, u32 reactionSet) {
+ u8 currentMask = func_8008F080(globalCtx);
+ return sReactionTextIds[reactionSet][currentMask];
}
diff --git a/src/code/z_horse.c b/src/code/z_horse.c
index 13f6382f5..44612269b 100644
--- a/src/code/z_horse.c
+++ b/src/code/z_horse.c
@@ -159,19 +159,21 @@ void func_8006D684(GlobalContext* globalCtx, Player* player) {
{ 0xF6F7, 0x0139, 0x1766 },
};
- if (gSaveContext.entrance_index == 0x028A)
+ if (gSaveContext.entrance_index == 0x028A) {
spawnPos = spawnPositions[0];
- else if (gSaveContext.entrance_index == 0x028E)
+ } else if (gSaveContext.entrance_index == 0x028E) {
spawnPos = spawnPositions[1];
- else if (gSaveContext.entrance_index == 0x0292)
+ } else if (gSaveContext.entrance_index == 0x0292) {
spawnPos = spawnPositions[2];
- else
+ } else {
spawnPos = spawnPositions[3];
+ }
player->rideActor = Actor_Spawn(&globalCtx->actorCtx, globalCtx, ACTOR_EN_HORSE, spawnPos.x, spawnPos.y,
spawnPos.z, 0, player->actor.posRot.rot.y, 0, 7);
- if (player->rideActor == NULL)
+ if (player->rideActor == NULL) {
__assert("player->ride.actor != NULL", "../z_horse.c", 561);
+ }
func_8002DECC(globalCtx, player, player->rideActor);
func_8002DE74(globalCtx, player);
@@ -180,15 +182,17 @@ void func_8006D684(GlobalContext* globalCtx, Player* player) {
(Flags_GetEventChkInf(0x18) == 0) && (DREG(1) == 0)) {
player->rideActor =
Actor_Spawn(&globalCtx->actorCtx, globalCtx, ACTOR_EN_HORSE, 894.0f, 0.0f, -2084.0f, 0, -0x7FFF, 0, 5);
- if (player->rideActor == NULL)
+ if (player->rideActor == NULL) {
__assert("player->ride.actor != NULL", "../z_horse.c", 582);
+ }
func_8002DECC(globalCtx, player, player->rideActor);
func_8002DE74(globalCtx, player);
gSaveContext.horse_data.scene = globalCtx->sceneNum;
- if (globalCtx->sceneNum == SCENE_SPOT12)
+ if (globalCtx->sceneNum == SCENE_SPOT12) {
player->rideActor->room = -1;
+ }
} else {
static struct_8011F9B8 D_8011F9B8[] = {
{ 93, 0xFFF0, 0x0E10, 0x0585, 0x0168, 0x8001, 8 }, { 99, 0xFFF0, 0xFF06, 0x0001, 0xF9D4, 0x4000, 6 },
@@ -210,8 +214,9 @@ void func_8006D684(GlobalContext* globalCtx, Player* player) {
player->rideActor = Actor_Spawn(&globalCtx->actorCtx, globalCtx, ACTOR_EN_HORSE,
D_8011F9B8[i].pos.x, D_8011F9B8[i].pos.y, D_8011F9B8[i].pos.z, 0,
player->actor.posRot.rot.y, 0, D_8011F9B8[i].type);
- if (player->rideActor == NULL)
+ if (player->rideActor == NULL) {
__assert("player->ride.actor != NULL", "../z_horse.c", 628);
+ }
func_8002DECC(globalCtx, player, player->rideActor);
func_8002DE74(globalCtx, player);
@@ -221,14 +226,16 @@ void func_8006D684(GlobalContext* globalCtx, Player* player) {
s32 pad2;
temp = 0;
- if (((gSaveContext.event_inf[0] & 0x10) >> 4) && D_8011F9B8[i].type == 6)
+ if (((gSaveContext.event_inf[0] & 0x10) >> 4) && D_8011F9B8[i].type == 6) {
temp = 0x8000;
+ }
player->rideActor = Actor_Spawn(&globalCtx->actorCtx, globalCtx, ACTOR_EN_HORSE,
D_8011F9B8[i].pos.x, D_8011F9B8[i].pos.y, D_8011F9B8[i].pos.z, 0,
D_8011F9B8[i].angle, 0, D_8011F9B8[i].type | temp);
- if (player->rideActor == NULL)
+ if (player->rideActor == NULL) {
__assert("player->ride.actor != NULL", "../z_horse.c", 667);
+ }
player->actor.posRot.pos.x = D_8011F9B8[i].pos.x;
player->actor.posRot.pos.y = D_8011F9B8[i].pos.y;
diff --git a/src/code/z_kaleido_scope_call.c b/src/code/z_kaleido_scope_call.c
index a722beff9..3366c932d 100644
--- a/src/code/z_kaleido_scope_call.c
+++ b/src/code/z_kaleido_scope_call.c
@@ -75,8 +75,9 @@ void KaleidoScopeCall_Update(GlobalContext* globalCtx) {
pauseCtx->state++;
} else if (pauseCtx->state == 2 || pauseCtx->state == 9) {
osSyncPrintf("R_PAUSE_MENU_MODE=%d\n", R_PAUSE_MENU_MODE);
- if (R_PAUSE_MENU_MODE >= 3)
+ if (R_PAUSE_MENU_MODE >= 3) {
pauseCtx->state++;
+ }
} else if (pauseCtx->state != 0) {
if (&gKaleidoMgrOverlayTable[KALEIDO_OVL_KALEIDO_SCOPE] != gKaleidoMgrCurOvl) {
if (gKaleidoMgrCurOvl) {
diff --git a/src/code/z_parameter.c b/src/code/z_parameter.c
index 91c70d609..51de6e08c 100644
--- a/src/code/z_parameter.c
+++ b/src/code/z_parameter.c
@@ -1141,13 +1141,15 @@ void Inventory_SwapAgeEquipment(void) {
if (LINK_AGE_IN_YEARS == YEARS_CHILD) {
for (i = 0; i < 4; i++) {
- if (i != 0)
+ if (i != 0) {
gSaveContext.child_equips.button_items[i] = gSaveContext.equips.button_items[i];
- else
+ } else {
gSaveContext.child_equips.button_items[i] = ITEM_SWORD_KOKIRI;
+ }
- if (i != 0)
+ if (i != 0) {
gSaveContext.child_equips.c_button_slots[i - 1] = gSaveContext.equips.c_button_slots[i - 1];
+ }
}
gSaveContext.child_equips.equipment = gSaveContext.equips.equipment;
@@ -1172,8 +1174,9 @@ void Inventory_SwapAgeEquipment(void) {
for (i = 0; i < 4; i++) {
gSaveContext.equips.button_items[i] = gSaveContext.adult_equips.button_items[i];
- if (i != 0)
+ if (i != 0) {
gSaveContext.equips.c_button_slots[i - 1] = gSaveContext.adult_equips.c_button_slots[i - 1];
+ }
if (((gSaveContext.equips.button_items[i] >= ITEM_BOTTLE) &&
(gSaveContext.equips.button_items[i] <= ITEM_POE)) ||
@@ -1190,8 +1193,9 @@ void Inventory_SwapAgeEquipment(void) {
for (i = 0; i < 4; i++) {
gSaveContext.adult_equips.button_items[i] = gSaveContext.equips.button_items[i];
- if (i != 0)
+ if (i != 0) {
gSaveContext.adult_equips.c_button_slots[i - 1] = gSaveContext.equips.c_button_slots[i - 1];
+ }
}
gSaveContext.adult_equips.equipment = gSaveContext.equips.equipment;
@@ -1200,8 +1204,9 @@ void Inventory_SwapAgeEquipment(void) {
for (i = 0; i < 4; i++) {
gSaveContext.equips.button_items[i] = gSaveContext.child_equips.button_items[i];
- if (i != 0)
+ if (i != 0) {
gSaveContext.equips.c_button_slots[i - 1] = gSaveContext.child_equips.c_button_slots[i - 1];
+ }
if (((gSaveContext.equips.button_items[i] >= ITEM_BOTTLE) &&
(gSaveContext.equips.button_items[i] <= ITEM_POE)) ||
@@ -1221,8 +1226,9 @@ void Inventory_SwapAgeEquipment(void) {
temp = gEquipMasks[EQUIP_SHIELD] & gSaveContext.equips.equipment;
if (temp != 0) {
temp >>= gEquipShifts[EQUIP_SHIELD];
- if (!(gBitFlags[temp + 3] & gSaveContext.equipment))
+ if (!(gBitFlags[temp + 3] & gSaveContext.equipment)) {
gSaveContext.equips.equipment &= gEquipNegMasks[EQUIP_SHIELD];
+ }
}
}
#else
@@ -1315,8 +1321,9 @@ u8 Item_Give(GlobalContext* globalCtx, u8 item) {
s8 bombCount;
slot = SLOT(item);
- if (item >= ITEM_STICKS_5)
+ if (item >= ITEM_STICKS_5) {
slot = SLOT(sExtraItemBases[item - ITEM_STICKS_5]);
+ }
osSyncPrintf(VT_FGCOL(YELLOW));
osSyncPrintf("item_get_setting=%d pt=%d z=%x\n", item, slot, gSaveContext.items[slot]);
@@ -1330,8 +1337,9 @@ u8 Item_Give(GlobalContext* globalCtx, u8 item) {
osSyncPrintf("封印 = %x\n", gSaveContext.quest_items);
osSyncPrintf(VT_RST);
- if (item == ITEM_MEDALLION_WATER)
+ if (item == ITEM_MEDALLION_WATER) {
func_8006D0AC(globalCtx);
+ }
return ITEM_NONE;
} else if ((item >= ITEM_SONG_MINUET) && (item <= ITEM_SONG_STORMS)) {
@@ -1423,8 +1431,9 @@ u8 Item_Give(GlobalContext* globalCtx, u8 item) {
return ITEM_NONE;
} else {
AMMO(ITEM_BOW)++;
- if (AMMO(ITEM_BOW) > CUR_CAPACITY(UPG_QUIVER))
+ if (AMMO(ITEM_BOW) > CUR_CAPACITY(UPG_QUIVER)) {
AMMO(ITEM_BOW) = CUR_CAPACITY(UPG_QUIVER);
+ }
}
} else if (item == ITEM_QUIVER_40) {
Inventory_ChangeUpgrade(UPG_QUIVER, 2);
@@ -1450,8 +1459,9 @@ u8 Item_Give(GlobalContext* globalCtx, u8 item) {
return ITEM_NONE;
} else {
AMMO(ITEM_BOMB)++;
- if (AMMO(ITEM_BOMB) > CUR_CAPACITY(UPG_BOMB_BAG))
+ if (AMMO(ITEM_BOMB) > CUR_CAPACITY(UPG_BOMB_BAG)) {
AMMO(ITEM_BOMB) = CUR_CAPACITY(UPG_BOMB_BAG);
+ }
}
} else if (item == ITEM_BOMB_BAG_30) {
Inventory_ChangeUpgrade(UPG_BOMB_BAG, 2);
@@ -1483,26 +1493,30 @@ u8 Item_Give(GlobalContext* globalCtx, u8 item) {
Inventory_ChangeUpgrade(UPG_WALLET, 2);
return ITEM_NONE;
} else if (item == ITEM_STICK_UPGRADE_20) {
- if (gSaveContext.items[slot] == ITEM_NONE)
+ if (gSaveContext.items[slot] == ITEM_NONE) {
INV_CONTENT(ITEM_STICK) = ITEM_STICK;
+ }
Inventory_ChangeUpgrade(UPG_STICKS, 2);
AMMO(ITEM_STICK) = CAPACITY(UPG_STICKS, 2);
return ITEM_NONE;
} else if (item == ITEM_STICK_UPGRADE_30) {
- if (gSaveContext.items[slot] == ITEM_NONE)
+ if (gSaveContext.items[slot] == ITEM_NONE) {
INV_CONTENT(ITEM_STICK) = ITEM_STICK;
+ }
Inventory_ChangeUpgrade(UPG_STICKS, 3);
AMMO(ITEM_STICK) = CAPACITY(UPG_STICKS, 3);
return ITEM_NONE;
} else if (item == ITEM_NUT_UPGRADE_30) {
- if (gSaveContext.items[slot] == ITEM_NONE)
+ if (gSaveContext.items[slot] == ITEM_NONE) {
INV_CONTENT(ITEM_NUT) = ITEM_NUT;
+ }
Inventory_ChangeUpgrade(UPG_NUTS, 2);
AMMO(ITEM_NUT) = CAPACITY(UPG_NUTS, 2);
return ITEM_NONE;
} else if (item == ITEM_NUT_UPGRADE_40) {
- if (gSaveContext.items[slot] == ITEM_NONE)
+ if (gSaveContext.items[slot] == ITEM_NONE) {
INV_CONTENT(ITEM_NUT) = ITEM_NUT;
+ }
Inventory_ChangeUpgrade(UPG_NUTS, 3);
AMMO(ITEM_NUT) = CAPACITY(UPG_NUTS, 3);
return ITEM_NONE;
@@ -1521,8 +1535,9 @@ u8 Item_Give(GlobalContext* globalCtx, u8 item) {
AMMO(ITEM_STICK) = 1;
} else {
AMMO(ITEM_STICK)++;
- if (AMMO(ITEM_STICK) > CUR_CAPACITY(UPG_STICKS))
+ if (AMMO(ITEM_STICK) > CUR_CAPACITY(UPG_STICKS)) {
AMMO(ITEM_STICK) = CUR_CAPACITY(UPG_STICKS);
+ }
}
} else if ((item == ITEM_STICKS_5) || (item == ITEM_STICKS_10)) {
if (gSaveContext.items[slot] == ITEM_NONE) {
@@ -1530,8 +1545,9 @@ u8 Item_Give(GlobalContext* globalCtx, u8 item) {
AMMO(ITEM_STICK) = sAmmoRefillCounts[item - ITEM_STICKS_5];
} else {
AMMO(ITEM_STICK) += sAmmoRefillCounts[item - ITEM_STICKS_5];
- if (AMMO(ITEM_STICK) > CUR_CAPACITY(UPG_STICKS))
+ if (AMMO(ITEM_STICK) > CUR_CAPACITY(UPG_STICKS)) {
AMMO(ITEM_STICK) = CUR_CAPACITY(UPG_STICKS);
+ }
}
item = ITEM_STICK;
} else if (item == ITEM_NUT) {
@@ -1540,8 +1556,9 @@ u8 Item_Give(GlobalContext* globalCtx, u8 item) {
AMMO(ITEM_NUT) = ITEM_NUT;
} else {
AMMO(ITEM_NUT)++;
- if (AMMO(ITEM_NUT) > CUR_CAPACITY(UPG_NUTS))
+ if (AMMO(ITEM_NUT) > CUR_CAPACITY(UPG_NUTS)) {
AMMO(ITEM_NUT) = CUR_CAPACITY(UPG_NUTS);
+ }
}
} else if ((item == ITEM_NUTS_5) || (item == ITEM_NUTS_10)) {
if (gSaveContext.items[slot] == ITEM_NONE) {
@@ -1552,8 +1569,9 @@ u8 Item_Give(GlobalContext* globalCtx, u8 item) {
sAmmoRefillCounts[item - ITEM_NUTS_5]);
} else {
AMMO(ITEM_NUT) += sAmmoRefillCounts[item - ITEM_NUTS_5];
- if (AMMO(ITEM_NUT) > CUR_CAPACITY(UPG_NUTS))
+ if (AMMO(ITEM_NUT) > CUR_CAPACITY(UPG_NUTS)) {
AMMO(ITEM_NUT) = CUR_CAPACITY(UPG_NUTS);
+ }
}
item = ITEM_NUT;
} else if (item == ITEM_BOMB) {
@@ -1561,14 +1579,16 @@ u8 Item_Give(GlobalContext* globalCtx, u8 item) {
osSyncPrintf(" 爆弾 爆弾 爆弾 爆弾 爆弾 爆弾 爆弾 \n");
bombCount = AMMO(ITEM_BOMB) + 1;
AMMO(ITEM_BOMB) = bombCount;
- if (bombCount > CUR_CAPACITY(UPG_BOMB_BAG))
+ if (bombCount > CUR_CAPACITY(UPG_BOMB_BAG)) {
AMMO(ITEM_BOMB) = CUR_CAPACITY(UPG_BOMB_BAG);
+ }
return ITEM_NONE;
} else if ((item >= ITEM_BOMBS_5) && (item <= ITEM_BOMBS_30)) {
bombCount = AMMO(ITEM_BOMB) + sAmmoRefillCounts[item - ITEM_BOMBS_5];
AMMO(ITEM_BOMB) = bombCount;
- if (bombCount > CUR_CAPACITY(UPG_BOMB_BAG))
+ if (bombCount > CUR_CAPACITY(UPG_BOMB_BAG)) {
AMMO(ITEM_BOMB) = CUR_CAPACITY(UPG_BOMB_BAG);
+ }
return ITEM_NONE;
} else if (item == ITEM_BOMBCHU) {
if (gSaveContext.items[slot] == ITEM_NONE) {
@@ -1577,8 +1597,9 @@ u8 Item_Give(GlobalContext* globalCtx, u8 item) {
return ITEM_NONE;
} else {
AMMO(ITEM_BOMBCHU) += 10;
- if (AMMO(ITEM_BOMBCHU) > 50)
+ if (AMMO(ITEM_BOMBCHU) > 50) {
AMMO(ITEM_BOMBCHU) = 50;
+ }
return ITEM_NONE;
}
} else if ((item == ITEM_BOMBCHUS_5) || (item == ITEM_BOMBCHUS_20)) {
@@ -1588,15 +1609,17 @@ u8 Item_Give(GlobalContext* globalCtx, u8 item) {
return ITEM_NONE;
} else {
AMMO(ITEM_BOMBCHU) += sAmmoRefillCounts[item - ITEM_BOMBCHUS_5 + 8];
- if (AMMO(ITEM_BOMBCHU) > 50)
+ if (AMMO(ITEM_BOMBCHU) > 50) {
AMMO(ITEM_BOMBCHU) = 50;
+ }
return ITEM_NONE;
}
} else if ((item >= ITEM_ARROWS_SMALL) && (item <= ITEM_ARROWS_LARGE)) {
AMMO(ITEM_BOW) += sAmmoRefillCounts[item - ITEM_ARROWS_SMALL + 4];
- if ((AMMO(ITEM_BOW) >= CUR_CAPACITY(UPG_QUIVER)) || (AMMO(ITEM_BOW) < 0))
+ if ((AMMO(ITEM_BOW) >= CUR_CAPACITY(UPG_QUIVER)) || (AMMO(ITEM_BOW) < 0)) {
AMMO(ITEM_BOW) = CUR_CAPACITY(UPG_QUIVER);
+ }
osSyncPrintf("%d本 Item_MaxGet=%d\n", AMMO(ITEM_BOW), CUR_CAPACITY(UPG_QUIVER));
@@ -1609,8 +1632,9 @@ u8 Item_Give(GlobalContext* globalCtx, u8 item) {
} else if (item == ITEM_SEEDS) {
AMMO(ITEM_SLINGSHOT) += 5;
- if (AMMO(ITEM_SLINGSHOT) >= CUR_CAPACITY(UPG_BULLET_BAG))
+ if (AMMO(ITEM_SLINGSHOT) >= CUR_CAPACITY(UPG_BULLET_BAG)) {
AMMO(ITEM_SLINGSHOT) = CUR_CAPACITY(UPG_BULLET_BAG);
+ }
if (!(gSaveContext.item_get_inf[1] & 8)) {
gSaveContext.item_get_inf[1] |= 8;
@@ -1621,8 +1645,9 @@ u8 Item_Give(GlobalContext* globalCtx, u8 item) {
} else if (item == ITEM_SEEDS_30) {
AMMO(ITEM_SLINGSHOT) += 30;
- if (AMMO(ITEM_SLINGSHOT) >= CUR_CAPACITY(UPG_BULLET_BAG))
+ if (AMMO(ITEM_SLINGSHOT) >= CUR_CAPACITY(UPG_BULLET_BAG)) {
AMMO(ITEM_SLINGSHOT) = CUR_CAPACITY(UPG_BULLET_BAG);
+ }
if (!(gSaveContext.item_get_inf[1] & 8)) {
gSaveContext.item_get_inf[1] |= 8;
@@ -1665,8 +1690,9 @@ u8 Item_Give(GlobalContext* globalCtx, u8 item) {
Health_ChangeBy(globalCtx, 0x10);
return item;
} else if (item == ITEM_MAGIC_SMALL) {
- if (gSaveContext.unk_13F0 != 10)
+ if (gSaveContext.unk_13F0 != 10) {
func_80087680(globalCtx);
+ }
func_80087708(globalCtx, 12, 5);
@@ -1677,8 +1703,9 @@ u8 Item_Give(GlobalContext* globalCtx, u8 item) {
return item;
} else if (item == ITEM_MAGIC_LARGE) {
- if (gSaveContext.unk_13F0 != 10)
+ if (gSaveContext.unk_13F0 != 10) {
func_80087680(globalCtx);
+ }
func_80087708(globalCtx, 24, 5);
@@ -1741,8 +1768,9 @@ u8 Item_Give(GlobalContext* globalCtx, u8 item) {
}
}
} else if ((item >= ITEM_WEIRD_EGG) && (item <= ITEM_CLAIM_CHECK)) {
- if (item == ITEM_SAW)
+ if (item == ITEM_SAW) {
gSaveContext.item_get_inf[1] |= 0x8000;
+ }
prevTradeItem = INV_CONTENT(item);
INV_CONTENT(item) = item;
@@ -1990,8 +2018,9 @@ void Inventory_UpdateBottleItem(GlobalContext* globalCtx, u8 item, u8 cButton) {
// Special case to only empty half of a Lon Lon Milk Bottle
if ((gSaveContext.items[gSaveContext.equips.c_button_slots[cButton - 1]] == ITEM_MILK_BOTTLE) &&
- (item == ITEM_BOTTLE))
+ (item == ITEM_BOTTLE)) {
item = ITEM_MILK_HALF;
+ }
gSaveContext.items[gSaveContext.equips.c_button_slots[cButton - 1]] = item;
gSaveContext.equips.button_items[cButton] = item;
@@ -2052,14 +2081,17 @@ u32 sDoActionTextures[] = { 0x07000000, 0x07000180 };
#ifdef NON_MATCHING
// 0x80000000 is reused in the 2 *_TO_VIRTUAL macros when it shouldn't
void Interface_LoadActionLabel(InterfaceContext* interfaceCtx, u16 action, s16 arg2) {
- if (action >= 0x1D)
+ if (action >= 0x1D) {
action = 0x0A;
+ }
- if (gSaveContext.language != 0)
+ if (gSaveContext.language != 0) {
action += 0x1D;
+ }
- if (gSaveContext.language == 2)
+ if (gSaveContext.language == 2) {
action += 0x1D;
+ }
if ((action != 0x0A) && (action != 0x27) && (action != 0x44)) {
osCreateMesgQueue(&interfaceCtx->loadQueue, &interfaceCtx->loadMsg, OS_MESG_BLOCK);
@@ -2375,12 +2407,14 @@ void Interface_UpdateMagicBar(GlobalContext* globalCtx) {
if (gSaveContext.unk_13F4 != maxMagic) {
if (gSaveContext.unk_13F4 < maxMagic) {
gSaveContext.unk_13F4 += 8;
- if (gSaveContext.unk_13F4 > maxMagic)
+ if (gSaveContext.unk_13F4 > maxMagic) {
gSaveContext.unk_13F4 = maxMagic;
+ }
} else {
gSaveContext.unk_13F4 -= 8;
- if (gSaveContext.unk_13F4 <= maxMagic)
+ if (gSaveContext.unk_13F4 <= maxMagic) {
gSaveContext.unk_13F4 = maxMagic;
+ }
}
} else {
gSaveContext.unk_13F0 = 9;
@@ -2389,8 +2423,9 @@ void Interface_UpdateMagicBar(GlobalContext* globalCtx) {
case 9:
gSaveContext.magic += 4;
- if (gSaveContext.game_mode == 0 && gSaveContext.scene_setup_index < 4)
+ if (gSaveContext.game_mode == 0 && gSaveContext.scene_setup_index < 4) {
Audio_PlaySoundGeneral(0x401F, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8);
+ }
// Translates to: "Storage MAGIC_NOW=%d (%d)"
osSyncPrintf("蓄電 MAGIC_NOW=%d (%d)\n", gSaveContext.magic, gSaveContext.unk_13F6);
@@ -2423,20 +2458,23 @@ void Interface_UpdateMagicBar(GlobalContext* globalCtx) {
case 6:
color = sMagicBorderColors[sMagicBorderIndexes[sMagicBorderStep]];
- if (sMagicBorderR >= color[0])
+ if (sMagicBorderR >= color[0]) {
sMagicBorderR -= ABS(sMagicBorderR - color[0]) / sMagicBorderRatio;
- else
+ } else {
sMagicBorderR += ABS(sMagicBorderR - color[0]) / sMagicBorderRatio;
+ }
- if (sMagicBorderG >= color[1])
+ if (sMagicBorderG >= color[1]) {
sMagicBorderG -= ABS(sMagicBorderG - color[1]) / sMagicBorderRatio;
- else
+ } else {
sMagicBorderG += ABS(sMagicBorderG - color[1]) / sMagicBorderRatio;
+ }
- if (sMagicBorderB >= color[2])
+ if (sMagicBorderB >= color[2]) {
sMagicBorderB -= ABS(sMagicBorderB - color[2]) / sMagicBorderRatio;
- else
+ } else {
sMagicBorderB += ABS(sMagicBorderB - color[2]) / sMagicBorderRatio;
+ }
sMagicBorderRatio--;
if (sMagicBorderRatio == 0) {
@@ -2445,8 +2483,9 @@ void Interface_UpdateMagicBar(GlobalContext* globalCtx) {
sMagicBorderB = color[2];
sMagicBorderRatio = YREG(40 + sMagicBorderStep);
sMagicBorderStep++;
- if (sMagicBorderStep >= 4)
+ if (sMagicBorderStep >= 4) {
sMagicBorderStep = 0;
+ }
}
break;
case 5:
@@ -2481,20 +2520,23 @@ void Interface_UpdateMagicBar(GlobalContext* globalCtx) {
color = sMagicBorderColors[sMagicBorderIndexes[sMagicBorderStep]];
- if (sMagicBorderR >= color[0])
+ if (sMagicBorderR >= color[0]) {
sMagicBorderR -= ABS(sMagicBorderR - color[0]) / sMagicBorderRatio;
- else
+ } else {
sMagicBorderR += ABS(sMagicBorderR - color[0]) / sMagicBorderRatio;
+ }
- if (sMagicBorderG >= color[1])
+ if (sMagicBorderG >= color[1]) {
sMagicBorderG -= ABS(sMagicBorderG - color[1]) / sMagicBorderRatio;
- else
+ } else {
sMagicBorderG += ABS(sMagicBorderG - color[1]) / sMagicBorderRatio;
+ }
- if (sMagicBorderB >= color[2])
+ if (sMagicBorderB >= color[2]) {
sMagicBorderB -= ABS(sMagicBorderB - color[2]) / sMagicBorderRatio;
- else
+ } else {
sMagicBorderB += ABS(sMagicBorderB - color[2]) / sMagicBorderRatio;
+ }
sMagicBorderRatio--;
if (sMagicBorderRatio == 0) {
@@ -2503,8 +2545,9 @@ void Interface_UpdateMagicBar(GlobalContext* globalCtx) {
sMagicBorderB = color[2];
sMagicBorderRatio = YREG(40 + sMagicBorderStep);
sMagicBorderStep++;
- if (sMagicBorderStep >= 4)
+ if (sMagicBorderStep >= 4) {
sMagicBorderStep = 0;
+ }
}
break;
case 10:
@@ -2772,13 +2815,14 @@ void Interface_DrawItemButtons(GlobalContext* globalCtx) {
// C-Up Button Texture, Color & Label (Navi Text)
gDPPipeSync(gfxCtx->overlay.p++);
- if ((gSaveContext.unk_13EA == 1) || (gSaveContext.unk_13EA == 2) || (gSaveContext.unk_13EA == 5))
+ if ((gSaveContext.unk_13EA == 1) || (gSaveContext.unk_13EA == 2) || (gSaveContext.unk_13EA == 5)) {
cUpAlpha = 0;
- else if ((player->stateFlags2 & 0x00200000) || (func_8008F2F8(globalCtx) == 4) ||
- (player->stateFlags2 & 0x00040000))
+ } else if ((player->stateFlags2 & 0x00200000) || (func_8008F2F8(globalCtx) == 4) ||
+ (player->stateFlags2 & 0x00040000)) {
cUpAlpha = 0x46;
- else
+ } else {
cUpAlpha = interfaceCtx->healthAlpha;
+ }
gDPSetPrimColor(gfxCtx->overlay.p++, 0, 0, R_C_BTN_COLOR(0), R_C_BTN_COLOR(1), R_C_BTN_COLOR(2), cUpAlpha);
gDPSetCombineLERP(gfxCtx->overlay.p++, TEXEL0, 0, PRIMITIVE, 0, TEXEL0, 0, PRIMITIVE, 0, TEXEL0, 0,
@@ -2820,15 +2864,16 @@ void Interface_DrawItemButtons(GlobalContext* globalCtx) {
// Empty C Button Arrows
for (i = 1; i < 4; i++) {
if (gSaveContext.equips.button_items[i] > 0xF0) {
- if (i == 1)
+ if (i == 1) {
gDPSetPrimColor(gfxCtx->overlay.p++, 0, 0, R_C_BTN_COLOR(0), R_C_BTN_COLOR(1), R_C_BTN_COLOR(2),
interfaceCtx->cLeftAlpha);
- else if (i == 2)
+ } else if (i == 2) {
gDPSetPrimColor(gfxCtx->overlay.p++, 0, 0, R_C_BTN_COLOR(0), R_C_BTN_COLOR(1), R_C_BTN_COLOR(2),
interfaceCtx->cDownAlpha);
- else
+ } else {
gDPSetPrimColor(gfxCtx->overlay.p++, 0, 0, R_C_BTN_COLOR(0), R_C_BTN_COLOR(1), R_C_BTN_COLOR(2),
interfaceCtx->cRightAlpha);
+ }
gfxCtx->overlay.p =
Draw_TextureIA8(gfxCtx->overlay.p, &D_02000A00[i + 1], 0x20, 0x20, R_ITEM_BTN_X(i), R_ITEM_BTN_Y(i),
@@ -3188,12 +3233,13 @@ void Interface_Draw(GlobalContext* globalCtx) {
// Rupee Counter
gDPPipeSync(gfxCtx->overlay.p++);
- if (gSaveContext.rupees == CUR_CAPACITY(UPG_WALLET))
+ if (gSaveContext.rupees == CUR_CAPACITY(UPG_WALLET)) {
gDPSetPrimColor(gfxCtx->overlay.p++, 0, 0, 0x78, 0xFF, 0x00, interfaceCtx->magicAlpha);
- else if (gSaveContext.rupees != 0)
+ } else if (gSaveContext.rupees != 0) {
gDPSetPrimColor(gfxCtx->overlay.p++, 0, 0, 0xFF, 0xFF, 0xFF, interfaceCtx->magicAlpha);
- else
+ } else {
gDPSetPrimColor(gfxCtx->overlay.p++, 0, 0, 0x64, 0x64, 0x64, interfaceCtx->magicAlpha);
+ }
gDPSetCombineLERP(gfxCtx->overlay.p++, 0, 0, 0, PRIMITIVE, TEXEL0, 0, PRIMITIVE, 0, 0, 0, 0, PRIMITIVE, TEXEL0,
0, PRIMITIVE, 0);
@@ -3201,8 +3247,9 @@ void Interface_Draw(GlobalContext* globalCtx) {
interfaceCtx->counterDigits[0] = interfaceCtx->counterDigits[1] = 0;
interfaceCtx->counterDigits[2] = gSaveContext.rupees;
- if ((interfaceCtx->counterDigits[2] >= 10000) || (interfaceCtx->counterDigits[2] < 0))
+ if ((interfaceCtx->counterDigits[2] >= 10000) || (interfaceCtx->counterDigits[2] < 0)) {
interfaceCtx->counterDigits[2] &= 0xDDD;
+ }
while (interfaceCtx->counterDigits[2] >= 100) {
interfaceCtx->counterDigits[2] -= 100;
@@ -3225,8 +3272,9 @@ void Interface_Draw(GlobalContext* globalCtx) {
Interface_DrawMagicBar(globalCtx);
Interface_DrawMinimap(globalCtx);
- if ((R_PAUSE_MENU_MODE != 2) && (R_PAUSE_MENU_MODE != 3))
+ if ((R_PAUSE_MENU_MODE != 2) && (R_PAUSE_MENU_MODE != 3)) {
func_8002C124(&globalCtx->actorCtx.targetCtx, globalCtx); // Draw Z-Target
+ }
func_80094520(globalCtx->state.gfxCtx);
@@ -3343,10 +3391,11 @@ void Interface_Draw(GlobalContext* globalCtx) {
G_MTX_MODELVIEW | G_MTX_LOAD);
gSPVertex(gfxCtx->overlay.p++, &interfaceCtx->vtx_128[4], 4, 0);
- if ((interfaceCtx->unk_1EC < 2) || (interfaceCtx->unk_1EC == 3))
+ if ((interfaceCtx->unk_1EC < 2) || (interfaceCtx->unk_1EC == 3)) {
Interface_DrawActionLabel(globalCtx->state.gfxCtx, (void*)(u32)interfaceCtx->do_actionSegment);
- else
+ } else {
Interface_DrawActionLabel(globalCtx->state.gfxCtx, (void*)((u32)interfaceCtx->do_actionSegment + 0x180));
+ }
gDPPipeSync(gfxCtx->overlay.p++);
@@ -3441,10 +3490,11 @@ void Interface_Draw(GlobalContext* globalCtx) {
phi_s1 = ZREG(14);
for (phi_s3 = 1; phi_s3 < 7; phi_s3++) {
// Carrot Color (based on availability)
- if ((interfaceCtx->unk_23A == 0) || (interfaceCtx->unk_23A < phi_s3))
+ if ((interfaceCtx->unk_23A == 0) || (interfaceCtx->unk_23A < phi_s3)) {
gDPSetPrimColor(gfxCtx->overlay.p++, 0, 0, 0x00, 0x96, 0xFF, interfaceCtx->aAlpha);
- else
+ } else {
gDPSetPrimColor(gfxCtx->overlay.p++, 0, 0, 0xFF, 0xFF, 0xFF, interfaceCtx->aAlpha);
+ }
gSPTextureRectangle(gfxCtx->overlay.p++, phi_s1 << 2, ZREG(15) << 2, (phi_s1 + 16) << 2,
(ZREG(15) + 16) << 2, G_TX_RENDERTILE, 0, 0, 1024, 1024);
@@ -3507,10 +3557,11 @@ void Interface_Draw(GlobalContext* globalCtx) {
(gSaveContext.equips.button_items[0] != ITEM_SWORD_MASTER) &&
(gSaveContext.equips.button_items[0] != ITEM_SWORD_BGS) &&
(gSaveContext.equips.button_items[0] != ITEM_SWORD_KNIFE)) {
- if (gSaveContext.button_status[0] != BTN_ENABLED)
+ if (gSaveContext.button_status[0] != BTN_ENABLED) {
gSaveContext.equips.button_items[0] = gSaveContext.button_status[0];
- else
+ } else {
gSaveContext.equips.button_items[0] = ITEM_NONE;
+ }
}
// Revert any spoiling trade quest items
@@ -3553,20 +3604,22 @@ void Interface_Draw(GlobalContext* globalCtx) {
case 5:
case 11:
D_8015FFE0 = D_8015FFE2 = 20;
- if (gSaveContext.timer_1_state == 5)
+ if (gSaveContext.timer_1_state == 5) {
gSaveContext.timer_1_state = 6;
- else
+ } else {
gSaveContext.timer_1_state = 12;
+ }
break;
case 6:
case 12:
D_8015FFE2--;
if (D_8015FFE2 == 0) {
D_8015FFE2 = 20;
- if (gSaveContext.timer_1_state == 6)
+ if (gSaveContext.timer_1_state == 6) {
gSaveContext.timer_1_state = 7;
- else
+ } else {
gSaveContext.timer_1_state = 13;
+ }
}
break;
case 3:
@@ -3574,10 +3627,11 @@ void Interface_Draw(GlobalContext* globalCtx) {
phi_s3 = (gSaveContext.timer_x[0] - 26) / D_8015FFE2;
gSaveContext.timer_x[0] -= phi_s3;
- if (gSaveContext.health_capacity > 0xA0)
+ if (gSaveContext.health_capacity > 0xA0) {
phi_s3 = (gSaveContext.timer_y[0] - 54) / D_8015FFE2;
- else
+ } else {
phi_s3 = (gSaveContext.timer_y[0] - 46) / D_8015FFE2;
+ }
gSaveContext.timer_y[0] -= phi_s3;
D_8015FFE2--;
@@ -3585,30 +3639,34 @@ void Interface_Draw(GlobalContext* globalCtx) {
gSaveContext.timer_x[0] = 26;
D_8015FFE2 = 20;
- if (gSaveContext.health_capacity > 0xA0)
+ if (gSaveContext.health_capacity > 0xA0) {
gSaveContext.timer_y[0] = 54;
- else
+ } else {
gSaveContext.timer_y[0] = 46;
+ }
- if (gSaveContext.timer_1_state == 3)
+ if (gSaveContext.timer_1_state == 3) {
gSaveContext.timer_1_state = 4;
- else
+ } else {
gSaveContext.timer_1_state = 8;
+ }
}
case 4:
case 8:
if ((gSaveContext.timer_1_state == 4) || (gSaveContext.timer_1_state == 8)) {
- if (gSaveContext.health_capacity > 0xA0)
+ if (gSaveContext.health_capacity > 0xA0) {
gSaveContext.timer_y[0] = 54;
- else
+ } else {
gSaveContext.timer_y[0] = 46;
+ }
}
if ((gSaveContext.timer_1_state >= 3) && (msgCtx->unk_E300 == 0)) {
D_8015FFE0--;
if (D_8015FFE0 == 0) {
- if (gSaveContext.timer_1_value != 0)
+ if (gSaveContext.timer_1_value != 0) {
gSaveContext.timer_1_value--;
+ }
D_8015FFE0 = 20;
@@ -3620,13 +3678,15 @@ void Interface_Draw(GlobalContext* globalCtx) {
}
D_80125A5C = 0;
} else if (gSaveContext.timer_1_value > 60) {
- if (sTimerDigits[4] == 1)
+ if (sTimerDigits[4] == 1) {
Audio_PlaySoundGeneral(NA_SE_SY_MESSAGE_WOMAN, &D_801333D4, 4, &D_801333E0,
&D_801333E0, &D_801333E8);
+ }
} else if (gSaveContext.timer_1_value >= 11) {
- if (sTimerDigits[4] & 1)
+ if (sTimerDigits[4] & 1) {
Audio_PlaySoundGeneral(NA_SE_SY_WARNING_COUNT_N, &D_801333D4, 4, &D_801333E0,
&D_801333E0, &D_801333E8);
+ }
} else {
Audio_PlaySoundGeneral(NA_SE_SY_WARNING_COUNT_E, &D_801333D4, 4, &D_801333E0,
&D_801333E0, &D_801333E8);
@@ -3638,10 +3698,11 @@ void Interface_Draw(GlobalContext* globalCtx) {
phi_s3 = (gSaveContext.timer_x[0] - 26) / D_8015FFE2;
gSaveContext.timer_x[0] -= phi_s3;
- if (gSaveContext.health_capacity > 0xA0)
+ if (gSaveContext.health_capacity > 0xA0) {
phi_s3 = (gSaveContext.timer_y[0] - 54) / D_8015FFE2;
- else
+ } else {
phi_s3 = (gSaveContext.timer_y[0] - 46) / D_8015FFE2;
+ }
gSaveContext.timer_y[0] -= phi_s3;
D_8015FFE2--;
@@ -3649,19 +3710,21 @@ void Interface_Draw(GlobalContext* globalCtx) {
gSaveContext.timer_x[0] = 26;
D_8015FFE2 = 20;
- if (gSaveContext.health_capacity > 0xA0)
+ if (gSaveContext.health_capacity > 0xA0) {
gSaveContext.timer_y[0] = 54;
- else
+ } else {
gSaveContext.timer_y[0] = 46;
+ }
gSaveContext.timer_1_state = 14;
}
case 14:
if (gSaveContext.timer_1_state == 14) {
- if (gSaveContext.health_capacity > 0xA0)
+ if (gSaveContext.health_capacity > 0xA0) {
gSaveContext.timer_y[0] = 54;
- else
+ } else {
gSaveContext.timer_y[0] = 46;
+ }
}
if (gSaveContext.timer_1_state >= 3) {
@@ -3686,10 +3749,11 @@ void Interface_Draw(GlobalContext* globalCtx) {
gSaveContext.timer_y[1] = 80;
D_8015FFE4 = D_8015FFE6 = 20;
- if (gSaveContext.timer_2_state < 7)
+ if (gSaveContext.timer_2_state < 7) {
gSaveContext.timer_2_state = 2;
- else
+ } else {
gSaveContext.timer_2_state = 8;
+ }
gSaveContext.timer_1_state = 0;
} else {
@@ -3706,20 +3770,22 @@ void Interface_Draw(GlobalContext* globalCtx) {
gSaveContext.timer_x[1] = 140;
gSaveContext.timer_y[1] = 80;
D_8015FFE4 = D_8015FFE6 = 20;
- if (gSaveContext.timer_2_state == 1)
+ if (gSaveContext.timer_2_state == 1) {
gSaveContext.timer_2_state = 2;
- else
+ } else {
gSaveContext.timer_2_state = 8;
+ }
break;
case 2:
case 8:
D_8015FFE6--;
if (D_8015FFE6 == 0) {
D_8015FFE6 = 20;
- if (gSaveContext.timer_2_state == 2)
+ if (gSaveContext.timer_2_state == 2) {
gSaveContext.timer_2_state = 3;
- else
+ } else {
gSaveContext.timer_2_state = 9;
+ }
}
break;
case 3:
@@ -3730,10 +3796,11 @@ void Interface_Draw(GlobalContext* globalCtx) {
phi_s3 = (gSaveContext.timer_x[1] - 26) / D_8015FFE2;
gSaveContext.timer_x[1] -= phi_s3;
- if (gSaveContext.health_capacity > 0xA0)
+ if (gSaveContext.health_capacity > 0xA0) {
phi_s3 = (gSaveContext.timer_y[1] - 54) / D_8015FFE6;
- else
+ } else {
phi_s3 = (gSaveContext.timer_y[1] - 46) / D_8015FFE6;
+ }
gSaveContext.timer_y[1] -= phi_s3;
D_8015FFE6--;
@@ -3741,23 +3808,26 @@ void Interface_Draw(GlobalContext* globalCtx) {
gSaveContext.timer_x[1] = 26;
D_8015FFE6 = 20;
- if (gSaveContext.health_capacity > 0xA0)
+ if (gSaveContext.health_capacity > 0xA0) {
gSaveContext.timer_y[1] = 54;
- else
+ } else {
gSaveContext.timer_y[1] = 46;
+ }
- if (gSaveContext.timer_2_state == 3)
+ if (gSaveContext.timer_2_state == 3) {
gSaveContext.timer_2_state = 4;
- else
+ } else {
gSaveContext.timer_2_state = 10;
+ }
}
case 4:
case 10:
if ((gSaveContext.timer_2_state == 4) || (gSaveContext.timer_2_state == 10)) {
- if (gSaveContext.health_capacity > 0xA0)
+ if (gSaveContext.health_capacity > 0xA0) {
gSaveContext.timer_y[1] = 54;
- else
+ } else {
gSaveContext.timer_y[1] = 46;
+ }
}
if (gSaveContext.timer_2_state >= 3) {
@@ -3785,13 +3855,15 @@ void Interface_Draw(GlobalContext* globalCtx) {
}
} else {
if (gSaveContext.timer_2_value > 60) {
- if (sTimerDigits[4] == 1)
+ if (sTimerDigits[4] == 1) {
Audio_PlaySoundGeneral(NA_SE_SY_MESSAGE_WOMAN, &D_801333D4, 4,
&D_801333E0, &D_801333E0, &D_801333E8);
+ }
} else if (gSaveContext.timer_2_value > 10) {
- if (sTimerDigits[4] & 1)
+ if (sTimerDigits[4] & 1) {
Audio_PlaySoundGeneral(NA_SE_SY_WARNING_COUNT_N, &D_801333D4, 4,
&D_801333E0, &D_801333E0, &D_801333E8);
+ }
} else {
Audio_PlaySoundGeneral(NA_SE_SY_WARNING_COUNT_E, &D_801333D4, 4,
&D_801333E0, &D_801333E0, &D_801333E8);
@@ -3817,8 +3889,9 @@ void Interface_Draw(GlobalContext* globalCtx) {
break;
case 6:
D_8015FFE6--;
- if (D_8015FFE6 == 0)
+ if (D_8015FFE6 == 0) {
gSaveContext.timer_2_state = 0;
+ }
break;
}
}
@@ -3828,10 +3901,11 @@ void Interface_Draw(GlobalContext* globalCtx) {
sTimerDigits[0] = sTimerDigits[1] = sTimerDigits[3] = 0;
sTimerDigits[2] = 10; // digit 10 is used as ':' (colon)
- if (gSaveContext.timer_1_state != 0)
+ if (gSaveContext.timer_1_state != 0) {
sTimerDigits[4] = gSaveContext.timer_1_value;
- else
+ } else {
sTimerDigits[4] = gSaveContext.timer_2_value;
+ }
while (sTimerDigits[4] >= 60) {
sTimerDigits[1]++;
@@ -3860,15 +3934,17 @@ void Interface_Draw(GlobalContext* globalCtx) {
TEXEL0, 0, PRIMITIVE, 0);
if (gSaveContext.timer_1_state != 0) {
- if ((gSaveContext.timer_1_value < 10) && (gSaveContext.timer_1_state < 11))
+ if ((gSaveContext.timer_1_value < 10) && (gSaveContext.timer_1_state < 11)) {
gDPSetPrimColor(gfxCtx->overlay.p++, 0, 0, 0xFF, 0x32, 0x00, 0xFF);
- else
+ } else {
gDPSetPrimColor(gfxCtx->overlay.p++, 0, 0, 0xFF, 0xFF, 0xFF, 0xFF);
+ }
} else {
- if ((gSaveContext.timer_2_value < 10) && (gSaveContext.timer_2_state < 6))
+ if ((gSaveContext.timer_2_value < 10) && (gSaveContext.timer_2_state < 6)) {
gDPSetPrimColor(gfxCtx->overlay.p++, 0, 0, 0xFF, 0x32, 0x00, 0xFF);
- else
+ } else {
gDPSetPrimColor(gfxCtx->overlay.p++, 0, 0, 0xFF, 0xFF, 0x00, 0xFF);
+ }
}
for (phi_s3 = 0; phi_s3 < 5; phi_s3++) {
@@ -3881,8 +3957,9 @@ void Interface_Draw(GlobalContext* globalCtx) {
}
}
- if (pauseCtx->flag == 3)
+ if (pauseCtx->flag == 3) {
func_8002AAB0(globalCtx);
+ }
if (interfaceCtx->unk_244 != 0) {
gDPPipeSync(gfxCtx->overlay.p++);
@@ -3952,32 +4029,38 @@ void Interface_Update(GlobalContext* globalCtx) {
case 12:
case 13:
alpha = 0xFF - (gSaveContext.unk_13EC << 5);
- if (alpha < 0)
+ if (alpha < 0) {
alpha = 0;
+ }
func_80082850(globalCtx, alpha);
gSaveContext.unk_13EC++;
- if (alpha == 0)
+ if (alpha == 0) {
gSaveContext.unk_13E8 = 0;
+ }
break;
case 50:
alpha = 0xFF - (gSaveContext.unk_13EC << 5);
- if (alpha < 0)
+ if (alpha < 0) {
alpha = 0;
+ }
alpha1 = 0xFF - alpha;
- if (alpha1 >= 0xFF)
+ if (alpha1 >= 0xFF) {
alpha1 = 0xFF;
+ }
osSyncPrintf("case 50 : alpha=%d alpha1=%d\n", alpha, alpha1);
func_80082644(globalCtx, alpha1);
- if (interfaceCtx->healthAlpha != 0xFF)
+ if (interfaceCtx->healthAlpha != 0xFF) {
interfaceCtx->healthAlpha = alpha1;
+ }
- if (interfaceCtx->magicAlpha != 0xFF)
+ if (interfaceCtx->magicAlpha != 0xFF) {
interfaceCtx->magicAlpha = alpha1;
+ }
switch (globalCtx->sceneNum) {
case SCENE_SPOT00:
@@ -4000,20 +4083,23 @@ void Interface_Update(GlobalContext* globalCtx) {
case SCENE_SPOT18:
case SCENE_SPOT20:
case SCENE_GANON_TOU:
- if (interfaceCtx->minimapAlpha < 0xAA)
+ if (interfaceCtx->minimapAlpha < 0xAA) {
interfaceCtx->minimapAlpha = alpha1;
- else
+ } else {
interfaceCtx->minimapAlpha = 0xAA;
+ }
break;
default:
- if (interfaceCtx->minimapAlpha != 0xFF)
+ if (interfaceCtx->minimapAlpha != 0xFF) {
interfaceCtx->minimapAlpha = alpha1;
+ }
break;
}
gSaveContext.unk_13EC++;
- if (alpha1 == 0xFF)
+ if (alpha1 == 0xFF) {
gSaveContext.unk_13E8 = 0;
+ }
break;
case 52:
@@ -4030,8 +4116,9 @@ void Interface_Update(GlobalContext* globalCtx) {
gSaveContext.health_accumulator -= 4;
gSaveContext.health += 4;
- if ((gSaveContext.health & 0xF) < 4)
+ if ((gSaveContext.health & 0xF) < 4) {
Audio_PlaySoundGeneral(NA_SE_SY_HP_RECOVER, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8);
+ }
osSyncPrintf("now_life=%d max_life=%d\n", gSaveContext.health, gSaveContext.health_capacity);
@@ -4079,8 +4166,9 @@ void Interface_Update(GlobalContext* globalCtx) {
gSaveContext.rupee_accumulator += 10;
gSaveContext.rupees -= 10;
- if (gSaveContext.rupees < 0)
+ if (gSaveContext.rupees < 0) {
gSaveContext.rupees = 0;
+ }
Audio_PlaySoundGeneral(NA_SE_SY_RUPY_COUNT, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8);
} else {
@@ -4108,8 +4196,9 @@ void Interface_Update(GlobalContext* globalCtx) {
interfaceCtx->unk_1EC = 0;
interfaceCtx->unk_1EE = interfaceCtx->unk_1F0;
action = interfaceCtx->unk_1EE;
- if ((action == 0x1D) || (action == 0x1E))
+ if ((action == 0x1D) || (action == 0x1E)) {
action = 0xA;
+ }
Interface_LoadActionLabel(interfaceCtx, action, 0);
}
break;
@@ -4127,8 +4216,9 @@ void Interface_Update(GlobalContext* globalCtx) {
interfaceCtx->unk_1EC = 0;
interfaceCtx->unk_1EE = interfaceCtx->unk_1F0;
action = interfaceCtx->unk_1EE;
- if ((action == 0x1D) || (action == 0x1E))
+ if ((action == 0x1D) || (action == 0x1E)) {
action = 0xA;
+ }
Interface_LoadActionLabel(interfaceCtx, action, 0);
}
break;
@@ -4173,11 +4263,13 @@ void Interface_Update(GlobalContext* globalCtx) {
interfaceCtx->unk_23C = 0;
if (sHBAScoreTier == 0) {
- if (gSaveContext.minigame_score >= 1000)
+ if (gSaveContext.minigame_score >= 1000) {
sHBAScoreTier++;
+ }
} else if (sHBAScoreTier == 1) {
- if (gSaveContext.minigame_score >= 1500)
+ if (gSaveContext.minigame_score >= 1500) {
sHBAScoreTier++;
+ }
}
sHBAScoreDigits[1] = 0;
@@ -4202,14 +4294,16 @@ void Interface_Update(GlobalContext* globalCtx) {
}
if (gSaveContext.unk_1422 != 0) {
- if ((msgCtx->unk_E3F0 != 0x31) && (gSaveContext.unk_1422 == 1))
+ if ((msgCtx->unk_E3F0 != 0x31) && (gSaveContext.unk_1422 == 1)) {
globalCtx->msgCtx.unk_E3EE = 4;
+ }
if (globalCtx->unk_10A26 != 0) {
if (gSaveContext.unk_1422 != 2) {
D_80125B60 = 0;
- if ((gSaveContext.day_time >= 0x4555) && (gSaveContext.day_time <= 0xC001))
+ if ((gSaveContext.day_time >= 0x4555) && (gSaveContext.day_time <= 0xC001)) {
D_80125B60 = 1;
+ }
gSaveContext.unk_1422 = 2;
D_80125B64 = D_8011FB40;
diff --git a/src/code/z_path.c b/src/code/z_path.c
new file mode 100644
index 000000000..03dc6d6f6
--- /dev/null
+++ b/src/code/z_path.c
@@ -0,0 +1,46 @@
+#include <ultra64.h>
+#include <global.h>
+
+Path* Path_GetByIndex(GlobalContext* globalCtx, s16 index, s16 max) {
+ Path* path;
+
+ if (index != max) {
+ path = &globalCtx->setupPathList[index];
+ } else {
+ path = NULL;
+ }
+
+ return path;
+}
+
+f32 Path_OrientAndGetDistSq(Actor* actor, Path* path, s16 waypoint, s16* yaw) {
+ f32 dx;
+ f32 dz;
+ Vec3s* pointPos;
+
+ if (path == NULL) {
+ return -1.0;
+ }
+
+ pointPos = SEGMENTED_TO_VIRTUAL(path->points);
+ pointPos = &pointPos[waypoint];
+
+ dx = pointPos->x - actor->posRot.pos.x;
+ dz = pointPos->z - actor->posRot.pos.z;
+
+ *yaw = Math_atan2f(dx, dz) * (32768 / M_PI);
+
+ return SQ(dx) + SQ(dz);
+}
+
+void Path_CopyLastPoint(Path* path, Vec3f* dest) {
+ Vec3s* pointPos;
+
+ if (path != NULL) {
+ pointPos = &((Vec3s*)SEGMENTED_TO_VIRTUAL(path->points))[path->count - 1];
+
+ dest->x = pointPos->x;
+ dest->y = pointPos->y;
+ dest->z = pointPos->z;
+ }
+}
diff --git a/src/code/z_room.c b/src/code/z_room.c
index f225ef77f..f74888438 100644
--- a/src/code/z_room.c
+++ b/src/code/z_room.c
@@ -129,8 +129,9 @@ void func_80095D04(GlobalContext* globalCtx, Room* room, u32 flags) {
spA4 = &spB8[0];
polygonDlist = SEGMENTED_TO_VIRTUAL(room->mesh->polygon2.start);
polygon2 = &room->mesh->polygon2;
- if (polygon2->num > SHAPE_SORT_MAX)
+ if (polygon2->num > SHAPE_SORT_MAX) {
__assert("polygon2->num <= SHAPE_SORT_MAX", "../z_room.c", 317);
+ }
sp78 = polygonDlist;
for (sp9C = 0; sp9C < polygon2->num; sp9C++) {
@@ -152,8 +153,9 @@ void func_80095D04(GlobalContext* globalCtx, Room* room, u32 flags) {
spA4->unk_08 = NULL;
} else {
do {
- if (spA4->unk_04 < phi_v0->unk_04)
+ if (spA4->unk_04 < phi_v0->unk_04) {
break;
+ }
phi_v0 = phi_v0->unk_0C;
} while (phi_v0 != NULL);
@@ -165,10 +167,11 @@ void func_80095D04(GlobalContext* globalCtx, Room* room, u32 flags) {
} else {
phi_a0 = phi_v0->unk_08;
spA4->unk_08 = phi_a0;
- if (phi_a0 == NULL)
+ if (phi_a0 == NULL) {
spB4 = spA4;
- else
+ } else {
phi_a0->unk_0C = spA4;
+ }
phi_v0->unk_08 = spA4;
spA4->unk_0C = (void*)phi_v0;
}
@@ -187,25 +190,30 @@ void func_80095D04(GlobalContext* globalCtx, Room* room, u32 flags) {
if (iREG(86) != 0) {
phi_v1 = 0;
while (phi_v1 < polygon2->num) {
- if (phi_s0 == sp78)
+ if (phi_s0 == sp78) {
break;
+ }
phi_v1++;
sp78++;
}
if (((iREG(86) == 1) && (iREG(89) > sp9C)) || ((iREG(86) == 2) && (iREG(89) == sp9C))) {
- if ((flags & 1) && (phi_s0->opa != NULL))
+ if ((flags & 1) && (phi_s0->opa != NULL)) {
gSPDisplayList(gfxCtx->polyOpa.p++, phi_s0->opa);
+ }
- if ((flags & 2) && (phi_s0->xlu != NULL))
+ if ((flags & 2) && (phi_s0->xlu != NULL)) {
gSPDisplayList(gfxCtx->polyXlu.p++, phi_s0->xlu);
+ }
}
} else {
- if ((flags & 1) && (phi_s0->opa != NULL))
+ if ((flags & 1) && (phi_s0->opa != NULL)) {
gSPDisplayList(gfxCtx->polyOpa.p++, phi_s0->opa);
+ }
- if ((flags & 2) && (phi_s0->xlu != NULL))
+ if ((flags & 2) && (phi_s0->xlu != NULL)) {
gSPDisplayList(gfxCtx->polyXlu.p++, phi_s0->xlu);
+ }
}
spB4 = spB4->unk_0C;
@@ -541,8 +549,9 @@ u32 func_80096FE8(GlobalContext* globalCtx, RoomContext* roomCtx) {
for (i = 0; i < globalCtx->nbRooms; i++) {
roomSize = roomList[i].vromEnd - roomList[i].vromStart;
osSyncPrintf("ROOM%d size=%d\n", i, roomSize);
- if (maxRoomSize < roomSize)
+ if (maxRoomSize < roomSize) {
maxRoomSize = roomSize;
+ }
}
if (globalCtx->nbTransitionActors != 0) {
@@ -559,8 +568,9 @@ u32 func_80096FE8(GlobalContext* globalCtx, RoomContext* roomCtx) {
cumulRoomSize = (frontRoom != backRoom) ? frontRoomSize + backRoomSize : frontRoomSize;
osSyncPrintf("DOOR%d=<%d> ROOM1=<%d, %d> ROOM2=<%d, %d>\n", j, cumulRoomSize, frontRoom, frontRoomSize,
backRoom, backRoomSize);
- if (maxRoomSize < cumulRoomSize)
+ if (maxRoomSize < cumulRoomSize) {
maxRoomSize = cumulRoomSize;
+ }
transitionActor++;
}
}
@@ -578,10 +588,11 @@ u32 func_80096FE8(GlobalContext* globalCtx, RoomContext* roomCtx) {
roomCtx->unk_30 = 0;
roomCtx->status = 0;
- if (gSaveContext.respawn_flag > 0)
+ if (gSaveContext.respawn_flag > 0) {
nextRoomNum = gSaveContext.respawn[gSaveContext.respawn_flag - 1].room_index;
- else
+ } else {
nextRoomNum = globalCtx->setupEntranceList[globalCtx->curSpawn].room;
+ }
func_8009728C(globalCtx, roomCtx, nextRoomNum);
return maxRoomSize;
diff --git a/src/code/z_sample.c b/src/code/z_sample.c
index cbd934701..9b9fa9559 100644
--- a/src/code/z_sample.c
+++ b/src/code/z_sample.c
@@ -20,8 +20,8 @@ void Sample_Draw(SampleContext* this) {
func_800C6AC4(gfxArr, gfxCtx, "../z_sample.c", 62);
- gSPSegment(gfxCtx->polyOpa.p++, 0, NULL;
- gSPSegment(gfxCtx->polyOpa.p++, 1, this->staticSegment);
+ gSPSegment(gfxCtx->polyOpa.p++, 0x00, NULL);
+ gSPSegment(gfxCtx->polyOpa.p++, 0x01, this->staticSegment);
func_80095248(gfxCtx, 0, 0, 0);
@@ -34,10 +34,11 @@ void Sample_Draw(SampleContext* this) {
gfxCtx->polyOpa.p = func_80093708(gfxCtx->polyOpa.p, 0xFF, 0xFF, 0xFF, 0, 0, 0);
func_80093D18(gfxCtx);
-
+
gDPSetCycleType(gfxCtx->polyOpa.p++, G_CYC_1CYCLE);
gDPSetRenderMode(gfxCtx->polyOpa.p++, G_RM_AA_ZB_OPA_SURF, G_RM_AA_ZB_OPA_SURF2);
- gDPSetCombineLERP(gfxCtx->polyOpa.p++, 0, 0, 0, PRIMITIVE, 0, 0, 0, PRIMITIVE, 0, 0, 0, PRIMITIVE, 0, 0, 0, PRIMITIVE);
+ gDPSetCombineLERP(gfxCtx->polyOpa.p++, 0, 0, 0, PRIMITIVE, 0, 0, 0, PRIMITIVE, 0, 0, 0, PRIMITIVE, 0, 0, 0,
+ PRIMITIVE);
gDPSetPrimColor(gfxCtx->polyOpa.p++, 0, 0, 0xFF, 0xFF, 0x00, 0x00);
func_800C6B54(gfxArr, gfxCtx, "../z_sample.c", 111);
diff --git a/src/code/z_scene.c b/src/code/z_scene.c
index 949e1e41c..3a7121b04 100644
--- a/src/code/z_scene.c
+++ b/src/code/z_scene.c
@@ -312,13 +312,15 @@ void func_8009899C(GlobalContext* globalCtx, SceneCmd* cmd) {
}
}
- if (cmd->objectList.num > OBJECT_EXCHANGE_BANK_MAX)
+ if (cmd->objectList.num > OBJECT_EXCHANGE_BANK_MAX) {
__assert("scene_info->object_bank.num <= OBJECT_EXCHANGE_BANK_MAX", "../z_scene.c", 705);
+ }
while (k < cmd->objectList.num) {
nextPtr = func_800982FC(&globalCtx->objectCtx, i, *objectEntry);
- if (i < OBJECT_EXCHANGE_BANK_MAX - 1)
+ if (i < OBJECT_EXCHANGE_BANK_MAX - 1) {
globalCtx->objectCtx.status[i + 1].segment = nextPtr;
+ }
k++;
objectEntry++;
status++;
diff --git a/src/code/z_scene_table.c b/src/code/z_scene_table.c
index 86d79168f..1bdfde9e3 100644
--- a/src/code/z_scene_table.c
+++ b/src/code/z_scene_table.c
@@ -2271,10 +2271,11 @@ void func_8009FE58(GlobalContext* globalCtx) {
D_8012A398 += 0.15f + (globalCtx->unk_11D30[1] * 0.001f);
}
- if (globalCtx->roomCtx.curRoom.num == 2)
+ if (globalCtx->roomCtx.curRoom.num == 2) {
Matrix_Scale(1, sinf(D_8012A398) * 0.8f, 1, MTXMODE_NEW);
- else
+ } else {
Matrix_Scale(1.005f, sinf(D_8012A398) * 0.8f, 1.005f, MTXMODE_NEW);
+ }
gSPSegment(gfxCtx->polyOpa.p++, 0x0D, Matrix_NewMtx(globalCtx->state.gfxCtx, "../z_scene_table.c", 7809));
diff --git a/src/code/z_skelanime.c b/src/code/z_skelanime.c
index d43e77dfe..501797081 100644
--- a/src/code/z_skelanime.c
+++ b/src/code/z_skelanime.c
@@ -1,176 +1,1694 @@
#include <ultra64.h>
#include <global.h>
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_skelanime/func_800A08A0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_skelanime/func_800A0B40.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_skelanime/func_800A0D94.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_skelanime/func_800A106C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_skelanime/func_800A1344.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_skelanime/SkelAnime_Draw.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_skelanime/func_800A180C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_skelanime/func_800A1AC8.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_skelanime/func_800A1D8C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_skelanime/func_800A1FC8.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_skelanime/SkelAnime_GetFrameCount.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_skelanime/func_800A2044.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_skelanime/func_800A2288.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_skelanime/func_800A24A0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_skelanime/func_800A273C.s")
-
+#include <vt.h>
+
+s32 func_800A3D70(GlobalContext*, SkelAnime*);
+s32 func_800A3E0C(GlobalContext*, SkelAnime*);
+s32 func_800A4D9C(SkelAnime* skelAnime);
+s32 func_800A4EE0(SkelAnime* skelAnime);
+s32 func_800A4E38(SkelAnime* skelAnime);
+s32 func_800A4AD8(SkelAnime* skelAnime);
+void SkelAnime_CopyVec3s(SkelAnime* skelAnime, Vec3s* dst, Vec3s* src);
+void SkelAnime_LinkAnimetionLoaded(GlobalContext* globalCtx, AnimationEntryType0* entry);
+void SkelAnime_AnimationType1Loaded(GlobalContext* globalCtx, AnimationEntryType1* entry);
+void SkelAnime_AnimationType2Loaded(GlobalContext* globalCtx, AnimationEntryType2* entry);
+void SkelAnime_AnimationType3Loaded(GlobalContext* globalCtx, AnimationEntryType3* entry);
+void SkelAnime_AnimationType4Loaded(GlobalContext* globalCtx, AnimationEntryType4* entry);
+void SkelAnime_AnimationType5Loaded(GlobalContext* globalCtx, AnimationEntryType5* entry);
+
+//.data
+u32 D_8012A480 = 0;
+static AnimationEntryCallback sAnimationLoadDone[] = {
+ &SkelAnime_LinkAnimetionLoaded, &SkelAnime_AnimationType1Loaded, &SkelAnime_AnimationType2Loaded,
+ &SkelAnime_AnimationType3Loaded, &SkelAnime_AnimationType4Loaded, &SkelAnime_AnimationType5Loaded,
+};
+
+//.bss
+u32 D_801600B0;
+
+void SkelAnime_LodDrawLimb(GlobalContext* globalCtx, s32 limbIndex, Skeleton* skeleton, Vec3s* actorDrawTable,
+ SkelAnime_LimbUpdateMatrix updateMtxFunc, SkelAnime_LimbAppendDlist appendDlistFunc,
+ Actor* actor, s32 dListIndex) {
+ SkelLimbEntry* limbEntry;
+ Gfx* dList;
+ Vec3f pos;
+ Vec3s rot;
+ GraphicsContext* gfxCtx;
+ Gfx* gfx[4];
+
+ gfxCtx = globalCtx->state.gfxCtx;
+ func_800C6AC4(gfx, globalCtx->state.gfxCtx, "../z_skelanime.c", 773);
+ Matrix_Push();
+ limbEntry = SEGMENTED_TO_VIRTUAL(skeleton->limbs[limbIndex]);
+ limbIndex++;
+ rot = actorDrawTable[limbIndex];
+
+ pos.x = limbEntry->translation.x;
+ pos.y = limbEntry->translation.y;
+ pos.z = limbEntry->translation.z;
+
+ dList = limbEntry->displayLists[dListIndex];
+ if ((updateMtxFunc == NULL) || (updateMtxFunc(globalCtx, limbIndex, &dList, &pos, &rot, actor) == 0)) {
+ Matrix_TranslateThenRotateZYX(&pos, &rot);
+ if (dList != NULL) {
+ do {
+ if (1) {
+ gSPMatrix(gfxCtx->polyOpa.p++, Matrix_NewMtx(globalCtx->state.gfxCtx, "../z_skelanime.c", 805),
+ G_MTX_LOAD);
+
+ gSPDisplayList(gfxCtx->polyOpa.p++, dList);
+ }
+ } while (0);
+ }
+ }
+
+ if (appendDlistFunc != NULL) {
+ appendDlistFunc(globalCtx, limbIndex, &dList, &rot, actor);
+ }
+
+ if (limbEntry->firstChildIndex != LIMB_DONE) {
+ SkelAnime_LodDrawLimb(globalCtx, limbEntry->firstChildIndex, skeleton, actorDrawTable, updateMtxFunc,
+ appendDlistFunc, actor, dListIndex);
+ }
+
+ Matrix_Pull();
+
+ if (limbEntry->nextLimbIndex != LIMB_DONE) {
+ SkelAnime_LodDrawLimb(globalCtx, limbEntry->nextLimbIndex, skeleton, actorDrawTable, updateMtxFunc,
+ appendDlistFunc, actor, dListIndex);
+ }
+
+ func_800C6B54(gfx, globalCtx->state.gfxCtx, "../z_skelanime.c", 821);
+}
+
+void SkelAnime_LodDraw(GlobalContext* globalCtx, Skeleton* skeleton, Vec3s* actorDrawTable,
+ SkelAnime_LimbUpdateMatrix updateMtxFunc, SkelAnime_LimbAppendDlist appendDlistFunc,
+ Actor* actor, s32 dListIndex) {
+ SkelLimbEntry* limbEntry;
+ char pad[4];
+ Gfx* dList;
+ Vec3f pos;
+ Vec3s rot;
+ GraphicsContext* gfxCtx;
+ Gfx* gfx[4];
+
+ if (skeleton == NULL) {
+ osSyncPrintf(VT_FGCOL(RED));
+ osSyncPrintf("Si2_Lod_draw():skelがNULLです。\n");
+ osSyncPrintf(VT_RST);
+ return;
+ }
+ gfxCtx = globalCtx->state.gfxCtx;
+ func_800C6AC4(gfx, globalCtx->state.gfxCtx, "../z_skelanime.c", 849);
+ Matrix_Push();
+
+ limbEntry = SEGMENTED_TO_VIRTUAL(skeleton->limbs[0]);
+ pos.x = actorDrawTable->x;
+ pos.y = actorDrawTable->y;
+ pos.z = actorDrawTable->z;
+
+ rot = actorDrawTable[1];
+ dList = limbEntry->displayLists[dListIndex];
+
+ if ((updateMtxFunc == NULL) || (updateMtxFunc(globalCtx, 1, &dList, &pos, &rot, actor) == 0)) {
+ Matrix_TranslateThenRotateZYX(&pos, &rot);
+ if (dList != NULL) {
+ gSPMatrix(gfxCtx->polyOpa.p++, Matrix_NewMtx(globalCtx->state.gfxCtx, "../z_skelanime.c", 881), G_MTX_LOAD);
+
+ gSPDisplayList(gfxCtx->polyOpa.p++, dList);
+ }
+ }
+ if (appendDlistFunc != NULL) {
+ appendDlistFunc(globalCtx, 1, &dList, &rot, actor);
+ }
+
+ if (limbEntry->firstChildIndex != 0xFF) {
+ SkelAnime_LodDrawLimb(globalCtx, limbEntry->firstChildIndex, skeleton, actorDrawTable, updateMtxFunc,
+ appendDlistFunc, actor, dListIndex);
+ }
+
+ Matrix_Pull();
+ func_800C6B54(gfx, globalCtx->state.gfxCtx, "../z_skelanime.c", 894);
+}
+
+#ifdef NON_MATCHING
+// regalloc
+void SkelAnime_LodDrawLimbSV(GlobalContext* globalCtx, s32 limbIndex, Skeleton* skeleton, Vec3s* actorDrawTable,
+ SkelAnime_LimbUpdateMatrix updateMtxFunc, SkelAnime_LimbAppendDlist appendDlistFunc,
+ Actor* actor, s32 dListIndex, Mtx** mtx) {
+ SkelLimbEntry* limbEntry;
+ Gfx* dList[2];
+ Vec3f pos;
+ Vec3s rot;
+ GraphicsContext* gfxCtx;
+ Gfx* gfx[3];
+
+ Matrix_Push();
+
+ limbEntry = SEGMENTED_TO_VIRTUAL(skeleton->limbs[limbIndex]);
+ limbIndex++;
+
+ rot = actorDrawTable[limbIndex];
+
+ pos.x = limbEntry->translation.x;
+ pos.y = limbEntry->translation.y;
+ pos.z = limbEntry->translation.z;
+ dList[1] = dList[0] = limbEntry->displayLists[dListIndex];
+
+ if ((updateMtxFunc == NULL) || (updateMtxFunc(globalCtx, limbIndex, &dList[1], &pos, &rot, actor) == 0)) {
+ Matrix_TranslateThenRotateZYX(&pos, &rot);
+ if (dList[1] != NULL) {
+ Matrix_ToMtx(*mtx, "../z_skelanime.c", 945);
+ gfxCtx = globalCtx->state.gfxCtx;
+ func_800C6AC4(gfx, globalCtx->state.gfxCtx, "../z_skelanime.c", 946);
+ gSPMatrix(gfxCtx->polyOpa.p++, *mtx, G_MTX_LOAD);
+ gSPDisplayList(gfxCtx->polyOpa.p++, dList[1]);
+ func_800C6B54(gfx, globalCtx->state.gfxCtx, "../z_skelanime.c", 949);
+ (*mtx)++;
+ } else if (dList[0] != NULL) {
+ Matrix_ToMtx(*mtx, "../z_skelanime.c", 954);
+ (*mtx)++;
+ }
+ }
+ if (appendDlistFunc != NULL) {
+ appendDlistFunc(globalCtx, limbIndex, &dList[0], &rot, actor);
+ }
+ if (limbEntry->firstChildIndex != LIMB_DONE) {
+ SkelAnime_LodDrawLimbSV(globalCtx, limbEntry->firstChildIndex, skeleton, actorDrawTable, updateMtxFunc,
+ appendDlistFunc, actor, dListIndex, mtx);
+ }
+
+ Matrix_Pull();
+
+ if (limbEntry->nextLimbIndex != LIMB_DONE) {
+ SkelAnime_LodDrawLimbSV(globalCtx, limbEntry->nextLimbIndex, skeleton, actorDrawTable, updateMtxFunc,
+ appendDlistFunc, actor, dListIndex, mtx);
+ }
+}
+#else
+#pragma GLOBAL_ASM("asm/non_matchings/code/z_skelanime/SkelAnime_LodDrawLimbSV.s")
+#endif
+
+#ifdef NON_MATCHING
+// regalloc
+void SkelAnime_LodDrawSV(GlobalContext* globalCtx, Skeleton* skeleton, Vec3s* actorDrawTable, s32 limbCount,
+ SkelAnime_LimbUpdateMatrix updateMtxFunc, SkelAnime_LimbAppendDlist appendDlistFunc,
+ Actor* actor, s32 dListIndex) {
+ SkelLimbEntry* limbEntry;
+ Gfx* dList[2];
+ Vec3f pos;
+ Vec3s rot;
+ Mtx* mtx;
+ GraphicsContext* gfxCtx;
+ Gfx* gfx[4];
+
+ mtx = Graph_Alloc(globalCtx->state.gfxCtx, limbCount * sizeof(Mtx));
+
+ if (skeleton == NULL) {
+ osSyncPrintf(VT_FGCOL(RED));
+ osSyncPrintf("Si2_Lod_draw_SV():skelがNULLです。\n");
+ osSyncPrintf(VT_RST);
+ return;
+ }
+ gfxCtx = globalCtx->state.gfxCtx;
+ func_800C6AC4(gfx, globalCtx->state.gfxCtx, "../z_skelanime.c", 1000);
+ gSPSegment(gfxCtx->polyOpa.p++, 0xD, mtx);
+ Matrix_Push();
+
+ limbEntry = SEGMENTED_TO_VIRTUAL(skeleton->limbs[0]);
+ if (limbEntry) {}
+ pos.x = actorDrawTable->x;
+ pos.y = actorDrawTable->y;
+ pos.z = actorDrawTable->z;
+
+ rot = actorDrawTable[1];
+
+ dList[0] = dList[1] = limbEntry->displayLists[dListIndex];
+
+ if ((updateMtxFunc == 0) || (updateMtxFunc(globalCtx, 1, &dList[1], &pos, &rot, actor) == 0)) {
+ Matrix_TranslateThenRotateZYX(&pos, &rot);
+ if (dList[1] != NULL) {
+ Matrix_ToMtx(mtx, "../z_skelanime.c", 1033);
+ gSPMatrix(gfxCtx->polyOpa.p++, mtx, G_MTX_LOAD);
+ gSPDisplayList(gfxCtx->polyOpa.p++, dList[1]);
+ mtx++;
+ } else if (dList[0] != NULL) {
+ Matrix_ToMtx(mtx, "../z_skelanime.c", 1040);
+ mtx++;
+ }
+ }
+
+ if (appendDlistFunc != NULL) {
+ appendDlistFunc(globalCtx, 1, &dList[0], &rot, actor);
+ }
+ if (limbEntry->firstChildIndex != LIMB_DONE) {
+ SkelAnime_LodDrawLimbSV(globalCtx, limbEntry->firstChildIndex, skeleton, actorDrawTable, updateMtxFunc,
+ appendDlistFunc, actor, dListIndex, &mtx);
+ }
+
+ Matrix_Pull();
+
+ func_800C6B54(gfx, globalCtx->state.gfxCtx, "../z_skelanime.c", 1053);
+}
+#else
+#pragma GLOBAL_ASM("asm/non_matchings/code/z_skelanime/SkelAnime_LodDrawSV.s")
+#endif
+
+void SkelAnime_DrawLimb(GlobalContext* globalCtx, s32 limbIndex, Skeleton* skeleton, Vec3s* actorDrawTable,
+ SkelAnime_LimbUpdateMatrix updateMtxFunc, SkelAnime_LimbAppendDlist appendDlistFunc,
+ Actor* actor) {
+ SkelLimbEntry* limbEntry;
+ Gfx* dList;
+ Vec3f pos;
+ Vec3s rot;
+ GraphicsContext* gfxCtx;
+ Gfx* gfx[4];
+
+ gfxCtx = globalCtx->state.gfxCtx;
+
+ func_800C6AC4(gfx, globalCtx->state.gfxCtx, "../z_skelanime.c", 1076);
+ Matrix_Push();
+
+ limbEntry = SEGMENTED_TO_VIRTUAL(skeleton->limbs[limbIndex]);
+ limbIndex++;
+ rot = actorDrawTable[limbIndex];
+ pos.x = limbEntry->translation.x;
+ pos.y = limbEntry->translation.y;
+ pos.z = limbEntry->translation.z;
+ dList = limbEntry->displayLists[0];
+
+ if ((updateMtxFunc == NULL) || (updateMtxFunc(globalCtx, limbIndex, &dList, &pos, &rot, actor) == 0)) {
+ Matrix_TranslateThenRotateZYX(&pos, &rot);
+ if (dList != NULL) {
+ do {
+ if (1) {
+ gSPMatrix(gfxCtx->polyOpa.p++, Matrix_NewMtx(globalCtx->state.gfxCtx, "../z_skelanime.c", 1103),
+ G_MTX_LOAD);
+ gSPDisplayList(gfxCtx->polyOpa.p++, dList);
+ }
+ } while (0);
+ }
+ }
+
+ if (appendDlistFunc != NULL) {
+ appendDlistFunc(globalCtx, limbIndex, &dList, &rot, actor);
+ }
+
+ if (limbEntry->firstChildIndex != LIMB_DONE) {
+ SkelAnime_DrawLimb(globalCtx, limbEntry->firstChildIndex, skeleton, actorDrawTable, updateMtxFunc,
+ appendDlistFunc, actor);
+ }
+
+ Matrix_Pull();
+
+ if (limbEntry->nextLimbIndex != LIMB_DONE) {
+ SkelAnime_DrawLimb(globalCtx, limbEntry->nextLimbIndex, skeleton, actorDrawTable, updateMtxFunc,
+ appendDlistFunc, actor);
+ }
+
+ func_800C6B54(gfx, globalCtx->state.gfxCtx, "../z_skelanime.c", 1121);
+}
+
+void SkelAnime_Draw(GlobalContext* globalCtx, Skeleton* skeleton, Vec3s* actorDrawTable,
+ SkelAnime_LimbUpdateMatrix updateMtxFunc, SkelAnime_LimbAppendDlist appendDlistFunc, Actor* actor) {
+ SkelLimbEntry* rootLimb;
+ char pad[4];
+ Gfx* dList;
+ Vec3f pos;
+ Vec3s rot;
+ GraphicsContext* gfxCtx;
+ Gfx* gfx[4];
+
+ if (skeleton == NULL) {
+ osSyncPrintf(VT_FGCOL(RED));
+ osSyncPrintf("Si2_draw():skelがNULLです。\n"); // Si2_draw (): skel is NULL.
+ osSyncPrintf(VT_RST);
+ return;
+ }
+
+ gfxCtx = globalCtx->state.gfxCtx;
+
+ func_800C6AC4(gfx, globalCtx->state.gfxCtx, "../z_skelanime.c", 1148);
+ Matrix_Push();
+ rootLimb = SEGMENTED_TO_VIRTUAL(skeleton->limbs[0]);
+
+ pos.x = actorDrawTable[0].x;
+ pos.y = actorDrawTable[0].y;
+ pos.z = actorDrawTable[0].z;
+
+ rot = actorDrawTable[1];
+ dList = rootLimb->displayLists[0];
+
+ if ((updateMtxFunc == NULL) || (updateMtxFunc(globalCtx, 1, &dList, &pos, &rot, actor) == 0)) {
+ Matrix_TranslateThenRotateZYX(&pos, &rot);
+ if (dList != NULL) {
+ gSPMatrix(gfxCtx->polyOpa.p++, Matrix_NewMtx(globalCtx->state.gfxCtx, "../z_skelanime.c", 1176),
+ G_MTX_LOAD);
+ gSPDisplayList(gfxCtx->polyOpa.p++, dList);
+ }
+ }
+
+ if (appendDlistFunc != NULL) {
+ appendDlistFunc(globalCtx, 1, &dList, &rot, actor);
+ }
+
+ if (rootLimb->firstChildIndex != LIMB_DONE) {
+ SkelAnime_DrawLimb(globalCtx, rootLimb->firstChildIndex, skeleton, actorDrawTable, updateMtxFunc,
+ appendDlistFunc, actor);
+ }
+
+ Matrix_Pull();
+
+ func_800C6B54(gfx, globalCtx->state.gfxCtx, "../z_skelanime.c", 1190);
+}
+
+#ifdef NON_MATCHING
+// close, needs a bit bmore work. Mainly seems centered around SEGMENTED_TO_VIRTUAL
+void SkelAnime_DrawLimbSV(GlobalContext* globalCtx, s32 limbIndex, Skeleton* skeleton, Vec3s* actorDrawTable,
+ SkelAnime_LimbUpdateMatrix updateMtxFunc, SkelAnime_LimbAppendDlist appendDlistFunc,
+ Actor* actor, Mtx** limbMatricies) {
+ SkelLimbEntry* limbEntry;
+ Gfx* dList[2];
+ Vec3f pos;
+ Vec3s rot;
+ GraphicsContext* gfxCtx;
+ Gfx* gfx[3];
+
+ gfxCtx = globalCtx->state.gfxCtx;
+ func_800C6AC4(gfx, globalCtx->state.gfxCtx, "../z_skelanime.c", 1214);
+ Matrix_Push();
+
+ limbEntry = SEGMENTED_TO_VIRTUAL(skeleton->limbs[limbIndex]);
+ limbIndex++;
+ rot = actorDrawTable[limbIndex];
+
+ pos.x = limbEntry->translation.x;
+ pos.y = limbEntry->translation.y;
+ pos.z = limbEntry->translation.z;
+
+ dList[0] = dList[1] = limbEntry->displayLists[0];
+
+ if ((updateMtxFunc == NULL) || (updateMtxFunc(globalCtx, limbIndex, &dList[1], &pos, &rot, actor) == 0)) {
+ Matrix_TranslateThenRotateZYX(&pos, &rot);
+ if (dList[1] != NULL) {
+ Matrix_ToMtx(*limbMatricies, "../z_skelanime.c", 1242);
+ gSPMatrix(gfxCtx->polyOpa.p++, *limbMatricies, G_MTX_LOAD);
+ gSPDisplayList(gfxCtx->polyOpa.p++, dList[1]);
+ (*limbMatricies)++;
+ } else if (dList[0] != NULL) {
+ Matrix_ToMtx(*limbMatricies, "../z_skelanime.c", 1249);
+ (*limbMatricies)++;
+ }
+ }
+
+ if (appendDlistFunc != NULL) {
+ appendDlistFunc(globalCtx, limbIndex, &dList[0], &rot, actor);
+ }
+
+ if (limbEntry->firstChildIndex != LIMB_DONE) {
+ SkelAnime_DrawLimbSV(globalCtx, limbEntry->firstChildIndex, skeleton, actorDrawTable, updateMtxFunc,
+ appendDlistFunc, actor, limbMatricies);
+ }
+
+ Matrix_Pull();
+
+ if (limbEntry->nextLimbIndex != LIMB_DONE) {
+ SkelAnime_DrawLimbSV(globalCtx, limbEntry->nextLimbIndex, skeleton, actorDrawTable, updateMtxFunc,
+ appendDlistFunc, actor, limbMatricies);
+ }
+
+ func_800C6B54(gfx, globalCtx->state.gfxCtx, "../z_skelanime.c", 1265);
+}
+#else
+#pragma GLOBAL_ASM("asm/non_matchings/code/z_skelanime/SkelAnime_DrawLimbSV.s")
+#endif
+
+#ifdef NON_MATCHING
+// Regalloc, pretty much same as SkelAnime_LodDrawSV
+void SkelAnime_DrawSV(GlobalContext* globalCtx, Skeleton* skeleton, Vec3s* actorDrawTable, s32 limbCount,
+ SkelAnime_LimbUpdateMatrix updateMtxFunc, SkelAnime_LimbAppendDlist appendDlistFunc,
+ Actor* actor) {
+ SkelLimbEntry* limbEntry;
+ char pad[4];
+ Gfx* dList[2];
+ Vec3f pos;
+ Vec3s rot;
+ Mtx* mtx;
+ GraphicsContext* gfxCtx;
+ Gfx* gfx[4];
+
+ mtx = Graph_Alloc(globalCtx->state.gfxCtx, limbCount * sizeof(Mtx));
+
+ if (skeleton == NULL) {
+ osSyncPrintf(VT_FGCOL(RED));
+ osSyncPrintf("Si2_draw_SV():skelがNULLです。\n"); // Si2_draw_SV (): skel is NULL.
+ osSyncPrintf(VT_RST);
+ return;
+ }
+
+ gfxCtx = globalCtx->state.gfxCtx;
+
+ func_800C6AC4(gfx, globalCtx->state.gfxCtx, "../z_skelanime.c", 1294);
+
+ gSPSegment(gfxCtx->polyOpa.p++, 0xD, mtx);
+
+ Matrix_Push();
+
+ limbEntry = SEGMENTED_TO_VIRTUAL(skeleton->limbs[0]);
+
+ pos.x = actorDrawTable->x;
+ pos.y = actorDrawTable->x;
+ pos.z = actorDrawTable->z;
+
+ rot = actorDrawTable[1];
+
+ dList[0] = dList[1] = limbEntry->displayLists[0];
+
+ if ((updateMtxFunc == NULL) || (updateMtxFunc(globalCtx, 1, &dList[1], &pos, &rot, actor) == 0)) {
+ Matrix_TranslateThenRotateZYX(&pos, &rot);
+ if (dList[1] != NULL) {
+ Matrix_ToMtx(mtx, "../z_skelanime.c", 1327);
+ gSPMatrix(gfxCtx->polyOpa.p++, mtx, G_MTX_LOAD);
+ gSPDisplayList(gfxCtx->polyOpa.p++, dList[1]);
+ mtx++;
+ } else {
+ if (dList[0] != NULL) {
+ Matrix_ToMtx(mtx, "../z_skelanime.c", 1334);
+ mtx++;
+ }
+ }
+ }
+
+ if (appendDlistFunc != NULL) {
+ appendDlistFunc(globalCtx, 1, &dList[0], &rot, actor);
+ }
+
+ if (limbEntry->firstChildIndex != LIMB_DONE) {
+ SkelAnime_DrawLimbSV(globalCtx, limbEntry->firstChildIndex, skeleton, actorDrawTable, updateMtxFunc,
+ appendDlistFunc, actor, &mtx);
+ }
+
+ Matrix_Pull();
+ func_800C6B54(gfx, globalCtx->state.gfxCtx, "../z_skelanime.c", 1347);
+}
+#else
+#pragma GLOBAL_ASM("asm/non_matchings/code/z_skelanime/SkelAnime_DrawSV.s")
+#endif
+
+/*
+ * Copies the rotation values from the rotation value table, indexed by the rotation index table
+ * When a rotation index is >= the animation limit, the output rotation value is copied from the frame's
+ * rotation value list, otherwise it is copied from the initial rotation value list
+ */
+void SkelAnime_AnimateFrame(AnimationHeader* animationSeg, s32 currentFrame, s32 limbCount, Vec3s* dst) {
+ AnimationRotationIndex* index;
+ AnimationRotationValue* rotationValueTable;
+ AnimationRotationValue* frameRotationValueTable;
+ AnimationHeader* animationHeader;
+
+ s32 i;
+ u16 limit;
+
+ animationHeader = SEGMENTED_TO_VIRTUAL(animationSeg);
+ index = SEGMENTED_TO_VIRTUAL(animationHeader->rotationIndexSeg);
+ rotationValueTable = SEGMENTED_TO_VIRTUAL(animationHeader->rotationValueSeg);
+ frameRotationValueTable = &rotationValueTable[currentFrame];
+ limit = animationHeader->limit;
+
+ for (i = 0; i < limbCount; i++, dst++, index++) {
+ if ((dst == NULL) || (index == NULL) || (frameRotationValueTable == NULL) || (rotationValueTable == NULL)) {
+ if (1) {} // Necessary to match.
+ LogUtils_LogThreadId("../z_skelanime.c", 1392);
+ osSyncPrintf("out = %08x\n", dst);
+ LogUtils_LogThreadId("../z_skelanime.c", 1393);
+ osSyncPrintf("ref_tbl = %08x\n", index);
+ LogUtils_LogThreadId("../z_skelanime.c", 1394);
+ osSyncPrintf("frame_tbl = %08x\n", frameRotationValueTable);
+ LogUtils_LogThreadId("../z_skelanime.c", 1395);
+ osSyncPrintf("tbl = %08x\n", rotationValueTable);
+ }
+
+ dst->x = index->x >= limit ? frameRotationValueTable[index->x] : rotationValueTable[index->x];
+ dst->y = index->y >= limit ? frameRotationValueTable[index->y] : rotationValueTable[index->y];
+ dst->z = index->z >= limit ? frameRotationValueTable[index->z] : rotationValueTable[index->z];
+ }
+}
+
+s16 func_800A1FC8(GenericAnimationHeader* animationSeg) {
+ GenericAnimationHeader* animation = SEGMENTED_TO_VIRTUAL(animationSeg);
+ return animation->frameCount;
+}
+
+s16 SkelAnime_GetFrameCount(GenericAnimationHeader* animationSeg) {
+ GenericAnimationHeader* animation = SEGMENTED_TO_VIRTUAL(animationSeg);
+
+ return (u16)animation->frameCount - 1;
+}
+
+Gfx* SkelAnime_Draw2Limb(GlobalContext* globalCtx, s32 limbIndex, Skeleton* skeleton, Vec3s* actorDrawTable,
+ SkelAnime_LimbUpdateMatrix2 updateMtxFunc, SkelAnime_LimbAppendDlist2 appendDlistFunc,
+ Actor* actor, Gfx* gfx) {
+ SkelLimbEntry* limbEntry;
+ Gfx* dList;
+ Vec3f pos;
+ Vec3s rot;
+
+ Matrix_Push();
+
+ limbEntry = SEGMENTED_TO_VIRTUAL(skeleton->limbs[limbIndex]);
+ limbIndex++;
+
+ rot = actorDrawTable[limbIndex];
+
+ pos.x = limbEntry->translation.x;
+ pos.y = limbEntry->translation.y;
+ pos.z = limbEntry->translation.z;
+
+ dList = limbEntry->displayLists[0];
+
+ if ((updateMtxFunc == NULL) || (updateMtxFunc(globalCtx, limbIndex, &dList, &pos, &rot, actor, &gfx) == 0)) {
+ Matrix_TranslateThenRotateZYX(&pos, &rot);
+ if (dList != NULL) {
+ gSPMatrix(gfx++, Matrix_NewMtx(globalCtx->state.gfxCtx, "../z_skelanime.c", 1489), G_MTX_LOAD);
+ gSPDisplayList(gfx++, dList);
+ }
+ }
+
+ if (appendDlistFunc != NULL) {
+ appendDlistFunc(globalCtx, limbIndex, &dList, &rot, actor, &gfx);
+ }
+
+ if (limbEntry->firstChildIndex != LIMB_DONE) {
+ gfx = SkelAnime_Draw2Limb(globalCtx, limbEntry->firstChildIndex, skeleton, actorDrawTable, updateMtxFunc,
+ appendDlistFunc, actor, gfx);
+ }
+
+ Matrix_Pull();
+
+ if (limbEntry->nextLimbIndex != LIMB_DONE) {
+ gfx = SkelAnime_Draw2Limb(globalCtx, limbEntry->nextLimbIndex, skeleton, actorDrawTable, updateMtxFunc,
+ appendDlistFunc, actor, gfx);
+ }
+
+ return gfx;
+}
+
+Gfx* SkelAnime_Draw2(GlobalContext* globalCtx, Skeleton* skeleton, Vec3s* actorDrawTable,
+ SkelAnime_LimbUpdateMatrix2 updateMtxFunc, SkelAnime_LimbAppendDlist2 appendDlistFunc,
+ Actor* actor, Gfx* gfx) {
+ SkelLimbEntry* limbEntry;
+ char pad[4];
+ Gfx* dList;
+ Vec3f pos;
+ Vec3s rot;
+
+ if (skeleton == NULL) {
+ osSyncPrintf(VT_FGCOL(RED));
+ osSyncPrintf("Si2_draw2():skelがNULLです。NULLを返します。\n");
+ osSyncPrintf(VT_RST);
+ return NULL;
+ }
+
+ Matrix_Push();
+
+ limbEntry = SEGMENTED_TO_VIRTUAL(skeleton->limbs[0]);
+
+ pos.x = actorDrawTable->x;
+ pos.y = actorDrawTable->y;
+ pos.z = actorDrawTable->z;
+
+ rot = actorDrawTable[1];
+
+ dList = limbEntry->displayLists[0];
+
+ if ((updateMtxFunc == NULL) || (updateMtxFunc(globalCtx, 1, &dList, &pos, &rot, actor, &gfx) == 0)) {
+ Matrix_TranslateThenRotateZYX(&pos, &rot);
+ if (dList != NULL) {
+ gSPMatrix(gfx++, Matrix_NewMtx(globalCtx->state.gfxCtx, "../z_skelanime.c", 1558), G_MTX_LOAD);
+ gSPDisplayList(gfx++, dList);
+ }
+ }
+
+ if (appendDlistFunc != NULL) {
+ appendDlistFunc(globalCtx, 1, &dList, &rot, actor, &gfx);
+ }
+
+ if (limbEntry->firstChildIndex != LIMB_DONE) {
+ gfx = SkelAnime_Draw2Limb(globalCtx, limbEntry->firstChildIndex, skeleton, actorDrawTable, updateMtxFunc,
+ appendDlistFunc, actor, gfx);
+ }
+
+ Matrix_Pull();
+
+ return gfx;
+}
+
+Gfx* SkelAnime_DrawLimbSV2(GlobalContext* globalCtx, s32 limbIndex, Skeleton* skeleton, Vec3s* actorDrawTable,
+ SkelAnime_LimbUpdateMatrix2 updateMtxFunc, SkelAnime_LimbAppendDlist2 appendDlistFunc,
+ Actor* actor, Mtx** mtx, Gfx* gfx) {
+ SkelLimbEntry* limbEntry;
+ Gfx* dList1;
+ Gfx* dList2;
+ Vec3f pos;
+ Vec3s rot;
+ char pad[4];
+
+ Matrix_Push();
+
+ limbEntry = SEGMENTED_TO_VIRTUAL(skeleton->limbs[limbIndex]);
+ limbIndex++;
+ rot = actorDrawTable[limbIndex];
+
+ pos.x = limbEntry->translation.x;
+ pos.y = limbEntry->translation.y;
+ pos.z = limbEntry->translation.z;
+
+ dList1 = dList2 = limbEntry->displayLists[0];
+ if ((updateMtxFunc == NULL) || (updateMtxFunc(globalCtx, limbIndex, &dList1, &pos, &rot, actor, &gfx) == 0)) {
+ Matrix_TranslateThenRotateZYX(&pos, &rot);
+ if (dList1 != NULL) {
+ Matrix_ToMtx(*mtx, "../z_skelanime.c", 1623);
+ gSPMatrix(gfx++, *mtx, G_MTX_LOAD);
+ gSPDisplayList(gfx++, dList1);
+ (*mtx)++;
+ } else {
+ if (dList2 != NULL) {
+ Matrix_ToMtx(*mtx, "../z_skelanime.c", 1630);
+ (*mtx)++;
+ }
+ }
+ }
+ if (appendDlistFunc != NULL) {
+ appendDlistFunc(globalCtx, limbIndex, &dList2, &rot, actor, &gfx);
+ }
+ if (limbEntry->firstChildIndex != LIMB_DONE) {
+ gfx = SkelAnime_DrawLimbSV2(globalCtx, limbEntry->firstChildIndex, skeleton, actorDrawTable, updateMtxFunc,
+ appendDlistFunc, actor, mtx, gfx);
+ }
+
+ Matrix_Pull();
+
+ if (limbEntry->nextLimbIndex != LIMB_DONE) {
+ gfx = SkelAnime_DrawLimbSV2(globalCtx, limbEntry->nextLimbIndex, skeleton, actorDrawTable, updateMtxFunc,
+ appendDlistFunc, actor, mtx, gfx);
+ }
+
+ return gfx;
+}
+
+Gfx* SkelAnime_DrawSV2(GlobalContext* globalCtx, Skeleton* skeleton, Vec3s* actorDrawTable, s32 dListCount,
+ SkelAnime_LimbUpdateMatrix2 updateMtxFunc, SkelAnime_LimbAppendDlist2 appendDlistFunc,
+ Actor* actor, Gfx* gfx) {
+ SkelLimbEntry* limbEntry;
+ char pad[4];
+ Gfx* dList1;
+ Gfx* dList2;
+ Vec3f pos;
+ Vec3s rot;
+ Mtx* mtx;
+
+ mtx = Graph_Alloc(globalCtx->state.gfxCtx, dListCount * sizeof(*mtx));
+ if (skeleton == NULL) {
+ osSyncPrintf(VT_FGCOL(RED));
+ osSyncPrintf("Si2_draw2_SV():skelがNULLです。NULLを返します。\n");
+ osSyncPrintf(VT_RST);
+ return NULL;
+ }
+
+ gSPSegment(gfx++, 0xD, mtx);
+ Matrix_Push();
+ limbEntry = SEGMENTED_TO_VIRTUAL(skeleton->limbs[0]);
+
+ pos.x = actorDrawTable->x;
+ pos.y = actorDrawTable->y;
+ pos.z = actorDrawTable->z;
+
+ rot = actorDrawTable[1];
+
+ dList1 = dList2 = limbEntry->displayLists[0];
+
+ if ((updateMtxFunc == NULL) || (updateMtxFunc(globalCtx, 1, &dList1, &pos, &rot, actor, &gfx) == 0)) {
+ Matrix_TranslateThenRotateZYX(&pos, &rot);
+ if (dList1 != NULL) {
+ Matrix_ToMtx(mtx, "../z_skelanime.c", 1710);
+ gSPMatrix(gfx++, mtx, G_MTX_LOAD);
+ gSPDisplayList(gfx++, dList1);
+ mtx++;
+ } else {
+ if (dList2 != NULL) {
+ Matrix_ToMtx(mtx, "../z_skelanime.c", 1717);
+ mtx++;
+ }
+ }
+ }
+ if (appendDlistFunc != NULL) {
+ appendDlistFunc(globalCtx, 1, &dList2, &rot, actor, &gfx);
+ }
+ if (limbEntry->firstChildIndex != LIMB_DONE) {
+ gfx = SkelAnime_DrawLimbSV2(globalCtx, limbEntry->firstChildIndex, skeleton, actorDrawTable, updateMtxFunc,
+ appendDlistFunc, actor, &mtx, gfx);
+ }
+
+ Matrix_Pull();
+
+ return gfx;
+}
+
+// Seems to be some kind of rotations update, somewhat large.
#pragma GLOBAL_ASM("asm/non_matchings/code/z_skelanime/func_800A29BC.s")
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_skelanime/func_800A2DBC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_skelanime/func_800A2DF4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_skelanime/func_800A2E2C.s")
-
+s16 func_800A2DBC(GenericAnimationHeader* animationSeg) {
+ GenericAnimationHeader* animation = SEGMENTED_TO_VIRTUAL(animationSeg);
+
+ return animation->unk_02;
+}
+
+s16 func_800A2DF4(GenericAnimationHeader* animationSeg) {
+ GenericAnimationHeader* animation = SEGMENTED_TO_VIRTUAL(animationSeg);
+
+ return animation->frameCount;
+}
+
+s16 func_800A2E2C(GenericAnimationHeader* animationSeg) {
+ GenericAnimationHeader* animation = SEGMENTED_TO_VIRTUAL(animationSeg);
+
+ return animation->frameCount - 1;
+}
+
+#ifdef NON_MATCHING
+// Functionally equal, but loop unrolling is way off.
+void func_800A2E70(s32 limbCount, Vec3s* vec1, Vec3s* vec2, Vec3s* vec3, f32 unkf) {
+ Vec3s* pvec1;
+ Vec3s* pvec2;
+ Vec3s* pvec3;
+ s32 iVar3;
+
+ if (unkf < 1.0f) {
+ for (iVar3 = 0, pvec1 = vec1, pvec2 = vec2, pvec3 = vec3; iVar3 < limbCount;
+ iVar3++, pvec1++, pvec2++, pvec3++) {
+ pvec1->x = pvec2->x + ((s16)(pvec3->x - pvec2->x) * unkf);
+ pvec1->y = pvec2->y + ((s16)(pvec3->y - pvec2->y) * unkf);
+ pvec1->z = pvec2->z + ((s16)(pvec3->z - pvec2->z) * unkf);
+ }
+ } else {
+ for (iVar3 = 0; iVar3 < limbCount; iVar3++) {
+ pvec1 = &vec1[iVar3];
+ pvec3 = &vec3[iVar3];
+ pvec1->x = pvec3->x;
+ pvec1->y = pvec3->y;
+ pvec1->z = pvec3->z;
+ }
+ }
+}
+#else
#pragma GLOBAL_ASM("asm/non_matchings/code/z_skelanime/func_800A2E70.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_skelanime/func_800A32EC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_skelanime/func_800A32F4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_skelanime/func_800A3310.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_skelanime/func_800A3334.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_skelanime/func_800A336C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_skelanime/func_800A3478.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_skelanime/func_800A34DC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_skelanime/func_800A3548.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_skelanime/func_800A35B4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_skelanime/func_800A3620.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_skelanime/func_800A3678.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_skelanime/func_800A36A4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_skelanime/func_800A3714.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_skelanime/func_800A3770.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_skelanime/func_800A37F0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_skelanime/func_800A3874.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_skelanime/func_800A390C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_skelanime/func_800A39AC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_skelanime/func_800A3B8C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_skelanime/func_800A3BC0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_skelanime/func_800A3BE4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_skelanime/func_800A3C9C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_skelanime/func_800A3D70.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_skelanime/func_800A3E0C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_skelanime/func_800A3EE8.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_skelanime/func_800A3F08.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_skelanime/func_800A407C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_skelanime/func_800A40DC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_skelanime/func_800A4140.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_skelanime/func_800A419C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_skelanime/func_800A41FC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_skelanime/func_800A422C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_skelanime/func_800A425C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_skelanime/func_800A42A0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_skelanime/func_800A42E4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_skelanime/func_800A431C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_skelanime/func_800A43B8.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_skelanime/func_800A4454.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_skelanime/func_800A4478.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_skelanime/func_800A4530.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_skelanime/SkelAnime_Init.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_skelanime/func_800A46F8.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_skelanime/func_800A487C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_skelanime/func_800A49B0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_skelanime/SkelAnime_FrameUpdateMatrix.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_skelanime/func_800A4A20.s")
-
+#endif
+
+void SkelAnime_AnimationCtxReset(AnimationContext* animationCtx) {
+ animationCtx->animationCount = 0;
+}
+
+void func_800A32F4(GlobalContext* globalCtx) {
+ D_801600B0 <<= 1;
+}
+
+void func_800A3310(GlobalContext* globalCtx) {
+ u32* D_8012A480Ptr = &D_8012A480;
+
+ *D_8012A480Ptr |= D_801600B0;
+}
+
+AnimationEntry* SkelAnime_NextEntry(AnimationContext* animationCtx, AnimationType type) {
+ AnimationEntry* entry;
+ s16 index = animationCtx->animationCount;
+
+ if (index >= ANIMATION_ENTRY_MAX) {
+ return NULL;
+ }
+ animationCtx->animationCount = index + 1;
+ entry = &animationCtx->entries[index];
+ entry->type = type;
+ return entry;
+}
+
+/*
+ * The next 6 functions are coordinate with the AnimationType enum
+ */
+
+void SkelAnime_LoadLinkAnimetion(GlobalContext* globalCtx, LinkAnimetionEntry* linkAnimetionSeg, s32 frame,
+ s32 limbCount, void* ram) {
+ AnimationEntry* entry;
+ LinkAnimetionEntry* linkAnimetionEntry;
+ char pad[4];
+
+ entry = SkelAnime_NextEntry(&globalCtx->animationCtx, ANIMATION_LINKANIMETION);
+
+ if (entry != NULL) {
+ linkAnimetionEntry = SEGMENTED_TO_VIRTUAL(linkAnimetionSeg);
+ osCreateMesgQueue(&entry->types.type0.msgQueue, &entry->types.type0.msg, 1);
+ DmaMgr_SendRequest2(
+ &entry->types.type0.req, ram,
+ LINK_ANIMETION_OFFSET(linkAnimetionEntry->animationSegAddress, ((sizeof(Vec3s) * limbCount + 2) * frame)),
+ sizeof(Vec3s) * limbCount + 2, 0, &entry->types.type0.msgQueue, NULL, "../z_skelanime.c", 2004);
+ }
+}
+
+void SkelAnime_LoadAnimationType1(GlobalContext* globalCtx, s32 vecCount, Vec3s* dst, Vec3s* src) {
+ AnimationEntry* entry = SkelAnime_NextEntry(&globalCtx->animationCtx, ANIMATION_TYPE1);
+ if (entry != NULL) {
+ entry->types.type1.unk_00 = D_801600B0;
+ entry->types.type1.vecCount = vecCount;
+ entry->types.type1.dst = dst;
+ entry->types.type1.src = src;
+ }
+}
+
+void SkelAnime_LoadAnimationType2(GlobalContext* globalCtx, s32 limbCount, Vec3s* arg2, Vec3s* arg3, f32 arg4) {
+ AnimationEntry* entry = SkelAnime_NextEntry(&globalCtx->animationCtx, ANIMATION_TYPE2);
+ if (entry != NULL) {
+ entry->types.type2.unk_00 = D_801600B0;
+ entry->types.type2.limbCount = limbCount;
+ entry->types.type2.unk_04 = arg2;
+ entry->types.type2.unk_08 = arg3;
+ entry->types.type2.unk_0C = arg4;
+ }
+}
+
+void SkelAnime_LoadAnimationType3(GlobalContext* globalCtx, s32 vecCount, Vec3s* dst, Vec3s* src, u8* index) {
+ AnimationEntry* entry = SkelAnime_NextEntry(&globalCtx->animationCtx, ANIMATION_TYPE3);
+ if (entry != NULL) {
+ entry->types.type3.unk_00 = D_801600B0;
+ entry->types.type3.vecCount = vecCount;
+ entry->types.type3.dst = dst;
+ entry->types.type3.src = src;
+ entry->types.type3.index = index;
+ }
+}
+
+void SkelAnime_LoadAnimationType4(GlobalContext* globalCtx, s32 vecCount, Vec3s* dst, Vec3s* src, u8* index) {
+ AnimationEntry* entry = SkelAnime_NextEntry(&globalCtx->animationCtx, ANIMATION_TYPE4);
+ if (entry != NULL) {
+ entry->types.type4.unk_00 = D_801600B0;
+ entry->types.type4.vecCount = vecCount;
+ entry->types.type4.dst = dst;
+ entry->types.type4.src = src;
+ entry->types.type4.index = index;
+ }
+}
+
+void SkelAnime_LoadAnimationType5(GlobalContext* globalCtx, Actor* actor, SkelAnime* skelAnime, f32 arg3) {
+ AnimationEntry* entry = SkelAnime_NextEntry(&globalCtx->animationCtx, ANIMATION_TYPE5);
+ if (entry != NULL) {
+ entry->types.type5.actor = actor;
+ entry->types.type5.skelAnime = skelAnime;
+ entry->types.type5.unk_08 = arg3;
+ }
+}
+
+/* The next functions are callbacks to loading animations */
+
+void SkelAnime_LinkAnimetionLoaded(GlobalContext* globalCtx, AnimationEntryType0* entry) {
+ osRecvMesg(&entry->msgQueue, NULL, OS_MESG_BLOCK);
+}
+
+void SkelAnime_AnimationType1Loaded(GlobalContext* globalCtx, AnimationEntryType1* entry) {
+ s32 i;
+ Vec3s* dst;
+ Vec3s* src;
+ AnimationEntryRaw* genericEntry = (AnimationEntryRaw*)entry;
+
+ if ((genericEntry->raw[0] & D_8012A480) != 0) {
+ return;
+ }
+
+ for (dst = entry->dst, src = entry->src, i = 0; i < genericEntry->raw[1]; i++) {
+ *dst++ = *src++;
+ }
+}
+
+void SkelAnime_AnimationType2Loaded(GlobalContext* globalCtx, AnimationEntryType2* entry) {
+ if ((entry->unk_00 & D_8012A480) == 0) {
+ func_800A2E70(entry->limbCount, entry->unk_04, entry->unk_04, entry->unk_08, entry->unk_0C);
+ }
+}
+
+void SkelAnime_AnimationType3Loaded(GlobalContext* globalCtx, AnimationEntryType3* entry) {
+ s32 i;
+ Vec3s* dst;
+ Vec3s* src;
+ u8* index;
+ AnimationEntryRaw* rawEntry = (AnimationEntryRaw*)entry;
+
+ if ((rawEntry->raw[0] & D_8012A480) == 0) {
+ for (dst = entry->dst, src = entry->src, index = entry->index, i = 0; i < rawEntry->raw[1]; i++, dst++, src++) {
+ if (*index++) {
+ *dst = *src;
+ }
+ }
+ }
+}
+
+void SkelAnime_AnimationType4Loaded(GlobalContext* globalCtx, AnimationEntryType4* entry) {
+ s32 i;
+ Vec3s* dst;
+ Vec3s* src;
+ u8* index;
+ AnimationEntryRaw* rawEntry = (AnimationEntryRaw*)entry;
+
+ if ((rawEntry->raw[0] & D_8012A480) == 0) {
+ for (dst = entry->dst, src = entry->src, index = entry->index, i = 0; i < rawEntry->raw[1]; i++, dst++, src++) {
+ if (*index++ < 1U) {
+ *dst = *src;
+ }
+ }
+ }
+}
+
+void SkelAnime_AnimationType5Loaded(GlobalContext* globalCtx, AnimationEntryType5* entry) {
+ char pad[4];
+ Actor* actor = entry->actor;
+ Vec3f pos;
+
+ func_800A54FC(entry->skelAnime, &pos, actor->shape.rot.y);
+ actor->posRot.pos.x += pos.x * actor->scale.x;
+ actor->posRot.pos.y += pos.y * actor->scale.y * entry->unk_08;
+ actor->posRot.pos.z += pos.z * actor->scale.z;
+}
+
+void func_800A390C(GlobalContext* globalCtx, AnimationContext* animationCtx) {
+ AnimationEntry* entry;
+
+ for (entry = animationCtx->entries; animationCtx->animationCount != 0; entry++, animationCtx->animationCount--) {
+ sAnimationLoadDone[entry->type](globalCtx, &entry->types);
+ }
+
+ D_801600B0 = 1;
+ D_8012A480 = 0;
+}
+
+void SkelAnime_InitLinkAnimetion(GlobalContext* globalCtx, SkelAnime* skelAnime, SkeletonHeader* skeletonHeaderSeg,
+ LinkAnimetionEntry* linkAnimetionEntrySeg, s32 flags, Vec3s* actorDrawTbl, Vec3s* arg6,
+ s32 limbBufCount) {
+ char pad[8];
+ SkeletonHeader* skeletonHeader;
+ size_t allocSize;
+ s32 limbCount;
+ s32 headerCount;
+
+ skeletonHeader = SEGMENTED_TO_VIRTUAL(skeletonHeaderSeg);
+ headerCount = skeletonHeader->limbCount;
+ skelAnime->unk_34 = flags;
+ limbCount = (flags & 2) ? headerCount : 1;
+
+ if (flags & 1) {
+ limbCount += headerCount;
+ }
+ if (flags & 4) {
+ limbCount += headerCount;
+ }
+
+ skelAnime->limbCount = limbCount;
+ skelAnime->dListCount = skeletonHeader->dListCount;
+
+ allocSize = limbCount * sizeof(Vec3s);
+ skelAnime->skeleton = SEGMENTED_TO_VIRTUAL(skeletonHeader->skeletonSeg);
+
+ if (flags & 8) {
+ allocSize += 2;
+ }
+
+ if (actorDrawTbl == NULL) {
+ skelAnime->actorDrawTbl = ZeldaArena_MallocDebug(allocSize, "../z_skelanime.c", 2364);
+ skelAnime->unk_24 = ZeldaArena_MallocDebug(allocSize, "../z_skelanime.c", 2365);
+ } else {
+ if (limbBufCount != limbCount) {
+ __assert("joint_buff_num == joint_num", "../z_skelanime.c", 2369);
+ }
+
+ skelAnime->actorDrawTbl = (Vec3s*)ALIGN16((u32)actorDrawTbl);
+ skelAnime->unk_24 = (Vec3s*)ALIGN16((u32)arg6);
+ }
+
+ if ((skelAnime->actorDrawTbl == NULL) || (skelAnime->unk_24 == NULL)) {
+ osSyncPrintf(VT_FGCOL(RED));
+ osSyncPrintf(
+ "Skeleton_Info_Rom_SV_ct メモリアロケーションエラー\n"); // Skeleton_Info_Rom_SV_ct Memory allocation error
+ osSyncPrintf(VT_RST);
+ }
+
+ SkelAnime_LinkChangeAnimation(globalCtx, skelAnime, linkAnimetionEntrySeg, 1.0f, 0.0f, 0.0f, 0, 0.0f);
+}
+
+void func_800A3B8C(SkelAnime* skelAnime) {
+ if (skelAnime->unk_01 < 2) {
+ skelAnime->animUpdate = &func_800A3D70;
+ } else {
+ skelAnime->animUpdate = &func_800A3E0C;
+ }
+ skelAnime->unk_28 = 0.0f;
+}
+
+void func_800A3BC0(GlobalContext* globalCtx, SkelAnime* skelAnime) {
+ skelAnime->animUpdate(globalCtx, skelAnime);
+}
+
+s32 func_800A3BE4(GlobalContext* globalCtx, SkelAnime* skelAnime) {
+ f32 prevUnk28 = skelAnime->unk_28;
+ f32 updateRate = R_UPDATE_RATE * 0.5f;
+
+ skelAnime->unk_28 -= skelAnime->unk_2C * updateRate;
+
+ if (skelAnime->unk_28 <= 0.0f) {
+ func_800A3B8C(skelAnime);
+ }
+
+ SkelAnime_LoadAnimationType2(globalCtx, skelAnime->limbCount, skelAnime->actorDrawTbl, skelAnime->unk_24,
+ 1.0f - (skelAnime->unk_28 / prevUnk28));
+ return 0;
+}
+
+void func_800A3C9C(GlobalContext* globalCtx, SkelAnime* skelAnime) {
+ f32 updateRate;
+
+ SkelAnime_LoadLinkAnimetion(globalCtx, skelAnime->linkAnimetionSeg, skelAnime->animCurrentFrame,
+ skelAnime->limbCount, skelAnime->actorDrawTbl);
+ if (skelAnime->unk_28 != 0) {
+ updateRate = R_UPDATE_RATE * 0.5f;
+ skelAnime->unk_28 -= skelAnime->unk_2C * updateRate;
+ if (skelAnime->unk_28 <= 0.0f) {
+ skelAnime->unk_28 = 0.0f;
+ return;
+ }
+ SkelAnime_LoadAnimationType2(globalCtx, skelAnime->limbCount, skelAnime->actorDrawTbl, skelAnime->unk_24,
+ skelAnime->unk_28);
+ }
+}
+
+s32 func_800A3D70(GlobalContext* globalCtx, SkelAnime* skelAnime) {
+ f32 updateRate = R_UPDATE_RATE * 0.5f;
+
+ skelAnime->animCurrentFrame += skelAnime->animPlaybackSpeed * updateRate;
+ if (skelAnime->animCurrentFrame < 0.0f) {
+ skelAnime->animCurrentFrame += skelAnime->unk_14;
+ } else if (skelAnime->unk_14 <= skelAnime->animCurrentFrame) {
+ skelAnime->animCurrentFrame -= skelAnime->unk_14;
+ }
+ func_800A3C9C(globalCtx, skelAnime);
+ return 0;
+}
+
+s32 func_800A3E0C(GlobalContext* globalCtx, SkelAnime* skelAnime) {
+ f32 updateRate = R_UPDATE_RATE * 0.5f;
+
+ if (skelAnime->animCurrentFrame == skelAnime->animFrameCount) {
+ func_800A3C9C(globalCtx, skelAnime);
+ return 1;
+ }
+ skelAnime->animCurrentFrame += skelAnime->animPlaybackSpeed * updateRate;
+ if (0.0f < ((skelAnime->animCurrentFrame - skelAnime->animFrameCount) * skelAnime->animPlaybackSpeed)) {
+ skelAnime->animCurrentFrame = skelAnime->animFrameCount;
+ } else {
+ if (skelAnime->animCurrentFrame < 0.0f) {
+ skelAnime->animCurrentFrame += skelAnime->unk_14;
+ } else if (skelAnime->unk_14 <= skelAnime->animCurrentFrame) {
+ skelAnime->animCurrentFrame -= skelAnime->unk_14;
+ }
+ }
+ func_800A3C9C(globalCtx, skelAnime);
+ return 0;
+}
+
+void func_800A3EE8(GlobalContext* globalCtx, SkelAnime* skelAnime, f32 arg2) {
+ skelAnime->unk_28 = 1.0f;
+ skelAnime->unk_2C = 1.0f / arg2;
+}
+
+#ifdef NON_MATCHING
+void SkelAnime_LinkChangeAnimation(GlobalContext* globalCtx, SkelAnime* skelAnime,
+ LinkAnimetionEntry* linkAnimetionEntrySeg, f32 playbackSpeed, f32 frame,
+ f32 frameCount, u8 arg6, f32 arg7) {
+
+ skelAnime->unk_01 = arg6;
+ if ((arg7 != 0.0f) &&
+ ((linkAnimetionEntrySeg == skelAnime->linkAnimetionSeg) || (frame != skelAnime->animCurrentFrame))) {
+ if (arg7 < 0.0f) {
+ func_800A3B8C(skelAnime);
+ SkelAnime_CopyVec3s(skelAnime, skelAnime->unk_24, skelAnime->actorDrawTbl);
+ arg7 = -arg7;
+ } else {
+ skelAnime->animUpdate = &func_800A3BE4;
+ SkelAnime_LoadLinkAnimetion(globalCtx, linkAnimetionEntrySeg, (s32)frame, skelAnime->limbCount,
+ skelAnime->unk_24);
+ }
+ skelAnime->unk_28 = 1.0f;
+ skelAnime->unk_2C = 1.0f / arg7;
+ } else {
+ func_800A3B8C(skelAnime);
+ SkelAnime_LoadLinkAnimetion(globalCtx, linkAnimetionEntrySeg, (s32)frame, skelAnime->limbCount,
+ skelAnime->actorDrawTbl);
+ skelAnime->unk_28 = 0.0f;
+ }
+
+ skelAnime->animCurrentFrame = 0.0f;
+ skelAnime->unk_0C = frame;
+ skelAnime->animCurrentFrame = frame;
+ skelAnime->animFrameCount = frameCount;
+ skelAnime->unk_14 = func_800A1FC8(&linkAnimetionEntrySeg->genericHeader);
+ skelAnime->animPlaybackSpeed = playbackSpeed;
+}
+#else
+#pragma GLOBAL_ASM("asm/non_matchings/code/z_skelanime/SkelAnime_LinkChangeAnimation.s")
+#endif
+
+void func_800A407C(GlobalContext* globalCtx, SkelAnime* skelAnime, LinkAnimetionEntry* linkAnimetionEntrySeg) {
+ SkelAnime_LinkChangeAnimation(globalCtx, skelAnime, linkAnimetionEntrySeg, 1.0f, 0.0f,
+ SkelAnime_GetFrameCount(&linkAnimetionEntrySeg->genericHeader), 2, 0.0f);
+}
+
+void func_800A40DC(GlobalContext* globalCtx, SkelAnime* skelAnime, LinkAnimetionEntry* linkAnimetionEntrySeg,
+ f32 playbackSpeed) {
+ SkelAnime_LinkChangeAnimation(globalCtx, skelAnime, linkAnimetionEntrySeg, playbackSpeed, 0.0f,
+ SkelAnime_GetFrameCount(&linkAnimetionEntrySeg->genericHeader), 2, 0.0f);
+}
+
+void func_800A4140(GlobalContext* globalCtx, SkelAnime* skelAnime, LinkAnimetionEntry* linkAnimetionEntrySeg) {
+ SkelAnime_LinkChangeAnimation(globalCtx, skelAnime, linkAnimetionEntrySeg, 1.0f, 0.0f,
+ SkelAnime_GetFrameCount(&linkAnimetionEntrySeg->genericHeader), 0, 0.0f);
+}
+
+void func_800A419C(GlobalContext* globalCtx, SkelAnime* skelAnime, LinkAnimetionEntry* linkAnimetionEntrySeg,
+ f32 playbackSpeed) {
+ SkelAnime_LinkChangeAnimation(globalCtx, skelAnime, linkAnimetionEntrySeg, playbackSpeed, 0.0f,
+ SkelAnime_GetFrameCount(&linkAnimetionEntrySeg->genericHeader), 0, 0.0f);
+}
+
+void func_800A41FC(GlobalContext* globalCtx, SkelAnime* skelAnime) {
+ SkelAnime_LoadAnimationType1(globalCtx, skelAnime->limbCount, skelAnime->unk_24, skelAnime->actorDrawTbl);
+}
+
+void func_800A422C(GlobalContext* globalCtx, SkelAnime* skelAnime) {
+ SkelAnime_LoadAnimationType1(globalCtx, skelAnime->limbCount, skelAnime->actorDrawTbl, skelAnime->unk_24);
+}
+
+void func_800A425C(GlobalContext* globalCtx, SkelAnime* skelAnime, LinkAnimetionEntry* linkAnimetionEntrySeg,
+ f32 frame) {
+ SkelAnime_LoadLinkAnimetion(globalCtx, linkAnimetionEntrySeg, (s32)frame, skelAnime->limbCount, skelAnime->unk_24);
+}
+
+void func_800A42A0(GlobalContext* globalCtx, SkelAnime* skelAnime, LinkAnimetionEntry* linkAnimetionEntrySeg,
+ f32 frame) {
+ SkelAnime_LoadLinkAnimetion(globalCtx, linkAnimetionEntrySeg, (s32)frame, skelAnime->limbCount,
+ skelAnime->actorDrawTbl);
+}
+
+void func_800A42E4(GlobalContext* globalCtx, SkelAnime* skelAnime, f32 arg2) {
+ SkelAnime_LoadAnimationType2(globalCtx, skelAnime->limbCount, skelAnime->actorDrawTbl, skelAnime->unk_24, arg2);
+}
+
+void func_800A431C(GlobalContext* globalCtx, SkelAnime* skelAnime, LinkAnimetionEntry* linkAnimetionEntrySeg, f32 frame,
+ LinkAnimetionEntry* linkAnimetionEntrySeg2, f32 arg5, f32 arg6, Vec3s* arg7) {
+ Vec3s* alignedArg7;
+ SkelAnime_LoadLinkAnimetion(globalCtx, linkAnimetionEntrySeg, (s32)frame, skelAnime->limbCount,
+ skelAnime->actorDrawTbl);
+
+ alignedArg7 = (Vec3s*)ALIGN16((u32)arg7);
+
+ SkelAnime_LoadLinkAnimetion(globalCtx, linkAnimetionEntrySeg2, (s32)arg5, skelAnime->limbCount, alignedArg7);
+ SkelAnime_LoadAnimationType2(globalCtx, skelAnime->limbCount, skelAnime->actorDrawTbl, alignedArg7, arg6);
+}
+
+void func_800A43B8(GlobalContext* globalCtx, SkelAnime* skelAnime, LinkAnimetionEntry* linkAnimetionEntrySeg, f32 frame,
+ LinkAnimetionEntry* linkAnimetionEntrySeg2, f32 arg5, f32 arg6, Vec3s* arg7) {
+ Vec3s* alignedArg7;
+
+ SkelAnime_LoadLinkAnimetion(globalCtx, linkAnimetionEntrySeg, (s32)frame, skelAnime->limbCount, skelAnime->unk_24);
+
+ alignedArg7 = (Vec3s*)ALIGN16((u32)arg7);
+
+ SkelAnime_LoadLinkAnimetion(globalCtx, linkAnimetionEntrySeg2, (s32)arg5, skelAnime->limbCount, alignedArg7);
+ SkelAnime_LoadAnimationType2(globalCtx, skelAnime->limbCount, skelAnime->unk_24, alignedArg7, arg6);
+}
+
+void func_800A4454(SkelAnime* skelAnime) {
+ skelAnime->unk_01 = 2;
+ func_800A3B8C(skelAnime);
+}
+
+s32 func_800A4478(SkelAnime* skelAnime, f32 arg1, f32 updateRate) {
+ f32 updateSpeed;
+ f32 temp_f12;
+ f32 nextFrame;
+
+ updateSpeed = skelAnime->animPlaybackSpeed * updateRate;
+ nextFrame = skelAnime->animCurrentFrame - updateSpeed;
+ if (nextFrame < 0.0f) {
+ nextFrame += skelAnime->unk_14;
+ } else {
+ if (skelAnime->unk_14 <= nextFrame) {
+ nextFrame -= skelAnime->unk_14;
+ }
+ }
+ if (arg1 == 0.0f) {
+ if (0.0f < updateSpeed) {
+ arg1 = skelAnime->unk_14;
+ }
+ }
+ temp_f12 = (nextFrame + updateSpeed) - arg1;
+ if (0.0f <= (temp_f12 * updateSpeed)) {
+ if (((temp_f12 - updateSpeed) * updateSpeed) < 0.0f) {
+ return 1;
+ }
+ }
+ return 0;
+}
+
+s32 func_800A4530(SkelAnime* skelAnime, f32 arg1) {
+ f32 updateRate = R_UPDATE_RATE * 0.5f;
+
+ return func_800A4478(skelAnime, arg1, updateRate);
+}
+
+void SkelAnime_Init(GlobalContext* globalCtx, SkelAnime* skelAnime, SkeletonHeader* skeletonHeaderSeg,
+ AnimationHeader* animationSeg, Vec3s* actorDrawTable, Vec3s* arg5, s32 limbCount) {
+ SkeletonHeader* skeletonHeader;
+
+ skeletonHeader = SEGMENTED_TO_VIRTUAL(skeletonHeaderSeg);
+ skelAnime->limbCount = skeletonHeader->limbCount + 1;
+ skelAnime->skeleton = SEGMENTED_TO_VIRTUAL(skeletonHeader->skeletonSeg);
+ if (actorDrawTable == NULL) {
+ skelAnime->actorDrawTbl =
+ ZeldaArena_MallocDebug(skelAnime->limbCount * sizeof(*skelAnime->actorDrawTbl), "../z_skelanime.c", 2968);
+ skelAnime->unk_24 =
+ ZeldaArena_MallocDebug(skelAnime->limbCount * sizeof(*skelAnime->unk_24), "../z_skelanime.c", 2969);
+ } else {
+ if (limbCount != skelAnime->limbCount) {
+ __assert("joint_buff_num == this->joint_num", "../z_skelanime.c", 2973);
+ }
+ skelAnime->actorDrawTbl = actorDrawTable;
+ skelAnime->unk_24 = arg5;
+ }
+ if ((skelAnime->actorDrawTbl == NULL) || (skelAnime->unk_24 == NULL)) {
+ osSyncPrintf(VT_FGCOL(RED));
+ osSyncPrintf("Skeleton_Info2_ct メモリアロケーションエラー\n"); // Skeleton_Info2_ct memory allocation error
+ osSyncPrintf(VT_RST);
+ }
+
+ if (animationSeg != NULL) {
+ SkelAnime_ChangeAnimationDefault(skelAnime, animationSeg);
+ }
+}
+
+void SkelAnime_InitSV(GlobalContext* globalCtx, SkelAnime* skelAnime, SkeletonHeader* skeletonHeaderSeg,
+ AnimationHeader* animationSeg, Vec3s* actorDrawTable, Vec3s* arg5, s32 limbCount) {
+ SkeletonHeader* skeletonHeader;
+
+ skeletonHeader = SEGMENTED_TO_VIRTUAL(skeletonHeaderSeg);
+ skelAnime->limbCount = skeletonHeader->limbCount + 1;
+ skelAnime->dListCount = skeletonHeader->dListCount;
+ skelAnime->skeleton = SEGMENTED_TO_VIRTUAL(skeletonHeader->skeletonSeg);
+
+ if (actorDrawTable == NULL) {
+ skelAnime->actorDrawTbl =
+ ZeldaArena_MallocDebug(skelAnime->limbCount * sizeof(*skelAnime->actorDrawTbl), "../z_skelanime.c", 3047);
+
+ skelAnime->unk_24 =
+ ZeldaArena_MallocDebug(skelAnime->limbCount * sizeof(*skelAnime->unk_24), "../z_skelanime.c", 3048);
+ } else {
+ if (limbCount != skelAnime->limbCount) {
+ __assert("joint_buff_num == this->joint_num", "../z_skelanime.c", 3052);
+ }
+ skelAnime->actorDrawTbl = actorDrawTable;
+ skelAnime->unk_24 = arg5;
+ }
+ if ((skelAnime->actorDrawTbl == NULL) || (skelAnime->unk_24 == NULL)) {
+ osSyncPrintf(VT_FGCOL(RED));
+ osSyncPrintf(
+ "Skeleton_Info_Rom_SV_ct メモリアロケーションエラー\n"); // Skeleton_Info_Rom_SV_ct Memory allocation error
+ osSyncPrintf(VT_RST);
+ }
+
+ if (animationSeg != NULL) {
+ SkelAnime_ChangeAnimationDefault(skelAnime, animationSeg);
+ }
+}
+
+void SkelAnime_InitSkin(GlobalContext* globalCtx, SkelAnime* skelAnime, SkeletonHeader* skeletonHeaderSeg,
+ AnimationHeader* animationSeg) {
+ SkeletonHeader* skeletonHeader;
+
+ skeletonHeader = SEGMENTED_TO_VIRTUAL(skeletonHeaderSeg);
+ skelAnime->limbCount = skeletonHeader->limbCount + 1;
+ skelAnime->skeleton = SEGMENTED_TO_VIRTUAL(skeletonHeader->skeletonSeg);
+ skelAnime->actorDrawTbl =
+ ZeldaArena_MallocDebug(skelAnime->limbCount * sizeof(*skelAnime->actorDrawTbl), "../z_skelanime.c", 3120);
+ skelAnime->unk_24 =
+ ZeldaArena_MallocDebug(skelAnime->limbCount * sizeof(*skelAnime->unk_24), "../z_skelanime.c", 3121);
+ if ((skelAnime->actorDrawTbl == NULL) || (skelAnime->unk_24 == NULL)) {
+ osSyncPrintf(VT_FGCOL(RED));
+ osSyncPrintf(
+ "Skeleton_Info2_skin2_ct メモリアロケーションエラー\n"); // Skeleton_Info2_skin2_ct Memory allocation error
+ osSyncPrintf(VT_RST);
+ }
+
+ if (animationSeg != NULL) {
+ SkelAnime_ChangeAnimationDefault(skelAnime, animationSeg);
+ }
+}
+
+void func_800A49B0(SkelAnime* skelAnime) {
+ if (skelAnime->unk_01 < 2) {
+ skelAnime->animUpdate = &func_800A4D9C;
+ } else if (skelAnime->unk_01 < 4) {
+ skelAnime->animUpdate = &func_800A4EE0;
+ } else {
+ skelAnime->animUpdate = &func_800A4E38;
+ }
+}
+
+s32 SkelAnime_FrameUpdateMatrix(SkelAnime* skelAnime) {
+ return skelAnime->animUpdate(skelAnime);
+}
+
+s32 func_800A4A20(SkelAnime* skelAnime) {
+ f32 prevUnk28;
+ f32 updateRate;
+
+ prevUnk28 = skelAnime->unk_28;
+ updateRate = R_UPDATE_RATE * 0.33333334f;
+ skelAnime->unk_28 -= skelAnime->unk_2C * updateRate;
+ if (skelAnime->unk_28 <= 0.0f) {
+ func_800A49B0(skelAnime);
+ skelAnime->unk_28 = 0.0f;
+ }
+ func_800A2E70(skelAnime->limbCount, skelAnime->actorDrawTbl, skelAnime->actorDrawTbl, skelAnime->unk_24,
+ 1.0f - (skelAnime->unk_28 / prevUnk28));
+ return 0;
+}
+
+#ifdef NON_MATCHING
+// small stack alloc
+s32 func_800A4AD8(SkelAnime* skelAnime) {
+ s16 temp_a1;
+ s16 temp_a2;
+ f32 sp28;
+ f32 phi_f2;
+ f32 updateRate;
+
+ temp_a2 = (s16)(skelAnime->unk_28 * 16384.0f);
+ updateRate = R_UPDATE_RATE * 0.33333334f;
+ skelAnime->unk_28 -= skelAnime->unk_2C * updateRate;
+ if (skelAnime->unk_28 <= 0.0f) {
+ func_800A49B0(skelAnime);
+ skelAnime->unk_28 = 0.0f;
+ }
+ temp_a1 = (s16)(skelAnime->unk_28 * 16384.0f);
+ if (skelAnime->unk_03 < 0) {
+ sp28 = 1.0f - Math_Coss(temp_a2);
+ phi_f2 = 1.0f - Math_Coss(temp_a1);
+ } else {
+ sp28 = Math_Sins(temp_a2);
+ phi_f2 = Math_Sins(temp_a1);
+ }
+ if (phi_f2 != 0.0f) {
+ phi_f2 /= sp28;
+ } else {
+ phi_f2 = 0.0f;
+ }
+ func_800A2E70(skelAnime->limbCount, skelAnime->actorDrawTbl, skelAnime->actorDrawTbl, skelAnime->unk_24,
+ 1.0f - phi_f2);
+ return 0;
+}
+#else
#pragma GLOBAL_ASM("asm/non_matchings/code/z_skelanime/func_800A4AD8.s")
-
+#endif
+
+#ifdef NON_MATCHING
+// regalloc
+void func_800A4C58(SkelAnime* skelAnime) {
+ char pad[6];
+ f32 temp_f0;
+ f32 temp_f10;
+ Vec3s sp38[97];
+ s32 temp_f8;
+ f32 temp_f2;
+
+ SkelAnime_AnimateFrame(skelAnime->animCurrentSeg, skelAnime->animCurrentFrame, skelAnime->limbCount,
+ skelAnime->actorDrawTbl);
+ if (skelAnime->unk_01) {
+ temp_f8 = (s32)skelAnime->animCurrentFrame;
+ temp_f10 = temp_f8;
+ temp_f8++;
+ temp_f2 = skelAnime->animCurrentFrame - temp_f10;
+ if (temp_f8 >= (s32)skelAnime->unk_14) {
+ temp_f8 = 0;
+ }
+ SkelAnime_AnimateFrame(skelAnime->animCurrentSeg, temp_f8, skelAnime->limbCount, sp38);
+ func_800A2E70(skelAnime->limbCount, skelAnime->actorDrawTbl, skelAnime->actorDrawTbl, sp38, temp_f2);
+ }
+ if (skelAnime->unk_28 != 0) {
+ skelAnime->unk_28 -= skelAnime->unk_2C * (R_UPDATE_RATE * 0.33333334f);
+ temp_f0 = skelAnime->unk_28;
+ if (temp_f0 <= 0.0f) {
+ skelAnime->unk_28 = 0.0f;
+ return;
+ }
+ func_800A2E70(skelAnime->limbCount, skelAnime->actorDrawTbl, skelAnime->actorDrawTbl, skelAnime->unk_24,
+ skelAnime->unk_28);
+ }
+}
+#else
#pragma GLOBAL_ASM("asm/non_matchings/code/z_skelanime/func_800A4C58.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_skelanime/func_800A4D9C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_skelanime/func_800A4E38.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_skelanime/func_800A4EE0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_skelanime/func_800A4FE4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_skelanime/SkelAnime_ChangeAnimation.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_skelanime/func_800A51E8.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_skelanime/func_800A5240.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_skelanime/func_800A529C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_skelanime/func_800A52F8.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_skelanime/func_800A534C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_skelanime/func_800A5384.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_skelanime/func_800A53DC.s")
-
+#endif
+
+s32 func_800A4D9C(SkelAnime* skelAnime) {
+ f32 updateRate = R_UPDATE_RATE * 0.33333334f;
+ skelAnime->animCurrentFrame += skelAnime->animPlaybackSpeed * updateRate;
+ if (skelAnime->animCurrentFrame < 0.0f) {
+ skelAnime->animCurrentFrame += skelAnime->unk_14;
+ } else if (skelAnime->unk_14 <= skelAnime->animCurrentFrame) {
+ skelAnime->animCurrentFrame -= skelAnime->unk_14;
+ }
+ func_800A4C58(skelAnime);
+ return 0;
+}
+
+s32 func_800A4E38(SkelAnime* skelAnime) {
+ f32 updateRate = R_UPDATE_RATE * 0.33333334f;
+ skelAnime->animCurrentFrame += skelAnime->animPlaybackSpeed * updateRate;
+ if (skelAnime->animCurrentFrame < skelAnime->unk_0C) {
+ skelAnime->animCurrentFrame = (skelAnime->animCurrentFrame - skelAnime->unk_0C) + skelAnime->animFrameCount;
+ } else if (skelAnime->animFrameCount <= skelAnime->animCurrentFrame) {
+ skelAnime->animCurrentFrame = (skelAnime->animCurrentFrame - skelAnime->animFrameCount) + skelAnime->unk_0C;
+ }
+
+ func_800A4C58(skelAnime);
+ return 0;
+}
+
+s32 func_800A4EE0(SkelAnime* skelAnime) {
+ f32 temp_f14;
+
+ temp_f14 = R_UPDATE_RATE * 0.33333334f;
+ if (skelAnime->animCurrentFrame == skelAnime->animFrameCount) {
+
+ SkelAnime_AnimateFrame(skelAnime->animCurrentSeg, (s32)skelAnime->animCurrentFrame, skelAnime->limbCount,
+ skelAnime->actorDrawTbl);
+ func_800A4C58(skelAnime);
+ return 1;
+ }
+ skelAnime->animCurrentFrame += skelAnime->animPlaybackSpeed * temp_f14;
+ if (0.0f < ((skelAnime->animCurrentFrame - skelAnime->animFrameCount) * skelAnime->animPlaybackSpeed)) {
+ skelAnime->animCurrentFrame = skelAnime->animFrameCount;
+ } else {
+ if (skelAnime->animCurrentFrame < 0.0f) {
+ skelAnime->animCurrentFrame += skelAnime->unk_14;
+ } else {
+ if (skelAnime->unk_14 <= skelAnime->animCurrentFrame) {
+ skelAnime->animCurrentFrame -= skelAnime->unk_14;
+ }
+ }
+ }
+ func_800A4C58(skelAnime);
+ return 0;
+}
+
+void SkelAnime_ChangeAnimationImpl(SkelAnime* skelAnime, AnimationHeader* animationSeg, f32 playbackSpeed, f32 frame,
+ f32 frameCount, u8 unk1, f32 transitionRate, s8 unk2) {
+ skelAnime->unk_01 = unk1;
+ if ((transitionRate != 0.0f) &&
+ ((animationSeg != skelAnime->animCurrentSeg) || (frame != skelAnime->animCurrentFrame))) {
+ if (transitionRate < 0) {
+ func_800A49B0(skelAnime);
+ SkelAnime_CopyVec3s(skelAnime, skelAnime->unk_24, skelAnime->actorDrawTbl);
+ transitionRate = -transitionRate;
+ } else {
+ if (unk2 != 0) {
+ skelAnime->animUpdate = &func_800A4AD8;
+ skelAnime->unk_03 = unk2;
+ } else {
+ skelAnime->animUpdate = &func_800A4A20;
+ }
+ SkelAnime_AnimateFrame(animationSeg, frame, skelAnime->limbCount, skelAnime->unk_24);
+ }
+ skelAnime->unk_28 = 1.0f;
+ skelAnime->unk_2C = 1.0f / transitionRate;
+ } else {
+ func_800A49B0(skelAnime);
+ SkelAnime_AnimateFrame(animationSeg, frame, skelAnime->limbCount, skelAnime->actorDrawTbl);
+ skelAnime->unk_28 = 0.0f;
+ }
+
+ skelAnime->animCurrentSeg = animationSeg;
+ skelAnime->unk_0C = frame;
+ skelAnime->animFrameCount = frameCount;
+ skelAnime->unk_14 = func_800A1FC8(&animationSeg->genericHeader);
+ if (skelAnime->unk_01 >= 4) {
+ skelAnime->animCurrentFrame = 0.0f;
+ } else {
+ skelAnime->animCurrentFrame = frame;
+ if (skelAnime->unk_01 < 2) {
+ skelAnime->animFrameCount = skelAnime->unk_14 - 1.0f;
+ }
+ }
+ skelAnime->animPlaybackSpeed = playbackSpeed;
+}
+
+void SkelAnime_ChangeAnimation(SkelAnime* skelAnime, AnimationHeader* animationSeg, f32 playbackSpeed, f32 frame,
+ f32 frameCount, u8 unk1, f32 transitionRate) {
+ SkelAnime_ChangeAnimationImpl(skelAnime, animationSeg, playbackSpeed, frame, frameCount, unk1, transitionRate, 0);
+}
+
+void func_800A51E8(SkelAnime* skelAnime, AnimationHeader* animationSeg) {
+ SkelAnime_ChangeAnimation(skelAnime, animationSeg, 1.0f, 0.0f,
+ SkelAnime_GetFrameCount(&animationSeg->genericHeader), 2, 0.0f);
+}
+
+void func_800A5240(SkelAnime* skelAnime, AnimationHeader* animationSeg, f32 transitionRate) {
+ SkelAnime_ChangeAnimation(skelAnime, animationSeg, 1.0f, 0, SkelAnime_GetFrameCount(&animationSeg->genericHeader),
+ 2, transitionRate);
+}
+
+void func_800A529C(SkelAnime* skelAnime, AnimationHeader* animationSeg, f32 playbackSpeed) {
+ SkelAnime_ChangeAnimation(skelAnime, animationSeg, playbackSpeed, 0.0f,
+ SkelAnime_GetFrameCount(&animationSeg->genericHeader), 2, 0.0f);
+}
+
+void SkelAnime_ChangeAnimationDefault(SkelAnime* skelAnime, AnimationHeader* animationSeg) {
+ SkelAnime_ChangeAnimation(skelAnime, animationSeg, 1.0f, 0.0f,
+ SkelAnime_GetFrameCount(&animationSeg->genericHeader), 0, 0.0f);
+}
+
+void SkelAnime_ChangeAnimationTransitionRate(SkelAnime* skelAnime, AnimationHeader* animationSeg, f32 transitionRate) {
+ SkelAnime_ChangeAnimation(skelAnime, animationSeg, 1.0f, 0.0f, 0.0f, 0, transitionRate);
+}
+
+void SkelAnime_ChangeAnimationPlaybackSpeed(SkelAnime* skelAnime, AnimationHeader* animationSeg, f32 playbackSpeed) {
+ SkelAnime_ChangeAnimation(skelAnime, animationSeg, playbackSpeed, 0.0f,
+ SkelAnime_GetFrameCount(&animationSeg->genericHeader), 0, 0.0f);
+}
+
+void func_800A53DC(SkelAnime* skelAnime) {
+ skelAnime->unk_01 = 2;
+ skelAnime->animFrameCount = skelAnime->unk_14;
+ func_800A49B0(skelAnime);
+}
+
+#ifdef NON_MATCHING
+// regalloc
+void func_800A5408(SkelAnime* skelAnime) {
+ f32 frameCount = skelAnime->animFrameCount;
+
+ skelAnime->animFrameCount = skelAnime->unk_0C;
+ skelAnime->animPlaybackSpeed = -skelAnime->animPlaybackSpeed;
+ skelAnime->unk_0C = frameCount;
+}
+#else
#pragma GLOBAL_ASM("asm/non_matchings/code/z_skelanime/func_800A5408.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_skelanime/func_800A5428.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_skelanime/func_800A5490.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_skelanime/func_800A54FC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_skelanime/func_800A56C8.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_skelanime/func_800A56F0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_skelanime/func_800A5774.s")
+#endif
+
+void func_800A5428(SkelAnime* skelAnime, Vec3s* dst, Vec3s* src, u8* index) {
+ s32 i;
+ for (i = 0; i < skelAnime->limbCount; i++, dst++, src++) {
+ if (*index++) {
+ *dst = *src;
+ }
+ }
+}
+
+void func_800A5490(SkelAnime* skelAnime, Vec3s* dst, Vec3s* src, u8* arg3) {
+ s32 i;
+ for (i = 0; i < skelAnime->limbCount; i++, dst++, src++) {
+ if (*arg3++ < 1U) {
+ *dst = *src;
+ }
+ }
+}
+
+void func_800A54FC(SkelAnime* skelAnime, Vec3f* pos, s16 angle) {
+ f32 x;
+ f32 z;
+ f32 sin;
+ f32 cos;
+
+ if (skelAnime->unk_35 & 0x10) {
+ pos->z = 0.0f;
+ pos->x = 0.0f;
+ } else {
+ x = skelAnime->actorDrawTbl->x;
+ z = skelAnime->actorDrawTbl->z;
+ sin = Math_Sins(angle);
+ cos = Math_Coss(angle);
+ pos->x = x * cos + z * sin;
+ pos->z = z * cos - x * sin;
+ x = skelAnime->unk_38;
+ z = skelAnime->unk_3C;
+ sin = Math_Sins(skelAnime->unk_36);
+ cos = Math_Coss(skelAnime->unk_36);
+ pos->x -= x * cos + z * sin;
+ pos->z -= z * cos - x * sin;
+ }
+
+ skelAnime->unk_36 = angle;
+ skelAnime->unk_38 = skelAnime->actorDrawTbl->x;
+ skelAnime->actorDrawTbl->x = skelAnime->unk_3E;
+ skelAnime->unk_3C = skelAnime->actorDrawTbl->z;
+ skelAnime->actorDrawTbl->z = skelAnime->unk_42;
+ if (skelAnime->unk_35 & 2) {
+ if (skelAnime->unk_35 & 0x10) {
+ pos->y = 0.0f;
+ } else {
+ pos->y = skelAnime->actorDrawTbl->y - skelAnime->unk_3A;
+ }
+ skelAnime->unk_3A = skelAnime->actorDrawTbl->y;
+ skelAnime->actorDrawTbl->y = skelAnime->unk_40;
+ } else {
+ pos->y = 0.0f;
+ skelAnime->unk_3A = skelAnime->actorDrawTbl->y;
+ }
+ skelAnime->unk_35 &= ~0x10;
+}
+
+s32 func_800A56C8(SkelAnime* skelAnime, f32 arg1) {
+ return func_800A4478(skelAnime, arg1, 1.0f);
+}
+
+void SkelAnime_Free(SkelAnime* skelAnime, GlobalContext* globalCtx) {
+ if (skelAnime->actorDrawTbl != NULL) {
+ ZeldaArena_FreeDebug(skelAnime->actorDrawTbl, "../z_skelanime.c", 3729);
+ } else {
+ osSyncPrintf("now_joint あきまへん!!\n"); // now_joint Akimane! !
+ }
+
+ if (skelAnime->unk_24 != NULL) {
+ ZeldaArena_FreeDebug(skelAnime->unk_24, "../z_skelanime.c", 3731);
+ } else {
+ osSyncPrintf("morf_joint あきまへん!!\n"); // "morf_joint Akimane !!"
+ }
+}
+
+void SkelAnime_CopyVec3s(SkelAnime* skelAnime, Vec3s* dst, Vec3s* src) {
+ s32 i;
+ for (i = 0; i < skelAnime->limbCount; i++) {
+ *dst++ = *src++;
+ }
+}