From 82184c5d9fbb85ef28d68b666dcb22af5330deb9 Mon Sep 17 00:00:00 2001 From: Ryan Dwyer Date: Tue, 1 Jun 2021 23:41:17 +1000 Subject: [PATCH] Attempt to decompile currentPlayerExecutePreparedWarp --- src/game/bondeyespy.c | 4 +- src/game/chr/chraicommands.c | 8 +-- src/game/game_097ba0.c | 8 +-- src/game/game_0b69d0.c | 114 ++++++++++++++++++++++++++++----- src/game/lv.c | 6 +- src/game/prop.c | 6 +- src/game/propobj.c | 4 +- src/include/game/game_0b69d0.h | 12 ++-- src/include/types.h | 7 ++ 9 files changed, 129 insertions(+), 40 deletions(-) diff --git a/src/game/bondeyespy.c b/src/game/bondeyespy.c index 0dc64437f..e21af9f3d 100644 --- a/src/game/bondeyespy.c +++ b/src/game/bondeyespy.c @@ -630,7 +630,7 @@ bool eyespyTryLaunch(void) g_Vars.currentplayer->eyespy->vels[1] = 0; g_Vars.currentplayer->eyespy->pitch = 0; - func0f0c1e54(g_Vars.currentplayer->prop, 0); + currentPlayerSetPerimEnabled(g_Vars.currentplayer->prop, false); if (insafe || !cdTestAToB4(&testfrompos, g_Vars.currentplayer->prop->rooms, &g_Vars.currentplayer->eyespy->prop->pos, CDTYPE_ALL, 15)) { @@ -667,7 +667,7 @@ bool eyespyTryLaunch(void) #endif } - func0f0c1e54(g_Vars.currentplayer->prop, true); + currentPlayerSetPerimEnabled(g_Vars.currentplayer->prop, true); func0f065c44(g_Vars.currentplayer->eyespy->prop); func0f065e74(&g_Vars.currentplayer->prop->pos, g_Vars.currentplayer->prop->rooms, &g_Vars.currentplayer->eyespy->prop->pos, g_Vars.currentplayer->eyespy->prop->rooms); diff --git a/src/game/chr/chraicommands.c b/src/game/chr/chraicommands.c index 23b912cba..876dfe4ae 100644 --- a/src/game/chr/chraicommands.c +++ b/src/game/chr/chraicommands.c @@ -5282,7 +5282,7 @@ bool aiWarpJoToPad(void) { u8 *cmd = g_Vars.ailist + g_Vars.aioffset; u16 pad_id = cmd[3] | (cmd[2] << 8); - warpBondToPad(pad_id); + currentPlayerPrepareWarpToPad(pad_id); g_Vars.aioffset += 4; @@ -5541,8 +5541,8 @@ bool ai00df(void) s32 cmdindex = tagGetCommandIndex(tag); if (cmdindex >= 0) { - u32 *ptr = setupGetPtrToCommandByIndex(cmdindex + tag->cmdoffset); - func0f0b9bac(ptr, cmd[4] | (cmd[3] << 8), cmd[6] | (cmd[5] << 8)); + void *ptr = setupGetPtrToCommandByIndex(cmdindex + tag->cmdoffset); + currentPlayerPrepareWarpType2(ptr, cmd[4] | (cmd[3] << 8), cmd[6] | (cmd[5] << 8)); } } @@ -6018,7 +6018,7 @@ bool ai00f4(void) s16 e = cmd[11] | (cmd[10] << 8); s32 f = cmd[13] | (cmd[12] << 8); - func0f0b9c1c(f * M_BADTAU / 65536, c * M_BADTAU / 65536, a, b, e, d); + currentPlayerPrepareWarpType3(f * M_BADTAU / 65536, c * M_BADTAU / 65536, a, b, e, d); g_Vars.aioffset += 14; diff --git a/src/game/game_097ba0.c b/src/game/game_097ba0.c index 2bca54d1a..1ec473f19 100644 --- a/src/game/game_097ba0.c +++ b/src/game/game_097ba0.c @@ -11420,7 +11420,7 @@ glabel var7f1ac72c /* f09f25c: 0c00567f */ jal func000159fc /* f09f260: e7a001c8 */ swc1 $f0,0x1c8($sp) /* f09f264: 8fa401d8 */ lw $a0,0x1d8($sp) -/* f09f268: 0fc30795 */ jal func0f0c1e54 +/* f09f268: 0fc30795 */ jal currentPlayerSetPerimEnabled /* f09f26c: 00002825 */ or $a1,$zero,$zero /* f09f270: 8fa201d8 */ lw $v0,0x1d8($sp) /* f09f274: 240a003f */ addiu $t2,$zero,0x3f @@ -11452,7 +11452,7 @@ glabel var7f1ac72c /* f09f2d8: e7a80178 */ swc1 $f8,0x178($sp) .L0f09f2dc: /* f09f2dc: 8fa401d8 */ lw $a0,0x1d8($sp) -/* f09f2e0: 0fc30795 */ jal func0f0c1e54 +/* f09f2e0: 0fc30795 */ jal currentPlayerSetPerimEnabled /* f09f2e4: 24050001 */ addiu $a1,$zero,0x1 /* f09f2e8: 27a401e8 */ addiu $a0,$sp,0x1e8 /* f09f2ec: 27a501dc */ addiu $a1,$sp,0x1dc @@ -11936,7 +11936,7 @@ glabel var7f1ac72c /* f09f25c: 0c00567f */ jal func000159fc /* f09f260: e7a001c8 */ swc1 $f0,0x1c8($sp) /* f09f264: 8fa401d8 */ lw $a0,0x1d8($sp) -/* f09f268: 0fc30795 */ jal func0f0c1e54 +/* f09f268: 0fc30795 */ jal currentPlayerSetPerimEnabled /* f09f26c: 00002825 */ or $a1,$zero,$zero /* f09f270: 8fa201d8 */ lw $v0,0x1d8($sp) /* f09f274: 240a003f */ addiu $t2,$zero,0x3f @@ -11968,7 +11968,7 @@ glabel var7f1ac72c /* f09f2d8: e7a80178 */ swc1 $f8,0x178($sp) .L0f09f2dc: /* f09f2dc: 8fa401d8 */ lw $a0,0x1d8($sp) -/* f09f2e0: 0fc30795 */ jal func0f0c1e54 +/* f09f2e0: 0fc30795 */ jal currentPlayerSetPerimEnabled /* f09f2e4: 24050001 */ addiu $a1,$zero,0x1 /* f09f2e8: 27a401e8 */ addiu $a0,$sp,0x1e8 /* f09f2ec: 27a501dc */ addiu $a1,$sp,0x1dc diff --git a/src/game/game_0b69d0.c b/src/game/game_0b69d0.c index 6a6ffb225..338944752 100644 --- a/src/game/game_0b69d0.c +++ b/src/game/game_0b69d0.c @@ -83,14 +83,14 @@ f32 var8009dddc; f32 var8009dde0; f32 var8009dde4; s16 g_WarpPadId; -u32 *var8009ddec; +struct var8009ddec *var8009ddec; f32 var8009ddf0; f32 var8009ddf4; f32 var8009ddf8; f32 var8009ddfc; f32 var8009de00; u32 var8009de04; -u32 var8009de08; +s32 var8009de08; u32 var8009de0c; s32 g_CutsceneCurAnimFrame60; @@ -3317,7 +3317,7 @@ void func0f0b9afc(void) } } -void warpBondToPad(s16 pad) +void currentPlayerPrepareWarpToPad(s16 pad) { setTickMode(TICKMODE_WARP); var80070744 = 0; @@ -3326,7 +3326,7 @@ void warpBondToPad(s16 pad) g_WarpPadId = pad; } -void func0f0b9bac(u32 *cmd, s32 arg1, s32 arg2) +void currentPlayerPrepareWarpType2(struct var8009ddec *cmd, s32 arg1, s32 arg2) { setTickMode(TICKMODE_WARP); var80070744 = 0; @@ -3338,7 +3338,7 @@ void func0f0b9bac(u32 *cmd, s32 arg1, s32 arg2) var8009de0c = arg2; } -void func0f0b9c1c(f32 arg0, f32 arg1, f32 arg2, f32 arg3, f32 arg4, s32 arg5) +void currentPlayerPrepareWarpType3(f32 arg0, f32 arg1, f32 arg2, f32 arg3, f32 arg4, s32 arg5) { setTickMode(TICKMODE_WARP); var80070744 = 0; @@ -3355,7 +3355,7 @@ void func0f0b9c1c(f32 arg0, f32 arg1, f32 arg2, f32 arg3, f32 arg4, s32 arg5) } GLOBAL_ASM( -glabel func0f0b9cbc +glabel currentPlayerExecutePreparedWarp .late_rodata glabel var7f1ad5cc .word 0x40c907a9 @@ -3582,6 +3582,88 @@ glabel var7f1ad5cc /* f0ba00c: 00000000 */ nop ); +// Mismatch: Can't match the last section's pos +//void currentPlayerExecutePreparedWarp(void) +//{ +// struct pad pad; // 64 +// struct coord pos = {0, 0, 0}; // 58 +// struct coord look = {0, 0, 1}; // 4c +// struct coord up = {0, 1, 0}; // 40 +// s32 room; // 3c +// struct coord memcampos; // 30 +// +// currentPlayerSetCameraMode(CAMERAMODE_THIRDPERSON); +// +// // d4c +// if (g_WarpPadId >= 0) { +// // Used by device and holo training to warp player back to room +// padUnpack(g_WarpPadId, PADFIELD_POS | PADFIELD_ROOM, &pad); +// +// pos.x = pad.pos.x; +// pos.y = pad.pos.y; +// pos.z = pad.pos.z; +// +// memcampos.x = pad.pos.x; +// memcampos.y = pad.pos.y; +// memcampos.z = pad.pos.z; +// +// room = pad.room; +// } else /*d98*/ if (var8009ddec) { +// // Used by AI command 00df, but that command is not used +// pos.x = var8009ddec->pos.x; +// pos.y = var8009ddec->pos.y; +// pos.z = var8009ddec->pos.z; +// +// padUnpack(var8009ddec->pad, PADFIELD_POS | PADFIELD_ROOM, &pad); +// +// room = pad.room; +// +// memcampos.x = pad.pos.x; +// memcampos.y = pad.pos.y; +// memcampos.z = pad.pos.z; +// +// if (var8009de08 != 1) { +// look.x = cosf(var8009ddec->look[1]) * sinf(var8009ddec->look[0]); +// look.y = sinf(var8009ddec->look[1]); +// look.z = cosf(var8009ddec->look[1]) * cosf(var8009ddec->look[0]); +// } +// } else { +// // e5c +// // Used by AI command 00f4, but that command is not used +// padUnpack(var8009de04, PADFIELD_POS | PADFIELD_ROOM, &pad); +// +// room = pad.room; +// +// memcampos.f[0] = pad.pos.f[0]; +// memcampos.f[1] = pad.pos.f[1]; +// memcampos.f[2] = pad.pos.f[2]; +// +// pos.f[0] = sinf(var8009ddf0); cosf(var8009ddf0); +// pos.f[0] = pos.f[0] * var8009ddf8 + memcampos.f[0]; +// pos.f[1] = memcampos.f[1] + var8009de00 + var8009ddfc; +// pos.f[2] = cosf(var8009ddf0); sinf(var8009ddf0); +// pos.f[2] = pos.f[2] * var8009ddf8 + memcampos.f[2]; +// +// cosf(var8009ddf0); +// look.x = memcampos.f[0] - pos.f[0]; +// look.y = memcampos.f[1] + var8009de00 - pos.f[1]; +// sinf(var8009ddf0); +// look.z = memcampos.f[2] - pos.f[2]; +// +// var8009ddf0 += var8009ddf4 * g_Vars.lvupdate240freal; +// +// while (var8009ddf0 >= M_BADTAU) { +// var8009ddf0 -= M_BADTAU; +// } +// +// while (var8009ddf0 < 0) { +// var8009ddf0 += M_BADTAU; +// } +// } +// +// func0f0c1ba4(&pos, &up, &look, &memcampos, room); +//} + void func0f0ba010(void) { setTickMode(TICKMODE_CUTSCENE); @@ -5878,7 +5960,7 @@ glabel var7f1ad6ac /* f0be77c: 24070001 */ li $a3,0x1 /* f0be780: 0fc3307a */ jal bmoveTick /* f0be784: a438e358 */ sh $t8,-0x1ca8($at) -/* f0be788: 0fc2e877 */ jal func0f0b9cbc +/* f0be788: 0fc2e877 */ jal currentPlayerExecutePreparedWarp /* f0be78c: 00000000 */ nop /* f0be790: 100005c3 */ b .PF0f0bfea0 /* f0be794: 8e700284 */ lw $s0,0x284($s3) @@ -7196,7 +7278,7 @@ glabel var7f1ad6ac /* f0bfaf0: 00003025 */ move $a2,$zero /* f0bfaf4: 0fc3307a */ jal bmoveTick /* f0bfaf8: 24070001 */ li $a3,0x1 -/* f0bfafc: 0fc2e877 */ jal func0f0b9cbc +/* f0bfafc: 0fc2e877 */ jal currentPlayerExecutePreparedWarp /* f0bfb00: 00000000 */ nop /* f0bfb04: 100000e6 */ b .PF0f0bfea0 /* f0bfb08: 8e700284 */ lw $s0,0x284($s3) @@ -8279,7 +8361,7 @@ glabel var7f1ad6ac /* f0be210: 24070001 */ addiu $a3,$zero,0x1 /* f0be214: 0fc32f16 */ jal bmoveTick /* f0be218: a439dde8 */ sh $t9,%lo(g_WarpPadId)($at) -/* f0be21c: 0fc2e72f */ jal func0f0b9cbc +/* f0be21c: 0fc2e72f */ jal currentPlayerExecutePreparedWarp /* f0be220: 00000000 */ nop /* f0be224: 100005c3 */ b .L0f0bf934 /* f0be228: 8e700284 */ lw $s0,0x284($s3) @@ -9597,7 +9679,7 @@ glabel var7f1ad6ac /* f0bf584: 00003025 */ or $a2,$zero,$zero /* f0bf588: 0fc32f16 */ jal bmoveTick /* f0bf58c: 24070001 */ addiu $a3,$zero,0x1 -/* f0bf590: 0fc2e72f */ jal func0f0b9cbc +/* f0bf590: 0fc2e72f */ jal currentPlayerExecutePreparedWarp /* f0bf594: 00000000 */ nop /* f0bf598: 100000e6 */ b .L0f0bf934 /* f0bf59c: 8e700284 */ lw $s0,0x284($s3) @@ -10639,7 +10721,7 @@ glabel var7f1ad6ac /* f0bbde8: 24070001 */ addiu $a3,$zero,0x1 /* f0bbdec: 0fc32522 */ jal bmoveTick /* f0bbdf0: a42e25c8 */ sh $t6,0x25c8($at) -/* f0bbdf4: 0fc2de66 */ jal func0f0b9cbc +/* f0bbdf4: 0fc2de66 */ jal currentPlayerExecutePreparedWarp /* f0bbdf8: 00000000 */ sll $zero,$zero,0x0 /* f0bbdfc: 100005c1 */ beqz $zero,.NB0f0bd504 /* f0bbe00: 00000000 */ sll $zero,$zero,0x0 @@ -11953,7 +12035,7 @@ glabel var7f1ad6ac /* f0bd154: 00003025 */ or $a2,$zero,$zero /* f0bd158: 0fc32522 */ jal bmoveTick /* f0bd15c: 24070001 */ addiu $a3,$zero,0x1 -/* f0bd160: 0fc2de66 */ jal func0f0b9cbc +/* f0bd160: 0fc2de66 */ jal currentPlayerExecutePreparedWarp /* f0bd164: 00000000 */ sll $zero,$zero,0x0 /* f0bd168: 100000e6 */ beqz $zero,.NB0f0bd504 /* f0bd16c: 00000000 */ sll $zero,$zero,0x0 @@ -12600,7 +12682,7 @@ glabel var7f1ad6ac // func0f0b8ba0(); // g_WarpPadId = g_Vars.currentplayer->teleportcamerapad; // bmoveTick(0, 0, 0, 1); -// func0f0b9cbc(); +// currentPlayerExecutePreparedWarp(); // } else { // // e230 // if (g_Vars.currentplayer->visionmode == VISIONMODE_SLAYERROCKET) { @@ -13187,7 +13269,7 @@ glabel var7f1ad6ac // } else if (g_Vars.tickmode == TICKMODE_WARP) { // func0f0b8ba0(); // bmoveTick(0, 0, 0, 1); -// func0f0b9cbc(); +// currentPlayerExecutePreparedWarp(); // } else if (g_Vars.tickmode == TICKMODE_AUTOWALK) { // struct pad pad; // f32 sp216; @@ -14121,7 +14203,7 @@ Gfx *currentPlayerRenderShield(Gfx *gdl) return gdl; } -Gfx *func0f0c07c8(Gfx *gdl) +Gfx *currentPlayerRenderHud(Gfx *gdl) { if (g_Vars.currentplayer->cameramode == CAMERAMODE_THIRDPERSON) { gdl = func0f0aeed8(gdl); @@ -15160,7 +15242,7 @@ void allPlayersClearMemCamRoom(void) setCurrentPlayerNum(prevplayernum); } -void func0f0c1e54(struct prop *prop, bool enable) +void currentPlayerSetPerimEnabled(struct prop *prop, bool enable) { u32 playernum = propGetPlayerNum(prop); diff --git a/src/game/lv.c b/src/game/lv.c index 6b01cd985..e649429b3 100644 --- a/src/game/lv.c +++ b/src/game/lv.c @@ -2868,7 +2868,7 @@ glabel var7f1b8e7cpf /* f16b2f4: 24010002 */ li $at,0x2 /* f16b2f8: 17210005 */ bne $t9,$at,.PF0f16b310 /* f16b2fc: 00000000 */ nop -/* f16b300: 0fc3034d */ jal func0f0c07c8 +/* f16b300: 0fc3034d */ jal currentPlayerRenderHud /* f16b304: 02602025 */ move $a0,$s3 /* f16b308: 1000000b */ b .PF0f16b338 /* f16b30c: 00409825 */ move $s3,$v0 @@ -4010,7 +4010,7 @@ Gfx *lvRender(Gfx *gdl) } if (var80075d60 == 2) { - gdl = func0f0c07c8(gdl); + gdl = currentPlayerRenderHud(gdl); } else { gdl = func0f0aeed8(gdl); @@ -5458,7 +5458,7 @@ glabel var7f1b1fd4nb /* f16500c: 24010002 */ addiu $at,$zero,0x2 /* f165010: 15e10007 */ bne $t7,$at,.NB0f165030 /* f165014: 00000000 */ sll $zero,$zero,0x0 -/* f165018: 0fc2f8ed */ jal func0f0c07c8 +/* f165018: 0fc2f8ed */ jal currentPlayerRenderHud /* f16501c: 02602025 */ or $a0,$s3,$zero /* f165020: 0fc58d05 */ jal func7f163414nb /* f165024: 00402025 */ or $a0,$v0,$zero diff --git a/src/game/prop.c b/src/game/prop.c index bf36e2871..c4f2e5046 100644 --- a/src/game/prop.c +++ b/src/game/prop.c @@ -6633,7 +6633,7 @@ void propSetCollisionsEnabled(struct prop *prop, s32 enable) if (prop->type == PROPTYPE_CHR) { chrSetOrUnsetHiddenFlag00000100(prop->chr, enable); } else if (prop->type == PROPTYPE_PLAYER) { - func0f0c1e54(prop, enable); + currentPlayerSetPerimEnabled(prop, enable); } else if (prop->type == PROPTYPE_OBJ || prop->type == PROPTYPE_DOOR || prop->type == PROPTYPE_WEAPON) { propObjSetOrUnsetHiddenFlag00400000(prop, enable); } @@ -6984,7 +6984,7 @@ f32 func0f06438c(struct prop *prop, struct coord *arg1, f32 *arg2, f32 *arg3, f3 if (sp4c) { playerprop = g_Vars.currentplayer->prop; - func0f0c1e54(playerprop, false); + currentPlayerSetPerimEnabled(playerprop, false); if (arg5) { lVar3 = func0002db98(&playerprop->pos, playerprop->rooms, &prop->pos, 0x32, 16); @@ -7025,7 +7025,7 @@ f32 func0f06438c(struct prop *prop, struct coord *arg1, f32 *arg2, f32 *arg3, f3 } } - func0f0c1e54(playerprop, true); + currentPlayerSetPerimEnabled(playerprop, true); } } diff --git a/src/game/propobj.c b/src/game/propobj.c index f1462d7b0..265a39a49 100644 --- a/src/game/propobj.c +++ b/src/game/propobj.c @@ -33412,13 +33412,13 @@ void cctvTick(struct prop *camprop) // Check line of sight if (canseeplayer) { - func0f0c1e54(playerprop, false); + currentPlayerSetPerimEnabled(playerprop, false); if (!hasLineOfSight(&camprop->pos, camprop->rooms, &playerprop->pos, playerprop->rooms, 315, 8)) { canseeplayer = false; } - func0f0c1e54(playerprop, true); + currentPlayerSetPerimEnabled(playerprop, true); } if (canseeplayer) { diff --git a/src/include/game/game_0b69d0.h b/src/include/game/game_0b69d0.h index 9e78ac0fc..1affd948c 100644 --- a/src/include/game/game_0b69d0.h +++ b/src/include/game/game_0b69d0.h @@ -16,7 +16,7 @@ void currentPlayerChooseBodyAndHead(s32 *bodynum, s32 *headnum, s32 *arg2); void func0f0b8ba0(void); void func0f0b9538(void); void func0f0b96e8(void); -void func0f0b9cbc(void); +void currentPlayerExecutePreparedWarp(void); void cameraDoAnimation(s16 anim_id); void func0f0ba190(u32 arg0); void func0f0ba29c(bool arg0); @@ -58,7 +58,7 @@ void func0f0bfc7c(struct coord *cam_pos, struct coord *cam_look, struct coord *c Gfx *currentPlayerUpdateShootRot(Gfx *gdl); void currentPlayerDisplayShield(void); Gfx *currentPlayerRenderShield(Gfx *gdl); -Gfx *func0f0c07c8(Gfx *gdl); +Gfx *currentPlayerRenderHud(Gfx *gdl); void currentPlayerDie(bool force); void currentPlayerDieByShooter(u32 shooter, bool force); void currentPlayerCheckIfShotInBack(s32 attackerplayernum, f32 x, f32 z); @@ -67,7 +67,7 @@ void func0f0c1840(struct coord *pos, struct coord *up, struct coord *look, struc void func0f0c1ba4(struct coord *pos, struct coord *up, struct coord *look, struct coord *memcampos, s32 memcamroom); void func0f0c1bd8(struct coord *pos, struct coord *up, struct coord *look); void allPlayersClearMemCamRoom(void); -void func0f0c1e54(struct prop *prop, bool enable); +void currentPlayerSetPerimEnabled(struct prop *prop, bool enable); bool playerUpdateGeometry(struct prop *prop, u8 **start, u8 **end); void currentPlayerUpdatePerimInfo(void); void propPlayerGetBbox(struct prop *prop, f32 *width, f32 *ymax, f32 *ymin); @@ -86,9 +86,9 @@ void func0f0b9650(void); void func0f0b9674(void); void func0f0b9a20(void); void func0f0b9afc(void); -void warpBondToPad(s16 pad_id); -void func0f0b9bac(u32 *cmd, s32 arg1, s32 arg2); -void func0f0b9c1c(f32 arg0, f32 arg1, f32 arg2, f32 arg3, f32 arg4, s32 arg5); +void currentPlayerPrepareWarpToPad(s16 pad_id); +void currentPlayerPrepareWarpType2(struct var8009ddec *cmd, s32 arg1, s32 arg2); +void currentPlayerPrepareWarpType3(f32 arg0, f32 arg1, f32 arg2, f32 arg3, f32 arg4, s32 arg5); void func0f0ba010(void); void currentPlayerSetFadeColour(s32 r, s32 g, s32 b, f32 a); void currentPlayerAdjustFade(f32 maxfadetime, s32 r, s32 g, s32 b, f32 frac); diff --git a/src/include/types.h b/src/include/types.h index 0f29c3552..21be8f336 100644 --- a/src/include/types.h +++ b/src/include/types.h @@ -7012,4 +7012,11 @@ struct rdptask { u32 unk5c; }; +struct var8009ddec { + /*0x00*/ u32 unk00; + /*0x04*/ struct coord pos; + /*0x10*/ f32 look[2]; + /*0x18*/ s32 pad; +}; + #endif