☣Связанные Зоной☣Форум
?
  
  • Страница 1 из 1
  • 1
Модератор форума: Кракен, [Дядька]_ЯR  
Форум » S.T.A.L.K.E.R. - Зов Припяти » Модостроение » Создание радио. Статья от ак101
Создание радио. Статья от ак101
Не в Зоне slavapro




Когда то я уже писал тутор на эту тему, но в нем были допущены ошибки, вернее я не все написал.В этом туторе все исправлено!
Итак приступим:
Сначало в распакованном олл спавне, в файле alife_zaton.ltx добавим это
Хочу заметить что "поющим" можно зделать ВСЕ что угодно, даже чайник если прописать нужную ему логику.
Так дальше идем в папку /configs/scripts создаём там файл zaton_radio.ltx и в нём пишем
Code
[logic]  
  active = ph_sound  

  [ph_sound]  
  snd = music_radio  
  looped = false  
  min_idle = 300  
  max_idle = 500  
  random = true
Так теперь чешим в папку папку gamedata\sound\ characters_voice\scenario\ и создаем там папку zaton_radio после чего кидаем в эту папку музыкальные файлы в формате ogg и назовем их примерно так: zaton_1, zaton_2, zaton_3, zaton_4, zaton_5
Так теперь скрипты.
Идем в файл gamedata\script\sound_theme.script и там в самом начале после строчки theme = {} пишем это
Code
ph_snd_themes = {}  
  ph_snd_themes["music_radio"] = {  
  "characters_voice\\scenario\\zaton_radio\\zaton_5",  
  "characters_voice\\scenario\\zaton_radio\\zaton_4",  
  "characters_voice\\scenario\\za ton_radio\\zaton_3",  
  "characters_voice\\scenario\\zaton_radio\\zaton_2",  
  "characters_voice\\scenario\\zaton_radio\\zaton_1"  
  }
