From 1175fdae70b34c423d3a6225a8e5acf19b607710 Mon Sep 17 00:00:00 2001 From: Ryan Dwyer Date: Tue, 2 Mar 2021 12:15:09 +1000 Subject: [PATCH] Decompile func0f0a1528 --- src/assets/files/setup/setuplip.c | 16 +- src/game/data/ailists.c | 20 +- src/game/game_097ba0.c | 449 ++++++++++-------------------- src/include/constants.h | 2 +- src/include/game/game_097ba0.h | 10 +- src/include/sfx.h | 1 + src/include/types.h | 54 +--- 7 files changed, 189 insertions(+), 363 deletions(-) diff --git a/src/assets/files/setup/setuplip.c b/src/assets/files/setup/setuplip.c index 1bf880ed0..65cc44592 100644 --- a/src/assets/files/setup/setuplip.c +++ b/src/assets/files/setup/setuplip.c @@ -4503,12 +4503,18 @@ u8 func1032_count_last_room_guards[] = { }; /** - * Not really sure what the point of this is. + * When the player uses the disguise the game sets CHRHFLAG_UNTARGETABLE on + * them. Guards check their targets for this flag periodically and unset their + * targets if found. + * + * This ailist disables the flag after 10 seconds. This causes guards to + * disengage combat and gives the player an opportunity to leave a combat + * situation before the guards can become savvy again and foil the disguise. */ -u8 func1033_update_buddy_placed_flag[] = { +u8 func1033_unset_untargetable_flag[] = { beginloop(0x04) chr_toggle_p1p2(CHR_SELF) - if_chr_has_hiddenflag(CHR_P1P2, CHRHFLAG_BUDDY_PLACED, /*goto*/ 0x2d) + if_chr_has_hiddenflag(CHR_P1P2, CHRHFLAG_UNTARGETABLE, /*goto*/ 0x2d) endloop(0x04) label(0x2d) @@ -4519,7 +4525,7 @@ u8 func1033_update_buddy_placed_flag[] = { endloop(0x64) label(0x2d) - unset_chr_hiddenflag(CHR_P1P2, CHRHFLAG_BUDDY_PLACED) + unset_chr_hiddenflag(CHR_P1P2, CHRHFLAG_UNTARGETABLE) set_ailist(CHR_SELF, GAILIST_IDLE) endlist }; @@ -4762,7 +4768,7 @@ struct ailist ailists[] = { { func1030_lift_door_sounds, 0x1030 }, { func1031_toggle_doorman, 0x1031 }, { func1032_count_last_room_guards, 0x1032 }, - { func1033_update_buddy_placed_flag, 0x1033 }, + { func1033_unset_untargetable_flag, 0x1033 }, { func1034_setup_rtracker, 0x1034 }, { func1435_setup_environment, 0x1435 }, { func1036_check_door_terminal_destroyed, 0x1036 }, diff --git a/src/game/data/ailists.c b/src/game/data/ailists.c index d5575dab1..6b1445ef8 100644 --- a/src/game/data/ailists.c +++ b/src/game/data/ailists.c @@ -1065,7 +1065,7 @@ u8 func0007_alerted[] = { yield label(0x16) if_chr_has_hiddenflag(CHR_SELF, CHRHFLAG_00002000, /*goto*/ 0x13) - if_chr_has_hiddenflag(CHR_TARGET, CHRHFLAG_BUDDY_PLACED, /*goto*/ 0x01) + if_chr_has_hiddenflag(CHR_TARGET, CHRHFLAG_UNTARGETABLE, /*goto*/ 0x01) label(0x13) if_self_flag_bankx_eq(CHRFLAG1_00000001, TRUE, BANK_1, /*goto*/ LABEL_TRACK) dprint 'C','H','E','C','K','I','N','J','U','R','Y','E','N','D','\n',0, @@ -2157,7 +2157,7 @@ u8 func0007_alerted[] = { beginloop(0x35) if_chr_has_hiddenflag(CHR_SELF, CHRHFLAG_00002000, /*goto*/ 0x13) - if_chr_has_hiddenflag(CHR_TARGET, CHRHFLAG_BUDDY_PLACED, /*goto*/ 0x01) + if_chr_has_hiddenflag(CHR_TARGET, CHRHFLAG_UNTARGETABLE, /*goto*/ 0x01) label(0x13) if_dangerous_object_nearby(3, /*goto*/ LABEL_FLEE_GRENADE) if_chr_has_hiddenflag(CHR_TARGET, CHRHFLAG_CLOAKED, /*goto*/ LABEL_CLOAKED) @@ -4726,11 +4726,11 @@ u8 func0014_coop_buddy[] = { beginloop(0xf2) if_chr_has_hiddenflag(CHR_BOND, CHRHFLAG_TRIGGER_BUDDY_WARP, /*goto*/ 0x13) - unset_chr_hiddenflag(CHR_SELF, CHRHFLAG_BUDDY_PLACED) + unset_chr_hiddenflag(CHR_SELF, CHRHFLAG_UNTARGETABLE) goto_next(0x15) label(0x13) - if_chr_has_hiddenflag(CHR_SELF, CHRHFLAG_BUDDY_PLACED, /*goto*/ 0x15) + if_chr_has_hiddenflag(CHR_SELF, CHRHFLAG_UNTARGETABLE, /*goto*/ 0x15) goto_next(LABEL_PLACE_BUDDY) label(0x15) @@ -4764,11 +4764,11 @@ u8 func0014_coop_buddy[] = { beginloop(0x0c) if_chr_has_hiddenflag(CHR_BOND, CHRHFLAG_TRIGGER_BUDDY_WARP, /*goto*/ 0x13) - unset_chr_hiddenflag(CHR_SELF, CHRHFLAG_BUDDY_PLACED) + unset_chr_hiddenflag(CHR_SELF, CHRHFLAG_UNTARGETABLE) goto_next(0x15) label(0x13) - if_chr_has_hiddenflag(CHR_SELF, CHRHFLAG_BUDDY_PLACED, /*goto*/ 0x15) + if_chr_has_hiddenflag(CHR_SELF, CHRHFLAG_UNTARGETABLE, /*goto*/ 0x15) goto_next(LABEL_PLACE_BUDDY) label(0x15) @@ -4799,11 +4799,11 @@ u8 func0014_coop_buddy[] = { beginloop(0x04) if_chr_has_hiddenflag(CHR_BOND, CHRHFLAG_TRIGGER_BUDDY_WARP, /*goto*/ 0x13) - unset_chr_hiddenflag(CHR_SELF, CHRHFLAG_BUDDY_PLACED) + unset_chr_hiddenflag(CHR_SELF, CHRHFLAG_UNTARGETABLE) goto_next(0x15) label(0x13) - if_chr_has_hiddenflag(CHR_SELF, CHRHFLAG_BUDDY_PLACED, /*goto*/ 0x15) + if_chr_has_hiddenflag(CHR_SELF, CHRHFLAG_UNTARGETABLE, /*goto*/ 0x15) goto_next(LABEL_PLACE_BUDDY) label(0x15) @@ -5333,7 +5333,7 @@ u8 func0020_place_coop_buddy[] = { unset_self_chrflag(CHRCFLAG_INVINCIBLE_TO_GUNFIRE) stop_chr set_chr_cloaked(CHR_SELF, FALSE, TRUE) - set_chr_hiddenflag(CHR_SELF, CHRHFLAG_BUDDY_PLACED) + set_chr_hiddenflag(CHR_SELF, CHRHFLAG_UNTARGETABLE) set_returnlist(CHR_SELF, GAILIST_COOP_BUDDY) set_ailist(CHR_SELF, GAILIST_COOP_BUDDY) @@ -5367,7 +5367,7 @@ u8 func0020_place_coop_buddy[] = { label(0x13) stop_chr set_chr_hiddenflag(CHR_SELF, CHRHFLAG_00020000) - set_chr_hiddenflag(CHR_SELF, CHRHFLAG_BUDDY_PLACED) + set_chr_hiddenflag(CHR_SELF, CHRHFLAG_UNTARGETABLE) // Wait until flag unset (timer is not checked) restart_timer diff --git a/src/game/game_097ba0.c b/src/game/game_097ba0.c index cd2ac0bb4..892590cb8 100644 --- a/src/game/game_097ba0.c +++ b/src/game/game_097ba0.c @@ -11796,305 +11796,156 @@ glabel func0f0a134c /* f0a1524: 27bd0040 */ addiu $sp,$sp,0x40 ); -GLOBAL_ASM( -glabel func0f0a1528 -/* f0a1528: 27bdffb8 */ addiu $sp,$sp,-72 -/* f0a152c: afb50040 */ sw $s5,0x40($sp) -/* f0a1530: 3c03800a */ lui $v1,%hi(g_Vars+0x284) -/* f0a1534: 8c75a244 */ lw $s5,%lo(g_Vars+0x284)($v1) -/* f0a1538: afb4003c */ sw $s4,0x3c($sp) -/* f0a153c: afbf0044 */ sw $ra,0x44($sp) -/* f0a1540: afb30038 */ sw $s3,0x38($sp) -/* f0a1544: afb20034 */ sw $s2,0x34($sp) -/* f0a1548: afb10030 */ sw $s1,0x30($sp) -/* f0a154c: afb0002c */ sw $s0,0x2c($sp) -/* f0a1550: f7b40020 */ sdc1 $f20,0x20($sp) -/* f0a1554: 26b41580 */ addiu $s4,$s5,0x1580 -/* f0a1558: 828e0002 */ lb $t6,0x2($s4) -/* f0a155c: 05c200e6 */ bltzl $t6,.L0f0a18f8 -/* f0a1560: 82a20de4 */ lb $v0,0xde4($s5) -/* f0a1564: 0fc26fb2 */ jal func0f09bec8 -/* f0a1568: 00002025 */ or $a0,$zero,$zero -/* f0a156c: 504000f6 */ beqzl $v0,.L0f0a1948 -/* f0a1570: 8fbf0044 */ lw $ra,0x44($sp) -/* f0a1574: 0fc26fb2 */ jal func0f09bec8 -/* f0a1578: 24040001 */ addiu $a0,$zero,0x1 -/* f0a157c: 504000f2 */ beqzl $v0,.L0f0a1948 -/* f0a1580: 8fbf0044 */ lw $ra,0x44($sp) -/* f0a1584: 82b01580 */ lb $s0,0x1580($s5) -/* f0a1588: 82b10de4 */ lb $s1,0xde4($s5) -/* f0a158c: 0fc2c62f */ jal currentPlayerGetDeviceState -/* f0a1590: 82840002 */ lb $a0,0x2($s4) -/* f0a1594: 2401ffff */ addiu $at,$zero,-1 -/* f0a1598: 10410002 */ beq $v0,$at,.L0f0a15a4 -/* f0a159c: 24120001 */ addiu $s2,$zero,0x1 -/* f0a15a0: a2920002 */ sb $s2,0x2($s4) -.L0f0a15a4: -/* f0a15a4: 82980003 */ lb $t8,0x3($s4) -/* f0a15a8: 24120001 */ addiu $s2,$zero,0x1 -/* f0a15ac: 07010009 */ bgez $t8,.L0f0a15d4 -/* f0a15b0: 00000000 */ nop -/* f0a15b4: 82840002 */ lb $a0,0x2($s4) -/* f0a15b8: 0fc4473e */ jal invHasDoubleWeaponIncAllGuns -/* f0a15bc: 00802825 */ or $a1,$a0,$zero -/* f0a15c0: 14400004 */ bnez $v0,.L0f0a15d4 -/* f0a15c4: 00000000 */ nop -/* f0a15c8: 92990003 */ lbu $t9,0x3($s4) -/* f0a15cc: 3328ff7f */ andi $t0,$t9,0xff7f -/* f0a15d0: a2880003 */ sb $t0,0x3($s4) -.L0f0a15d4: -/* f0a15d4: 0fc35cd9 */ jal func0f0d7364 -/* f0a15d8: 00000000 */ nop -/* f0a15dc: 0fc284d3 */ jal func0f0a134c -/* f0a15e0: 02402025 */ or $a0,$s2,$zero -/* f0a15e4: 0fc284d3 */ jal func0f0a134c -/* f0a15e8: 00002025 */ or $a0,$zero,$zero -/* f0a15ec: 24060032 */ addiu $a2,$zero,0x32 -/* f0a15f0: 16060005 */ bne $s0,$a2,.L0f0a1608 -/* f0a15f4: 2401000d */ addiu $at,$zero,0xd -/* f0a15f8: 3c05800a */ lui $a1,%hi(g_Vars) -/* f0a15fc: 24a59fc0 */ addiu $a1,$a1,%lo(g_Vars) -/* f0a1600: 8ca90284 */ lw $t1,0x284($a1) -/* f0a1604: ad200120 */ sw $zero,0x120($t1) -.L0f0a1608: -/* f0a1608: 3c05800a */ lui $a1,%hi(g_Vars) -/* f0a160c: 1601000f */ bne $s0,$at,.L0f0a164c -/* f0a1610: 24a59fc0 */ addiu $a1,$a1,%lo(g_Vars) -/* f0a1614: c6a40874 */ lwc1 $f4,0x874($s5) -/* f0a1618: 828b0064 */ lb $t3,0x64($s4) -/* f0a161c: 4600218d */ trunc.w.s $f6,$f4 -/* f0a1620: 000b6080 */ sll $t4,$t3,0x2 -/* f0a1624: 02ac2021 */ addu $a0,$s5,$t4 -/* f0a1628: 8c8317a8 */ lw $v1,0x17a8($a0) -/* f0a162c: 44023000 */ mfc1 $v0,$f6 -/* f0a1630: 00000000 */ nop -/* f0a1634: 0062082a */ slt $at,$v1,$v0 -/* f0a1638: 50200003 */ beqzl $at,.L0f0a1648 -/* f0a163c: 00626823 */ subu $t5,$v1,$v0 -/* f0a1640: 00601025 */ or $v0,$v1,$zero -/* f0a1644: 00626823 */ subu $t5,$v1,$v0 -.L0f0a1648: -/* f0a1648: ac8d17a8 */ sw $t5,0x17a8($a0) -.L0f0a164c: -/* f0a164c: 5606000f */ bnel $s0,$a2,.L0f0a168c -/* f0a1650: 82840002 */ lb $a0,0x2($s4) -/* f0a1654: 44804000 */ mtc1 $zero,$f8 -/* f0a1658: 8cae0284 */ lw $t6,0x284($a1) -/* f0a165c: 3c014270 */ lui $at,0x4270 -/* f0a1660: 44818000 */ mtc1 $at,$f16 -/* f0a1664: e5c81844 */ swc1 $f8,0x1844($t6) -/* f0a1668: 8ca30284 */ lw $v1,0x284($a1) -/* f0a166c: c46a1844 */ lwc1 $f10,0x1844($v1) -/* f0a1670: e46a1840 */ swc1 $f10,0x1840($v1) -/* f0a1674: 8caf0284 */ lw $t7,0x284($a1) -/* f0a1678: e5f01850 */ swc1 $f16,0x1850($t7) -/* f0a167c: 8ca30284 */ lw $v1,0x284($a1) -/* f0a1680: c4721850 */ lwc1 $f18,0x1850($v1) -/* f0a1684: e4721848 */ swc1 $f18,0x1848($v1) -/* f0a1688: 82840002 */ lb $a0,0x2($s4) -.L0f0a168c: -/* f0a168c: 26a20ddc */ addiu $v0,$s5,0xddc -/* f0a1690: 14800005 */ bnez $a0,.L0f0a16a8 -/* f0a1694: 00000000 */ nop -/* f0a1698: a0400008 */ sb $zero,0x8($v0) -/* f0a169c: a2a00640 */ sb $zero,0x640($s5) -/* f0a16a0: 1000000a */ b .L0f0a16cc -/* f0a16a4: a2800000 */ sb $zero,0x0($s4) -.L0f0a16a8: -/* f0a16a8: 0fc277d9 */ jal func0f09df64 -/* f0a16ac: 00000000 */ nop -/* f0a16b0: 82980002 */ lb $t8,0x2($s4) -/* f0a16b4: 26a20ddc */ addiu $v0,$s5,0xddc -/* f0a16b8: 3c05800a */ lui $a1,%hi(g_Vars) -/* f0a16bc: a2980000 */ sb $t8,0x0($s4) -/* f0a16c0: a0520008 */ sb $s2,0x8($v0) -/* f0a16c4: a2b20640 */ sb $s2,0x640($s5) -/* f0a16c8: 24a59fc0 */ addiu $a1,$a1,%lo(g_Vars) -.L0f0a16cc: -/* f0a16cc: 82990000 */ lb $t9,0x0($s4) -/* f0a16d0: 24010022 */ addiu $at,$zero,0x22 -/* f0a16d4: 57210005 */ bnel $t9,$at,.L0f0a16ec -/* f0a16d8: 828c0003 */ lb $t4,0x3($s4) -/* f0a16dc: 92890003 */ lbu $t1,0x3($s4) -/* f0a16e0: 352a0080 */ ori $t2,$t1,0x80 -/* f0a16e4: a28a0003 */ sb $t2,0x3($s4) -/* f0a16e8: 828c0003 */ lb $t4,0x3($s4) -.L0f0a16ec: -/* f0a16ec: 2a01002d */ slti $at,$s0,0x2d -/* f0a16f0: 05800002 */ bltz $t4,.L0f0a16fc -/* f0a16f4: 00000000 */ nop -/* f0a16f8: a0400008 */ sb $zero,0x8($v0) -.L0f0a16fc: -/* f0a16fc: 10200004 */ beqz $at,.L0f0a1710 -/* f0a1700: 00000000 */ nop -/* f0a1704: 1a000002 */ blez $s0,.L0f0a1710 -/* f0a1708: 00000000 */ nop -/* f0a170c: a2b01581 */ sb $s0,0x1581($s5) -.L0f0a1710: -/* f0a1710: 52200006 */ beqzl $s1,.L0f0a172c -/* f0a1714: 92b81583 */ lbu $t8,0x1583($s5) -/* f0a1718: 92ae1583 */ lbu $t6,0x1583($s5) -/* f0a171c: 35cf0040 */ ori $t7,$t6,0x40 -/* f0a1720: 10000004 */ b .L0f0a1734 -/* f0a1724: a2af1583 */ sb $t7,0x1583($s5) -/* f0a1728: 92b81583 */ lbu $t8,0x1583($s5) -.L0f0a172c: -/* f0a172c: 3319ffbf */ andi $t9,$t8,0xffbf -/* f0a1730: a2b91583 */ sb $t9,0x1583($s5) -.L0f0a1734: -/* f0a1734: 8ca30284 */ lw $v1,0x284($a1) -/* f0a1738: 240affff */ addiu $t2,$zero,-1 -/* f0a173c: 4480a000 */ mtc1 $zero,$f20 -/* f0a1740: 90681583 */ lbu $t0,0x1583($v1) -/* f0a1744: 00008825 */ or $s1,$zero,$zero -/* f0a1748: 02a08025 */ or $s0,$s5,$zero -/* f0a174c: 3109ffdf */ andi $t1,$t0,0xffdf -/* f0a1750: a0691583 */ sb $t1,0x1583($v1) -/* f0a1754: 8cab0284 */ lw $t3,0x284($a1) -/* f0a1758: 00009025 */ or $s2,$zero,$zero -/* f0a175c: 26b309e0 */ addiu $s3,$s5,0x9e0 -/* f0a1760: a56a024e */ sh $t2,0x24e($t3) -.L0f0a1764: -/* f0a1764: 920c0d0e */ lbu $t4,0xd0e($s0) -/* f0a1768: 92180d0f */ lbu $t8,0xd0f($s0) -/* f0a176c: e6140874 */ swc1 $f20,0x874($s0) -/* f0a1770: 318eff0f */ andi $t6,$t4,0xff0f -/* f0a1774: 3308ffdf */ andi $t0,$t8,0xffdf -/* f0a1778: a20e0d0e */ sb $t6,0xd0e($s0) -/* f0a177c: 31cf00f1 */ andi $t7,$t6,0xf1 -/* f0a1780: a2080d0f */ sb $t0,0xd0f($s0) -/* f0a1784: 310900ef */ andi $t1,$t0,0xef -/* f0a1788: a20f0d0e */ sb $t7,0xd0e($s0) -/* f0a178c: a2090d0f */ sb $t1,0xd0f($s0) -/* f0a1790: e6140878 */ swc1 $f20,0x878($s0) -/* f0a1794: e614087c */ swc1 $f20,0x87c($s0) -/* f0a1798: e6140868 */ swc1 $f20,0x868($s0) -/* f0a179c: e6140db8 */ swc1 $f20,0xdb8($s0) -/* f0a17a0: ae000b90 */ sw $zero,0xb90($s0) -/* f0a17a4: e6140888 */ swc1 $f20,0x888($s0) -/* f0a17a8: ae00080c */ sw $zero,0x80c($s0) -/* f0a17ac: ae000810 */ sw $zero,0x810($s0) -/* f0a17b0: a200063b */ sb $zero,0x63b($s0) -/* f0a17b4: 828a0000 */ lb $t2,0x0($s4) -/* f0a17b8: 02202025 */ or $a0,$s1,$zero -/* f0a17bc: a20a0638 */ sb $t2,0x638($s0) -/* f0a17c0: 928b0068 */ lbu $t3,0x68($s4) -/* f0a17c4: e6140d08 */ swc1 $f20,0xd08($s0) -/* f0a17c8: 024b6007 */ srav $t4,$t3,$s2 -/* f0a17cc: 318d000f */ andi $t5,$t4,0xf -/* f0a17d0: 0fc2af4c */ jal func0f0abd30 -/* f0a17d4: a20d0639 */ sb $t5,0x639($s0) -/* f0a17d8: 0c008c28 */ jal animInitialise -/* f0a17dc: 02602025 */ or $a0,$s3,$zero -/* f0a17e0: 8e040d84 */ lw $a0,0xd84($s0) -/* f0a17e4: 50800008 */ beqzl $a0,.L0f0a1808 -/* f0a17e8: 26310001 */ addiu $s1,$s1,0x1 -/* f0a17ec: 0c00cdfc */ jal audioIsPlaying -/* f0a17f0: 00000000 */ nop -/* f0a17f4: 50400004 */ beqzl $v0,.L0f0a1808 -/* f0a17f8: 26310001 */ addiu $s1,$s1,0x1 -/* f0a17fc: 0c00cec9 */ jal audioStop -/* f0a1800: 8e040d84 */ lw $a0,0xd84($s0) -/* f0a1804: 26310001 */ addiu $s1,$s1,0x1 -.L0f0a1808: -/* f0a1808: 24010002 */ addiu $at,$zero,0x2 -/* f0a180c: 261007a4 */ addiu $s0,$s0,0x7a4 -/* f0a1810: 26520004 */ addiu $s2,$s2,0x4 -/* f0a1814: 1621ffd3 */ bne $s1,$at,.L0f0a1764 -/* f0a1818: 267307a4 */ addiu $s3,$s3,0x7a4 -/* f0a181c: 0fc44bdc */ jal invCalculateCurrentIndex -/* f0a1820: 00000000 */ nop -/* f0a1824: 82820000 */ lb $v0,0x0($s4) -/* f0a1828: 240effff */ addiu $t6,$zero,-1 -/* f0a182c: 24010040 */ addiu $at,$zero,0x40 -/* f0a1830: a28e0002 */ sb $t6,0x2($s4) -/* f0a1834: 10410004 */ beq $v0,$at,.L0f0a1848 -/* f0a1838: a2800067 */ sb $zero,0x67($s4) -/* f0a183c: 24010041 */ addiu $at,$zero,0x41 -/* f0a1840: 54410027 */ bnel $v0,$at,.L0f0a18e0 -/* f0a1844: 92990003 */ lbu $t9,0x3($s4) -.L0f0a1848: -/* f0a1848: 8eaf00bc */ lw $t7,0xbc($s5) -/* f0a184c: 3c01bf80 */ lui $at,0xbf80 -/* f0a1850: 44812000 */ mtc1 $at,$f4 -/* f0a1854: 8df00004 */ lw $s0,0x4($t7) -/* f0a1858: 3c048009 */ lui $a0,%hi(var80095200) -/* f0a185c: 2418ffff */ addiu $t8,$zero,-1 -/* f0a1860: 2419ffff */ addiu $t9,$zero,-1 -/* f0a1864: 2408ffff */ addiu $t0,$zero,-1 -/* f0a1868: afa8001c */ sw $t0,0x1c($sp) -/* f0a186c: afb90018 */ sw $t9,0x18($sp) -/* f0a1870: afb80010 */ sw $t8,0x10($sp) -/* f0a1874: 8c845200 */ lw $a0,%lo(var80095200)($a0) -/* f0a1878: 2405042e */ addiu $a1,$zero,0x42e -/* f0a187c: 00003025 */ or $a2,$zero,$zero -/* f0a1880: 2407ffff */ addiu $a3,$zero,-1 -/* f0a1884: 0c004241 */ jal audioStart -/* f0a1888: e7a40014 */ swc1 $f4,0x14($sp) -/* f0a188c: 3c03800a */ lui $v1,%hi(g_Vars+0x284) -/* f0a1890: 8c63a244 */ lw $v1,%lo(g_Vars+0x284)($v1) -/* f0a1894: 3c010008 */ lui $at,0x8 -/* f0a1898: 3c0e800a */ lui $t6,%hi(g_Vars+0x4b4) -/* f0a189c: 906a1c50 */ lbu $t2,0x1c50($v1) -/* f0a18a0: 354b0040 */ ori $t3,$t2,0x40 -/* f0a18a4: a06b1c50 */ sb $t3,0x1c50($v1) -/* f0a18a8: 8e0c0014 */ lw $t4,0x14($s0) -/* f0a18ac: 01816825 */ or $t5,$t4,$at -/* f0a18b0: ae0d0014 */ sw $t5,0x14($s0) -/* f0a18b4: 8dcea474 */ lw $t6,%lo(g_Vars+0x4b4)($t6) -/* f0a18b8: 24010035 */ addiu $at,$zero,0x35 -/* f0a18bc: 35b81000 */ ori $t8,$t5,0x1000 -/* f0a18c0: 15c10002 */ bne $t6,$at,.L0f0a18cc -/* f0a18c4: 00000000 */ nop -/* f0a18c8: ae180014 */ sw $t8,0x14($s0) -.L0f0a18cc: -/* f0a18cc: 0fc447a9 */ jal invRemoveItemByNum -/* f0a18d0: 82840000 */ lb $a0,0x0($s4) -/* f0a18d4: 0fc2870b */ jal func0f0a1c2c -/* f0a18d8: 00000000 */ nop -/* f0a18dc: 92990003 */ lbu $t9,0x3($s4) -.L0f0a18e0: -/* f0a18e0: a680006c */ sh $zero,0x6c($s4) -/* f0a18e4: a280006e */ sb $zero,0x6e($s4) -/* f0a18e8: 3328fff7 */ andi $t0,$t9,0xfff7 -/* f0a18ec: 10000015 */ b .L0f0a1944 -/* f0a18f0: a2880003 */ sb $t0,0x3($s4) -/* f0a18f4: 82a20de4 */ lb $v0,0xde4($s5) -.L0f0a18f8: -/* f0a18f8: 10400004 */ beqz $v0,.L0f0a190c -/* f0a18fc: 00000000 */ nop -/* f0a1900: 82aa1583 */ lb $t2,0x1583($s5) -/* f0a1904: 05410006 */ bgez $t2,.L0f0a1920 -/* f0a1908: 00000000 */ nop -.L0f0a190c: -/* f0a190c: 5440000e */ bnezl $v0,.L0f0a1948 -/* f0a1910: 8fbf0044 */ lw $ra,0x44($sp) -/* f0a1914: 82ac1583 */ lb $t4,0x1583($s5) -/* f0a1918: 0583000b */ bgezl $t4,.L0f0a1948 -/* f0a191c: 8fbf0044 */ lw $ra,0x44($sp) -.L0f0a1920: -/* f0a1920: 0fc26fb2 */ jal func0f09bec8 -/* f0a1924: 24040001 */ addiu $a0,$zero,0x1 -/* f0a1928: 50400007 */ beqzl $v0,.L0f0a1948 -/* f0a192c: 8fbf0044 */ lw $ra,0x44($sp) -/* f0a1930: 0fc284d3 */ jal func0f0a134c -/* f0a1934: 24040001 */ addiu $a0,$zero,0x1 -/* f0a1938: 92ad1583 */ lbu $t5,0x1583($s5) -/* f0a193c: 000d71c2 */ srl $t6,$t5,0x7 -/* f0a1940: a2ae0de4 */ sb $t6,0xde4($s5) -.L0f0a1944: -/* f0a1944: 8fbf0044 */ lw $ra,0x44($sp) -.L0f0a1948: -/* f0a1948: d7b40020 */ ldc1 $f20,0x20($sp) -/* f0a194c: 8fb0002c */ lw $s0,0x2c($sp) -/* f0a1950: 8fb10030 */ lw $s1,0x30($sp) -/* f0a1954: 8fb20034 */ lw $s2,0x34($sp) -/* f0a1958: 8fb30038 */ lw $s3,0x38($sp) -/* f0a195c: 8fb4003c */ lw $s4,0x3c($sp) -/* f0a1960: 8fb50040 */ lw $s5,0x40($sp) -/* f0a1964: 03e00008 */ jr $ra -/* f0a1968: 27bd0048 */ addiu $sp,$sp,0x48 -); +void func0f0a1528(void) +{ + struct player *player = g_Vars.currentplayer; + struct gunctrl *ctrl = &g_Vars.currentplayer->gunctrl; + s32 i; + + if (ctrl->switchtoweaponnum >= 0) { + if (func0f09bec8(HAND_RIGHT) && func0f09bec8(HAND_LEFT)) { + s32 weaponnum = player->gunctrl.weaponnum; + s32 prev640 = player->hands[HAND_LEFT].unk0640; + struct hand *lefthand; + struct hand *righthand; + + if (currentPlayerGetDeviceState(ctrl->switchtoweaponnum) != DEVICESTATE_UNEQUIPPED) { + ctrl->switchtoweaponnum = WEAPON_UNARMED; + } + + if (ctrl->unk1583_00 + && !invHasDoubleWeaponIncAllGuns(ctrl->switchtoweaponnum, ctrl->switchtoweaponnum)) { + ctrl->unk1583_00 = false; + } + + func0f0d7364(); + + func0f0a134c(HAND_LEFT); + func0f0a134c(HAND_RIGHT); + + if (weaponnum == WEAPON_HORIZONSCANNER) { + g_Vars.currentplayer->insightaimmode = false; + } + + if (weaponnum == WEAPON_RCP120) { + s32 amount = player->hands[HAND_RIGHT].unk0874; + + if (amount > player->ammoheldarr[ctrl->totalammo[0]]) { + amount = player->ammoheldarr[ctrl->totalammo[0]]; + } + + player->ammoheldarr[ctrl->totalammo[0]] -= amount; + } + + if (weaponnum == WEAPON_HORIZONSCANNER) { + g_Vars.currentplayer->zoomintimemax = 0; + g_Vars.currentplayer->zoomintime = g_Vars.currentplayer->zoomintimemax; + g_Vars.currentplayer->zoominfovynew = 60; + g_Vars.currentplayer->zoominfovy = g_Vars.currentplayer->zoominfovynew; + } + + lefthand = &player->hands[HAND_LEFT]; + righthand = &player->hands[HAND_RIGHT]; + + if (ctrl->switchtoweaponnum == WEAPON_NONE) { + lefthand->unk0640 = 0; + righthand->unk0640 = 0; + ctrl->weaponnum = WEAPON_NONE; + } else { + func0f09df64(ctrl->switchtoweaponnum); + ctrl->weaponnum = ctrl->switchtoweaponnum; + lefthand->unk0640 = 1; + righthand->unk0640 = 1; + } + + if (ctrl->weaponnum == WEAPON_REMOTEMINE) { + ctrl->unk1583_00 = true; + } + + if (!ctrl->unk1583_00) { + lefthand->unk0640 = 0; + } + + if (weaponnum <= WEAPON_PSYCHOSISGUN && weaponnum >= WEAPON_UNARMED) { + player->gunctrl.prevweaponnum = weaponnum; + } + + if (prev640) { + player->gunctrl.unk1583_01 = true; + } else { + player->gunctrl.unk1583_01 = false; + } + + g_Vars.currentplayer->gunctrl.invertgunfunc = false; + g_Vars.currentplayer->usedowntime = -1; + + for (i = 0; i < 2; i++) { + player->hands[i].unk0874 = 0.0f; + + player->hands[i].unk0d0e_00 = 0; + player->hands[i].unk0d0e_04 = 0; + player->hands[i].unk0d0f_02 = false; + player->hands[i].unk0d0f_03 = false; + + player->hands[i].unk0878 = 0.0f; + player->hands[i].unk087c = 0.0f; + player->hands[i].unk0868 = 0.0f; + player->hands[i].unk0db8 = 0.0f; + player->hands[i].unk0b90 = 0; + player->hands[i].unk0888 = 0.0f; + player->hands[i].unk080c = 0; + player->hands[i].unk0810 = 0; + player->hands[i].base.weaponfunc = FUNC_PRIMARY; + + player->hands[i].base.weaponnum = ctrl->weaponnum; + + player->hands[i].base.unk0639 = (ctrl->unk15e8 >> (i * 4)) & 0xf; + player->hands[i].unk0d08 = 0.0f; + + func0f0abd30(i); + + animInitialise(&player->hands[i].anim); + + if (player->hands[i].audiohandle && audioIsPlaying(player->hands[i].audiohandle)) { + audioStop(player->hands[i].audiohandle); + } + } + + invCalculateCurrentIndex(); + + ctrl->switchtoweaponnum = -1; + ctrl->unk15e7 = 0; + + if (ctrl->weaponnum == WEAPON_DISGUISE40 || ctrl->weaponnum == WEAPON_DISGUISE41) { + struct chrdata *chr = player->prop->chr; + + audioStart(var80095200, SFX_DISGUISE_ON, 0, -1, -1, -1, -1, -1); + + g_Vars.currentplayer->disguised = true; + + chr->hidden |= CHRHFLAG_DISGUISED; + + if (g_Vars.stagenum == STAGE_RESCUE) { + chr->hidden |= CHRHFLAG_UNTARGETABLE; + } + + invRemoveItemByNum(ctrl->weaponnum); + func0f0a1c2c(); + } + + ctrl->unk15ec = 0; + ctrl->unk15ee = 0; + ctrl->unk1583_04 = false; + } + } else { + if (((player->hands[HAND_LEFT].unk0640 && !player->gunctrl.unk1583_00) + || (!player->hands[HAND_LEFT].unk0640 && player->gunctrl.unk1583_00)) + && func0f09bec8(HAND_LEFT)) { + func0f0a134c(HAND_LEFT); + player->hands[HAND_LEFT].unk0640 = player->gunctrl.unk1583_00; + } + } +} void currentPlayerEquipWeapon(s32 weaponnum) { diff --git a/src/include/constants.h b/src/include/constants.h index 882ba55a3..26b9bd020 100644 --- a/src/include/constants.h +++ b/src/include/constants.h @@ -454,7 +454,7 @@ #define CHRHFLAG_00000200 0x00000200 // Not used in scripts #define CHRHFLAG_PASSIVE 0x00000400 #define CHRHFLAG_KEEP_CORPSE 0x00000800 // Appears to be misnamed -#define CHRHFLAG_BUDDY_PLACED 0x00001000 +#define CHRHFLAG_UNTARGETABLE 0x00001000 #define CHRHFLAG_00002000 0x00002000 // Globals, Rescue guards once disguised #define CHRHFLAG_TRIGGER_BUDDY_WARP 0x00004000 #define CHRHFLAG_00008000 0x00008000 // Duel only. Set on each opponent when they start combat. diff --git a/src/include/game/game_097ba0.h b/src/include/game/game_097ba0.h index 4bf4f1b52..a5a56b6e8 100644 --- a/src/include/game/game_097ba0.h +++ b/src/include/game/game_097ba0.h @@ -42,7 +42,7 @@ u32 func0f09b828(void); u32 func0f09b8e0(void); u32 func0f09bc2c(void); u32 func0f09bd58(void); -u32 func0f09bec8(void); +bool func0f09bec8(s32 handnum); u32 func0f09bf44(void); u32 func0f09c01c(void); u32 func0f09cb44(void); @@ -61,7 +61,7 @@ u32 func0f09ddcc(void); u32 func0f09ddec(void); u32 func0f09ddfc(void); void func0f09df50(void); -void func0f09df64(s32 arg0); +void func0f09df64(s32 weaponnum); void func0f09df9c(void); u32 func0f09e004(void); u32 func0f09e144(void); @@ -87,8 +87,8 @@ void func0f0a0cb0(struct coord *arg0, struct coord *arg1, s32 handnum, bool arg3 u32 func0f0a0fac(void); void func0f0a12b0(struct coord *arg0, struct coord *arg1, s32 handnum); bool func0f0a1318(s32 handnum); -u32 func0f0a134c(void); -u32 func0f0a1528(void); +void func0f0a134c(s32 handnum); +void func0f0a1528(void); void currentPlayerEquipWeapon(s32 weaponnum); s32 handGetWeaponNum(s32 handnum); bool func0f0a1a10(s32 weaponnum); @@ -175,7 +175,7 @@ void cboostRevert(void); void speedpillTick(void); void currentPlayerSetGunSightVisible(u32 bits, bool visible); Gfx *func0f0abcb0(Gfx *gdl); -u32 func0f0abd30(void); +void func0f0abd30(s32 handnum); s32 getCurrentPlayerWeaponIdWrapper(s32 handnum); s8 freeFireslotWrapper(s32 fireslot); s8 freeFireslot(s32 fireslot); diff --git a/src/include/sfx.h b/src/include/sfx.h index 1a75a2b57..45ea26c32 100644 --- a/src/include/sfx.h +++ b/src/include/sfx.h @@ -266,6 +266,7 @@ #define SFX_M2_WERE_GONNA_DIE 0x0421 #define SFX_DOOR_042B 0x042b #define SFX_DOOR_042C 0x042c +#define SFX_DISGUISE_ON 0x042e #define SFX_RELOAD_FARSIGHT 0x0433 #define SFX_MENU_SUBFOCUS 0x043e #define SFX_MENU_FOCUS 0x0441 diff --git a/src/include/types.h b/src/include/types.h index 059036ee1..f2a724344 100644 --- a/src/include/types.h +++ b/src/include/types.h @@ -1858,15 +1858,15 @@ struct hand { /*0x0854*/ u32 unk0854; /*0x0858*/ s32 loadedammo[2]; /*0x0860*/ s32 clipsizes[2]; - /*0x0868*/ u32 unk0868; + /*0x0868*/ f32 unk0868; /*0x086c*/ u32 unk086c; /*0x0870*/ u32 unk0870; /*0x0874*/ f32 unk0874; // Mauler charge amount? Or a timer - /*0x0878*/ u32 unk0878; - /*0x087c*/ u32 unk087c; + /*0x0878*/ f32 unk0878; + /*0x087c*/ f32 unk087c; /*0x0880*/ u32 unk0880; /*0x0884*/ u32 unk0884; - /*0x0888*/ u32 unk0888; + /*0x0888*/ f32 unk0888; /*0x088c*/ u32 unk088c; /*0x0890*/ u32 unk0890; /*0x0894*/ u32 unk0894; @@ -1952,41 +1952,7 @@ struct hand { /*0x09d4*/ u32 unk09d4; /*0x09d8*/ u32 unk09d8; /*0x09dc*/ u32 unk09dc; - /*0x09e0*/ u32 unk09e0; - /*0x09e4*/ u32 unk09e4; - /*0x09e8*/ u32 unk09e8; - /*0x09ec*/ u32 unk09ec; - /*0x09f0*/ u32 unk09f0; - /*0x09f4*/ u32 unk09f4; - /*0x09f8*/ u32 unk09f8; - /*0x09fc*/ u32 unk09fc; - /*0x0a00*/ u32 unk0a00; - /*0x0a04*/ u32 unk0a04; - /*0x0a08*/ u32 unk0a08; - /*0x0a0c*/ u32 unk0a0c; - /*0x0a10*/ u32 unk0a10; - /*0x0a14*/ u32 unk0a14; - /*0x0a18*/ u32 unk0a18; - /*0x0a1c*/ u32 unk0a1c; - /*0x0a20*/ u32 unk0a20; - /*0x0a24*/ u32 unk0a24; - /*0x0a28*/ u32 unk0a28; - /*0x0a2c*/ u32 unk0a2c; - /*0x0a30*/ u32 unk0a30; - /*0x0a34*/ u32 unk0a34; - /*0x0a38*/ u32 unk0a38; - /*0x0a3c*/ u32 unk0a3c; - /*0x0a40*/ u32 unk0a40; - /*0x0a44*/ u32 unk0a44; - /*0x0a48*/ u32 unk0a48; - /*0x0a4c*/ u32 unk0a4c; - /*0x0a50*/ u32 unk0a50; - /*0x0a54*/ u32 unk0a54; - /*0x0a58*/ u32 unk0a58; - /*0x0a5c*/ u32 unk0a5c; - /*0x0a60*/ u32 unk0a60; - /*0x0a64*/ u32 unk0a64; - /*0x0a68*/ u32 unk0a68; + /*0x09e0*/ struct anim anim; /*0x0a6c*/ u32 unk0a6c; /*0x0a70*/ u32 unk0a70; /*0x0a74*/ u32 unk0a74; @@ -2150,7 +2116,7 @@ struct hand { /*0x0cec*/ ubool unk0cec; /*0x0cf0*/ struct coord unk0cf0; /*0x0cfc*/ struct coord unk0cfc; - /*0x0d08*/ u32 unk0d08; + /*0x0d08*/ f32 unk0d08; /*0x0d0c*/ u8 unk0d0c; /*0x0d0d*/ u8 unk0d0d; /*0x0d0e*/ u8 unk0d0e_00 : 4; @@ -2201,7 +2167,7 @@ struct hand { /*0x0dac*/ u32 unk0dac; /*0x0db0*/ u32 unk0db0; /*0x0db4*/ u32 unk0db4; - /*0x0db8*/ u32 unk0db8; + /*0x0db8*/ f32 unk0db8; /*0x0dbc*/ u32 unk0dbc; /*0x0dc0*/ u32 unk0dc0; /*0x0dc4*/ u32 unk0dc4; @@ -2263,10 +2229,12 @@ struct gunctrl { /*0x15e4*/ s8 totalammo[2]; /*0x15e6*/ u8 unk15e6; /*0x15e7*/ u8 unk15e7; - /*0x15e8*/ u16 unk15e8; + /*0x15e8*/ u8 unk15e8; + /*0x15e9*/ u8 unk15e9; /*0x15ea*/ u8 unk15ea; /*0x15eb*/ s8 unk15eb; - /*0x15ec*/ u32 unk15ec; + /*0x15ec*/ u16 unk15ec; + /*0x15ee*/ u8 unk15ee; /*0x15f0*/ u16 unk15f0; /*0x15f2*/ u16 unk15f2; /*0x15f4*/ u32 unk15f4;