Параметры озвучки NPC |
Здравствуйте, гость ( Авторизация | Регистрация )
Сайт S.T.A.L.K.E.R. Inside / [ЗП] Параметры командной строки / Распаковщик ресурсов
Параметры озвучки NPC |
17.09.2017, 17:43
Сообщение
#1
|
|
Грандмастер Репутация: 118 Группа: Участник Сообщений: 1788 Награды: 4 Регистрация: 04.04.2013 |
При каких условиях NPC произносят те или иные звуки?
На примере m_stalker.ltx: Код sound_death = fight\death\death_ sound_anomaly_death = fight\death\anomaly_ sound_hit = fight\hit\hit_ sound_humming = states\idle\idle_ sound_alarm = fight\enemy\enemy_ sound_backup = fight\backup\backup_,fight\threat\threat_close_ sound_detour = fight\detour\detour_,fight\fire\fire_,fight\threat\threat_close_ sound_friendly_fire = fight\friendly_fire\friendly_fire_ sound_panic_human = states\panic_human\panic_human_ sound_panic_monster = states\panic_monster\panic_monster_ sound_tolls = fight\tolls\tolls_ sound_grenade_alarm = fight\grenade\grenade_ sound_friendly_grenade_alarm = fight\friendly_grenade\friendly_grenade_ sound_need_backup = fight\cover_fire\cover_fire_ sound_running_in_danger = states\breath\breath_1 sound_walking_in_danger = states\breath\breath_2 sound_kill_wounded = help\wounded\kill_wounded_ sound_enemy_critically_wounded = fight\enemy_hit\enemy_hit_ sound_enemy_killed_or_wounded = fight\enemy_down\enemy_down_ sound_attack = fight\attack\attack_ sound_search = fight\searching_enemy\search_ sound_attack_no_allies = fight\fire\fire_,fight\threat\threat_distant_ sound_attack_allies_single_enemy = fight\attack\attack_,fight\attack\attack_one_,fight\fire\fire_ sound_attack_allies_several_enemies = fight\attack\attack_,fight\attack\attack_many_,fight\fire\fire_ sound_search1_no_allies = fight\threat\threat_distant_ sound_search1_with_allies = fight\searching_enemy\search_,fight\searching_enemy\enemy_lost_ В ЧН добавился: Код sound_throw_grenade = fight\grenade\grenade_ready_ Остался и в ЗП.Но в ЗП вроде исчезли: Код sound_attack = fight\attack\attack_ sound_search = fight\searching_enemy\search_ А также добавились: Код sound_wounded = fight\friend_hitted\hit_friend_ sound_enemy_lost_no_allies = sound_enemy_lost_with_allies = fight\searching_enemy\enemy_lost_ Разумеется приветствуется реальные данные, а не только копипаст из интернета. Сообщение отредактировал aka_sektor - 17.09.2017, 17:45 -------------------- |
 
|
|
|
|
17.09.2017, 19:25
Сообщение
#2
|
|
Игровой Бог Репутация: 1690 Группа: Участник Сообщений: 7021 Награды: 11 Регистрация: 22.02.2006 |
Реальные данные для ТЧ наверняка можно найти в ai_stalker.cpp и ai_stalker_script.cpp.
Сообщение отредактировал macron - 17.09.2017, 19:25 |
 
|
|
17.09.2017, 19:34
Сообщение
#3
|
|
Грандмастер Репутация: 118 Группа: Участник Сообщений: 1788 Награды: 4 Регистрация: 04.04.2013 |
можно найти в Если ты про комментарии к коду, то судя по сырцам 1.0007 - нету их. -------------------- |
 
|
|
17.09.2017, 19:48
Сообщение
#4
|
|
Продвинутый геймер Репутация: 53 Группа: Участник Сообщений: 265 Награды: 3 Регистрация: 22.02.2010 |
Даже этот бесполезный коммент полезнее всей твоей компиляционной деятельности и мемосных видосов.
Это было слишком грубо. [ForserX] Сообщение отредактировал Forser - 17.09.2017, 20:07 -------------------- Официально разморожен
|
 
|
|
17.09.2017, 19:52
Сообщение
#5
|
|
Грандмастер Репутация: 118 Группа: Участник Сообщений: 1788 Награды: 4 Регистрация: 04.04.2013 |
lafugix,
-> Я не отвечаю на провокации. Сообщение отредактировал aka_sektor - 17.09.2017, 20:21 -------------------- |
 
|
|
17.09.2017, 20:00
Сообщение
#6
|
|
Почти Игроман Репутация: 91 Группа: Модератор Сообщений: 516 Награды: 4 Регистрация: 19.07.2015 |
Господин Лафик, умерьте пыл.
aka_sektor, комментарии в коде тут никому не упали. Когда ты уже начнёшь читать названия переменных и приходить к выводу от размышлений и ингейм проверок? -------------------- В армии по 01.07.2020. |
 
