ЕДИНЫЙ ФОРУМ S.T.A.L.K.E.R. - МЕТРО 2033

Объявление

УВАЖАЕМЫЕ ПОСЕТИТЕЛИ ! РЕГИСТРИРУЙТЕСЬ И ЧУВСТВУЙТЕ СЕБЯ КАК ДОМА ( НЕ ЗАБЫВАЯ ПРО ОБЩИЕ ПРАВИЛА ) , ПРИСОЕДИНЯЙТЕСЬ !!! администратор единого форума ENIGMADAX .

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » ЕДИНЫЙ ФОРУМ S.T.A.L.K.E.R. - МЕТРО 2033 » КОНФИГИ СТАЛКЕР ТЧ : » КОНФИГИ СТАЛКЕР ТЧ


КОНФИГИ СТАЛКЕР ТЧ

Сообщений 1 страница 24 из 24

1

Оформление инвентаря:
---------------------------------------
По пути gamedata.db0/config/ui/ лежит файл inventory_new.xml содержащий координаты объектов инвентаря.
Инвентарные слоты состоят из багграундных текстур, и слотовых сеток.
К примеру строки
<belt_slots x="0" y="80" width="1024" height="172">       
     <texture>ui_slots_belt</texture>
</belt_slots>
содержат координаты (x="0" y="80") и размер (width="1024" height="172") багграундной текстурки ui_slots_belt для двух оружейных слотов и слота ремня.

А строки
<dragdrop_belt x="645" y="136" width="410" height="60"
      cell_width = "60" cell_height="60" rows_num="1" cols_num="5"/>
содержат координаты (x="645" y="136"), размер сетки(width="410" height="60"), размер одной ячейки сетки (cell_width = "60" cell_height="60"), число строк (rows_num="1") и столбцов (cols_num="5") слотовой сетки инвентаря.
Отсчет координат x y идет с левого верхнего угла.
Меняя значения приведенных значения можно изменять внешний вид инвентаря.

Примеры:
Изменив значения в строках
<dragdrop_belt x="645" y="136" width="410" height="60"
     cell_width = "60" cell_height="60" rows_num="1" cols_num="5"/>
на
<dragdrop_belt x="590" y="118" width="410" height="104"
       cell_width = "52" cell_height="52" rows_num="2" cols_num="5"/>

у нас в ременном отделении под артефакты вместо 5ти, будет 10ть слотовых ячеек.
Или изменив координаты (x="870" y="725") в строках
<exit_button x="870" y="725" width="157" height="48">
....     
....   
</exit_button>
на координаты (x="10" y="10"), можно перенести кнопку Выхода(из инвентаря) из правого нижнего угла в левый верхний угол.

0

2

Параметры slot_persistent_*
---------------------------------------------------
slot_persistent_1  = true    ;knife
slot_persistent_2  = false    ;pistol
slot_persistent_3  = false    ;automatic
slot_persistent_4  = true    ;grenades
slot_persistent_5  = true    ;binocular
slot_persistent_6  = true    ;bolt
slot_persistent_7  = false    ;outfit
slot_persistent_8  = true    ;pda
slot_persistent_9  = true    ;detector
slot_persistent_10  = true    ;torch
Эти параметры проверяются когда игрок обшаривает контейнер или начинает торговаться с кем-то.
Если стоит false то вещь находящаяся в слоте при обшаривании или торговле будет автоматически выложена из слота в рюкзак. Если стоит true то при обшаривании/торговле вещь останется в слоте.
При завершении торговли или обшаривании контейнера, слоты автоматом забирают в себя соответствующие вещи из рюкзака. (если конечно эти вещи остались в рюкзаке - не были проданы или выложены в контейнер)
Если для параметров:
slot_persistent_1  = true    ;knife
slot_persistent_5  = true    ;binocular
slot_persistent_6  = true    ;bolt
slot_persistent_8  = true    ;pda
slot_persistent_9  = true    ;detector
slot_persistent_10  = true    ;torch
вместо true выставить false при обшаривании или торговле в рюкзаке можно увидеть ПДА, фонарик, детектор, ножь, болты, которые в обычном режиме в инвентаре не отображаются.

0

3

Активация артефактов
---------------------------------------------------------------
Распишу по пунктам как добавить например к "огненому шару" аномалию Жарка...
Открываете файл: gamedata/config/misc/artefacts.ltx
И там в самом начале файла такая секция:
;Артефакты, которые при активизации создают аномальные зоны
;формат: {секция_артефакта} = {секция_зоны},Radius,Power
[artefact_spawn_zones]
af_medusa = zone_mosquito_bald_weak, 2.0, 30.0

Обозначает что артефакт af_medusa при активации создаст аномальную зону zone_mosquito_bald_weak с радиусом 2 метра и мощностью 30 (возможно влияет и на время жизни аномалии)
Кончается этот список по идее строчкой: mp_af_electra_flash = zone_witches_galantine, 3, 50.0
и сразу после неё пишете: af_fireball = zone_zharka_static, 3, 30.0
В принципе можно прописать там не статик а zone_zharka_weak незнаю что из них правильнее использовать... статик работает тоже.В той-же папке есть файл zone_zharka, где описаны свойства зон _weak, _average, _strong( слабая, средняя, сильная), а также зона zone_zharka_static.
После этого у вас игра станет вылетать с ошибкой про невозможность обнаружить последовательность описывающую анимацию активации аномалии.
А это всё там же в начале файла чуть ниже того где вы добавили новый артефакт в список есть такие строчки:
[af_activation_gravi]
;----------------------------------------------------------------------------------------------------------------------------------------
;format:                        time(sec),    sound_name,                 light_R,G,B,      light_range,        particle_name,                        af_animation_name
;----------------------------------------------------------------------------------------------------------------------------------------
starting                    =    5.0,        anomalygravi_idle00,    0.5, 1.0, 1.5,      5.0,            "anomaly2artefact_gravi_blast_start",    "idle"
flying                        =    2.0,        anomalygravi_idle01,    0.8, 1.0, 1.2,      3.0,            "anomaly2artefactartefact_gravi",                "idle"
idle_before_spawning        =    5.0,        anomalygravi_blowout5,    1.0, 1.0, 1,        0.0,            "anomaly2artefact_gravi_blast_finished",    "idle"               
spawning                    =    1,          anomalygravity_entrance,    0.9, 1.1, 1.01,      0.0,        "",        "idle"

Что как раз и описывает анимацию..
По-хорошему надо написать свою анимацию к жарке но это честно говоря не обязательно... потому что нам сейчас важна не красота а работоспособность.... Так вот... из заголовка "[af_activation_gravi]" берем название последовательности af_activation_gravi и ищем сам артефакт af_fireball (кто уже забыл зачем, мы на него собирались вешать новую активацию)
Найдете что-то вроде:
[af_fireball]:af_base
GroupControlSection    = spawn_group
$spawn             = "artifactszharka fireball"
$npc            = on                ; option for Level Editor
;$prefetch         = 3
cform           = skeleton
class           = ARTEFACT

visual                = physicsanomalyartefact_fire.ogf
description            = enc_zone_artifact_af-fireball
inv_name            = af-fireball
И где-нибудь тут добавляете строчку: artefact_activation_seq = af_activation_gravi
И на этом всё. Прописываем в artefacts.ltx в блоке [af_base]:identity_immunities вместо ;slot=10 вот это: slot=1. Насколько я знаю, знак ; зоначает, что строка закомментирована(неактивна) У себя я прописывал slot=1 между строчками inv_name = af-electra-moonlight inv_name_short = inv_weight = 0.05 slot = 1 inv_grid_x = 10 inv_grid_y = 10 для того артефакта, который хочу активировать.
В игре берем артефакт в первый слот и активируем.

0

4

Добавление статей в PDA
---------------------------------------------------
Добавление статьи
На примере статьи из Artefact Activation Mod разберем их добавление в PDA:
· Добавим в файл config\gameplay\encyclopedia_zone.xml новую статью:
    <!-------------------------------- Activation - Basic ----------------------------->

    <article id="zone_anomalies_activation_basic" name="zone_anomalies_activation-basic" group="Anomalies">
<texture x="500" y="150" width="100" height="100">ui_icon_photo</texture>
        <text>enc_zone_anomalies_activation_basic</text>
    </article>
Здесь:
·
o article id - внутреннее имя статьи, именно на него ссылаются в файлах игры
o name - имя статьи, отображаемое в игре, подгружается из строкового массива
o texture - картинка и её позиция в статье, в данном случае мы использовали обычный белый шум
o text - текст статьи, отображаемый в игре, подгружается из строкового массива
· Добавим в, например, config\gameplay\info_l01escape.xml (инфопорции уровня "Кордон") ссылку на получение статьи - скажем, к трупу у туннеля, при обыске которого выдается информация о аномалиях в туннеле (вы его обнаруживаете, проходя второе спецзадание от Сидоровича). Найдем эти строки и дополним их:
<!-- труп у аномалии -->
<info_portion id="esc_tutorial_dead_novice">
    <article>tutorial_moving_anomaly</article>
    '''<article>zone_anomalies_activation_basic</article>'''
</info_portion>
Главное - никогда не путайте article id, name и text статьи. Я в данном примере это сделать легко. Лучше называйте их непохожими друг на друга названиями.
· Так как в статье у нас есть такое поле:
        <text>enc_zone_anomalies_activation_basic</text>
Да и название тоже не написано прямо, а ссылается на определенную строку, то добавим этот самый text в config\text\rus\string_table_enc_zone.xml, в нашем случае:
<string id="enc_zone_anomalies_activation-basic">
    <text>Активация - базис</text>
</string>
<string id="enc_zone_anomalies_activation_basic">
    <text>С артефактами связана, помимо всего прочего, ''(ну, и так далее, там большой текст)''...</text>
</string>
Дополнительно
Чтобы статья добавлялась при получении определенного задания, в ..._task.xml (вместо ... стоит название уровня) нужно прописать конструкцию вида:
<article>название_задания_descr</article>

0

5

КЛАССИФИКАЦИЯ ОБЬЕКТОВ ИСПОЛЬЗУЕМАЯ В СТАЛКЕР ТЧ.
------------------------------------------------------------------------------------------
КЛАССИФИКАЦИЯ НЕ ПОЛНАЯ ТАК КАК НЕУДАЛОСЬ ПОЛНОСТЬЮ РАСПОЗНАТЬ ИСХОДНИКИ .

   
AMMO                           Патроны    
ARTEFACT                           Артефакты    
A_OG7B                           OG7B    
A_VOG25                            VOG25    
A_M209                           M209    
AI_GRAPH                           ai\graph point    
AI_SPGRP                           spawn_group_zone /spawn_group    
AI_STL_S                           m_stalker.ltx    
AI_STL                          [m_army_(боец)] [m_bandit_(боец)]    
AI_CROW                           Ворона    
AI_DOG_R                          [m_dog_e] (m_dog_.ltx)    
AI_TRD_S                           Торговец (Бывший класс AI_TRADE)    
AI_PHANT                            Фантомы монстров    
AI_RAT_G                          Группа крыс    
AI_RAT                           Крыса    
C_HLCP_S                           Вертолёт    
D_PDA                            КПК    
D_SIMDET                            Детекторы    
E_STLK                            equ_stalker Обмундирование людей(бывшие EQU_MLTR E_STLK)    
EVENT                            tg_event    
G_F1                           Граната    
G_RGD5                            Граната    
G_FAKE                           Fake Missiles and Grenades_____Свойства CustomRocket    
G_RPG7                             Ракета вертолета (weapons\rpg_7\wpn_rpg_7_grenade.ogf)    
II_BOLT                               Болт    
II_EXPLO                            Взрывоопасные объекты — бочки, канистры и т. д.    
II_DOC                           item_document_01.ogf (Уникальное имя Documents)    
II_ATTCH                              Аттачибл объекты, рация и пр.    
II_FOOD                                Хавчик    
II_BOTTL                           Водка    
II_ANTIR                            Антирад    
II_MEDKI                            Аптечки    
II_BANDG                               Бинт    
LVL_CHNG                  level_changer    
NW_ATTCH             custom_script_object (handradio было)    
O_HLAMP                            lights_hanging_lamp    
O_PHYS_S                      physic_object    
O_SEARCH             search_light    
O_BRKBL                             breakable_object    
O_ACTOR                              actor    
O_INVBOX                              devices\inventory box    
O_SWITCH             trigger    
C_HLCP_S                            helicopter       
P_DSTRBL                              physic_destroyable_object    
P_SKELET                              ph_skeleton_object    
RE_SPAWN            ai\respawn    
SCRPTART                               Этот класс встречается у пары артефактов    
SPECT                               spectator    
SMRTTRRN                              smart_terrain    
SCRPTCAR             m_car    
SCRIPTZN                              script_zone    
SCRPTOBJ                                script_object    
SM_BLOOD                Кровосос    
SM_BOARW                 Кабан    
SM_BURER                             Бюрер    
SM_CAT_S                                 Кошка    
SM_CHIMS                             Химера    
SM_CONTR                Контролер    
SM_DOG_S               Сепой пес    
SM_FLESH                                  Плоть    
SM_IZLOM                                [m_fracture_e] (по идее излом)    
SM_GIANT                                Псевдогигант    
SM_POLTR                                 Полтергейст    
SM_P_DOG                 Псевдособака(Собака чернобыля)    
SM_SNORK                 Снорк    
SM_TUSHK                                  Тушканчик (бывший AI_TUSH)    
SM_ZOMBI                               Зомби    
SPC_RS_S                              ai\space_restrictor    
TORCH_S                                     device_torch    
W_MOUNTD                  wpn_pkm_trenoga.ogf    
W_SILENC                                  wpn_addon_silencer    
W_GLAUNC                     wpn_addon_grenade_launcher    
WP_WALTH                  Вальтер    
WP_VINT                                    Винторез    
WP_VAL                                      ВАЛ    
WP_USP45                           usp45    
WP_SVU                                        СВУ    
WP_SHOTG                     Дробовики    
WP_RPG7                                       РПГ7    
WP_RG6                                           РГ6    
WP_PM                                        ПМ    
WP_KNIFE                                        Нож    
WP_HPSA                                         HPSA    
WP_SVD                                         СВД    
WP_GROZA                          Гроза    
WP_BM16                                             ВМ16    
WP_BINOC                         Бинокль    
WP_LR300                                         LR300    
WP_AK74                                         АК74    
WP_SCOPE                          Опт. Прицел    
Z_TEAMBS                                     zone_team_base    
Z_MINCER ----------    
Z_GALANT----------      
Z_AMEBA                                       [zone_ameba]    
Z_RADIO                                        [zone_monolith] [zone_radioactive]    
Z_NOGRAV                        [zone_no_gravity]    
Z_MBALD                                        [zone_campfire_mp_nolight] [zone_campfire_grill] [zone_flame] [zone_zhar] [zone_emi] [zone_flame_small]
                                                       [zone_mine_field] [zone_death] [zone_sarcofag] [zone_teleport] [zone_teleport_out]    
Z_RUSTYH                                   [zone_rusty_hair]    
Z_ZONE                                      [zone_teleport_monolith]    
Z_TORRID                                         [torrid_zone] [fireball_zone]    
ZS_MINCE                            [zone_mincer] (статическая)    
ZS_GALAN                              [zone_gravi_zone] (статическая)    
ZS_MBALD                                [zone_buzz] [zone_mosquito_bald] [zone_witches_galantine] [zone_zharka_static] (статическая)    
ZS_BFUZZ                                       [zone_burning_fuzz] (статическая)

0

6

Новые монстры
-------------------------------------------
Введение
Многие часто сталкиваются с тем, что при попытке добавления монстров не попавшими в финальную версию игра может вылетать. Попробую рассказать, как это дело можно исправить.
Для примера возьму кошек (уж очень они мне нравятся)
Добавить их можно отредактировать файл all.spawn, либо динамически создать в игре через функцию alife:create().
Вылет при появлении
Обычно сопровождается сообщением в логе:
Arguments     : Can't open section 'cat_weak'
Это значит, что монстр у нас не до конца описан. В файле конфигурации идет секция
[m_cat_e]:monster_base
Но для создания разных по силе конфигураций монстров обычно используется такая штука. Создается секция вида
[cat_weak]:m_cat_e
то есть ссылка на основную конфигурацию, а потом указываются параметры, которые отличаются от нее. Например сила, здоровье, угол обзора и тд. Мы пока ограничимся просто добавлением этой секции. В файле config\creatures\m_cat.ltx в конце допишем [cat_weak]:m_cat_e. Запускаем, добавляем кошку, вылетаем с ошибкой:
Arguments     : Can't find variable smart_terrain_choose_interval in [cat_weak]
Что ж, добавим и этот параметр. Посмотрим, какой он у собак, и сделаем также:
smart_terrain_choose_interval = 00:15:00
Запускаем, вылетаем с ошибкой:
Arguments     : Can't find variable satiety_threshold in [cat_weak]
Вобщем, добавляем параметры, по кошка не станет нормально появлятся. Такие ошибки легко локализуются и исправляются.
Ну, на всякий случай, нужно добавить еще две строчки:
critical_wound_threshold = 0.4
critical_wound_decrease_quant = 0.
После этого кошка появляется, бегает, с 30 метров бежит нас кушать. Мы этого не хотим, стреляем в нее, и у нас происходит
Вылет при убийстве
Это знаменитая ошибка:
Arguments     : LUA error: e:\stalker\gamedata\scripts\_g.script:20 ........
Самое просто и неправильное решение - закоментировать 20-ю строку скрипта _g.script, вылет исчезнет, но ошибка никуда не денется. Я не могу сказать с уверенностью, к чему игнорирование этого факта может привести, так как исправлял причину, а не следствие.
Путем нехитрых логических размышлений решение было найдено. Вернее тупым перебором всего, что относилось к делу, криками на форумах, битьем головой о стенку... Потом пришло озарение, вместе с сакраментальным вопросом "что происходит после смерти?" А происходит добавление в статистику убитого объекта (монстра, нпс-а). Поэтому лезем в скрипт xr_statistic.script. В самом начале видим объявление переменной
local killCountProps = {...}
в которой кошек нет. Поэтому добавляем их туда (например, в конец), для начисления очков опыта:
cat_weak = 1, cat_normal = 2, cat_strong = 3,
Хотя мы сделали только cat_weak, но на будущее добавим и остальных. Затем идет перечисление используемых классов монстров:
monster_classes = {
кошек нет и здесь, добавляем:
[clsid.cat_s] = "cat",
Смотрим дальше, видим функцию addKillCount(npc), которая определяет сообщество (community) убитого. Функция вызывает getNpcType(npc), которая находится в этом же скрипте. А там идет обращение к функции IsStalker(npc), и возвращает сообщество и ранг убиенного.
Но тут про мостров ни слова, а значит идем дальше. Функция IsStalker(npc) обнаруживается в скрипте _g.script. Просматривая его обнаруживаем следующие интересующие нас функции:
· is_object_monster(obj)
кошек нет, добавляем рядом с собаками:
otype == clsid.cat or
· IsMonster (object, class_id)
кошки есть, ничего не трогаем.
Для страховки проверим еще одни файл, class_registrator.script. Находим в нем строку
cs_register (object_factory, "CCat", "se_monster.se_monster", "SM_CAT_S", "cat_s")
и успокаиваемся на этом. Запускаем, убиваем, подходим, пытаемся обыскать - вылетаем. Потому что случился
Вылет при обыске
Ну тут уже проще. Вспоминаем, что у нас показывается в инвентаре убитого? Иконка растерзанного трупа. Проверяем m_cat.ltx - действительно, параметр icon отсутствует. Тут появляется два пути.
Первый - нарисовать новую иконку, вставить ее в файл ui_npc_monster.dds, определить координаты и добавить их в xml-описатель ui_npc_monster.xml. И так для каждого нового монстра.
Второй - использовать общую иконку для всех монстров, у которых отсутствует этот параметр. Мы им и воспользуемся, так как для тестовых целей сойдет, а для серьезного применения все равно необходимо иметь хоть какие-то художественные навыки (если кто видел мой тестовый мод "15 кошек", то помнят тот ужас вместо иконки кошки :) )
Для этого отредактируем файл defines.ltx , так как именно в нём содержится секция monster_base, общая для всех монстров. Открываем, ищем секцию, и вставляем
icon = ui_frame_error_sign_red
Это будет такой красный крест в круге. Запускаем, убиваем, обыскиваем и не вылетаем.
Итак, свежедобавленный монстр бегает, живет, нападает. Однако та же кошка по умолчанию невероятно сильна, убивает с одного удара, поэтому для нормальной жизни необходимо подредактировать секцию атаки.
Внимание!!!
Огромный минус в том, что убитое животное не попадает в статистику, хотя мы вроде все для этого сделали. С этим предлагаю разобраться самим. Подсказка: в энциклопедии кошек тоже нет ;)

0

7

Однотипные квесты
--------------------------------------
Описание
Как известно, при разговоре с некоторыми NPC (Сахаров, Бармен, Сидорович, Лукаш, Волк, Шустрый Долговец, Лысый, Охотник и Осведомитель) появляется ветка «есть ли для меня работа?». В целях упрощения создания однотипных квестов, выдаваемых через эту ветку, разработчики создали следующую схему...
Структура однотипных квестов
Сами задания находятся в конфиге:
gamedata\config\misc\task_manager.ltx
Цели квестов и условия их выполнения фиксируются в скрипте:
gamedata\scripts\task_manager.script
Ветки диалогов, отвечающие за эти задания (например, у Сидоровича) выглядит так:
<actor_dialog>tm_trader_dialog</actor_dialog>
<actor_dialog>tm_trader_reward</actor_dialog>
Где первый actor_dialog – диалог с выдачей задания, а второй - диалог по заданию и получению награды, либо отказа от выполнения оного. Никто нас насильно его выполнять не заставляет.
При получении задания информация об этом прописывается и в PDA, не забываем об этом. Информация добавляется с помощью файла:
gamedata\config\gameplay\storyline_info_taskmanager.xml
Описание задания хранится в файле:
gamedata\config\text\rus\stable_task_manager.xml
Всего существует шесть видов подобных заданий:
· eliminate_lager = уничтожить лагерь
· defend_lager = защитить лагерь
· kill_stalker = убить сталкер
· artefact = найти артефакт
· monster_part = найти часть монстра
· find_item = найти предмет
Создаем квест
Для создания дополнительного квеста у Сидоровича нам понадобятся всего три файла:
gamedata\config\gameplay\storyline_info_taskmanager.xml
gamedata\config\misc\task_manager.ltx
gamedata\config\text\rus\stable_task_manager.xml
Открываем task_manager.ltx, в начале видим длинный список заданий, а уж потом сами задания и условия выполнения к ним. Т.е. cначала идет:
[...]
tm_kill_stalker_5
tm_kill_stalker_6
tm_kill_stalker_7
[...]
А затем то, что нам нужно:
[...]
[tm_kill_stalker_6]
type = kill_stalker
community = actor
text = tm_kill_stalker_6_text
description = tm_kill_stalker_6_descr
parent = trader
target = sim_stalker_novice
;reward_money = 1000
reward_reputation = +3
reward_rank = 2
reward_item = af_vyvert, conserva
time = 86400
prior = 1

