--[[
_____ _ _____ _ _
|_ _| | | / ____| | | |
_ __ ___ | | _ __ | |_ _ __ ___| (___ | |__ __ _| | _____ ___
| '_ ` _ \ | | | '_ \| __| '__/ _ \\___ \| '_ \ / _` | |/ / _ \/ __|
| | | | | |_| |_| | | | |_| | | (_) |___) | | | | (_| | < __/\__ \
|_| |_| |_|_____|_| |_|\__|_| \___/_____/|_| |_|\__,_|_|\_\___||___/
--]]
--[[
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
--------------------------------------------------------------------------------------------------
--[[
_____ _ _ _ _ ______ _ _
/ ____| | | | | | | | ____| | | (_)
| | __ _| | | |__ __ _ ___| | __ | |__ _ _ _ __ ___| |_ _ ___ _ __ ___
| | / _` | | | '_ \ / _` |/ __| |/ / | __| | | | '_ \ / __| __| |/ _ \| '_ \/ __|
| |___| (_| | | | |_) | (_| | (__| < | | | |_| | | | | (__| |_| | (_) | | | \__ \
\_____\__,_|_|_|_.__/ \__,_|\___|_|\_\ |_| \__,_|_| |_|\___|\__|_|\___/|_| |_|___/
]]--
--------------------------------------------------------------------------------------------------
--[[
_______ _ _ ______ _ _
|__ __| | | | | ____| | | (_)
| | | |__ _ __ ___ __ _ __| | | |__ _ _ _ __ ___| |_ _ ___ _ __ ___
| | | '_ \| '__/ _ \/ _` |/ _` | | __| | | | '_ \ / __| __| |/ _ \| '_ \/ __|
| | | | | | | | __/ (_| | (_| | | | | |_| | | | | (__| |_| | (_) | | | \__ \
|_| |_| |_|_| \___|\__,_|\__,_| |_| \__,_|_| |_|\___|\__|_|\___/|_| |_|___/
]]--