Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- local sim_objects_registry = nil
- local props_ini = ini_file("misc\\simulation_objects_props.ltx")
- local tweaks_ini = ini_file("ai_tweaks\\simulation_objects.ltx")
- local EnterLevels = alun_utils.collect_section(tweaks_ini,"enter_levels",true)
- local ExitLevels = alun_utils.collect_section(tweaks_ini,"exit_levels",true)
- class "simulation_objects_registry"
- function simulation_objects_registry:__init()
- self.objects = {}
- end
- function simulation_objects_registry:register(obj)
- self:get_props(obj)
- self:update_avaliability(obj)
- end
- function simulation_objects_registry:update_avaliability(obj)
- if xr_logic.pick_section_from_condlist(db.actor or alife():actor(), obj, obj.sim_avail) == "true" and obj:sim_available() then
- self.objects[obj.id] = obj
- else
- self.objects[obj.id] = nil
- end
- end
- function simulation_objects_registry:get_props(obj)
- obj.props = {}
- local props_section = obj:name()
- if obj:clsid() == clsid.online_offline_group_s then
- props_section = obj:section_name()
- end
- if not props_ini:section_exist(props_section) then
- -- abort("!!!!Warning : object [%s] has no simulation props section!!!!!!!!!!!!!!!!", obj:name())
- props_section = "default"
- if obj:clsid() == clsid.online_offline_group_s then
- props_section = "default_squad"
- end
- if obj:clsid() == clsid.script_actor then
- props_section = "actor"
- end
- end
- local n = props_ini:line_count(props_section)
- for j=0,n-1 do
- local result, prop_name, prop_condlist = props_ini:r_line(props_section,j,"","")
- if prop_name == "sim_avail" then
- obj.sim_avail = xr_logic.parse_condlist(nil, "simulation_object", "sim_avail", prop_condlist)
- else
- obj.props[prop_name] = prop_condlist
- end
- end
- if obj.sim_avail == nil then
- obj.sim_avail = xr_logic.parse_condlist(nil, "simulation_object", "sim_avail", "true")
- end
- end
- function simulation_objects_registry:unregister(obj)
- self.objects[obj.id] = nil
- end
- function get_sim_obj_registry()
- if sim_objects_registry == nil then
- sim_objects_registry = simulation_objects_registry()
- end
- return sim_objects_registry
- end
- --***********************************************************************************************
- --* SIMULATION_LOCAL_FUNCTIONS *
- --***********************************************************************************************
- function sim_dist_to(obj1 , obj2)
- local pos1,lv1,gv1 = obj1:get_location()
- local pos2,lv2,gv2 = obj2:get_location()
- return utils.graph_distance(gv1, gv2)
- end
- local function evaluate_prior_by_dist(target, squad)
- local dist = sim_dist_to(target, squad)
- if dist < 1 then
- dist = 1
- end
- return 1 + 1/dist
- end
- function is_on_the_same_level(obj1, obj2)
- return game_graph():vertex(obj1.m_game_vertex_id):level_id() == game_graph():vertex(obj2.m_game_vertex_id):level_id()
- end
- function evaluate_prior(target, squad)
- if (target:clsid() == clsid.online_offline_group_s and not is_on_the_same_level(target, squad)) then
- return 0
- end
- local prior = 0
- if (not target:target_precondition(squad)) then
- return 0
- else
- prior = 3
- end
- -- Level travel
- if not (is_on_the_same_level(target, squad)) then
- local level_name = alife():level_name(game_graph():vertex(squad.m_game_vertex_id):level_id())
- local target_level_name = alife():level_name(game_graph():vertex(target.m_game_vertex_id):level_id())
- local enable = EnterLevels[target_level_name] and xr_logic.pick_section_from_condlist(db.actor,squad,xr_logic.parse_condlist(squad,"enter_levels",target_level_name,EnterLevels[target_level_name]))
- if (enable ~= "true") then
- return 0
- end
- enable = ExitLevels[level_name] and xr_logic.pick_section_from_condlist(db.actor,squad,xr_logic.parse_condlist(squad,"exit_levels",level_name,ExitLevels[level_name]))
- if (enable ~= "true") then
- return 0
- end
- end
- for k,v in pairs (squad.behaviour) do
- local squad_koeff = tonumber(v)
- local target_koeff = 0
- if target.props[k] ~= nil then
- target_koeff = tonumber(target.props[k])
- end
- prior = prior + squad_koeff*target_koeff
- end
- return prior*evaluate_prior_by_dist(target, squad)
- end
- --***********************************************************************************************
- --* DEBUG_FUNCTIONS
- --***********************************************************************************************
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement