add game&rawdata

This commit is contained in:
Vasily Petrov 2026-06-17 23:06:51 +03:00
parent 0133cd976c
commit 49b34b5546
45731 changed files with 709831 additions and 0 deletions

View file

@ -0,0 +1,479 @@
--'******************************************************
--'* Ðååñòð ñìàðò-òåððåéíîâ. Èãðîâîå ïîëå ñèìóëÿöèè.
--'******************************************************
--' Â ýòîì ltx õðàíÿòñÿ äåñêðèïòîðû ñêâàäîâ.
squad_ltx = system_ini()
setting_ini = ini_file("misc\\simulation.ltx")
local group_id_by_levels = {zaton = 1,
pripyat = 2,
jupiter = 3,
labx8 = 4,
jupiter_underground = 5}
local board = nil
simulation_activities = {
stalker = {
squad = nil,
smart = { base = { prec = function(squad, target) return in_time_interval(18,8) and not xr_conditions.surge_started() and not travel_manager.check_squad_for_enemies(squad) and (target:name() == "zat_stalker_base_smart" or target:name() == "jup_a6" or target:name() == "pri_a16") end },
surge = { prec = function() return xr_conditions.surge_started() end },
territory= { prec = function() return in_time_interval(8,18) and not xr_conditions.surge_started() end },
resource = { prec = function(squad, target) return in_time_interval(8,18) and not xr_conditions.surge_started() end } -- and squad:has_detector()
},
actor = nil
},
bandit = {
squad = { stalker = { prec = function(squad, target) return in_time_interval(8,21) and not xr_conditions.surge_started() and simulation_objects.sim_dist_to(squad, target) <= 150 end }
},
smart = { base = { prec = function(squad, target) return in_time_interval(21,8) and not xr_conditions.surge_started() and not travel_manager.check_squad_for_enemies(squad) and (target:name() == "zat_stalker_base_smart" or target:name() == "jup_a10_smart_terrain") end },
territory= { prec = function() return in_time_interval(8,21) and not xr_conditions.surge_started() end },
surge = { prec = function() return xr_conditions.surge_started() end }
},
actor = { prec = function(squad, target) return has_alife_info("sim_bandit_attack_harder") and simulation_objects.sim_dist_to(squad, target) <= 150 end }
},
dolg = {
squad = { freedom = { prec = function(squad, target) return in_time_interval(8,19) and not xr_conditions.surge_started() and simulation_objects.sim_dist_to(squad, target) <= 150 end },
monster_predatory_day = { prec = function(squad, target) return in_time_interval(8,19) and not xr_conditions.surge_started() and simulation_objects.sim_dist_to(squad, target) <= 150 end },
monster_predatory_night = { prec = function(squad, target) return in_time_interval(8,19) and not xr_conditions.surge_started() and simulation_objects.sim_dist_to(squad, target) <= 150 end },
monster_vegetarian = { prec = function(squad, target) return in_time_interval(8,19) and not xr_conditions.surge_started() and simulation_objects.sim_dist_to(squad, target) <= 150 end },
monster_zombied_day = { prec = function(squad, target) return in_time_interval(8,19) and not xr_conditions.surge_started() and simulation_objects.sim_dist_to(squad, target) <= 150 end },
monster_special = { prec = function(squad, target) return in_time_interval(8,19) and not xr_conditions.surge_started() and simulation_objects.sim_dist_to(squad, target) <= 150 end }
},
smart = { base = { prec = function(squad, target) return in_time_interval(19,8) and not xr_conditions.surge_started() and not travel_manager.check_squad_for_enemies(squad) and (target:name() == "zat_stalker_base_smart" or target:name() == "jup_a6" or target:name() == "pri_a16") end },
territory= { prec = function() return in_time_interval(8,19) and not xr_conditions.surge_started() end },
surge = { prec = function() return xr_conditions.surge_started() end }
},
actor = nil
},
freedom = {
squad = { dolg = { prec = function(squad, target) return in_time_interval(8,19) and not xr_conditions.surge_started() and simulation_objects.sim_dist_to(squad, target) <= 150 end }
},
smart = { base = { prec = function(squad, target) return in_time_interval(19,8) and not xr_conditions.surge_started() and not travel_manager.check_squad_for_enemies(squad) and (target:name() == "zat_stalker_base_smart" or target:name() == "jup_a6" or target:name() == "pri_a16") end },
territory= { prec = function() return in_time_interval(8,19) and not xr_conditions.surge_started() end },
surge = { prec = function() return xr_conditions.surge_started() end }
},
actor = nil
},
killer = {
squad = nil,
smart = { territory= { prec = function() return not xr_conditions.surge_started() end },
surge = { prec = function() return xr_conditions.surge_started() end }
},
actor = { prec = function(squad, target) return simulation_objects.sim_dist_to(squad, target) <= 150 end }
},
zombied = {
squad = nil,
smart = { territory= { prec = function() return true end },
lair = { prec = function() return true end}
},
actor = nil
},
monster_predatory_day = {
squad = { monster_vegetarian = { prec = function() return in_time_interval(6,19) end },
stalker = { prec = function(squad, target) return in_time_interval(6, 19) and simulation_objects.sim_dist_to(squad, target) <= 150 end },
bandit = { prec = function(squad, target) return in_time_interval(6, 19) and simulation_objects.sim_dist_to(squad, target) <= 150 end },
dolg = { prec = function(squad, target) return in_time_interval(6, 19) and simulation_objects.sim_dist_to(squad, target) <= 150 end },
freedom = { prec = function(squad, target) return in_time_interval(6, 19) and simulation_objects.sim_dist_to(squad, target) <= 150 end },
killer = { prec = function(squad, target) return in_time_interval(6, 19) and simulation_objects.sim_dist_to(squad, target) <= 150 end }
},
smart = { territory= { prec = function() return in_time_interval(6, 19) end },
lair = { prec = function() return in_time_interval(19,6) end }
},
actor = { prec = function(squad, target) return in_time_interval(6, 19) and simulation_objects.sim_dist_to(squad, target) <= 150 end }
},
monster_predatory_night = {
squad = { monster_vegetarian = { prec = function() return in_time_interval(21,6) end },
stalker = { prec = function(squad, target) return in_time_interval(19,6) and simulation_objects.sim_dist_to(squad, target) <= 150 end },
bandit = { prec = function(squad, target) return in_time_interval(19,6) and simulation_objects.sim_dist_to(squad, target) <= 150 end },
dolg = { prec = function(squad, target) return in_time_interval(19,6) and simulation_objects.sim_dist_to(squad, target) <= 150 end },
freedom = { prec = function(squad, target) return in_time_interval(19,6) and simulation_objects.sim_dist_to(squad, target) <= 150 end },
killer = { prec = function(squad, target) return in_time_interval(19,6) and simulation_objects.sim_dist_to(squad, target) <= 150 end }
},
smart = { territory= { prec = function() return in_time_interval(19,6) end },
lair = { prec = function() return in_time_interval(6,19) end }
},
actor = { prec = function(squad, target) return in_time_interval(19,6) and simulation_objects.sim_dist_to(squad, target) <= 150 end }
},
monster_vegetarian = {
squad = nil,
smart = {
lair = { prec = function() return true end }
},
actor = { prec = function(squad, target) return in_time_interval(6, 19) and simulation_objects.sim_dist_to(squad, target) <= 150 end }
},
monster_zombied_day = {
squad = { stalker = { prec = function(squad, target) return in_time_interval(6, 19) and simulation_objects.sim_dist_to(squad, target) <= 150 end },
bandit = { prec = function(squad, target) return in_time_interval(6, 19) and simulation_objects.sim_dist_to(squad, target) <= 150 end },
dolg = { prec = function(squad, target) return in_time_interval(6, 19) and simulation_objects.sim_dist_to(squad, target) <= 150 end },
freedom = { prec = function(squad, target) return in_time_interval(6, 19) and simulation_objects.sim_dist_to(squad, target) <= 150 end },
killer = { prec = function(squad, target) return in_time_interval(6, 19) and simulation_objects.sim_dist_to(squad, target) <= 150 end }
},
smart = { territory= { prec = function() return not xr_conditions.surge_started() end },
lair = { prec = function() return in_time_interval(19,6) end }
},
actor = { prec = function(squad, target) return in_time_interval(6, 19) and simulation_objects.sim_dist_to(squad, target) <= 150 end }
},
monster_zombied_night = {
squad = { stalker = { prec = function(squad, target) return in_time_interval(19,6) and simulation_objects.sim_dist_to(squad, target) <= 150 end },
bandit = { prec = function(squad, target) return in_time_interval(19,6) and simulation_objects.sim_dist_to(squad, target) <= 150 end },
dolg = { prec = function(squad, target) return in_time_interval(19,6) and simulation_objects.sim_dist_to(squad, target) <= 150 end },
freedom = { prec = function(squad, target) return in_time_interval(19,6) and simulation_objects.sim_dist_to(squad, target) <= 150 end },
killer = { prec = function(squad, target) return in_time_interval(19,6) and simulation_objects.sim_dist_to(squad, target) <= 150 end }
},
smart = { territory= { prec = function() return in_time_interval(19,6) end },
lair = { prec = function() return in_time_interval(6,19) end }
},
actor = { prec = function(squad, target) return in_time_interval(19,6) and simulation_objects.sim_dist_to(squad, target) <= 150 end }
},
monster_special = {
squad = nil,
smart = { lair = { prec = function() return true end }
},
actor = nil
},
}
class "sim_board"
function sim_board:__init()
--' Òàáëèöà ñîäåðæàùàÿ ñìàðòû è äàííûå î íèõ â ôîðìàòå:
--' smart = {smrt, targets = {}, dangers = {}, squads = {}, stayed_squad_quan = 0}
self.smarts = {}
self.simulation_started = true
--' Òàáëèöà ñìàðòîâ ïî èìåíàì.
self.smarts_by_names = {}
--' Òàáëèöà ñóùåñòâóþùèõ îòðÿäîâ.
self.squads = {}
--' îòðèñîâûâàåòñÿ ëè ñåé÷àñ ïîëå íà êàðòå.
--self.show_flag = false
--' Òàáëèöà ñïàóíñìàðòîâ. Ñìàðò = óðîâåíü.
self.spawn_smarts = {}
-- Òàáëèöà äëÿ ëîãîâîâ ìóòàíòîâ íà óðîâíÿõ
self.mutant_lair = {}
-- Âðåìåííàÿ òàáëèöà
self.tmp_assigned_squad = {}
self.tmp_entered_squad = {}
printf("CREATE NEW SIM BOARD [%s]", tostring(self.sid))
end
function sim_board:start_sim()
self.simulation_started = true
end
function sim_board:stop_sim()
self.simulation_started = false
end
-- Ïåðåâîä èãðîêà â ãðóïïèðîâêó.
function sim_board:set_actor_community(community)
---- Óñòàíàâëèâàåì ãðóïïèðîâêó èãðîêà
db.actor:set_character_community(actor_communitites[community], 0, 0)
end
--' Ðåãèñòðàöèÿ íîâîãî ñìàðòà.
function sim_board:register_smart(obj)
printf("register_smart %s", obj:name())
if self.smarts[obj.id] ~= nil then
abort("Smart already exist in list [%s]", obj:name())
end
self.smarts[obj.id] = {smrt = obj, squads = {}, stayed_squad_quan = 0}
self.smarts_by_names[obj:name()] = obj
end
-- Èíèöèàëèçàöèÿ ñìàðòà
function sim_board:init_smart(obj)
if self.tmp_assigned_squad[obj.id] ~= nil then
for k,v in pairs(self.tmp_assigned_squad[obj.id]) do
self:assign_squad_to_smart(v, obj.id)
end
self.tmp_assigned_squad[obj.id] = nil
end
if self.tmp_entered_squad[obj.id] ~= nil then
for k,v in pairs(self.tmp_entered_squad[obj.id]) do
self:enter_smart(v, obj.id)
end
self.tmp_entered_squad[obj.id] = nil
end
end
--' ÀíÐåãèñòðàöèÿ ñìàðòà.
function sim_board:unregister_smart(obj)
if self.smarts[obj.id] == nil then
abort("Trying to unregister nil smart [%s]", obj:name())
end
self.smarts[obj.id] = nil
end
--' Ñîçäàíèå íîâîãî îòðÿäà
function sim_board:create_squad(spawn_smart, sq_id)
printf("create squad called")
local squad_id = tostring(sq_id)
local squad = alife():create(squad_id,spawn_smart.position,
spawn_smart.m_level_vertex_id,
spawn_smart.m_game_vertex_id)
--local squad = squad_class(self, squad_id, faction_name, settings_id)
--squad:init_squad(spawn_smart)
printf("Creating squad[%s] in smart[%s]", squad_id, spawn_smart:name())
--' Îïðåäåëÿåì â êàêîì ñìàðòå ñîçäàòü íîâûé îòðÿä
squad:create_npc(spawn_smart)
squad:set_squad_relation()
self:assign_squad_to_smart(squad, spawn_smart.id)
--' Ïåðåñ÷èòûâàåì Team, Squad, Group
for k in squad:squad_members() do
local obj = k.object
squad.board:setup_squad_and_group(obj)
end
return squad
end
--' Óäàëèòü îòðÿä
function sim_board:remove_squad(squad)
printf("Remove squad %s", tostring(squad.id))
if squad.current_action == nil or
squad.current_action.dest_smrt == nil
then
squad.board:exit_smart(squad, squad.smart_id)
end
--squad:hide()
self:assign_squad_to_smart(squad, nil)
squad:remove_squad()
end
--' Íàçíà÷åíèå îòðÿäà â ñìàðò.
function sim_board:assign_squad_to_smart(squad, smart_id)
-- Åñëè ñìàðòà íåòó (íàïðèìåð íà çàãðóçêå îí åùå íå çàãðóæåí), òî ìû çàãîíÿåì äàííûå
-- âî âðåìåííóþ òàáëèöó. È íà çàãðóçêå ñìàðòà àâòîäîáàâëÿåì èõ.
--printf("assigned squad %s to smart [%s].", tostring(squad.id), tostring(smart_id))
if smart_id ~= nil and self.smarts[smart_id] == nil then
-- printf(" to tmp")
if self.tmp_assigned_squad[smart_id] == nil then
self.tmp_assigned_squad[smart_id] = {}
end
table.insert(self.tmp_assigned_squad[smart_id], squad)
return
end
--' Óáèðàåì îòðÿä èç ñòàðîãî ñìàðòà
local old_smart_id = nil
if squad.smart_id ~= nil then
old_smart_id = squad.smart_id
end
if old_smart_id ~= nil and self.smarts[old_smart_id] ~= nil then
self.smarts[old_smart_id].squads[squad.id] = nil
self.smarts[old_smart_id].smrt:refresh()
end
if smart_id == nil then
squad:assign_smart(nil)
return
end
squad:assign_smart(self.smarts[smart_id].smrt)
--' Ïðîïèñûâàåì îòðÿä â íîâîì ñìàðòå.
self.smarts[smart_id].squads[squad.id] = squad
self.smarts[smart_id].smrt:refresh()
end
--' Îòðÿä ïîêèäàåò ñìàðò (óìåíüøàþòñÿ ðåñóðñû)
function sim_board:exit_smart(squad, smart_id)
if smart_id == nil then
return
end
if squad.entered_smart ~= smart_id then
return
end
squad.entered_smart = nil
local smart = self.smarts[smart_id]
if smart == nil then
abort("Smart nil while smart_id not nil [%s]", tostring(smart_id))
end
printf("Squad %s exit smart %s. Quan = %s", tostring(squad.id), smart.smrt:name(), tostring(smart.stayed_squad_quan))
smart.stayed_squad_quan = smart.stayed_squad_quan - 1
smart.squads[squad.id] = nil
--smart.smrt:refresh()
end
--' Îòðÿä çàíèìàåò ñìàðò (óâåëè÷èâàþòñÿ ðåñóðñû)
function sim_board:enter_smart(squad, smart_id, after_load)
callstack()
if self.smarts[smart_id] == nil then
printf(" to tmp")
if self.tmp_entered_squad[smart_id] == nil then
self.tmp_entered_squad[smart_id] = {}
end
table.insert(self.tmp_entered_squad[smart_id], squad)
return
end
local smart = self.smarts[smart_id]
if squad.entered_smart ~= nil then
abort("Couldn enter to smart, becouse i'm not leave old one. Squad [%s]", squad.id)
end
squad.entered_smart = smart_id
printf("Squad %s enter smart %s. Quan = %s", tostring(squad.id), smart.smrt:name(), tostring(smart.stayed_squad_quan))
--smart.smrt:refresh()
smart.stayed_squad_quan = smart.stayed_squad_quan + 1
squad.items_spawned = false
end
-- óñòàíîâèòü squad è group â ñîîòâåòñòâèè ñ ðàáîòîé
function sim_board:setup_squad_and_group(obj)
--printf("tsg["..obj:name().."]")
local level_name = level.name()
--' Ãðóïïó áåðåì èç óðîâíÿ.
local obj = alife():object(obj.id)
local group = group_id_by_levels[level_name] or 0
change_team_squad_group(obj, obj.team, obj.squad, group)
--' Ñêâàä áåðåì èç ñìàðòà.
local squad = alife():object(obj.group_id)
if squad == nil then
change_team_squad_group(obj, obj.team, 0, obj.group)
--printf("TSG1: [%s][%s][%s]", tostring(obj.team), tostring(obj.squad), tostring(obj.group))
return
end
local smart = nil
if squad.current_action ~= nil and squad.current_action.name == "reach_target" then
smart = alife():object(squad.assigned_target_id)
elseif squad.smart_id ~= nil then
smart = alife():object(squad.smart_id)
end
if smart == nil then
change_team_squad_group(obj, obj.team, 0, obj.group)
--printf("TSG2: [%s][%s][%s]", tostring(obj.team), tostring(obj.squad), tostring(obj.group))
return
end
local obj_sq = 0
if smart:clsid() == clsid.smart_terrain then
obj_sq = smart.squad_id
end
change_team_squad_group(obj, obj.team, obj_sq, obj.group)
--printf("TSG3: [%s][%s][%s]", tostring(obj.team), tostring(obj.squad), tostring(obj.group))
end
--' Çàïîëíåíèå ñòàðòîâîãî ðàñïîëîæåíèÿ
function sim_board:fill_start_position()
if self.start_position_filled == true then
return
end
--printf("FILL START POSITION [%s]", self.player_name)
self.start_position_filled = true
for level in game_graph():levels() do
local section_name = "start_position_" .. alife():level_name(level.id)
if not setting_ini:section_exist(section_name) then
return
end
local n = setting_ini:line_count(section_name)
for i=0,n-1 do
local result, id, value = setting_ini:r_line(section_name,i,"","")
local smrt_names = utils.parse_names(value)
for k,v in pairs(smrt_names) do
local smart = self.smarts_by_names[v]
if smart == nil then
abort("Wrong smart name [%s] in start position", tostring(v))
end
local squad = self:create_squad(smart, id)
self:enter_smart(squad, smart.id)
--squad:update()
end
end
end
end
--' Âîçâðàòèòü ñìàðò ïî åãî èìåíè.
function sim_board:get_smart_by_name(name)
return self.smarts_by_names[name]
end
--' Âîçâðàùàåò êîëè÷åñòâî îòðÿäîâ â ñìàðòå.
function sim_board:get_smart_population(smart)
return self.smarts[smart.id].stayed_squad_quan
end
--' Ïîëó÷åíèå èãðîâîãî ïîëÿ.
function get_sim_board()
if board == nil then
board = sim_board()
end
return board
end
function sim_board:get_squad_target(squad)
--printf("List of available target for %s", squad.id)
local available_targets = {}
local most_priority_task = nil
local max_prior = 0
for k,v in pairs(simulation_objects.get_sim_obj_registry().objects) do
local curr_prior = 0
-- Ïðîâåðêà ïðîòèâ âûäà÷è òàñêà íà ñåáÿ.
if v.id ~= squad.id then
curr_prior = v:evaluate_prior(squad)
end
if curr_prior > 0 then
local target_tbl = {prior = curr_prior, target = v}
table.insert(available_targets, target_tbl)
end
end
if #available_targets > 0 then
table.sort(available_targets, function(a,b) return a.prior > b.prior end)
local max_id = math.floor(0.3 * #available_targets)
if max_id == 0 then max_id = 1 end
most_priority_task = available_targets[math.random(max_id)].target
end
--print_table(available_targets)
--printf("end of List of available target for %s", squad.id)
return most_priority_task or (squad.smart_id and alife():object(squad.smart_id)) or squad
end
local targets_by_squad_id = {}
--[[function sim_board:reset_targets()
for k,v in pairs(self.squads) do
end]]--
--' Îáíóëåíèå ñïèñêà íà ñîçäàíèè èãðû.
function clear()
board = nil
end
--' Òåñòîâûå ôóíêöèè
function print()
--print_table(get_sim_board().smarts)
end