[tm_kill_stalker_7]
type = kill_stalker
community = actor
text = tm_kill_stalker_7_text
description = tm_kill_stalker_7_descr
parent = trader
target = esc_wolf
reward_money = 10000
reward_reputation = +3
reward_rank = 2
reward_item = vodka, conserva
time = 86400
prior = 1
[...]
Рассмотрим структуру этих записей, заодно создав новую:
· [tm_kill_stalker_7] – наше задание
· type = kill_stalker – тип задания, в данном случае – убийство сталкера
· community = actor – комьюнити, к которому принадлежит выполняющий задание (странный параметр, в игре используется - везде выставлен равным actor'у)
· text = tm_kill_stalker_7_text – описание нашего задания в диалоге
· description = tm_kill_stalker_7_descr – описание нашего задания в PDA
· parent = trader - заказчик
· target = esc_wolf – цель, в данном случае мы собираемся грохнуть Волка
· reward_money = 10000 – сколько денег нам дадут за выполнение
· reward_reputation = +3 – повышение/понижение репутации после выполнения задания
· reward_rank = 2 – кличество очков ранга, выдаваемых за выполнение
· reward_item = vodka, conserva – предметы, выдаваемые в награду за квест
· time = 86400 – время выполнения квеста
· prior = 1 – приоритет задания
Не забываем про PDA. В файл:
gamedata\config\gameplay\storyline_info_taskmanager.xml
Добавляем следующие строки:
<article id="tm_kill_stalker_7_descr" name="kill_stalker" article_type="task">
        <text>tm_kill_stalker_7_descr</text>
</article>
Текст на русском для задания нужен? Тогда открываем
gamedata\config\text\rus\stable_task_manager.xml
И туда вгоняем следующие строки:
<string id="tm_kill_stalker_7">
    <text>Убить Волка</text>
</string>
<string id="tm_kill_stalker_7_text">
    <text>Достал меня Волк! Понимаешь, достал! Ворует у меня водку, понимаешь, потом идет и клянчит деньги на
тушенку, потому что новички его не слушают и есть ничего не дают, а вот сойти со своего места и пойти охотится на кабанов, он,
видите ли, не хочет, ибо ЛЕНЬ! Грохни его, Меченый, я в долгу не останусь.</text>
</string>
<string id="tm_kill_stalker_7_descr">
    <text>Сидрыч заказал убийство Волка</text>
</string>
Важно! Эти строки не должны выходить за пределы тегов <string_table> и </string_table>.
Вот и все, теперь у Сидоровича появился новый квест - "Убить Волка".

0

8

Редактирование NPC
------------------------------------------------------------
Вступление
В этой статье мы научимся редактировать NPC: изменять содержимое их инвентаря, реплики, поведение, имя, и другие параметры.
Параметры
За параметры NPC отвечают файлы:
\config\gameplay\character_desc_[название локации].xml
Каждый из них разбит на секции - по одной на NPC. Используются следующие параметры:
· <name>...</name> - Имя (ссылка на строку в текстовом массиве).
· <icon>ui_npc_...</icon> - Иконка для диалогов/торговли/PDA
· <bio>..._bio</bio> - Биография (в игре не используется).
· <class>...</class> - Класс (лучше не трогать).Imp 12:46, 12 августа 2007 (EEST)Нужно для того что-бы автоматические респавнеры могли спавнить немного разных персонажей. То есть например в игре есть описание восьми (кажеться может и больше) разных новичков и что бы при автоматическом респавне не получалась куча братьев-близнецов, респавнер настраивается на класс персонажей и спавнит случайным образом разных персонажей одного класса.
· <community>...</community> - Группировка.
· <rank>...</rank> - Ранг.
· <reputation>...</reputation> - Репутация.
· <money min="..." max="..." infinitive="..."/> - Количество денег (infinitive="1" - бесконечные деньги).
· <snd_config>...</snd_config> - Набор звуков.
· <crouch_type>-1</crouch_type> - Тип приседания. Лучше не трогать.
· <visual>actors\...</visual> - Внешность. Влияет как на внешний вид костюма, так и на его свойства. Укажите здесь экзоскелет - и персонаж действительно в нем окажется: как по внешности, так и по свойствам.
· <supplies>...</supplies> - Предметы, находящиеся у него в инвентаре. Некоторые из них в игре не отображаются, поэтому не удивляйтесь присутствию здесь предметов вроде рации или фонарика.
В игре отображаються все предметы, просто при торговле есть ограничения на допустимые к торговле предметы, а при смерти персонажа, "запрещенные" предметы удаляються скриптом. Imp 12:46, 12 августа 2007 (EEST)
· <start_dialog>...<start_dialog> - Приветственный диалог. Их может быть несколько, с различными условиями появления.
· <actor_dialog>...</actor_dialog> - Диалоги с игроком.
Практика
Изменим, например, параметры NPC по имени Волк.
Откроем файл:
\config\gameplay\character_desc_escape.xml
И найдем в нем раздел, ему соответствующий:
<!---------------------esc_wolf--------------------->

<specific_character id="esc_wolf" team_default = "1">
    <name>esc_wolf_name</name>
    <icon>ui_npc_u_stalker_neytral_balon_1</icon>
    <bio>esc_wolf_bio</bio>

    <class>esc_wolf</class>
    <community>stalker</community> <terrain_sect>stalker_terrain</terrain_sect>
   
    <rank>434</rank>
    <reputation>5</reputation>
    <money min="600" max="2000" infinitive="0"/>
   
    <snd_config>characters_voice\human_01\stalker\</snd_config>
    <crouch_type>-1</crouch_type>

    <visual>actors\neytral\stalker_neytral_balon_1</visual>
    <supplies>
    [spawn] \n
    wpn_pm \n
    ammo_9x18_fmj = 1 \n
    wpn_ak74u \n
    ammo_5.45x39_fmj \n
    device_torch \n
    hand_radio \n
    </supplies>
   
#include "gameplay\character_criticals_4.xml" //

    <start_dialog>escape_lager_volk_talk</start_dialog>
    <start_dialog>dm_hello_dialog</start_dialog>
    <actor_dialog>dm_cool_info_dialog</actor_dialog>
    <actor_dialog>dm_help_wounded_medkit_dialog</actor_dialog> 
    <actor_dialog>tm_wolf_dialog</actor_dialog>
    <actor_dialog>tm_wolf_reward</actor_dialog>
</specific_character>
Изменим некоторые параметры. Выдадим ему FN2000 и Desert Eagle, примем в "Долг" и сделаем неограниченное количество денег:
<!---------------------esc_wolf--------------------->

<specific_character id="esc_wolf" team_default = "1">
    <name>esc_wolf_name</name>
    <icon>ui_npc_u_stalker_neytral_balon_1</icon>
    <bio>esc_wolf_bio</bio>

    <class>esc_wolf</class>
    <community>dolg</community> <terrain_sect>stalker_terrain</terrain_sect>
   
    <rank>434</rank>
    <reputation>5</reputation>
    <money min="600" max="2000" infinitive="1"/>
   
    <snd_config>characters_voice\human_01\stalker\</snd_config>
    <crouch_type>-1</crouch_type>

    <visual>actors\neytral\stalker_neytral_balon_1</visual>
    <supplies>
    [spawn] \n
    wpn_deagle \n
    ammo_11.43x23_fmj = 1 \n
    wpn_fn2000 \n
    ammo_5.56x45_ap \n
    ammo_5.45x39_fmj \n
    device_torch \n
    hand_radio \n
    </supplies>
   
#include "gameplay\character_criticals_4.xml" //

    <start_dialog>escape_lager_volk_talk</start_dialog>
    <start_dialog>dm_hello_dialog</start_dialog>
    <actor_dialog>dm_cool_info_dialog</actor_dialog>
    <actor_dialog>dm_help_wounded_medkit_dialog</actor_dialog> 
    <actor_dialog>tm_wolf_dialog</actor_dialog>
    <actor_dialog>tm_wolf_reward</actor_dialog>
</specific_character>
Для ввода нового NPC в симуляцию достаточно создать новый профиль.

0

9

Редактирование костюмов

-----------------------------------------------------------
Разбор параметров
В этой статье мы рассмотрим значения параметров костюмов.
Все параметры, не упомянутые ниже, изменять строго не рекомендуется!
Итак, секции с параметрами находятся в файле:
config\misc\outfit.ltx
Разберем, например, параметры классического костюма сталкера.
[stalker_outfit]:outfit_base

; название секции костюма. именно к нему игра будет обращаться. outfit_base -
базовая (наследуемая)  секция (изменять строго не рекомендуется).

visual          = equipments\stalker_suit ; модель, используемая для сложенного костюма,
лежащего на земле.

actor_visual = actors\hero\stalker_hood.ogf ; модель, используемая для игрока, когда
на нем надет костюм.

inv_name    = stalker_outfit_name ; название в инвентаре.

inv_name_short    = stalker_outfit_name ; название в инвентаре (в принципе, можно
здесь продублировать значение предыдущего параметра - так чаще всего и делают).

description    = stalker_outfit_description ; ссылка на текстовую строку
с описанием.

inv_weight    = 5.0 ; вес.

; далее идут параметры иконки в инвентаре (см. примечание 1).

inv_grid_width    = 2
inv_grid_height    = 3
inv_grid_x    = 6
inv_grid_y    = 15

full_icon_name    = npc_icon_stalker_outfit ; название иконки.

cost        = 15000 ; базовая цена (см. примечание 2).

full_scale_icon    = 14,11    ; иконка сталкера в костюме в полный
рост (отображается в инвентаре справа).

nightvision_sect        = effector_nightvision_bad ; тип ПНВ
("плохой" - зеленый, "хороший" - синий).

; ниже идут параметры защиты владельца от различных типов воздействий,
обеспечиваемые костюмом.

burn_protection         = 0.5 ; защита от воздействия
огня (костры, аномалия "Жарка" и т.д.).

strike_protection         = 0.5 ; защита от ударов
(наносятся мутантами, например, псевдогигантом).

shock_protection         = 0.5 ; защита от поражения
электричеством.

wound_protection        = 0.4 ; защита от ранений
(наносятся мутантами, например, собаками, кровососами и т.д.).

radiation_protection     = 0.5 ; защита от радиации.

telepatic_protection     = 0.0 ; защита от пси-воздействия
(например, присутствие контроллера серьезно влияет на psy_health).

chemical_burn_protection     = 0.5 ; защита от химического воздействия.

explosion_protection     = 0.3 ; защита от взрывов/осколков.

fire_wound_protection      = 0.3 ; защита от огнестрельного
оружия (наиболее важный параметр для большинства костюмов).

power_loss = 0.87
bones_koeff_protection = gilet_antigas_damage

[sect_stalker_outfit_immunities] ; коэффициенты иммунитета самого костюма, то
есть - то, насколько сильно он сам подвержен повреждениям от различных типов
воздействий. по значениям каждого типа - см. выше.

burn_immunity        = 0.03
strike_immunity        = 0.01
shock_immunity        = 0.03
wound_immunity        = 0.015
radiation_immunity    = 0.00
telepatic_immunity    = 0.00
chemical_burn_immunity    = 0.03
explosion_immunity    = 0.03
fire_wound_immunity    = 0.01

0

10

Редактирование оружия
------------------------------------------------------------
Общие положения
Сегодня мы разберем то, каким образом можно редактировать оружие в игре - от характеристик до описания. Характеристики оружия хранятся здесь:
...\S.T.A.L.K.E.R\gamedata\config\weapons\w_[...].ltx
Разбор структуры конфига
Возьмем, для примера, конфиг w_g36.ltx. Он делится на разделы:
Первый раздел
Здесь хранится общая информация о оружии - его класс, тип, ссылки на спавн и т.д. Нас интересуют следующие строки:
· description = enc_weapons1_wpn-g36 - ссылка на string_id, из которого игра подгружает описание этого оружия.
· ef_main_weapon_type = 2 - основной тип, к которому принадлежит оружие
· ef_weapon_type = 6 - подтип, к которому принадлежит оружие
Второй раздел
Содержит модификаторы, которые даются к углу зрения/дальности обзора NPC, держащего это оружие в руках:
· holder_range_modifier = 1.85 - во сколько раз увеличивается eye_range
· holder_fov_modifier = 0.3 - во сколько раз увеличивается eye_fov
Третий раздел
Содержит данные о самом оружии, его некоторых характеристиках:
· cost = 18000 - базовая цена (торговцы умножают её на некоторый коэффициент)
· weapon_class = assault_rifle - класс оружия (здесь - штурмовая винтовка)
· ammo_mag_size = 30 - размер магазина
· ammo_class = ammo_5.56x45_ss190, ammo_5.56x45_ap - типы используемых патронов
· grenade_class = ammo_m209 - тип используемых гранат
· fire_modes = 1, -1 - режимы ведения огня
· hand_dependence = 1 - засивимость о рук (?) - возможно, речь идет о качании ствола
· single_handed = 0 - держится ли только в одной руке
· slot = 2 - слот в инвентаре
· animation_slot = 2 - вид анимации (для пистолета/для винтовки)
· inv_name = wpn-g36 - ссылка на имя, отображаемое в инвентаре, тоже берется из string table, как и описание
· inv_name_short = wpn-g36 - короткое имя; в данном случае используется то же самое
· inv_weight = 3.6 - вес
· inv_grid_width = 5 - координаты первого угла иконки по x
· inv_grid_height = 2 - координаты первого угла иконки по y
· inv_grid_x = 0 - координаты второго угла иконки по x
· inv_grid_y = 10 - координаты второго угла иконки по y
Четвертый раздел
В четвертом разделе хранится информация о износе/отдаче оружия. Практически все параметры там снабжены комментариями, поэтому приведу лишь самые интересные:
· cam_relax_speed = 5.7 - скорость возврата в исходное положение
· cam_dispersion = 0.2 - увеличения угла (в градусах) с каждым выстрелом
· fire_dispersion_condition_factor = 5 - увеличение дисперсии в процентах при максимальном износе
· misfire_probability = 0.003 - вероятность осечки при максимальном износе
· misfire_condition_k = 0.05 - порог (в данном случае - 5%), после которого оружие может заклинивать
· condition_shot_dec = 0.0002 - увеличение износа при каждом выстреле
Пятый раздел
Здесь хранится множество параметров, из которых наиболее интересны эти:
· hit_power = 0.50, 0.54, 0.57, 0.60 - сила выстрела
· hit_impulse = 105 - импульс пули (сила, которую летящая пуля передает жертве, влияет на поведение ragdoll-тела)
· hit_type = fire_wound - тип причиняемых повреждений, в данном случае - пулевые ранения (параметр в синглплеере ни на что не влияет)
· fire_distance = 600 - максимальная дистанция для выстрела
· bullet_speed = 925 - начальная скорость пули
· hud = wpn_g36_hud - внешний вид оружия
Шестой раздел
· position = -0.026, -0.132, 0.0 - позиция по отношению к игроку (?)
· orientation = 0, 0, 0 - направление, в которое смотрит ствол (?)
Седьмой раздел
Содержит описания визуальной стороны оружия и некоторые другие параметры:
· startup_ammo = 90 - как нетрудно догадаться, стартовое количество патронов (в синглплеере ни на что не влияет)
· visual = weapons\g36\wpn_g36.ogf - модель оружия, используемая NPC, а также игроком при виде от третьего лица
· ph_mass = 4 - физическая масса, используемая при расчетах
· scope_status = 1 - ситуация со съемным прицелом
· silencer_status = 0 - ситуация со съемным глушителем
· grenade_launcher_status = 0 - ситуация с подствольным гранатометом
· Параметры:
o 0 - нет, новый прикрепить нельзя
o 1 - уже есть, несъемный
o 2 - нет, но можно установить новый
· zoom_enabled = true - есть ли зум (прицеливание)
· scope_zoom_factor = 33.3 - какой зум дает прицеливание (здесь - 1.8х)
· scope_texture = wpn\wpn_crosshair_g36 - текстура прицельной сетки
· shell_point = 0.15, 0.0, -0.05 - точка вылета гильз
· shell_dir = 0.0, 1.0, 0.0
· fire_point = -0.000000,0.062000,0.134000 - точка выстрела
· fire_point2 = 0.30, 0.00, 0.05 - точка выстрела (2)
· fire_bone = wpn_body
· orientation = 0, 0, 0 - направление
· position = 0, 0, 0 - позиция
· visual = weapons\g36\wpn_g36_hud.ogf - модель, отображаемая у нас в руках
Изменение описаний
Описания оружия хранятся в файле: ...\S.T.A.L.K.E.R\gamedata\config\text\rus\string_table_enc_weapons.xml
В нем хранятся строки с названиями и описаниями, на которые ссылаются конфиги оружия. Например, тот же G36 ссылается сюда:
[...]
<string id="enc_weapons1_wpn-g36">
    <text>Штурмовая винтовка немецкого производства, представляющая собой первоклассный образец
современного оружия - лёгкого, надёжного и эргономичного.\n Боеприпасы:\n обычный 5,56x45 мм
SS109,\n бронебойный 5,56x45 мм АР.</text>
[...]
<string id="wpn-g36">
    <text>ГП37</text>
[...]
Меняя их содержимое, мы меняем описания/названия данного оружия.
Изменение патронов
Параметры патронов хранятся в файле:
...\S.T.A.L.K.E.R\gamedata\config\weapons\weapons.ltx
Найдем, например, раздел, отвечающий за патроны к тому же G36 (о них мы узнали из параметра ammo_class), и разберем, что означает каждый параметр:

· visual = weapons\ammo\ammo_556x45_ss190.ogf - модель коробки с патронами
· description = enc_weapons1_ammo_ammo-5.56x45-ss190 - ссылка на string_id, из которого игра подгружает описание этого типа патронов
· cost = 320 - стоимость одной коробки
· box_size = 30 - количество патронов в одной коробке
· inv_name = ammo-5.56x45-ss190 - ссылка на string_id, содержащий имя для инвентаря
· inv_name_short = ammo-5.56x45-ss190_s - ссылка на string_id, содержащий краткое имя для инвентаря
· inv_weight = 0.33 - вес
· inv_grid_width = 2 - координаты первого угла иконки по x
· inv_grid_height = 1 - координаты первого угла иконки по y
· inv_grid_x = 14 - координаты второго угла иконки по x
· inv_grid_y = 11 - координаты второго угла иконки по y

· k_dist = 1 - коэффициент дальности, сама дальность - в стволе, тупо расстояние.
· k_disp = 2.5 - кучность, завязана с кучностью в стволе
· k_hit = 1 - убойность, завязана с убойностью в стволе
· k_impulse = 1 - чисто наскока эффектно ногами непись дрыгнет во время кердыка
· k_pierce = 1 - коэффициент наскока испорится броня при попадании

· impair = 1 - коэффициент износа ствола от пули
· buck_shot = 1 - кол-во составляющих в пуле (напр картечь - 4, пуля - 1)
· tracer = on - является ли патрон трассирующим (on/off)
· wm_size = 0.05 - визуальный размер дырки на стене от пули

0

11

Редактирование торговцев
------------------------------------------------------------
Общее
Урок посвящен редактированию ассортимента торговцев в игре. Эта, в общем-то несложная процедура у многих вызывает вопросы, поэтому я и решил разъяснить, что да как.
Файлы
Ассортимент товаров у торговцев хранится в файлах вида trade_[...].ltx, где ... - системное имя торговца. Это файлы:
· trade_barman.ltx - Бармен
· trade_dolg.ltx - сержант Петренко на базе группировки "Долг"
· trade_ecolog.ltx - Сахаров
· trade_freedom.ltx - Скряга на базе группировки "Свобода"
· trade_trader.ltx - Сидорович
· trade_generic.ltx - обычный сталкер
Все они хранятся в папке:
...\S.T.A.L.K.E.R\gamedata\config\misc\...
Структура файла
Разберем структуру файла trade_barman.ltx:
[trader]
buy_condition = barman_generic_buy
sell_condition = {+yan_labx16_switcher_primary_off} barman_after_brain_sell, {+bar_darklab_document_done} barman_after_darkvalley_sell, barman_start_sell
buy_supplies = { yan_labx16_switcher_primary_off} supplies_after_brain, { bar_darklab_document_done}
supplies_after_darkvalley, supplies_start
Здесь содержатся условия, от которых зависит диапазон продаваемых/покупаемых торговцем предметов. То есть, например, после выполнения квеста на "Янтаре" соответствующее условие считается выполненным, и ассортимент сменяется на новый, из другого раздела.

После этого идет раздел [barman_generic_buy], содержащий предметы, которые бармен покупает.
Структура записи в этом разделе:
wpn_walther        = 0.3, 0.1
· wpn_walther - имя предмета, в данном случае - пистолет "Вальтер"
· 0.3 - максимальная цена, по которой торговец купит предмет
· 0.1 - минимальная цена, по которой торговец купит предмет
Цена зависит от репутации игрока.

Далее идет раздел [supplies_start] - ассортимент, предоставляемый барменом в начале игры. Он поделен на категории:
[supplies_start]

;'''Аммуниция'''
ammo_9x18_fmj     = 15, 0.6
...

;'''Оружие'''
wpn_pb        = 3, 0.6
...

;'''Броники'''
stalker_outfit    = 3, 0.7
...

;'''Медикаменты'''
bandage        = 5, 0.6
...

;'''Еда'''
bread        = 10, 0.5
...
На самом деле можете добавлять новый предмет, куда захотите, все эти "категории" существуют исключительно в целях удобства. Игра их не учитывает.
Теперь о структуре одной записи:
wpn_walther        = 3, 0.6
· wpn_walther - имя предмета, в данном случае - пистолет "Вальтер"
· 3 - количество предметов этого типа у торговца
· 0.6 - вероятность появления каждого из них
То есть если значения равны 4, 0.5, то это означает, что у торговца в ассортименте появятся два предмета этого типа.

Далее идет раздел [barman_start_sell]. Рассмотрим структуру записи в нем:
wpn_walther        = 2, 4
· wpn_walther - имя предмета, в данном случае - пистолет "Вальтер"
· Цена высчитываетя по формулае (2+4)/2 * базовую цену предмета*(МР).
· Модифиакор Реакции(МР) - Цена зависит от репутации игрока. (по умолчанию = 1)
Расширяем ассортимент
Чтобы добавить в начальный ассортимент, например, винтовку FN2000, проделаем следующее:
1. Добавим её в раздел [supplies_start]:
;Оружие
...
wpn_fn2000 = 2, 0.5
2. Добавим её в раздел [barman_start_sell]:
;Оружие
...
wpn_fn2000        1, 3
Ну а чтобы оно не пропадало после выполнения важных заданий, запишите её и в ассортименты для выполненных условий.

0

12

Содержимое файлов gamedata.db*          1 ЧАСТЬ .
---------------------------------------------------------------------------

gamedata.db0
    -ai:
       | -alife
       | -common
    -anims:
       | -camera_effects
       | -editor
       | -helicopter
       | -path
    -config:
       | -creatures
       | -gameplay
       | -misc
       | -models:
       |    | -capture
       |    | -objects
       |    | -vehicles
       |    | -weapons
       | -mp:
       |    | -soundmessages
       |    | -weapons_mp
       | -prefetch
       | -scripts:
       |    | -agr
       |    | -cit
       |    | -dar
       |    | -ds
       |    | -mil
       |    | -pri
       |    | -rad
       |    | -val
       |    | -yan
       | -text:
       |    | -map_desc
       | -ui
       | -weapons
       | -weathers
    -levels:
       | -l01_escape:
       |    | -meshes
       |    | -terrain
       | -l02_garbage:
       |    | -meshes
       |    | -terrain
       | -l03_agroprom:
       |    | -meshes
       |    | -terrain
       | -l03u_agr_underground
       | -l04_darkvalley:
       |    | -meshes
       |    | -terrain
       | -l04u_labx18

gamedata.db1
    -levels:
       | -l04u_labx18:
       |    | -meshes
       | -l05_bar:
       |    | -terrain
       | -l06_rostok:
       |    | -meshes
       |    | -terrain
       | -l07_military:
       |    | -meshes
       |    | -terrain
       | -l08_yantar:
       |    | -meshes
       |    | -terrain
       | -l08u_brainlab:
       |    | -meshes
       | -l10_radar
gamedata.db2
    -levels:
       | -l10_radar:
       |    | -meshes
       |    | -terrain
       | -l10u_bunker
       | -l11_pripyat:
       |    | -meshes
       |    | -terrain
       | -l12_stancia:
       |    | -meshes
       |    | -terrain
       | -l12_stancia_2
gamedata.db3
    -levels:
       | -l12_stancia_2:
       |    | -meshes
       |    | -terrain
       | -l12u_control_monolith
       | -l12u_sarcofag
       | -testers_mp_agroprom:
       |    | -terrain
       | -testers_mp_atp:
       |    | -terrain
       | -testers_mp_bath:
       |    | -terrain
       | -testers_mp_darkvalley:
       |    | -meshes
       |    | -terrain
       | -testers_mp_factory:
       |    | -terrain
       | -testers_mp_lost_village:
       |    | -terrain
       | -testers_mp_military_1:
       |    | -meshes
       |    | -terrain
       | -testers_mp_military_2:
       |    | -terrain
       | -testers_mp_pool
       | -testers_mp_railroad:
       |    | -terrain
       | -testers_mp_rostok
gamedata.db4
    -levels:
       | -testers_mp_rostok:
       |    | -meshes
       |    | -terrain
       | -testers_mp_workshop:
       |    | -terrain
    -meshes:
       | -actors:
       |    | -bandit
       |    | -barman
       |    | -dolg
       |    | -ecolog
       |    | -hero
       |    | -izgoy
       |    | -killer
       |    | -militari
       |    | -monolit
       |    | -nauchniy
       |    | -neytral
       |    | -novice
       |    | -protect
       |    | -soldier
       |    | -stalker_mp
       |    | -stalker_zombi
       |    | -svoboda
       |    | -trader
       |    | -ucheniy
       | -dm
       | -equipments
       | -food
       | -monsters:
       |    | -burer
       |    | -cat
       |    | -chimera
       |    | -crow
       |    | -dark_stalker
       |    | -dog
       |    | -flesh
       |    | -izlom
       |    | -kontroler
       |    | -krovosos
       |    | -mutant_boar
       |    | -phantom
       |    | -poltergeist
       |    | -pseudodog
       |    | -psevdogigant
       |    | -rat
       |    | -snork
       |    | -stalker_zombi
       |    | -topolinypuh
       |    | -tushkano
       |    | -zombi
       | -objects:
       |    | -dynamics:
       |    |    | -balon
       |    |    | -bed
       |    |    | -box:
       |    |    |    | -prt
       |    |    | -chair
       |    |    | -decor
       |    |    | -plitka
       | -physics:
       |    | -anomaly
       |    | -balon
       |    | -box:
       |    |    | -prt
       |    | -dead_body
       |    | -decor:
       |    |    | -prt
       |    | -door:
       |    |    | -prt
       |    | -equipment_cache
       |    | -keyboard
       |    | -krovati
       |    | -large_trash:
       |    |    | -prt
       |    | -light:
       |    |    | -new_light
       |    | -rope
       |    | -shkaf
       |    | -small_trash:
       |    |    | -prt
       |    | -stol
       |    | -stul
       |    | -target
       |    | -technica
       |    | -test:
       |    |    | -old
       |    | -vehicles:
       |    |    | -btr
       |    |    | -kamaz:
       |    |    |    | -old
       |    |    | -mi24:
       |    |    |    | -part
       |    |    | -moskvich
       |    |    | -niva
       |    |    | -tr13
       |    |    | -uaz
       |    |    | -zaz
       |    | -zabor:
       |    |    | -prt
       | -weapons:
       |    | -abakan
       |    | -ak-74u
       |    | -ak74
       |    | -ammo
       |    | -aptechka
       |    | -artefact
       |    | -bandage
       |    | -beretta92fs
       |    | -binoculars
       |    | -bm_16
       |    | -bolt
       |    | -bred
       |    | -colt1911
       |    | -desert_eagle
       |    | -fn2000
       |    | -fort
       |    | -g36
       |    | -gauss
       |    | -grenade
       |    | -groza
       |    | -hpsa
       |    | -knife
       |    | -kolbasa
       |    | -l85
       |    | -lr300
       |    | -mounted_weapons
       |    | -mp5
       |    | -p90
       |    | -pb
       |    | -pm
       |    | -rg-6
       |    | -rpg_7
       |    | -sig220
       |    | -sig550
       |    | -sigaret
       |    | -spas12
       |    | -svd
       |    | -svu
       |    | -toz34
       |    | -upgrade
       |    | -usp_45
       |    | -val
       |    | -vintorez
       |    | -vodka
       |    | -walter_99
       |    | -winchester1300
    -scripts
    -shaders:
       | -r1:
       |    | -shared
       | -r2:
       |    | -shared
       |    | -test
       | -shared
    -sounds:
       | -actor
       | -affects
       | -alexmx
       | -ambient:
       |    | -arena
       |    | -bar
       |    | -indoors
       |    | -random
       |    | -rnd_outdoor
       |    | -underground
       |    | -x16
       |    | -x18
       | -anomaly
       | -car
       | -characters_voice:
       |    | -human_01:
       |    |    | -bandit:
       |    |    |    | -fight:
       |    |    |    |    | -attack
       |    |    |    |    | -backup
       |    |    |    |    | -cover_fire
       |    |    |    |    | -death
       |    |    |    |    | -detour
       |    |    |    |    | -enemy
       |    |    |    |    | -friendly_fire
       |    |    |    |    | -friendly_grenade
       |    |    |    |    | -friend_hitted
       |    |    |    |    | -grenade
       |    |    |    |    | -hit
       |    |    |    |    | -searching_enemy
       |    |    |    |    | -tolls
       |    |    |    | -hail
       |    |    |    | -help:
       |    |    |    |    | -not_wounded
       |    |    |    |    | -wounded
       |    |    |    |    | -wounded_heavy
       |    |    |    |    | -wounded_not_see_helper
       |    |    |    |    | -wounded_psy
       |    |    |    |    | -wounded_see_helper
       |    |    |    | -music
       |    |    |    | -reactions:
       |    |    |    |    | -dead_enemy
       |    |    |    |    | -dead_friend
       |    |    |    |    | -dead_mutant
       |    |    |    |    | -dead_neutral
       |    |    |    |    | -hear_something
       |    |    |    |    | -joke
       |    |    |    |    | -music
       |    |    |    |    | -nothing
       |    |    |    |    | -see_something
       |    |    |    |    | -story
       |    |    |    | -states:
       |    |    |    |    | -breath
       |    |    |    |    | -fatique
       |    |    |    |    | -health
       |    |    |    |    | -idle
       |    |    |    |    | -panic_human
       |    |    |    |    | -panic_monster
       |    |    |    |    | -radiation
       |    |    |    |    | -sleep
       |    |    |    |    | -starvation
       |    |    |    | -talk:
       |    |    |    |    | -abuse
       |    |    |    |    | -accept
       |    |    |    |    | -friendly_greeting
       |    |    |    |    | -intros
       |    |    |    |    | -jokes
       |    |    |    |    | -leave
       |    |    |    |    | -neutral_greeting
       |    |    |    |    | -raid
       |    |    |    |    |    | -init
       |    |    |    |    |    | -reaction
       |    |    |    |    | -rejection
       |    |    |    |    | -stories
       |    |    |    |    | -trade
       |    |    |    |    |    | -no
       |    |    |    |    |    | -yes
       |    |    |    |    | -use
       |    |    |    | -threat:
       |    |    |    |    | -back_off
       |    |    |    |    | -drop_weapon
       |    |    |    |    | -stop
       |    |    |    | -waiting:
       |    |    |    |    | -moveout
       |    |    | -dolg:
       |    |    |    | -fight:
       |    |    |    |    | -attack
       |    |    |    |    | -backup
       |    |    |    |    | -cover_fire
       |    |    |    |    | -death
       |    |    |    |    | -detour
       |    |    |    |    | -enemy
       |    |    |    |    | -enemy_down
       |    |    |    |    | -enemy_hit
       |    |    |    |    | -fire
       |    |    |    |    | -friendly_fire
       |    |    |    |    | -friend_hitted
       |    |    |    |    | -grenade
       |    |    |    |    | -hit
       |    |    |    |    | -searching_enemy
       |    |    |    |    | -threat
       |    |    |    |    | -tolls
       |    |    |    | -hail
       |    |    |    | -help:
       |    |    |    |    | -not_wounded
       |    |    |    |    | -wounded
       |    |    |    |    | -wounded_heavy
       |    |    |    |    | -wounded_not_see_helper
       |    |    |    |    | -wounded_psy
       |    |    |    |    | -wounded_see_helper
       |    |    |    |    | -wounded_thanx
       |    |    |    | -music
       |    |    |    | -reactions:
       |    |    |    |    | -box
       |    |    |    |    | -dead_enemy
       |    |    |    |    | -dead_friend
       |    |    |    |    | -dead_mutant
       |    |    |    |    | -dead_neutral
       |    |    |    |    | -hear_something
       |    |    |    |    | -joke
       |    |    |    |    | -music
       |    |    |    |    | -nothing
       |    |    |    |    | -raid
       |    |    |    |    | -see_something
       |    |    |    |    | -story
       |    |    |    | -states:
       |    |    |    |    | -breath
       |    |    |    |    | -fatique
       |    |    |    |    | -health
       |    |    |    |    | -idle
       |    |    |    |    | -panic_human
       |    |    |    |    | -panic_monster
       |    |    |    |    | -radiation
       |    |    |    |    | -sleep
       |    |    |    |    | -starvation
       |    |    |    | -talk:
       |    |    |    |    | -abuse
       |    |    |    |    | -accept
       |    |    |    |    | -friendly_greeting
       |    |    |    |    | -intros
       |    |    |    |    | -jokes
       |    |    |    |    | -leave
       |    |    |    |    | -neutral_greeting
       |    |    |    |    | -raid:
       |    |    |    |    |    | -init
       |    |    |    |    |    | -reaction
       |    |    |    |    | -rejection
       |    |    |    |    | -stories
       |    |    |    |    | -trade:
       |    |    |    |    |    | -no
       |    |    |    |    |    | -yes
       |    |    |    |    | -use
       |    |    |    | -threat:
       |    |    |    |    | -back_off
       |    |    |    |    | -drop_weapon
       |    |    |    |    | -stop
       |    |    |    | -waiting:
       |    |    |    |    | -moveout
       |    |    | -ecolog:
       |    |    |    | -fight:
       |    |    |    |    | -attack
       |    |    |    |    | -backup
       |    |    |    |    | -cover_fire
       |    |    |    |    | -death
       |    |    |    |    | -detour
       |    |    |    |    | -enemy
       |    |    |    |    | -enemy_down
       |    |    |    |    | -enemy_hit
       |    |    |    |    | -fire
       |    |    |    |    | -friendly_fire
       |    |    |    |    | -friend_hitted
       |    |    |    |    | -grenade
       |    |    |    |    | -hit
       |    |    |    |    | -searching_enemy
       |    |    |    |    | -threat
       |    |    |    |    | -tolls
       |    |    |    | -hail
       |    |    |    | -help:
       |    |    |    |    | -not_wounded
       |    |    |    |    | -wounded
       |    |    |    |    | -wounded_heavy:
       |    |    |    |    |    | -aptechku
       |    |    |    |    | -wounded_not_see_helper
       |    |    |    |    | -wounded_psy
       |    |    |    |    | -wounded_see_helper
       |    |    |    |    | -wounded_thanx
       |    |    |    | -reactions:
       |    |    |    |    | -dead_enemy
       |    |    |    |    | -dead_friend
       |    |    |    |    | -dead_mutant
       |    |    |    |    | -dead_neutral
       |    |    |    |    | -hear_something
       |    |    |    |    | -joke
       |    |    |    |    | -music
       |    |    |    |    | -nothing
       |    |    |    |    | -see_something
       |    |    |    |    | -story
       |    |    |    | -states:
       |    |    |    |    | -breath
       |    |    |    |    | -fatique
       |    |    |    |    | -health
       |    |    |    |    | -idle
       |    |    |    |    | -panic_human
       |    |    |    |    | -panic_monster
       |    |    |    |    | -radiation
       |    |    |    |    | -sleep
       |    |    |    |    | -starvation
       |    |    |    | -talk:
       |    |    |    |    | -abuse
       |    |    |    |    | -accept
       |    |    |    |    | -friendly_greeting
       |    |    |    |    | -intros
       |    |    |    |    | -jokes
       |    |    |    |    | -leave
       |    |    |    |    | -neutral_greeting
       |    |    |    |    | -raid:
       |    |    |    |    |    | -init
       |    |    |    |    |    | -reaction
       |    |    |    |    | -rejection
       |    |    |    |    | -stories
       |    |    |    |    | -trade:
       |    |    |    |    |    | -no
       |    |    |    |    |    | -yes
       |    |    |    |    | -use
       |    |    |    | -threat:
       |    |    |    |    | -back_off
       |    |    |    |    | -drop_weapon
       |    |    |    |    | -stop
       |    |    |    | -waiting:
       |    |    |    |    | -moveout
       |    |    | -freedom:
       |    |    |    | -fight:
       |    |    |    |    | -attack
       |    |    |    |    | -backup
       |    |    |    |    | -cover_fire
       |    |    |    |    | -death
       |    |    |    |    | -detour
       |    |    |    |    | -enemy
       |    |    |    |    | -enemy_down
       |    |    |    |    | -enemy_hit
       |    |    |    |    | -fire
       |    |    |    |    | -friendly_fire
       |    |    |    |    | -friend_hitted
       |    |    |    |    | -grenade
       |    |    |    |    | -hit
       |    |    |    |    | -searching_enemy
       |    |    |    |    | -threat
       |    |    |    |    | -tolls
       |    |    |    | -hail
       |    |    |    | -help:
       |    |    |    |    | -not_wounded
       |    |    |    |    | -wounded
       |    |    |    |    | -wounded_heavy
       |    |    |    |    | -wounded_not_see_helper
       |    |    |    |    | -wounded_psy
       |    |    |    |    | -wounded_see_helper
       |    |    |    |    | -wounded_thanx
       |    |    |    | -music
       |    |    |    | -reactions:
       |    |    |    |    | -box
       |    |    |    |    | -dead_enemy
       |    |    |    |    | -dead_friend
       |    |    |    |    | -dead_mutant
       |    |    |    |    | -dead_neutral
       |    |    |    |    | -hear_something
       |    |    |    |    | -joke
       |    |    |    |    | -music
       |    |    |    |    | -nothing
       |    |    |    |    | -see_something
       |    |    |    |    | -story
       |    |    |    | -states:
       |    |    |    |    | -breath
       |    |    |    |    | -fatique
       |    |    |    |    | -health
       |    |    |    |    | -idle
       |    |    |    |    | -panic_human
       |    |    |    |    | -panic_monster
       |    |    |    |    | -radiation
       |    |    |    |    | -sleep
       |    |    |    |    | -starvation
       |    |    |    | -talk:
       |    |    |    |    | -abuse
       |    |    |    |    | -accept
       |    |    |    |    | -friendly_greeting
       |    |    |    |    | -intros
       |    |    |    |    | -jokes
       |    |    |    |    | -leave
       |    |    |    |    | -neutral_greeting
       |    |    |    |    | -raid:
       |    |    |    |    |    | -init
       |    |    |    |    |    | -reaction
       |    |    |    |    | -rejection
       |    |    |    |    | -stories
       |    |    |    |    | -trade:
       |    |    |    |    |    | -no
       |    |    |    |    |    | -yes
       |    |    |    |    | -use
       |    |    |    | -threat:
       |    |    |    |    | -back_off
       |    |    |    |    | -drop_weapon
       |    |    |    |    | -stop
       |    |    |    | -waiting:
       |    |    |    |    | -moveout
       |    |    | -killer:
       |    |    |    | -fight:
       |    |    |    |    | -attack
       |    |    |    |    | -backup
       |    |    |    |    | -cover_fire
       |    |    |    |    | -death
       |    |    |    |    | -detour
       |    |    |    |    | -enemy
       |    |    |    |    | -friendly_fire
       |    |    |    |    | -friendly_grenade
       |    |    |    |    | -friend_hitted
       |    |    |    |    | -grenade
       |    |    |    |    | -hit
       |    |    |    |    | -searching_enemy
       |    |    |    |    | -tolls
       |    |    |    | -hail
       |    |    |    | -help:
       |    |    |    |    | -not_wounded
       |    |    |    |    | -wounded
       |    |    |    |    | -wounded_heavy:
       |    |    |    |    |    | -aptechku
       |    |    |    |    | -wounded_not_see_helper
       |    |    |    |    | -wounded_psy
       |    |    |    |    | -wounded_see_helper
       |    |    |    |    | -wounded_thanx
       |    |    |    | -reactions:
       |    |    |    |    | -dead_enemy
       |    |    |    |    | -dead_friend
       |    |    |    |    | -dead_mutant
       |    |    |    |    | -dead_neutral
       |    |    |    |    | -hear_something
       |    |    |    |    | -joke
       |    |    |    |    | -music
       |    |    |    |    | -nothing
       |    |    |    |    | -see_something
       |    |    |    |    | -story
       |    |    |    | -states:
       |    |    |    |    | -breath
       |    |    |    |    | -fatique
       |    |    |    |    | -health
       |    |    |    |    | -idle
       |    |    |    |    | -panic_human
       |    |    |    |    | -panic_monster
       |    |    |    |    | -radiation
       |    |    |    |    | -sleep
       |    |    |    |    | -starvation
       |    |    |    | -talk:
       |    |    |    |    | -abuse
       |    |    |    |    | -accept
       |    |    |    |    | -friendly_greeting
       |    |    |    |    | -intros
       |    |    |    |    | -jokes
       |    |    |    |    | -leave
       |    |    |    |    | -neutral_greeting
       |    |    |    |    | -raid:
       |    |    |    |    |    | -init
       |    |    |    |    |    | -reaction
       |    |    |    |    | -rejection
       |    |    |    |    | -stories
       |    |    |    |    | -trade:
       |    |    |    |    |    | -no
       |    |    |    |    |    | -yes
       |    |    |    |    | -use
       |    |    |    | -threat:
       |    |    |    |    | -back_off
       |    |    |    |    | -drop_weapon
       |    |    |    |    | -stop
       |    |    |    | -waiting:
       |    |    |    |    | -moveout
       |    |    | -military:
       |    |    |    | -fight:
       |    |    |    |    | -attack
       |    |    |    |    | -backup
       |    |    |    |    | -cover_fire
       |    |    |    |    | -death
       |    |    |    |    | -detour
       |    |    |    |    | -enemy
       |    |    |    |    | -enemy_down
       |    |    |    |    | -enemy_hit
       |    |    |    |    | -fire
       |    |    |    |    | -friend_hitted
       |    |    |    |    | -friendly_fire
       |    |    |    |    | -grenade
       |    |    |    |    | -hit
       |    |    |    |    | -searching_enemy
       |    |    |    |    | -threat
       |    |    |    |    | -tolls
       |    |    |    | -hail
       |    |    |    | -help:
       |    |    |    |    | -not_wounded
       |    |    |    |    | -wounded
       |    |    |    |    | -wounded_heavy:
       |    |    |    |    | -wounded_not_see_helper
       |    |    |    |    | -wounded_psy
       |    |    |    |    | -wounded_see_helper
       |    |    |    | -reactions:
       |    |    |    |    | -dead_enemy
       |    |    |    |    | -dead_friend
       |    |    |    |    | -dead_mutant
       |    |    |    |    | -dead_neutral
       |    |    |    |    | -hear_something
       |    |    |    |    | -joke
       |    |    |    |    | -music
       |    |    |    |    | -nothing
       |    |    |    |    | -see_something
       |    |    |    |    | -story
       |    |    |    | -states:
       |    |    |    |    | -breath
       |    |    |    |    | -fatique
       |    |    |    |    | -health
       |    |    |    |    | -idle
       |    |    |    |    | -panic_human
       |    |    |    |    | -panic_monster
       |    |    |    |    | -radiation
       |    |    |    |    | -sleep
       |    |    |    |    | -starvation
       |    |    |    | -talk:
       |    |    |    |    | -abuse
       |    |    |    |    | -accept
       |    |    |    |    | -friendly_greeting
       |    |    |    |    | -intros
       |    |    |    |    | -jokes
       |    |    |    |    | -leave
       |    |    |    |    | -neutral_greeting
       |    |    |    |    | -raid:
       |    |    |    |    |    | -init
       |    |    |    |    |    | -reaction
       |    |    |    |    | -rejection
       |    |    |    |    | -stories
       |    |    |    |    | -trade:
       |    |    |    |    |    | -no
       |    |    |    |    |    | -yes
       |    |    |    |    | -use
       |    |    |    | -threat:
       |    |    |    |    | -back_off
       |    |    |    |    | -drop_weapon
       |    |    |    |    | -stop
       |    |    |    | -waiting:
       |    |    |    |    | -moveout
       |    |    | -monolith:
       |    |    |    | -fight:
       |    |    |    |    | -attack
       |    |    |    |    | -backup
       |    |    |    |    | -cover_fire
       |    |    |    |    | -death
       |    |    |    |    | -detour
       |    |    |    |    | -enemy
       |    |    |    |    | -enemy_down
       |    |    |    |    | -enemy_hit
       |    |    |    |    | -fire
       |    |    |    |    | -friend_hitted
       |    |    |    |    | -friendly_fire
       |    |    |    |    | -grenade
       |    |    |    |    | -hit
       |    |    |    |    | -searching_enemy
       |    |    |    |    | -threat
       |    |    |    |    | -tolls
       |    |    |    | -hail
       |    |    |    | -help:
       |    |    |    |    | -not_wounded
       |    |    |    |    | -wounded
       |    |    |    |    | -wounded_heavy:
       |    |    |    |    |    | -aptechku
       |    |    |    |    | -wounded_not_see_helper
       |    |    |    |    | -wounded_psy
       |    |    |    |    | -wounded_see_helper
       |    |    |    |    | -wounded_thanx
       |    |    |    | -reactions:
       |    |    |    |    | -dead_enemy
       |    |    |    |    | -dead_friend
       |    |    |    |    | -dead_mutant
       |    |    |    |    | -dead_neutral
       |    |    |    |    | -hear_something
       |    |    |    |    | -joke
       |    |    |    |    | -music
       |    |    |    |    | -nothing
       |    |    |    |    | -see_something
       |    |    |    |    | -story
       |    |    |    | -states:
       |    |    |    |    | -breath
       |    |    |    |    | -fatique
       |    |    |    |    | -health
       |    |    |    |    | -idle
       |    |    |    |    | -panic_human
       |    |    |    |    | -panic_monster
       |    |    |    |    | -radiation
       |    |    |    |    | -sleep
       |    |    |    |    | -starvation
       |    |    |    | -talk:
       |    |    |    |    | -abuse
       |    |    |    |    | -accept
       |    |    |    |    | -friendly_greeting
       |    |    |    |    | -intros
       |    |    |    |    | -jokes
       |    |    |    |    | -leave
       |    |    |    |    | -neutral_greeting
       |    |    |    |    | -raid:
       |    |    |    |    |    | -init
       |    |    |    |    |    | -reaction
       |    |    |    |    | -rejection
       |    |    |    |    | -stories
       |    |    |    |    | -trade:
       |    |    |    |    |    | -no
       |    |    |    |    |    | -yes
       |    |    |    |    | -use
       |    |    |    | -threat:
       |    |    |    |    | -back_off
       |    |    |    |    | -drop_weapon
       |    |    |    |    | -stop
       |    |    |    | -waiting:
       |    |    |    |    | -moveout
       |    |    | -newbie
       |    |    |    | -fight:
       |    |    |    |    | -attack
       |    |    |    |    | -backup
       |    |    |    |    | -cover_fire
       |    |    |    |    | -death
       |    |    |    |    | -detour
       |    |    |    |    | -enemy
       |    |    |    |    | -enemy_down
       |    |    |    |    | -enemy_hit
       |    |    |    |    | -fire
       |    |    |    |    | -friend_hitted
       |    |    |    |    | -friendly_fire
       |    |    |    |    | -grenade
       |    |    |    |    | -hit
       |    |    |    |    | -searching_enemy
       |    |    |    |    | -threat
       |    |    |    |    | -tolls
       |    |    |    | -help:
       |    |    |    |    | -wounded
       |    |    |    |    | -wounded_heavy
       |    |    |    |    | -wounded_thanx
       |    |    |    | -music
       |    |    |    | -reactions:
       |    |    |    |    | -box
       |    |    |    |    | -joke
       |    |    |    |    | -music
       |    |    |    |    | -story
       |    |    |    | -states:
       |    |    |    |    | -breath
       |    |    |    |    | -idle
       |    |    |    |    | -panic_human
       |    |    |    |    | -panic_monster
       |    |    |    |    | -sleep
       |    |    |    | -talk:
       |    |    |    |    | -intros
       |    |    |    |    | -jokes
       |    |    |    |    | -use
       |    |    |    | -threat:
       |    |    |    |    | -back_off
       |    |    |    |    | -drop_weapon
       |    |    | -stalker
       |    |    |    | -fight:
       |    |    |    |    | -attack
       |    |    |    |    | -backup
       |    |    |    |    | -cover_fire
       |    |    |    |    | -death
       |    |    |    |    | -detour
       |    |    |    |    | -enemy
       |    |    |    |    | -enemy_down
       |    |    |    |    | -enemy_hit
       |    |    |    |    | -fire
       |    |    |    |    | -friend_hitted
       |    |    |    |    | -friendly_fire
       |    |    |    |    | -grenade
       |    |    |    |    | -hit
       |    |    |    |    | -searching_enemy
       |    |    |    |    | -threat
       |    |    |    |    | -tolls
       |    |    |    | -help:
       |    |    |    |    | -wounded
       |    |    |    |    | -wounded_heavy
       |    |    |    |    | -wounded_thanx
       |    |    |    | -music
       |    |    |    | -reactions:
       |    |    |    |    | -box
       |    |    |    |    | -joke
       |    |    |    |    | -music
       |    |    |    |    | -story
       |    |    |    | -states:
       |    |    |    |    | -breath
       |    |    |    |    | -idle
       |    |    |    |    | -panic_human
       |    |    |    |    | -panic_monster
       |    |    |    |    | -sleep
       |    |    |    | -talk:
       |    |    |    |    | -intros
       |    |    |    |    | -jokes
       |    |    |    |    | -use
       |    |    |    | -threat:
       |    |    |    |    | -back_off
       |    |    |    |    | -drop_weapon
       |    |    | -zombied
       |    |    |    | -fight:
       |    |    |    |    | -attack
       |    |    |    |    | -death
       |    |    |    |    | -enemy
       |    |    |    |    | -hit
       |    |    |    | -states:
       |    |    |    |    | -idle
       |    |    |    |    | -rising
       |    | -human_02:
       |    |    | -bandit:
       |    |    |    | -fight:
       |    |    |    |    | -attack
       |    |    |    |    | -backup
       |    |    |    |    | -cover_fire
       |    |    |    |    | -death
       |    |    |    |    | -detour
       |    |    |    |    | -enemy
       |    |    |    |    | -friendly_fire
       |    |    |    |    | -friendly_grenade
       |    |    |    |    | -friend_hitted
       |    |    |    |    | -grenade
       |    |    |    |    | -hit
       |    |    |    |    | -searching_enemy
       |    |    |    |    | -tolls
       |    |    |    | -hail
       |    |    |    | -help:
       |    |    |    |    | -not_wounded
       |    |    |    |    | -wounded
       |    |    |    |    | -wounded_heavy
       |    |    |    |    | -wounded_not_see_helper
       |    |    |    |    | -wounded_psy
       |    |    |    |    | -wounded_see_helper
       |    |    |    | -music
       |    |    |    | -reactions:
       |    |    |    |    | -dead_enemy
       |    |    |    |    | -dead_friend
       |    |    |    |    | -dead_mutant
       |    |    |    |    | -dead_neutral
       |    |    |    |    | -hear_something
       |    |    |    |    | -joke
       |    |    |    |    | -music
       |    |    |    |    | -nothing
       |    |    |    |    | -see_something
       |    |    |    |    | -story
       |    |    |    | -states:
       |    |    |    |    | -breath
       |    |    |    |    | -fatique
       |    |    |    |    | -health
       |    |    |    |    | -idle
       |    |    |    |    | -panic_human
       |    |    |    |    | -panic_monster
       |    |    |    |    | -radiation
       |    |    |    |    | -sleep
       |    |    |    |    | -starvation
       |    |    |    | -talk:
       |    |    |    |    | -abuse
       |    |    |    |    | -accept
       |    |    |    |    | -friendly_greeting
       |    |    |    |    | -intros
       |    |    |    |    | -jokes
       |    |    |    |    | -leave
       |    |    |    |    | -neutral_greeting
       |    |    |    |    | -raid
       |    |    |    |    |    | -init
       |    |    |    |    |    | -reaction
       |    |    |    |    | -rejection
       |    |    |    |    | -stories
       |    |    |    |    | -trade
       |    |    |    |    |    | -no
       |    |    |    |    |    | -yes
       |    |    |    |    | -use
       |    |    |    | -threat:
       |    |    |    |    | -back_off
       |    |    |    |    | -drop_weapon
       |    |    |    |    | -stop
       |    |    |    | -waiting:
       |    |    |    |    | -moveout
       |    |    | -dolg:
       |    |    |    | -fight:
       |    |    |    |    | -attack
       |    |    |    |    | -backup
       |    |    |    |    | -cover_fire
       |    |    |    |    | -death
       |    |    |    |    | -detour
       |    |    |    |    | -enemy
       |    |    |    |    | -enemy_down
       |    |    |    |    | -enemy_hit
       |    |    |    |    | -fire
       |    |    |    |    | -friendly_fire
       |    |    |    |    | -friend_hitted
       |    |    |    |    | -grenade
       |    |    |    |    | -hit
       |    |    |    |    | -searching_enemy
       |    |    |    |    | -threat
       |    |    |    |    | -tolls
       |    |    |    | -hail
       |    |    |    | -help:
       |    |    |    |    | -not_wounded
       |    |    |    |    | -wounded
       |    |    |    |    | -wounded_heavy
       |    |    |    |    | -wounded_not_see_helper
       |    |    |    |    | -wounded_psy
       |    |    |    |    | -wounded_see_helper
       |    |    |    |    | -wounded_thanx
       |    |    |    | -music
       |    |    |    | -reactions:
       |    |    |    |    | -box
       |    |    |    |    | -dead_enemy
       |    |    |    |    | -dead_friend
       |    |    |    |    | -dead_mutant
       |    |    |    |    | -dead_neutral
       |    |    |    |    | -hear_something
       |    |    |    |    | -joke
       |    |    |    |    | -music
       |    |    |    |    | -nothing
       |    |    |    |    | -raid
       |    |    |    |    | -see_something
       |    |    |    |    | -story
       |    |    |    | -states:
       |    |    |    |    | -breath
       |    |    |    |    | -fatique
       |    |    |    |    | -health
       |    |    |    |    | -idle
       |    |    |    |    | -panic_human
       |    |    |    |    | -panic_monster
       |    |    |    |    | -radiation
       |    |    |    |    | -sleep
       |    |    |    |    | -starvation
       |    |    |    | -talk:
       |    |    |    |    | -abuse
       |    |    |    |    | -accept
       |    |    |    |    | -friendly_greeting
       |    |    |    |    | -intros
       |    |    |    |    | -jokes
       |    |    |    |    | -leave
       |    |    |    |    | -neutral_greeting
       |    |    |    |    | -raid:
       |    |    |    |    |    | -init
       |    |    |    |    |    | -reaction
       |    |    |    |    | -rejection
       |    |    |    |    | -stories
       |    |    |    |    | -trade:
       |    |    |    |    |    | -no
       |    |    |    |    |    | -yes
       |    |    |    |    | -use
       |    |    |    | -threat:
       |    |    |    |    | -back_off
       |    |    |    |    | -drop_weapon
       |    |    |    |    | -stop
       |    |    |    | -waiting:
       |    |    |    |    | -moveout
       |    |    | -ecolog:
       |    |    |    | -fight:
       |    |    |    |    | -attack
       |    |    |    |    | -backup
       |    |    |    |    | -cover_fire
       |    |    |    |    | -death
       |    |    |    |    | -detour
       |    |    |    |    | -enemy
       |    |    |    |    | -enemy_down
       |    |    |    |    | -enemy_hit
       |    |    |    |    | -fire
       |    |    |    |    | -friendly_fire
       |    |    |    |    | -friend_hitted
       |    |    |    |    | -grenade
       |    |    |    |    | -hit
       |    |    |    |    | -searching_enemy
       |    |    |    |    | -threat
       |    |    |    |    | -tolls
       |    |    |    | -hail
       |    |    |    | -help:
       |    |    |    |    | -not_wounded
       |    |    |    |    | -wounded
       |    |    |    |    | -wounded_heavy:
       |    |    |    |    |    | -aptechku
       |    |    |    |    | -wounded_not_see_helper
       |    |    |    |    | -wounded_psy
       |    |    |    |    | -wounded_see_helper
       |    |    |    |    | -wounded_thanx
       |    |    |    | -reactions:
       |    |    |    |    | -dead_enemy
       |    |    |    |    | -dead_friend
       |    |    |    |    | -dead_mutant
       |    |    |    |    | -dead_neutral
       |    |    |    |    | -hear_something
       |    |    |    |    | -joke
       |    |    |    |    | -music
       |    |    |    |    | -nothing
       |    |    |    |    | -see_something
       |    |    |    |    | -story
       |    |    |    | -states:
       |    |    |    |    | -breath
       |    |    |    |    | -fatique
       |    |    |    |    | -health
       |    |    |    |    | -idle
       |    |    |    |    | -panic_human
       |    |    |    |    | -panic_monster
       |    |    |    |    | -radiation
       |    |    |    |    | -sleep
       |    |    |    |    | -starvation
       |    |    |    | -talk:
       |    |    |    |    | -abuse
       |    |    |    |    | -accept
       |    |    |    |    | -friendly_greeting
       |    |    |    |    | -intros
       |    |    |    |    | -jokes
       |    |    |    |    | -leave
       |    |    |    |    | -neutral_greeting
       |    |    |    |    | -raid:
       |    |    |    |    |    | -init
       |    |    |    |    |    | -reaction
       |    |    |    |    | -rejection
       |    |    |    |    | -stories
       |    |    |    |    | -trade:
       |    |    |    |    |    | -no
       |    |    |    |    |    | -yes
       |    |    |    |    | -use
       |    |    |    | -threat:
       |    |    |    |    | -back_off
       |    |    |    |    | -drop_weapon
       |    |    |    |    | -stop
       |    |    |    | -waiting:
       |    |    |    |    | -moveout
       |    |    | -freedom:
       |    |    |    | -fight:
       |    |    |    |    | -attack
       |    |    |    |    | -backup
       |    |    |    |    | -cover_fire
       |    |    |    |    | -death
       |    |    |    |    | -detour
       |    |    |    |    | -enemy
       |    |    |    |    | -enemy_down
       |    |    |    |    | -enemy_hit
       |    |    |    |    | -fire
       |    |    |    |    | -friendly_fire
       |    |    |    |    | -friend_hitted
       |    |    |    |    | -grenade
       |    |    |    |    | -hit
       |    |    |    |    | -searching_enemy
       |    |    |    |    | -threat
       |    |    |    |    | -tolls
       |    |    |    | -hail
       |    |    |    | -help:
       |    |    |    |    | -not_wounded
       |    |    |    |    | -wounded
       |    |    |    |    | -wounded_heavy
       |    |    |    |    | -wounded_not_see_helper
       |    |    |    |    | -wounded_psy
       |    |    |    |    | -wounded_see_helper
       |    |    |    |    | -wounded_thanx
       |    |    |    | -music
       |    |    |    | -reactions:
       |    |    |    |    | -box
       |    |    |    |    | -dead_enemy
       |    |    |    |    | -dead_friend
       |    |    |    |    | -dead_mutant
       |    |    |    |    | -dead_neutral
       |    |    |    |    | -hear_something
       |    |    |    |    | -joke
       |    |    |    |    | -music
       |    |    |    |    | -nothing
       |    |    |    |    | -see_something
       |    |    |    |    | -story
       |    |    |    | -states:
       |    |    |    |    | -breath
       |    |    |    |    | -fatique
       |    |    |    |    | -health
       |    |    |    |    | -idle
       |    |    |    |    | -panic_human
       |    |    |    |    | -panic_monster
       |    |    |    |    | -radiation
       |    |    |    |    | -sleep
       |    |    |    |    | -starvation
       |    |    |    | -talk:
       |    |    |    |    | -abuse
       |    |    |    |    | -accept
       |    |    |    |    | -friendly_greeting
       |    |    |    |    | -intros
       |    |    |    |    | -jokes
       |    |    |    |    | -leave
       |    |    |    |    | -neutral_greeting
       |    |    |    |    | -raid:
       |    |    |    |    |    | -init
       |    |    |    |    |    | -reaction
       |    |    |    |    | -rejection
       |    |    |    |    | -stories
       |    |    |    |    | -trade:
       |    |    |    |    |    | -no
       |    |    |    |    |    | -yes
       |    |    |    |    | -use
       |    |    |    | -threat:
       |    |    |    |    | -back_off
       |    |    |    |    | -drop_weapon
       |    |    |    |    | -stop
       |    |    |    | -waiting:
       |    |    |    |    | -moveout
       |    |    | -killer:
       |    |    |    | -fight:
       |    |    |    |    | -attack

0

13

Содержимое файлов gamedata.db*          2 ЧАСТЬ .
--------------------------------------------------------------------------------------------

       |    |    |    |    | -cover_fire
       |    |    |    |    | -death
       |    |    |    |    | -detour
       |    |    |    |    | -enemy
       |    |    |    |    | -friendly_fire
       |    |    |    |    | -friendly_grenade
       |    |    |    |    | -friend_hitted
       |    |    |    |    | -grenade
       |    |    |    |    | -hit
       |    |    |    |    | -searching_enemy
       |    |    |    |    | -tolls
       |    |    |    | -hail
       |    |    |    | -help:
       |    |    |    |    | -not_wounded
       |    |    |    |    | -wounded
       |    |    |    |    | -wounded_heavy:
       |    |    |    |    |    | -aptechku
       |    |    |    |    | -wounded_not_see_helper
       |    |    |    |    | -wounded_psy
       |    |    |    |    | -wounded_see_helper
       |    |    |    |    | -wounded_thanx
       |    |    |    | -reactions:
       |    |    |    |    | -dead_enemy
       |    |    |    |    | -dead_friend
       |    |    |    |    | -dead_mutant
       |    |    |    |    | -dead_neutral
       |    |    |    |    | -hear_something
       |    |    |    |    | -joke
       |    |    |    |    | -music
       |    |    |    |    | -nothing
       |    |    |    |    | -see_something
       |    |    |    |    | -story
       |    |    |    | -states:
       |    |    |    |    | -breath
       |    |    |    |    | -fatique
       |    |    |    |    | -health
       |    |    |    |    | -idle
       |    |    |    |    | -panic_human
       |    |    |    |    | -panic_monster
       |    |    |    |    | -radiation
       |    |    |    |    | -sleep
       |    |    |    |    | -starvation
       |    |    |    | -talk:
       |    |    |    |    | -abuse
       |    |    |    |    | -accept
       |    |    |    |    | -friendly_greeting
       |    |    |    |    | -intros
       |    |    |    |    | -jokes
       |    |    |    |    | -leave
       |    |    |    |    | -neutral_greeting
       |    |    |    |    | -raid:
       |    |    |    |    |    | -init
       |    |    |    |    |    | -reaction
       |    |    |    |    | -rejection
       |    |    |    |    | -stories
       |    |    |    |    | -trade:
       |    |    |    |    |    | -no
       |    |    |    |    |    | -yes
       |    |    |    |    | -use
       |    |    |    | -threat:
       |    |    |    |    | -back_off
       |    |    |    |    | -drop_weapon
       |    |    |    |    | -stop
       |    |    |    | -waiting:
       |    |    |    |    | -moveout
       |    |    | -military:
       |    |    |    | -fight:
       |    |    |    |    | -attack
       |    |    |    |    | -backup
       |    |    |    |    | -cover_fire
       |    |    |    |    | -death
       |    |    |    |    | -detour
       |    |    |    |    | -enemy
       |    |    |    |    | -enemy_down
       |    |    |    |    | -enemy_hit
       |    |    |    |    | -fire
       |    |    |    |    | -friend_hitted
       |    |    |    |    | -friendly_fire
       |    |    |    |    | -grenade
       |    |    |    |    | -hit
       |    |    |    |    | -searching_enemy
       |    |    |    |    | -threat
       |    |    |    |    | -tolls
       |    |    |    | -hail
       |    |    |    | -help:
       |    |    |    |    | -not_wounded
       |    |    |    |    | -wounded
       |    |    |    |    | -wounded_heavy:
       |    |    |    |    | -wounded_not_see_helper
       |    |    |    |    | -wounded_psy
       |    |    |    |    | -wounded_see_helper
       |    |    |    | -reactions:
       |    |    |    |    | -dead_enemy
       |    |    |    |    | -dead_friend
       |    |    |    |    | -dead_mutant
       |    |    |    |    | -dead_neutral
       |    |    |    |    | -hear_something
       |    |    |    |    | -joke
       |    |    |    |    | -music
       |    |    |    |    | -nothing
       |    |    |    |    | -see_something
       |    |    |    |    | -story
       |    |    |    | -states:
       |    |    |    |    | -breath
       |    |    |    |    | -fatique
       |    |    |    |    | -health
       |    |    |    |    | -idle
       |    |    |    |    | -panic_human
       |    |    |    |    | -panic_monster
       |    |    |    |    | -radiation
       |    |    |    |    | -sleep
       |    |    |    |    | -starvation
       |    |    |    | -talk:
       |    |    |    |    | -abuse
       |    |    |    |    | -accept
       |    |    |    |    | -friendly_greeting
       |    |    |    |    | -intros
       |    |    |    |    | -jokes
       |    |    |    |    | -leave
       |    |    |    |    | -neutral_greeting
       |    |    |    |    | -raid:
       |    |    |    |    |    | -init
       |    |    |    |    |    | -reaction
       |    |    |    |    | -rejection
       |    |    |    |    | -stories
       |    |    |    |    | -trade:
       |    |    |    |    |    | -no
       |    |    |    |    |    | -yes
       |    |    |    |    | -use
       |    |    |    | -threat:
       |    |    |    |    | -back_off
       |    |    |    |    | -drop_weapon
       |    |    |    |    | -stop
       |    |    |    | -waiting:
       |    |    |    |    | -moveout
       |    |    | -monolith:
       |    |    |    | -fight:
       |    |    |    |    | -attack
       |    |    |    |    | -backup
       |    |    |    |    | -cover_fire
       |    |    |    |    | -death
       |    |    |    |    | -detour
       |    |    |    |    | -enemy
       |    |    |    |    | -enemy_down
       |    |    |    |    | -enemy_hit
       |    |    |    |    | -fire
       |    |    |    |    | -friend_hitted
       |    |    |    |    | -friendly_fire
       |    |    |    |    | -grenade
       |    |    |    |    | -hit
       |    |    |    |    | -searching_enemy
       |    |    |    |    | -threat
       |    |    |    |    | -tolls
       |    |    |    | -hail
       |    |    |    | -help:
       |    |    |    |    | -not_wounded
       |    |    |    |    | -wounded
       |    |    |    |    | -wounded_heavy:
       |    |    |    |    |    | -aptechku
       |    |    |    |    | -wounded_not_see_helper
       |    |    |    |    | -wounded_psy
       |    |    |    |    | -wounded_see_helper
       |    |    |    |    | -wounded_thanx
       |    |    |    | -reactions:
       |    |    |    |    | -dead_enemy
       |    |    |    |    | -dead_friend
       |    |    |    |    | -dead_mutant
       |    |    |    |    | -dead_neutral
       |    |    |    |    | -hear_something
       |    |    |    |    | -joke
       |    |    |    |    | -music
       |    |    |    |    | -nothing
       |    |    |    |    | -see_something
       |    |    |    |    | -story
       |    |    |    | -states:
       |    |    |    |    | -breath
       |    |    |    |    | -fatique
       |    |    |    |    | -health
       |    |    |    |    | -idle
       |    |    |    |    | -panic_human
       |    |    |    |    | -panic_monster
       |    |    |    |    | -radiation
       |    |    |    |    | -sleep
       |    |    |    |    | -starvation
       |    |    |    | -talk:
       |    |    |    |    | -abuse
       |    |    |    |    | -accept
       |    |    |    |    | -friendly_greeting
       |    |    |    |    | -intros
       |    |    |    |    | -jokes
       |    |    |    |    | -leave
       |    |    |    |    | -neutral_greeting
       |    |    |    |    | -raid:
       |    |    |    |    |    | -init
       |    |    |    |    |    | -reaction
       |    |    |    |    | -rejection
       |    |    |    |    | -stories
       |    |    |    |    | -trade:
       |    |    |    |    |    | -no
       |    |    |    |    |    | -yes
       |    |    |    |    | -use
       |    |    |    | -threat:
       |    |    |    |    | -back_off
       |    |    |    |    | -drop_weapon
       |    |    |    |    | -stop
       |    |    |    | -waiting:
       |    |    |    |    | -moveout
       |    |    | -newbie
       |    |    |    | -fight:
       |    |    |    |    | -attack
       |    |    |    |    | -backup
       |    |    |    |    | -cover_fire
       |    |    |    |    | -death
       |    |    |    |    | -detour
       |    |    |    |    | -enemy
       |    |    |    |    | -enemy_down
       |    |    |    |    | -enemy_hit
       |    |    |    |    | -fire
       |    |    |    |    | -friend_hitted
       |    |    |    |    | -friendly_fire
       |    |    |    |    | -grenade
       |    |    |    |    | -hit
       |    |    |    |    | -searching_enemy
       |    |    |    |    | -threat
       |    |    |    |    | -tolls
       |    |    |    | -help:
       |    |    |    |    | -wounded
       |    |    |    |    | -wounded_heavy
       |    |    |    |    | -wounded_thanx
       |    |    |    | -music
       |    |    |    | -reactions:
       |    |    |    |    | -box
       |    |    |    |    | -joke
       |    |    |    |    | -music
       |    |    |    |    | -story
       |    |    |    | -states:
       |    |    |    |    | -breath
       |    |    |    |    | -idle
       |    |    |    |    | -panic_human
       |    |    |    |    | -panic_monster
       |    |    |    |    | -sleep
       |    |    |    | -talk:
       |    |    |    |    | -intros
       |    |    |    |    | -jokes
       |    |    |    |    | -use
       |    |    |    | -threat:
       |    |    |    |    | -back_off
       |    |    |    |    | -drop_weapon
       |    |    | -stalker
       |    |    |    | -fight:
       |    |    |    |    | -attack
       |    |    |    |    | -backup
       |    |    |    |    | -cover_fire
       |    |    |    |    | -death
       |    |    |    |    | -detour
       |    |    |    |    | -enemy
       |    |    |    |    | -enemy_down
       |    |    |    |    | -enemy_hit
       |    |    |    |    | -fire
       |    |    |    |    | -friend_hitted
       |    |    |    |    | -friendly_fire
       |    |    |    |    | -grenade
       |    |    |    |    | -hit
       |    |    |    |    | -searching_enemy
       |    |    |    |    | -threat
       |    |    |    |    | -tolls
       |    |    |    | -help:
       |    |    |    |    | -wounded
       |    |    |    |    | -wounded_heavy
       |    |    |    |    | -wounded_thanx
       |    |    |    | -music
       |    |    |    | -reactions:
       |    |    |    |    | -box
       |    |    |    |    | -joke
       |    |    |    |    | -music
       |    |    |    |    | -story
       |    |    |    | -states:
       |    |    |    |    | -breath
       |    |    |    |    | -idle
       |    |    |    |    | -panic_human
       |    |    |    |    | -panic_monster
       |    |    |    |    | -sleep
       |    |    |    | -talk:
       |    |    |    |    | -intros
       |    |    |    |    | -jokes
       |    |    |    |    | -use
       |    |    |    | -threat:
       |    |    |    |    | -back_off
       |    |    |    |    | -drop_weapon
       |    |    | -zombied
       |    |    |    | -fight:
       |    |    |    |    | -attack
       |    |    |    |    | -death
       |    |    |    |    | -enemy
       |    |    |    |    | -hit
       |    |    |    | -states:
       |    |    |    |    | -idle
       |    |    |    |    | -rising
       |    | -human_03:
       |    |    | -bandit:
       |    |    |    | -fight:
       |    |    |    |    | -attack
       |    |    |    |    | -backup
       |    |    |    |    | -cover_fire
       |    |    |    |    | -death
       |    |    |    |    | -detour
       |    |    |    |    | -enemy
       |    |    |    |    | -friendly_fire
       |    |    |    |    | -friendly_grenade
       |    |    |    |    | -friend_hitted
       |    |    |    |    | -grenade
       |    |    |    |    | -hit
       |    |    |    |    | -searching_enemy
       |    |    |    |    | -tolls
       |    |    |    | -hail
       |    |    |    | -help:
       |    |    |    |    | -not_wounded
       |    |    |    |    | -wounded
       |    |    |    |    | -wounded_heavy
       |    |    |    |    | -wounded_not_see_helper
       |    |    |    |    | -wounded_psy
       |    |    |    |    | -wounded_see_helper
       |    |    |    | -music
       |    |    |    | -reactions:
       |    |    |    |    | -dead_enemy
       |    |    |    |    | -dead_friend
       |    |    |    |    | -dead_mutant
       |    |    |    |    | -dead_neutral
       |    |    |    |    | -hear_something
       |    |    |    |    | -joke
       |    |    |    |    | -music
       |    |    |    |    | -nothing
       |    |    |    |    | -see_something
       |    |    |    |    | -story
       |    |    |    | -states:
       |    |    |    |    | -breath
       |    |    |    |    | -fatique
       |    |    |    |    | -health
       |    |    |    |    | -idle
       |    |    |    |    | -panic_human
       |    |    |    |    | -panic_monster
       |    |    |    |    | -radiation
       |    |    |    |    | -sleep
       |    |    |    |    | -starvation
       |    |    |    | -talk:
       |    |    |    |    | -abuse
       |    |    |    |    | -accept
       |    |    |    |    | -friendly_greeting
       |    |    |    |    | -intros
       |    |    |    |    | -jokes
       |    |    |    |    | -leave
       |    |    |    |    | -neutral_greeting
       |    |    |    |    | -raid
       |    |    |    |    |    | -init
       |    |    |    |    |    | -reaction
       |    |    |    |    | -rejection
       |    |    |    |    | -stories
       |    |    |    |    | -trade
       |    |    |    |    |    | -no
       |    |    |    |    |    | -yes
       |    |    |    |    | -use
       |    |    |    | -threat:
       |    |    |    |    | -back_off
       |    |    |    |    | -drop_weapon
       |    |    |    |    | -stop
       |    |    |    | -waiting:
       |    |    |    |    | -moveout
       |    |    | -dolg:
       |    |    |    | -fight:
       |    |    |    |    | -attack
       |    |    |    |    | -backup
       |    |    |    |    | -cover_fire
       |    |    |    |    | -death
       |    |    |    |    | -detour
       |    |    |    |    | -enemy
       |    |    |    |    | -enemy_down
       |    |    |    |    | -enemy_hit
       |    |    |    |    | -fire
       |    |    |    |    | -friendly_fire
       |    |    |    |    | -friend_hitted
       |    |    |    |    | -grenade
       |    |    |    |    | -hit
       |    |    |    |    | -searching_enemy
       |    |    |    |    | -threat
       |    |    |    |    | -tolls
       |    |    |    | -hail
       |    |    |    | -help:
       |    |    |    |    | -not_wounded
       |    |    |    |    | -wounded
       |    |    |    |    | -wounded_heavy
       |    |    |    |    | -wounded_not_see_helper
       |    |    |    |    | -wounded_psy
       |    |    |    |    | -wounded_see_helper
       |    |    |    |    | -wounded_thanx
       |    |    |    | -music
       |    |    |    | -reactions:
       |    |    |    |    | -box
       |    |    |    |    | -dead_enemy
       |    |    |    |    | -dead_friend
       |    |    |    |    | -dead_mutant
       |    |    |    |    | -dead_neutral
       |    |    |    |    | -hear_something
       |    |    |    |    | -joke
       |    |    |    |    | -music
       |    |    |    |    | -nothing
       |    |    |    |    | -raid
       |    |    |    |    | -see_something
       |    |    |    |    | -story
       |    |    |    | -states:
       |    |    |    |    | -breath
       |    |    |    |    | -fatique
       |    |    |    |    | -health
       |    |    |    |    | -idle
       |    |    |    |    | -panic_human
       |    |    |    |    | -panic_monster
       |    |    |    |    | -radiation
       |    |    |    |    | -sleep
       |    |    |    |    | -starvation
       |    |    |    | -talk:
       |    |    |    |    | -abuse
       |    |    |    |    | -accept
       |    |    |    |    | -friendly_greeting
       |    |    |    |    | -intros
       |    |    |    |    | -jokes
       |    |    |    |    | -leave
       |    |    |    |    | -neutral_greeting
       |    |    |    |    | -raid:
       |    |    |    |    |    | -init
       |    |    |    |    |    | -reaction
       |    |    |    |    | -rejection
       |    |    |    |    | -stories
       |    |    |    |    | -trade:
       |    |    |    |    |    | -no
       |    |    |    |    |    | -yes
       |    |    |    |    | -use
       |    |    |    | -threat:
       |    |    |    |    | -back_off
       |    |    |    |    | -drop_weapon
       |    |    |    |    | -stop
       |    |    |    | -waiting:
       |    |    |    |    | -moveout
       |    |    | -ecolog:
       |    |    |    | -fight:
       |    |    |    |    | -attack
       |    |    |    |    | -backup
       |    |    |    |    | -cover_fire
       |    |    |    |    | -death
       |    |    |    |    | -detour
       |    |    |    |    | -enemy
       |    |    |    |    | -enemy_down
       |    |    |    |    | -enemy_hit
       |    |    |    |    | -fire
       |    |    |    |    | -friendly_fire
       |    |    |    |    | -friend_hitted
       |    |    |    |    | -grenade
       |    |    |    |    | -hit
       |    |    |    |    | -searching_enemy
       |    |    |    |    | -threat
       |    |    |    |    | -tolls
       |    |    |    | -hail
       |    |    |    | -help:
       |    |    |    |    | -not_wounded
       |    |    |    |    | -wounded
       |    |    |    |    | -wounded_heavy:
       |    |    |    |    |    | -aptechku
       |    |    |    |    | -wounded_not_see_helper
       |    |    |    |    | -wounded_psy
       |    |    |    |    | -wounded_see_helper
       |    |    |    |    | -wounded_thanx
       |    |    |    | -reactions:
       |    |    |    |    | -dead_enemy
       |    |    |    |    | -dead_friend
       |    |    |    |    | -dead_mutant
       |    |    |    |    | -dead_neutral
       |    |    |    |    | -hear_something
       |    |    |    |    | -joke
       |    |    |    |    | -music
       |    |    |    |    | -nothing
       |    |    |    |    | -see_something
       |    |    |    |    | -story
       |    |    |    | -states:
       |    |    |    |    | -breath
       |    |    |    |    | -fatique
       |    |    |    |    | -health
       |    |    |    |    | -idle
       |    |    |    |    | -panic_human
       |    |    |    |    | -panic_monster
       |    |    |    |    | -radiation
       |    |    |    |    | -sleep
       |    |    |    |    | -starvation
       |    |    |    | -talk:
       |    |    |    |    | -abuse
       |    |    |    |    | -accept
       |    |    |    |    | -friendly_greeting
       |    |    |    |    | -intros
       |    |    |    |    | -jokes
       |    |    |    |    | -leave
       |    |    |    |    | -neutral_greeting
       |    |    |    |    | -raid:
       |    |    |    |    |    | -init
       |    |    |    |    |    | -reaction
       |    |    |    |    | -rejection
       |    |    |    |    | -stories
       |    |    |    |    | -trade:
       |    |    |    |    |    | -no
       |    |    |    |    |    | -yes
       |    |    |    |    | -use
       |    |    |    | -threat:
       |    |    |    |    | -back_off
       |    |    |    |    | -drop_weapon
       |    |    |    |    | -stop
       |    |    |    | -waiting:
       |    |    |    |    | -moveout
       |    |    | -freedom:
       |    |    |    | -fight:
       |    |    |    |    | -attack
       |    |    |    |    | -backup
       |    |    |    |    | -cover_fire
       |    |    |    |    | -death
       |    |    |    |    | -detour
       |    |    |    |    | -enemy
       |    |    |    |    | -enemy_down
       |    |    |    |    | -enemy_hit
       |    |    |    |    | -fire
       |    |    |    |    | -friendly_fire
       |    |    |    |    | -friend_hitted
       |    |    |    |    | -grenade
       |    |    |    |    | -hit
       |    |    |    |    | -searching_enemy
       |    |    |    |    | -threat
       |    |    |    |    | -tolls
       |    |    |    | -hail
       |    |    |    | -help:
       |    |    |    |    | -not_wounded
       |    |    |    |    | -wounded
       |    |    |    |    | -wounded_heavy
       |    |    |    |    | -wounded_not_see_helper
       |    |    |    |    | -wounded_psy
       |    |    |    |    | -wounded_see_helper
       |    |    |    |    | -wounded_thanx
       |    |    |    | -music
       |    |    |    | -reactions:
       |    |    |    |    | -box
       |    |    |    |    | -dead_enemy
       |    |    |    |    | -dead_friend
       |    |    |    |    | -dead_mutant
       |    |    |    |    | -dead_neutral
       |    |    |    |    | -hear_something
       |    |    |    |    | -joke
       |    |    |    |    | -music
       |    |    |    |    | -nothing
       |    |    |    |    | -see_something
       |    |    |    |    | -story
       |    |    |    | -states:
       |    |    |    |    | -breath
       |    |    |    |    | -fatique
       |    |    |    |    | -health
       |    |    |    |    | -idle
       |    |    |    |    | -panic_human
       |    |    |    |    | -panic_monster
       |    |    |    |    | -radiation
       |    |    |    |    | -sleep
       |    |    |    |    | -starvation
       |    |    |    | -talk:
       |    |    |    |    | -abuse
       |    |    |    |    | -accept
       |    |    |    |    | -friendly_greeting
       |    |    |    |    | -intros
       |    |    |    |    | -jokes
       |    |    |    |    | -leave
       |    |    |    |    | -neutral_greeting
       |    |    |    |    | -raid:
       |    |    |    |    |    | -init
       |    |    |    |    |    | -reaction
       |    |    |    |    | -rejection
       |    |    |    |    | -stories
       |    |    |    |    | -trade:
       |    |    |    |    |    | -no
       |    |    |    |    |    | -yes
       |    |    |    |    | -use
       |    |    |    | -threat:
       |    |    |    |    | -back_off
       |    |    |    |    | -drop_weapon
       |    |    |    |    | -stop
       |    |    |    | -waiting:
       |    |    |    |    | -moveout
       |    |    | -killer:
       |    |    |    | -fight:
       |    |    |    |    | -attack
       |    |    |    |    | -backup
       |    |    |    |    | -cover_fire
       |    |    |    |    | -death
       |    |    |    |    | -detour
       |    |    |    |    | -enemy
       |    |    |    |    | -friendly_fire
       |    |    |    |    | -friendly_grenade
       |    |    |    |    | -friend_hitted
       |    |    |    |    | -grenade
       |    |    |    |    | -hit
       |    |    |    |    | -searching_enemy
       |    |    |    |    | -tolls
       |    |    |    | -hail
       |    |    |    | -help:
       |    |    |    |    | -not_wounded
       |    |    |    |    | -wounded
       |    |    |    |    | -wounded_heavy:
       |    |    |    |    |    | -aptechku
       |    |    |    |    | -wounded_not_see_helper
       |    |    |    |    | -wounded_psy
       |    |    |    |    | -wounded_see_helper
       |    |    |    |    | -wounded_thanx
       |    |    |    | -reactions:
       |    |    |    |    | -dead_enemy
       |    |    |    |    | -dead_friend
       |    |    |    |    | -dead_mutant
       |    |    |    |    | -dead_neutral
       |    |    |    |    | -hear_something
       |    |    |    |    | -joke
       |    |    |    |    | -music
       |    |    |    |    | -nothing
       |    |    |    |    | -see_something
       |    |    |    |    | -story
       |    |    |    | -states:
       |    |    |    |    | -breath
       |    |    |    |    | -fatique
       |    |    |    |    | -health
       |    |    |    |    | -idle
       |    |    |    |    | -panic_human
       |    |    |    |    | -panic_monster
       |    |    |    |    | -radiation
       |    |    |    |    | -sleep
       |    |    |    |    | -starvation
       |    |    |    | -talk:
       |    |    |    |    | -abuse
       |    |    |    |    | -accept
       |    |    |    |    | -friendly_greeting
       |    |    |    |    | -intros
       |    |    |    |    | -jokes
       |    |    |    |    | -leave
       |    |    |    |    | -neutral_greeting
       |    |    |    |    | -raid:
       |    |    |    |    |    | -init
       |    |    |    |    |    | -reaction
       |    |    |    |    | -rejection
       |    |    |    |    | -stories
       |    |    |    |    | -trade:
       |    |    |    |    |    | -no
       |    |    |    |    |    | -yes
       |    |    |    |    | -use
       |    |    |    | -threat:
       |    |    |    |    | -back_off
       |    |    |    |    | -drop_weapon
       |    |    |    |    | -stop
       |    |    |    | -waiting:
       |    |    |    |    | -moveout
       |    |    | -military:
       |    |    |    | -fight:
       |    |    |    |    | -attack
       |    |    |    |    | -backup
       |    |    |    |    | -cover_fire
       |    |    |    |    | -death
       |    |    |    |    | -detour
       |    |    |    |    | -enemy
       |    |    |    |    | -enemy_down
       |    |    |    |    | -enemy_hit
       |    |    |    |    | -fire
       |    |    |    |    | -friend_hitted
       |    |    |    |    | -friendly_fire
       |    |    |    |    | -grenade
       |    |    |    |    | -hit
       |    |    |    |    | -searching_enemy
       |    |    |    |    | -threat
       |    |    |    |    | -tolls
       |    |    |    | -hail
       |    |    |    | -help:
       |    |    |    |    | -not_wounded
       |    |    |    |    | -wounded
       |    |    |    |    | -wounded_heavy:
       |    |    |    |    | -wounded_not_see_helper
       |    |    |    |    | -wounded_psy
       |    |    |    |    | -wounded_see_helper
       |    |    |    | -reactions:
       |    |    |    |    | -dead_enemy
       |    |    |    |    | -dead_friend
       |    |    |    |    | -dead_mutant
       |    |    |    |    | -dead_neutral
       |    |    |    |    | -hear_something
       |    |    |    |    | -joke
       |    |    |    |    | -music
       |    |    |    |    | -nothing
       |    |    |    |    | -see_something
       |    |    |    |    | -story
       |    |    |    | -states:
       |    |    |    |    | -breath
       |    |    |    |    | -fatique
       |    |    |    |    | -health
       |    |    |    |    | -idle
       |    |    |    |    | -panic_human
       |    |    |    |    | -panic_monster
       |    |    |    |    | -radiation
       |    |    |    |    | -sleep
       |    |    |    |    | -starvation
       |    |    |    | -talk:
       |    |    |    |    | -abuse
       |    |    |    |    | -accept
       |    |    |    |    | -friendly_greeting
       |    |    |    |    | -intros
       |    |    |    |    | -jokes
       |    |    |    |    | -leave
       |    |    |    |    | -neutral_greeting
       |    |    |    |    | -raid:
       |    |    |    |    |    | -init
       |    |    |    |    |    | -reaction
       |    |    |    |    | -rejection
       |    |    |    |    | -stories
       |    |    |    |    | -trade:
       |    |    |    |    |    | -no
       |    |    |    |    |    | -yes
       |    |    |    |    | -use
       |    |    |    | -threat:
       |    |    |    |    | -back_off
       |    |    |    |    | -drop_weapon
       |    |    |    |    | -stop
       |    |    |    | -waiting:
       |    |    |    |    | -moveout
       |    |    | -monolith:
       |    |    |    | -fight:
       |    |    |    |    | -attack
       |    |    |    |    | -backup
       |    |    |    |    | -cover_fire
       |    |    |    |    | -death
       |    |    |    |    | -detour
       |    |    |    |    | -enemy
       |    |    |    |    | -enemy_down
       |    |    |    |    | -enemy_hit
       |    |    |    |    | -fire
       |    |    |    |    | -friend_hitted
       |    |    |    |    | -friendly_fire
       |    |    |    |    | -grenade
       |    |    |    |    | -hit
       |    |    |    |    | -searching_enemy
       |    |    |    |    | -threat
       |    |    |    |    | -tolls
       |    |    |    | -hail
       |    |    |    | -help:
       |    |    |    |    | -not_wounded
       |    |    |    |    | -wounded
       |    |    |    |    | -wounded_heavy:
       |    |    |    |    |    | -aptechku
       |    |    |    |    | -wounded_not_see_helper
       |    |    |    |    | -wounded_psy
       |    |    |    |    | -wounded_see_helper
       |    |    |    |    | -wounded_thanx
       |    |    |    | -reactions:
       |    |    |    |    | -dead_enemy
       |    |    |    |    | -dead_friend
       |    |    |    |    | -dead_mutant
       |    |    |    |    | -dead_neutral
       |    |    |    |    | -hear_something
       |    |    |    |    | -joke
       |    |    |    |    | -music
       |    |    |    |    | -nothing
       |    |    |    |    | -see_something
       |    |    |    |    | -story
       |    |    |    | -states:
       |    |    |    |    | -breath
       |    |    |    |    | -fatique
       |    |    |    |    | -health
       |    |    |    |    | -idle
       |    |    |    |    | -panic_human
       |    |    |    |    | -panic_monster
       |    |    |    |    | -radiation
       |    |    |    |    | -sleep
       |    |    |    |    | -starvation
       |    |    |    | -talk:
       |    |    |    |    | -abuse
       |    |    |    |    | -accept
       |    |    |    |    | -friendly_greeting
       |    |    |    |    | -intros
       |    |    |    |    | -jokes
       |    |    |    |    | -leave
       |    |    |    |    | -neutral_greeting
       |    |    |    |    | -raid:
       |    |    |    |    |    | -init
       |    |    |    |    |    | -reaction
       |    |    |    |    | -rejection
       |    |    |    |    | -stories
       |    |    |    |    | -trade:
       |    |    |    |    |    | -no
       |    |    |    |    |    | -yes
       |    |    |    |    | -use
       |    |    |    | -threat:
       |    |    |    |    | -back_off
       |    |    |    |    | -drop_weapon
       |    |    |    |    | -stop
       |    |    |    | -waiting:
       |    |    |    |    | -moveout
       |    |    | -newbie
       |    |    |    | -fight:
       |    |    |    |    | -attack
       |    |    |    |    | -backup
       |    |    |    |    | -cover_fire
       |    |    |    |    | -death
       |    |    |    |    | -detour
       |    |    |    |    | -enemy
       |    |    |    |    | -enemy_down
       |    |    |    |    | -enemy_hit
       |    |    |    |    | -fire
       |    |    |    |    | -friend_hitted
       |    |    |    |    | -friendly_fire
       |    |    |    |    | -grenade
       |    |    |    |    | -hit
       |    |    |    |    | -searching_enemy
       |    |    |    |    | -threat
       |    |    |    |    | -tolls
       |    |    |    | -help:
       |    |    |    |    | -wounded
       |    |    |    |    | -wounded_heavy
       |    |    |    |    | -wounded_thanx
       |    |    |    | -music
       |    |    |    | -reactions:
       |    |    |    |    | -box
       |    |    |    |    | -joke
       |    |    |    |    | -music
       |    |    |    |    | -story
       |    |    |    | -states:
       |    |    |    |    | -breath
       |    |    |    |    | -idle
       |    |    |    |    | -panic_human
       |    |    |    |    | -panic_monster
       |    |    |    |    | -sleep
       |    |    |    | -talk:
       |    |    |    |    | -intros
       |    |    |    |    | -jokes
       |    |    |    |    | -use
       |    |    |    | -threat:
       |    |    |    |    | -back_off
       |    |    |    |    | -drop_weapon
       |    |    | -stalker
       |    |    |    | -fight:
       |    |    |    |    | -attack
       |    |    |    |    | -backup
       |    |    |    |    | -cover_fire
       |    |    |    |    | -death
       |    |    |    |    | -detour
       |    |    |    |    | -enemy
       |    |    |    |    | -enemy_down
       |    |    |    |    | -enemy_hit
       |    |    |    |    | -fire
       |    |    |    |    | -friend_hitted
       |    |    |    |    | -friendly_fire
       |    |    |    |    | -grenade
       |    |    |    |    | -hit
       |    |    |    |    | -searching_enemy
       |    |    |    |    | -threat
       |    |    |    |    | -tolls
       |    |    |    | -help:
       |    |    |    |    | -wounded
       |    |    |    |    | -wounded_heavy
       |    |    |    |    | -wounded_thanx
       |    |    |    | -music
       |    |    |    | -reactions:
       |    |    |    |    | -box
       |    |    |    |    | -joke
       |    |    |    |    | -music
       |    |    |    |    | -story
       |    |    |    | -states:
       |    |    |    |    | -breath
       |    |    |    |    | -idle
       |    |    |    |    | -panic_human
       |    |    |    |    | -panic_monster
       |    |    |    |    | -sleep
       |    |    |    | -talk:
       |    |    |    |    | -intros
       |    |    |    |    | -jokes
       |    |    |    |    | -use
       |    |    |    | -threat:
       |    |    |    |    | -back_off
       |    |    |    |    | -drop_weapon

gamedata.db5
    -sounds:
       | -characters_voice:
       |    | -human_03:
       |    |    | -stalker:
       |    |    |    | -fight:
       |    |    |    |    | -attack
       |    |    |    |    | -backup
       |    |    |    |    | -cover_fire
       |    |    |    |    | -death
       |    |    |    |    | -detour
       |    |    |    |    | -enemy
       |    |    |    |    | -enemy_down
       |    |    |    |    | -enemy_hit
       |    |    |    |    | -fire
       |    |    |    |    | -friendly_fire
       |    |    |    |    | -friend_hitted
       |    |    |    |    | -grenade
       |    |    |    |    | -hit
       |    |    |    |    | -searching_enemy
       |    |    |    |    | -threat
       |    |    |    |    | -tolls
       |    |    |    | -hail
       |    |    |    | -help:
       |    |    |    |    | -not_wounded
       |    |    |    |    | -wounded
       |    |    |    |    | -wounded_heavy
       |    |    |    |    | -wounded_not_see_helper
       |    |    |    |    | -wounded_psy
       |    |    |    |    | -wounded_see_helper
       |    |    |    |    | -wounded_thanx
       |    |    |    | -music
       |    |    |    | -reactions:
       |    |    |    |    | -box
       |    |    |    |    | -dead_enemy
       |    |    |    |    | -dead_friend
       |    |    |    |    | -dead_mutant
       |    |    |    |    | -dead_neutral
       |    |    |    |    | -hear_something
       |    |    |    |    | -joke
       |    |    |    |    | -music
       |    |    |    |    | -nothing
       |    |    |    |    | -raid
       |    |    |    |    | -see_something
       |    |    |    |    | -story
       |    |    |    | -states:
       |    |    |    |    | -breath
       |    |    |    |    | -fatique
       |    |    |    |    | -health
       |    |    |    |    | -idle
       |    |    |    |    | -panic_human
       |    |    |    |    | -panic_monster
       |    |    |    |    | -radiation
       |    |    |    |    | -sleep
       |    |    |    |    | -starvation
       |    |    |    | -talk:
       |    |    |    |    | -abuse
       |    |    |    |    | -accept
       |    |    |    |    | -friendly_greeting
       |    |    |    |    | -intros
       |    |    |    |    | -jokes
       |    |    |    |    | -leave
       |    |    |    |    | -neutral_greeting
       |    |    |    |    | -raid:
       |    |    |    |    |    | -init
       |    |    |    |    |    | -reaction
       |    |    |    |    | -rejection
       |    |    |    |    | -stories
       |    |    |    |    | -trade:
       |    |    |    |    |    | -no
       |    |    |    |    |    | -yes
       |    |    |    |    | -use
       |    |    |    | -threat:
       |    |    |    |    | -back_off
       |    |    |    |    | -drop_weapon
       |    |    |    |    | -stop
       |    |    |    | -waiting:
       |    |    |    |    | -moveout
       |    |    | -zombied:
       |    |    |    | -fight:
       |    |    |    |    | -attack
       |    |    |    |    | -death
       |    |    |    |    | -enemy
       |    |    |    |    | -hit
       |    |    |    | -states:
       |    |    |    |    | -idle
       |    |    |    |    | -rising
       | -detectors
       | -device:
       |    | -pda
       | -heart
       | -helicopter
       | -interface
       | -intro
       | -material:
       |    | -actor:
       |    |    | -step
       |    | -barrel:
       |    |    | -collide
       |    | -bottle:
       |    |    | -collide
       |    | -bullet:
       |    |    | -collide
       |    | -dead-body:
       |    |    | -collide
       |    | -glass
       |    | -hoof:
       |    |    | -step
       |    | -human:
       |    |    | -collide
       |    |    | -step
       |    | -large
       |    | -large_furniture
       |    | -large_metal_trash:
       |    |    | -collide
       |    | -large-weapon:
       |    |    | -collide
       |    | -medium
       |    | -metal_box:
       |    |    | -collide
       |    | -small-weapon:
       |    |    | -collide
       |    | -wood
       | -messages:
       |    | -multiplayer
       | -monsters:
       |    | -biting
       |    | -bloodsucker
       |    | -boar
       |    | -burer
       |    | -controller
       |    | -crow
       |    | -dog
       |    | -flesh
       |    | -giant
       |    | -human:
       |    |    | -combat:
       |    |    |    | -rus
       |    |    |    | -ukr
       |    |    |    | -ukr2
       |    | -poltergeist
       |    | -pseudodog
       |    | -rat
       |    | -snork
       |    | -stalker:
       |    |    | -combat
       |    |    | -death
       |    |    | -hiccup
       |    |    | -humming
       |    |    | -surrender
       |    |    | -wound
       |    | -tushkano
       |    | -zombie
       | -mp_actor
       | -music:
       |    | -save
       | -nature
       | -scripts:
       |    | -door_crash
       |    | -m_gameplay
       |    | -magnitofon
       | -script_replics:
       |    | -bandit_1:
       |    |    | -alarm
       |    |    | -combat
       |    |    | -idle
       |    |    | -replics
       |    | -comandir_1:
       |    |    | -drunk
       |    |    | -normal
       |    | -megafon:
       |    |    | -alarm
       |    |    | -comandir
       |    |    | -music
       |    | -military:
       |    |    | -replics
       |    | -radio:
       |    |    | -commander
       |    |    | -message
       |    | -soldier_1:
       |    |    | -alarm
       |    |    | -combat
       |    |    | -hear_something
       |    |    | -idle
       |    |    | -replics
       |    |    | -search_enemy
       |    | -stalker_1:
       |    |    | -newbie
       |    |    | -talk
       |    |    | -trade
       |    |    | -wound
       |    | -trader
       |    | -zombie:
       |    |    | -stalker_zombie
       | -script_sound:
       |    | -hail:
       |    |    | -soldier
       |    | -help:
       |    |    | -soldier
       |    | -reactions:
       |    |    | -dead_enemy:
       |    |    |    | -soldier
       |    |    | -dead_friend:
       |    |    |    | -soldier
       |    |    | -dead_mutant:
       |    |    |    | -soldier
       |    |    | -dead_neutral:
       |    |    |    | -soldier
       |    |    | -enemy:
       |    |    |    | -soldier
       |    |    | -friendly_fire:
       |    |    |    | -soldier
       |    |    | -hear_something:
       |    |    |    | -soldier
       |    |    | -mutants:
       |    |    |    | -soldier
       |    |    | -nothing:
       |    |    |    | -soldier
       |    |    | -search_enemy:
       |    |    |    | -soldier
       |    |    | -see_something:
       |    |    |    | -soldier
       |    | -states:
       |    |    | -fatique:
       |    |    |    | -soldier
       |    |    | -health:
       |    |    |    | -soldier
       |    |    | -idle:
       |    |    |    | -soldier
       |    |    | -sleep:
       |    |    |    | -soldier
       |    |    | -starvation:
       |    |    |    | -soldier
       |    | -talk:
       |    |    | -abuse
       |    |    |    | -soldier
       |    |    | -accept
       |    |    |    | -soldier
       |    |    | -greeting
       |    |    |    | -soldier
       |    |    | -leave
       |    |    |    | -soldier
       |    |    | -rejection
       |    |    |    | -soldier
       |    |    | -replics
       |    |    |    | -soldier
       |    |    | -trade
       |    |    |    | -no:
       |    |    |    |    | -soldier
       |    |    |    | -yes:
       |    |    |    |    | -soldier
       |    | -threat:
       |    |    | -backoff:
       |    |    |    | -soldier
       |    |    | -drop_weapon:
       |    |    |    | -soldier
       |    |    | -stop:
       |    |    |    | -soldier
       |    | -waiting:
       |    |    | -soldier
       |    | -weather:
       |    |    | -bad:
       |    |    |    | -soldier
       |    |    | -good:
       |    |    |    | -soldier
       | -weapons
    -spawns
    -textures:
       | -act
       | -andy
       | -artifact
       | -car
       | -controller
       | -corp
       | -crete
       | -det
       | -detail
       | -door
       | -ed
       | -effects
       | -fbr
       | -flare
       | -fonts
       | -fx
       | -glas
       | -glow
       | -gr
       | -grnd
       | -hud
       | -human
       | -icon
       | -internal
       | -intro
gamedata.db6
    -textures:
       | -intro
       | -item
       | -jeffry
       | -level
       | -lights
       | -map

gamedata.db7
    -textures:
       | -mtl
       | -pda
       | -pfx
       | -prop
       | -sign
       | -sky:
       |    | -old
       | -sleep
       | -ston
       | -temp
       | -terrain
       | -tree
       | -trees
       | -ui:
       |    | -eng_pda
       |    | -rus_pda

gamedata.db8
    -textures:
       | -ui
       | -veh
       | -water
       | -wind
       | -wm
       | -wood
       | -wpn

gamedata.db9
    -config:
       | -misc
       | -text:
       |    | -rus
       | -ui
    -sounds:
       | -characters_voice:
       |    | -dialogs
       |    | -multiplayer:
       |    |    | -automatic
       |    |    | -team_1
       |    |    | -team_2
       |    | -scenario:
       |    |    | -aes:
       |    |    |    | -aes2
       |    |    | -agroprom
       |    |    | -army_commander:
       |    |    |    | -drunk
       |    |    |    | -normal
       |    |    | -bandits
       |    |    | -bar:
       |    |    |    | -arena_megafon
       |    |    |    | -arena_public
       |    |    |    | -arena_sound
       |    |    |    | -barman
       |    |    |    | -barman_megafon
       |    |    |    | -bar_guard
       |    |    |    | -bar_hunter
       |    |    |    | -bar_informer
       |    |    |    | -bar_veteran
       |    |    |    | -bar_visitor
       |    |    |    | -dolg_guard
       |    |    |    | -dolg_megafon
       |    |    |    | -dolg_petrenko
       |    |    |    | -dolg_voronin
       |    |    |    | -pda
       |    |    |    | -psycho
       |    |    |    | -radio_music
       |    |    | -bun
       |    |    | -camp
       |    |    | -cit
       |    |    | -darkscape
       |    |    | -dramatic_garbage
       |    |    | -duty
       |    |    | -escape
       |    |    | -garbage
       |    |    | -guard_novice_camp
       |    |    | -gunslinger
       |    |    | -helicopter
       |    |    | -magnitofon
       |    |    | -megafon
       |    |    | -military:
       |    |    |    | -after_attack
       |    |    |    | -before_collect
       |    |    |    | -collect
       |    |    |    | -controller
       |    |    |    | -crazy
       |    |    |    | -dolg_attack:
       |    |    |    |    | -base
       |    |    |    | -dolg_kill_patrol
       |    |    |    | -freedom_base
       |    |    |    | -khutor_attack
       |    |    |    | -lukash
       |    |    |    | -pavlik_morozov
       |    |    |    | -pda
       |    |    | -military_stalker
       |    |    | -newbie_on_garbage
       |    |    | -osoznanie
       |    |    | -pri
       |    |    | -radar:
       |    |    |    | -entrance
       |    |    | -radio:
       |    |    |    | -radio_commander
       |    |    |    | -talk_1
       |    |    | -rostok:
       |    |    |    | -heli_crush
       |    |    | -sarcofag
       |    |    | -scared_stalker_underground
       |    |    | -tolik
       |    |    | -trader
       |    |    | -tramp
       |    |    | -val:
       |    |    |    | -ambush
       |    |    |    | -bs_fall
       |    |    |    | -escort
       |    |    |    | -monolith
       |    |    |    | -prisoner
       |    |    |    | -rob
       |    |    |    | -sacrifice
       |    |    |    | -suicide
       |    |    | -video
       |    |    | -wolf
       |    |    | -wounded_veteran_escape
       |    |    | -yantar
       |    |    | -zombied_stalker

0

14

Создание диалогов
-------------------------------------
Создание новых веток диалогов
Теория
1) Списки веток диалогов содержатся в файлах вида gamedata/config/gameplay/character_desc_*.xml
Это, например:
character_desc_zombied.xml character_desc_stalker.xml character_desc_garbage.xml ...
Файлы character_desc_*.xml можно сравнить со стволом дерева диалогов. В них перечисляется названия прикрепляемых веток диалогов
Например вот список веток диалога с Сидоровичем взятый из файла character_desc_escape.xml
    <start_dialog>escape_trader_start_dialog</start_dialog>
    <actor_dialog>escape_trader_talk_info</actor_dialog>
    <actor_dialog>escape_trader_jobs</actor_dialog>
    <actor_dialog>tm_trader_dialog</actor_dialog>
    <actor_dialog>tm_trader_reward</actor_dialog>
    <actor_dialog>escape_trader_done_blockpost_box</actor_dialog>
