add game&rawdata
This commit is contained in:
parent
0133cd976c
commit
49b34b5546
45731 changed files with 709831 additions and 0 deletions
271
gamedata/scripts/death_manager.script
Normal file
271
gamedata/scripts/death_manager.script
Normal file
|
|
@ -0,0 +1,271 @@
|
|||
|
||||
--' Êëþ÷åì ÿâëÿåòñÿ ãðóïïèðîâêà ïåðñîíàæà. Çíà÷åíèåì ÿâëÿåòñÿ òàáëèöà, ñîäåðæàøàÿ èìåíà ñåêöèé ïðåäìåòîâ.
|
||||
local item_by_community = {}
|
||||
|
||||
--' Çàâèñèìîñòè â ñïàóíå ïðåäìåòîâ. Ïðåäìåò ñïàóíèòüñÿ òîëüêî åñëè åñòü õîòÿ áû îäèí èç çàâèñèìûõ.
|
||||
local item_dependence = {}
|
||||
|
||||
--' Ìíîæèòåëè è ìèíèìàêñû äëÿ âûïàäåíèÿ âåùåé â çàâèñèìîñòè îò óðîâíÿ
|
||||
local mul_by_level = {}
|
||||
local count_by_level = {}
|
||||
|
||||
--' Ïðåäìåòû, êîòîðûå íåëüçÿ óäàëÿòü (êâåñòîâûå íàïðèìåð)
|
||||
local always_keep_item = {}
|
||||
|
||||
--' Ïðåäìåòû, îòíîñÿùèåñÿ ê ïàòðîíàì. Èõ íàäî ñïàóíèòü äðóãèì ìåòîäîì.
|
||||
ammo_sections = {}
|
||||
|
||||
local death_ini = ini_file("misc\\death_generic.ltx")
|
||||
|
||||
|
||||
function init_drop_settings()
|
||||
local community_list = { "stalker", "dolg", "freedom", "bandit", "army", "zombied", "ecolog", "killer", "monolith" }
|
||||
|
||||
for k,v in pairs(community_list) do
|
||||
--' Íåîáõîäèìî çàïîëíèòü òàáëèöó
|
||||
item_by_community[v] = {}
|
||||
if death_ini:section_exist(v) then
|
||||
local n = death_ini:line_count(v)
|
||||
local id, value = "", ""
|
||||
for i=0,n-1 do
|
||||
result, id, value = death_ini:r_line(v,i,"","")
|
||||
item_by_community[v][id] = 100*tonumber(value)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
--' Çàïîëíÿåì òàáëèöó çàâèñèìîñòåé
|
||||
local n = death_ini:line_count("item_dependence")
|
||||
local id, value = "", ""
|
||||
for i=0,n-1 do
|
||||
result, id, value = death_ini:r_line("item_dependence",i,"","")
|
||||
item_dependence[id] = {}
|
||||
local vvv = parse_names(value)
|
||||
for k,v in pairs(vvv) do
|
||||
item_dependence[id][v] = true
|
||||
end
|
||||
end
|
||||
|
||||
--' Ìíîæèòåëè è ìèíèìàêñû äëÿ âûïàäåíèÿ âåùåé â çàâèñèìîñòè îò óðîâíÿ
|
||||
local level_name = level.name()
|
||||
|
||||
if not death_ini:section_exist(level_name) then
|
||||
level_name = "default"
|
||||
end
|
||||
|
||||
local n = death_ini:line_count(level_name)
|
||||
local id, value = "", ""
|
||||
for i=0,n-1 do
|
||||
result, id, value = death_ini:r_line(level_name,i,"","")
|
||||
mul_by_level[id] = tonumber(value)
|
||||
end
|
||||
|
||||
local item_count_section = "item_count_" .. level.get_game_difficulty()
|
||||
local n = death_ini:line_count(item_count_section)
|
||||
for i=0,n-1 do
|
||||
result, id, value = death_ini:r_line(item_count_section,i,"","")
|
||||
--' Íóæíî ðàñïàðñèòü value â äâà çíà÷åíèÿ
|
||||
local t = parse_nums(value)
|
||||
if t[1] == nil then
|
||||
abort("Error on [death_ini] declaration. Section [%s], line [%s]", item_count_section, tostring(id))
|
||||
end
|
||||
local min = t[1]
|
||||
local max = t[2]
|
||||
if max == nil then
|
||||
max = min
|
||||
end
|
||||
|
||||
if mul_by_level[id] == nil then
|
||||
mul_by_level[id] = 0
|
||||
end
|
||||
|
||||
min = tonumber(min) * mul_by_level[id]
|
||||
max = tonumber(max) * mul_by_level[id]
|
||||
|
||||
count_by_level[id] = {min = min, max = max}
|
||||
end
|
||||
|
||||
--' Ïðåäìåòû, êîòîðûå íåëüçÿ óäàëÿòü (êâåñòîâûå íàïðèìåð)
|
||||
local n = death_ini:line_count("keep_items")
|
||||
for i=0,n-1 do
|
||||
result, id, value = death_ini:r_line("keep_items",i,"","")
|
||||
if value == "true" then
|
||||
always_keep_item[id] = true
|
||||
end
|
||||
end
|
||||
|
||||
--' Ïðåäìåòû, îòíîñÿùèåñÿ ê ïàòðîíàì. Èõ íàäî ñïàóíèòü äðóãèì ìåòîäîì.
|
||||
ammo_sections = {}
|
||||
local n = death_ini:line_count("ammo_sections")
|
||||
local id, value = "", ""
|
||||
for i=0,n-1 do
|
||||
result, id, value = death_ini:r_line("ammo_sections",i,"","")
|
||||
ammo_sections[id] = true
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
|
||||
class "drop_manager"
|
||||
function drop_manager:__init(npc)
|
||||
self.npc = npc
|
||||
end
|
||||
function drop_manager:create_release_item()
|
||||
--' Ñïðàøèâàåì ó ñåðâåðíîãî îáúåêòà ãåíåðèëèñü ëè ïðåäìåòû
|
||||
local se_obj = alife():object(self.npc:id())
|
||||
if se_obj == nil or se_obj.death_droped == true then
|
||||
return
|
||||
end
|
||||
se_obj.death_droped = true
|
||||
|
||||
--' Çàïóñêàåì èòåðàòîð íà óäàëåíèå ïðåäìåòîâ
|
||||
self.npc:iterate_inventory(keep_item, self.npc)
|
||||
|
||||
--' Ïðîâåðêà íà îòñóòñòâèå ñïàóíà ëóòà
|
||||
local ini = self.npc:spawn_ini()
|
||||
|
||||
if ini and ini:section_exist("dont_spawn_loot") then
|
||||
return
|
||||
end
|
||||
local st = db.storage[self.npc:id()]
|
||||
local st_ini = st and st.ini
|
||||
if st_ini and st_ini:line_exist(st.section_logic , "dont_spawn_loot") then
|
||||
return
|
||||
end
|
||||
|
||||
--' Äîñïàâíèâàåì íåîáõîäèìîå êîëè÷åñòâî èòåìîâ:
|
||||
--' Íåîáõîäèìî ñîñòàâèòü ñïèñîê îáúåêòîâ êîòîðûå ìîãóò áûòü çàñïàâíåíû äëÿ ïåðñîíàæà
|
||||
|
||||
local spawn_items = item_by_community[character_community(self.npc)]
|
||||
if spawn_items == nil then
|
||||
return
|
||||
end
|
||||
for k,v in pairs(spawn_items) do
|
||||
--' Ïî êàæäîìó îáúåêòó íåîáõîäèìî ïîëó÷èòü çàâèñèìîñòè
|
||||
if check_item_dependence(self.npc, k) == true then
|
||||
--' Ïî êàæäîìó îáúåêòó íåîáõîäèìî ïîëó÷èòü êîëè÷åñòâî
|
||||
if count_by_level[k] == nil then
|
||||
abort("Incorrect count settings in death_manager for object[%s]", k)
|
||||
end
|
||||
local number = math.ceil(math.random(count_by_level[k].min, count_by_level[k].max))
|
||||
--' Íåîáõîäèìî çàñïàâíèòü íóæíîå êîëè÷åñòâî.
|
||||
create_items(self.npc, k, number, v)
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
--' Ôóíêöèÿ âûçûâàåòñÿ äëÿ êàæäîãî ïðåäìåòà, åñëè âåðíåò false òî ïðåäìåò óäàëèòñÿ.
|
||||
function keep_item(npc, item)
|
||||
local section = item:section()
|
||||
|
||||
local ini = npc:spawn_ini()
|
||||
|
||||
if ini and ini:section_exist("keep_items")
|
||||
and section ~= "guitar_a"
|
||||
and section ~= "harmonica_a"
|
||||
and section ~= "wpn_binoc"
|
||||
and section ~= "device_torch"
|
||||
and section ~= "device_pda" then
|
||||
return
|
||||
end
|
||||
|
||||
if isArtefact(item) then
|
||||
return
|
||||
end
|
||||
-- printf("keep_item:item ["..item:name().."] npc_name ["..npc:name().."]")
|
||||
if section == "bolt" then
|
||||
return
|
||||
end
|
||||
|
||||
if always_keep_item[section] == true then
|
||||
return
|
||||
end
|
||||
--printf("item name [%s]", item:name())
|
||||
if isWeapon(item) and not(get_clsid(item)==clsid.wpn_grenade_rgd5_s or get_clsid(item)==clsid.wpn_grenade_f1_s) then
|
||||
set_weapon_drop_condition(item)
|
||||
return
|
||||
end
|
||||
|
||||
if xr_corpse_detection.lootable_table[section] == true and ammo_sections[section] == nil then
|
||||
return
|
||||
end
|
||||
alife():release(alife():object(item:id()), true)
|
||||
|
||||
--[[
|
||||
local item_id = item:id()
|
||||
local item_in_slot = npc:item_in_slot(2)
|
||||
if item_in_slot ~= nil and item_in_slot:id() == item_id then
|
||||
--' Òóò íàäî óìåíüøèòü êîíäèøí îðóæèÿ
|
||||
item:set_condition((math.random(40)+40)/100)
|
||||
return
|
||||
end
|
||||
item_in_slot = npc:item_in_slot(3)
|
||||
if item_in_slot ~= nil and item_in_slot:id() == item_id then
|
||||
--' Òóò íàäî óìåíüøèòü êîíäèøí îðóæèÿ
|
||||
item:set_condition((math.random(40)+40)/100)
|
||||
return
|
||||
end
|
||||
|
||||
-- npc:mark_item_dropped(item)
|
||||
local item_in_slot = npc:item_in_slot(4)
|
||||
if item_in_slot ~= nil and item_in_slot:id() == item_id then
|
||||
return
|
||||
end
|
||||
if not npc:marked_dropped(item) then
|
||||
-- printf("releasing object ["..item:name().."]")
|
||||
alife():release(alife():object(item:id()), true)
|
||||
end
|
||||
]]
|
||||
end
|
||||
|
||||
function set_weapon_drop_condition(item)
|
||||
local condition = (math.random(40)+40)/100
|
||||
--printf("condition [%s]", tostring(condition))
|
||||
item:set_condition(condition)
|
||||
end
|
||||
|
||||
--' Ôóíêöèÿ ñïàâíèò íåîáõîäèìîå ÷èñëî ïðåäìåòîâ
|
||||
function create_items(npc, section, number, rnd)
|
||||
--'printf("create %s of %s", tostring(number), tostring(section))
|
||||
if ammo_sections[section] == true then
|
||||
if number > 0 then
|
||||
create_ammo(section,
|
||||
npc:position(),
|
||||
npc:level_vertex_id(),
|
||||
npc:game_vertex_id(),
|
||||
npc:id(),
|
||||
number)
|
||||
end
|
||||
else
|
||||
for i=1,number do
|
||||
--' Ïðîâåðÿåì âåðîÿòíîñòü ïîÿâèòü êàæäûé îáúåêò â îòäåëüíîñòè
|
||||
if math.random(100) <= rnd then
|
||||
alife():create(section,
|
||||
npc:position(),
|
||||
npc:level_vertex_id(),
|
||||
npc:game_vertex_id(),
|
||||
npc:id())
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
--' Ôóíêöèÿ ïðîâåðÿåò åñòü ëè õîòü îäèí èç çàâèñèìûõ îáúåêòîâ ó ïåðñîíàæà
|
||||
function check_item_dependence(npc, section)
|
||||
if item_dependence[section] == nil then
|
||||
return true
|
||||
end
|
||||
|
||||
local d_flag = true
|
||||
for k,v in pairs(item_dependence[section]) do
|
||||
local obj = npc:object(k)
|
||||
if obj ~= nil and npc:marked_dropped(obj) ~= true then
|
||||
return true
|
||||
end
|
||||
d_flag = false
|
||||
end
|
||||
|
||||
return d_flag
|
||||
end
|
||||
Loading…
Add table
Add a link
Reference in a new issue