From 09ef65b4d5fab2ec64782cc5121c6925383da1e5 Mon Sep 17 00:00:00 2001 From: Ryan Dwyer Date: Sun, 22 Nov 2020 18:53:54 +1000 Subject: [PATCH] Decompile func0f11505c --- src/game/padhalllv.c | 159 ++++++++-------------------- src/include/game/data/data_01a3a0.h | 2 +- src/include/lib/lib_12dc0.h | 2 +- src/include/lib/lib_4ae00.h | 2 +- 4 files changed, 50 insertions(+), 115 deletions(-) diff --git a/src/game/padhalllv.c b/src/game/padhalllv.c index cf9a30c87..5eb913af3 100644 --- a/src/game/padhalllv.c +++ b/src/game/padhalllv.c @@ -20,7 +20,7 @@ const char var7f1b3a80[] = "padhalllv.c"; -s32 g_WaypointHashes[2] = {0}; +u32 g_WaypointHashes[2] = {0}; void waypointSetHashThing(s32 hash1, s32 hash2) { @@ -815,117 +815,52 @@ s32 func0f114f70(struct waypoint *from, struct waypoint *to, struct waypoint **a return arrptr - arr; } -GLOBAL_ASM( -glabel func0f11505c -/* f11505c: 27bdff88 */ addiu $sp,$sp,-120 -/* f115060: afbf003c */ sw $ra,0x3c($sp) -/* f115064: afbe0038 */ sw $s8,0x38($sp) -/* f115068: afb70034 */ sw $s7,0x34($sp) -/* f11506c: afb60030 */ sw $s6,0x30($sp) -/* f115070: afb5002c */ sw $s5,0x2c($sp) -/* f115074: afb40028 */ sw $s4,0x28($sp) -/* f115078: afb30024 */ sw $s3,0x24($sp) -/* f11507c: afb20020 */ sw $s2,0x20($sp) -/* f115080: afb1001c */ sw $s1,0x1c($sp) -/* f115084: afb00018 */ sw $s0,0x18($sp) -/* f115088: 8c8e0004 */ lw $t6,0x4($a0) -/* f11508c: 3c02800a */ lui $v0,%hi(g_StageSetup) -/* f115090: 2442d030 */ addiu $v0,$v0,%lo(g_StageSetup) -/* f115094: 8c530000 */ lw $s3,0x0($v0) -/* f115098: 8c540004 */ lw $s4,0x4($v0) -/* f11509c: afae006c */ sw $t6,0x6c($sp) -/* f1150a0: ace00000 */ sw $zero,0x0($a3) -/* f1150a4: acc00000 */ sw $zero,0x0($a2) -/* f1150a8: 8faf006c */ lw $t7,0x6c($sp) -/* f1150ac: 00e0a825 */ or $s5,$a3,$zero -/* f1150b0: 00c0b025 */ or $s6,$a2,$zero -/* f1150b4: 8de30000 */ lw $v1,0x0($t7) -/* f1150b8: 00a0b825 */ or $s7,$a1,$zero -/* f1150bc: 3c118007 */ lui $s1,%hi(g_WaypointHashes) -/* f1150c0: 0460003e */ bltz $v1,.L0f1151bc -/* f1150c4: 241e000c */ addiu $s8,$zero,0xc -/* f1150c8: 26315ca0 */ addiu $s1,$s1,%lo(g_WaypointHashes) -/* f1150cc: 0003c100 */ sll $t8,$v1,0x4 -.L0f1150d0: -/* f1150d0: 03139021 */ addu $s2,$t8,$s3 -/* f1150d4: 8e500004 */ lw $s0,0x4($s2) -/* f1150d8: 8e020000 */ lw $v0,0x0($s0) -/* f1150dc: 04400031 */ bltz $v0,.L0f1151a4 -/* f1150e0: 30598000 */ andi $t9,$v0,0x8000 -.L0f1150e4: -/* f1150e4: 1720002b */ bnez $t9,.L0f115194 -/* f1150e8: 30483fff */ andi $t0,$v0,0x3fff -/* f1150ec: 00084900 */ sll $t1,$t0,0x4 -/* f1150f0: 01331821 */ addu $v1,$t1,$s3 -/* f1150f4: 8c6a0008 */ lw $t2,0x8($v1) -/* f1150f8: 3c0d800a */ lui $t5,%hi(g_Vars+0x330) -/* f1150fc: 015e0019 */ multu $t2,$s8 -/* f115100: 00005812 */ mflo $t3 -/* f115104: 01746021 */ addu $t4,$t3,$s4 -/* f115108: 56ec0023 */ bnel $s7,$t4,.L0f115198 -/* f11510c: 8e020004 */ lw $v0,0x4($s0) -/* f115110: aed20000 */ sw $s2,0x0($s6) -/* f115114: aea30000 */ sw $v1,0x0($s5) -/* f115118: 8dada2f0 */ lw $t5,%lo(g_Vars+0x330)($t5) -/* f11511c: 24040000 */ addiu $a0,$zero,0x0 -/* f115120: 24060000 */ addiu $a2,$zero,0x0 -/* f115124: 11a0001f */ beqz $t5,.L0f1151a4 -/* f115128: 24070020 */ addiu $a3,$zero,0x20 -/* f11512c: 8e220000 */ lw $v0,0x0($s1) -/* f115130: 1440000b */ bnez $v0,.L0f115160 -/* f115134: 00000000 */ nop -/* f115138: 8e2e0004 */ lw $t6,0x4($s1) -/* f11513c: 15c00008 */ bnez $t6,.L0f115160 -/* f115140: 00000000 */ nop -/* f115144: 0c004b70 */ jal random -/* f115148: 00000000 */ nop -/* f11514c: 304f0001 */ andi $t7,$v0,0x1 -/* f115150: 55e00011 */ bnezl $t7,.L0f115198 -/* f115154: 8e020004 */ lw $v0,0x4($s0) -/* f115158: 10000013 */ b .L0f1151a8 -/* f11515c: 8fac006c */ lw $t4,0x6c($sp) -.L0f115160: -/* f115160: 0c012ba9 */ jal func0004aea4 -/* f115164: 00402825 */ or $a1,$v0,$zero -/* f115168: 8e380004 */ lw $t8,0x4($s1) -/* f11516c: 24080000 */ addiu $t0,$zero,0x0 -/* f115170: 01025025 */ or $t2,$t0,$v0 -/* f115174: 03035825 */ or $t3,$t8,$v1 -/* f115178: afab0054 */ sw $t3,0x54($sp) -/* f11517c: afaa0050 */ sw $t2,0x50($sp) -/* f115180: 0c004b87 */ jal func00012e1c -/* f115184: 27a40050 */ addiu $a0,$sp,0x50 -/* f115188: 30590001 */ andi $t9,$v0,0x1 -/* f11518c: 53200006 */ beqzl $t9,.L0f1151a8 -/* f115190: 8fac006c */ lw $t4,0x6c($sp) -.L0f115194: -/* f115194: 8e020004 */ lw $v0,0x4($s0) -.L0f115198: -/* f115198: 26100004 */ addiu $s0,$s0,0x4 -/* f11519c: 0443ffd1 */ bgezl $v0,.L0f1150e4 -/* f1151a0: 30598000 */ andi $t9,$v0,0x8000 -.L0f1151a4: -/* f1151a4: 8fac006c */ lw $t4,0x6c($sp) -.L0f1151a8: -/* f1151a8: 258d0004 */ addiu $t5,$t4,0x4 -/* f1151ac: afad006c */ sw $t5,0x6c($sp) -/* f1151b0: 8da30000 */ lw $v1,0x0($t5) -/* f1151b4: 0463ffc6 */ bgezl $v1,.L0f1150d0 -/* f1151b8: 0003c100 */ sll $t8,$v1,0x4 -.L0f1151bc: -/* f1151bc: 8fbf003c */ lw $ra,0x3c($sp) -/* f1151c0: 8fb00018 */ lw $s0,0x18($sp) -/* f1151c4: 8fb1001c */ lw $s1,0x1c($sp) -/* f1151c8: 8fb20020 */ lw $s2,0x20($sp) -/* f1151cc: 8fb30024 */ lw $s3,0x24($sp) -/* f1151d0: 8fb40028 */ lw $s4,0x28($sp) -/* f1151d4: 8fb5002c */ lw $s5,0x2c($sp) -/* f1151d8: 8fb60030 */ lw $s6,0x30($sp) -/* f1151dc: 8fb70034 */ lw $s7,0x34($sp) -/* f1151e0: 8fbe0038 */ lw $s8,0x38($sp) -/* f1151e4: 03e00008 */ jr $ra -/* f1151e8: 27bd0078 */ addiu $sp,$sp,0x78 -); +void func0f11505c(struct waygroup *groupa, struct waygroup *groupb, struct waypoint **pointa, struct waypoint **pointb) +{ + struct waypoint *points = g_StageSetup.waypoints; + struct waygroup *groups = g_StageSetup.waygroups; + s32 *groupapointnums = groupa->waypoints; + s32 stack; + + *pointb = NULL; + *pointa = NULL; + + while (*groupapointnums >= 0) { + struct waypoint *groupapoint = &points[*groupapointnums]; + s32 *neighbournums = groupapoint->neighbours; + + while (*neighbournums >= 0) { + if ((*neighbournums & 0x8000) == 0) { + struct waypoint *neighbour = &points[*neighbournums & 0x3fff]; + + if (groupb == &groups[neighbour->groupnum]) { + *pointa = groupapoint; + *pointb = neighbour; + + if (g_Vars.unk000330 == 0) { + break; + } + + if (!g_WaypointHashes[0] && !g_WaypointHashes[1]) { + if (random() % 2 == 0) { + break; + } + } else { + u64 sp50 = func0004aea4(g_WaypointHashes[0], 0x20) | g_WaypointHashes[1]; + + if ((func00012e1c(&sp50) % 2) == 0) { + break; + } + } + } + } + + neighbournums++; + } + + groupapointnums++; + } +} /** * Find a route from frompoint to topoint. The arr argument will be populated diff --git a/src/include/game/data/data_01a3a0.h b/src/include/game/data/data_01a3a0.h index b23d24fe0..a11b5ba60 100644 --- a/src/include/game/data/data_01a3a0.h +++ b/src/include/game/data/data_01a3a0.h @@ -42,7 +42,7 @@ extern u32 var80075c3c; extern u32 var80075c48; extern u32 var80075c54; extern u32 var80075c94; -extern s32 g_WaypointHashes[2]; +extern u32 g_WaypointHashes[2]; extern char var80075cb4[]; extern char var80075cc0[]; extern u32 g_PakDebugForceScrub; diff --git a/src/include/lib/lib_12dc0.h b/src/include/lib/lib_12dc0.h index 8289d3995..909c20d2d 100644 --- a/src/include/lib/lib_12dc0.h +++ b/src/include/lib/lib_12dc0.h @@ -4,7 +4,7 @@ #include "types.h" void rngSetSeed(u32 amount); -u32 func00012e1c(void); +u32 func00012e1c(u64 *value); u32 func00012e60(void); void func00012efc(char *string); s32 func00012f30(void); diff --git a/src/include/lib/lib_4ae00.h b/src/include/lib/lib_4ae00.h index 952fdac7c..11639ac69 100644 --- a/src/include/lib/lib_4ae00.h +++ b/src/include/lib/lib_4ae00.h @@ -6,7 +6,7 @@ u32 func0004ae00(void); u32 func0004ae2c(void); u64 func0004ae68(u64 arg0, u64 arg1); -u32 func0004aea4(void); +u64 func0004aea4(u64 arg0, u64 arg1); u32 func0004af0c(void); u64 func0004af68(u64 arg0, u64 arg2);