Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Параметры озвучки NPC
GAMEINATOR forums > S.T.A.L.K.E.R. > Мастерская: создание модов для S.T.A.L.K.E.R.
aka_sektor
При каких условиях 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_

Разумеется приветствуется реальные данные, а не только копипаст из интернета.
macron
Реальные данные для ТЧ наверняка можно найти в ai_stalker.cpp и ai_stalker_script.cpp.
aka_sektor
Цитата(macron @ 17.09.2017, 19:25) *
можно найти в

Если ты про комментарии к коду, то судя по сырцам 1.0007 - нету их.
lafugix
Даже этот бесполезный коммент полезнее всей твоей компиляционной деятельности и мемосных видосов.

Это было слишком грубо. [ForserX]
aka_sektor
lafugix,
->


Я не отвечаю на провокации.
ForserX
Господин Лафик, умерьте пыл.

aka_sektor, комментарии в коде тут никому не упали.

Когда ты уже начнёшь читать названия переменных и приходить к выводу от размышлений и ингейм проверок?
RayTwitty
Цитата(Forser @ 17.09.2017, 20:00) *
Когда ты уже начнёшь читать названия переменных и приходить к выводу от размышлений и ингейм проверок?

Но ведь для этого нужно включить мозг z_lol1.gif
Cossack-HD
Цитата(RayTwitty @ 17.09.2017, 23:27) *
Цитата(Forser @ 17.09.2017, 20:00) *
Когда ты уже начнёшь читать названия переменных и приходить к выводу от размышлений и ингейм проверок?

Но ведь для этого нужно включить мозг z_lol1.gif

В программировании и в любой разработке важна документация. У столкира нет документации по очень многим вопросам, это усложняет разработку. Человек просто интересуется, может кто-то уже ковырял эти параметры.. и он сам уже собрал довольно много инфы, так что не нужно тут грубить - это не нуб, который спрашивает, как распаковать гейдату или как сделать батник.
Однако, не думаю, что нужно было запиливать отдельную тему касательно вопросов озвучки - это магнит для троллей.

Метод перебора и проверок вживую вполне подходит.
Я как-то делал мод на L4D2, заменяя все звуки зомби на сами знаете что - там сотни звуков и хрен знает как они воспроизводятся (в каких ситуациях) - вон там бы помогли советы и документация.
ForserX
Цитата(Cossack-HD @ 17.09.2017, 23:07) *
В программировании и в любой разработке важна документация.

Молодой человек, пысовцы - КЛЯТЫЕ ООП'шники. Первое правило ООП гласит: названия всего и всея должно описывать происходящее внутри.
aka_sektor
Цитата(Forser @ 17.09.2017, 20:00) *
названия переменных
Назвать можно как угодно. Тупо перевести, и сказать что вот оно так работает - неправильно.

Хоть ты и говоришь, что:
Цитата(Forser @ 18.09.2017, 00:27) *
пысовцы - КЛЯТЫЕ ООП'шники
С учетом того, сколько раз переписывали все, и сколько билдомусора, далеко не факт, что все параметры вообще работают.

Цитата(Forser @ 17.09.2017, 20:00) *
приходить к выводу от размышлений и ингейм проверок
Да... придумать можно всякое.
Тут в общем также. Ну услышишь ты фразу. О чём это тебе скажет? Идёт бой. Попробуй разберись, что именно послужило условием к произношению той или иной фразы.

Повторюсь из темы импорта звука:
Цитата(aka_sektor @ 16.09.2017, 16:37) *
И все таки, эт нужно в исходниках смотреть каждый тип отдельно.
Судить может каждый по-разному, в меру своих знаний. Пока что по теме чего-то полезного сказано не было.

Цитата(RayTwitty @ 17.09.2017, 21:27) *
нужно включить мозг
Избавь меня от своего тщеславия.

Цитата(Cossack-HD @ 17.09.2017, 23:07) *
В программировании и в любой разработке важна документация. У столкира нет документации по очень многим вопросам, это усложняет разработку.
Цитата(Cossack-HD @ 17.09.2017, 23:07) *
просто интересуется, может кто-то уже ковырял эти параметры

Верно.

Цитата(Cossack-HD @ 17.09.2017, 23:07) *
это магнит для троллей

Есть верное средство: "Не кормить их".

P.S.
Вообще, мы же все прекрасно знаем. Те кто реально разбирается в чем-то, осознанно предпочитают не рассказывать о том как, и что они делают. Просто делают моды, а потом почивают на лаврах.

