-- 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