После последней строчки ЗАПЯТУЮ СТАВИТЬ НЕ НАДО!!!
Так ну теперь то что я не дописал в прошлый раз:
Открываем файл modules.script и там после строчки
load_scheme("ph_oscillate", "ph_oscillate", stype_item)
Пишем это
Code
load_scheme("ph_sound", "ph_sound", stype_item)
Теперь идем в файл xr_sound.script и в самый конец пишем это:
Code
Теперь идем в файл xr_sound.script и в самый конец пишем это:
Code
---------------------------------------------------------------------------------------------------------------------  
  -- Схема озвучки  
  -- автор: Диденко Руслан (Stohe)  
  -- update: Чугай Александр (Chugai)  
  ----------------------------------------------------------------------------------------------------------------------  
  key_by_id = {}  
  group_idle = {}  

  --function printf()  
  --end  

  function get_sound(path, tt, npc)  
  if path == nil then return nil end  
  if path.exec == nil then  
  -- чтение настроек темы  
  tt.into_id = path.into_id  
  tt.into_max = path.max_ids[npc:id()].into_max  
  tt.into_last = nil  

  tt.rnd_id = path.rnd_id  
  tt.rnd_max = path.max_ids[npc:id()].rnd_max  
  tt.rnd_last = nil  

  tt.min_snd = path.min_snd  
  tt.max_snd = path.max_snd  
  tt.rnd_snd = path.rnd_snd  
  else  
  get_sound(path.types[path.exec(path.types, npc)], tt, npc)  
  end  
  end  
  -- Формирование ключа персонажа  
  function get_key(npc)  
  local key  

  -- формирование ключа  
  local overrides = xr_logic.generic_scheme_overrides(npc)  
  if overrides and  
  overrides.soundgroup  
  then  
  key = overrides.soundgroup  
  else  
  key = utils.to_str(npc:id())  
  end  

  -- апдейт таблиц :smile: не менять!  
  if xr_sound.key_by_id[npc:id()] ~= key then  
  if xr_sound.group_idle[xr_sound.key_by_id[npc:id()]] ~= nil then  
  xr_sound.group_idle[xr_sound.key_by_id[npc:id()]].num_in_group = xr_sound.group_idle[xr_sound.key_by_id[npc:id()]].num_in_group - 1  
  end  
  xr_sound.key_by_id[npc:id()] = key  
  if xr_sound.group_idle[key] == nil then  
  xr_sound.group_idle[key] = {num_in_group = 1}  
  else  
  xr_sound.group_idle[key].num_in_group = xr_sound.group_idle[key].num_in_group + 1  
  end  
  end  
  return key  
  end  

  ------------------------------------------------------------------------------------------------------------------------------- ----  
  -- Установка и распарсивание тем в файлы.  
  -----------------------------------------------------------------------------------------------------------------------------------  
  f unction set_sound(npc, sound, now, into_timeout)  
  -- printf("*SND* [%s] try to change SND to [%s]", npc:name(), tostring(sound))  

  local npc_id = npc:id()  
  if (db.sound[npc_id] == nil or  
  db.sound[npc_id].theme ~= sound) or  
  now == true  
  then  
  -- if db.sound[npc_id] == nil then  
  -- printf("*SND* change SND [_] to [%s] for [%s]", tostring(sound), npc:name())  
  -- else  
  -- printf("*SND* change SND [%s] to [%s] for [%s]", tostring(db.sound[npc_id].theme), tostring(sound), npc:name())  
  -- end  
  -- Туточки надобно распарсить имена тем в их id  
  if sound == nil then sound = "" end  
  if db.sound[npc_id] == nil then db.sound[npc_id] = {} end  
  db.sound[npc_id].theme = sound  
  db.sound[npc_id].snd = parse_names(sound)  
  if db.sound[npc_id].last_snd == nil then  
  db.sound[npc_id].last_snd = {}  
  else  

  local snd_table = {}  
  local t = 0  
  for k,v in pairs(db.sound[npc_id].snd) do  
  snd_table[t] = {}  
  get_sound(sound_theme.theme[v], snd_table[t], npc)  
  t = t + 1  
  end  
  for k,v in pairs(snd_table) do  
  if v.into_id then db.sound[npc_id].last_snd[v.into_id] = nil end  
  if v.rnd_id then db.sound[npc_id].last_snd[v.rnd_id] = nil end  
  end  

  end  
  -- Устанавливаем входную паузу  
  local key = get_key(npc)  
  xr_sound.group_idle[key].begin = time_global()  
  if into_timeout then  
  xr_sound.group_idle[key].idle = into_timeout  
  else  
  xr_sound.group_idle[key].idle = 0  
  end  

  if now == true then  
  stop_play_sound(npc)  
  end  
  end  
  end  

  function play_sound(npc, themes, timeout)  
  -- нужно составить список тем  
  local snd_table = {}  
  local t = 0  
  for k,v in pairs(themes) do  
  snd_table[t] = {}  
  if sound_theme.theme[v] ~= nil then  
  snd_table[t].theme = v  
  get_sound(sound_theme.theme[v], snd_table[t], npc)  
  else  
  abort("ERROR: ILLEGAL PLAY SOUND!!! %s for %s", v, npc:name())  
  end  
  t = t + 1  
  end  
  --printf("*")  
  --print_table(snd_table)  
  if t == 0 then return end  
  -- из списка тем выбираем одну.  
  local snd = snd_table[math.random(0, t-1)]  
  if snd ~= nil then  
  --printf("!")  
  --print_table(snd)  
  if snd.min_snd == nil then return end  
  local npc_id = npc:id()  
  local group_table = xr_sound.group_idle[get_key(npc)]  
  group_table.idle = math.random(snd.min_snd, snd.max_snd)*1000  
  if group_table.last_snd == nil then  
  group_table.last_snd = {}  
  end  
  -- необходимо ли нам играть into или rnd звуки  
  if snd.into_max ~= nil and  
  snd.into_max > 0  
  then  
  if db.sound[npc_id].last_snd[snd.into_id] == snd.into_max - 1 then  
  if snd.into_cycled == true then  
  db.sound[npc_id].last_snd[snd.into_id] = nil  
  else  
  return  
  end  
  end  

  -- играем входные  
  if db.sound[npc_id].last_snd[snd.into_id] == nil then db.sound[npc_id].last_snd[snd.into_id] = -1 end  

  --printf("*SND* play seq [%s] for [%s]", db.sound[npc_id].last_snd[snd.into_id]+1, npc:name())  
  process_tutor_on_sound(snd.theme)  
  npc:play_sound(snd.into_id, 1, 0, 1, 0, db.sound[npc_id].last_snd[snd.into_id]+1)  
  db.sound[npc_id].last_snd[snd.into_id] = db.sound[npc_id].last_snd[snd.into_id] + 1  
  --printf("*SND* play seq [%s] for [%s]", db.sound[npc_id].last_snd[snd.into_id], npc:name())  
  return  
  end  
  if snd.rnd_max ~= nil and  
  snd.rnd_max > 0  
  then  
  -- играем рандомные  
  local s = 0  
  if snd.rnd_max == 1 then  
  s = 0  
  else  
  -- Если прошлый раз проигрывался такой же набор тем  
  -- то учитывать последний звук для группы.  
  -- if db.sound[npc_id].last_snd[snd.rnd_id] ~= nil then  
  if group_table.last_snd[snd.rnd_id] ~= nil then  
  s = math.random(0, snd.rnd_max-2)  
  if s >= group_table.last_snd[snd.rnd_id] then s = s + 1 end  
  else  
  s = math.random(0, snd.rnd_max-1)  
  end  
  end  

  if timeout == nil then  
  timeout = 0  
  end  
  --printf("*SND* play rnd [%s] for [%s]", s, npc:name())  
  process_tutor_on_sound(snd.theme)  
  npc:play_sound(snd.rnd_id, timeout+1, timeout, 1, 0, s)  
  --db.sound[npc_id].last_snd[snd.rnd_id] = s  
  group_table.last_snd[snd.rnd_id] = s  
  end  
  end  
  end  

  function get_last_IDS(npc, theme)  
  local last_table = db.sound[npc:id()].last_snd  
  local snd_table = {}  
  if sound_theme.theme[theme] ~= nil then  
  get_sound(sound_theme.theme[theme], snd_table, npc)  
  end  
  printf("LAST INTO ID for [%s] = [%s], max [%s]", theme, last_table[snd_table.into_id], snd_table.into_max)  
  return last_table[snd_table.into_id], snd_table.into_max  
  end  

  function load_sound(npc)  
  sound_theme.load_sound(npc)  
  end  

  function process_tutor_on_sound(theme)  
  end  

  --' Actor sound player  
  local actor_sound = {}  
  function set_actor_sound(sound)  
  printf("*ACTOR SND* try to change SND to [%s]", tostring(sound))  
  if actor_sound.theme ~= sound then  
  --' Туточки надобно распарсить имена тем в их id  
  if sound == nil then sound = "" end  
  actor_sound.theme = sound  
  actor_sound.begin = nil  

  this.set_actor_sound_factor(1)  
  end  
  end  

  function set_actor_sound_factor(factor)  
  local theme = sound_theme.actor_theme[actor_sound.theme]  
  if theme ~= nil then  
  actor_sound.min_snd = theme.min_snd * factor  
  actor_sound.max_snd = theme.max_snd * factor  
  end  
  end  

  function update_actor()  
  local theme = sound_theme.actor_theme[actor_sound.theme]  
  if theme == nil then return end  

  if table.getn(theme.sounds) == 0 then  
  return  
  end  

  if actor_sound.begin == nil or  
  time_global() - actor_sound.begin >= actor_sound.idle  
  then  
  actor_sound.begin = time_global()  

  --' Тут надо отыграть звук  
  local sound = theme.sounds[math.random(table.getn(theme.sounds))]  
  if sound ~= nil then  
  sound:play(db.actor, 0, sound_object.s2d)  
  end  
  actor_sound.idle = math.random(actor_sound.min_snd, actor_sound.max_snd)  
  end  
  end  

  --' Таблица для хранения созданных саунд обжектов.  
  sound_object_by_theme = {}  
  --' type = [random|seq|looped]  
  function get_sound_object(theme, t_type)  
  if sound_theme.ph_snd_themes[theme] == nil then  
  abort("ph_snd_themes for theme %s", tostring(theme))  
  return  
  end  

  if sound_object_by_theme[theme] == nil then  
  sound_object_by_theme[theme] = {}  
  end  

  if t_type == nil then  
  t_type = "random"  
  end  

  --' Выбор следующего айдишника  
  local play_id = -1  
  local table_size = table.getn(sound_theme.ph_snd_themes[theme])  
  if sound_object_by_theme[theme].last_id == nil then  
  if t_type == "random" then  
  if table_size >= 2 then  
  play_id = math.random(1, table_size)  
  else  
  play_id = 1  
  end  
  else  
  play_id = 1  
  end  
  else  
  if t_type == "random" then  
  if table_size >= 2 then  
  play_id = math.random(1, table_size - 1)  
  if play_id >= sound_object_by_theme[theme].last_id then play_id = play_id + 1 end  
  else  
  play_id = 1  
  end  
  else  
  if sound_object_by_theme[theme].last_id < table_size then  
  play_id = sound_object_by_theme[theme].last_id + 1  
  else  
  if type == "looped" then  
  play_id = 1  
  end  
  end  
  end  
  end  

  printf("SOUND_OBJECT: selected id [%s] for theme [%s], type [%s], size [%s]", tostring(play_id), tostring(theme), tostring(type), table_size)  

  if play_id == -1 then  
  return  
  end  
  --' Проверяем создан ли у нас соответствующий саунд обжект или его надо создать  
  if sound_object_by_theme[theme][play_id] == nil then  
  if type(sound_theme.ph_snd_themes[theme][play_id]) == "table" then  
  sound_object_by_theme[theme][play_id.."_r"] = get_safe_sound_object(sound_theme.ph_snd_themes[theme][play_id][1].."_r")  
  sound_object_by_theme[theme][play_id.."_l"] = get_safe_sound_object(sound_theme.ph_snd_themes[theme][play_id][1].."_l")  
  else  
  sound_object_by_theme[theme][play_id] = get_safe_sound_object(sound_theme.ph_snd_themes[theme][play_id])  
  end  
  end  

  sound_object_by_theme[theme].last_id = play_id  

  --' Возвращаем саунд обжект  
  if type(sound_theme.ph_snd_themes[theme][play_id]) == "table" then  
  return sound_object_by_theme[theme][play_id.."_r"], sound_object_by_theme[theme][play_id.."_l"]  
  else  
  return sound_object_by_theme[theme][play_id]  
  end  
  end  

  local sound_object_by_path = {}  
  --' Обертка вокруг функции, возвращающий звуковой объект.  
  function get_safe_sound_object(path)  
  if sound_object_by_path[path] == nil then  
  sound_object_by_path[path] = sound_object(path)  
  end  
  return sound_object_by_path[path]  
  end  

  function stop_all_sound_object()  
  for k,v in pairs(sound_object_by_path) do  
  if v:playing() then  
  v:stop()  
  end  
  end  
  end  
  function clear_all_sound_object()  
  sound_object_by_theme = {}  
  end