В свою очередь каждая ветка диалога также может ветвится.
2) Ветвление диалогов прописывается уже в других файлах.
Например, ветвление диалога с Сидоровичем содержится в файле gamedata/config/gameplay/dialogs_escape.xml Возьмем оттуда, например, ветвление escape_trader_jobs.
Ветвление имеет довольно большие масштабы, поэтому приведу только часть:
<dialog id="escape_trader_talk_info">
        <precondition>escape_dialog.trader_has_talk_info_wr</precondition>
        <has_info>tutorial_end</has_info>
        <phrase_list>
            <phrase id="1">
                <text>escape_trader_talk_info_1</text>
                <next>100</next>
                <next>99</next>
      <next>9995</next>
            </phrase>
            ...
            <phrase id="0">
                <text>escape_trader_talk_info_0</text>
                <next>1</next>
            </phrase>
        </phrase_list>
</dialog>
Здесь <precondition>…</precondition> - это проверка выполнения условия. Ветка появится в диалоге, только если условие выполняется. Конкретно <precondition>escape_dialog.trader_has_talk_info_wr</precondition> из ветки escape_trader_talk_info - это обращение к функции trader_has_talk_info_wr, находящейся в файле скрипте gamedata/scripts/escape_dialog.script
Функция выглядит так:
function trader_has_talk_info_wr( trader, actor )
return true
end
То есть, судя по его структуре, <precondition>escape_dialog.trader_has_talk_info_wr</precondition> выполняется всегда, т.к. функция всегда возвращает истину и <dialog id="escape_trader_talk_info"> пропускается в списк реплик.
Но для конкретной ветки может быть несколько precondition и других условий.
Далее, <has_info>tutorial_end</has_info> - это еще одна проверка, на этот раз на наличие у игрока так называемых infoportions, выдаваемы в процессе ключевых диалогов. В данном случае это проверка на то, закончена ли определенная стадия туториала, или нет. Т.е. ветка допустится в список реплик если стадия туториала закончена.
Более детально мы это разберем в конце статьи.
А далее идут конкретные фразы, содержащие ссылки на вытекающие фразы, например:
<phrase id="0">
                <text>escape_trader_talk_info_0</text>
                <next>1</next>
