Rename functions and an AI command relating to FOV checks

This commit is contained in:
Ryan Dwyer 2021-02-05 22:04:01 +10:00
parent 91b275bb19
commit 0c9bb52b78
18 changed files with 126 additions and 81 deletions

View File

@ -1817,7 +1817,7 @@ u8 func0414_programmer[] = {
if_can_see_target(/*goto*/ 0x06)
goto_next(0x2c)
label(0x06)
if_player_looking_at_something_maybe(0x28, 0x01, 0x00, /*goto*/ LABEL_JO_SPEAK)
if_within_targets_fovx_by_angle(40, /*goto*/ LABEL_JO_SPEAK)
label(0x2c)
endloop(0x0d)
@ -1887,7 +1887,7 @@ u8 func0414_programmer[] = {
if_chr_stopped(/*goto*/ LABEL_LOG_ON)
if_stage_flag_eq(STAGEFLAG_PROGRAMMER_INJURED, TRUE, /*goto*/ 0x06)
if_distance_to_target_lt(500, /*goto*/ 0x06)
if_player_looking_at_something_maybe(0x28, 0x01, 0x00, /*goto*/ 0x06)
if_within_targets_fovx_by_angle(40, /*goto*/ 0x06)
if_chr_in_room(CHR_PROGRAMMER, 0x00, 0x007d, /*goto*/ 0x06)
if_chr_in_room(CHR_PROGRAMMER, 0x00, 0x007e, /*goto*/ 0x06)
if_chr_in_room(CHR_PROGRAMMER, 0x00, 0x007f, /*goto*/ 0x06)

View File

@ -1421,7 +1421,7 @@ u8 func041a_pres_clone[] = {
chr_toggle_p1p2(CHR_SELF)
set_target_chr(CHR_P1P2)
if_alertness(99, OPERATOR_GREATER_THAN, /*goto*/ 0x31)
if_player_looking_at_something_maybe(0x00, 0x00, 0x01, /*goto*/ 0x08)
if_target_outside_my_yvisang(/*goto*/ 0x08)
if_target_in_sight(/*goto*/ 0x31)
label(0x08)
endloop(0x06)

View File

@ -1193,7 +1193,7 @@ u8 func0407_stewardess[] = {
if_distance_to_target_gt(500, /*goto*/ 0x31)
if_alertness(99, OPERATOR_GREATER_THAN, /*goto*/ 0x04)
label(0x31)
if_player_looking_at_something_maybe(0x00, 0x00, 0x01, /*goto*/ 0x02)
if_target_outside_my_yvisang(/*goto*/ 0x02)
if_target_in_sight(/*goto*/ 0x04)
label(0x02)
if_timer_gt(120, /*goto*/ 0x16)
@ -1220,7 +1220,7 @@ u8 func0407_stewardess[] = {
if_saw_death(0x00, /*goto*/ 0x0f)
label(0x31)
if_alertness(99, OPERATOR_GREATER_THAN, /*goto*/ 0x04)
if_player_looking_at_something_maybe(0x00, 0x00, 0x01, /*goto*/ 0x02)
if_target_outside_my_yvisang(/*goto*/ 0x02)
if_target_in_sight(/*goto*/ 0x04)
label(0x02)
if_chr_stopped(/*goto*/ 0x0b)
@ -1291,7 +1291,7 @@ u8 func0407_stewardess[] = {
label(0x75)
if_alertness(99, OPERATOR_GREATER_THAN, /*goto*/ 0x4e)
dprint 'W','A','L','K','I','N','G','\n',0,
if_player_looking_at_something_maybe(0x00, 0x00, 0x01, /*goto*/ 0x31)
if_target_outside_my_yvisang(/*goto*/ 0x31)
if_target_in_sight(/*goto*/ 0x02)
label(0x31)
if_distance_to_chr_lt(200, 0xfb, /*goto*/ 0x4a)

View File

@ -2305,7 +2305,7 @@ u8 func0412_cloak_guard[] = {
goto_next(0x06)
label(0x2c)
if_player_looking_at_something_maybe(0x0f, 0x01, 0x00, /*goto*/ 0x0e)
if_within_targets_fovx_by_angle(15, /*goto*/ 0x0e)
label(0x06)
if_can_see_attack_target(/*goto*/ 0x2c)
goto_next(0x0d)

View File

@ -631,7 +631,7 @@ u8 func041e_colleague[] = {
goto_first(0x59)
label(0x06)
if_player_looking_at_something_maybe(0x14, 0x01, 0x00, /*goto*/ 0x06)
if_within_targets_fovx_by_angle(20, /*goto*/ 0x06)
goto_first(0x59)
label(0x06)
@ -658,7 +658,7 @@ u8 func041e_colleague[] = {
goto_next(0x2f)
label(0x06)
if_player_looking_at_something_maybe(0x14, 0x01, 0x00, /*goto*/ 0x30)
if_within_targets_fovx_by_angle(20, /*goto*/ 0x30)
label(0x2f)
if_chr_idle(/*goto*/ 0x06)
if_self_flag_bankx_eq(CHRFLAG1_DOINGIDLEANIMATION, FALSE, BANK_1, /*goto*/ 0x7f)
@ -4052,7 +4052,7 @@ u8 func042f_holo2_part2[] = {
endloop(0x08)
beginloop(0x04)
if_player_looking_at_something_maybe(0x14, 0x01, 0x00, /*goto*/ 0x06)
if_within_targets_fovx_by_angle(20, /*goto*/ 0x06)
goto_next(0x2f)
label(0x06)
@ -5153,7 +5153,7 @@ u8 func0415_holo_guard_unarmed_unalert[] = {
beginloop(0x08)
if_timer_gt(120, /*goto*/ 0x04)
if_player_looking_at_something_maybe(0x28, 0x01, 0x00, /*goto*/ 0x04)
if_within_targets_fovx_by_angle(40, /*goto*/ 0x04)
endloop(0x08)
beginloop(0x04)

View File

@ -2998,7 +2998,7 @@ u8 func0421_bridge_skedar[] = {
chr_toggle_p1p2(CHR_SELF)
label(0x2c)
set_target_chr(CHR_P1P2)
if_player_looking_at_something_maybe(0x00, 0x00, 0x01, /*goto*/ 0x06)
if_target_outside_my_yvisang(/*goto*/ 0x06)
if_target_in_sight(/*goto*/ 0xc8)
label(0x06)
if_saw_injury(0x00, /*goto*/ 0xc8)
@ -3008,7 +3008,7 @@ u8 func0421_bridge_skedar[] = {
reloop(0xc7)
label(0x06)
if_player_looking_at_something_maybe(0x00, 0x00, 0x01, /*goto*/ 0x2c)
if_target_outside_my_yvisang(/*goto*/ 0x2c)
if_target_in_sight(/*goto*/ 0xc8)
label(0x2c)
set_target_chr(CHR_BOND)
@ -3053,7 +3053,7 @@ u8 func0421_bridge_skedar[] = {
call_rng
chr_toggle_p1p2(CHR_SELF)
set_target_chr(CHR_P1P2)
if_player_looking_at_something_maybe(0x00, 0x00, 0x01, /*goto*/ 0x06)
if_target_outside_my_yvisang(/*goto*/ 0x06)
if_target_in_sight(/*goto*/ 0xce)
label(0x06)
if_timer_gt(60, /*goto*/ 0xcf)

View File

@ -3467,7 +3467,7 @@ u8 func0426_check_looking_at_alien[] = {
// Jo is in range
label(0x64)
if_player_looking_at_something_maybe(0x0a, 0x01, 0x00, /*goto*/ 0x2d)
if_within_targets_fovx_by_angle(10, /*goto*/ 0x2d)
// Jo is too far away or not looking at alien
label(0x66)
@ -3477,7 +3477,7 @@ u8 func0426_check_looking_at_alien[] = {
// Velvet is in range
label(0x68)
if_player_looking_at_something_maybe(0x0a, 0x01, 0x00, /*goto*/ 0x2d)
if_within_targets_fovx_by_angle(10, /*goto*/ 0x2d)
// Both players are too far away
label(0x69)

View File

@ -3210,7 +3210,7 @@ u8 func041d_sniper[] = {
label(0x2e)
dprint 'C','H','E','C','K',' ','P','L','A','Y','E','R',' ','D','I','R','\n',0,
if_player_looking_at_something_maybe(0x14, 0x01, 0x00, /*goto*/ 0x0d)
if_within_targets_fovx_by_angle(20, /*goto*/ 0x0d)
dprint '3','\n',0,
label(0x06)
if_can_see_target(/*goto*/ 0x2e)

View File

@ -1704,7 +1704,7 @@ u8 func0409_reaper_slayer_skedar[] = {
if_self_flag_bankx_eq(CHRFLAG0_AIVSAI, FALSE, BANK_0, /*goto*/ 0x2e)
if_enemy_distance_lt_and_los(2540, /*goto*/ 0x60)
label(0x2e)
if_player_looking_at_something_maybe(0x00, 0x00, 0x01, /*goto*/ 0x06)
if_target_outside_my_yvisang(/*goto*/ 0x06)
if_target_in_sight(/*goto*/ 0x60)
label(0x06)
if_just_injured(CHR_SELF, /*goto*/ 0x58)
@ -1716,7 +1716,7 @@ u8 func0409_reaper_slayer_skedar[] = {
endloop(0x5f)
label(0x06)
if_player_looking_at_something_maybe(0x00, 0x00, 0x01, /*goto*/ 0x2d)
if_target_outside_my_yvisang(/*goto*/ 0x2d)
if_target_in_sight(/*goto*/ 0x60)
label(0x2d)
set_target_chr(CHR_BOND)
@ -1768,7 +1768,7 @@ u8 func0409_reaper_slayer_skedar[] = {
call_rng
chr_toggle_p1p2(CHR_SELF)
set_target_chr(CHR_P1P2)
if_player_looking_at_something_maybe(0x00, 0x00, 0x01, /*goto*/ 0x06)
if_target_outside_my_yvisang(/*goto*/ 0x06)
if_target_in_sight(/*goto*/ 0x6b)
label(0x06)
if_timer_gt(60, /*goto*/ 0x6c)

View File

@ -831,7 +831,7 @@ u8 func0402_jonathan_waiting_for_meetup[] = {
do_preset_animation(3)
beginloop(0x09)
if_player_looking_at_something_maybe(0x0a, 0x01, 0x00, /*goto*/ 0x06)
if_within_targets_fovx_by_angle(10, /*goto*/ 0x06)
if_timer_gt(60, /*goto*/ 0x06)
endloop(0x09)

View File

@ -1579,7 +1579,7 @@ u8 func0415_chief[] = {
beginloop(0x03)
chr_toggle_p1p2(CHR_SELF)
set_target_chr(CHR_P1P2)
if_player_looking_at_something_maybe(0x00, 0x00, 0x01, /*goto*/ 0x06)
if_target_outside_my_yvisang(/*goto*/ 0x06)
if_target_in_sight(/*goto*/ 0x2c)
label(0x06)
reloop(0x03)

View File

@ -24215,24 +24215,24 @@ f32 chrGetVerticalAngleToTarget(struct chrdata *chr)
return result;
}
bool func0f048e74(struct chrdata *chr, u8 fov)
bool chrIsInTargetsFovX(struct chrdata *chr, u8 fov360)
{
f32 angle = chrGetAngleFromTargetsFov(chr);
if ((angle < fov * 0.024539785459638f && angle < M_PI)
|| (angle > M_BADTAU - fov * 0.024539785459638f && angle > M_PI)) {
if ((angle < fov360 * 0.024539785459638f && angle < M_PI)
|| (angle > M_BADTAU - fov360 * 0.024539785459638f && angle > M_PI)) {
return true;
}
return false;
}
bool func0f048f20(struct chrdata *chr, u8 angle)
bool chrIsVerticalAngleToTargetWithin(struct chrdata *chr, u8 fov360)
{
f32 val = chrGetVerticalAngleToTarget(chr);
if ((val < angle * 0.024539785459638f && val < M_PI)
|| (val > M_BADTAU - angle * 0.024539785459638f && val > M_PI)) {
if ((val < fov360 * 0.024539785459638f && val < M_PI)
|| (val > M_BADTAU - fov360 * 0.024539785459638f && val > M_PI)) {
return true;
}
@ -24776,7 +24776,7 @@ bool chrCanSeeTargetWithExtraCheck(struct chrdata *chr)
return false;
}
return func0f048e74(chr, 20);
return chrIsInTargetsFovX(chr, 20);
}
if (target->type == PROPTYPE_PLAYER) {

View File

@ -95,7 +95,7 @@ bool (*g_CommandPointers[])(void) = {
/*0x004b*/ aiIfNearMiss,
/*0x004c*/ aiIfSeesSuspiciousItem,
/*0x004d*/ aiIfTargetInFovLeft,
/*0x004e*/ ai004e,
/*0x004e*/ aiIfCheckFovWithTarget,
/*0x004f*/ aiIfTargetOutOfFovLeft,
/*0x0050*/ aiIfTargetInFov,
/*0x0051*/ aiIfTargetOutOfFov,

View File

@ -1625,19 +1625,19 @@ bool aiIfSeesSuspiciousItem(void)
/**
* @cmd 004e
*/
bool ai004e(void)
bool aiIfCheckFovWithTarget(void)
{
bool pass;
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
if (cmd[4] == 0) {
if (cmd[3]) {
pass = func0f048e74(g_Vars.chrdata, cmd[2]);
pass = chrIsInTargetsFovX(g_Vars.chrdata, cmd[2]);
} else {
pass = func0f048f20(g_Vars.chrdata, cmd[2]);
pass = chrIsVerticalAngleToTargetWithin(g_Vars.chrdata, cmd[2]);
}
} else {
pass = g_Vars.chrdata->yvisang && func0f048f20(g_Vars.chrdata, g_Vars.chrdata->yvisang) == 0;
pass = g_Vars.chrdata->yvisang && chrIsVerticalAngleToTargetWithin(g_Vars.chrdata, g_Vars.chrdata->yvisang) == 0;
}
if (pass) {
@ -6790,7 +6790,7 @@ bool aiDetectEnemy(void)
s16 prevtarget = g_Vars.chrdata->target;
g_Vars.chrdata->target = propGetIndexByChrId(g_Vars.chrdata, chr->chrnum);
if (func0f048f20(g_Vars.chrdata, g_Vars.chrdata->yvisang)) {
if (chrIsVerticalAngleToTargetWithin(g_Vars.chrdata, g_Vars.chrdata->yvisang)) {
closestdist = distance;
closesttarg = chr->chrnum;
}
@ -8192,8 +8192,12 @@ bool aiSetTeamOrders(void)
s32 num;
u32 stack;
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
// Get list of chrs in the current chr's squadron
chrnums = squadronGetChrIds(g_Vars.chrdata->squadron);
// Iterate chrs in squadron and build list of their actions.
// Put the current chr's action first.
chraction = chractions;
chraction->chrnum = g_Vars.chrdata->chrnum;
chraction->myaction = g_Vars.chrdata->myaction;
@ -8227,6 +8231,8 @@ bool aiSetTeamOrders(void)
chraction->myaction = MA_END;
// Iterate the list of chrs and decide how to reassign orders to them
// based on the current chr's action
if (chrcount != 1) {
chraction = &chractions[1];
num = 1;
@ -8236,25 +8242,25 @@ bool aiSetTeamOrders(void)
switch (chractions[0].myaction) {
case MA_COVERGOTO:
if (func0f048e74(chr, 45) == 0) {
if (!chrIsInTargetsFovX(chr, 45)) {
chr->orders = MA_SHOOTING;
}
break;
case MA_COVERBREAK:
if (func0f048e74(chr, 30) == 0) {
if (!chrIsInTargetsFovX(chr, 30)) {
chr->orders = MA_SHOOTING;
}
num++;
break;
case MA_COVERSEEN:
if (func0f048e74(chr, 30) == 0) {
if (!chrIsInTargetsFovX(chr, 30)) {
chr->orders = MA_SHOOTING;
g_Vars.chrdata->orders = MA_COVERGOTO;
}
num++;
break;
case MA_FLANKLEFT:
if (func0f048e74(chr, 50)) {
if (chrIsInTargetsFovX(chr, 50)) {
chr->orders = MA_FLANKRIGHT;
} else {
chr->orders = MA_SHOOTING;
@ -8263,7 +8269,7 @@ bool aiSetTeamOrders(void)
g_Vars.chrdata->orders = MA_FLANKLEFT;
break;
case MA_FLANKRIGHT:
if (func0f048e74(chr, 50)) {
if (chrIsInTargetsFovX(chr, 50)) {
chr->orders = MA_FLANKLEFT;
} else {
chr->orders = MA_SHOOTING;
@ -8272,7 +8278,7 @@ bool aiSetTeamOrders(void)
g_Vars.chrdata->orders = MA_FLANKRIGHT;
break;
case MA_DODGE:
if (func0f048e74(chr, 30) == 0 &&
if (!chrIsInTargetsFovX(chr, 30) &&
chrHasFlagById(chr, CHR_SELF, CHRFLAG0_CAN_BACKOFF, BANK_0)) {
chr->orders = MA_WITHDRAW;
} else {
@ -8289,7 +8295,7 @@ bool aiSetTeamOrders(void)
num++;
break;
case MA_WAITSEEN:
if (func0f048e74(chr, 30) &&
if (chrIsInTargetsFovX(chr, 30) &&
chrHasFlagById(chr, CHR_SELF, CHRFLAG0_CAN_BACKOFF, BANK_0)) {
chr->orders = MA_WITHDRAW;
} else {

View File

@ -161,7 +161,7 @@ u8 func0006_unalerted[] = {
// Warned
label(0x13)
dprint 'A','1','\n',0,
if_player_looking_at_something_maybe(0x00, 0x00, 0x01, /*goto*/ 0x16)
if_target_outside_my_yvisang(/*goto*/ 0x16)
if_target_in_sight(/*goto*/ LABEL_SEE_DETECT)
label(0x16)
dprint 'B','4',' ','A','I','V','S','A','I','\n',0,
@ -344,7 +344,7 @@ u8 func0006_unalerted[] = {
label(0xe9)
label(0x13)
if_player_looking_at_something_maybe(0x0a, 0x01, 0x00, /*goto*/ 0x13)
if_within_targets_fovx_by_angle(10, /*goto*/ 0x13)
goto_next(0x15)
label(0x13)
@ -542,7 +542,7 @@ u8 func0006_unalerted[] = {
if_saw_injury(0x00, /*goto*/ 0x16)
chr_toggle_p1p2(CHR_SELF)
set_target_chr(CHR_P1P2)
if_player_looking_at_something_maybe(0x00, 0x00, 0x01, /*goto*/ 0x13)
if_target_outside_my_yvisang(/*goto*/ 0x13)
if_target_in_sight(/*goto*/ 0x16)
label(0x13)
if_distance_to_chr_lt(150, CHR_SEEDIE, /*goto*/ 0x7f)
@ -565,7 +565,7 @@ u8 func0006_unalerted[] = {
chr_toggle_p1p2(CHR_SELF)
set_target_chr(CHR_P1P2)
if_hears_target(/*goto*/ 0x16)
if_player_looking_at_something_maybe(0x00, 0x00, 0x01, /*goto*/ 0x13)
if_target_outside_my_yvisang(/*goto*/ 0x13)
if_target_in_sight(/*goto*/ 0x17)
label(0x13)
if_self_flag_bankx_eq(CHRFLAG0_CAN_EXAMINE_BODY, FALSE, BANK_0, /*goto*/ 0x13)
@ -1417,7 +1417,7 @@ u8 func0007_alerted[] = {
//
label(0x52)
dprint 'A','M','B','U','S','H',' ','F','A','I','L','E','D','3','\n',0,
if_player_looking_at_something_maybe(0x3c, 0x01, 0x00, /*goto*/ 0x16)
if_within_targets_fovx_by_angle(60, /*goto*/ 0x16)
goto_next(0x68)
label(0x16)
@ -1429,7 +1429,7 @@ u8 func0007_alerted[] = {
if_self_flag_bankx_eq(CHRFLAG0_00000080, TRUE, BANK_0, /*goto*/ 0x13)
call_rng
if_rand_gt(100, /*goto*/ 0x13)
if_player_looking_at_something_maybe(0x1e, 0x01, 0x00, /*goto*/ 0x16)
if_within_targets_fovx_by_angle(30, /*goto*/ 0x16)
label(0x13)
if_nearly_in_targets_sight(30, /*goto*/ 0x5f)
label(0x16)
@ -1554,7 +1554,7 @@ u8 func0007_alerted[] = {
label(0x69)
if_distance_to_target_gt(4000, /*goto*/ 0x16)
label(0x6a)
if_player_looking_at_something_maybe(0x11, 0x01, 0x00, /*goto*/ 0x63)
if_within_targets_fovx_by_angle(17, /*goto*/ 0x63)
label(0x16)
label(0x64)
set_action(MA_COVERBREAK, FALSE)
@ -1583,7 +1583,7 @@ u8 func0007_alerted[] = {
label(0x63)
if_self_flag_bankx_eq(CHRFLAG0_00008000, FALSE, BANK_0, /*goto*/ 0x13)
if_player_looking_at_something_maybe(0x11, 0x01, 0x00, /*goto*/ 0x16)
if_within_targets_fovx_by_angle(17, /*goto*/ 0x16)
goto_first(0x64)
label(0x13)
@ -1730,7 +1730,7 @@ u8 func0007_alerted[] = {
label(0x4d)
if_self_flag_bankx_eq(CHRFLAG1_00040000, TRUE, BANK_1, /*goto*/ 0x32)
call_rng
if_player_looking_at_something_maybe(0x1e, 0x01, 0x00, /*goto*/ 0x16)
if_within_targets_fovx_by_angle(30, /*goto*/ 0x16)
goto_next(0x32)
label(0x16)
@ -1795,7 +1795,7 @@ u8 func0007_alerted[] = {
if_self_flag_bankx_eq(CHRFLAG1_00020000, TRUE, BANK_1, /*goto*/ 0x2f)
label(0x32)
if_player_looking_at_something_maybe(0x14, 0x01, 0x00, /*goto*/ 0x16)
if_within_targets_fovx_by_angle(20, /*goto*/ 0x16)
goto_next(0x2f)
label(0x16)
@ -1822,7 +1822,7 @@ u8 func0007_alerted[] = {
goto_next(LABEL_TRACK)
label(0x51)
if_player_looking_at_something_maybe(0x15, 0x01, 0x00, /*goto*/ 0x16)
if_within_targets_fovx_by_angle(21, /*goto*/ 0x16)
goto_next(LABEL_TRACK)
//
@ -1930,7 +1930,7 @@ u8 func0007_alerted[] = {
if_timer_gt(600, /*goto*/ 0x3d)
if_timer_gt(60, /*goto*/ 0x16)
label(0x16)
if_player_looking_at_something_maybe(0x15, 0x01, 0x00, /*goto*/ 0x16)
if_within_targets_fovx_by_angle(21, /*goto*/ 0x16)
goto_next(LABEL_TRACK)
label(0x16)
if_distance_to_target_gt(2000, /*goto*/ 0x41)
@ -2061,7 +2061,7 @@ u8 func0007_alerted[] = {
label(0x13)
label(0x8b)
dprint 'B','A','C','K','O','F','F','\n',0,
if_player_looking_at_something_maybe(0x14, 0x01, 0x00, /*goto*/ 0x13)
if_within_targets_fovx_by_angle(20, /*goto*/ 0x13)
goto_next(0x50)
label(0x13)
@ -2181,7 +2181,7 @@ u8 func0007_alerted[] = {
if_distance_to_target_gt(1300, /*goto*/ 0x13)
if_self_flag_bankx_eq(CHRFLAG1_01000000, TRUE, BANK_1, /*goto*/ 0x16)
if_self_flag_bankx_eq(CHRFLAG1_02000000, FALSE, BANK_1, /*goto*/ 0x16)
if_player_looking_at_something_maybe(0x15, 0x01, 0x00, /*goto*/ 0x3b)
if_within_targets_fovx_by_angle(21, /*goto*/ 0x3b)
goto_next(0x16)
label(0xc8)
@ -2218,13 +2218,13 @@ u8 func0007_alerted[] = {
label(0x39)
if_self_flag_bankx_eq(CHRFLAG1_01000000, TRUE, BANK_1, /*goto*/ 0x3c)
if_player_looking_at_something_maybe(0x15, 0x01, 0x00, /*goto*/ 0x3b)
if_within_targets_fovx_by_angle(21, /*goto*/ 0x3b)
if_distance_to_target_lt(1300, /*goto*/ 0x3b)
goto_next(0x17)
label(0x3a)
if_self_flag_bankx_eq(CHRFLAG1_01000000, TRUE, BANK_1, /*goto*/ 0x3c)
if_player_looking_at_something_maybe(0x15, 0x01, 0x00, /*goto*/ 0x3b)
if_within_targets_fovx_by_angle(21, /*goto*/ 0x3b)
goto_next(0x3c)
label(0x3c)
@ -4156,7 +4156,7 @@ u8 func001b_observe_camspy[] = {
if_distance_to_target_lt(300, /*goto*/ 0x13)
chr_toggle_p1p2(CHR_SELF)
set_target_chr(CHR_P1P2)
if_player_looking_at_something_maybe(0x00, 0x00, 0x01, /*goto*/ 0x16)
if_target_outside_my_yvisang(/*goto*/ 0x16)
if_target_in_sight(/*goto*/ 0x0b)
label(0x16)
set_target_chr(CHR_PRESET)
@ -4176,7 +4176,7 @@ u8 func001b_observe_camspy[] = {
if_distance_to_target_gt(400, /*goto*/ 0x13)
chr_toggle_p1p2(CHR_SELF)
set_target_chr(CHR_P1P2)
if_player_looking_at_something_maybe(0x00, 0x00, 0x01, /*goto*/ 0x16)
if_target_outside_my_yvisang(/*goto*/ 0x16)
if_target_in_sight(/*goto*/ 0x0b)
label(0x16)
set_target_chr(CHR_PRESET)
@ -4198,7 +4198,7 @@ u8 func001b_observe_camspy[] = {
label(0x13)
chr_toggle_p1p2(CHR_SELF)
set_target_chr(CHR_P1P2)
if_player_looking_at_something_maybe(0x00, 0x00, 0x01, /*goto*/ 0x16)
if_target_outside_my_yvisang(/*goto*/ 0x16)
if_target_in_sight(/*goto*/ 0x0b)
label(0x16)
set_target_chr(CHR_PRESET)
@ -4322,7 +4322,7 @@ u8 func001d_search_for_player[] = {
label(0x13)
chr_toggle_p1p2(CHR_SELF)
set_target_chr(CHR_P1P2)
if_player_looking_at_something_maybe(0x00, 0x00, 0x01, /*goto*/ 0x15)
if_target_outside_my_yvisang(/*goto*/ 0x15)
if_target_in_sight(/*goto*/ 0x12)
label(0x15)
if_timer_gt(30, /*goto*/ 0x05)
@ -4402,7 +4402,7 @@ u8 func001d_search_for_player[] = {
if_distance_to_target_gt(500, /*goto*/ 0x15)
label(0x13)
dprint 'C','H','E','K',' ','V','I','S','\n',0,
if_player_looking_at_something_maybe(0x00, 0x00, 0x01, /*goto*/ 0x15)
if_target_outside_my_yvisang(/*goto*/ 0x15)
if_target_in_sight(/*goto*/ 0x12)
label(0x15)
if_saw_death(0x00, /*goto*/ 0x28)
@ -4480,7 +4480,7 @@ u8 func001f_related_to_spawning[] = {
label(0x16)
if_saw_death(0x01, /*goto*/ 0x1e)
if_saw_injury(0x01, /*goto*/ 0x1e)
if_player_looking_at_something_maybe(0x00, 0x00, 0x01, /*goto*/ 0x16)
if_target_outside_my_yvisang(/*goto*/ 0x16)
if_target_in_sight(/*goto*/ 0x1e)
label(0x16)
if_self_flag_bankx_eq(CHRFLAG0_AIVSAI, FALSE, BANK_0, /*goto*/ 0x16)

View File

@ -708,14 +708,34 @@
angle, \
label,
// Either bool1 or bool2 are set - never none or both
// When bool1 is set, u1 is populated
// When bool2 is set, u1 is 0 (likely unused)
#define if_player_looking_at_something_maybe(u1, bool1, bool2, label) \
/**
* Check if the current chr is in their target's field of view (FOV).
*
* Depending on the arguments given, the check is either on the X axis or the Y
* axis. If the X axis is being used then the turn direction that the target is
* facing is relevant. If the Y axis is being used then the pitch that the
* target is ignored and the check is purely positional.
*
* if op2 is TRUE, the command checks if the chr is *outside* of their target's
* FOV Y and is based on the chr's yvisang property. The given angle is ignored.
*
* if op2 is FALSE, then op1 is checked:
*
* if op1 is TRUE, the command checks if the chr is within their target's FOV X
* by the given angle (ie. their target is looking at them).
*
* if op1 is FALSE, the command checks if the chr is within their target's FOV Y.
*
* Consider using the following macros for this command instead:
* if_within_targets_fovx_by_angle
* if_y_angle_to_target_lt
* if_target_outside_my_yvisang
*/
#define if_fov_check_with_target(angle, op1, op2, label) \
mkshort(0x004e), \
u1, \
bool1, \
bool2, \
angle, \
op1, \
op2, \
label,
/**
@ -4180,15 +4200,34 @@
mkshort(0x01e0),
// Convenience macros for readability
#define beginloop(id) label(id) yield
#define beginloop(id) \
label(id) \
yield
#define endloop(id) goto_first(id)
#define endloop(id) \
goto_first(id)
#define reloop(id) goto_first(id)
#define reloop(id) \
goto_first(id)
#define remove_hudmsgs show_hudmsg_middle(0x02, 0, 0x0002)
#define remove_hudmsgs \
show_hudmsg_middle(0x02, 0, 0x0002)
#define if_stage_is_not(stage, label) if_stage_lt(stage, label) if_stage_gt(stage, label)
#define if_stage_is_not(stage, label) \
if_stage_lt(stage, label) \
if_stage_gt(stage, label)
#define go_to_gun(label) do_gun_command(0, label)
#define if_gun_landed(label) do_gun_command(1, label)
#define go_to_gun(label) \
do_gun_command(0, label)
#define if_gun_landed(label) \
do_gun_command(1, label)
#define if_within_targets_fovx_by_angle(angle, label) \
if_fov_check_with_target(angle, TRUE, FALSE, label)
#define if_y_angle_to_target_lt(angle, label) \
if_fov_check_with_target(angle, FALSE, FALSE, label)
#define if_target_outside_my_yvisang(label) \
if_fov_check_with_target(0, FALSE, TRUE, label)

View File

@ -173,8 +173,8 @@ f32 chrGetAngleToPos(struct chrdata *chr, struct coord *pos);
u32 func0f048b78(void);
f32 chrGetAngleFromTargetsFov(struct chrdata *chr);
f32 chrGetVerticalAngleToTarget(struct chrdata *chr);
bool func0f048e74(struct chrdata *chr, u8 arg1);
bool func0f048f20(struct chrdata *chr, u8 arg1);
bool chrIsInTargetsFovX(struct chrdata *chr, u8 fov360);
bool chrIsVerticalAngleToTargetWithin(struct chrdata *chr, u8 arg1);
f32 func0f048fcc(struct chrdata *chr, u8 arg1);
bool chrIsTargetInFov(struct chrdata *chr, u8 arg1, u8 arg2);
bool func0f04911c(struct chrdata *chr, struct coord *pos, u8 arg2);

View File

@ -81,7 +81,7 @@
/*0x004b*/ bool aiIfNearMiss(void);
/*0x004c*/ bool aiIfSeesSuspiciousItem(void);
/*0x004d*/ bool aiIfTargetInFovLeft(void);
/*0x004e*/ bool ai004e(void);
/*0x004e*/ bool aiIfCheckFovWithTarget(void);
/*0x004f*/ bool aiIfTargetOutOfFovLeft(void);
/*0x0050*/ bool aiIfTargetInFov(void);
/*0x0051*/ bool aiIfTargetOutOfFov(void);