From a393ba01089d0d4c3c223a22266e8fc637a5cf45 Mon Sep 17 00:00:00 2001 From: Ryan Dwyer Date: Fri, 22 May 2020 19:53:42 +1000 Subject: [PATCH] Decompile getLowestUnusedChrId --- src/game/chr/chr.c | 72 +++++++---------------------- src/game/data/data_0083d0.c | 2 +- src/game/game_00b480.c | 4 +- src/include/game/chr/chr.h | 2 +- src/include/game/data/data_0083d0.h | 2 +- 5 files changed, 21 insertions(+), 61 deletions(-) diff --git a/src/game/chr/chr.c b/src/game/chr/chr.c index 795549569..a5305c694 100644 --- a/src/game/chr/chr.c +++ b/src/game/chr/chr.c @@ -2449,63 +2449,23 @@ f32 chrGetArmor(struct chrdata *chr) return 0; } -GLOBAL_ASM( -glabel getLowestUnusedChrId -/* f0205ec: 27bdffd8 */ addiu $sp,$sp,-40 -/* f0205f0: afb00014 */ sw $s0,0x14($sp) -/* f0205f4: afb30020 */ sw $s3,0x20($sp) -/* f0205f8: afb2001c */ sw $s2,0x1c($sp) -/* f0205fc: 3c108006 */ lui $s0,%hi(var80062984) -/* f020600: afbf0024 */ sw $ra,0x24($sp) -/* f020604: afb10018 */ sw $s1,0x18($sp) -/* f020608: 26102984 */ addiu $s0,$s0,%lo(var80062984) -/* f02060c: 34128000 */ dli $s2,0x8000 -/* f020610: 24131388 */ addiu $s3,$zero,0x1388 -/* f020614: 8e0e0000 */ lw $t6,0x0($s0) -.L0f020618: -/* f020618: 25c20001 */ addiu $v0,$t6,0x1 -/* f02061c: 0052082a */ slt $at,$v0,$s2 -/* f020620: 14200003 */ bnez $at,.L0f020630 -/* f020624: ae020000 */ sw $v0,0x0($s0) -/* f020628: ae130000 */ sw $s3,0x0($s0) -/* f02062c: 02601025 */ or $v0,$s3,$zero -.L0f020630: -/* f020630: 00028c00 */ sll $s1,$v0,0x10 -/* f020634: 00112403 */ sra $a0,$s1,0x10 -/* f020638: 0fc0a1dd */ jal chrFindByLiteralId -/* f02063c: 00808825 */ or $s1,$a0,$zero -/* f020640: 5440fff5 */ bnezl $v0,.L0f020618 -/* f020644: 8e0e0000 */ lw $t6,0x0($s0) -/* f020648: 8fbf0024 */ lw $ra,0x24($sp) -/* f02064c: 02201025 */ or $v0,$s1,$zero -/* f020650: 8fb10018 */ lw $s1,0x18($sp) -/* f020654: 8fb00014 */ lw $s0,0x14($sp) -/* f020658: 8fb2001c */ lw $s2,0x1c($sp) -/* f02065c: 8fb30020 */ lw $s3,0x20($sp) -/* f020660: 03e00008 */ jr $ra -/* f020664: 27bd0028 */ addiu $sp,$sp,0x28 -); +s16 getLowestUnusedChrId(void) +{ + s32 chr_id; + struct chrdata *chr; -// Mismatch due to different registers -//s32 getLowestUnusedChrId(void) -//{ -// s32 chr_id; -// struct chrdata *chr; -// -// do { -// chr_id = var80062984 + 1; -// var80062984 = chr_id; -// -// if (chr_id > 32767) { -// var80062984 = 5000; -// chr_id = 5000; -// } -// -// chr = chrFindByLiteralId(chr_id); -// } while (chr); -// -// return chr_id; -//} + do { + chr_id = ++g_NextChrId; + + if (chr_id > 32767) { + chr_id = g_NextChrId = 5000; + } + + chr = chrFindByLiteralId((s16)chr_id); + } while (chr); + + return chr_id; +} void chrInit(struct prop *prop, u8 *ailist) { diff --git a/src/game/data/data_0083d0.c b/src/game/data/data_0083d0.c index 39f26f99c..7a9282c28 100644 --- a/src/game/data/data_0083d0.c +++ b/src/game/data/data_0083d0.c @@ -382,7 +382,7 @@ u32 var80062974 = 0x00000000; u32 var80062978 = 0x00000000; u32 var8006297c = 0; u32 var80062980 = 0; -s32 var80062984 = 5000; +s32 g_NextChrId = 5000; // 80062988 struct chrdata *g_ChrsA = NULL; diff --git a/src/game/game_00b480.c b/src/game/game_00b480.c index 4199bc5cf..b9e583cf9 100644 --- a/src/game/game_00b480.c +++ b/src/game/game_00b480.c @@ -71,8 +71,8 @@ glabel func0f00b510 /* f00b540: ac202978 */ sw $zero,%lo(var80062978)($at) /* f00b544: 3c018006 */ lui $at,%hi(var8006297c) /* f00b548: ac20297c */ sw $zero,%lo(var8006297c)($at) -/* f00b54c: 3c018006 */ lui $at,%hi(var80062984) -/* f00b550: ac2e2984 */ sw $t6,%lo(var80062984)($at) +/* f00b54c: 3c018006 */ lui $at,%hi(g_NextChrId) +/* f00b550: ac2e2984 */ sw $t6,%lo(g_NextChrId)($at) /* f00b554: 3c018006 */ lui $at,%hi(g_ChrsA) /* f00b558: 27bdffe0 */ addiu $sp,$sp,-32 /* f00b55c: ac202988 */ sw $zero,%lo(g_ChrsA)($at) diff --git a/src/include/game/chr/chr.h b/src/include/game/chr/chr.h index f636ae083..b744b8179 100644 --- a/src/include/game/chr/chr.h +++ b/src/include/game/chr/chr.h @@ -10,7 +10,7 @@ u32 func0f01e7f4(void); u32 func0f01f264(struct chrdata *chr, struct coord *pos, s16 *room, f32 arg3, bool arg4); void func0f01f378(void); s32 chrsGetNumFree(void); -s32 getLowestUnusedChrId(void); +s16 getLowestUnusedChrId(void); struct prop *func0f020b14(struct prop *prop, struct animdata *animdata, struct coord *pos, s16 *rooms, f32 arg3, u8 *ailist); void func0f020d44(struct prop *prop, bool arg1); u32 func0f021258(void); diff --git a/src/include/game/data/data_0083d0.h b/src/include/game/data/data_0083d0.h index c104c447d..8bac1ae75 100644 --- a/src/include/game/data/data_0083d0.h +++ b/src/include/game/data/data_0083d0.h @@ -92,7 +92,7 @@ extern u32 var80062970; extern u32 var80062974; extern u32 var8006297c; extern u32 var80062980; -extern s32 var80062984; +extern s32 g_NextChrId; extern u32 var80062990; extern u32 var80062998; extern u32 var800629d8;