Добиться от таких людей хоть какого-то вразумительного ответа по каким-либо вопросам моддинга, не удается или удается очень редко. Кто-то реально занят, а кто-то считает слишком низким для себя разжевывать что-либо кому-то, как они опять же считают, ниже себя интеллектом. Зато, они просто обязаны отписать какой-нибудь ехидный комментарий везде где только можно.
abramcumner
Цитата(aka_sektor @ 18.09.2017, 16:24) *
Вообще, мы же все прекрасно знаем. Те кто реально разбирается в чем-то, осознанно предпочитают не рассказывать о том как, и что они делают. Просто делают моды, а потом почивают на лаврах.

Добиться от таких людей хоть какого-то вразумительного ответа по каким-либо вопросам моддинга, не удается или удается очень редко. Кто-то реально занят, а кто-то считает слишком низким для себя разжевывать что-либо кому-то, как они опять же считают, ниже себя интеллектом. Зато, они просто обязаны отписать какой-нибудь ехидный комментарий везде где только можно.

biggrin.gif Ты как Дизель/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. Теперь ты обладаешь секретным знанием - делись им. Уверен, что кроме тебя больше этого никто не знает smile.gif
aka_sektor
Цитата(abramcumner @ 18.09.2017, 17:00) *
никто не знает, когда НПЦ какие звуки когда произносят. Это вообще никому не уперлось.

Даже так? blink.gif
Удивительно, что 10 лет никому не было интересно.

Цитата(abramcumner @ 18.09.2017, 17:00) *
за него самого это никто не сделает

Ну... вообще, чет такое уже описывали (второй спойлер): http://stalker-worlds.ru/forum/topic/3148-...dk/#entry147060

Цитата(abramcumner @ 18.09.2017, 17:00) *
Это не так уж и сложно.

Насчет этого согласен:
Цитата(abramcumner @ 18.09.2017, 17:00) *
в исходниках строку "sound_alarm"

Но не насчет этого:
Цитата(abramcumner @ 18.09.2017, 17:00) *
исходниках строку eStalkerSoundAlarm
Не знал. А вот это уже интересно. Посмотрю.
Цитата(abramcumner @ 18.09.2017, 17:00) *
Вот условие, когда произносится звук sound_alarm

Как-то не особо что приведенный код говорит. Расшифруй.

Цитата(abramcumner @ 18.09.2017, 17:00) *
Уверен, что кроме тебя больше этого никто не знает

Дело не в том что я знаю, а в том что знает человек, который в этом реально разбирается. Программист например, коим я лично не являюсь.

P.S.
Цитата(abramcumner @ 18.09.2017, 17:00) *
Дизель/andreyholkin ... на хрее запилить гусеницы ... ГСЦ 10 лет пыталось

Ничего не слышал про это.
Он вроде переносит ЧН на двиг ЗП.
abramcumner
Цитата(aka_sektor @ 18.09.2017, 17:25) *
Даже так? blink.gif
Удивительно, что 10 лет никому не было интересно.

z_lol1.gif
Ну за всех конечно неправильно говорить, но мне вот совершенно не было интересно, да и сейчас тоже. Так же, как и гусеничный транспорт в сталкере.

Цитата
Как-то не особо что приведенный код говорит. Расшифруй.

Так это надо дальше поиском заниматься, когда какая функция возвращает истину, а когда ложь. Навскидку так:
Код
                                                                                            // кривой перевод английских названий функций
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 часов на поиск по файлам, чтобы получить "реальные данные".

Цитата
Он вроде переносит ЧН на двиг ЗП.

Ну кроме этого, он еще за гусеницы болеет.
ForserX
Цитата(aka_sektor @ 18.09.2017, 16:24) *
Добиться от таких людей хоть какого-то вразумительного ответа по каким-либо вопросам моддинга, не удается или удается очень редко. Кто-то реально занят, а кто-то считает слишком низким для себя разжевывать что-либо кому-то, как они опять же считают, ниже себя интеллектом. Зато, они просто обязаны отписать какой-нибудь ехидный комментарий везде где только можно.

Позволь объясню. Модмейкеры - народ скупой в своих знаниях. Для многих вопросов большинству приходится дополнительно изучать самому. Я отвечу всегда на вопрос, если ответ на него мне уже известен, в противном случае отправлю автора изучать всё самостоятельно. Есть неплохие материалы практически по любой части, которые помогут в этом деле. Часть по скрипта я сам правил и обновлял. Раньше я тоже придерживался тулешо мнения, но когда полез в зато, то понял, что иногда, для самых банальных вопросов, приходится искать ответ часами. Уж прости, такова сэляви.
aka_sektor
Цитата(abramcumner @ 18.09.2017, 18:07) *
за всех конечно неправильно говорить

Верно.

Цитата(abramcumner @ 18.09.2017, 18:07) *
мне вот совершенно не было интересно, да и сейчас тоже

Тогда удивительно, как ты вообще решил тут ответить что-то по теме.

Цитата(abramcumner @ 18.09.2017, 18:07) *
Навскидку так

