From a241da79445b74c2bb7b61d58b7d4fb7f2d4bf4d Mon Sep 17 00:00:00 2001 From: Ryan Dwyer Date: Thu, 18 Feb 2021 20:46:42 +1000 Subject: [PATCH] Decompile roomsGetActive --- src/game/prop.c | 2 +- src/game/propobj.c | 2 +- src/game/room.c | 71 +++++++++++++++------------------------ src/gvars/gvars.c | 4 +-- src/include/game/room.h | 2 +- src/include/gvars/gvars.h | 4 +-- 6 files changed, 35 insertions(+), 50 deletions(-) diff --git a/src/game/prop.c b/src/game/prop.c index 29f7e0801..1cb20ea8c 100644 --- a/src/game/prop.c +++ b/src/game/prop.c @@ -997,7 +997,7 @@ glabel var7f1a9eb8 /* f0610dc: 544cfffe */ bnel $v0,$t4,.L0f0610d8 /* f0610e0: 848c0002 */ lh $t4,0x2($a0) .L0f0610e4: -/* f0610e4: 0fc5914d */ jal func0f164534 +/* f0610e4: 0fc5914d */ jal roomsGetActive /* f0610e8: 24050064 */ addiu $a1,$zero,0x64 /* f0610ec: 87ad00d8 */ lh $t5,0xd8($sp) /* f0610f0: 2401ffff */ addiu $at,$zero,-1 diff --git a/src/game/propobj.c b/src/game/propobj.c index 9a9683f9f..fe5cecf35 100644 --- a/src/game/propobj.c +++ b/src/game/propobj.c @@ -7859,7 +7859,7 @@ glabel var7f1aa268 /* f06ce3c: 56cffffe */ bnel $s6,$t7,.L0f06ce38 /* f06ce40: 848f0002 */ lh $t7,0x2($a0) .L0f06ce44: -/* f06ce44: 0fc5914d */ jal func0f164534 +/* f06ce44: 0fc5914d */ jal roomsGetActive /* f06ce48: 24050064 */ addiu $a1,$zero,0x64 /* f06ce4c: 87b800cc */ lh $t8,0xcc($sp) /* f06ce50: 27b100cc */ addiu $s1,$sp,0xcc diff --git a/src/game/room.c b/src/game/room.c index ed1f75e34..163bd09ff 100644 --- a/src/game/room.c +++ b/src/game/room.c @@ -6647,7 +6647,7 @@ void func0f15ca00(void) { s32 tickmode; - var800a4bec = 0; + g_NumActiveRooms = 0; func0f15c920(); @@ -12848,16 +12848,16 @@ glabel var7f1b76bc /* f162a2c: 8e04000c */ lw $a0,0xc($s0) /* f162a30: 0fc55fa5 */ jal func0f157e94 /* f162a34: 02a03025 */ or $a2,$s5,$zero -/* f162a38: 3c02800a */ lui $v0,%hi(var800a4bec) -/* f162a3c: 8c424bec */ lw $v0,%lo(var800a4bec)($v0) +/* f162a38: 3c02800a */ lui $v0,%hi(g_NumActiveRooms) +/* f162a3c: 8c424bec */ lw $v0,%lo(g_NumActiveRooms)($v0) /* f162a40: 8e18000c */ lw $t8,0xc($s0) -/* f162a44: 3c01800a */ lui $at,%hi(var800a4930) +/* f162a44: 3c01800a */ lui $at,%hi(g_ActiveRoomNums) /* f162a48: 0002c840 */ sll $t9,$v0,0x1 /* f162a4c: 00390821 */ addu $at,$at,$t9 -/* f162a50: a4384930 */ sh $t8,%lo(var800a4930)($at) -/* f162a54: 3c01800a */ lui $at,%hi(var800a4bec) +/* f162a50: a4384930 */ sh $t8,%lo(g_ActiveRoomNums)($at) +/* f162a54: 3c01800a */ lui $at,%hi(g_NumActiveRooms) /* f162a58: 24480001 */ addiu $t0,$v0,0x1 -/* f162a5c: ac284bec */ sw $t0,%lo(var800a4bec)($at) +/* f162a5c: ac284bec */ sw $t0,%lo(g_NumActiveRooms)($at) .L0f162a60: /* f162a60: 92090001 */ lbu $t1,0x1($s0) .L0f162a64: @@ -13157,7 +13157,7 @@ glabel var7f1b76bc // if (execute) { // if (g_PortalMode == PORTALMODE_SHOW && func0f15cd90(cmd[1].param, &var800a65c0)) { // func0f157e94(cmd[1].param, 0, &var800a65c0); -// var800a4930[var800a4bec++] = cmd[1].param; +// g_ActiveRoomNums[g_NumActiveRooms++] = cmd[1].param; // } // } // cmd += cmd->len; @@ -14897,41 +14897,26 @@ glabel var7f1b76c0 /* f164530: 01601025 */ or $v0,$t3,$zero ); -GLOBAL_ASM( -glabel func0f164534 -/* f164534: 3c08800a */ lui $t0,%hi(var800a4bec) -/* f164538: 25084bec */ addiu $t0,$t0,%lo(var800a4bec) -/* f16453c: 8d0e0000 */ lw $t6,0x0($t0) -/* f164540: 00001825 */ or $v1,$zero,$zero -/* f164544: 2409ffff */ addiu $t1,$zero,-1 -/* f164548: 59c00013 */ blezl $t6,.L0f164598 -/* f16454c: 00035040 */ sll $t2,$v1,0x1 -/* f164550: 18a00010 */ blez $a1,.L0f164594 -/* f164554: 00001040 */ sll $v0,$zero,0x1 -/* f164558: 3c0f800a */ lui $t7,%hi(var800a4930) -/* f16455c: 25ef4930 */ addiu $t7,$t7,%lo(var800a4930) -/* f164560: 004f3821 */ addu $a3,$v0,$t7 -/* f164564: 00823021 */ addu $a2,$a0,$v0 -/* f164568: 84f80000 */ lh $t8,0x0($a3) -.L0f16456c: -/* f16456c: 24630001 */ addiu $v1,$v1,0x1 -/* f164570: 24c60002 */ addiu $a2,$a2,0x2 -/* f164574: a4d8fffe */ sh $t8,-0x2($a2) -/* f164578: 8d190000 */ lw $t9,0x0($t0) -/* f16457c: 24e70002 */ addiu $a3,$a3,0x2 -/* f164580: 0079082a */ slt $at,$v1,$t9 -/* f164584: 10200003 */ beqz $at,.L0f164594 -/* f164588: 0065082a */ slt $at,$v1,$a1 -/* f16458c: 5420fff7 */ bnezl $at,.L0f16456c -/* f164590: 84f80000 */ lh $t8,0x0($a3) -.L0f164594: -/* f164594: 00035040 */ sll $t2,$v1,0x1 -.L0f164598: -/* f164598: 008a5821 */ addu $t3,$a0,$t2 -/* f16459c: a5690000 */ sh $t1,0x0($t3) -/* f1645a0: 03e00008 */ jr $ra -/* f1645a4: 00601025 */ or $v0,$v1,$zero -); +/** + * @dangerous: This function assumes that the passed len is the allocated length + * minus one. ie. It assumes there is space to write the -1 terminator once the + * length is reached. + * + * This is only called from two places, both with len=100, so you'd need to have + * over 100 rooms active at the same time before this would overflow the array. + */ +s32 roomsGetActive(s16 *rooms, s32 len) +{ + s32 i; + + for (i = 0; i < g_NumActiveRooms && i < len; i++) { + rooms[i] = g_ActiveRoomNums[i]; + } + + rooms[i] = -1; + + return i; +} s32 roomGetNeighbours(s32 roomnum, s16 *dstrooms, s32 len) { diff --git a/src/gvars/gvars.c b/src/gvars/gvars.c index d612653fd..b5cf1e0a4 100644 --- a/src/gvars/gvars.c +++ b/src/gvars/gvars.c @@ -14781,7 +14781,7 @@ u32 var800a4920 = 0; u32 var800a4924 = 0; struct room *g_Rooms = NULL; u8 *g_MpRoomVisibility = NULL; -s16 var800a4930[1] = {0}; +s16 g_ActiveRoomNums[1] = {0}; u32 var800a4934 = 0; u32 var800a4938 = 0; u32 var800a493c = 0; @@ -14956,7 +14956,7 @@ u32 var800a4bdc = 0; u32 var800a4be0 = 0; u32 var800a4be4 = 0; u32 var800a4be8 = 0; -u32 var800a4bec = 0; +s32 g_NumActiveRooms = 0; u32 var800a4bf0 = 0; u32 var800a4bf4 = 0; s16 var800a4bf8[100] = {0}; diff --git a/src/include/game/room.h b/src/include/game/room.h index 0c1f54dc7..c2c7be5ea 100644 --- a/src/include/game/room.h +++ b/src/include/game/room.h @@ -89,7 +89,7 @@ u32 func0f163904(void); u32 func0f16397c(void); void func0f163e34(void); Gfx *func0f164150(Gfx *gdl); -u32 func0f164534(void); +s32 roomsGetActive(s16 *rooms, s32 len); s32 roomGetNeighbours(s32 room, s16 *rooms, s32 len); bool roomsAreNeighbours(s32 roomnum1, s32 roomnum2); u32 func0f164748(void); diff --git a/src/include/gvars/gvars.h b/src/include/gvars/gvars.h index fdd7eb658..fc05a045d 100644 --- a/src/include/gvars/gvars.h +++ b/src/include/gvars/gvars.h @@ -706,8 +706,8 @@ extern u32 var800a4920; extern u32 var800a4924; extern struct room *g_Rooms; extern u8 *g_MpRoomVisibility; -extern s16 var800a4930[1]; -extern u32 var800a4bec; +extern s16 g_ActiveRoomNums[1]; +extern s32 g_NumActiveRooms; extern u32 var800a4bf0; extern s16 var800a4bf8[100]; extern u32 var800a4cc0;