--[[ 
 
 
 
            _____       _             _____ _           _              
 
           |_   _|     | |           / ____| |         | |             
 
  _ __ ___   | |  _ __ | |_ _ __ ___| (___ | |__   __ _| | _____  ___  
 
 | '_ ` _ \  | | | '_ \| __| '__/ _ \\___ \| '_ \ / _` | |/ / _ \/ __| 
 
 | | | | | |_| |_| | | | |_| | | (_) |___) | | | | (_| |   <  __/\__ \ 
 
 |_| |_| |_|_____|_| |_|\__|_|  \___/_____/|_| |_|\__,_|_|\_\___||___/ 
 
                                                                       
 
                                                                       
 
											   
 
 
 
--]] 
 
 
 
--[[ 
 
	mIntroShakes.lua 
 
	SRG Map Event Script 
 
	DATE: 2014-05-05 
 
	AUTHOR:	Kevin Tyska 
 
]]-- 
 
 
 
-- Tweakable Parameters -- 
 
 
 
 
 
-------------------------------------------------------------------------------------------------- 
 
--[[ 
 
 
 
   _____                            
 
  / ____|                           
 
 | |  __ _ __ ___  _   _ _ __  ___  
 
 | | |_ | '__/ _ \| | | | '_ \/ __| 
 
 | |__| | | | (_) | |_| | |_) \__ \ 
 
  \_____|_|  \___/ \__,_| .__/|___/ 
 
						| |         
 
						|_|         
 
 
 
]]-- 
 
-------------------------------------------------------------------------------------------------- 
 
	mIntroShakes_group = {  
  
 
		shakespeare_npc = {  
			name = "shakespeare_npc", 
 
			npcs = { "shakespeare<001>" },  
			shakes = "shakespeare<001>", 
 
		}, 
 
 
 
		--ENEMY GROUPS 
 
		--WAVE ONE 
 
		entrance_demons = {  
			name = "entrance_group", 
 
			members = {	"entrance<001>", "entrance<002>", "entrance<003>" },  
			destination = "entrance_nav", 
 
		}, 
 
 
 
		sniper_01 = {  
			name = "sniper_01_group", 
 
			members = {	"sniper<001>" },  
		}, 
 
 
 
		imps_01 = {  
			name = "imp_01_group", 
 
			members = {	"imp_01<001>", "imp_01<002>", "imp_01<003>", "imp_01<004>", "imp_01<005>", "imp_01<006>", "imp_01<007>", "imp_01<008>" },  
		}, 
 
		 
 
		--WAVE TWO 
 
		bar_demons = {  
			name = "w2_bar_group", 
 
			members = {	"w2_bar_grunts<001>", "w2_bar_grunts<002>" },  
			destination = "bar_group_nav", 
 
		}, 
 
 
 
		winged_01 = {  
			name = "w2_winged_group", 
 
			members = {	"w2_winged<001>" },  
		}, 
 
 
 
		inciters_01 = {  
			name = "Inciter_group_01", 
 
			members = {	"inciter_01<001>" },  
		}, 
 
 
 
		SAM_Grunt = {  
			name = "sam_grunt_01", 
 
			sam =  "sam_grunt<001>", 
 
		}, 
 
 
 
		--WAVE THREE 
 
		bar_demons_02 = {  
			name = "w3_bar_group", 
 
			members = {	"w3_bar_grunts<001>", "w3_bar_grunts<002>", "w3_bar_grunts<003>", "w3_bar_grunts<004>" },  
			destination = "bar_group_02_nav", 
 
		}, 
 
 
 
		balcony_demons = {  
			name = "balcony_group_01", 
 
			members = {	"balcony_grunts<001>", "balcony_grunts<002>"},  
			destination = "balcony_nav_01", 
 
		}, 
 
 
 
		imps_02 = {  
			name = "imp_02_group", 
 
			members = {	"imp_02<001>", "imp_02<002>", "imp_02<003>", "imp_02<004>", "imp_02<005>", "imp_02<006>", "imp_02<007>", "imp_02<008>", "imp_02<009>", "imp_02<010>" },  
		}, 
 
 
 
		sniper_02 = {  
			name = "sniper_02_group", 
 
			members = {	"sniper<002>" },  
		}, 
 
 
 
		--WAVE FOUR 
 
		inciters_02 = {  
			name = "Inciter_group_02", 
 
			members = {	"inciter_02<001>" },  
		}, 
 
 
 
		winged_02 = {  
			name = "w4_winged_group", 
 
			members = {	"w4_winged<001>", "w4_winged<002>" },  
		}, 
 
 
 
		vip_demons = {  
			name = "vip_group", 
 
			members = {	"vip_grunt<001>"},  
			destination = "vip_nav", 
 
		}, 
 
 
 
		sniper_03 = {  
			name = "sniper_03_group", 
 
			members = {	"sniper<003>" },  
		}, 
 
 
 
		--WAVE FIVE 
 
		bosses = {  
			name = "boss_group", 
 
			members = {	"boss<001>", "boss<002>" },  
		}, 
 
 
 
	} 
 
 
 
-------------------------------------------------------------------------------------------------- 
 
--[[ 
 
 
 
  _   _                         _       _        
 
 | \ | |                       (_)     | |       
 
 |  \| | __ ___   ___ __   ___  _ _ __ | |_ ___  
 
 | . ` |/ _` \ \ / / '_ \ / _ \| | '_ \| __/ __| 
 
 | |\  | (_| |\ V /| |_) | (_) | | | | | |_\__ \ 
 
 |_| \_|\__,_| \_/ | .__/ \___/|_|_| |_|\__|___/ 
 
				   | |                           
 
				   |_|                           
 
 
 
]]-- 
 
--------------------------------------------------------------------------------------------------	 
 
 
 
	mIntroShakes_navpoints = {  
 
 
		shadow_nav_1 = { "sniper_leash<001>", "sniper_leash<002>", "sniper_leash<003>", "sniper_leash<003>" },  
		shadow_nav_2 = { "sniper_leash_02<001>", "sniper_leash_02<002>", "sniper_leash_02<003>", "sniper_leash_02<004>" },	  
		shadow_nav_3 = { "sniper_leash_03<001>", "sniper_leash_03<002>", "sniper_leash_03<003>", "sniper_leash_03<004>" },	  
					 
 
	} 
 
-------------------------------------------------------------------------------------------------- 
 
--[[ 
 
 
 
  _______ _                        _      
 
 |__   __| |                      | |     
 
	| |  | |__  _ __ ___  __ _  __| |___  
 
	| |  | '_ \| '__/ _ \/ _` |/ _` / __| 
 
	| |  | | | | | |  __/ (_| | (_| \__ \ 
 
	|_|  |_| |_|_|  \___|\__,_|\__,_|___/ 
 
										  
 
										  
 
]]-- 
 
-------------------------------------------------------------------------------------------------- 
 
	mIntroShakes_thread = {  
 
 
	} 
 
 
 
-------------------------------------------------------------------------------------------------- 
 
--[[ 
 
				 _             _   _           _        _____        _         
 
	 /\         (_)           | \ | |         | |      |  __ \      | |        
 
	/  \   _ __  _ _ __ ___   |  \| | ___   __| | ___  | |  | | __ _| |_ __ _  
 
   / /\ \ | '_ \| | '_ ` _ \  | . ` |/ _ \ / _` |/ _ \ | |  | |/ _` | __/ _` | 
 
  / ____ \| | | | | | | | | | | |\  | (_) | (_| |  __/ | |__| | (_| | || (_| | 
 
 /_/    \_\_| |_|_|_| |_| |_| |_| \_|\___/ \__,_|\___| |_____/ \__,_|\__\__,_| 
 
																			   
 
]]-- 
 
--------------------------------------------------------------------------------------------------      
 
 
 
	mIntroShakes_anim_node = {  
 
 
	}	                                                                   
 
 
 
-------------------------------------------------------------------------------------------------- 
 
--[[ 
 
 
 
   _____ _               _                _       _        
 
  / ____| |             | |              (_)     | |       
 
 | |    | |__   ___  ___| | ___ __   ___  _ _ __ | |_ ___  
 
 | |    | '_ \ / _ \/ __| |/ / '_ \ / _ \| | '_ \| __/ __| 
 
 | |____| | | |  __/ (__|   <| |_) | (_) | | | | | |_\__ \ 
 
  \_____|_| |_|\___|\___|_|\_\ .__/ \___/|_|_| |_|\__|___/ 
 
							 | |                           
 
							 |_|                           
 
 
 
]]-- 
 
-------------------------------------------------------------------------------------------------- 
 
	mIntroShakes_checkpoint = {  
		{  
			name = MISSION_START_CHECKPOINT,					-- First Checkpoint Shakespeare SAM(sam) 
 
			init = "mIntroShakes_sam_init", 
 
			run = "mIntroShakes_sam_run", 
 
			cleanup = "mIntroShakes_sam_cleanup", 
 
			next_checkpoint = "Shakespeare_Dance_Battle", 
 
			host_start = "player_start_host", 
 
			client_start = "player_start_client", 
 
			p1_car_nav = "", 
 
			p2_car_nav = "", 
 
			start_groups = {  },  
			cp_only_groups = {},  
		}, 
 
 
 
		{  
			name = "Shakespeare_Dance_Battle",					-- First Checkpoint Shakespeare Dance Battle(sdb) 
 
			init = "mIntroShakes_sdb_init", 
 
			run = "mIntroShakes_sdb_run", 
 
			cleanup = "mIntroShakes_sdb_cleanup", 
 
			next_checkpoint = "nil", 
 
			host_start = "player_start_host", 
 
			client_start = "player_start_client", 
 
			p1_car_nav = "", 
 
			p2_car_nav = "", 
 
			start_groups = {  },  
			cp_only_groups = {},  
		}, 
 
	} 
 
	 
 
-------------------------------------------------------------------------------------------------- 
 
--[[ 
 
 
 
   _____      _                                 
 
  / ____|    | |                                
 
 | |    _   _| |_ ___  ___ ___ _ __   ___  ___  
 
 | |   | | | | __/ __|/ __/ _ \ '_ \ / _ \/ __| 
 
 | |___| |_| | |_\__ \ (_|  __/ | | |  __/\__ \ 
 
  \_____\__,_|\__|___/\___\___|_| |_|\___||___/ 
 
											    
 
											    
 
]]-- 
 
-------------------------------------------------------------------------------------------------- 
 
	mIntroShakes_scene = {  
		intro = "", 
 
		outro = "Bink_Shakespeare_Confronted" 
 
	} 
 
 
 
-------------------------------------------------------------------------------------------------- 
 
--[[ 
 
 
 
   _____                                    _   _                  
 
  / ____|                                  | | (_)                 
 
 | |     ___  _ ____   _____ _ __ ___  __ _| |_ _  ___  _ __  ___  
 
 | |    / _ \| '_ \ \ / / _ \ '__/ __|/ _` | __| |/ _ \| '_ \/ __| 
 
 | |___| (_) | | | \ V /  __/ |  \__ \ (_| | |_| | (_) | | | \__ \ 
 
  \_____\___/|_| |_|\_/ \___|_|  |___/\__,_|\__|_|\___/|_| |_|___/ 
 
																   
 
																   
 
]]-- 
 
-------------------------------------------------------------------------------------------------- 
 
 
 
	mIntroShakes_persona = {   
		Johnny = {  
			persona_name = "Johnny_Gat", 
 
			persona_id = INVALID_PERSONA_HANDLE 
 
		}, 
 
		Kinzie = {  
			persona_name = "Kinzie", 
 
			persona_id = INVALID_PERSONA_HANDLE 
 
		}, 
 
		Shakespeare = {  
			persona_name = "Shakespeare", 
 
			persona_id = INVALID_PERSONA_HANDLE 
 
		}, 
 
 
 
	} 
 
 
 
	mIntroShakes_convo = {  
		--[[ = { 
 
			name = "file_name without voice (_bm, _wm, _bf...", 
 
			player_talks = true or false, 
 
			handle = INVALID_CONVERSATION_HANDLE, 
 
			convo_thread = INVALID_THREAD_HANDLE, 
 
			max_wait_seconds = 60,	-- if the conversation doesn't complete before this time, kill it 
 
			timer_thread = INVALID_THREAD_HANDLE, 
 
			priority = CONVO_PRIORITY_HIGH or CONVO_PRIORITY_NORMAL or CONVO_PRIORITY_OPTIONAL 
 
			(optional) persona_line = true,	-- this is a single line 
 
			(required if persona_line) speaker_name = "name of speaker",	-- single line speaker (might be set before call to play is made?) 
 
			(optional)phone_call = true,  -- this is a phone conversation (phone persona must be preloaded) 
 
			(required if phone_call) receiving_call = true or false  -- auto-answer is always true in missions (until proven otherwise) 
 
			 
 
		},]] 
 
		 
 
		shake_comment_01 = {  
			name = "mission_intro_ss_battle_comment_01", 
 
			player_talks = false, 
 
			handle = INVALID_CONVERSATION_HANDLE, 
 
			convo_thread = INVALID_THREAD_HANDLE, 
 
			max_wait_seconds = 10,	-- if the conversation doesn't complete before this time, kill it 
 
			timer_thread = INVALID_THREAD_HANDLE, 
 
			priority = CONVO_PRIORITY_NORMAL, 
 
			persona_line = true, 
 
			speaker_name = mIntroShakes_group.shakespeare_npc.shakes, 
 
		},	 
 
 
 
		shake_comment_02 = {  
			name = "mission_intro_ss_battle_comment_02", 
 
			player_talks = false, 
 
			handle = INVALID_CONVERSATION_HANDLE, 
 
			convo_thread = INVALID_THREAD_HANDLE, 
 
			max_wait_seconds = 10,	-- if the conversation doesn't complete before this time, kill it 
 
			timer_thread = INVALID_THREAD_HANDLE, 
 
			priority = CONVO_PRIORITY_NORMAL, 
 
			persona_line = true, 
 
			speaker_name = mIntroShakes_group.shakespeare_npc.shakes, 
 
		},	 
 
 
 
		shake_more_guys = {  
			name = "mission_intro_ss_more_enemies", 
 
			player_talks = false, 
 
			handle = INVALID_CONVERSATION_HANDLE, 
 
			convo_thread = INVALID_THREAD_HANDLE, 
 
			max_wait_seconds = 10,	-- if the conversation doesn't complete before this time, kill it 
 
			timer_thread = INVALID_THREAD_HANDLE, 
 
			priority = CONVO_PRIORITY_NORMAL, 
 
			persona_line = true, 
 
			speaker_name = mIntroShakes_group.shakespeare_npc.shakes, 
 
		},	 
 
 
 
		shake_challenge = {  
			name = "mission_intro_ss_challenge", 
 
			player_talks = false, 
 
			handle = INVALID_CONVERSATION_HANDLE, 
 
			convo_thread = INVALID_THREAD_HANDLE, 
 
			max_wait_seconds = 10,	-- if the conversation doesn't complete before this time, kill it 
 
			timer_thread = INVALID_THREAD_HANDLE, 
 
			priority = CONVO_PRIORITY_NORMAL, 
 
			persona_line = true, 
 
			speaker_name = mIntroShakes_group.shakespeare_npc.shakes, 
 
		},	 
 
 
 
		shake_battle_end = {  
			name = "mission_intro_ss_battle_end", 
 
			player_talks = false, 
 
			handle = INVALID_CONVERSATION_HANDLE, 
 
			convo_thread = INVALID_THREAD_HANDLE, 
 
			max_wait_seconds = 10,	-- if the conversation doesn't complete before this time, kill it 
 
			timer_thread = INVALID_THREAD_HANDLE, 
 
			priority = CONVO_PRIORITY_NORMAL, 
 
			persona_line = true, 
 
			speaker_name = mIntroShakes_group.shakespeare_npc.shakes, 
 
		},	 
 
 
 
		shake_grant_power = {  
			name = "Grant_Power", 
 
			player_talks = false, 
 
			handle = INVALID_CONVERSATION_HANDLE, 
 
			convo_thread = INVALID_THREAD_HANDLE, 
 
			max_wait_seconds = 10,	-- if the conversation doesn't complete before this time, kill it 
 
			timer_thread = INVALID_THREAD_HANDLE, 
 
			priority = CONVO_PRIORITY_NORMAL, 
 
			persona_line = true, 
 
			speaker_name = mIntroShakes_group.shakespeare_npc.shakes, 
 
		},	 
 
 
 
	} 
 
	 
 
	mIntroShakes_convo_queue = {  
		--[[start_drive_queue = {   
			{ delay = 2.0, convo = mIntroShakes_convo.goto_first_checkpoint_nav },  
			{ delay = 4.0, convo = mIntroShakes_convo.goto_first_checkpoint_nav2 },  
			{ delay = 3.0, convo = mIntroShakes_convo.goto_first_checkpoint_nav3 },  
			{ delay = 5.0, convo = mIntroShakes_convo.goto_first_checkpoint_nav4 }  
		}, 
 
		]]-- 
 
	} 
 
	 
 
-------------------------------------------------------------------------------------------------- 
 
--[[ 
 
 
 
  _______   _                            
 
 |__   __| (_)                           
 
	| |_ __ _  __ _  __ _  ___ _ __ ___  
 
	| | '__| |/ _` |/ _` |/ _ \ '__/ __| 
 
	| | |  | | (_| | (_| |  __/ |  \__ \ 
 
	|_|_|  |_|\__, |\__, |\___|_|  |___/ 
 
			   __/ | __/ |               
 
			  |___/ |___/                
 
 
 
]]-- 
 
-------------------------------------------------------------------------------------------------- 
 
	mIntroShakes_trigger = {  
		-- = { 
 
		--	name = "_trigger", 
 
		--	hit = false, 
 
		-- 	last_hit_by = nil, -- 	last_hit_human = nil (set to the last human to enter the trigger in the default trigger callback) 
 
		--  (optional)callback = "mIntroShakes_function_name_cb" 
 
		--	(optional)marker = TRIGGER_LOCATION or TRIGGER_USE or custom or don't include for no marker 
 
		--  (optional)waypoint = true, 
 
		--  (optional)teleport_to = {  
		--						host = "host_nav", 
 
		--						client = "client_nav"  
 
		--					},		 
 
		--	(optional)conversation = mIntroShakes_convo.convo_name  -- play a conversation 
 
		--	(optional)next_trigger = "next_trigger_name" sets up next trigger when triggered (breadcrumbs) 
 
		--}, 
 
		 
 
 
 
	} 
 
	 
 
-------------------------------------------------------------------------------------------------- 
 
																	  --[[ INTERROGATION DATA ]]-- 
 
-------------------------------------------------------------------------------------------------- 
 
	--mIntroShakes_interrogate = {  
	--	leader = {  
	--		target = mIntroShakes_group.friendly_fire.owner, 
 
	--		persona = "Interrogation", 
 
	--		objective = "mIntroShakes_INTERROGATE_OWNER", 
 
	--	--	(optional)conversation = mIntroShakes_convo.convo_name  -- play a conversation while interrogating 
 
	--	}, 
 
	--} 
 
		 
 
-------------------------------------------------------------------------------------------------- 
 
--[[ 
 
 
 
   ____  _   _                
 
  / __ \| | | |               
 
 | |  | | |_| |__   ___ _ __  
 
 | |  | | __| '_ \ / _ \ '__| 
 
 | |__| | |_| | | |  __/ |    
 
  \____/ \__|_| |_|\___|_|    
 
							  
 
							  
 
]]-- 
 
-------------------------------------------------------------------------------------------------- 
 
 
 
	mIntroShakes_homie = {  
 
 
	} 
 
	 
 
	mIntroShakes_tweakables = {  
 
 
	} 
 
 
 
 
 
 
 
	mIntroShakes_runtime = {  
		inciter_intro_sam_complete = false, 
 
		shakespeare_sam_complete = false, 
 
	} 
 
 
 
	mIntroShakes_VFX = 
 
	{  
		power_up = { name = "vfx_Altars_PowerUp", handle = "" },  
	} 
 
 
 
-------------------------------------------------------------------------------------------------- 
 
																				--[[ MOVERS ]]-- 
 
--------------------------------------------------------------------------------------------------\ 
 
 
 
mIntroShakes_movers = {  
 
 
	door_01 = {  
		mover = "door<001>", 
 
	}, 
 
 
 
	door_02 = {  
		mover = "door<002>", 
 
	}, 
 
 
 
} 
 
 
 
-------------------------------------------------------------------------------------------------- 
 
--[[ 
 
 
 
   _____ _                  _               _   ______                _   _                  
 
  / ____| |                | |             | | |  ____|              | | (_)                 
 
 | (___ | |_ __ _ _ __   __| | __ _ _ __ __| | | |__ _   _ _ __   ___| |_ _  ___  _ __  ___  
 
  \___ \| __/ _` | '_ \ / _` |/ _` | '__/ _` | |  __| | | | '_ \ / __| __| |/ _ \| '_ \/ __| 
 
  ____) | || (_| | | | | (_| | (_| | | | (_| | | |  | |_| | | | | (__| |_| | (_) | | | \__ \ 
 
 |_____/ \__\__,_|_| |_|\__,_|\__,_|_|  \__,_| |_|   \__,_|_| |_|\___|\__|_|\___/|_| |_|___/ 
 
																							 
 
																							 
 
]]-- 
 
 
 
-- This is the primary entry point for the mission, and is responsible for starting up the mission 
 
-- at the specified checkpoint. 
 
-- CALLED FROM CODE 
 
-- 
 
-- start_checkpoint_name:	(string) The checkpoint the mission should begin at 
 
-- is_restart:					(bool) TRUE if the mission is restarting, FALSE otherwise 
 
-- 
 
function mIntroShakes_start(start_checkpoint_name, is_restart) 
 
 
 
 
 
	mission_start_fade_out(0.0) 
 
 
 
	set_ped_override_density(.1) 
 
	set_traffic_density(.1) 
 
	parking_spot_disable_all(true) 
 
	-- initialize systems 
 
	mission_startup(mIntroShakes_trigger, mIntroShakes_convo) -- mIntroShakes_checkpoint 
 
	 
 
	-- HVS_BDF: we don't necessarily want to call load_persona() because this creates a 2D 
 
	-- version, which can prevent actual in-game characters from lip syncing their VO if 
 
	-- the 2D persona was loaded prior to their character being spawned. 
 
	-- In the case of PC characters, they are present in the world  
 
	-- and their characters should lip sync their VO. 
 
	--load_persona(mIntro_persona.Johnny) 
 
	--load_persona(mIntro_persona.Kinzie) 
 
	 
 
	local start_cp = get_table_by_name(mIntroShakes_checkpoint, MISSION_START_CHECKPOINT) 
 
 
 
	-- TEMPORARY: give player approximate loadout of weapons & superpowers 
 
	-- TODO: remove this before the game ships!!! 
 
	--hvUnlockLoadout("mIntroShakes")  
 
 
	-- Check if this mission starting from the beginning 
 
	if (start_checkpoint_name == start_cp.name) then 
 
		if (is_restart == false and mIntroShakes_scene.intro ~= "") then 
 
			-- First time playing mission 
 
			local fade_in_after = false 
 
			cutscene_play(mIntroShakes_scene.intro, nil, {start_cp.host_start, start_cp.client_start}, fade_in_after)  
		else 
 
			teleport_coop(start_cp.host_start, start_cp.client_start, true, false, false)--HVS_RCK - Adding false for stick_to_ground. Fixes being stuck in floor on client 
 
		end 
 
		fade_out(0) 
 
	end 
 
 
 
	-- Handle mission initialization for the current checkpoint 
 
	mIntroShakes_initialize(start_checkpoint_name) 
 
 
 
	-- Run the mission from the current checkpoint 
 
	checkpoint_run_mission(mIntroShakes_checkpoint, start_checkpoint_name) 
 
	 
 
	mission_end_success("mIntroShakes") --, mIntroShakes_scene.outro, {"player_start_host", "player_start_client"})  
end 
 
 
 
-- This is the primary function responsible for cleaning up the entire mission 
 
-- CALLED FROM CODE (+++MUST RETURN IMMEDIATELY+++) 
 
-- 
 
function mIntroShakes_cleanup() 
 
	--[[ INSERT ANY MISSION SPECIFIC CLEAN-UP ]]-- 
 
 
 
	set_ped_override_density(-1) 
 
	set_traffic_density(1) 
 
	parking_spot_disable_all(false) 
 
	-- cleanup all threads 
 
	cleanup_threads(mIntroShakes_thread) 
 
	 
 
	-- run checkpoint cleanups (move into mission_shutdown?) 
 
	checkpoint_cleanup_mission(mIntroShakes_checkpoint) 
 
	 
 
	-- cleanup triggers, convos, kill_list and interrogations 
 
	mission_shutdown() 
 
	 
 
	-- cleanup all groups 
 
	cleanup_groups(mIntroShakes_group) 
 
 
 
	notoriety_set_min_and_max("police", 0, MAX_NOTORIETY_LEVEL)  
	notoriety_reset("police")  
	notoriety_set_can_decay(true) 
 
	spawning_allow_cop_ambient_spawns(true) 
 
	roadblocks_enable(true) 
 
 
 
    on_seamless_animated_moment_end("")  
    seamless_animated_moment_cleanup() 
 
 
 
	if not mission_is_failed() then 
 
		player_unlock_super_power( 1) 
 
		if coop_is_active() then 
 
			player_unlock_super_power( 1 , REMOTE_PLAYER) 
 
		end 
 
	end 
 
 
 
	door_lock( mIntroShakes_movers.door_01.mover, false ) 
 
	door_lock( mIntroShakes_movers.door_02.mover, false ) 
 
 
 
	spawning_vehicles(true)  
 
 
 
end 
 
 
 
-- Called when the mission has ended with success 
 
-- CALLED FROM CODE (+++MUST RETURN IMMEDIATELY+++) 
 
-- 
 
function mIntroShakes_success() 
 
	--[[ INSERT ANY MISSION SPECIFIC SUCCESS STUFF ]]-- 
 
 
 
	player_super_power_select( "stomp", SYNC_ALL, "force" ) 
 
	 
 
end 
 
 
 
-------------------------------------------------------------------------------------------------- 
 
--[[ 
 
 
 
 
 
  _____       _ _   _       _ _           ______                _   _                  
 
 |_   _|     (_) | (_)     | (_)         |  ____|              | | (_)                 
 
   | |  _ __  _| |_ _  __ _| |_ _______  | |__ _   _ _ __   ___| |_ _  ___  _ __  ___  
 
   | | | '_ \| | __| |/ _` | | |_  / _ \ |  __| | | | '_ \ / __| __| |/ _ \| '_ \/ __| 
 
  _| |_| | | | | |_| | (_| | | |/ /  __/ | |  | |_| | | | | (__| |_| | (_) | | | \__ \ 
 
 |_____|_| |_|_|\__|_|\__,_|_|_/___\___| |_|   \__,_|_| |_|\___|\__|_|\___/|_| |_|___/ 
 
																					   
 
																					   
 
]]-- 
 
 
 
-- Initialize the mission for the specified checkpoint 
 
-- 
 
-- checkpoint_name:		(string) Checkpoint to initialize the mission to 
 
-- 
 
function mIntroShakes_initialize(checkpoint_name) 
 
	-- Common initialization 
 
	mIntroShakes_initialize_common() 
 
 
 
	 
 
	-- Checkpoint specific initialization 
 
	checkpoint_init(mIntroShakes_checkpoint, checkpoint_name) 
 
 
 
	-- Remove any present subtitles 
 
	message_remove_all() 
 
 
 
	-- Start fading in  
 
	mission_start_fade_in() 
 
end 
 
 
 
-- Handle any common initialization 
 
-- 
 
function mIntroShakes_initialize_common() 
 
	--[[ INSERT ANY COMMON INITIALIZATION CODE HERE ]]-- 
 
	notoriety_set_min_and_max("police", 0, 1)  
	 
 
	spawning_allow_cop_ambient_spawns(false) 
 
	roadblocks_enable(false) 
 
 
 
	door_lock( mIntroShakes_movers.door_01.mover, true ) 
 
	door_lock( mIntroShakes_movers.door_02.mover, true ) 
 
 
 
end 
 
 
 
-------------------------------------------------------------------------------------------------- 
 
--[[ 
 
 
 
 
 
   _____ _               _                _       _     ______                _   _                  
 
  / ____| |             | |              (_)     | |   |  ____|              | | (_)                 
 
 | |    | |__   ___  ___| | ___ __   ___  _ _ __ | |_  | |__ _   _ _ __   ___| |_ _  ___  _ __  ___  
 
 | |    | '_ \ / _ \/ __| |/ / '_ \ / _ \| | '_ \| __| |  __| | | | '_ \ / __| __| |/ _ \| '_ \/ __| 
 
 | |____| | | |  __/ (__|   <| |_) | (_) | | | | | |_  | |  | |_| | | | | (__| |_| | (_) | | | \__ \ 
 
  \_____|_| |_|\___|\___|_|\_\ .__/ \___/|_|_| |_|\__| |_|   \__,_|_| |_|\___|\__|_|\___/|_| |_|___/ 
 
							 | |                                                                     
 
							 |_|                                                                     
 
 
 
]]-- 
 
-------------------------------------------------------------------------------------------------- 
 
-------------------------------------------------------------------------------------------------- 
 
--[[ 
 
 
 
   _____ _           _                                         _____                         ____        _   _   _       
 
  / ____| |         | |                                       |  __ \                       |  _ \      | | | | | |      
 
 | (___ | |__   __ _| | _____  ___ _ __   ___  __ _ _ __ ___  | |  | | __ _ _ __   ___ ___  | |_) | __ _| |_| |_| | ___  
 
  \___ \| '_ \ / _` | |/ / _ \/ __| '_ \ / _ \/ _` | '__/ _ \ | |  | |/ _` | '_ \ / __/ _ \ |  _ < / _` | __| __| |/ _ \ 
 
  ____) | | | | (_| |   <  __/\__ \ |_) |  __/ (_| | | |  __/ | |__| | (_| | | | | (_|  __/ | |_) | (_| | |_| |_| |  __/ 
 
 |_____/|_| |_|\__,_|_|\_\___||___/ .__/ \___|\__,_|_|  \___| |_____/ \__,_|_| |_|\___\___| |____/ \__,_|\__|\__|_|\___| 
 
                                  | |                                                                                    
 
                                  |_|                                                                                    
 
       
 
]]-- 
 
-------------------------------------------------------------------------------------------------- 
 
 
 
-- Initialize this checkpoint. 
 
-- 
 
-- mission_start: (bool) Whether we're initializing from a mission (re)start or from 
 
--					a natural play-through. 
 
 
 
function mIntroShakes_sam_init(mission_start) 
 
 
 
	fade_out(0.0)	 
 
			 
 
	audio_object_post_event("Play_shakes")  
	audio_object_post_event("Play_MKing_Shakespeare_Intro")  
	audio_object_post_event("Play_Mission_Checkpoint_Icon_Stop")  
 
 
	group_create( mIntroShakes_group.shakespeare_npc.name, true ) 
 
	-- HVS_BDF: let's see if a brief delay is enough to improve the reliability of Shakespeare 
 
	-- being ready on the client for the SAM... 
 
	delay(0.01) 
 
	--Shakespeare SAM 
 
	local actor_list = { LOCAL_PLAYER, mIntroShakes_group.shakespeare_npc.shakes }  
	seamless_animated_moment_prep("SAM_shkspr_intro", actor_list)  
	on_seamless_animated_moment_end("SAM_shkspr_intro_complete")  
	seamless_animated_moment_start("SAM_shkspr_intro", actor_list)  
 
 
	fade_in(0.2) 
 
 
 
	--Wait until the SAM has completed 
 
    while(mIntroShakes_runtime.shakespeare_sam_complete == false) do 
 
         thread_yield() 
 
	end 
 
	 
 
	on_seamless_animated_moment_end("")  
 
 
end 
 
								 
 
-- The next objective 
 
-- 
 
function mIntroShakes_sam_run() 
 
 
 
	objective_text_clear(0) 
 
 
 
end 
 
 
 
-- Do any cleanup for this checkpoint. 
 
-- 
 
-- (+++THIS IS CALLED FROM MISSION CLEANUP, MUST RETURN IMMEDIATELY+++) 
 
-- 
 
-- mission_exit: (bool) Whether we're exiting the mission entirely, or just 
 
--					moving on to the next checkpoint. 
 
-- 
 
function mIntroShakes_sam_cleanup(mission_exit) 
 
 
 
	if mission_exit then 
 
		spawning_allow_cop_ambient_spawns(true) 
 
		roadblocks_enable(true)	 
 
	end 
 
 
 
end 
 
 
 
-- 
 
function mIntroShakes_sdb_init(mission_start) 
 
	 
 
	notoriety_set_min_and_max("police", 0, 0)  
	notoriety_set("police", 0)  
	spawning_allow_cop_ambient_spawns(false) 
 
 
 
	if mission_start then 
 
 
 
		group_create( mIntroShakes_group.shakespeare_npc.name, true ) 
 
 
 
	end 
 
 
 
end 
 
								 
 
-- The next objective 
 
-- 
 
function mIntroShakes_sdb_run() 
 
 
 
	spawning_vehicles(false)  
 
 
 
	set_ignore_ai_flag(mIntroShakes_group.shakespeare_npc.shakes, true) 
 
	set_animation_state(mIntroShakes_group.shakespeare_npc.npcs[1], "djvc djing") 
 
	character_set_animation_overrides(mIntroShakes_group.shakespeare_npc.npcs[1],"djvc djing") 
 
 
 
	--npc_leash_to_nav(mIntroShakes_group.shakespeare_npc.shakes, "shakes_anchor", 0.1, false) 
 
 
 
	turn_invulnerable(mIntroShakes_group.shakespeare_npc.npcs[1]) 
 
	character_allow_ragdoll(mIntroShakes_group.shakespeare_npc.npcs[1], false) 
 
	character_prevent_flinching(mIntroShakes_group.shakespeare_npc.npcs[1], true) 
 
	character_prevent_bumping(mIntroShakes_group.shakespeare_npc.npcs[1], true) 
 
 
 
	human_gravity_enable(mIntroShakes_group.shakespeare_npc.npcs[1], false) 
 
	character_collision_enable (mIntroShakes_group.shakespeare_npc.npcs[1], false) 
 
	character_enable_superpower_immunity(mIntroShakes_group.shakespeare_npc.npcs[1], true) 
 
	character_enable_supersprint_immunity(mIntroShakes_group.shakespeare_npc.npcs[1], true) 
 
 
 
	--HVS_BAS - horrible hack, but this dude needs to stay PUT! 
 
	local x = -576.85 
 
	local y = 65.74 
 
	local z = -862.57  
 
	set_human_pos(mIntroShakes_group.shakespeare_npc.npcs[1],x,y,z) 
 
	objective_text( 0, "", "GM_INTRO_KILL_DEMONS", "", SYNC_ALL, OI_ASSET_KILL ) 
 
 
 
	convo_start( mIntroShakes_convo.shake_comment_01 )	 
 
 
 
	--WAVE ONE 
 
	mIntroShakes_attack( mIntroShakes_group.entrance_demons ) 
 
 
 
	delay(.2) 
 
	set_human_pos(mIntroShakes_group.shakespeare_npc.npcs[1],x,y,z) 
 
	kill_list_wait_for_complete() 
 
 
 
	--sub-wave for sniper 
 
	group_create( mIntroShakes_group.sniper_01.name, true ) 
 
	kill_list_add( mIntroShakes_group.sniper_01.members, OI_ASSET_KILL ) 
 
	human_use_teleport_navpoints(mIntroShakes_group.sniper_01.members[1], true) 
 
 
 
	--use set navpoints for shadow demon 
 
	mIntroShakes_set_shadow_navs(mIntroShakes_navpoints.shadow_nav_1) 
 
	delay(.2) 
 
	set_human_pos(mIntroShakes_group.shakespeare_npc.npcs[1],x,y,z) 
 
 
 
	kill_list_wait_for_complete() 
 
 
 
	--WAVE TWO 
 
	convo_start( mIntroShakes_convo.shake_more_guys )	 
 
 
 
	--mIntroShakes_attack( mIntroShakes_group.vip_demons ) 
 
 
 
	group_create( mIntroShakes_group.winged_02.name, true ) 
 
	kill_list_add( mIntroShakes_group.winged_02.members, OI_ASSET_KILL ) 
 
 
 
	group_create( mIntroShakes_group.winged_01.name, true ) 
 
	kill_list_add( mIntroShakes_group.winged_01.members, OI_ASSET_KILL ) 
 
 
 
	kill_list_wait_for_complete() 
 
 
 
	--WAVE THREE 
 
	convo_start( mIntroShakes_convo.shake_comment_02 )	 
 
 
 
	--mIntroShakes_attack( mIntroShakes_group.bar_demons_02 ) 
 
 
 
 
 
	group_create( mIntroShakes_group.sniper_02.name, true ) 
 
 
 
	human_use_teleport_navpoints(mIntroShakes_group.sniper_02.members[1], true) 
 
 
 
	--use set navpoints for shadow demon 
 
	mIntroShakes_set_shadow_navs_02(mIntroShakes_navpoints.shadow_nav_2) 
 
 
 
	kill_list_add( mIntroShakes_group.sniper_02.members, OI_ASSET_KILL ) 
 
 
 
	--group_create( mIntroShakes_group.sniper_03.name, true ) 
 
 
 
	--human_use_teleport_navpoints(mIntroShakes_group.sniper_03.members[1], true) 
 
 
 
	--use set navpoints for shadow demon 
 
	--mIntroShakes_set_shadow_navs_03(mIntroShakes_navpoints.shadow_nav_3) 
 
 
 
	--kill_list_add( mIntroShakes_group.sniper_03.members, OI_ASSET_KILL ) 
 
	 
 
	kill_list_wait_for_complete() 
 
 
 
	--WAVE FOUR 
 
	--SAM DARK INCITER INTRO 
 
 
 
	group_destroy( mIntroShakes_group.imps_01 ) 
 
 
 
	--group_create( mIntroShakes_group.SAM_Grunt.name, true ) 
 
	--group_create( mIntroShakes_group.inciters_01.name, true ) 
 
	 
 
	-- HVS_JBG - creating and hiding the group 
 
	group_create_hidden( mIntroShakes_group.SAM_Grunt.name, true ) 
 
	group_create_hidden( mIntroShakes_group.inciters_01.name, true ) 
 
	turn_invulnerable( mIntroShakes_group.inciters_01.members[1] ) 
 
	 
 
	delay(0.01) 
 
	-- HVS_JBG - re-hide the group, in some cases the client was sending an un-hide packet back to the host... so we'll delay before re-hiding. 
 
	group_hide( mIntroShakes_group.SAM_Grunt.name ) 
 
	group_hide( mIntroShakes_group.inciters_01.name ) 
 
	turn_invulnerable( mIntroShakes_group.inciters_01.members[1] ) 
 
	 
 
	-- HVS_BDF: let's see if a brief delay is enough to improve the reliability of Inciter n' Co. 
 
	-- being ready on the client for the SAM... 
 
	--delay(0.01) 
 
	-- HVS_JBG - add a longer delay to ensure the client has had time to create the group 
 
	delay(3.0); 
 
	--dark_inciter_ultra_shield_disable(mIntroShakes_group.inciters_01.members[1], true) 
 
	--audio_object_post_event("Play_DarkInciter_IntroMusic")  
 
 
	-- HVS_JBG - make sure the group is shown again before starting the SAM. 
 
	group_show( mIntroShakes_group.SAM_Grunt.name ) 
 
	group_show( mIntroShakes_group.inciters_01.name ) 
 
	 
 
	local actor_list = { LOCAL_PLAYER, mIntroShakes_group.SAM_Grunt.sam, mIntroShakes_group.inciters_01.members[1]}  
	seamless_animated_moment_prep("sam_inciter_intro", actor_list)  
	on_seamless_animated_moment_end("sam_inciter_intro_complete")  
	seamless_animated_moment_start("sam_inciter_intro", actor_list)  
 
 
	delay(2.0) 
 
	--dark_inciter_ultra_shield_disable(mIntroShakes_group.inciters_01.members[1], false) 
 
 
 
	--Wait until the SAM has completed 
 
    while(mIntroShakes_runtime.inciter_intro_sam_complete == false) do 
 
         thread_yield() 
 
	end 
 
	human_gravity_enable(mIntroShakes_group.inciters_01.members[1], true) --HVS_RCK - Make sure he can be petrified and killed that way. 
 
	 
 
	on_seamless_animated_moment_end("")  
 
 
	convo_start( mIntroShakes_convo.shake_challenge ) 
 
 
 
	--mIntroShakes_attack( mIntroShakes_group.bar_demons ) 
 
 
 
	kill_list_add( mIntroShakes_group.inciters_01.members, OI_ASSET_KILL ) 
 
	dark_inciter_kill_summons_on_death(mIntroShakes_group.inciters_01.members[1], true) 
 
 
 
	mIntroShakes_attack( mIntroShakes_group.balcony_demons ) 
 
 
 
	kill_list_wait_for_complete() 
 
 
 
	--marker_remove( mIntroShakes_group.sniper_03.members ) 
 
	marker_remove( mIntroShakes_group.inciters_01.members ) 
 
	marker_remove( mIntroShakes_group.balcony_demons ) 
 
 
 
	objective_text_clear(0) 
 
	notoriety_set_min_and_max("police", 0, 0)  
	notoriety_set("police", 0)  
	spawning_allow_cop_ambient_spawns(false) 
 
 
 
	convo_start( mIntroShakes_convo.shake_battle_end ) 
 
	delay(18) 
 
 
 
	player_controls_disable(LOCAL_PLAYER) 
 
	if coop_is_active() then 
 
		player_controls_enable(REMOTE_PLAYER) 
 
	end 
 
	cutscene_play(mIntroShakes_scene.outro, nil, {"host_telenav", "client_telenav"}, true )  
 
 
	character_set_animation_overrides(mIntroShakes_group.shakespeare_npc.npcs[1],"") 
 
	clear_animation_state(mIntroShakes_group.shakespeare_npc.npcs[1]) 
 
 
 
	character_collision_enable (mIntroShakes_group.shakespeare_npc.npcs[1], true) 
 
	human_gravity_enable(mIntroShakes_group.shakespeare_npc.npcs[1], true) 
 
 
 
	npc_leash_remove( mIntroShakes_group.shakespeare_npc.shakes ) 
 
 
 
	teleport( mIntroShakes_group.shakespeare_npc.shakes, "shakes_nav") 
 
 
 
 
 
	if cutscene_check_exiting() then 
 
		thread_yield()		 
 
	end 
 
 
 
	convo_start( mIntroShakes_convo.shake_grant_power ) 
 
	 
 
 
 
	delay(6.0) 
 
		-- Have player(s) fully power up (non-blocking) 
 
	local anim_name = "altars_powerup" 
 
	local morph_name = anim_name 
 
	local force_play = false 
 
	local stand_still = true 
 
	local zero_movement = true 
 
	effect_play_on_human( mIntroShakes_VFX.power_up.name, LOCAL_PLAYER, "spine2" ) 
 
	action_play_non_blocking(LOCAL_PLAYER, anim_name, morph_name, force_play, stand_still, zero_movement, "host_telenav" ) 
 
	if coop_is_active() then 
 
		effect_play_on_human( mIntroShakes_VFX.power_up.name, REMOTE_PLAYER, "spine2"  ) 
 
		action_play_non_blocking(REMOTE_PLAYER, anim_name, morph_name, force_play, stand_still, zero_movement, "client_telenav" ) 
 
	end 
 
 
 
	-- Wait for player to react 
 
	delay(5) 
 
	fade_out(1) 
 
	fade_out_block() 
 
	force_spawn_contacts() 
 
	player_super_power_select( "stomp", SYNC_ALL, "force" ) 
 
 
 
	--WAVE FIVE 
 
	--group_create( mIntroShakes_group.bosses.name, true ) 
 
 
 
	--kill_list_add( mIntroShakes_group.bosses.members, OI_ASSET_KILL_FULL ) 
 
 
 
	--kill_list_wait_for_complete() 
 
 
 
end 
 
 
 
-- Do any cleanup for this checkpoint. 
 
-- 
 
-- (+++THIS IS CALLED FROM MISSION CLEANUP, MUST RETURN IMMEDIATELY+++) 
 
-- 
 
-- mission_exit: (bool) Whether we're exiting the mission entirely, or just 
 
--					moving on to the next checkpoint. 
 
-- 
 
function mIntroShakes_sdb_cleanup(mission_exit) 
 
 
 
	if mission_exit then 
 
		spawning_allow_cop_ambient_spawns(true) 
 
		roadblocks_enable(true)	 
 
		spawning_vehicles(true) 	 
 
	end 
 
 
 
end 
 
 
 
------------------------------------ 
 
-- 
 
-- Checkpoint helper functions 
 
-- 
 
------------------------------------ 
 
function mIntroShakes_set_shadow_navs(nav_group) 
 
	human_clear_teleport_navpoints(mIntroShakes_group.sniper_01.members[1]) 
 
	 
 
	for i, nav in pairs(nav_group) do 
 
		human_add_teleport_navpoint(mIntroShakes_group.sniper_01.members[1], nav) 
 
	end 
 
end 
 
 
 
function mIntroShakes_set_shadow_navs_02(nav_group) 
 
	human_clear_teleport_navpoints(mIntroShakes_group.sniper_02.members[1]) 
 
	 
 
	for i, nav in pairs(nav_group) do 
 
		human_add_teleport_navpoint(mIntroShakes_group.sniper_02.members[1], nav) 
 
	end 
 
end 
 
 
 
function mIntroShakes_set_shadow_navs_03(nav_group) 
 
	human_clear_teleport_navpoints(mIntroShakes_group.sniper_03.members[1]) 
 
	 
 
	for i, nav in pairs(nav_group) do 
 
		human_add_teleport_navpoint(mIntroShakes_group.sniper_03.members[1], nav) 
 
	end 
 
end 
 
------------------------------------ 
 
-- 
 
-- Checkpoint callback functions 
 
-- 
 
------------------------------------ 
 
function SAM_shkspr_intro_complete() 
 
	mIntroShakes_runtime.shakespeare_sam_complete = true 
 
end 
 
 
 
function sam_inciter_intro_complete() 
 
	mIntroShakes_runtime.inciter_intro_sam_complete = true 
 
	 
 
	turn_vulnerable( mIntroShakes_group.inciters_01.members[1] ) 
 
end 
 
 
 
------------------------------------ 
 
-- 
 
-- Checkpoint thread functions 
 
-- 
 
------------------------------------ 
 
 
 
-------------------------------------------------------------------------------------------------- 
 
--[[ 
 
 
 
   _____                                        ______                _   _                  
 
  / ____|                                      |  ____|              | | (_)                 
 
 | |     ___  _ __ ___  _ __ ___   ___  _ __   | |__ _   _ _ __   ___| |_ _  ___  _ __  ___  
 
 | |    / _ \| '_ ` _ \| '_ ` _ \ / _ \| '_ \  |  __| | | | '_ \ / __| __| |/ _ \| '_ \/ __| 
 
 | |___| (_) | | | | | | | | | | | (_) | | | | | |  | |_| | | | | (__| |_| | (_) | | | \__ \ 
 
  \_____\___/|_| |_| |_|_| |_| |_|\___/|_| |_| |_|   \__,_|_| |_|\___|\__|_|\___/|_| |_|___/ 
 
																							 
 
																							 
 
]]-- 
 
 
 
--Reinforcement spawn 
 
function mIntroShakes_attack(group) 
 
	local block = true 
 
	local should_run = true 
 
	local should_fire = false 
 
	group_create( group.name, true, block ) 
 
	for index, npc in pairs( group.members ) do 
 
		ai_do_scripted_move( npc, group.destination, should_run, should_fire ) 
 
	end 
 
	kill_list_add( group.members, OI_ASSET_KILL) 
 
end 
 
 
 
--Thread Killer 
 
function mIntroShakes_safe_thread_kill( thread ) 
 
	 
 
	if( thread ~= nil )	then 
 
		if( thread ~= INVALID_THREAD_HANDLE) then 
 
			thread_kill( thread ) 
 
			thread = INVALID_THREAD_HANDLE 
 
		end 
 
	end 
 
 
 
end 
 
 
 
-------------------------------------------------------------------------------------------------- 
 
--[[ 
 
 
 
   _____      _ _ _                _      ______                _   _                  
 
  / ____|    | | | |              | |    |  ____|              | | (_)                 
 
 | |     __ _| | | |__   __ _  ___| | __ | |__ _   _ _ __   ___| |_ _  ___  _ __  ___  
 
 | |    / _` | | | '_ \ / _` |/ __| |/ / |  __| | | | '_ \ / __| __| |/ _ \| '_ \/ __| 
 
 | |___| (_| | | | |_) | (_| | (__|   <  | |  | |_| | | | | (__| |_| | (_) | | | \__ \ 
 
  \_____\__,_|_|_|_.__/ \__,_|\___|_|\_\ |_|   \__,_|_| |_|\___|\__|_|\___/|_| |_|___/ 
 
																					   
 
																					   
 
]]-- 
 
 
 
-------------------------------------------------------------------------------------------------- 
 
--[[ 
 
 
 
  _______ _                        _   ______                _   _                  
 
 |__   __| |                      | | |  ____|              | | (_)                 
 
	| |  | |__  _ __ ___  __ _  __| | | |__ _   _ _ __   ___| |_ _  ___  _ __  ___  
 
	| |  | '_ \| '__/ _ \/ _` |/ _` | |  __| | | | '_ \ / __| __| |/ _ \| '_ \/ __| 
 
	| |  | | | | | |  __/ (_| | (_| | | |  | |_| | | | | (__| |_| | (_) | | | \__ \ 
 
	|_|  |_| |_|_|  \___|\__,_|\__,_| |_|   \__,_|_| |_|\___|\__|_|\___/|_| |_|___/ 
 
																				    
 
																				    
 
]]--