diff --git a/src/files/setup/setupazt.c b/src/files/setup/setupazt.c index aaa355164..a7925fbc1 100644 --- a/src/files/setup/setupazt.c +++ b/src/files/setup/setupazt.c @@ -1360,7 +1360,7 @@ u8 func0418_robot[] = { * Assigned to two stripes guards. */ u8 func0414_spawner[] = { - set_self_chrflag(CHRCFLAG_00000002) + set_self_chrflag(CHRCFLAG_CLONEABLE) beginloop(0x06) chr_toggle_p1p2(CHR_SELF) diff --git a/src/files/setup/setupcave.c b/src/files/setup/setupcave.c index 28a47a37a..a4994e578 100644 --- a/src/files/setup/setupcave.c +++ b/src/files/setup/setupcave.c @@ -3141,7 +3141,7 @@ u8 func042a_foyer_spawner[] = { add_health_or_armor(40) set_recovery_speed(30) set_shield(0) - set_self_chrflag(CHRCFLAG_00000002) + set_self_chrflag(CHRCFLAG_CLONEABLE) set_self_chrflag(CHRCFLAG_HIDDEN) set_self_chrflag(CHRCFLAG_00040000) diff --git a/src/files/setup/setupimp.c b/src/files/setup/setupimp.c index 4604f9446..eafe9fd24 100644 --- a/src/files/setup/setupimp.c +++ b/src/files/setup/setupimp.c @@ -585,7 +585,7 @@ u8 func1400_setup_counterop[] = { }; #define spawner_logic(initfunc, clonefunc) \ - set_self_chrflag(CHRCFLAG_00000002) \ + set_self_chrflag(CHRCFLAG_CLONEABLE) \ set_self_chrflag(CHRCFLAG_HIDDEN) \ set_self_chrflag(CHRCFLAG_00040000) \ \ @@ -1718,7 +1718,7 @@ u8 func041b_init_hostage_holo[] = { }; u8 func041a_hostage_holo[] = { - set_self_chrflag(CHRCFLAG_00000002) + set_self_chrflag(CHRCFLAG_CLONEABLE) set_self_chrflag(CHRCFLAG_00040000) set_shotlist(AILIST_HOSTAGE_HOLO) if_chr_dying(CHR_SELF, /*goto*/ 0x2e) @@ -2972,7 +2972,7 @@ u8 func1015_firingrange_pc[] = { }; #define topspawner_logic(initfunc, clonefunc) \ - set_self_chrflag(CHRCFLAG_00000002) \ + set_self_chrflag(CHRCFLAG_CLONEABLE) \ set_self_chrflag(CHRCFLAG_HIDDEN) \ set_self_chrflag(CHRCFLAG_00040000) \ \ @@ -3111,7 +3111,7 @@ u8 func1016_remove_spawners[] = { // Spawner outside Jo's office u8 func0410_spawner6[] = { - set_self_chrflag(CHRCFLAG_00000002) + set_self_chrflag(CHRCFLAG_CLONEABLE) set_self_chrflag(CHRCFLAG_HIDDEN) set_self_chrflag(CHRCFLAG_00040000) diff --git a/src/files/setup/setuplee.c b/src/files/setup/setuplee.c index 8d82ca395..e002ed1ad 100644 --- a/src/files/setup/setuplee.c +++ b/src/files/setup/setuplee.c @@ -1656,7 +1656,7 @@ u8 func0406_start_path05[] = { u8 func0412_hangarspawner[] = { set_chr_chrflag(CHR_SELF, CHRCFLAG_KILLCOUNTABLE) - set_self_chrflag(CHRCFLAG_00000002) + set_self_chrflag(CHRCFLAG_CLONEABLE) set_self_chrflag(CHRCFLAG_HIDDEN) set_self_chrflag(CHRCFLAG_00040000) set_morale(0) @@ -2138,7 +2138,7 @@ u8 func0415_bridgespawner[] = { set_recovery_speed(0) set_shield(0) set_chr_chrflag(CHR_SELF, CHRCFLAG_KILLCOUNTABLE) - set_self_chrflag(CHRCFLAG_00000002) + set_self_chrflag(CHRCFLAG_CLONEABLE) set_self_chrflag(CHRCFLAG_HIDDEN) set_chr_cloaked(CHR_SELF, TRUE, FALSE) set_self_chrflag(CHRCFLAG_00040000) diff --git a/src/files/setup/setuplip.c b/src/files/setup/setuplip.c index 70dcd6989..cd9979c43 100644 --- a/src/files/setup/setuplip.c +++ b/src/files/setup/setuplip.c @@ -2387,7 +2387,7 @@ u8 func1011_unhide_warehouse_spawner[] = { }; u8 func0415_warehouse_spawner[] = { - set_self_chrflag(CHRCFLAG_00000002) + set_self_chrflag(CHRCFLAG_CLONEABLE) restart_timer beginloop(0x04) @@ -4025,7 +4025,7 @@ u8 func0429_spawn_while_xraying[] = { add_health_or_armor(0) set_recovery_speed(35) set_shield(0) - set_self_chrflag(CHRCFLAG_00000002) + set_self_chrflag(CHRCFLAG_CLONEABLE) set_self_chrflag(CHRCFLAG_HIDDEN) set_self_chrflag(CHRCFLAG_INVINCIBLE_TO_GUNFIRE) set_self_chrflag(CHRCFLAG_00040000) diff --git a/src/files/setup/setuplue.c b/src/files/setup/setuplue.c index fa5cc054b..d3bf5fdf6 100644 --- a/src/files/setup/setuplue.c +++ b/src/files/setup/setuplue.c @@ -2651,7 +2651,7 @@ u8 func0419_clone_spawner[] = { add_health_or_armor(10) set_recovery_speed(35) set_shield(0) - set_self_chrflag(CHRCFLAG_00000002) + set_self_chrflag(CHRCFLAG_CLONEABLE) set_self_chrflag(CHRCFLAG_HIDDEN) set_self_chrflag(CHRCFLAG_INVINCIBLE_TO_GUNFIRE) set_self_chrflag(CHRCFLAG_00040000) diff --git a/src/files/setup/setuppam.c b/src/files/setup/setuppam.c index 1b3141bd4..b12b0ce02 100644 --- a/src/files/setup/setuppam.c +++ b/src/files/setup/setuppam.c @@ -3370,7 +3370,7 @@ u8 func100f_check_drcaroll_dead[] = { u8 func040f_miniskedar_send_clones[] = { dprint 'D','E','T','E','C','T','E','D','\n',0, - set_self_chrflag(CHRCFLAG_00000002) + set_self_chrflag(CHRCFLAG_CLONEABLE) set_self_chrflag(CHRCFLAG_HIDDEN) set_self_chrflag(CHRCFLAG_00040000) diff --git a/src/files/setup/setuprit.c b/src/files/setup/setuprit.c index 9a625f50b..93e64a496 100644 --- a/src/files/setup/setuprit.c +++ b/src/files/setup/setuprit.c @@ -2425,7 +2425,7 @@ u8 func040b_defend_president[] = { }; u8 func0415_cloner1[] = { - set_self_chrflag(CHRCFLAG_00000002) + set_self_chrflag(CHRCFLAG_CLONEABLE) set_self_chrflag(CHRCFLAG_HIDDEN) set_self_chrflag(CHRCFLAG_00040000) @@ -2516,7 +2516,7 @@ u8 func0417_clone1[] = { }; u8 func0418_cloner2[] = { - set_self_chrflag(CHRCFLAG_00000002) + set_self_chrflag(CHRCFLAG_CLONEABLE) set_self_chrflag(CHRCFLAG_HIDDEN) set_self_chrflag(CHRCFLAG_00040000) @@ -2616,7 +2616,7 @@ u8 func041a_clone2[] = { * reached the escape pod. */ u8 func041b_cloner3[] = { - set_self_chrflag(CHRCFLAG_00000002) + set_self_chrflag(CHRCFLAG_CLONEABLE) set_self_chrflag(CHRCFLAG_HIDDEN) set_self_chrflag(CHRCFLAG_00040000) diff --git a/src/files/setup/setupsev.c b/src/files/setup/setupsev.c index f50a13d5e..eaff03e35 100644 --- a/src/files/setup/setupsev.c +++ b/src/files/setup/setupsev.c @@ -1187,7 +1187,7 @@ u8 func1006_activate_alarm[] = { * A hidden chr spawns clones every 50 seconds after the alarm is sounded. */ u8 func0410_clone_spawner[] = { - set_self_chrflag(CHRCFLAG_00000002) + set_self_chrflag(CHRCFLAG_CLONEABLE) set_self_chrflag(CHRCFLAG_HIDDEN) set_self_chrflag(CHRCFLAG_00040000) @@ -1255,7 +1255,7 @@ u8 func0412_clone[] = { }; u8 func0410_clone_spawner2[] = { - set_self_chrflag(CHRCFLAG_00000002) + set_self_chrflag(CHRCFLAG_CLONEABLE) set_self_chrflag(CHRCFLAG_HIDDEN) set_self_chrflag(CHRCFLAG_00040000) diff --git a/src/files/setup/setupsho.c b/src/files/setup/setupsho.c index 14be284c0..ae7ccda17 100644 --- a/src/files/setup/setupsho.c +++ b/src/files/setup/setupsho.c @@ -845,7 +845,7 @@ u8 func0404_miniskedar[] = { * Spawn a clone and remove self. This function seems unnecessary. */ u8 func0407_init_cloaked_skedar[] = { - set_self_chrflag(CHRCFLAG_00000002) + set_self_chrflag(CHRCFLAG_CLONEABLE) set_self_chrflag(CHRCFLAG_HIDDEN) set_self_chrflag(CHRCFLAG_00040000) set_chr_hiddenflag(CHR_SELF, CHRHFLAG_CLOAKED) @@ -912,7 +912,7 @@ u8 func0408_cloaked_skedar[] = { * Spawns up to 3 miniskedar clones, one at a time. */ u8 func0404_miniskedar_spawner[] = { - set_self_chrflag(CHRCFLAG_00000002) + set_self_chrflag(CHRCFLAG_CLONEABLE) set_self_chrflag(CHRCFLAG_HIDDEN) set_self_chrflag(CHRCFLAG_00040000) set_morale(0) @@ -2280,7 +2280,7 @@ u8 func040d_king_combat[] = { }; u8 func040e_king_skedar_spawner[] = { - set_self_chrflag(CHRCFLAG_00000002) + set_self_chrflag(CHRCFLAG_CLONEABLE) set_self_chrflag(CHRCFLAG_HIDDEN) set_self_chrflag(CHRCFLAG_INVINCIBLE_TO_GUNFIRE) set_self_chrflag(CHRCFLAG_00040000) @@ -2337,7 +2337,7 @@ u8 func0410_init_king_skedar_clone[] = { }; u8 func0411_king_miniskedar_spawner[] = { - set_self_chrflag(CHRCFLAG_00000002) + set_self_chrflag(CHRCFLAG_CLONEABLE) set_self_chrflag(CHRCFLAG_HIDDEN) set_self_chrflag(CHRCFLAG_INVINCIBLE_TO_GUNFIRE) set_self_chrflag(CHRCFLAG_00040000) diff --git a/src/files/setup/setuptra.c b/src/files/setup/setuptra.c index 8efd9cd92..3ca1a90a5 100644 --- a/src/files/setup/setuptra.c +++ b/src/files/setup/setuptra.c @@ -3199,7 +3199,7 @@ u8 func0416_spawn_during_follow[] = { set_recovery_speed(0) set_shield(0) set_self_chrflag(CHRCFLAG_00040000) - set_self_chrflag(CHRCFLAG_00000002) + set_self_chrflag(CHRCFLAG_CLONEABLE) set_self_chrflag(CHRCFLAG_HIDDEN) set_self_chrflag(CHRCFLAG_INVINCIBLE_TO_GUNFIRE) diff --git a/src/game/chr/chraicommands.c b/src/game/chr/chraicommands.c index 5ed541ebe..8f1f2d314 100644 --- a/src/game/chr/chraicommands.c +++ b/src/game/chr/chraicommands.c @@ -4512,205 +4512,99 @@ bool aiTryEquipHat(void) /** * @cmd 00ca */ -GLOBAL_ASM( -glabel aiDuplicateChr -/* f055b18: 3c03800a */ lui $v1,%hi(g_Vars) -/* f055b1c: 24639fc0 */ addiu $v1,$v1,%lo(g_Vars) -/* f055b20: 8c6e0434 */ lw $t6,0x434($v1) -/* f055b24: 8c6f0438 */ lw $t7,0x438($v1) -/* f055b28: 27bdff98 */ addiu $sp,$sp,-104 -/* f055b2c: afbf0024 */ sw $ra,0x24($sp) -/* f055b30: afb10020 */ sw $s1,0x20($sp) -/* f055b34: afb0001c */ sw $s0,0x1c($sp) -/* f055b38: 01cf2821 */ addu $a1,$t6,$t7 -/* f055b3c: 90b80005 */ lbu $t8,0x5($a1) -/* f055b40: 90a80006 */ lbu $t0,0x6($a1) -/* f055b44: 90ab0007 */ lbu $t3,0x7($a1) -/* f055b48: 90ae0008 */ lbu $t6,0x8($a1) -/* f055b4c: 0018ce00 */ sll $t9,$t8,0x18 -/* f055b50: 00084c00 */ sll $t1,$t0,0x10 -/* f055b54: 03295025 */ or $t2,$t9,$t1 -/* f055b58: 000b6200 */ sll $t4,$t3,0x8 -/* f055b5c: 014c6825 */ or $t5,$t2,$t4 -/* f055b60: 01ae7825 */ or $t7,$t5,$t6 -/* f055b64: afaf0060 */ sw $t7,0x60($sp) -/* f055b68: 90b80003 */ lbu $t8,0x3($a1) -/* f055b6c: 90b90004 */ lbu $t9,0x4($a1) -/* f055b70: afa50064 */ sw $a1,0x64($sp) -/* f055b74: 00184200 */ sll $t0,$t8,0x8 -/* f055b78: 01191025 */ or $v0,$t0,$t9 -/* f055b7c: 0c006134 */ jal ailistFindById -/* f055b80: 3044ffff */ andi $a0,$v0,0xffff -/* f055b84: 8fab0064 */ lw $t3,0x64($sp) -/* f055b88: afa00054 */ sw $zero,0x54($sp) -/* f055b8c: 3c04800a */ lui $a0,%hi(g_Vars+0x424) -/* f055b90: 00408025 */ or $s0,$v0,$zero -/* f055b94: 8c84a3e4 */ lw $a0,%lo(g_Vars+0x424)($a0) -/* f055b98: 0fc126d1 */ jal chrFindById -/* f055b9c: 91650002 */ lbu $a1,0x2($t3) -/* f055ba0: 00408825 */ or $s1,$v0,$zero -/* f055ba4: afa00048 */ sw $zero,0x48($sp) -/* f055ba8: afa00040 */ sw $zero,0x40($sp) -/* f055bac: afa00030 */ sw $zero,0x30($sp) -/* f055bb0: 1040007b */ beqz $v0,.L0f055da0 -/* f055bb4: afa0002c */ sw $zero,0x2c($sp) -/* f055bb8: 8c4a0018 */ lw $t2,0x18($v0) -/* f055bbc: 3c04800a */ lui $a0,%hi(g_Vars+0x424) -/* f055bc0: 2406ffff */ addiu $a2,$zero,-1 -/* f055bc4: 314c0002 */ andi $t4,$t2,0x2 -/* f055bc8: 51800076 */ beqzl $t4,.L0f055da4 -/* f055bcc: 8fb90054 */ lw $t9,0x54($sp) -/* f055bd0: 8fad0060 */ lw $t5,0x60($sp) -/* f055bd4: 84450010 */ lh $a1,0x10($v0) -/* f055bd8: 84470000 */ lh $a3,0x0($v0) -/* f055bdc: afb00010 */ sw $s0,0x10($sp) -/* f055be0: 8c84a3e4 */ lw $a0,%lo(g_Vars+0x424)($a0) -/* f055be4: 0fc12d7d */ jal chrSpawnAtChr -/* f055be8: afad0014 */ sw $t5,0x14($sp) -/* f055bec: 5040006d */ beqzl $v0,.L0f055da4 -/* f055bf0: 8fb90054 */ lw $t9,0x54($sp) -/* f055bf4: 0fc0817b */ jal getLowestUnusedChrId -/* f055bf8: 8c500004 */ lw $s0,0x4($v0) -/* f055bfc: 00022c00 */ sll $a1,$v0,0x10 -/* f055c00: 00057403 */ sra $t6,$a1,0x10 -/* f055c04: 01c02825 */ or $a1,$t6,$zero -/* f055c08: 0fc07937 */ jal chrSetChrnum -/* f055c0c: 02002025 */ or $a0,$s0,$zero -/* f055c10: 860f0000 */ lh $t7,0x0($s0) -/* f055c14: 02202025 */ or $a0,$s1,$zero -/* f055c18: 00002825 */ or $a1,$zero,$zero -/* f055c1c: 0fc0a209 */ jal chrGetEquippedWeaponProp -/* f055c20: a62f0132 */ sh $t7,0x132($s1) -/* f055c24: 5040000d */ beqzl $v0,.L0f055c5c -/* f055c28: 02202025 */ or $a0,$s1,$zero -/* f055c2c: 8c420004 */ lw $v0,0x4($v0) -/* f055c30: 02002025 */ or $a0,$s0,$zero -/* f055c34: 00003825 */ or $a3,$zero,$zero -/* f055c38: 84450004 */ lh $a1,0x4($v0) -/* f055c3c: 9046005c */ lbu $a2,0x5c($v0) -/* f055c40: 0fc22eb4 */ jal func0f08bad0 -/* f055c44: afa20040 */ sw $v0,0x40($sp) -/* f055c48: 50400004 */ beqzl $v0,.L0f055c5c -/* f055c4c: 02202025 */ or $a0,$s1,$zero -/* f055c50: 8c580004 */ lw $t8,0x4($v0) -/* f055c54: afb8002c */ sw $t8,0x2c($sp) -/* f055c58: 02202025 */ or $a0,$s1,$zero -.L0f055c5c: -/* f055c5c: 0fc0a209 */ jal chrGetEquippedWeaponProp -/* f055c60: 24050001 */ addiu $a1,$zero,0x1 -/* f055c64: 5040000d */ beqzl $v0,.L0f055c9c -/* f055c68: 8fa20048 */ lw $v0,0x48($sp) -/* f055c6c: 8c420004 */ lw $v0,0x4($v0) -/* f055c70: 02002025 */ or $a0,$s0,$zero -/* f055c74: 3c071000 */ lui $a3,0x1000 -/* f055c78: 84450004 */ lh $a1,0x4($v0) -/* f055c7c: 9046005c */ lbu $a2,0x5c($v0) -/* f055c80: 0fc22eb4 */ jal func0f08bad0 -/* f055c84: afa20048 */ sw $v0,0x48($sp) -/* f055c88: 50400004 */ beqzl $v0,.L0f055c9c -/* f055c8c: 8fa20048 */ lw $v0,0x48($sp) -/* f055c90: 8c440004 */ lw $a0,0x4($v0) -/* f055c94: afa40030 */ sw $a0,0x30($sp) -/* f055c98: 8fa20048 */ lw $v0,0x48($sp) -.L0f055c9c: -/* f055c9c: 8fa40030 */ lw $a0,0x30($sp) -/* f055ca0: 8fa30040 */ lw $v1,0x40($sp) -/* f055ca4: 50400010 */ beqzl $v0,.L0f055ce8 -/* f055ca8: 8e230178 */ lw $v1,0x178($s1) -/* f055cac: 5060000e */ beqzl $v1,.L0f055ce8 -/* f055cb0: 8e230178 */ lw $v1,0x178($s1) -/* f055cb4: 1080000b */ beqz $a0,.L0f055ce4 -/* f055cb8: 8fa8002c */ lw $t0,0x2c($sp) -/* f055cbc: 5100000a */ beqzl $t0,.L0f055ce8 -/* f055cc0: 8e230178 */ lw $v1,0x178($s1) -/* f055cc4: 8c590064 */ lw $t9,0x64($v0) -/* f055cc8: 54790007 */ bnel $v1,$t9,.L0f055ce8 -/* f055ccc: 8e230178 */ lw $v1,0x178($s1) -/* f055cd0: 8c690064 */ lw $t1,0x64($v1) -/* f055cd4: 54490004 */ bnel $v0,$t1,.L0f055ce8 -/* f055cd8: 8e230178 */ lw $v1,0x178($s1) -/* f055cdc: 0fc22b6b */ jal func0f08adac -/* f055ce0: 01002825 */ or $a1,$t0,$zero -.L0f055ce4: -/* f055ce4: 8e230178 */ lw $v1,0x178($s1) -.L0f055ce8: -/* f055ce8: 02002025 */ or $a0,$s0,$zero -/* f055cec: 50600006 */ beqzl $v1,.L0f055d08 -/* f055cf0: 8e2b0114 */ lw $t3,0x114($s1) -/* f055cf4: 8c620004 */ lw $v0,0x4($v1) -/* f055cf8: 00003025 */ or $a2,$zero,$zero -/* f055cfc: 0fc22776 */ jal chrTryEquipHat -/* f055d00: 84450004 */ lh $a1,0x4($v0) -/* f055d04: 8e2b0114 */ lw $t3,0x114($s1) -.L0f055d08: -/* f055d08: 3c02800a */ lui $v0,%hi(g_Vars) -/* f055d0c: 24429fc0 */ addiu $v0,$v0,%lo(g_Vars) -/* f055d10: ae0b0114 */ sw $t3,0x114($s0) -/* f055d14: 8e2a0118 */ lw $t2,0x118($s1) -/* f055d18: 3c0e800a */ lui $t6,%hi(g_MissionConfig+0x3) -/* f055d1c: ae0a0118 */ sw $t2,0x118($s0) -/* f055d20: 862c0128 */ lh $t4,0x128($s1) -/* f055d24: a60c0128 */ sh $t4,0x128($s0) -/* f055d28: 8c4d0318 */ lw $t5,0x318($v0) -/* f055d2c: 55a0000b */ bnezl $t5,.L0f055d5c -/* f055d30: 8fa80060 */ lw $t0,0x60($sp) -/* f055d34: 81cfdfeb */ lb $t7,%lo(g_MissionConfig+0x3)($t6) -/* f055d38: 05e30008 */ bgezl $t7,.L0f055d5c -/* f055d3c: 8fa80060 */ lw $t0,0x60($sp) -/* f055d40: 8c580474 */ lw $t8,0x474($v0) -/* f055d44: 3c010001 */ lui $at,0x1 -/* f055d48: 01614825 */ or $t1,$t3,$at -/* f055d4c: 5b000003 */ blezl $t8,.L0f055d5c -/* f055d50: 8fa80060 */ lw $t0,0x60($sp) -/* f055d54: ae090114 */ sw $t1,0x114($s0) -/* f055d58: 8fa80060 */ lw $t0,0x60($sp) -.L0f055d5c: -/* f055d5c: 310b1000 */ andi $t3,$t0,0x1000 -/* f055d60: 51600005 */ beqzl $t3,.L0f055d78 -/* f055d64: 922d0125 */ lbu $t5,0x125($s1) -/* f055d68: 8e0a0018 */ lw $t2,0x18($s0) -/* f055d6c: 314c0400 */ andi $t4,$t2,0x400 -/* f055d70: ae0c0018 */ sw $t4,0x18($s0) -/* f055d74: 922d0125 */ lbu $t5,0x125($s1) -.L0f055d78: -/* f055d78: a20d0125 */ sb $t5,0x125($s0) -/* f055d7c: 922e02a2 */ lbu $t6,0x2a2($s1) -/* f055d80: a20e02a2 */ sb $t6,0x2a2($s0) -/* f055d84: 922f02b1 */ lbu $t7,0x2b1($s1) -/* f055d88: 0fc13301 */ jal rebuildTeams -/* f055d8c: a20f02b1 */ sb $t7,0x2b1($s0) -/* f055d90: 0fc13341 */ jal rebuildSquadrons -/* f055d94: 00000000 */ sll $zero,$zero,0x0 -/* f055d98: 24180001 */ addiu $t8,$zero,0x1 -/* f055d9c: afb80054 */ sw $t8,0x54($sp) -.L0f055da0: -/* f055da0: 8fb90054 */ lw $t9,0x54($sp) -.L0f055da4: -/* f055da4: 3c02800a */ lui $v0,%hi(g_Vars) -/* f055da8: 24429fc0 */ addiu $v0,$v0,%lo(g_Vars) -/* f055dac: 13200009 */ beqz $t9,.L0f055dd4 -/* f055db0: 3c08800a */ lui $t0,%hi(g_Vars+0x438) -/* f055db4: 8fa90064 */ lw $t1,0x64($sp) -/* f055db8: 8c440434 */ lw $a0,0x434($v0) -/* f055dbc: 8c450438 */ lw $a1,0x438($v0) -/* f055dc0: 0fc13583 */ jal chraiGoToLabel -/* f055dc4: 91260009 */ lbu $a2,0x9($t1) -/* f055dc8: 3c01800a */ lui $at,%hi(g_Vars+0x438) -/* f055dcc: 10000005 */ beqz $zero,.L0f055de4 -/* f055dd0: ac22a3f8 */ sw $v0,%lo(g_Vars+0x438)($at) -.L0f055dd4: -/* f055dd4: 8d08a3f8 */ lw $t0,%lo(g_Vars+0x438)($t0) -/* f055dd8: 3c01800a */ lui $at,%hi(g_Vars+0x438) -/* f055ddc: 250b000a */ addiu $t3,$t0,0xa -/* f055de0: ac2ba3f8 */ sw $t3,%lo(g_Vars+0x438)($at) -.L0f055de4: -/* f055de4: 8fbf0024 */ lw $ra,0x24($sp) -/* f055de8: 8fb0001c */ lw $s0,0x1c($sp) -/* f055dec: 8fb10020 */ lw $s1,0x20($sp) -/* f055df0: 27bd0068 */ addiu $sp,$sp,0x68 -/* f055df4: 03e00008 */ jr $ra -/* f055df8: 00001025 */ or $v0,$zero,$zero -); +bool aiDuplicateChr(void) +{ + u8 *cmd = g_Vars.ailist + g_Vars.aioffset; + u32 flags = (cmd[6] << 16) | (cmd[7] << 8) | cmd[8] | (cmd[5] << 24); + u16 ailistid = cmd[4] | (cmd[3] << 8); + u8 *ailist = ailistFindById(ailistid); + bool pass = false; + struct chrdata *chr = chrFindById(g_Vars.chrdata, cmd[2]); + struct chrdata *clone = NULL; + struct weaponobj *srcweapon1 = NULL; + struct prop *cloneprop = NULL; + struct weaponobj *srcweapon0 = NULL; + struct prop *srcweapon0prop = NULL; + struct prop *cloneweapon0prop = NULL; + struct prop *srcweapon1prop = NULL; + struct weaponobj *cloneweapon1 = NULL; + struct weaponobj *cloneweapon0 = NULL; + struct prop *cloneweapon1prop = NULL; + + if (chr && (chr->chrflags & CHRCFLAG_CLONEABLE)) { + cloneprop = chrSpawnAtChr(g_Vars.chrdata, chr->bodynum, -1, chr->chrnum, ailist, flags); + + if (cloneprop) { + clone = cloneprop->chr; + chrSetChrnum(clone, getLowestUnusedChrId()); + chr->chrdup = clone->chrnum; + + srcweapon0prop = chrGetEquippedWeaponProp(chr, 0); + + if (srcweapon0prop) { + srcweapon0 = srcweapon0prop->weapon; + cloneweapon0prop = func0f08bad0(clone, srcweapon0->base.obj, srcweapon0->weapon_id, 0); + + if (cloneweapon0prop) { + cloneweapon0 = cloneweapon0prop->weapon; + } + } + + srcweapon1prop = chrGetEquippedWeaponProp(chr, 1); + + if (srcweapon1prop) { + srcweapon1 = srcweapon1prop->weapon; + cloneweapon1prop = func0f08bad0(clone, srcweapon1->base.obj, srcweapon1->weapon_id, 0x10000000); + + if (cloneweapon1prop) { + cloneweapon1 = cloneweapon1prop->weapon; + } + } + + if (srcweapon1 && srcweapon0 + && cloneweapon1 && cloneweapon0 + && srcweapon0 == srcweapon1->dual && srcweapon1 == srcweapon0->dual) { + func0f08adac(cloneweapon1, cloneweapon0); + } + + if (chr->weapons_held[2]) { + struct defaultobj *obj = chr->weapons_held[2]->obj; + chrTryEquipHat(clone, obj->obj, 0); + } + + clone->flags = chr->flags; + clone->flags2 = chr->flags2; + clone->padpreset1 = chr->padpreset1; + + if (g_Vars.normmplayerisrunning == false + && g_MissionConfig.iscoop + && g_Vars.numaibuddies > 0) { + clone->flags |= CHRFLAG0_AIVSAI; + } + + if (flags & 0x00001000) { + clone->chrflags &= CHRCFLAG_HIDDEN; + } + + clone->team = chr->team; + clone->squadron = chr->squadron; + clone->voicebox = chr->voicebox; + + rebuildTeams(); + rebuildSquadrons(); + + pass = true; + } + } + + if (pass) { + g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[9]); + } else { + g_Vars.aioffset += 10; + } + + return false; +} /** * @cmd 00cb diff --git a/src/include/constants.h b/src/include/constants.h index c95de7e61..dc123dd4e 100644 --- a/src/include/constants.h +++ b/src/include/constants.h @@ -395,7 +395,7 @@ // chr->chrflags #define CHRCFLAG_00000001 0x00000001 // Villa takers, Attack Ship Cass and skedar - both set at end of intros -#define CHRCFLAG_00000002 0x00000002 // Seems to be set on guards who can spawn clones? +#define CHRCFLAG_CLONEABLE 0x00000002 #define CHRCFLAG_NEAR_MISS 0x00000004 #define CHRCFLAG_NEVER_BEEN_ON_SCREEN 0x00000008 #define CHRCFLAG_INVINCIBLE_TO_GUNFIRE 0x00000010 diff --git a/src/include/game/propobj.h b/src/include/game/propobj.h index b1e924ccb..566622173 100644 --- a/src/include/game/propobj.h +++ b/src/include/game/propobj.h @@ -253,7 +253,7 @@ u32 func0f089a94(void); u32 func0f089c70(void); u32 func0f089d64(void); u32 func0f089db8(void); -u32 chrTryEquipHat(struct chrdata *chr, u32 thing, u32 flags); +u32 chrTryEquipHat(struct chrdata *chr, u32 model, u32 flags); u32 func0f089f8c(void); u32 func0f08a38c(void); u32 func0f08a724(void); @@ -265,7 +265,7 @@ u32 func0f08ab64(void); u32 func0f08ab9c(void); u32 func0f08abd4(void); u32 func0f08acb0(void); -u32 func0f08adac(void); +void func0f08adac(struct weaponobj *weapon1, struct weaponobj *weapon2); u32 func0f08adc8(void); u32 func0f08ae0c(void); u32 func0f08ae54(struct defaultobj *obj, struct chrdata *chr); diff --git a/src/include/types.h b/src/include/types.h index 2a8465efa..7be8cfb0e 100644 --- a/src/include/types.h +++ b/src/include/types.h @@ -921,6 +921,7 @@ struct weaponobj { // objtype 0x08 /*0x5f*/ u8 dragonthrown; /*0x60*/ s16 unk60; /*0x62*/ s16 team; + /*0x64*/ struct weaponobj *dual; // other weapon when dual wielding }; struct singlemonitorobj { // objtype 0x0a