</phrase>
Это основа ветки escape_trader_talk_info.
Важно! В любой основной ветке любого диалога фраза <phrase id="0"> будет основой, из которой далее будет все вытекать. Она должна обязательно присутствовать и в вашем диалоге.
<next>1</next> - это ссылка на вытекающую фразу <phrase id="1">:
       <phrase id="1">
                <text>escape_trader_talk_info_1</text>
                <next>100</next>
                <next>99</next>
    <next>9995</next>
        </phrase>
В свою очередь <next>100</next>, <next>99</next>, <next>9995</next> это ссылки на фразы веточки растущие из фразы <phrase id="1">.
3) Текст каждой фразы содержится в третьем файле. Для диалога с Сидоровичем тексты лежат в файле gamedata/config/text/rus/stable_dialogs_escape.xml
<string id="escape_trader_talk_info_0">
    <text>Есть несколько вопросов.</text>
</string>
<string id="escape_trader_talk_info_1">
    <text>Спрашивай, только я ведь всего не знаю. Сам понимаешь, сижу тут
целыми днями, а жизнь - она вся там, снаружи, в Зоне. Могу рассказать о Зоне вообще, а немного
могу о ближайших окрестностях, где сам ходил.</text>
</string>
        ...
Эти строки содержат тексты для фраз <phrase id="0"> и <phrase id="1">
Итого диалоги разложены по трем, а то и более файлам.
Да кстати, путь по веткам может быть зацикленным, если того требует диалог. Например так:
<phrase id="0">
            <text>...</text>
            <next>1</next>
            <next>2</next>
