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,810 @@
--'-------------------------------------------------------------------------------------------------------------------
--' Ñõåìà îçâó÷êè
--' àâòîð: Äèäåíêî Ðóñëàí (Stohe)
--'--------------------------------------------------------------------------------------------------------------------
nstl = 64
theme = {}
local sounds_base = stalker_ids.sound_script + 10000
function id()
sounds_base = sounds_base + 1
return sounds_base - 1
end
--function printf()
--end
--'--------------------------------------------------------------------------------------------------------------------
--' Êëàññ "çâóêîâàÿ êîëëåêöèÿ ñòàëêåðà"
--'--------------------------------------------------------------------------------------------------------------------
class "npc_sound"
function npc_sound:__init(snd_ini, section)
self.class_id = "npc_sound"
--' Ïàðàìåòðû âû÷èòûâàíèÿ çâóêà
self.prefix = utils.cfg_get_bool(snd_ini, section, "npc_prefix", nil, false, false)
self.path = utils.cfg_get_string(snd_ini, section, "path", nil, true, "")
self.shuffle = utils.cfg_get_string(snd_ini, section, "shuffle", nil, false, "", "rnd")
self.group_snd = utils.cfg_get_bool(snd_ini, section, "group_snd", nil, false, false)
self.play_always = utils.cfg_get_bool(snd_ini, section, "play_always", nil, false, false)
self.is_combat_sound = utils.cfg_get_bool(snd_ini, section, "is_combat_sound", nil, false, false)
self.section = section
--' Õðàíèò ïàðàìåòðû çâóêà äëÿ êàæäîãî NPC
self.npc = {}
self.played_id = nil
-- Âðåìÿ çàäåðæêè íà÷àëà îòûãðûâàíèÿ çâóêà
self.delay_sound = utils.cfg_get_number(snd_ini, section, "delay_sound", self.npc, false, 0)
--' Èíòåðâàë ïðîèãðûâàíèÿ çâóêà
local interval = parse_names(utils.cfg_get_string(snd_ini, section, "idle", nil, false, "", "3,5,100"))
self.min_idle = tonumber(interval[1])
self.max_idle = tonumber(interval[2])
self.rnd = tonumber(interval[3])
self.can_play_group_sound = true
self.can_play_sound = {}
self.sound_path = {}
self.faction = utils.cfg_get_string(snd_ini, section, "faction", nil, false, "", "")
self.point = utils.cfg_get_string(snd_ini, section, "point", nil, false, "", "")
self.msg = utils.cfg_get_string(snd_ini, section, "message", nil, false, "", "")
local avail_communities = parse_names(utils.cfg_get_string(snd_ini, section, "avail_communities", nil, false, "", "stalker, ecolog, bandit, dolg, freedom, army, zombied, monolith, killer"))
self.avail_communities = {}
for k,v in pairs(avail_communities) do
self.avail_communities[v] = true
end
end
function npc_sound:reset(npc_id)
local npc = db.storage[npc_id] and db.storage[npc_id].object
self.played_time = nil
self.played_id = nil
self.can_play_group_sound = true
self.can_play_sound[npc_id] = true
if npc ~= nil then
npc:set_sound_mask(-1)
npc:set_sound_mask(0)
end
if self.pda_snd_obj ~= nil then
self.pda_snd_obj:stop()
self.pda_snd_obj = nil
end
end
function npc_sound:is_playing(npc_id)
-- Ïðîâåðêà èãðàåòñÿ ëè ñåé÷àñ çâóê ó íïñ
local obj = db.storage[npc_id] and db.storage[npc_id].object
if obj == nil then
return false
end
return obj:active_sound_count() ~= 0 or (self.pda_snd_obj and self.pda_snd_obj:playing())
end
function npc_sound:init_npc(npc)
--printf("Init %s snd NPC %s", self.section, npc:name())
local npc_id = npc:id()
self.npc[npc_id] = {}
self.sound_path[npc_id] = {}
local character_prefix
if self.prefix == false then
character_prefix = npc:sound_prefix()
npc:sound_prefix("characters_voice\\")
end
self.npc[npc_id].id = id()
if self.is_combat_sound then
self.npc[npc_id].max = npc:add_combat_sound(self.path, nstl, snd_type.talk, 2, 1, self.npc[npc_id].id,"bip01_head") - 1
else
self.npc[npc_id].max = npc:add_sound(self.path, nstl, snd_type.talk, 2, 1, self.npc[npc_id].id) - 1
end
local f = getFS()
if f:exist("$game_sounds$",npc:sound_prefix()..self.path..".ogg") ~= nil then
self.sound_path[npc_id][1] = npc:sound_prefix()..self.path
-- printf("adding sound ["..npc:sound_prefix()..self.path.."]")
else
local num = 1
while f:exist("$game_sounds$",npc:sound_prefix()..self.path..num..".ogg") do
-- printf("adding sound ["..npc:sound_prefix()..self.path..num.."] to table id = "..num)
self.sound_path[npc_id][num] = npc:sound_prefix()..self.path..num
num = num + 1
end
end
if self.npc[npc_id].max < 0 then
abort("Couldnt find sounds %s with prefix %s", tostring(self.path), npc:sound_prefix())
end
if self.prefix == false then
npc:sound_prefix(character_prefix)
end
if self.group_snd then
self.can_play_group_sound = true
else
if self.can_play_sound[npc_id] ~= false then
self.can_play_sound[npc_id] = true
end
end
end
function npc_sound:callback(npc_id)
self.played_time = time_global()
self.idle_time = math.random(self.min_idle, self.max_idle) * 1000
if self.group_snd then
self.can_play_group_sound = true
else
self.can_play_sound[npc_id] = true
end
-- printf("npc_sound:callback!!!!!!!!")
get_hud():RemoveCustomStatic("cs_subtitles_npc")
local st = db.storage[npc_id]
if st.active_scheme == nil then
return
end
if st[st.active_scheme].signals == nil then
return
end
-- Çàòû÷êà ïðîòèâ âîçìîæíîãî âûëåòà, êîãäà ïðèõîäèò êîëáåê îò çâóêà, êîòîðûé äàííûé ÍÏÑ íå èãðàåò.
if self.npc[npc_id] == nil then
return
end
if self.played_id == self.npc[npc_id].max and self.shuffle ~= "rnd" then
-- printf("npc [%s] signalled [theme_end] for snd [%s]", npc_id, self.section)
st[st.active_scheme].signals["theme_end"] = true
st[st.active_scheme].signals["sound_end"] = true
else
-- printf("npc [%s] signalled [sound_end] for snd [%s]", npc_id, self.section)
st[st.active_scheme].signals["sound_end"] = true
end
end
function npc_sound:play(npc_id, faction, point, msg)
local npc = db.storage[npc_id] and db.storage[npc_id].object
if npc == nil then
--printf("coudnt find npc!!!")
return false
end
-- if not self.play_always then
if self.group_snd then
if not self.can_play_group_sound then
--printf("coudnt play snd1!!!")
return false
end
else
if not self.can_play_sound[npc_id] then
--printf("coudnt play snd1!!!")
return false
end
end
-- end
if self.played_time ~= nil and time_global() - self.played_time < self.idle_time
then
--printf("coudnt play snd2!!!")
return false
end
self.played_time = nil
local npc_data = self.npc[npc_id]
if(npc_data==nil) then
--printf("coudnt play nodata!!!")
return false
end
--' Âûáîð çâóêà, êîòîðûé èãðàòü.
self.played_id = self:select_next_sound(npc_id)
if self.played_id == -1 then
--printf("coudnt play snd3!!!")
--' Ïðîïóñêàåì.
return false
end
--printf("playing sound "..self.played_id)
if npc ~= nil then
-- play_sound (u32 internal_type, u32 max_start_time, u32 min_start_time, u32 max_stop_time, u32 min_stop_time, u32 id)
npc:play_sound(npc_data.id, self.delay_sound+0.06, self.delay_sound+0.05, 1, 0, self.played_id)
end
local table_id = self.played_id + 1
local snd = self.sound_path[npc_id][table_id]
-- ïðîâåðêà íà ñóùåñòâîâàíèå çâóêà äóáëèðóþùåãî îñíîâíîé ïî ÏÄÀ. Åñëè îí åñòü òî èãðàòü åãî.
local f = getFS()
if snd and f:exist("$game_sounds$", snd.."_pda.ogg") ~= nil and npc:position():distance_to_sqr(db.actor:position()) >= 100 then
if self.pda_snd_obj ~= nil and self.pda_snd_obj:playing() then
self.pda_snd_obj:stop()
end
self.pda_snd_obj = sound_object(snd.."_pda")
--play_at_pos(CScriptGameObject *object, const Fvector &position, float delay, int flags)
self.pda_snd_obj:play_at_pos(db.actor, vector():set(0,0,0), self.delay_sound, sound_object.s2d)
self.pda_snd_obj.volume = 0.8
end
--printf("snd_path is "..tostring(self.sound_path[npc_id][table_id]))
local snd_st, num_copy = string.gsub(snd, "\\", "_")
if self.group_snd then
self.can_play_group_sound = false
else
self.can_play_sound[npc_id] = false
end
if game.translate_string(snd_st) ~= snd_st then
if not faction then
faction = character_community(npc)
end
if not point then
point = npc:profile_name().."_name"
if game.translate_string(point) == point then
point = nil
end
end
news_manager.send_sound(npc, faction, point, snd, snd_st, self.delay_sound)
else
news_manager.send_sound(npc, faction, point, snd, nil , self.delay_sound)
end
return true
end
function npc_sound:select_next_sound(npc_id)
local npc_data = self.npc[npc_id]
if self.shuffle == "rnd" then
if npc_data.max == 0 then
return 0
end
if self.played_id ~= nil then
local played_id = math.random(0,npc_data.max - 1)
if played_id >= self.played_id then
return played_id + 1
end
return played_id
end
return math.random(0,npc_data.max)
end
if self.shuffle == "seq" then
if self.played_id == -1 then
return -1
end
if self.played_id == nil then
return 0
end
if self.played_id < npc_data.max then
return self.played_id + 1
end
return -1
end
if self.shuffle == "loop" then
if self.played_id == nil then
return 0
end
if self.played_id < npc_data.max then
return self.played_id + 1
end
return 0
end
end
function npc_sound:stop(obj_id)
local npc = db.storage[obj_id] and db.storage[obj_id].object
if npc ~= nil and npc:alive() then
npc:set_sound_mask(-1)
npc:set_sound_mask(0)
end
if self.pda_snd_obj ~= nil and self.pda_snd_obj:playing() then
self.pda_snd_obj:stop()
self.pda_snd_obj = nil
end
end
function npc_sound:save(thread)
-- set_save_marker(thread, "save", false, "npc_sound")
thread:w_stringZ(tostring(self.played_id))
if self.group_snd then
thread:w_bool(self.can_play_group_sound)
end
-- set_save_marker(thread, "save", true, "npc_sound")
end
function npc_sound:load(thread)
-- set_save_marker(thread, "load", false, "npc_sound")
local id = thread:r_stringZ()
if(id~="nil") then
self.played_id = tonumber(id)
else
self.played_id = nil
end
if self.group_snd then
self.can_play_group_sound = thread:r_bool()
end
-- set_save_marker(thread, "load", true, "npc_sound")
end
function npc_sound:save_npc(thread, npc_id)
-- set_save_marker(thread, "save", false, "npc_sound_save_npc")
if not self.group_snd then
thread:w_bool(self.can_play_sound[npc_id] == true)
end
-- set_save_marker(thread, "save", true, "npc_sound_save_npc")
end
function npc_sound:load_npc(thread, npc_id)
-- set_save_marker(thread, "load", false, "npc_sound_save_npc")
if not self.group_snd then
self.can_play_sound[npc_id] = thread:r_bool()
end
-- set_save_marker(thread, "load", true, "npc_sound_save_npc")
end
--'--------------------------------------------------------------------------------------------------------------------
--' Êëàññ "çâóêîâàÿ êîëëåêöèÿ èãðîêà"
--'--------------------------------------------------------------------------------------------------------------------
class "actor_sound"
function actor_sound:__init(snd_ini, section)
self.class_id = "actor_sound"
--' Ïàðàìåòðû âû÷èòûâàíèÿ çâóêà
self.stereo = utils.cfg_get_bool(snd_ini, section, "actor_stereo", nil, false, false)
self.prefix = utils.cfg_get_bool(snd_ini, section, "npc_prefix", nil, false, false)
self.path = utils.cfg_get_string(snd_ini, section, "path", nil, true, "")
self.shuffle = utils.cfg_get_string(snd_ini, section, "shuffle", nil, false, "", "rnd")
self.play_always = utils.cfg_get_bool(snd_ini, section, "play_always", nil, false, false)
self.section = section
self.played_id = nil
if self.prefix then
self.path = "characters_voice\\"..self.path
end
--' Èíòåðâàë ïðîèãðûâàíèÿ çâóêà
local interval = parse_names(utils.cfg_get_string(snd_ini, section, "idle", nil, false, "", "3,5,100"))
self.min_idle = tonumber(interval[1])
self.max_idle = tonumber(interval[2])
self.rnd = tonumber(interval[3])
self.sound = {}
self.snd_obj = nil
self.can_play_sound = true
self.faction = utils.cfg_get_string(snd_ini, section, "faction", nil, false, "", "")
self.point = utils.cfg_get_string(snd_ini, section, "point", nil, false, "", "")
self.msg = utils.cfg_get_string(snd_ini, section, "message", nil, false, "", "")
local f = getFS()
if f:exist("$game_sounds$",self.path..".ogg") ~= nil then
self.sound[1] = self.path
else
local num = 1
while f:exist("$game_sounds$",self.path..num..".ogg") do
self.sound[num] = self.path..num
num = num + 1
end
end
if #self.sound == 0 then
abort("There are no sound collection with path: %s", self.path)
end
end
function actor_sound:callback(npc_id)
self.played_time = time_global()
self.idle_time = math.random(self.min_idle, self.max_idle) * 1000
self.snd_obj = nil
self.can_play_sound = true
get_hud():RemoveCustomStatic("cs_subtitles_actor")
-- printf("actor_sound:callback from [%s]", npc_id)
local st = db.storage[npc_id]
if st.active_scheme == nil then
return
end
if st[st.active_scheme].signals == nil then
-- printf("SOUND_THEME: There is no signals in this scheme [%s]", st.active_scheme)
return
end
if self.played_id == #self.sound and self.shuffle ~= "rnd" then
printf("actor_sound:object [%s] signalled 'theme_end' in section [%s]", npc_id, st.active_section)
st[st.active_scheme].signals["theme_end"] = true
st[st.active_scheme].signals["sound_end"] = true
else
printf("actor_sound:object [%s] signalled 'sound_end' in section [%s]", npc_id, st.active_section)
st[st.active_scheme].signals["sound_end"] = true
end
end
function actor_sound:is_playing ()
if(self.snd_obj~=nil) then
return self.snd_obj:playing()
else
return false
end
end
function actor_sound:play(npc, faction, point, msg)
--printf("PLAY ACTOR SOUND")
if not self.can_play_sound then
printf("self.can_play_sound == false")
return false
end
if self.played_time ~= nil and time_global() - self.played_time < self.idle_time
then
--printf("self.idle_time not reached!!")
return false
end
self.played_time = nil
--' Âûáîð çâóêà, êîòîðûé èãðàòü.
self.played_id = self:select_next_sound()
if self.played_id == -1 then
--' Ïðîïóñêàåì.
return false
end
local snd = self.sound[self.played_id]
self.snd_obj = sound_object(snd)
self.snd_obj.volume = 0.8
self.snd_obj:play_at_pos(db.actor, vector():set(0,0,0), 0, sound_object.s2d)
self.snd_obj.volume = 0.8
local snd_st, num_copy = string.gsub(snd, "\\", "_")
--[[
if game.translate_string(snd_st) ~= snd_st then
local hud_demo = get_hud()
--printf("uraaaa!!!")
self.custom_static_demo = hud_demo:GetCustomStatic("cs_subtitles_actor")
if self.custom_static_demo == nil then
hud_demo:AddCustomStatic("cs_subtitles_actor", true)
self.custom_static_demo = hud_demo:GetCustomStatic("cs_subtitles_actor")
end
self.custom_static_demo:wnd():SetTextST(snd_st)
end
]]
self.can_play_sound = false
news_manager.send_sound(nil, faction, point, snd)
return true
end
function actor_sound:reset(npc_id)
self.played_time = nil
self.played_id = nil
end
function actor_sound:select_next_sound()
local sound_table_size = #self.sound
if self.shuffle == "rnd" then
if sound_table_size == 1 then
return 1
end
if self.played_id ~= nil then
local played_id = math.random(1,sound_table_size - 1)
if played_id >= self.played_id then
return played_id + 1
end
return played_id
end
return math.random(1,sound_table_size)
end
if self.shuffle == "seq" then
if self.played_id == -1 then
return -1
end
if self.played_id == nil then
return 1
end
if self.played_id < sound_table_size then
return self.played_id + 1
end
return -1
end
if self.shuffle == "loop" then
if self.played_id == nil then
return 1
end
if self.played_id < sound_table_size then
return self.played_id + 1
end
return 1
end
end
function actor_sound:stop()
if self.snd_obj ~= nil then
self.snd_obj:stop()
end
end
function actor_sound:save(thread)
-- set_save_marker(thread, "save", false, "actor_sound")
thread:w_stringZ(tostring(self.played_id))
-- set_save_marker(thread, "save", true, "actor_sound")
end
function actor_sound:load(thread)
-- set_save_marker(thread, "load", false, "actor_sound")
local id = thread:r_stringZ()
if(id~="nil") then
self.played_id = tonumber(id)
else
self.played_id = nil
end
-- set_save_marker(thread, "load", true, "actor_sound")
end
function actor_sound:save_npc(thread)
end
function actor_sound:load_npc(thread)
end
--'--------------------------------------------------------------------------------------------------------------------
--' Êëàññ "çâóêîâàÿ êîëëåêöèÿ îáúåêòà"
--'--------------------------------------------------------------------------------------------------------------------
class "object_sound"
function object_sound:__init(snd_ini, section)
self.class_id = "object_sound"
--' Ïàðàìåòðû âû÷èòûâàíèÿ çâóêà
self.path = utils.cfg_get_string(snd_ini, section, "path", nil, true, "")
self.shuffle = utils.cfg_get_string(snd_ini, section, "shuffle", nil, false, "", "rnd")
--' Èíòåðâàë ïðîèãðûâàíèÿ çâóêà
local interval = parse_names(utils.cfg_get_string(snd_ini, section, "idle", nil, false, "", "3,5,100"))
self.min_idle = tonumber(interval[1])
self.max_idle = tonumber(interval[2])
self.rnd = tonumber(interval[3])
self.sound = {}
self.snd_obj = nil
self.can_play_sound = true
self.section = section
self.played_id = nil
self.faction = utils.cfg_get_string(snd_ini, section, "faction", nil, false, "", "")
self.point = utils.cfg_get_string(snd_ini, section, "point", nil, false, "", "")
self.msg = utils.cfg_get_string(snd_ini, section, "message", nil, false, "", "")
local f = getFS()
if f:exist("$game_sounds$",self.path..".ogg") ~= nil then
self.sound[1] = self.path
else
local num = 1
while f:exist("$game_sounds$",self.path..num..".ogg") do
self.sound[num] = self.path..num
num = num + 1
end
end
if #self.sound == 0 then
abort("There are no sound collection with path: %s", self.path)
end
end
function object_sound:callback(npc_id)
self.played_time = time_global()
self.idle_time = math.random(self.min_idle, self.max_idle) * 1000
self.snd_obj = nil
self.can_play_sound = true
-- printf("object_sound:callback for object !!!!!!!!")
get_hud():RemoveCustomStatic("cs_subtitles_object")
local st = db.storage[npc_id]
if st.active_scheme == nil then
return
end
if st[st.active_scheme].signals == nil then
return
end
if self.played_id == #self.sound and self.shuffle ~= "rnd" then
st[st.active_scheme].signals["theme_end"] = true
st[st.active_scheme].signals["sound_end"] = true
else
st[st.active_scheme].signals["sound_end"] = true
end
end
function object_sound:is_playing ()
if(self.snd_obj~=nil) then
return self.snd_obj:playing()
else
return false
end
end
function object_sound:play(obj_id, faction, point, msg)
local obj = db.storage[obj_id] and db.storage[obj_id].object
if obj == nil then
return false
end
if not self.can_play_sound then return false end
if self.played_time ~= nil and time_global() - self.played_time < self.idle_time
then
return false
end
self.played_time = nil
--' Âûáîð çâóêà, êîòîðûé èãðàòü.
self.played_id = self:select_next_sound()
if self.played_id == -1 then
--' Ïðîïóñêàåì.
return false
end
-- printf("object played_id = %s", self.played_id)
local snd = self.sound[self.played_id]
local f = getFS()
if snd and f:exist("$game_sounds$", snd.."_pda.ogg") ~= nil and obj:position():distance_to_sqr(db.actor:position()) >= 5 then
self.pda_snd_obj = sound_object(snd.."_pda")
self.pda_snd_obj:play_at_pos(db.actor, vector():set(0,0,0), 0, sound_object.s2d)
self.pda_snd_obj.volume = 0.8
end
self.snd_obj = sound_object(snd)
self.snd_obj:play_at_pos(obj, obj:position(), 0, sound_object.s3d)
local snd_st, num_copy = string.gsub(snd, "\\", "_")
--[[
if game.translate_string(snd_st) ~= snd_st then
local hud_demo = get_hud()
-- printf("uraaaa!!!")
self.custom_static_demo = hud_demo:GetCustomStatic("cs_subtitles_object")
if self.custom_static_demo == nil then
hud_demo:AddCustomStatic("cs_subtitles_object", true)
self.custom_static_demo = hud_demo:GetCustomStatic("cs_subtitles_object")
end
self.custom_static_demo:wnd():SetTextST(snd_st)
end
]]
self.can_play_sound = false
news_manager.send_sound(nil, faction, point, snd)
return true
end
function object_sound:select_next_sound()
local sound_table_size = #self.sound
if self.shuffle == "rnd" then
if sound_table_size == 1 then
return 1
end
if self.played_id ~= nil then
local played_id = math.random(1,sound_table_size - 1)
if played_id >= self.played_id then
return played_id + 1
end
return played_id
end
return math.random(1,sound_table_size)
end
if self.shuffle == "seq" then
if self.played_id == -1 then
return -1
end
if self.played_id == nil then
return 1
end
if self.played_id < sound_table_size then
return self.played_id + 1
end
return -1
end
if self.shuffle == "loop" then
if self.played_id == nil then
return 1
end
if self.played_id < sound_table_size then
return self.played_id + 1
end
return 1
end
end
function object_sound:stop()
if self.snd_obj ~= nil then
self.snd_obj:stop()
end
if self.pda_snd_obj ~= nil and self.pda_snd_obj:playing() then
self.pda_snd_obj:stop()
self.pda_snd_obj = nil
end
end
function object_sound:save(thread)
-- set_save_marker(thread, "save", false, "object_sound")
thread:w_stringZ(tostring(self.played_id))
-- set_save_marker(thread, "save", true, "object_sound")
end
function object_sound:load(thread)
-- set_save_marker(thread, "load", false, "object_sound")
local id = thread:r_stringZ()
if(id~="nil") then
self.played_id = tonumber(id)
else
self.played_id = nil
end
-- set_save_marker(thread, "load", true, "object_sound")
end
function object_sound:save_npc(thread)
end
function object_sound:load_npc(thread)
end
--'--------------------------------------------------------------------------------------------------------------------
--' Êëàññ "çàöèêëåííûé çâóê"
--'--------------------------------------------------------------------------------------------------------------------
class "looped_sound"
function looped_sound:__init(snd_ini, section)
self.class_id = "looped_sound"
--' Ïàðàìåòðû âû÷èòûâàíèÿ çâóêà
self.path = utils.cfg_get_string(snd_ini, section, "path", nil, true, "")
self.sound = nil
self.snd_obj = nil
self.section = section
local f = getFS()
if f:exist("$game_sounds$",self.path..".ogg") ~= nil then
self.sound = self.path
end
if self.sound == nil then
abort("There are no looped sound with path: %s", self.path)
end
end
function looped_sound:is_playing ()
if(self.snd_obj~=nil) then
return self.snd_obj:playing()
else
return false
end
end
function looped_sound:stop ()
if self.snd_obj ~= nil then
self.snd_obj:stop()
end
end
function looped_sound:set_volume (level)
self.snd_obj.volume = level
end
function looped_sound:play(obj_id)
local obj = db.storage[obj_id].object
if obj == nil then
return
end
self.snd_obj = sound_object(self.sound)
self.snd_obj:play_at_pos(obj, obj:position(), 0, sound_object.s3d + sound_object.looped)
return true
end
function looped_sound:save(thread)
-- set_save_marker(thread, "save", false, "looped_sound")
-- set_save_marker(thread, "save", true, "looped_sound")
end
function looped_sound:load(thread)
-- set_save_marker(thread, "load", false, "looped_sound")
-- set_save_marker(thread, "load", true, "looped_sound")
end
function looped_sound:save_npc(thread)
end
function looped_sound:load_npc(thread)
end
--'--------------------------------------------------------------------------------------------------------------------
--' Çàãðóçêà çâóêîâ
--'--------------------------------------------------------------------------------------------------------------------
function load_sound()
local snd_ini = ini_file("misc\\script_sound.ltx")
--' Èòåðèðóåìñÿ ïî ñïèñêó òåì.
if not snd_ini:section_exist("list") then
abort("There is no section [list] in script_sound.ltx")
end
local n = snd_ini:line_count("list")
local id, value = "",""
local category = ""
--' íà÷àëüíàÿ óñòàíîâêà
theme = {}
for i=0,n-1 do
result, section, value = snd_ini:r_line("list",i,"","")
local type = utils.cfg_get_string(snd_ini, section, "type", db.actor, true, "")
--' Îïðåäåëÿåì òèï çâóêà.
if type == "npc" then
theme[section] = npc_sound(snd_ini, section)
elseif type == "actor" then
theme[section] = actor_sound(snd_ini, section)
elseif type == "3d" then
theme[section] = object_sound(snd_ini, section)
elseif type == "looped" then
theme[section] = looped_sound(snd_ini, section)
end
end
end
--' Çàãðóçêà çâóêîâ ÍÏÑ
function init_npc_sound(npc)
for k,v in pairs(theme) do
if v.init_npc then
--printf("checking %s for %s (%s)", v.section, npc:name(), character_community(npc))
if v.avail_communities[character_community(npc)] ~= nil then
v:init_npc(npc)
end
end
end
end