-- ============================================================ -- -- Script Functions for Task Dialogs (dialogs.script) -- CoC 1.4.22 - DoctorX Questlines 1.24 -- -- Modified by: DoctorX, av661194 -- Last revised: February 16, 2017 -- -- ============================================================ local goodwill_trust_limit = 200 function can_do_task_mysteries_of_the_zone(a,b) -- Only give the story quests to factions in this table. local actor_comm = character_community(db.actor):sub(7) local story_factions = { ["csky"] = true, ["dolg"] = true, ["ecolog"] = true, ["freedom"] = true, ["killer"] = true, ["stalker"] = true, } if actor_comm and story_factions[actor_comm] and (not has_alife_info("story_mode_disabled")) then return true end return false end function give_task_mysteries_of_the_zone(a,b) task_manager.get_task_manager():give_task("mar_find_doctor_task") end function warfare_disabled(a,b) if _G.WARFARE then return false end return true end ------------------------------------------- -- Task stacking check ------------------------------------------- local mark_task_per_npc = {} function get_npc_task_limit() return tonumber(ui_options.get("gameplay/general/max_tasks") or 2) end function has_tasks_by_npc(a,b) local npc = who_is_npc(a, b) axr_task_manager.generate_ongoing_tasks(npc,nil) return axr_task_manager.ongoing_tasks[npc:id()] and (#axr_task_manager.ongoing_tasks[npc:id()] >= get_npc_task_limit()) or false end function not_has_tasks_by_npc(a,b) return (not has_tasks_by_npc(a,b)) end function confirm_task_stack(a,b) local npc = who_is_npc(a, b) mark_task_per_npc[npc:id()] = true end function clear_task_stack(a,b) local npc = who_is_npc(a, b) mark_task_per_npc[npc:id()] = nil end function check_task_stack(a,b) local npc = who_is_npc(a, b) if not_has_tasks_by_npc(a,b) then mark_task_per_npc[npc:id()] = nil end return (mark_task_per_npc[npc:id()] ~= true) end -- Global var to store last available task id: last_task_id = nil -- Determine if actor has npc task: function drx_sl_dont_has_npc_task( a, b ) local npc = who_is_npc(a, b) local se_obj = npc and alife( ):object( npc:id( ) ) local giver_id = se_obj and (se_obj.group_id ~= 65535 and se_obj.group_id or se_obj.id) if not ( giver_id ) then return false end if ( load_var( db.actor, ("drx_sl_task_giver_" .. giver_id), 0 ) > 0 ) then return false end return true end -- Determine if actor is same faction as npc (true faction): function drx_sl_actor_can_change_this_faction( a, b ) -- Get npc faction: local npc = who_is_npc( a, b ) local npc_faction = character_community( npc ) -- Special check for Traders if ( npc_faction == "trader" ) then local se_squad = get_object_squad(npc) npc_faction = se_squad and se_squad.player_id or npc_faction if ( npc_faction == "trader" ) then npc_faction = "stalker" end end -- Get player faction: local actor_faction = get_actor_true_community() -- Check if factions are same, or enemies (disguise case) if ( actor_faction == npc_faction ) or game_relations.is_factions_enemies( actor_faction , npc_faction ) then return false else return true end end -- Determine if actor has completed current storyline task: function drx_sl_actor_has_finished_task( a, b ) local npc = who_is_npc( a, b ) local tsk = axr_task_manager and axr_task_manager.drx_sl_get_finished_task( npc ) if ( tsk == nil ) then return false end return true end -- Determine if actor has completed change factions task: function drx_sl_actor_has_finished_cf_task( a, b ) local npc = who_is_npc( a, b ) local tsk = axr_task_manager and axr_task_manager.drx_sl_get_finished_cf_task( npc ) if ( tsk == nil ) then return false end return true end -- Determine if end game task has been reached or should be given: function drx_sl_is_endgame( a, b ) if ( (load_var( db.actor, "drx_sl_current_task_number", 1 ) >= load_var( db.actor, "drx_sl_total_task_number", 1 )) and (has_alife_info( "bar_deactivate_radar_done" )) ) then return true end return false end -- Determine if end game task has been reached or should be given: function drx_sl_is_not_endgame( a, b ) return not drx_sl_is_endgame( ) end -- Initiate storyline task: function drx_sl_text_honcho_has_storyline_task_to_give( a, b ) local npc = who_is_npc( a, b ) local task_section = axr_task_manager and axr_task_manager.drx_sl_generate_random_sl_task( npc ) last_task_id = task_section -- Tronex, fix for task with info if last_task_id then axr_task_manager.trigger_job_func(last_task_id) axr_task_manager.trigger_fetch_func(last_task_id) end return game.translate_string( task_section and axr_task_manager.get_task_job_description( task_section ) or "st_no_available_task" ) end -- Initiate mechanic task: function drx_sl_text_mechanic_has_ordered_task_to_give( a, b ) local npc = who_is_npc( a, b ) local task_section = axr_task_manager and axr_task_manager.drx_sl_get_mechanic_task( npc ) last_task_id = task_section -- Tronex, fix for task with info if last_task_id then axr_task_manager.trigger_job_func(last_task_id) axr_task_manager.trigger_fetch_func(last_task_id) end return game.translate_string( task_section and axr_task_manager.get_task_job_description( task_section ) or "st_no_available_task" ) end -- Initiate a change factions task: function drx_sl_text_npc_has_change_factions_task_to_give( a, b ) local npc = who_is_npc( a, b ) local task_section = axr_task_manager and axr_task_manager.drx_sl_generate_change_factions_task( npc ) last_task_id = task_section return game.translate_string( task_section and axr_task_manager.get_task_job_description( task_section ) or "st_no_available_task" ) end -- Fetch storyline task text: function drx_sl_text_fetch_task( a, b ) axr_task_manager.trigger_fetch_func( last_task_id ) local text = game.translate_string( last_task_id and axr_task_manager.get_fetch_task_description( last_task_id ) or "st_about_fetch_task_default" ) return string.format( text, _FETCH_TEXT or "" ) or "" end -- End of storyline task text: function drx_sl_text_task_finish( a, b ) local npc = who_is_npc( a, b ) local task_section = axr_task_manager and axr_task_manager.drx_sl_get_finished_task( npc ) return game.translate_string( task_section and axr_task_manager.get_task_complete_text( task_section ) or ("st_default_task_finished_" .. math.random( 1, 3 )) ) end -- End of change factions task text: function drx_sl_text_cf_task_finish( a, b ) local npc = who_is_npc( a, b ) local task_section = axr_task_manager and axr_task_manager.drx_sl_get_finished_cf_task( npc ) return game.translate_string( task_section and axr_task_manager.get_task_complete_text( task_section ) or ("st_default_task_finished_" .. math.random( 1, 3 )) ) end -- End of game text: function drx_sl_text_end_game( a, b ) local npc = who_is_npc( a, b ) local text_list = {} local i = 1 while ( true ) do local text_id = (load_var( db.actor, "drx_sl_start_task", "" ) .. "_endgame_" .. i) local end_game_text = game.translate_string( text_id ) if ( end_game_text and end_game_text ~= "" and end_game_text ~= ("_endgame_" .. i) and end_game_text ~= text_id ) then table.insert( text_list, end_game_text ) else break end i = (i + 1) end if ( #text_list < 1 ) then return game.translate_string( "drx_sl_default_endgame" ) end return text_list[math.random( 1, #text_list )] end -- Set current storyline task to complete: function drx_sl_set_finished_task_complete( a, b ) -- Set current task to complete: local npc = who_is_npc( a, b ) axr_task_manager.drx_sl_set_finished_task_complete( npc ) -- Give actor meet next honcho task: xr_effects.drx_sl_meet_random_honcho( ) end -- Set current storyline task to complete: function drx_sl_set_finished_task_complete_endgame( a, b ) -- Set current task to complete: local npc = who_is_npc( a, b ) axr_task_manager.drx_sl_set_finished_task_complete( npc ) -- Give actor end game task: xr_effects.drx_sl_find_wish_granter( ) end -- Set current change faction task to complete: function drx_sl_set_finished_cf_task_complete( a, b ) -- Set current task to complete: local npc = who_is_npc( a, b ) axr_task_manager.drx_sl_set_finished_cf_task_complete( npc ) end -- Determine whether or not a npc has an available task: function npc_has_ordered_task_to_give( a, b ) local npc = who_is_npc( a, b ) return last_task_id ~= nil or false end -- Text to display when a npc has a task to give: function text_npc_has_ordered_task_to_give( a, b ) local npc = who_is_npc( a, b ) local task_section = axr_task_manager and axr_task_manager.get_first_available_task( npc ) last_task_id = task_section return game.translate_string( task_section and axr_task_manager.get_task_job_description( task_section ) or "st_no_available_task" ) end -- Text to display when a npc has a simulation task to give: function text_sim_npc_has_ordered_task_to_give( a, b ) local npc = who_is_npc( a, b ) local task_section = axr_task_manager and axr_task_manager.get_first_available_task( npc, nil, true ) last_task_id = task_section return game.translate_string( task_section and axr_task_manager.get_task_job_description( task_section ) or "st_no_available_task" ) end -- Text to display when a task is finished: function text_task_finish( a, b ) local npc = who_is_npc( a, b ) local task_section = axr_task_manager and axr_task_manager.get_first_finished_task( npc ) return game.translate_string( task_section and axr_task_manager.get_task_complete_text( task_section ) or "st_default_task_finished_" .. math.random( 1, 3 ) ) end -- Text to display when a simulation task is finished: function text_sim_task_finish( a, b ) local npc = who_is_npc( a, b ) local task_section = axr_task_manager and axr_task_manager.get_first_finished_task( npc, true ) return game.translate_string( task_section and axr_task_manager.get_task_complete_text( task_section ) or "st_default_task_finished_" .. math.random( 1, 3 ) ) end -- Determine whether or not the task is a fetch task: function task_is_fetch_task( a, b ) local npc = who_is_npc( a, b ) local task_id = last_task_id --axr_task_manager.get_first_available_task(npc) if not ( task_id ) then return false end return axr_task_manager.get_fetch_task_description( task_id ) ~= nil end -- Determine whether or not the task is a fetch task: function not_task_is_fetch_task( a, b ) return not task_is_fetch_task( a, b ) end -- Clear skipped tasks: function npc_clear_skipped_tasks( a, b ) if ( axr_task_manager ) then axr_task_manager.clear_skipped_tasks( ) end end -- Determine if the actor has a PDA: function condition_actor_has_pda( a, b ) return db.actor:object( "itm_pda_common") or db.actor:object( "itm_pda_uncommon" ) or db.actor:object( "itm_pda_rare" ) or false end -- Check if actor has finished task: function actor_has_finished_ordered_task( a, b ) local npc = who_is_npc( a, b ) local tsk = axr_task_manager and axr_task_manager.get_first_finished_task( npc ) if ( tsk == nil ) then return false end return true end -- Check if actor has finished task: function actor_has_not_finished_ordered_task( a, b ) return not actor_has_finished_ordered_task( a, b ) end -- Check if actor has finished task: function actor_sim_has_finished_ordered_task( a, b ) local npc = who_is_npc( a, b ) return axr_task_manager and axr_task_manager.get_first_finished_task( npc, true ) ~= nil or false end -- Check if actor has finished task: function actor_sim_has_not_finished_ordered_task( a, b ) return not actor_sim_has_finished_ordered_task( a, b ) end -- Set current simulation task to complete: function npc_sim_set_finished_task_complete( a, b ) local npc = who_is_npc( a, b ) axr_task_manager.set_finished_task_complete( npc, true ) end -- Give player storyline task: function drx_sl_give_sl_task( a, b ) disable_info( ("drx_sl_meet_honcho_" .. load_var( db.actor, "drx_sl_current_honcho", "" )) ) local npc = who_is_npc( a, b ) local task_section = axr_task_manager and axr_task_manager.drx_sl_generate_random_sl_task( npc, nil, true ) while last_task_id and task_section ~= nil and task_section ~= last_task_id do task_section = axr_task_manager.drx_sl_generate_random_sl_task( npc, true, true ) end if ( last_task_id ) then printf( ("DRX SL storyline task started: " .. last_task_id) ) local se_obj = npc and alife( ):object( npc:id( ) ) local giver_id = se_obj and (se_obj.group_id ~= 65535 and se_obj.group_id or se_obj.id) save_var( db.actor, "drx_sl_current_task", last_task_id ) task_manager.get_task_manager( ):give_task( last_task_id, giver_id ) -- Register current task giver: if ( (not string.find( "meet_task", last_task_id )) and (not string.find( "find_wish_granter", last_task_id )) ) then local giver_task_count = (load_var( db.actor, ("drx_sl_task_giver_" .. giver_id), 0 ) + 1) save_var( db.actor, ("drx_sl_task_giver_" .. giver_id), giver_task_count ) printf( ("DRX SL: drx_sl_task_giver_" .. giver_id .. " registered (" .. giver_task_count .. " outstanding)") ) end last_task_id = nil end end -- Give player change factions task: function drx_sl_give_cf_task( a, b ) local npc = who_is_npc( a, b ) local task_section = axr_task_manager and axr_task_manager.drx_sl_generate_change_factions_task( npc, nil, true ) while last_task_id and task_section ~= nil and task_section ~= last_task_id do task_section = axr_task_manager.drx_sl_generate_change_factions_task( npc, true, true ) end if ( last_task_id ) then printf( ("DRX SL change factions task started: " .. last_task_id) ) local se_obj = npc and alife( ):object( npc:id( ) ) local giver_id = se_obj and (se_obj.group_id ~= 65535 and se_obj.group_id or se_obj.id) task_manager.get_task_manager( ):give_task( last_task_id, giver_id ) -- Register current task giver: local giver_task_count = (load_var( db.actor, ("drx_sl_task_giver_" .. giver_id), 0 ) + 1) save_var( db.actor, ("drx_sl_task_giver_" .. giver_id), giver_task_count ) printf( ("DRX SL: drx_sl_task_giver_" .. giver_id .. " registered (" .. giver_task_count .. " outstanding)") ) last_task_id = nil end end -- Give the player the current dynamic task: function drx_sl_give_mechanic_task( a, b ) local npc = who_is_npc( a, b ) local task_section = axr_task_manager and axr_task_manager.drx_sl_get_mechanic_task( npc, nil, true ) while last_task_id and task_section ~= nil and task_section ~= last_task_id do task_section = axr_task_manager.drx_sl_get_mechanic_task( npc, true, true ) end if ( last_task_id ) then printf( ("DRX SL mechanic task started: " .. last_task_id) ) local se_obj = npc and alife( ):object( npc:id( ) ) local giver_id = se_obj and (se_obj.group_id ~= 65535 and se_obj.group_id or se_obj.id) task_manager.get_task_manager( ):give_task( last_task_id, giver_id ) local giver_task_count = (load_var( db.actor, ("drx_sl_task_giver_" .. giver_id), 0 ) + 1) save_var( db.actor, ("drx_sl_task_giver_" .. giver_id), giver_task_count ) printf( ("DRX SL: drx_sl_task_giver_" .. giver_id .. " registered (" .. giver_task_count .. " outstanding)") ) last_task_id = nil end end -- Give the player the current dynamic task: function npc_give_last_task_id( a, b ) local npc = who_is_npc( a, b ) local task_section = axr_task_manager and axr_task_manager.get_first_available_task( npc, nil, true ) while last_task_id and task_section ~= nil and task_section ~= last_task_id do task_section = axr_task_manager.get_first_available_task( npc, true, true ) end if ( last_task_id ) then printf( ("DRX SL dynamic task started: " .. last_task_id) ) local se_obj = npc and alife( ):object( npc:id( ) ) local giver_id = se_obj and (se_obj.group_id ~= 65535 and se_obj.group_id or se_obj.id) task_manager.get_task_manager( ):give_task( last_task_id, giver_id ) local giver_task_count = (load_var( db.actor, ("drx_sl_task_giver_" .. giver_id), 0 ) + 1) save_var( db.actor, ("drx_sl_task_giver_" .. giver_id), giver_task_count ) printf( ("DRX SL: drx_sl_task_giver_" .. giver_id .. " registered (" .. giver_task_count .. " outstanding)") ) last_task_id = nil end end -- Give the player the current simulation task: function npc_sim_give_last_task_id( a, b ) local npc = who_is_npc( a, b ) local task_section = axr_task_manager and axr_task_manager.get_first_available_task( npc, nil, true ) while last_task_id and task_section ~= nil and task_section ~= last_task_id do task_section = axr_task_manager.get_first_available_task( npc, true, true ) end if ( last_task_id ) then -- Give player task: printf( ("DRX SL simulation task started: " .. last_task_id) ) local se_obj = npc and alife( ):object( npc:id( ) ) local giver_id = se_obj and (se_obj.group_id ~= 65535 and se_obj.group_id or se_obj.id) task_manager.get_task_manager( ):give_task( last_task_id, giver_id ) last_task_id = nil -- Register task giver: local giver_task_count = (load_var( db.actor, ("drx_sl_task_giver_" .. giver_id), 0 ) + 1) save_var( db.actor, ("drx_sl_task_giver_" .. giver_id), giver_task_count ) printf( ("DRX SL: drx_sl_task_giver_" .. giver_id .. " registered (" .. giver_task_count .. " outstanding)") ) -- Register hostage task giver: if ( load_var( db.actor, "drx_sl_hostage_giver_needed", false ) ) then save_var( db.actor, ("drx_sl_hostage_giver_" .. giver_id), true ) save_var( db.actor, "drx_sl_hostage_giver_needed", false ) printf( ("DRX SL: drx_sl_hostage_giver_" .. giver_id .. " registered") ) end end end -- Give the player the first available dynamic task: function npc_give_first_available_task( a, b ) if ( axr_task_manager ) then local npc = who_is_npc( a, b ) local task_id = axr_task_manager.npc_give_first_available_ordered_task( npc ) if ( not task_id ) then return end printf( ("DRX SL dynamic task started: " .. task_id) ) local se_obj = npc and alife( ):object( npc:id( ) ) local giver_id = se_obj and (se_obj.group_id ~= 65535 and se_obj.group_id or se_obj.id) local giver_task_count = (load_var( db.actor, ("drx_sl_task_giver_" .. giver_id), 0 ) + 1) save_var( db.actor, ("drx_sl_task_giver_" .. giver_id), giver_task_count ) printf( ("DRX SL: drx_sl_task_giver_" .. giver_id .. " registered (" .. giver_task_count .. " outstanding)") ) end end -- Give the player the first available simulation task: function npc_sim_give_first_available_task( a, b ) if ( axr_task_manager ) then local npc = who_is_npc( a, b ) local task_id = axr_task_manager.npc_give_first_available_ordered_task( npc, true ) if ( not task_id ) then return end printf( ("DRX SL simulation task started: " .. task_id) ) local se_obj = npc and alife( ):object( npc:id( ) ) local giver_id = se_obj and (se_obj.group_id ~= 65535 and se_obj.group_id or se_obj.id) local giver_task_count = (load_var( db.actor, ("drx_sl_task_giver_" .. giver_id), 0 ) + 1) save_var( db.actor, ("drx_sl_task_giver_" .. giver_id), giver_task_count ) printf( ("DRX SL: drx_sl_task_giver_" .. giver_id .. " registered (" .. giver_task_count .. " outstanding)") ) end end -- npcs and trade and repair function npc_is_trader(a,b) local npc = who_is_npc(a, b) if hide_hud_inventory() then npc:start_trade(db.actor) end end function npc_is_tech(a,b) local npc = who_is_npc(a,b) if hide_hud_inventory() then npc:start_upgrade(db.actor) end end function rescue_hostage(a,b) local npc = who_is_npc(a,b) local squad = get_object_squad(npc) if (squad) then for k in squad:squad_members() do se_save_var(k.id,k.object:name(),"companion_cannot_teleport",nil) axr_task_manager.hostages_by_id[k.id] = nil end else local se_npc = alife_object(npc:id()) if (se_npc) then se_save_var(se_npc.id,se_npc:name(),"companion_cannot_teleport",nil) axr_task_manager.hostages_by_id[se_npc.id] = nil end end end -- Dynamic Ordered Task dialog -- AVAILABLE TASKS function generate_available_tasks(a,b) local npc = who_is_npc(a, b) axr_task_manager.generate_available_tasks(npc,nil) --printf("generate_available_tasks %s",axr_task_manager.available_tasks[npc:id()] and #axr_task_manager.available_tasks[npc:id()]) end function sim_generate_available_tasks(a,b) local npc = who_is_npc(a, b) axr_task_manager.generate_available_tasks(npc,true) --printf("sim_generate_available_tasks %s",axr_task_manager.available_tasks[npc:id()] and #axr_task_manager.available_tasks[npc:id()]) end function text_npc_has_task(a,b) local npc = who_is_npc(a, b) local task_id = axr_task_manager.available_tasks[npc:id()] and axr_task_manager.available_tasks[npc:id()][1] --printf("text_npc_has_task %s",task_id) local on_job_descr = task_id and task_manager.task_ini:r_string_ex(task_id,"on_job_descr") if (on_job_descr) then local cond = xr_logic.parse_condlist(db.actor,"task_manager","condlist",on_job_descr) if (cond) then xr_logic.pick_section_from_condlist(db.actor,db.actor,cond) end end local fetch = task_id and task_manager.task_ini:r_string_ex(task_id,"fetch_descr") if (fetch) then axr_task_manager.trigger_fetch_func(task_id) return strformat(game.translate_string(fetch),_FETCH_TEXT or "") end return game.translate_string(task_id and task_manager.task_ini:r_string_ex(task_id,"job_descr") or "st_no_available_task") end function npc_has_task(a,b) local npc = who_is_npc(a, b) --printf("npc_has_task %s",axr_task_manager.available_tasks[npc:id()] and axr_task_manager.available_tasks[npc:id()][1] ~= nil) return axr_task_manager.available_tasks[npc:id()] and axr_task_manager.available_tasks[npc:id()][1] ~= nil end function npc_give_task(a,b) local npc = who_is_npc(a, b) local task_id = axr_task_manager.available_tasks[npc:id()] and axr_task_manager.available_tasks[npc:id()][1] if (task_id) then task_manager.get_task_manager():give_task(task_id,npc:id()) end --printf("npc_give_task %s",task_id) end function npc_skip_task(a,b) local npc = who_is_npc(a, b) if (axr_task_manager.available_tasks[npc:id()]) then table.remove(axr_task_manager.available_tasks[npc:id()],1) end --printf("npc_skip_task %s",axr_task_manager.available_tasks[npc:id()] and #axr_task_manager.available_tasks[npc:id()]) end -- FINISHED TASK TURN-IN DIALOG function actor_has_finished_task(a,b) local npc = who_is_npc(a, b) axr_task_manager.generate_finished_tasks(npc,nil) --printf("actor_has_finished_task %s",axr_task_manager.finished_tasks[npc:id()] and axr_task_manager.finished_tasks[npc:id()][1] ~= nil) return axr_task_manager.finished_tasks[npc:id()] and axr_task_manager.finished_tasks[npc:id()][1] ~= nil end function sim_actor_has_finished_task(a,b) local npc = who_is_npc(a, b) axr_task_manager.generate_finished_tasks(npc,true) --printf("sim_actor_has_finished_task %s",axr_task_manager.finished_tasks[npc:id()] and axr_task_manager.finished_tasks[npc:id()][1] ~= nil) return axr_task_manager.finished_tasks[npc:id()] and axr_task_manager.finished_tasks[npc:id()][1] ~= nil end function text_npc_task_finish(a,b) local npc = who_is_npc(a, b) local task_id = axr_task_manager.finished_tasks[npc:id()] and axr_task_manager.finished_tasks[npc:id()][1] --printf("text_npc_task_finish %s",task_id) return game.translate_string(task_id and task_manager.task_ini:r_string_ex(task_id,"task_complete_descr") or "st_default_task_finished_"..math.random(1,3)) end -- Set current dynamic task to complete: function npc_set_finished_task_complete( a, b ) local npc = who_is_npc( a, b ) axr_task_manager.set_finished_task_complete( npc ) end -- CANCEL TASKS function actor_has_ongoing_task(a,b) local npc = who_is_npc(a, b) axr_task_manager.generate_ongoing_tasks(npc,nil) return axr_task_manager.ongoing_tasks[npc:id()] and axr_task_manager.ongoing_tasks[npc:id()][1] ~= nil end function sim_actor_has_ongoing_task(a,b) local npc = who_is_npc(a, b) axr_task_manager.generate_ongoing_tasks(npc,true) return axr_task_manager.ongoing_tasks[npc:id()] and axr_task_manager.ongoing_tasks[npc:id()][1] ~= nil end function text_npc_has_cancel_task(a,b) local npc = who_is_npc(a, b) local task_id = axr_task_manager.ongoing_tasks[npc:id()] and axr_task_manager.ongoing_tasks[npc:id()][1] --printf("text_npc_has_cancel_task %s",task_id) local text = task_id and game.translate_string(task_manager.task_ini:r_string_ex(task_id, "title")) if not (text) then return game.translate_string("st_task_none_active") end local fetch = task_id and task_manager.task_ini:r_string_ex(task_id,"fetch_descr") if (fetch) then local sec = load_var(db.actor,task_id.."_fetch") if not (sec) then return text or game.translate_string("st_task_none_active") end local name = ui_item.get_sec_name(sec) return strformat(text,name or "") end return text end function npc_has_cancel_task(a,b) local npc = who_is_npc(a, b) --printf("npc_has_cancel_task %s",axr_task_manager.ongoing_tasks[npc:id()] and axr_task_manager.ongoing_tasks[npc:id()][1] ~= nil) return axr_task_manager.ongoing_tasks[npc:id()] and axr_task_manager.ongoing_tasks[npc:id()][1] ~= nil end function npc_cancel_task(a,b) local npc = who_is_npc(a, b) local task_id = axr_task_manager.ongoing_tasks[npc:id()] and axr_task_manager.ongoing_tasks[npc:id()][1] if (task_id) then task_manager.get_task_manager():set_task_cancelled(task_id) end --printf("npc_cancel_task %s",task_id) end function npc_skip_cancel_task(a,b) local npc = who_is_npc(a, b) if (axr_task_manager.ongoing_tasks[npc:id()]) then table.remove(axr_task_manager.ongoing_tasks[npc:id()],1) end --printf("npc_skip_cancel_task %s",axr_task_manager.ongoing_tasks[npc:id()] and #axr_task_manager.ongoing_tasks[npc:id()]) end function text_actor_cancel_task(a,b) local npc = who_is_npc(a, b) local task_id = axr_task_manager.ongoing_tasks[npc:id()] and axr_task_manager.ongoing_tasks[npc:id()][1] return game.translate_string(task_id and task_manager.task_ini:r_string_ex(task_id, "abandoned_reason") or "st_task_default_excuse_cancel_job") end function text_task_cancel(a,b) local npc = who_is_npc(a, b) local task_id = axr_task_manager.ongoing_tasks[npc:id()] and axr_task_manager.ongoing_tasks[npc:id()][1] return game.translate_string(task_id and task_manager.task_ini:r_string_ex(task_id, "abandoned_reply") or "st_default_task_cancel_"..math.random(1,3)) end -- This function allows Player to see NPC inventory as if it was a corpse function free_trade_with_npc(a,b) local npc = who_is_npc(a, b) if hide_hud_inventory() then npc:use(db.actor) end end -- Dynamic Broker dialog -- Determine if actor has valuable item: function condition_actor_has_valuable_item( a, b ) -- local story_done = has_alife_info( "story_mode_disabled" ) or has_alife_info( "warlab_deactivate_generators_done" ) or false local story_done = has_alife_info( "warlab_deactivate_generators_done" ) local items = { ["itm_pda_common"] = true, ["itm_pda_uncommon"] = true, ["itm_pda_rare"] = true, --["main_story_1_quest_case"] = story_done, --["main_story_2_lab_x18_documents"] = story_done, --["main_story_3_lab_x16_documents"] = story_done, --["main_story_4_lab_x10_documents"] = story_done, --["main_story_5_lab_x8_documents"] = story_done, --["main_story_6_jup_ug_documents"] = story_done, --["main_story_7_mon_con_documents"] = story_done } for k,v in pairs( items ) do if ( v == true and db.actor:object( k ) ) then return true end end return false end -- Text for if the player has an item that can be brokered: function text_actor_has_valuable_item( a, b ) local npc = who_is_npc( a, b ) -- local story_done = has_alife_info( "story_mode_disabled" ) or has_alife_info( "warlab_deactivate_generators_done" ) or false local story_done = has_alife_info( "warlab_deactivate_generators_done" ) local valuable = { --["main_story_1_quest_case"] = story_done, --["main_story_2_lab_x18_documents"] = story_done, --["main_story_3_lab_x16_documents"] = story_done, --["main_story_4_lab_x10_documents"] = story_done, --["main_story_5_lab_x8_documents"] = story_done, --["main_story_6_jup_ug_documents"] = story_done, --["main_story_7_mon_con_documents"] = story_done } for k,v in pairs( valuable ) do if ( v == true and db.actor:object( k ) ) then return game.translate_string( "st_broker_query_valuable" ) end end local count = 0 local function itr( actor, itm ) local sec = itm:section( ) if ( sec == "itm_pda_common" or sec == "itm_pda_uncommon" or sec == "itm_pda_rare" ) then count = (count + 1) end end db.actor:iterate_inventory( itr, db.actor ) if ( count == 1 ) then return game.translate_string( "st_broker_query_pda" ) end return strformat( game.translate_string( "st_broker_query_pdas" ), count ) or game.translate_string( "st_broker_query_pda" ) end -- Text for trading PDA: function text_trade_npc_pda(a,b) local npc = who_is_npc(a, b) -- local story_done = has_alife_info("story_mode_disabled") or has_alife_info("warlab_deactivate_generators_done") or false local story_done = has_alife_info( "warlab_deactivate_generators_done" ) local valuable = { --["main_story_1_quest_case"] = story_done, --["main_story_2_lab_x18_documents"] = story_done, --["main_story_3_lab_x16_documents"] = story_done, --["main_story_4_lab_x10_documents"] = story_done, --["main_story_5_lab_x8_documents"] = story_done, --["main_story_6_jup_ug_documents"] = story_done, --["main_story_7_mon_con_documents"] = story_done } for k,v in pairs(valuable) do local item = v == true and db.actor:object(k) if (item) then -- xQd, don't transfer documents cu warfare trader inventory local se_obj = alife_object(item:id()) local wf_trader if not warfare.is_warfare_trader(npc) then wf_trader = false db.actor:transfer_item(item,npc) else wf_trader = true end news_manager.relocate_item(db.actor, "out", item:section()) relocate_money(npc, random_choice(10000,15000,20000,25000) , "in") local name = ui_item.get_sec_name(sec) if wf_trader == true then alife_release(se_obj) end -- xQd end return strformat(game.translate_string("st_broker_trade_valuable"),name) end end -- Collect PDA content to determine pricing local cost_per_typ = { ["common"] = 1, ["uncommon"] = 2, ["rare"] = 3, } local cost_per_state = { ["junk"] = 1, ["info"] = 1.5, ["encrypted"] = 2, ["kill_the_strelok"] = 15, } local pda_sell = {} local function itr(actor,itm) if item_device.device_npc_pda[itm:section()] then local chk, pda_t = itm:section():match("(itm_pda_)([%l]+)") if chk and cost_per_typ[pda_t] then local id = itm:id() local info = se_load_var(id, itm:name(), "info") if info then local state if (info.state == "kill_the_strelok") then state = "kill_the_strelok" elseif (info.state == "encrypted") then state = "encrypted" else local msgs = info.msg for i=1,#msgs do local msg = msgs[i] if msg.stash or msg.route or msg.rf_freq then state = "info" break end end if (not state) then state = "junk" end end pda_sell[id] = { typ = pda_t , state = state } else pda_sell[id] = { typ = pda_t , state = "junk" } end -- xQd, don't transfer pdas cu warfare trader inventory if not warfare.is_warfare_trader(npc) then actor:transfer_item(itm,npc) else alife_release_id(id) end game_statistics.increment_statistic("pdas_delivered") end end end db.actor:iterate_inventory(itr,db.actor) local npc_text = "" local total_value = 0 local pda_bonus_coords = 0 local first_line local count = 0 for id,info in pairs(pda_sell) do local typ = info.typ local state = info.state if typ and state then local mul = (cost_per_typ[typ] * cost_per_state[state]) local mul2 = typ == "common" and 0.5 or typ == "uncommon" and 5 or typ == "rare" and 10 count = count + 1 total_value = total_value + (mul * math.random(350,900)) if (math.random(1,100) <= mul2) then pda_bonus_coords = pda_bonus_coords + 1 end if first_line then npc_text = npc_text .. " " .. game.translate_string("st_drx_questlines_and_this_one") .. " " end local trans = utils_data.collect_translations("st_broker_npc_about_pda_" .. state .. "_",true) if trans then npc_text = npc_text .. trans[math.random(#trans)] end first_line = true end end news_manager.relocate_item(db.actor, "out", "itm_pda_common", count) if (game_achievements.has_achievement("infopreneur")) then total_value = total_value + math.floor(total_value / 20) end -- Round off value: total_value = math.ceil( (total_value / 50) ) total_value = (total_value * 50) relocate_money(npc, total_value, "in") -- Add ending text: npc_text = (npc_text .. " " .. game.translate_string( "st_drx_broker_finish_" .. math.random( 1, 3 ) )) if (pda_bonus_coords > 0 and treasure_manager) then npc_text = npc_text .. "\n\n " .. game.translate_string("st_broker_npc_about_pda_bonus_coords") for i=1,pda_bonus_coords do treasure_manager.create_random_stash() end end return npc_text end -- Dynamic Surrender dialog function victim_is_bounty(a,b) local npc = who_is_npc(a, b) local id = npc:id() for task_id,npc_id in pairs(axr_task_manager.bounties_by_id) do if (id == npc_id) then return true end end return false end function npc_is_surrendered(a,b) local npc = who_is_npc(a, b) local st = db.storage[npc:id()] local po = st and st.victim_surrender and st.victim_surrender < 65534 and level.object_by_id(st.victim_surrender) --printf("npc_is_surrendered: surrendered to %s",st.victim_surrender) if (po) then return true end return false end function npc_is_not_surrendered(a,b) local npc = who_is_npc(a, b) local st = db.storage[npc:id()] local po = st and st.victim_surrender and st.victim_surrender < 65534 and level.object_by_id(st.victim_surrender) if not (po) then return false end return true end function victim_surrender(a,b) local npc = dialogs.who_is_npc(a,b) return load_var(npc,"victim_surrender",false) == true end function victim_no_surrender(a,b) local npc = dialogs.who_is_npc(a,b) return load_var(npc,"victim_surrender",false) == false end function set_victim_surrendered(a,b) local npc = dialogs.who_is_npc(a,b) save_var(npc,"victim_surrender",true) end function surrender_victim_answers_bounty(a,b) local npc = dialogs.who_is_npc(a,b) local id = npc:id() local prefix = "default" for task_id,npc_id in pairs(axr_task_manager.bounties_by_id) do if (npc_id == id) then if (task_id == "esc_m_trader_task_2") then prefix = "esc_m_trader" elseif (task_id == "zat_b7_bandit_boss_sultan_task_1") then prefix = "zat_b7_bandit_boss_sultan" end end end local r = math.random(1,10) if (r == 1 or r == 2) and ui_pda_npc_tab.can_own_pda(npc) then r = (math.random(1,100)/100) local sec = "itm_pda_common" if (r <= 0.10) then sec = "itm_pda_rare" elseif (r <= 0.5) then sec = "itm_pda_uncommon" end relocate_item_section_to_actor(a, b, sec, 1) relocate_money_to_actor(a,b,math.random(500,3000)) return game.translate_string("st_surrender_victim_answer_"..prefix.."_bounty_1") elseif (r == 3 or r == 4) then return game.translate_string("st_surrender_victim_answer_"..prefix.."_bounty_2") elseif (r == 5) then return game.translate_string("st_surrender_victim_answer_"..prefix.."_bounty_3") elseif (r == 6 or r == 7) then return game.translate_string("st_surrender_victim_answer_"..prefix.."_bounty_4") elseif (r == 8 or r == 9) then return game.translate_string("st_surrender_victim_answer_"..prefix.."_bounty_5") end if ((math.random(1,100)/100) < 0.5) then alife_create_item("medkit_script", npc) xr_wounded.unlock_medkit(npc) end return game.translate_string("st_surrender_victim_answer_5") end function surrender_victim_answers_1(a,b) local npc = dialogs.who_is_npc(a,b) local r = math.random(1,5) if (treasure_manager) and (r <= 2) then local function itr(npc,itm) if (IsWeapon(itm)) then local cond = math.random(25,50)/100 itm:set_condition(cond) npc:transfer_item(itm,db.actor) end end npc:iterate_inventory(itr,npc) if (treasure_manager) then treasure_manager.create_random_stash(nil,game.translate_string("st_stash_of") .. " " .. npc:character_name(),nil,true) if (game_achievements.has_achievement("silver_or_lead") and ((math.random(1,100)/100) <= 0.33)) then treasure_manager.create_random_stash(nil,game.translate_string("st_stash_of") .. " " .. npc:character_name(),nil,true) end end if (treasure_manager and treasure_manager.last_secret) then return game.translate_string("st_surrender_victim_answer_"..math.random(3)) else return game.translate_string("st_surrender_victim_answer_5") end elseif (r == 3) then r = (math.random(1,100)/100) local sec = "itm_pda_common" if (r <= 0.10) then sec = "itm_pda_rare" elseif (r <= 0.5) then sec = "itm_pda_uncommon" end relocate_item_section_to_actor(a, b, sec, 1) return game.translate_string("st_surrender_victim_answer_4") elseif (r == 5) then alife_create_item("medkit_script", npc) xr_wounded.unlock_medkit(npc) return game.translate_string("st_surrender_victim_answer_5") end return game.translate_string("st_surrender_victim_answer_5") end function surrender_victim_answers_2(a,b) local npc = dialogs.who_is_npc(a,b) alife_create_item("medkit_script", npc) xr_wounded.unlock_medkit(npc) --npc:set_relation(game_object.enemy,db.actor) local function itr(npc,itm) if (IsWeapon(itm)) then local cond = math.random(25,50)/100 itm:set_condition(cond) npc:transfer_item(itm,db.actor) end end game_statistics.increment_statistic("wounded_helped") npc:iterate_inventory(itr,npc) --if (math.random() <= 0.8) then --npc:set_relation(game_object.neutral,db.actor) --end db.storage[npc:id()].panicked_to_actor = true return game.translate_string("st_surrender_victim_answer_6") end function set_enemy(a,b) local npc = dialogs.who_is_npc(a,b) npc:set_relation(game_object.enemy,db.actor) end --End Alundaio function is_npc_in_current_smart(first_speaker, second_speaker, smart_name) local npc = who_is_npc(first_speaker, second_speaker) local smart = xr_gulag.get_npc_smart(npc) if not smart then return false end return smart:name() == smart_name end function break_dialog(first_speaker, second_speaker, id) first_speaker:stop_talk() second_speaker:stop_talk() end function update_npc_dialog(first_speaker, second_speaker) local npc = who_is_npc(first_speaker, second_speaker) local st = db.storage[npc:id()] st.meet.meet_manager:update() xr_meet.process_npc_usability(npc) --xr_motivator.update_logic(npc) xr_logic.try_switch_to_another_section(npc, st[st.active_scheme], db.actor) end function disable_talk_self(first_speaker, second_speaker) first_speaker:disable_talk() end function disable_talk_victim(first_speaker, second_speaker) second_speaker:disable_talk() end function punch(first_speaker, second_speaker) --printf("KICK ASS !!!!") --xr_punch.punch[first_speaker:id()] = second_speaker db.storage[second_speaker:id()].punch.enabled = true end function get_money_then_leave(first_speaker, second_speaker) db.storage[first_speaker:id()].meet.enabled = false db.storage[first_speaker:id()].robber.enabled = true end function is_wounded(first_speaker, second_speaker) -- if db.storage[first_speaker:id()].wounded ~= nil and -- db.storage[first_speaker:id()].wounded.wound_manager.can_use_medkit == true -- then -- return false -- end local npc = who_is_npc(first_speaker, second_speaker) return xr_wounded.is_wounded(npc) end --[[ function is_opp_wounded(first_speaker, second_speaker, dialog_id) if db.storage[second_speaker:id()].wounded ~= nil and db.storage[second_speaker:id()].wounded.wound_manager.can_use_medkit == true then return false end return xr_wounded.is_wounded(second_speaker) end ]]-- function is_not_wounded(first_speaker, second_speaker, dn) return not is_wounded(first_speaker, second_speaker) end function actor_have_medkit(first_speaker, second_speaker) local med = {"medkit","medkit_army","medkit_scientic"} for k,v in pairs(med) do if (first_speaker:object(v)) then return true end end return false end function actor_hasnt_medkit(first_speaker, second_speaker) return actor_have_medkit(first_speaker, second_speaker) == false end function actor_have_bandage(first_speaker, second_speaker) return first_speaker:object("bandage") ~= nil end function transfer_medkit(first_speaker, second_speaker) local npc = who_is_npc(first_speaker, second_speaker) xr_wounded.unlock_medkit(npc) if not (npc:object("medkit_script")) then alife_create_item("medkit_script", npc) end local t = {"medkit","medkit_army","medkit_scientic"} for i=1,#t do if (db.actor:object(t[i])) then dialogs.relocate_item_section(npc,t[i],"out") break end end if (npc:relation(db.actor) >= game_object.enemy) then npc:set_relation(game_object.neutral,db.actor) else npc:set_relation(game_object.friend,db.actor) end game_statistics.increment_statistic("wounded_helped") end function transfer_medkit_to_hip(first_speaker, second_speaker) local npc = who_is_npc(first_speaker, second_speaker) xr_wounded.unlock_medkit(npc) if not (npc:object("medkit_script")) then alife_create_item("medkit_script", npc) end local t = {"medkit","medkit_army","medkit_scientic"} for i=1,#t do if (db.actor:object(t[i])) then dialogs.relocate_item_section(npc,t[i],"out") break end end if (npc:relation(db.actor) >= game_object.enemy) then npc:set_relation(game_object.neutral,db.actor) else npc:set_relation(game_object.friend,db.actor) end end function transfer_bandage(first_speaker, second_speaker) dialogs.relocate_item_section(second_speaker, "bandage", "out") second_speaker:set_relation(game_object.friend, first_speaker) end function kill_yourself(first_speaker, second_speaker) local npc = who_is_npc(first_speaker, second_speaker) npc:kill(actor) end function relocate_item_section(victim, section, type, amount) -- Tronex if type == "in" then itms_manager.relocate_item_to_actor(db.actor, nil, section, amount) elseif type == "out" then itms_manager.relocate_item_from_actor(db.actor, victim, section, amount) end end function relocate_money(victim, num, type) if db.actor then if type == "in" then db.actor:give_money(num) -- game_stats.money_quest_update (num) elseif type == "out" then if victim == nil then printf("Couldn't relocate money to NULL") end db.actor:transfer_money(num, victim) -- game_stats.money_quest_update(-num) end news_manager.relocate_money(db.actor, type, num) end end --'--------------------------------------------------------------------------------- --' DIALOG ALLOWED --'--------------------------------------------------------------------------------- --function dialog_allowed(object, victim, id) -- if id ~= nil then ---- printf("*DIALOGS*: dialog_allowed: %s", id) -- else ---- printf("*DIALOGS*: dialog_allowed: nil") -- end -- if db.storage[victim:id()].actor_dialogs ~= nil then -- for k,v in pairs(db.storage[victim:id()].actor_dialogs) do -- if v == id then return true end -- end -- end -- return false --end --function dialog_not_disable(object, victim, id) -- if id ~= nil then ---- printf("*DIALOGS*: dialog_disable:%s", id) -- else ---- printf("*DIALOGS*: dialog_disable:nil") -- end -- if db.storage[victim:id()].actor_disable ~= nil then -- for k,v in pairs(db.storage[victim:id()].actor_disable) do -- if v == id then return false end -- end -- end -- return true --end function allow_wounded_dialog(object, victim, id) if db.storage[victim:id()].wounded == nil then return false end if db.storage[victim:id()].wounded.help_dialog == id then return true end return false end --function allow_guide_dialog(object, victim, id) -- local section = db.storage[victim:id()].active_section -- printf("active_section %s", tostring(section)) -- if section == nil then -- return false -- end -- if string.find(section, "conductor", 1) ~= nil then -- return true -- end -- return false --end ----------------------------------------------------------------------------------- -- LEVELS ----------------------------------------------------------------------------------- --function level_escape(first_speaker, second_speaker) -- return level.name() == "l01_escape" --end -- --function level_garbage(first_speaker, second_speaker) -- return level.name() == "l02_garbage" --end -- --function level_agroprom(first_speaker, second_speaker) -- return level.name() == "l03_agroprom_ai2" or level.name() == "l03_agroprom" --end function level_zaton(first_speaker, second_speaker) return level.name() == "zaton" end function level_jupiter(first_speaker, second_speaker) return level.name() == "jupiter" end function level_pripyat(first_speaker, second_speaker) return level.name() == "pripyat" end function not_level_zaton(first_speaker, second_speaker) return level.name() ~= "zaton" end function not_level_jupiter(first_speaker, second_speaker) return level.name() ~= "jupiter" end function not_level_pripyat(first_speaker, second_speaker) return level.name() ~= "pripyat" end ----------------------------------------------------------------------------------- -- Relation functions ----------------------------------------------------------------------------------- function is_friend(first_speaker, second_speaker) return first_speaker:relation(second_speaker) == game_object.friend end function is_not_friend(first_speaker, second_speaker) return not is_friend(first_speaker, second_speaker) end function become_friend(first_speaker, second_speaker) first_speaker:set_relation(game_object.friend, second_speaker) end ----------------------------------------------------------------------------------- -- Community ----------------------------------------------------------------------------------- function actor_stalker(first_speaker, second_speaker) return character_community(db.actor) == "actor_stalker" end function actor_bandit(first_speaker, second_speaker) return character_community(db.actor) == "actor_bandit" end function actor_freedom(first_speaker, second_speaker) return character_community(db.actor) == "actor_freedom" end function actor_dolg(first_speaker, second_speaker) return character_community(db.actor) == "actor_dolg" end function actor_killer(first_speaker, second_speaker) return character_community(db.actor) == "actor_killer" end function actor_army(first_speaker, second_speaker) return character_community(db.actor) == "actor_army" end function actor_ecolog(first_speaker, second_speaker) return character_community(db.actor) == "actor_ecolog" end function actor_csky(first_speaker, second_speaker) return character_community(db.actor) == "actor_csky" end function actor_monolith(first_speaker, second_speaker) return character_community(db.actor) == "actor_monolith" end function actor_renegade(first_speaker, second_speaker) return character_community(db.actor) == "actor_renegade" end function actor_greh(first_speaker, second_speaker) return character_community(db.actor) == "actor_greh" end function actor_isg(first_speaker, second_speaker) return character_community(db.actor) == "actor_isg" end function actor_zombied(first_speaker, second_speaker) return character_community(db.actor) == "actor_zombied" end function actor_not_stalker(first_speaker, second_speaker) return character_community(db.actor) ~= "actor_stalker" end function actor_not_bandit(first_speaker, second_speaker) return character_community(db.actor) ~= "actor_bandit" end function actor_not_freedom(first_speaker, second_speaker) return character_community(db.actor) ~= "actor_freedom" end function actor_not_dolg(first_speaker, second_speaker) return character_community(db.actor) ~= "actor_dolg" end function actor_not_killer(first_speaker, second_speaker) return character_community(db.actor) ~= "actor_killer" end function actor_not_army(first_speaker, second_speaker) return character_community(db.actor) ~= "actor_army" end function actor_not_ecolog(first_speaker, second_speaker) return character_community(db.actor) ~= "actor_dolg" end function actor_not_csky(first_speaker, second_speaker) return character_community(db.actor) ~= "actor_csky" end function actor_not_monolith(first_speaker, second_speaker) return character_community(db.actor) ~= "actor_monolith" end function actor_not_renegade(first_speaker, second_speaker) return character_community(db.actor) ~= "actor_renegade" end function actor_not_greh(first_speaker, second_speaker) return character_community(db.actor) ~= "actor_greh" end function actor_not_isg(first_speaker, second_speaker) return character_community(db.actor) ~= "actor_isg" end function actor_not_zombied(first_speaker, second_speaker) return character_community(db.actor) ~= "actor_zombied" end function actor_true_stalker(first_speaker, second_speaker) return get_actor_true_community() == "stalker" end function actor_true_bandit(first_speaker, second_speaker) return get_actor_true_community() == "bandit" end function actor_true_freedom(first_speaker, second_speaker) return get_actor_true_community() == "freedom" end function actor_true_dolg(first_speaker, second_speaker) return get_actor_true_community() == "dolg" end function actor_true_killer(first_speaker, second_speaker) return get_actor_true_community() == "killer" end function actor_true_army(first_speaker, second_speaker) return get_actor_true_community() == "army" end function actor_true_ecolog(first_speaker, second_speaker) return get_actor_true_community() == "ecolog" end function actor_true_csky(first_speaker, second_speaker) return get_actor_true_community() == "csky" end function actor_true_monolith(first_speaker, second_speaker) return get_actor_true_community() == "monolith" end function actor_true_renegade(first_speaker, second_speaker) return get_actor_true_community() == "renegade" end function actor_true_greh(first_speaker, second_speaker) return get_actor_true_community() == "greh" end function actor_true_isg(first_speaker, second_speaker) return get_actor_true_community() == "isg" end function actor_not_true_stalker(first_speaker, second_speaker) return get_actor_true_community() ~= "stalker" end function actor_not_true_bandit(first_speaker, second_speaker) return get_actor_true_community() ~= "bandit" end function actor_not_true_freedom(first_speaker, second_speaker) return get_actor_true_community() ~= "freedom" end function actor_not_true_dolg(first_speaker, second_speaker) return get_actor_true_community() ~= "dolg" end function actor_not_true_killer(first_speaker, second_speaker) return get_actor_true_community() ~= "killer" end function actor_not_true_army(first_speaker, second_speaker) return get_actor_true_community() ~= "army" end function actor_not_true_ecolog(first_speaker, second_speaker) return get_actor_true_community() ~= "ecolog" end function actor_not_true_csky(first_speaker, second_speaker) return get_actor_true_community() ~= "csky" end function actor_not_true_monolith(first_speaker, second_speaker) return get_actor_true_community() ~= "monolith" end function actor_not_true_renegade(first_speaker, second_speaker) return get_actor_true_community() ~= "renegade" end function actor_not_true_greh(first_speaker, second_speaker) return get_actor_true_community() ~= "greh" end function actor_not_true_isg(first_speaker, second_speaker) return get_actor_true_community() ~= "isg" end function npc_stalker(first_speaker, second_speaker) local npc = who_is_npc(first_speaker, second_speaker) return character_community(npc) == "stalker" end function npc_bandit(first_speaker, second_speaker) local npc = who_is_npc(first_speaker, second_speaker) return character_community(npc) == "bandit" end function npc_freedom(first_speaker, second_speaker) local npc = who_is_npc(first_speaker, second_speaker) return character_community(npc) == "freedom" end function npc_dolg(first_speaker, second_speaker) local npc = who_is_npc(first_speaker, second_speaker) return character_community(npc) == "dolg" end function npc_killer(first_speaker, second_speaker) local npc = who_is_npc(first_speaker, second_speaker) return character_community(npc) == "killer" end function npc_army(first_speaker, second_speaker) local npc = who_is_npc(first_speaker, second_speaker) return character_community(npc) == "army" end function npc_ecolog(first_speaker, second_speaker) local npc = who_is_npc(first_speaker, second_speaker) return character_community(npc) == "ecolog" end function npc_csky(first_speaker, second_speaker) local npc = who_is_npc(first_speaker, second_speaker) return character_community(npc) == "csky" end function npc_monolith(first_speaker, second_speaker) local npc = who_is_npc(first_speaker, second_speaker) return character_community(npc) == "monolith" end function npc_renegade(first_speaker, second_speaker) local npc = who_is_npc(first_speaker, second_speaker) return character_community(npc) == "renegade" end function npc_greh(first_speaker, second_speaker) local npc = who_is_npc(first_speaker, second_speaker) return character_community(npc) == "greh" end function npc_isg(first_speaker, second_speaker) local npc = who_is_npc(first_speaker, second_speaker) return character_community(npc) == "isg" end ----------------------------------------------------------------------------------- -- Goodwill ----------------------------------------------------------------------------------- function is_actor_trustworthy(first_speaker, second_speaker) local npc = who_is_npc(first_speaker, second_speaker) local sec = npc:section() local comm = sim_offline_combat.story_id_communities[sec] or character_community(npc) if (comm == "trader") then comm = "stalker" end local goodwill = relation_registry.community_goodwill(comm, AC_ID) return goodwill > goodwill_trust_limit end function is_actor_not_trustworthy(first_speaker, second_speaker) return (not is_actor_trustworthy(first_speaker, second_speaker)) end ----------------------------------------------------------------------------------- -- Rank ----------------------------------------------------------------------------------- function is_actor_experienced(first_speaker, second_speaker) local rank = ranks.get_obj_rank_name(db.actor) if (rank == "veteran" or rank == "expert" or rank == "master" or rank == "legend") then return true end return false end function is_actor_reliable(first_speaker, second_speaker) return (not is_actor_noob(first_speaker, second_speaker)) end function is_actor_noob(first_speaker, second_speaker) local rank = ranks.get_obj_rank_name(db.actor) if (rank == "novice" or rank == "trainee") then return true end return false end ----------------------------------------------------------------------------------- -- Money functions ----------------------------------------------------------------------------------- function has_2000_money(first_speaker, second_speaker) return first_speaker:money() >= 2000 end ----------------------------------------------------------------------------------- -- TRADE ----------------------------------------------------------------------------------- --' Инициализация торговли function trade_init(seller, buyer) db.storage[seller:id()].meet.begin_wait_to_see.begin = time_global()/1000 xr_position.setPosition(db.storage[seller:id()].meet.Seller, db.storage[seller:id()].meet.Seller:level_vertex_id()) db.storage[seller:id()].meet.Buyer = buyer end function want_trade(seller, buyer) if seller:relation(buyer) == game_object.friend or seller:relation(buyer) == game_object.neutral then return true else return false end end function dont_want_trade(seller, buyer) return not want_trade(seller,buyer) end function relocate_item_section_to_actor(first_speaker, second_speaker, section, amount) -- Tronex local npc = who_is_npc(first_speaker, second_speaker) itms_manager.relocate_item_to_actor(db.actor, npc, section, amount) end function relocate_money_to_actor(first_speaker, second_speaker, num) db.actor:give_money(num) -- game_stats.money_quest_update (num) news_manager.relocate_money(db.actor, "in", num) end function relocate_money_from_actor(first_speaker, second_speaker, num) local victim = who_is_npc(first_speaker, second_speaker) if victim == nil then printf("Couldn't relocate money to NULL") end db.actor:transfer_money(num, victim) -- game_stats.money_quest_update(-num) news_manager.relocate_money(db.actor, "out", num) end --[[ Old one function relocate_item_section_from_actor(first_speaker, second_speaker, section) local npc = who_is_npc(first_speaker, second_speaker) db.actor:transfer_item(db.actor:object(section), npc) news_manager.relocate_item(db.actor, "out", section) end ]]-- function who_is_actor(first_speaker, second_speaker) local npc = second_speaker if AC_ID ~= npc:id() then npc = first_speaker end return npc end function relocate_item_section_from_actor(first_speaker, second_speaker, section, amount) -- Tronex local npc = who_is_npc(first_speaker, second_speaker) itms_manager.relocate_item_from_actor(db.actor, npc, section, amount) end function actor_has_item(first_speaker, second_speaker, section) return db.actor:object(section) ~= nil end function npc_has_item(first_speaker, second_speaker, section) local npc = who_is_npc(first_speaker, second_speaker) return npc:object(section) ~= nil end function who_is_npc(first_speaker, second_speaker) return first_speaker:id() == AC_ID and second_speaker or first_speaker end -------------------------------------------------------------------------------- function transfer_any_pistol_from_actor(first_speaker, second_speaker) local npc = who_is_npc(first_speaker, second_speaker) db.actor:iterate_inventory(is_pistol, npc) if(db.actor.pistol~=nil) then db.actor:transfer_item(db.actor:object(db.actor.pistol), npc) news_manager.relocate_item(db.actor, "out", db.actor.pistol) db.actor.pistol = nil end end function is_pistol(npc, item) local section = item:section() if(section=="wpn_beretta") or(section=="wpn_colt1911") or(section=="wpn_desert_eagle") or(section=="wpn_fort") or(section=="wpn_hpsa") or(section=="wpn_pb") or(section=="wpn_pm") or(section=="wpn_usp") or(section=="wpn_walther") then db.actor.pistol = section end end function have_actor_any_pistol(first_speaker, second_speaker) local npc = who_is_npc(first_speaker, second_speaker) db.actor:iterate_inventory(is_pistol, npc) if(db.actor.pistol~=nil) then return true else return false end end -------------------------------------------------------------------------------- function transfer_any_gun_from_actor(first_speaker, second_speaker) local npc = who_is_npc(first_speaker, second_speaker) db.actor:iterate_inventory(is_gun, npc) if(db.actor.gun~=nil) then db.actor:transfer_item(db.actor:object(db.actor.gun), npc) news_manager.relocate_item(db.actor, "out", db.actor.gun) db.actor.gun = nil end end function is_gun(npc, item) local section = item:section() if(section=="wpn_abakan") or(section=="wpn_ak74") or(section=="wpn_ak74u") or(section=="wpn_groza") or(section=="wpn_sig550") or(section=="wpn_vintorez") then db.actor.gun = section end end function have_actor_any_gun(first_speaker, second_speaker) local npc = who_is_npc(first_speaker, second_speaker) db.actor:iterate_inventory(is_gun, npc) if(db.actor.gun~=nil) then return true else return false end end -------------------------------------------------------------------------------- function transfer_any_shootgun_from_actor(first_speaker, second_speaker) local npc = who_is_npc(first_speaker, second_speaker) db.actor:iterate_inventory(is_shootgun, npc) if(db.actor.shootgun~=nil) then db.actor:transfer_item(db.actor:object(db.actor.shootgun), npc) news_manager.relocate_item(db.actor, "out", db.actor.shootgun) db.actor.shootgun = nil end end function is_shootgun(npc, item) local section = item:section() if(section=="wpn_bm16") or(section=="wpn_toz34") or(section=="wpn_wincheaster1300") or(section=="wpn_spas12") then db.actor.shootgun = section end end function have_actor_any_shootgun(first_speaker, second_speaker) local npc = who_is_npc(first_speaker, second_speaker) db.actor:iterate_inventory(is_shootgun, npc) if(db.actor.shootgun~=nil) then return true else return false end end ----------------------------------------------------------------------------------- -- Weapons ----------------------------------------------------------------------------------- function give_suitable_ammo(first_speaker, second_speaker) local wpns = {} local wpn_1 = db.actor:item_in_slot(2) if wpn_1 and IsWeapon(wpn_1) then wpns[#wpns + 1] = wpn_1:section() end local wpn_2 = db.actor:item_in_slot(3) if wpn_2 and IsWeapon(wpn_2) then wpns[#wpns + 1] = wpn_2:section() end for i=1,#wpns do local section = wpns[i] local ammo = parse_list(ini_sys,section,"ammo_class") if ammo and #ammo > 0 then local ammo_sec = ammo[1] local box_size = ini_sys:r_u32(ammo_sec, "box_size") alife_create_item(ammo_sec, db.actor, { ammo = box_size }) news_manager.relocate_item(db.actor, "in", ammo_sec, box_size) end end end -------------------------------------------------------------------------------- -- ALIFE SUPPORT -------------------------------------------------------------------------------- function disable_ui(first_speaker, second_speaker) xr_effects.disable_ui(first_speaker, second_speaker) end function disable_ui_only(first_speaker, second_speaker) xr_effects.disable_ui_only(first_speaker, second_speaker) end function is_surge_running(first_speaker, second_speaker) return xr_conditions.surge_started() end function is_surge_not_running(first_speaker, second_speaker) return not xr_conditions.surge_started() end --------------------- function quest_dialog_heli_precond(first_speaker, second_speaker) if (has_alife_info("jup_b9_heli_1_searched") and has_alife_info("zat_b100_heli_2_searched") and has_alife_info("zat_b28_heli_3_searched") and has_alife_info("jup_b8_heli_4_searched") and has_alife_info("zat_b101_heli_5_searched")) or has_alife_info("pri_b305_actor_wondered_done") then return false end return true end function quest_dialog_military_precond(first_speaker, second_speaker) if has_alife_info("zat_b28_heli_3_searched") or has_alife_info("jup_b9_blackbox_decrypted") then if not (has_alife_info("zat_b28_heli_3_searched") and has_alife_info("jup_b9_blackbox_decrypted")) then return true end end return false end function quest_dialog_squad_precond(first_speaker, second_speaker) return not (has_alife_info("jup_b218_monolith_hired") and has_alife_info("jup_b218_soldier_hired") and has_alife_info("jup_a10_vano_agree_go_und")) end function quest_dialog_toolkits_precond(first_speaker, second_speaker) if has_alife_info("zat_a2_mechanic_toolkit_search") and not has_alife_info("zat_b3_task_end") then return true elseif has_alife_info("jup_b217_tech_instruments_start") and not has_alife_info("jup_b217_task_end") then return true end return false end function squad_not_in_smart_b101(first_speaker, second_speaker) local smart = "zat_b101" return not is_npc_in_current_smart(first_speaker, second_speaker, smart) end function squad_not_in_smart_b103(first_speaker, second_speaker) local smart = "zat_b103" return not is_npc_in_current_smart(first_speaker, second_speaker, smart) end function squad_not_in_smart_b104(first_speaker, second_speaker) local smart = "zat_b104" return not is_npc_in_current_smart(first_speaker, second_speaker, smart) end function squad_not_in_smart_b213(first_speaker, second_speaker) local smart = "jup_b213" return not is_npc_in_current_smart(first_speaker, second_speaker, smart) end function squad_not_in_smart_b214(first_speaker, second_speaker) local smart = "jup_b214" return not is_npc_in_current_smart(first_speaker, second_speaker, smart) end function squad_not_in_smart_b304(first_speaker, second_speaker) local smart = "pri_b304_monsters_smart_terrain" return not is_npc_in_current_smart(first_speaker, second_speaker, smart) end function squad_not_in_smart_b303(first_speaker, second_speaker) local smart = "pri_b303" return not is_npc_in_current_smart(first_speaker, second_speaker, smart) end function squad_not_in_smart_b40(first_speaker, second_speaker) local smart = "zat_b40_smart_terrain" return not is_npc_in_current_smart(first_speaker, second_speaker, smart) end function squad_not_in_smart_b18(first_speaker, second_speaker) local smart = "zat_b18" return not is_npc_in_current_smart(first_speaker, second_speaker, smart) end function squad_not_in_smart_b6(first_speaker, second_speaker) local smart = "jup_b41" return not is_npc_in_current_smart(first_speaker, second_speaker, smart) end function squad_not_in_smart_b205(first_speaker, second_speaker) local smart = "jup_b205_smart_terrain" return not is_npc_in_current_smart(first_speaker, second_speaker, smart) end function squad_not_in_smart_b47(first_speaker, second_speaker) local smart = "jup_b47" return not is_npc_in_current_smart(first_speaker, second_speaker, smart) end function squad_in_smart_zat_base(first_speaker, second_speaker) local smart = "zat_stalker_base_smart" return is_npc_in_current_smart(first_speaker, second_speaker, smart) end function squad_in_smart_jup_b25(first_speaker, second_speaker) local smart = "jup_a6" return is_npc_in_current_smart(first_speaker, second_speaker, smart) end function spartak_is_alive(first_speaker, second_speaker) return xr_conditions.is_alive(nil,nil,{"zat_b7_stalker_victim_1"}) end function tesak_is_alive(first_speaker, second_speaker) return xr_conditions.is_alive(nil,nil,{"zat_b103_lost_merc_leader"}) end function gonta_is_alive(first_speaker, second_speaker) return xr_conditions.is_alive(nil,nil,{"zat_b103_lost_merc_leader"}) end function mityay_is_alive(first_speaker, second_speaker) return xr_conditions.is_alive(nil,nil,{"jup_a12_stalker_assaulter"}) end function dolg_can_work_for_sci(first_speaker, second_speaker) return not (has_alife_info("jup_a6_freedom_leader_bunker_guards_work") or has_alife_info("jup_a6_freedom_leader_bunker_scan_work")) end function dolg_can_not_work_for_sci(first_speaker, second_speaker) return has_alife_info("jup_a6_freedom_leader_bunker_guards_work") or has_alife_info("jup_a6_freedom_leader_bunker_scan_work") end function freedom_can_work_for_sci(first_speaker, second_speaker) return not (has_alife_info("jup_a6_duty_leader_bunker_guards_work") or has_alife_info("jup_a6_duty_leader_bunker_scan_work")) end function freedom_can_not_work_for_sci(first_speaker, second_speaker) return has_alife_info("jup_a6_duty_leader_bunker_guards_work") or has_alife_info("jup_a6_duty_leader_bunker_scan_work") end function monolith_leader_is_alive(first_speaker, second_speaker) if not (has_alife_info("jup_b4_monolith_squad_in_freedom") or has_alife_info("jup_b4_monolith_squad_in_duty")) then return xr_conditions.is_alive(nil,nil,{"jup_b4_monolith_squad_leader_monolith_skin"}) end if has_alife_info("jup_b4_monolith_squad_in_freedom") then return xr_conditions.is_alive(nil,nil,{"jup_b4_monolith_squad_leader_freedom_skin"}) elseif has_alife_info("jup_b4_monolith_squad_in_duty") then return xr_conditions.is_alive(nil,nil,{"jup_b4_monolith_squad_leader_duty_skin"}) end return false end function monolith_leader_dead_or_hired(first_speaker, second_speaker) if has_alife_info("jup_b218_soldier_hired") then return true end if not (has_alife_info("jup_b4_monolith_squad_in_freedom") or has_alife_info("jup_b4_monolith_squad_in_duty")) then return not xr_conditions.is_alive(nil,nil,{"jup_b4_monolith_squad_leader_monolith_skin"}) end if has_alife_info("jup_b4_monolith_squad_in_freedom") then return not xr_conditions.is_alive(nil,nil,{"jup_b4_monolith_squad_leader_freedom_skin"}) elseif has_alife_info("jup_b4_monolith_squad_in_duty") then return not xr_conditions.is_alive(nil,nil,{"jup_b4_monolith_squad_leader_duty_skin"}) end return true end function monolith_leader_dead_or_dolg(first_speaker, second_speaker) if has_alife_info("jup_b218_soldier_hired") then return true end if not (has_alife_info("jup_b4_monolith_squad_in_freedom") or has_alife_info("jup_b4_monolith_squad_in_duty")) then return not xr_conditions.is_alive(nil,nil,{"jup_b4_monolith_squad_leader_monolith_skin"}) end if has_alife_info("jup_b4_monolith_squad_in_freedom") then return true elseif has_alife_info("jup_b4_monolith_squad_in_duty") then return not xr_conditions.is_alive(nil,nil,{"jup_b4_monolith_squad_leader_duty_skin"}) end return true end function monolith_leader_dead_or_freedom(first_speaker, second_speaker) if has_alife_info("jup_b218_soldier_hired") then return true end if not (has_alife_info("jup_b4_monolith_squad_in_freedom") or has_alife_info("jup_b4_monolith_squad_in_duty")) then return not xr_conditions.is_alive(nil,nil,{"jup_b4_monolith_squad_leader_monolith_skin"}) end if has_alife_info("jup_b4_monolith_squad_in_freedom") then return not xr_conditions.is_alive(nil,nil,{"jup_b4_monolith_squad_leader_freedom_skin"}) elseif has_alife_info("jup_b4_monolith_squad_in_duty") then return true end return true end -- Medic support function medic_magic_potion(first_speaker, second_speaker) db.actor.health = 1 db.actor.power = 1 -- com db.actor.radiation = 0 db.actor.bleeding = 1 end function medic_rad_potion(first_speaker, second_speaker) db.actor.radiation = 0 end function health_care_actor_has_money(first_speaker, second_speaker) return db.actor:money() >= 1850 end function health_care_actor_has_rad_money(first_speaker, second_speaker) return db.actor:money() >= 1480 end function health_care_actor_hasnt_money(first_speaker, second_speaker) return not health_care_actor_has_money(first_speaker, second_speaker) end function health_care_actor_hasnt_rad_money(first_speaker, second_speaker) return not health_care_actor_has_rad_money(first_speaker, second_speaker) end function health_care_actor_transfer_money(first_speaker, second_speaker) dialogs.relocate_money_from_actor(first_speaker, second_speaker, 1850) end function health_care_actor_transfer_rad_money(first_speaker, second_speaker) dialogs.relocate_money_from_actor(first_speaker, second_speaker, 1480) end function give_hip_medic_potion(first_speaker, second_speaker) local npc = who_is_npc(first_speaker, second_speaker) npc.health = 1 npc.power = 1 npc.radiation = 0 npc.bleeding = 1 end function actor_needs_bless(first_speaker, second_speaker) if db.actor.health < 1 or db.actor.radiation > 0 or db.actor.bleeding > 0 then return true end return false end function actor_needs_health(first_speaker, second_speaker) if (db.actor.health < 1) and (db.actor:money() >= 1850) then return true end return false end function actor_needs_rad_health(first_speaker, second_speaker) if (db.actor.radiation > 0) and (db.actor:money() >= 1480) then return true end return false end function actor_is_damn_healthy(first_speaker, second_speaker) return not actor_needs_bless(first_speaker, second_speaker) end function actor_needs_rad_bless(first_speaker, second_speaker) if db.actor.radiation > 0 or db.actor.bleeding >= 0 then return true end return false end function actor_wants_rad_bless(first_speaker, second_speaker) if db.actor.radiation > 0 and db.actor:money() >= 3500 then return true end return false end function actor_must_rad_bless(first_speaker, second_speaker) if db.actor.radiation > 0 and db.actor:money() >= 500 and db.actor:money() < 3500 then return true end return false end function actor_is_damn_healthy(first_speaker, second_speaker) return not actor_needs_bless(first_speaker, second_speaker) end function leave_zone_save(first_speaker, second_speaker) xr_effects.scenario_autosave(db.actor,nil,{"st_save_uni_zone_to_reality"}) end function save_uni_travel_zat_to_jup(first_speaker, second_speaker) xr_effects.scenario_autosave(db.actor,nil,{"st_save_uni_travel_zat_to_jup"}) end function save_uni_travel_zat_to_pri(first_speaker, second_speaker) xr_effects.scenario_autosave(db.actor,nil,{"st_save_uni_travel_zat_to_pri"}) end function save_uni_travel_jup_to_zat(first_speaker, second_speaker) xr_effects.scenario_autosave(db.actor,nil,{"st_save_uni_travel_jup_to_zat"}) end function save_uni_travel_jup_to_pri(first_speaker, second_speaker) xr_effects.scenario_autosave(db.actor,nil,{"st_save_uni_travel_jup_to_pri"}) end function save_uni_travel_pri_to_zat(first_speaker, second_speaker) xr_effects.scenario_autosave(db.actor,nil,{"st_save_uni_travel_pri_to_zat"}) end function save_uni_travel_pri_to_jup(first_speaker, second_speaker) xr_effects.scenario_autosave(db.actor,nil,{"st_save_uni_travel_pri_to_jup"}) end function save_jup_b218_travel_jup_to_pas(first_speaker, second_speaker) xr_effects.scenario_autosave(db.actor,nil,{"st_save_jup_b218_travel_jup_to_pas"}) end function save_pri_a17_hospital_start(first_speaker, second_speaker) xr_effects.scenario_autosave(db.actor,nil,{"st_save_pri_a17_hospital_start"}) end function save_jup_a10_gonna_return_debt(first_speaker, second_speaker) if has_alife_info("jup_a10_vano_give_task") and not has_alife_info("jup_a10_avtosave") and not has_alife_info("jup_b218_gather_squad_complete") then xr_effects.scenario_autosave(db.actor,nil,{"st_save_jup_a10_gonna_return_debt"}) db.actor:give_info_portion("jup_a10_avtosave") end end function save_jup_b6_arrived_to_fen(first_speaker, second_speaker) xr_effects.scenario_autosave(db.actor,nil,{"st_save_jup_b6_arrived_to_fen"}) end function save_jup_b6_arrived_to_ash_heap(first_speaker, second_speaker) xr_effects.scenario_autosave(db.actor,nil,{"st_save_jup_b6_arrived_to_ash_heap"}) end function save_jup_b19_arrived_to_kopachy(first_speaker, second_speaker) xr_effects.scenario_autosave(db.actor,nil,{"st_save_jup_b19_arrived_to_kopachy"}) end function save_zat_b106_arrived_to_chimera_lair(first_speaker, second_speaker) xr_effects.scenario_autosave(db.actor,nil,{"st_save_zat_b106_arrived_to_chimera_lair"}) end function save_zat_b5_met_with_others(first_speaker, second_speaker) xr_effects.scenario_autosave(db.actor,nil,{"st_save_zat_b5_met_with_others"}) end function can_do_alun_riddle_quest(first_speaker, second_speaker) return has_alife_info("alun_riddle_begin") ~= true end ----------------------------------------------------------------------------------- -- Medic general dialog ----------------------------------------------------------------------------------- function is_actor_not_healthy(first_speaker, second_speaker) if (db.actor.health < 1 or db.actor.bleeding > 0 or db.actor.radiation > 0) then return true end return false end function is_actor_healthy(first_speaker, second_speaker) return (not is_actor_not_healthy(first_speaker, second_speaker)) end function is_actor_injured(first_speaker, second_speaker) if (db.actor.health < 1 or db.actor.bleeding > 0) and (db.actor:money() >= 1850) then return true end return false end function is_actor_irradiated(first_speaker, second_speaker) if (db.actor.radiation > 0) and (db.actor:money() >= 1480) then return true end return false end function is_actor_injured_irradiated(first_speaker, second_speaker) if (db.actor.health < 1 or db.actor.bleeding > 0) and (db.actor.radiation > 0) and (db.actor:money() >= 3350) then return true end return false end function heal_actor_injury(first_speaker, second_speaker) relocate_money_from_actor (first_speaker, second_speaker, 1850) db.actor.health = 1 db.actor.power = 1 db.actor.bleeding = 1 end function heal_actor_radiation(first_speaker, second_speaker) relocate_money_from_actor (first_speaker, second_speaker, 1480) db.actor.radiation = 0 end function heal_actor_injury_radiation(first_speaker, second_speaker) relocate_money_from_actor (first_speaker, second_speaker, 3350) db.actor.health = 1 db.actor.power = 1 db.actor.radiation = 0 db.actor.bleeding = 1 end function st_dm_medic_general_text_1(first_speaker, second_speaker) local str_0 = "st_dm_medic_general_text_1_0" local str_r = "st_dm_medic_general_text_1_" .. math.random(1,3) local str = game.translate_string(str_r) .. " " .. game.translate_string(str_0) return str end function st_dm_medic_general_text_10(first_speaker, second_speaker) local str_0 = "st_dm_medic_general_text_10_0" local str_r = "st_dm_medic_general_text_10_" .. math.random(1,4) local str = game.translate_string(str_r) .. " " .. game.translate_string(str_0) return str end ----------------------------------------------------------------------------------- -- Trade important documents ----------------------------------------------------------------------------------- local important_docs = { ["main_story_1_quest_case"] = 10000, ["main_story_2_lab_x18_documents"] = 13000, ["main_story_3_lab_x16_documents"] = 16000, ["main_story_4_lab_x10_documents"] = 20000, ["main_story_5_lab_x8_documents"] = 13000, ["main_story_6_jup_ug_documents"] = 14000, ["main_story_7_mon_con_documents"] = 25000, } local important_docs_warfare_names = { ["stalker"] = "bar_visitors_barman_stalker_trader", ["bandit"] = "zat_b7_bandit_boss_sultan", ["csky"] = "mar_smart_terrain_base_stalker_leader_marsh", ["dolg"] = "bar_dolg_leader", ["army"] = "agr_smart_terrain_1_6_near_2_military_colonel_kovalski", ["killer"] = "cit_killers_merc_trader_stalker", ["ecolog"] = "yan_stalker_sakharov", ["freedom"] = "mil_smart_terrain_7_7_freedom_leader_stalker", } local inv_important_docs = {} local inv_important_docs_money = 0 function actor_has_important_documents(a,b) -- reset empty_table(inv_important_docs) inv_important_docs_money = 0 local function itr(_,obj) local sec = obj:section() if important_docs[sec] then inv_important_docs[#inv_important_docs + 1] = sec end end db.actor:iterate_inventory(itr, nil) return (#inv_important_docs > 0) end function st_trade_important_documents(a,b,typ,txt) local npc = who_is_npc(a, b) local npc_name if _G.WARFARE then local se_obj = alife_object(npc:id()) local comm = se_obj:community() npc_name = important_docs_warfare_names[comm] else npc_name = npc:section() if npc_name == "m_trader" then npc_name = npc:name() end end local str = game.translate_string("st_trade_important_documents_".. typ .. "_" .. npc_name) str = strformat(str,txt) return str end function st_trade_important_documents_ask(a,b) inv_important_docs_money = 0 for i=1,#inv_important_docs do inv_important_docs_money = inv_important_docs_money + important_docs[inv_important_docs[i]] end -- Economy factor local eco_type = game_difficulties.get_eco_factor("type") local factor = ((eco_type == 3) and 0.5) or ((eco_type == 2) and 0.75) or 1 inv_important_docs_money = inv_important_docs_money * factor -- Randomizer local delta = inv_important_docs_money * 0.1 inv_important_docs_money = math.ceil(math.random(inv_important_docs_money - delta , inv_important_docs_money + delta )) return st_trade_important_documents(a,b,"ask",inv_important_docs_money) end function st_trade_important_documents_answer(a,b) return st_trade_important_documents(a,b,"answer","") end function trade_important_documents_reward(a,b) local sweets_1 = { "af_aac", "af_iam", "af_plates", "af_camelbak", "af_surge_up", "af_frames_up", "af_grid_up", "af_grid", } local sweets_2 = { "stimpack", "medkit_army", "medkit", "drug_psy_blockade", } for i=1,#inv_important_docs do dialogs.relocate_item_section(db.actor, inv_important_docs[i], "out") local obj = db.actor:object(inv_important_docs[i]) if obj then alife_release_id(obj:id()) end end dialogs.relocate_money(db.actor, inv_important_docs_money, "in") dialogs.relocate_item_section(db.actor, sweets_1[math.random(#sweets_1)], "in", 1) dialogs.relocate_item_section(db.actor, sweets_2[math.random(#sweets_2)], "in", math.random(2,3)) end ----------------------------------------------------------------------------------- -- Trade / Repair init ----------------------------------------------------------------------------------- function is_trade_init_accept(a,b) local npc = who_is_npc(a, b) local id = npc:id() local npc_items = death_manager.get_items_by_npc(id) return (npc_items ~= false) end function is_trade_accept(a,b) local npc = who_is_npc(a, b) local id = npc:id() local npc_items = death_manager.get_items_by_npc(id) -- first-time trade request, decide if NPC wants to trade local init_items = nil if (npc_items == nil) then init_items = (math.random(100) <= 60) and true or false end -- if npc agrees, spawn items in his inventory if (init_items == true) then local npc_comm = character_community(npc) local npc_rank = ranks.get_obj_rank_name(npc) death_manager.create_item_list(npc, npc_comm, npc_rank, false, true) -- if npc disagrees, mark him elseif (init_items == false) then death_manager.set_items_by_npc(id,false) end return ((npc_items or init_items) and true or false) end function is_not_trade_accept(a,b) local npc = who_is_npc(a, b) local id = npc:id() local npc_items = death_manager.get_items_by_npc(id) return (npc_items == false) end function st_stalker_trade_dialog_reply(a,b) local str = game.translate_string("st_stalker_trade_dialog_reply_" .. math.random(1,50)) return str end function st_stalker_trade_dialog_reply_no(a,b) local str = game.translate_string("st_stalker_trade_dialog_reply_no_" .. math.random(1,40)) return str end function st_trader_dialog_reply(a,b) local str = game.translate_string("st_trader_dialog_reply_" .. math.random(1,100)) return str end function st_mechanic_dialog_reply(a,b) local str = game.translate_string("st_mechanic_dialog_reply_" .. math.random(1,50)) return str end function st_medic_dialog_reply(a,b) local str = game.translate_string("st_medic_dialog_reply_" .. math.random(1,50)) return str end function st_bartender_dialog_reply(a,b) local str = game.translate_string("st_bartender_dialog_reply_" .. math.random(1,50)) return str end ----------------------------------------------------------------------------------- -- Questions about NPC life style ----------------------------------------------------------------------------------- local lifestyle_asked_already = {} -- dialog is available 2 times only for an npc: when asked and get answer, and when npc has enough local lifestyle_id -- stores latest npc with this dialog, it will be safe because of the procondition local lifestyle_tbl = { ["esc_m_trader"] = "esc_m_trader", ["bar_dolg_leader"] = "bar_dolg_leader", ["mil_smart_terrain_7_7_freedom_leader_stalker"] = "mil_smart_terrain_7_7_freedom_leader_stalker", ["yan_stalker_sakharov"] = "yan_stalker_sakharov", ["jup_b6_scientist_nuclear_physicist"] = "yan_stalker_sakharov", ["hunter_gar_trader"] = "hunter_gar_trader", ["jup_b220_trapper"] = "jup_b220_trapper", } function lifestyle_first_time(a,b) local npc = who_is_npc(a, b) local name = npc and (npc:section() ~= "m_trader") and npc:section() or npc:name() lifestyle_id = npc:id() --printf("- lifestyle_first_time | NPC: %s - id: %s", name, lifestyle_id) -- if npc is asked twice, no dialog if name and (lifestyle_asked_already[name] == true) then return false end return true end function st_lifestyle_ask(a,b) local npc = lifestyle_id and db.storage[lifestyle_id] and db.storage[lifestyle_id].object local name = npc and (npc:section() ~= "m_trader") and npc:section() or npc:name() local prof = name and lifestyle_tbl[name] if prof then return game.translate_string("st_" .. prof .. "_life_ask") end return game.translate_string("st_esc_m_trader_life_ask") end function st_lifestyle_answer(a,b) local npc = lifestyle_id and db.storage[lifestyle_id] and db.storage[lifestyle_id].object local name = npc and (npc:section() ~= "m_trader") and npc:section() or npc:name() local prof = name and lifestyle_tbl[name] -- if npc is asked once, second answer is enough if prof and (lifestyle_asked_already[name] == false) then lifestyle_asked_already[name] = true return game.translate_string("st_" .. prof .. "_life_end") end lifestyle_asked_already[name] = false -- if npc never asked, give proper answer local tbl = prof and utils_data.collect_translations("st_" .. prof .. "_life_",true) if (not tbl) then lifestyle_asked_already[name] = true return game.translate_string("st_esc_m_trader_life_end") end return tbl[math.random(#tbl)] end