5504 lines
148 KiB
C
5504 lines
148 KiB
C
#include <ultra64.h>
|
|
#include "game/chr/chraicommands.h"
|
|
#include "game/game_000000.h"
|
|
#include "game/prop.h"
|
|
#include "stagesetup.h"
|
|
#include "data.h"
|
|
#include "types.h"
|
|
|
|
u8 func0000_idle[] = {
|
|
dprint 'd','y','e','n','g',0,
|
|
beginloop(0x0d)
|
|
endloop(0x0d)
|
|
|
|
endlist
|
|
};
|
|
|
|
u8 func0005_end_cinema[] = {
|
|
enter_firstperson
|
|
set_ailist(CHR_SELF, GAILIST_IDLE)
|
|
endlist
|
|
};
|
|
|
|
u8 func0001_unalerted_0001[] = {
|
|
set_ailist(CHR_SELF, GAILIST_UNALERTED)
|
|
endlist
|
|
};
|
|
|
|
// Never used
|
|
u8 func0003_stop_unalerted[] = {
|
|
stop_chr
|
|
set_ailist(CHR_SELF, GAILIST_UNALERTED)
|
|
endlist
|
|
};
|
|
|
|
u8 func0002_unalerted_0002[] = {
|
|
set_ailist(CHR_SELF, GAILIST_UNALERTED)
|
|
endlist
|
|
};
|
|
|
|
u8 func0004_unalerted_0004[] = {
|
|
set_ailist(CHR_SELF, GAILIST_UNALERTED_0002)
|
|
endlist
|
|
};
|
|
|
|
u8 func0006_unalerted[] = {
|
|
#define LABEL_AIVSAIFAIL 0x16
|
|
#define LABEL_DISGUISE_UNCOVERED 0x16
|
|
#define LABEL_SCAN_START 0x1a
|
|
#define LABEL_SEE_DETECT 0x1e
|
|
#define LABEL_HEAR_DETECT 0x1f
|
|
#define LABEL_NEAR_MISS 0x20
|
|
#define LABEL_SEEFRIENDDIE 0x21
|
|
#define LABEL_HEARD_ALARM 0x23
|
|
#define LABEL_HEARSPAWN 0xda
|
|
|
|
if_chr_has_hiddenflag(CHR_SELF, CHRHFLAG_PSYCHOSISED, /*goto*/ 0x13)
|
|
goto_next(0x16)
|
|
|
|
label(0x13)
|
|
set_returnlist(CHR_SELF, GAILIST_INIT_PSYCHOSIS)
|
|
set_ailist(CHR_SELF, GAILIST_INIT_PSYCHOSIS)
|
|
|
|
label(0x16)
|
|
set_target_chr(CHR_P1P2)
|
|
set_shotlist(GAILIST_UNALERTED)
|
|
if_chr_dead(CHR_SELF, /*goto*/ 0x15)
|
|
if_chr_death_animation_finished(CHR_SELF, /*goto*/ 0x15)
|
|
if_chr_knockedout(CHR_SELF, /*goto*/ 0x15)
|
|
if_just_injured(CHR_SELF, /*goto*/ 0x16)
|
|
if_has_gun(CHR_SELF, /*goto*/ 0x13)
|
|
dprint 'N','O','G','U','N','\n',0,
|
|
goto_next(0x16)
|
|
|
|
label(0x13)
|
|
goto_next(LABEL_SCAN_START)
|
|
|
|
// Dying
|
|
label(0x15)
|
|
dprint 'D','I','E',' ','I','N','S','C','A','N','\n',0,
|
|
set_shotlist(GAILIST_IDLE)
|
|
set_ailist(CHR_SELF, GAILIST_IDLE)
|
|
|
|
// Injured or has no gun
|
|
label(0x16)
|
|
say_quip(CHR_BOND, QUIP_SHOTUNALERT, 0x78, 0x03, 0x00, BANK_0, 0x00, 0x00)
|
|
dprint 'N','O','G','U','N',',','\n',0,
|
|
if_self_flag_bankx_eq(CHRFLAG1_DOINGIDLEANIMATION, FALSE, BANK_1, /*goto*/ 0x06)
|
|
unset_self_flag_bankx(CHRFLAG1_DOINGIDLEANIMATION, BANK_1)
|
|
if_chr_idle_action_eq(IDLEACTION_SITTING_TYPING, /*goto*/ 0x05)
|
|
if_chr_idle_action_eq(IDLEACTION_SITTING_DORMANT, /*goto*/ 0x05)
|
|
goto_next(0x06)
|
|
|
|
// Stand up from sitting
|
|
label(0x05)
|
|
dprint 'N','O','G','U','N','2','\n',0,
|
|
dprint 'A','N','I','M',' ','O','B','J','E','C','T',' ','N','O','W','\n',0,
|
|
set_chr_maxdamage(CHR_SELF, 40)
|
|
object_do_animation(0x025a, 0xff, 0x02, 0xffff)
|
|
chr_do_animation(ANIM_STAND_UP_FROM_SITTING, 0, -1, 0x02, 0x10, CHR_SELF, 2)
|
|
unset_self_flag_bankx(CHRFLAG1_DOINGIDLEANIMATION, BANK_1)
|
|
set_chr_special_death_animation(CHR_SELF, SPECIALDIE_NONE)
|
|
dprint 'B','4',' ','W','A','T','\n',0,
|
|
goto_next(0x0c)
|
|
|
|
label(0x06)
|
|
dprint 'B','E','E','N',' ','S','H','O','T','\n',0,
|
|
// if 01000000, set 04000000
|
|
if_chr_has_hiddenflag(CHR_TARGET, CHRHFLAG_01000000, /*goto*/ 0x14)
|
|
goto_next(0x13)
|
|
|
|
label(0x14)
|
|
set_chr_hiddenflag(CHR_TARGET, CHRHFLAG_04000000)
|
|
|
|
// Stop chr, either immediately or by waiting for their animation to end.
|
|
// I think the animation is their injured animation.
|
|
label(0x13)
|
|
set_chr_hiddenflag(CHR_TARGET, CHRHFLAG_02000000)
|
|
if_chr_idle(/*goto*/ 0x13)
|
|
goto_next(0x03)
|
|
|
|
label(0x13)
|
|
stop_chr
|
|
goto_next(0x16)
|
|
|
|
beginloop(0x03)
|
|
if_chr_stopped(/*goto*/ 0x16)
|
|
endloop(0x03)
|
|
|
|
// If warned already, go straight to scan
|
|
label(0x16)
|
|
if_self_flag_bankx_eq(CHRFLAG1_WARNED, TRUE, BANK_1, /*goto*/ LABEL_SCAN_START)
|
|
|
|
say_quip(CHR_BOND, QUIP_SHOTUNALERT, 0xff, 0x03, 0x00, BANK_0, 0x00, 0x00)
|
|
dprint 'N','O',' ','W','A','R','N','I','N','G','\n',0,
|
|
if_self_flag_bankx_eq(CHRFLAG0_CANT_ALERT_GROUP, TRUE, BANK_0, /*goto*/ 0x13)
|
|
increase_squadron_alertness(100)
|
|
label(0x13)
|
|
dprint 'N','O',' ','W','A','R','N','I','N','G','\n',0,
|
|
set_ailist(CHR_SELF, GAILIST_WAKEUP)
|
|
dprint 'S','1',0,
|
|
|
|
// Armed
|
|
label(LABEL_SCAN_START)
|
|
dprint 'S','C','A','N',' ','S','T','A','R','T','\n',0,
|
|
set_action(MA_NORMAL, TRUE)
|
|
yield
|
|
dprint 'S','2',0,
|
|
chr_toggle_p1p2(CHR_SELF)
|
|
set_target_chr(CHR_P1P2)
|
|
label(0x13)
|
|
if_alertness(100, OPERATOR_LESS_THAN, /*goto*/ 0x16)
|
|
dprint 'A','L','E','R','T',' ','F','A','I','\n',0,
|
|
goto_next(0x78)
|
|
|
|
// Not alert
|
|
label(0x16)
|
|
if_self_flag_bankx_eq(CHRFLAG1_WARNED, TRUE, BANK_1, /*goto*/ 0x13)
|
|
if_saw_death(0x01, /*goto*/ LABEL_SEEFRIENDDIE)
|
|
if_saw_injury(0x01, /*goto*/ LABEL_NEAR_MISS)
|
|
|
|
// Warned
|
|
label(0x13)
|
|
dprint 'A','1','\n',0,
|
|
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,
|
|
if_self_flag_bankx_eq(CHRFLAG0_AIVSAI, FALSE, BANK_0, /*goto*/ LABEL_AIVSAIFAIL)
|
|
dprint 'A','I','V','S','A','I','S','E','T','\n',0,
|
|
if_enemy_distance_lt_and_los(2540, /*goto*/ 0x13)
|
|
dprint 'A','I','V','S','A','I','F','A','I','L','\n',0,
|
|
goto_next(LABEL_AIVSAIFAIL)
|
|
|
|
label(0x13)
|
|
dprint 'A','I','V','S','A','I','P','A','S','S','\n',0,
|
|
if_target_is_player(/*goto*/ LABEL_AIVSAIFAIL)
|
|
goto_next(0x12)
|
|
|
|
// Check see and hear
|
|
label(LABEL_AIVSAIFAIL)
|
|
dprint 'S','4',0,
|
|
if_near_miss(/*goto*/ LABEL_SEE_DETECT)
|
|
if_num_times_shot_gt(0, /*goto*/ LABEL_SEE_DETECT)
|
|
dprint 'B','4','N','O','H','E','A','R','\n',0,
|
|
if_self_flag_bankx_eq(CHRFLAG0_NOHEAR, FALSE, BANK_0, /*goto*/ 0x16)
|
|
if_can_see_target(/*goto*/ 0x16)
|
|
goto_next(0x13)
|
|
|
|
label(0x16)
|
|
dprint 'C','H','E','K','H','E','A','R','\n',0,
|
|
if_heard_target_recently(/*goto*/ LABEL_HEAR_DETECT)
|
|
label(0x13)
|
|
dprint 'N','O','T','H','E','A','R','D','\n',0,
|
|
|
|
// Check alarm
|
|
label(0x13)
|
|
dprint 'N','2','\n',0,
|
|
if_self_flag_bankx_eq(CHRFLAG0_CAN_HEAR_ALARMS, FALSE, BANK_0, /*goto*/ 0x16)
|
|
dprint 'N','3','\n',0,
|
|
if_alarm_active(/*goto*/ LABEL_HEARD_ALARM)
|
|
label(0x16)
|
|
dprint 'N','1','\n',0,
|
|
if_alarm_active(/*goto*/ 0x13)
|
|
goto_next(0x16)
|
|
|
|
// Can hear alarm
|
|
label(0x13)
|
|
dprint 'A','L',' ','O','N','A','R','D','\n',0,
|
|
if_stage_is_not(STAGE_PELAGIC, /*goto*/ 0x16)
|
|
if_bitcheck_in_prop_struct(/*goto*/ LABEL_HEARD_ALARM)
|
|
|
|
// Check if can see camspy
|
|
label(0x16)
|
|
set_target_to_camspy_if_in_sight(/*goto*/ 0x16)
|
|
dprint 'E','S',' ','N','O','V','I','S','\n',0,
|
|
goto_next(0x13)
|
|
|
|
// Can see camspy
|
|
label(0x16)
|
|
dprint 'S','E','E','E','Y','E','S','P','Y','\n',0,
|
|
if_path_started(/*goto*/ 0x15)
|
|
set_returnlist(CHR_SELF, GAILIST_UNALERTED)
|
|
set_ailist(CHR_SELF, GAILIST_OBSERVE_CAMSPY)
|
|
|
|
// Patroller seeing camspy
|
|
label(0x15)
|
|
set_returnlist(CHR_SELF, GAILIST_DISGUISE_DETECTION)
|
|
set_ailist(CHR_SELF, GAILIST_OBSERVE_CAMSPY)
|
|
|
|
// Can't see camspy
|
|
label(0x13)
|
|
if_self_flag_bankx_eq(CHRFLAG1_00080000, TRUE, BANK_1, /*goto*/ 0x16)
|
|
if_self_flag_bankx_eq(CHRFLAG1_DOINGIDLEANIMATION, TRUE, BANK_1, /*goto*/ 0x13)
|
|
if_self_flag_bankx_eq(CHRFLAG1_DISSPEE, FALSE, BANK_1, /*goto*/ 0x15)
|
|
dprint 'C','H','E','C','K',' ','S','O','U','F','I','\n',0, // checks outfit?
|
|
if_chr_propsoundcount_zero(CHR_SELF, /*goto*/ 0x28)
|
|
if_timer_gt(60, /*goto*/ 0x28)
|
|
goto_next(0x15)
|
|
|
|
// chr field 0x332 was zero
|
|
label(0x28)
|
|
unset_self_flag_bankx(CHRFLAG1_DISSPEE, BANK_1)
|
|
stop_chr
|
|
|
|
// Disspee is false, or timer not at 1 second yet
|
|
label(0x15)
|
|
if_chr_idle(/*goto*/ 0x16)
|
|
call_rng
|
|
if_rand_gt(1, /*goto*/ 0x16)
|
|
call_rng
|
|
if_rand_gt(20, /*goto*/ 0x16)
|
|
if_path_started(/*goto*/ 0x15)
|
|
set_returnlist(CHR_SELF, GAILIST_UNALERTED)
|
|
set_ailist(CHR_SELF, GAILIST_DO_BORED_ANIMATION)
|
|
|
|
label(0x15)
|
|
set_returnlist(CHR_SELF, GAILIST_DISGUISE_DETECTION)
|
|
set_ailist(CHR_SELF, GAILIST_DO_BORED_ANIMATION)
|
|
|
|
// Consider looking around
|
|
label(0x16)
|
|
if_self_flag_bankx_eq(CHRFLAG1_CAN_LOOK_AROUND, FALSE, BANK_1, /*goto*/ 0x16)
|
|
call_rng
|
|
if_rand_gt(10, /*goto*/ 0x16)
|
|
call_rng
|
|
if_rand_gt(20, /*goto*/ 0x16)
|
|
if_path_started(/*goto*/ 0x15)
|
|
set_returnlist(CHR_SELF, GAILIST_UNALERTED)
|
|
set_ailist(CHR_SELF, GAILIST_LOOK_AROUND)
|
|
|
|
label(0x15)
|
|
set_returnlist(CHR_SELF, GAILIST_DISGUISE_DETECTION)
|
|
set_ailist(CHR_SELF, GAILIST_LOOK_AROUND)
|
|
|
|
label(0x16)
|
|
goto_first(LABEL_SCAN_START)
|
|
|
|
// Idle animations
|
|
label(0x13)
|
|
dprint 'N','A','T',' ','A','N','I','M','S','\n',0,
|
|
if_chr_idle(/*goto*/ 0x16)
|
|
set_returnlist(CHR_SELF, GAILIST_UNALERTED)
|
|
set_ailist(CHR_SELF, GAILIST_BUSY)
|
|
|
|
label(0x16)
|
|
dprint 'I','N',' ','A','N','I','M','S','\n',0,
|
|
goto_first(LABEL_SCAN_START)
|
|
|
|
// Handle seeing player
|
|
label(LABEL_SEE_DETECT)
|
|
dprint 'S','E','E',' ','D','E','T','E','C','T','\n',0,
|
|
if_chr_has_hiddenflag(CHR_TARGET, CHRHFLAG_DISGUISE_UNCOVERED, /*goto*/ LABEL_DISGUISE_UNCOVERED)
|
|
label(0x13)
|
|
if_chr_has_hiddenflag(CHR_TARGET, CHRHFLAG_02000000, /*goto*/ 0x14)
|
|
goto_next(0x13)
|
|
|
|
label(0x14)
|
|
if_chr_weapon_equipped(CHR_TARGET, WEAPON_NONE, /*goto*/ 0x15)
|
|
if_chr_weapon_equipped(CHR_TARGET, WEAPON_UNARMED, /*goto*/ 0x15)
|
|
if_chr_weapon_equipped(CHR_TARGET, WEAPON_COMBATBOOST, /*goto*/ 0x15)
|
|
if_chr_weapon_equipped(CHR_TARGET, WEAPON_HORIZONSCANNER, /*goto*/ 0x15)
|
|
if_chr_weapon_equipped(CHR_TARGET, WEAPON_SUITCASE, /*goto*/ 0x15)
|
|
if_chr_in_view(/*goto*/ LABEL_DISGUISE_UNCOVERED)
|
|
if_chr_has_hiddenflag(CHR_TARGET, CHRHFLAG_04000000, /*goto*/ LABEL_DISGUISE_UNCOVERED)
|
|
|
|
label(0x15)
|
|
dprint 'N','O','T',' ','A','I','M','I','N','G',' ','A','T',' ','M','E','\n',0,
|
|
|
|
label(0x13)
|
|
if_chr_has_hiddenflag(CHR_TARGET, CHRHFLAG_DISGUISED, /*goto*/ 0x13)
|
|
goto_next(LABEL_DISGUISE_UNCOVERED)
|
|
|
|
label(0x13)
|
|
if_chr_weapon_equipped(CHR_TARGET, WEAPON_NONE, /*goto*/ 0x15)
|
|
if_chr_weapon_equipped(CHR_TARGET, WEAPON_UNARMED, /*goto*/ 0x15)
|
|
if_chr_weapon_equipped(CHR_TARGET, WEAPON_COMBATBOOST, /*goto*/ 0x15)
|
|
if_chr_weapon_equipped(CHR_TARGET, WEAPON_HORIZONSCANNER, /*goto*/ 0x15)
|
|
if_chr_weapon_equipped(CHR_TARGET, WEAPON_SUITCASE, /*goto*/ 0x15)
|
|
goto_next(0x14)
|
|
|
|
label(0x15)
|
|
if_chr_soundtimer(600, OPERATOR_GREATER_THAN, /*goto*/ 0x15)
|
|
goto_next(0xea)
|
|
|
|
label(0x14)
|
|
if_chr_has_hiddenflag(CHR_TARGET, CHRHFLAG_02000000, /*goto*/ 0xe8)
|
|
if_chr_has_hiddenflag(CHR_TARGET, CHRHFLAG_01000000, /*goto*/ 0xe8)
|
|
|
|
label(0xea)
|
|
if_chr_weapon_equipped(CHR_TARGET, WEAPON_NONE, /*goto*/ 0xe6)
|
|
if_chr_weapon_equipped(CHR_TARGET, WEAPON_UNARMED, /*goto*/ 0xe6)
|
|
if_chr_weapon_equipped(CHR_TARGET, WEAPON_COMBATBOOST, /*goto*/ 0xe6)
|
|
if_chr_weapon_equipped(CHR_TARGET, WEAPON_HORIZONSCANNER, /*goto*/ 0xe6)
|
|
if_chr_weapon_equipped(CHR_TARGET, WEAPON_SUITCASE, /*goto*/ 0xe6)
|
|
dprint 'T','A','L','K',' ','D','I','S','T',' ','G','U','N','\n',0,
|
|
if_distance_to_target_gt(900, /*goto*/ 0x15)
|
|
goto_next(0xe8)
|
|
|
|
label(0xe6)
|
|
if_distance_to_target_gt(450, /*goto*/ 0x15)
|
|
label(0xe8)
|
|
if_can_see_target(/*goto*/ 0xe9)
|
|
goto_next(LABEL_DISGUISE_UNCOVERED)
|
|
|
|
label(0xe9)
|
|
label(0x13)
|
|
if_within_targets_fovx_by_angle(10, /*goto*/ 0x13)
|
|
goto_next(0x15)
|
|
|
|
label(0x13)
|
|
if_path_started(/*goto*/ 0x14)
|
|
set_returnlist(CHR_SELF, GAILIST_UNALERTED)
|
|
set_ailist(CHR_SELF, GAILIST_CIVILIAN_SAY_COMMENT)
|
|
label(0x14)
|
|
set_returnlist(CHR_SELF, GAILIST_DISGUISE_DETECTION)
|
|
set_ailist(CHR_SELF, GAILIST_CIVILIAN_SAY_COMMENT)
|
|
label(0x15)
|
|
goto_first(LABEL_SCAN_START)
|
|
|
|
// Disguise broken
|
|
label(LABEL_DISGUISE_UNCOVERED)
|
|
dprint 'D','I','S','B','R','O','K','E','N','\n',0,
|
|
if_near_miss(/*goto*/ 0x16)
|
|
if_self_flag_bankx_eq(CHRFLAG0_UNSURPRISABLE, TRUE, BANK_0, /*goto*/ 0x94)
|
|
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_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)
|
|
increase_squadron_alertness(100)
|
|
goto_next(0x77)
|
|
|
|
label(0xdb) // jumped to from below
|
|
label(0x14)
|
|
say_quip(CHR_BOND, QUIP_UNCOVERDISGUISE1, 0xff, 0x03, 0xff, BANK_0, 0x00, 0x00)
|
|
increase_squadron_alertness(100)
|
|
goto_next(0x77)
|
|
|
|
// Unreachable?
|
|
label(0x16)
|
|
yield
|
|
yield
|
|
dprint 'S','3',0,
|
|
say_quip(CHR_BOND, QUIP_SHOTUNALERT, 0xff, 0x03, 0x00, BANK_0, 0x00, 0x00)
|
|
increase_squadron_alertness(100)
|
|
goto_next(0x77)
|
|
|
|
label(0x94)
|
|
label(0x16)
|
|
set_chr_hiddenflag(CHR_TARGET, CHRHFLAG_PSYCHOSISED)
|
|
dprint 'S','U','R','P','R','I','S','E','D','!','\n',0,
|
|
say_quip(CHR_BOND, QUIP_SURPRISED, 0xff, 0x03, 0xff, BANK_0, 0x00, 0x00)
|
|
restart_timer
|
|
if_self_flag_bankx_eq(CHRFLAG1_DOINGIDLEANIMATION, FALSE, BANK_1, /*goto*/ 0x16)
|
|
if_chr_idle_action_eq(IDLEACTION_SITTING_TYPING, /*goto*/ 0x13)
|
|
if_chr_idle_action_eq(IDLEACTION_SITTING_DORMANT, /*goto*/ 0x13)
|
|
goto_next(0x16)
|
|
|
|
label(0x13)
|
|
set_chr_maxdamage(CHR_SELF, 40)
|
|
goto_next(0x73)
|
|
|
|
label(0x16)
|
|
chr_do_animation(ANIM_SURPRISED_0202, 0, -1, 0x00, 0x10, CHR_SELF, 2)
|
|
|
|
beginloop(0x73)
|
|
dprint 'S','4',0,
|
|
if_timer_gt(60, /*goto*/ 0x77)
|
|
endloop(0x73)
|
|
|
|
label(0x77)
|
|
set_alertness(255)
|
|
if_self_flag_bankx_eq(CHRFLAG0_CANT_ALERT_GROUP, TRUE, BANK_0, /*goto*/ 0x13)
|
|
increase_squadron_alertness(100)
|
|
label(0x13)
|
|
set_ailist(CHR_SELF, GAILIST_WAKEUP)
|
|
|
|
//
|
|
// HEAR DETECT
|
|
//
|
|
label(LABEL_HEAR_DETECT)
|
|
yield
|
|
dprint 'S','7',0,
|
|
dprint 'H','E','A','R','D','E','T','E','C','T','\n',0,
|
|
say_quip(CHR_BOND, QUIP_HEARNOISE, 0xff, 0x03, 0xff, BANK_0, 0x00, 0x00)
|
|
if_self_flag_bankx_eq(CHRFLAG0_CAN_HEARSPAWN, TRUE, BANK_0, /*goto*/ LABEL_HEARSPAWN)
|
|
restart_timer
|
|
if_self_flag_bankx_eq(CHRFLAG1_DOINGIDLEANIMATION, TRUE, BANK_1, /*goto*/ 0x80)
|
|
chr_do_animation(ANIM_YAWN, 0, 193, 0x18, 0x10, CHR_SELF, 2)
|
|
|
|
beginloop(0x80)
|
|
dprint 'S','8',0,
|
|
if_timer_gt(60, /*goto*/ 0x81)
|
|
endloop(0x80)
|
|
|
|
label(0x81)
|
|
if_self_flag_bankx_eq(CHRFLAG0_00000004, TRUE, BANK_0, /*goto*/ 0x13)
|
|
if_self_flag_bankx_eq(CHRFLAG1_01000000, TRUE, BANK_1, /*goto*/ 0x13)
|
|
set_ailist(CHR_SELF, GAILIST_SEARCH_FOR_PLAYER)
|
|
|
|
label(0x13)
|
|
increase_squadron_alertness(100)
|
|
set_ailist(CHR_SELF, GAILIST_WAKEUP)
|
|
|
|
//
|
|
// HEAR SPAWN
|
|
//
|
|
label(LABEL_HEARSPAWN)
|
|
dprint 'H','E','A','R','S','P','A','W','N','\n',0,
|
|
if_never_been_onscreen(/*goto*/ 0x0e)
|
|
dprint 'N','E','V','E','R',' ','V','I','S','F','A','I','L','\n',0,
|
|
set_ailist(CHR_SELF, GAILIST_SEARCH_FOR_PLAYER)
|
|
|
|
label(0x0e)
|
|
if_never_been_onscreen(/*goto*/ 0x13)
|
|
set_ailist(CHR_SELF, GAILIST_SEARCH_FOR_PLAYER)
|
|
|
|
// Never been on screen
|
|
label(0x13)
|
|
if_self_flag_bankx_eq(CHRFLAG0_00100000, FALSE, BANK_0, /*goto*/ 0x13)
|
|
set_alertness(100)
|
|
label(0x13)
|
|
dprint 'C','H','E','C','K',' ','D','U','P','E','\n',0,
|
|
if_chr_death_animation_finished(CHR_CLONE, /*goto*/ 0x0e)
|
|
if_chr_knockedout(CHR_CLONE, /*goto*/ 0x0e)
|
|
set_ailist(CHR_SELF, GAILIST_UNALERTED_0001)
|
|
|
|
label(0x0e)
|
|
dprint 'C','R','E','A','T','E',' ','S','P','A','W','N','\n',0,
|
|
try_spawn_clone2(CHR_SELF, GAILIST_SEARCH_FOR_PLAYER, 0x00000000, /*goto*/ 0x13)
|
|
dprint 'C','R','E','A','T','E',' ','F','A','I','L','\n',0,
|
|
if_self_flag_bankx_eq(CHRFLAG0_00100000, TRUE, BANK_0, /*goto*/ 0x13)
|
|
set_ailist(CHR_SELF, GAILIST_SEARCH_FOR_PLAYER)
|
|
|
|
label(0x13)
|
|
set_ailist(CHR_SELF, GAILIST_UNALERTED_0001)
|
|
|
|
//
|
|
// NEAR MISS
|
|
//
|
|
label(LABEL_NEAR_MISS)
|
|
increase_self_alertness(100)
|
|
say_quip(CHR_BOND, QUIP_SHOTUNALERT, 0xff, 0x03, 0x00, BANK_0, 0x00, 0x00)
|
|
set_target_chr(CHR_BOND)
|
|
if_nearly_in_targets_sight(30, /*goto*/ 0x13)
|
|
goto_next(0x16)
|
|
|
|
label(0x13)
|
|
if_chr_has_hiddenflag(CHR_TARGET, CHRHFLAG_DISGUISED, /*goto*/ 0x13)
|
|
goto_next(0x16)
|
|
|
|
label(0x13)
|
|
set_chr_hiddenflag(CHR_TARGET, CHRHFLAG_02000000)
|
|
goto_next(0x94)
|
|
|
|
label(0x16)
|
|
if_chr_death_animation_finished(CHR_COOP, /*goto*/ 0x16)
|
|
set_target_chr(CHR_COOP)
|
|
if_nearly_in_targets_sight(30, /*goto*/ 0x13)
|
|
goto_next(0x16)
|
|
|
|
label(0x13)
|
|
if_chr_has_hiddenflag(CHR_TARGET, CHRHFLAG_DISGUISED, /*goto*/ 0x13)
|
|
goto_next(0x16)
|
|
|
|
label(0x13)
|
|
set_chr_hiddenflag(CHR_TARGET, CHRHFLAG_02000000)
|
|
goto_next(0x94)
|
|
|
|
label(0x16)
|
|
goto_next(0x94)
|
|
|
|
//
|
|
// SEE FRIEND DIE
|
|
//
|
|
label(LABEL_SEEFRIENDDIE)
|
|
dprint 'S','E','E','F','R','I','E','N','D','D','I','E','\n',0,
|
|
if_self_flag_bankx_eq(CHRFLAG0_UNSURPRISABLE, FALSE, BANK_0, /*goto*/ 0x17)
|
|
label(0x94)
|
|
label(0x16)
|
|
dprint 'S','U','R','P','R','I','S','E','D','!','\n',0,
|
|
say_quip(CHR_BOND, QUIP_SURPRISED, 0xff, 0x03, 0xff, BANK_0, 0x00, 0x00)
|
|
restart_timer
|
|
if_self_flag_bankx_eq(CHRFLAG1_DOINGIDLEANIMATION, TRUE, BANK_1, /*goto*/ 0x76)
|
|
chr_do_animation(ANIM_SURPRISED_0202, 0, -1, 0x00, 0x10, CHR_SELF, 2)
|
|
|
|
beginloop(0x76)
|
|
dprint 'S','6',0,
|
|
if_timer_gt(60, /*goto*/ 0x17)
|
|
endloop(0x76)
|
|
|
|
label(0x17)
|
|
if_self_flag_bankx_eq(CHRFLAG0_CAN_EXAMINE_BODY, FALSE, BANK_0, /*goto*/ 0x7d)
|
|
try_jog_to_chr(CHR_SEEDIE, /*goto*/ 0x7e)
|
|
dprint 'W','A','L','K','F','A','I','L','\n',0,
|
|
|
|
beginloop(0x7e)
|
|
dprint 'S','9',0,
|
|
dprint 'W','A','L','K','I','N','G','\n',0,
|
|
if_saw_injury(0x00, /*goto*/ 0x16)
|
|
chr_toggle_p1p2(CHR_SELF)
|
|
set_target_chr(CHR_P1P2)
|
|
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)
|
|
if_chr_stopped(/*goto*/ 0x7f)
|
|
endloop(0x7e)
|
|
|
|
label(0x16)
|
|
goto_first(LABEL_SEE_DETECT)
|
|
|
|
// At friend
|
|
label(0x7f)
|
|
restart_timer
|
|
kneel
|
|
|
|
beginloop(0x7c)
|
|
dprint 'T','1',0,
|
|
dprint 'E','X','A','M',' ','B','O','D','Y','\n',0,
|
|
if_saw_injury(0x00, /*goto*/ 0x16)
|
|
set_hear_distance(10000)
|
|
chr_toggle_p1p2(CHR_SELF)
|
|
set_target_chr(CHR_P1P2)
|
|
if_hears_target(/*goto*/ 0x16)
|
|
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)
|
|
if_timer_lt(120, /*goto*/ 0x13)
|
|
say_quip(CHR_BOND, QUIP_INSPECTBODY, 0xff, 0x03, 0xff, BANK_0, 0x00, 0x00)
|
|
unset_self_flag_bankx(CHRFLAG0_CAN_EXAMINE_BODY, BANK_0)
|
|
label(0x13)
|
|
if_timer_gt(600, /*goto*/ 0x7d)
|
|
endloop(0x7c)
|
|
|
|
// Heard gunfire
|
|
label(0x16)
|
|
set_alertness(100)
|
|
set_chr_hiddenflag(CHR_TARGET, CHRHFLAG_02000000)
|
|
goto_first(LABEL_SCAN_START)
|
|
|
|
// Saw player
|
|
label(0x17)
|
|
set_alertness(100)
|
|
set_chr_hiddenflag(CHR_TARGET, CHRHFLAG_02000000)
|
|
goto_first(LABEL_SCAN_START)
|
|
|
|
// Examination finished
|
|
label(0x7d)
|
|
dprint 'E','X','A','M',' ','B','O','D','Y','D','O','N','E','\n',0,
|
|
set_target_chr(CHR_BOND)
|
|
if_nearly_in_targets_sight(30, /*goto*/ 0x13)
|
|
goto_next(0x16)
|
|
|
|
label(0x13)
|
|
set_alertness(100)
|
|
set_chr_hiddenflag(CHR_TARGET, CHRHFLAG_02000000)
|
|
goto_first(0xdb)
|
|
|
|
// Can't see Jonna
|
|
label(0x16)
|
|
if_chr_death_animation_finished(CHR_COOP, /*goto*/ 0x16)
|
|
set_target_chr(CHR_COOP)
|
|
if_nearly_in_targets_sight(30, /*goto*/ 0x13)
|
|
goto_next(0x16)
|
|
|
|
label(0x13)
|
|
set_alertness(100)
|
|
set_chr_hiddenflag(CHR_TARGET, CHRHFLAG_02000000)
|
|
goto_first(0xdb)
|
|
|
|
label(0x16)
|
|
set_target_chr(CHR_P1P2)
|
|
if_self_flag_bankx_eq(CHRFLAG1_DOINGIDLEANIMATION, FALSE, BANK_1, /*goto*/ 0x13)
|
|
set_ailist(CHR_SELF, GAILIST_WAKEUP)
|
|
|
|
label(0x13)
|
|
set_ailist(CHR_SELF, GAILIST_SEARCH_FOR_PLAYER)
|
|
|
|
// Unreachable - nothing jumps here
|
|
label(0x22)
|
|
increase_self_alertness(100)
|
|
dprint 'S','E','E',' ','O','B','J','E','C','T','\n',0,
|
|
goto_next(0x16)
|
|
|
|
//
|
|
// HEARD ALARM
|
|
//
|
|
label(LABEL_HEARD_ALARM)
|
|
dprint 'H','E','A','R','D',' ','A','L','A','R','M','\n',0,
|
|
if_self_flag_bankx_eq(CHRFLAG1_00010000, FALSE, BANK_1, /*goto*/ 0x13)
|
|
set_self_flag_bankx(CHRFLAG0_00100000, BANK_0)
|
|
label(0x13)
|
|
if_self_flag_bankx_eq(CHRFLAG0_CAN_HEARSPAWN, TRUE, BANK_0, /*goto*/ LABEL_HEARSPAWN)
|
|
restart_timer
|
|
if_self_flag_bankx_eq(CHRFLAG1_DOINGIDLEANIMATION, TRUE, BANK_1, /*goto*/ 0x82)
|
|
chr_do_animation(ANIM_YAWN, 0, 193, 0x18, 0x10, CHR_SELF, 2)
|
|
|
|
beginloop(0x82)
|
|
dprint 'T','2',0,
|
|
if_timer_gt(60, /*goto*/ 0x81)
|
|
endloop(0x82)
|
|
|
|
label(0x81)
|
|
increase_squadron_alertness(100)
|
|
set_alertness(255)
|
|
set_ailist(CHR_SELF, GAILIST_WAKEUP)
|
|
|
|
//
|
|
// HEAR SPAWN 2
|
|
//
|
|
label(LABEL_HEARSPAWN)
|
|
yield
|
|
dprint 'H','E','A','R','S','P','A','W','N','\n',0,
|
|
if_never_been_onscreen(/*goto*/ 0x0e)
|
|
dprint 'N','E','V','E','R',' ','V','I','S','F','A','I','L','\n',0,
|
|
set_ailist(CHR_SELF, GAILIST_WAKEUP)
|
|
|
|
label(0x0e)
|
|
if_never_been_onscreen(/*goto*/ 0x13)
|
|
set_ailist(CHR_SELF, GAILIST_WAKEUP)
|
|
|
|
label(0x13)
|
|
dprint 'C','H','E','C','K',' ','D','U','P','E','\n',0,
|
|
if_chr_death_animation_finished(CHR_CLONE, /*goto*/ 0x0e)
|
|
if_chr_knockedout(CHR_CLONE, /*goto*/ 0x0e)
|
|
if_self_flag_bankx_eq(CHRFLAG0_00100000, FALSE, BANK_0, /*goto*/ 0x13)
|
|
goto_first(LABEL_HEARSPAWN)
|
|
|
|
label(0x13)
|
|
goto_first(LABEL_SCAN_START)
|
|
|
|
label(0x0e)
|
|
dprint 'C','R','E','A','T','E',' ','S','P','A','W','N','\n',0,
|
|
try_spawn_clone2(CHR_SELF, GAILIST_SEARCH_FOR_PLAYER, 0x00000000, /*goto*/ 0x13)
|
|
dprint 'C','R','E','A','T','E',' ','F','A','I','L','\n',0,
|
|
if_self_flag_bankx_eq(CHRFLAG0_00100000, FALSE, BANK_0, /*goto*/ 0x16)
|
|
goto_first(LABEL_HEARSPAWN)
|
|
|
|
label(0x16)
|
|
goto_first(LABEL_SCAN_START)
|
|
|
|
label(0x13)
|
|
if_self_flag_bankx_eq(CHRFLAG0_00100000, FALSE, BANK_0, /*goto*/ 0x13)
|
|
goto_first(LABEL_HEARSPAWN)
|
|
|
|
label(0x13)
|
|
set_ailist(CHR_SELF, GAILIST_UNALERTED_0001)
|
|
|
|
// Unreachable due to set_ailist above
|
|
increase_self_alertness(255)
|
|
goto_next(0x16)
|
|
|
|
label(0x16)
|
|
goto_first(LABEL_SCAN_START)
|
|
|
|
//
|
|
// ALERT FAIL (alertness < 100)
|
|
//
|
|
label(0x78)
|
|
if_self_flag_bankx_eq(CHRFLAG0_00100000, FALSE, BANK_0, /*goto*/ 0x13)
|
|
goto_first(0x0e) // create spawn
|
|
|
|
label(0x13)
|
|
dprint 'W','A','R','N','E','D','B','Y','F','R','I','E','N','D','\n',0,
|
|
if_self_flag_bankx_eq(CHRFLAG0_CAN_HEARSPAWN, FALSE, BANK_0, /*goto*/ 0x13)
|
|
set_alertness(0)
|
|
goto_first(LABEL_HEARSPAWN)
|
|
|
|
label(0x13)
|
|
if_chr_is_skedar(CHR_SELF, /*goto*/ 0x7b)
|
|
restart_timer
|
|
if_self_flag_bankx_eq(CHRFLAG1_DOINGIDLEANIMATION, TRUE, BANK_1, /*goto*/ 0x7a)
|
|
chr_do_animation(ANIM_YAWN, 0, 193, 0x18, 0x10, CHR_SELF, 2)
|
|
|
|
beginloop(0x7a)
|
|
dprint 'T','3',0,
|
|
if_timer_gt(60, /*goto*/ 0x7b)
|
|
endloop(0x7a)
|
|
|
|
label(0x7b)
|
|
dprint 'W','A','R','N','E','D','B','E','N','D','\n',0,
|
|
dprint 'W','A','R','N','E','D','B','E','N','D','2','\n',0,
|
|
set_ailist(CHR_SELF, GAILIST_WAKEUP)
|
|
|
|
// Unreachable - nothing jumps here
|
|
label(0xe4)
|
|
set_returnlist(CHR_SELF, GAILIST_UNALERTED)
|
|
set_ailist(CHR_SELF, GAILIST_FLEE_FROM_GRENADE)
|
|
|
|
//
|
|
// AIVSAI pass
|
|
//
|
|
label(0x12)
|
|
if_self_flag_bankx_eq(CHRFLAG1_00100000, TRUE, BANK_1, /*goto*/ 0x13)
|
|
set_returnlist(CHR_SELF, GAILIST_UNALERTED)
|
|
|
|
label(0x13)
|
|
dprint 'W','A','R','N','E','D','B','E','N','D','3','\n',0,
|
|
if_self_flag_bankx_eq(CHRFLAG0_UNSURPRISABLE, FALSE, BANK_0, /*goto*/ 0x77)
|
|
say_quip(CHR_BOND, QUIP_SURPRISED, 0xff, 0x03, 0xff, BANK_0, 0x00, 0x00)
|
|
restart_timer
|
|
if_self_flag_bankx_eq(CHRFLAG1_DOINGIDLEANIMATION, TRUE, BANK_1, /*goto*/ 0x75)
|
|
chr_do_animation(ANIM_SURPRISED_0202, 0, -1, 0x00, 0x10, CHR_SELF, 2)
|
|
|
|
beginloop(0x75)
|
|
dprint 'S','6',0,
|
|
if_timer_gt(60, /*goto*/ 0x77)
|
|
endloop(0x75)
|
|
|
|
label(0x77)
|
|
if_chr_in_squadron_doing_action(MA_GOTOALARM, /*goto*/ 0x16)
|
|
if_self_flag_bankx_eq(CHRFLAG0_CAN_GO_TO_PLACES, TRUE, BANK_0, /*goto*/ 0x13)
|
|
label(0x16)
|
|
set_ailist(CHR_SELF, GAILIST_INIT_COMBAT)
|
|
|
|
label(0x13)
|
|
set_ailist(CHR_SELF, GAILIST_WAKEUP)
|
|
|
|
// Wait until chr finished animation, then become alert.
|
|
// Used when standing up from sitting.
|
|
label(0x0c)
|
|
dprint 'G','O','T',' ','W','A','T','\n',0,
|
|
yield
|
|
if_chr_stopped(/*goto*/ 0x13)
|
|
goto_first(0x0c)
|
|
|
|
label(0x13)
|
|
set_ailist(CHR_SELF, GAILIST_WAKEUP)
|
|
endlist
|
|
};
|
|
|
|
u8 unregistered_function1[] = {
|
|
dprint 'I','V','E','I','J','U','R','E','D','\n',0,
|
|
set_ailist(CHR_SELF, GAILIST_WAKEUP)
|
|
endlist
|
|
};
|
|
|
|
u8 func0008_wakeup[] = {
|
|
set_chr_hiddenflag(CHR_TARGET, CHRHFLAG_PSYCHOSISED)
|
|
if_chr_has_hiddenflag(CHR_SELF, CHRHFLAG_PSYCHOSISED, /*goto*/ 0x13)
|
|
goto_next(0x16)
|
|
|
|
// Psychosised
|
|
label(0x13)
|
|
set_returnlist(CHR_SELF, GAILIST_INIT_PSYCHOSIS)
|
|
set_ailist(CHR_SELF, GAILIST_INIT_PSYCHOSIS)
|
|
|
|
// Unset special death animation if no longer idle
|
|
label(0x16)
|
|
if_self_flag_bankx_eq(CHRFLAG1_DOINGIDLEANIMATION, FALSE, BANK_1, /*goto*/ 0x13)
|
|
set_chr_special_death_animation(CHR_SELF, SPECIALDIE_NONE)
|
|
|
|
// If idle, unset it and stand up or whatever is needed
|
|
label(0x13)
|
|
set_shotlist(GAILIST_ALERTED)
|
|
if_self_flag_bankx_eq(CHRFLAG1_DOINGIDLEANIMATION, FALSE, BANK_1, /*goto*/ 0x06)
|
|
unset_self_flag_bankx(CHRFLAG1_DOINGIDLEANIMATION, BANK_1)
|
|
if_chr_idle_action_eq(IDLEACTION_SITTING_TYPING, /*goto*/ 0x05)
|
|
if_chr_idle_action_eq(IDLEACTION_SITTING_DORMANT, /*goto*/ 0x05)
|
|
goto_next(0x06)
|
|
|
|
// About to stand up
|
|
label(0x05)
|
|
dprint 'A','N','I','M',' ','O','B','J','E','C','T',' ','N','O','W','\n',0,
|
|
yield
|
|
if_chr_death_animation_finished(CHR_SELF, /*goto*/ 0x13)
|
|
if_chr_dead(CHR_SELF, /*goto*/ 0x13)
|
|
if_chr_knockedout(CHR_SELF, /*goto*/ 0x13)
|
|
goto_next(0x15)
|
|
|
|
// Dead
|
|
label(0x13)
|
|
set_shotlist(GAILIST_IDLE)
|
|
set_ailist(CHR_SELF, GAILIST_IDLE)
|
|
|
|
// Stand up
|
|
label(0x15)
|
|
set_chr_maxdamage(CHR_SELF, 40)
|
|
chr_do_animation(ANIM_STAND_UP_FROM_SITTING, 0, -1, 0x02, 0x10, CHR_SELF, 2)
|
|
object_do_animation(0x025a, 0xff, 0x02, 0xffff)
|
|
goto_next(0x0c)
|
|
|
|
// Unreachable - nothing jumps here
|
|
label(0x16)
|
|
object_do_animation(0x027b, 0xff, 0x02, 0xffff)
|
|
|
|
// Wait for stand up animation to finish
|
|
label(0x0c)
|
|
dprint 'G','O','T',' ','W','A','T','\n',0,
|
|
yield
|
|
if_chr_stopped(/*goto*/ 0x13)
|
|
goto_first(0x0c)
|
|
|
|
label(0x13)
|
|
label(0x06)
|
|
set_ailist(CHR_SELF, GAILIST_ALERTED)
|
|
endlist
|
|
};
|
|
|
|
u8 func0007_alerted[] = {
|
|
#define LABEL_DRAW_PISTOL 0xe7
|
|
#define LABEL_GETGUN_FAILED 0xaf
|
|
#define LABEL_CLOAKED 0xeb
|
|
#define LABEL_RUN_FOR_ALARM 0x9f
|
|
#define LABEL_RETREAT 0x6b
|
|
#define LABEL_FLANK_LEFT 0x8f
|
|
#define LABEL_FLANK_RIGHT 0x90
|
|
#define LABEL_TRACK 0x34
|
|
#define LABEL_SNIPE 0xde
|
|
#define LABEL_FLEE_GRENADE 0xe4
|
|
|
|
set_chr_hiddenflag(CHR_TARGET, CHRHFLAG_PSYCHOSISED)
|
|
if_chr_has_hiddenflag(CHR_SELF, CHRHFLAG_PSYCHOSISED, /*goto*/ 0x13)
|
|
goto_next(0x16)
|
|
|
|
label(0x13)
|
|
set_returnlist(CHR_SELF, GAILIST_INIT_PSYCHOSIS)
|
|
set_ailist(CHR_SELF, GAILIST_INIT_PSYCHOSIS)
|
|
|
|
// If doing idle animation, turn off special death animation
|
|
label(0x16)
|
|
if_self_flag_bankx_eq(CHRFLAG1_DOINGIDLEANIMATION, FALSE, BANK_1, /*goto*/ 0x13)
|
|
set_chr_special_death_animation(CHR_SELF, SPECIALDIE_NONE)
|
|
|
|
// If something, jump to combat
|
|
label(0x13)
|
|
unset_self_flag_bankx(CHRFLAG1_01000000, BANK_1)
|
|
if_chr_is_skedar(CHR_SELF, /*goto*/ 0x13)
|
|
goto_next(0x16)
|
|
|
|
label(0x13)
|
|
set_ailist(CHR_SELF, GAILIST_COMBAT_WITH_TARGET)
|
|
|
|
// is_chr_is_dead_maybe (named wrong) was false
|
|
label(0x16)
|
|
set_shotlist(GAILIST_ALERTED)
|
|
set_aishootingatmelist(GAILIST_DODGE)
|
|
set_darkroomlist(GAILIST_SEARCH_FOR_PLAYER)
|
|
|
|
dprint 'S','T','A','R','T',' ','L','O','O','P','\n',0,
|
|
if_chr_dead(CHR_SELF, /*goto*/ 0x16)
|
|
if_chr_death_animation_finished(CHR_SELF, /*goto*/ 0x16)
|
|
if_chr_knockedout(CHR_SELF, /*goto*/ 0x16)
|
|
dprint 'N','O','T',' ','D','E','A','D','\n',0,
|
|
goto_next(0x13)
|
|
|
|
// Dying
|
|
label(0x16)
|
|
set_chr_dodge_rating(2, 0x00)
|
|
set_shotlist(GAILIST_IDLE)
|
|
|
|
restart_timer
|
|
|
|
beginloop(0x1c)
|
|
dprint 'D','I','E',' ','L','O','O','P','\n',0,
|
|
if_timer_gt(15, /*goto*/ 0x16)
|
|
endloop(0x1c)
|
|
|
|
label(0x16)
|
|
say_quip(CHR_BOND, QUIP_DIE, 0xff, 0x03, 0xff, BANK_0, 0x00, 0x00)
|
|
set_shotlist(GAILIST_IDLE)
|
|
set_ailist(CHR_SELF, GAILIST_IDLE)
|
|
|
|
// Alive
|
|
label(0x13)
|
|
dprint 'S','T','A','R','T',' ','L','O','O','P','2','\n',0,
|
|
if_just_injured(CHR_SELF, /*goto*/ 0x16)
|
|
if_has_gun(CHR_SELF, /*goto*/ 0x13)
|
|
goto_next(0x16)
|
|
|
|
// Not injured and has gun
|
|
label(0x13)
|
|
if_self_flag_bankx_eq(CHRFLAG1_CAN_DRAW_PISTOL, TRUE, BANK_1, /*goto*/ LABEL_DRAW_PISTOL)
|
|
goto_next(0x1b)
|
|
|
|
// Injured or no gun
|
|
label(0x16)
|
|
restart_timer
|
|
unset_self_flag_bankx(CHRFLAG1_00000020, BANK_1)
|
|
unset_self_flag_bankx(CHRFLAG1_CAN_DRAW_PISTOL, BANK_1)
|
|
dprint 'C','H','E','C','K','I','N','J','U','R','Y','\n',0,
|
|
|
|
// Say an injury quip if we haven't already, then wait up to 3 seconds for
|
|
// the chr to have finished their injury animation
|
|
beginloop(0x1d)
|
|
if_self_flag_bankx_eq(CHRFLAG0_SAID_INJURY_QUIP, TRUE, BANK_0, /*goto*/ 0x16)
|
|
if_num_times_shot_lt(1, /*goto*/ 0x16)
|
|
if_timer_lt(20, /*goto*/ 0x16)
|
|
say_quip(CHR_BOND, QUIP_INJURED1, 0x28, 0x03, 0x00, BANK_0, 0x00, 0x00)
|
|
say_quip(CHR_BOND, QUIP_INJURED2, 0x28, 0x03, 0x01, BANK_0, 0x00, 0x00)
|
|
set_self_flag_bankx(CHRFLAG0_SAID_INJURY_QUIP, BANK_0)
|
|
label(0x16)
|
|
if_timer_gt(180, /*goto*/ 0x13)
|
|
if_chr_stopped(/*goto*/ 0x13)
|
|
endloop(0x1d)
|
|
|
|
label(0x13)
|
|
stop_chr
|
|
dprint 'I','N','J',' ','O','V','E','R','\n',0,
|
|
if_self_flag_bankx_eq(CHRFLAG1_CAN_DRAW_PISTOL, TRUE, BANK_1, /*goto*/ LABEL_DRAW_PISTOL)
|
|
dprint 'B','4',' ','G','U','N','\n',0,
|
|
if_has_gun(CHR_SELF, /*goto*/ 0x1b)
|
|
dprint 'L','O','S','T',' ','M','Y',' ','G','U','N','\n',0,
|
|
label(0xac)
|
|
set_chr_dodge_rating(2, 0x00)
|
|
say_quip(CHR_BOND, QUIP_LOSTGUN, 0xff, 0x03, 0xff, BANK_0, 0x00, 0x00)
|
|
stop_chr
|
|
restart_timer
|
|
yield
|
|
|
|
// Wait for gun to land. If it disappears (eg. falls out of geometry), is
|
|
// picked up by the player, or we've been waiting for 5 seconds then go to
|
|
// GETFUN_FAILED.
|
|
label(0xb0)
|
|
dprint 'W','A','I','T','I','N','G','\n',0,
|
|
yield
|
|
yield
|
|
yield
|
|
if_gun_unclaimed(-1, TRUE, /*goto*/ 0x13)
|
|
goto_next(LABEL_GETGUN_FAILED)
|
|
|
|
label(0x13)
|
|
if_gun_landed(/*goto*/ 0xb1)
|
|
if_timer_gt(300, /*goto*/ LABEL_GETGUN_FAILED)
|
|
goto_first(0xb0)
|
|
|
|
label(0xb1)
|
|
restart_timer
|
|
go_to_gun(/*goto*/ 0xad)
|
|
|
|
beginloop(0xad)
|
|
dprint 'G','O',' ','F','O','R',' ','G','U','N','\n',0,
|
|
if_timer_gt(300, /*goto*/ LABEL_GETGUN_FAILED)
|
|
if_gun_unclaimed(-1, TRUE, /*goto*/ 0x13)
|
|
goto_next(LABEL_GETGUN_FAILED)
|
|
label(0x13)
|
|
if_distance_to_gun_lt(100, /*goto*/ 0x16)
|
|
if_chr_stopped(/*goto*/ 0x16)
|
|
endloop(0xad)
|
|
|
|
label(0x16)
|
|
dprint 'A','T',' ','G','U','N','\n',0,
|
|
restart_timer
|
|
chr_do_animation(ANIM_PICK_UP_GUN, 0, -1, 0x10, 0x10, CHR_SELF, 2)
|
|
|
|
beginloop(0xae)
|
|
if_timer_gt(60, /*goto*/ 0x16)
|
|
endloop(0xae)
|
|
|
|
label(0x16)
|
|
if_gun_unclaimed(-1, TRUE, /*goto*/ 0x13)
|
|
goto_next(LABEL_GETGUN_FAILED)
|
|
|
|
label(0x13)
|
|
chr_recover_gun(CHR_SELF, /*goto*/ 0x16)
|
|
goto_next(LABEL_GETGUN_FAILED)
|
|
|
|
label(0x16)
|
|
goto_next(0x1b)
|
|
|
|
//
|
|
// GETGUN FAILED
|
|
//
|
|
label(LABEL_GETGUN_FAILED)
|
|
stop_chr
|
|
dprint 'G','E','T','G','U','N',' ','F','A','I','L','E','D','\n',0,
|
|
call_rng
|
|
if_rand_lt(50, /*goto*/ 0xe6)
|
|
if_rand_lt(100, /*goto*/ LABEL_DRAW_PISTOL)
|
|
set_self_flag_bankx(CHRFLAG0_CAN_RETREAT, BANK_0)
|
|
set_self_flag_bankx(CHRFLAG0_CANT_ALERT_GROUP, BANK_0)
|
|
set_self_flag_bankx(CHRFLAG0_00200000, BANK_0)
|
|
unset_self_flag_bankx(CHRFLAG0_00002000, BANK_0)
|
|
unset_self_flag_bankx(CHRFLAG0_00004000, BANK_0)
|
|
unset_self_flag_bankx(CHRFLAG0_80000000, BANK_0)
|
|
set_self_flag_bankx(CHRFLAG1_00000002, BANK_1)
|
|
goto_next(0x1b)
|
|
|
|
label(0xe6)
|
|
set_self_flag_bankx(CHRFLAG1_00000001, BANK_1)
|
|
goto_next(0x1b)
|
|
|
|
//
|
|
// DRAW PISTOL
|
|
//
|
|
label(LABEL_DRAW_PISTOL)
|
|
call_rng
|
|
if_rand_lt(82, /*goto*/ 0x13)
|
|
if_rand_lt(164, /*goto*/ 0x15)
|
|
chr_do_animation(ANIM_DRAW_PISTOL_0288, 0, -1, 0x10, 0x10, CHR_SELF, 2)
|
|
goto_next(0x16)
|
|
|
|
label(0x13)
|
|
chr_do_animation(ANIM_DRAW_PISTOL_0289, 0, -1, 0x10, 0x10, CHR_SELF, 2)
|
|
goto_next(0x16)
|
|
|
|
label(0x15)
|
|
chr_do_animation(ANIM_DRAW_PISTOL_0245, 0, -1, 0x10, 0x10, CHR_SELF, 2)
|
|
|
|
label(0x16)
|
|
if_stage_is_not(STAGE_AIRFORCEONE, /*goto*/ 0x13)
|
|
try_equip_weapon(MODEL_CHRCYCLONE, WEAPON_CYCLONE, 0x00000000, /*goto*/ 0xe5)
|
|
label(0x13)
|
|
try_equip_weapon(MODEL_CHRFALCON2, WEAPON_FALCON2, 0x00000000, /*goto*/ 0xe5)
|
|
|
|
beginloop(0xe5)
|
|
if_chr_stopped(/*goto*/ 0x16)
|
|
endloop(0xe5)
|
|
|
|
label(0x16)
|
|
if_self_flag_bankx_eq(CHRFLAG1_CAN_DRAW_PISTOL, TRUE, BANK_1, /*goto*/ 0x13)
|
|
unset_self_flag_bankx(CHRFLAG0_80000000, BANK_0)
|
|
label(0x13)
|
|
unset_self_flag_bankx(CHRFLAG1_CAN_DRAW_PISTOL, BANK_1)
|
|
label(0x16)
|
|
|
|
//
|
|
// Lots of things go here
|
|
//
|
|
label(0x1b)
|
|
yield
|
|
label(0x16)
|
|
if_chr_has_hiddenflag(CHR_SELF, CHRHFLAG_00002000, /*goto*/ 0x13)
|
|
if_chr_has_hiddenflag(CHR_TARGET, CHRHFLAG_UNTARGETABLE, /*goto*/ 0x01)
|
|
label(0x13)
|
|
if_self_flag_bankx_eq(CHRFLAG1_00000001, TRUE, BANK_1, /*goto*/ LABEL_TRACK)
|
|
dprint 'C','H','E','C','K','I','N','J','U','R','Y','E','N','D','\n',0,
|
|
|
|
// Consider warning others in team
|
|
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_GO_TO_PLACES, TRUE, BANK_0, /*goto*/ LABEL_RUN_FOR_ALARM)
|
|
|
|
// No need to warn
|
|
label(0x16)
|
|
if_chr_has_hiddenflag(CHR_TARGET, CHRHFLAG_CLOAKED, /*goto*/ LABEL_CLOAKED)
|
|
goto_next(0x16)
|
|
|
|
// Unreachable - nothing jumps here
|
|
label(0x13)
|
|
set_returnlist(CHR_SELF, GAILIST_ALERTED)
|
|
set_alertness(0)
|
|
set_ailist(CHR_SELF, GAILIST_SEARCH_FOR_PLAYER)
|
|
|
|
// This flag appears to control whether the chr can declare that they're
|
|
// attempting to surround the player. These quips are never said though, so
|
|
// either the flag is never set for anyone or the field_0x201 values are
|
|
// something different.
|
|
label(0x16)
|
|
if_self_flag_bankx_eq(CHRFLAG0_CAN_FLANK, FALSE, BANK_0, /*goto*/ 0x93)
|
|
if_orders_eq(MA_FLANKLEFT, /*goto*/ 0x13)
|
|
if_orders_eq(MA_FLANKRIGHT, /*goto*/ 0x15)
|
|
goto_next(0x93)
|
|
|
|
label(0x13)
|
|
say_quip(CHR_BOND, QUIP_FLANK, 0x28, 0x03, 0x01, BANK_0, 0x00, 0x00)
|
|
goto_next(LABEL_FLANK_LEFT)
|
|
|
|
label(0x15)
|
|
say_quip(CHR_BOND, QUIP_FLANK, 0x28, 0x03, 0x01, BANK_0, 0x00, 0x00)
|
|
goto_next(LABEL_FLANK_RIGHT)
|
|
|
|
// Attempt trap (hide and ambush when player gets near)
|
|
label(0x93)
|
|
if_self_flag_bankx_eq(CHRFLAG0_CANT_ALERT_GROUP, TRUE, BANK_0, /*goto*/ LABEL_RETREAT)
|
|
if_self_flag_bankx_eq(CHRFLAG0_CAN_TRAP, TRUE, BANK_0, /*goto*/ 0x13)
|
|
dprint 'T','R','A','P',' ','N','O','T',' ','S','E','T','\n',0,
|
|
if_self_flag_bankx_eq(CHRFLAG0_00000004, FALSE, BANK_0, /*goto*/ 0x16)
|
|
label(0x13)
|
|
dprint 'V','I','S','\n',0,
|
|
if_can_see_attack_target(/*goto*/ 0x16)
|
|
goto_next(0x98)
|
|
|
|
label(0x16)
|
|
dprint 'T','R','A','P',' ','F','A','I','L','E','D','\n',0,
|
|
if_self_flag_bankx_eq(CHRFLAG0_02000000, TRUE, BANK_0, /*goto*/ 0x16)
|
|
if_self_flag_bankx_eq(CHRFLAG0_01000000, FALSE, BANK_0, /*goto*/ 0x16)
|
|
label(0x13)
|
|
dprint 'V','I','S','\n',0,
|
|
if_can_see_attack_target(/*goto*/ 0x16)
|
|
goto_next(0xa1)
|
|
|
|
label(0x16)
|
|
if_self_flag_bankx_eq(CHRFLAG0_10000000, FALSE, BANK_0, /*goto*/ 0x16)
|
|
label(0x13)
|
|
dprint 'I','M',' ','G','O','I','N','G',' ','T','O',' ','P','O','P','\n',0,
|
|
goto_next(0xa4)
|
|
|
|
// Not popping
|
|
label(0x16)
|
|
if_self_flag_bankx_eq(CHRFLAG1_CAN_SNIPE, FALSE, BANK_1, /*goto*/ 0x16)
|
|
label(0x13)
|
|
dprint 'I','M',' ','G','O','I','N','G',' ','T','O',' ','S','N','I','P','E','\n',0,
|
|
goto_next(LABEL_SNIPE)
|
|
|
|
label(0x16)
|
|
dprint 'A','M','B','U','S','H',' ','F','A','I','L','E','D','\n',0,
|
|
if_self_flag_bankx_eq(CHRFLAG0_CAN_RETREAT, FALSE, BANK_0, /*goto*/ 0x16)
|
|
if_num_times_shot_lt(1, /*goto*/ 0x16)
|
|
if_retreat_risk_lt(3, /*goto*/ LABEL_RETREAT)
|
|
dprint 'R','I','S','K',' ','F','A','I','L','E','D','\n',0,
|
|
label(0x16)
|
|
if_self_flag_bankx_eq(CHRFLAG0_00004000, TRUE, BANK_0, /*goto*/ 0x91)
|
|
if_self_flag_bankx_eq(CHRFLAG0_00002000, TRUE, BANK_0, /*goto*/ 0x92)
|
|
label(0x91)
|
|
if_retreat_risk_lt(5, /*goto*/ 0x52)
|
|
label(0x92)
|
|
goto_next(0x68)
|
|
|
|
//
|
|
// TRAP/AMBUSH
|
|
//
|
|
label(0x98)
|
|
dprint 'G','O','I','N','G',' ','T','O',' ','T','R','A','P',' ','P','A','D','\n',0,
|
|
go_to_target_pad(SPEED_JOG)
|
|
|
|
beginloop(0x99)
|
|
label(0x16)
|
|
if_chr_stopped(/*goto*/ 0x16)
|
|
endloop(0x99)
|
|
|
|
label(0x16)
|
|
dprint 'A','T',' ','T','R','A','P',' ','P','A','D','\n',0,
|
|
label(0x9b)
|
|
if_chr_has_hiddenflag(CHR_TARGET, CHRHFLAG_CLOAKED, /*goto*/ LABEL_CLOAKED)
|
|
try_attack_kneel(ENTITYTYPE_TARGET | ENTITYTYPE_AIMONLY, 0, /*goto*/ 0x03)
|
|
|
|
beginloop(0x03)
|
|
if_can_see_attack_target(/*goto*/ 0x9a)
|
|
if_chr_target_eq(CHR_SELF, CHR_P1P2, FALSE, /*goto*/ 0xee)
|
|
goto_next(0xef)
|
|
|
|
label(0xee)
|
|
chr_toggle_p1p2(CHR_SELF)
|
|
if_chr_target_eq(CHR_SELF, CHR_P1P2, FALSE, /*goto*/ 0xee)
|
|
set_target_chr(CHR_P1P2)
|
|
if_can_see_attack_target(/*goto*/ 0x9a)
|
|
label(0xee)
|
|
chr_toggle_p1p2(CHR_SELF)
|
|
set_target_chr(CHR_P1P2)
|
|
label(0xef)
|
|
endloop(0x03)
|
|
|
|
// Aiming only
|
|
label(0x9a)
|
|
try_modify_attack(ENTITYTYPE_TARGET, 0, /*goto*/ 0x04)
|
|
|
|
beginloop(0x04)
|
|
if_chr_stopped(/*goto*/ 0x16)
|
|
endloop(0x04)
|
|
|
|
label(0x16)
|
|
if_self_flag_bankx_eq(CHRFLAG0_CAN_TRAP, TRUE, BANK_0, /*goto*/ 0x16)
|
|
if_distance_to_target_lt(800, /*goto*/ 0x9c)
|
|
label(0x16)
|
|
goto_first(0x9b)
|
|
|
|
label(0x9c)
|
|
unset_self_flag_bankx(CHRFLAG0_00000004, BANK_0)
|
|
goto_first(0x1b)
|
|
|
|
label(0xa1)
|
|
kneel
|
|
|
|
beginloop(0xa2)
|
|
dprint 'W','A','I','T',' ','F','O','R',' ','A','M','B','\n',0,
|
|
if_can_see_attack_target(/*goto*/ 0xa3)
|
|
dprint 'A','M','B','1','\n',0,
|
|
if_distance_from_target_to_pad_lt(200, PAD_PRESET, /*goto*/ 0x13)
|
|
dprint 'A','M','B','2','\n',0,
|
|
chr_toggle_p1p2(CHR_SELF)
|
|
set_target_chr(CHR_P1P2)
|
|
if_enemy_distance_lt_and_los(1200, /*goto*/ 0xee)
|
|
endloop(0xa2)
|
|
|
|
label(0xee)
|
|
if_target_is_player(/*goto*/ 0x13)
|
|
set_returnlist(CHR_SELF, GAILIST_COMBAT_WITH_TARGET)
|
|
set_ailist(CHR_SELF, GAILIST_COMBAT_WITH_TARGET)
|
|
|
|
label(0x13)
|
|
dprint 'A','M','B','U','S','H',' ','P','L','A','Y','E','R','\n',0,
|
|
set_accuracy(30)
|
|
set_self_flag_bankx(CHRFLAG0_02000000, BANK_0)
|
|
say_quip(CHR_BOND, QUIP_ATTACK2, 0x50, 0x02, 0x01, BANK_0, 0x00, 0x00)
|
|
goto_first(0x1b)
|
|
|
|
label(0xa3)
|
|
dprint 'S','E','E','N','T','A','R','G','\n',0, // seen target
|
|
unset_self_flag_bankx(CHRFLAG0_01000000, BANK_0)
|
|
goto_first(0x1b)
|
|
|
|
//
|
|
// POP
|
|
//
|
|
label(0xa4)
|
|
if_self_flag_bankx_eq(CHRFLAG0_00002000, TRUE, BANK_0, /*goto*/ 0xa8)
|
|
cmd0121_if_something(0xa0b5, /*goto*/ 0xa5)
|
|
dprint 'P','O','P','P','E','R',' ','F','A','I','L','E','D','\n',0,
|
|
goto_next(0x52)
|
|
|
|
label(0xa5)
|
|
dprint 'G','O',' ','T','O',' ','P','O','P','P','E','R','\n',0,
|
|
set_action(MA_COVERGOTO, FALSE)
|
|
unset_self_flag_bankx(CHRFLAG1_00040000, BANK_1)
|
|
unset_self_flag_bankx(CHRFLAG1_00020000, BANK_1)
|
|
label(0x16)
|
|
go_to_cover(SPEED_RUN)
|
|
|
|
beginloop(0xa6)
|
|
if_chr_stopped(/*goto*/ 0xa7)
|
|
endloop(0xa6)
|
|
|
|
label(0xa7)
|
|
dprint 'U','N','D','E','R',' ','P','O','P','P','E','R','\n',0,
|
|
label(0xa8)
|
|
if_chr_has_hiddenflag(CHR_TARGET, CHRHFLAG_CLOAKED, /*goto*/ LABEL_CLOAKED)
|
|
try_attack_stand(ENTITYTYPE_TARGET | ENTITYTYPE_AIMONLY, 0, /*goto*/ 0xa9)
|
|
|
|
beginloop(0xa9)
|
|
chr_toggle_p1p2(CHR_SELF)
|
|
set_target_chr(CHR_P1P2)
|
|
if_near_miss(/*goto*/ 0x13)
|
|
if_saw_injury(0x00, /*goto*/ 0x13)
|
|
if_saw_death(0x00, /*goto*/ 0x13)
|
|
if_can_see_attack_target(/*goto*/ 0x13)
|
|
endloop(0xa9)
|
|
|
|
label(0x13)
|
|
call_rng
|
|
if_rand_gt(150, /*goto*/ 0x13)
|
|
if_can_see_attack_target(/*goto*/ 0x16)
|
|
goto_next(0x13)
|
|
|
|
label(0x16)
|
|
try_modify_attack(ENTITYTYPE_TARGET, 0, /*goto*/ 0xaa)
|
|
label(0x13)
|
|
kneel
|
|
restart_timer
|
|
|
|
beginloop(0xab)
|
|
set_target_chr(CHR_P1P2)
|
|
if_distance_to_target_gt(300, /*goto*/ 0x13)
|
|
unset_self_flag_bankx(CHRFLAG0_10000000, BANK_0)
|
|
goto_first(0x1b)
|
|
|
|
label(0x13)
|
|
call_rng
|
|
if_rand_gt(250, /*goto*/ 0x13)
|
|
if_timer_gt(240, /*goto*/ 0x16)
|
|
endloop(0xab)
|
|
|
|
label(0x13)
|
|
if_chr_has_hiddenflag(CHR_TARGET, CHRHFLAG_CLOAKED, /*goto*/ LABEL_CLOAKED)
|
|
try_attack_stand(ENTITYTYPE_TARGET | ENTITYTYPE_AIMONLY, 0, /*goto*/ 0x13)
|
|
goto_first(0xa8)
|
|
|
|
label(0x13)
|
|
if_can_see_attack_target(/*goto*/ 0x13)
|
|
goto_first(0xa8)
|
|
|
|
label(0x13)
|
|
try_modify_attack(ENTITYTYPE_TARGET, 0, /*goto*/ 0x13)
|
|
goto_first(0xa8)
|
|
|
|
label(0x13)
|
|
|
|
beginloop(0xaa)
|
|
if_chr_stopped(/*goto*/ 0x16)
|
|
endloop(0xaa)
|
|
|
|
label(0x16)
|
|
goto_first(0xa8)
|
|
|
|
//
|
|
// SNIPE
|
|
//
|
|
label(LABEL_SNIPE)
|
|
unset_self_flag_bankx(CHRFLAG0_80000000, BANK_0)
|
|
yield
|
|
if_distance_to_target_lt(1000, /*goto*/ 0x16)
|
|
if_distance_to_target_gt(2500, /*goto*/ 0x14)
|
|
|
|
// Distance between 1000 and 2500
|
|
if_target_in_fov_left(10, /*goto*/ 0x13)
|
|
if_target_out_of_fov_left(246, /*goto*/ 0x13)
|
|
restart_timer
|
|
stop_chr
|
|
try_face_entity(ENTITYTYPE_TARGET, 0, /*goto*/ 0xec)
|
|
|
|
beginloop(0xec)
|
|
if_target_in_fov_left(10, /*goto*/ 0x13)
|
|
if_target_out_of_fov_left(246, /*goto*/ 0x13)
|
|
if_timer_gt(60, /*goto*/ 0x13)
|
|
endloop(0xec)
|
|
|
|
label(0x13)
|
|
if_can_see_attack_target(/*goto*/ 0x13)
|
|
if_chr_target_eq(CHR_SELF, CHR_P1P2, FALSE, /*goto*/ 0xee)
|
|
goto_next(0xef)
|
|
|
|
label(0xee)
|
|
chr_toggle_p1p2(CHR_SELF)
|
|
if_chr_target_eq(CHR_SELF, CHR_P1P2, FALSE, /*goto*/ 0xee)
|
|
set_target_chr(CHR_P1P2)
|
|
if_can_see_attack_target(/*goto*/ 0x13)
|
|
label(0xee)
|
|
chr_toggle_p1p2(CHR_SELF)
|
|
set_target_chr(CHR_P1P2)
|
|
label(0xef)
|
|
goto_first(LABEL_SNIPE)
|
|
|
|
// Distance > 2500
|
|
label(0x14)
|
|
try_run_to_target(/*goto*/ 0xe1)
|
|
|
|
beginloop(0xe1)
|
|
if_distance_to_target_lt(2500, /*goto*/ 0x15)
|
|
endloop(0xe1)
|
|
|
|
label(0x15)
|
|
goto_first(LABEL_SNIPE)
|
|
|
|
label(0x13)
|
|
restart_timer
|
|
if_chr_has_hiddenflag(CHR_TARGET, CHRHFLAG_CLOAKED, /*goto*/ LABEL_CLOAKED)
|
|
try_attack_lie(ENTITYTYPE_FORWARD | ENTITYTYPE_AIMONLY, 0, /*goto*/ 0xdf)
|
|
|
|
beginloop(0xdf)
|
|
if_distance_to_target_lt(1000, /*goto*/ 0x16)
|
|
if_timer_gt(300, /*goto*/ 0x13)
|
|
endloop(0xdf)
|
|
|
|
label(0x13)
|
|
if_can_see_attack_target(/*goto*/ 0x13)
|
|
set_self_flag_bankx(CHRFLAG0_80000000, BANK_0)
|
|
stop_chr
|
|
goto_first(0x1b)
|
|
|
|
label(0x13)
|
|
restart_timer
|
|
set_accuracy(100)
|
|
try_attack_lie(ENTITYTYPE_TARGET, 0, /*goto*/ 0xe0)
|
|
dprint 'S','N','I','P','E','R',' ','N','O',' ','S','H','O','O','T','\n',0,
|
|
|
|
beginloop(0xe0)
|
|
dprint 'S','N','I','P','E','R',' ',' ','S','H','O','O','T','\n',0,
|
|
if_chr_stopped(/*goto*/ 0x13)
|
|
endloop(0xe0)
|
|
|
|
label(0x13)
|
|
set_accuracy(10)
|
|
stop_chr
|
|
goto_first(LABEL_SNIPE)
|
|
|
|
// Distance < 1000
|
|
label(0x16)
|
|
stop_chr
|
|
unset_self_flag_bankx(CHRFLAG1_CAN_SNIPE, BANK_1)
|
|
set_self_flag_bankx(CHRFLAG0_80000000, BANK_0)
|
|
restart_timer
|
|
|
|
beginloop(0xbd)
|
|
if_timer_gt(60, /*goto*/ 0x13)
|
|
endloop(0xbd)
|
|
|
|
label(0x13)
|
|
goto_first(0x1b)
|
|
|
|
//
|
|
// POPPER/AMBUSH FAILED
|
|
//
|
|
label(0x52)
|
|
dprint 'A','M','B','U','S','H',' ','F','A','I','L','E','D','3','\n',0,
|
|
if_within_targets_fovx_by_angle(60, /*goto*/ 0x16)
|
|
goto_next(0x68)
|
|
|
|
label(0x16)
|
|
dprint 'A','M','B','U','S','H',' ','F','A','I','L','E','D','4','\n',0,
|
|
if_self_flag_bankx_eq(CHRFLAG0_00000010, TRUE, BANK_0, /*goto*/ 0x16)
|
|
goto_next(0x5b)
|
|
|
|
label(0x16)
|
|
if_self_flag_bankx_eq(CHRFLAG0_00000080, TRUE, BANK_0, /*goto*/ 0x13)
|
|
call_rng
|
|
if_rand_gt(100, /*goto*/ 0x13)
|
|
if_within_targets_fovx_by_angle(30, /*goto*/ 0x16)
|
|
label(0x13)
|
|
if_nearly_in_targets_sight(30, /*goto*/ 0x5f)
|
|
label(0x16)
|
|
if_nearly_in_targets_sight(30, /*goto*/ 0x16)
|
|
if_player_using_cmp150_or_ar34(/*goto*/ 0x69)
|
|
if_distance_to_target_gt(2000, /*goto*/ 0x61)
|
|
goto_next(0x16)
|
|
|
|
label(0x69)
|
|
if_distance_to_target_gt(4000, /*goto*/ 0x61)
|
|
label(0x16)
|
|
dprint 'O','K','F','O','R','C','O','V','E','R','\n',0,
|
|
if_can_see_attack_target(/*goto*/ 0x5b)
|
|
if_nearly_in_targets_sight(30, /*goto*/ 0x5b)
|
|
if_chr_in_view(/*goto*/ 0x5b)
|
|
goto_next(0x56)
|
|
|
|
label(0x5b)
|
|
dprint 'C','O','V','E','R',' ','I','N','V','A','L','I','D','\n',0,
|
|
if_self_flag_bankx_eq(CHRFLAG1_00004000, TRUE, BANK_1, /*goto*/ 0x15)
|
|
if_self_flag_bankx_eq(CHRFLAG0_00000040, TRUE, BANK_0, /*goto*/ 0x16)
|
|
if_self_flag_bankx_eq(CHRFLAG0_08000000, FALSE, BANK_0, /*goto*/ 0x5c)
|
|
cmd0121_if_something(0x10b5, /*goto*/ 0x53)
|
|
goto_next(0x14)
|
|
|
|
label(0x5c)
|
|
cmd0121_if_something(0x1035, /*goto*/ 0x53)
|
|
goto_next(0x14)
|
|
|
|
label(0x16)
|
|
cmd0121_if_something(0x0035, /*goto*/ 0x53)
|
|
goto_next(0x14)
|
|
|
|
label(0x15)
|
|
dprint 'S','O','F','T',' ','C','O','V','E','R','\n',0,
|
|
if_self_flag_bankx_eq(CHRFLAG0_00000040, TRUE, BANK_0, /*goto*/ 0x16)
|
|
if_self_flag_bankx_eq(CHRFLAG0_08000000, FALSE, BANK_0, /*goto*/ 0x5c)
|
|
cmd0121_if_something(0x90b5, /*goto*/ 0x53)
|
|
goto_next(0x14)
|
|
|
|
label(0x5c)
|
|
cmd0121_if_something(0x9035, /*goto*/ 0x53)
|
|
goto_next(0x14)
|
|
|
|
label(0x16)
|
|
cmd0121_if_something(0x8035, /*goto*/ 0x53)
|
|
goto_next(0x14)
|
|
|
|
label(0x14)
|
|
goto_next(0x54)
|
|
|
|
label(0x53)
|
|
dprint 'G','O',' ','T','O',' ','C','O','V','E','R','\n',0,
|
|
set_action(MA_COVERGOTO, FALSE)
|
|
unset_self_flag_bankx(CHRFLAG1_00040000, BANK_1)
|
|
unset_self_flag_bankx(CHRFLAG1_00020000, BANK_1)
|
|
if_self_flag_bankx_eq(CHRFLAG0_CAN_FLANK, FALSE, BANK_0, /*goto*/ 0x16)
|
|
set_team_orders(MA_SHOOTING, /*goto*/ 0x16)
|
|
label(0x16)
|
|
say_quip(CHR_BOND, QUIP_GOTOCOVER1, 0xff, 0x02, 0x01, BANK_0, 0x00, 0x00)
|
|
restart_timer
|
|
go_to_cover(SPEED_RUN)
|
|
|
|
beginloop(0x55)
|
|
if_dangerous_object_nearby(3, /*goto*/ LABEL_FLEE_GRENADE)
|
|
if_chr_has_hiddenflag(CHR_TARGET, CHRHFLAG_CLOAKED, /*goto*/ LABEL_CLOAKED)
|
|
if_self_flag_bankx_eq(CHRFLAG1_00001000, TRUE, BANK_1, /*goto*/ 0x13)
|
|
if_self_flag_bankx_eq(CHRFLAG1_00000001, TRUE, BANK_1, /*goto*/ 0x16)
|
|
if_distance_to_target_lt(120, /*goto*/ 0x16)
|
|
call_rng
|
|
if_rand_lt(128, /*goto*/ 0x13)
|
|
if_distance_to_target_gt(250, /*goto*/ 0x13)
|
|
label(0x16)
|
|
if_can_see_attack_target(/*goto*/ 0x16)
|
|
goto_next(0x13)
|
|
|
|
label(0x16)
|
|
set_returnlist(CHR_SELF, GAILIST_ALERTED)
|
|
set_ailist(CHR_SELF, GAILIST_HAND_COMBAT)
|
|
|
|
label(0x13)
|
|
if_timer_gt(300, /*goto*/ 0x56)
|
|
if_chr_stopped(/*goto*/ 0x56)
|
|
endloop(0x55)
|
|
|
|
label(0x56)
|
|
set_self_flag_bankx(CHRFLAG0_00000010, BANK_0)
|
|
dprint 'U','N','D','E','R',' ','C','O','V','E','R','\n',0,
|
|
label(0x58)
|
|
set_chrpreset(CHR_TARGET)
|
|
restart_timer
|
|
set_action(MA_COVERWAIT, TRUE)
|
|
unset_self_flag_bankx(CHRFLAG1_00040000, BANK_1)
|
|
unset_self_flag_bankx(CHRFLAG1_00020000, BANK_1)
|
|
if_chr_has_hiddenflag(CHR_TARGET, CHRHFLAG_CLOAKED, /*goto*/ LABEL_CLOAKED)
|
|
try_attack_kneel(ENTITYTYPE_TARGET | ENTITYTYPE_AIMONLY, 0, /*goto*/ 0x59)
|
|
|
|
beginloop(0x59)
|
|
if_dangerous_object_nearby(3, /*goto*/ LABEL_FLEE_GRENADE)
|
|
chr_toggle_p1p2(CHR_SELF)
|
|
set_target_chr(CHR_P1P2)
|
|
if_nearly_in_targets_sight(30, /*goto*/ 0x5f)
|
|
if_timer_gt(240, /*goto*/ 0x61)
|
|
if_self_flag_bankx_eq(CHRFLAG0_CAN_FLANK, FALSE, BANK_0, /*goto*/ 0x93)
|
|
if_has_orders(/*goto*/ 0x84)
|
|
label(0x93)
|
|
label(0x5a)
|
|
endloop(0x59)
|
|
|
|
label(0x61)
|
|
set_target_chr(CHR_PRESET)
|
|
dprint 'B','R','E','A','K',' ','C','O','V','E','R','\n',0,
|
|
if_self_flag_bankx_eq(CHRFLAG0_00008000, TRUE, BANK_0, /*goto*/ 0x66)
|
|
label(0x16)
|
|
goto_next(0x16)
|
|
|
|
label(0x66)
|
|
if_player_using_cmp150_or_ar34(/*goto*/ 0x69)
|
|
if_distance_to_target_gt(2000, /*goto*/ 0x16)
|
|
goto_next(0x6a)
|
|
|
|
label(0x69)
|
|
if_distance_to_target_gt(4000, /*goto*/ 0x16)
|
|
label(0x6a)
|
|
if_within_targets_fovx_by_angle(17, /*goto*/ 0x63)
|
|
label(0x16)
|
|
label(0x64)
|
|
set_action(MA_COVERBREAK, FALSE)
|
|
unset_self_flag_bankx(CHRFLAG1_00040000, BANK_1)
|
|
unset_self_flag_bankx(CHRFLAG1_00020000, BANK_1)
|
|
if_self_flag_bankx_eq(CHRFLAG0_CAN_FLANK, FALSE, BANK_0, /*goto*/ 0x16)
|
|
set_team_orders(MA_COVERBREAK, /*goto*/ 0x16)
|
|
label(0x16)
|
|
cmd012f
|
|
restart_timer
|
|
try_run_to_target(/*goto*/ 0x62)
|
|
|
|
beginloop(0x62)
|
|
if_dangerous_object_nearby(3, /*goto*/ LABEL_FLEE_GRENADE)
|
|
if_can_see_attack_target(/*goto*/ 0x5f)
|
|
if_player_using_cmp150_or_ar34(/*goto*/ 0x69)
|
|
if_distance_to_target_gt(2000, /*goto*/ 0x65)
|
|
goto_next(0x16)
|
|
|
|
label(0x69)
|
|
if_distance_to_target_gt(4000, /*goto*/ 0x65)
|
|
label(0x16)
|
|
if_timer_gt(120, /*goto*/ 0x63)
|
|
label(0x65)
|
|
endloop(0x62)
|
|
|
|
label(0x63)
|
|
if_self_flag_bankx_eq(CHRFLAG0_00008000, FALSE, BANK_0, /*goto*/ 0x13)
|
|
if_within_targets_fovx_by_angle(17, /*goto*/ 0x16)
|
|
goto_first(0x64)
|
|
|
|
label(0x13)
|
|
set_self_flag_bankx(CHRFLAG1_01000000, BANK_1)
|
|
goto_next(LABEL_TRACK)
|
|
|
|
label(0x16)
|
|
stop_chr
|
|
yield
|
|
if_dangerous_object_nearby(3, /*goto*/ LABEL_FLEE_GRENADE)
|
|
dprint 'B','A','C','K',' ','T','O',' ','C','O','V','E','R','\n',0,
|
|
goto_first(0x52)
|
|
|
|
label(0x5f)
|
|
cmd012f
|
|
dprint 'S','E','E','C','O','V','E','R','\n',0,
|
|
set_action(MA_COVERSEEN, FALSE)
|
|
unset_self_flag_bankx(CHRFLAG1_00040000, BANK_1)
|
|
unset_self_flag_bankx(CHRFLAG1_00020000, BANK_1)
|
|
if_self_flag_bankx_eq(CHRFLAG0_CAN_FLANK, FALSE, BANK_0, /*goto*/ 0x16)
|
|
set_team_orders(MA_COVERSEEN, /*goto*/ 0x16)
|
|
label(0x16)
|
|
if_self_flag_bankx_eq(CHRFLAG0_CAN_FLANK, FALSE, BANK_0, /*goto*/ 0x93)
|
|
if_has_orders(/*goto*/ 0x84)
|
|
label(0x93)
|
|
if_can_see_attack_target(/*goto*/ 0x26)
|
|
goto_next(0x87)
|
|
|
|
if_chr_has_hiddenflag(CHR_TARGET, CHRHFLAG_CLOAKED, /*goto*/ LABEL_CLOAKED)
|
|
if_self_flag_bankx_eq(CHRFLAG1_00001000, TRUE, BANK_1, /*goto*/ 0x13)
|
|
if_self_flag_bankx_eq(CHRFLAG1_00000001, TRUE, BANK_1, /*goto*/ 0x16)
|
|
if_distance_to_target_lt(120, /*goto*/ 0x16)
|
|
call_rng
|
|
if_rand_lt(128, /*goto*/ 0x13)
|
|
if_distance_to_target_gt(250, /*goto*/ 0x13)
|
|
label(0x16)
|
|
if_can_see_attack_target(/*goto*/ 0x16)
|
|
goto_next(0x13)
|
|
|
|
label(0x16)
|
|
set_returnlist(CHR_SELF, GAILIST_ALERTED)
|
|
set_ailist(CHR_SELF, GAILIST_HAND_COMBAT)
|
|
|
|
label(0x13)
|
|
if_self_flag_bankx_eq(CHRFLAG1_00002000, FALSE, BANK_1, /*goto*/ 0x13)
|
|
unset_self_flag_bankx(CHRFLAG1_00002000, BANK_1)
|
|
goto_next(0x48)
|
|
|
|
label(0x13)
|
|
if_chr_has_hiddenflag(CHR_TARGET, CHRHFLAG_CLOAKED, /*goto*/ LABEL_CLOAKED)
|
|
call_rng
|
|
if_rand_lt(10, /*goto*/ 0x57)
|
|
if_rand_gt(64, /*goto*/ 0x16)
|
|
if_self_flag_bankx_eq(CHRFLAG1_00000010, FALSE, BANK_1, /*goto*/ 0x13)
|
|
try_attack_amount(90, 100)
|
|
set_self_flag_bankx(CHRFLAG1_00000020, BANK_1)
|
|
goto_next(0x60)
|
|
|
|
label(0x13)
|
|
if_self_flag_bankx_eq(CHRFLAG1_00000004, FALSE, BANK_1, /*goto*/ 0x13)
|
|
try_attack_amount(20, 30)
|
|
goto_next(0x60)
|
|
|
|
label(0x13)
|
|
label(0x16)
|
|
call_rng
|
|
if_rand_gt(50, /*goto*/ 0x13)
|
|
call_rng
|
|
if_rand_gt(128, /*goto*/ 0x16)
|
|
label(0xbe)
|
|
try_attack_roll(/*goto*/ 0x60)
|
|
label(0x16)
|
|
try_attack_walk(/*goto*/ 0x60)
|
|
label(0x13)
|
|
call_rng
|
|
if_rand_gt(128, /*goto*/ 0x8c)
|
|
try_attack_kneel(ENTITYTYPE_TARGET | ENTITYTYPE_AIMONLY, 0, /*goto*/ 0x16)
|
|
label(0x8c)
|
|
try_attack_stand(ENTITYTYPE_TARGET | ENTITYTYPE_AIMONLY, 0, /*goto*/ 0x16)
|
|
label(0x16)
|
|
try_modify_attack(ENTITYTYPE_TARGET, 0, /*goto*/ 0x60)
|
|
|
|
beginloop(0x60)
|
|
if_dangerous_object_nearby(3, /*goto*/ LABEL_FLEE_GRENADE)
|
|
if_chr_stopped(/*goto*/ 0x5e)
|
|
endloop(0x60)
|
|
|
|
label(0x57)
|
|
say_quip(CHR_BOND, QUIP_GUNJAMMED, 0xfe, 0x03, 0xff, BANK_0, 0x00, 0x00)
|
|
do_preset_animation(-2)
|
|
goto_next(0xe8)
|
|
|
|
label(0x5e)
|
|
call_rng
|
|
if_rand_lt(20, /*goto*/ 0x16)
|
|
if_self_flag_bankx_eq(CHRFLAG1_00000020, FALSE, BANK_1, /*goto*/ 0x13)
|
|
label(0x16)
|
|
set_self_flag_bankx(CHRFLAG1_00000020, BANK_1)
|
|
restart_timer
|
|
chr_do_animation(ANIM_RELOAD_0209, 0, -1, 0x10, 0x10, CHR_SELF, 2)
|
|
|
|
beginloop(0xe8)
|
|
if_self_flag_bankx_eq(CHRFLAG1_00000020, FALSE, BANK_1, /*goto*/ 0x16)
|
|
if_timer_lt(120, /*goto*/ 0x16)
|
|
assign_sound(0x80f6, CHANNEL_7)
|
|
play_sound_from_entity(CHANNEL_7, CHR_SELF, 0x0bb8, 0x1770, 0x01)
|
|
unset_self_flag_bankx(CHRFLAG1_00000020, BANK_1)
|
|
label(0x16)
|
|
if_chr_stopped(/*goto*/ 0x13)
|
|
endloop(0xe8)
|
|
|
|
label(0x13)
|
|
if_self_flag_bankx_eq(CHRFLAG0_01000000, FALSE, BANK_0, /*goto*/ 0x13)
|
|
unset_self_flag_bankx(CHRFLAG0_01000000, BANK_0)
|
|
set_accuracy(0)
|
|
label(0x13)
|
|
check_cover_out_of_sight(/*goto*/ 0x16)
|
|
label(0x16)
|
|
goto_first(0x1b)
|
|
|
|
label(0x54)
|
|
dprint 'N','O',' ','C','O','V','E','R','A','V','A','I','L','A','B','L','E','\n',0,
|
|
label(0x68)
|
|
if_can_see_attack_target(/*goto*/ 0x24)
|
|
goto_next(0x25)
|
|
|
|
label(0x25)
|
|
dprint 'H','E','C','A','N','T',' ','S','E','E',' ','M','E','\n',0,
|
|
goto_next(0x2f)
|
|
|
|
label(0x24)
|
|
label(0x4e)
|
|
if_self_flag_bankx_eq(CHRFLAG0_CAN_RETREAT, FALSE, BANK_0, /*goto*/ 0x16)
|
|
if_self_flag_bankx_eq(CHRFLAG0_CANT_ALERT_GROUP, TRUE, BANK_0, /*goto*/ LABEL_RETREAT)
|
|
if_num_times_shot_lt(1, /*goto*/ 0x16)
|
|
if_retreat_risk_lt(3, /*goto*/ LABEL_RETREAT)
|
|
label(0x16)
|
|
if_self_flag_bankx_eq(CHRFLAG0_00004000, TRUE, BANK_0, /*goto*/ 0x91)
|
|
if_self_flag_bankx_eq(CHRFLAG0_00002000, TRUE, BANK_0, /*goto*/ 0x4d)
|
|
label(0x91)
|
|
if_retreat_risk_lt(5, /*goto*/ 0x32)
|
|
goto_next(0x4d)
|
|
|
|
label(0x4d)
|
|
if_self_flag_bankx_eq(CHRFLAG1_00040000, TRUE, BANK_1, /*goto*/ 0x32)
|
|
call_rng
|
|
if_within_targets_fovx_by_angle(30, /*goto*/ 0x16)
|
|
goto_next(0x32)
|
|
|
|
label(0x16)
|
|
if_rand_lt(128, /*goto*/ 0x32)
|
|
label(0x31)
|
|
dprint 'F','L','A','N','K','\n',0,
|
|
label(0x16)
|
|
label(0x13)
|
|
dprint 'F','L','A','N','K',' ','B','E','S','T','\n',0,
|
|
unset_self_flag_bankx(CHRFLAG1_00020000, BANK_1)
|
|
cmd0139(25, 0x02, TRUE)
|
|
if_self_flag_bankx_eq(CHRFLAG0_CAN_FLANK, FALSE, BANK_0, /*goto*/ 0x16)
|
|
set_team_orders(MA_FLANKLEFT, /*goto*/ 0x16)
|
|
set_team_orders(MA_FLANKRIGHT, /*goto*/ 0x16)
|
|
label(0x16)
|
|
goto_next(0x33)
|
|
|
|
label(LABEL_FLANK_LEFT)
|
|
dprint 'F','L','A','N','K',' ','L','E','F','T','\n',0,
|
|
set_action(MA_FLANKLEFT, FALSE)
|
|
cmd0139(335, 0x02, FALSE)
|
|
if_self_flag_bankx_eq(CHRFLAG0_CAN_FLANK, FALSE, BANK_0, /*goto*/ 0x16)
|
|
set_team_orders(MA_FLANKLEFT, /*goto*/ 0x16)
|
|
label(0x16)
|
|
goto_next(0x33)
|
|
|
|
label(LABEL_FLANK_RIGHT)
|
|
dprint 'F','L','A','N','K',' ','R','I','G','H','T','\n',0,
|
|
set_action(MA_FLANKRIGHT, FALSE)
|
|
if_self_flag_bankx_eq(CHRFLAG0_CAN_FLANK, FALSE, BANK_0, /*goto*/ 0x16)
|
|
set_team_orders(MA_FLANKRIGHT, /*goto*/ 0x16)
|
|
label(0x16)
|
|
cmd0139(25, 0x02, FALSE)
|
|
label(0x33)
|
|
set_self_flag_bankx(CHRFLAG1_00040000, BANK_1)
|
|
restart_timer
|
|
|
|
beginloop(0x30)
|
|
if_dangerous_object_nearby(3, /*goto*/ LABEL_FLEE_GRENADE)
|
|
if_chr_has_hiddenflag(CHR_TARGET, CHRHFLAG_CLOAKED, /*goto*/ LABEL_CLOAKED)
|
|
if_self_flag_bankx_eq(CHRFLAG1_00001000, TRUE, BANK_1, /*goto*/ 0x13)
|
|
if_self_flag_bankx_eq(CHRFLAG1_00000001, TRUE, BANK_1, /*goto*/ 0x16)
|
|
if_distance_to_target_lt(120, /*goto*/ 0x16)
|
|
call_rng
|
|
if_rand_lt(128, /*goto*/ 0x13)
|
|
if_distance_to_target_gt(250, /*goto*/ 0x13)
|
|
label(0x16)
|
|
if_can_see_attack_target(/*goto*/ 0x16)
|
|
goto_next(0x13)
|
|
|
|
label(0x16)
|
|
set_returnlist(CHR_SELF, GAILIST_ALERTED)
|
|
set_ailist(CHR_SELF, GAILIST_HAND_COMBAT)
|
|
|
|
label(0x13)
|
|
if_chr_stopped(/*goto*/ 0x32)
|
|
if_timer_gt(180, /*goto*/ 0x32)
|
|
endloop(0x30)
|
|
|
|
// Unreachable - no label
|
|
goto_next(0x2f)
|
|
if_self_flag_bankx_eq(CHRFLAG1_00020000, TRUE, BANK_1, /*goto*/ 0x2f)
|
|
|
|
label(0x32)
|
|
if_within_targets_fovx_by_angle(20, /*goto*/ 0x16)
|
|
goto_next(0x2f)
|
|
|
|
label(0x16)
|
|
call_rng
|
|
if_rand_gt(100, /*goto*/ 0x2f)
|
|
if_chr_in_view(/*goto*/ 0x18)
|
|
label(0x2f)
|
|
dprint 'C',' ','1','\n',0,
|
|
if_distance_to_target_gt(1300, /*goto*/ LABEL_TRACK)
|
|
if_can_see_attack_target(/*goto*/ 0x26)
|
|
dprint 'C',' ','2','\n',0,
|
|
if_self_flag_bankx_eq(CHRFLAG0_CAN_RETREAT, FALSE, BANK_0, /*goto*/ 0x16)
|
|
if_self_flag_bankx_eq(CHRFLAG0_CANT_ALERT_GROUP, TRUE, BANK_0, /*goto*/ LABEL_RETREAT)
|
|
if_num_times_shot_lt(1, /*goto*/ 0x16)
|
|
if_retreat_risk_lt(3, /*goto*/ LABEL_RETREAT)
|
|
label(0x16)
|
|
if_self_flag_bankx_eq(CHRFLAG0_00004000, TRUE, BANK_0, /*goto*/ 0x91)
|
|
if_self_flag_bankx_eq(CHRFLAG0_00002000, TRUE, BANK_0, /*goto*/ 0x4d)
|
|
label(0x91)
|
|
if_retreat_risk_lt(5, /*goto*/ 0x51)
|
|
label(0x4d)
|
|
dprint 'C',' ','3','\n',0,
|
|
if_self_flag_bankx_eq(CHRFLAG0_00008000, TRUE, BANK_0, /*goto*/ 0x48)
|
|
goto_next(LABEL_TRACK)
|
|
|
|
label(0x51)
|
|
if_within_targets_fovx_by_angle(21, /*goto*/ 0x16)
|
|
goto_next(LABEL_TRACK)
|
|
|
|
//
|
|
// GRENADE THROWING
|
|
//
|
|
label(0x16)
|
|
dprint 'C',' ','4','\n',0,
|
|
kneel
|
|
yield
|
|
if_dangerous_object_nearby(3, /*goto*/ LABEL_FLEE_GRENADE)
|
|
label(0x48)
|
|
dprint 'G','R','E','N','A','D','E','P','\n',0,
|
|
set_grenade_probability_out_of_255(255)
|
|
label(0x16)
|
|
if_self_flag_bankx_eq(CHRFLAG0_CAN_THROW_GRENADES, TRUE, BANK_0, /*goto*/ 0x16)
|
|
goto_next(0x4c)
|
|
|
|
label(0x16)
|
|
if_distance_to_target_lt(500, /*goto*/ 0x4c)
|
|
dprint 'G','R','E','N','A','D','E','\n',0,
|
|
restart_timer
|
|
if_chr_in_squadron_doing_action(MA_GRENADE, /*goto*/ 0x4c)
|
|
dprint 'A','C','T','I','O','N',' ','G','R','E','N','A','D','E','\n',0,
|
|
set_action(MA_GRENADE, FALSE)
|
|
unset_self_flag_bankx(CHRFLAG1_00040000, BANK_1)
|
|
unset_self_flag_bankx(CHRFLAG1_00020000, BANK_1)
|
|
consider_throwing_grenade(0x0200, 0x0000, /*goto*/ 0x46)
|
|
goto_next(0x4c)
|
|
|
|
dprint 'G','R','E','N','A','D','E','F','A','I','L','\n',0,
|
|
|
|
beginloop(0x46)
|
|
if_chr_stopped(/*goto*/ 0x16)
|
|
endloop(0x46)
|
|
|
|
label(0x16)
|
|
if_self_flag_bankx_eq(CHRFLAG0_CAN_FLANK, FALSE, BANK_0, /*goto*/ 0x47)
|
|
set_team_orders(MA_GRENADE, /*goto*/ 0x47)
|
|
|
|
beginloop(0x47)
|
|
say_quip(CHR_BOND, QUIP_GRENADE2, 0xff, 0x07, 0x00, BANK_0, 0x00, 0x00)
|
|
if_chr_stopped(/*goto*/ 0x4a)
|
|
endloop(0x47)
|
|
|
|
label(0x4a)
|
|
if_timer_lt(60, /*goto*/ 0x49)
|
|
dprint 'G','R','E','N','A','D','E','S','T','O','P','\n',0,
|
|
set_action(MA_GRENADEWAIT, FALSE)
|
|
unset_self_flag_bankx(CHRFLAG1_00040000, BANK_1)
|
|
unset_self_flag_bankx(CHRFLAG1_00020000, BANK_1)
|
|
restart_timer
|
|
try_face_entity(ENTITYTYPE_TARGET, 0, /*goto*/ 0x4b)
|
|
|
|
beginloop(0x4b)
|
|
if_nearly_in_targets_sight(30, /*goto*/ 0x42)
|
|
if_chr_in_view(/*goto*/ 0x42)
|
|
if_chr_target_eq(CHR_SELF, CHR_P1P2, FALSE, /*goto*/ 0xee)
|
|
goto_next(0xef)
|
|
|
|
label(0xee)
|
|
chr_toggle_p1p2(CHR_SELF)
|
|
if_chr_target_eq(CHR_SELF, CHR_P1P2, FALSE, /*goto*/ 0xee)
|
|
set_target_chr(CHR_P1P2)
|
|
if_nearly_in_targets_sight(30, /*goto*/ 0x42)
|
|
if_chr_in_view(/*goto*/ 0x42)
|
|
label(0xee)
|
|
chr_toggle_p1p2(CHR_SELF)
|
|
set_target_chr(CHR_P1P2)
|
|
label(0xef)
|
|
if_timer_gt(240, /*goto*/ 0x49)
|
|
endloop(0x4b)
|
|
|
|
label(0x49)
|
|
label(0x4c)
|
|
restart_timer
|
|
dprint 'W','A','I','T','I','N','G','\n',0,
|
|
set_action(MA_WAITING, TRUE)
|
|
unset_self_flag_bankx(CHRFLAG1_00040000, BANK_1)
|
|
unset_self_flag_bankx(CHRFLAG1_00020000, BANK_1)
|
|
if_chr_has_hiddenflag(CHR_TARGET, CHRHFLAG_CLOAKED, /*goto*/ LABEL_CLOAKED)
|
|
try_attack_kneel(ENTITYTYPE_TARGET | ENTITYTYPE_AIMONLY, 0, /*goto*/ 0x40)
|
|
|
|
beginloop(0x40)
|
|
if_dangerous_object_nearby(3, /*goto*/ LABEL_FLEE_GRENADE)
|
|
if_self_flag_bankx_eq(CHRFLAG0_00004000, TRUE, BANK_0, /*goto*/ 0x91)
|
|
if_self_flag_bankx_eq(CHRFLAG0_00002000, TRUE, BANK_0, /*goto*/ 0x16)
|
|
label(0x91)
|
|
if_retreat_risk_lt(5, /*goto*/ 0x41)
|
|
label(0x16)
|
|
if_self_flag_bankx_eq(CHRFLAG0_CAN_FLANK, FALSE, BANK_0, /*goto*/ 0x93)
|
|
if_has_orders(/*goto*/ 0x84)
|
|
label(0x93)
|
|
if_nearly_in_targets_sight(30, /*goto*/ 0x42)
|
|
if_chr_target_eq(CHR_SELF, CHR_P1P2, FALSE, /*goto*/ 0xee)
|
|
goto_next(0xef)
|
|
label(0xee)
|
|
chr_toggle_p1p2(CHR_SELF)
|
|
if_chr_target_eq(CHR_SELF, CHR_P1P2, FALSE, /*goto*/ 0xee)
|
|
set_target_chr(CHR_P1P2)
|
|
if_nearly_in_targets_sight(30, /*goto*/ 0x42)
|
|
label(0xee)
|
|
chr_toggle_p1p2(CHR_SELF)
|
|
set_target_chr(CHR_P1P2)
|
|
label(0xef)
|
|
if_timer_gt(600, /*goto*/ 0x3d)
|
|
if_timer_gt(60, /*goto*/ 0x16)
|
|
label(0x16)
|
|
if_within_targets_fovx_by_angle(21, /*goto*/ 0x16)
|
|
goto_next(LABEL_TRACK)
|
|
label(0x16)
|
|
if_distance_to_target_gt(2000, /*goto*/ 0x41)
|
|
endloop(0x40)
|
|
|
|
label(0x42)
|
|
dprint 'S','E','E','W','A','I','T','\n',0,
|
|
set_action(MA_WAITSEEN, FALSE)
|
|
unset_self_flag_bankx(CHRFLAG1_00040000, BANK_1)
|
|
unset_self_flag_bankx(CHRFLAG1_00020000, BANK_1)
|
|
dprint 'S','E','E','W','A','I','T','2','\n',0,
|
|
if_self_flag_bankx_eq(CHRFLAG0_CAN_FLANK, FALSE, BANK_0, /*goto*/ 0x16)
|
|
set_team_orders(MA_WAITSEEN, /*goto*/ 0x16)
|
|
label(0x16)
|
|
dprint 'S','E','E','W','A','I','T','3','\n',0,
|
|
if_can_see_attack_target(/*goto*/ 0x8a)
|
|
restart_timer
|
|
try_run_to_target(/*goto*/ 0x89)
|
|
|
|
beginloop(0x89)
|
|
if_dangerous_object_nearby(3, /*goto*/ LABEL_FLEE_GRENADE)
|
|
if_self_flag_bankx_eq(CHRFLAG0_00004000, TRUE, BANK_0, /*goto*/ 0x91)
|
|
if_self_flag_bankx_eq(CHRFLAG0_00002000, TRUE, BANK_0, /*goto*/ 0x16)
|
|
label(0x91)
|
|
if_retreat_risk_lt(5, /*goto*/ 0x41)
|
|
label(0x16)
|
|
if_can_see_attack_target(/*goto*/ 0x8a)
|
|
if_timer_gt(60, /*goto*/ 0x29)
|
|
endloop(0x89)
|
|
|
|
label(0x8a)
|
|
if_chr_has_hiddenflag(CHR_TARGET, CHRHFLAG_CLOAKED, /*goto*/ LABEL_CLOAKED)
|
|
if_self_flag_bankx_eq(CHRFLAG1_00001000, TRUE, BANK_1, /*goto*/ 0x13)
|
|
if_self_flag_bankx_eq(CHRFLAG1_00000001, TRUE, BANK_1, /*goto*/ 0x16)
|
|
if_distance_to_target_lt(120, /*goto*/ 0x16)
|
|
call_rng
|
|
if_rand_lt(128, /*goto*/ 0x13)
|
|
if_distance_to_target_gt(250, /*goto*/ 0x13)
|
|
label(0x16)
|
|
if_can_see_attack_target(/*goto*/ 0x16)
|
|
goto_next(0x13)
|
|
|
|
label(0x16)
|
|
set_returnlist(CHR_SELF, GAILIST_ALERTED)
|
|
set_ailist(CHR_SELF, GAILIST_HAND_COMBAT)
|
|
|
|
label(0x13)
|
|
if_self_flag_bankx_eq(CHRFLAG1_00002000, FALSE, BANK_1, /*goto*/ 0x13)
|
|
unset_self_flag_bankx(CHRFLAG1_00002000, BANK_1)
|
|
goto_first(0x48)
|
|
|
|
label(0x13)
|
|
if_chr_has_hiddenflag(CHR_TARGET, CHRHFLAG_CLOAKED, /*goto*/ LABEL_CLOAKED)
|
|
call_rng
|
|
if_rand_lt(10, /*goto*/ 0x57)
|
|
if_rand_gt(64, /*goto*/ 0x16)
|
|
if_self_flag_bankx_eq(CHRFLAG1_00000010, FALSE, BANK_1, /*goto*/ 0x13)
|
|
try_attack_amount(90, 100)
|
|
set_self_flag_bankx(CHRFLAG1_00000020, BANK_1)
|
|
goto_next(0x43)
|
|
|
|
label(0x13)
|
|
if_self_flag_bankx_eq(CHRFLAG1_00000004, FALSE, BANK_1, /*goto*/ 0x13)
|
|
try_attack_amount(20, 30)
|
|
goto_next(0x43)
|
|
|
|
label(0x13)
|
|
label(0x16)
|
|
call_rng
|
|
if_rand_gt(50, /*goto*/ 0x13)
|
|
call_rng
|
|
if_rand_gt(128, /*goto*/ 0x16)
|
|
label(0xbe)
|
|
try_attack_roll(/*goto*/ 0x43)
|
|
label(0x16)
|
|
try_attack_walk(/*goto*/ 0x43)
|
|
label(0x13)
|
|
call_rng
|
|
if_rand_gt(128, /*goto*/ 0x8c)
|
|
try_attack_stand(ENTITYTYPE_TARGET | ENTITYTYPE_AIMONLY, 0, /*goto*/ 0x16)
|
|
label(0x8c)
|
|
try_attack_kneel(ENTITYTYPE_TARGET | ENTITYTYPE_AIMONLY, 0, /*goto*/ 0x16)
|
|
label(0x16)
|
|
try_modify_attack(ENTITYTYPE_TARGET, 0, /*goto*/ 0x43)
|
|
|
|
beginloop(0x43)
|
|
if_dangerous_object_nearby(3, /*goto*/ LABEL_FLEE_GRENADE)
|
|
if_chr_stopped(/*goto*/ 0x29)
|
|
endloop(0x43)
|
|
|
|
label(0x57)
|
|
say_quip(CHR_BOND, QUIP_GUNJAMMED, 0xfe, 0x03, 0xff, BANK_0, 0x00, 0x00)
|
|
do_preset_animation(-2)
|
|
goto_next(0xe9)
|
|
|
|
label(0x29)
|
|
if_self_flag_bankx_eq(CHRFLAG0_01000000, FALSE, BANK_0, /*goto*/ 0x13)
|
|
unset_self_flag_bankx(CHRFLAG0_01000000, BANK_0)
|
|
set_accuracy(0)
|
|
label(0x13)
|
|
if_chr_injured_target(CHR_SELF, /*goto*/ 0x13)
|
|
say_quip(CHR_BOND, QUIP_MISSEDPLAYER1, 0x19, 0x03, 0x00, BANK_0, 0x00, 0x00)
|
|
say_quip(CHR_BOND, QUIP_MISSEDPLAYER2, 0x19, 0x03, 0x01, BANK_0, 0x00, 0x00)
|
|
goto_next(0x16)
|
|
|
|
label(0x13)
|
|
say_quip(CHR_BOND, QUIP_HITPLAYER, 0x19, 0x02, 0x00, BANK_0, 0x00, 0x00)
|
|
say_quip(CHR_BOND, QUIP_HITPLAYER, 0x19, 0x03, 0x01, BANK_0, 0x00, 0x00)
|
|
label(0x16)
|
|
call_rng
|
|
if_rand_lt(20, /*goto*/ 0x16)
|
|
if_self_flag_bankx_eq(CHRFLAG1_00000020, FALSE, BANK_1, /*goto*/ 0x13)
|
|
label(0x16)
|
|
set_self_flag_bankx(CHRFLAG1_00000020, BANK_1)
|
|
restart_timer
|
|
chr_do_animation(ANIM_RELOAD_0209, 0, -1, 0x10, 0x10, CHR_SELF, 2)
|
|
label(0xe9)
|
|
yield
|
|
if_self_flag_bankx_eq(CHRFLAG1_00000020, FALSE, BANK_1, /*goto*/ 0x16)
|
|
if_timer_lt(120, /*goto*/ 0x16)
|
|
assign_sound(0x80f6, CHANNEL_6)
|
|
play_sound_from_entity(CHANNEL_6, CHR_SELF, 0x0bb8, 0x1770, 0x01)
|
|
unset_self_flag_bankx(CHRFLAG1_00000020, BANK_1)
|
|
label(0x16)
|
|
if_chr_stopped(/*goto*/ 0x13)
|
|
goto_first(0xe9)
|
|
|
|
label(0x13)
|
|
label(0x8b)
|
|
dprint 'B','A','C','K','O','F','F','\n',0,
|
|
if_within_targets_fovx_by_angle(20, /*goto*/ 0x13)
|
|
goto_next(0x50)
|
|
|
|
label(0x13)
|
|
if_self_flag_bankx_eq(CHRFLAG0_CAN_BACKOFF, TRUE, BANK_0, /*goto*/ 0x16)
|
|
goto_next(0x50)
|
|
|
|
label(0x16)
|
|
set_action(MA_WITHDRAW, FALSE)
|
|
unset_self_flag_bankx(CHRFLAG1_00040000, BANK_1)
|
|
unset_self_flag_bankx(CHRFLAG1_00020000, BANK_1)
|
|
restart_timer
|
|
retreat(0x02, 0x01)
|
|
cmd012f
|
|
|
|
beginloop(0x4f)
|
|
if_dangerous_object_nearby(3, /*goto*/ LABEL_FLEE_GRENADE)
|
|
if_timer_gt(120, /*goto*/ 0x50)
|
|
if_chr_stopped(/*goto*/ 0x50)
|
|
endloop(0x4f)
|
|
|
|
label(0x50)
|
|
if_chr_has_hiddenflag(CHR_TARGET, CHRHFLAG_CLOAKED, /*goto*/ LABEL_CLOAKED)
|
|
if_self_flag_bankx_eq(CHRFLAG1_00001000, TRUE, BANK_1, /*goto*/ 0x13)
|
|
if_self_flag_bankx_eq(CHRFLAG1_00000001, TRUE, BANK_1, /*goto*/ 0x16)
|
|
if_distance_to_target_lt(120, /*goto*/ 0x16)
|
|
call_rng
|
|
if_rand_lt(128, /*goto*/ 0x13)
|
|
if_distance_to_target_gt(250, /*goto*/ 0x13)
|
|
label(0x16)
|
|
if_can_see_attack_target(/*goto*/ 0x16)
|
|
goto_next(0x13)
|
|
|
|
label(0x16)
|
|
set_returnlist(CHR_SELF, GAILIST_ALERTED)
|
|
set_ailist(CHR_SELF, GAILIST_HAND_COMBAT)
|
|
|
|
label(0x13)
|
|
if_dangerous_object_nearby(3, /*goto*/ LABEL_FLEE_GRENADE)
|
|
if_chr_has_hiddenflag(CHR_TARGET, CHRHFLAG_CLOAKED, /*goto*/ LABEL_CLOAKED)
|
|
goto_next(0x16)
|
|
|
|
label(0x13)
|
|
set_returnlist(CHR_SELF, GAILIST_ALERTED)
|
|
set_alertness(0)
|
|
set_ailist(CHR_SELF, GAILIST_SEARCH_FOR_PLAYER)
|
|
|
|
if_self_flag_bankx_eq(CHRFLAG0_04000000, TRUE, BANK_0, /*goto*/ 0x16)
|
|
call_rng
|
|
if_rand_gt(196, /*goto*/ 0x16)
|
|
goto_next(LABEL_TRACK)
|
|
|
|
label(0x16)
|
|
goto_first(0x1b)
|
|
|
|
label(0x3d)
|
|
dprint 'W','A','I','T','T','I','M','E','O','U','T','\n',0,
|
|
if_self_flag_bankx_eq(CHRFLAG0_CAN_TRAP, FALSE, BANK_0, /*goto*/ 0x13)
|
|
goto_first(0x1b)
|
|
|
|
label(0x13)
|
|
set_action(MA_WAITTIMEOUT, FALSE)
|
|
unset_self_flag_bankx(CHRFLAG1_00040000, BANK_1)
|
|
unset_self_flag_bankx(CHRFLAG1_00020000, BANK_1)
|
|
if_self_flag_bankx_eq(CHRFLAG0_CAN_FLANK, FALSE, BANK_0, /*goto*/ 0x16)
|
|
set_team_orders(MA_WAITTIMEOUT, /*goto*/ 0x16)
|
|
label(0x16)
|
|
goto_next(0x3f)
|
|
|
|
// Unreachable - no label
|
|
dprint 'W','A','I','T','M','O','V','E','\n',0,
|
|
try_run_sideways(/*goto*/ 0x3e)
|
|
|
|
beginloop(0x3e)
|
|
if_dangerous_object_nearby(3, /*goto*/ LABEL_FLEE_GRENADE)
|
|
if_chr_stopped(/*goto*/ 0x3f)
|
|
endloop(0x3e)
|
|
|
|
label(0x3f)
|
|
goto_first(0x1b)
|
|
|
|
label(0x41)
|
|
goto_first(0x1b)
|
|
|
|
label(LABEL_TRACK)
|
|
set_chrpreset(CHR_TARGET)
|
|
dprint 'T','R','A','C','K','\n',0,
|
|
set_action(MA_TRACKING, FALSE)
|
|
unset_self_flag_bankx(CHRFLAG1_00040000, BANK_1)
|
|
unset_self_flag_bankx(CHRFLAG1_00020000, BANK_1)
|
|
restart_timer
|
|
label(0xf7)
|
|
try_run_to_target(/*goto*/ 0x35)
|
|
|
|
beginloop(0x35)
|
|
if_chr_has_hiddenflag(CHR_SELF, CHRHFLAG_00002000, /*goto*/ 0x13)
|
|
if_chr_has_hiddenflag(CHR_TARGET, CHRHFLAG_UNTARGETABLE, /*goto*/ 0x01)
|
|
label(0x13)
|
|
if_dangerous_object_nearby(3, /*goto*/ LABEL_FLEE_GRENADE)
|
|
if_chr_has_hiddenflag(CHR_TARGET, CHRHFLAG_CLOAKED, /*goto*/ LABEL_CLOAKED)
|
|
if_self_flag_bankx_eq(CHRFLAG1_00001000, TRUE, BANK_1, /*goto*/ 0x13)
|
|
if_self_flag_bankx_eq(CHRFLAG1_00000001, TRUE, BANK_1, /*goto*/ 0x16)
|
|
if_distance_to_target_lt(120, /*goto*/ 0x16)
|
|
call_rng
|
|
if_rand_lt(128, /*goto*/ 0x13)
|
|
if_distance_to_target_gt(250, /*goto*/ 0x13)
|
|
label(0x16)
|
|
if_can_see_attack_target(/*goto*/ 0x16)
|
|
goto_next(0x13)
|
|
|
|
label(0x16)
|
|
set_returnlist(CHR_SELF, GAILIST_ALERTED)
|
|
set_ailist(CHR_SELF, GAILIST_HAND_COMBAT)
|
|
|
|
label(0x13)
|
|
chr_toggle_p1p2(CHR_SELF)
|
|
set_target_chr(CHR_P1P2)
|
|
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_within_targets_fovx_by_angle(21, /*goto*/ 0x3b)
|
|
goto_next(0x16)
|
|
|
|
label(0xc8)
|
|
unset_self_flag_bankx(CHRFLAG1_02000000, BANK_1)
|
|
goto_first(0x31)
|
|
|
|
label(0x16)
|
|
if_can_see_attack_target(/*goto*/ 0x26)
|
|
label(0x13)
|
|
dprint 'N','O','S','E','E','P','L','A','Y','E','R','\n',0,
|
|
if_self_flag_bankx_eq(CHRFLAG0_AIVSAI, FALSE, BANK_0, /*goto*/ 0x13)
|
|
if_enemy_distance_lt_and_los(2540, /*goto*/ 0x16)
|
|
goto_next(0x13)
|
|
|
|
label(0x16)
|
|
if_target_is_player(/*goto*/ 0x13)
|
|
set_returnlist(CHR_SELF, GAILIST_UNALERTED)
|
|
set_ailist(CHR_SELF, GAILIST_COMBAT_WITH_TARGET)
|
|
|
|
label(0x13)
|
|
if_distance_to_target_gt(1300, /*goto*/ 0x3c)
|
|
if_self_flag_bankx_eq(CHRFLAG0_CAN_RETREAT, FALSE, BANK_0, /*goto*/ 0x16)
|
|
if_self_flag_bankx_eq(CHRFLAG0_CANT_ALERT_GROUP, TRUE, BANK_0, /*goto*/ LABEL_RETREAT)
|
|
if_num_times_shot_lt(1, /*goto*/ 0x16)
|
|
if_retreat_risk_lt(3, /*goto*/ LABEL_RETREAT)
|
|
label(0x16)
|
|
if_self_flag_bankx_eq(CHRFLAG0_00004000, TRUE, BANK_0, /*goto*/ 0x91)
|
|
if_self_flag_bankx_eq(CHRFLAG0_00002000, TRUE, BANK_0, /*goto*/ 0x4d)
|
|
label(0x91)
|
|
if_retreat_risk_lt(5, /*goto*/ 0x39)
|
|
label(0x4d)
|
|
if_self_flag_bankx_eq(CHRFLAG0_00008000, TRUE, BANK_0, /*goto*/ 0x3a)
|
|
goto_next(0x3c)
|
|
|
|
label(0x39)
|
|
if_self_flag_bankx_eq(CHRFLAG1_01000000, TRUE, BANK_1, /*goto*/ 0x3c)
|
|
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_within_targets_fovx_by_angle(21, /*goto*/ 0x3b)
|
|
goto_next(0x3c)
|
|
|
|
label(0x3c)
|
|
dprint 'N','O','A','N','G','\n',0,
|
|
label(0x17)
|
|
if_chr_stopped(/*goto*/ 0x13)
|
|
if_timer_gt(600, /*goto*/ 0x36)
|
|
endloop(0x35)
|
|
|
|
label(0x13)
|
|
dprint 'C','O','M','P','L','E','T','E','D','\n',0,
|
|
set_target_chr(CHR_PRESET)
|
|
goto_first(0xf7)
|
|
|
|
label(0x36)
|
|
set_target_chr(CHR_PRESET)
|
|
dprint 'E','N','D',' ','T','R','A','C','K','\n',0,
|
|
set_alertness(0)
|
|
set_returnlist(CHR_SELF, GAILIST_ALERTED)
|
|
set_ailist(CHR_SELF, GAILIST_SEARCH_FOR_PLAYER)
|
|
goto_first(0x1b)
|
|
|
|
label(0x3b)
|
|
goto_first(0x1b)
|
|
|
|
label(0x37)
|
|
goto_first(0x1b)
|
|
|
|
//
|
|
// SYNC SHOOT
|
|
//
|
|
label(0x87)
|
|
dprint 'S','Y','N','C',' ','S','H','O','O','T','\n',0,
|
|
cmd012f
|
|
set_action(MA_SHOOTING, FALSE)
|
|
unset_self_flag_bankx(CHRFLAG1_00040000, BANK_1)
|
|
unset_self_flag_bankx(CHRFLAG1_00020000, BANK_1)
|
|
restart_timer
|
|
try_run_to_target(/*goto*/ 0x85)
|
|
|
|
beginloop(0x85)
|
|
if_dangerous_object_nearby(3, /*goto*/ LABEL_FLEE_GRENADE)
|
|
if_chr_has_hiddenflag(CHR_TARGET, CHRHFLAG_CLOAKED, /*goto*/ LABEL_CLOAKED)
|
|
if_self_flag_bankx_eq(CHRFLAG1_00001000, TRUE, BANK_1, /*goto*/ 0x13)
|
|
if_self_flag_bankx_eq(CHRFLAG1_00000001, TRUE, BANK_1, /*goto*/ 0x16)
|
|
if_distance_to_target_lt(120, /*goto*/ 0x16)
|
|
call_rng
|
|
if_rand_lt(128, /*goto*/ 0x13)
|
|
if_distance_to_target_gt(250, /*goto*/ 0x13)
|
|
label(0x16)
|
|
if_can_see_attack_target(/*goto*/ 0x16)
|
|
goto_next(0x13)
|
|
|
|
label(0x16)
|
|
set_returnlist(CHR_SELF, GAILIST_ALERTED)
|
|
set_ailist(CHR_SELF, GAILIST_HAND_COMBAT)
|
|
|
|
label(0x13)
|
|
if_can_see_attack_target(/*goto*/ 0x26)
|
|
if_timer_gt(120, /*goto*/ 0x86)
|
|
endloop(0x85)
|
|
|
|
label(0x86)
|
|
goto_first(0x1b)
|
|
|
|
label(0x26)
|
|
dprint 'I','C','A','N','S','E',' ','P','L','A','Y','E','R','\n',0,
|
|
if_chr_has_hiddenflag(CHR_TARGET, CHRHFLAG_CLOAKED, /*goto*/ LABEL_CLOAKED)
|
|
if_self_flag_bankx_eq(CHRFLAG1_00001000, TRUE, BANK_1, /*goto*/ 0x13)
|
|
if_self_flag_bankx_eq(CHRFLAG1_00000001, TRUE, BANK_1, /*goto*/ 0x16)
|
|
if_distance_to_target_lt(120, /*goto*/ 0x16)
|
|
call_rng
|
|
if_rand_lt(128, /*goto*/ 0x13)
|
|
if_distance_to_target_gt(250, /*goto*/ 0x13)
|
|
label(0x16)
|
|
if_can_see_attack_target(/*goto*/ 0x16)
|
|
goto_next(0x13)
|
|
|
|
label(0x16)
|
|
set_returnlist(CHR_SELF, GAILIST_ALERTED)
|
|
set_ailist(CHR_SELF, GAILIST_HAND_COMBAT)
|
|
|
|
label(0x13)
|
|
dprint 't','a','r','g','e','t','\n',0,
|
|
restart_timer
|
|
stop_chr
|
|
set_action(MA_SHOOTING, FALSE)
|
|
unset_self_flag_bankx(CHRFLAG1_00040000, BANK_1)
|
|
unset_self_flag_bankx(CHRFLAG1_00020000, BANK_1)
|
|
if_self_flag_bankx_eq(CHRFLAG1_00002000, FALSE, BANK_1, /*goto*/ 0x13)
|
|
unset_self_flag_bankx(CHRFLAG1_00002000, BANK_1)
|
|
goto_first(0x48)
|
|
|
|
label(0x13)
|
|
if_chr_has_hiddenflag(CHR_TARGET, CHRHFLAG_CLOAKED, /*goto*/ LABEL_CLOAKED)
|
|
call_rng
|
|
if_rand_lt(10, /*goto*/ 0x57)
|
|
if_rand_gt(64, /*goto*/ 0x16)
|
|
if_self_flag_bankx_eq(CHRFLAG1_00000010, FALSE, BANK_1, /*goto*/ 0x13)
|
|
try_attack_amount(90, 100)
|
|
set_self_flag_bankx(CHRFLAG1_00000020, BANK_1)
|
|
goto_next(0x44)
|
|
|
|
label(0x13)
|
|
if_self_flag_bankx_eq(CHRFLAG1_00000004, FALSE, BANK_1, /*goto*/ 0x13)
|
|
try_attack_amount(20, 30)
|
|
goto_next(0x44)
|
|
|
|
label(0x13)
|
|
label(0x16)
|
|
call_rng
|
|
if_rand_gt(50, /*goto*/ 0x13)
|
|
call_rng
|
|
if_rand_gt(128, /*goto*/ 0x16)
|
|
label(0xbe)
|
|
try_attack_roll(/*goto*/ 0x44)
|
|
label(0x16)
|
|
try_attack_walk(/*goto*/ 0x44)
|
|
label(0x13)
|
|
call_rng
|
|
if_rand_gt(128, /*goto*/ 0x8c)
|
|
try_attack_kneel(ENTITYTYPE_TARGET | ENTITYTYPE_AIMONLY, 0, /*goto*/ 0x28)
|
|
label(0x8c)
|
|
try_attack_stand(ENTITYTYPE_TARGET | ENTITYTYPE_AIMONLY, 0, /*goto*/ 0x28)
|
|
dprint 'S','H','O','O','T','F','A','I','L','E','D','\n',0,
|
|
yield
|
|
if_dangerous_object_nearby(3, /*goto*/ LABEL_FLEE_GRENADE)
|
|
goto_first(0x8b)
|
|
|
|
label(0x28)
|
|
try_modify_attack(ENTITYTYPE_TARGET, 0, /*goto*/ 0x44)
|
|
goto_next(0x67)
|
|
|
|
label(0x44)
|
|
say_quip(CHR_BOND, QUIP_ATTACK1, 0x19, 0x02, 0x00, BANK_0, 0x00, 0x00)
|
|
say_quip(CHR_BOND, QUIP_ATTACK2, 0x19, 0x02, 0x01, BANK_0, 0x00, 0x00)
|
|
|
|
beginloop(0x45)
|
|
if_dangerous_object_nearby(3, /*goto*/ LABEL_FLEE_GRENADE)
|
|
if_chr_stopped(/*goto*/ 0x2a)
|
|
endloop(0x45)
|
|
|
|
label(0x57)
|
|
say_quip(CHR_BOND, QUIP_GUNJAMMED, 0xfe, 0x03, 0xff, BANK_0, 0x00, 0x00)
|
|
do_preset_animation(-2)
|
|
goto_next(0xea)
|
|
label(0x2a)
|
|
if_self_flag_bankx_eq(CHRFLAG0_01000000, FALSE, BANK_0, /*goto*/ 0x13)
|
|
unset_self_flag_bankx(CHRFLAG0_01000000, BANK_0)
|
|
set_accuracy(0)
|
|
label(0x13)
|
|
if_chr_injured_target(CHR_SELF, /*goto*/ 0x13)
|
|
say_quip(CHR_BOND, QUIP_MISSEDPLAYER1, 0x19, 0x03, 0x00, BANK_0, 0x00, 0x00)
|
|
say_quip(CHR_BOND, QUIP_MISSEDPLAYER2, 0x19, 0x03, 0x01, BANK_0, 0x00, 0x00)
|
|
goto_next(0x16)
|
|
|
|
label(0x13)
|
|
say_quip(CHR_BOND, QUIP_HITPLAYER, 0x19, 0x02, 0x00, BANK_0, 0x00, 0x00)
|
|
say_quip(CHR_BOND, QUIP_HITPLAYER, 0x19, 0x03, 0x01, BANK_0, 0x00, 0x00)
|
|
label(0x16)
|
|
call_rng
|
|
if_rand_lt(20, /*goto*/ 0x16)
|
|
if_self_flag_bankx_eq(CHRFLAG1_00000020, FALSE, BANK_1, /*goto*/ 0x13)
|
|
label(0x16)
|
|
set_self_flag_bankx(CHRFLAG1_00000020, BANK_1)
|
|
restart_timer
|
|
chr_do_animation(ANIM_RELOAD_0209, 0, -1, 0x10, 0x10, CHR_SELF, 2)
|
|
label(0xea)
|
|
yield
|
|
if_self_flag_bankx_eq(CHRFLAG1_00000020, FALSE, BANK_1, /*goto*/ 0x16)
|
|
if_timer_lt(120, /*goto*/ 0x16)
|
|
assign_sound(0x80f6, CHANNEL_6)
|
|
play_sound_from_entity(CHANNEL_6, CHR_SELF, 0x0bb8, 0x1770, 0x01)
|
|
unset_self_flag_bankx(CHRFLAG1_00000020, BANK_1)
|
|
label(0x16)
|
|
if_chr_stopped(/*goto*/ 0x13)
|
|
goto_first(0xea)
|
|
|
|
label(0x13)
|
|
dprint 'L','E','F','T','S','H','O','O','T','\n',0,
|
|
goto_first(0x8b)
|
|
|
|
label(0x67)
|
|
dprint 'S','H','O','T','N','O','W','O','R','K','\n',0,
|
|
label(0x2b)
|
|
goto_first(0x8b)
|
|
|
|
//
|
|
// DODGE
|
|
//
|
|
label(0x18)
|
|
dprint 'D','o','d','g','e','\n',0,
|
|
set_action(MA_DODGE, FALSE)
|
|
unset_self_flag_bankx(CHRFLAG1_00040000, BANK_1)
|
|
set_self_flag_bankx(CHRFLAG1_00020000, BANK_1)
|
|
if_self_flag_bankx_eq(CHRFLAG0_CAN_FLANK, FALSE, BANK_0, /*goto*/ 0x16)
|
|
set_team_orders(MA_DODGE, /*goto*/ 0x16)
|
|
label(0x16)
|
|
call_rng
|
|
if_rand_lt(128, /*goto*/ 0x2d)
|
|
try_jumpout(/*goto*/ 0x13)
|
|
goto_next(0x2e)
|
|
|
|
label(0x2d)
|
|
try_sidestep(/*goto*/ 0x13)
|
|
goto_next(0x2e)
|
|
|
|
label(0x13)
|
|
set_self_flag_bankx(CHRFLAG1_00020000, BANK_1)
|
|
|
|
beginloop(0x2c)
|
|
if_dangerous_object_nearby(3, /*goto*/ LABEL_FLEE_GRENADE)
|
|
if_chr_stopped(/*goto*/ 0x2e)
|
|
endloop(0x2c)
|
|
|
|
label(0x2e)
|
|
dprint 'D','O','D','G','E',' ','D','O','N','E','\n',0,
|
|
call_rng
|
|
if_rand_lt(128, /*goto*/ 0x16)
|
|
goto_first(0x87)
|
|
|
|
label(0x16)
|
|
goto_first(0x1b)
|
|
|
|
//
|
|
// RETREAT
|
|
//
|
|
label(LABEL_RETREAT)
|
|
set_chr_dodge_rating(0, 0x00)
|
|
set_chr_dodge_rating(1, 0x00)
|
|
dprint 'R','O','U','T','E','D','\n',0,
|
|
set_action(MA_RETREAT, FALSE)
|
|
unset_self_flag_bankx(CHRFLAG1_00040000, BANK_1)
|
|
unset_self_flag_bankx(CHRFLAG1_00020000, BANK_1)
|
|
say_quip(CHR_BOND, QUIP_RETREAT1, 0x19, 0x02, 0x01, BANK_0, 0x00, 0x00)
|
|
try_set_chrpreset_to_unalerted_teammate(0, /*goto*/ 0x95)
|
|
if_self_flag_bankx_eq(CHRFLAG1_00000002, TRUE, BANK_1, /*goto*/ 0x16)
|
|
label(0x16)
|
|
if_self_flag_bankx_eq(CHRFLAG0_00200000, TRUE, BANK_0, /*goto*/ 0x16)
|
|
unset_self_flag_bankx(CHRFLAG0_CAN_RETREAT, BANK_0)
|
|
unset_self_flag_bankx(CHRFLAG0_CANT_ALERT_GROUP, BANK_0)
|
|
goto_first(0x1b)
|
|
|
|
//
|
|
// RUNNING
|
|
//
|
|
label(0x16)
|
|
dprint 'R','U','N','N','I','N','G','\n',0,
|
|
set_target_chr(CHR_P1P2)
|
|
retreat(0x02, 0x01)
|
|
|
|
beginloop(0x6c)
|
|
if_dangerous_object_nearby(3, /*goto*/ LABEL_FLEE_GRENADE)
|
|
if_distance_to_target_gt(300, /*goto*/ 0x16)
|
|
if_chr_in_view(/*goto*/ 0x70)
|
|
label(0x16)
|
|
if_distance_to_target_gt(3000, /*goto*/ 0x6d)
|
|
endloop(0x6c)
|
|
|
|
label(0x6d)
|
|
stop_chr
|
|
|
|
beginloop(0x6e)
|
|
if_dangerous_object_nearby(3, /*goto*/ LABEL_FLEE_GRENADE)
|
|
chr_toggle_p1p2(CHR_SELF)
|
|
set_target_chr(CHR_P1P2)
|
|
if_distance_to_target_lt(3000, /*goto*/ 0x6f)
|
|
endloop(0x6e)
|
|
|
|
label(0x6f)
|
|
goto_first(LABEL_RETREAT)
|
|
|
|
//
|
|
// SURRENDER
|
|
//
|
|
label(0x70)
|
|
if_chr_dead(CHR_SELF, /*goto*/ 0x88)
|
|
set_action(MA_SURRENDER, FALSE)
|
|
unset_self_flag_bankx(CHRFLAG1_00040000, BANK_1)
|
|
unset_self_flag_bankx(CHRFLAG1_00020000, BANK_1)
|
|
say_quip(CHR_BOND, QUIP_SURRENDER, 0xfe, 0x0a, 0xff, BANK_0, 0x00, 0x00)
|
|
restart_timer
|
|
surrender
|
|
|
|
beginloop(0x71)
|
|
if_chr_dead(CHR_SELF, /*goto*/ 0x88)
|
|
if_timer_gt(300, /*goto*/ 0x16)
|
|
chr_toggle_p1p2(CHR_SELF)
|
|
set_target_chr(CHR_P1P2)
|
|
if_chr_in_view(/*goto*/ 0x72)
|
|
if_bitcheck_in_prop_struct(/*goto*/ 0x13)
|
|
endloop(0x71)
|
|
|
|
// Out of view for 5 seconds - remove
|
|
label(0x16)
|
|
drop_concealed_items(CHR_SELF)
|
|
yield
|
|
remove_chr(CHR_SELF)
|
|
label(0x13)
|
|
restart_timer
|
|
goto_first(0x71)
|
|
|
|
label(0x72)
|
|
say_quip(CHR_BOND, QUIP_SURRENDER, 0x23, 0x0a, 0x00, BANK_0, 0x00, 0x00)
|
|
restart_timer
|
|
goto_first(0x71)
|
|
|
|
label(0x95)
|
|
unset_self_flag_bankx(CHRFLAG0_CAN_RETREAT, BANK_0)
|
|
unset_self_flag_bankx(CHRFLAG0_CANT_ALERT_GROUP, BANK_0)
|
|
try_run_to_chr(CHR_PRESET, /*goto*/ 0x96)
|
|
|
|
beginloop(0x96)
|
|
if_dangerous_object_nearby(3, /*goto*/ LABEL_FLEE_GRENADE)
|
|
if_chr_death_animation_finished(CHR_PRESET, /*goto*/ 0x84)
|
|
if_chr_knockedout(CHR_PRESET, /*goto*/ 0x84)
|
|
if_detected_chr(CHR_PRESET, /*goto*/ 0x97)
|
|
if_chr_stopped(/*goto*/ 0x97)
|
|
endloop(0x96)
|
|
|
|
label(0x97)
|
|
dprint 'W','A','R','N',' ','F','R','I','E','N','D','S','\n',0,
|
|
say_quip(CHR_BOND, QUIP_WARNFRIENDS, 0xff, 0x02, 0xff, BANK_0, 0x00, 0x00)
|
|
increase_squadron_alertness(100)
|
|
label(0x84)
|
|
goto_first(0x1b)
|
|
|
|
label(0x88)
|
|
set_ailist(CHR_SELF, GAILIST_IDLE)
|
|
|
|
//
|
|
// RUN FOR ALARM
|
|
//
|
|
label(LABEL_RUN_FOR_ALARM)
|
|
set_action(MA_GOTOALARM, FALSE)
|
|
unset_self_flag_bankx(CHRFLAG1_00040000, BANK_1)
|
|
unset_self_flag_bankx(CHRFLAG1_00020000, BANK_1)
|
|
say_quip(CHR_BOND, QUIP_GOFORALARM, 0xff, 0x03, 0xff, BANK_0, 0x00, 0x00)
|
|
go_to_target_pad(SPEED_JOG)
|
|
|
|
beginloop(0x9d)
|
|
if_dangerous_object_nearby(3, /*goto*/ LABEL_FLEE_GRENADE)
|
|
if_chr_stopped(/*goto*/ 0x16)
|
|
endloop(0x9d)
|
|
|
|
label(0x16)
|
|
chr_do_animation(ANIM_PUSH_BUTTON, 0, 193, 0x10, 0x10, CHR_SELF, 2)
|
|
restart_timer
|
|
|
|
beginloop(0xed)
|
|
if_timer_gt(70, /*goto*/ 0x16)
|
|
endloop(0xed)
|
|
|
|
label(0x16)
|
|
activate_alarm
|
|
|
|
beginloop(0x9e)
|
|
if_dangerous_object_nearby(3, /*goto*/ LABEL_FLEE_GRENADE)
|
|
if_chr_stopped(/*goto*/ 0x16)
|
|
endloop(0x9e)
|
|
|
|
label(0x16)
|
|
goto_first(0x1b)
|
|
|
|
//
|
|
// FLEE GRENADE
|
|
//
|
|
label(LABEL_FLEE_GRENADE)
|
|
set_returnlist(CHR_SELF, GAILIST_ALERTED)
|
|
set_ailist(CHR_SELF, GAILIST_FLEE_FROM_GRENADE)
|
|
|
|
//
|
|
// CLOAKED
|
|
//
|
|
label(LABEL_CLOAKED)
|
|
set_alertness(0)
|
|
set_returnlist(CHR_SELF, GAILIST_ALERTED)
|
|
set_ailist(CHR_SELF, GAILIST_SEARCH_FOR_PLAYER)
|
|
|
|
label(0x01)
|
|
set_chr_hiddenflag(CHR_SELF, CHRHFLAG_00002000)
|
|
stop_chr
|
|
if_chr_death_animation_finished(CHR_SELF, /*goto*/ 0x16)
|
|
if_chr_dead(CHR_SELF, /*goto*/ 0x16)
|
|
if_chr_knockedout(CHR_SELF, /*goto*/ 0x16)
|
|
if_can_see_target(/*goto*/ 0x13)
|
|
set_alertness(0)
|
|
set_self_flag_bankx(CHRFLAG1_10000000, BANK_1)
|
|
set_returnlist(CHR_SELF, GAILIST_UNALERTED)
|
|
set_ailist(CHR_SELF, GAILIST_SEARCH_FOR_PLAYER)
|
|
|
|
label(0x13)
|
|
set_ailist(CHR_SELF, GAILIST_ALERTED)
|
|
|
|
label(0x0a)
|
|
set_ailist(CHR_SELF, GAILIST_IDLE)
|
|
endlist
|
|
};
|
|
|
|
u8 func000a_do_idle_animation[] = {
|
|
set_chr_chrflag(CHR_SELF, CHRCFLAG_00000080)
|
|
if_chr_has_hiddenflag(CHR_SELF, CHRHFLAG_TRIGGER_BUDDY_WARP, /*goto*/ 0x13)
|
|
if_chr_idle_action_eq(IDLEACTION_SITTING_TYPING, /*goto*/ 0x16)
|
|
if_chr_idle_action_eq(IDLEACTION_SITTING_DORMANT, /*goto*/ 0x16)
|
|
goto_next(0x13)
|
|
|
|
label(0x16)
|
|
set_chr_maxdamage(CHR_SELF, 1)
|
|
set_chr_hiddenflag(CHR_SELF, CHRHFLAG_TRIGGER_BUDDY_WARP)
|
|
|
|
label(0x13)
|
|
set_shotlist(GAILIST_UNALERTED)
|
|
label(0x00)
|
|
if_chr_idle_action_eq(IDLEACTION_STANDING, /*goto*/ 0x03)
|
|
if_chr_idle_action_eq(IDLEACTION_SITTING_TYPING, /*goto*/ 0x04)
|
|
if_chr_idle_action_eq(IDLEACTION_SITTING_DORMANT, /*goto*/ 0x05)
|
|
if_chr_idle_action_eq(IDLEACTION_OPERATING, /*goto*/ 0x06)
|
|
if_chr_idle_action_eq(IDLEACTION_OPERATING_PAD, /*goto*/ 0x07)
|
|
stop_chr
|
|
return
|
|
set_ailist(CHR_SELF, GAILIST_IDLE)
|
|
|
|
label(0x03)
|
|
dprint 'S','T','A','N','D','I','N','G','\n',0,
|
|
chr_do_animation(ANIM_OPERATE_0204, 0, -1, 0x10, 0x10, CHR_SELF, 2)
|
|
goto_next(0x0c)
|
|
|
|
label(0x04)
|
|
dprint 'S','I','T','T','I','N','G',' ','T','Y','P','I','N','G','\n',0,
|
|
set_chr_special_death_animation(CHR_SELF, SPECIALDIE_ONCHAIR)
|
|
chr_do_animation(ANIM_SITTING_TYPING, 0, -1, 0x14, 0x00, CHR_SELF, 2)
|
|
goto_next(0x0c)
|
|
|
|
label(0x05)
|
|
dprint 'S','I','T','T','I','N','G','\n',0,
|
|
set_chr_special_death_animation(CHR_SELF, SPECIALDIE_ONCHAIR)
|
|
chr_do_animation(ANIM_SITTING_DORMANT, 0, -1, 0x14, 0x00, CHR_SELF, 2)
|
|
goto_next(0x0c)
|
|
|
|
label(0x07)
|
|
dprint 'N','A','T',' ','5','\n',0,
|
|
restart_timer
|
|
try_face_entity(ENTITYTYPE_PAD, PAD_PRESET, /*goto*/ 0xfa)
|
|
|
|
beginloop(0xfa)
|
|
if_timer_gt(60, /*goto*/ 0x06)
|
|
endloop(0xfa)
|
|
|
|
label(0x06)
|
|
dprint 'O','P','E','R','A','T','I','N','G','\n',0,
|
|
call_rng
|
|
if_rand_gt(85, /*goto*/ 0x28)
|
|
if_rand_gt(170, /*goto*/ 0x29)
|
|
chr_do_animation(ANIM_OPERATE_0221, 0, -1, 0x10, 0x00, CHR_SELF, 2)
|
|
goto_next(0x0c)
|
|
|
|
label(0x28)
|
|
chr_do_animation(ANIM_OPERATE_0222, 0, -1, 0x10, 0x00, CHR_SELF, 2)
|
|
goto_next(0x0c)
|
|
|
|
label(0x29)
|
|
chr_do_animation(ANIM_OPERATE_0223, 0, -1, 0x10, 0x00, CHR_SELF, 2)
|
|
goto_next(0x0c)
|
|
|
|
label(0x0c)
|
|
return
|
|
|
|
// Nothing jumps to here or below
|
|
beginloop(0x15)
|
|
chr_toggle_p1p2(CHR_SELF)
|
|
set_target_chr(CHR_P1P2)
|
|
if_target_in_sight(/*goto*/ 0x13)
|
|
if_self_flag_bankx_eq(CHRFLAG0_AIVSAI, FALSE, BANK_0, /*goto*/ 0x16)
|
|
if_enemy_distance_lt_and_los(2540, /*goto*/ 0x13)
|
|
goto_next(0x16)
|
|
|
|
label(0x13)
|
|
goto_next(0x12)
|
|
|
|
label(0x16)
|
|
endloop(0x15)
|
|
|
|
// Stand up
|
|
label(0x13)
|
|
chr_do_animation(ANIM_STAND_UP_FROM_SITTING, 0, -1, 0x02, 0x10, CHR_SELF, 2)
|
|
object_do_animation(0x025a, 0xff, 0x02, 0xffff)
|
|
|
|
beginloop(0x06)
|
|
if_chr_stopped(/*goto*/ 0x13)
|
|
endloop(0x06)
|
|
|
|
label(0x13)
|
|
return
|
|
|
|
label(0x12)
|
|
set_returnlist(CHR_SELF, GAILIST_UNALERTED)
|
|
set_ailist(CHR_SELF, GAILIST_COMBAT_WITH_TARGET)
|
|
endlist
|
|
};
|
|
|
|
/**
|
|
* Attempts to set the target chr and engage in combat with them.
|
|
*
|
|
* - If current chr has been shot, say something, raise group alertness, then
|
|
* engage combat with the target (if in range and line of sight).
|
|
* - Otherwise, attempt to find the target using a one of two methods,
|
|
* determined by a bitflag on the chr:
|
|
*
|
|
* 1) Find chr by group (details unknown)
|
|
* 2) Distance and line of sight check on all chrs
|
|
*
|
|
* When one fails the other is attempted. Presumably both of these are quite
|
|
* expensive, so the flag exists to determine which one is more likely to pass
|
|
* on a per chr basis.
|
|
*
|
|
* If both fail, the function yields and continues checking.
|
|
*/
|
|
u8 func000b_choose_target_chr[] = {
|
|
set_shotlist(GAILIST_CHOOSE_TARGET)
|
|
if_num_times_shot_lt(1, /*goto*/ 0xd3)
|
|
|
|
// Has been shot
|
|
say_quip(CHR_BOND, QUIP_SHOTUNALERT, 0x78, 0x03, 0x00, BANK_0, 0x00, 0x00)
|
|
|
|
beginloop(0x03)
|
|
if_chr_stopped(/*goto*/ 0x16)
|
|
endloop(0x03)
|
|
|
|
label(0x16)
|
|
say_quip(CHR_BOND, QUIP_SHOTUNALERT, 0xff, 0x03, 0x00, BANK_0, 0x00, 0x00)
|
|
dprint 'N','O',' ','W','A','R','N','I','N','G','\n',0,
|
|
increase_squadron_alertness(100)
|
|
dprint 'N','O',' ','W','A','R','N','I','N','G','\n',0,
|
|
if_enemy_distance_lt_and_los(2540, /*goto*/ 0x13)
|
|
goto_next(0xd3)
|
|
|
|
label(0x13)
|
|
set_ailist(CHR_SELF, GAILIST_COMBAT_WITH_TARGET)
|
|
|
|
// Hasn't been shot, or can't engage target chr
|
|
label(0xd3)
|
|
set_action(MA_NORMAL, FALSE)
|
|
yield
|
|
dprint 'S','C','A','N','\n',0,
|
|
|
|
if_self_flag_bankx_eq(CHRFLAG0_NOHEAR, TRUE, BANK_0, /*goto*/ 0x13)
|
|
set_target_to_enemy_on_same_floor(/*goto*/ 0x16)
|
|
goto_next(0x04)
|
|
|
|
// No hear - only see
|
|
label(0x13)
|
|
if_enemy_distance_lt_and_los(2540, /*goto*/ 0x16)
|
|
|
|
// Scan failed
|
|
label(0x04)
|
|
if_saw_injury(0x00, /*goto*/ 0x13)
|
|
if_alertness(99, OPERATOR_GREATER_THAN, /*goto*/ 0x13)
|
|
goto_first(0xd3)
|
|
|
|
// Found
|
|
label(0x16)
|
|
dprint 'F','O','U','N','D','\n',0,
|
|
increase_squadron_alertness(100)
|
|
set_ailist(CHR_SELF, GAILIST_COMBAT_WITH_TARGET)
|
|
set_returnlist(CHR_SELF, GAILIST_CHOOSE_TARGET)
|
|
|
|
label(0x13)
|
|
dprint 'F','O','U','N','D','A','L','E','R','T','\n',0,
|
|
if_enemy_distance_lt_and_los(2540, /*goto*/ 0x13)
|
|
if_self_flag_bankx_eq(CHRFLAG0_NOHEAR, TRUE, BANK_0, /*goto*/ 0x16)
|
|
set_target_to_enemy_on_same_floor(/*goto*/ 0x13)
|
|
label(0x16)
|
|
goto_first(0xd3)
|
|
|
|
label(0x13)
|
|
set_ailist(CHR_SELF, GAILIST_COMBAT_WITH_TARGET)
|
|
endlist
|
|
};
|
|
|
|
u8 func000d_init_combat[] = {
|
|
set_shotlist(GAILIST_COMBAT_WITH_TARGET)
|
|
|
|
// If not idle, turn off special death animation
|
|
if_self_flag_bankx_eq(CHRFLAG1_DOINGIDLEANIMATION, FALSE, BANK_1, /*goto*/ 0x13)
|
|
set_chr_special_death_animation(CHR_SELF, SPECIALDIE_NONE)
|
|
|
|
label(0x13)
|
|
if_self_flag_bankx_eq(CHRFLAG1_DOINGIDLEANIMATION, FALSE, BANK_1, /*goto*/ 0x16)
|
|
unset_self_flag_bankx(CHRFLAG1_DOINGIDLEANIMATION, BANK_1)
|
|
if_chr_idle_action_eq(IDLEACTION_SITTING_TYPING, /*goto*/ 0x05)
|
|
if_chr_idle_action_eq(IDLEACTION_SITTING_DORMANT, /*goto*/ 0x05)
|
|
goto_next(0x16)
|
|
|
|
// Stand up
|
|
label(0x05)
|
|
set_chr_maxdamage(CHR_SELF, 40)
|
|
chr_do_animation(ANIM_STAND_UP_FROM_SITTING, 0, -1, 0x02, 0x10, CHR_SELF, 2)
|
|
object_do_animation(0x025a, 0xff, 0x02, 0xffff)
|
|
|
|
beginloop(0x0c)
|
|
if_chr_stopped(/*goto*/ 0x13)
|
|
endloop(0x0c)
|
|
|
|
label(0x13)
|
|
label(0x16)
|
|
set_shotlist(GAILIST_COMBAT_WITH_TARGET)
|
|
set_ailist(CHR_SELF, GAILIST_COMBAT_WITH_TARGET)
|
|
endlist
|
|
};
|
|
|
|
u8 func000c_combat_with_target_chr[] = {
|
|
if_chr_is_skedar(CHR_SELF, /*goto*/ 0x16)
|
|
dprint 'S','E','E',' ','E','N','E','M','Y','\n',0,
|
|
if_num_human_players_lt(2, /*goto*/ 0x16)
|
|
label(0x13)
|
|
if_target_is_player(/*goto*/ 0x13)
|
|
goto_next(0x16)
|
|
|
|
label(0x13)
|
|
if_stage_is_not(STAGE_WAR, /*goto*/ 0x13)
|
|
if_num_human_players_lt(2, /*goto*/ 0x13)
|
|
goto_next(0x16)
|
|
|
|
label(0x13)
|
|
if_stage_is_not(STAGE_DEEPSEA, /*goto*/ 0x13)
|
|
if_num_human_players_lt(2, /*goto*/ 0x13)
|
|
goto_next(0x16)
|
|
|
|
label(0x13)
|
|
if_stage_is_not(STAGE_DEFENSE, /*goto*/ 0x13)
|
|
if_num_human_players_lt(2, /*goto*/ 0x13)
|
|
goto_next(0x16)
|
|
|
|
label(0x13)
|
|
if_stage_is_not(STAGE_WAR, /*goto*/ 0x13)
|
|
if_num_human_players_lt(2, /*goto*/ 0x13)
|
|
goto_next(0x16)
|
|
|
|
label(0x13)
|
|
if_stage_is_not(STAGE_ESCAPE, /*goto*/ 0x13)
|
|
if_num_human_players_lt(2, /*goto*/ 0x13)
|
|
goto_next(0x16)
|
|
|
|
label(0x13)
|
|
if_stage_is_not(STAGE_ATTACKSHIP, /*goto*/ 0x13)
|
|
if_num_human_players_lt(2, /*goto*/ 0x13)
|
|
goto_next(0x16)
|
|
|
|
label(0x13)
|
|
if_stage_is_not(STAGE_CRASHSITE, /*goto*/ 0x13)
|
|
if_num_human_players_lt(2, /*goto*/ 0x13)
|
|
goto_next(0x16)
|
|
|
|
// Solo mode, or co-op/counter-op on any other stage
|
|
label(0x13)
|
|
if_target_is_player(/*goto*/ 0x13)
|
|
goto_next(0x16)
|
|
|
|
label(0x13)
|
|
set_ailist(CHR_SELF, GAILIST_ALERTED)
|
|
|
|
// Co-op with friend or counter-op on any of the above stages
|
|
// Or follow through if chr still has target
|
|
label(0x16)
|
|
set_self_chrflag(CHRCFLAG_00000040)
|
|
dprint 'D','E','T','E','C','T','\n',0,
|
|
if_chr_dead(CHR_SELF, /*goto*/ 0x16)
|
|
if_chr_death_animation_finished(CHR_SELF, /*goto*/ 0x16)
|
|
if_chr_knockedout(CHR_SELF, /*goto*/ 0x16)
|
|
goto_next(0x13)
|
|
|
|
// Dying
|
|
label(0x16)
|
|
set_shotlist(GAILIST_IDLE)
|
|
restart_timer
|
|
|
|
beginloop(0x1c)
|
|
if_timer_gt(15, /*goto*/ 0x16)
|
|
endloop(0x1c)
|
|
|
|
label(0x16)
|
|
if_chr_is_skedar(CHR_SELF, /*goto*/ 0x16)
|
|
say_quip(CHR_BOND, QUIP_DIE, 0xff, 0x03, 0xff, BANK_0, 0x00, 0x00)
|
|
goto_next(0x17)
|
|
|
|
label(0x16)
|
|
say_quip(CHR_BOND, QUIP_GOTOCOVER1, 0xff, 0x03, 0xff, BANK_0, 0x00, 0x00)
|
|
|
|
label(0x17)
|
|
set_shotlist(GAILIST_IDLE)
|
|
set_ailist(CHR_SELF, GAILIST_IDLE)
|
|
|
|
// Alive
|
|
label(0x13)
|
|
dprint 'D','E','T','E','C','T','1','\n',0,
|
|
if_num_times_shot_lt(1, /*goto*/ 0xb2)
|
|
if_just_injured(CHR_SELF, /*goto*/ 0x16)
|
|
if_has_gun(CHR_SELF, /*goto*/ 0xb2)
|
|
set_self_flag_bankx(CHRFLAG1_00000001, BANK_1)
|
|
goto_next(0xb2)
|
|
|
|
dprint 'D','E','T','E','C','T','2','\n',0,
|
|
|
|
// Injured
|
|
label(0x16)
|
|
restart_timer
|
|
|
|
beginloop(0x1d)
|
|
if_self_flag_bankx_eq(CHRFLAG0_SAID_INJURY_QUIP, TRUE, BANK_0, /*goto*/ 0x16)
|
|
if_num_times_shot_lt(1, /*goto*/ 0x16)
|
|
if_timer_lt(20, /*goto*/ 0x16)
|
|
say_quip(CHR_BOND, QUIP_INJURED1, 0x28, 0x03, 0xff, BANK_0, 0x00, 0x00)
|
|
say_quip(CHR_BOND, QUIP_INJURED2, 0x28, 0x03, 0x01, BANK_0, 0x00, 0x00)
|
|
set_self_flag_bankx(CHRFLAG0_SAID_INJURY_QUIP, BANK_0)
|
|
label(0x16)
|
|
if_chr_stopped(/*goto*/ 0x13)
|
|
if_timer_gt(180, /*goto*/ 0x13)
|
|
endloop(0x1d)
|
|
|
|
label(0x13)
|
|
dprint 'D','E','T','E','C','T','3','\n',0,
|
|
label(0xb2)
|
|
yield
|
|
if_chr_has_hiddenflag(CHR_TARGET, CHRHFLAG_08000000, /*goto*/ 0x13)
|
|
unset_self_flag_bankx(CHRFLAG1_00000001, BANK_1)
|
|
goto_next(0x16)
|
|
|
|
label(0x13)
|
|
set_self_flag_bankx(CHRFLAG1_00000001, BANK_1)
|
|
label(0x16)
|
|
dprint 'T','E','A','M','D','\n',0,
|
|
if_alertness(100, OPERATOR_LESS_THAN, /*goto*/ 0xb3)
|
|
dprint 'A','L','E','R','T','\n',0,
|
|
if_enemy_distance_lt_and_los(2540, /*goto*/ 0xb3)
|
|
if_chr_is_skedar(CHR_SELF, /*goto*/ 0x16)
|
|
if_chr_has_hiddenflag(CHR_SELF, CHRHFLAG_PSYCHOSISED, /*goto*/ 0x13)
|
|
goto_next(0x16)
|
|
|
|
label(0x13)
|
|
if_chrpresets_target_is_different(/*goto*/ 0xb3)
|
|
label(0x16)
|
|
dprint 'N','O',' ','T','A','R','G','E','T','\n',0,
|
|
set_target_chr(-1)
|
|
return
|
|
|
|
label(0xb3)
|
|
if_chr_is_skedar(CHR_SELF, /*goto*/ 0x16)
|
|
label(0x13)
|
|
if_target_is_player(/*goto*/ 0x13)
|
|
goto_next(0x16)
|
|
|
|
label(0x13)
|
|
if_stage_is_not(STAGE_WAR, /*goto*/ 0x13)
|
|
if_num_human_players_lt(2, /*goto*/ 0x13)
|
|
goto_next(0x16)
|
|
|
|
label(0x13)
|
|
if_stage_is_not(STAGE_DEEPSEA, /*goto*/ 0x13)
|
|
if_num_human_players_lt(2, /*goto*/ 0x13)
|
|
goto_next(0x16)
|
|
|
|
label(0x13)
|
|
if_stage_is_not(STAGE_DEFENSE, /*goto*/ 0x13)
|
|
if_num_human_players_lt(2, /*goto*/ 0x13)
|
|
goto_next(0x16)
|
|
|
|
label(0x13)
|
|
if_stage_is_not(STAGE_WAR, /*goto*/ 0x13)
|
|
if_num_human_players_lt(2, /*goto*/ 0x13)
|
|
goto_next(0x16)
|
|
|
|
label(0x13)
|
|
if_stage_is_not(STAGE_ESCAPE, /*goto*/ 0x13)
|
|
if_num_human_players_lt(2, /*goto*/ 0x13)
|
|
goto_next(0x16)
|
|
|
|
label(0x13)
|
|
if_stage_is_not(STAGE_ATTACKSHIP, /*goto*/ 0x13)
|
|
if_num_human_players_lt(2, /*goto*/ 0x13)
|
|
goto_next(0x16)
|
|
|
|
label(0x13)
|
|
if_stage_is_not(STAGE_CRASHSITE, /*goto*/ 0x13)
|
|
if_num_human_players_lt(2, /*goto*/ 0x13)
|
|
goto_next(0x16)
|
|
|
|
label(0x13)
|
|
set_ailist(CHR_SELF, GAILIST_ALERTED)
|
|
|
|
label(0x16)
|
|
dprint 'F','O','U','N','D',' ','E','N','E','M','Y','\n',0,
|
|
restart_timer
|
|
if_chr_dead(CHR_TARGET, /*goto*/ 0xba)
|
|
if_chr_death_animation_finished(CHR_TARGET, /*goto*/ 0xba)
|
|
if_chr_knockedout(CHR_TARGET, /*goto*/ 0xba)
|
|
if_chrpresets_target_is_different(/*goto*/ 0x13)
|
|
goto_next(0x16)
|
|
|
|
// Target's field 0x17e is different
|
|
label(0x13)
|
|
if_self_flag_bankx_eq(CHRFLAG1_00000001, FALSE, BANK_1, /*goto*/ 0x16)
|
|
if_self_flag_bankx_eq(CHRFLAG1_00001000, TRUE, BANK_1, /*goto*/ 0x16)
|
|
call_rng
|
|
if_rand_lt(128, /*goto*/ 0x13)
|
|
if_distance_to_target_gt(250, /*goto*/ 0x16)
|
|
if_can_see_attack_target(/*goto*/ 0x13)
|
|
goto_next(0x16)
|
|
|
|
label(0x13)
|
|
set_self_flag_bankx(CHRFLAG1_PUNCH_THEN_GENERAL_COMBAT, BANK_1)
|
|
set_ailist(CHR_SELF, GAILIST_HAND_COMBAT)
|
|
|
|
label(0x16)
|
|
try_run_to_target(/*goto*/ 0xb4)
|
|
dprint 'R','U','N',' ','F','A','I','L','\n',0,
|
|
|
|
beginloop(0xb4)
|
|
dprint 'F','O','U','N','D',' ','1','\n',0,
|
|
if_timer_gt(600, /*goto*/ 0xba)
|
|
if_self_flag_bankx_eq(CHRFLAG1_00000001, FALSE, BANK_1, /*goto*/ 0x13)
|
|
if_timer_gt(20, /*goto*/ 0x09)
|
|
label(0x13)
|
|
if_chr_dead(CHR_TARGET, /*goto*/ 0xba)
|
|
if_chr_death_animation_finished(CHR_TARGET, /*goto*/ 0xba)
|
|
if_chr_knockedout(CHR_TARGET, /*goto*/ 0xba)
|
|
if_chrpresets_target_is_different(/*goto*/ 0x13)
|
|
goto_next(0xba)
|
|
|
|
label(0x13)
|
|
dprint 'F','O','U','N','D',' ','2','\n',0,
|
|
if_self_flag_bankx_eq(CHRFLAG1_00000001, TRUE, BANK_1, /*goto*/ 0x16)
|
|
if_self_flag_bankx_eq(CHRFLAG1_00001000, TRUE, BANK_1, /*goto*/ 0x13)
|
|
if_distance_to_target_lt(120, /*goto*/ 0x16)
|
|
call_rng
|
|
if_rand_lt(128, /*goto*/ 0x13)
|
|
if_distance_to_target_gt(250, /*goto*/ 0x13)
|
|
label(0x16)
|
|
if_can_see_attack_target(/*goto*/ 0x16)
|
|
dprint 'N','O','U','N','A','R','M','\n',0,
|
|
goto_next(0x13)
|
|
|
|
label(0x16)
|
|
dprint 'G','O','U','N','A','R','M','\n',0,
|
|
set_self_flag_bankx(CHRFLAG1_PUNCH_THEN_GENERAL_COMBAT, BANK_1)
|
|
set_ailist(CHR_SELF, GAILIST_HAND_COMBAT)
|
|
|
|
label(0x13)
|
|
label(0x13)
|
|
if_enemy_distance_lt_and_los(1200, /*goto*/ 0xb5)
|
|
if_can_see_attack_target(/*goto*/ 0xb6)
|
|
endloop(0xb4)
|
|
|
|
label(0x09)
|
|
goto_first(0xb3)
|
|
|
|
label(0xb7)
|
|
label(0xb9)
|
|
if_can_see_attack_target(/*goto*/ 0xb6)
|
|
if_chr_dead(CHR_TARGET, /*goto*/ 0xba)
|
|
if_chr_death_animation_finished(CHR_TARGET, /*goto*/ 0xba)
|
|
if_chr_knockedout(CHR_TARGET, /*goto*/ 0xba)
|
|
if_chrpresets_target_is_different(/*goto*/ 0x13)
|
|
goto_next(0xba)
|
|
|
|
label(0x13)
|
|
if_chr_in_view(/*goto*/ 0xbb)
|
|
goto_first(0xb4)
|
|
|
|
label(0xb5)
|
|
restart_timer
|
|
try_run_to_target(/*goto*/ 0xbc)
|
|
|
|
beginloop(0xbc)
|
|
if_chr_dead(CHR_TARGET, /*goto*/ 0xc0)
|
|
if_chr_death_animation_finished(CHR_TARGET, /*goto*/ 0xc0)
|
|
if_chr_knockedout(CHR_TARGET, /*goto*/ 0xc0)
|
|
if_chrpresets_target_is_different(/*goto*/ 0x13)
|
|
goto_next(0xc0)
|
|
|
|
label(0x13)
|
|
if_chr_has_hiddenflag(CHR_TARGET, CHRHFLAG_CLOAKED, /*goto*/ 0x13)
|
|
if_can_see_attack_target(/*goto*/ 0xbf)
|
|
label(0x13)
|
|
if_timer_gt(120, /*goto*/ 0xc0)
|
|
endloop(0xbc)
|
|
|
|
label(0xbf)
|
|
goto_next(0xb6)
|
|
|
|
label(0xc0)
|
|
goto_first(0xb2)
|
|
|
|
label(0xb6)
|
|
set_grenade_probability_out_of_255(255)
|
|
set_self_chrflag(CHRCFLAG_00000040)
|
|
if_chr_dead(CHR_TARGET, /*goto*/ 0xc1)
|
|
if_chr_death_animation_finished(CHR_TARGET, /*goto*/ 0xc1)
|
|
if_chr_knockedout(CHR_TARGET, /*goto*/ 0xc1)
|
|
if_chrpresets_target_is_different(/*goto*/ 0x13)
|
|
goto_next(0xc1)
|
|
|
|
label(0x13)
|
|
dprint 'S','H','O','O','T','I','N','G','\n',0,
|
|
goto_next(0xc2)
|
|
|
|
label(0x16)
|
|
if_distance_to_target_lt(800, /*goto*/ 0xc2)
|
|
|
|
// @bug: Guards will consider throwing grenades if you're moving quickly
|
|
// rather than slowly. The below statement skips the grenade logic if slow.
|
|
if_target_moving_slowly(0, /*goto*/ 0xc2)
|
|
dprint 'G','R','E','N','A','D','E','\n',0,
|
|
restart_timer
|
|
if_chr_in_squadron_doing_action(MA_GRENADE, /*goto*/ 0xc2)
|
|
set_action(MA_GRENADE, FALSE)
|
|
consider_throwing_grenade(0x0200, 0x0000, /*goto*/ 0x16)
|
|
label(0x16)
|
|
if_self_flag_bankx_eq(CHRFLAG1_00001000, TRUE, BANK_1, /*goto*/ 0x13)
|
|
if_self_flag_bankx_eq(CHRFLAG1_00000001, TRUE, BANK_1, /*goto*/ 0x16)
|
|
if_distance_to_target_lt(120, /*goto*/ 0x16)
|
|
call_rng
|
|
if_rand_lt(128, /*goto*/ 0x13)
|
|
if_distance_to_target_gt(250, /*goto*/ 0x13)
|
|
label(0x16)
|
|
if_can_see_attack_target(/*goto*/ 0x16)
|
|
goto_next(0x13)
|
|
|
|
label(0x16)
|
|
set_self_flag_bankx(CHRFLAG1_PUNCH_THEN_GENERAL_COMBAT, BANK_1)
|
|
set_ailist(CHR_SELF, GAILIST_HAND_COMBAT)
|
|
|
|
label(0x13)
|
|
yield
|
|
dprint 'G','R','E','N','A','D','E',' ','E','N','D','\n',0,
|
|
label(0xc2)
|
|
if_self_flag_bankx_eq(CHRFLAG1_00001000, TRUE, BANK_1, /*goto*/ 0x13)
|
|
if_self_flag_bankx_eq(CHRFLAG1_00000001, TRUE, BANK_1, /*goto*/ 0x16)
|
|
if_distance_to_target_lt(120, /*goto*/ 0x16)
|
|
call_rng
|
|
if_rand_lt(128, /*goto*/ 0x13)
|
|
if_distance_to_target_gt(250, /*goto*/ 0x13)
|
|
label(0x16)
|
|
if_can_see_attack_target(/*goto*/ 0x16)
|
|
goto_next(0x13)
|
|
|
|
label(0x16)
|
|
set_self_flag_bankx(CHRFLAG1_PUNCH_THEN_GENERAL_COMBAT, BANK_1)
|
|
set_ailist(CHR_SELF, GAILIST_HAND_COMBAT)
|
|
|
|
label(0x13)
|
|
label(0x13)
|
|
dprint 'C','H','O','S','E',' ','S','H','T','N','D','\n',0, // choose... ?
|
|
call_rng
|
|
if_rand_gt(64, /*goto*/ 0x16)
|
|
if_self_flag_bankx_eq(CHRFLAG1_00000010, FALSE, BANK_1, /*goto*/ 0x13)
|
|
try_attack_amount(90, 100)
|
|
set_self_flag_bankx(CHRFLAG1_00000020, BANK_1)
|
|
goto_next(0xc3)
|
|
|
|
label(0x13)
|
|
if_self_flag_bankx_eq(CHRFLAG1_00000004, FALSE, BANK_1, /*goto*/ 0x13)
|
|
try_attack_amount(20, 30)
|
|
goto_next(0xc3)
|
|
|
|
label(0x13)
|
|
label(0x16)
|
|
if_chr_is_skedar(CHR_SELF, /*goto*/ 0x17)
|
|
goto_next(0x16)
|
|
|
|
label(0x17)
|
|
say_quip(CHR_BOND, QUIP_ATTACK2, 0xff, 0x03, 0xff, BANK_0, 0x00, 0x00)
|
|
label(0x16)
|
|
call_rng
|
|
if_rand_gt(50, /*goto*/ 0x13)
|
|
call_rng
|
|
if_rand_gt(128, /*goto*/ 0x16)
|
|
label(0xbe)
|
|
try_attack_roll(/*goto*/ 0xc3)
|
|
label(0x16)
|
|
try_attack_walk(/*goto*/ 0xc3)
|
|
label(0x13)
|
|
call_rng
|
|
if_rand_gt(128, /*goto*/ 0x8c)
|
|
try_attack_kneel(ENTITYTYPE_TARGET | ENTITYTYPE_AIMONLY, 0, /*goto*/ 0x16)
|
|
label(0x8c)
|
|
try_attack_stand(ENTITYTYPE_TARGET | ENTITYTYPE_AIMONLY, 0, /*goto*/ 0x16)
|
|
label(0x16)
|
|
try_modify_attack(ENTITYTYPE_TARGET, 0, /*goto*/ 0xc3)
|
|
|
|
label(0xc3)
|
|
say_quip(CHR_BOND, QUIP_ATTACK3, 0x19, 0x02, 0xff, BANK_0, 0x00, 0x00)
|
|
say_quip(CHR_BOND, QUIP_ATTACK4, 0x19, 0x02, 0x01, BANK_0, 0x00, 0x00)
|
|
|
|
beginloop(0xe2)
|
|
if_chr_dead(CHR_TARGET, /*goto*/ 0xc1)
|
|
if_chr_death_animation_finished(CHR_TARGET, /*goto*/ 0xc1)
|
|
if_chr_knockedout(CHR_TARGET, /*goto*/ 0xc1)
|
|
if_chrpresets_target_is_different(/*goto*/ 0x16)
|
|
goto_next(0xc1)
|
|
|
|
label(0x16)
|
|
if_chr_stopped(/*goto*/ 0xc1)
|
|
endloop(0xe2)
|
|
|
|
label(0x13)
|
|
restart_timer
|
|
dprint 'S','H','O','O','T',' ','F','A','I','L','\n',0,
|
|
|
|
beginloop(0x03)
|
|
if_timer_gt(60, /*goto*/ 0x16)
|
|
endloop(0x03)
|
|
|
|
label(0x16)
|
|
goto_first(0xc3)
|
|
|
|
label(0xba)
|
|
dprint 'F','O','U','N','D',' ','3','\n',0,
|
|
label(0xc1)
|
|
if_chr_injured_target(CHR_SELF, /*goto*/ 0x13)
|
|
dprint 'P','U','N','C','H','M','I','S','S','E','D','\n',0,
|
|
say_quip(CHR_BOND, QUIP_MISSEDPLAYER1, 0x19, 0x03, 0xff, BANK_0, 0x00, 0x00)
|
|
say_quip(CHR_BOND, QUIP_MISSEDPLAYER2, 0x19, 0x03, 0x01, BANK_0, 0x00, 0x00)
|
|
goto_next(0x16)
|
|
|
|
label(0x13)
|
|
dprint 'P','U','N','C','H','H','I','T','\n',0,
|
|
say_quip(CHR_BOND, QUIP_HITPLAYER, 0x19, 0x02, 0xff, BANK_0, 0x00, 0x00)
|
|
say_quip(CHR_BOND, QUIP_HITPLAYER, 0x19, 0x03, 0x01, BANK_0, 0x00, 0x00)
|
|
|
|
label(0x16)
|
|
dprint 'B','O','N','N','D',' ','3','\n',0,
|
|
if_self_flag_bankx_eq(CHRFLAG1_00000800, FALSE, BANK_1, /*goto*/ 0x13)
|
|
if_target_is_player(/*goto*/ 0x13)
|
|
damage_chr(CHR_TARGET, 18)
|
|
unset_self_flag_bankx(CHRFLAG1_00000800, BANK_1)
|
|
label(0x13)
|
|
if_chr_dead(CHR_TARGET, /*goto*/ 0xc5)
|
|
if_chr_death_animation_finished(CHR_TARGET, /*goto*/ 0xc5)
|
|
if_chr_knockedout(CHR_TARGET, /*goto*/ 0xc5)
|
|
if_chrpresets_target_is_different(/*goto*/ 0x13)
|
|
goto_next(0xc5)
|
|
|
|
label(0x13)
|
|
if_self_flag_bankx_eq(CHRFLAG1_40000000, TRUE, BANK_1, /*goto*/ 0xc5)
|
|
label(0xb8)
|
|
label(0xc6)
|
|
if_self_flag_bankx_eq(CHRFLAG0_08000000, FALSE, BANK_0, /*goto*/ 0x13)
|
|
goto_first(0xb3)
|
|
|
|
label(0x13)
|
|
dprint 'L','O','O','K',' ','F','O','R',' ','C','O','V','E','R','\n',0,
|
|
if_self_flag_bankx_eq(CHRFLAG1_00004000, TRUE, BANK_1, /*goto*/ 0x15)
|
|
cmd0121_if_something(0x1035, /*goto*/ 0x53)
|
|
cmd0121_if_something(0x1095, /*goto*/ 0x53)
|
|
goto_next(0x16)
|
|
|
|
label(0x15)
|
|
cmd0121_if_something(0x9035, /*goto*/ 0x53)
|
|
cmd0121_if_something(0x9095, /*goto*/ 0x53)
|
|
label(0x16)
|
|
goto_next(0x54)
|
|
|
|
label(0x53)
|
|
dprint 'G','O',' ','T','O',' ','C','O','V','E','R','\n',0,
|
|
say_quip(CHR_BOND, QUIP_GOTOCOVER1, 0xff, 0x02, 0x01, BANK_0, 0x00, 0x00)
|
|
go_to_cover(SPEED_RUN)
|
|
restart_timer
|
|
|
|
beginloop(0xc7)
|
|
if_chr_dead(CHR_TARGET, /*goto*/ 0xc5)
|
|
if_chr_death_animation_finished(CHR_TARGET, /*goto*/ 0xc5)
|
|
if_chr_knockedout(CHR_TARGET, /*goto*/ 0xc5)
|
|
if_enemy_distance_lt_and_los(400, /*goto*/ 0x13)
|
|
if_chr_stopped(/*goto*/ 0x16)
|
|
if_timer_gt(360, /*goto*/ 0x16)
|
|
endloop(0xc7)
|
|
|
|
label(0x13)
|
|
goto_first(0xb5)
|
|
|
|
label(0x16)
|
|
dprint 'G','O','T',' ','T','O',' ','C','O','V','E','R','\n',0,
|
|
label(0xc8)
|
|
restart_timer
|
|
try_attack_kneel(ENTITYTYPE_TARGET | ENTITYTYPE_AIMONLY, 0, /*goto*/ 0xc9)
|
|
|
|
beginloop(0xc9)
|
|
if_chr_dead(CHR_TARGET, /*goto*/ 0xc5)
|
|
if_chr_death_animation_finished(CHR_TARGET, /*goto*/ 0xc5)
|
|
if_chr_knockedout(CHR_TARGET, /*goto*/ 0xc5)
|
|
if_chrpresets_target_is_different(/*goto*/ 0x13)
|
|
goto_next(0xc5)
|
|
|
|
label(0x13)
|
|
if_enemy_distance_lt_and_los(400, /*goto*/ 0x15)
|
|
if_chr_has_hiddenflag(CHR_TARGET, CHRHFLAG_CLOAKED, /*goto*/ 0x13)
|
|
if_can_see_attack_target(/*goto*/ 0xca)
|
|
label(0x13)
|
|
if_timer_gt(200, /*goto*/ 0x16)
|
|
endloop(0xc9)
|
|
|
|
label(0x16)
|
|
dprint 'T','I','M','O','U','T','\n',0,
|
|
goto_first(0xb3)
|
|
|
|
label(0x15)
|
|
dprint 'O','P','F','I','R','E','\n',0,
|
|
goto_first(0xb5)
|
|
|
|
label(0xa3)
|
|
goto_first(0xc1)
|
|
|
|
label(0xca)
|
|
restart_timer
|
|
dprint 'T','A','R','S','H','O','\n',0,
|
|
if_chr_is_skedar(CHR_SELF, /*goto*/ 0x16)
|
|
goto_next(0x17)
|
|
|
|
label(0x16)
|
|
say_quip(CHR_BOND, QUIP_ATTACK2, 0xff, 0x03, 0xff, BANK_0, 0x00, 0x00)
|
|
label(0x17)
|
|
try_modify_attack(ENTITYTYPE_TARGET, 0, /*goto*/ 0xcb)
|
|
goto_next(0x16)
|
|
|
|
label(0xcb)
|
|
say_quip(CHR_BOND, QUIP_ATTACK3, 0x19, 0x02, 0xff, BANK_0, 0x00, 0x00)
|
|
say_quip(CHR_BOND, QUIP_ATTACK4, 0x19, 0x02, 0x01, BANK_0, 0x00, 0x00)
|
|
|
|
beginloop(0xcc)
|
|
if_chr_dead(CHR_TARGET, /*goto*/ 0xc5)
|
|
if_chr_death_animation_finished(CHR_TARGET, /*goto*/ 0xc5)
|
|
if_chr_knockedout(CHR_TARGET, /*goto*/ 0xc5)
|
|
if_chrpresets_target_is_different(/*goto*/ 0x13)
|
|
goto_next(0xc5)
|
|
|
|
label(0x13)
|
|
if_timer_gt(300, /*goto*/ 0x16)
|
|
if_chr_stopped(/*goto*/ 0x16)
|
|
endloop(0xcc)
|
|
|
|
label(0x54)
|
|
dprint 'N','O','C','O','V','E','R','\n',0,
|
|
goto_first(0xb3)
|
|
|
|
restart_timer
|
|
try_run_sideways(/*goto*/ 0xcd)
|
|
|
|
beginloop(0xcd)
|
|
if_timer_gt(300, /*goto*/ 0xce)
|
|
if_chr_stopped(/*goto*/ 0xce)
|
|
endloop(0xcd)
|
|
|
|
label(0xce)
|
|
goto_first(0xb3)
|
|
|
|
label(0xc5)
|
|
dprint 'F','O','U','N','D',' ','4','\n',0,
|
|
if_self_flag_bankx_eq(CHRFLAG1_00100000, FALSE, BANK_1, /*goto*/ 0x13)
|
|
dprint 'F','O','U','N','D',' ','5','\n',0,
|
|
return
|
|
|
|
label(0x13)
|
|
if_self_flag_bankx_eq(CHRFLAG0_NOHEAR, TRUE, BANK_0, /*goto*/ 0x13)
|
|
label(0x13)
|
|
goto_next(0xcf)
|
|
|
|
label(0x16)
|
|
dprint 'K','I','L','L','E','D',' ','T','A','R','G','E','T','\n',0,
|
|
restart_timer
|
|
call_rng
|
|
if_self_flag_bankx_eq(CHRFLAG1_00100000, FALSE, BANK_1, /*goto*/ 0x13)
|
|
return
|
|
|
|
label(0x13)
|
|
goto_next(0xd0)
|
|
|
|
// Unreachable - no label
|
|
if_rand_gt(128, /*goto*/ 0xd1)
|
|
try_jog_to_target(/*goto*/ 0xd0)
|
|
|
|
beginloop(0xd0)
|
|
if_timer_gt(120, /*goto*/ 0xd2)
|
|
if_chr_stopped(/*goto*/ 0xd2)
|
|
endloop(0xd0)
|
|
|
|
label(0xd2)
|
|
goto_next(0xc4)
|
|
|
|
// Begin unreachable
|
|
kneel
|
|
|
|
beginloop(0xd4)
|
|
if_timer_gt(60, /*goto*/ 0xc4)
|
|
endloop(0xd4)
|
|
|
|
label(0xd1)
|
|
try_run_sideways(/*goto*/ 0xd5)
|
|
|
|
beginloop(0xd5)
|
|
if_timer_gt(180, /*goto*/ 0xc4)
|
|
if_chr_stopped(/*goto*/ 0xc4)
|
|
endloop(0xd5)
|
|
// End unreachable
|
|
|
|
label(0xc4)
|
|
if_self_flag_bankx_eq(CHRFLAG0_10000000, FALSE, BANK_0, /*goto*/ 0x13)
|
|
return
|
|
|
|
label(0x13)
|
|
goto_first(0xb3)
|
|
|
|
label(0xcf)
|
|
if_self_flag_bankx_eq(CHRFLAG0_10000000, FALSE, BANK_0, /*goto*/ 0x13)
|
|
if_target_is_player(/*goto*/ 0x16)
|
|
goto_next(0x13)
|
|
|
|
label(0x16)
|
|
return
|
|
|
|
label(0x13)
|
|
try_walk_to_target(/*goto*/ 0xd6)
|
|
|
|
beginloop(0xd6)
|
|
if_enemy_distance_lt_and_los(1200, /*goto*/ 0x13)
|
|
if_chr_stopped(/*goto*/ 0xd7)
|
|
endloop(0xd6)
|
|
|
|
label(0x13)
|
|
goto_first(0xb3)
|
|
|
|
label(0xd7)
|
|
say_quip(CHR_BOND, QUIP_KILLEDPLAYER1, 0x28, 0x00, 0x01, BANK_0, 0x00, 0x00)
|
|
try_face_entity(ENTITYTYPE_TARGET, 0, /*goto*/ 0x16)
|
|
label(0x16)
|
|
if_chr_is_skedar(CHR_SELF, /*goto*/ 0xd9)
|
|
chr_do_animation(ANIM_YAWN, 0, 193, 0x18, 0x10, CHR_SELF, 2)
|
|
|
|
beginloop(0xd8)
|
|
if_chr_stopped(/*goto*/ 0xd9)
|
|
endloop(0xd8)
|
|
|
|
label(0xd9)
|
|
return
|
|
endlist
|
|
};
|
|
|
|
u8 unregistered_function2[] = {
|
|
stop_chr
|
|
label(0x19)
|
|
stop_chr
|
|
yield
|
|
goto_first(0x19)
|
|
|
|
endlist
|
|
};
|
|
|
|
u8 unregistered_function3[] = {
|
|
surrender
|
|
beginloop(0x19)
|
|
if_chr_stopped(/*goto*/ 0x16)
|
|
endloop(0x19)
|
|
|
|
label(0x16)
|
|
dprint 'f','i','n','y','a','w','n','\n',0,
|
|
return
|
|
endlist
|
|
};
|
|
|
|
/**
|
|
* This is the initial function for Defense blondes and some chr in
|
|
* Attack Ship.
|
|
*/
|
|
u8 func0000_idle_0009[] = {
|
|
dprint 'S','T','A','R','T',' ','L','I','S','T','\n',0,
|
|
set_action(MA_NORMAL, FALSE)
|
|
set_returnlist(CHR_SELF, GAILIST_IDLE_0009)
|
|
stop_chr
|
|
|
|
beginloop(0x0c)
|
|
endloop(0x0c)
|
|
|
|
endlist
|
|
};
|
|
|
|
/**
|
|
* Not used.
|
|
*/
|
|
u8 func000e_see_then_attack[] = {
|
|
set_shotlist(GAILIST_ALERTED)
|
|
|
|
beginloop(0x0c)
|
|
chr_toggle_p1p2(CHR_SELF)
|
|
set_target_chr(CHR_P1P2)
|
|
if_can_see_target(/*goto*/ 0x16)
|
|
endloop(0x0c)
|
|
|
|
label(0x16)
|
|
set_ailist(CHR_SELF, GAILIST_ALERTED)
|
|
endlist
|
|
};
|
|
|
|
/**
|
|
* Waits for an objective to fail, then shows the objectives failed messages
|
|
* periodically.
|
|
*/
|
|
u8 func0016_show_objective_failed_msg[] = {
|
|
// Wait until an objective has failed
|
|
beginloop(0x0c)
|
|
if_timer_gt(0, /*goto*/ 0x13)
|
|
if_objective_failed(0, /*goto*/ 0x16)
|
|
if_objective_failed(1, /*goto*/ 0x16)
|
|
if_objective_failed(2, /*goto*/ 0x16)
|
|
if_objective_failed(3, /*goto*/ 0x16)
|
|
if_objective_failed(4, /*goto*/ 0x16)
|
|
endloop(0x0c)
|
|
|
|
// Wait 30 seconds. It iterates to the top loop here, which instantly jumps
|
|
// down to 0x13 because the timer is > 0. Seems a bit unnecessary...
|
|
label(0x16)
|
|
restart_timer
|
|
yield
|
|
label(0x13)
|
|
if_timer_gt(1800, /*goto*/ 0x13)
|
|
goto_first(0x0c)
|
|
|
|
// Check objective is still failed
|
|
label(0x13)
|
|
if_objective_failed(0, /*goto*/ 0x13)
|
|
if_objective_failed(1, /*goto*/ 0x13)
|
|
if_objective_failed(2, /*goto*/ 0x13)
|
|
if_objective_failed(3, /*goto*/ 0x13)
|
|
if_objective_failed(4, /*goto*/ 0x13)
|
|
set_ailist(CHR_SELF, GAILIST_IDLE)
|
|
|
|
// Show message first time
|
|
label(0x13)
|
|
show_hudmsg(CHR_BOND, L_MISC_069) // "OBJECTIVES FAILED - abort mission."
|
|
|
|
// Wait 60 seconds
|
|
restart_timer
|
|
|
|
beginloop(0x03)
|
|
if_timer_gt(3600, /*goto*/ 0x16)
|
|
endloop(0x03)
|
|
|
|
// Check objective is still failed
|
|
label(0x16)
|
|
if_objective_failed(0, /*goto*/ 0x13)
|
|
if_objective_failed(1, /*goto*/ 0x13)
|
|
if_objective_failed(2, /*goto*/ 0x13)
|
|
if_objective_failed(3, /*goto*/ 0x13)
|
|
if_objective_failed(4, /*goto*/ 0x13)
|
|
set_ailist(CHR_SELF, GAILIST_IDLE)
|
|
|
|
// Show message second time
|
|
label(0x13)
|
|
show_hudmsg(CHR_BOND, L_MISC_069) // "OBJECTIVES FAILED - abort mission."
|
|
restart_timer
|
|
|
|
// Wait 2 minutes
|
|
beginloop(0x04)
|
|
if_timer_gt(7200, /*goto*/ 0x06)
|
|
endloop(0x04)
|
|
|
|
// Check objective is still failed
|
|
label(0x06)
|
|
if_objective_failed(0, /*goto*/ 0x13)
|
|
if_objective_failed(1, /*goto*/ 0x13)
|
|
if_objective_failed(2, /*goto*/ 0x13)
|
|
if_objective_failed(3, /*goto*/ 0x13)
|
|
if_objective_failed(4, /*goto*/ 0x13)
|
|
set_ailist(CHR_SELF, GAILIST_IDLE)
|
|
|
|
// Show message third time
|
|
label(0x13)
|
|
show_hudmsg(CHR_BOND, L_MISC_069) // "OBJECTIVES FAILED - abort mission."
|
|
restart_timer
|
|
|
|
// Wait 5 minutes
|
|
beginloop(0x05)
|
|
if_timer_gt(18000, /*goto*/ 0x16)
|
|
endloop(0x05)
|
|
|
|
// Loop back to the last message, so it will display every 5 minutes
|
|
label(0x16)
|
|
goto_first(0x06)
|
|
|
|
endlist
|
|
};
|
|
|
|
u8 func0017_rebuild_groups[] = {
|
|
rebuild_teams
|
|
rebuild_squadrons
|
|
set_ailist(CHR_SELF, GAILIST_IDLE)
|
|
endlist
|
|
};
|
|
|
|
u8 func0018_do_bored_animation[] = {
|
|
call_rng
|
|
if_rand_gt(50, /*goto*/ 0x13)
|
|
chr_do_animation(ANIM_YAWN, 0, 193, 0x18, 0x10, CHR_SELF, 2)
|
|
goto_next(0x16)
|
|
|
|
label(0x13)
|
|
if_rand_gt(100, /*goto*/ 0x13)
|
|
chr_do_animation(ANIM_SCRATCH_HEAD, 0, 294, 0x18, 0x10, CHR_SELF, 2)
|
|
goto_next(0x16)
|
|
|
|
label(0x13)
|
|
if_rand_gt(150, /*goto*/ 0x13)
|
|
chr_do_animation(ANIM_ROLL_HEAD, 0, 183, 0x18, 0x10, CHR_SELF, 2)
|
|
goto_next(0x16)
|
|
|
|
label(0x13)
|
|
if_rand_gt(200, /*goto*/ 0x13)
|
|
chr_do_animation(ANIM_GRAB_CROTCH, 0, 123, 0x18, 0x10, CHR_SELF, 2)
|
|
goto_next(0x16)
|
|
|
|
label(0x13)
|
|
if_rand_gt(250, /*goto*/ 0x13)
|
|
chr_do_animation(ANIM_GRAB_BUTT, 0, 56, 0x18, 0x10, CHR_SELF, 2)
|
|
goto_next(0x16)
|
|
|
|
label(0x13)
|
|
label(0x16)
|
|
return
|
|
endlist
|
|
};
|
|
|
|
u8 func001e_look_around[] = {
|
|
call_rng
|
|
if_rand_gt(50, /*goto*/ 0x13)
|
|
chr_do_animation(ANIM_LOOK_AROUND_025B, 0, 193, 0x18, 0x10, CHR_SELF, 2)
|
|
goto_next(0x16)
|
|
|
|
label(0x13)
|
|
if_rand_gt(100, /*goto*/ 0x13)
|
|
chr_do_animation(ANIM_LOOK_AROUND_025C, 0, 294, 0x18, 0x10, CHR_SELF, 2)
|
|
goto_next(0x16)
|
|
|
|
label(0x13)
|
|
if_rand_gt(150, /*goto*/ 0x13)
|
|
chr_do_animation(ANIM_LOOK_AROUND_025D, 0, 183, 0x18, 0x10, CHR_SELF, 2)
|
|
goto_next(0x16)
|
|
|
|
// @bug: Shows grab crotch animation when wanting to look around instead.
|
|
// Probably a copy/paste error from previous function.
|
|
label(0x13)
|
|
if_rand_gt(200, /*goto*/ 0x13)
|
|
chr_do_animation(ANIM_GRAB_CROTCH, 0, 123, 0x18, 0x10, CHR_SELF, 2)
|
|
goto_next(0x16)
|
|
|
|
label(0x13)
|
|
if_rand_gt(250, /*goto*/ 0x13)
|
|
chr_do_animation(ANIM_LOOK_AROUND_025E, 0, 56, 0x18, 0x10, CHR_SELF, 2)
|
|
goto_next(0x16)
|
|
|
|
label(0x13)
|
|
label(0x16)
|
|
return
|
|
endlist
|
|
};
|
|
|
|
u8 func0019_do_sitting_animation[] = {
|
|
call_rng
|
|
if_rand_gt(128, /*goto*/ 0x13)
|
|
chr_do_animation(ANIM_SITTING_TYPING, 0, -1, 0x10, 0x10, CHR_SELF, 2)
|
|
goto_next(0x16)
|
|
|
|
label(0x13)
|
|
chr_do_animation(ANIM_SITTING_DORMANT, 0, -1, 0x10, 0x10, CHR_SELF, 2)
|
|
goto_next(0x16)
|
|
|
|
label(0x13)
|
|
label(0x16)
|
|
return
|
|
endlist
|
|
};
|
|
|
|
/**
|
|
* This function is only used by other global functions.
|
|
*
|
|
* It appears the purpose is to unset CHRFLAG1_DISSPEE in certain conditions.
|
|
*/
|
|
u8 func001a_maybe_unset_disspee[] = {
|
|
restart_timer
|
|
|
|
// If target has both DISGUISED and chrflag2_02000000
|
|
// then they must not have a gun equipped.
|
|
label(0x00)
|
|
yield
|
|
if_chr_has_hiddenflag(CHR_TARGET, CHRHFLAG_DISGUISED, /*goto*/ 0x14)
|
|
goto_next(0x13)
|
|
|
|
label(0x14)
|
|
if_chr_has_hiddenflag(CHR_TARGET, CHRHFLAG_02000000, /*goto*/ 0xe8)
|
|
goto_next(0x13)
|
|
|
|
label(0xe8)
|
|
if_chr_weapon_equipped(CHR_TARGET, WEAPON_NONE, /*goto*/ 0x13)
|
|
if_chr_weapon_equipped(CHR_TARGET, WEAPON_UNARMED, /*goto*/ 0x13)
|
|
if_chr_weapon_equipped(CHR_TARGET, WEAPON_COMBATBOOST, /*goto*/ 0x13)
|
|
if_chr_weapon_equipped(CHR_TARGET, WEAPON_HORIZONSCANNER, /*goto*/ 0x13)
|
|
if_chr_weapon_equipped(CHR_TARGET, WEAPON_SUITCASE, /*goto*/ 0x13)
|
|
set_ailist(CHR_SELF, GAILIST_UNALERTED_0004)
|
|
|
|
// Not disguised, or
|
|
// disguised but not 02000000, or
|
|
// disguised and 02000000 and has no weapon equipped.
|
|
// Wait 1 second, or for some field in the current chr to change.
|
|
label(0x13)
|
|
if_timer_lt(60, /*goto*/ 0x15)
|
|
if_chr_propsoundcount_zero(CHR_SELF, /*goto*/ 0x28)
|
|
goto_next(0x15)
|
|
|
|
// Field changed
|
|
label(0x28)
|
|
unset_self_flag_bankx(CHRFLAG1_DISSPEE, BANK_1)
|
|
stop_chr
|
|
|
|
// Field changed (follow through from above) or 1 second elapsed
|
|
label(0x15)
|
|
if_chr_idle(/*goto*/ 0x13)
|
|
goto_next(0x16)
|
|
|
|
label(0x13)
|
|
goto_first(0x00)
|
|
|
|
// Resume walking a path
|
|
label(0x16)
|
|
start_path
|
|
set_ailist(CHR_SELF, GAILIST_UNALERTED_0004)
|
|
endlist
|
|
};
|
|
|
|
u8 func000f_hand_combat[] = {
|
|
#define LABEL_FACE_TARGET 0x16
|
|
#define LABEL_PUNCH 0x16
|
|
|
|
if_chr_death_animation_finished(CHR_SELF, /*goto*/ 0x13)
|
|
if_chr_dead(CHR_SELF, /*goto*/ 0x13)
|
|
if_chr_knockedout(CHR_SELF, /*goto*/ 0x13)
|
|
goto_next(0x16)
|
|
|
|
// Dying
|
|
label(0x13)
|
|
set_shotlist(GAILIST_IDLE)
|
|
set_ailist(CHR_SELF, GAILIST_IDLE)
|
|
|
|
label(0x16)
|
|
set_action(MA_UNARMEDATTACK, FALSE)
|
|
restart_timer
|
|
|
|
// If current chr doesn't have this flag and isn't idle, stop them
|
|
if_self_flag_bankx_eq(CHRFLAG1_00000001, TRUE, BANK_1, /*goto*/ 0x0c)
|
|
if_chr_idle(/*goto*/ 0x0c)
|
|
stop_chr
|
|
|
|
// Begin loop
|
|
label(0x0c)
|
|
yield
|
|
if_chr_death_animation_finished(CHR_TARGET, /*goto*/ 0xfa)
|
|
if_chr_dead(CHR_TARGET, /*goto*/ 0xfa)
|
|
if_chr_knockedout(CHR_TARGET, /*goto*/ 0xfa)
|
|
|
|
// This if-statement is effectively a no op
|
|
dprint 'L','1','\n',0,
|
|
if_chrpresets_target_is_different(/*goto*/ 0x13)
|
|
|
|
dprint 'L','2','\n',0,
|
|
label(0x13)
|
|
dprint 'L','O','O','K',' ','F','O','R',' ','T','A','R','G','E','T','\n',0,
|
|
if_self_flag_bankx_eq(CHRFLAG1_00000001, TRUE, BANK_1, /*goto*/ 0x13)
|
|
if_chr_is_skedar(CHR_SELF, /*goto*/ 0x0f)
|
|
if_distance_to_target_gt(120, /*goto*/ 0x13)
|
|
goto_next(0x10)
|
|
|
|
label(0x0f)
|
|
if_distance_to_target_gt(150, /*goto*/ 0x13)
|
|
|
|
label(0x10)
|
|
if_can_see_attack_target(/*goto*/ 0x13)
|
|
if_timer_gt(120, /*goto*/ 0x0b)
|
|
goto_first(0x0c)
|
|
|
|
label(0x13)
|
|
if_target_is_player(/*goto*/ 0x0a)
|
|
if_self_flag_bankx_eq(CHRFLAG1_00000001, TRUE, BANK_1, /*goto*/ 0x13)
|
|
if_distance_to_target_gt(400, /*goto*/ 0x0b)
|
|
label(0x13)
|
|
if_chr_is_skedar(CHR_SELF, /*goto*/ 0x0f)
|
|
if_distance_to_target_lt(120, /*goto*/ LABEL_FACE_TARGET)
|
|
goto_next(0x10)
|
|
|
|
label(0x0f)
|
|
if_distance_to_target_lt(150, /*goto*/ LABEL_FACE_TARGET)
|
|
label(0x10)
|
|
label(0xe3)
|
|
restart_timer
|
|
dprint 'R','U','N',' ','T','O',' ','T','A','R','G','E','T','\n',0,
|
|
try_run_to_target(/*goto*/ 0x03)
|
|
|
|
beginloop(0x03)
|
|
if_chr_death_animation_finished(CHR_TARGET, /*goto*/ 0xfa)
|
|
if_chr_dead(CHR_TARGET, /*goto*/ 0xfa)
|
|
if_chr_knockedout(CHR_TARGET, /*goto*/ 0xfa)
|
|
label(0x13)
|
|
if_timer_gt(90, /*goto*/ 0x0b)
|
|
if_target_is_player(/*goto*/ 0x09)
|
|
if_self_flag_bankx_eq(CHRFLAG1_00000001, TRUE, BANK_1, /*goto*/ 0x13)
|
|
if_distance_to_target_gt(400, /*goto*/ 0x0b)
|
|
label(0x13)
|
|
if_chr_is_skedar(CHR_SELF, /*goto*/ 0x0f)
|
|
if_distance_to_target_lt(120, /*goto*/ LABEL_FACE_TARGET)
|
|
goto_next(0x10)
|
|
|
|
label(0x0f)
|
|
if_distance_to_target_lt(150, /*goto*/ LABEL_FACE_TARGET)
|
|
label(0x10)
|
|
endloop(0x03)
|
|
|
|
label(0x09)
|
|
if_chr_is_skedar(CHR_SELF, /*goto*/ 0x0f)
|
|
if_distance_to_target_lt(120, /*goto*/ LABEL_FACE_TARGET)
|
|
goto_next(0x10)
|
|
|
|
label(0x0f)
|
|
if_distance_to_target_lt(150, /*goto*/ LABEL_FACE_TARGET)
|
|
label(0x10)
|
|
if_self_flag_bankx_eq(CHRFLAG1_00000001, TRUE, BANK_1, /*goto*/ 0x13)
|
|
if_distance_to_target_gt(400, /*goto*/ 0x0b)
|
|
label(0x13)
|
|
goto_first(0x03)
|
|
|
|
label(0x0a)
|
|
if_chr_is_skedar(CHR_SELF, /*goto*/ 0x0f)
|
|
if_distance_to_target_lt(120, /*goto*/ LABEL_FACE_TARGET)
|
|
goto_next(0x10)
|
|
|
|
label(0x0f)
|
|
if_distance_to_target_lt(150, /*goto*/ LABEL_FACE_TARGET)
|
|
label(0x10)
|
|
if_distance_to_target_gt(400, /*goto*/ 0x0b)
|
|
goto_first(0xe3)
|
|
|
|
label(0x13)
|
|
restart_timer
|
|
goto_first(0x0c)
|
|
|
|
label(LABEL_FACE_TARGET)
|
|
restart_timer
|
|
dprint 'F','A','C','E',' ','T','A','R','G','E','T','\n',0,
|
|
if_target_in_fov_left(10, /*goto*/ LABEL_PUNCH)
|
|
if_target_out_of_fov_left(246, /*goto*/ LABEL_PUNCH)
|
|
stop_chr
|
|
try_face_entity(ENTITYTYPE_TARGET, 1, /*goto*/ 0x04)
|
|
|
|
beginloop(0x04)
|
|
if_chr_death_animation_finished(CHR_TARGET, /*goto*/ 0xfa)
|
|
if_chr_dead(CHR_TARGET, /*goto*/ 0xfa)
|
|
if_chr_knockedout(CHR_TARGET, /*goto*/ 0xfa)
|
|
label(0x13)
|
|
if_distance_to_target_gt(400, /*goto*/ 0x0b)
|
|
if_target_in_fov_left(15, /*goto*/ LABEL_PUNCH)
|
|
if_target_out_of_fov_left(240, /*goto*/ LABEL_PUNCH)
|
|
if_timer_gt(60, /*goto*/ LABEL_PUNCH)
|
|
endloop(0x04)
|
|
|
|
label(0x13)
|
|
restart_timer
|
|
goto_first(0x0c)
|
|
|
|
label(LABEL_PUNCH)
|
|
dprint 'P','U','N','C','H','\n',0,
|
|
try_punch_or_kick(/*goto*/ 0x13)
|
|
|
|
// Unable to punch or kick for some reason - return to main loop
|
|
restart_timer
|
|
goto_first(0x0c)
|
|
|
|
label(0x13)
|
|
add_morale(1)
|
|
if_chr_is_skedar(CHR_SELF, /*goto*/ 0x17)
|
|
goto_next(0x05)
|
|
|
|
label(0x17)
|
|
restart_timer
|
|
say_quip(CHR_BOND, QUIP_ATTACK2, 0xff, 0x03, 0xff, BANK_0, 0x00, 0x00)
|
|
|
|
beginloop(0x05)
|
|
if_timer_gt(180, /*goto*/ 0x16)
|
|
if_chr_stopped(/*goto*/ 0x16)
|
|
endloop(0x05)
|
|
|
|
label(0x16)
|
|
if_chr_injured_target(CHR_SELF, /*goto*/ 0x13)
|
|
dprint 'P','U','N','C','H','M','I','S','S','E','D','\n',0,
|
|
say_quip(CHR_BOND, QUIP_MISSEDPLAYER1, 0x19, 0x03, 0x00, BANK_0, 0x00, 0x00)
|
|
say_quip(CHR_BOND, QUIP_MISSEDPLAYER2, 0x19, 0x03, 0x01, BANK_0, 0x00, 0x00)
|
|
goto_next(0x16)
|
|
|
|
label(0x13)
|
|
dprint 'P','U','N','C','H','H','I','T','\n',0,
|
|
say_quip(CHR_BOND, QUIP_HITPLAYER, 0x19, 0x02, 0x00, BANK_0, 0x00, 0x00)
|
|
say_quip(CHR_BOND, QUIP_HITPLAYER, 0x19, 0x03, 0x01, BANK_0, 0x00, 0x00)
|
|
|
|
label(0x16)
|
|
goto_next(0x0b)
|
|
|
|
label(0xfa)
|
|
dprint 'T','A','R','G','E','T',' ','I','S',' ','D','Y','I','N','G','\n',0,
|
|
|
|
// Finished attack
|
|
label(0x0b)
|
|
dprint 'F','U','N',' ',' ','H','I','T','\n',0,
|
|
label(0x15)
|
|
if_self_flag_bankx_eq(CHRFLAG1_PUNCH_THEN_GENERAL_COMBAT, TRUE, BANK_1, /*goto*/ 0x13)
|
|
dprint 'R','E','T',' ','H','H','I','T','\n',0,
|
|
label(0x17)
|
|
return
|
|
|
|
label(0x13)
|
|
dprint 'D','E','T',' ','E','N','I','T','\n',0,
|
|
set_ailist(CHR_SELF, GAILIST_COMBAT_WITH_TARGET)
|
|
endlist
|
|
};
|
|
|
|
/**
|
|
* Used in Chicago, Air Base, and some other global functions.
|
|
*
|
|
* There is special logic for Chicago, where they don't care if you have a gun
|
|
* and say different things.
|
|
*
|
|
* The chr will make one comment, then it returns to the previous function.
|
|
*/
|
|
u8 func0010_civilian_say_comment[] = {
|
|
set_self_chrflag(CHRCFLAG_00040000)
|
|
set_shotlist(GAILIST_SURPRISED)
|
|
label(0x0c)
|
|
yield
|
|
dprint 'L','O','O','K',' ','F','O','R',' ','T','A','R','G','E','T','\n',0,
|
|
label(0x16)
|
|
restart_timer
|
|
dprint 'F','A','C','E',' ','T','A','R','G','E','T','\n',0,
|
|
try_face_entity(ENTITYTYPE_TARGET, 0, /*goto*/ 0x04)
|
|
|
|
// Wait until facing target, or a second has passed, or something else
|
|
// happens such as hearing gunfire or seeing someone die.
|
|
beginloop(0x04)
|
|
if_saw_injury(0x01, /*goto*/ 0x83)
|
|
if_saw_death(0x01, /*goto*/ 0x83)
|
|
if_target_in_fov_left(10, /*goto*/ 0x13)
|
|
if_target_out_of_fov_left(246, /*goto*/ 0x13)
|
|
if_timer_gt(60, /*goto*/ 0x13)
|
|
endloop(0x04)
|
|
|
|
// Facing target
|
|
label(0x13)
|
|
if_stage_is_not(STAGE_CHICAGO, /*goto*/ 0x16)
|
|
goto_next(0x0e)
|
|
|
|
// Not Chicago
|
|
label(0x16)
|
|
label(0x16)
|
|
set_self_flag_bankx(CHRFLAG1_DISSPEE, BANK_1)
|
|
dprint 'S','E','T',' ','D','I','S','S','P','E','E','\n',0,
|
|
if_chr_weapon_equipped(CHR_TARGET, WEAPON_NONE, /*goto*/ 0x07)
|
|
if_chr_weapon_equipped(CHR_TARGET, WEAPON_UNARMED, /*goto*/ 0x07)
|
|
if_chr_weapon_equipped(CHR_TARGET, WEAPON_COMBATBOOST, /*goto*/ 0x07)
|
|
if_chr_weapon_equipped(CHR_TARGET, WEAPON_HORIZONSCANNER, /*goto*/ 0x07)
|
|
if_chr_weapon_equipped(CHR_TARGET, WEAPON_SUITCASE, /*goto*/ 0x07)
|
|
goto_next(0x05)
|
|
|
|
// Unarmed
|
|
label(0x07)
|
|
restart_timer
|
|
if_chr_has_hiddenflag(CHR_SELF, CHRHFLAG_01000000, /*goto*/ 0x13)
|
|
do_preset_animation(-1)
|
|
say_quip(CHR_BOND, QUIP_GREETING, 0xff, 0x02, 0xff, BANK_0, 0x00, 0x00)
|
|
yield
|
|
|
|
// Set a do-once flag, so chr is only stopped the first time
|
|
dprint 'R','E','T','\n',0,
|
|
if_self_flag_bankx_eq(CHRFLAG1_DISSPEE, TRUE, BANK_1, /*goto*/ 0x13)
|
|
stop_chr
|
|
set_self_flag_bankx(CHRFLAG1_DISSPEE, BANK_1)
|
|
|
|
label(0x13)
|
|
set_chr_hiddenflag(CHR_SELF, CHRHFLAG_01000000)
|
|
return
|
|
|
|
// Armed
|
|
label(0x05)
|
|
if_chr_has_hiddenflag(CHR_TARGET, CHRHFLAG_01000000, /*goto*/ 0x06)
|
|
set_chr_hiddenflag(CHR_TARGET, CHRHFLAG_01000000)
|
|
say_quip(CHR_BOND, QUIP_ASKWEAPON1, 0xff, 0x02, 0xff, BANK_0, 0x00, 0x00)
|
|
do_preset_animation(6)
|
|
restart_timer
|
|
|
|
beginloop(0x08)
|
|
if_saw_injury(0x01, /*goto*/ 0x83)
|
|
if_saw_death(0x01, /*goto*/ 0x83)
|
|
if_timer_gt(180, /*goto*/ 0x16)
|
|
endloop(0x08)
|
|
|
|
// Unreachable
|
|
return
|
|
|
|
// Has chrflag2_01000000
|
|
label(0x06)
|
|
if_chr_in_view(/*goto*/ 0x13)
|
|
return
|
|
|
|
label(0x13)
|
|
set_chr_hiddenflag(CHR_TARGET, CHRHFLAG_02000000)
|
|
dprint 'D','O','N','T',' ','P','O','I','N','T','\n',0,
|
|
say_quip(CHR_BOND, QUIP_ASKWEAPON2, 0xff, 0x03, 0xff, BANK_0, 0x00, 0x00)
|
|
do_preset_animation(-1)
|
|
restart_timer
|
|
|
|
// Wait 3 seconds, or for see/hear gunfire
|
|
beginloop(0x09)
|
|
if_saw_injury(0x01, /*goto*/ 0x83)
|
|
if_saw_death(0x01, /*goto*/ 0x83)
|
|
if_timer_gt(180, /*goto*/ 0x16)
|
|
endloop(0x09)
|
|
|
|
// Timer expired
|
|
label(0x16)
|
|
return
|
|
label(0x15)
|
|
|
|
// Special Chicago logic
|
|
label(0x0e)
|
|
call_rng
|
|
if_rand_gt(128, /*goto*/ 0x16)
|
|
dprint 'B','4','T','A','L','K','\n',0,
|
|
if_stage_is_not(STAGE_CHICAGO, /*goto*/ 0x15) // will never pass
|
|
|
|
// 50% chance of this happening
|
|
say_quip(CHR_BOND, 0x16, 0xff, 0x00, 0xff, 0x81, 0x00, 0x00)
|
|
goto_next(0x13)
|
|
|
|
// 50% chance of this happening
|
|
label(0x16)
|
|
say_quip(CHR_BOND, 0x17, 0xff, 0x00, 0xff, 0x81, 0x00, 0x00)
|
|
label(0x13)
|
|
do_preset_animation(3)
|
|
return
|
|
|
|
// Not Chicago
|
|
label(0x15)
|
|
say_quip(CHR_BOND, 0x22, 0xff, 0x00, 0xff, 0x81, 0x00, 0x00)
|
|
goto_next(0x13)
|
|
|
|
label(0x16)
|
|
say_quip(CHR_BOND, 0x23, 0xff, 0x00, 0xff, 0x81, 0x00, 0x00)
|
|
label(0x13)
|
|
do_preset_animation(3)
|
|
return
|
|
|
|
label(0x83)
|
|
set_alertness(100)
|
|
set_ailist(CHR_SELF, GAILIST_UNALERTED)
|
|
endlist
|
|
};
|
|
|
|
/**
|
|
* This function is only used by civilians while they say comments...?
|
|
*/
|
|
u8 func001c_surprised[] = {
|
|
set_shotlist(GAILIST_ALERTED)
|
|
increase_squadron_alertness(100)
|
|
say_quip(CHR_BOND, QUIP_SHOTUNALERT, 0xff, 0x03, 0x00, BANK_0, 0x00, 0x00)
|
|
restart_timer
|
|
chr_do_animation(ANIM_SURPRISED_0202, 0, -1, 0x00, 0x10, CHR_SELF, 2)
|
|
|
|
// Wait 1 second
|
|
beginloop(0x03)
|
|
dprint 'S','6',0,
|
|
if_timer_gt(60, /*goto*/ 0x77)
|
|
endloop(0x03)
|
|
|
|
label(0x77)
|
|
set_ailist(CHR_SELF, GAILIST_ALERTED)
|
|
set_returnlist(CHR_SELF, GAILIST_ALERTED)
|
|
endlist
|
|
};
|
|
|
|
u8 func0011_flee_from_grenade[] = {
|
|
set_action(MA_RUNFROMGRENADE, FALSE)
|
|
dprint 'N','E','A','R',' ','D','A','N','G','E','R','\n',0,
|
|
run_from_grenade
|
|
say_quip(CHR_BOND, QUIP_GRENADE1, 0xff, 0x00, 0xff, BANK_0, 0x00, 0x00)
|
|
restart_timer
|
|
|
|
beginloop(0x0c)
|
|
dprint 'D','A','N','G','E','R',' ','L','O','O','P','\n',0,
|
|
if_dangerous_object_nearby(3, /*goto*/ 0x13)
|
|
goto_next(0x16)
|
|
|
|
label(0x13)
|
|
if_timer_gt(180, /*goto*/ 0x16)
|
|
endloop(0x0c)
|
|
|
|
label(0x16)
|
|
return
|
|
endlist
|
|
};
|
|
|
|
u8 func001b_observe_camspy[] = {
|
|
stop_chr
|
|
set_shotlist(GAILIST_ALERTED)
|
|
unset_self_flag_bankx(CHRFLAG1_DOINGIDLEANIMATION, BANK_1)
|
|
set_chr_special_death_animation(CHR_SELF, SPECIALDIE_NONE)
|
|
set_chrpreset(CHR_TARGET)
|
|
|
|
if_just_injured(CHR_SELF, /*goto*/ 0x09)
|
|
dprint 'E','Y','E',' ','S','P','Y','\n',0,
|
|
|
|
label(0x00)
|
|
set_target_chr(CHR_PRESET)
|
|
if_distance_to_target_lt(300, /*goto*/ 0x13)
|
|
try_jog_to_target(/*goto*/ 0x0c)
|
|
restart_timer
|
|
|
|
beginloop(0x0c)
|
|
if_timer_gt(60, /*goto*/ 0x0b)
|
|
if_distance_to_target_lt(300, /*goto*/ 0x13)
|
|
chr_toggle_p1p2(CHR_SELF)
|
|
set_target_chr(CHR_P1P2)
|
|
if_target_outside_my_yvisang(/*goto*/ 0x16)
|
|
if_target_in_sight(/*goto*/ 0x0b)
|
|
label(0x16)
|
|
set_target_chr(CHR_PRESET)
|
|
endloop(0x0c)
|
|
|
|
// At camspy
|
|
label(0x13)
|
|
set_target_chr(CHR_PRESET)
|
|
restart_timer
|
|
try_face_entity(ENTITYTYPE_TARGET, 0, /*goto*/ 0x03)
|
|
|
|
// Wait 5 seconds. During this time:
|
|
// - If the camspy moves away, exit the loop and follow it
|
|
// - If the player comes into sight, return from the function
|
|
beginloop(0x03)
|
|
if_timer_gt(300, /*goto*/ 0x04)
|
|
if_distance_to_target_gt(400, /*goto*/ 0x13)
|
|
chr_toggle_p1p2(CHR_SELF)
|
|
set_target_chr(CHR_P1P2)
|
|
if_target_outside_my_yvisang(/*goto*/ 0x16)
|
|
if_target_in_sight(/*goto*/ 0x0b)
|
|
label(0x16)
|
|
set_target_chr(CHR_PRESET)
|
|
endloop(0x03)
|
|
|
|
// Camspy moved away - follow it
|
|
label(0x13)
|
|
goto_first(0x00)
|
|
|
|
// Timer expired
|
|
label(0x04)
|
|
do_preset_animation(-1)
|
|
say_quip(CHR_BOND, QUIP_SEEEYESPY, 0xff, 0x00, 0xff, BANK_0, 0x00, 0x00)
|
|
|
|
// Wait another 5 seconds with same logic as previous timer
|
|
beginloop(0x05)
|
|
if_chr_idle(/*goto*/ 0x13)
|
|
if_timer_gt(300, /*goto*/ 0x06)
|
|
label(0x13)
|
|
chr_toggle_p1p2(CHR_SELF)
|
|
set_target_chr(CHR_P1P2)
|
|
if_target_outside_my_yvisang(/*goto*/ 0x16)
|
|
if_target_in_sight(/*goto*/ 0x0b)
|
|
label(0x16)
|
|
set_target_chr(CHR_PRESET)
|
|
endloop(0x05)
|
|
|
|
// Timer expired
|
|
label(0x06)
|
|
if_self_flag_bankx_eq(CHRFLAG1_LONG_CAMSPY_OBSERVATION, FALSE, BANK_1, /*goto*/ 0xe8)
|
|
unset_self_flag_bankx(CHRFLAG1_LONG_CAMSPY_OBSERVATION, BANK_1)
|
|
goto_first(0x00)
|
|
|
|
// Player in sight while observing camspy
|
|
label(0x0b)
|
|
return
|
|
|
|
// Timer expired second time
|
|
label(0xe8)
|
|
say_quip(CHR_BOND, QUIP_UNCOVEREDDISGUISE2, 0xff, 0x03, 0xff, BANK_0, 0x00, 0x00)
|
|
|
|
// Shoot camspy
|
|
label(0x09)
|
|
set_self_chrflag(CHRCFLAG_00000040)
|
|
try_attack_stand(ENTITYTYPE_TARGET | ENTITYTYPE_AIMONLY, 0, /*goto*/ 0x16)
|
|
label(0x16)
|
|
try_modify_attack(ENTITYTYPE_TARGET, 0, /*goto*/ 0xc3)
|
|
|
|
// Wait until shooting animation done
|
|
beginloop(0xc3)
|
|
if_chr_stopped(/*goto*/ 0x16)
|
|
endloop(0xc3)
|
|
|
|
label(0x16)
|
|
dprint 'E','1','\n',0,
|
|
if_chr_death_animation_finished(CHR_TARGET, /*goto*/ 0x13)
|
|
if_chr_dead(CHR_TARGET, /*goto*/ 0x13)
|
|
if_chr_knockedout(CHR_TARGET, /*goto*/ 0x13)
|
|
|
|
// Camspy still alive
|
|
dprint 'E','2','\n',0,
|
|
if_can_see_target(/*goto*/ 0x16)
|
|
dprint 'E','3','\n',0,
|
|
goto_next(0x13)
|
|
|
|
// Unreachable - no label
|
|
dprint 'E','4','\n',0,
|
|
if_chrpresets_target_is_different(/*goto*/ 0x16)
|
|
dprint 'E','5','\n',0,
|
|
goto_next(0x13)
|
|
|
|
label(0x16)
|
|
dprint 'E','6','\n',0,
|
|
if_target_is_player(/*goto*/ 0x13)
|
|
dprint 'E','7','\n',0,
|
|
goto_first(0x09)
|
|
|
|
label(0x13)
|
|
set_target_chr(CHR_BOND)
|
|
dprint 'E','8','\n',0,
|
|
set_self_flag_bankx(CHRFLAG1_10000000, BANK_1)
|
|
set_ailist(CHR_SELF, GAILIST_SEARCH_FOR_PLAYER)
|
|
endlist
|
|
};
|
|
|
|
u8 func001d_search_for_player[] = {
|
|
if_chr_death_animation_finished(CHR_SELF, /*goto*/ 0x13)
|
|
if_chr_dead(CHR_SELF, /*goto*/ 0x13)
|
|
if_chr_knockedout(CHR_SELF, /*goto*/ 0x13)
|
|
goto_next(0x16)
|
|
|
|
// Dying
|
|
label(0x13)
|
|
set_shotlist(GAILIST_IDLE)
|
|
set_ailist(CHR_SELF, GAILIST_IDLE)
|
|
|
|
// Alive
|
|
label(0x16)
|
|
if_self_flag_bankx_eq(CHRFLAG1_DOINGIDLEANIMATION, FALSE, BANK_1, /*goto*/ 0x13)
|
|
set_chr_special_death_animation(CHR_SELF, SPECIALDIE_NONE)
|
|
label(0x13)
|
|
dprint 'S','E','A','R','C','H',' ','R','O','O','M','\n',0,
|
|
set_chr_dodge_rating(2, 0x00)
|
|
label(0x00)
|
|
set_target_chr(CHR_PRESET)
|
|
set_self_flag_bankx(CHRFLAG1_01000000, BANK_1)
|
|
if_self_flag_bankx_eq(CHRFLAG1_10000000, TRUE, BANK_1, /*goto*/ 0x16)
|
|
set_chr_roomtosearch
|
|
if_distance_to_target_gt(1000, /*goto*/ 0x13)
|
|
try_jog_to_target(/*goto*/ 0x03)
|
|
label(0x13)
|
|
try_run_to_target(/*goto*/ 0x03)
|
|
|
|
beginloop(0x03)
|
|
dprint 'S','E','A','R','C','H','I','N','I','T','\n',0,
|
|
chr_toggle_p1p2(CHR_SELF)
|
|
set_target_chr(CHR_P1P2)
|
|
if_target_in_sight(/*goto*/ 0x12)
|
|
if_self_flag_bankx_eq(CHRFLAG0_AIVSAI, FALSE, BANK_0, /*goto*/ 0x13)
|
|
if_enemy_distance_lt_and_los(2540, /*goto*/ 0xc3)
|
|
label(0x13)
|
|
if_chr_in_room(CHR_SELF, 0x01, 0x0001, /*goto*/ 0x16)
|
|
endloop(0x03)
|
|
|
|
// Player is in the same room as self
|
|
label(0x16)
|
|
restart_timer
|
|
|
|
beginloop(0x0a)
|
|
dprint 'P','O','I','N','T',' ','S','R','C','H','\n',0,
|
|
if_self_flag_bankx_eq(CHRFLAG0_AIVSAI, FALSE, BANK_0, /*goto*/ 0x13)
|
|
if_self_flag_bankx_eq(CHRFLAG1_00000400, TRUE, BANK_1, /*goto*/ 0x15)
|
|
if_enemy_distance_lt_and_los(2540, /*goto*/ 0xc3)
|
|
goto_next(0x13)
|
|
|
|
label(0x15)
|
|
if_enemy_distance_lt_and_los(100, /*goto*/ 0xc3)
|
|
label(0x13)
|
|
if_self_flag_bankx_eq(CHRFLAG1_00000400, FALSE, BANK_1, /*goto*/ 0x13)
|
|
if_distance_to_target_lt(500, /*goto*/ 0x13)
|
|
goto_next(0x05)
|
|
|
|
label(0x13)
|
|
chr_toggle_p1p2(CHR_SELF)
|
|
set_target_chr(CHR_P1P2)
|
|
if_target_outside_my_yvisang(/*goto*/ 0x15)
|
|
if_target_in_sight(/*goto*/ 0x12)
|
|
label(0x15)
|
|
if_timer_gt(30, /*goto*/ 0x05)
|
|
endloop(0x0a)
|
|
|
|
label(0x05)
|
|
restart_timer
|
|
label(0x06)
|
|
if_distance_to_target_lt(1000, /*goto*/ 0x13)
|
|
goto_first(0x00)
|
|
|
|
label(0x13)
|
|
stop_chr
|
|
if_self_flag_bankx_eq(CHRFLAG1_DONE_SEARCH_ANIM, TRUE, BANK_1, /*goto*/ 0x13)
|
|
call_rng
|
|
if_rand_gt(128, /*goto*/ 0x13)
|
|
call_rng
|
|
if_rand_lt(64, /*goto*/ 0x28)
|
|
if_rand_lt(128, /*goto*/ 0x29)
|
|
if_rand_lt(196, /*goto*/ 0x2a)
|
|
set_self_flag_bankx(CHRFLAG1_DONE_SEARCH_ANIM, BANK_1)
|
|
chr_do_animation(ANIM_LOOK_AROUND_025B, 0, -1, 0x10, 0x0a, CHR_SELF, 2)
|
|
goto_next(0x04)
|
|
|
|
label(0x28)
|
|
chr_do_animation(ANIM_LOOK_AROUND_025C, 0, -1, 0x10, 0x0a, CHR_SELF, 2)
|
|
goto_next(0x04)
|
|
|
|
label(0x29)
|
|
chr_do_animation(ANIM_LOOK_AROUND_025D, 0, -1, 0x10, 0x0a, CHR_SELF, 2)
|
|
goto_next(0x04)
|
|
|
|
label(0x2a)
|
|
chr_do_animation(ANIM_LOOK_AROUND_025E, 0, -1, 0x10, 0x0a, CHR_SELF, 2)
|
|
goto_next(0x04)
|
|
|
|
label(0x13)
|
|
unset_self_flag_bankx(CHRFLAG1_DONE_SEARCH_ANIM, BANK_1)
|
|
call_rng
|
|
if_rand_lt(64, /*goto*/ 0x28)
|
|
if_rand_lt(128, /*goto*/ 0x29)
|
|
if_rand_lt(196, /*goto*/ 0x2a)
|
|
try_set_target_pad_to_something(0x08, /*goto*/ 0x13)
|
|
label(0x28)
|
|
try_set_target_pad_to_something(0x02, /*goto*/ 0x13)
|
|
label(0x29)
|
|
try_set_target_pad_to_something(0x04, /*goto*/ 0x13)
|
|
label(0x2a)
|
|
try_set_target_pad_to_something(0x08, /*goto*/ 0x13)
|
|
goto_next(0x04)
|
|
|
|
label(0x13)
|
|
go_to_target_pad(SPEED_WALK)
|
|
|
|
beginloop(0x04)
|
|
dprint 'W','A','L','K',' ','P','A','D','\n',0,
|
|
if_self_flag_bankx_eq(CHRFLAG0_AIVSAI, FALSE, BANK_0, /*goto*/ 0x13)
|
|
if_enemy_distance_lt_and_los(2540, /*goto*/ 0xc3)
|
|
label(0x13)
|
|
if_self_flag_bankx_eq(CHRFLAG1_00000400, FALSE, BANK_1, /*goto*/ 0x13)
|
|
if_distance_to_target_lt(500, /*goto*/ 0x13)
|
|
label(0x13)
|
|
chr_toggle_p1p2(CHR_SELF)
|
|
set_target_chr(CHR_P1P2)
|
|
dprint '1','\n',0,
|
|
if_timer_gt(600, /*goto*/ 0x0b)
|
|
dprint '1','\n',0,
|
|
if_chr_stopped(/*goto*/ 0x16)
|
|
dprint '1','\n',0,
|
|
if_hears_target(/*goto*/ 0x12)
|
|
dprint '1','\n',0,
|
|
if_alertness(99, OPERATOR_GREATER_THAN, /*goto*/ 0x12)
|
|
dprint '1','\n',0,
|
|
if_near_miss(/*goto*/ 0x12)
|
|
dprint '1','\n',0,
|
|
if_self_flag_bankx_eq(CHRFLAG1_00000400, FALSE, BANK_1, /*goto*/ 0x13)
|
|
if_distance_to_target_gt(500, /*goto*/ 0x15)
|
|
label(0x13)
|
|
dprint 'C','H','E','K',' ','V','I','S','\n',0,
|
|
if_target_outside_my_yvisang(/*goto*/ 0x15)
|
|
if_target_in_sight(/*goto*/ 0x12)
|
|
label(0x15)
|
|
if_saw_death(0x00, /*goto*/ 0x28)
|
|
endloop(0x04)
|
|
|
|
label(0x16)
|
|
goto_first(0x06)
|
|
|
|
// Saw death?
|
|
label(0x28)
|
|
dprint 'E','Y','E',' ','S','P','Y','\n',0,
|
|
label(0x12)
|
|
if_chr_has_hiddenflag(CHR_TARGET, CHRHFLAG_DISGUISED, /*goto*/ 0x13)
|
|
goto_next(0x16)
|
|
|
|
label(0x13)
|
|
set_alertness(0)
|
|
set_returnlist(CHR_SELF, GAILIST_UNALERTED)
|
|
set_ailist(CHR_SELF, GAILIST_UNALERTED)
|
|
|
|
label(0x16)
|
|
set_alertness(100)
|
|
dprint 'S','E','E',' ','P','L','A','Y','\n',0,
|
|
if_self_flag_bankx_eq(CHRFLAG1_00000400, FALSE, BANK_1, /*goto*/ 0x13)
|
|
say_quip(CHR_BOND, QUIP_SEARCHSUCCESS, 0xff, 0x03, 0xff, BANK_0, 0x00, 0x00)
|
|
label(0x13)
|
|
set_ailist(CHR_SELF, GAILIST_ALERTED)
|
|
label(0x0b)
|
|
say_quip(CHR_BOND, QUIP_SEARCHFAIL, 0x32, 0x03, 0xff, BANK_0, 0x00, 0x00)
|
|
goto_first(0x05)
|
|
|
|
label(0xc3)
|
|
if_chr_has_hiddenflag(CHR_TARGET, CHRHFLAG_DISGUISED, /*goto*/ 0x13)
|
|
goto_next(0x16)
|
|
|
|
label(0x13)
|
|
set_alertness(0)
|
|
set_returnlist(CHR_SELF, GAILIST_UNALERTED)
|
|
set_ailist(CHR_SELF, GAILIST_UNALERTED)
|
|
|
|
label(0x16)
|
|
set_returnlist(CHR_SELF, GAILIST_UNALERTED)
|
|
set_shotlist(GAILIST_COMBAT_WITH_TARGET)
|
|
set_ailist(CHR_SELF, GAILIST_COMBAT_WITH_TARGET)
|
|
endlist
|
|
};
|
|
|
|
u8 func001f_related_to_spawning[] = {
|
|
dprint 'S','E','E',' ','P','L','A','Y','\n',0,
|
|
if_chr_dead(CHR_SELF, /*goto*/ 0x13)
|
|
if_chr_death_animation_finished(CHR_SELF, /*goto*/ 0x13)
|
|
if_chr_knockedout(CHR_SELF, /*goto*/ 0x13)
|
|
goto_next(0x16)
|
|
|
|
// Dying
|
|
label(0x13)
|
|
set_shotlist(GAILIST_IDLE)
|
|
set_ailist(CHR_SELF, GAILIST_IDLE)
|
|
|
|
// Alive
|
|
label(0x16)
|
|
set_returnlist(CHR_SELF, GAILIST_RELATED_TO_SPAWNING)
|
|
set_target_chr(CHR_P1P2)
|
|
set_shotlist(GAILIST_RELATED_TO_SPAWNING)
|
|
if_num_times_shot_lt(1, /*goto*/ 0x1a) // pointless check
|
|
label(0x1a)
|
|
set_action(MA_NORMAL, TRUE)
|
|
yield
|
|
chr_toggle_p1p2(CHR_SELF)
|
|
set_target_chr(CHR_P1P2)
|
|
if_alertness(100, OPERATOR_LESS_THAN, /*goto*/ 0x16)
|
|
goto_next(0x78)
|
|
|
|
// Not alert
|
|
label(0x16)
|
|
if_saw_death(0x01, /*goto*/ 0x1e)
|
|
if_saw_injury(0x01, /*goto*/ 0x1e)
|
|
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)
|
|
if_enemy_distance_lt_and_los(2540, /*goto*/ 0x13)
|
|
goto_next(0x16)
|
|
|
|
label(0x13)
|
|
goto_next(0x12)
|
|
|
|
label(0x16)
|
|
if_near_miss(/*goto*/ 0x1e)
|
|
if_num_times_shot_gt(0, /*goto*/ 0x1e)
|
|
if_self_flag_bankx_eq(CHRFLAG0_NOHEAR, FALSE, BANK_0, /*goto*/ 0x16)
|
|
if_can_see_target(/*goto*/ 0x16)
|
|
goto_next(0x13)
|
|
|
|
label(0x16)
|
|
if_heard_target_recently(/*goto*/ 0x1f)
|
|
label(0x13)
|
|
if_self_flag_bankx_eq(CHRFLAG0_CAN_HEAR_ALARMS, FALSE, BANK_0, /*goto*/ 0x16)
|
|
if_alarm_active(/*goto*/ 0x23)
|
|
label(0x16)
|
|
goto_first(0x1a)
|
|
|
|
label(0x1e)
|
|
dprint 'S','E','E',' ','D','E','T','E','C','T','\n',0,
|
|
say_quip(CHR_BOND, QUIP_SEEPLAYER, 0xff, 0x03, 0xff, BANK_0, 0x00, 0x00)
|
|
label(0x9f)
|
|
increase_squadron_alertness(100)
|
|
set_alertness(255)
|
|
set_returnlist(CHR_SELF, GAILIST_RELATED_TO_SPAWNING)
|
|
set_ailist(CHR_SELF, GAILIST_COMBAT_WITH_TARGET)
|
|
|
|
label(0x1f)
|
|
yield
|
|
say_quip(CHR_BOND, QUIP_HEARNOISE, 0xff, 0x03, 0xff, BANK_0, 0x00, 0x00)
|
|
if_self_flag_bankx_eq(CHRFLAG0_CAN_HEARSPAWN, TRUE, BANK_0, /*goto*/ 0xda)
|
|
increase_squadron_alertness(100)
|
|
set_returnlist(CHR_SELF, GAILIST_RELATED_TO_SPAWNING)
|
|
set_ailist(CHR_SELF, GAILIST_COMBAT_WITH_TARGET)
|
|
|
|
label(0xda)
|
|
if_never_been_onscreen(/*goto*/ 0x0e)
|
|
set_returnlist(CHR_SELF, GAILIST_RELATED_TO_SPAWNING)
|
|
set_ailist(CHR_SELF, GAILIST_COMBAT_WITH_TARGET)
|
|
|
|
label(0x0e)
|
|
if_chr_death_animation_finished(CHR_CLONE, /*goto*/ 0x0e)
|
|
if_chr_knockedout(CHR_CLONE, /*goto*/ 0x0e)
|
|
set_returnlist(CHR_SELF, GAILIST_RELATED_TO_SPAWNING)
|
|
set_ailist(CHR_SELF, GAILIST_RELATED_TO_SPAWNING)
|
|
|
|
label(0x0e)
|
|
try_spawn_clone2(CHR_SELF, GAILIST_SEARCH_FOR_PLAYER, 0x00000000, /*goto*/ 0x13)
|
|
set_returnlist(CHR_SELF, GAILIST_RELATED_TO_SPAWNING)
|
|
set_ailist(CHR_SELF, GAILIST_COMBAT_WITH_TARGET)
|
|
|
|
label(0x13)
|
|
set_ailist(CHR_SELF, GAILIST_RELATED_TO_SPAWNING)
|
|
|
|
// Alert
|
|
label(0x78)
|
|
if_self_flag_bankx_eq(CHRFLAG0_CAN_HEARSPAWN, FALSE, BANK_0, /*goto*/ 0x13)
|
|
set_alertness(0)
|
|
goto_first(0xda)
|
|
|
|
label(0x13)
|
|
set_returnlist(CHR_SELF, GAILIST_RELATED_TO_SPAWNING)
|
|
set_ailist(CHR_SELF, GAILIST_COMBAT_WITH_TARGET)
|
|
|
|
label(0x12)
|
|
if_self_flag_bankx_eq(CHRFLAG1_00100000, TRUE, BANK_1, /*goto*/ 0x13)
|
|
set_returnlist(CHR_SELF, GAILIST_RELATED_TO_SPAWNING)
|
|
|
|
label(0x13)
|
|
dprint 'W','A','R','N','E','D','B','E','N','D','3','\n',0,
|
|
set_returnlist(CHR_SELF, GAILIST_RELATED_TO_SPAWNING)
|
|
set_ailist(CHR_SELF, GAILIST_COMBAT_WITH_TARGET)
|
|
endlist
|
|
};
|
|
|
|
/**
|
|
* Not used?
|
|
*/
|
|
u8 func0012_init_coop_100[] = {
|
|
set_chr_hiddenflag(CHR_SELF, CHRHFLAG_PASSIVE)
|
|
set_self_chrflag(CHRCFLAG_00040000)
|
|
set_chr_team(CHR_SELF, TEAM_ALLY)
|
|
set_self_chrflag(CHRCFLAG_PUSHABLE)
|
|
set_chr_hiddenflag(CHR_SELF, CHRHFLAG_PSYCHOSISED)
|
|
set_alertness(100)
|
|
set_chrpreset(CHR_BOND)
|
|
yield
|
|
rebuild_teams
|
|
rebuild_squadrons
|
|
yield
|
|
yield
|
|
yield
|
|
yield
|
|
yield
|
|
yield
|
|
yield
|
|
yield
|
|
|
|
// Wait for intro to finish
|
|
beginloop(0x03)
|
|
if_camera_animating(/*goto*/ 0x13)
|
|
goto_next(0x16)
|
|
|
|
label(0x13)
|
|
endloop(0x03)
|
|
|
|
label(0x16)
|
|
rebuild_teams
|
|
rebuild_squadrons
|
|
set_target_chr(-1)
|
|
|
|
// Set stage flag 00000080 for Air Force One and Skedar Ruins
|
|
if_stage_is_not(STAGE_AIRFORCEONE, /*goto*/ 0x15)
|
|
set_stage_flag(0x00000080)
|
|
label(0x15)
|
|
|
|
if_stage_is_not(STAGE_SKEDARRUINS, /*goto*/ 0x15)
|
|
set_stage_flag(0x00000080)
|
|
label(0x15)
|
|
|
|
// Uncloak
|
|
set_chr_cloaked(CHR_SELF, FALSE, TRUE)
|
|
|
|
// Wait 2 seconds
|
|
restart_timer
|
|
|
|
beginloop(0x04)
|
|
if_timer_gt(120, /*goto*/ 0x16)
|
|
endloop(0x04)
|
|
|
|
label(0x16)
|
|
set_target_chr(-1)
|
|
|
|
// Set the flags again
|
|
if_stage_is_not(STAGE_AIRFORCEONE, /*goto*/ 0x15)
|
|
set_stage_flag(0x00000080)
|
|
|
|
label(0x15)
|
|
if_stage_is_not(STAGE_SKEDARRUINS, /*goto*/ 0x15)
|
|
set_stage_flag(0x00000080)
|
|
|
|
label(0x15)
|
|
set_ailist(CHR_SELF, GAILIST_COOP_BUDDY)
|
|
endlist
|
|
};
|
|
|
|
/**
|
|
* Similar to the previous function, but with minor differences.
|
|
* Alertness is 200 for example.
|
|
*
|
|
* Not used?
|
|
*/
|
|
u8 func0013_init_coop_200[] = {
|
|
set_chr_hiddenflag(CHR_SELF, CHRHFLAG_PASSIVE)
|
|
set_chr_team(CHR_SELF, TEAM_ALLY)
|
|
set_self_chrflag(CHRCFLAG_00040000)
|
|
set_self_chrflag(CHRCFLAG_PUSHABLE)
|
|
set_chr_hiddenflag(CHR_SELF, CHRHFLAG_PSYCHOSISED)
|
|
set_alertness(200)
|
|
yield
|
|
yield
|
|
yield
|
|
yield
|
|
yield
|
|
yield
|
|
yield
|
|
yield
|
|
yield
|
|
set_self_chrflag(CHRCFLAG_RUNFASTER)
|
|
|
|
// Wait for intro to finish
|
|
beginloop(0x03)
|
|
if_camera_animating(/*goto*/ 0x13)
|
|
goto_next(0x16)
|
|
|
|
label(0x13)
|
|
endloop(0x03)
|
|
|
|
label(0x16)
|
|
rebuild_teams
|
|
rebuild_squadrons
|
|
set_chr_cloaked(CHR_SELF, FALSE, TRUE)
|
|
|
|
// Wait 2 seconds
|
|
restart_timer
|
|
|
|
beginloop(0x04)
|
|
if_timer_gt(120, /*goto*/ 0x16)
|
|
endloop(0x04)
|
|
|
|
label(0x16)
|
|
set_target_chr(-1)
|
|
|
|
// Set stage flag 00000080 for Air Force One and Skedar Ruins
|
|
if_stage_is_not(STAGE_AIRFORCEONE, /*goto*/ 0x15)
|
|
set_stage_flag(0x00000080)
|
|
|
|
label(0x15)
|
|
if_stage_is_not(STAGE_SKEDARRUINS, /*goto*/ 0x15)
|
|
set_stage_flag(0x00000080)
|
|
|
|
label(0x15)
|
|
set_ailist(CHR_SELF, GAILIST_COOP_BUDDY)
|
|
endlist
|
|
};
|
|
|
|
u8 func0014_coop_buddy[] = {
|
|
#define LABEL_PLACE_BUDDY 0x0a
|
|
|
|
set_returnlist(CHR_SELF, GAILIST_COOP_BUDDY)
|
|
set_shotlist(GAILIST_COOP_BUDDY)
|
|
dprint 'B','A','C','K',' ','T','O',' ','B','U','D','D','Y','\n',0,
|
|
unset_self_chrflag(CHRCFLAG_00040000)
|
|
set_self_flag_bankx(CHRFLAG1_00100000, BANK_1)
|
|
set_morale(0)
|
|
set_shotlist(GAILIST_COOP_BUDDY)
|
|
set_target_chr(CHR_BOND)
|
|
if_chr_dead(CHR_SELF, /*goto*/ 0x13)
|
|
if_chr_death_animation_finished(CHR_SELF, /*goto*/ 0x13)
|
|
if_chr_knockedout(CHR_SELF, /*goto*/ 0x13)
|
|
goto_next(0x16)
|
|
|
|
// Dying
|
|
label(0x13)
|
|
dprint 'B','U','D','D','Y',' ','D','I','E','\n',0,
|
|
set_ailist(CHR_SELF, GAILIST_IDLE)
|
|
|
|
// Alive
|
|
label(0x16)
|
|
if_just_injured(CHR_SELF, /*goto*/ 0x13)
|
|
goto_next(0x16)
|
|
|
|
// Injured
|
|
label(0x13)
|
|
say_quip(CHR_BOND, QUIP_INJURED2, 0xff, 0x14, 0xff, BANK_0, 0x00, 0x00)
|
|
dprint 'B','U','D','D','Y',' ','W','O','U','N','D','\n',0,
|
|
|
|
beginloop(0xf2)
|
|
if_chr_has_hiddenflag(CHR_BOND, CHRHFLAG_TRIGGER_BUDDY_WARP, /*goto*/ 0x13)
|
|
unset_chr_hiddenflag(CHR_SELF, CHRHFLAG_UNTARGETABLE)
|
|
goto_next(0x15)
|
|
|
|
label(0x13)
|
|
if_chr_has_hiddenflag(CHR_SELF, CHRHFLAG_UNTARGETABLE, /*goto*/ 0x15)
|
|
goto_next(LABEL_PLACE_BUDDY)
|
|
|
|
label(0x15)
|
|
if_chr_stopped(/*goto*/ 0x16)
|
|
endloop(0xf2)
|
|
|
|
// Healthy
|
|
label(0x16)
|
|
if_chr_has_hiddenflag(CHR_TARGET, CHRHFLAG_08000000, /*goto*/ 0x13)
|
|
unset_self_flag_bankx(CHRFLAG1_00000001, BANK_1)
|
|
goto_next(0x16)
|
|
|
|
label(0x13)
|
|
set_self_flag_bankx(CHRFLAG1_00000001, BANK_1)
|
|
label(0x16)
|
|
if_chr_has_hiddenflag(CHR_SELF, CHRHFLAG_PASSIVE, /*goto*/ 0xdc)
|
|
if_enemy_distance_lt_and_los(2540, /*goto*/ 0x03)
|
|
label(0xdc)
|
|
set_target_chr(CHR_BOND)
|
|
if_distance_to_target_lt(200, /*goto*/ 0x16)
|
|
|
|
// Start outer loop
|
|
label(0x00)
|
|
dprint 'B','U','D','D','Y',' ','G','O',' ','T','O','W','A','R','D','S','\n',0,
|
|
set_target_chr(CHR_BOND)
|
|
restart_timer
|
|
if_distance_to_target_gt(300, /*goto*/ 0x16)
|
|
try_jog_to_target(/*goto*/ 0x0c)
|
|
label(0x16)
|
|
try_run_to_target(/*goto*/ 0x0c)
|
|
|
|
beginloop(0x0c)
|
|
if_chr_has_hiddenflag(CHR_BOND, CHRHFLAG_TRIGGER_BUDDY_WARP, /*goto*/ 0x13)
|
|
unset_chr_hiddenflag(CHR_SELF, CHRHFLAG_UNTARGETABLE)
|
|
goto_next(0x15)
|
|
|
|
label(0x13)
|
|
if_chr_has_hiddenflag(CHR_SELF, CHRHFLAG_UNTARGETABLE, /*goto*/ 0x15)
|
|
goto_next(LABEL_PLACE_BUDDY)
|
|
|
|
label(0x15)
|
|
if_chr_has_hiddenflag(CHR_TARGET, CHRHFLAG_DISGUISED, /*goto*/ 0x06)
|
|
goto_next(0x07)
|
|
|
|
label(0x06)
|
|
set_chr_hiddenflag(CHR_SELF, CHRHFLAG_DISGUISED)
|
|
label(0x07)
|
|
set_target_chr(CHR_BOND)
|
|
if_can_see_target(/*goto*/ 0xdd)
|
|
if_chr_has_hiddenflag(CHR_SELF, CHRHFLAG_PASSIVE, /*goto*/ 0xdc)
|
|
label(0xdd)
|
|
if_enemy_distance_lt_and_los(2540, /*goto*/ 0x03)
|
|
label(0xdc)
|
|
set_target_chr(CHR_BOND)
|
|
if_distance_to_target_lt(200, /*goto*/ 0x16)
|
|
if_timer_gt(60, /*goto*/ 0x13)
|
|
endloop(0x0c)
|
|
|
|
label(0x13)
|
|
goto_first(0x00)
|
|
|
|
// Standing next to player
|
|
label(0x16)
|
|
dprint 'B','U','D','D','Y',' ','S','T','A','N','D','\n',0,
|
|
stop_chr
|
|
|
|
beginloop(0x04)
|
|
if_chr_has_hiddenflag(CHR_BOND, CHRHFLAG_TRIGGER_BUDDY_WARP, /*goto*/ 0x13)
|
|
unset_chr_hiddenflag(CHR_SELF, CHRHFLAG_UNTARGETABLE)
|
|
goto_next(0x15)
|
|
|
|
label(0x13)
|
|
if_chr_has_hiddenflag(CHR_SELF, CHRHFLAG_UNTARGETABLE, /*goto*/ 0x15)
|
|
goto_next(LABEL_PLACE_BUDDY)
|
|
|
|
label(0x15)
|
|
label(0x13)
|
|
if_chr_has_hiddenflag(CHR_TARGET, CHRHFLAG_DISGUISED, /*goto*/ 0x06)
|
|
goto_next(0x07)
|
|
|
|
label(0x06)
|
|
set_chr_hiddenflag(CHR_SELF, CHRHFLAG_DISGUISED)
|
|
label(0x07)
|
|
if_chr_has_hiddenflag(CHR_SELF, CHRHFLAG_PASSIVE, /*goto*/ 0xdc)
|
|
if_stage_is_not(STAGE_G5BUILDING, /*goto*/ 0x15)
|
|
goto_next(0x13)
|
|
|
|
label(0x15)
|
|
if_stage_is_not(STAGE_DEEPSEA, /*goto*/ 0x15)
|
|
goto_next(0x13)
|
|
|
|
// Not G5 Building or Deep Sea
|
|
label(0x15)
|
|
set_target_to_enemy_on_same_floor(/*goto*/ 0x0b)
|
|
|
|
// All stages
|
|
label(0x13)
|
|
label(0xdc)
|
|
if_enemy_distance_lt_and_los(2540, /*goto*/ 0x03)
|
|
set_target_chr(CHR_BOND)
|
|
if_distance_to_target_gt(300, /*goto*/ 0x16)
|
|
endloop(0x04)
|
|
|
|
label(0x16)
|
|
goto_first(0x00)
|
|
|
|
label(0x03)
|
|
dprint 'D','E','T','E','C','T','E','D','\n',0,
|
|
call_rng
|
|
if_rand_lt(85, /*goto*/ 0xfa)
|
|
if_rand_lt(170, /*goto*/ 0xf3)
|
|
say_quip(CHR_BOND, QUIP_ATTACK1, 0xff, 0x14, 0xff, BANK_0, 0x00, 0x00)
|
|
goto_next(0x13)
|
|
|
|
label(0xfa)
|
|
say_quip(CHR_BOND, QUIP_SEEPLAYER, 0xff, 0x14, 0xff, BANK_0, 0x00, 0x00)
|
|
goto_next(0x13)
|
|
|
|
label(0xf3)
|
|
say_quip(CHR_BOND, QUIP_HITPLAYER, 0xff, 0x14, 0xff, BANK_0, 0x00, 0x00)
|
|
label(0x13)
|
|
|
|
// Found chr in group from non G5 or Deep Sea stage
|
|
label(0x0b)
|
|
if_chr_has_hiddenflag(CHR_TARGET, CHRHFLAG_08000000, /*goto*/ 0x13)
|
|
unset_self_flag_bankx(CHRFLAG1_00000001, BANK_1)
|
|
goto_next(0x16)
|
|
|
|
label(0x13)
|
|
set_self_flag_bankx(CHRFLAG1_00000001, BANK_1)
|
|
label(0x16)
|
|
set_returnlist(CHR_SELF, GAILIST_COOP_BUDDY)
|
|
set_ailist(CHR_SELF, GAILIST_COMBAT_WITH_TARGET)
|
|
|
|
label(LABEL_PLACE_BUDDY)
|
|
set_ailist(CHR_SELF, GAILIST_PLACE_COOP_BUDDY)
|
|
endlist
|
|
};
|
|
|
|
/**
|
|
* Not used?
|
|
*/
|
|
u8 func002b_do_something_and_wait[] = {
|
|
cmd01c5
|
|
|
|
beginloop(0x03)
|
|
if_chr_stopped(/*goto*/ 0x16)
|
|
endloop(0x03)
|
|
|
|
label(0x16)
|
|
return
|
|
endlist
|
|
};
|
|
|
|
/**
|
|
* Not used.
|
|
*/
|
|
u8 func0022_comment_on_player_dead[] = {
|
|
set_aishootingatmelist(GAILIST_IDLE)
|
|
dprint 'K','I','L','L','\n',0,
|
|
stop_chr
|
|
|
|
// Wait until player in sight. Which won't happen if the current chr is
|
|
// stopped and player is dying...
|
|
beginloop(0x0c)
|
|
if_can_see_target(/*goto*/ 0x16)
|
|
endloop(0x0c)
|
|
|
|
// Wait half a second
|
|
label(0x16)
|
|
restart_timer
|
|
|
|
beginloop(0x03)
|
|
if_timer_gt(30, /*goto*/ 0x13)
|
|
endloop(0x03)
|
|
|
|
// Roll the dice, and maybe wait another half second
|
|
label(0x13)
|
|
call_rng
|
|
if_rand_gt(25, /*goto*/ 0x16)
|
|
goto_first(0x03)
|
|
|
|
label(0x16)
|
|
dprint 'K','I','L','L','E','D','E','R','\n',0,
|
|
say_quip(CHR_BOND, QUIP_KILLEDPLAYER2, 0xff, 0x02, 0x00, BANK_0, 0x00, 0x00)
|
|
say_quip(CHR_BOND, QUIP_HITPLAYER, 0x80, 0x03, 0x01, BANK_0, 0x00, 0x00)
|
|
|
|
beginloop(0x04)
|
|
endloop(0x04)
|
|
|
|
// Unreachable
|
|
set_ailist(CHR_SELF, GAILIST_IDLE)
|
|
endlist
|
|
};
|
|
|
|
/**
|
|
* Do a sideways dodge, then assign GAILIST_ALERTED.
|
|
*/
|
|
u8 func0023_dodge[] = {
|
|
if_chr_dead(CHR_SELF, /*goto*/ 0x16)
|
|
if_chr_death_animation_finished(CHR_SELF, /*goto*/ 0x16)
|
|
if_chr_knockedout(CHR_SELF, /*goto*/ 0x16)
|
|
goto_next(0x13)
|
|
|
|
// Dying
|
|
label(0x16)
|
|
set_aishootingatmelist(GAILIST_IDLE)
|
|
set_ailist(CHR_SELF, GAILIST_IDLE)
|
|
|
|
label(0x13)
|
|
dprint 'D','O','D','O','\n',0,
|
|
set_self_flag_bankx(CHRFLAG1_00020000, BANK_1)
|
|
|
|
// 50% chance of hop vs jump
|
|
call_rng
|
|
if_rand_lt(128, /*goto*/ 0x2d)
|
|
try_jumpout(/*goto*/ 0x13)
|
|
goto_next(0x2e)
|
|
|
|
label(0x2d)
|
|
try_sidestep(/*goto*/ 0x13)
|
|
goto_next(0x2c)
|
|
|
|
// Unreachable
|
|
label(0xbb)
|
|
cmd0139(25, 0x01, TRUE)
|
|
goto_next(0x2c)
|
|
|
|
// Was able to start dodge
|
|
label(0x13)
|
|
|
|
beginloop(0x2c)
|
|
if_chr_stopped(/*goto*/ 0x2e)
|
|
endloop(0x2c)
|
|
|
|
// Unable to hop sideways, or follow-through from above
|
|
label(0x2e)
|
|
set_self_flag_bankx(CHRFLAG1_00020000, BANK_1)
|
|
set_ailist(CHR_SELF, GAILIST_ALERTED)
|
|
endlist
|
|
};
|
|
|
|
/**
|
|
* In co-op mode with an AI buddy, this ailist is applied to the buddy when you
|
|
* give them the Stealth command.
|
|
*/
|
|
u8 func0015_aibuddy_stealth[] = {
|
|
stop_chr
|
|
set_chr_cloaked(CHR_SELF, TRUE, TRUE)
|
|
|
|
// Wait 1 second
|
|
restart_timer
|
|
|
|
beginloop(0x03)
|
|
if_timer_gt(60, /*goto*/ 0x16)
|
|
endloop(0x03)
|
|
|
|
// Hide chr
|
|
label(0x16)
|
|
remove_references_to_chr
|
|
set_self_chrflag(CHRCFLAG_INVINCIBLE_TO_GUNFIRE)
|
|
set_self_chrflag((CHRCFLAG_HIDDEN | CHRCFLAG_00010000 | CHRCFLAG_00040000))
|
|
|
|
// Wait 3 seconds
|
|
restart_timer
|
|
|
|
beginloop(0x04)
|
|
if_timer_gt(180, /*goto*/ 0x16)
|
|
endloop(0x04)
|
|
|
|
// Wait for intro to finish and for 1 second to have passed
|
|
// (in case intro was cut by player)
|
|
#define wait_intro(loopid) \
|
|
restart_timer \
|
|
beginloop(loopid) \
|
|
if_camera_animating(/*goto*/ 0x13) \
|
|
if_timer_gt(60, /*goto*/ 0x16) \
|
|
label(0x13) \
|
|
endloop(loopid) \
|
|
label(0x16)
|
|
|
|
|
|
|
|
label(0x16)
|
|
|
|
wait_intro(0x05)
|
|
cmd01b4_if_something(/*goto*/ 0x17)
|
|
|
|
wait_intro(0x06)
|
|
cmd01b4_if_something(/*goto*/ 0x17)
|
|
|
|
wait_intro(0x07)
|
|
cmd01b4_if_something(/*goto*/ 0x17)
|
|
|
|
wait_intro(0x08)
|
|
cmd01b4_if_something(/*goto*/ 0x17)
|
|
|
|
wait_intro(0x09)
|
|
cmd01b4_if_something(/*goto*/ 0x17)
|
|
|
|
wait_intro(0x0a)
|
|
cmd01b4_if_something(/*goto*/ 0x17)
|
|
|
|
label(0x19)
|
|
wait_intro(0x0b)
|
|
|
|
// This will execute every second after the initial 7ish seconds and while
|
|
// cutscene is not running. The chr is being moved back to the player
|
|
// repeatedly.
|
|
set_chr_hiddenflag(CHR_SELF, 0x00100200)
|
|
chr_move_to_pad(CHR_SELF, CHR_BOND, 88, /*goto*/ 0x17)
|
|
goto_first(0x19)
|
|
|
|
label(0x17)
|
|
unset_self_chrflag(0x00050400)
|
|
unset_self_chrflag(CHRCFLAG_INVINCIBLE_TO_GUNFIRE)
|
|
unset_chr_hiddenflag(CHR_SELF, 0x00100200)
|
|
set_chr_cloaked(CHR_SELF, FALSE, TRUE)
|
|
set_returnlist(CHR_SELF, GAILIST_COOP_BUDDY)
|
|
set_shotlist(GAILIST_COOP_BUDDY)
|
|
set_ailist(CHR_SELF, GAILIST_COOP_BUDDY)
|
|
endlist
|
|
};
|
|
|
|
/**
|
|
* Not used.
|
|
*/
|
|
u8 func002c_init_search_unused[] = {
|
|
set_self_flag_bankx(CHRFLAG1_00000400, BANK_1)
|
|
set_self_flag_bankx(CHRFLAG1_10000000, BANK_1)
|
|
set_ailist(CHR_SELF, GAILIST_SEARCH_FOR_PLAYER)
|
|
endlist
|
|
};
|
|
|
|
/**
|
|
* Not used.
|
|
*/
|
|
u8 func0024_follow_bond[] = {
|
|
set_target_chr(CHR_BOND)
|
|
|
|
label(0x03)
|
|
restart_timer
|
|
try_run_to_target(/*goto*/ 0x04)
|
|
|
|
beginloop(0x04)
|
|
set_action(MA_TRACKING, FALSE)
|
|
if_distance_to_target_lt(200, /*goto*/ 0x16)
|
|
if_timer_gt(120, /*goto*/ 0x13)
|
|
if_chr_stopped(/*goto*/ 0x13)
|
|
endloop(0x04)
|
|
|
|
// Been running for 2 seconds, or stopped
|
|
label(0x13)
|
|
goto_first(0x03)
|
|
|
|
// Within 200 units
|
|
label(0x16)
|
|
stop_chr
|
|
|
|
// Wait here until 300 units away, then follow again
|
|
beginloop(0x05)
|
|
set_action(MA_WAITING, FALSE)
|
|
if_distance_to_target_gt(300, /*goto*/ 0x16)
|
|
endloop(0x05)
|
|
|
|
label(0x16)
|
|
goto_first(0x03)
|
|
|
|
endlist
|
|
};
|
|
|
|
/**
|
|
* Not used.
|
|
*/
|
|
u8 func0025_pointless[] = {
|
|
// Wait until target chr is dead
|
|
beginloop(0x0c)
|
|
if_chr_death_animation_finished(CHR_TARGET, /*goto*/ 0x03)
|
|
if_chr_dead(CHR_TARGET, /*goto*/ 0x03)
|
|
endloop(0x0c)
|
|
|
|
// Wait 10 seconds
|
|
label(0x03)
|
|
restart_timer
|
|
|
|
beginloop(0x04)
|
|
if_timer_gt(600, /*goto*/ 0x13)
|
|
endloop(0x04)
|
|
|
|
// Continue waiting 10 seconds indefinitely
|
|
label(0x13)
|
|
goto_first(0x03)
|
|
|
|
endlist
|
|
};
|
|
|
|
u8 func0026_init_psychosis[] = {
|
|
set_shotlist(GAILIST_INIT_PSYCHOSIS)
|
|
set_chr_team(CHR_SELF, TEAM_NONCOMBAT)
|
|
set_self_flag_bankx(CHRFLAG1_80000000, BANK_1)
|
|
set_self_chrflag(CHRCFLAG_00040000)
|
|
set_self_chrflag(CHRCFLAG_PUSHABLE)
|
|
set_self_flag_bankx(CHRFLAG1_00100000, BANK_1)
|
|
set_self_flag_bankx(CHRFLAG1_40000000, BANK_1)
|
|
set_chr_hiddenflag(CHR_SELF, CHRHFLAG_PSYCHOSISED)
|
|
set_alertness(100)
|
|
set_chrpreset(CHR_BOND)
|
|
yield
|
|
rebuild_teams
|
|
rebuild_squadrons
|
|
yield
|
|
yield
|
|
yield
|
|
yield
|
|
yield
|
|
yield
|
|
yield
|
|
yield
|
|
chr_do_animation(ANIM_BIG_SNEEZE, -1, -1, 0x10, 0x14, CHR_SELF, 2)
|
|
|
|
// Wait for animation to finish
|
|
beginloop(0x03)
|
|
if_chr_stopped(/*goto*/ 0x16)
|
|
endloop(0x03)
|
|
|
|
// Become ally
|
|
label(0x16)
|
|
set_chr_team(CHR_SELF, TEAM_ALLY)
|
|
rebuild_teams
|
|
rebuild_squadrons
|
|
|
|
label(0x16)
|
|
set_target_chr(-1)
|
|
set_ailist(CHR_SELF, GAILIST_PSYCHOSISED)
|
|
endlist
|
|
};
|
|
|
|
u8 func0027_psychosised[] = {
|
|
set_morale(0)
|
|
set_shotlist(GAILIST_PSYCHOSISED)
|
|
set_target_chr(CHR_PRESET)
|
|
if_chr_dead(CHR_SELF, /*goto*/ 0x13)
|
|
if_chr_death_animation_finished(CHR_SELF, /*goto*/ 0x13)
|
|
if_chr_knockedout(CHR_SELF, /*goto*/ 0x13)
|
|
goto_next(0x16)
|
|
|
|
// Dying
|
|
label(0x13)
|
|
set_ailist(CHR_SELF, GAILIST_IDLE)
|
|
|
|
// Alive
|
|
label(0x16)
|
|
if_just_injured(CHR_SELF, /*goto*/ 0x13)
|
|
goto_next(0x16)
|
|
|
|
// Injured
|
|
label(0x13)
|
|
say_quip(CHR_BOND, QUIP_INJURED2, 0xff, 0x03, 0xff, BANK_0, 0x00, 0x00)
|
|
|
|
beginloop(0xf2)
|
|
if_chr_stopped(/*goto*/ 0x16)
|
|
endloop(0xf2)
|
|
|
|
// Healthy
|
|
label(0x16)
|
|
set_target_to_enemy_on_same_floor(/*goto*/ 0x03)
|
|
if_enemy_distance_lt_and_los(2540, /*goto*/ 0x03)
|
|
set_target_chr(CHR_PRESET)
|
|
if_distance_to_target_lt(200, /*goto*/ 0x16)
|
|
|
|
// Following Joanna
|
|
label(0x00)
|
|
set_target_chr(CHR_PRESET)
|
|
restart_timer
|
|
if_distance_to_target_gt(300, /*goto*/ 0x16)
|
|
try_jog_to_target(/*goto*/ 0x0c)
|
|
label(0x16)
|
|
if_distance_to_target_lt(200, /*goto*/ 0x16)
|
|
try_run_to_target(/*goto*/ 0x0c)
|
|
|
|
beginloop(0x0c)
|
|
if_chr_has_hiddenflag(CHR_TARGET, CHRHFLAG_DISGUISED, /*goto*/ 0x06)
|
|
goto_next(0x07)
|
|
|
|
label(0x06)
|
|
set_chr_hiddenflag(CHR_SELF, CHRHFLAG_DISGUISED)
|
|
label(0x07)
|
|
if_enemy_distance_lt_and_los(2540, /*goto*/ 0x03)
|
|
set_target_chr(CHR_PRESET)
|
|
if_distance_to_target_lt(200, /*goto*/ 0x16)
|
|
if_timer_gt(60, /*goto*/ 0x13)
|
|
endloop(0x0c)
|
|
|
|
label(0x13)
|
|
goto_first(0x00)
|
|
|
|
// At Joanna
|
|
label(0x16)
|
|
stop_chr
|
|
|
|
beginloop(0x04)
|
|
if_chr_has_hiddenflag(CHR_TARGET, CHRHFLAG_DISGUISED, /*goto*/ 0x06)
|
|
goto_next(0x07)
|
|
|
|
label(0x06)
|
|
set_chr_hiddenflag(CHR_SELF, CHRHFLAG_DISGUISED)
|
|
label(0x07)
|
|
set_target_to_enemy_on_same_floor(/*goto*/ 0x03)
|
|
if_enemy_distance_lt_and_los(2540, /*goto*/ 0x03)
|
|
set_target_chr(CHR_PRESET)
|
|
if_distance_to_target_gt(300, /*goto*/ 0x16)
|
|
endloop(0x04)
|
|
|
|
label(0x16)
|
|
goto_first(0x00)
|
|
|
|
// Detected enemy
|
|
label(0x03)
|
|
call_rng
|
|
if_rand_lt(85, /*goto*/ 0xfa)
|
|
if_rand_lt(170, /*goto*/ 0xf3)
|
|
|
|
say_quip(CHR_BOND, QUIP_ATTACK1, 0xff, 0x03, 0xff, BANK_0, 0x00, 0x00)
|
|
goto_next(0x13)
|
|
|
|
label(0xfa)
|
|
say_quip(CHR_BOND, QUIP_SEEPLAYER, 0xff, 0x03, 0xff, BANK_0, 0x00, 0x00)
|
|
goto_next(0x13)
|
|
|
|
label(0xf3)
|
|
say_quip(CHR_BOND, QUIP_HITPLAYER, 0xff, 0x03, 0xff, BANK_0, 0x00, 0x00)
|
|
|
|
label(0x13)
|
|
set_returnlist(CHR_SELF, GAILIST_PSYCHOSISED)
|
|
set_ailist(CHR_SELF, GAILIST_COMBAT_WITH_TARGET)
|
|
endlist
|
|
};
|
|
|
|
u8 func002d_invincible_and_idle[] = {
|
|
set_self_chrflag(CHRCFLAG_INVINCIBLE_TO_GUNFIRE)
|
|
set_self_chrflag(CHRCFLAG_UNEXPLODABLE)
|
|
set_ailist(CHR_SELF, GAILIST_IDLE)
|
|
endlist
|
|
};
|
|
|
|
u8 func0020_place_coop_buddy[] = {
|
|
set_self_chrflag(CHRCFLAG_INVINCIBLE_TO_GUNFIRE)
|
|
set_self_chrflag(CHRCFLAG_00040000)
|
|
set_chr_hiddenflag(CHR_SELF, CHRHFLAG_CLOAKED)
|
|
stop_chr
|
|
set_target_chr(CHR_BOND)
|
|
yield
|
|
if_stage_is_not(STAGE_DEEPSEA, /*goto*/ 0x15)
|
|
goto_next(0x16)
|
|
|
|
// Not Deep Sea
|
|
label(0x15)
|
|
if_stage_is_not(STAGE_AIRFORCEONE, /*goto*/ 0x15)
|
|
|
|
// Deep Sea or Air Force One
|
|
label(0x16)
|
|
yield
|
|
yield
|
|
yield
|
|
yield
|
|
yield
|
|
|
|
// Try to move chr to one of four pads until it works
|
|
label(0x03)
|
|
yield
|
|
try_set_padpreset_to_target_quadrant(QUADRANT_BACK, /*goto*/ 0xfa)
|
|
goto_next(0xf3)
|
|
|
|
label(0xfa)
|
|
chr_move_to_pad(CHR_SELF, PAD_PRESET, 0x01, /*goto*/ 0x13)
|
|
label(0xf3)
|
|
try_set_padpreset_to_target_quadrant(QUADRANT_SIDE1, /*goto*/ 0xfa)
|
|
goto_next(0xf3)
|
|
|
|
label(0xfa)
|
|
chr_move_to_pad(CHR_SELF, PAD_PRESET, 0x01, /*goto*/ 0x13)
|
|
label(0xf3)
|
|
try_set_padpreset_to_target_quadrant(QUADRANT_SIDE2, /*goto*/ 0xfa)
|
|
goto_next(0xf3)
|
|
|
|
label(0xfa)
|
|
chr_move_to_pad(CHR_SELF, PAD_PRESET, 0x01, /*goto*/ 0x13)
|
|
label(0xf3)
|
|
try_set_padpreset_to_target_quadrant(QUADRANT_FRONT, /*goto*/ 0xfa)
|
|
goto_next(0xf3)
|
|
|
|
label(0xfa)
|
|
chr_move_to_pad(CHR_SELF, PAD_PRESET, 0x01, /*goto*/ 0x13)
|
|
label(0xf3)
|
|
goto_first(0x03)
|
|
|
|
// Move to pad worked
|
|
label(0x13)
|
|
unset_self_chrflag(CHRCFLAG_HIDDEN)
|
|
unset_self_chrflag(CHRCFLAG_INVINCIBLE_TO_GUNFIRE)
|
|
stop_chr
|
|
set_chr_cloaked(CHR_SELF, FALSE, TRUE)
|
|
set_chr_hiddenflag(CHR_SELF, CHRHFLAG_UNTARGETABLE)
|
|
set_returnlist(CHR_SELF, GAILIST_COOP_BUDDY)
|
|
set_ailist(CHR_SELF, GAILIST_COOP_BUDDY)
|
|
|
|
// Not Deep Sea nor Air Force One
|
|
label(0x15)
|
|
yield
|
|
yield
|
|
yield
|
|
yield
|
|
yield
|
|
stop_chr
|
|
if_stage_is_not(STAGE_ATTACKSHIP, /*goto*/ 0x04)
|
|
|
|
// Attack Ship
|
|
beginloop(0x05)
|
|
chr_move_to_pad(CHR_SELF, 0x011f, 0x01, /*goto*/ 0x13)
|
|
chr_move_to_pad(CHR_SELF, 0x0120, 0x01, /*goto*/ 0x13)
|
|
chr_move_to_pad(CHR_SELF, 0x0121, 0x01, /*goto*/ 0x13)
|
|
chr_move_to_pad(CHR_SELF, 0x0122, 0x01, /*goto*/ 0x13)
|
|
endloop(0x05)
|
|
|
|
// Not Air Force One, Deep Sea or Attack Ship
|
|
beginloop(0x04)
|
|
chr_move_to_pad(CHR_SELF, 0x0012, 0x01, /*goto*/ 0x13)
|
|
chr_move_to_pad(CHR_SELF, 0x001a, 0x01, /*goto*/ 0x13)
|
|
chr_move_to_pad(CHR_SELF, 0x0013, 0x01, /*goto*/ 0x13)
|
|
chr_move_to_pad(CHR_SELF, 0x0019, 0x01, /*goto*/ 0x13)
|
|
endloop(0x04)
|
|
|
|
// Move to pad worked
|
|
label(0x13)
|
|
stop_chr
|
|
set_chr_hiddenflag(CHR_SELF, CHRHFLAG_00020000)
|
|
set_chr_hiddenflag(CHR_SELF, CHRHFLAG_UNTARGETABLE)
|
|
|
|
// Wait until flag unset (timer is not checked)
|
|
restart_timer
|
|
|
|
beginloop(0xef)
|
|
if_chr_has_hiddenflag(CHR_BOND, CHRHFLAG_TRIGGER_BUDDY_WARP, /*goto*/ 0x13)
|
|
goto_next(0x16)
|
|
|
|
label(0x13)
|
|
endloop(0xef)
|
|
|
|
// Unhide
|
|
label(0x16)
|
|
unset_self_chrflag(CHRCFLAG_HIDDEN)
|
|
unset_self_chrflag(CHRCFLAG_INVINCIBLE_TO_GUNFIRE)
|
|
stop_chr
|
|
set_chr_cloaked(CHR_SELF, FALSE, TRUE)
|
|
set_returnlist(CHR_SELF, GAILIST_COOP_BUDDY)
|
|
set_ailist(CHR_SELF, GAILIST_COOP_BUDDY)
|
|
endlist
|
|
};
|
|
|
|
u8 func0021_stop_and_idle[] = {
|
|
set_shotlist(GAILIST_STOP_AND_IDLE)
|
|
stop_chr
|
|
set_ailist(CHR_SELF, GAILIST_IDLE)
|
|
endlist
|
|
};
|
|
|
|
/**
|
|
* Assigned at start of match, then switches to GAILIST_AI_BOT_ALIVE.
|
|
*
|
|
* Also assigned the moment the aibot dies, but this jumps out immediately to
|
|
* FAILIST_AI_BOT_DEAD while their death animation is happening.
|
|
*
|
|
* Also assigned upon respawn.
|
|
*/
|
|
u8 func0029_ai_bot_init[] = {
|
|
dprint 'l','i','s','t',':',' ','a','i','b','o','t','i','n','i','t',0,
|
|
set_chr_maxdamage(CHR_SELF, 80)
|
|
set_reaction_speed(100)
|
|
set_returnlist(CHR_SELF, GAILIST_AI_BOT_ALIVE)
|
|
|
|
beginloop(0x19)
|
|
if_chr_death_animation_finished(CHR_SELF, /*goto*/ 0x13)
|
|
goto_next(0x16)
|
|
|
|
label(0x13)
|
|
endloop(0x19)
|
|
|
|
label(0x16)
|
|
set_ailist(CHR_SELF, GAILIST_AI_BOT_ALIVE)
|
|
endlist
|
|
};
|
|
|
|
/**
|
|
* Assigned while the aibot is doing their death animation. Stops after fadeout.
|
|
*/
|
|
u8 func0028_ai_bot_dead[] = {
|
|
dprint 'l','i','s','t',':',' ','a','i','d','e','a','d',0,
|
|
|
|
beginloop(0x0d)
|
|
cmd0176_if_something(/*goto*/ 0x16)
|
|
endloop(0x0d)
|
|
|
|
label(0x16)
|
|
set_ailist(CHR_SELF, GAILIST_AI_BOT_INIT)
|
|
endlist
|
|
};
|
|
|
|
/**
|
|
* Assigned while the aibot is alive.
|
|
*/
|
|
u8 func002a_ai_bot_alive[] = {
|
|
beginloop(0xf8)
|
|
if_chr_dead(CHR_SELF, /*goto*/ 0xf9)
|
|
endloop(0xf8)
|
|
|
|
label(0xf9)
|
|
set_ailist(CHR_SELF, GAILIST_AI_BOT_DEAD)
|
|
endlist
|
|
};
|
|
|
|
// 20c78
|
|
struct ailist g_GlobalAilists[] = {
|
|
{ func0000_idle, 0x0000 },
|
|
{ func0001_unalerted_0001, 0x0001 },
|
|
{ func0004_unalerted_0004, 0x0004 },
|
|
{ func0003_stop_unalerted, 0x0003 },
|
|
{ func0002_unalerted_0002, 0x0002 },
|
|
{ func0005_end_cinema, 0x0005 },
|
|
{ func0006_unalerted, 0x0006 },
|
|
{ func0007_alerted, 0x0007 },
|
|
{ func0008_wakeup, 0x0008 },
|
|
{ func000a_do_idle_animation, 0x000a },
|
|
{ func000b_choose_target_chr, 0x000b },
|
|
{ func000c_combat_with_target_chr, 0x000c },
|
|
{ func000d_init_combat, 0x000d },
|
|
{ func000e_see_then_attack, 0x000e },
|
|
{ func0016_show_objective_failed_msg, 0x0016 },
|
|
{ func0017_rebuild_groups, 0x0017 },
|
|
{ func0018_do_bored_animation, 0x0018 },
|
|
{ func0019_do_sitting_animation, 0x0019 },
|
|
{ func0000_idle_0009, 0x0009 },
|
|
{ func001a_maybe_unset_disspee, 0x001a },
|
|
{ func000f_hand_combat, 0x000f },
|
|
{ func0010_civilian_say_comment, 0x0010 },
|
|
{ func0011_flee_from_grenade, 0x0011 },
|
|
{ func001b_observe_camspy, 0x001b },
|
|
{ func0020_place_coop_buddy, 0x0020 },
|
|
{ func0012_init_coop_100, 0x0012 },
|
|
{ func0013_init_coop_200, 0x0013 },
|
|
{ func0014_coop_buddy, 0x0014 },
|
|
{ func001d_search_for_player, 0x001d },
|
|
{ func001e_look_around, 0x001e },
|
|
{ func001f_related_to_spawning, 0x001f },
|
|
{ func001c_surprised, 0x001c },
|
|
{ func0022_comment_on_player_dead, 0x0022 },
|
|
{ func0023_dodge, 0x0023 },
|
|
{ func002c_init_search_unused, 0x002c },
|
|
{ func0024_follow_bond, 0x0024 },
|
|
{ func0025_pointless, 0x0025 },
|
|
{ func0026_init_psychosis, 0x0026 },
|
|
{ func0027_psychosised, 0x0027 },
|
|
{ func002d_invincible_and_idle, 0x002d },
|
|
{ func0021_stop_and_idle, 0x0021 },
|
|
{ func0015_aibuddy_stealth, 0x0015 },
|
|
{ func0028_ai_bot_dead, 0x0028 },
|
|
{ func0029_ai_bot_init, 0x0029 },
|
|
{ func002a_ai_bot_alive, 0x002a },
|
|
{ func002b_do_something_and_wait, 0x002b },
|
|
{ NULL, 0 },
|
|
};
|