add game&rawdata
This commit is contained in:
parent
0133cd976c
commit
49b34b5546
45731 changed files with 709831 additions and 0 deletions
810
gamedata/scripts/sound_theme.script
Normal file
810
gamedata/scripts/sound_theme.script
Normal 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
|
||||
Loading…
Add table
Add a link
Reference in a new issue