|
|
17.09.2017, 21:27
Сообщение
#7
|
|
Игровой Бог Репутация: 648 Группа: Участник Сообщений: 5354 Награды: 9 Регистрация: 24.09.2010 |
Когда ты уже начнёшь читать названия переменных и приходить к выводу от размышлений и ингейм проверок? Но ведь для этого нужно включить мозг -------------------- |
 
|
|
17.09.2017, 23:07
Сообщение
#8
|
|
TECHNOSLAV 80 уровня Репутация: 379 Группа: Участник Сообщений: 5758 Награды: 6 Регистрация: 26.01.2014 |
Когда ты уже начнёшь читать названия переменных и приходить к выводу от размышлений и ингейм проверок? Но ведь для этого нужно включить мозг В программировании и в любой разработке важна документация. У столкира нет документации по очень многим вопросам, это усложняет разработку. Человек просто интересуется, может кто-то уже ковырял эти параметры.. и он сам уже собрал довольно много инфы, так что не нужно тут грубить - это не нуб, который спрашивает, как распаковать гейдату или как сделать батник. Однако, не думаю, что нужно было запиливать отдельную тему касательно вопросов озвучки - это магнит для троллей. Метод перебора и проверок вживую вполне подходит. Я как-то делал мод на L4D2, заменяя все звуки зомби на сами знаете что - там сотни звуков и хрен знает как они воспроизводятся (в каких ситуациях) - вон там бы помогли советы и документация. Сообщение отредактировал Cossack-HD - 17.09.2017, 23:10 -------------------- Ryzen 3700X
Arctic Freezer 33 eSports Duo 16GB DDR4 3600MHz Strix GTX 1080 TI |
 
|
|
18.09.2017, 00:27
Сообщение
#9
|
|
Почти Игроман Репутация: 91 Группа: Модератор Сообщений: 516 Награды: 4 Регистрация: 19.07.2015 |
В программировании и в любой разработке важна документация. Молодой человек, пысовцы - КЛЯТЫЕ ООП'шники. Первое правило ООП гласит: названия всего и всея должно описывать происходящее внутри. Сообщение отредактировал Forser - 18.09.2017, 00:27 -------------------- В армии по 01.07.2020. |
 
|
|
18.09.2017, 16:24
Сообщение
#10
|
|
Грандмастер Репутация: 118 Группа: Участник Сообщений: 1788 Награды: 4 Регистрация: 04.04.2013 |
названия переменных Назвать можно как угодно. Тупо перевести, и сказать что вот оно так работает - неправильно.Хоть ты и говоришь, что: пысовцы - КЛЯТЫЕ ООП'шники С учетом того, сколько раз переписывали все, и сколько билдомусора, далеко не факт, что все параметры вообще работают.приходить к выводу от размышлений и ингейм проверок Да... придумать можно всякое.Тут в общем также. Ну услышишь ты фразу. О чём это тебе скажет? Идёт бой. Попробуй разберись, что именно послужило условием к произношению той или иной фразы. Повторюсь из темы импорта звука: И все таки, эт нужно в исходниках смотреть каждый тип отдельно. Судить может каждый по-разному, в меру своих знаний. Пока что по теме чего-то полезного сказано не было.нужно включить мозг Избавь меня от своего тщеславия.В программировании и в любой разработке важна документация. У столкира нет документации по очень многим вопросам, это усложняет разработку. просто интересуется, может кто-то уже ковырял эти параметры Верно. это магнит для троллей Есть верное средство: "Не кормить их". P.S. Вообще, мы же все прекрасно знаем. Те кто реально разбирается в чем-то, осознанно предпочитают не рассказывать о том как, и что они делают. Просто делают моды, а потом почивают на лаврах. Добиться от таких людей хоть какого-то вразумительного ответа по каким-либо вопросам моддинга, не удается или удается очень редко. Кто-то реально занят, а кто-то считает слишком низким для себя разжевывать что-либо кому-то, как они опять же считают, ниже себя интеллектом. Зато, они просто обязаны отписать какой-нибудь ехидный комментарий везде где только можно. -------------------- |
 
