From b9484635f751e4d5cdf824ef001c68729e238870 Mon Sep 17 00:00:00 2001 From: Ryan Dwyer Date: Sun, 22 Dec 2019 09:53:23 +1000 Subject: [PATCH] Decompile chrSpawnAtPad and rename other spawn functions --- src/game/chr/chr.c | 55 +++++++++++----------------------- src/game/chr/chraicommands.c | 10 +++---- src/game/game_0b28d0.c | 22 +++++++------- src/include/game/chr/chr.h | 6 ++-- src/include/game/game_096750.h | 2 +- src/include/types.h | 8 +++-- 6 files changed, 42 insertions(+), 61 deletions(-) diff --git a/src/game/chr/chr.c b/src/game/chr/chr.c index 0cd6f0b7e..485f23e10 100644 --- a/src/game/chr/chr.c +++ b/src/game/chr/chr.c @@ -49419,7 +49419,7 @@ s32 func0f0495d0(struct chrdata *chr, s32 pad_id) if (resolved_pad_id >= 0) { padUnpack(resolved_pad_id, 0x40, &pad); - ret = pad.padnum; + ret = pad.room; } } else { ret = pad_id; @@ -51475,7 +51475,7 @@ glabel func0f04af84 ); GLOBAL_ASM( -glabel func0f04b2f4 +glabel chrSpawnAtCoord /* f04b2f4: 27bdff88 */ addiu $sp,$sp,-120 /* f04b2f8: afbf0024 */ sw $ra,0x24($sp) /* f04b2fc: afa40078 */ sw $a0,0x78($sp) @@ -51652,42 +51652,21 @@ glabel func0f04b2f4 /* f04b574: 00000000 */ sll $zero,$zero,0x0 ); -GLOBAL_ASM( -glabel chrSpawn -/* f04b578: 27bdff78 */ addiu $sp,$sp,-136 -/* f04b57c: afbf0024 */ sw $ra,0x24($sp) -/* f04b580: afa5008c */ sw $a1,0x8c($sp) -/* f04b584: afa60090 */ sw $a2,0x90($sp) -/* f04b588: 0fc1258b */ jal padResolve -/* f04b58c: 00e02825 */ or $a1,$a3,$zero -/* f04b590: 00402025 */ or $a0,$v0,$zero -/* f04b594: 24050046 */ addiu $a1,$zero,0x46 -/* f04b598: 0fc456ac */ jal padUnpack -/* f04b59c: 27a60030 */ addiu $a2,$sp,0x30 -/* f04b5a0: c7ac003c */ lwc1 $f12,0x3c($sp) -/* f04b5a4: 0fc259d4 */ jal func0f096750 -/* f04b5a8: c7ae0044 */ lwc1 $f14,0x44($sp) -/* f04b5ac: 8fae0078 */ lw $t6,0x78($sp) -/* f04b5b0: 8fb80098 */ lw $t8,0x98($sp) -/* f04b5b4: 8fb9009c */ lw $t9,0x9c($sp) -/* f04b5b8: 240fffff */ addiu $t7,$zero,-1 -/* f04b5bc: a7af002e */ sh $t7,0x2e($sp) -/* f04b5c0: 8fa4008c */ lw $a0,0x8c($sp) -/* f04b5c4: 8fa50090 */ lw $a1,0x90($sp) -/* f04b5c8: 27a60030 */ addiu $a2,$sp,0x30 -/* f04b5cc: 27a7002c */ addiu $a3,$sp,0x2c -/* f04b5d0: e7a00010 */ swc1 $f0,0x10($sp) -/* f04b5d4: a7ae002c */ sh $t6,0x2c($sp) -/* f04b5d8: afb80014 */ sw $t8,0x14($sp) -/* f04b5dc: 0fc12cbd */ jal func0f04b2f4 -/* f04b5e0: afb90018 */ sw $t9,0x18($sp) -/* f04b5e4: 8fbf0024 */ lw $ra,0x24($sp) -/* f04b5e8: 27bd0088 */ addiu $sp,$sp,0x88 -/* f04b5ec: 03e00008 */ jr $ra -/* f04b5f0: 00000000 */ sll $zero,$zero,0x0 -); +bool chrSpawnAtPad(struct chrdata *basechr, s32 body, s32 head, s32 pad_id, u8 *ailist, u32 flags) +{ + s32 resolved_pad_id = padResolve(basechr, pad_id); + struct pad pad; + s16 room[2]; + float fvalue; + padUnpack(resolved_pad_id, 0x46, &pad); + fvalue = func0f096750(pad.look.x, pad.look.z); + room[0] = pad.room; + room[1] = -1; -s32 func0f04b5f4(struct chrdata *basechr, s32 arg1, s32 arg2, u32 chrnum, s32 arg4, s32 arg5) + return chrSpawnAtCoord(body, head, &pad.coord, &room[0], fvalue, ailist, flags); +} + +bool chrSpawnAtChr(struct chrdata *basechr, s32 body, s32 head, u32 chrnum, u8 *ailist, u32 flags) { struct chrdata *chr = chrFindById(basechr, chrnum); float fvalue; @@ -51696,7 +51675,7 @@ s32 func0f04b5f4(struct chrdata *basechr, s32 arg1, s32 arg2, u32 chrnum, s32 ar fvalue = func0f03e45c(chr); } - return func0f04b2f4(arg1, arg2, &chr->pos->coord, &chr->pos->room, fvalue, arg4, arg5); + return chrSpawnAtCoord(body, head, &chr->pos->coord, &chr->pos->room, fvalue, ailist, flags); } GLOBAL_ASM( diff --git a/src/game/chr/chraicommands.c b/src/game/chr/chraicommands.c index c0630c337..514ff8686 100644 --- a/src/game/chr/chraicommands.c +++ b/src/game/chr/chraicommands.c @@ -5766,7 +5766,7 @@ glabel aiSpawnChr /* f0556ec: afa20010 */ sw $v0,0x10($sp) /* f0556f0: 97a70032 */ lhu $a3,0x32($sp) /* f0556f4: afa30034 */ sw $v1,0x34($sp) -/* f0556f8: 0fc12d5e */ jal chrSpawn +/* f0556f8: 0fc12d5e */ jal chrSpawnAtPad /* f0556fc: afa80014 */ sw $t0,0x14($sp) /* f055700: 10400007 */ beqz $v0,.L0f055720 /* f055704: 8fa30034 */ lw $v1,0x34($sp) @@ -5796,7 +5796,7 @@ glabel aiSpawnChr // s32 ailistid = cmd[7] | (cmd[6] << 8); // u8 *ailist = ailistFindById(ailistid & 0xffff); // -// if (chrSpawn(g_Vars.chrdata, cmd[2], (s8)cmd[3], pad, ailist, flags)) { +// if (chrSpawnAtPad(g_Vars.chrdata, cmd[2], (s8)cmd[3], pad, ailist, flags)) { // g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[12]); // } else { // g_Vars.aioffset += 13; @@ -5843,7 +5843,7 @@ glabel ai00c7 /* f0557b8: 80660003 */ lb $a2,0x3($v1) /* f0557bc: 90670004 */ lbu $a3,0x4($v1) /* f0557c0: afa20010 */ sw $v0,0x10($sp) -/* f0557c4: 0fc12d7d */ jal func0f04b5f4 +/* f0557c4: 0fc12d7d */ jal chrSpawnAtChr /* f0557c8: afab0014 */ sw $t3,0x14($sp) /* f0557cc: 10400007 */ beqz $v0,.L0f0557ec /* f0557d0: 8fa3002c */ lw $v1,0x2c($sp) @@ -5873,7 +5873,7 @@ glabel ai00c7 // u32 ailistid = cmd[6] | (cmd[5] << 8); // u8 *ailist = ailistFindById(ailistid); // -// if (func0f04b5f4(g_Vars.chrdata, cmd[2], (s8)cmd[3], cmd[4], ailist, flags)) { +// if (chrSpawnAtChr(g_Vars.chrdata, cmd[2], (s8)cmd[3], cmd[4], ailist, flags)) { // g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[11]); // } else { // g_Vars.aioffset += 12; @@ -6115,7 +6115,7 @@ glabel aiDuplicateChr /* f055bd8: 84470000 */ lh $a3,0x0($v0) /* f055bdc: afb00010 */ sw $s0,0x10($sp) /* f055be0: 8c84a3e4 */ lw $a0,-0x5c1c($a0) -/* f055be4: 0fc12d7d */ jal func0f04b5f4 +/* f055be4: 0fc12d7d */ jal chrSpawnAtChr /* f055be8: afad0014 */ sw $t5,0x14($sp) /* f055bec: 5040006d */ beqzl $v0,.L0f055da4 /* f055bf0: 8fb90054 */ lw $t9,0x54($sp) diff --git a/src/game/game_0b28d0.c b/src/game/game_0b28d0.c index 12025c0ee..633fbdad4 100644 --- a/src/game/game_0b28d0.c +++ b/src/game/game_0b28d0.c @@ -14084,7 +14084,7 @@ glabel func0f0bd904 /* f0bed00: 24660008 */ addiu $a2,$v1,0x8 /* f0bed04: 24670028 */ addiu $a3,$v1,0x28 /* f0bed08: 46143482 */ mul.s $f18,$f6,$f20 -/* f0bed0c: 0fc12cbd */ jal func0f04b2f4 +/* f0bed0c: 0fc12cbd */ jal chrSpawnAtCoord /* f0bed10: e7b20010 */ swc1 $f18,0x10($sp) /* f0bed14: 1000002a */ beqz $zero,.L0f0bedc0 /* f0bed18: 00408825 */ or $s1,$v0,$zero @@ -14107,7 +14107,7 @@ glabel func0f0bd904 /* f0bed58: 24050008 */ addiu $a1,$zero,0x8 /* f0bed5c: 24660008 */ addiu $a2,$v1,0x8 /* f0bed60: 24670028 */ addiu $a3,$v1,0x28 -/* f0bed64: 0fc12cbd */ jal func0f04b2f4 +/* f0bed64: 0fc12cbd */ jal chrSpawnAtCoord /* f0bed68: e7aa0010 */ swc1 $f10,0x10($sp) /* f0bed6c: 10000014 */ beqz $zero,.L0f0bedc0 /* f0bed70: 00408825 */ or $s1,$v0,$zero @@ -14128,7 +14128,7 @@ glabel func0f0bd904 /* f0beda8: 24660008 */ addiu $a2,$v1,0x8 /* f0bedac: 24670028 */ addiu $a3,$v1,0x28 /* f0bedb0: 46149202 */ mul.s $f8,$f18,$f20 -/* f0bedb4: 0fc12cbd */ jal func0f04b2f4 +/* f0bedb4: 0fc12cbd */ jal chrSpawnAtCoord /* f0bedb8: e7a80010 */ swc1 $f8,0x10($sp) /* f0bedbc: 00408825 */ or $s1,$v0,$zero .L0f0bedc0: @@ -14211,7 +14211,7 @@ glabel func0f0bd904 /* f0beee4: 24050008 */ addiu $a1,$zero,0x8 /* f0beee8: 24660008 */ addiu $a2,$v1,0x8 /* f0beeec: 24670028 */ addiu $a3,$v1,0x28 -/* f0beef0: 0fc12cbd */ jal func0f04b2f4 +/* f0beef0: 0fc12cbd */ jal chrSpawnAtCoord /* f0beef4: e7a40010 */ swc1 $f4,0x10($sp) /* f0beef8: 10000011 */ beqz $zero,.L0f0bef40 /* f0beefc: 00408825 */ or $s1,$v0,$zero @@ -14229,7 +14229,7 @@ glabel func0f0bd904 /* f0bef28: 2405001b */ addiu $a1,$zero,0x1b /* f0bef2c: 24660008 */ addiu $a2,$v1,0x8 /* f0bef30: 24670028 */ addiu $a3,$v1,0x28 -/* f0bef34: 0fc12cbd */ jal func0f04b2f4 +/* f0bef34: 0fc12cbd */ jal chrSpawnAtCoord /* f0bef38: e7b20010 */ swc1 $f18,0x10($sp) /* f0bef3c: 00408825 */ or $s1,$v0,$zero .L0f0bef40: @@ -14307,7 +14307,7 @@ glabel func0f0bd904 /* f0bf050: 24050008 */ addiu $a1,$zero,0x8 /* f0bf054: 24660008 */ addiu $a2,$v1,0x8 /* f0bf058: 24670028 */ addiu $a3,$v1,0x28 -/* f0bf05c: 0fc12cbd */ jal func0f04b2f4 +/* f0bf05c: 0fc12cbd */ jal chrSpawnAtCoord /* f0bf060: e7aa0010 */ swc1 $f10,0x10($sp) /* f0bf064: 10000011 */ beqz $zero,.L0f0bf0ac /* f0bf068: 00408825 */ or $s1,$v0,$zero @@ -14325,7 +14325,7 @@ glabel func0f0bd904 /* f0bf094: 24050012 */ addiu $a1,$zero,0x12 /* f0bf098: 24660008 */ addiu $a2,$v1,0x8 /* f0bf09c: 24670028 */ addiu $a3,$v1,0x28 -/* f0bf0a0: 0fc12cbd */ jal func0f04b2f4 +/* f0bf0a0: 0fc12cbd */ jal chrSpawnAtCoord /* f0bf0a4: e7a60010 */ swc1 $f6,0x10($sp) /* f0bf0a8: 00408825 */ or $s1,$v0,$zero .L0f0bf0ac: @@ -14409,7 +14409,7 @@ glabel func0f0bd904 /* f0bf1d4: 24050008 */ addiu $a1,$zero,0x8 /* f0bf1d8: 24660008 */ addiu $a2,$v1,0x8 /* f0bf1dc: 24670028 */ addiu $a3,$v1,0x28 -/* f0bf1e0: 0fc12cbd */ jal func0f04b2f4 +/* f0bf1e0: 0fc12cbd */ jal chrSpawnAtCoord /* f0bf1e4: e7a80010 */ swc1 $f8,0x10($sp) /* f0bf1e8: 10000011 */ beqz $zero,.L0f0bf230 /* f0bf1ec: 00408825 */ or $s1,$v0,$zero @@ -14427,7 +14427,7 @@ glabel func0f0bd904 /* f0bf218: 02802825 */ or $a1,$s4,$zero /* f0bf21c: 24660008 */ addiu $a2,$v1,0x8 /* f0bf220: 24670028 */ addiu $a3,$v1,0x28 -/* f0bf224: 0fc12cbd */ jal func0f04b2f4 +/* f0bf224: 0fc12cbd */ jal chrSpawnAtCoord /* f0bf228: e7a40010 */ swc1 $f4,0x10($sp) /* f0bf22c: 00408825 */ or $s1,$v0,$zero .L0f0bf230: @@ -14515,7 +14515,7 @@ glabel func0f0bd904 /* f0bf368: 24050008 */ addiu $a1,$zero,0x8 /* f0bf36c: 24660008 */ addiu $a2,$v1,0x8 /* f0bf370: 24670028 */ addiu $a3,$v1,0x28 -/* f0bf374: 0fc12cbd */ jal func0f04b2f4 +/* f0bf374: 0fc12cbd */ jal chrSpawnAtCoord /* f0bf378: e7b20010 */ swc1 $f18,0x10($sp) /* f0bf37c: 10000011 */ beqz $zero,.L0f0bf3c4 /* f0bf380: 00408825 */ or $s1,$v0,$zero @@ -14533,7 +14533,7 @@ glabel func0f0bd904 /* f0bf3ac: 24050029 */ addiu $a1,$zero,0x29 /* f0bf3b0: 24660008 */ addiu $a2,$v1,0x8 /* f0bf3b4: 24670028 */ addiu $a3,$v1,0x28 -/* f0bf3b8: 0fc12cbd */ jal func0f04b2f4 +/* f0bf3b8: 0fc12cbd */ jal chrSpawnAtCoord /* f0bf3bc: e7aa0010 */ swc1 $f10,0x10($sp) /* f0bf3c0: 00408825 */ or $s1,$v0,$zero .L0f0bf3c4: diff --git a/src/include/game/chr/chr.h b/src/include/game/chr/chr.h index 9245991c1..f74b61484 100644 --- a/src/include/game/chr/chr.h +++ b/src/include/game/chr/chr.h @@ -384,9 +384,9 @@ u32 func0f04acc8(struct chrdata *chr, s32 arg1, s32 pad_id); u32 func0f04ad08(struct chrdata *chr); u32 func0f04aeb0(void); u32 func0f04af84(void); -s32 func0f04b2f4(s32 arg0, s32 arg1, struct coord *coord, s16 *room, float arg4, s32 arg5, s32 arg6); -u32 chrSpawn(struct chrdata *chr, s32 body, s32 head, u16 pad, u8 *ailist, u32 flags); -s32 func0f04b5f4(struct chrdata *chr, s32 arg1, s32 arg2, u32 chrnum, s32 arg4, s32 arg5); +bool chrSpawnAtCoord(s32 body, s32 head, struct coord *coord, s16 *room, float arg4, u8 *ailist, u32 flags); +bool chrSpawnAtPad(struct chrdata *chr, s32 body, s32 head, s32 pad, u8 *ailist, u32 flags); +bool chrSpawnAtChr(struct chrdata *basechr, s32 body, s32 head, u32 chrnum, u8 *ailist, u32 flags); u32 func0f04b658(struct chrdata *chr); u32 func0f04b748(void); u32 func0f04b950(struct chrdata *chr, u32 cover, u32 arg2); diff --git a/src/include/game/game_096750.h b/src/include/game/game_096750.h index f20a46e6b..b51b9e088 100644 --- a/src/include/game/game_096750.h +++ b/src/include/game/game_096750.h @@ -3,7 +3,7 @@ #include #include "types.h" -u32 func0f096750(void); +float func0f096750(float x, float z); u32 func0f096890(void); u32 func0f096910(void); u32 func0f096964(void); diff --git a/src/include/types.h b/src/include/types.h index 967abb27d..ed31a2609 100644 --- a/src/include/types.h +++ b/src/include/types.h @@ -73,9 +73,11 @@ struct pad { /*0x3c*/ float ymax; /*0x40*/ float zmin; /*0x44*/ float zmax; - /*0x48*/ s32 padnum; - /*0x4c*/ u32 unk4c; - /*0x50*/ u32 unk50; + /*0x48*/ s32 room; + /*0x4c*/ s16 unk4c; + /*0x4e*/ s16 unk4e; + /*0x50*/ s16 unk50; + /*0x52*/ s16 unk52; }; struct chr020 {