From 2def3999670d48e77f25ade9b18ab38e00f03d9a Mon Sep 17 00:00:00 2001 From: Jbleezy Date: Tue, 4 Apr 2023 04:07:11 -0700 Subject: [PATCH] Buried: Maxis Quest changes --- README.md | 6 + scripts/zm/_zm_reimagined.gsc | 8 ++ scripts/zm/replaced/zm_buried_sq.gsc | 91 ++++++++++++++ scripts/zm/replaced/zm_buried_sq_ip.gsc | 111 ++++++++++++++++++ scripts/zm/replaced/zm_buried_sq_ows.gsc | 98 ++++++++++++++++ scripts/zm/replaced/zm_buried_sq_tpo.gsc | 32 +++++ scripts/zm/replaced/zm_buried_sq_ts.gsc | 44 +++++++ scripts/zm/zm_buried/zm_buried_reimagined.gsc | 10 ++ 8 files changed, 400 insertions(+) create mode 100644 scripts/zm/replaced/zm_buried_sq.gsc create mode 100644 scripts/zm/replaced/zm_buried_sq_ip.gsc create mode 100644 scripts/zm/replaced/zm_buried_sq_ows.gsc create mode 100644 scripts/zm/replaced/zm_buried_sq_tpo.gsc create mode 100644 scripts/zm/replaced/zm_buried_sq_ts.gsc diff --git a/README.md b/README.md index aa28ad32..119a5448 100644 --- a/README.md +++ b/README.md @@ -570,6 +570,12 @@ * Players can no longer get into the corner next to Juggernog * Removed buildable table hint icons * Added buildable table hint strings on buildable purchase +* Quest: all 5 signs must be meleed for wisp to spawn +* Quest: no longer need to activate the Time Bomb to be able to spawn the 2nd wisp +* Quest: no longer need to activate the lever in the Mansion before activating the bells +* Quest: bells can be activated in any order +* Quest: changed number of targets that need to be hit to 20 multiplied by the amount of player +* Quest: completion button always activatable after completing the quest #### Borough * Tunnels and bank area disabled diff --git a/scripts/zm/_zm_reimagined.gsc b/scripts/zm/_zm_reimagined.gsc index 028f2079..0fd9f89e 100644 --- a/scripts/zm/_zm_reimagined.gsc +++ b/scripts/zm/_zm_reimagined.gsc @@ -2820,6 +2820,10 @@ onuseplantobject_mtower( player ) self maps\mp\zombies\_zm_buildables::buildablestub_finish_build( player ); player playsound( "zmb_buildable_complete" ); + slot = self.buildablestruct.buildable_slot; + piece = player player_get_buildable_piece( slot ); + player player_destroy_piece( piece ); + level thread unregister_tower_unitriggers(); } @@ -2835,6 +2839,10 @@ onuseplantobject_rtower( player ) self maps\mp\zombies\_zm_buildables::buildablestub_finish_build( player ); player playsound( "zmb_buildable_complete" ); + slot = self.buildablestruct.buildable_slot; + piece = player player_get_buildable_piece( slot ); + player player_destroy_piece( piece ); + level thread unregister_tower_unitriggers(); } diff --git a/scripts/zm/replaced/zm_buried_sq.gsc b/scripts/zm/replaced/zm_buried_sq.gsc new file mode 100644 index 00000000..e445f6ba --- /dev/null +++ b/scripts/zm/replaced/zm_buried_sq.gsc @@ -0,0 +1,91 @@ +#include common_scripts\utility; +#include maps\mp\_utility; +#include maps\mp\zombies\_zm_utility; +#include maps\mp\zombies\_zm_sidequests; +#include maps\mp\_visionset_mgr; +#include maps\mp\zm_buried_sq_bt; +#include maps\mp\zm_buried_sq_mta; +#include maps\mp\zm_buried_sq_gl; +#include maps\mp\zm_buried_sq_ftl; +#include maps\mp\zm_buried_sq_ll; +#include maps\mp\zm_buried_sq_ts; +#include maps\mp\zm_buried_sq_ctw; +#include maps\mp\zm_buried_sq_tpo; +#include maps\mp\zm_buried_sq_ip; +#include maps\mp\zm_buried_sq_ows; +#include maps\mp\gametypes_zm\_globallogic_score; +#include maps\mp\zombies\_zm_stats; +#include maps\mp\zombies\_zm_buildables; +#include maps\mp\zombies\_zm_audio; +#include maps\mp\zombies\_zm_perks; +#include maps\mp\zombies\_zm_unitrigger; +#include maps\mp\zm_buried_amb; +#include maps\mp\zombies\_zm_powerups; +#include maps\mp\zombies\_zm_spawner; +#include maps\mp\zombies\_zm_score; +#include maps\mp\zm_buried_sq; + +sq_metagame() +{ + level endon( "sq_metagame_player_connected" ); + + if ( !is_true( level.buried_sq_maxis_complete ) && !is_true( level.buried_sq_richtofen_complete ) ) + level waittill( "buried_sidequest_achieved" ); + + level thread sq_metagame_turn_off_watcher(); + m_endgame_machine = getstruct( "sq_endgame_machine", "targetname" ); + a_stat = []; + a_stat[0] = "sq_transit_last_completed"; + a_stat[1] = "sq_highrise_last_completed"; + a_stat[2] = "sq_buried_last_completed"; + level.n_metagame_machine_lights_on = 0; + flag_wait( "start_zombie_round_logic" ); + sq_metagame_clear_lights(); + players = get_players(); + player_count = players.size; + + for ( n_player = 0; n_player < player_count; n_player++ ) + { + for ( n_stat = 0; n_stat < a_stat.size; n_stat++ ) + { + if ( flag( "sq_is_max_tower_built" ) ) + { + m_endgame_machine sq_metagame_machine_set_light( n_player, n_stat, "sq_bulb_orange" ); + } + else + { + m_endgame_machine sq_metagame_machine_set_light( n_player, n_stat, "sq_bulb_blue" ); + } + + level setclientfield( "buried_sq_egm_bulb_" + n_stat, 1 ); + } + } + + m_endgame_machine.activate_trig = spawn( "trigger_radius", m_endgame_machine.origin, 0, 128, 72 ); + + m_endgame_machine.activate_trig waittill( "trigger" ); + + m_endgame_machine.activate_trig delete(); + m_endgame_machine.activate_trig = undefined; + level setclientfield( "buried_sq_egm_animate", 1 ); + m_endgame_machine.endgame_trig = spawn( "trigger_radius_use", m_endgame_machine.origin, 0, 16, 16 ); + m_endgame_machine.endgame_trig setcursorhint( "HINT_NOICON" ); + m_endgame_machine.endgame_trig sethintstring( &"ZM_BURIED_SQ_EGM_BUT" ); + m_endgame_machine.endgame_trig triggerignoreteam(); + m_endgame_machine.endgame_trig usetriggerrequirelookat(); + + m_endgame_machine.endgame_trig waittill( "trigger" ); + + m_endgame_machine.endgame_trig delete(); + m_endgame_machine.endgame_trig = undefined; + level thread sq_metagame_clear_tower_pieces(); + playsoundatposition( "zmb_endgame_mach_button", m_endgame_machine.origin ); + players = get_players(); + + sq_metagame_clear_lights(); + + if ( flag( "sq_is_max_tower_built" ) ) + level notify( "end_game_reward_starts_maxis" ); + else + level notify( "end_game_reward_starts_richtofen" ); +} \ No newline at end of file diff --git a/scripts/zm/replaced/zm_buried_sq_ip.gsc b/scripts/zm/replaced/zm_buried_sq_ip.gsc new file mode 100644 index 00000000..96a22742 --- /dev/null +++ b/scripts/zm/replaced/zm_buried_sq_ip.gsc @@ -0,0 +1,111 @@ +#include common_scripts\utility; +#include maps\mp\_utility; +#include maps\mp\zombies\_zm_utility; +#include maps\mp\zombies\_zm_sidequests; +#include maps\mp\zm_buried_sq; +#include maps\mp\zombies\_zm_zonemgr; +#include maps\mp\zm_buried_sq_ip; + +init() +{ + flag_init( "sq_ip_puzzle_complete" ); + level.sq_bp_buttons = []; + s_lightboard = getstruct( "zm_sq_lightboard", "targetname" ); + s_lightboard sq_bp_spawn_board(); + declare_sidequest_stage( "sq", "ip", ::init_stage, ::stage_logic, ::exit_stage ); +} + +stage_logic() +{ + if ( flag( "sq_is_max_tower_built" ) ) + { + a_button_structs = getstructarray( "sq_bp_button", "targetname" ); + array_thread( a_button_structs, ::sq_bp_spawn_trigger ); + m_lightboard = getent( "sq_bp_board", "targetname" ); + m_lightboard setclientfield( "buried_sq_bp_set_lightboard", 1 ); + + while ( !flag( "sq_ip_puzzle_complete" ) ) + { + sq_bp_start_puzzle_lights(); + sq_bp_delete_green_lights(); + wait_network_frame(); + wait_network_frame(); + wait_network_frame(); + wait_network_frame(); + wait_network_frame(); + } + } + else + { + sq_ml_spawn_levers(); + a_levers = getentarray( "sq_ml_lever", "targetname" ); + array_thread( a_levers, ::sq_ml_spawn_trigger ); + level thread sq_ml_puzzle_logic(); + flag_wait( "sq_ip_puzzle_complete" ); + } + + wait_network_frame(); + stage_completed( "sq", level._cur_stage_name ); +} + +sq_bp_start_puzzle_lights() +{ + level endon( "sq_bp_wrong_button" ); + level endon( "sq_bp_timeout" ); + a_button_structs = getstructarray( "sq_bp_button", "targetname" ); + a_tags = []; + + foreach ( m_button in a_button_structs ) + a_tags[a_tags.size] = m_button.script_string; + + a_tags = array_randomize( a_tags ); + m_lightboard = getent( "sq_bp_board", "targetname" ); + + foreach ( str_tag in a_tags ) + { + level waittill( "sq_bp_correct_button" ); + } + + flag_set( "sq_ip_puzzle_complete" ); + a_button_structs = getstructarray( "sq_bp_button", "targetname" ); + + foreach ( s_button in a_button_structs ) + { + if ( isdefined( s_button.trig ) ) + s_button.trig delete(); + } +} + +sq_bp_spawn_trigger() +{ + level endon( "sq_ip_puzzle_complete" ); + self.trig = spawn( "trigger_radius_use", self.origin, 0, 16, 16 ); + self.trig setcursorhint( "HINT_NOICON" ); + self.trig sethintstring( &"ZM_BURIED_SQ_BUT_U" ); + self.trig triggerignoreteam(); + self.trig usetriggerrequirelookat(); + + while ( true ) + { + self.trig waittill( "trigger" ); + + self.trig sethintstring( "" ); + level thread sq_bp_button_pressed( self.script_string, self.trig ); + wait 1; + self.trig sethintstring( &"ZM_BURIED_SQ_BUT_U" ); + } +} + +sq_bp_button_pressed( str_tag, trig ) +{ + trig playsound( "zmb_sq_bell_yes" ); + + if ( is_true( trig.triggered ) ) + { + return; + } + + trig.triggered = 1; + sq_bp_light_on( str_tag, "green" ); + level notify( "sq_bp_correct_button" ); +} \ No newline at end of file diff --git a/scripts/zm/replaced/zm_buried_sq_ows.gsc b/scripts/zm/replaced/zm_buried_sq_ows.gsc new file mode 100644 index 00000000..376207bb --- /dev/null +++ b/scripts/zm/replaced/zm_buried_sq_ows.gsc @@ -0,0 +1,98 @@ +#include common_scripts\utility; +#include maps\mp\_utility; +#include maps\mp\zombies\_zm_utility; +#include maps\mp\zombies\_zm_sidequests; +#include maps\mp\zm_buried_sq; +#include maps\mp\zm_buried_sq_ows; + +ows_targets_start() +{ + n_cur_second = 0; + flag_clear( "sq_ows_target_missed" ); + level thread sndsidequestowsmusic(); + a_sign_spots = getstructarray( "otw_target_spot", "script_noteworthy" ); + + level.targets_hit = 0; + + while ( n_cur_second < 40 ) + { + a_spawn_spots = ows_targets_get_cur_spots( n_cur_second ); + + if ( isdefined( a_spawn_spots ) && a_spawn_spots.size > 0 ) + ows_targets_spawn( a_spawn_spots ); + + wait 1; + n_cur_second++; + } + + players = get_players(); + if ( level.targets_hit < ( 20 * players.size ) ) + { + flag_set( "sq_ows_target_missed" ); + } + + if ( !flag( "sq_ows_target_missed" ) ) + { + flag_set( "sq_ows_success" ); + playsoundatposition( "zmb_sq_target_success", ( 0, 0, 0 ) ); + } + else + playsoundatposition( "zmb_sq_target_fail", ( 0, 0, 0 ) ); + + level notify( "sndEndOWSMusic" ); +} + +ows_targets_spawn( a_spawn_spots ) +{ + i = 0; + foreach ( s_spot in a_spawn_spots ) + { + m_target = spawn( "script_model", s_spot.origin ); + m_target.angles = s_spot.angles; + m_target setmodel( "p6_zm_bu_target" ); + m_target ghost(); + wait_network_frame(); + m_target show(); + playfxontag( level._effect["sq_spawn"], m_target, "tag_origin" ); + m_target playsound( "zmb_sq_target_spawn" ); + + if ( isdefined( s_spot.target ) ) + m_target thread ows_target_move( s_spot.target ); + + m_target thread ows_target_think(); + m_target thread sndhit(); + m_target thread sndtime(); + i++; + } +} + +ows_target_think() +{ + self setcandamage( 1 ); + self thread ows_target_delete_timer(); + msg = self waittill_any_return( "ows_target_timeout", "damage" ); + + if ( msg == "damage" ) + { + level.targets_hit++; + } + + if ( isdefined( self.m_linker ) ) + { + self unlink(); + self.m_linker delete(); + } + + self rotatepitch( -90, 0.15, 0.05, 0.05 ); + + self waittill( "rotatedone" ); + + self delete(); +} + +ows_target_delete_timer() +{ + self endon( "death" ); + wait 4; + self notify( "ows_target_timeout" ); +} \ No newline at end of file diff --git a/scripts/zm/replaced/zm_buried_sq_tpo.gsc b/scripts/zm/replaced/zm_buried_sq_tpo.gsc new file mode 100644 index 00000000..fa8b60ec --- /dev/null +++ b/scripts/zm/replaced/zm_buried_sq_tpo.gsc @@ -0,0 +1,32 @@ +#include common_scripts\utility; +#include maps\mp\_utility; +#include maps\mp\zombies\_zm_utility; +#include maps\mp\zombies\_zm_sidequests; +#include maps\mp\_visionset_mgr; +#include maps\mp\gametypes_zm\_hud_util; +#include maps\mp\zombies\_zm_buildables; +#include maps\mp\zombies\_zm; +#include maps\mp\zm_buried_sq; +#include maps\mp\zombies\_zm_weap_time_bomb; +#include maps\mp\zombies\_zm_unitrigger; +#include maps\mp\zm_buried_buildables; +#include maps\mp\zm_buried_sq_tpo; + +stage_logic_maxis() +{ + flag_clear( "sq_wisp_success" ); + flag_clear( "sq_wisp_failed" ); + + while ( !flag( "sq_wisp_success" ) ) + { + stage_start( "sq", "ts" ); + + level waittill( "sq_ts_over" ); + + stage_start( "sq", "ctw" ); + + level waittill( "sq_ctw_over" ); + } + + level._cur_stage_name = "tpo"; +} \ No newline at end of file diff --git a/scripts/zm/replaced/zm_buried_sq_ts.gsc b/scripts/zm/replaced/zm_buried_sq_ts.gsc new file mode 100644 index 00000000..e9c1023d --- /dev/null +++ b/scripts/zm/replaced/zm_buried_sq_ts.gsc @@ -0,0 +1,44 @@ +#include common_scripts\utility; +#include maps\mp\_utility; +#include maps\mp\zombies\_zm_utility; +#include maps\mp\zombies\_zm_sidequests; +#include maps\mp\zm_buried_sq_ts; + +ts_sign_damage_watch() +{ + level endon( "sq_sign_damaged" ); + self ts_sign_deactivate(); + + while ( true ) + { + self waittill( "damage", n_damage, e_attacker, v_direction, v_point, str_type, str_tag, str_model, str_part, str_weapon ); + + if ( ts_is_bowie_knife( str_weapon ) || ts_is_galvaknuckles( str_weapon ) ) + { + self thread ts_sign_activate(); + + ts_sign_check_all_activated( e_attacker, self ); + } + } +} + +ts_sign_check_all_activated( e_attacker, m_last_touched ) +{ + a_signs = getentarray( "sq_tunnel_sign", "targetname" ); + a_signs_active = []; + + foreach ( m_sign in a_signs ) + { + if ( m_sign.ts_sign_activated ) + { + a_signs_active[a_signs_active.size] = m_sign; + } + } + + if ( a_signs_active.size == a_signs.size ) + { + level.m_sq_start_sign = m_last_touched; + level.e_sq_sign_attacker = e_attacker; + level notify( "sq_sign_damaged" ); + } +} \ No newline at end of file diff --git a/scripts/zm/zm_buried/zm_buried_reimagined.gsc b/scripts/zm/zm_buried/zm_buried_reimagined.gsc index e9ab9875..157c2364 100644 --- a/scripts/zm/zm_buried/zm_buried_reimagined.gsc +++ b/scripts/zm/zm_buried/zm_buried_reimagined.gsc @@ -6,7 +6,12 @@ #include scripts\zm\replaced\zm_buried_gamemodes; #include scripts\zm\replaced\zm_buried_ffotd; #include scripts\zm\replaced\zm_buried_fountain; +#include scripts\zm\replaced\zm_buried_sq; #include scripts\zm\replaced\zm_buried_sq_bt; +#include scripts\zm\replaced\zm_buried_sq_ts; +#include scripts\zm\replaced\zm_buried_sq_tpo; +#include scripts\zm\replaced\zm_buried_sq_ip; +#include scripts\zm\replaced\zm_buried_sq_ows; #include scripts\zm\replaced\_zm_ai_sloth; #include scripts\zm\replaced\_zm_buildables_pooled; #include scripts\zm\replaced\_zm_equip_subwoofer; @@ -27,8 +32,13 @@ main() replaceFunc(maps\mp\zm_buried_gamemodes::buildbuildable, scripts\zm\replaced\zm_buried_gamemodes::buildbuildable); replaceFunc(maps\mp\zm_buried_ffotd::spawned_life_triggers, scripts\zm\replaced\zm_buried_ffotd::spawned_life_triggers); replaceFunc(maps\mp\zm_buried_fountain::transport_player_to_start_zone, scripts\zm\replaced\zm_buried_fountain::transport_player_to_start_zone); + replaceFunc(maps\mp\zm_buried_sq::sq_metagame, scripts\zm\replaced\zm_buried_sq::sq_metagame); replaceFunc(maps\mp\zm_buried_sq_bt::stage_vo_watch_gallows, scripts\zm\replaced\zm_buried_sq_bt::stage_vo_watch_gallows); replaceFunc(maps\mp\zm_buried_sq_bt::stage_vo_watch_guillotine, scripts\zm\replaced\zm_buried_sq_bt::stage_vo_watch_guillotine); + replaceFunc(maps\mp\zm_buried_sq_ts::ts_sign_damage_watch, scripts\zm\replaced\zm_buried_sq_ts::ts_sign_damage_watch); + replaceFunc(maps\mp\zm_buried_sq_tpo::stage_logic_maxis, scripts\zm\replaced\zm_buried_sq_tpo::stage_logic_maxis); + replaceFunc(maps\mp\zm_buried_sq_ip::init, scripts\zm\replaced\zm_buried_sq_ip::init); + replaceFunc(maps\mp\zm_buried_sq_ows::ows_targets_start, scripts\zm\replaced\zm_buried_sq_ows::ows_targets_start); replaceFunc(maps\mp\zombies\_zm_ai_sloth::sloth_init_start_funcs, scripts\zm\replaced\_zm_ai_sloth::sloth_init_start_funcs); replaceFunc(maps\mp\zombies\_zm_ai_sloth::sloth_init_update_funcs, scripts\zm\replaced\_zm_ai_sloth::sloth_init_update_funcs); replaceFunc(maps\mp\zombies\_zm_ai_sloth::sloth_check_ragdolls, scripts\zm\replaced\_zm_ai_sloth::sloth_check_ragdolls);