|
|
18.09.2017, 17:00
Сообщение
#11
|
|
Игровое Воплощение Репутация: 394 Группа: Участник Сообщений: 4791 Награды: 4 Регистрация: 27.04.2011 |
Вообще, мы же все прекрасно знаем. Те кто реально разбирается в чем-то, осознанно предпочитают не рассказывать о том как, и что они делают. Просто делают моды, а потом почивают на лаврах. Добиться от таких людей хоть какого-то вразумительного ответа по каким-либо вопросам моддинга, не удается или удается очень редко. Кто-то реально занят, а кто-то считает слишком низким для себя разжевывать что-либо кому-то, как они опять же считают, ниже себя интеллектом. Зато, они просто обязаны отписать какой-нибудь ехидный комментарий везде где только можно. Ты как Дизель/andreyholkin. Тот считает, что уже 20 лет без перерывов бьются и не могут на хрее запилить гусеницы. Сначала ГСЦ 10 лет пыталось, а потом 10 лет все моддеры. Вон кстати у КД в движке число костей увеличено, осталось в шейдер прокинуть одну константу и будут ему простейшие гусеницы. Но за него самого это никто не сделает. Так же и здесь. В том смысле, который ты вкладываешь в "знают", никто не знает, когда НПЦ какие звуки когда произносят. Это вообще никому не уперлось. А все движковые правки рано или поздно становятся доступными. Причем сейчас скорее раньше. Взял бы и сам занялся изучением звуков. Это не так уж и сложно. Например: берешь "sound_alarm = fight\enemy\enemy_", ищешь в исходниках строку "sound_alarm", она находится в строке: Код sound().add(pSettings->r_string(section,"sound_alarm"), 100, SOUND_TYPE_MONSTER_TALKING, 5, u32(eStalkerSoundMaskAlarm), eStalkerSoundAlarm, head_bone_name, xr_new<CStalkerSoundData>(this)); Ищешь в исходниках строку eStalkerSoundAlarm, находится в таком участке кода: Код if (m_object->memory().visual().visible_now(m_object->memory().enemy().selected())) { if (m_object->memory().enemy().selected()->human_being()) if (object().agent_manager().member().can_cry_noninfo_phrase()) if (object().agent_manager().member().members().size() > 1) if (!CScriptActionPlanner::m_storage.property(eWorldPropertyUseSuddenness)) object().sound().play (eStalkerSoundAlarm); } Вот условие, когда произносится звук sound_alarm. Теперь ты обладаешь секретным знанием - делись им. Уверен, что кроме тебя больше этого никто не знает |
 
|
|
18.09.2017, 17:25
Сообщение
#12
|
|
Грандмастер Репутация: 118 Группа: Участник Сообщений: 1788 Награды: 4 Регистрация: 04.04.2013 |
никто не знает, когда НПЦ какие звуки когда произносят. Это вообще никому не уперлось. Даже так? Удивительно, что 10 лет никому не было интересно. за него самого это никто не сделает Ну... вообще, чет такое уже описывали (второй спойлер): Это не так уж и сложно. Насчет этого согласен: в исходниках строку "sound_alarm" Но не насчет этого: исходниках строку eStalkerSoundAlarm Не знал. А вот это уже интересно. Посмотрю.Вот условие, когда произносится звук sound_alarm Как-то не особо что приведенный код говорит. Расшифруй. Уверен, что кроме тебя больше этого никто не знает Дело не в том что я знаю, а в том что знает человек, который в этом реально разбирается. Программист например, коим я лично не являюсь. P.S. Сообщение отредактировал aka_sektor - 18.09.2017, 17:54 -------------------- |
 
|
|
18.09.2017, 18:07
Сообщение
#13
|
|
Игровое Воплощение Репутация: 394 Группа: Участник Сообщений: 4791 Награды: 4 Регистрация: 27.04.2011 |
Даже так? Удивительно, что 10 лет никому не было интересно. Ну за всех конечно неправильно говорить, но мне вот совершенно не было интересно, да и сейчас тоже. Так же, как и гусеничный транспорт в сталкере. Цитата Как-то не особо что приведенный код говорит. Расшифруй. Так это надо дальше поиском заниматься, когда какая функция возвращает истину, а когда ложь. Навскидку так: Код // кривой перевод английских названий функций if (m_object->memory().visual().visible_now(m_object->memory().enemy().selected())) { // если видим врага if (m_object->memory().enemy().selected()->human_being()) // если враг человек if (object().agent_manager().member().can_cry_noninfo_phrase()) // если можем говорить if (object().agent_manager().member().members().size() > 1) // если мы в группе if (!CScriptActionPlanner::m_storage.property(eWorldPropertyUseSuddenness)) // ??? object().sound().play (eStalkerSoundAlarm); // то проигрываем звук } Цитата а в том что знает человек, который в этом реально разбирается. Еще раз повторю, таких тупо нет. Программисту, не программисту - всем надо потратить N часов на поиск по файлам, чтобы получить "реальные данные". Цитата Он вроде переносит ЧН на двиг ЗП. Ну кроме этого, он еще за гусеницы болеет. Сообщение отредактировал abramcumner - 18.09.2017, 18:08 |
 
