diff --git a/src/game/chr/chraction.c b/src/game/chr/chraction.c index 763294230..a39360a84 100644 --- a/src/game/chr/chraction.c +++ b/src/game/chr/chraction.c @@ -84,8 +84,6 @@ const char var7f1a8c54[] = "CHARS -> numseenbond3 \t= %d/%d"; const char var7f1a8c78[] = "CHARS -> numseenbond \t= %d/%d"; const char var7f1a8c9c[] = "CHARS -> DEAD = %d/%d"; const char var7f1a8cb4[] = "chrdisttopad : %x -> %d : Dist=%f"; -const char var7f1a8cd8[] = "chraction.c"; -const char var7f1a8ce4[] = "chraction.c"; u32 var80068260 = 0x00000000; u32 var80068264 = 0x00000000; @@ -27821,102 +27819,44 @@ s16 chrGoToCover(struct chrdata *chr, u8 speed) return -1; } -GLOBAL_ASM( -glabel chrRunFromPos -/* f04c2e8: 27bdffb0 */ addiu $sp,$sp,-80 -/* f04c2ec: afbf0024 */ sw $ra,0x24($sp) -/* f04c2f0: afb00020 */ sw $s0,0x20($sp) -/* f04c2f4: 00808025 */ or $s0,$a0,$zero -/* f04c2f8: afa50054 */ sw $a1,0x54($sp) -/* f04c2fc: afa60058 */ sw $a2,0x58($sp) -/* f04c300: 0fc0e686 */ jal chrIsReadyForOrders -/* f04c304: afa7005c */ sw $a3,0x5c($sp) -/* f04c308: 10400048 */ beqz $v0,.L0f04c42c -/* f04c30c: 8fa3005c */ lw $v1,0x5c($sp) -/* f04c310: 8e0e001c */ lw $t6,0x1c($s0) -/* f04c314: c4660000 */ lwc1 $f6,0x0($v1) -/* f04c318: 44800000 */ mtc1 $zero,$f0 -/* f04c31c: c5c40008 */ lwc1 $f4,0x8($t6) -/* f04c320: 46062201 */ sub.s $f8,$f4,$f6 -/* f04c324: e7a80040 */ swc1 $f8,0x40($sp) -/* f04c328: 8e0f001c */ lw $t7,0x1c($s0) -/* f04c32c: c7a60040 */ lwc1 $f6,0x40($sp) -/* f04c330: c5ea000c */ lwc1 $f10,0xc($t7) -/* f04c334: 46060032 */ c.eq.s $f0,$f6 -/* f04c338: e7aa0044 */ swc1 $f10,0x44($sp) -/* f04c33c: 8e18001c */ lw $t8,0x1c($s0) -/* f04c340: c4720008 */ lwc1 $f18,0x8($v1) -/* f04c344: c7100010 */ lwc1 $f16,0x10($t8) -/* f04c348: 46128101 */ sub.s $f4,$f16,$f18 -/* f04c34c: 45010006 */ bc1t .L0f04c368 -/* f04c350: e7a40048 */ swc1 $f4,0x48($sp) -/* f04c354: c7ae0048 */ lwc1 $f14,0x48($sp) -/* f04c358: 460e0032 */ c.eq.s $f0,$f14 -/* f04c35c: c7a00040 */ lwc1 $f0,0x40($sp) -/* f04c360: 45000003 */ bc1f .L0f04c370 -/* f04c364: 00000000 */ sll $zero,$zero,0x0 -.L0f04c368: -/* f04c368: 10000031 */ beqz $zero,.L0f04c430 -/* f04c36c: 00001025 */ or $v0,$zero,$zero -.L0f04c370: -/* f04c370: 460e7202 */ mul.s $f8,$f14,$f14 -/* f04c374: e7ae0048 */ swc1 $f14,0x48($sp) -/* f04c378: 46000282 */ mul.s $f10,$f0,$f0 -/* f04c37c: 0c012974 */ jal sqrtf -/* f04c380: 460a4300 */ add.s $f12,$f8,$f10 -/* f04c384: c7b00058 */ lwc1 $f16,0x58($sp) -/* f04c388: c7b20040 */ lwc1 $f18,0x40($sp) -/* f04c38c: c7ae0048 */ lwc1 $f14,0x48($sp) -/* f04c390: 46008083 */ div.s $f2,$f16,$f0 -/* f04c394: 02002025 */ or $a0,$s0,$zero -/* f04c398: 00002825 */ or $a1,$zero,$zero -/* f04c39c: 46029102 */ mul.s $f4,$f18,$f2 -/* f04c3a0: 00000000 */ sll $zero,$zero,0x0 -/* f04c3a4: 46027382 */ mul.s $f14,$f14,$f2 -/* f04c3a8: e7a40040 */ swc1 $f4,0x40($sp) -/* f04c3ac: 0fc079ef */ jal chrSetOrUnsetHiddenFlag00000100 -/* f04c3b0: e7ae0048 */ swc1 $f14,0x48($sp) -/* f04c3b4: 8e02001c */ lw $v0,0x1c($s0) -/* f04c3b8: 24190004 */ addiu $t9,$zero,0x4 -/* f04c3bc: afb90010 */ sw $t9,0x10($sp) -/* f04c3c0: 27a60040 */ addiu $a2,$sp,0x40 -/* f04c3c4: 2407003f */ addiu $a3,$zero,0x3f -/* f04c3c8: 24440008 */ addiu $a0,$v0,0x8 -/* f04c3cc: 0c00b764 */ jal func0002dd90 -/* f04c3d0: 24450028 */ addiu $a1,$v0,0x28 -/* f04c3d4: 14400005 */ bnez $v0,.L0f04c3ec -/* f04c3d8: 27a40040 */ addiu $a0,$sp,0x40 -/* f04c3dc: 3c067f1b */ lui $a2,%hi(var7f1a8cd8) -/* f04c3e0: 24c68cd8 */ addiu $a2,$a2,%lo(var7f1a8cd8) -/* f04c3e4: 0c0093af */ jal func00024ebc -/* f04c3e8: 24054873 */ addiu $a1,$zero,0x4873 -.L0f04c3ec: -/* f04c3ec: 02002025 */ or $a0,$s0,$zero -/* f04c3f0: 0fc079ef */ jal chrSetOrUnsetHiddenFlag00000100 -/* f04c3f4: 24050001 */ addiu $a1,$zero,0x1 -/* f04c3f8: 8e02001c */ lw $v0,0x1c($s0) -/* f04c3fc: 27a60040 */ addiu $a2,$sp,0x40 -/* f04c400: 27a70030 */ addiu $a3,$sp,0x30 -/* f04c404: 24440008 */ addiu $a0,$v0,0x8 -/* f04c408: 0fc1979d */ jal func0f065e74 -/* f04c40c: 24450028 */ addiu $a1,$v0,0x28 -/* f04c410: 02002025 */ or $a0,$s0,$zero -/* f04c414: 27a50040 */ addiu $a1,$sp,0x40 -/* f04c418: 27a60030 */ addiu $a2,$sp,0x30 -/* f04c41c: 0fc0e10f */ jal chrGoToPos -/* f04c420: 8fa70054 */ lw $a3,0x54($sp) -/* f04c424: 10000003 */ beqz $zero,.L0f04c434 -/* f04c428: 8fbf0024 */ lw $ra,0x24($sp) -.L0f04c42c: -/* f04c42c: 00001025 */ or $v0,$zero,$zero -.L0f04c430: -/* f04c430: 8fbf0024 */ lw $ra,0x24($sp) -.L0f04c434: -/* f04c434: 8fb00020 */ lw $s0,0x20($sp) -/* f04c438: 27bd0050 */ addiu $sp,$sp,0x50 -/* f04c43c: 03e00008 */ jr $ra -/* f04c440: 00000000 */ sll $zero,$zero,0x0 -); +bool chrRunFromPos(struct chrdata *chr, u32 speed, f32 rundist, struct coord *frompos) +{ + f32 curdistfrompos; + struct coord delta; + s16 rooms[8]; + f32 zero = 0; + + if (chrIsReadyForOrders(chr)) { + delta.x = chr->prop->pos.x - frompos->x; + delta.y = chr->prop->pos.y; + delta.z = chr->prop->pos.z - frompos->z; + + // @bug: This check should be &&. The runfrompos will fail if the + // frompos is on the same X or Z axis as the chr, which is unlikely + // because it's a floating point number. + if (zero == delta.x || zero == delta.z) { + return false; + } + + curdistfrompos = sqrtf(delta.z * delta.z + delta.x * delta.x); + delta.x *= rundist / curdistfrompos; + delta.z *= rundist / curdistfrompos; + + chrSetOrUnsetHiddenFlag00000100(chr, false); + + if (!func0002dd90(&chr->prop->pos, chr->prop->rooms, &delta, 0x3f, 4)) { + func00024ebc(&delta, 18547, "chraction.c"); + } + + chrSetOrUnsetHiddenFlag00000100(chr, true); + + func0f065e74(&chr->prop->pos, chr->prop->rooms, &delta, rooms); + + return chrGoToPos(chr, &delta, rooms, speed); + } + + return false; +} void chrAddTargetToBdlist(struct chrdata *chr) { @@ -28040,6 +27980,8 @@ glabel var7f1a9428 /* f04c870: 46006006 */ mov.s $f0,$f12 ); +const char var7f1a8ce4[] = "chraction.c"; + GLOBAL_ASM( glabel func0f04c874 .late_rodata diff --git a/src/game/game_102240.c b/src/game/game_102240.c index 580355e6d..4505efee2 100644 --- a/src/game/game_102240.c +++ b/src/game/game_102240.c @@ -3486,7 +3486,7 @@ void func0f105948(s32 weaponnum) useindex = 0; } - if (weaponHasFlag(weaponnum, WEAPONFLAG_00040000) == false && (u32)wantindex >= 0 && useindex >= 0) { + if (weaponHasFlag(weaponnum, WEAPONFLAG_HIDEMENUMODEL) == false && (u32)wantindex >= 0 && useindex >= 0) { weapon = weaponFindById(weaponnum); g_MenuStack[g_MpPlayerNum].unk840 = 8; diff --git a/src/include/constants.h b/src/include/constants.h index 817264ac7..c38fd8b4c 100644 --- a/src/include/constants.h +++ b/src/include/constants.h @@ -2784,17 +2784,19 @@ #define WEAPON_DISABLED 0x5c #define WEAPON_SUICIDEPILL 0x5d -#define WEAPONFLAG_ONEHANDED 0x00000008 +#define WEAPONFLAG_ONEHANDED 0x00000008 // Makes guards carry the gun with one hand #define WEAPONFLAG_00000010 0x00000010 -#define WEAPONFLAG_TRACKTIMEUSED 0x00000200 -#define WEAPONFLAG_DUALWIELD 0x00001000 -#define WEAPONFLAG_00040000 0x00040000 -#define WEAPONFLAG_DETERMINER_S_AN 0x00200000 -#define WEAPONFLAG_DETERMINER_F_AN 0x00400000 -#define WEAPONFLAG_DETERMINER_S_THE 0x00800000 -#define WEAPONFLAG_DETERMINER_F_THE 0x01000000 -#define WEAPONFLAG_DETERMINER_S_SOME 0x10000000 -#define WEAPONFLAG_DETERMINER_F_SOME 0x20000000 +#define WEAPONFLAG_TRACKTIMEUSED 0x00000200 // Allow tracking how long gun is used, for weapon of choice +#define WEAPONFLAG_DUALWIELD 0x00001000 // Allow dual wielding +#define WEAPONFLAG_HIDEMENUMODEL 0x00040000 // Don't display the rotating model in the inventory menu +#define WEAPONFLAG_HOLDSIDEWAYS 0x00080000 // Allow turning the gun sideways at close range +#define WEAPONFLAG_DETERMINER_S_AN 0x00200000 // "An ..." (short version - when vertically split) +#define WEAPONFLAG_DETERMINER_F_AN 0x00400000 // "Picked up an ..." (full version) +#define WEAPONFLAG_DETERMINER_S_THE 0x00800000 // "The ..." (short version - when vertically split) +#define WEAPONFLAG_DETERMINER_F_THE 0x01000000 // "Picked up the ..." (full version) +#define WEAPONFLAG_DETERMINER_S_SOME 0x10000000 // "Some ..." (short version - when vertically split) +#define WEAPONFLAG_DETERMINER_F_SOME 0x20000000 // "Picked up some ..." (full version) +#define WEAPONFLAG_AIMTRACK 0x40000000 // Allow drawing red box around targets in aim mode #define WEAPONFLAG_80000000 0x80000000 #define WEAPONFUNCFLAG_00000040 0x00000040 // related to auto aim diff --git a/src/include/game/chr/chraction.h b/src/include/game/chr/chraction.h index 3667faa7b..c18a0eb74 100644 --- a/src/include/game/chr/chraction.h +++ b/src/include/game/chr/chraction.h @@ -200,7 +200,7 @@ bool chrMoveToPos(struct chrdata *chr, struct coord *pos, s16 *room, f32 arg3, u bool chrCheckCoverOutOfSight(struct chrdata *chr, s32 covernum, bool arg2); s32 func0f04ba34(struct chrdata *chr, u16 arg1, u32 arg2); u32 func0f04bffc(struct chrdata *chr, u32 arg1, u32 arg2); -void chrRunFromPos(struct chrdata *chr, u32 speed, f32 distance, struct coord *pos); +bool chrRunFromPos(struct chrdata *chr, u32 speed, f32 distance, struct coord *frompos); u32 func0f04c784(void); void func0f04c874(struct chrdata *chr, u32 flags, struct coord *pos, s32 arg3, s32 arg4); u32 rebuildTeams(void); diff --git a/src/include/lib/lib_233c0.h b/src/include/lib/lib_233c0.h index 8071dc505..ffac64538 100644 --- a/src/include/lib/lib_233c0.h +++ b/src/include/lib/lib_233c0.h @@ -113,7 +113,7 @@ u32 func0002dc18(struct coord *coord, s16 *room, struct coord *coord2, s32 arg3) bool hasLineOfSight(struct coord *coord, s16 *room, struct coord *coord2, s16 *room2, s32 arg4, s32 arg5); u32 func0002dcd0(void); bool func0002dcfc(struct coord *pos, s16 *rooms, struct coord *pos2, s16 *rooms2, s16 *rooms3, u32 arg5, u32 arg6); -u32 func0002dd90(void); +u32 func0002dd90(struct coord *pos, s16 *rooms, struct coord *pos2, u32 arg3, u32 arg4); u32 func0002de10(void); u32 func0002de34(void); u32 func0002deac(void);