perfect_dark/asm/setup/setupate.s

554 lines
16 KiB
ArmAsm

#
# Duel
#
.set HEADERLEN, 0x20
.include "asm/include/setup.inc"
// Characters
.set CHR_GUARD, 0x00
.set CHR_JONATHAN, 0x01
.set CHR_TRENT, 0x02
// Stage flags
.set STAGEFLAG_GUARD_DEAD, 0x00000100
.set STAGEFLAG_JONATHAN_DEAD, 0x00000200
.set STAGEFLAG_TRENT_DEAD, 0x00000400
.set STAGEFLAG_SA_WALK_TRIGGER, 0x00000800
.set STAGEFLAG_PA_WALK_TRIGGER, 0x00001000
// Functions
.set FUNC_MOVE_TO_PAD, 0x0401
.set FUNC_GUARD_COMBAT, 0x0402
.set FUNC_JON_COMBAT, 0x0403
.set FUNC_TRENT_COMBAT, 0x0404
.set FUNC_GUARD_INIT, 0x0405
.set FUNC_JON_INIT, 0x0406
.set FUNC_TRENT_INIT, 0x0407
props:
briefing 0, 0x5e01
briefing 1, 0x5e00
briefing 2, 0x5e02
briefing 3, 0x5e03
beginobjective 0, 0x5e04, DIFFBIT_A | DIFFBIT_SA | DIFFBIT_PA | DIFFBIT_PD // "Defeat dataDyne guard"
complete_flags STAGEFLAG_GUARD_DEAD
endobjective
beginobjective 1, 0x5e05, DIFFBIT_SA | DIFFBIT_PA | DIFFBIT_PD // "Defeat Jonathan Dark"
complete_flags STAGEFLAG_JONATHAN_DEAD
endobjective
beginobjective 2, 0x5e06, DIFFBIT_PA | DIFFBIT_PD // "Defeat Trent Easton"
complete_flags STAGEFLAG_TRENT_DEAD
endobjective
chr 0x00000200, 0x00, 0x0279, BODY_DDSHOCK, HEAD_RANDOM, FUNC_GUARD_INIT, -1, -1, 100, 100, 0x4c080800, 0x02000000, 0x02, 0x04, -1, 0, 0x00000000
weapon 0x0100, MODEL_CHRFALCON2, CHR_GUARD, 0x00004000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x000003e8, 0x00000000, 0x00000000, 0x0fff0000, WEAPON_FALCON2_SCOPE, 0x00ffffff, 0x00000000
chr 0x00000200, 0x01, 0x0023, BODY_CISOLDIER, HEAD_JONATHAN, FUNC_JON_INIT, -1, -1, 100, 100, 0x4c080800, 0x02000000, 0x02, 0x04, -1, 0, 0x00000000
weapon 0x0100, MODEL_CHRDY357, CHR_JONATHAN, 0x00004000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x000003e8, 0x00000000, 0x00000000, 0x0fff0000, WEAPON_DY357MAGNUM, 0x00ffffff, 0x00000000
chr 0x00000200, 0x02, 0x0024, BODY_TRENT, HEAD_TRENT, FUNC_TRENT_INIT, -1, -1, 100, 100, 0x4c080800, 0x02000000, 0x02, 0x04, -1, 0, 0x00000000
weapon 0x0100, MODEL_CHRDY357TRENT, CHR_TRENT, 0x00004000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x000003e8, 0x00000000, 0x00000000, 0x0fff0000, WEAPON_DY357LX, 0x00ffffff, 0x00000000
door 0x0100, MODEL_DD_OFFICEDOOR, 0x0158, 0x00000400, 0x20000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x000003e8, 0x00000000, 0x00000000, 0x0fff0000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, 0x00040000, 0x00000040, 0x00000384, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000001, 0x00000000, 0x00000800, 0x00000000, 0xff000000, 0x00000000, 0x00000000, 0x00000000
door 0x0100, MODEL_DD_OFFICEDOOR, 0x0159, 0x00000400, 0x20000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x000003e8, 0x00000000, 0x00000000, 0x0fff0000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, 0x00040000, 0x00000040, 0x00000384, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0xff000000, 0x00000000, 0x00000000, 0x00000000
endprops
intro:
outfit OUTFIT_DEFAULT
spawn 0x027a
intro_weapon WEAPON_FALCON2_SCOPE, -1
ammo AMMOTYPE_PISTOL, 8
endintro
paths:
endpaths
func1000_counterop_setup:
yield
set_chr_alliance CHR_COUNTEROP, ALLIANCE_ENEMY
set_function CHR_SELF, GFUNC_REBUILD_GROUPS
endfunction
func1001_objectives_failed:
yield
set_function CHR_SELF, GFUNC_SHOW_OBJ_FAILED_MSG
endfunction
func1002_first_walk:
set_chr_flag_bank3 CHR_VELVET, CHRFLAG3_HIDDEN
set_chr_flag_bank3 CHR_COUNTEROP, CHRFLAG3_HIDDEN
camera_movement 0x0488
unset_chr_flag_bank3 CHR_JOANNA, CHRFLAG3_HIDDEN
set_chr_flag_bank3 CHR_JOANNA, CHRFLAG3_UNPLAYABLE
set_chr_flag_bank2 CHR_JOANNA, CHRFLAG2_00020000
display_text 0x00, COLOR_02_WHITE, 0x5e07 // "THE DUEL"
animation ANIM_RELOAD, -1, -1, 0x0600, CHR_GUARD, 2
label 0x2d
message CHR_JOANNA, 0x5e0c // "Opponent skill level: AGENT"
// Wait for camera to stop animating
restart_timer
beginloop 0x08
if_camera_animating /*goto*/ 0x2d
goto_next 0x06
label 0x2d
endloop 0x08
// Start walking
label 0x06
remove_displayed_text
revoke_control CHR_JOANNA, 0
enter_firstperson
force_walk CHR_JOANNA, 0x0275, 0x2805, 0x0064
chr_move_to_pad CHR_GUARD, 0x0274, 0x01, /*goto*/ 0x0b
// Wait for walk to finish
beginloop 0x0b
if_force_walk_finished CHR_JOANNA, /*goto*/ 0x0c
endloop 0x0b
label 0x0c
grant_control CHR_JOANNA
set_function CHR_GUARD, FUNC_GUARD_COMBAT
set_function CHR_SELF, GFUNC_IDLE
endfunction
func1007_second_walk:
// Wait until SA walk trigger
beginloop 0x58
if_chr_dying CHR_JOANNA, /*goto*/ 0x2d
if_chr_death_animation_finished CHR_JOANNA, /*goto*/ 0x2d
if_stage_flag_eq STAGEFLAG_SA_WALK_TRIGGER, TRUE, /*goto*/ 0x06
endloop 0x58
// Begin cutscene
label 0x2d
set_function CHR_SELF, GFUNC_IDLE
label 0x06
revoke_control CHR_JOANNA, 0
camera_movement 0x0488
// Place chrs
label 0x8f
set_function CHR_P1P2, FUNC_MOVE_TO_PAD
chr_move_to_pad CHR_JONATHAN, 0x0279, 0x01, /*goto*/ 0x2d
yield
goto_first 0x8f
label 0x2d
unset_chr_flag_bank3 CHR_JONATHAN, CHRFLAG3_HIDDEN
unset_chr_flag_bank3 CHR_JONATHAN, CHRFLAG3_INVINCIBLE_TO_GUNFIRE
unset_chr_flag_bank3 CHR_JONATHAN, CHRFLAG3_UNEXPLODABLE
yield
unset_chr_flag_bank3 CHR_JOANNA, CHRFLAG3_HIDDEN
set_chr_flag_bank3 CHR_JOANNA, CHRFLAG3_UNPLAYABLE
set_chr_flag_bank2 CHR_JOANNA, CHRFLAG2_00020000
animation ANIM_GRAB_CROTCH, -1, -1, 0x0600, CHR_JONATHAN, 2
label 0x2d
message CHR_JOANNA, 0x5e0d // "Opponent skill level: SPECIAL AGENT"
restart_timer
beginloop 0x08
if_camera_animating /*goto*/ 0x2d
goto_next 0x06
label 0x2d
endloop 0x08
// Start force walk
label 0x06
label 0x2d
remove_displayed_text
revoke_control CHR_JOANNA, 0
enter_firstperson
yield
force_walk CHR_JOANNA, 0x0275, 0x2805, 0x0064
// Place Jon
call_rng
if_rand_lt 128, /*goto*/ 0x8f
chr_move_to_pad CHR_JONATHAN, 0x0271, 0x01, /*goto*/ 0x0b
label 0x8f
chr_move_to_pad CHR_JONATHAN, 0x0270, 0x01, /*goto*/ 0x0b
// Wait for force walk to finish
beginloop 0x0b
if_force_walk_finished CHR_JOANNA, /*goto*/ 0x0c
endloop 0x0b
// Give control back to Jo
label 0x0c
grant_control CHR_JOANNA
set_function CHR_JONATHAN, FUNC_JON_COMBAT
set_function CHR_SELF, GFUNC_IDLE
endfunction
func0401_move_to_pad:
chr_move_to_pad CHR_SELF, 0x027a, 0x01, /*goto*/ 0x06
label 0x06
yield
stop_chr
set_function CHR_SELF, GFUNC_IDLE
endfunction
func1008_third_walk:
// Wait for flag or Jo dying
beginloop 0x58
if_chr_dying CHR_JOANNA, /*goto*/ 0x2d
if_chr_death_animation_finished CHR_JOANNA, /*goto*/ 0x2d
if_stage_flag_eq STAGEFLAG_PA_WALK_TRIGGER, TRUE, /*goto*/ 0x06
endloop 0x58
// Jo dead
label 0x2d
set_function CHR_SELF, GFUNC_IDLE
// Do cutscene
label 0x06
revoke_control CHR_JOANNA, 0
camera_movement 0x0488
label 0x8f
set_function CHR_P1P2, FUNC_MOVE_TO_PAD
chr_move_to_pad CHR_TRENT, 0x0279, 0x01, /*goto*/ 0x2d
yield
goto_first 0x8f
label 0x2d
unset_chr_flag_bank3 CHR_TRENT, CHRFLAG3_HIDDEN
unset_chr_flag_bank3 CHR_TRENT, CHRFLAG3_INVINCIBLE_TO_GUNFIRE
unset_chr_flag_bank3 CHR_TRENT, CHRFLAG3_UNEXPLODABLE
yield
unset_chr_flag_bank3 CHR_JOANNA, CHRFLAG3_HIDDEN
set_chr_flag_bank3 CHR_JOANNA, CHRFLAG3_UNPLAYABLE
set_chr_flag_bank2 CHR_JOANNA, CHRFLAG2_00020000
animation ANIM_HEAD_ROLL, -1, -1, 0x0600, CHR_TRENT, 2
label 0x2d
message CHR_JOANNA, 0x5e0e // "Opponent skill level: PERFECT AGENT"
// Wait for cutscene to finish
restart_timer
beginloop 0x08
if_camera_animating /*goto*/ 0x2d
goto_next 0x06
label 0x2d
endloop 0x08
// Begin force walk
label 0x06
remove_displayed_text
revoke_control CHR_JOANNA, 0
enter_firstperson
force_walk CHR_JOANNA, 0x0275, 0x2805, 0x0064
chr_move_to_pad CHR_TRENT, 0x0272, 0x01, /*goto*/ 0x0b
beginloop 0x0b
if_force_walk_finished CHR_JOANNA, /*goto*/ 0x0c
endloop 0x0b
label 0x0c
set_function CHR_TRENT, FUNC_TRENT_COMBAT
grant_control CHR_JOANNA
set_function CHR_SELF, GFUNC_IDLE
endfunction
func1004_revoke_control:
yield
revoke_control CHR_JOANNA, 0
set_function CHR_SELF, GFUNC_IDLE
endfunction
func1005_main:
// Wait until guard dead
beginloop 0x04
if_chr_death_animation_finished CHR_GUARD, /*goto*/ 0x2d
if_chr_dying CHR_GUARD, /*goto*/ 0x2d
if_chr_unloaded CHR_GUARD, /*goto*/ 0x2d
endloop 0x04
label 0x2d
message CHR_JOANNA, 0x5e09 // "Well done! You were too quick for him!"
set_stage_flag STAGEFLAG_GUARD_DEAD
restart_timer
beginloop 0x08
if_timer_gt 120, /*goto*/ 0x2d
endloop 0x08
// If Agent, return
label 0x2d
if_difficulty_lt DIFF_SA, /*goto*/ 0x2d
goto_next 0x06
label 0x2d
set_function CHR_SELF, GFUNC_IDLE
label 0x06
set_stage_flag STAGEFLAG_SA_WALK_TRIGGER
// Wait until Jonathan dead
beginloop 0x09
if_chr_death_animation_finished CHR_JONATHAN, /*goto*/ 0x2d
if_chr_dying CHR_JONATHAN, /*goto*/ 0x2d
if_chr_unloaded CHR_JONATHAN, /*goto*/ 0x2d
endloop 0x09
label 0x2d
message CHR_JOANNA, 0x5e0a // "Well done! You were too quick for him!"
set_stage_flag STAGEFLAG_JONATHAN_DEAD
restart_timer
beginloop 0x0b
if_timer_gt 120, /*goto*/ 0x2d
endloop 0x0b
// If Special Agent, return
label 0x2d
if_difficulty_lt DIFF_PA, /*goto*/ 0x2d
goto_next 0x06
label 0x2d
set_function CHR_SELF, GFUNC_IDLE
label 0x06
set_stage_flag STAGEFLAG_PA_WALK_TRIGGER
// Wait until Trent dead
beginloop 0x0c
if_chr_death_animation_finished CHR_TRENT, /*goto*/ 0x2d
if_chr_dying CHR_TRENT, /*goto*/ 0x2d
if_chr_unloaded CHR_TRENT, /*goto*/ 0x2d
endloop 0x0c
label 0x2d
message CHR_JOANNA, 0x5e0b // "Well done! You were too quick for him!"
set_stage_flag STAGEFLAG_TRENT_DEAD
restart_timer
beginloop 0x0d
if_timer_gt 120, /*goto*/ 0x2d
endloop 0x0d
label 0x2d
set_function CHR_SELF, GFUNC_IDLE
endfunction
func1003_init_audio:
restart_default_music
reset_ambience
set_function CHR_SELF, GFUNC_IDLE
endfunction
func1006_check_objectives_complete:
// Wait for all objectives complete
beginloop 0x04
if_all_objectives_complete /*goto*/ 0x2d
endloop 0x04
// Wait 3 seconds
label 0x2d
restart_timer
beginloop 0x08
if_timer_gt 180, /*goto*/ 0x2d
endloop 0x08
// End level
label 0x2d
end_level
set_function CHR_SELF, GFUNC_IDLE
endfunction
func0402_guard_combat:
set_onshot_function FUNC_GUARD_COMBAT
if_just_injured CHR_SELF, /*goto*/ 0x03
set_chr_flag_bank2 CHR_SELF, CHRFLAG2_00008000
// Wait 2 seconds or for guard to come into view
restart_timer
beginloop 0x04
if_timer_gt 120, /*goto*/ 0x06
if_chr_in_view /*goto*/ 0x2d
endloop 0x04
// Guard has come into view. Jump sideways.
label 0x2d
try_jump_sideways /*goto*/ 0x08
beginloop 0x08
if_chr_distance_lt 250, /*goto*/ 0x0e
if_chr_stopped /*goto*/ 0x03
endloop 0x08
// Guard has been shot, or finished jump
beginloop 0x03
if_chr_distance_lt 250, /*goto*/ 0x0e
if_chr_sees_player /*goto*/ 0x06
reloop 0x03
// 2 seconds have passed without seeing guard, or guard has been shot
label 0x06
if_chr_dying TARGET_CHR, /*goto*/ 0x2e
try_aim_and_shoot_thing1 0x0220, 0x0000, /*goto*/ 0x2d
label 0x2d
try_aim_and_shoot_thing2 0x0200, 0x0000, /*goto*/ 0x0c
beginloop 0x0c
if_chr_stopped /*goto*/ 0x06
endloop 0x0c
// Finished shooting
label 0x06
endloop 0x03
// Dying
label 0x2e
set_function CHR_SELF, GFUNC_IDLE
// Hand combat
label 0x0e
set_return_function CHR_SELF, FUNC_TRENT_COMBAT
set_function CHR_SELF, GFUNC_HAND_COMBAT
endfunction
func0403_jon_combat:
set_onshot_function FUNC_JON_COMBAT
if_just_injured CHR_SELF, /*goto*/ 0x58
set_chr_flag_bank2 CHR_SELF, CHRFLAG2_00008000
restart_timer
beginloop 0x04
if_timer_gt 240, /*goto*/ 0x58
if_within_units_of_sight 30, /*goto*/ 0x58
endloop 0x04
label 0x58
try_run_to_target_chr /*goto*/ 0x08
beginloop 0x08
if_chr_distance_lt 250, /*goto*/ 0x0e
if_in_disarm_range /*goto*/ 0x06
reloop 0x08
label 0x06
try_chr_kneel_and_shoot_thing 0x0220, 0x0000, /*goto*/ 0x2d
label 0x2d
try_roll_and_shoot /*goto*/ 0x0c
try_chr_kneel_and_shoot_thing 0x0200, 0x0000, /*goto*/ 0x0c
beginloop 0x0c
if_chr_stopped /*goto*/ 0x06
endloop 0x0c
label 0x06
endloop 0x58
label 0x0e
set_return_function CHR_SELF, FUNC_JON_COMBAT
set_function CHR_SELF, GFUNC_HAND_COMBAT
set_function CHR_SELF, GFUNC_IDLE
endfunction
func0404_trent_combat:
set_onshot_function FUNC_TRENT_COMBAT
if_just_injured CHR_SELF, /*goto*/ 0x03
set_chr_flag_bank2 CHR_SELF, CHRFLAG2_00008000
restart_timer
beginloop 0x04
if_timer_gt 120, /*goto*/ 0x03
if_chr_in_view /*goto*/ 0x03
endloop 0x04
// Wait until player in sight or in close range
beginloop 0x03
if_chr_distance_lt 250, /*goto*/ 0x0e
if_chr_sees_player /*goto*/ 0x06
reloop 0x03
// Attack
label 0x06
if_chr_dying TARGET_CHR, /*goto*/ 0x2e
try_aim_and_shoot_thing1 0x0220, 0x0000, /*goto*/ 0x2d
label 0x2d
try_aim_and_shoot_thing2 0x0200, 0x0000, /*goto*/ 0x0c
beginloop 0x0c
if_chr_stopped /*goto*/ 0x06
endloop 0x0c
label 0x06
endloop 0x03
// Hand combat
label 0x0e
set_return_function CHR_SELF, FUNC_TRENT_COMBAT
set_function CHR_SELF, GFUNC_HAND_COMBAT
label 0x2e
set_function CHR_SELF, GFUNC_IDLE
endfunction
func0405_guard_init:
set_self_flag_bank3 CHRFLAG3_NOAUTOAIM
set_accuracy 200
set_reaction_speed 50
set_chr_health CHR_SELF, 20
set_armor 0
set_recovery_speed 0
set_shield 0
set_function CHR_SELF, GFUNC_IDLE
endfunction
func0406_jon_init:
set_self_flag_bank3 CHRFLAG3_NOAUTOAIM
set_accuracy 200
set_reaction_speed 75
set_chr_health CHR_SELF, 40
set_armor 0
set_recovery_speed 0
set_shield 0
set_self_flag_bank3 CHRFLAG3_HIDDEN
set_self_flag_bank3 CHRFLAG3_INVINCIBLE_TO_GUNFIRE
set_self_flag_bank3 CHRFLAG3_UNEXPLODABLE
set_function CHR_SELF, GFUNC_IDLE
endfunction
func0407_trent_init:
set_self_flag_bank3 CHRFLAG3_NOAUTOAIM
set_accuracy 200
set_reaction_speed 75
set_chr_health CHR_SELF, 40
set_armor 0
set_recovery_speed 0
set_shield 0
set_self_flag_bank3 CHRFLAG3_HIDDEN
set_self_flag_bank3 CHRFLAG3_INVINCIBLE_TO_GUNFIRE
set_self_flag_bank3 CHRFLAG3_UNEXPLODABLE
set_function CHR_SELF, GFUNC_IDLE
endfunction
functions:
register_function func1000_counterop_setup 0x1000
register_function func1001_objectives_failed 0x1001
register_function func1002_first_walk 0x1002
register_function func1003_init_audio 0x1003
register_function func1004_revoke_control 0x1004
register_function func1005_main 0x1005
register_function func1006_check_objectives_complete 0x1006
register_function func1007_second_walk 0x1007
register_function func1008_third_walk 0x1008
register_function func0401_move_to_pad 0x0401
register_function func0402_guard_combat 0x0402
register_function func0403_jon_combat 0x0403
register_function func0404_trent_combat 0x0404
register_function func0405_guard_init 0x0405
register_function func0406_jon_init 0x0406
register_function func0407_trent_init 0x0407
endfunctions
.align 4