diff --git a/src/game/chr/chraicommands.c b/src/game/chr/chraicommands.c index 2b3ef33e7..1606ae237 100644 --- a/src/game/chr/chraicommands.c +++ b/src/game/chr/chraicommands.c @@ -14426,52 +14426,17 @@ glabel ai01dd /** * @cmd 01de */ -GLOBAL_ASM( -glabel ai01de -/* f060048: 3c03800a */ lui $v1,%hi(g_Vars) -/* f06004c: 24639fc0 */ addiu $v1,$v1,%lo(g_Vars) -/* f060050: 8c6e0318 */ lw $t6,0x318($v1) -/* f060054: 27bdffe8 */ addiu $sp,$sp,-24 -/* f060058: afbf0014 */ sw $ra,0x14($sp) -/* f06005c: 15c0000d */ bnez $t6,.L0f060094 -/* f060060: 3c0f800a */ lui $t7,0x800a -/* f060064: 81f8dfeb */ lb $t8,-0x2015($t7) -/* f060068: 0703000b */ bgezl $t8,.L0f060098 -/* f06006c: 8c790438 */ lw $t9,0x438($v1) -/* f060070: 8c640434 */ lw $a0,0x434($v1) -/* f060074: 8c650438 */ lw $a1,0x438($v1) -/* f060078: 00851021 */ addu $v0,$a0,$a1 -/* f06007c: 0fc13583 */ jal chraiGoToLabel -/* f060080: 90460002 */ lbu $a2,0x2($v0) -/* f060084: 3c03800a */ lui $v1,%hi(g_Vars) -/* f060088: 24639fc0 */ addiu $v1,$v1,%lo(g_Vars) -/* f06008c: 10000004 */ beqz $zero,.L0f0600a0 -/* f060090: ac620438 */ sw $v0,0x438($v1) -.L0f060094: -/* f060094: 8c790438 */ lw $t9,0x438($v1) -.L0f060098: -/* f060098: 27280003 */ addiu $t0,$t9,0x3 -/* f06009c: ac680438 */ sw $t0,0x438($v1) -.L0f0600a0: -/* f0600a0: 8fbf0014 */ lw $ra,0x14($sp) -/* f0600a4: 27bd0018 */ addiu $sp,$sp,0x18 -/* f0600a8: 00001025 */ or $v0,$zero,$zero -/* f0600ac: 03e00008 */ jr $ra -/* f0600b0: 00000000 */ sll $zero,$zero,0x0 -); +bool aiIfCoopMode(void) +{ + if (g_Vars.unk000318 == 0 && g_MissionConfig.iscoop) { + u8 *cmd = g_Vars.ailist + g_Vars.aioffset; + g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[2]); + } else { + g_Vars.aioffset += 3; + } -// Mismatch due to different temporary registers -//bool ai01de(void) -//{ -// if (g_Vars.unk000318 == 0 && (s8)g_MissionConfig[3] < 0) { -// u8 *cmd = g_Vars.ailist + g_Vars.aioffset; -// g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[2]); -// } else { -// g_Vars.aioffset += 3; -// } -// -// return false; -//} + return false; +} /** * @cmd 01e0 diff --git a/src/include/commands.h b/src/include/commands.h index 824089164..223ab9295 100644 --- a/src/include/commands.h +++ b/src/include/commands.h @@ -31,7 +31,7 @@ id, /** - * Pauses the current script and yield execution back to the engine. At least + * Pauses the current script and yields execution back to the engine. At least * one frame will pass before the script is continued. * * To prevent infinite loops this must be called at least once per loop. This is @@ -86,7 +86,7 @@ * You would typically set this to the same list as the current one so the chr * continues doing what they were doing previously (eg. running to a target). * The list will be restarted from the beginning. You may want to use - * if_just_injured near the top of the list so you detect then injury, make them + * if_just_injured near the top of the list so you detect the injury, make them * say something and wait for their injury animation to finish before they * continue their regular logic. */ @@ -189,6 +189,11 @@ mkshort(0x0012), \ label, +/** + * Attempt to run and shoot. If it worked then go to the given label. + * The command may fail if the chr is blocked, or maybe if the chr can't see + * their target. + */ #define try_run_and_shoot(label) \ mkshort(0x0013), \ label, @@ -615,7 +620,7 @@ label, /** - * Checks if the chr had shot nearly hit them. + * Checks if the chr had a shot nearly hit them. */ #define if_near_miss(label) \ mkshort(0x004b), \ @@ -975,7 +980,7 @@ * Checks if the given objective index is complete. * * This is not the same as the objective number. Objective indexes start from 0, - * and some objective indexes do not apply to higher difficulties. + * and some objective indexes do not apply to easier difficulties. */ #define if_objective_complete(objective, label) \ mkshort(0x0073), \ @@ -986,7 +991,7 @@ * Checks if the given objective index is failed. * * This is not the same as the objective number. Objective indexes start from 0, - * and some objective indexes do not apply to higher difficulties. + * and some objective indexes do not apply to easier difficulties. */ #define if_objective_failed(objective, label) \ mkshort(0x0074), \ @@ -1588,7 +1593,7 @@ * * padpreset can be referenced via PAD_PRESET. */ -#define chr_set_target_pad(pad) \ +#define chr_set_target_pad(chr, pad) \ mkshort(0x00b3), \ chr, \ mkshort(pad), @@ -2102,7 +2107,7 @@ /** * Checks if the player is invincible. * - * Set set_invincible. + * See set_invincible. */ #define if_player_is_invincible(chr, label) \ mkshort(0x00f8), \ @@ -2699,12 +2704,11 @@ object, \ 0x00, -// Related to hovercopter and Infiltration interceptors -// Sets player struct's field_0x2e to 1/true. +// Sets the heli's 0x90 field to true. #define cmd0143 \ mkshort(0x0143), -// Sets heli field 0x90 +// Sets the heli's 0x90 field to false. #define cmd0144 \ mkshort(0x0144), \ label, @@ -2896,8 +2900,8 @@ // If bool is false, run some function on the chr and their gun ground // prop, then follow the label. -// If bool is true, don't call the function, and only follow the label if field -// 0x4 in the gun ground prop struct is less than 64. +// If bool is true, don't call the function, and only follow the label if the +// gun prop has OBJHIDDENFLAG_00000080. #define if_gun_landed(bool, label) \ mkshort(0x0170), \ bool, \ @@ -3724,7 +3728,12 @@ mkshort(distance / 10), \ label, -// Not sure about this +/** + * Checks if the game is being played in co-operative mode. + * + * This command does not check if the buddy is a human or bot. You can use + * if_num_human_players_lt for that. + */ #define if_coop_mode(label) \ mkshort(0x01de), \ label, diff --git a/src/include/game/chr/chraicommands.h b/src/include/game/chr/chraicommands.h index 0423f2725..e6bb5550f 100644 --- a/src/include/game/chr/chraicommands.h +++ b/src/include/game/chr/chraicommands.h @@ -441,7 +441,7 @@ /*0x01db*/ bool aiChrKill(void); /*0x01dc*/ bool aiRemoveWeaponFromInventory(void); /*0x01dd*/ bool ai01dd(void); -/*0x01de*/ bool ai01de(void); +/*0x01de*/ bool aiIfCoopMode(void); /*0x01df*/ bool aiIfChrSameFloorDistanceToPadLessThan(void); /*0x01e0*/ bool ai01e0(void); diff --git a/src/setup/setup_000000.c b/src/setup/setup_000000.c index f27426789..7b3ce8772 100644 --- a/src/setup/setup_000000.c +++ b/src/setup/setup_000000.c @@ -14613,7 +14613,7 @@ bool (*g_CommandPointers[])(void) = { /*0x01db*/ aiChrKill, /*0x01dc*/ aiRemoveWeaponFromInventory, /*0x01dd*/ ai01dd, - /*0x01de*/ ai01de, + /*0x01de*/ aiIfCoopMode, /*0x01df*/ aiIfChrSameFloorDistanceToPadLessThan, /*0x01e0*/ ai01e0, };