|
|
18.09.2017, 18:29
Сообщение
#14
|
|
Почти Игроман Репутация: 91 Группа: Модератор Сообщений: 516 Награды: 4 Регистрация: 19.07.2015 |
Добиться от таких людей хоть какого-то вразумительного ответа по каким-либо вопросам моддинга, не удается или удается очень редко. Кто-то реально занят, а кто-то считает слишком низким для себя разжевывать что-либо кому-то, как они опять же считают, ниже себя интеллектом. Зато, они просто обязаны отписать какой-нибудь ехидный комментарий везде где только можно. Позволь объясню. Модмейкеры - народ скупой в своих знаниях. Для многих вопросов большинству приходится дополнительно изучать самому. Я отвечу всегда на вопрос, если ответ на него мне уже известен, в противном случае отправлю автора изучать всё самостоятельно. Есть неплохие материалы практически по любой части, которые помогут в этом деле. Часть по скрипта я сам правил и обновлял. Раньше я тоже придерживался тулешо мнения, но когда полез в зато, то понял, что иногда, для самых банальных вопросов, приходится искать ответ часами. Уж прости, такова сэляви. -------------------- В армии по 01.07.2020. |
 
|
|
18.09.2017, 19:38
Сообщение
#15
|
|
Грандмастер Репутация: 118 Группа: Участник Сообщений: 1788 Награды: 4 Регистрация: 04.04.2013 |
за всех конечно неправильно говорить Верно. мне вот совершенно не было интересно, да и сейчас тоже Тогда удивительно, как ты вообще решил тут ответить что-то по теме. Навскидку так Я уже тоже было начал: Код объект - память - визуал - видит сейчас - враг - выбран враг - выбран - человек ... Но у тебя понятнее. таких тупо нет ... надо потратить N часов ... Как же? А кто же тогда навскидку тут прикинул... И не n-часов прошло. P.S. Модмейкеры - народ скупой в своих знаниях. Не согласен. Есть примеры, одиночек, которые создавали моды. отправлю автора изучать всё самостоятельно Ну эт лишнее. Это очевидно, и делается автором ещё перед тем, как задавать вопросы. Есть неплохие материалы практически по любой части Согласен что есть, но не согласен, что неплохие. Есть устаревшие и непроверенные. Всякая вымышленная инфа, которая на практике не работает. для самых банальных вопросов, приходится искать ответ часами Я не считаю, что поведение AI эт банальный вопрос. Вот например, OLR, восстановили же: Сообщение отредактировал aka_sektor - 18.09.2017, 19:42 -------------------- |
 
|
|
18.09.2017, 19:44
Сообщение
#16
|
|
Игровое Воплощение Репутация: 394 Группа: Участник Сообщений: 4791 Награды: 4 Регистрация: 27.04.2011 |
Тогда удивительно, как ты вообще решил тут ответить что-то по теме. Твоя деятельность по поиску и организации информации о хрее интересна, а сами параметры нет. Цитата Как же? А кто же тогда навскидку тут прикинул... И не n-часов прошло. Ну алгоритм поиска ты теперь знаешь |
 
|
|
18.09.2017, 19:50
Сообщение
#17
|
|
Грандмастер Репутация: 118 Группа: Участник Сообщений: 1788 Награды: 4 Регистрация: 04.04.2013 |
а сами параметры нет Ну я захотел этот вопрос разобрать, чтобы лучше понять, как возможно кастомизировать озвучку неписей. алгоритм поиска ты теперь знаешь Ещё бы для Game Type такой же. -------------------- |
 