</phrase>
<phrase id="1">
            <text>...</text>
            <next>11</next>
            <next>12</next>
</phrase>
<phrase id="11">
            <text>...</text>
            <next>1</next>  - Это возврат к фразе №1 (зацикливание) 
            <next>111</next>
</phrase>
Практика
Добавим в диалог с Сидоровичем ветку своего собственного изготовления.Например такую:
Меченый: Сидрыч, а чего это у тебя зеленые человечки, что по столу бегают, такие худые?
Сидорович: Чего?!
Меченый: Ты их совсем, совсем не кормишь?
Сидорович: В следующий раз, как пойдешь в зону, бери-ка  вместо водяры побольше антирада. А то
мало что таким перегаром дышишь, уже до зеленых человечков долечился... Шутник.
Для этого:
1) В файле gamedata/config/gameplay/character_desc_escape.xml в конце списка веток для trader припишем свою ветку с произвольным названием. Это будет, например, <actor_dialog>escape_trader_letat_gusi</actor_dialog>.
Т.е у нас получится так:
<specific_character id="escape_trader" no_random = "1">
    ...
    <start_dialog>escape_trader_start_dialog</start_dialog>
    <actor_dialog>escape_trader_talk_info</actor_dialog>
    <actor_dialog>escape_trader_jobs</actor_dialog>
    <actor_dialog>tm_trader_dialog</actor_dialog>
    <actor_dialog>tm_trader_reward</actor_dialog>
    <actor_dialog>escape_trader_done_blockpost_box</actor_dialog>
                        <actor_dialog>escape_trader_letat_gusi</actor_dialog>
