Введение  Многие часто сталкиваются с тем, что при попытке добавления монстров не попавшими в финальную версию игра может вылетать. Попробую рассказать, как это дело можно исправить. 
 Для примера возьму кошек (уж очень они мне нравятся) 
 Добавить их можно отредактировать файл all.spawn, либо динамически создать в игре через функцию alife:create().  
Вылет при появлении  Обычно сопровождается сообщением в логе:  
Код
Arguments     : Can't open section 'cat_weak'
 Это значит, что монстр у нас не до конца описан. В файле конфигурации идет секция  
Код
[m_cat_e]:monster_base
 Но для создания разных по силе конфигураций монстров обычно используется такая штука. Создается секция вида  
  то есть ссылка на основную конфигурацию, а потом указываются параметры, которые отличаются от нее. Например сила, здоровье, угол обзора и тд. Мы пока ограничимся просто добавлением этой секции. В файле 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, но на будущее добавим и остальных. Затем идет перечисление используемых классов монстров:  
  кошек нет и здесь, добавляем:  
Код
[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. И так для каждого нового монстра. 
 Второй - использовать общую иконку для всех монстров, у которых отсутствует этот параметр. Мы им и воспользуемся, так как для тестовых целей сойдет, а для серьезного применения все равно необходимо иметь хоть какие-то художественные навыки. 
 Для этого отредактируем файл defines.ltx , так как именно в нём содержится секция monster_base, общая для всех монстров. Открываем, ищем секцию, и вставляем  
Код
icon = ui_frame_error_sign_red
 Это будет такой красный крест в круге. Запускаем, убиваем, обыскиваем и не вылетаем. 
 Итак, свежедобавленный монстр бегает, живет, нападает. Однако та же кошка по умолчанию невероятно сильна, убивает с одного удара, поэтому для нормальной жизни необходимо подредактировать секцию атаки.