Я уже тоже было начал:
Код
объект - память - визуал - видит сейчас - враг - выбран
враг - выбран - человек
...

Но у тебя понятнее.

Цитата(abramcumner @ 18.09.2017, 18:07) *
таких тупо нет ... надо потратить N часов ...

Как же? А кто же тогда навскидку тут прикинул... cool.gif
И не n-часов прошло.

P.S.
Цитата(Forser @ 18.09.2017, 18:29) *
Модмейкеры - народ скупой в своих знаниях.

Не согласен. Есть примеры, одиночек, которые создавали моды.

Цитата(Forser @ 18.09.2017, 18:29) *
отправлю автора изучать всё самостоятельно

Ну эт лишнее. Это очевидно, и делается автором ещё перед тем, как задавать вопросы.

Цитата(Forser @ 18.09.2017, 18:29) *
Есть неплохие материалы практически по любой части

Согласен что есть, но не согласен, что неплохие. Есть устаревшие и непроверенные. Всякая вымышленная инфа, которая на практике не работает.

Цитата(Forser @ 18.09.2017, 18:29) *
для самых банальных вопросов, приходится искать ответ часами

Я не считаю, что поведение AI эт банальный вопрос. Вот например, OLR, восстановили же: https://vk.com/wall-35238079_17022
abramcumner
Цитата(aka_sektor @ 18.09.2017, 19:38) *
Тогда удивительно, как ты вообще решил тут ответить что-то по теме.

Твоя деятельность по поиску и организации информации о хрее интересна, а сами параметры нет.

Цитата
Как же? А кто же тогда навскидку тут прикинул... cool.gif
И не n-часов прошло.

Ну алгоритм поиска ты теперь знаешь smile.gif
aka_sektor
Цитата(abramcumner @ 18.09.2017, 19:44) *
а сами параметры нет

Ну я захотел этот вопрос разобрать, чтобы лучше понять, как возможно кастомизировать озвучку неписей.

Цитата(abramcumner @ 18.09.2017, 19:44) *
алгоритм поиска ты теперь знаешь

Ещё бы для Game Type такой же.
aka_sektor
Ну... в общем, такое в исходниках:
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
aka_sektor
Мысли не программиста

sound_death и sound_anomaly_death - тут в общем-то понятно, что звук воспроизводится при смерти NPC.
Вопрос ток в том, как он понимает, что умер в аномалии. Думаю оператор "else", зависит от "(who)".
Код
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
Вторая часть...
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, как тебе такой разбор?
aka_sektor
По поводу:
Цитата(aka_sektor @ 18.09.2017, 22:26) *
sound_backup
eStalkerSoundBackup

Чет присмотрелся, кода недостаточно. Вот более полный:
Код
#ifndef SILENT_COMBAT
    if (object().memory().enemy().selected()->human_being()) {
        if (object().agent_manager().member().can_cry_noninfo_phrase())
            if (object().Position().distance_to_sqr(object().memory().enemy().selected()->Position()) < _sqr(10.f))
                if (object().memory().visual().visible_now(object().memory().enemy().selected()) && object().agent_manager().member().group_behaviour())
                    object().sound().play        (eStalkerSoundBackup,0,0,6000,4000);
    }
#endif
}

Кажись допер, в чем отличие от sound_alarm

sound_backup - срабатывает на близкой дистанции. Типа когда непись заметил игрока в упор, вот тогда он и кричит "Ты труп мужик!".

UPD:
Насчет:
Цитата(aka_sektor @ 18.09.2017, 22:26) *
sound_detour и sound_need_backup
eStalkerSoundDetour и eStalkerSoundNeedBackup

Тоже, посмотрел ещё код, стало понятнее.
sound_detour связан с CStalkerActionDetourEnemy
sound_need_backup связан с CStalkerActionHoldPosition

Первый судя по всему, то что непись говорит когда обходит врага.
А второй, когда кемперит.
aka_sektor
Насчет:
Цитата(aka_sektor @ 18.09.2017, 22:26) *
sound_attack_no_allies и sound_attack_allies_single_enemy и sound_attack_allies_several_enemies

Тоже, вчитался по лучше. Похоже что:
sound_attack_no_allies - если NPC в одиночку атакует врага.

sound_attack_allies_single_enemy - если NPC атакует с союзниками 1 врага.

sound_attack_allies_several_enemies - если NPC атакует с союзниками больше, чем 1 врага.

UPD:
Цитата(aka_sektor @ 18.09.2017, 22:26) *
sound_search1_no_allies и sound_search1_with_allies

Ещё раз проверил. Тут похоже условие, если может говорить и если NPC атакует с союзниками врага.
Как и в случае с sound_panic_human и sound_panic_monster, разницы между 2мя параметрами нет.
Видимо NPC просто комментирует бой, пока не видит врага.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.