diff --git a/src/game/chr/chraction.c b/src/game/chr/chraction.c index f3e5113ee..54fe2ab4d 100644 --- a/src/game/chr/chraction.c +++ b/src/game/chr/chraction.c @@ -1265,14 +1265,18 @@ struct attackanimgroup *g_KneelDualAttackAnims[][32] = { }, }; -struct attackanimconfig var80067428 = { 0x000b, 76, 0, 0, 20, -1, 98, 161, -1, -1, 93, 161, 0.87252569198608, -0.52351540327072, 0.69802057743073, -0.69802057743073, 1.7000000476837, 2 }; -struct attackanimconfig var80067470 = { 0x000c, 58, 0, 0, 10, -1, 77, 104, -1, -1, 72, 104, 0.87252569198608, -0.34901028871536, 0.61076802015305, -0.69802057743073, 1.5499999523163, 1.5 }; -struct attackanimconfig var800674b8 = { 0x000d, 61, 0, 0, 10, -1, 83, 128, -1, -1, 78, 128, 0.87252569198608, -0.52351540327072, 0.87252569198608, -0.52351540327072, 1.2000000476837, 1.2999999523163 }; -struct attackanimconfig var80067500 = { 0x0027, 63, 0, 0, 10, -1, 73, 114, -1, -1, 68, 114, 0.87252569198608, -0.52351540327072, 0.61076802015305, -0.61076802015305, 1.6499999761581, 1.5 }; -struct attackanimconfig var80067548 = { 0x000b, 76, 0, 0, 20, 76, 98, 161, -1, -1, 93, 161, 0.87252569198608, -0.52351540327072, 0.69802057743073, -0.69802057743073, 1.7000000476837, 2 }; -struct attackanimconfig var80067590 = { 0x000c, 58, 0, 0, 10, 63, 77, 104, -1, -1, 72, 104, 0.87252569198608, -0.34901028871536, 0.61076802015305, -0.69802057743073, 1.5499999523163, 1.5 }; -struct attackanimconfig var800675d8 = { 0x000d, 61, 0, 0, 10, 56, 83, 128, -1, -1, 78, 128, 0.87252569198608, -0.52351540327072, 0.87252569198608, -0.52351540327072, 1.2000000476837, 1.2999999523163 }; -struct attackanimconfig var80067620 = { 0x0027, 63, 0, 0, 10, 50, 73, 114, -1, -1, 68, 114, 0.87252569198608, -0.52351540327072, 0.61076802015305, -0.61076802015305, 1.6499999761581, 1.5 }; +// These 8 animations must be kept together because the code loads a pointer to +// the heavy anims then adds 4 to get to the light anims. Using an array here +// would be less hacky, but then the individual names would be lost. +struct attackanimconfig g_AttackAnimRollHeavyLeft1 = { 0x000b, 76, 0, 0, 20, -1, 98, 161, -1, -1, 93, 161, 0.87252569198608, -0.52351540327072, 0.69802057743073, -0.69802057743073, 1.7000000476837, 2 }; +struct attackanimconfig g_AttackAnimRollHeavyRight1 = { 0x000c, 58, 0, 0, 10, -1, 77, 104, -1, -1, 72, 104, 0.87252569198608, -0.34901028871536, 0.61076802015305, -0.69802057743073, 1.5499999523163, 1.5 }; +struct attackanimconfig g_AttackAnimRollHeavyLeft2 = { 0x000d, 61, 0, 0, 10, -1, 83, 128, -1, -1, 78, 128, 0.87252569198608, -0.52351540327072, 0.87252569198608, -0.52351540327072, 1.2000000476837, 1.2999999523163 }; +struct attackanimconfig g_AttackAnimRollHeavyRight2 = { 0x0027, 63, 0, 0, 10, -1, 73, 114, -1, -1, 68, 114, 0.87252569198608, -0.52351540327072, 0.61076802015305, -0.61076802015305, 1.6499999761581, 1.5 }; +struct attackanimconfig g_AttackAnimRollLightLeft1 = { 0x000b, 76, 0, 0, 20, 76, 98, 161, -1, -1, 93, 161, 0.87252569198608, -0.52351540327072, 0.69802057743073, -0.69802057743073, 1.7000000476837, 2 }; +struct attackanimconfig g_AttackAnimRollLightRight1 = { 0x000c, 58, 0, 0, 10, 63, 77, 104, -1, -1, 72, 104, 0.87252569198608, -0.34901028871536, 0.61076802015305, -0.69802057743073, 1.5499999523163, 1.5 }; +struct attackanimconfig g_AttackAnimRollLightLeft2 = { 0x000d, 61, 0, 0, 10, 56, 83, 128, -1, -1, 78, 128, 0.87252569198608, -0.52351540327072, 0.87252569198608, -0.52351540327072, 1.2000000476837, 1.2999999523163 }; +struct attackanimconfig g_AttackAnimRollLightRight2 = { 0x0027, 63, 0, 0, 10, 50, 73, 114, -1, -1, 68, 114, 0.87252569198608, -0.52351540327072, 0.61076802015305, -0.61076802015305, 1.6499999761581, 1.5 }; + struct attackanimconfig var80067668 = { 0x0045, 0, 0, 0, 7, 64, 19, 51, 24, 46, 14, 58, 0.87252569198608, -0.69802057743073, 0.52351540327072, -0.7852731347084, 0, 0 }; struct attackanimconfig var800676b0 = { 0x004a, 0, 0, 1.5707963705063, 14, 76, 26, 31, 31, 38, 15, 49, 0.87252569198608, -0.69802057743073, 0.52351540327072, -1.0470308065414, 0, 0 }; struct attackanimconfig var800676f8 = { 0x004c, 26, 0, 0, 25, 89, 41, 63, 41, 51, 21, 80, 0.87252569198608, -0.69802057743073, 0.34901028871536, -1.1342834234238, 0, 0 }; @@ -2603,346 +2607,169 @@ void chrAttackRollChooseAnimation(struct chrdata *chr) } } -u32 var8006804c = 0x00000000; -u32 var80068050 = 0x00000000; -u32 var80068054 = 0x00000000; -u32 var80068058 = 0x00000000; -u32 var8006805c = 0x00000000; -u32 var80068060 = 0x00000000; +void chrAttackRoll(struct chrdata *chr, bool toleft) +{ + struct attackanimconfig *animcfg; + struct prop *leftgun = chrGetEquippedWeaponProp(chr, HAND_LEFT); + struct prop *rightgun = chrGetEquippedWeaponProp(chr, HAND_RIGHT); + bool flip; + bool onehanded = false; + struct prop *prop; + struct weaponobj *weapon; + bool dorecoil = true; + bool firing[] = {false, false}; + s32 i; + bool dooneburst = false; + bool everytick[] = {false, false}; + bool singleshot[] = {false, false}; -GLOBAL_ASM( -glabel chrAttackRoll -/* f030b48: 27bdff78 */ addiu $sp,$sp,-136 -/* f030b4c: afbf0024 */ sw $ra,0x24($sp) -/* f030b50: afb10018 */ sw $s1,0x18($sp) -/* f030b54: afa5008c */ sw $a1,0x8c($sp) -/* f030b58: 00808825 */ or $s1,$a0,$zero -/* f030b5c: afb30020 */ sw $s3,0x20($sp) -/* f030b60: afb2001c */ sw $s2,0x1c($sp) -/* f030b64: afb00014 */ sw $s0,0x14($sp) -/* f030b68: 0fc0a209 */ jal chrGetEquippedWeaponProp -/* f030b6c: 24050001 */ addiu $a1,$zero,0x1 -/* f030b70: 00408025 */ or $s0,$v0,$zero -/* f030b74: 02202025 */ or $a0,$s1,$zero -/* f030b78: 0fc0a209 */ jal chrGetEquippedWeaponProp -/* f030b7c: 00002825 */ or $a1,$zero,$zero -/* f030b80: 3c0f8007 */ lui $t7,%hi(var8006804c) -/* f030b84: afa00074 */ sw $zero,0x74($sp) -/* f030b88: 25ef804c */ addiu $t7,$t7,%lo(var8006804c) -/* f030b8c: 8de10000 */ lw $at,0x0($t7) -/* f030b90: 8de80004 */ lw $t0,0x4($t7) -/* f030b94: 27ae0060 */ addiu $t6,$sp,0x60 -/* f030b98: 3c0a8007 */ lui $t2,%hi(var80068054) -/* f030b9c: adc10000 */ sw $at,0x0($t6) -/* f030ba0: adc80004 */ sw $t0,0x4($t6) -/* f030ba4: afa00058 */ sw $zero,0x58($sp) -/* f030ba8: 254a8054 */ addiu $t2,$t2,%lo(var80068054) -/* f030bac: 8d410000 */ lw $at,0x0($t2) -/* f030bb0: 8d4d0004 */ lw $t5,0x4($t2) -/* f030bb4: 27a90050 */ addiu $t1,$sp,0x50 -/* f030bb8: 3c188007 */ lui $t8,%hi(var8006805c) -/* f030bbc: 2718805c */ addiu $t8,$t8,%lo(var8006805c) -/* f030bc0: ad210000 */ sw $at,0x0($t1) -/* f030bc4: ad2d0004 */ sw $t5,0x4($t1) -/* f030bc8: 8f080004 */ lw $t0,0x4($t8) -/* f030bcc: 8f010000 */ lw $at,0x0($t8) -/* f030bd0: 27b90048 */ addiu $t9,$sp,0x48 -/* f030bd4: 00409025 */ or $s2,$v0,$zero -/* f030bd8: 24130001 */ addiu $s3,$zero,0x1 -/* f030bdc: af280004 */ sw $t0,0x4($t9) -/* f030be0: 12000029 */ beqz $s0,.L0f030c88 -/* f030be4: af210000 */ sw $at,0x0($t9) -/* f030be8: 10400027 */ beqz $v0,.L0f030c88 -/* f030bec: 02202025 */ or $a0,$s1,$zero -/* f030bf0: 0fc0a20d */ jal chrGetEquippedWeaponPropWithCheck -/* f030bf4: 24050001 */ addiu $a1,$zero,0x1 -/* f030bf8: 00408025 */ or $s0,$v0,$zero -/* f030bfc: 02202025 */ or $a0,$s1,$zero -/* f030c00: 0fc0a20d */ jal chrGetEquippedWeaponPropWithCheck -/* f030c04: 00002825 */ or $a1,$zero,$zero -/* f030c08: 12000018 */ beqz $s0,.L0f030c6c -/* f030c0c: 2c430001 */ sltiu $v1,$v0,0x1 -/* f030c10: 50400017 */ beqzl $v0,.L0f030c70 -/* f030c14: 24190001 */ addiu $t9,$zero,0x1 -/* f030c18: 0c004b70 */ jal random -/* f030c1c: 00000000 */ nop -/* f030c20: 304c0001 */ andi $t4,$v0,0x1 -/* f030c24: 240b0001 */ addiu $t3,$zero,0x1 -/* f030c28: afac0078 */ sw $t4,0x78($sp) -/* f030c2c: 0c004b70 */ jal random -/* f030c30: afab0074 */ sw $t3,0x74($sp) -/* f030c34: 24010003 */ addiu $at,$zero,0x3 -/* f030c38: 0041001b */ divu $zero,$v0,$at -/* f030c3c: 00004810 */ mfhi $t1 -/* f030c40: 240f0001 */ addiu $t7,$zero,0x1 -/* f030c44: 15200006 */ bnez $t1,.L0f030c60 -/* f030c48: 240e0001 */ addiu $t6,$zero,0x1 -/* f030c4c: 8faa0078 */ lw $t2,0x78($sp) -/* f030c50: 2d4d0001 */ sltiu $t5,$t2,0x1 -/* f030c54: afad0060 */ sw $t5,0x60($sp) -/* f030c58: 1000001f */ b .L0f030cd8 -/* f030c5c: afaa0064 */ sw $t2,0x64($sp) -.L0f030c60: -/* f030c60: afaf0064 */ sw $t7,0x64($sp) -/* f030c64: 1000001c */ b .L0f030cd8 -/* f030c68: afae0060 */ sw $t6,0x60($sp) -.L0f030c6c: -/* f030c6c: 24190001 */ addiu $t9,$zero,0x1 -.L0f030c70: -/* f030c70: 2c780001 */ sltiu $t8,$v1,0x1 -/* f030c74: afa30078 */ sw $v1,0x78($sp) -/* f030c78: afb90074 */ sw $t9,0x74($sp) -/* f030c7c: afa30064 */ sw $v1,0x64($sp) -/* f030c80: 10000015 */ b .L0f030cd8 -/* f030c84: afb80060 */ sw $t8,0x60($sp) -.L0f030c88: -/* f030c88: 0fc0b849 */ jal weaponIsOneHanded -/* f030c8c: 02002025 */ or $a0,$s0,$zero -/* f030c90: 54400005 */ bnezl $v0,.L0f030ca8 -/* f030c94: 0010102b */ sltu $v0,$zero,$s0 -/* f030c98: 0fc0b849 */ jal weaponIsOneHanded -/* f030c9c: 02402025 */ or $a0,$s2,$zero -/* f030ca0: 10400008 */ beqz $v0,.L0f030cc4 -/* f030ca4: 0010102b */ sltu $v0,$zero,$s0 -.L0f030ca8: -/* f030ca8: 24080001 */ addiu $t0,$zero,0x1 -/* f030cac: 2c4c0001 */ sltiu $t4,$v0,0x1 -/* f030cb0: afa20078 */ sw $v0,0x78($sp) -/* f030cb4: afa80074 */ sw $t0,0x74($sp) -/* f030cb8: afa20064 */ sw $v0,0x64($sp) -/* f030cbc: 10000006 */ b .L0f030cd8 -/* f030cc0: afac0060 */ sw $t4,0x60($sp) -.L0f030cc4: -/* f030cc4: 0010102b */ sltu $v0,$zero,$s0 -/* f030cc8: 2c4b0001 */ sltiu $t3,$v0,0x1 -/* f030ccc: afa20078 */ sw $v0,0x78($sp) -/* f030cd0: afa20064 */ sw $v0,0x64($sp) -/* f030cd4: afab0060 */ sw $t3,0x60($sp) -.L0f030cd8: -/* f030cd8: 8fa2008c */ lw $v0,0x8c($sp) -/* f030cdc: 8fa90078 */ lw $t1,0x78($sp) -/* f030ce0: 10400003 */ beqz $v0,.L0f030cf0 -/* f030ce4: 00000000 */ nop -/* f030ce8: 11200005 */ beqz $t1,.L0f030d00 -/* f030cec: 00000000 */ nop -.L0f030cf0: -/* f030cf0: 1440000f */ bnez $v0,.L0f030d30 -/* f030cf4: 8faa0078 */ lw $t2,0x78($sp) -/* f030cf8: 1140000d */ beqz $t2,.L0f030d30 -/* f030cfc: 00000000 */ nop -.L0f030d00: -/* f030d00: 0c004b70 */ jal random -/* f030d04: 00000000 */ nop -/* f030d08: 304d0001 */ andi $t5,$v0,0x1 -/* f030d0c: 11a00005 */ beqz $t5,.L0f030d24 -/* f030d10: 3c0e8006 */ lui $t6,%hi(var800674b8) -/* f030d14: 3c0f8006 */ lui $t7,%hi(var80067428) -/* f030d18: 25ef7428 */ addiu $t7,$t7,%lo(var80067428) -/* f030d1c: 1000000f */ b .L0f030d5c -/* f030d20: afaf0084 */ sw $t7,0x84($sp) -.L0f030d24: -/* f030d24: 25ce74b8 */ addiu $t6,$t6,%lo(var800674b8) -/* f030d28: 1000000c */ b .L0f030d5c -/* f030d2c: afae0084 */ sw $t6,0x84($sp) -.L0f030d30: -/* f030d30: 0c004b70 */ jal random -/* f030d34: 00000000 */ nop -/* f030d38: 30590001 */ andi $t9,$v0,0x1 -/* f030d3c: 13200005 */ beqz $t9,.L0f030d54 -/* f030d40: 3c088006 */ lui $t0,%hi(var80067500) -/* f030d44: 3c188006 */ lui $t8,%hi(var80067470) -/* f030d48: 27187470 */ addiu $t8,$t8,%lo(var80067470) -/* f030d4c: 10000003 */ b .L0f030d5c -/* f030d50: afb80084 */ sw $t8,0x84($sp) -.L0f030d54: -/* f030d54: 25087500 */ addiu $t0,$t0,%lo(var80067500) -/* f030d58: afa80084 */ sw $t0,0x84($sp) -.L0f030d5c: -/* f030d5c: 8fac0074 */ lw $t4,0x74($sp) -/* f030d60: 00008025 */ or $s0,$zero,$zero -/* f030d64: 00003025 */ or $a2,$zero,$zero -/* f030d68: 11800004 */ beqz $t4,.L0f030d7c -/* f030d6c: 27a70060 */ addiu $a3,$sp,0x60 -/* f030d70: 8fab0084 */ lw $t3,0x84($sp) -/* f030d74: 25690120 */ addiu $t1,$t3,0x120 -/* f030d78: afa90084 */ sw $t1,0x84($sp) -.L0f030d7c: -/* f030d7c: 24120001 */ addiu $s2,$zero,0x1 -.L0f030d80: -/* f030d80: 8cea0000 */ lw $t2,0x0($a3) -/* f030d84: 02202025 */ or $a0,$s1,$zero -/* f030d88: 02002825 */ or $a1,$s0,$zero -/* f030d8c: 51400038 */ beqzl $t2,.L0f030e70 -/* f030d90: 26100001 */ addiu $s0,$s0,0x1 -/* f030d94: afa60038 */ sw $a2,0x38($sp) -/* f030d98: 0fc0a209 */ jal chrGetEquippedWeaponProp -/* f030d9c: afa70034 */ sw $a3,0x34($sp) -/* f030da0: 8c430004 */ lw $v1,0x4($v0) -/* f030da4: 9064005c */ lbu $a0,0x5c($v1) -/* f030da8: 9065005f */ lbu $a1,0x5f($v1) -/* f030dac: 0fc2c7ba */ jal weaponGetNumTicksPerShot -/* f030db0: afa3006c */ sw $v1,0x6c($sp) -/* f030db4: 8fa3006c */ lw $v1,0x6c($sp) -/* f030db8: 8fa60038 */ lw $a2,0x38($sp) -/* f030dbc: 1c400009 */ bgtz $v0,.L0f030de4 -/* f030dc0: 8fa70034 */ lw $a3,0x34($sp) -/* f030dc4: 03a66821 */ addu $t5,$sp,$a2 -/* f030dc8: adb20050 */ sw $s2,0x50($t5) -/* f030dcc: 9062005c */ lbu $v0,0x5c($v1) -/* f030dd0: 2401001d */ addiu $at,$zero,0x1d -/* f030dd4: 54410007 */ bnel $v0,$at,.L0f030df4 -/* f030dd8: 24010018 */ addiu $at,$zero,0x18 -/* f030ddc: 10000004 */ b .L0f030df0 -/* f030de0: 00009825 */ or $s3,$zero,$zero -.L0f030de4: -/* f030de4: afb20058 */ sw $s2,0x58($sp) -/* f030de8: 00009825 */ or $s3,$zero,$zero -/* f030dec: 9062005c */ lbu $v0,0x5c($v1) -.L0f030df0: -/* f030df0: 24010018 */ addiu $at,$zero,0x18 -.L0f030df4: -/* f030df4: 1041001c */ beq $v0,$at,.L0f030e68 -/* f030df8: 03a67821 */ addu $t7,$sp,$a2 -/* f030dfc: 24010034 */ addiu $at,$zero,0x34 -/* f030e00: 10410019 */ beq $v0,$at,.L0f030e68 -/* f030e04: 24010019 */ addiu $at,$zero,0x19 -/* f030e08: 10410017 */ beq $v0,$at,.L0f030e68 -/* f030e0c: 24010017 */ addiu $at,$zero,0x17 -/* f030e10: 10410015 */ beq $v0,$at,.L0f030e68 -/* f030e14: 3c04800a */ lui $a0,%hi(g_Vars+0x318) -/* f030e18: 8c84a2d8 */ lw $a0,%lo(g_Vars+0x318)($a0) -/* f030e1c: 24010008 */ addiu $at,$zero,0x8 -/* f030e20: 14800009 */ bnez $a0,.L0f030e48 -/* f030e24: 00000000 */ nop -/* f030e28: 14410007 */ bne $v0,$at,.L0f030e48 -/* f030e2c: 00000000 */ nop -/* f030e30: 82230006 */ lb $v1,0x6($s1) -/* f030e34: 24010028 */ addiu $at,$zero,0x28 -/* f030e38: 10610003 */ beq $v1,$at,.L0f030e48 -/* f030e3c: 24010013 */ addiu $at,$zero,0x13 -/* f030e40: 5461000a */ bnel $v1,$at,.L0f030e6c -/* f030e44: adf20048 */ sw $s2,0x48($t7) -.L0f030e48: -/* f030e48: 14800003 */ bnez $a0,.L0f030e58 -/* f030e4c: 24010009 */ addiu $at,$zero,0x9 -/* f030e50: 50410006 */ beql $v0,$at,.L0f030e6c -/* f030e54: adf20048 */ sw $s2,0x48($t7) -.L0f030e58: -/* f030e58: 14800004 */ bnez $a0,.L0f030e6c -/* f030e5c: 24010013 */ addiu $at,$zero,0x13 -/* f030e60: 54410003 */ bnel $v0,$at,.L0f030e70 -/* f030e64: 26100001 */ addiu $s0,$s0,0x1 -.L0f030e68: -/* f030e68: adf20048 */ sw $s2,0x48($t7) -.L0f030e6c: -/* f030e6c: 26100001 */ addiu $s0,$s0,0x1 -.L0f030e70: -/* f030e70: 24010002 */ addiu $at,$zero,0x2 -/* f030e74: 24c60004 */ addiu $a2,$a2,0x4 -/* f030e78: 1601ffc1 */ bne $s0,$at,.L0f030d80 -/* f030e7c: 24e70004 */ addiu $a3,$a3,0x4 -/* f030e80: 240e000a */ addiu $t6,$zero,0xa -/* f030e84: a22e0007 */ sb $t6,0x7($s1) -/* f030e88: 8fb90084 */ lw $t9,0x84($sp) -/* f030e8c: a2200031 */ sb $zero,0x31($s1) -/* f030e90: 0c004b70 */ jal random -/* f030e94: ae39002c */ sw $t9,0x2c($s1) -/* f030e98: 30580001 */ andi $t8,$v0,0x1 -/* f030e9c: a2380032 */ sb $t8,0x32($s1) -/* f030ea0: 8fa80064 */ lw $t0,0x64($sp) -/* f030ea4: a2280039 */ sb $t0,0x39($s1) -/* f030ea8: 8fac0060 */ lw $t4,0x60($sp) -/* f030eac: a22c0038 */ sb $t4,0x38($s1) -/* f030eb0: 8fab0054 */ lw $t3,0x54($sp) -/* f030eb4: a22b003b */ sb $t3,0x3b($s1) -/* f030eb8: 8fa90050 */ lw $t1,0x50($sp) -/* f030ebc: a229003a */ sb $t1,0x3a($s1) -/* f030ec0: 8faa004c */ lw $t2,0x4c($sp) -/* f030ec4: a22a003d */ sb $t2,0x3d($s1) -/* f030ec8: 8fad0048 */ lw $t5,0x48($sp) -/* f030ecc: a2330036 */ sb $s3,0x36($s1) -/* f030ed0: a22d003c */ sb $t5,0x3c($s1) -/* f030ed4: 8faf0058 */ lw $t7,0x58($sp) -/* f030ed8: a22f0037 */ sb $t7,0x37($s1) -/* f030edc: 8fae0074 */ lw $t6,0x74($sp) -/* f030ee0: ae200040 */ sw $zero,0x40($s1) -/* f030ee4: a2200033 */ sb $zero,0x33($s1) -/* f030ee8: a2320030 */ sb $s2,0x30($s1) -/* f030eec: a22e0035 */ sb $t6,0x35($s1) -/* f030ef0: 8fb9004c */ lw $t9,0x4c($sp) -/* f030ef4: 8fb80048 */ lw $t8,0x48($sp) -/* f030ef8: 8fa8004c */ lw $t0,0x4c($sp) -/* f030efc: 17200003 */ bnez $t9,.L0f030f0c -/* f030f00: 00000000 */ nop -/* f030f04: 13000009 */ beqz $t8,.L0f030f2c -/* f030f08: 00000000 */ nop -.L0f030f0c: -/* f030f0c: 11000005 */ beqz $t0,.L0f030f24 -/* f030f10: 8fac0048 */ lw $t4,0x48($sp) -/* f030f14: 11800003 */ beqz $t4,.L0f030f24 -/* f030f18: 240b0002 */ addiu $t3,$zero,0x2 -/* f030f1c: 10000015 */ b .L0f030f74 -/* f030f20: a22b0034 */ sb $t3,0x34($s1) -.L0f030f24: -/* f030f24: 10000013 */ b .L0f030f74 -/* f030f28: a2320034 */ sb $s2,0x34($s1) -.L0f030f2c: -/* f030f2c: 0c004b70 */ jal random -/* f030f30: 00000000 */ nop -/* f030f34: 30490003 */ andi $t1,$v0,0x3 -/* f030f38: 252a0002 */ addiu $t2,$t1,0x2 -/* f030f3c: a22a0034 */ sb $t2,0x34($s1) -/* f030f40: 8fad0060 */ lw $t5,0x60($sp) -/* f030f44: 8faf0064 */ lw $t7,0x64($sp) -/* f030f48: 51a0000b */ beqzl $t5,.L0f030f78 -/* f030f4c: 240c0200 */ addiu $t4,$zero,0x200 -/* f030f50: 51e00009 */ beqzl $t7,.L0f030f78 -/* f030f54: 240c0200 */ addiu $t4,$zero,0x200 -/* f030f58: 0c004b70 */ jal random -/* f030f5c: 00000000 */ nop -/* f030f60: 822e0034 */ lb $t6,0x34($s1) -/* f030f64: 30590003 */ andi $t9,$v0,0x3 -/* f030f68: 01d9c021 */ addu $t8,$t6,$t9 -/* f030f6c: 27080002 */ addiu $t0,$t8,0x2 -/* f030f70: a2280034 */ sb $t0,0x34($s1) -.L0f030f74: -/* f030f74: 240c0200 */ addiu $t4,$zero,0x200 -.L0f030f78: -/* f030f78: ae2c004c */ sw $t4,0x4c($s1) -/* f030f7c: ae200050 */ sw $zero,0x50($s1) -/* f030f80: ae320054 */ sw $s2,0x54($s1) -/* f030f84: ae200058 */ sw $zero,0x58($s1) -/* f030f88: ae200044 */ sw $zero,0x44($s1) -/* f030f8c: ae200048 */ sw $zero,0x48($s1) -/* f030f90: 8fab0078 */ lw $t3,0x78($sp) -/* f030f94: a2200008 */ sb $zero,0x8($s1) -/* f030f98: 8e240020 */ lw $a0,0x20($s1) -/* f030f9c: 0c0076e5 */ jal modelIsAnimMerging -/* f030fa0: a22b003e */ sb $t3,0x3e($s1) -/* f030fa4: 10400006 */ beqz $v0,.L0f030fc0 -/* f030fa8: 00000000 */ nop -/* f030fac: 8e290014 */ lw $t1,0x14($s1) -/* f030fb0: 3c010020 */ lui $at,0x20 -/* f030fb4: 01215025 */ or $t2,$t1,$at -/* f030fb8: 10000008 */ b .L0f030fdc -/* f030fbc: ae2a0014 */ sw $t2,0x14($s1) -.L0f030fc0: -/* f030fc0: 0fc0c290 */ jal chrAttackRollChooseAnimation -/* f030fc4: 02202025 */ or $a0,$s1,$zero -/* f030fc8: 8e2d0014 */ lw $t5,0x14($s1) -/* f030fcc: 3c01ffdf */ lui $at,0xffdf -/* f030fd0: 3421ffff */ ori $at,$at,0xffff -/* f030fd4: 01a17824 */ and $t7,$t5,$at -/* f030fd8: ae2f0014 */ sw $t7,0x14($s1) -.L0f030fdc: -/* f030fdc: 8fbf0024 */ lw $ra,0x24($sp) -/* f030fe0: 8fb00014 */ lw $s0,0x14($sp) -/* f030fe4: 8fb10018 */ lw $s1,0x18($sp) -/* f030fe8: 8fb2001c */ lw $s2,0x1c($sp) -/* f030fec: 8fb30020 */ lw $s3,0x20($sp) -/* f030ff0: 03e00008 */ jr $ra -/* f030ff4: 27bd0088 */ addiu $sp,$sp,0x88 -); + if (leftgun && rightgun) { + struct prop *leftgun2 = chrGetEquippedWeaponPropWithCheck(chr, HAND_LEFT); + struct prop *rightgun2 = chrGetEquippedWeaponPropWithCheck(chr, HAND_RIGHT); + + if (leftgun2 && rightgun2) { + flip = random() % 2; + onehanded = true; + + if (random() % 3 == 0) { + firing[HAND_LEFT] = flip; + firing[HAND_RIGHT] = !flip; + } else { + firing[HAND_LEFT] = true; + firing[HAND_RIGHT] = true; + } + } else { + flip = (bool)rightgun2 == false; + onehanded = true; + firing[HAND_LEFT] = flip; + firing[HAND_RIGHT] = !flip; + } + } else { + if (weaponIsOneHanded(leftgun) || weaponIsOneHanded(rightgun)) { + flip = (bool)leftgun != false; + onehanded = true; + firing[HAND_LEFT] = flip; + firing[HAND_RIGHT] = !flip; + } else { + flip = (bool)leftgun != false; + firing[HAND_LEFT] = flip; + firing[HAND_RIGHT] = !flip; + } + } + + if ((toleft && !flip) || (!toleft && flip)) { + if (random() % 2) { + animcfg = &g_AttackAnimRollHeavyLeft1; + } else { + animcfg = &g_AttackAnimRollHeavyLeft2; + } + } else { + if (random() % 2) { + animcfg = &g_AttackAnimRollHeavyRight1; + } else { + animcfg = &g_AttackAnimRollHeavyRight2; + } + } + + if (onehanded) { + // Move the animation pointer to the light-weight version of the same + // animation. The light-weight versions are defined immediately after + // the heavy versions. + animcfg += 4; + } + + for (i = 0; i < 2; i++) { + if (firing[i]) { + prop = chrGetEquippedWeaponProp(chr, i); + weapon = prop->weapon; + + if (weaponGetNumTicksPerShot(weapon->weaponnum, weapon->gunfunc) < 1) { + everytick[i] = true; + + if (weapon->weaponnum == WEAPON_LASER) { + dorecoil = false; + } + } else { + dorecoil = false; + dooneburst = true; + } + + if (weapon->weaponnum == WEAPON_ROCKETLAUNCHER + || weapon->weaponnum == WEAPON_ROCKETLAUNCHER_34 + || weapon->weaponnum == WEAPON_SLAYER + || weapon->weaponnum == WEAPON_DEVASTATOR + || ( + !g_Vars.normmplayerisrunning + && weapon->weaponnum == WEAPON_DY357MAGNUM + && chr->headnum != HEAD_JONATHAN + && chr->headnum != HEAD_CHRIST) + || ( + !g_Vars.normmplayerisrunning + && weapon->weaponnum == WEAPON_DY357LX) + || ( + !g_Vars.normmplayerisrunning + && weapon->weaponnum == WEAPON_SHOTGUN)) { + singleshot[i] = true; + } + } + } + + chr->actiontype = ACT_ATTACKROLL; + + chr->act_attack.animcfg = animcfg; + chr->act_attack.fired = false; + chr->act_attack.nextgun = random() % 2; + chr->act_attack.firegun[HAND_LEFT] = firing[HAND_LEFT]; + chr->act_attack.firegun[HAND_RIGHT] = firing[HAND_RIGHT]; + chr->act_attack.everytick[HAND_LEFT] = everytick[HAND_LEFT]; + chr->act_attack.everytick[HAND_RIGHT] = everytick[HAND_RIGHT]; + chr->act_attack.singleshot[HAND_LEFT] = singleshot[HAND_LEFT]; + chr->act_attack.singleshot[HAND_RIGHT] = singleshot[HAND_RIGHT]; + chr->act_attack.dorecoil = dorecoil; + chr->act_attack.dooneburst = dooneburst; + chr->act_attack.onehanded = onehanded; + chr->act_attack.unk040 = 0; + chr->act_attack.numshots = 0; + chr->act_attack.turning = true; + + if (singleshot[HAND_LEFT] || singleshot[HAND_RIGHT]) { + if (singleshot[HAND_LEFT] && singleshot[HAND_RIGHT]) { + chr->act_attack.maxshots = 2; + } else { + chr->act_attack.maxshots = 1; + } + } else { + chr->act_attack.maxshots = (random() % 4) + 2; + + if (firing[HAND_RIGHT] && firing[HAND_LEFT]) { + chr->act_attack.maxshots += (random() % 4) + 2; + } + } + + chr->act_attack.flags = ATTACKFLAG_AIMATTARGET; + chr->act_attack.entityid = 0; + chr->act_attack.unk054 = 1; + chr->act_attack.unk058 = 0; + chr->act_attack.unk044 = 0; + chr->act_attack.unk048 = 0; + chr->act_attack.flip = flip; + + chr->sleep = 0; + + // @bug: CHRCFLAG_INJUREDTARGET is not unset here. This means if the chr + // does an attack that hits the target, then does a roll attack which + // misses, their AI list will incorrectly read the roll attack as a hit + // provided it didn't read and clear the flag between the attacks. + // It usually (always?) does though, so this isn't really an issue. + + if (modelIsAnimMerging(chr->model)) { + chr->hidden |= CHRHFLAG_NEEDANIM; + } else { + chrAttackRollChooseAnimation(chr); + + chr->hidden &= ~CHRHFLAG_NEEDANIM; + } +} void chrStartAnim(struct chrdata *chr, s32 animnum, f32 startframe, f32 endframe, u8 flags, s32 arg5, f32 speed) { @@ -4026,10 +3853,10 @@ bool chrIsAnimPreventingArgh(struct chrdata *chr, f32 *dst) } else if (chr->actiontype == ACT_ATTACKROLL && modelGetAnimNum(chr->model) == chr->act_attack.animcfg->animnum) { if (chr->act_attack.onehanded) { - if (chr->act_attack.animcfg == &var80067548 - || chr->act_attack.animcfg == &var80067590 - || chr->act_attack.animcfg == &var800675d8 - || chr->act_attack.animcfg == &var80067620) { + if (chr->act_attack.animcfg == &g_AttackAnimRollLightLeft1 + || chr->act_attack.animcfg == &g_AttackAnimRollLightRight1 + || chr->act_attack.animcfg == &g_AttackAnimRollLightLeft2 + || chr->act_attack.animcfg == &g_AttackAnimRollLightRight2) { endframe = chr->act_attack.animcfg->unk04 - 8; if (chr->act_attack.animcfg->unk14 < chr->act_attack.animcfg->unk04) { @@ -8371,16 +8198,16 @@ bool chrTryAttackRoll(struct chrdata *chr) f32 z = target->pos.z - prop->pos.z; f32 sqdistance = x * x + y * y + z * z; - if (sqdistance >= 40000.0f) { - bool side = (random() & 1) == 0; + if (sqdistance >= 200 * 200) { + bool toleft = (random() % 2) == 0; - if (chrCanRollInDirection(chr, side, 200)) { - chrAttackRoll(chr, side); + if (chrCanRollInDirection(chr, toleft, 200)) { + chrAttackRoll(chr, toleft); return true; } - if (chrCanRollInDirection(chr, !side, 200)) { - chrAttackRoll(chr, !side); + if (chrCanRollInDirection(chr, !toleft, 200)) { + chrAttackRoll(chr, !toleft); return true; } } @@ -18392,19 +18219,19 @@ glabel func0f041c44 /* f041c5c: 54400032 */ bnezl $v0,.L0f041d28 /* f041c60: 00001025 */ or $v0,$zero,$zero /* f041c64: 8c82002c */ lw $v0,0x2c($a0) -/* f041c68: 3c0e8006 */ lui $t6,%hi(var800674b8) -/* f041c6c: 25ce74b8 */ addiu $t6,$t6,%lo(var800674b8) +/* f041c68: 3c0e8006 */ lui $t6,%hi(g_AttackAnimRollHeavyLeft2) +/* f041c6c: 25ce74b8 */ addiu $t6,$t6,%lo(g_AttackAnimRollHeavyLeft2) /* f041c70: 11c20004 */ beq $t6,$v0,.L0f041c84 -/* f041c74: 3c0f8006 */ lui $t7,%hi(var80067500) -/* f041c78: 25ef7500 */ addiu $t7,$t7,%lo(var80067500) +/* f041c74: 3c0f8006 */ lui $t7,%hi(g_AttackAnimRollHeavyRight2) +/* f041c78: 25ef7500 */ addiu $t7,$t7,%lo(g_AttackAnimRollHeavyRight2) /* f041c7c: 55e2002a */ bnel $t7,$v0,.L0f041d28 /* f041c80: 00001025 */ or $v0,$zero,$zero .L0f041c84: /* f041c84: 8c820020 */ lw $v0,0x20($a0) -/* f041c88: 3c098006 */ lui $t1,%hi(var80067470) +/* f041c88: 3c098006 */ lui $t1,%hi(g_AttackAnimRollHeavyRight1) /* f041c8c: 24080002 */ addiu $t0,$zero,0x2 /* f041c90: 8c580020 */ lw $t8,0x20($v0) -/* f041c94: 25297470 */ addiu $t1,$t1,%lo(var80067470) +/* f041c94: 25297470 */ addiu $t1,$t1,%lo(g_AttackAnimRollHeavyRight1) /* f041c98: 3c053f33 */ lui $a1,0x3f33 /* f041c9c: 83190008 */ lb $t9,0x8($t8) /* f041ca0: 3c063f8f */ lui $a2,0x3f8f @@ -18418,17 +18245,17 @@ glabel func0f041c44 /* f041cc0: afa2002c */ sw $v0,0x2c($sp) /* f041cc4: 3c0141b0 */ lui $at,0x41b0 /* f041cc8: 44812000 */ mtc1 $at,$f4 -/* f041ccc: 3c058006 */ lui $a1,%hi(var80067470) -/* f041cd0: 3c078006 */ lui $a3,%hi(var80067470+0x1c) -/* f041cd4: 8ce7748c */ lw $a3,%lo(var80067470+0x1c)($a3) -/* f041cd8: 84a57470 */ lh $a1,%lo(var80067470)($a1) +/* f041ccc: 3c058006 */ lui $a1,%hi(g_AttackAnimRollHeavyRight1) +/* f041cd0: 3c078006 */ lui $a3,%hi(g_AttackAnimRollHeavyRight1+0x1c) +/* f041cd4: 8ce7748c */ lw $a3,%lo(g_AttackAnimRollHeavyRight1+0x1c)($a3) +/* f041cd8: 84a57470 */ lh $a1,%lo(g_AttackAnimRollHeavyRight1)($a1) /* f041cdc: 8fa4002c */ lw $a0,0x2c($sp) /* f041ce0: 8fa60024 */ lw $a2,0x24($sp) /* f041ce4: e7a00010 */ swc1 $f0,0x10($sp) /* f041ce8: 0c007733 */ jal modelSetAnimation /* f041cec: e7a40014 */ swc1 $f4,0x14($sp) -/* f041cf0: 3c018006 */ lui $at,%hi(var80067470+0x14) -/* f041cf4: c4207484 */ lwc1 $f0,%lo(var80067470+0x14)($at) +/* f041cf0: 3c018006 */ lui $at,%hi(g_AttackAnimRollHeavyRight1+0x14) +/* f041cf4: c4207484 */ lwc1 $f0,%lo(g_AttackAnimRollHeavyRight1+0x14)($at) /* f041cf8: 44803000 */ mtc1 $zero,$f6 /* f041cfc: 00000000 */ nop /* f041d00: 4600303e */ c.le.s $f6,$f0 @@ -20727,19 +20554,19 @@ glabel chrTickAttackRoll /* f043440: 0c00745f */ jal modelGetCurAnimFrame /* f043444: afa40044 */ sw $a0,0x44($sp) /* f043448: 8fa70048 */ lw $a3,0x48($sp) -/* f04344c: 3c0b8006 */ lui $t3,%hi(var80067548) -/* f043450: 256b7548 */ addiu $t3,$t3,%lo(var80067548) +/* f04344c: 3c0b8006 */ lui $t3,%hi(g_AttackAnimRollLightLeft1) +/* f043450: 256b7548 */ addiu $t3,$t3,%lo(g_AttackAnimRollLightLeft1) /* f043454: 8ce2002c */ lw $v0,0x2c($a3) -/* f043458: 3c0c8006 */ lui $t4,%hi(var80067590) +/* f043458: 3c0c8006 */ lui $t4,%hi(g_AttackAnimRollLightRight1) /* f04345c: 46000306 */ mov.s $f12,$f0 /* f043460: 11620009 */ beq $t3,$v0,.L0f043488 -/* f043464: 258c7590 */ addiu $t4,$t4,%lo(var80067590) +/* f043464: 258c7590 */ addiu $t4,$t4,%lo(g_AttackAnimRollLightRight1) /* f043468: 11820007 */ beq $t4,$v0,.L0f043488 -/* f04346c: 3c0d8006 */ lui $t5,%hi(var800675d8) -/* f043470: 25ad75d8 */ addiu $t5,$t5,%lo(var800675d8) +/* f04346c: 3c0d8006 */ lui $t5,%hi(g_AttackAnimRollLightLeft2) +/* f043470: 25ad75d8 */ addiu $t5,$t5,%lo(g_AttackAnimRollLightLeft2) /* f043474: 11a20004 */ beq $t5,$v0,.L0f043488 -/* f043478: 3c0f8006 */ lui $t7,%hi(var80067620) -/* f04347c: 25ef7620 */ addiu $t7,$t7,%lo(var80067620) +/* f043478: 3c0f8006 */ lui $t7,%hi(g_AttackAnimRollLightRight2) +/* f04347c: 25ef7620 */ addiu $t7,$t7,%lo(g_AttackAnimRollLightRight2) /* f043480: 15e200c8 */ bne $t7,$v0,.L0f0437a4 /* f043484: 3c0c8006 */ lui $t4,%hi(var80067668) .L0f043488: @@ -20775,8 +20602,8 @@ glabel chrTickAttackRoll /* f0434f8: 24630240 */ addiu $v1,$v1,0x240 /* f0434fc: 8fa70048 */ lw $a3,0x48($sp) .L0f043500: -/* f043500: 3c028006 */ lui $v0,%hi(var80067428) -/* f043504: 24427428 */ addiu $v0,$v0,%lo(var80067428) +/* f043500: 3c028006 */ lui $v0,%hi(g_AttackAnimRollHeavyLeft1) +/* f043504: 24427428 */ addiu $v0,$v0,%lo(g_AttackAnimRollHeavyLeft1) /* f043508: 244b0240 */ addiu $t3,$v0,0x240 /* f04350c: 146b0005 */ bne $v1,$t3,.L0f043524 /* f043510: 00e02025 */ or $a0,$a3,$zero diff --git a/src/game/game_000130.c b/src/game/game_000130.c index b526e246d..b895a3041 100644 --- a/src/game/game_000130.c +++ b/src/game/game_000130.c @@ -408,8 +408,8 @@ glabel func0f000648 /* f000784: 3c148006 */ lui $s4,%hi(g_KneelHeavyAttackAnims) /* f000788: 3c158006 */ lui $s5,%hi(g_KneelLightAttackAnims) /* f00078c: 3c108006 */ lui $s0,%hi(g_KneelDualAttackAnims) -/* f000790: 3c168006 */ lui $s6,%hi(var80067428) -/* f000794: 26d67428 */ addiu $s6,$s6,%lo(var80067428) +/* f000790: 3c168006 */ lui $s6,%hi(g_AttackAnimRollHeavyLeft1) +/* f000794: 26d67428 */ addiu $s6,$s6,%lo(g_AttackAnimRollHeavyLeft1) /* f000798: 26107328 */ addiu $s0,$s0,%lo(g_KneelDualAttackAnims) /* f00079c: 26b56ef0 */ addiu $s5,$s5,%lo(g_KneelLightAttackAnims) /* f0007a0: 26946a70 */ addiu $s4,$s4,%lo(g_KneelHeavyAttackAnims) @@ -436,9 +436,9 @@ glabel func0f000648 /* f0007f0: 26940080 */ addiu $s4,$s4,0x80 /* f0007f4: 1616ffee */ bne $s0,$s6,.L0f0007b0 /* f0007f8: 26b50080 */ addiu $s5,$s5,0x80 -/* f0007fc: 3c048006 */ lui $a0,%hi(var80067428) +/* f0007fc: 3c048006 */ lui $a0,%hi(g_AttackAnimRollHeavyLeft1) /* f000800: 0fc00103 */ jal func0f00040c -/* f000804: 24847428 */ addiu $a0,$a0,%lo(var80067428) +/* f000804: 24847428 */ addiu $a0,$a0,%lo(g_AttackAnimRollHeavyLeft1) /* f000808: 3c048006 */ lui $a0,%hi(g_AttackAnimHeavyWalk) /* f00080c: 0fc00103 */ jal func0f00040c /* f000810: 24847a10 */ addiu $a0,$a0,%lo(g_AttackAnimHeavyWalk) diff --git a/src/include/data.h b/src/include/data.h index 444ae6508..7412aa849 100644 --- a/src/include/data.h +++ b/src/include/data.h @@ -206,7 +206,7 @@ extern struct attackanimgroup *g_StandDualAttackAnims[][32]; extern struct attackanimgroup *g_KneelHeavyAttackAnims[][32]; extern struct attackanimgroup *g_KneelLightAttackAnims[][32]; extern struct attackanimgroup *g_KneelDualAttackAnims[][32]; -extern struct attackanimconfig var80067428; +extern struct attackanimconfig g_AttackAnimRollHeavyLeft1; extern struct attackanimconfig g_AttackAnimHeavyWalk; extern struct attackanimconfig g_AttackAnimHeavyRun; extern struct attackanimconfig g_AttackAnimLightWalk; diff --git a/src/include/game/chr/chraction.h b/src/include/game/chr/chraction.h index 1a0ccb19a..6697b45ca 100644 --- a/src/include/game/chr/chraction.h +++ b/src/include/game/chr/chraction.h @@ -44,7 +44,7 @@ void chrAttackKneel(struct chrdata *chr, u32 attackflags, s32 entityid); void chrAttackWalkChooseAnimation(struct chrdata *chr); void chrAttackWalk(struct chrdata *chr, bool run); void chrAttackRollChooseAnimation(struct chrdata *chr); -void chrAttackRoll(struct chrdata *chr, bool direction); +void chrAttackRoll(struct chrdata *chr, bool toleft); void chrStartAnim(struct chrdata *chr, s32 animnum, f32 startframe, f32 endframe, u8 flags, s32 arg5, f32 speed); void func0f031254(struct chrdata *chr); void chrAttack(struct chrdata *chr, struct attackanimgroup **arg1, bool flip, bool *firing, u32 attackflags, u32 entityid, u32 arg6); @@ -72,7 +72,7 @@ bool propchrHasClearLineToPos(struct prop *prop, struct coord *dstpos, struct co bool propchrHasClearLineInVector(struct prop *prop, struct coord *coord, f32 arg2); bool func0f036974(struct prop *prop, struct coord *coord); void chrGetSideVectorToTarget(struct chrdata *chr, bool side, struct coord *vector); -bool chrCanRollInDirection(struct chrdata *chr, bool side, f32 distance); +bool chrCanRollInDirection(struct chrdata *chr, bool toleft, f32 distance); void chrGetSideVector(struct chrdata *chr, bool side, struct coord *vector); bool chrCanJumpInDirection(struct chrdata *chr, bool side, f32 distance); s32 func0f036c08(struct chrdata *chr, struct coord *arg1, s16 *rooms); diff --git a/src/include/types.h b/src/include/types.h index 7d5055150..9e6d933ff 100644 --- a/src/include/types.h +++ b/src/include/types.h @@ -1092,7 +1092,7 @@ struct act_attack { /*0x48*/ u32 unk048; /*0x4c*/ u32 flags; /*0x50*/ u32 entityid; - /*0x54*/ u32 unk054; + /*0x54*/ s32 unk054; /*0x58*/ u32 unk058; };