Divergent/mods/iTheon New Tasks/gamedata/scripts/tasks_dead_night.script

99 lines
2.5 KiB
Plaintext

-- Stage 0: Task has been set up - player needs to get to the Darkscape close to the coded position
-- Stage 1: Player needs to kill all of the mutants (showing tag only on one of them at a time
-- to make it harder to cheese through looking at the map)
-- Stage 2: Player can receive reward from the quest giver
local state = {}
local nta_utils = new_tasks_addon_tasks_utils
function save_state(mdata)
mdata.dead_night_task_data = state
end
function load_state(mdata)
if mdata.dead_night_task_data then
state = mdata.dead_night_task_data
end
end
task_status_functor.dead_night_task_status_functor = function(tsk,task_id)
if not (db.actor and tsk) then return end
local stage = tsk.stage
if (stage == 0) then
if
is_darkscape()
and db.actor:position():distance_to(vector():set(-226.5967,4.5275,-317.1637)) < 15
and nta_utils.is_dark_night()
then
spawn()
level.add_pp_effector ("fade_in.ppe", 200, false)
tsk.stage = 1
end
end
if (stage == 1) then
if not is_darkscape() then return 'fail' end
if all_dead() then
tsk.stage = 2
end
end
end
function spawn()
for _, spawn_config in pairs(dead_night_configs.spawn_configs) do
table.insert(state, nta_utils.spawn_helper(spawn_config, spawn_config.section_func()))
end
end
function all_dead()
local some_lives = false
for _, id in pairs(state) do
local obj = alife():object(id)
if obj then
if obj:alive() then
some_lives = true
end
end
end
return not some_lives
end
function is_darkscape()
return level.name() == "k01_darkscape"
end
task_functor.dead_night_task_target_functor = function(task_id,field,p,tsk)
if not (db.actor and tsk) then return nil end
local stage = tsk.stage
if (stage == 1 and is_darkscape()) then -- Darkscape check needed to avoid crash on task fail cleanup
local sim = alife()
for _, id in ipairs(state) do
local obj = sim:object(id)
if obj and obj:alive() then return id end
end
end
if (stage == 2) then
return tsk.task_giver_id
end
end
xr_effects.dead_night_cleanup = function()
local sim = alife()
for _, id in pairs(state) do
if sim:object(id) then
safe_release_manager.release({id = id})
end
end
state = {}
end
function on_game_start()
RegisterScriptCallback("save_state",save_state)
RegisterScriptCallback("load_state",load_state)
end