19,426
edits
m (adding new "hands-off" template) |
m (missed these self-links because of the lack of underscores in the names) |
||
(17 intermediate revisions by 2 users not shown) | |||
Line 1: | Line 1: | ||
{{ | {{finish}} | ||
{|style="float:right" | |||
|__TOC__ | |||
|} | |||
=### AIRPORT 1 LEVEL LOGIC ###= | |||
==### START, SAVE & OBJECTIVES ###== | |||
===func func_start=== | |||
func void func_start(string ai_name) | |||
{ | |||
[[dprint]] start_active | |||
[[trigvolume_enable]] hidden1 1 | |||
trigvolume_enable hidden1 1 | |||
if ([[save_point]] eq 0) | |||
{ | |||
my_save_point=0; | |||
[[particle]] auto1 start | |||
particle auto1fire start | |||
particle auto1spark start | |||
particle door1spark start | |||
particle tctf1 start | |||
} | |||
if (save_point eq 1) | |||
{ | |||
my_save_point=1; | |||
[[env_show]] 10 1 | |||
env_show 11 1 | |||
env_show 12 1 | |||
dprint restore1_active | |||
particle auto1 start | |||
particle auto1fire start | |||
particle auto1spark start | |||
particle door1spark start | |||
particle tctf1 start | |||
[[sound_music_start]] mus_asian 0.5 | |||
music_script_start(); | |||
[[ai2_spawn]] IntroStriker01 | |||
ai2_spawn IntroStriker02 | |||
[[restore_game]] | |||
[[sleep]] 30 | |||
set_target_1 | |||
set_objective_1 | |||
} | |||
if (save_point eq 2) | |||
{ | |||
my_save_point=2; | |||
dprint restore_2 | |||
particle fx3 do start | |||
particle exhaust create | |||
[[#func Tarmac1|Tarmac1]] | |||
trigvolume_enable tarmac 0 | |||
trigvolume_enable trigger_volume_03 0 | |||
trigvolume_enable bomberboom 0 | |||
trigvolume_enable madbomberbait 0 | |||
[[door_lock]] 3 | |||
[[obj_kill]] 991 992 | |||
restore_game | |||
sleep 30 | |||
set_target_3 | |||
set_objective_2 | |||
} | |||
if (save_point eq 3) | |||
{ | |||
my_save_point=3; | |||
dprint restore3_active | |||
door_lock 3 | |||
[[door_unlock]] 6 | |||
particle lock1_locklight01 do stop | |||
particle lock2_locklight01 do start | |||
[[console_deactivate]] 5 | |||
particle door7_locklight01 do start | |||
particle door2_locklight01 do start | |||
console_deactivate 6 | |||
trigvolume_enable trigger_volume_02 0 | |||
trigvolume_enable trigger_volume_03 0 | |||
trigvolume_enable trigger_volume_04 0 | |||
trigvolume_enable trigger_volume_08 0 | |||
trigvolume_enable trigger_volume_10 0 | |||
trigvolume_enable trigger_volume_11 0 | |||
trigvolume_enable save_game 0 | |||
trigvolume_enable secondcoming 0 | |||
TerminalTwo1 | |||
particle auto1 stop | |||
particle auto1fire stop | |||
particle auto1spark stop | |||
particle door1spark stop | |||
particle tctf1 stop | |||
ai2_spawn TerminalTwo_Striker_1 | |||
ai2_spawn TerminalTwo_Striker_2 | |||
particle fx4 do start | |||
particle fx5 do start | |||
particle fx6 do start | |||
particle fx1 do stop | |||
particle fx2 do stop | |||
particle fx3 do stop | |||
music_script_start(); | |||
restore_game | |||
sleep 30 | |||
set_objective_3 | |||
set_target_5 | |||
} | |||
} | |||
===func you_lose=== | |||
func void you_lose(string ai_name) | |||
{ | |||
[[#func all_music_counters|all_music_counters]] | |||
[[sleep]] 240 | |||
[[fade_out]] 0 0 0 180 | |||
[[sleep]] 240 | |||
[[lose]] | |||
} | |||
# | ===func you_win=== | ||
func void you_win(int char_index) | |||
{ | |||
[[#func all_music_counters|all_music_counters]] | |||
[[win]] | |||
} | |||
===func save_point_1=== | |||
func void save_point_1(string player_name) | |||
{ | |||
[[dprint]] save_point_1_active | |||
[[save_game]] 1 autosave | |||
} | |||
===func save_point_2=== | |||
func void save_point_2(string player_name) | |||
{ | |||
[[dprint]] save_point_2_active | |||
[[save_game]] 2 autosave | |||
} | |||
===func save_point_3=== | |||
func void save_point_3(string player_name) | |||
{ | |||
[[dprint]] save_point_3_active | |||
[[save_game]] 3 autosave | |||
[[ai2_spawn]] TerminalTwo_Striker_1 | |||
ai2_spawn TerminalTwo_Striker_2 | |||
[[particle]] fx5 do start | |||
particle fx6 do start | |||
particle fx3 do stop | |||
[[door_unlock]] 6 | |||
particle door7_locklight01 do start | |||
particle lock2_locklight01 do start | |||
particle door2_locklight01 do start | |||
} | |||
func void | ===func set_objective_1=== | ||
{ | func void set_objective_1(string chr_index) | ||
{ | |||
[[dprint]] objective_1 | |||
[[objective_set]](1) | |||
[[sound_dialog_play]] c00_01_22shinatama | |||
} | |||
===func set_objective_2=== | |||
func void set_objective_2(string chr_index) | |||
{ | |||
[[dprint]] objective_2 | |||
[[objective_set]](2) | |||
[[sound_dialog_play]] c00_01_19shinatama | |||
} | |||
===func set_objective_3=== | |||
func void set_objective_3(string chr_index) | |||
{ | |||
[[dprint]] objective_3 | |||
[[objective_set]](3) | |||
[[console_deactivate]] 2 | |||
[[sound_dialog_play]] c00_01_18shinatama | |||
} | |||
===func set_objective_4=== | |||
func void set_objective_4(string chr_index) | |||
{ | |||
dprint objective_4 | |||
objective_set(4) | |||
sound_dialog_play c00_01_20shinatama | |||
} | |||
===func set_target_1=== | |||
func void set_target_1(string chr_index) | |||
{ | |||
dprint set_target1 | |||
target_set(1095, 30.0) | |||
sound_dialog_play c00_01_28shinatama | |||
} | |||
===func set_target_2=== | |||
func void set_target_2(string chr_index) | |||
{ | |||
dprint set_target2 | |||
target_set(1132, 30.0) | |||
sound_dialog_play c00_01_27shinatama | |||
} | |||
===func set_target_3=== | |||
func void set_target_3(string chr_index) | |||
{ | |||
dprint set_target3 | |||
target_set(1109, 30.0) | |||
sound_dialog_play c00_01_26shinatama | |||
} | |||
===func set_target_4=== | |||
func void set_target_4(string chr_index) | |||
{ | |||
dprint set_target4 | |||
target_set(1112, 30.0) | |||
sound_dialog_play c00_01_25shinatama | |||
} | |||
===func set_target_5=== | |||
func void set_target_5(string chr_index) | |||
{ | |||
dprint set_target5 | |||
target_set(1115, 30.0) | |||
sound_dialog_play c00_01_24shinatama | |||
} | |||
===func set_target_6=== | |||
func void set_target_6(string chr_index) | |||
{ | |||
[[dprint]] set_target6 | |||
[[target_set]](1139, 30.0) | |||
[[sound_dialog_play]] c00_01_28shinatama | |||
} | |||
===func set_target_blank=== | |||
func void set_target_blank(string chr_index) | |||
{ | |||
[[dprint]] set_targetblank | |||
[[target_set]](0, 0.0) | |||
} | |||
==### MUSIC ###== | |||
===var music_counter=== | |||
var int music_counter; | |||
===func music_force_stop=== | |||
func void music_force_stop(void) | |||
{ | |||
[[sleep]] 4500 | |||
[[if]] (0 ne [[#var music_counter|music_counter]]) | |||
{ | |||
[[dprint]] music_force_stop | |||
music_counter = 0 | |||
[[#func all_music_counters|all_music_counters]] | |||
} | |||
} | |||
===func music_script_start=== | |||
func void music_script_start(void) | |||
{ | |||
[[#var music_counter|music_counter]] = 2 | |||
} | |||
===func striker_lullaby_1=== | |||
func void striker_lullaby_1(string ai_name) | |||
{ | |||
[[dprint]] striker_lullaby1 | |||
[[#var music_counter|music_counter]] = music_counter - 1 | |||
[[if]] (music_counter eq 0) | |||
{ | |||
[[#func all_music_counters|all_music_counters]](); | |||
[[sleep]] f120 | |||
} | |||
} | |||
===func striker_lullaby_2=== | |||
func void striker_lullaby_2(string ai_name) | |||
{ | |||
[[dprint]] striker_lullaby2 | |||
[[#var music_counter|music_counter]] = music_counter - 1 | |||
[[if]] (music_counter eq 0) | |||
{ | |||
[[#func all_music_counters|all_music_counters]](); | |||
[[sleep]] f120 | |||
} | |||
} | |||
===func all_music_counters=== | |||
func void all_music_counters(void) | |||
{ | |||
[[dprint]] STOP_THE_MUSIC | |||
[[sound_music_stop]] mus_fitec_hd | |||
sound_music_stop mus_fitec | |||
sound_music_stop mus_fiteb | |||
sound_music_stop mus_asian | |||
sound_music_stop atm_gr06 | |||
} | |||
==### TEXT CONSOLES ###== | |||
===func level_4a=== | |||
func void level_4a(void) | |||
{ | |||
[[dprint]] set_text_4a | |||
[[text_console]] level_4a | |||
[[console_reset]] 7 | |||
} | |||
===func level_4b=== | |||
func void level_4b(void) | |||
{ | |||
[[dprint]] set_text_4b | |||
[[text_console]] level_4b | |||
[[console_reset]] 7 | |||
} | |||
===func level_4c=== | |||
func void level_4c(void) | |||
{ | |||
[[dprint]] set_text_4c | |||
[[text_console]] level_4c | |||
[[console_reset]] 8 | |||
} | |||
} | |||
func void | ==### GAMEPLAY PROGRESSION ###== | ||
{ | ===func FixDoors=== | ||
func void FixDoors(string char_index) | |||
{ | |||
[[dprint]] Fix_Doors | |||
[[particle]] door2_locklight01 do stop | |||
[[door_lock]] 10 | |||
} | } | ||
===func hidden_civilian1=== | |||
func void hidden_civilian1(string ai_name) | |||
{ | |||
dprint hidden_civilian | |||
ai2_spawn hidden_civ_1 | |||
} | |||
===func panic1a=== | |||
func void panic1a(string char_index) | |||
{ | |||
dprint panic_1a | |||
ai2_spawn civ_victim_6 | |||
playback civ_victim_6 civ_victim6_flee interp 30 | |||
ai2_spawn civ_victim_4 | |||
playback civ_victim_4 civ_victim4_flee interp 30 | |||
sleep 30 | |||
ai2_spawn Intro_Striker_4 | |||
playback Intro_Striker_4 striker4_advance interp 30 | |||
ai2_spawn Intro_Comguy_1 | |||
} | |||
===func panic1b=== | |||
func void panic1b(string char_index) | |||
{ | |||
dprint panic_1b | |||
ai2_passive Intro_Striker_4 1 | |||
ai2_spawn civ_victim_2 | |||
ai2_spawn civ_victim_3 | |||
playback civ_victim_3 civ_victim3_flee interp 30 | |||
sleep 120 | |||
ai2_spawn Intro_Striker_3 | |||
ai2_attack Intro_Striker_3 civ_victim_2 | |||
ai2_spawn Friend_Thug_1 | |||
ai2_spawn Neutral_Thug_1 | |||
ai2_spawn Neutral_Thug_3 | |||
particle fx1 do start | |||
particle fx2 do start | |||
chr_delete civ_victim_4 | |||
chr_delete civ_victim_6 | |||
} | |||
===func hide_1=== | |||
func void hide_1(string char_index) | |||
{ | |||
dprint hide1 | |||
ai2_spawn civ_victim_5 | |||
playback_block civ_victim_5 civ_victim5_flee interp 30 | |||
ai2_dopath civ_victim_5 civ_victim_5 | |||
} | |||
===func horror_1=== | |||
func void horror_1(string char_index) | |||
{ | |||
[[dprint]] horror1 | |||
[[ai2_passive]] Intro_Striker_4 0 | |||
[[ai2_spawn]] civ_victim_10 | |||
ai2_spawn civ_victim_11 | |||
ai2_spawn civ_victim_20 | |||
ai2_spawn civ_victim_21 | |||
[[particle]] fx1 do start | |||
particle fx2 do start | |||
} | |||
===func ambush_striker_1=== | |||
func void ambush_striker_1(string char_index) | |||
{ | |||
[[dprint]] ambush_1 | |||
[[ai2_spawn]] Terminal_Striker_1 | |||
ai2_spawn Terminal_Striker_2 | |||
ai2_spawn mad_bomber_1 | |||
[[obj_create]] 991 992 | |||
} | |||
===func civ_victim_20s_flee=== | |||
func void civ_victim_20s_flee(string char_index) | |||
{ | |||
[[dprint]] civ_victim_20s | |||
[[ai2_dopath]] civ_victim_20 civ20s_flee1 | |||
ai2_dopath civ_victim_21 civ20s_flee2 | |||
} | |||
func void | ===func LoadingBay1=== | ||
{ | func void LoadingBay1(string char_index) | ||
{ | |||
[[dprint]] spawn_guards | |||
} | [[ai2_spawn]] LoadingBay_Thug_1 | ||
ai2_spawn LoadingBay_Thug_2 | |||
ai2_spawn LoadingBay_Striker_2 | |||
ai2_spawn LoadingBay_Comguy_1 | |||
[[particle]] fx3 do start | |||
} | |||
func void | ===func bomber_boom=== | ||
{ | func void bomber_boom(string char_index) | ||
{ | |||
[[dprint]] bomberboom | |||
} | [[particle]] bomb1 do explode | ||
[[obj_kill]] 991 992 | |||
[[sleep]] 300 | |||
particle bomb1 stop | |||
} | |||
func void | ===func mad_bomber_bait=== | ||
{ | func void mad_bomber_bait(string char_index) | ||
{ | |||
dprint bomber_bait | |||
} | ai2_dopath mad_bomber_1 bomber_flee 1 | ||
} | |||
===func patrolscript0200=== | |||
func void patrolscript0200(string char_index) | |||
{ | |||
dprint bomber1_death | |||
chr_delete mad_bomber_1 | |||
} | |||
===func Tarmac1=== | |||
func void Tarmac1(string char_index) | |||
{ | |||
dprint spawn_guards | |||
ai2_spawn Tarmac_Striker_1 | |||
ai2_spawn Tarmac_Striker_2 | |||
ai2_spawn Tarmac_Striker_3 | |||
ai2_spawn Tarmac_Striker_4 | |||
ai2_spawn Tarmac_Friend_1 | |||
ai2_spawn LoadingBay_Striker_1 | |||
sound_music_start atm_gr06 0.75 | |||
particle tarmacfire do start | |||
particle exhaust create | |||
} | |||
===func back9a=== | |||
func void back9a(string ai_name) | |||
{ | |||
dprint hidden_striker1 | |||
ai2_spawn hidden_striker1 | |||
} | |||
===func back9b=== | |||
func void back9b(string ai_name) | |||
{ | |||
dprint hidden_striker1 | |||
ai2_spawn hidden_striker2 | |||
} | |||
===func bay1_particles=== | |||
func void bay1_particles(void) | |||
{ | |||
dprint bay1_fires_on | |||
particle fx3 do start | |||
particle fx4 do stop | |||
} | |||
===func fire_damage=== | |||
func void fire_damage(string ai_name) | |||
{ | |||
[[dprint]] fire_hurt_konoko | |||
[[chr_poison]] (ai_name, 5, 30, 30); | |||
} | |||
===func bay2_particles=== | |||
func void bay2_particles(void) | |||
{ | |||
[[dprint]] bay2_fires_on | |||
[[particle]] fx3 do stop | |||
particle fx4 do start | |||
} | |||
func void | ===# COME TO ME=== | ||
{ | ====func come_to_me==== | ||
func void come_to_me(string ai_name) | |||
{ | |||
dprint go_to_konoko | |||
ai2_dopath Tarmac_Striker_2 come_to_me 1 | |||
ai2_dopath Tarmac_Striker_3 come_to_me 1 | |||
ai2_dopath mad_bomber_2 come_to_me 1 | |||
} | |||
} | |||
===# COME TO ME REDUX=== | |||
====func second_coming==== | |||
func void second_coming(string ai_name) | |||
{ | |||
dprint go_to_konoko_again | |||
ai2_dopath Tarmac_Striker_2 come_to_me 1 | |||
ai2_dopath Tarmac_Striker_3 come_to_me 1 | |||
ai2_dopath mad_bomber_2 come_to_me 1 | |||
} | |||
===# PROGRESS CHECK=== | |||
====var progress_counter==== | |||
var int progress_counter=2; | |||
====func progress_check_1==== | |||
func void progress_check_1(string ai_name) | |||
{ | |||
dprint progress_check1 | |||
progress_counter = progress_counter - 1 | |||
if (progress_counter eq 0) | |||
{ | |||
pass_go_collect_whupass(); | |||
} | |||
} | |||
====func progress_check_2==== | |||
func void progress_check_2(string ai_name) | |||
{ | |||
dprint progress_check2 | |||
progress_counter = progress_counter - 1 | |||
if (progress_counter eq 0) | |||
{ | |||
pass_go_collect_whupass(); | |||
} | |||
} | |||
====func progress_check_3==== | |||
func void progress_check_3(string ai_name) | |||
{ | |||
dprint progress_check3 | |||
progress_counter = progress_counter - 1 | |||
if (progress_counter eq 0) | |||
{ | |||
pass_go_collect_whupass(); | |||
} | |||
} | |||
====func progress_check_4==== | |||
func void progress_check_4(string ai_name) | |||
{ | |||
dprint progress_check4 | |||
progress_counter = progress_counter - 1 | |||
if (progress_counter eq 0) | |||
{ | |||
pass_go_collect_whupass(); | |||
} | |||
} | |||
===func exhaust_on=== | |||
func void exhaust_on(string ai_name) | |||
{ | |||
dprint start_exhaust | |||
particle exhaust create | |||
} | |||
===func exhaust_off=== | |||
func void exhaust_off(string ai_name) | |||
{ | |||
dprint stop_exhaust | |||
particle exhaust kill | |||
} | |||
===func pass_go_collect_whupass=== | |||
func void pass_go_collect_whupass(string ai_name) | |||
{ | |||
dprint let_the_whupping_continue | |||
trigvolume_enable save_game_2 1 | |||
trigvolume_enable secondcoming 0 | |||
} | |||
===func patrolscript000=== | |||
func void patrolscript000(string ai_name) | |||
{ | |||
dprint do_my_bidding | |||
particle lock2_locklight01 do start | |||
door_unlock 6 | |||
} | |||
===func BayTwo1=== | |||
func void BayTwo1(string char_index) | |||
{ | |||
dprint spawn_guards | |||
ai2_spawn BayTwo_Striker_1 | |||
ai2_spawn hidden_friend2 | |||
ai2_spawn mad_bomber_2 | |||
sound_music_stop atm_gr06 | |||
} | |||
===func Repair1=== | |||
func void Repair1(string char_index) | |||
{ | |||
dprint spawn_guards | |||
ai2_spawn Repair_Striker_1 | |||
ai2_spawn Repair_Comguy_1 | |||
ai2_spawn alamo_thug_1 | |||
} | |||
===func Repair2=== | |||
func void Repair2(string char_index) | |||
{ | |||
dprint spawn_guards | |||
ai2_spawn Repair_Striker_2 | |||
ai2_spawn Repair_Comguy_2 | |||
} | |||
===func console_2_activate=== | |||
func void console_2_activate(string char_index) | |||
{ | |||
dprint console2_activate | |||
console_activate 2 | |||
} | |||
===func final_ambush=== | |||
This is triggered by the pre-final [[OBD:BINA/OBJC/CONS|console]] (number 3). That console doesn't do anything else (in particular, it doesn't activate console number 4, because in this case a ''delayed'' activation is needed. Control is taken away from the player with '''input 0''' and given back with '''input 1'''. Actually, this is redundant here because '''begin_cutscene''' and '''end_cutscene''' take care of the player's controls too (along with letterboxing etc). | |||
;Camera stuff | |||
:The camera cuts to a view of console 4 (interpolation over 0 frames to the position and rotation of '''[[OBAN|OBANambush1]]''') after 1 second. Another 2.5 seconds later, console 4 is activated, and then after another 2.5 seconds the actual "ambush" starts: the camera cuts to a view of console 3 (with Konoko still in front of it) and then interpolates over 5 seconds to a view of the final door, '''OBANambush3''': [[cm_interpolate_block]] makes sure that the ''previous'' camera relocation (the cut to '''OBANambush2''') is complete. 50 frames after the camera has reached '''OBANambush3''', it closes in on the door over another 5 seconds ('''OBANambush4'''). The camera stays there until the end of the cutscene, when it focuses back on Konoko. | |||
;Music | |||
:The music starts as the camera cuts back to Konoko's pod and starts panning towards the door. '''[[#func music_script_start|func music_script_start]]''' sets the user variable '''music_counter''' to 2 so that the music stops when and if both Strikers are killed (when either of them is killed, a function is called that decrements the counter and stops the music if it reaches zero: see '''[[#func striker_lullaby_2|func striker_lullaby_2]]''' and '''[[#func all_music_counters|func all_music_counters]]'''). | |||
;Door and locklight | |||
:The [[OBD:BINA/OBJC/DOOR|door]] unlocks to let the Strikers pass and locks behind them (the locklight, looked up in [[ENVP]], changes accordingly). It is later unlocked by console 4. | |||
;Characters | |||
:The Strikers have their movement mode set to "walk", which is only effective after they stop '''playback'''ing and start '''do_path'''ing (they wander off towards the middle of the hangar). The '''i_uh_heheheh1''' [[OBD:BINA/OBJC/TRGV|trigger volume]] makes sure they'll retreat to guard the door if Konoko heads for the console that unlocks it (see '''[[#func i_uh_heheheh|func i_uh_heheheh]]''' below). The purpose of "interp 30" modifier to the '''playback''' command is not clear, as the scene looks just the same without it. | |||
func void final_ambush(string char_index) | |||
{ | |||
[[dprint]] finalambush | |||
[[input]] 0 | |||
[[begin_cutscene]] | |||
[[sleep]] 60 | |||
[[cm_interpolate]] ambush1 0 | |||
sleep 150 | |||
[[console_activate]] 4 | |||
sleep 150 | |||
[[sound_music_start]] mus_fitec_hd 0.91 | |||
[[#func music_script_start|music_script_start]] | |||
cm_interpolate ambush2 0 | |||
[[cm_interpolate_block]] ambush3 300 | |||
sleep 350 | |||
cm_interpolate ambush4 300 | |||
[[door_unlock]] 14 | |||
[[particle]] door3_locklight01 do start | |||
[[ai2_spawn]] finalam_striker_1 | |||
ai2_spawn finalam_striker_2 | |||
[[ai2_setmovementmode]] finalam_striker_1 walk | |||
ai2_setmovementmode finalam_striker_2 walk | |||
[[playback]] finalam_striker_1 finalam_striker1 interp 30 | |||
playback finalam_striker_2 finalam_striker2 interp 30 | |||
sleep 300 | |||
particle door3_locklight01 do stop | |||
sleep 300 | |||
[[door_lock]] 14 | |||
[[ai2_dopath]] finalam_striker1 finalam_1 1 | |||
ai2_dopath finalam_striker2 finalam_2 1 | |||
[[trigvolume_enable]] i_uh_heheheh1 1 | |||
[[cm_reset]] | |||
[[end_cutscene]] | |||
input 1 | |||
} | |||
func | ===func i_uh_heheheh=== | ||
This forces the two Red Strikers from the final fight to retreat to the end-of-level door when and if Konoko is about to unlock it from the faraway console. The [[TRGV|trigger volume]] responsible for this is '''i_uh_heheheh1''' (number 6): '''func i_uh_heheheh''' is its '''entry''' function; it spans the stairs that lead to the [[OBD:BINA/OBJC/CONS|console]] number 4. That trigger volume is disabled at level start. It's enabled in '''[[#func final_ambush|func final_ambush]]''' (see above), after both Strikers are spawned. Once enabled, it can only be triggered once, and only by the player. | |||
:Note the typically inconsistent '''string char_index''' parameter: this is actually the ''name'' of the character who fired the trigger volume function. | |||
func void i_uh_heheheh(string char_index) | |||
{ | |||
[[dprint]] iuh_heheheh | |||
func void | [[ai2_dopath]] finalam_striker_1 strategic_retreat1 | ||
{ | ai2_dopath finalam_striker_2 strategic_retreat2 | ||
} | |||
} | |||
func void | ==### DOOR LOCK LIGHTS ###== | ||
{ | ===func change_terminaldoor_light=== | ||
A typical door-unlocking function, called from [[OBD:BINA/OBJC/CONS|console]] number 1. Control is taken away from the player with '''input 0''' and given back with '''input 1'''. The camera instantly moves (interpolates over 0 frames) to the position and orientation specified by '''[[OBAN|OBANdoor1]]''' and refocuses on the player 3.5 seconds later. In the meantime, the '''door1_locklight01''' particle (looked up in '''[[ENVP]]''') turns on, whereby the apparent light changes from red to green. Note that the door (number 2) is unlocked directly by the console, so there's no need for a '''door_unlock 2''' here. | |||
func void change_terminaldoor_light(void) | |||
{ | |||
[[dprint]] door1 | |||
} | [[input]] 0 | ||
[[cm_interpolate]] door1 0 | |||
[[sleep]] 60 | |||
[[particle]] door1_locklight01 do start | |||
sleep 150 | |||
[[cm_reset]] | |||
input 1 | |||
} | |||
func void | ===func change_door2_light=== | ||
{ | Same as above except before giving control back to the player, the objective and compass target are updated (by user functions). This is called from [[OBD:BINA/OBJC/CONS|console]] number 2, and the [[OBD:BINA/OBJC/DOOR|door]] (number 10) is also unlocked directly by the console. | ||
func void change_door2_light(void) | |||
{ | |||
[[dprint]] door2 | |||
} | [[input]] 0 | ||
[[cm_interpolate]] door2 0 | |||
[[sleep]] 60 | |||
[[particle]] door2_locklight01 do start | |||
sleep 150 | |||
[[#func set_objective_3|set_objective_3]] | |||
[[#func set_target_6|set_target_6]] | |||
[[cm_reset]] | |||
input 1 | |||
} | |||
===func change_enddoor_light=== | |||
Same as above for [[OBAN]] and [[ENVP]] lookup. The '''door_unlock 14''' is redundant here because the [[OBD:BINA/OBJC/CONS|console]] (number 4) actually takes care of unlocking [[OBD:BINA/OBJC/DOOR|door]] number 14 (the final door). There is no unlocking sound so it really doesn't make sense to unlock the door a second time while the camera is close to it. | |||
func void change_enddoor_light(void) | |||
{ | |||
[[dprint]] end_door | |||
[[input]] 0 | |||
[[cm_interpolate]] ambush4 0 | |||
[[sleep]] 60 | |||
[[particle]] door3_locklight01 do start | |||
sleep 150 | |||
[[door_unlock]] 14 | |||
[[cm_reset]] | |||
input 1 | |||
} | |||
[[Category:Modding tutorials]] | |||