|
|
18.09.2017, 22:26
Сообщение
#18
|
|
Грандмастер Репутация: 118 Группа: Участник Сообщений: 1788 Награды: 4 Регистрация: 04.04.2013 |
Ну... в общем, такое в исходниках:
sound_death и sound_anomaly_death eStalkerSoundDie и eStalkerSoundDieInAnomaly Код if (is_special_killer(who)) sound().play (eStalkerSoundDieInAnomaly); else sound().play (eStalkerSoundDie); sound_hit eStalkerSoundInjuring Код if (entity_alive && !wounded()) { if (is_relation_enemy(entity_alive)) sound().play (eStalkerSoundInjuring); // else // sound().play (eStalkerSoundInjuringByFriend); } Код if (object().memory().enemy().selected()) { u32 min_queue_size, max_queue_size, min_queue_interval, max_queue_interval; float distance = object().memory().enemy().selected()->Position().distance_to(object().Position()); select_queue_params (distance,min_queue_size, max_queue_size, min_queue_interval, max_queue_interval); object().CObjectHandler::set_goal (eObjectActionIdle,object().best_weapon(),min_queue_size, max_queue_size, min_queue_interval, max_queue_interval); } else object().CObjectHandler::set_goal (eObjectActionIdle,object().best_weapon()); object().sight().setup (CSightAction(SightManager::eSightTypeCurrentDirection,true,true)); object().sound().play (eStalkerSoundInjuring); } sound_humming eStalkerSoundHumming Код void CStalkerActionSmartTerrain::execute () { inherited::execute (); if (completed()) object().CObjectHandler::set_goal (eObjectActionStrapped,object().best_weapon()); object().sound().play (eStalkerSoundHumming,60000,10000); CSE_ALifeHumanAbstract *stalker = smart_cast<CSE_ALifeHumanAbstract*>(ai().alife().objects().object(m_object->ID())); VERIFY (stalker); VERIFY (stalker->m_smart_terrain_id != 0xffff); CALifeSmartTerrainTask *task = stalker->brain().smart_terrain().task(stalker); THROW2 (task,"Smart terrain is assigned but returns no task"); Код if (completed()) object().CObjectHandler::set_goal (eObjectActionStrapped,object().best_weapon()); object().sound().play (eStalkerSoundHumming,60000,10000); sound_backup eStalkerSoundBackup Код if (object().memory().visual().visible_now(object().memory().enemy().selected()) && object().agent_manager().member().group_behaviour()) object().sound().play (eStalkerSoundBackup,0,0,6000,4000); } sound_detour и sound_need_backup eStalkerSoundDetour и eStalkerSoundNeedBackup Код if (object().agent_manager().member().cover_detouring() && fire_make_sense()) { // object().sound().play (eStalkerSoundDetour,3000,3000,10000,10000); object().sound().play (eStalkerSoundNeedBackup,3000,3000,10000,10000); fire (); } Код if (object().memory().enemy().selected()->human_being() && object().agent_manager().member().group_behaviour()) // object().sound().play (eStalkerSoundNeedBackup); object().sound().play (eStalkerSoundDetour); //#endif } sound_friendly_fire eStalkerSoundInjuringByFriend Код if (entity_alive && !wounded()) { if (is_relation_enemy(entity_alive)) sound().play (eStalkerSoundInjuring); // else // sound().play (eStalkerSoundInjuringByFriend); } sound_panic_human и sound_panic_monster eStalkerSoundPanicHuman и eStalkerSoundPanicMonster Код void CStalkerActionCombatBase::play_panic_sound (u32 max_start_time, u32 min_start_time, u32 max_stop_time, u32 min_stop_time, u32 id) { object().sound().play ( object().memory().enemy().selected()->human_being() ? eStalkerSoundPanicHuman : eStalkerSoundPanicMonster, max_start_time, min_start_time, max_stop_time, min_stop_time, id ); } sound_tolls eStalkerSoundTolls Код if (agent_manager().member().group_behaviour()) sound().play (StalkerSpace::eStalkerSoundTolls); reaction.clear (); } sound_grenade_alarm eStalkerSoundGrenadeAlarm Код if (is_relation_enemy(initiator)) sound().play (StalkerSpace::eStalkerSoundGrenadeAlarm); sound_friendly_grenade_alarm eStalkerSoundFriendlyGrenadeAlarm Код if (missile->Position().distance_to(Position()) < FRIENDLY_GRENADE_ALARM_DIST) sound().play (StalkerSpace::eStalkerSoundFriendlyGrenadeAlarm); } sound_running_in_danger и sound_walking_in_danger eStalkerSoundRunningInDanger и eStalkerSoundWalkingInDanger Код if ( (eBodyStateStand == movement().body_state()) && (eMovementTypeRun == movement().movement_type()) ) { sound().play (eStalkerSoundRunningInDanger); } else { // sound().play (eStalkerSoundWalkingInDanger); } sound_kill_wounded eStalkerSoundKillWounded Код void CStalkerActionPrepareWounded::initialize () { inherited::initialize (); object().movement().set_desired_direction (0); object().movement().set_path_type (MovementManager::ePathTypeLevelPath); object().movement().set_detail_path_type (DetailPathManager::eDetailPathTypeSmooth); object().movement().set_mental_state (eMentalStateDanger); object().movement().set_body_state (eBodyStateStand); object().movement().set_movement_type (eMovementTypeStand); object().sound().play (eStalkerSoundKillWounded); object().CObjectHandler::set_goal (eObjectActionAimReady1,weapon_to_kill(&object()),MIN_QUEUE,MAX_QUEUE,MIN_INTERVAL,MAX_INTERVAL); } sound_enemy_critically_wounded eStalkerSoundEnemyCriticallyWounded Код if (!can_cry_enemy_is_wounded()) return; sound().play (eStalkerSoundEnemyCriticallyWounded); } sound_enemy_killed_or_wounded eStalkerSoundEnemyKilledOrWounded Код void CAI_Stalker::on_enemy_wounded_or_killed (const CAI_Stalker *wounded_or_killed) { if (!can_cry_enemy_is_wounded()) return; sound().play (eStalkerSoundEnemyKilledOrWounded); } sound_attack_no_allies и sound_attack_allies_single_enemy и sound_attack_allies_several_enemies eStalkerSoundAttackNoAllies и eStalkerSoundAttackAlliesSingleEnemy и eStalkerSoundAttackAlliesSeveralEnemies Код void CStalkerActionCombatBase::play_attack_sound (u32 max_start_time, u32 min_start_time, u32 max_stop_time, u32 min_stop_time, u32 id) { if (!object().memory().enemy().selected()->human_being()) return; if (!object().agent_manager().member().can_cry_noninfo_phrase()) return; u32 sound_type = eStalkerSoundAttackNoAllies; #ifdef DEBUG if (object().agent_manager().member().combat_members().empty()) Msg ( "! I am in combat, but there is no combat members at all (including me), npc[%s],team[%d],squad[%d],group[%d]", *object().cName(), object().g_Team(), object().g_Squad(), object().g_Group() ); #endif // DEBUG if (object().agent_manager().member().combat_members().size() > 1) { if (object().agent_manager().enemy().enemies().size() > 1) sound_type = eStalkerSoundAttackAlliesSeveralEnemies; else sound_type = eStalkerSoundAttackAlliesSingleEnemy; } else sound_type = eStalkerSoundAttackNoAllies; object().sound().play ( sound_type, max_start_time, min_start_time, max_stop_time, min_stop_time, id ); } sound_search1_no_allies и sound_search1_with_allies eStalkerSoundSearch1NoAllies и eStalkerSoundSearch1WithAllies Код void CStalkerActionCombatBase::play_start_search_sound (u32 max_start_time, u32 min_start_time, u32 max_stop_time, u32 min_stop_time, u32 id) { if (!object().agent_manager().member().can_cry_noninfo_phrase()) return; #ifdef DEBUG if (object().agent_manager().member().combat_members().empty()) Msg ("! I am in combat, but there is no combat members at all (including me), npc[%s],team[%d],squad[%d],group[%d]", *object().cName(), object().g_Team(), object().g_Squad(), object().g_Group() ); #endif // DEBUG bool search_with_allies = object().agent_manager().member().combat_members().size() > 1; object().sound().play ( search_with_allies ? eStalkerSoundSearch1WithAllies : eStalkerSoundSearch1NoAllies, max_start_time, min_start_time, max_stop_time, min_stop_time, id ); } sound_throw_grenade eStalkerSoundThrowGrenade Код void CStalkerCombatActionThrowGrenade::initialize () { inherited::initialize (); object().movement().set_mental_state (eMentalStateDanger); const CInventoryItem *grenade = object().inventory().ItemFromSlot(GRENADE_SLOT); VERIFY (grenade); m_grenade_id = grenade->object().ID(); object().movement().set_movement_type (eMovementTypeStand); object().movement().set_body_state (eBodyStateStand); object().sound().play (eStalkerSoundThrowGrenade); m_storage->set_property (eWorldPropertyStartedToThrowGrenade, true); } sound_wounded eStalkerSoundWounded Код if (agent_manager().member().group_behaviour()) { if (!reaction.m_member->g_Alive()) sound().play ( StalkerSpace::eStalkerSoundTolls, 3000, 2000 ); sound_enemy_lost_no_allies и sound_enemy_lost_with_allies eStalkerSoundEnemyLostNoAllies и eStalkerSoundEnemyLostWithAllies Код void CStalkerActionCombatBase::play_enemy_lost_sound (u32 max_start_time, u32 min_start_time, u32 max_stop_time, u32 min_stop_time, u32 id) { if (!object().agent_manager().member().can_cry_noninfo_phrase()) return; #ifdef DEBUG if (object().agent_manager().member().combat_members().empty()) Msg ("! I am in combat, but there is no combat members at all (including me), npc[%s],team[%d],squad[%d],group[%d]", *object().cName(), object().g_Team(), object().g_Squad(), object().g_Group() ); #endif // DEBUG bool search_with_allies = object().agent_manager().member().combat_members().size() > 1; object().sound().play ( search_with_allies ? eStalkerSoundEnemyLostWithAllies : eStalkerSoundEnemyLostNoAllies, max_start_time, min_start_time, max_stop_time, min_stop_time, id ); } Не нашел вообще: Код sound_attack
sound_search -------------------- |
 
|
|
19.09.2017, 12:16
Сообщение
#19
|
|
Грандмастер Репутация: 118 Группа: Участник Сообщений: 1788 Награды: 4 Регистрация: 04.04.2013 |
Мысли не программиста sound_death и sound_anomaly_death - тут в общем-то понятно, что звук воспроизводится при смерти NPC. Вопрос ток в том, как он понимает, что умер в аномалии. Думаю Код notify_on_wounded_or_killed (who); sound_hit - тут говорится, если жив и ранен. Или "wounded" следует понимать как получил ранение? (второй код не ясен) Судя по звуку, именно так. sound_humming - тут чет про смарт-террейн, и то что объект привязан. В скобках некие цифры, наверное задержка. Во втором коде, если что-то выполнено, и опять же привязан. Судя по звуку, эт бездействие. Что вроде как сходится, сидит у костра говорит, сразу после боя, точнее после фразы "ну что передохнём маленько..." начинает стоять рассказывать "про сапоги хреновые". sound_alarm - вроде разобрали уже, эт когда обнаружил врага. sound_backup - тут что-то похожее на предыдущий. Тоже, если видит врага, поведение в группе. Судя по звукам, там говорится "На получи! или Ты труп мужик!" Даже не знаю, как-то непонятно что тут служит условием. Видимо тоже обнаружение врага, но без проверки человек ли это. Видать и на монстров чтобы кричали. Что странно, учитывая фразу про мужика... хотя... вроде наблюдал такое, когда на монстра так кричали. sound_detour - если враг человек, поведение в группе. Судя по звуку, "просит прикрыть", а также как у предыдущего, кричит "На получи!" или Ты труп мужик!". sound_need_backup - если cover_detouring и fire_make_sense. Типа если "можно обойти" и "стрельба имеет смысл". Судя по звуку, кричит "Рви! Я его прижал!". sound_friendly_fire - это похоже то же что и sound_hit, но закомментировано. Плюс проверка (условие) какое-то насчет отношения (наверное типа друг/враг). sound_panic_human и sound_panic_monster - тут не очень понятно. Похоже они оба завязаны на боёвку, с тем условием что если враг человек. По звукам, то что говорит NPC убегая от врага NPC или монстра. Уже не знаю, делает ли игра разницу, кто враг. Думается что нет... sound_tolls - тут просто, поведение в группе. А по звуку, говорит "Тут нашего убили". Эт явно не случайно. Но условий для этого чет не вижу в коде. Хотя... тут наверное следует смотреть полный код: Код Код void CAI_Stalker::react_on_member_death () { CMemberOrder::CMemberDeathReaction &reaction = agent_manager().member().member(this).member_death_reaction(); if (!reaction.m_processing) return; if (Device.dwTimeGlobal < reaction.m_time + TOLLS_INTERVAL) return; if (agent_manager().member().group_behaviour()) sound().play (StalkerSpace::eStalkerSoundTolls); reaction.clear (); } Реакция на смерть союзника. Ток не пойму, как NPC это определяет? По коду? Или сам видел как убили? Или нашёл тело? Здесь некий интервал, задержка времени видимо. Думаю, тут по коду, данные из боя приходят, через некоторое время NPC воспроизводит звук. sound_grenade_alarm - тоже непонятное, просто: если отношение враг. Также надо полный код: Код Код void CAI_Stalker::react_on_grenades () { CMemberOrder::CGrenadeReaction &reaction = agent_manager().member().member(this).grenade_reaction(); if (!reaction.m_processing) return; if (Device.dwTimeGlobal < reaction.m_time + GRENADE_INTERVAL) return; // u32 interval = AFTER_GRENADE_DESTROYED_INTERVAL; const CMissile *missile = smart_cast<const CMissile*>(reaction.m_grenade); // if (missile && (missile->destroy_time() > Device.dwTimeGlobal)) // interval = missile->destroy_time() - Device.dwTimeGlobal + AFTER_GRENADE_DESTROYED_INTERVAL; // m_object->agent_manager().add_danger_location(reaction.m_game_object->Position(),Device.dwTimeGlobal,interval,GRENADE_RADIUS); if (missile && agent_manager().member().group_behaviour()) { // Msg ("%6d : Stalker %s : grenade reaction",Device.dwTimeGlobal,*m_object->cName()); CEntityAlive *initiator = smart_cast<CEntityAlive*>(Level().Objects.net_Find(reaction.m_grenade->CurrentParentID())); if (is_relation_enemy(initiator)) sound().play (StalkerSpace::eStalkerSoundGrenadeAlarm); else if (missile->Position().distance_to(Position()) < FRIENDLY_GRENADE_ALARM_DIST) sound().play (StalkerSpace::eStalkerSoundFriendlyGrenadeAlarm); } reaction.clear (); } Реакция на гранату, missile (ракета? снаряд? Наверное имеется ввиду полет гранаты), поведение в группе. Судя по звуку, сообщает NPC, что рядом с ним граната упала. sound_friendly_grenade_alarm - а тут как у предыдущего, с поправкой на дистанцию. Видимо, NPC бросил гранату, слишком близко к союзникам. P.S. Не помню таких фраз в игре. Может очень редки. sound_running_in_danger и sound_walking_in_danger - тут что-то про тип передвижения, если стоит на месте или бежит. Второй, который walking, закомментирован. Как-то непонятно, надо снова полный код: Код Код void CAI_Stalker::UpdateCL() { START_PROFILE("stalker") START_PROFILE("stalker/client_update") VERIFY2 (PPhysicsShell()||getEnabled(), *cName()); if (g_Alive()) { if (g_mt_config.test(mtObjectHandler) && CObjectHandler::planner().initialized()) { fastdelegate::FastDelegate0<> f = fastdelegate::FastDelegate0<>(this,&CAI_Stalker::update_object_handler); #ifdef DEBUG xr_vector<fastdelegate::FastDelegate0<> >::const_iterator I; I = std::find(Device.seqParallel.begin(),Device.seqParallel.end(),f); VERIFY (I == Device.seqParallel.end()); #endif Device.seqParallel.push_back (fastdelegate::FastDelegate0<>(this,&CAI_Stalker::update_object_handler)); } else { START_PROFILE("stalker/client_update/object_handler") update_object_handler (); STOP_PROFILE } if ( (movement().speed(character_physics_support()->movement()) > EPS_L) && (eMovementTypeStand != movement().movement_type()) && (eMentalStateDanger == movement().mental_state()) ) { if ( (eBodyStateStand == movement().body_state()) && (eMovementTypeRun == movement().movement_type()) ) { sound().play (eStalkerSoundRunningInDanger); } else { // sound().play (eStalkerSoundWalkingInDanger); } } } Тут ещё говорится про eMentalStateDanger. Мол в состоянии опасности. Судя по звуку, эт сильная отдышка. Наверное и правда, когда NPC на сильном шухере, носится туда сюда. Сообщение отредактировал aka_sektor - 19.09.2017, 12:17 -------------------- |
 
|
|
19.09.2017, 16:42
Сообщение
#20
|
|
Грандмастер Репутация: 118 Группа: Участник Сообщений: 1788 Награды: 4 Регистрация: 04.04.2013 |
Вторая часть... sound_kill_wounded - тут с условиями не очень понятно. Судя по звуку, NPC говорит его, перед тем, как добить раненного. sound_enemy_critically_wounded - если враг мог получить ранение. Судя по звуку, NPC кричит что попал во врага. sound_enemy_killed_or_wounded - похоже тоже, что и предыдущий, только с поправкой на то, что добил. И звук сходится. sound_attack_no_allies - если враг человек, если может говорить, ну и вторая часть, что-то про кол-во участников боя. По звуку, кричит "Получи гад!" или "От меня не уйдешь!" sound_attack_allies_single_enemy - код соответствует второй части предыдущего. По звуку, кричит "Размолотим!" или "Мочи его!" или снова "Получи гад!". sound_attack_allies_several_enemies - код аналогично предыдущему, с той разницей, что звук "Мочи его!" заменен на "Мочи всех!". sound_search1_no_allies - если может говорить, что-то про кол-во участников боя. По звуку, как у sound_attack_no_allies, "От меня не уйдешь!". sound_search1_with_allies - как и предыдущий, но звуки уже другие: "Вылезай, не прячься..." , "Куда ж он спрятался, а?". ЧН и ЗП параметр: sound_throw_grenade - что-то про состояние опасности, слот инвентаря, и состояние eWorldPropertyStartedToThrowGrenade. Очевидно, что воспроизводит звук NPC, когда готовится кинуть гранату. Звук подтверждает: "Получи гранату!" ЗП параметры: sound_wounded - поведение в бою, реакция на союзника если выжил. По звуку, "Нашего зацепило!". sound_enemy_lost_no_allies - по коду, это копия sound_search1_no_allies . Звук не указан. sound_enemy_lost_with_allies - по коду, это копия sound_search1_with_allies. Звук один из тех же двух, т.е.: "Куда ж он спрятался, а?". abramcumner, как тебе такой разбор? -------------------- |
 
|
|
Текстовая версия | Сейчас: 20.04.2024, 08:34 |