diff --git a/src/files/setup/setupdepo.c b/src/files/setup/setupdepo.c index 4fa6342aa..aaa8c0131 100644 --- a/src/files/setup/setupdepo.c +++ b/src/files/setup/setupdepo.c @@ -2240,21 +2240,21 @@ u8 func101a_init_laser_switch_guards[] = { if_difficulty_lt(DIFF_PA, /*goto*/ 0x09) // Perfect Agent - set_chr_flag_bankx(0x0c, CHRFLAG0_CAN_RUN_FOR_ALARM, BANK_0) - set_chr_flag_bankx(0x0d, CHRFLAG0_CAN_RUN_FOR_ALARM, BANK_0) - set_chr_flag_bankx(0x0e, CHRFLAG0_CAN_RUN_FOR_ALARM, BANK_0) + set_chr_flag_bankx(0x0c, CHRFLAG0_CAN_GO_TO_PLACES, BANK_0) + set_chr_flag_bankx(0x0d, CHRFLAG0_CAN_GO_TO_PLACES, BANK_0) + set_chr_flag_bankx(0x0e, CHRFLAG0_CAN_GO_TO_PLACES, BANK_0) goto_next(0x06) // Agent label(0x08) - set_chr_flag_bankx(0x0e, CHRFLAG0_CAN_RUN_FOR_ALARM, BANK_0) + set_chr_flag_bankx(0x0e, CHRFLAG0_CAN_GO_TO_PLACES, BANK_0) set_chr_flag_bankx(0x0e, CHRFLAG0_UNSURPRISABLE, BANK_0) goto_next(0x06) // Special Agent label(0x09) - set_chr_flag_bankx(0x0e, CHRFLAG0_CAN_RUN_FOR_ALARM, BANK_0) - set_chr_flag_bankx(0x0d, CHRFLAG0_CAN_RUN_FOR_ALARM, BANK_0) + set_chr_flag_bankx(0x0e, CHRFLAG0_CAN_GO_TO_PLACES, BANK_0) + set_chr_flag_bankx(0x0d, CHRFLAG0_CAN_GO_TO_PLACES, BANK_0) label(0x06) set_ailist(CHR_SELF, GAILIST_IDLE) diff --git a/src/game/chr/chraction.c b/src/game/chr/chraction.c index aa189c795..5f007911d 100644 --- a/src/game/chr/chraction.c +++ b/src/game/chr/chraction.c @@ -13019,62 +13019,32 @@ bool chrFaceEntity(struct chrdata *chr, u32 entitytype, u32 entityid) return false; } -GLOBAL_ASM( -glabel func0f03a894 -/* f03a894: 27bdff88 */ addiu $sp,$sp,-120 -/* f03a898: afb00018 */ sw $s0,0x18($sp) -/* f03a89c: 00808025 */ or $s0,$a0,$zero -/* f03a8a0: afbf001c */ sw $ra,0x1c($sp) -/* f03a8a4: 04a00027 */ bltz $a1,.L0f03a944 -/* f03a8a8: afa60080 */ sw $a2,0x80($sp) -/* f03a8ac: 0fc0e686 */ jal chrIsReadyForOrders -/* f03a8b0: afa5007c */ sw $a1,0x7c($sp) -/* f03a8b4: 10400023 */ beqz $v0,.L0f03a944 -/* f03a8b8: 8fa7007c */ lw $a3,0x7c($sp) -/* f03a8bc: 3c0e8006 */ lui $t6,%hi(var80062cbc) -/* f03a8c0: 8dce2cbc */ lw $t6,%lo(var80062cbc)($t6) -/* f03a8c4: 02002025 */ or $a0,$s0,$zero -/* f03a8c8: 29c10009 */ slti $at,$t6,0x9 -/* f03a8cc: 14200009 */ bnez $at,.L0f03a8f4 -/* f03a8d0: 00000000 */ sll $zero,$zero,0x0 -/* f03a8d4: 8e0f0014 */ lw $t7,0x14($s0) -/* f03a8d8: 000fc240 */ sll $t8,$t7,0x9 -/* f03a8dc: 07010005 */ bgez $t8,.L0f03a8f4 -/* f03a8e0: 00000000 */ sll $zero,$zero,0x0 -/* f03a8e4: 8e190114 */ lw $t9,0x114($s0) -/* f03a8e8: 00194340 */ sll $t0,$t9,0xd -/* f03a8ec: 05030016 */ bgezl $t0,.L0f03a948 -/* f03a8f0: 00001025 */ or $v0,$zero,$zero -.L0f03a8f4: -/* f03a8f4: 0fc1258b */ jal chrResolvePadId -/* f03a8f8: 00e02825 */ or $a1,$a3,$zero -/* f03a8fc: 04400011 */ bltz $v0,.L0f03a944 -/* f03a900: 00402025 */ or $a0,$v0,$zero -/* f03a904: 24050042 */ addiu $a1,$zero,0x42 -/* f03a908: 0fc456ac */ jal padUnpack -/* f03a90c: 27a60020 */ addiu $a2,$sp,0x20 -/* f03a910: 8fa90068 */ lw $t1,0x68($sp) -/* f03a914: 240affff */ addiu $t2,$zero,-1 -/* f03a918: a7aa0076 */ sh $t2,0x76($sp) -/* f03a91c: 02002025 */ or $a0,$s0,$zero -/* f03a920: 27a50020 */ addiu $a1,$sp,0x20 -/* f03a924: 27a60074 */ addiu $a2,$sp,0x74 -/* f03a928: 8fa70080 */ lw $a3,0x80($sp) -/* f03a92c: 0fc0e10f */ jal chrGoToPos -/* f03a930: a7a90074 */ sh $t1,0x74($sp) -/* f03a934: 50400004 */ beqzl $v0,.L0f03a948 -/* f03a938: 00001025 */ or $v0,$zero,$zero -/* f03a93c: 10000002 */ beqz $zero,.L0f03a948 -/* f03a940: 24020001 */ addiu $v0,$zero,0x1 -.L0f03a944: -/* f03a944: 00001025 */ or $v0,$zero,$zero -.L0f03a948: -/* f03a948: 8fbf001c */ lw $ra,0x1c($sp) -/* f03a94c: 8fb00018 */ lw $s0,0x18($sp) -/* f03a950: 27bd0078 */ addiu $sp,$sp,0x78 -/* f03a954: 03e00008 */ jr $ra -/* f03a958: 00000000 */ sll $zero,$zero,0x0 -); +bool chrGoToPad(struct chrdata *chr, s32 padnum, u32 speed) +{ + if (padnum >= 0 + && chrIsReadyForOrders(chr) + && (var80062cbc <= 8 + || (chr->hidden & CHRHFLAG_00400000) == 0 + || (chr->flags & CHRFLAG0_CAN_GO_TO_PLACES))) { + padnum = chrResolvePadId(chr, padnum); + + if (padnum >= 0) { + s16 rooms[2]; + struct pad pad; + + padUnpack(padnum, PADFIELD_ROOM | PADFIELD_POS, &pad); + + rooms[0] = pad.room; + rooms[1] = -1; + + if (chrGoToPos(chr, &pad.pos, rooms, speed)) { + return true; + } + } + } + + return false; +} bool chrSetPath(struct chrdata *chr, u32 path_id) { @@ -13117,7 +13087,7 @@ bool chrGoToTarget(struct chrdata *chr, u32 speed) if (chrIsReadyForOrders(chr)) { if (var80062cbc <= 8 || (chr->hidden & CHRHFLAG_00400000) == 0 || - (chr->flags & CHRFLAG0_CAN_RUN_FOR_ALARM)) { + (chr->flags & CHRFLAG0_CAN_GO_TO_PLACES)) { struct prop *prop = chrGetTargetProp(chr); if (chrGoToPos(chr, &prop->pos, &prop->rooms[0], speed)) { @@ -13134,7 +13104,7 @@ bool chrGoToChr(struct chrdata *chr, u32 dst_chrnum, u32 speed) if (chrIsReadyForOrders(chr)) { if (var80062cbc <= 8 || (chr->hidden & CHRHFLAG_00400000) == 0 || - (chr->flags & CHRFLAG0_CAN_RUN_FOR_ALARM)) { + (chr->flags & CHRFLAG0_CAN_GO_TO_PLACES)) { struct chrdata *dstchr = chrFindById(chr, dst_chrnum); if (dstchr && dstchr->prop && chrGoToPos(chr, &dstchr->prop->pos, &dstchr->prop->rooms[0], speed)) { diff --git a/src/game/chr/chraicommands.c b/src/game/chr/chraicommands.c index 557fe3c8f..84c76f883 100644 --- a/src/game/chr/chraicommands.c +++ b/src/game/chr/chraicommands.c @@ -1149,7 +1149,7 @@ bool aiJogToPad(void) u8 *cmd = g_Vars.ailist + g_Vars.aioffset; u16 pad = cmd[3] | (cmd[2] << 8); - func0f03a894(g_Vars.chrdata, pad, SPEED_JOG); + chrGoToPad(g_Vars.chrdata, pad, SPEED_JOG); g_Vars.aioffset += 4; return false; @@ -1164,13 +1164,13 @@ bool aiGoToPadPreset(void) switch (cmd[2]) { case 0: - func0f03a894(g_Vars.chrdata, g_Vars.chrdata->padpreset1, SPEED_WALK); + chrGoToPad(g_Vars.chrdata, g_Vars.chrdata->padpreset1, SPEED_WALK); break; case 1: - func0f03a894(g_Vars.chrdata, g_Vars.chrdata->padpreset1, SPEED_JOG); + chrGoToPad(g_Vars.chrdata, g_Vars.chrdata->padpreset1, SPEED_JOG); break; default: - func0f03a894(g_Vars.chrdata, g_Vars.chrdata->padpreset1, SPEED_RUN); + chrGoToPad(g_Vars.chrdata, g_Vars.chrdata->padpreset1, SPEED_RUN); break; } @@ -1187,7 +1187,7 @@ bool aiWalkToPad(void) u8 *cmd = g_Vars.ailist + g_Vars.aioffset; u16 pad = cmd[3] | (cmd[2] << 8); - func0f03a894(g_Vars.chrdata, pad, SPEED_WALK); + chrGoToPad(g_Vars.chrdata, pad, SPEED_WALK); g_Vars.aioffset += 4; return false; @@ -1201,7 +1201,7 @@ bool aiRunToPad(void) u8 *cmd = g_Vars.ailist + g_Vars.aioffset; u16 pad = cmd[3] | (cmd[2] << 8); - func0f03a894(g_Vars.chrdata, pad, SPEED_RUN); + chrGoToPad(g_Vars.chrdata, pad, SPEED_RUN); g_Vars.aioffset += 4; return false; diff --git a/src/game/data/ailists.c b/src/game/data/ailists.c index 9d518188f..c48432f78 100644 --- a/src/game/data/ailists.c +++ b/src/game/data/ailists.c @@ -365,7 +365,7 @@ u8 func0006_unalerted[] = { label(0x16) if_chr_has_hiddenflag(CHR_TARGET, CHRHFLAG_DISGUISED, /*goto*/ 0x14) if_chr_in_squadron_doing_action(MA_GOTOALARM, /*goto*/ 0x16) - if_self_flag_bankx_eq(CHRFLAG0_CAN_RUN_FOR_ALARM, TRUE, BANK_0, /*goto*/ 0x9f) + if_self_flag_bankx_eq(CHRFLAG0_CAN_GO_TO_PLACES, TRUE, BANK_0, /*goto*/ 0x9f) label(0x16) say_quip(CHR_BOND, QUIP_SEEPLAYER, 0xff, 0x03, 0xff, BANK_0, 0x00, 0x00) label(0x9f) @@ -753,7 +753,7 @@ u8 func0006_unalerted[] = { label(0x77) if_chr_in_squadron_doing_action(MA_GOTOALARM, /*goto*/ 0x16) - if_self_flag_bankx_eq(CHRFLAG0_CAN_RUN_FOR_ALARM, TRUE, BANK_0, /*goto*/ 0x13) + if_self_flag_bankx_eq(CHRFLAG0_CAN_GO_TO_PLACES, TRUE, BANK_0, /*goto*/ 0x13) label(0x16) set_ailist(CHR_SELF, GAILIST_INIT_COMBAT) @@ -1074,7 +1074,7 @@ u8 func0007_alerted[] = { dprint 'B','4',' ','T','E','A','M',' ','C','H','E','C','K','\n',0, if_alarm_active(/*goto*/ 0x16) if_chr_in_squadron_doing_action(MA_GOTOALARM, /*goto*/ 0x16) - if_self_flag_bankx_eq(CHRFLAG0_CAN_RUN_FOR_ALARM, TRUE, BANK_0, /*goto*/ LABEL_RUN_FOR_ALARM) + if_self_flag_bankx_eq(CHRFLAG0_CAN_GO_TO_PLACES, TRUE, BANK_0, /*goto*/ LABEL_RUN_FOR_ALARM) // No need to warn label(0x16) diff --git a/src/include/constants.h b/src/include/constants.h index 191c0d2ae..cd3e742bf 100644 --- a/src/include/constants.h +++ b/src/include/constants.h @@ -303,7 +303,7 @@ #define CHRFLAG0_00008000 0x00008000 // Something to do with breaking cover or grenades? #define CHRFLAG0_AIVSAI 0x00010000 #define CHRFLAG0_CAN_TRAP 0x00020000 -#define CHRFLAG0_CAN_RUN_FOR_ALARM 0x00040000 +#define CHRFLAG0_CAN_GO_TO_PLACES 0x00040000 #define CHRFLAG0_SQUADALERTANYDIST 0x00080000 #define CHRFLAG0_00100000 0x00100000 // Become alert when hearing player and never on screen #define CHRFLAG0_00200000 0x00200000 // Globals, Villa hostage takers diff --git a/src/include/game/chr/chraction.h b/src/include/game/chr/chraction.h index e83ff1f3a..1abc8d4be 100644 --- a/src/include/game/chr/chraction.h +++ b/src/include/game/chr/chraction.h @@ -99,7 +99,7 @@ u32 chrTryAttackWalk(struct chrdata *chr); bool chrTryAttackRun(struct chrdata *chr); u32 chrTryAttackRoll(struct chrdata *chr); u32 chrTryAttackAmount(struct chrdata *chr, u32 arg1, u32 arg2, u8 arg3, u8 arg4); -u32 func0f03a894(struct chrdata *chr, s32 pad, s32 arg2); +bool chrGoToPad(struct chrdata *chr, s32 padnum, u32 speed); u32 func0f03abd0(void); u32 func0f03aca0(struct chrdata *chr, u32 arg1, u32 arg2); u32 chrTryRunFromTarget(struct chrdata *chr);