------------------------------------ -- HELPERS ------------------------------------ ---------------------------------------------------------------------------------------------- -- Status Functors ---------------------------------------------------------------------------------------------- -- checks smart from pstor variable function check_smart_under_faction_control(tsk,task_id) if not (db.actor) then return end local smart_id = utils.load_var(db.actor,task_id.."_id") if not (smart_id) then return "fail" end local smrt = SIMBOARD.smarts[smart_id] if not (smrt) then return "fail" end local smart = smrt.smrt if not (smart) then return "fail" end --in case sim_avail is set true during the player's tsk if not(smart.sim_avail == nil or xr_logic.pick_section_from_condlist(actor, smart, smart.sim_avail) == "true") then return "fail" end local faction_list = alun_utils.parse_list(task_manager.task_ini,task_id,"status_functor_params") local tg = time_global() if (tsk.__check_smart_time and tg < tsk.__check_smart_time) then return end tsk.__check_smart_time = tg+3000 utils.save_var(db.actor,task_id.."_target_id",nil) if (smart.sim_avail == nil or xr_logic.pick_section_from_condlist(actor, smart, smart.sim_avail) == "true") then for id,squad in pairs(SIMBOARD.squads) do if (squad) and simulation_objects.is_on_the_same_level(squad, smart) then if not (squad.first_update) then return -- not all squads are loaded yet! end if not (squad:get_script_target()) and (squad.current_target_id and squad.current_target_id == smart.id and squad.current_action == 1) then for i=1,#faction_list do if (faction_list[i] == "monster" and is_squad_monster[squad.player_id]) or (squad.player_id == faction_list[i]) then utils.save_var(db.actor,task_id.."_target_id",squad.id) squad.stay_time = game.get_game_time() -- reset gametime so they don't leave squad.task_target_id = smart.id -- stay forever for task squad.force_online = true --printf("task_id = %s squad_id = %s",task_id,squad.id) return end end end end end end --if not (smart.online) then -- return "fail" --end --[[ local last_target_id = utils.load_var(db.actor,task_id.."_target_id") if (last_target_id and axr_task_manager.actor_tagged_squad_by_id[last_target_id] ~= true) then return "fail" end --]] if (smart.faction_controlled) then local a_to_f = { ["actor_stalker"] = "stalker", ["actor_bandit"] = "bandit", ["actor_ecolog"] = "ecolog", ["actor_dolg"] = "dolg", ["actor_freedom"] = "freedom", ["actor_monolith"] = "monolith", ["actor_army"] = "army", ["actor_killer"] = "killer", ["actor_csky"] = "csky" } smart.faction = a_to_f[character_community(db.actor)] or smart.faction end return "complete" end -- to check a specific smart given as a param function specific_check_smart_under_faction_control(tsk,task_id) if not (db.actor) then return end local p = alun_utils.parse_list(task_manager.task_ini,task_id,"status_functor_params") local smart = p[1] and SIMBOARD.smarts_by_names[p[1]] if not (smart) then return "fail" end local smrt = SIMBOARD.smarts[smart.id] if not (smrt) then return "fail" end --in case sim_avail is set true during the player's tsk if not(smart.sim_avail == nil or xr_logic.pick_section_from_condlist(actor, smart, smart.sim_avail) == "true") then return "fail" end local tg = time_global() if (tsk.__check_smart_time and tg < tsk.__check_smart_time) then return end tsk.__check_smart_time = tg+1500 utils.save_var(db.actor,task_id.."_target_id",nil) if (smart.sim_avail == nil or xr_logic.pick_section_from_condlist(actor, smart, smart.sim_avail) == "true") then for id,squad in pairs(SIMBOARD.squads) do if (squad) and simulation_objects.is_on_the_same_level(squad, smart) then if not (squad.first_update) then return -- not all squads are loaded yet! end if not (squad:get_script_target()) and (squad.current_target_id and squad.current_target_id == smart.id and squad.current_action == 1) then for i=2,#p do if (p[i] == "monster" and is_squad_monster[squad.player_id]) or (squad.player_id == p[i]) then utils.save_var(db.actor,task_id.."_target_id",squad.id) squad.stay_time = game.get_game_time() -- reset gametime so they don't leave squad.task_target_id = smart.id -- stay forever for task squad.force_online = true --printf("task_id = %s squad_id = %s",task_id,squad.id) return end end end end end end --if not (smart.online) then -- return "fail" --end --[[ local last_target_id = utils.load_var(db.actor,task_id.."_target_id") if (last_target_id and axr_task_manager.actor_tagged_squad_by_id[last_target_id] ~= true) then return "fail" end --]] if (smart.faction_controlled) then local a_to_f = { ["actor_stalker"] = "stalker", ["actor_bandit"] = "bandit", ["actor_ecolog"] = "ecolog", ["actor_dolg"] = "dolg", ["actor_freedom"] = "freedom", ["actor_monolith"] = "monolith", ["actor_army"] = "army", ["actor_killer"] = "killer", ["actor_csky"] = "csky" } smart.faction = a_to_f[character_community(db.actor)] or smart.faction end return "complete" end function check_smart_under_faction_control_staged(tsk,task_id) if not (db.actor) then return end if (tsk.stage == 1) then -- already completed return end local status = check_smart_under_faction_control(tsk,task_id) if (status == "fail") then return "fail" elseif (status == "complete" and tsk.stage == 0) then tsk.stage = 1 end end function check_specific_smart_under_faction_control_staged(tsk,task_id) if not (db.actor) then return end if (tsk.stage == 1) then -- already completed return end local status = specific_check_smart_under_faction_control(tsk,task_id) if (status == "fail") then return "fail" elseif (status == "complete" and tsk.stage == 0) then tsk.stage = 1 --printf("set %s on complete stage",task_id) end end function hostage_task(tsk,task_id) if not (db.actor) then return end local id = tonumber(utils.load_var(db.actor,task_id .. "_id")) local smart = id and alife_object(id) if (smart) then smart.locked = true end if (tsk.stage == 0) then if (db.actor:has_info("hostage_companion_task_1_hostage_rescued")) then tsk.stage = 1 end elseif (tsk.stage == 1) then if not (axr_task_manager.is_task_giver_valid(tsk) and db.actor:is_talking()) then -- is_talking necessary or crash local hud = get_hud() if (hud) then hud:HideActorMenu() end return "complete" -- complete task even though giver is dead/missing/deleted end end end function bounty_task(tsk,task_id) if not (axr_task_manager.is_task_giver_valid(tsk)) then return "fail" end if (tsk.stage == 0) then local id = axr_task_manager.bounties_by_id[task_id] if not (id) then return "fail" end local se_obj = id and alife_object(id) if not (se_obj) then return "fail" end if not (IsStalker(nil,se_obj:clsid())) then return "fail" end if not (se_obj:alive()) then tsk.stage = 1 end elseif (tsk.stage == 254) then return "fail" end end function actor_has_fetch_item(tsk,task_id) if not (db.actor) then return end --if not (axr_task_manager.is_task_giver_valid(tsk)) then -- return "fail" --end local section = db.actor and utils.load_var(db.actor,task_id.."_fetch") local item = section and db.actor:object(section) if (item ~= nil) then if (task_id == "esc_2_12_stalker_nimble_task_1" or task_id == "jup_b220_trapper_task_3" or task_id == "mil_smart_terrain_7_7_freedom_leader_stalker_task_5" or task_id == "bar_dolg_leader_task_1") then if (item:condition() >= 0.75) then tsk.stage = 1 else tsk.stage = 0 end elseif (task_id == "simulation_task_5" or task_id == "simulation_task_6" or task_id == "simulation_task_16" or task_id == "pri_monolith_monolith_trader_stalker_task_3") then if (item:condition() <= 0.25) then tsk.stage = 0 else tsk.stage = 1 end else local count = utils.load_var(db.actor,task_id.."_fetch_count") if (count and count > 1) then local cnt = 0 local function section_count(npc, item) if (item:section() == section) then cnt = cnt + 1 end end db.actor:iterate_inventory(section_count, nil) if (cnt >= count) then tsk.stage = 1 else tsk.stage = 0 end return end tsk.stage = 1 -- should never happen but in such case let player finish quest for free end else tsk.stage = 0 end end function check_if_enough_time_passed(tsk,task_id) if not (db.actor) then return end local p = alun_utils.parse_list(task_manager.task_ini,task_id,"status_functor_params") if not (p[1]) then printf("task_status_function not set up properly! check_if_killed_enough needs an extra param for squad story id! task_id=%s",task_id) return end local gt = utils.load_ctime(db.actor,task_id) if (gt == nil or game.get_game_time():diffSec(gt) >= tonumber(p[1])) then tsk.stage = 2 return end end function check_if_killed_enough(tsk,task_id) local p = alun_utils.parse_list(task_manager.task_ini,task_id,"status_functor_params") if not (p[1]) then printf("task_status_function not set up properly! check_if_killed_enough needs an extra param for squad story id! task_id=%s",task_id) return end local squad = get_story_squad(p[1]) if not (squad) then return end local id = squad:commander_id() local npc = db.storage[id] and db.storage[id].object if not (npc) then return end local total_kill_count, npc for k in self:squad_members() do local npc = db.storage[k.id] and db.storage[k.id].object if (npc) then total_kill_count = total_kill_count + (utils.load_var(npc,"s_kill_count") or 0) end end if (total_kill_count >= tonumber(p[2] or 5)) then return "complete" end end function check_if_looted_enough(tsk,task_id) local p = alun_utils.parse_list(task_manager.task_ini,task_id,"status_functor_params") if not (p[1]) then printf("task_status_function not set up properly! check_if_looted_enough needs an extra param for squad story id! task_id=%s",task_id) return end local squad = get_story_squad(p[1]) if not (squad) then return end local id = squad:commander_id() local npc = db.storage[id] and db.storage[id].object if not (npc) then return end local total_loot_count, npc for k in squad:squad_members() do local npc = db.storage[k.id] and db.storage[k.id].object if (npc) then total_loot_count = total_loot_count + (utils.load_var(npc,"s_loot_count") or 0) end end if (total_loot_count >= tonumber(p[2] or 5)) then return "complete" end end function task_type_ecolog_gathered_tissue_samples(tsk,task_id) if (db.actor and tsk.stage == 0) then local count = utils.load_var(db.actor,task_id.."_tissue_count",0) local need = utils.load_var(db.actor,task_id.."_tissue_need",0) if (count >= need) then tsk.stage = 1 else tsk.stage = 0 end end return end -------------------------------------------------------------- function kill_strelok(tsk,task_id) local squad = get_story_squad("legendary_strelok") if (squad) then for k in squad:squad_members() do local se_obj = alife_object(k.id) if (se_obj and not se_obj:alive()) then return "complete" end end end end