Форум » S.T.A.L.K.E.R. - Зов Припяти » Модостроение » Создание радио. Статья от ак101
  • Страница 1 из 1
  • 1
Поиск:
Загрузка...

Авторское право на игру и использованные в ней материалы принадлежат GSC Game World.
Любое использование материалов сайта возможно только с разрешения Администрации.
Для просмотра сайта рекомендуем использовать Яндекс.Браузер
Copyright soc-team © 2014.

   Бесплатный анализ сайта
Общий канал
Общий канал
Сталкер, мы кого попало не пропускаем.
0
Группировки


Вступить

Обновления форума

Поиск по сайту

Лучшие сталкеры
slavapro
Постов: 544
Репутация: 11
Virus
Постов: 348
Репутация: 1
KiRiYaNoV
Постов: 319
Репутация: 1
p203w
Постов: 120
Репутация: 0
Кракен
Постов: 66
Репутация: 2

Кто нас сегодня посетил


Братья по оружию
 
Новости, общение и многое другое,<br> у нас на survarium-delta.ucoz.ru  Top Life-Stalker.RU
 Сайт создан не для заработка, а для вас Заходите Сталкеры. Оцените наш проект)ждем вас на http://DOLG-vs-SVOBODE.3dn.ru
Новости общение и многое другое, у нас на exelent731.ucoz.ru