</specific_character>
    …
Записываем изменения, с этим файлом пока всё.
2) Теперь берем файл gamedata/config/gameplay/dialogs_escape.xml
Диалогу:
Меченый: Сидрыч а почему это у тебя зеленые человечки, что по столу бегают, такие худые?
Сидорович: Чего?!!
Меченый: Ты их совсем, совсем не кормишь?
Сидорович: В следующий раз, как пойдешь в зону, бери-ка  вместо водяры побольше антирада. А то
мало что таким перегаром дышишь, уже до зеленых человечков долечился... Шутник.
Будет соответствовать такая структура:
<phrase id="0">
            <text>escape_trader_letat_gusi_0</text>
            <next>1</next>
</phrase>
<phrase id="1">
            <text>escape_trader_letat_gusi_1</text>
            <next>2</next>
</phrase>
<phrase id="2">
            <text> escape_trader_letat_gusi_2</text>
            <next>3</next>
</phrase>
<phrase id="3">
            <text> escape_trader_letat_gusi_3</text>
</phrase>
Условия наличия ветки в диалоге можно взять из ветки <dialog id="escape_trader_talk_info">.
Т.е берем условия <precondition>escape_dialog.trader_has_talk_info_wr</precondition> и <has_info>tutorial_end</has_info>. Можно было, конечно, прописать в скрипте еще одно условие для ветки, чтобы она появилась только один раз, а потом больше не возникала. Но об этом как-нибудь позже.
В итоге у нас получилась такая структура:
<dialog id="escape_trader_letat_gusi">
        <precondition>escape_dialog.trader_has_talk_info_wr</precondition>
        <has_info>tutorial_end</has_info>
        <phrase_list>
                   <phrase id="0">
                             <text>escape_trader_letat_gusi_0</text>
                              <next>1</next>
                    </phrase>
                     <phrase id="1">
                               <text>escape_trader_letat_gusi_1</text>
                                <next>2</next>
                     </phrase>
                     <phrase id="2">
                                <text> escape_trader_letat_gusi_2</text>
                                <next>3</next>
                     </phrase>
                     <phrase id="3">
                                  <text> escape_trader_letat_gusi_3</text>
                      </phrase>
        </phrase_list>
  </dialog>
Её нужно вставить в любом месте между dialog id'ами других веток в файле dialogs_escape.xml. Главное - не промахнутся и засунуть именно между, а не внутрь одного из dialog id.
После сохранения внесенных изменений с файлом dialogs_escape.xml все.
3) Теперь вбиваем сами текстовички в файле gamedata/config/text/rus/stable_dialogs_escape.xml
Т.е нам надо в файле stable_dialogs_escape.xml вставить такую конструкцию:
<string id="escape_trader_letat_gusi_0">
    <text>Сидрыч, а чего это у тебя зеленые человечки, что по столу бегают, такие худые?</text>
</string>
<string id="escape_trader_letat_gusi_1">
    <text>Чего?!</text>
</string>
<string id="escape_trader_letat_gusi_2">
    <text>Ты их совсем, совсем не кормишь?</text>
</string>
<string id="escape_trader_letat_gusi_3">
    <text>В следующий раз, как пойдешь в зону, бери-ка  вместо водяры побольше
антирада. А то мало что таким перегаром дышишь, уже до зеленых человечков долечился...
Шутник.</text>
</string>

В любом месте между уже существующими string id. После сохранения изменений, у нас все готово. Можно загружать игру и смотреть что получилось.
Дополнительно
Внимание! После патча 1.002 данный урок перестал работать. Причина - со вторым патчем несовместимо это условие:
<precondition>escape_dialog.trader_has_talk_info_wr</precondition>
Дело в том, что во втором патче из файла escape_dialog.script была удалена функция:
function trader_has_talk_info_wr( trader, actor )
   return true
end
Можно либо записать эту функцию обратно в escape_dialog.script, либо использовать другие более-менее подходящие условия, например:
<precondition>escape_dialog.trader_alredy_give_job</precondition>
Всё. Мы научились писать простые диалоги.

0

15

Создание квестов (базовый уровень)
--------------------------------------------------------------
Вступление
Перед изучением этого урока советую освоить находящийся несколько выше урок "Создание диалогов".
Небольшие правила, следуя которым, можно сберечь себе много нервов:
- всегда сохраняйте резервные копии модифицируемых файлов - старайтесь почаще тестировать внесенные изменения - так проще понять, в чем вы ошиблись (если активно работать пару часов без остановки, не разу не протетировав внесенные изменения, то потом будет очень сложно понять - почему же, черт возьми, игра вылетает при попытке поговорить с Сидоровичем?) - перед началом работы создайте новую папку gamedata, а свои моды спрячьте подальше: работать с "чистой" версией игры не в пример удобнее и проще; особенно противопоказан Repair Mod, который с новыми диалогами часто конфликтует. О том, как создать диалоги и квесты, исключающие возможность конфликта с другими подобными модами, см. часть 4.
Создание базового диалога
Начнем создание квеста с написания небольшого линейного диалога.
Открываем файл gamedata\config\gameplay\character_desc_escape.xml и проводим такие манипуляции:
- находим строку "<actor_dialog>escape_trader_done_blockpost_box</actor_dialog>" - добавляем после нее новую - "<actor_dialog>escape_trader_oops</actor_dialog>" - сохраняем изменения
Мы добавили к Диалогу с Сидоровичем новую ветку, вернее, только ссылку на неё. Сама внутренняя структура ветки хранится в файле gamedata\config\gameplay\dialogs_escape.xml, который мы открываем и производим:
- находим в любом месте файла промежуток между </dialog> и <dialog id="..."> - засовываем туда такую конструкцию:
<dialog id="escape_trader_oops">
        <precondition>escape_dialog.trader_alredy_give_job</precondition>
        <has_info>tutorial_end</has_info>
        <phrase_list>
<phrase id="0">
<text>escape_trader_oops_0</text>
<next>1</next>
</phrase>
<phrase id="1">
<text>escape_trader_oops_1</text>
<next>2</next>
</phrase>
<phrase id="2">
<text>escape_trader_oops_2</text>
<next>1</next>
</phrase>
<phrase id="3">
<text>escape_trader_oops_3</text>
</phrase>
</phrase_list>
</dialog>
- сохраняем изменения
Теперь у нас прописана структура новой ветки диалога. Осталось сделать еще одну вещь - прописать строки, которые будут отображаться вместо "escape_trader_oops_...".
Для этого откроем файл gamedata\config\text\rus\stable_dialogs_escape.xml и сделаем следующее:
- находим любой удобный промежуток между </string> и <string id="..."> - прописываем туда следующие строки:
<string id="escape_trader_oops_0">
    <text>Сидрыч, давай поговорим о... водке.</text>
</string>
<string id="escape_trader_oops_1">
    <text> водке? Да какая водка? Нет её у меня, кончилась. Вроде у Волка на чердаке была, что-то он
однажды об этом упоминал... Принеси, а?</text>

</string>
<string id="escape_trader_oops_2">
    <text>Да сбегаю я сейчас, сбегаю... алкоголик, блин.</text>
</string>
<string id="escape_trader_oops_3">
    <text>Беги, беги... сил уж нет ждать.</text>
</string>
- сохраняем изменения
Всё. Диалог готов. Можно грузить игру и смотреть, работает ли новая ветка. А теперь будем прикреплять к этому безобразию квест ""Принеси водки Сидоровичу".

Создание базового квеста
Активацию квеста в диалог прикрепить достаточно просто. Проводим с файлом gamedata\config\gameplay\ dialogs_escape.xml следующие манипуляции:
- добавляем содержимое фразы <phrase id="2"> следующим:

<phrase id="2">
<text>escape_trader_oops_2</text>
<give_info>kvest_vodka_started</give_info>
<next>3</next>
                     </phrase>
- сохраняем изменения
Теперь после фразы Меченого "Да сбегаю я сейчас, сбегаю..." Сидорович таки всучивает нам квест "Принеси водку". Но не спешите тестировать изменения. Мы добавили в диалог упоминание о квесте, хотя он еще не создан.
Исправим это недоразумение. Откройте файл gamedata\config\gameplay\tasks_escape.xml и в начале файла создайте такую конструкцию:
<game_task id="esc_test_vodka_task">
        <title>Принести водки</title> <!-- заголовок квеста -->
        <objective>
                <text>Принести водки Сидоровичу</text>
                <icon>ui_iconsTotal_find_item</icon>
                <infoportion_complete>test_quest_vodka_otdana</infoportion_complete>        </objective>
        <objective>
                <text>Вернуться с водкой обратно</text>
                <map_location_type hint="esc_dinamit_to_volk">green_location</map_location_type>
                <object_story_id>Escape_novice_lager_volk</object_story_id>
                <infoportion_complete>test_quest_vodka_otdana</infoportion_complete>
        </objective>
        <objective>
                <text>Найти водку на чердаке</text>
                <map_location_type hint="escape_trader">blue_location</map_location_type>
                <object_story_id>Escape_Trader</object_story_id>
                <infoportion_complete>test_quest_vodka_otdana</infoportion_complete>
        </objective>
</game_task>
Мы прописали данные о квесте: название, иконку, строки заданий, расположение маркеров и т.д.
К этому файлу мы еще вернемся, т.к. в этом варианте многое проставлялось не иначе как от балды. Я еще подумаю, как заставить задание "Вернуться с водкой обратно" появиться в PDA, а то оно что-то не желает явить себя народу... впрочем, ладно, главное, что все работает и не вылетает. А исправление столь мелких багов - дело десятое. Продолжим.
Откроем файл gamedata\config\gameplay\info_l01escape.xml и зарегистрируем до того отсутствовавшие в игре типы условий (они нам еще пригодятся для завершения работы над квестом):
- после строки <game_information_portions> прописываем:
<info_portion id="test_quest_vodka_otdana"></info_portion>

<info_portion id="kvest_vodka_started">
<task>esc_test_vodka_task</task>
</info_portion>

<info_portion id="otkazalsya_prinesty_vodku"></info_portion>
С прописыванием условий - всё.
Теперь займемся одной небольшой, но нужной вещью - прописыванием экранных подсказок, которые высвечиваются при получении/выполнении этапа/завершении задания.
Для этого откроем файл gamedata\config\text\rus\string_table_tasks_escape.xml и пропишем там:
    <string id="esc_test_prinesti_vodku">
        <text>Принести бутылку водки</text>
    </string>
    <string id="esc_test_prinesti_vodku_1">
        <text>Найти водку на чердаке у Волка</text>
    </string>
    <string id="esc_test_prinesti_vodku_2">
        <text>Принести водку Сидоровичу</text>
    </string>
Теперь можно тестировать, что получилось. Сверяем результаты:
- по окончанию разговора про водку у вас появляется новое задание - в задании маркером отмечен Волк (ближайший к чердаку маркер, потому и отмечен) - при получении задания на экране высвечивается уведомление
Можно приступать к третьей стадии. Что мы забыли? Правильно - возможность выполнить квест.

Реализация возможности выполнить квест
На самом деле - все просто. Все условия и т.д. уже нами созданы, осталось только применить их в диалоге. Давайте несколько изменим его структуру, сделаем его ветвистым и функциональным:
0. Сидрыч, давай поговорим о... водке. ( переход к 1)
1. О водке? Да какая водка? Нет её у меня, кончилась. Вроде у Волка на чердаке была, что-то он однажды об этом упоминал... Принеси, а? ( выбор - переход к 2, 4, 5; изначально доступен только 2 вариант )
2. Да сбегаю я сейчас, сбегаю... алкоголик, блин. ( получение квеста, переход к 3, после этого перестает быть доступен )
3. Беги, беги... сил уж нет ждать. ( конец, переход к списку веток Сидоровича )
4. Вот она, твоя бутылка водки. Ну, вернее, не твоя, а Волка... ( появляется только при наличии водки в инвентаре, при выборе водка передается Сидоровичу, квест выполняется, идет переход к 7 )
5. Извини, Сидрыч, я пока еще не раздобыл, терпи... ( появляется только если взять квест, переход к 6 )
6. А ну марш отсюда! Без бутылки пришел... ууу, вражина... ( переход к 8 )
7. Теперь моя будет, Меченый! Ты так Волку и передай. Спасибо, выручил... держи награду. ( выдача награды, переход к 8 )
8. Ну тебя в пень... ( конец, переход к списку веток Сидоровича )
А вот так это будет выглядеть в файле gamedata\config\gameplay\dialogs_escape.xml:
<dialog id="escape_trader_oops">
        <precondition>escape_dialog.trader_alredy_give_job</precondition>
        <has_info>tutorial_end</has_info>
        <phrase_list>
                     <phrase id="0">
                              <text>escape_trader_oops_0</text>
                              <next>1</next>
                     </phrase>
                     <phrase id="1">
                                <text>escape_trader_oops_1</text>
                                <next>2</next>
        <next>4</next>
        <next>5</next>
                     </phrase>
                     <phrase id="2">
        <dont_has_info>kvest_vodka_started</dont_has_info>
                                <text>escape_trader_oops_2</text>
        <give_info>kvest_vodka_started</give_info>
                                <next>3</next>
                     </phrase>
                     <phrase id="3">
                                <text>escape_trader_oops_3</text>
        <action>dialogs.break_dialog</action>
                     </phrase>
         <phrase id="4">
                              <text>escape_trader_oops_4</text>
        <precondition>escape_dialog.have_a_vodka</precondition>
        <action>escape_dialog.otday_vodku</action>
                              <next>7</next>
         </phrase>
         <phrase id="5">
        <has_info>kvest_vodka_started</has_info>
                              <text>escape_trader_oops_5</text>
                              <next>6</next>
         </phrase>
         <phrase id="6">
                              <text>escape_trader_oops_6</text>
                              <next>8</next>
         </phrase>
         <phrase id="7">
                              <text>escape_trader_oops_7</text>
        <give_info>test_quest_vodka_otdana</give_info>
        <action>escape_dialog.transfer_deneg</action>
                              <next>8</next>
         </phrase>
         <phrase id="8">
                              <text>escape_trader_oops_8</text>
         </phrase>
        </phrase_list>
    </dialog>
Теперь добавим в игру скрипты "передача денег" и "передача водки". Откройте файл gamedata\scripts\escape_dialog.script и перед разделителем "Trader" добавьте туда следующие строки:
function transfer_deneg(first_speaker, second_speaker)
    dialogs.relocate_money(second_speaker, 4000, "in")
end
   
function otday_vodku (npc, actor)
    dialogs.relocate_item_section(npc, "vodka", "out")
end

function have_a_vodka (stalker, player)
    return stalker:object ("vodka") ~= nil
end
Готово. Запускайте игру и любуйтесь.
Для тех, кто еще с нами - сейчас мы модифицируем квест так, чтобы исключить конфликты с другими подобными модами.

Реализация совместимости
Из-за чего наш мод не может работать вместе с аналогичными ему модами? Да потому, что файлы dialogs_escape.xml и некоторые другие у них пересекаются. Поэтому выделим их отдельно от основных диалогов:
Вместо dialogs_escape.xml мы будем испольховать новый - dialogs_new.xml Вместо stable_dialogs_escape.xml мы будем использовать файл stable_dialogs_new.xml (важно! не знаю почему, но он должен лежать в text\..., а не в text\rus\...)
Соответственно, весь реализованный нами новый контент перекидываем в пустые файлы (соблюдая форматирование), подчистив за собой на старом месте.
Единственное, что останется сделать после установки того же Repair Mod'а - заново добавить ветку диалога Сидоровичу в файле character_desc_escape.xml. Остальное в новом варианте нашего мода переписывать не придется - для диалогов отведено три файла.
Остальные файлы относятся уже к квестовой части и ни с чем пересекаться не могут - где вы видели другие моды с новыми квестами? Я - нет.
Откройте файл gamedata\config\localization.ltx и зарегистрируйте там stable_dialogs_escape.ltx. Потом откройте файл gamedata\config\system.ltx и в разделе "Dialogs" в конце строки (после dialogs_aes) пропишите dialogs_new (без ".ltx"!).
Все. Теперь ваши диалоги будут подгружаться из сторонних файлов.

Отдельное спасибо:
XiaNi - за страшный и непричесанный, но работающий пример квеста, на основе которого я и освоил принципы квестостроения =)
Keha – за урок по созданию новых диалогов
Дополнения
1. Если изменить шапку нашего диалога в файле dialogs_escape.xml со старого варианта на такой, то ветка исчезнет после выполнения задания:
<dialog id="escape_trader_oops">
        <precondition>escape_dialog.trader_alredy_give_job</precondition>
        <has_info>tutorial_end</has_info>
<dont_has_info>test_quest_vodka_otdana</dont_has_info>
          <phrase_list>

0

16

Создание квестов
-----------------------------------------------
Создание квестов и диалогов
Создание базового диалога
Итак, приступим к созданию диалога, в котором нам будет выдаваться новый квест. Участвующие лица: Сидорович (С) и Меченый (М)
М: Здравствуй, Сидорыч! Есть работенка?
С: О, неужели заглянул к нам на огонек, Меченый? Ладно... ближе к телу... эээ, к делу. У меня к тебе следующая просьба: сбегай к Волку, у него что-то намечалось.
М: Без проблем! Уже бегу.
Будем считать, определились с фразами базового диалога. Теперь необходимо добавить его в соответствующем виде, чтобы игре он был «понятен».
Создание «скелета» диалога.
Для того, чтобы добавить наш диалог, необходимо открыть для редактирования файл gamedata\config\gameplay\dialogs_escape.xml
Для тех, кто знаком с языком XML структура данного файла будет ясна с первого взгляда. Но, поподробнее об этом.
Для того, чтобы добавить в игру диалог предусмотрены так называемые тэги. В данном случае, тэгами являются такие конструкции:
1. <game_dialogs> и закрывающий к нему - </game_dialogs>
2. <dialog id = «»> закрывающий - </dialog>
3. <phrase_list> - </phrase_list>
4. <phrase id = «»> - </phrase>
5. <text> </text>
6. <next> </next>
В принципе, этих конструкций уже достаточно для того, чтобы создать диалог. Но, диалог, созданный на основе этих конструкций, не сможет стать основой для нового квеста. Для того, чтобы во время диалога вам выдавался квест, есть соответствующий тэг. Но об этом – чуть позже.
Поясню, что обозначает каждый тэг в отдельности.
1. Определяет содержимое файла (в данном случае, говорит о том, что файл содержит диалоги);
2. Определяет новый диалог с id = «». Где содержимое кавычек есть идентификатор диалога. Идентификатор диалога задается в файлах типа character_description_***.xml ;
3. Этот тэг говорит XML-парсеру игры о том, что далее следуют фразы диалога. Иными словами, между <phrase_list> и </phrase_list> содержатся фразы диалога;
4. Этот тэг определяет фразу с id = «». Внутри кавычек содержится идентификатор фразы (ВНИМАНИЕ: идентификатором в данном случае могут быть ТОЛЬКО цифры);
5. Внутри этих двух тэгов содержится ссылка на соответствующий данной фразе текст (пример, esc_trader_talk_info_123). Сам текст берется из файлов типа stable_dialogs_*****.xml, в котором содержатся все фразы в текстовом виде. О создании текста фразы поговорим позже;
6. Внутри этого тэга содержится ссылка (в числовом формате) на следующую (или следующие) фразы.
Теперь приступим к тэгам, позволяющим производить какие-то действия во время диалога.
<precondition> </precondition>. Представляет собой предусловие, в случае выполнения которого (то есть предусловие вернуло ИСТИНУ) данный диалог, или фраза будут появляться в списке доступных во время игры у NPC.
<action> </action>. Данный тэг позволяет производить какое-либо действие во время диалога (например, передачу предметов между общающимися... так же позволяет производить более сложные действия). Внутри тэга располагается ссылка на какую-либо функцию (например, dialogs. actor_set_dolg сделает игрока членом группировки Долг).
<give_info> </give_info>. Позволяет выдавать игроку во время диалога так называемые info_portion'ы (кстати, инфопоршны можно выдавать так же и через <action>, только это потребует создания специальной функции). info_portion – является основой для квестов, info_portion’ы определяются в файлах типа info****.xml. Инфопоршны могут, как начинать квест, так и заканчивать (завершать) его. Так же, с помощью инфопоршнов можно отслеживать действия игрока, для того, чтобы, например, вывести в нужное время диалог. <has_info> </has_info> и <dont_has_info> </dont_has_info> являются предусловиями для текущей фразы/диалога. Первый тэг проверяет наличие данного инфопоршна у игрока, второй – отсутствие.
Ну что, теперь мы можем создать диалог, в котором нам будет выдаваться квест. Но мы не создали самих info_portion'оф, которые позволяет активировать квест.
Создание info_portion'ов
Итак, открываем файл gamedata\config\gameplay\ info_l01escape.xml. Что мы там видим? Правильно, все ту же структуру XML. В данном файле нас интересуют только два тэга:
<info_portion id = “”> </info_portion>
<task > </task>
Первый объявляет сам info_portion. Второй – объявляет задание (идентификатор задания id содержится внутри тэга <task>)
Для примера, создадим 3 info_portion, которые понадобятся нам для будущего квеста:
<info_portion id = “new_task_started”>
<task>new_task</task>
</info_portion>
Это инфопоршн с именем new_task_started. Он активирует квест с именем new_task.
<info_portion id = “player_talked_with_wolf”>
</info_portion>
<info_portion id = “player_complete_new_task”>
</info_portion>
Создание нового квеста
Сами квесты содержаться в файлах типа tasks_*****.xml
Откроем файл gamedata\config\gameplay\tasks_escape.xml. Структура – все тот же XML.
Для примера исследуем уже существующий квест:
<game_task id="esc_help_wounded_from_raid" prio="485">
        <title>esc_help_wounded_from_raid</title>
<objective>
<text>esc_help_wounded_from_raid_0</text>
<icon>ui_iconsTotal_esc_help_wounded_from_raid</icon>
<function_complete>escape_tasks.task_fox_complete</function_complete>
<infoportion_set_complete>garbage_meetstalker_start</infoportion_set_complete>
        <article>esc_fox_help</article>
</objective>
<objective>
    <text>esc_help_wounded_from_raid_1</text>
<map_location_type hint="esc_fox">green_location</map_location_type>
<object_story_id>Escape_stalker_from_raid</object_story_id>
<infoportion_complete>escape_fox_heal</infoportion_complete>
<infoportion_fail>esc_dogs_return</infoportion_fail>
</objective>
<objective>
<text>esc_help_wounded_from_raid_2</text>
<map_location_type hint="esc_fox">green_location</map_location_type>
<object_story_id>Escape_stalker_from_raid</object_story_id>
<infoportion_complete>escape_stalker_done</infoportion_complete>
</objective>
</game_task>
По кусочкам:
<game_task id="esc_help_wounded_from_raid" prio="485"> </game_task>
Задает имя (id) нового квеста. В данном случае, esc_help_wounded_from_raid. prio = “” задает приоритет задачи. Чем выше приоритет, тем больше вероятность того, что текущий маркер квеста будет переключен на ваше задание.
<title>esc_help_wounded_from_raid</title>
Задает заголовок квеста. Т. е. его название. Название можно прописать в виде текста, либо в виде ссылки. В данном случае используется ссылка на текст, который хранится в файле string_table_tasks_escape.xml.
<function_complete>escape_tasks.task_fox_complete</function_complete>
Вызывает функцию из файла escape_tasks.script под именем task_fox_complete. При выполнении данной функции дается info_portion, который завершает данную подзадачу, в случае, если все условия функции соблюдаются.
<infoportion_complete>escape_fox_heal</infoportion_complete>
Текущее подзадание будет завершено в случае, если игроку будет дан этот info_portion.
<infoportion_fail>esc_dogs_return</infoportion_fail>
Текущее подзадание будет провалено в случае, если игроку будет дан этот info_portion.
<map_location_type hint="esc_fox">green_location</map_location_type>
Создает указатель на карте с подсказкой esc_fox и типом green_location.
<object_story_id>Escape_stalker_from_raid</object_story_id>
Указывает на sid из файла gamedata\config\game_story_ids.ltx
<infoportion_set_complete>garbage_meetstalker_start</infoportion_set_complete>
Автоматически устанавливает данную подзадачу в положение «Выполнено», если у игрока есть данный info_portion. //!!!!!!Не уверен – не пользовался не разу.
<text>esc_help_wounded_from_raid_0</text>
Содержит описание подзадачи. Может содержать внутри как текст, так и ссылку на текст.
Создадим задание, которое потребуется нам для диалога:
<game_task id=”new_task”>
<title>Поговорить с Волком</title>
<objective>
    <text>Вернуться к Сидорычу</text>
    <map_location_type hint="escape_trader">blue_location</map_location_type>
    <object_story_id>Escape_Trader</object_story_id>
    <infoportion_complete>player_complete_new_task</ infoportion_complete>
</objective>
<objective>
    <text>Поговорить с Волком</text>
    <map_location_type hint="volk">green_location</map_location_type>
    <object_story_id>Escape_novice_lager_volk</object_story_id>
    <infoportion_complete>player_talked_with_wolf</ infoportion_complete>
</objective>
<objective>
    <text>Вернуться к Сидорычу</text>
    <map_location_type hint="escape_trader">blue_location</map_location_type>
    <object_story_id>Escape_Trader</object_story_id>
    <infoportion_complete>player_complete_new_task</ infoportion_complete>
</objective>
</game_task>
Теперь создадим скелеты диалогов для нашего квеста. Потребуется три: один для Волка и два для Сидорыча.
<dialog id = “volk_new_quest”>
<has_info> new_task_started </has_info>
<dont_has_info> player_talked_with_wolf</dont_has_info>
<dont_has_info> player_complete_new_task </dont_has_info>
<phrase_list>
<phrase id = “0”>
    <text>esc_volk_new_quest_0</text>
    <next>1</next>
</phrase>
<phrase id = “1”>
    <text>esc_volk_new_quest_1</text>
    <give_info>player_talked_with_wolf</give_info>
    <next>2</next>
</phrase>
<phrase id = “2”>
    <text>esc_volk_new_quest_2</text>
    <action>dialogs.break_dialog</action>
</phrase>

</prhase_list>
</dialog>

<dialog id = “esc_trader_new_quest”>
<dont_has_info> player_complete_new_task </dont_has_info>
<dont_has_info> player_talked_with_wolf</dont_has_info>
<phrase_list>
<phrase id = “0”>
    <text>esc_trader_new_quest _0</text>
    <next>1</next>
</phrase>
<phrase id = “1”>
    <text>esc_trader_new_quest _1</text>
    <give_info>new_task_started </give_info>
    <next>2</next>
</phrase>
<phrase id = “2”>
    <text>esc_trader_new_quest _2</text>
    <action>dialogs.break_dialog</action>
</phrase>

</prhase_list>
</dialog>

<dialog id = “esc_trader_new_quest_complete”>
<dont_has_info> player_complete_new_task </dont_has_info>
<phrase_list>
<phrase id = “0”>
    <text> esc_trader_new_quest_complete _0</text>
    <next>1</next>
</phrase>
<phrase id = “1”>
    <text> esc_trader_new_quest_complete _1</text>
    <give_info>player_complete_new_task </give_info>
    <next>2</next>
</phrase>
<phrase id = “2”>
    <text> esc_trader_new_quest_complete _2</text>
    <action>dialogs.break_dialog</action>
</phrase>
</prhase_list>
</dialog>
Все «скелеты» добавляем в файл dialogs_escape.xml. Между <game_dialogs> и <dialog id=...>!
Примечание: посмотрите на уже готовые диалоги, которые создали разработчики игры – это облегчит вам жизнь.
Теперь бежим в файл character_desc_escape.xml
Ищем там NPC с id = “escape_trader” и добавляем два новых <actor_dialog></actor_dialog>:
<actor_dialog>esc_trader_new_quest_complete </actor_dialog>
<actor_dialog>esc_trader_new_quest </actor_dialog>
Там же ищем NPC с id = “esc_wolf” и добавляем один актор_диалог:
<actor_dialog> volk_new_quest </actor_dialog>
Примечание: <actor_dialog> является диалогом, который активируется самим игроком по желанию. А <start_dialog> активируется только при выполнении определенных условий, заданных в нем, и обычно недоступен.
Осталось только добавить текст трех диалогов, чтобы наш квест стал полноценным. Открываем файл stable_dialogs_escape.xml и добавляем в него новый текст в таком виде:
<string id=" esc_trader_new_quest_complete_0 ">
    <text>Все, я выполнил поручение Влока!</text>
</string>
<string id=" esc_trader_new_quest_complete_1 ">
    <text>Молодец, Меченый. На тебя можно положиться.</text>
</string>
<string id=" esc_trader_new_quest_complete_2 ">
    <text>Рад был помочь, Сидорыч.</text>
</string>
<string id=" esc_trader_new_quest _0 ">
    <text> Здравствуй, Сидорыч! Есть работенка?</text>
</string>
<string id=" esc_trader_new_quest _1 ">
    <text> О, неужели заглянул к нам на огонек, Меченый? Ладно… ближе к телу… эээ, к делу. У меня к тебе следующая
просьба: сбегай к Волку, у него что-то намечалось.</text>
</string>
<string id=" esc_trader_new_quest _2">
    <text> Без проблем! Уже бегу.</text>
</string>
<string id="esc_volk_new_quest_0">
    <text>Здорово, Волк. Меня тут Сидорыч послал, говорит у тебя работа есть.</text>
</string>
<string id="esc_volk_new_quest_1">
    <text>Привет, Меченый. Верь ты ему больше, этому старому маразматику! Все спокойно сейчас. Так что иди к нему и
скажи, что все хорошо.</text>
</string>
<string id="esc_volk_new_quest_2">
    <text>Все, ухожу.</text>
</string>
Все! Поздравляю! Вы только что написали новый квест.

0

17

Создание нового артефакта
------------------------------------------------------------
Сегодня мы на примере научимся созданию новых артефактов. Создадим, например, артефакт под названием "Ромашка".
Статья написана по материалам Hunter Mod.
Создание конфига
Заходим в папку gamedata\config\misc и открываем файл artefacts.ltx.
И находим, например, артефакт "Медуза":
[af_medusa]:af_base
GroupControlSection = spawn_group
$spawn        = "artifacts\moscito medusa"

$prefetch     = 64
cform        = skeleton
class        = ARTEFACT

visual        = physics\anomaly\artefact_blackdrip.ogf 
description    = enc_zone_artifact_af-medusa
inv_name    = af-medusa
inv_name_short    =
inv_weight    = 0.5

inv_grid_x    = 9
inv_grid_y    = 4

cost        = 1000

jump_height    = .5

particles    = anomaly2\artefact\artefact_gravi

lights_enabled = false

;скорости увеличения (уменьшения)
health_restore_speed    = 0.0   
radiation_restore_speed    = 0.0005
satiety_restore_speed    = 0.0
power_restore_speed    = 0.0
bleeding_restore_speed    = 0.0
hit_absorbation_sect    = af_medusa_absorbation

artefact_activation_seq    = af_activation_bold

[af_medusa_absorbation]
burn_immunity = 1.0        ;коэффициенты иммунитета
strike_immunity = 1.0
shock_immunity = 1.0
wound_immunity = 1.0   
radiation_immunity = 1.0
telepatic_immunity = 1.0
chemical_burn_immunity = 1.0
explosion_immunity = 1.0
fire_wound_immunity  = 0.98
В этой секции задаются параметры артефакта, начиная от внешнего вида и заканчивая коэффициентами различных эффектов вроде вывода радиации. Сделаем копию секции, принадлежающей "Медузе", и заменим её название с af_medusa на af_romashka.

Должно выйти примерно вот так:
[af_romashka]:af_base
GroupControlSection = spawn_group
$spawn        = "artifacts\moscito romashka"

$prefetch     = 64
cform        = skeleton
class        = ARTEFACT

visual        = physics\anomaly\artefact_blackdrip.ogf 
description    = enc_zone_artifact_af-romashka
inv_name    = af-romashka
inv_name_short    =
inv_weight    = 0.5

inv_grid_x    = 9
inv_grid_y    = 4

cost        = 1000

jump_height    = .5

particles    = anomaly2\artefact\artefact_gravi

lights_enabled = false

;скорости увеличения (уменьшения)
health_restore_speed    = 0.0   
radiation_restore_speed    = 0.0005
satiety_restore_speed    = 0.0
power_restore_speed    = 0.0
bleeding_restore_speed    = 0.0
hit_absorbation_sect    = af_romashka_absorbation

artefact_activation_seq    = af_activation_bold

[af_romashka_absorbation]
burn_immunity = 1.0        ;коэффициенты иммунитета
strike_immunity = 1.0
shock_immunity = 1.0
wound_immunity = 1.0   
radiation_immunity = 1.0
telepatic_immunity = 1.0
chemical_burn_immunity = 1.0
explosion_immunity = 1.0
fire_wound_immunity  = 0.98

Назначение некоторых параметров, влияющих на одевшего артефакт:
· health_restore_speed - прирост к скорости восстановления здоровья
· radiation_restore_speed - прирост скорость вывода радиации
· satiety_restore_speed - прирост к голоду
· power_restore_speed - прирост к выносливости
· bleeding_restore_speed - прирост к скорости остановки кровотечений
Создание описания и имени артефакта
Заходим в gamedata\config\text\rus и открываем файл string_table_enc_zone.xml. Добавим туда строку с названием артефакта.
<string id="af-romashka">
    <text>"Ромашка"</text>
</string>
Теперь у артефакта есть имя, но одного его недостаточно. Нужно сделать описание.
Поэтому добавим и его.
<string id="enc_zone_artifact_af-romaska">
    <text>Очень странный артефакт. Впервые появился в Зоне где-то в 2011 году, но толку от него - ноль. Ученые
                      не обнаружили никакого влияния артефакта на организм носителя.</text>
</string>
Все, поздравляю, вы только что создали свой первый артефакт! :)

0

18

Создание нового оружия
------------------------------------------
В этой статье мы научимся создавать новые образцы вооружения. Для начала, мы будем использовать модели из оригинальной игры. Если вы хотите создать оружие, имеющее уникальный внешний вид, ознакомьтесь с уроком по созданию моделей.
Добавим в игру АК101.
Внешний вид
Позаботимся о том, чтобы наше оружие отличалось внешне от того же АК74.
Текстуры
Нарисуем для оружия новую текстуру. Подробно останавливаться на этом процессе не буду, ознакомьтесь с примером, приведенным здесь. Итак, основываясь на текстуре АК74, мы сделали вот такую текстуру:

Файлы текстур мы назвали:
· wpn_ak10.dds
· wpn_ak10_bump#.dds
· wpn_ak10_bump.dds
Модели
Новых моделей мы пока делать не станем, просто воспользуемся дублированными моделями от АК74. Скопируем папку:
gamedata\meshes\weapons\ak47\
И назовем её ak-101. Содержимое, соответственно, переименуем в:
· wpn_ak101.ogf
· wpn_ak101_hud.ogf.
Теперь пропишем в эти модели созданные нами текстуры.
Иконки
Добавим в игру иконки, которыми оружие будет отображаться в инвентаре. Вот, что получилось в конечном итоге:

Конфиги
Новое оружие мы будем делать на базе оригинальных конфигурационных файлов. Создадим АК101 на базе конфигов АК74.
Свойства оружия
Скопируем файл из папки:
gamedata\config\ak74.ltx
Назовем его ak101.ltx.

Отредактируем свойства по своему усмотрению (но лучше - в соответствии с достоверной информацией о характеристиках оружия, т.к. АК101 - всё-таки оружие реально существующее). Редактирование конфигов оружия подробно описано в отдельном уроке. В данном случае конфиг был составлен таким образом:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
[wpn_ak101]:identity_immunities
GroupControlSection    = spawn_group
discovery_dependency =
$spawn              = "weapons\ak-101" ; name and section in level editor
$npc        = on       
$prefetch         = 8
scheduled        = off               ;[] option for ALife Simulator
cform                = skeleton
class                = WP_AK74    ; class of the weapon that corresponding to CPP class
min_radius          = 30        ; [] for AI
max_radius          = 100        ; [] for AI
description        = enc_weapons1_wpn-ak101

ef_main_weapon_type    = 2
ef_weapon_type    = 6

;-----------------------------------------------------------------------------------
holder_range_modifier = 1.0           ; во сколько раз увеличивается eye_range
holder_fov_modifier    = 0.7              ; во сколько раз увеличивается eye_fov
;-----------------------------------------------------------------------------------

cost        = 2;4000       
weapon_class    = assault_rifle   

ammo_limit        = 210       
ammo_elapsed    = 30       

ammo_mag_size    = 30       
fire_modes        = 1, -1

ammo_class        = ammo_5.56x45_ss190, ammo_5.56x45_ap  
grenade_class    = ammo_vog-25, ammo_vog-25p   
launch_speed    = 0

hand_dependence    = 1               
single_handed    = 0

slot         = 2               
animation_slot    = 2               
inv_name         = wpn-ak101               
inv_name_short    = wpn-ak101
inv_weight    = 3.3               

inv_grid_width    = 5
inv_grid_height    = 2    
inv_grid_x        = 11 
inv_grid_y        = 29

kill_msg_x    = 0
kill_msg_y    = 28
kill_msg_width    = 84
kill_msg_height    = 28

;-----------------------------------------------------------------------------------
;params of weapon recoil

fire_dispersion_base    = 0.15;0.2   
control_inertion_factor    = 1.1f;1.25f

;отдача
cam_relax_speed             =6;5;3.5; 0.15   
cam_dispersion              = 0.1;0.15   
cam_dispersion_inc    = 0.2;0.3   
cam_dispertion_frac    = 0.8;0.9   
cam_max_angle        = 10.0    
cam_max_angle_horz    = 20.0   
cam_step_angle_horz    = 1.1;1   

fire_dispersion_condition_factor = 5.7;5    
misfire_probability     = 0.0055;0.003
misfire_condition_k    = 0.06;0.05
condition_shot_dec     = 0.00035;0.0001
;-----------------------------------------------------------------------------------

fire_point                 =  0,0.216,0.638   
fire_point2                =  0,0.216,0.730   

flame_particles        = weapons\generic_weapon05
smoke_particles        = weapons\generic_shoot_00
grenade_flame_particles    = weapons\generic_weapon01

shell_point         = 0,0.216,0.174       
shell_particles     = weapons\generic_shells

PDM_disp_base         = 1.0
PDM_disp_vel_factor     = 1.3
PDM_disp_accel_factor     = 1.3
PDM_crouch         = 1.0
PDM_crouch_no_acc     = 1.0

; ttc
hit_power                = 0.36, 0.4, 0.43, 0.46   
hit_impulse         = 140   
hit_type         = fire_wound
fire_distance            = 1700   
bullet_speed        = 1000   
rpm                      = 750   

use_aim_bullet        = true   
time_to_aim        = 1.0

;params when silencer is attached
;similar to corresponding params without prefix silencer_

silencer_hit_power        = 0.38
silencer_hit_impulse = 120
silencer_fire_distance    = 250
silencer_bullet_speed = 600

hud                      = wpn_ak101_hud       

position                  = -0.026,-0.172,0   
orientation              = 0,0,0           

;--STRAP PARAMETERS-----------------------------------------------------------------
strap_position             = -0.16,-0.40,0.15   
strap_orientation          = -10,-5,10       
strap_bone0        = bip01_spine2
strap_bone1        = bip01_spine1

visual                     = weapons\ak-101\wpn_ak101   

light_color        = 0.6,0.5,0.3       
light_range        = 5           
light_var_color        = 0.05           
light_var_range        = 0.5
light_time         = 0.2           

ph_mass            = 5           

;addons
scope_status        = 2           
silencer_status        = 2           
grenade_launcher_status    = 0;2           

zoom_enabled        = true           
scope_zoom_factor     = 50           

scope_name         = wpn_addon_scope   
scope_x         = 42           
scope_y         = 3
silencer_name          = wpn_addon_silencer   
silencer_x         = 218           
silencer_y         = 13       
grenade_launcher_name     = wpn_addon_grenade_launcher
grenade_launcher_x     = 116           
grenade_launcher_y     = 23

;sounds (name of the sound, volume (0.0 - 1.0), delay (sec))
snd_draw        = weapons\ak74_draw
snd_holster        = weapons\generic_holster
snd_shoot        = weapons\ak74_shot_0
snd_shoot1        = weapons\ak74_shot_1
snd_shoot2        = weapons\ak74_shot_2
snd_shoot3        = weapons\ak74_shot_3   
snd_empty        = weapons\gen_empty, 0.5
snd_reload        = weapons\ak74_reload, 0.7, 0.35
snd_shoot_grenade    = weapons\gen_grenshoot
snd_reload_grenade    = weapons\gen_grenload, 1.0, 0.8
snd_switch        = weapons\groza_switch, 1.0, 0.5

;params when silencer is attached
;similar to corresponding params without prefix silencer_

;silencer_flame_particles = weapons\generic_weapon01
silencer_smoke_particles = weapons\generic_shoot_00

snd_silncer_shot    = weapons\w_ak74_shot1

silencer_light_color    = 0.6,0.5,0.3
silencer_light_range    = 0.01
silencer_light_var_color = 0.05
silencer_light_var_range = 0.5
silencer_light_time     = 0.2

;-----------------------------------------------------------------------------
;-- HUD DESCRIPTION
;-----------------------------------------------------------------------------

[wpn_ak101_hud]
allow_inertion        = true

;similar to corresponding params in weapon section but for 1st person view

shell_point        = -0.065000,0.000000,-0.045000
shell_dir          = 0.0, 1.0, 0.0

fire_point                = 0.09,0.020,-0.06
fire_point2              = 0.30, 0.00, 0.05
fire_bone                = wpn_body

orientation              = 0, 0, 0   
position                = 0, 0, 0.05
visual                  = weapons\ak-101\wpn_ak101_hud

grenade_bone            = wpn_grenade

; animation names

anim_idle        = idle
anim_idle_aim        = idle_aim
anim_reload        = reload
anim_draw        = draw_wo_gl
anim_holster        = holster_wo_gl
anim_shoot        = shoot
   
; animation names
; attached grenade launcher [GRENADE fire mode]
anim_idle_g        = idle_grenade
anim_idle_g_aim        = idle_g_aim
anim_reload_g        = reload_grenade
anim_shoot_g        = shoot_grenade
anim_switch_grenade_on    = switch_grenade
anim_switch_grenade_off    = switch_grenade_off
anim_draw_g        = draw_grenade_mode
anim_holster_g        = holster_grenade_mode

; attached grenade launcher [NORMAL fire mode]
anim_idle_gl        = idle_w_gl
anim_idle_gl_aim    = idle_w_gl_aim
anim_reload_gl        = reload_w_gl
anim_draw_gl        = draw_w_gl
anim_holster_gl        = holster_w_gl
anim_shoot_gl        = shoot_w_gl
anim_idle_sprint    = idle_sprint

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;HUD offset in zoom mode (to all)
;(use CONSOLE: hud_adjust_mode 0,1,2, then keys WSADQE and P to show current value in console)

zoom_offset    = -0.112400,0.016800,-0.115000
zoom_rotate_x    = 0.000200
zoom_rotate_y    = 0.017500

zoom_hide_crosshair = true           

; same as above, but for attached grenade launcher for
; in NORMAL shoot mode

grenade_normal_zoom_offset    = -0.112500,0.014000,0.000000
grenade_normal_zoom_rotate_x    = -0.000900
grenade_normal_zoom_rotate_y    = 0.017200

; same as above, but for attached grenade launcher for
; in GRENADE mode

grenade_zoom_offset    = -0.039600,-0.433100,0.000000
grenade_zoom_rotate_x    = -0.538700
grenade_zoom_rotate_y    = -0.033800
Регистрация
Итак, с характеристиками разобрались. Теперь зарегистрируем оружие в файле weapons.ltx. Для этого пропишем в него строку следующего вида:
#include "w_ak101.ltx"
Также, необходимо прописать модели, используемые для отображения оружия, в prefetch.ltx:
[...]
weapons\abakan\wpn_abakan
weapons\abakan\wpn_abakan_hud
weapons\ak-101\wpn_ak101
weapons\ak-101\wpn_ak101_hud
weapons\ak74\wpn_ak74
weapons\ak74\wpn_ak74_hud
[...]
Так же не забудте в файле mp_ranks.ltx прописать после available_items (которое внизу) прописать название своего оружия. Это предотвратит вылет при убийстве ГГ.
Добавление в игру
Осталось добавить оружие в игру.
Выдайте его некоторым NPC, расширьте ассортимент торговцев.
А вот как оно будет выглядеть в игре:

0

19

Создание новой группировки
--------------------------------------------------
Новая группировка
Сегодня мы создадим новую группировку. Назовем её, скажем, "Ветер". Не суть важно.
Практика
Базовый уровень
1. Для начала в game_relations.ltx и в таблицу отношений группировок в конце и в заголовке добавляем название своей группировки и коэффициенты отношений к ней у других группировок. Также, не забываем прописать её собственное отношение к другим группировкам:
[communities_relations]
;|actor  |act_dol|act_fre|stalker|monolit|militar|killer |ecolog |dolg   |freedom|bandit |zombied|strange|trader|arena_enemy|wind|
;=================================================================================================================================
actor = 0,    0,    0,    0,  -5000,  -5000,  -5000,      0,    0,    0,  -5000,  -5000,    0,   0,  -5000, 0
actor_dolg = 0,    0,    0,      0,  -5000,   -500,  -5000,   5000,    600,  -5000,  -5000,  -5000,    0,   0,  -5000
actor_freedom = 0,    0,    0,    0,  -5000,  -5000,  -5000,  -1500,  -5000,   5000,    0,  -5000,    0, 0,  -5000, 0

stalker = 0,    0,    0,    0,  -5000,  -5000,  -5000,      0,    0,    0,  -5000,  -5000,    0,   0,  -5000, 0
monolith = -5000,  -5000,  -5000,  -5000,   5000,  -5000,  -5000,  -5000,  -5000,  -5000,   5000,   5000,  -5000, 0,  -5000, 0
military = -5000,  -5000,  -5000,  -5000,  -5000,   5000,  -5000,      0,  -5000,  -5000,  -5000,  -5000,    0, 0,  -5000, 0
killer = -5000,  -5000,      0,  -5000,  -5000,  -5000,   5000,  -5000,  -5000,  -5000,    0,  -5000,  -5000,   0,  -5000, 0
ecolog = 0, 600,  -5000,      0,  -5000,   1000,  -5000,   5000,    500,  -5000,   -500,  -5000,    0,   0,      0, 0
dolg = 0,    600,  -5000,      0,  -5000,   -500,  -5000,   5000,   5000,  -5000,  -5000,  -5000,    0,   0,      0, 0
freedom = 0,  -5000, 600,    0,  -5000,  -5000,  -5000,  -1500,  -5000,   5000,    0,  -5000,    0,   0,      0, 0
bandit = -5000,  -5000,    0,  -5000,  -5000,   -500,      0,  -5000,  -5000,    0,    0,  -5000,  -5000,   0,  -5000, 0
zombied = -5000,  -5000,  -5000,  -5000,   5000,  -5000,  -5000,  -5000,  -5000,  -5000,  -5000,   5000,  -5000, 0,  -5000, 0
stranger = 0,    0,    0,      0,  -5000,  -5000,  -5000,      0,    0,    0,   -500,  -5000,    0,   0,      0, 0
trader = 0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,      0,   0,      0
arena_enemy = -5000,  -5000,  -5000,  -5000,  -5000,  -5000,      0,      0,      0,  -5000,  -5000,      0,      0,   0,     0, 0

wind = 0,    0,    0,    0,  -5000,  -5000,  -5000,      0,    0,    0,  -5000,  -5000,    0,   0,  -5000, 0
Также, изменим эту строку, добавив туда имя и номер группировки:
;названия группировок
communities = actor, 0, actor_dolg, 1, actor_freedom, 2, stalker, 5, monolith, 6, military, 7, killer, 8, ecolog, 9, dolg, 10,
freedom, 11, bandit, 12, zombied, 13, stranger, 14, trader, 15, arena_enemy, 16, wind, 18,
Отсчет идет построчно начиная сверху. Хотя есть небольшой нюанс. У первых трех строк - нумерация начинается с нуля, с остальных группировок она идет как надо. Для wind выставили 18, так как мы эту группировку отделили от других.
Далее, в разделе [communities_sympathy] в конце добавляем свою группировку и коэффициент "впечатлительности" - чем он меньше, тем меньше отношение группировки будет меняться к вам в целом:
[communities_sympathy]
actor    =    0.0
actor_dolg =    0.0
actor_freedom =    0.0
stalker    =    0.0
monolith =    0.0
military =    0.0
killer    =    0.0
ecolog    =    0.0
dolg    =    0.1
freedom    =    0.1
bandit    =    0.0
zombied    =    0.0
trader    =    0.0
stranger =    0.0
arena_enemy =     0.0
wind     =     0.0
2. После этого в файле death_manager.script ищем строку local community_list и в скобках добавляем название своей группировки:
function init_drop_settings()
local community_list = { "stalker", "dolg", "freedom", "bandit", "military", "zombied", "ecolog", "killer", "monolith",
"arena_enemy", "actor_dolg", "wind" }
3. В файле death_items_by_communities.ltx пишем [x]:stalker (вместо x - название вашей группировки):
[...]
af_dummy_spring    = 0
af_fuzz_kolobok    = 0

;Еда
vodka        = 0

[arena_enemy]
[actor_dolg]

[wind]: stalker
bread        = 0
kolbasa        = 0
vodka        = 0
energy_drink    = 0.3
4. Если предусматривается респавн бойцов новой группировки, в se_respawn.script прописываем в local simMaxCount = { после строчек с зомбированными сталкерами строку:
wind_novice = 20, wind_regular = 20, wind_veteran = 20, wind_master = 6,
5. Чтобы при убийстве непися новой группировки игра не вылетала в xr_statistic.script,
после строки:
zombied_novice = 1, zombied_experienced = 2, zombied_veteran = 3, zombied_master = 4,
пишем
dark_stalker_novice = 1, dark_stalker_experienced = 2, dark_stalker_veteran = 3, dark_stalker_master = 4,

6. Ну а в character_desk_x.xml выбираем любого NPC (или группу) и меняем группировку на свою:
<!---esc_wolf--->
<specific_character id="esc_wolf" team_default = "1">
    <name>esc_wolf_name</name>
    <icon>ui_npc_u_stalker_neytral_balon_1</icon>
    <bio>esc_wolf_bio</bio>

    <class>esc_wolf</class>
    <community>wind</community>
    [...]
7. Чтобы у персонажа в графе "Группировка" отображалось не "wind", а "Ветер", зарегистрируем соответствующую строку в файле string_table_general.xml:
<?xml version="1.0" encoding="windows-1251" ?>
<string_table>
<string id="wind">
    <text>Ветер</text>
</string>
<string id="actor">
    <text>Одиночка</text>
</string>
[...]
8. Существует возможность создать для нашей новой группировки места, где они будут ходить (*_terrain брать из m_stalker.ltx):
То есть, к примеру, существует секция:
[stalker_terrain]
255,000,255,255
008,001,255,255 ;Разрешено ходить по опасным местам на баре
012,001,255,255 ;Разрешено ходить по опасным местам на Милитари
Тогда можно создать новую, по аналогии:
[wind_terrain]
255,000,255,255
008,001,255,255 ;Разрешено ходить по опасным местам на баре
012,001,255,255 ;Разрешено ходить по опасным местам на Милитари
010,001,255,255 ;Разрешено ходить по опасным местам на янтаре

Здесь, очевидно, указаны координаты самого уровня. Для каждого уровня существует своя начальная координата.
Продвинутый уровень
Такой метод достаточно примитивен. Это не полноценная группировка. Нам нужны соответствующие диалоги, возможность получения квестов и вступления в группировку, уникальные NPC.
Квесты
Добавим квесты, которые нужно выполнить для группировки. Пока - простые поручения распространенных типов.
Во-первых, пропишите в список диалогов персонажа следующие строки:
    <actor_dialog>[что-нибудь]_dialog</actor_dialog>
    <actor_dialog>[что-нибудь]_reward</actor_dialog>
Примеры названий: tm_trader_dialog, tm_wolf_dialog...
Внимание! Метод не проверен.
Этим мы добавили ему ветку диалога "Есть работа?", а также ветку для награды за квест/отказа от него. Теперь зарегистрируем в task_manager.ltx набор новых заданий.
[list]

[...]

;--------Wind------------------------
;----------Kill Stalker----
wind_kill_stalker
;----------Find Item----
wind_find_item

[...]

;tasks for Wind

[wind_find_item]
type = find_item
community = actor
text = [ссылка на текст с рассказом заказчика о задании]
description = [ссылка на текст с описанием задания]
parent = [имя NPC-заказчика]
target = scientific_outfit
reward_money = 5000
reward_reputation = +5
reward_rank = 4
reward_item = wpn_sig_m1
time = 86400

[wind_kill_stalker]
type = kill_stalker
community = actor
text = [ссылка на текст с рассказом заказчика о задании]
description = [ссылка на текст с описанием задания]
parent = [имя NPC-заказчика]
target = sim_stalker_master_master
reward_money = 4000
reward_reputation = +5
reward_rank = 9
reward_item = ammo_5.56x45_ap, ammo_5.56x45_ap, ammo_5.56x45_ap
time = 86400
Не забудьте прописать описания заданий в текстовые массивы. Подробнее о редактировании task_manager.ltx читайте в уроке, посвященном однотипным квестам.
Да, и зарегистрируйте сами ветки диалогов в файле dialogs.xml. Вот пример того, как это сделано для заданий "Долга":
    <dialog id="tm_dolg_dialog" priority="-1">
    <init_func>task_manager.init_dolg_task_dialog</init_func>
    </dialog>
    <dialog id="tm_dolg_reward" priority="0">
    <init_func>task_manager.init_dolg_reward_dialog</init_func>
    <precondition>task_manager.has_active_vendor_task</precondition>
    </dialog>
Соответственно, пройдем туда, куда указывает строка task_manager.init_dolg_task_dialog - в task_manager.script:
function init_dolg_task_dialog(dlg)
get_random_task():init_task_dialog(dlg, "dolg")
По аналогии делаем и с нашим "Ветром".
Вступление в группировку
Реализуем возможность вступления в группировку.
Прописываем в dialogs.script такие action'ы:
-----------------------------------------------------------------------------------
-- Community
-----------------------------------------------------------------------------------

[...]

function actor_set_wind (actor, npc)
printf ("ACTOR NOW IN WIND COMMUNITY"
if db.actor then
db.actor:set_character_community ("actor_wind", 0, 0)
end
return true
end
После чего создадим диалог, и сделаем в нем фразу с action'ом вида <action>actor_set_wind</action>. Советую изучить урок, посвященный диалогам.
Новые NPC

0

20

Создание новых предметов
-----------------------------------------------------------
В этой статье я расскажу как создавать новые предметы:
Для начал находим файл items.ltx, находящийся в папке config/misc/, и копируем какой-нибудь предмет, я, например, взял:
[bread]:identity_immunities
GroupControlSection = spawn_group
discovery_dependency =
$spawn = "food and drugs\bread"
;$prefetch = 32
class = II_FOOD
cform = skeleton
visual = weapons\bred\bred.ogf
description = enc_equipment_food_bread1

inv_name = Bread
inv_name_short = Bread
inv_weight = 0.3 ;0.2

inv_grid_width = 1
inv_grid_height = 1
inv_grid_x = 11
inv_grid_y = 9
cost = 20

attach_angle_offset = -0.287979, 1.560923, 1.544060
attach_position_offset = 0.096910, -0.013594, 0.107925
attach_bone_name = bip01_r_hand
auto_attach = false

// should be deleted after update
bone_name = bip01_r_hand
position_offset = 0.0,0.0,0.0
angle_offset = 1.570790,1.570790,3.92699

; eatable item
eat_health = 0.05
eat_satiety = 0.2
eat_power = 0
eat_radiation = 0
wounds_heal_perc = 0
eat_portions_num = -1

; food item
slot = 4
animation_slot = 4

;hud item
hud = wpn_vodka_hud
Вставляем его копию в конец, меняем название:
[bread]
На:
[test]
А также:
inv_name = Bread
inv_name_short = Bread
На:
inv_name = test
inv_name_short = test
И description = enc_equipment_food_bread1 на description = enc_equipment_food_bread1_test
И, также, "по желанию":
eat_health = 0.05 eat_satiety = 0.2 eat_power = 0 eat_radiation = 0 wounds_heal_perc = 0 eat_portions_num = -1
Всё, в item.ltx работа закончена, теперь переходим к редактированию описания, открываем string_table_enc_equipment "Блокнотом". Что мы там видим: все описания и названия прописаны по тегам:
<string id="название из inv_name"> <text>Название в игре</text> </string>
И:
<string id="описание из description"> <text>Описание в игре</text> </string>
Пишем:
<string id="test"> <text>Тестовый предмет</text> </string>
И:
<string id="enc_equipment_food_bread1_test">
<text>Тестовый предмет, разработанный в сверхсекретных лабораториях Зоны :)</text>
</string>
Сохраняем... Все! Основная работа завершена! Теперь добавим предмет торговцам, например, Сидоровичу.
Открываем trader_trader из папки config/misc (работа с ним подробно описана в этой статье), прописываем:
test = 0.3, 0.5
В секции:
[trader_generic_buy]
И далее в:
[supplies_start]
test = 10, 1
В [supplies_after_fabric]
test = 10, 1
В [trader_start_sell]
И в:
[trader_after_fabric_sell]
test = 1. 3
Сохраняем, запускаем игру, торгуем с Сидоровичем и видим у него два вида хлеба: один из них - наш :)

0

21

Создание "перемещающихся" аномалий
----------------------------------------------------------
Небольшое вступление
"Перемещающиеся" аномалии с самого момента релиза очень заинтересовали коммьюнити. Выдвигалось множество предположений о принципе их работы. На самом деле, всё сделано достаточно незамысловато. В свойствах аномалий прописываются параметры, в которых указывается в какой промежуток времени они будут активны. Таким образом создаются целые цепочки из аномалий, параметры которых взаимосвязаны. В оригинале всего две таких цепочки: в туннеле на Кордоне и в подземелье Агропрома.
Описание параметров
Всего используются три параметра:
enabled_time       - через какое время после начала отсчёта аномалия включится.
disabled_time      - через какое время после начала отсчёта аномалия отключится.
start_time_shift   - на сколько сдвинется момент начала отсчёта времени. (Использовать необязательно)
После отключения аномалии процесс повторяется. Следующее включение произойдёт через промежуток времени прописанный в disable_time.
В Level Editor'е эти параметры находятся в свойствах аномалии. При использовании ACDC параметры прописываются "в теле" нужной аномалии. Значения указываются в секундах.
Небольшая наглядность
Создадим "перемещающуюся" аномалию, которая будет менять своё местоположение каждые четыре секунды. Для этого создадим несколько аномалий (для примера взято 3 штуки).
Для первой аномалии пропишем:
enabled_time = 4
disabled_time = 8
start_time_shift = 8
Для второй:
enabled_time = 4
disabled_time = 8
start_time_shift = 4
Для третьей:
enabled_time = 4
disabled_time = 8
Таким образом, первой будет активироваться третья аномалия, работать четыре секунды и деактивироваться. Сразу после неё будет активироваться вторая аномалия, работать 4 секунды, ну и так далее... Вот так и создаётся ощущение того, что аномалия перемещается. Конечно, это только один из примеров использования этих параметров. Обладая должным желанием и терпением, можно делать целые аномальные поля, где каждая аномалия будет вести себя независимо от других, но вместе они будут образовывать смертельно опасное место.

0

22

Теория модостроения
-----------------------------------------
О модифицировании игры
Выход долгожданной игры ознаменовался скандалами и возмущением общественности большим количеством убранного из игры.
На фоне вырезанного контента и огромного количества несоответствий игры обещаниям разработчиков стали формироваться моддерские команды. К счастью, разработчики оставили возможность простого модифицирования игры. Благодаря распаковщику игровых архивов мы получили полный доступ к ресурсам игры. Сверх того, разработчики оставили в финальном билде 2947 (и билдах после него) высший приоритет распакованной папки gamedata.
Итак, что же мы имеем?
Звуки
Звуки в игре записаны в формате ogg. Хочу заметить, что OGG Vorbis является признанным игровым форматом звука.
Проблем со звуком вообщем-то не возникает. Если Вы пользуетесь редактором звука, который не поддерживает OGG Vorbis, для Вас существует множество платных и бесплатных конвертеров.
Видео в игре также в формат Vorbis, расширения видео файлов - OGM. Для просмотра видео рекомендую Media Player Classic и CCCP Codec Pack.
Текстуры
Текстуры в игре имеют формат DDS (Direct Draw Surface). Для их редактирования рекомендую Adobe Photoshop CS 8.0 и NVidia Developer's Photoshop DDS Plugins.
При этом учтите следующее:
· Вы можете использовать сторонние конвертеры. К таким относится Lister Total Commander, который умеет сохранять и просматривать DDS текстуры в других форматах. Это расширенная сборка Total Commander'a (платный файловый менеджер Кристиана Гислера) версии 6.55. Приобрести его можно здесь.
· Также, Вы можете воспользоваться специальными DDS конвертером. Но при конвертации может исчезнуть альфа-канал текстуры, он очень важен для игры. Поэтому настоятельно рекомендую использовать Photoshop CS 8.0 с плагинами.
Внимание! После работы в Photoshop над тестурами, при сохранении не забудьте отметить пункт "Alpha Channels" и в открывшемся окне (после нажатия на кнопку "Сохранить"), выберите режим "DXT5 ARGB 8 bpp | interpolated alpha".
Также, в папке с игрой есть дополнительные текстуры с приписанным в конце имени файла словом "bump". Это бамп-карты текстур, используемые для придания модели некоторой объемности, которую ещё называют "псевдорельефностью".
Бамп-карты текстур используются только при игре на втором рендере (динамическое освещение, то есть DirectX9-рендер.
Модели
Следующий немаловажный компонент игры - OGF модели.
Модели расположены в папке meshes.
Они содержат в себе информацию о материале, анимации и саму модель предмета. Изменить текстуру модели реально при помощи WinHEX - путь к текстуре находится в первых строчках файла.
Для просмотра моделей незаменимой утилитой является OGF Viewer от batya. На данный момент возможен только просмотр и конвертирование моделей в формат obj.
При использовании OGF Viewer необходимо задать путь к текстурам в конфигурационном файле, который лежит в папке с программой.
Уровни
Следующим компонентом игры являются игровые уровни. Уровни можно разделить на мультиплеерные и сингловые.
MP-уровни отличаются от уровней одиночной игры отсутствием некоторых компонентов и несколько иной структурой/набором файлов. Например, на мультиплеерных уровнях отсутствует координатная сетка для A-Life.
Перед релизом бета-версии SDK (Software Development Kit от GSC Game World) я несколько недель тестировал его и сделал несколько печальных выводов.
Во-первых, при помощи MP-SDK невозможно не только редактировать, но и даже просматривать уже откомпилированные уровни. Дело в том, что MP-SDK требует исходников уровней. К тому же, пора прекращать мечтать о SDK и выкрикивать: "Дайте мне СДК я вам новое оружие сделаю и движок поменяю!!!". MP-SDK - всего лишь маппер для мультиплеера. Возможно, будет маппер и для сингловой версии игры, но исходников уровней от GSC Game World даже и ждать не стоит.
Однако, не стоит забывать, что в сеть была выложена лишь бета-версия этого пакета. Возможно, к появлению релиза добавятся новые функции и инструменты.
Уровни из сингловой версии игры можно портировать под мультиплеер. Алгоритм действий:
· Скопировать содержание папки уровня в новую папку с именем типа mp_yantar.
· Удалить файлы level.game, level.ai, level.som. Скопировать level.game из любой мультиплеерной карты и вставить в переделываемую карту.
· Открыть конфигурационный файл config\mp\maplist.ltx и добавить карту в список.
Скрипты
В игре широко используются скрипты. Некоторые из них - тестовые и являют собой оставленный разработчиками мусор, но никогда нельзя точно знать, где используется скрипт.
В скриптах используется язык Lua. Язык не очень сложный, с помощью него можно многое делать, в том числе и спаунить (от англ. "spawn" - размещать на карте) объекты.
К тому же, скрипты можно вызывать в spawn-файле, о нём подробнее будет рассказано ниже.
Конфиги
Другая, немаловажная часть игры - конфигурационные файлы. Они открываются обычным "Блокнотом" и представляют собой набор параметров и их значений.
В игре существуют конфигурационные файлы существ, мультиплеера, погоды, оружия, объектов, геймплея, моделей, конфигурационные скрипты и конфигурация интерфейса.
Также существует множество других конфигурационных файлов.
О некоторых из них подробнее. Конфигурации существ - одним из самых важных конфигурационных файлов является actor.ltx. В нём заданы параметры актора - т.е. главного героя игры.
На его примере рассмотрим структуру конфигурационного файла.
[actor] - пример entity. Конфигурацию актора вызывают при помощи названия entity. В данном случае - actor. В других конфигурационных файлах мы можем найти пример ссылки на entity. Например: [burer_arena]:m_burer_e.
В данном случае существо "burer_arena" ссылается на существо "m_burer_e" и является его прототипом. Также могут быть и ссылки на entity, обозначающей набор параметров. Например: damage = m_burer_damage.
Комментарии в ltx файлах начинаются с символа ";". Все, что расположено за этим знаком, игрой не учитывается.
Также очень интересна система так называемых инклудов (включений).
Инклуд обозначается строкой "#include "имя_файла.ltx""
Инклуды означают, что в файл, в котором написана вышеуказанная строка, вставляется содержание файла, указанного как аргумент к функции #include.
Получается так, что конфигурационные файлы монстров (к примеру) объединяются в файле monsters.ltx, файлы сталкеров - в stalkers.ltx. А файлы monsters.ltx, stalkers.ltx и все остальные файлы объединяются в файле system.ltx, в котором прописано около 20 инклудов. Таким образом, всё содержание ltx-файлов объединено в system.ltx.
Помните - когда создаёте новый конфигурационный файл - не забудьте вставить его методом инклуда в общий конфигурационный список в system.ltx.
Спавн-файл
Последнее, о чём пойдёт речь - папка spawns.
В ней расположен файл all.spawn. В этом файле обозначены почти все динамические объекты, которые содержатся в игровой Зоне. Это как монстры и сталкеры, так и приёмник "Горизонт" на столе у торговца, и даже ящик рядом с блокпостом.
Формат спаун-файла долго разбирался специалистами и благодаря товарищу Zeed'у разобран. И им же была написана специальная программа xrSpawner для спауна динамических объектов.
Дополнительно
Кроме файлов спауна в директории gamedata также присутствует папка с шейдерами, папка с анимациями камеры, папка с некоторыми файлами A-life и несколько файлов в формате xr.
В файле gamemtl.xr лежат настройки материалов, текстур и hit_fx эффектов. В режиме HEX файл более или менее читаем.
И последнее. Не пробуйте искать где указаны классы типа AI_CROW. Все классы существ находятся в xrGame.dll и попытки извлечь их или изменить бессмыслены.

0

23

Формат файлов постпроцессинга (ppe)
-------------------------------------------------------------
Вступление
Представляю на суд общественности результаты моих изысканий по формату файлов постпроцессинга (.ppe)
Нераскрытыми для меня осталось 6 переменных (переменные, которые я для себя назвал free, обязательно идут перед каждой триадой цепочек, управляющих цветом и 3 коэффициента, идут в каждом правиле после байта функции), но простенькие ppe-файлы можно делать и без них.
Вообще, оказалось, что возможности ppe были сильно мною переоценены (например тепловизор сделать с их помощью если и можно, то крайне проблематично). Основной недостаток - ppe можно применить только ко всему экрану, на отдельный обьект это не предусмотрено движком (даже стелс-режим кровососа реализуется подменой модели). Так что могу предложить только слегка улучшеный прибор ночного зрения.
Получилось так себе, просто убрал шумы, добавил яркости/контрастности, но зато теперь со включенным nv днем не побегаешь - засветка почти как на настоящем (как в кино показывают) и туман гораздо сильнее мешает, клубы тумана почти непрозрачны.
По поводу компилятора/декомпилятора, пришел к выводу, что фильтр постпроцесса изделие штучное, смысла в отдельных утилитах нет - я все анализировал, клепал, менял только с помощью блокнота и шестнадцатиричного редактора (кстати, выяснил, что при смене файла постпроцесса необязательно перезапускать сталкера и даже релоад делать ни к чему - изменения подхватываются при следующем выключении постпроцесса в данном случае nv).
При анализе ppe сильно помог тот факт, что постпроцесс существует в игре в текстовом и компилированом виде (кому интересно, копайте \gamedata\script\postprocess.script - полный разбор текстовых файлов написан обычным скриптом, там же, в самом конце функция main загружает погоду и файл постпроцессинга, сами файлы лежат \gamedata\config\scripts например proba.ltx). Компилированные ppe лежат в anims.

Практика
Итак, ppe-файл - это набор правил, как должен изменяться тот или иной параметр изображения во времени, всего этих параметров - 16 (названия взяты из текстовых версий, чтобы путаницы не было). В отличие от текстовой версии, цепочки должны идти только в этом порядке и их всегда должно быть только 16 (если игра вывалилась с сообщением в логах noise.grain cannot be zero, значит вы что-то пропустили).
Выбраная цветовая компонента умножается на коэффициент, то при параметре равным 1 чистый белый цвет останется белым, а чистый черный - черным, остальные преобретут компонентный оттенок.
· free1 - об этой переменной чуть ниже
· color_add_red
· color_add_green
· color_add_blue
Указанное значение принимается как база для данного цвета, то есть, если у данного пикселя значение цвета меньше указанного, то оно принимается как указанное, а если больше, то остается прежним. Следует заметить, что это единственный набор переменных, задирать значения в которых выше 0.5 не имеет смысла, 0.5 прибавляется где-то в дебрях движка.
· free2
· color_base_red
· color_base_green
· color_base_blue
Эта триада правил отвечает за вес цвета в сером/яркостном представлении и в обычном цветном режиме результат не виден. Но при увеличении правила gray становится ясно, что при например color_gray_red = -1 чисто красные компоненты становятся черными, 0 = остаются без изменений, 1 - чисто белыми:
· free3
· color_gray_red
· color_gray_green
· color_gray_blue
Переменная управляет величиной обратной насыщенности, то есть, чем больше gray (максимум +1) тем меньше насыщенность изображения:
· gray
Размытие изображения, при больших значениях (пробовал 25) начинаются косяки, портится нижняя часть, если долго стоять на месте:
· blur
Раздвоение изображения по горизонтали и вертикали соответственно. Значение указывается относительно экрана, то есть при 1 копии обьекта, первоначально находящегося в центре окажутся точно по краям:
· duality_h
· duality_v
· noise_intensity - интенсивность шума
· noise_granularity - размер зерна шума
· noise_fps - сколько раз в секунду шум должен пересчитываться
Файл всегда начинается с 01 00 00 00 - скорее всего это синатура, по которой движок определяет содержимое(кстати, у файлов anm, которые содержать анимацию камеры и похоже имеют ту же логику строения, что и ppe сигнатурой является 00 11 00 00 ).
Затем идет 4 байта неопределенной переменной, которую я для себя назвал free. Всего их 3. Эти переменные стоят только перед триадами, отвечающими за изменения цветов, обычно равны 7C 00 00 00, но есть небольшие вариации. Визуально определить, что меняется при изменении этой переменной я не смог, если кто совершит этот подвиг - вечная слава :)
Затем начинаются цепочки в перечисленном выше порядке. Цепочка начинается с 01 01 ХХ 00, где ХХ - число правил в данной цепочке. Если указано 01 01 00 00 (то есть цепочка с 0 правил, то данная цепочка в постпроцессинге не участвует и сразу после нее должна начинаться следующая цепочка). Основная ошибка, которую можно допустить - несоответствие реального числа правил с указаным в заголовке цепочки. Контроль, контроль, и еще раз контроль.
Каждая цепочка состоит из правил изменения переменной. Исходя из скрипта разбора текстовых версий можно предположить, что правил в цепочке не должно быть больше 16 (хотя возможно это только для текстовых).Совершенно необязательно, что этих правил в разных цепочках будет одинаковое количество или даже длиться они будут одинаковое время.
Правило содержит в себе всегда ровно 23 байта. Примерное описание -
9A 99 99 3E 00 00 A0 40 00 00 80 00 80 00 80 00 80 00 80 00 80 00 80
----------- ----------- -- ----- ----- ----- -----------------------
значение      время    ф    k1    k2    k3                                   
· значение - 4-байтная float переменная, обычно меняется от -1 до +1
· время - в секундах 4-байтная float переменная
· ф - функция, во всех ppe равна 00, но попробовал менять(не должна быть 04 - игра вылетает). 00,03 - синус, 01,05 - косинус, 02 - линейная, остальные значения игнорируются и правило перестает работать вообще.
· k1, k2, k3 - коэффициенты для функций вот с ними почти не разбирался, на линейную фунуцию изменений не выявил, на синус/косинус влияют очень сильно, но на поиск закономерности не хватило времени, по умолчанию равны 00 80 00 80 00 80
· остаток строки во всех файлах 00 80 00 80 00 80 00 80 - изменение визуально ничего не меняет, возможно зарезервировано для следующих версий.
Вот и все. Поле для работы как видите еще есть - коэффициенты k[1,2,3] и переменные free[1,2,3] - предлагаю общественности устроить мозговой штурм на них.
Напоследок мой файл ночного зрения с комментариями (для использования комменты удалить, шестнадцатиричный код загнать в WinHex и сохранить как anims\x.ppe(имя любое), и не забыть поправить config\misc\postprocess.ltx в нужной секции).
01 00 00 00     // сигнатура

// Цвета выкручиваем на максимум
7C 00 00 00     // free1
01 01 02 00     // color_add_red
00 00 80 3F 00 00 00 00 00 00 80 00 80 00 80 00 80 00 80 00 80 00 80
00 00 80 3F 00 00 00 41 00 00 80 00 80 00 80 00 80 00 80 00 80 00 80
01 01 02 00     // color_add_green
00 00 80 3F 00 00 00 00 00 00 80 00 80 00 80 00 80 00 80 00 80 00 80
00 00 80 3F 00 00 00 41 00 00 80 00 80 00 80 00 80 00 80 00 80 00 80
01 01 02 00     // color_add_blue
00 00 80 3F 00 00 00 00 00 00 80 00 80 00 80 00 80 00 80 00 80 00 80
00 00 80 3F 00 00 00 41 00 00 80 00 80 00 80 00 80 00 80 00 80 00 80

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

6C 10 00 00      // free2
01 01 02 00     // color_base_red
CD CC CC 3D 00 00 00 00 00 00 80 00 80 00 80 00 80 00 80 00 80 00 80
CD CC CC 3D 00 00 00 41 00 00 80 00 80 00 80 00 80 00 80 00 80 00 80
01 01 02 00     // color_base_green
CD CC CC 3D 00 00 00 00 00 00 80 00 80 00 80 00 80 00 80 00 80 00 80
CD CC CC 3D 00 00 00 41 00 00 80 00 80 00 80 00 80 00 80 00 80 00 80
01 01 02 00     // color_base_blue
CD CC 4C 3E 00 00 00 00 00 00 80 00 80 00 80 00 80 00 80 00 80 00 80
CD CC 4C 3E 00 00 00 41 00 00 80 00 80 00 80 00 80 00 80 00 80 00 80

// В сером режиме все красные обьекты - белым, синие и зеленые - черным

7C 00 00 00      // free3
01 01 02 00     // color_gray_red
00 00 80 3F 00 00 00 00 00 00 80 00 80 00 80 00 80 00 80 00 80 00 80
00 00 80 3F 00 00 00 41 00 00 80 00 80 00 80 00 80 00 80 00 80 00 80
01 01 02 00     // color_gray_green
00 00 80 BF 00 00 00 00 00 00 80 00 80 00 80 00 80 00 80 00 80 00 80
00 00 80 BF 00 00 00 41 00 00 80 00 80 00 80 00 80 00 80 00 80 00 80
01 01 02 00     // color_gray_blue
00 00 80 BF 00 00 00 00 00 00 80 00 80 00 80 00 80 00 80 00 80 00 80
00 00 80 BF 00 00 00 41 00 00 80 00 80 00 80 00 80 00 80 00 80 00 80

// Полностью черно-белое изображение с учетом правил color_gray_*
01 01 02 00     // gray
00 00 80 3F 00 00 00 00 00 00 80 00 80 00 80 00 80 00 80 00 80 00 80
00 00 80 3F 00 00 00 41 00 00 80 00 80 00 80 00 80 00 80 00 80 00 80

01 01 00 00     // blur

// Двоения в глазах не будет

01 01 00 00     // duality_h
01 01 00 00     // duality_v

// Шума не будет
01 01 00 00     // noise_intensivity
01 01 00 00     // noise_granularity
01 01 00 00    // noise_fps

0

24

нужная шняга

+1


Вы здесь » ЕДИНЫЙ ФОРУМ S.T.A.L.K.E.R. - МЕТРО 2033 » КОНФИГИ СТАЛКЕР ТЧ : » КОНФИГИ СТАЛКЕР ТЧ