Divergent/mods/Banjajis Task Givers Demise/gamedata/scripts/task_objects_monkeypatch_ba...

119 lines
4.4 KiB
Plaintext
Raw Permalink Normal View History

2024-03-17 20:18:03 -04:00
-- Modified by Banjaji's Task givers demise
-- 2022.04.01
-- * Added a check for cancelled tasks so that tm_dynamic.ltx can have "condlist_[nr] = {condition_to_check} cancel"
-- to fail a quest with different outcome from ordinary task failure. In essence when condition is true then the task
-- can have on_fail or on_cancel functions run.
-------------------------------------------------------------------
-- Monkeypatches
-------------------------------------------------------------------
--' Checking the current execution of the quest
task_objects.CGeneralTask.check_task = function(self, tm)
-- original code in separate function for potential monkeypatching
local not_return = self:check_start(tm)
if not not_return then return end
-- Iterate over condlist
for k,v in pairs(self.condlist) do
local t = xr_logic.pick_section_from_condlist(db.actor, db.actor, v)
if (t) and (t == "complete" or t == "fail" or t == "reversed" or t == "cancel") then -- added cancel option
self.last_check_task = t
return
end
end
-- status functor
if (self.status_functor and task_status_functor[self.status_functor]) then
local t = task_status_functor[self.status_functor](self,self.id)
if (t) and (t == "complete" or t == "fail" or t == "reversed") then -- not sure if I should add cancel option, so far it works
self.last_check_task = t
end
end
end
--' Deactivation of the quest
task_objects.CGeneralTask.deactivate_task_original = task_objects.CGeneralTask.deactivate_task -- save vanilla function
task_objects.CGeneralTask.deactivate_task = function(self, tsk)
-- Banjaji: tm_dynamic.ltx can have "condlist_[nr] = condition_to_check cancel" to fail a quest with different outcome from ordinary task failure (on_fail vs on_cancel)
if self.last_check_task == "cancel" then
if (self.on_cancel) then
xr_logic.pick_section_from_condlist(db.actor, db.actor, self.on_cancel)
end
news_manager.send_task(db.actor, "fail", tsk) -- this just says that the task failed, no point in adding extra cancelled task text
end
self:deactivate_task_original(tsk) -- Run the vanilla code
end
-------------------------------------------------------------------
-- Normal functions
-------------------------------------------------------------------
-- Do what check_task function did originally. This is separate function just for potential monkeypatching
function task_objects.CGeneralTask:check_start(tm)
local tg = time_global()
if (self.check_time and self.last_check_task == nil and tg < self.check_time) then
return
end
if (not db.actor) then
return
end
self.t = self.t or db.actor and db.actor:get_task(self.id,true)
if (self.t == nil) then -- task is most likely in timeout
return
end
self.check_time = tg + math.random(500,1000) --+ (self.prior*10)
local task_updated = false
local t_tile = task_functor[self.title_functor](self.id, "title", self.title, self) -- comes from task_functor.script
if self.current_title ~= t_tile then
--printf("task [%s] updated due to title change from [%s] to [%s]", tostring(self.id), tostring(self.current_title), tostring(t_tile))
task_updated = true
self.current_title = t_tile
self.t:set_title(game.translate_string(t_tile))
end
local t_descr = task_functor[self.descr_functor](self.id, "descr", self.descr, self)
if self.current_descr ~= t_descr then
--printf("task [%s] updated due to description change from [%s] to [%s]", tostring(self.id), tostring(self.current_descr), tostring(t_descr))
task_updated = true
self.current_descr = t_descr
self.t:set_description(game.translate_string(t_descr))
end
local t_target = task_functor[self.target_functor](self.id, "target", self.target, self)
self:check_level(t_target)
--printf("%s map_location=%s id=%s target=%s",self.current_title,self.t:get_map_location(),self.t:get_map_object_id(),t_target)
if (self.current_target ~= t_target) then
task_updated = true
if (t_target == nil) then
self.t:remove_map_locations(false)
else
self.t:change_map_location(self.spot, t_target)
if(self.storyline) then
level.map_add_object_spot(t_target, "ui_storyline_task_blink", "")
else
level.map_add_object_spot(t_target, "ui_secondary_task_blink", "")
end
end
self.current_target = t_target
end
if task_updated and not(self.dont_send_update_news) then
news_manager.send_task(db.actor, "updated", self.t)
end
return true -- if code reaches this then don't return in check_task function
end