Advertisement
Guest User

simulation_objects.script

a guest
Dec 1st, 2013
54
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.34 KB | None | 0 0
  1. local sim_objects_registry = nil
  2. local props_ini = ini_file("misc\\simulation_objects_props.ltx")
  3. local tweaks_ini = ini_file("ai_tweaks\\simulation_objects.ltx")
  4. local EnterLevels = alun_utils.collect_section(tweaks_ini,"enter_levels",true)
  5. local ExitLevels = alun_utils.collect_section(tweaks_ini,"exit_levels",true)
  6.  
  7.  
  8. class "simulation_objects_registry"
  9. function simulation_objects_registry:__init()
  10. self.objects = {}
  11. end
  12.  
  13. function simulation_objects_registry:register(obj)
  14. self:get_props(obj)
  15. self:update_avaliability(obj)
  16. end
  17.  
  18. function simulation_objects_registry:update_avaliability(obj)
  19. if xr_logic.pick_section_from_condlist(db.actor or alife():actor(), obj, obj.sim_avail) == "true" and obj:sim_available() then
  20. self.objects[obj.id] = obj
  21. else
  22. self.objects[obj.id] = nil
  23. end
  24. end
  25.  
  26. function simulation_objects_registry:get_props(obj)
  27. obj.props = {}
  28. local props_section = obj:name()
  29. if obj:clsid() == clsid.online_offline_group_s then
  30. props_section = obj:section_name()
  31. end
  32. if not props_ini:section_exist(props_section) then
  33. -- abort("!!!!Warning : object [%s] has no simulation props section!!!!!!!!!!!!!!!!", obj:name())
  34. props_section = "default"
  35. if obj:clsid() == clsid.online_offline_group_s then
  36. props_section = "default_squad"
  37. end
  38. if obj:clsid() == clsid.script_actor then
  39. props_section = "actor"
  40. end
  41. end
  42. local n = props_ini:line_count(props_section)
  43. for j=0,n-1 do
  44. local result, prop_name, prop_condlist = props_ini:r_line(props_section,j,"","")
  45. if prop_name == "sim_avail" then
  46. obj.sim_avail = xr_logic.parse_condlist(nil, "simulation_object", "sim_avail", prop_condlist)
  47. else
  48. obj.props[prop_name] = prop_condlist
  49. end
  50. end
  51. if obj.sim_avail == nil then
  52. obj.sim_avail = xr_logic.parse_condlist(nil, "simulation_object", "sim_avail", "true")
  53. end
  54. end
  55.  
  56. function simulation_objects_registry:unregister(obj)
  57. self.objects[obj.id] = nil
  58. end
  59.  
  60. function get_sim_obj_registry()
  61. if sim_objects_registry == nil then
  62. sim_objects_registry = simulation_objects_registry()
  63. end
  64. return sim_objects_registry
  65. end
  66.  
  67. --***********************************************************************************************
  68. --* SIMULATION_LOCAL_FUNCTIONS *
  69. --***********************************************************************************************
  70.  
  71.  
  72. function sim_dist_to(obj1 , obj2)
  73. local pos1,lv1,gv1 = obj1:get_location()
  74. local pos2,lv2,gv2 = obj2:get_location()
  75. return utils.graph_distance(gv1, gv2)
  76. end
  77.  
  78. local function evaluate_prior_by_dist(target, squad)
  79. local dist = sim_dist_to(target, squad)
  80. if dist < 1 then
  81. dist = 1
  82. end
  83. return 1 + 1/dist
  84. end
  85.  
  86. function is_on_the_same_level(obj1, obj2)
  87. return game_graph():vertex(obj1.m_game_vertex_id):level_id() == game_graph():vertex(obj2.m_game_vertex_id):level_id()
  88. end
  89.  
  90. function evaluate_prior(target, squad)
  91. if (target:clsid() == clsid.online_offline_group_s and not is_on_the_same_level(target, squad)) then
  92. return 0
  93. end
  94.  
  95. local prior = 0
  96. if (not target:target_precondition(squad)) then
  97. return 0
  98. else
  99. prior = 3
  100. end
  101.  
  102. -- Level travel
  103. if not (is_on_the_same_level(target, squad)) then
  104. local level_name = alife():level_name(game_graph():vertex(squad.m_game_vertex_id):level_id())
  105. local target_level_name = alife():level_name(game_graph():vertex(target.m_game_vertex_id):level_id())
  106.  
  107. 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]))
  108. if (enable ~= "true") then
  109. return 0
  110. end
  111.  
  112. 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]))
  113. if (enable ~= "true") then
  114. return 0
  115. end
  116. end
  117.  
  118. for k,v in pairs (squad.behaviour) do
  119. local squad_koeff = tonumber(v)
  120. local target_koeff = 0
  121. if target.props[k] ~= nil then
  122. target_koeff = tonumber(target.props[k])
  123. end
  124. prior = prior + squad_koeff*target_koeff
  125. end
  126.  
  127. return prior*evaluate_prior_by_dist(target, squad)
  128. end
  129.  
  130.  
  131. --***********************************************************************************************
  132. --* DEBUG_FUNCTIONS
  133. --***********************************************************************************************
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement