mirror of
https://github.com/JezuzLizard/Recompilable-gscs-for-BO2-zombies-and-multiplayer.git
synced 2025-06-10 18:57:58 -05:00
1158 lines
29 KiB
Plaintext
1158 lines
29 KiB
Plaintext
#include maps/mp/zm_highrise_sq;
|
|
#include maps/mp/zombies/_zm_perks;
|
|
#include maps/mp/zombies/_zm_unitrigger;
|
|
#include maps/mp/zombies/_zm_buildables;
|
|
#include maps/mp/zombies/_zm_stats;
|
|
#include maps/mp/gametypes_zm/_globallogic_score;
|
|
#include maps/mp/zombies/_zm_sidequests;
|
|
#include maps/mp/zombies/_zm_utility;
|
|
#include maps/mp/_utility;
|
|
#include common_scripts/utility;
|
|
|
|
#using_animtree( "fxanim_props" );
|
|
|
|
init()
|
|
{
|
|
if ( isDefined( level.gamedifficulty ) && level.gamedifficulty == 0 )
|
|
{
|
|
sq_easy_cleanup();
|
|
return;
|
|
}
|
|
flag_init( "sq_disabled" );
|
|
flag_init( "sq_branch_complete" );
|
|
flag_init( "sq_tower_active" );
|
|
flag_init( "sq_player_has_sniper" );
|
|
flag_init( "sq_player_has_ballistic" );
|
|
flag_init( "sq_ric_tower_complete" );
|
|
flag_init( "sq_max_tower_complete" );
|
|
flag_init( "sq_players_out_of_sync" );
|
|
flag_init( "sq_ball_picked_up" );
|
|
register_map_navcard( "navcard_held_zm_highrise", "navcard_held_zm_transit" );
|
|
ss_buttons = getentarray( "sq_ss_button", "targetname" );
|
|
i = 0;
|
|
while ( i < ss_buttons.size )
|
|
{
|
|
ss_buttons[ i ] usetriggerrequirelookat();
|
|
ss_buttons[ i ] sethintstring( "" );
|
|
ss_buttons[ i ] setcursorhint( "HINT_NOICON" );
|
|
i++;
|
|
}
|
|
level thread mahjong_tiles_setup();
|
|
flag_init( "sq_nav_built" );
|
|
declare_sidequest( "sq", ::init_sidequest, ::sidequest_logic, ::complete_sidequest, ::generic_stage_start, ::generic_stage_complete );
|
|
maps/mp/zm_highrise_sq_atd::init();
|
|
maps/mp/zm_highrise_sq_slb::init();
|
|
declare_sidequest( "sq_1", ::init_sidequest_1, ::sidequest_logic_1, ::complete_sidequest, ::generic_stage_start, ::generic_stage_complete );
|
|
maps/mp/zm_highrise_sq_ssp::init_1();
|
|
maps/mp/zm_highrise_sq_pts::init_1();
|
|
declare_sidequest( "sq_2", ::init_sidequest_2, ::sidequest_logic_2, ::complete_sidequest, ::generic_stage_start, ::generic_stage_complete );
|
|
maps/mp/zm_highrise_sq_ssp::init_2();
|
|
maps/mp/zm_highrise_sq_pts::init_2();
|
|
level thread init_navcard();
|
|
level thread init_navcomputer();
|
|
precache_sidequest_assets();
|
|
}
|
|
|
|
sq_highrise_clientfield_init()
|
|
{
|
|
registerclientfield( "toplayer", "clientfield_sq_vo", 5000, 5, "int" );
|
|
level.sq_clientfield_vo[ "none" ] = 0;
|
|
level.sq_clientfield_vo[ "vox_maxi_sidequest_activ_dragons_0" ] = 1;
|
|
level.sq_clientfield_vo[ "vox_maxi_sidequest_congratulate_0" ] = 2;
|
|
level.sq_clientfield_vo[ "vox_maxi_sidequest_create_trample_0" ] = 3;
|
|
level.sq_clientfield_vo[ "vox_maxi_sidequest_create_trample_1" ] = 4;
|
|
level.sq_clientfield_vo[ "vox_maxi_sidequest_create_trample_2" ] = 5;
|
|
level.sq_clientfield_vo[ "vox_maxi_sidequest_create_trample_3" ] = 6;
|
|
level.sq_clientfield_vo[ "vox_maxi_sidequest_create_trample_4" ] = 7;
|
|
level.sq_clientfield_vo[ "vox_maxi_sidequest_fail_0" ] = 8;
|
|
level.sq_clientfield_vo[ "vox_maxi_sidequest_fail_1" ] = 9;
|
|
level.sq_clientfield_vo[ "vox_maxi_sidequest_fail_2" ] = 10;
|
|
level.sq_clientfield_vo[ "vox_maxi_sidequest_fail_3" ] = 11;
|
|
level.sq_clientfield_vo[ "vox_maxi_sidequest_lion_balls_0" ] = 12;
|
|
level.sq_clientfield_vo[ "vox_maxi_sidequest_lion_balls_1" ] = 13;
|
|
level.sq_clientfield_vo[ "vox_maxi_sidequest_lion_balls_2" ] = 14;
|
|
level.sq_clientfield_vo[ "vox_maxi_sidequest_lion_balls_3" ] = 15;
|
|
level.sq_clientfield_vo[ "vox_maxi_sidequest_lion_balls_4" ] = 16;
|
|
level.sq_clientfield_vo[ "vox_maxi_sidequest_max_com_0" ] = 17;
|
|
level.sq_clientfield_vo[ "vox_maxi_sidequest_max_com_1" ] = 18;
|
|
level.sq_clientfield_vo[ "vox_maxi_sidequest_max_com_2" ] = 19;
|
|
level.sq_clientfield_vo[ "vox_maxi_sidequest_punch_tower_0" ] = 20;
|
|
level.sq_clientfield_vo[ "vox_maxi_sidequest_reincar_zombie_0" ] = 21;
|
|
level.sq_clientfield_vo[ "vox_maxi_sidequest_reincar_zombie_1" ] = 22;
|
|
level.sq_clientfield_vo[ "vox_maxi_sidequest_reincar_zombie_2" ] = 23;
|
|
level.sq_clientfield_vo[ "vox_maxi_sidequest_reincar_zombie_3" ] = 24;
|
|
level.sq_clientfield_vo[ "vox_maxi_sidequest_reincar_zombie_4" ] = 25;
|
|
level.sq_clientfield_vo[ "vox_maxi_sidequest_reincar_zombie_5" ] = 26;
|
|
level.sq_clientfield_vo[ "vox_maxi_sidequest_reincar_zombie_6" ] = 27;
|
|
level.sq_clientfield_vo[ "vox_maxi_sidequest_sec_symbols_0" ] = 28;
|
|
level.sq_clientfield_vo[ "vox_maxi_sidequest_sec_symbols_1" ] = 29;
|
|
level.sq_clientfield_vo[ "vox_maxi_sidequest_sniper_rifle_0" ] = 30;
|
|
level.sq_clientfield_vo[ "vox_maxi_sidequest_tower_complete_0" ] = 31;
|
|
}
|
|
|
|
sq_easy_cleanup()
|
|
{
|
|
computer_buildable_trig = getent( "sq_common_buildable_trigger", "targetname" );
|
|
computer_buildable_trig delete();
|
|
sq_buildables = getentarray( "buildable_sq_common", "targetname" );
|
|
_a112 = sq_buildables;
|
|
_k112 = getFirstArrayKey( _a112 );
|
|
while ( isDefined( _k112 ) )
|
|
{
|
|
item = _a112[ _k112 ];
|
|
item delete();
|
|
_k112 = getNextArrayKey( _a112, _k112 );
|
|
}
|
|
a_balls = getentarray( "sq_dragon_lion_ball", "targetname" );
|
|
array_delete( a_balls );
|
|
a_tiles = getentarray( "mahjong_tile", "script_noteworthy" );
|
|
array_delete( a_tiles );
|
|
a_emblems_lit = getentarray( "elevator_dragon_lit", "targetname" );
|
|
array_delete( a_emblems_lit );
|
|
a_emblems = getentarray( "elevator_dragon_icon", "targetname" );
|
|
array_delete( a_emblems );
|
|
a_emblems = getentarray( "atd2_marker_lit", "targetname" );
|
|
array_delete( a_emblems );
|
|
}
|
|
|
|
init_player_sidequest_stats()
|
|
{
|
|
self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "sq_highrise_started", 0 );
|
|
self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "navcard_held_zm_transit", 0 );
|
|
self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "navcard_held_zm_highrise", 0 );
|
|
self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "navcard_applied_zm_highrise", 0 );
|
|
self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "sq_highrise_maxis_reset", 0 );
|
|
self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "sq_highrise_rich_reset", 0 );
|
|
self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "sq_highrise_rich_complete", 0 );
|
|
self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "sq_highrise_maxis_complete", 0 );
|
|
self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "sq_highrise_last_completed", 0 );
|
|
}
|
|
|
|
start_highrise_sidequest()
|
|
{
|
|
flag_wait( "start_zombie_round_logic" );
|
|
sidequest_start( "sq" );
|
|
}
|
|
|
|
init_sidequest()
|
|
{
|
|
players = get_players();
|
|
thread sq_refresh_player_navcard_hud();
|
|
a_balls = getentarray( "sq_sliquify_ball", "targetname" );
|
|
_a180 = a_balls;
|
|
_k180 = getFirstArrayKey( _a180 );
|
|
while ( isDefined( _k180 ) )
|
|
{
|
|
m_ball = _a180[ _k180 ];
|
|
m_ball.can_pickup = 0;
|
|
m_ball hide();
|
|
_k180 = getNextArrayKey( _a180, _k180 );
|
|
}
|
|
scriptmodelsuseanimtree( -1 );
|
|
level.scr_anim[ "fxanim_props" ][ "trample_gen_ab" ] = %fxanim_zom_highrise_trample_gen_ab_anim;
|
|
level.scr_anim[ "fxanim_props" ][ "trample_gen_ba" ] = %fxanim_zom_highrise_trample_gen_ba_anim;
|
|
level.scr_anim[ "fxanim_props" ][ "trample_gen_cd" ] = %fxanim_zom_highrise_trample_gen_cd_anim;
|
|
level.scr_anim[ "fxanim_props" ][ "trample_gen_dc" ] = %fxanim_zom_highrise_trample_gen_dc_anim;
|
|
level thread vo_maxis_do_quest();
|
|
level thread vo_weapon_watcher();
|
|
level.maxcompleted = 0;
|
|
level.richcompleted = 0;
|
|
_a199 = players;
|
|
_k199 = getFirstArrayKey( _a199 );
|
|
while ( isDefined( _k199 ) )
|
|
{
|
|
player = _a199[ _k199 ];
|
|
player.highrise_sq_started = 1;
|
|
lastcompleted = player maps/mp/zombies/_zm_stats::get_global_stat( "sq_highrise_last_completed" );
|
|
if ( lastcompleted == 1 )
|
|
{
|
|
level.richcompleted = 1;
|
|
}
|
|
else
|
|
{
|
|
if ( lastcompleted == 2 )
|
|
{
|
|
level.maxcompleted = 1;
|
|
}
|
|
}
|
|
_k199 = getNextArrayKey( _a199, _k199 );
|
|
}
|
|
if ( level.richcompleted )
|
|
{
|
|
if ( level.maxcompleted )
|
|
{
|
|
flag_set( "sq_players_out_of_sync" );
|
|
}
|
|
else
|
|
{
|
|
tower_in_sync_lightning();
|
|
}
|
|
exploder( 1003 );
|
|
}
|
|
if ( level.maxcompleted )
|
|
{
|
|
if ( !flag( "sq_players_out_of_sync" ) )
|
|
{
|
|
tower_in_sync_lightning();
|
|
}
|
|
exploder( 903 );
|
|
}
|
|
}
|
|
|
|
init_sidequest_1()
|
|
{
|
|
}
|
|
|
|
init_sidequest_2()
|
|
{
|
|
}
|
|
|
|
generic_stage_start()
|
|
{
|
|
/#
|
|
level thread cheat_complete_stage();
|
|
#/
|
|
level._stage_active = 1;
|
|
}
|
|
|
|
cheat_complete_stage()
|
|
{
|
|
level endon( "reset_sundial" );
|
|
while ( 1 )
|
|
{
|
|
if ( getDvar( "cheat_sq" ) != "" )
|
|
{
|
|
if ( isDefined( level._last_stage_started ) )
|
|
{
|
|
setdvar( "cheat_sq", "" );
|
|
stage_completed( "sq", level._last_stage_started );
|
|
}
|
|
}
|
|
wait 0,1;
|
|
}
|
|
}
|
|
|
|
sidequest_logic()
|
|
{
|
|
level thread temp_test_fx();
|
|
if ( is_true( level.maxcompleted ) && is_true( level.richcompleted ) )
|
|
{
|
|
return;
|
|
}
|
|
level thread watch_nav_computer_built();
|
|
flag_wait( "power_on" );
|
|
level thread vo_richtofen_power_on();
|
|
flag_wait( "sq_nav_built" );
|
|
if ( !is_true( level.navcomputer_spawned ) )
|
|
{
|
|
update_sidequest_stats( "sq_highrise_started" );
|
|
}
|
|
level thread navcomputer_waitfor_navcard();
|
|
stage_start( "sq", "atd" );
|
|
level waittill( "sq_atd_over" );
|
|
stage_start( "sq", "slb" );
|
|
level waittill( "sq_slb_over" );
|
|
if ( !is_true( level.richcompleted ) )
|
|
{
|
|
level thread sidequest_start( "sq_1" );
|
|
}
|
|
if ( !is_true( level.maxcompleted ) )
|
|
{
|
|
level thread sidequest_start( "sq_2" );
|
|
}
|
|
flag_wait( "sq_branch_complete" );
|
|
tower_punch_watcher();
|
|
if ( flag( "sq_ric_tower_complete" ) )
|
|
{
|
|
update_sidequest_stats( "sq_highrise_rich_complete" );
|
|
}
|
|
else
|
|
{
|
|
if ( flag( "sq_max_tower_complete" ) )
|
|
{
|
|
update_sidequest_stats( "sq_highrise_maxis_complete" );
|
|
}
|
|
}
|
|
}
|
|
|
|
sidequest_logic_1()
|
|
{
|
|
stage_start( "sq_1", "ssp_1" );
|
|
level waittill( "sq_1_ssp_1_over" );
|
|
stage_start( "sq_1", "pts_1" );
|
|
level waittill( "sq_1_pts_1_over" );
|
|
flag_set( "sq_branch_complete" );
|
|
flag_set( "sq_ric_tower_complete" );
|
|
exploder( 1001 );
|
|
clientnotify( "start_fireball_dragon_b" );
|
|
wait 0,1;
|
|
clientnotify( "fxanim_dragon_b_start" );
|
|
wait getanimlength( %fxanim_zom_highrise_dragon_b_anim );
|
|
exploder( 1002 );
|
|
level thread vo_richtofen_punch_tower();
|
|
}
|
|
|
|
sidequest_logic_2()
|
|
{
|
|
stage_start( "sq_2", "ssp_2" );
|
|
level waittill( "sq_2_ssp_2_over" );
|
|
stage_start( "sq_2", "pts_2" );
|
|
level waittill( "sq_2_pts_2_over" );
|
|
exploder( 901 );
|
|
clientnotify( "start_fireball_dragon_a" );
|
|
wait 0,1;
|
|
clientnotify( "fxanim_dragon_a_start" );
|
|
wait getanimlength( %fxanim_zom_highrise_dragon_a_anim );
|
|
exploder( 902 );
|
|
flag_set( "sq_branch_complete" );
|
|
flag_set( "sq_max_tower_complete" );
|
|
level thread vo_maxis_punch_tower();
|
|
}
|
|
|
|
watch_nav_computer_built()
|
|
{
|
|
if ( !is_true( level.navcomputer_spawned ) )
|
|
{
|
|
wait_for_buildable( "sq_common" );
|
|
}
|
|
flag_set( "sq_nav_built" );
|
|
}
|
|
|
|
get_specific_player( num )
|
|
{
|
|
players = get_players();
|
|
return undefined;
|
|
}
|
|
|
|
tower_punch_watcher()
|
|
{
|
|
level thread playtoweraudio();
|
|
a_leg_trigs = [];
|
|
_a411 = level.a_wind_order;
|
|
_k411 = getFirstArrayKey( _a411 );
|
|
while ( isDefined( _k411 ) )
|
|
{
|
|
str_wind = _a411[ _k411 ];
|
|
a_leg_trigs[ a_leg_trigs.size ] = "sq_tower_" + str_wind;
|
|
_k411 = getNextArrayKey( _a411, _k411 );
|
|
}
|
|
level.n_cur_leg = 0;
|
|
level.sq_leg_punches = 0;
|
|
_a419 = a_leg_trigs;
|
|
_k419 = getFirstArrayKey( _a419 );
|
|
while ( isDefined( _k419 ) )
|
|
{
|
|
str_leg = _a419[ _k419 ];
|
|
t_leg = getent( str_leg, "script_noteworthy" );
|
|
t_leg thread tower_punch_watch_leg( a_leg_trigs );
|
|
_k419 = getNextArrayKey( _a419, _k419 );
|
|
}
|
|
flag_wait( "sq_tower_active" );
|
|
/#
|
|
iprintlnbold( "TOWER ACTIVE" );
|
|
#/
|
|
if ( flag( "sq_ric_tower_complete" ) )
|
|
{
|
|
exploder_stop( 1002 );
|
|
exploder_stop( 903 );
|
|
exploder( 1003 );
|
|
}
|
|
else
|
|
{
|
|
exploder_stop( 902 );
|
|
exploder_stop( 1003 );
|
|
exploder( 903 );
|
|
}
|
|
wait 1;
|
|
level thread tower_in_sync_lightning();
|
|
wait 1;
|
|
level thread sq_give_all_perks();
|
|
}
|
|
|
|
tower_in_sync_lightning()
|
|
{
|
|
s_tower_top = getstruct( "sq_zombie_launch_target", "targetname" );
|
|
playfx( level._effect[ "sidequest_tower_bolts" ], s_tower_top.origin - vectorScale( ( 0, 0, 0 ), 88 ), ( 0, 0, 0 ) );
|
|
}
|
|
|
|
playtoweraudio()
|
|
{
|
|
origin = ( 2207, 682, 3239 );
|
|
ent = spawn( "script_origin", origin );
|
|
ent playsound( "zmb_sq_tower_powerup_start_1" );
|
|
ent playloopsound( "zmb_sq_tower_powerup_loop_1", 1 );
|
|
flag_wait( "sq_tower_active" );
|
|
ent stoploopsound( 2 );
|
|
ent playsound( "zmb_sq_tower_powerup_start_2" );
|
|
wait 2;
|
|
ent playloopsound( "zmb_sq_tower_powerup_loop_2", 1 );
|
|
}
|
|
|
|
tower_punch_watch_leg( a_leg_trigs )
|
|
{
|
|
while ( !flag( "sq_tower_active" ) )
|
|
{
|
|
self waittill( "trigger", who );
|
|
if ( level.n_cur_leg < a_leg_trigs.size && isplayer( who ) || who.current_melee_weapon == "tazer_knuckles_zm" && who.current_melee_weapon == "tazer_knuckles_upgraded_zm" )
|
|
{
|
|
if ( self.script_noteworthy == a_leg_trigs[ level.n_cur_leg ] )
|
|
{
|
|
level.n_cur_leg++;
|
|
self playsound( "zmb_sq_leg_powerup_" + level.n_cur_leg );
|
|
if ( level.n_cur_leg == 4 )
|
|
{
|
|
flag_set( "sq_tower_active" );
|
|
}
|
|
}
|
|
else
|
|
{
|
|
level.n_cur_leg = 0;
|
|
self playsound( "zmb_sq_leg_powerdown" );
|
|
}
|
|
level.sq_leg_punches++;
|
|
self playsound( "zmb_sq_leg_powerup_" + level.sq_leg_punches );
|
|
if ( level.sq_leg_punches >= 4 && !flag( "sq_tower_active" ) )
|
|
{
|
|
wait 1;
|
|
self playsound( "zmb_sq_leg_powerdown" );
|
|
exploder_stop( 1002 );
|
|
exploder_stop( 902 );
|
|
cur_round = level.round_number;
|
|
level waittill( "start_of_round" );
|
|
level.sq_leg_punches = 0;
|
|
wait 2;
|
|
if ( flag( "sq_ric_tower_complete" ) )
|
|
{
|
|
exploder( 1002 );
|
|
break;
|
|
}
|
|
else
|
|
{
|
|
exploder( 902 );
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
mahjong_tiles_setup()
|
|
{
|
|
a_winds = array_randomize( array( "north", "south", "east", "west" ) );
|
|
a_colors = array_randomize( array( "blk", "blu", "grn", "red" ) );
|
|
a_locs = array_randomize( getstructarray( "sq_tile_loc_random", "targetname" ) );
|
|
/#
|
|
assert( a_locs.size > a_winds.size, "zm_highrise_sq: not enough locations for mahjong tiles!" );
|
|
#/
|
|
a_wind_order = array( "none" );
|
|
i = 0;
|
|
while ( i < a_winds.size )
|
|
{
|
|
a_wind_order[ a_wind_order.size ] = a_winds[ i ];
|
|
m_wind_tile = getent( "tile_" + a_winds[ i ] + "_" + a_colors[ i ], "targetname" );
|
|
m_wind_tile.script_noteworthy = undefined;
|
|
s_spot = a_locs[ i ];
|
|
if ( a_winds[ i ] == "north" )
|
|
{
|
|
s_spot = getstruct( "sq_tile_loc_north", "targetname" );
|
|
}
|
|
m_wind_tile.origin = s_spot.origin;
|
|
m_wind_tile.angles = s_spot.angles;
|
|
i++;
|
|
}
|
|
i = 0;
|
|
while ( i < a_colors.size )
|
|
{
|
|
m_num_tile = getent( "tile_" + ( i + 1 ) + "_" + a_colors[ i ], "targetname" );
|
|
m_num_tile.script_noteworthy = undefined;
|
|
s_spot = a_locs[ i + a_winds.size ];
|
|
m_num_tile.origin = s_spot.origin;
|
|
m_num_tile.angles = s_spot.angles;
|
|
i++;
|
|
}
|
|
a_tiles = getentarray( "mahjong_tile", "script_noteworthy" );
|
|
array_delete( a_tiles );
|
|
level.a_wind_order = a_winds;
|
|
}
|
|
|
|
light_dragon_fireworks( str_dragon, n_num_fireworks )
|
|
{
|
|
i = 0;
|
|
while ( i < n_num_fireworks )
|
|
{
|
|
wait 1;
|
|
clientnotify( str_dragon + "_start_firework" );
|
|
wait 1;
|
|
i++;
|
|
}
|
|
}
|
|
|
|
temp_test_fx()
|
|
{
|
|
n_index = 0;
|
|
level waittill( "temp_play_next_sq_fx" );
|
|
clientnotify( "r_drg_tail" );
|
|
clientnotify( "m_drg_tail" );
|
|
while ( n_index < 7 )
|
|
{
|
|
level waittill( "temp_play_next_sq_fx" );
|
|
clientnotify( "r_start_firework" );
|
|
clientnotify( "m_start_firework" );
|
|
n_index++;
|
|
}
|
|
level waittill( "temp_play_next_sq_fx" );
|
|
exploder( 901 );
|
|
clientnotify( "start_fireball_dragon_b" );
|
|
wait 0,1;
|
|
clientnotify( "fxanim_dragon_b_start" );
|
|
level waittill( "temp_play_next_sq_fx" );
|
|
clientnotify( "start_fireball_dragon_a" );
|
|
wait 0,1;
|
|
clientnotify( "fxanim_dragon_a_start" );
|
|
level waittill( "temp_play_next_sq_fx" );
|
|
wait 1;
|
|
exploder( 902 );
|
|
wait 1;
|
|
exploder( 903 );
|
|
level waittill( "temp_play_next_sq_fx" );
|
|
stop_exploder( 901 );
|
|
stop_exploder( 902 );
|
|
stop_exploder( 903 );
|
|
exploder( 1001 );
|
|
exploder( 1002 );
|
|
exploder( 1003 );
|
|
}
|
|
|
|
generic_stage_complete()
|
|
{
|
|
level._stage_active = 0;
|
|
}
|
|
|
|
complete_sidequest()
|
|
{
|
|
level thread sidequest_done();
|
|
}
|
|
|
|
sidequest_done()
|
|
{
|
|
}
|
|
|
|
get_variant_from_entity_num( player_number )
|
|
{
|
|
if ( !isDefined( player_number ) )
|
|
{
|
|
player_number = 0;
|
|
}
|
|
post_fix = "a";
|
|
switch( player_number )
|
|
{
|
|
case 0:
|
|
post_fix = "a";
|
|
break;
|
|
case 1:
|
|
post_fix = "b";
|
|
break;
|
|
case 2:
|
|
post_fix = "c";
|
|
break;
|
|
case 3:
|
|
post_fix = "d";
|
|
break;
|
|
}
|
|
return post_fix;
|
|
}
|
|
|
|
init_navcard()
|
|
{
|
|
flag_wait( "start_zombie_round_logic" );
|
|
spawn_card = 1;
|
|
players = get_players();
|
|
_a678 = players;
|
|
_k678 = getFirstArrayKey( _a678 );
|
|
while ( isDefined( _k678 ) )
|
|
{
|
|
player = _a678[ _k678 ];
|
|
has_card = does_player_have_map_navcard( player );
|
|
if ( has_card )
|
|
{
|
|
player.navcard_grabbed = level.map_navcard;
|
|
spawn_card = 0;
|
|
}
|
|
_k678 = getNextArrayKey( _a678, _k678 );
|
|
}
|
|
thread sq_refresh_player_navcard_hud();
|
|
if ( !spawn_card )
|
|
{
|
|
return;
|
|
}
|
|
next_model = "p6_zm_keycard";
|
|
place_navcard( next_model, next_model, level.map_navcard, level.navcard_needed );
|
|
}
|
|
|
|
place_navcard( str_model, str_next_model, str_stat, str_next_stat )
|
|
{
|
|
org = ( 1743, 1070, 3244,5 );
|
|
angles = ( 0, 0, 0 );
|
|
navcard = spawn( "script_model", org );
|
|
navcard setmodel( str_model );
|
|
navcard.angles = angles;
|
|
wait 1;
|
|
navcard_pickup_trig = spawn( "trigger_radius_use", org, 0, 84, 72 );
|
|
navcard_pickup_trig setcursorhint( "HINT_NOICON" );
|
|
navcard_pickup_trig sethintstring( &"ZOMBIE_NAVCARD_PICKUP" );
|
|
navcard_pickup_trig triggerignoreteam();
|
|
is_holding_card = 0;
|
|
while ( 1 )
|
|
{
|
|
navcard_pickup_trig waittill( "trigger", who );
|
|
if ( is_player_valid( who ) )
|
|
{
|
|
if ( who maps/mp/zombies/_zm_stats::get_global_stat( str_next_stat ) )
|
|
{
|
|
is_holding_card = 1;
|
|
who maps/mp/zombies/_zm_stats::set_global_stat( str_next_stat, 0 );
|
|
}
|
|
who playsound( "zmb_buildable_piece_add" );
|
|
who maps/mp/zombies/_zm_stats::set_global_stat( str_stat, 1 );
|
|
who.navcard_grabbed = str_stat;
|
|
wait_network_frame();
|
|
is_stat = who maps/mp/zombies/_zm_stats::get_global_stat( str_stat );
|
|
is_next_stat = who maps/mp/zombies/_zm_stats::get_global_stat( str_next_stat );
|
|
thread sq_refresh_player_navcard_hud();
|
|
break;
|
|
}
|
|
else
|
|
{
|
|
}
|
|
}
|
|
navcard delete();
|
|
navcard_pickup_trig delete();
|
|
if ( is_holding_card )
|
|
{
|
|
level thread place_navcard( str_next_model, str_model, str_next_stat, str_stat );
|
|
}
|
|
}
|
|
|
|
init_navcomputer()
|
|
{
|
|
flag_wait( "start_zombie_round_logic" );
|
|
spawn_navcomputer = 1;
|
|
players = get_players();
|
|
_a757 = players;
|
|
_k757 = getFirstArrayKey( _a757 );
|
|
while ( isDefined( _k757 ) )
|
|
{
|
|
player = _a757[ _k757 ];
|
|
built_comptuer = player maps/mp/zombies/_zm_stats::get_global_stat( "sq_highrise_started" );
|
|
if ( !built_comptuer )
|
|
{
|
|
spawn_navcomputer = 0;
|
|
break;
|
|
}
|
|
else
|
|
{
|
|
_k757 = getNextArrayKey( _a757, _k757 );
|
|
}
|
|
}
|
|
if ( !spawn_navcomputer )
|
|
{
|
|
return;
|
|
}
|
|
level.navcomputer_spawned = 1;
|
|
get_players()[ 0 ] maps/mp/zombies/_zm_buildables::player_finish_buildable( level.sq_buildable.buildablezone );
|
|
while ( isDefined( level.sq_buildable ) && isDefined( level.sq_buildable.model ) )
|
|
{
|
|
buildable = level.sq_buildable.buildablezone;
|
|
i = 0;
|
|
while ( i < buildable.pieces.size )
|
|
{
|
|
if ( isDefined( buildable.pieces[ i ].model ) )
|
|
{
|
|
buildable.pieces[ i ].model delete();
|
|
maps/mp/zombies/_zm_unitrigger::unregister_unitrigger( buildable.pieces[ i ].unitrigger );
|
|
}
|
|
if ( isDefined( buildable.pieces[ i ].part_name ) )
|
|
{
|
|
buildable.stub.model notsolid();
|
|
buildable.stub.model show();
|
|
buildable.stub.model showpart( buildable.pieces[ i ].part_name );
|
|
}
|
|
i++;
|
|
}
|
|
}
|
|
}
|
|
|
|
navcomputer_waitfor_navcard()
|
|
{
|
|
spawn_trigger = 1;
|
|
players = get_players();
|
|
_a801 = players;
|
|
_k801 = getFirstArrayKey( _a801 );
|
|
while ( isDefined( _k801 ) )
|
|
{
|
|
player = _a801[ _k801 ];
|
|
card_swiped = player maps/mp/zombies/_zm_stats::get_global_stat( "navcard_applied_zm_highrise" );
|
|
if ( card_swiped )
|
|
{
|
|
spawn_trigger = 0;
|
|
break;
|
|
}
|
|
else
|
|
{
|
|
_k801 = getNextArrayKey( _a801, _k801 );
|
|
}
|
|
}
|
|
if ( !spawn_trigger )
|
|
{
|
|
return;
|
|
}
|
|
computer_buildable_trig = getent( "sq_common_buildable_trigger", "targetname" );
|
|
trig_pos = getstruct( "sq_common_key", "targetname" );
|
|
navcomputer_use_trig = spawn( "trigger_radius_use", trig_pos.origin, 0, 48, 48 );
|
|
navcomputer_use_trig setcursorhint( "HINT_NOICON" );
|
|
navcomputer_use_trig sethintstring( &"ZOMBIE_NAVCARD_USE" );
|
|
navcomputer_use_trig triggerignoreteam();
|
|
while ( 1 )
|
|
{
|
|
navcomputer_use_trig waittill( "trigger", who );
|
|
if ( isplayer( who ) && is_player_valid( who ) )
|
|
{
|
|
if ( does_player_have_correct_navcard( who ) )
|
|
{
|
|
navcomputer_use_trig sethintstring( &"ZOMBIE_NAVCARD_SUCCESS" );
|
|
who playsound( "zmb_sq_navcard_success" );
|
|
update_sidequest_stats( "navcard_applied_zm_highrise" );
|
|
who.navcard_grabbed = undefined;
|
|
wait 1;
|
|
navcomputer_use_trig delete();
|
|
return;
|
|
break;
|
|
}
|
|
else
|
|
{
|
|
navcomputer_use_trig sethintstring( &"ZOMBIE_NAVCARD_FAIL" );
|
|
who playsound( "zmb_sq_navcard_fail" );
|
|
wait 1;
|
|
navcomputer_use_trig sethintstring( &"ZOMBIE_NAVCARD_USE" );
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
update_sidequest_stats( stat_name )
|
|
{
|
|
maxis_complete = 0;
|
|
rich_complete = 0;
|
|
started = 0;
|
|
if ( stat_name == "sq_highrise_maxis_complete" )
|
|
{
|
|
maxis_complete = 1;
|
|
}
|
|
else
|
|
{
|
|
if ( stat_name == "sq_highrise_rich_complete" )
|
|
{
|
|
rich_complete = 1;
|
|
}
|
|
}
|
|
players = get_players();
|
|
_a867 = players;
|
|
_k867 = getFirstArrayKey( _a867 );
|
|
while ( isDefined( _k867 ) )
|
|
{
|
|
player = _a867[ _k867 ];
|
|
if ( stat_name == "sq_highrise_started" )
|
|
{
|
|
player.highrise_sq_started = 1;
|
|
}
|
|
else if ( stat_name == "navcard_applied_zm_highrise" )
|
|
{
|
|
player maps/mp/zombies/_zm_stats::set_global_stat( level.navcard_needed, 0 );
|
|
thread sq_refresh_player_navcard_hud();
|
|
}
|
|
else
|
|
{
|
|
if ( !is_true( player.highrise_sq_started ) )
|
|
{
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if ( rich_complete )
|
|
{
|
|
player maps/mp/zombies/_zm_stats::set_global_stat( "sq_highrise_last_completed", 1 );
|
|
incrementcounter( "global_zm_total_rich_sq_complete_highrise", 1 );
|
|
}
|
|
else
|
|
{
|
|
if ( maxis_complete )
|
|
{
|
|
player maps/mp/zombies/_zm_stats::set_global_stat( "sq_highrise_last_completed", 2 );
|
|
incrementcounter( "global_zm_total_max_sq_complete_highrise", 1 );
|
|
}
|
|
}
|
|
player maps/mp/zombies/_zm_stats::increment_client_stat( stat_name, 0 );
|
|
}
|
|
_k867 = getNextArrayKey( _a867, _k867 );
|
|
}
|
|
if ( rich_complete || maxis_complete )
|
|
{
|
|
level notify( "highrise_sidequest_achieved" );
|
|
}
|
|
}
|
|
|
|
sq_give_all_perks()
|
|
{
|
|
vending_triggers = getentarray( "zombie_vending", "targetname" );
|
|
perks = [];
|
|
i = 0;
|
|
while ( i < vending_triggers.size )
|
|
{
|
|
perk = vending_triggers[ i ].script_noteworthy;
|
|
if ( perk == "specialty_weapupgrade" )
|
|
{
|
|
i++;
|
|
continue;
|
|
}
|
|
else
|
|
{
|
|
perks[ perks.size ] = perk;
|
|
}
|
|
i++;
|
|
}
|
|
if ( flag( "sq_ric_tower_complete" ) )
|
|
{
|
|
v_fireball_start_loc = ( 1946, 608, 3338 );
|
|
n_fireball_exploder = 1001;
|
|
}
|
|
else
|
|
{
|
|
v_fireball_start_loc = ( 1068, -1362, 3340,5 );
|
|
n_fireball_exploder = 901;
|
|
}
|
|
players = getplayers();
|
|
_a935 = players;
|
|
_k935 = getFirstArrayKey( _a935 );
|
|
while ( isDefined( _k935 ) )
|
|
{
|
|
player = _a935[ _k935 ];
|
|
player thread sq_give_player_perks( perks, v_fireball_start_loc, n_fireball_exploder );
|
|
level waittill( "sq_fireball_hit_player" );
|
|
_k935 = getNextArrayKey( _a935, _k935 );
|
|
}
|
|
}
|
|
|
|
sq_give_player_perks( perks, v_fireball_start_loc, n_fireball_exploder )
|
|
{
|
|
exploder( n_fireball_exploder );
|
|
m_fireball = spawn( "script_model", v_fireball_start_loc );
|
|
m_fireball setmodel( "tag_origin" );
|
|
playfxontag( level._effect[ "sidequest_dragon_fireball_max" ], m_fireball, "tag_origin" );
|
|
wait_network_frame();
|
|
v_to_player = vectornormalize( self gettagorigin( "J_SpineLower" ) - m_fireball.origin );
|
|
v_move_spot = m_fireball.origin + ( v_to_player * 48 );
|
|
m_fireball.origin = v_move_spot;
|
|
m_fireball.origin = self gettagorigin( "J_SpineLower" );
|
|
m_fireball linkto( self, "J_SpineLower" );
|
|
wait 1,5;
|
|
playfx( level._effect[ "sidequest_flash" ], m_fireball.origin );
|
|
m_fireball delete();
|
|
level notify( "sq_fireball_hit_player" );
|
|
_a967 = perks;
|
|
_k967 = getFirstArrayKey( _a967 );
|
|
while ( isDefined( _k967 ) )
|
|
{
|
|
perk = _a967[ _k967 ];
|
|
if ( isDefined( self.perk_purchased ) && self.perk_purchased == perk )
|
|
{
|
|
}
|
|
else
|
|
{
|
|
if ( self hasperk( perk ) || self maps/mp/zombies/_zm_perks::has_perk_paused( perk ) )
|
|
{
|
|
break;
|
|
}
|
|
else
|
|
{
|
|
self maps/mp/zombies/_zm_perks::give_perk( perk, 0 );
|
|
wait 1;
|
|
}
|
|
}
|
|
_k967 = getNextArrayKey( _a967, _k967 );
|
|
}
|
|
}
|
|
|
|
sq_refresh_player_navcard_hud_internal()
|
|
{
|
|
self endon( "disconnect" );
|
|
navcard_bits = 0;
|
|
i = 0;
|
|
while ( i < level.navcards.size )
|
|
{
|
|
hasit = self maps/mp/zombies/_zm_stats::get_global_stat( level.navcards[ i ] );
|
|
if ( isDefined( self.navcard_grabbed ) && self.navcard_grabbed == level.navcards[ i ] )
|
|
{
|
|
hasit = 1;
|
|
}
|
|
if ( hasit )
|
|
{
|
|
navcard_bits += 1 << i;
|
|
}
|
|
i++;
|
|
}
|
|
wait_network_frame();
|
|
self setclientfield( "navcard_held", 0 );
|
|
if ( navcard_bits > 0 )
|
|
{
|
|
wait_network_frame();
|
|
self setclientfield( "navcard_held", navcard_bits );
|
|
}
|
|
}
|
|
|
|
sq_refresh_player_navcard_hud()
|
|
{
|
|
if ( !isDefined( level.navcards ) )
|
|
{
|
|
return;
|
|
}
|
|
players = get_players();
|
|
_a1013 = players;
|
|
_k1013 = getFirstArrayKey( _a1013 );
|
|
while ( isDefined( _k1013 ) )
|
|
{
|
|
player = _a1013[ _k1013 ];
|
|
player thread sq_refresh_player_navcard_hud_internal();
|
|
_k1013 = getNextArrayKey( _a1013, _k1013 );
|
|
}
|
|
}
|
|
|
|
vo_maxis_do_quest()
|
|
{
|
|
wait 20;
|
|
if ( 1 )
|
|
{
|
|
maxissay( "vox_maxi_sidequest_max_com_0" );
|
|
}
|
|
else
|
|
{
|
|
maxissay( "vox_maxi_sidequest_max_com_1" );
|
|
maxissay( "vox_maxi_sidequest_max_com_2" );
|
|
}
|
|
}
|
|
|
|
vo_richtofen_power_on()
|
|
{
|
|
wait 6;
|
|
richtofensay( "vox_zmba_sidequest_power_on_0" );
|
|
}
|
|
|
|
vo_richtofen_nav_card()
|
|
{
|
|
switch( self.characterindex )
|
|
{
|
|
case 2:
|
|
break;
|
|
case 0:
|
|
case 3:
|
|
case 1:
|
|
}
|
|
if ( 1 )
|
|
{
|
|
level thread vo_maxis_first_tower();
|
|
}
|
|
else if ( 0 )
|
|
{
|
|
level thread vo_richtofen_first_tower();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
vo_richtofen_first_tower()
|
|
{
|
|
richtofensay( "vox_zmba_sidequest_congratulate_0" );
|
|
richtofensay( "vox_zmba_sidequest_congratulate_1" );
|
|
}
|
|
|
|
vo_maxis_first_tower()
|
|
{
|
|
maxissay( "vox_maxi_sidequest_congratulate_0" );
|
|
}
|
|
|
|
vo_find_nav_card()
|
|
{
|
|
switch( self.characterindex )
|
|
{
|
|
case 2:
|
|
break;
|
|
case 0:
|
|
case 3:
|
|
case 1:
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
vo_maxis_find_sniper()
|
|
{
|
|
maxissay( "vox_maxi_sidequest_sniper_rifle_0" );
|
|
}
|
|
|
|
vo_richtofen_find_sniper()
|
|
{
|
|
richtofensay( "vox_zmba_sidequest_sniper_rifle_0" );
|
|
wait 10;
|
|
richtofensay( "vox_zmba_sidequest_sniper_rifle_1" );
|
|
}
|
|
|
|
vo_maxis_player_has_pap_ballistic()
|
|
{
|
|
maps/mp/zm_highrise_sq::maxissay( "vox_maxi_sidequest_reincar_zombie_2" );
|
|
}
|
|
|
|
vo_richtofen_punch_tower()
|
|
{
|
|
richtofensay( "vox_zmba_sidequest_punch_tower_0" );
|
|
richtofensay( "vox_zmba_sidequest_punch_tower_1" );
|
|
richtofensay( "vox_zmba_sidequest_punch_tower_2" );
|
|
richtofensay( "vox_zmba_sidequest_punch_tower_3" );
|
|
}
|
|
|
|
vo_maxis_punch_tower()
|
|
{
|
|
maxissay( "vox_maxi_sidequest_punch_tower_0" );
|
|
}
|
|
|
|
vo_weapon_watcher()
|
|
{
|
|
while ( !flag( "sq_player_has_sniper" ) || !flag( "sq_player_has_ballistic" ) )
|
|
{
|
|
players = getplayers();
|
|
_a1155 = players;
|
|
_k1155 = getFirstArrayKey( _a1155 );
|
|
while ( isDefined( _k1155 ) )
|
|
{
|
|
player = _a1155[ _k1155 ];
|
|
if ( !flag( "sq_player_has_sniper" ) && isDefined( player.currentweapon ) && sq_is_weapon_sniper( player.currentweapon ) )
|
|
{
|
|
flag_set( "sq_player_has_sniper" );
|
|
if ( isDefined( level.rich_sq_player ) && is_player_valid( level.rich_sq_player ) && player == level.rich_sq_player )
|
|
{
|
|
level thread vo_richtofen_find_sniper();
|
|
}
|
|
else
|
|
{
|
|
level thread vo_maxis_find_sniper();
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if ( !flag( "sq_player_has_ballistic" ) && isDefined( player.currentweapon ) && player.currentweapon == "knife_ballistic_upgraded_zm" )
|
|
{
|
|
flag_set( "sq_player_has_ballistic" );
|
|
level thread vo_maxis_player_has_pap_ballistic();
|
|
}
|
|
}
|
|
_k1155 = getNextArrayKey( _a1155, _k1155 );
|
|
}
|
|
wait 1;
|
|
}
|
|
}
|
|
|
|
sq_is_weapon_sniper( str_weapon )
|
|
{
|
|
a_snipers = array( "dsr50", "barretm82", "svu" );
|
|
_a1184 = a_snipers;
|
|
_k1184 = getFirstArrayKey( _a1184 );
|
|
while ( isDefined( _k1184 ) )
|
|
{
|
|
str_sniper = _a1184[ _k1184 ];
|
|
if ( issubstr( str_weapon, str_sniper ) )
|
|
{
|
|
return 1;
|
|
}
|
|
_k1184 = getNextArrayKey( _a1184, _k1184 );
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
richtofensay( vox_line, time )
|
|
{
|
|
level endon( "end_game" );
|
|
level endon( "intermission" );
|
|
if ( is_true( level.intermission ) )
|
|
{
|
|
return;
|
|
}
|
|
if ( is_true( level.richcompleted ) )
|
|
{
|
|
return;
|
|
}
|
|
level endon( "richtofen_c_complete" );
|
|
if ( !isDefined( time ) )
|
|
{
|
|
time = 2;
|
|
}
|
|
while ( is_true( level.richtofen_talking_to_samuel ) )
|
|
{
|
|
wait 1;
|
|
}
|
|
if ( isDefined( level.rich_sq_player ) && is_player_valid( level.rich_sq_player ) )
|
|
{
|
|
/#
|
|
iprintlnbold( "Richtoffen Says: " + vox_line );
|
|
#/
|
|
level.rich_sq_player playsoundtoplayer( vox_line, level.rich_sq_player );
|
|
if ( !is_true( level.richtofen_talking_to_samuel ) )
|
|
{
|
|
level thread richtofen_talking( time );
|
|
}
|
|
}
|
|
}
|
|
|
|
richtofen_talking( time )
|
|
{
|
|
level.rich_sq_player.dontspeak = 1;
|
|
level.richtofen_talking_to_samuel = 1;
|
|
wait time;
|
|
level.richtofen_talking_to_samuel = 0;
|
|
if ( isDefined( level.rich_sq_player ) )
|
|
{
|
|
level.rich_sq_player.dontspeak = 0;
|
|
}
|
|
}
|
|
|
|
maxissay( line )
|
|
{
|
|
level endon( "end_game" );
|
|
level endon( "intermission" );
|
|
if ( is_true( level.maxcompleted ) )
|
|
{
|
|
return;
|
|
}
|
|
if ( is_true( level.intermission ) )
|
|
{
|
|
return;
|
|
}
|
|
while ( is_true( level.maxis_talking ) )
|
|
{
|
|
wait 0,05;
|
|
}
|
|
level.maxis_talking = 1;
|
|
/#
|
|
iprintlnbold( "Maxis Says: " + line );
|
|
#/
|
|
players = getplayers();
|
|
_a1286 = players;
|
|
_k1286 = getFirstArrayKey( _a1286 );
|
|
while ( isDefined( _k1286 ) )
|
|
{
|
|
player = _a1286[ _k1286 ];
|
|
player setclientfieldtoplayer( "clientfield_sq_vo", level.sq_clientfield_vo[ line ] );
|
|
_k1286 = getNextArrayKey( _a1286, _k1286 );
|
|
}
|
|
wait 10;
|
|
level.maxis_talking = 0;
|
|
}
|