diff --git a/README.md b/README.md index 753ed72f..d0fb5f92 100644 --- a/README.md +++ b/README.md @@ -526,6 +526,14 @@ * Moved weapon locker to the downstairs fridge * Zombies no longer spawn in the Upper Blue Highrise zone when in the Trample Steam zone * Zombies no longer spawn in the zone next to the AN94 when in the AN94 zone while the debris is closed +* Quest: elevator symbols can be activated without players on every symbol +* Quest: elevator symbols stay active after activating once +* Quest: floor symbols can be activated in any order +* Quest: Trample Steam step only requires one Trample Steam to be placed in the correct position +* Quest: tower legs can be punched in any order +* Quest (Maxis): no longer have to shoot the upgraded Ballistic Knife after collecting the corpses +* Quest (Maxis): ball no longer requires a Trample Steam on the other side +* Quest (Richtofen): decreased number of Sliquifier shots required for each ball from 20 to 10 ### Mob of the Dead * 1 afterlife max in solo diff --git a/scripts/zm/replaced/_zm_equip_springpad.gsc b/scripts/zm/replaced/_zm_equip_springpad.gsc index 3ed769b6..3b2b0708 100644 --- a/scripts/zm/replaced/_zm_equip_springpad.gsc +++ b/scripts/zm/replaced/_zm_equip_springpad.gsc @@ -43,7 +43,7 @@ springpadthink( weapon, electricradius, armed ) if ( isdefined( weapon.fling_targets ) && weapon.fling_targets.size > 0 ) { - weapon notify( "fling", 1 ); + weapon notify( "fling", weapon.zombies_only ); weapon.is_armed = 0; weapon.zombies_only = 1; @@ -118,4 +118,63 @@ wait_for_targets( weapon ) wait 0.05; } +} + +#using_animtree("zombie_springpad"); + +springpad_animate( weapon, armed ) +{ + self endon( "death" ); + self endon( "disconnect" ); + self endon( "equip_springpad_zm_taken" ); + weapon endon( "death" ); + weapon useanimtree( #animtree ); + f_animlength = getanimlength( %o_zombie_buildable_tramplesteam_reset_zombie ); + r_animlength = getanimlength( %o_zombie_buildable_tramplesteam_reset ); + l_animlength = getanimlength( %o_zombie_buildable_tramplesteam_launch ); + weapon thread springpad_audio(); + prearmed = 0; + + if ( isdefined( armed ) && armed ) + prearmed = 1; + + fast_reset = 0; + + while ( isdefined( weapon ) ) + { + if ( !prearmed ) + { + if ( fast_reset ) + { + weapon setanim( %o_zombie_buildable_tramplesteam_reset_zombie ); + weapon thread playspringpadresetaudio( f_animlength ); + wait( f_animlength ); + } + else + { + weapon setanim( %o_zombie_buildable_tramplesteam_reset ); + weapon thread playspringpadresetaudio( r_animlength ); + wait( r_animlength ); + } + } + else + wait 0.05; + + prearmed = 0; + weapon notify( "armed" ); + fast_reset = 1; + + if ( isdefined( weapon ) ) + { + weapon setanim( %o_zombie_buildable_tramplesteam_compressed_idle ); + + weapon waittill( "fling", fast ); + } + + if ( isdefined( weapon ) ) + { + weapon setanim( %o_zombie_buildable_tramplesteam_launch ); + wait( l_animlength ); + } + } } \ No newline at end of file diff --git a/scripts/zm/replaced/zm_highrise_sq.gsc b/scripts/zm/replaced/zm_highrise_sq.gsc index df7aedd1..e71b6df4 100644 --- a/scripts/zm/replaced/zm_highrise_sq.gsc +++ b/scripts/zm/replaced/zm_highrise_sq.gsc @@ -88,4 +88,135 @@ sidequest_logic() update_sidequest_stats( "sq_highrise_rich_complete" ); else if ( flag( "sq_max_tower_complete" ) ) update_sidequest_stats( "sq_highrise_maxis_complete" ); +} + +tower_punch_watcher() +{ + level thread playtoweraudio(); + a_leg_trigs = []; + + foreach ( str_wind in level.a_wind_order ) + a_leg_trigs[a_leg_trigs.size] = "sq_tower_" + str_wind; + + level.n_cur_leg = 0; + level.sq_leg_punches = 0; + + foreach ( str_leg in a_leg_trigs ) + { + t_leg = getent( str_leg, "script_noteworthy" ); + t_leg thread tower_punch_watch_leg( a_leg_trigs ); + } + + flag_wait( "sq_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_punch_watch_leg( a_leg_trigs ) +{ + level.legs_hit = []; + + while ( !flag( "sq_tower_active" ) ) + { + self waittill( "trigger", who ); + + if ( !isinarray( level.legs_hit, self.script_noteworthy ) && isplayer( who ) && ( who.current_melee_weapon == "tazer_knuckles_zm" || who.current_melee_weapon == "tazer_knuckles_upgraded_zm" ) ) + { + level.legs_hit[level.legs_hit.size] = self.script_noteworthy; + self playsound( "zmb_sq_leg_powerup_" + level.legs_hit.size ); + + if ( level.legs_hit.size == 4 ) + flag_set( "sq_tower_active" ); + + return; + } + } +} + +sq_give_all_perks() +{ + vending_triggers = getentarray( "zombie_vending", "targetname" ); + perks = []; + + for ( i = 0; i < vending_triggers.size; i++ ) + { + perk = vending_triggers[i].script_noteworthy; + + if ( perk == "specialty_weapupgrade" ) + continue; + + perks[perks.size] = perk; + } + + 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(); + + foreach ( player in players ) + { + player thread sq_give_player_perks( perks, v_fireball_start_loc, n_fireball_exploder ); + + level waittill( "sq_fireball_hit_player" ); + } +} + +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" ); + + do + { + 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; + } + while ( distancesquared( m_fireball.origin, self gettagorigin( "J_SpineLower" ) ) > 2304 ); + + 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" ); + + foreach ( perk in perks ) + { + if ( isdefined( self.perk_purchased ) && self.perk_purchased == perk ) + continue; + + if ( self hasperk( perk ) || self maps\mp\zombies\_zm_perks::has_perk_paused( perk ) ) + continue; + + self maps\mp\zombies\_zm_perks::give_perk( perk, 0 ); + wait 0.25; + } } \ No newline at end of file diff --git a/scripts/zm/replaced/zm_highrise_sq_atd.gsc b/scripts/zm/replaced/zm_highrise_sq_atd.gsc new file mode 100644 index 00000000..c308ddbd --- /dev/null +++ b/scripts/zm/replaced/zm_highrise_sq_atd.gsc @@ -0,0 +1,118 @@ +#include common_scripts\utility; +#include maps\mp\_utility; +#include maps\mp\zombies\_zm_utility; +#include maps\mp\zombies\_zm_sidequests; +#include maps\mp\zm_highrise_sq; +#include maps\mp\zm_highrise_sq_atd; + +init() +{ + flag_init( "sq_atd_elevator0" ); + flag_init( "sq_atd_elevator1" ); + flag_init( "sq_atd_elevator2" ); + flag_init( "sq_atd_elevator3" ); + flag_init( "sq_atd_elevator_activated" ); + flag_init( "sq_atd_drg_puzzle_1st_error" ); + flag_init( "sq_atd_drg_puzzle_complete" ); + declare_sidequest_stage( "sq", "atd", ::init_stage, ::stage_logic, ::exit_stage_1 ); + sq_atd_dragon_icon_setup(); +} + +stage_logic() +{ + sq_atd_elevators(); + sq_atd_drg_puzzle(); + stage_completed( "sq", level._cur_stage_name ); +} + +sq_atd_elevators() +{ + a_elevators = array( "elevator_bldg1b_trigger", "elevator_bldg1d_trigger", "elevator_bldg3b_trigger", "elevator_bldg3c_trigger" ); + a_elevator_flags = array( "sq_atd_elevator0", "sq_atd_elevator1", "sq_atd_elevator2", "sq_atd_elevator3" ); + + for ( i = 0; i < a_elevators.size; i++ ) + { + trig_elevator = getent( a_elevators[i], "targetname" ); + trig_elevator thread sq_atd_watch_elevator( a_elevator_flags[i] ); + } + + while ( !flag( "sq_atd_elevator0" ) || !flag( "sq_atd_elevator1" ) || !flag( "sq_atd_elevator2" ) || !flag( "sq_atd_elevator3" ) ) + { + flag_wait_any_array( a_elevator_flags ); + wait 0.5; + } + + flag_set( "sq_atd_elevator_activated" ); + vo_richtofen_atd_elevators(); + level thread vo_maxis_atd_elevators(); +} + +sq_atd_watch_elevator( str_flag ) +{ + level endon( "sq_atd_elevator_activated" ); + + while ( true ) + { + self waittill( "trigger", e_who ); + + if ( !isplayer( e_who ) ) + { + wait 0.05; + continue; + } + + a_dragon_icons = getentarray( "elevator_dragon_icon", "targetname" ); + foreach ( m_icon in a_dragon_icons ) + { + if ( issubstr( self.targetname, m_icon.script_noteworthy ) ) + { + v_off_pos = m_icon.m_lit_icon.origin; + m_icon.m_lit_icon unlink(); + m_icon unlink(); + m_icon.m_lit_icon.origin = m_icon.origin; + m_icon.origin = v_off_pos; + m_icon.m_lit_icon linkto( m_icon.m_elevator ); + m_icon linkto( m_icon.m_elevator ); + m_icon playsound( "zmb_sq_symbol_light" ); + break; + } + } + + flag_set( str_flag ); + return; + } +} + +sq_atd_drg_puzzle() +{ + level.sq_atd_cur_drg = 0; + a_puzzle_trigs = getentarray( "trig_atd_drg_puzzle", "targetname" ); + a_puzzle_trigs = array_randomize( a_puzzle_trigs ); + + for ( i = 0; i < a_puzzle_trigs.size; i++ ) + a_puzzle_trigs[i] thread drg_puzzle_trig_think( i ); + + while ( level.sq_atd_cur_drg < 4 ) + wait 1; + + flag_set( "sq_atd_drg_puzzle_complete" ); + level thread vo_maxis_atd_order_complete(); +} + +drg_puzzle_trig_think( n_order_id ) +{ + self.drg_active = 0; + m_unlit = getent( self.target, "targetname" ); + m_lit = m_unlit.lit_icon; + v_top = m_unlit.origin; + v_hidden = m_lit.origin; + + self waittill( "trigger", e_who ); + + m_lit.origin = v_top; + m_unlit.origin = v_hidden; + m_lit playsound( "zmb_sq_symbol_light" ); + self.drg_active = 1; + level thread vo_richtofen_atd_order( level.sq_atd_cur_drg ); + level.sq_atd_cur_drg++; +} \ No newline at end of file diff --git a/scripts/zm/replaced/zm_highrise_sq_pts.gsc b/scripts/zm/replaced/zm_highrise_sq_pts.gsc new file mode 100644 index 00000000..46ab832e --- /dev/null +++ b/scripts/zm/replaced/zm_highrise_sq_pts.gsc @@ -0,0 +1,360 @@ +#include common_scripts\utility; +#include maps\mp\_utility; +#include maps\mp\zombies\_zm_utility; +#include maps\mp\zombies\_zm_sidequests; +#include maps\mp\zm_highrise_sq; +#include maps\mp\zombies\_zm_unitrigger; +#include maps\mp\zm_highrise_sq_pts; + +init_1() +{ + flag_init( "pts_1_springpads_placed" ); + declare_sidequest_stage( "sq_1", "pts_1", ::init_stage_1, ::stage_logic_1, ::exit_stage_1 ); +} + +init_2() +{ + flag_init( "pts_2_springpads_placed" ); + flag_init( "pts_2_generator_1_started" ); + flag_init( "pts_2_generator_2_started" ); + declare_sidequest_stage( "sq_2", "pts_2", ::init_stage_2, ::stage_logic_2, ::exit_stage_2 ); +} + +stage_logic_1() +{ + watch_player_springpads( 0 ); + flag_set( "pts_1_springpads_placed" ); + maps\mp\zm_highrise_sq::light_dragon_fireworks( "r", 1 ); + wait_for_zombies_launched(); + maps\mp\zm_highrise_sq::light_dragon_fireworks( "r", 2 ); + stage_completed( "sq_1", "pts_1" ); +} + +stage_logic_2() +{ + watch_player_springpads( 1 ); + level thread wait_for_balls_launched(); + flag_wait( "pts_2_generator_1_started" ); + maps\mp\zm_highrise_sq::light_dragon_fireworks( "m", 2 ); + flag_wait( "pts_2_generator_2_started" ); + maps\mp\zm_highrise_sq::light_dragon_fireworks( "m", 2 ); + level thread maxis_balls_placed(); + stage_completed( "sq_2", "pts_2" ); +} + +watch_player_springpads( is_generator ) +{ + level thread springpad_count_watcher( is_generator ); + a_players = get_players(); + + foreach ( player in a_players ) + player thread pts_watch_springpad_use( is_generator ); +} + +springpad_count_watcher( is_generator ) +{ + level endon( "sq_pts_springad_count4" ); + str_which_spots = "pts_ghoul"; + + if ( is_generator ) + str_which_spots = "pts_lion"; + + a_spots = getstructarray( str_which_spots, "targetname" ); + + while ( true ) + { + level waittill( "sq_pts_springpad_in_place" ); + + n_count = 0; + + foreach ( s_spot in a_spots ) + { + if ( isdefined( s_spot.springpad ) ) + n_count++; + } + + level notify( "sq_pts_springad_count" + n_count ); + } +} + +pts_watch_springpad_use( is_generator ) +{ + self endon( "death" ); + self endon( "disconnect" ); + + while ( !flag( "sq_branch_complete" ) ) + { + self waittill( "equipment_placed", weapon, weapname ); + + if ( weapname == level.springpad_name ) + self thread is_springpad_in_place( weapon, is_generator ); + } +} + +is_springpad_in_place( m_springpad, is_generator ) +{ + m_springpad endon( "death" ); + + m_springpad waittill( "armed" ); + + a_lion_spots = getstructarray( "pts_lion", "targetname" ); + a_ghoul_spots = getstructarray( "pts_ghoul", "targetname" ); + a_spots = arraycombine( a_lion_spots, a_ghoul_spots, 0, 0 ); + + foreach ( s_spot in a_spots ) + { + n_dist = distance2dsquared( m_springpad.origin, s_spot.origin ); + + if ( n_dist < 1024 ) + { + v_spot_forward = vectornormalize( anglestoforward( s_spot.angles ) ); + v_pad_forward = vectornormalize( anglestoforward( m_springpad.angles ) ); + n_dot = vectordot( v_spot_forward, v_pad_forward ); + + if ( n_dot > 0.98 ) + { + level notify( "sq_pts_springpad_in_place" ); + s_spot.springpad = m_springpad; + self thread pts_springpad_removed_watcher( m_springpad, s_spot ); + + if ( is_generator ) + { + wait 0.1; + if ( pts_should_springpad_create_trigs( s_spot ) ) + { + thread maps\mp\zombies\_zm_unitrigger::unregister_unitrigger( self.buildablespringpad.stub ); + } + } + else + { + m_springpad.fling_scaler = 2; + m_springpad thread watch_zombie_flings(); + } + + if ( isdefined( s_spot.script_float ) ) + { + s_target = getstruct( "sq_zombie_launch_target", "targetname" ); + v_override_dir = vectornormalize( s_target.origin - m_springpad.origin ); + v_override_dir = vectorscale( v_override_dir, 1024 ); + m_springpad.direction_vec_override = v_override_dir; + m_springpad.fling_scaler = s_spot.script_float; + } + + break; + } + } + } +} + +wait_for_zombies_launched() +{ + level thread richtofen_zombies_launched(); + t_tower = getent( "pts_tower_trig", "targetname" ); + s_tower_top = getstruct( "sq_zombie_launch_target", "targetname" ); + + while ( level.n_launched_zombies < 15 ) + wait 0.5; +} + +watch_zombie_flings() +{ + self endon( "death" ); + self endon( "disconnect" ); + self endon( "equip_springpad_zm_taken" ); + self endon( "equip_springpad_zm_pickup" ); + + while ( level.n_launched_zombies < 15 ) + { + self waittill( "fling", zombies_only ); + + if ( zombies_only ) + { + level.n_launched_zombies++; + + if ( level.n_launched_zombies == 1 || level.n_launched_zombies == 5 || level.n_launched_zombies == 10 ) + level notify( "pts1_say_next_line" ); + } + + wait 0.1; + } +} + +wait_for_balls_launched() +{ + level.current_generator = 1; + a_lion_spots = getstructarray( "pts_lion", "targetname" ); + + foreach ( s_lion_spot in a_lion_spots ) + { + s_lion_spot.a_place_ball_trigs = []; + } + + a_players = getplayers(); + + foreach ( player in a_players ) + { + player.a_place_ball_trigs = []; + + if ( isdefined( player.zm_sq_has_ball ) ) + player thread player_set_down_ball_watcher(); + } + + while ( true ) + { + level waittill( "zm_ball_picked_up", player ); + + player thread player_set_down_ball_watcher(); + } +} + +player_set_down_ball_watcher() +{ + self waittill_any( "zm_sq_ball_putdown", "zm_sq_ball_used" ); + pts_putdown_trigs_remove_for_player( self ); +} + +pts_should_player_create_trigs( player ) +{ + a_lion_spots = getstructarray( "pts_lion", "targetname" ); + + foreach ( s_lion_spot in a_lion_spots ) + { + if ( isdefined( s_lion_spot.springpad ) && !isdefined( s_lion_spot.which_ball ) ) + { + pts_putdown_trigs_create_for_spot( s_lion_spot, player ); + return true; + } + } + + return false; +} + +pts_should_springpad_create_trigs( s_lion_spot ) +{ + if ( isdefined( s_lion_spot.springpad ) && !isdefined( s_lion_spot.which_ball ) ) + { + a_players = getplayers(); + + foreach ( player in a_players ) + { + if ( isdefined( player.zm_sq_has_ball ) && player.zm_sq_has_ball ) + { + pts_putdown_trigs_create_for_spot( s_lion_spot, player ); + return true; + } + } + } + + return false; +} + +pts_putdown_trigs_create_for_spot( s_lion_spot, player ) +{ + t_place_ball = sq_pts_create_use_trigger( s_lion_spot.origin, 16, 70, &"ZM_HIGHRISE_SQ_PUTDOWN_BALL" ); + player clientclaimtrigger( t_place_ball ); + t_place_ball.owner = player; + player thread place_ball_think( t_place_ball, s_lion_spot ); + + if ( !isdefined( s_lion_spot.pts_putdown_trigs ) ) + s_lion_spot.pts_putdown_trigs = []; + + s_lion_spot.pts_putdown_trigs[player.characterindex] = t_place_ball; + level thread pts_putdown_trigs_springpad_delete_watcher( player, s_lion_spot ); +} + +sq_pts_create_use_trigger( v_origin, radius, height, str_hint_string ) +{ + t_pickup = spawn( "trigger_radius_use", v_origin, 0, radius, height ); + t_pickup setcursorhint( "HINT_NOICON" ); + t_pickup sethintstring( str_hint_string ); + t_pickup.targetname = "ball_place_trig"; + t_pickup triggerignoreteam(); + return t_pickup; +} + +pts_putdown_trigs_springpad_delete_watcher( player, s_lion_spot ) +{ + player pts_springpad_waittill_removed( s_lion_spot.springpad ); + pts_putdown_trigs_remove_for_spot( s_lion_spot ); +} + +place_ball_think( t_place_ball, s_lion_spot ) +{ + t_place_ball endon( "delete" ); + + + while (1) + { + t_place_ball waittill( "trigger" ); + + if (!is_true( self.zm_sq_has_ball ) ) + { + continue; + } + + pts_putdown_trigs_remove_for_spot( s_lion_spot ); + self.zm_sq_has_ball = undefined; + s_lion_spot.which_ball = self.which_ball; + self notify( "zm_sq_ball_used" ); + s_lion_spot.zm_pts_animating = 1; + flag_set( "pts_2_generator_" + level.current_generator + "_started" ); + s_lion_spot.which_generator = level.current_generator; + level.current_generator++; + + s_lion_spot.springpad thread pts_springpad_fling( s_lion_spot.script_noteworthy ); + thread maps\mp\zombies\_zm_unitrigger::register_unitrigger( self.buildablespringpad.stub ); + self.t_putdown_ball delete(); + } +} + +#using_animtree("fxanim_props"); + +pts_springpad_fling( str_spot_name ) +{ + str_anim1 = undefined; + n_anim_length1 = undefined; + str_anim2 = undefined; + n_anim_length2 = undefined; + + switch ( str_spot_name ) + { + case "lion_pair_1": + str_anim1 = "dc"; + str_anim2 = "cd"; + break; + case "lion_pair_2": + str_anim1 = "ab"; + str_anim2 = "ba"; + break; + case "lion_pair_3": + str_anim1 = "cd"; + str_anim2 = "dc"; + break; + case "lion_pair_4": + str_anim1 = "ba"; + str_anim2 = "ab"; + break; + } + + m_anim = spawn( "script_model", ( 2090, 675, 3542 ) ); + m_anim.angles = ( 0, 0, 0 ); + m_anim setmodel( "fxanim_zom_highrise_trample_gen_mod" ); + m_anim useanimtree( #animtree ); + m_anim.targetname = "trample_gen_" + str_spot_name; + pts_springpad_anim_ball( m_anim, str_anim1, str_anim2 ); +} + +pts_springpad_anim_ball( m_anim, str_anim1, str_anim2 ) +{ + m_anim endon( "delete" ); + self endon( "delete" ); + n_anim_length1 = getanimlength( level.scr_anim["fxanim_props"]["trample_gen_" + str_anim1] ); + n_anim_length2 = getanimlength( level.scr_anim["fxanim_props"]["trample_gen_" + str_anim2] ); + + self notify( "fling", 1 ); + + if ( isdefined( m_anim ) ) + m_anim setanim( level.scr_anim["fxanim_props"]["trample_gen_" + str_anim1] ); + + wait( n_anim_length1 ); +} \ No newline at end of file diff --git a/scripts/zm/replaced/zm_highrise_sq_ssp.gsc b/scripts/zm/replaced/zm_highrise_sq_ssp.gsc new file mode 100644 index 00000000..4e4b8d77 --- /dev/null +++ b/scripts/zm/replaced/zm_highrise_sq_ssp.gsc @@ -0,0 +1,103 @@ +#include common_scripts\utility; +#include maps\mp\_utility; +#include maps\mp\zombies\_zm_utility; +#include maps\mp\zombies\_zm_sidequests; +#include maps\mp\zombies\_zm_spawner; +#include maps\mp\zm_highrise_sq; +#include maps\mp\zm_highrise_sq_ssp; + +ssp1_watch_ball( str_complete_flag ) +{ + self watch_model_sliquification( 10, str_complete_flag ); + self thread ssp1_rotate_ball(); + self playloopsound( "zmb_sq_ball_rotate_loop", 0.25 ); +} + +watch_model_sliquification( n_end_limit, str_complete_flag ) +{ + n_count = 0; + self setcandamage( 1 ); + + while ( !flag( str_complete_flag ) ) + { + self waittill( "damage", amount, attacker, direction, point, mod, tagname, modelname, partname, weaponname ); + + if ( issubstr( weaponname, "slipgun" ) && !flag( "sq_ball_picked_up" ) ) + { + n_count++; + + if ( n_count >= n_end_limit ) + { + self notify( "sq_sliquified" ); + + if ( isdefined( self.t_pickup ) ) + self.t_pickup delete(); + + flag_set( str_complete_flag ); + } + else if ( n_count == 1 ) + level notify( "ssp1_ball_first_sliquified" ); + else if ( n_count == 5 ) + level notify( "ssp1_ball_sliquified_2" ); + } + } +} + +init_2() +{ + flag_init( "ssp2_maxis_keep_going_said" ); + flag_init( "ssp2_maxis_reincarnate_said" ); + flag_init( "ssp2_corpses_in_place" ); + flag_init( "ssp2_resurrection_done" ); + flag_init( "ssp2_statue_complete" ); + maps\mp\zombies\_zm_spawner::add_custom_zombie_spawn_logic( ::ssp_2_zombie_death_check ); + declare_sidequest_stage( "sq_2", "ssp_2", ::init_stage_2, ::stage_logic_2, ::exit_stage_2 ); +} + +stage_logic_2() +{ + level thread ssp2_advance_dragon(); + corpse_room_watcher(); + stage_completed( "sq_2", "ssp_2" ); +} + +ssp_2_zombie_death_check() +{ + self waittill( "death" ); + + if ( !isdefined( self ) ) + return; + + t_corpse_room = getent( "corpse_room_trigger", "targetname" ); + + if ( self istouching( t_corpse_room ) ) + level notify( "ssp2_corpse_made", 1 ); +} + +corpse_room_watcher() +{ + t_corpse_room = getent( "corpse_room_trigger", "targetname" ); + n_count = 0; + + while ( !flag( "ssp2_resurrection_done" ) ) + { + level waittill( "ssp2_corpse_made", is_in_room ); + + if ( is_in_room ) + n_count++; + else + n_count = 0; + + if ( n_count == 1 && !flag( "ssp2_maxis_keep_going_said" ) ) + { + flag_set( "ssp2_maxis_keep_going_said" ); + level thread maps\mp\zm_highrise_sq::maxissay( "vox_maxi_sidequest_reincar_zombie_0" ); + } + else if ( n_count >= 15 ) + { + flag_set( "ssp2_corpses_in_place" ); + vo_maxis_ssp_complete(); + flag_set( "ssp2_resurrection_done" ); + } + } +} \ No newline at end of file diff --git a/scripts/zm/zm_highrise/zm_highrise_reimagined.gsc b/scripts/zm/zm_highrise/zm_highrise_reimagined.gsc index fc1a71f3..b31cc57d 100644 --- a/scripts/zm/zm_highrise/zm_highrise_reimagined.gsc +++ b/scripts/zm/zm_highrise/zm_highrise_reimagined.gsc @@ -10,11 +10,20 @@ #include scripts\zm\replaced\_zm_banking; #include scripts\zm\replaced\_zm_weapon_locker; #include scripts\zm\replaced\_zm_sq; +#include scripts\zm\replaced\_zm_sq_atd; +#include scripts\zm\replaced\_zm_sq_ssp; +#include scripts\zm\replaced\_zm_sq_pts; main() { replaceFunc(maps\mp\zm_highrise_sq::navcomputer_waitfor_navcard, scripts\zm\replaced\_zm_sq::navcomputer_waitfor_navcard); replaceFunc(maps\mp\zm_highrise_sq::init, scripts\zm\replaced\zm_highrise_sq::init); + replaceFunc(maps\mp\zm_highrise_sq_atd::init, scripts\zm\replaced\zm_highrise_sq_atd::init); + replaceFunc(maps\mp\zm_highrise_sq_ssp::ssp1_watch_ball, scripts\zm\replaced\zm_highrise_sq_ssp::ssp1_watch_ball); + replaceFunc(maps\mp\zm_highrise_sq_ssp::init_2, scripts\zm\replaced\zm_highrise_sq_ssp::init_2); + replaceFunc(maps\mp\zm_highrise_sq_pts::init_1, scripts\zm\replaced\zm_highrise_sq_pts::init_1); + replaceFunc(maps\mp\zm_highrise_sq_pts::init_2, scripts\zm\replaced\zm_highrise_sq_pts::init_2); + replaceFunc(maps\mp\zm_highrise_sq_pts::pts_should_player_create_trigs, scripts\zm\replaced\zm_highrise_sq_pts::pts_should_player_create_trigs); replaceFunc(maps\mp\zm_highrise_gamemodes::init, scripts\zm\replaced\zm_highrise_gamemodes::init); replaceFunc(maps\mp\zm_highrise_classic::insta_kill_player, scripts\zm\replaced\zm_highrise_classic::insta_kill_player); replaceFunc(maps\mp\zombies\_zm_chugabud::chugabud_bleed_timeout, scripts\zm\replaced\_zm_chugabud::chugabud_bleed_timeout);