Xml file ui scopes xml value errdescr error reading end tag

SkyAnomaly.jpeg Глобальная модификация SKY ANOMALY Сталкер Зов Припяти. В данной теме будет проходить обсуждении вышедшей 30 марта 2013 года глобальной модификации под названием Sky...

Добро пожаловать,
Сталкер!

  Прохождение мода Sky Anomaly обсуждение, вылеты

(1 чел.) (1) гость

Ответить

Новая тема

  • Страница:
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • Alexs
  • Вне Зоны
  • АДМИН
  • Постов: 1119

  • Репутация: 1198
  •  Награды

SkyAnomaly.jpeg

Глобальная модификация SKY ANOMALY Сталкер Зов Припяти.

В данной теме будет проходить обсуждении вышедшей 30 марта 2013 года глобальной модификации под названием Sky Anomaly. Данный мод был разработан для игры Сталкер Зов Припяти версии 1.6.02, и несет в себе ряд характерных преимуществ в плане разнообразия игрового мира. В модификации присутствует большое количество уникальных аномалий и аномальных зон, каждая из которых имеет уникальные характеристики и визуальные эффекты. На ряду с этим в игру включены новые мутанты Заноза и Ротан.

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

Всем желаю удачного прохождения!


:pinch: ОПИСАНИЕ МОДА, СКРИНШОТЫ И ССЫЛКИ НА СКАЧИВАНИЯ


:pinch: ОПИСАНИЕ НОВОВЕДЕНИЙ МОДА ARS КОТОРЫЙ ЛЕГ В ОСНОВУ МОДА SKY ANOMALY


:pinch: ГЕЙМПЛЕЙНОЕ ВИДЕО, ДЕМОНСТРИРУЮЩЕЕ НОВЫЕ АНОМАЛИИ И МОНСТРОВ


:pinch: ФИКСЫ!



Изменено: 16.11.2013 19:04 от .

  • Яр
  • Вне Зоны
  • ВЕТЕРАН ЗOНЫ
  • ЛЕГЕНДА ЗОНЫ
  • Постов: 1011

  • Репутация: 386
  •  Награды

Вылет после установки и начала загрузки новой игры (патч до 1.6.02 поставил, игра ноставлена заново с диска) . Памяти 4 гб. Видео карта 1 гб, ос 64 разряда, процессор 2 ядра, «пень». Что моду может не хватать? как бы нам с зеленым жучком разобраться? Если кто знает ответ на этот вопрос — помогите.

  • Tor-vik

MGSteel написал:

Вылет после установки и начала загрузки новой игры (патч до 1.6.02 поставил, игра ноставлена заново с диска) . Памяти 4 гб. Видео карта 1 гб, ос 64 разряда, процессор 2 ядра, «пень». Что моду может не хватать? как бы нам с зеленым жучком разобраться? Если кто знает ответ на этот вопрос — помогите.

Помогу ,если выложишь лог вылета. Иначе никак.

  • Яр
  • Вне Зоны
  • ВЕТЕРАН ЗOНЫ
  • ЛЕГЕНДА ЗОНЫ
  • Постов: 1011

  • Репутация: 386
  •  Награды

Tor-vik вот что пишет «жук»

:pinch: ВНИМАНИЕ: СПОЙЛЕР!

  • Tor-vik

MGSteel это горю не поможет . на жуке нажми закрыть. открой блокнот -нажми вставить и появится настоящий лог.
Скорее всего будет такой
fatal error
Expression : false
Function : CXml::Load
File : D:prog_repositorysourcestrunkxrXMLParserxrXMLParser.cpp
Line : 87
Description : XML file:uiscopes.xml value: errDescr:Error reading end tag.

Можешь сравнить

особенно последнюю строчку.


Изменено: 04.04.2013 22:47 от .

  • Яр
  • Вне Зоны
  • ВЕТЕРАН ЗOНЫ
  • ЛЕГЕНДА ЗОНЫ
  • Постов: 1011

  • Репутация: 386
  •  Награды

сравнил. так оно и есть. Пишет что ты указал. Это как-то можно исправить?


Изменено: 04.04.2013 22:56 от Яр.

  • Tor-vik

MGSteel написал:

сравнил. так оно и есть

Отлично.
Лечится так —в папке gamedata/config/ui есть два файла-scopes.xml и scopes_16.xml. Копируешь данные файла scopes_16.xml и заменяешь ими данные файла scopes.xml. Мне помогло. Или можно scopes.xml удалить,а scopes_16.xml переименовать. второе- проще. Похоже проблема с широкими мониторами.


Изменено: 04.04.2013 23:09 от .

  • Alexs
  • Вне Зоны
  • АДМИН
  • Постов: 1119

  • Репутация: 1198
  •  Награды

Тор-вик, ты прав на сто процентов сейчас тоже открыл scopes.xml, там везде прописано разрешение width=»1024″ height=»768″ из-за этого скорее всего и иконки могут поплыть, а у кого и вообще не запуститься. Наш случай. У меня кстати разрешение 1366×768 вроде нормально прошло, повезло наверное . Ну хорошо что хотя бы выяснилась причина и теперь известно в какую сторону наступать.

  • Alexs
  • Вне Зоны
  • АДМИН
  • Постов: 1119

  • Репутация: 1198
  •  Награды

Внимание ! В шапку темы добавлен фикс исправляющий вылет при начале игры с логом:

Expression : false Function : CXml::Load
File : D:prog_repositorysourcestrunkxrXMLParserxrXMLParser.cpp
Line : 87
Description : XML file:uiscopes.xml value: errDescr:Error reading end tag.

Ставить тем кто скачал версию мода от 31.03.2013. Скопировать папку gamedata в папку с игрой, согласится на замену файлов.


Ссылка на фикс 


Изменено: 04.04.2013 23:36 от Alexs.

Ответить

Новая тема

  • Страница:
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

Логика NPC
Содержание [показать]
[править]
Теория

Предполагается, что читатель этой статьи знаком с языком LUA и основами объектно-ориентированного программирования.
[править]
История

Подход к решению проблемы игрового ИИ, выбранный создателями S.T.A.L.K.E.R. (далее буду писать просто «Сталкер»), был впервые применён в 1957 году Гербертом Саймоном (Herbert Simon) и Алленом Ньюэллом (Allen Newell) в программе GPS (General Problem Solver или Универсальный Решатель Задач).
Суть этого подхода заключается в том, что сначала задача представляется в виде набора условий, набора операторов, изменяющих эти условия, и описания начального и конечного состояний. Затем осуществляется поиск последовательности операторов, переводящей начальное состояние системы в конечное.
В Сталкере подсистема поиска последовательности операторов называется «планировщик».
[править]
ИИ в Сталкере

Как видно, этот способ решения проблем не подходит для шутера, так как ситуация в игре может меняться непредсказуемым образом и построенный план решения (последовательность операторов) станет неприменимым к текущей ситуации. Поэтому планировщик запускается каждый раз при непредвиденном развитии событий и создаёт новую последовательность действий (операторов).
Условия в игре тоже вычисляются динамически. Для этого используются специальные объекты – эвалуаторы. Эвалуатор должен содержать метод evaluate(), возвращающий true, если условие выполняется и false в противном случае. Операторы также представлены как объекты. Планировщик вызывает метод initialize() при начале работы оператора, затем он периодически вызывает метод execute().
Например, можно создать эвалуатор для условия «NPC голоден», и привязать к этому условию оператор «поесть».
Планировщик будет периодически проверять это условие (вызывать метод evaluate() эвалуатора), и если оно выполняется, инициализирует и будет выполнять оператор «поесть» до тех пор, пока условие не станет ложным.
К сожалению, в большей части скриптов все возможности планировщика не используются.
[править]
Разбор настройки и работы планировщика на примере скрипта xr_kamp
Рассмотрим скрипт xr_kamp, заставляющий сталкеров сидеть у костра и рассказывать анекдоты. Настройка планировщика осуществляется в функции add_to_binder. Параметры функции: object – объект для которого настраивается планировщик (в нашем случае это сталкер), ini, scheme, section – инициализационный файл, название схемы действий, секция ини-файла (эти параметры будут подробно разобраны в части по созданию мода), storage – таблица для хранения текущих параметров схемы действий.
Разберём, что делает эта функция.
Сначала получаем планировщик для текущего объекта (object).
local manager = object:motivation_action_manager()
Затем присваиваем идентификаторы операторов и условий элементам массива. Это сделано просто для удобства.
Идентификаторы могут иметь любое целочисленное значение, главное, чтобы они были уникальными, то есть не использовались для других операторов и условий.
properties[«kamp_end»]=xr_evaluators_id.stohe_kamp_base+1
properties[«on_position»]=xr_evaluators_id.stohe_kamp_base+2
properties[«contact»]=xr_evaluators_id.stohe_meet_base+1
operators[«go_position»]=xr_actions_id.stohe_kamp_base+1
operators[«wait»]=xr_actions_id.stohe_kamp_base+3
Для каждого идентификатора условия создадим соответствующий эвалуатор и добавим его в планировщик. В данном случае это условия: «закончить ли посиделки около костра?» и «пришёл ли я на своё место у костра?»
manager:add_evaluator (properties[«kamp_end»],
this.evaluator_kamp_end («kamp_end», storage, «kamp_end»))manager:add_evaluator (properties[«on_position»],
this.evaluator_on_position («kamp_on_position», storage, «kamp_on_position»))
Теперь создадим оператор «сидеть около костра, рассказывать анекдоты, жевать колбасу и т.д.». Можно было бы реализовать эти действия как набор разных операторов, выбором которых занимался бы планировщик, но автор скрипта решил сделать один сложный оператор.
local action = this.action_wait (object:name(),»action_kamp_wait», storage)
Задаем предусловия для этого оператора. Планировщик выберет этот оператор при выполнении всех условий. Всё это значит примерно следующее: я могу сидеть у костра, если:
action:add_precondition (world_property(stalker_ids.property_alive, true))
я живой,
action:add_precondition (world_property(stalker_ids.property_danger,false))
опасностей нет,
action:add_precondition (world_property(stalker_ids.property_enemy, false))
врагов нет,
action:add_precondition (world_property(stalker_ids.property_anomaly,false))
аномалий поблизости нет,
xr_motivator.addCommonPrecondition(action)
выполняются другие важные условия (игрок не собирается со мной поговорить, я не собираюсь никого бить по морде, я не ранен, я не собираюсь стрелять по вертолёту),
action:add_precondition (world_property(properties[«on_position»], true))
я уже нахожусь около костра.
Скажем планировщику, что он должен ожидать от выполнения этого оператора. В данном случае после выполнения этого оператора условие «закончить ли посиделки около костра?» должно стать истинным. То есть если условие стало истинным, планировщик прекратит выполнение оператора.
action:add_effect (world_property(properties[«kamp_end»], true))
Создание оператора завершено. Добавим его в планировщик.
manager:add_action (operators[«wait»], action)
Эта строчка не имеет отношения к работе планировщика. Если коротко, то она позволяет объекту получать уведомления об определённых событиях (смерть NPC – вызывается метод death_callback(), попадание пули в NPC – вызывается метод hit_callback() и т.д.)
xr_logic.subscribe_action_for_events(object, storage, action)
Создаем оператор, отвечающий за доставку NPC к его месту у костра.
action = this.action_go_position (object:name(),»action_go_kamp», storage)
Добавляем предусловия, как и для предыдущего оператора.
action:add_precondition (world_property(stalker_ids.property_alive, true))
action:add_precondition (world_property(stalker_ids.property_danger,false))
action:add_precondition (world_property(stalker_ids.property_enemy, false))
action:add_precondition (world_property(stalker_ids.property_anomaly,false))
xr_motivator.addCommonPrecondition(action)
action:add_precondition (world_property(properties[«on_position»], false))
Единственное отличие – последнее условие. Этот оператор будет выполняться только если NPC ещё не находится на своем месте у костра, то есть если функция evaluator_on_position.evaluate() возвращает false.
В результате выполнения этого действия условие «на своём ли я месте у костра?» должно стать истинным.
action:add_effect (world_property(properties[«on_position»], true))
Создание оператора завершено. Добавляем его к планировщику.
manager:add_action (operators[«go_position»], action)
Осталось ещё одна задача. Нужно запретить планировщику активировать оператор «alife», тот самый оператор, который заставляет NPC болтаться по карте, отстреливать собачек и в конце концов попадать в аномалию. Впрочем, отстрелом врагов занимается другой оператор с идентификатором stalker_ids.action_combat_planner.
Для этого мы получаем оператор «alife»
action = manager:action (xr_actions_id.alife)
И добавляем к его предусловиям следующее: условие «закончить ли посиделки у костра?» должно быть истинным.
action:add_precondition (world_property(properties[«kamp_end»], true))
Итак, мы настроили планировщик. Посмотрим как всё это будет работать.
В некоторый момент времени гулаг, в который попал NPC, назначает ему работу: сидеть у костра. В результате условие «закончить ли посиделки у костра?» становится ложным. Планировщик видит это изменение и пытается выработать последовательность операторов, после выполнения которой, условие бы стало истинным и NPC снова бы вернулся к выполнению высокоприоритетного оператора «alife». Для выполнения этой задачи подходит оператор «посиделки у костра», но для него не выполняется условие «я на своем месте у костра». Поэтому планировщик создаёт план из двух операторов: «дойти до костра» и «посиделки у костра». Если во время выполнения одного из операторов возникнет непредвиденная ситуация (появится враг, главный герой начнёт приставать с вопросами и т.п.), то планировщик скорректирует план, добавив оператор для устранения этой непредвиденной ситуации.
Как видно система ИИ в Сталкере обладает весьма большой гибкостью, что мы и продемонстрируем при создании мода.
[править]
Модели (или схемы) поведения в Сталкере

В наборе скриптов Сталкера предусмотрена возможность объединять операторы и условия в модели поведения. Модель поведения – это набор логически связанных операторов и условий, служащих для выполнения определённой задачи. Так скрипт xr_kamp представляет собой модель поведения, состоящую из двух операторов и двух условий.
[править]
Регистрация модели поведения
Для включения новой модели поведения в набор моделей, доступных NPC, сначала необходимо её зарегистрировать. Предположим, нам нужно зарегистрировать модель поведения, описанную в скрипте actor_need_help.script. Регистрация моделей осуществляется в скрипте modules.script. Добавим туда следующие строки:
if actor_need_help then – в этой строке мы проверяем что наш скрипт действительно существует
load_scheme(«actor_need_help», «actor_need_help», stype_stalker)
end
Первый параметр функции load_scheme задает имя файла скрипта, второй параметр – это название модели поведения, третий параметр – тип модели поведения (возможны следующие значения: stype_stalker – модель поведения NPC, stype_mobile – модель поведения монстра, stype_item – «модель поведения» физического объекта, stype_heli – модель поведения вертолёта, stype_restrictor – «модель поведения» области пространства). Скрипты для моделей поведения разных типов пишутся по-разному. Мы будем рассматривать только модели поведения NPC.
Внимание! Для успешной работы модели поведения её скрипт должен содержать функцию add_to_binder, выполняющую настройку планировщика.
[править]
Активация/деактивация модели поведения
Некоторые модели поведения применимы в любых ситуациях (например, реакция на попадание пули в NPC или реакция на появление врага). Такие модели должны активироваться/деактивироваться в функциях
enable_generic_schemes()/disable_generic_schemes() скрипта xr_logic. В случае с моделью поведения actor_need_help,
это будет выглядеть так:
1. Создаём функции set_actor_need_help и disable_scheme в нашем скрипте actor_need_help. Эти функции будут отвечать за активацию и деактивацию нашей модели поведения.
function set_actor_need_help(npc,ini,scheme)
local st=xr_logic.assign_storage_and_bind(npc, ini, scheme, “actor_need_help”)
st.enabled=true
end
function disable_scheme(npc,scheme)
local st = db.storage[npc:id()][scheme]
if st then
st.enabled = false
end
end
2. Добавляем следующую строку в скрипт xr_logic.script после строки «if stype == modules.stype_stalker then» в функции enable_generic_schemes()
actor_need_help.set_actor_need_help(npc,ini,”actor_need_help”)
3. Добавляем следующую строку в скрипт xr_logic.script после строки «if stype == modules.stype_stalker then» в функции disable_generic_schemes()
actor_need_help.disable_scheme(npc,”actor_need_help”)
Если же модель поведения предназначена только для использования в определённых ситуациях, то достаточно выполнить шаг 1 и использовать созданные функции по мере надобности. Например, активируя эту схему через диалог с NPC (как мы и сделаем в нашем моде).
Внимание! Я максимально упростил функции активации/деактивации модели поведения. Чтобы полностью разобраться с ними, посмотрите скрипты xr_combat, xr_kamp и другие подобные.
[править]
Приоритеты моделей поведения
Некоторые модели поведения настолько важны, что должны срабатывать в любой ситуации (например, реакция на попадание пули). Для этого в скрипте xr_motivator предусмотрена функция addCommonPrecondition(action), в эту функцию можно добавить одно из условий нашей модели поведения, чтобы другие модели поведения не могли сработать при выполнении этого условия (здесь есть свои тонкости, но мы рассмотрим их позже). Предположим, что у нас есть модель поведения actor_need_help, заставляющая NPC подбежать к ГГ и вылечить его. Пусть за проверку здоровья ГГ отвечает условие с идентификатором actor_need_help.property_actor_is_wounded. Значит, если мы хотим, чтобы NPC подбегал к ГГ не обращая внимание ни на что другое, то нужно добавить следующую строчку в функцию addCommonPrecondition(action):
action:add_precondition(world_property(actor_need_help.property_actor_is_wounded,false))
Эта строчка запретит выполнение всех других действий, если условие с идентификатором actor_need_help.property_actor_is_wounded станет истинным (в нашем случае это будет означать, что ГГ сильно ранен.
Конкретное значение здоровья ГГ при котором он считается сильно раненным будет определять эвалуатор этого условия).

[править]
Создаем мод

В этом разделе мы сделаем мод, позволяющий сказать дружественно настроенному NPC, чтобы он лечил главного героя во время боя.
[править]
Постановка задачи

Итак, мы хотим, чтобы дружественные NPC наконец начали приносить пользу. Для этого научим их лечить ГГ во время боя. Распишем по пунктам:
1. Нужно добавить дружественным NPC ветку в диалоге с просьбой присматривать за ГГ и лечить его, если в этом возникнет необходимость.
2. Добавить NPC модель поведения, реализующую выполнение этой просьбы.
2.1. NPC должен действовать согласно этой модели только если ГГ находится недалеко от него.
2.2. NPC не должен далеко отходить от ГГ во время боя.
2.3. Если здоровье ГГ упало ниже определённой отметки, NPC должен подойти/подбежать и вылечить ГГ.
[править]
Что потребуется для реализации

Нам придётся изменять диалоги для некоторых NPC, для этого нужно будет изменить файлы configgameplaycharacter_dialogs.xml (диалоги для всех NPC), configlocalization.ltx и configsystem.ltx (подробнее см. статью BAC9-FLCL или Fr3nzy). Мы изменим диалоги для всех NPC, но для неподходящих NPC диалог будет отсекаться с помощью предусловия. Потребуется также добавить файлы с текстами диалогов и функции для проверки условий, используемых в диалогах.
Для включения новой модели поведения NPC нужно будет внести изменения в скрипты scriptsmodules.script (регистрация моделей поведения) и scriptsxr_motivator.script (для установки высокого приоритета нашей модели). Модификации файла xr_logic.script, в котором происходит установка общих моделей поведения, не потребуется, так как мы будем активировать нашу схему поведения при выборе определённой ветки в диалоге.
Теперь решим какие условия и операторы нам понадобятся.
Условия:
1. Состояние главного героя. Если оно ниже определённого порога, то условие станет истинным. Назначим ему идентификатор property_actor_is_wounded и эвалуатор evaluator_actor_is_wounded. Далее я буду указывать идентификатор и эвалуатор в скобках через запятую.
2. Находится ли NPC достаточно близко, чтобы вылечить ГГ. (property_ready_to_heal, evaluator_ready_to_heal)
3. Есть ли у NPC аптечки. (property_has_medkit, evaluator_has_medkit)
4. Не отошёл ли NPC слишком далеко от ГГ или ГГ от NPC. (property_faraway, evaluator_faraway)
5. Находится ли ГГ достаточно близко, чтобы имело смысл помогать ему. (property_near_enough, evaluator_near_enough).
Операторы:
1. Лечить ГГ. (act_heal, action_heal)
2. Подбежать к ГГ на дистанцию, достаточную для лечения (act_run_to_actor, action_run_to_actor)
3. Крикнуть что аптечки кончились (act_no_medkit, action_no_medkit)
4. Подобраться поближе к ГГ, чтобы быть под рукой. (act_stay_close, action_stay_close).
[править]
Реализация

Я буду писать эту статью параллельно с разработкой мода, указывая все найденные ошибки. Надеюсь, это поможет другим моддерам. Чтобы отделить результаты тестирования от описания процесса разработки мода, я буду выделять свои комментарии другим шрифтом.
[править]
Диалоги
В этом моде будет всего один диалог, и довольно простой, поэтому начнём с него. Создаём файл configgameplaydialogs_need_help.xml. Чтобы не возиться с идентификаторами текстов попробуем обойтись без них. Начнём с простой тестовой версии:

actor_need_help.i_am_friend

Дружище, сможешь присмотреть за мной, если стрелять начнут? Промедольчику, там, вколоть или

перевязку сделать, если что…
1

Нет проблем, конечно помогу.

Добавляем строку с идентификатором этого диалога в configgameplaycharacter_dialogs.xml:
actor_will_need_help
Дописываем имя файла диалога в configsystem.ltx в секцию «dialogs». Осталось создать функцию i_am_friend. Наш скрипт с моделью поведения будет называться scriptsactor_need_help.script, заодно пропишем там и диалоговые функции.
function i_am_friend(actor,npc)
return npc:relation(actor)==game_object.friend
end
При первом тестировании я заменил game_object.friend на game_object.neutral, чтобы не искать друзей по всей карте.
Тестируем, что у нас получилось…
Диалог работает, но вместо текста – набор значков, оказалось, я написал текст в кодировке CP866 (DOS), нужно поменять её на CP1251. Так, теперь текст в порядке.
Выбранный подход к созданию диалога оказался удачным.
Обратите внимание, вместо идентификатора текста можно вписать сам текст. Это усложнит локализацию, но уменьшит время создания диалогов.
Теперь нам понадобятся функции проверки наличия аптечек у NPC, проверки активации схемы поведения, активации/деактивации схемы поведения. Добавляем их в наш скрипт-файл.
Первый вариант скрипта я не буду приводить, чтобы не увеличивать и так большую статью. Окончательный вариант смотрите в конце статьи. Дальше по тексту идёт простейший работающий вариант.
Теперь у нас должно быть два варианта начальной фразы для активной и неактивной схемы. Придётся экспериментировать.
‘Вот первый проверенный вариант:

actor_need_help.i_am_friend

1
2

Дружище, сможешь присмотреть за мной, если стрелять начнут? Промедольчику, там, вколоть или

перевязку сделать, если что…
actor_need_help.scheme_is_not_active
11
12

Нет проблем, конечно помогу.
actor_need_help.npc_have_medkit
actor_need_help.activate_scheme

Извини, друг, аптечек совсем не осталось.
actor_need_help.npc_havent_medkit

Спасибо, друг, теперь я сам справлюсь.
actor_need_help.scheme_is_active
21

Да не за что, ты мне помог, я — тебе.
actor_need_help.deactivate_scheme

При первом запуске игра вылетела без сообщений об ошибках. Я внимательно просмотрел все файлы и оказалось, что в скриптах вместо комментария ‘—‘ (два минуса) я поставил просто минус (рекомендую пользоваться компилятором с [www.lua.org www.lua.org] для проверки корректности скриптов). После исправления ошибки игра запустилась, но диалог так и не появился. Небольшая дискуссия на форуме (спасибо Z.E.N. и Arhet) показала, что придётся сделать два диалога.
Кроме того, при тестах первых вариантов, выяснилось, что всегда выбирается вариант диалога с просьбой о помощи. То есть схема поведения не активируется.
Как оказалось, в качестве параметров в функции передаются не объекты ГГ и NPC, а объекты говорящего в данный момент персонажа и его собеседника. То есть, если фраза принадлежит NPC, то первый параметр будет объектом для NPC, а не для ГГ. Поэтому я изменил названия параметров и переписал функции.
Итак, все проблемы решены. Файл диалога принял следующий вид (configgameplaydialogs_need_help.xml):

actor_need_help.i_am_friend
actor_need_help.scheme_is_not_active

Дружище, сможешь присмотреть за мной, если стрелять начнут? Промедольчику, там, вколоть или

перевязку сделать, если что…
11
12

actor_need_help.npc_have_medkit
Нет проблем, конечно помогу.
actor_need_help.activate_scheme

actor_need_help.npc_havent_medkit
Извини, друг, аптечек совсем не осталось.

actor_need_help.i_am_friend
actor_need_help.scheme_is_active

Спасибо, друг, теперь я сам справлюсь.
21

Да не за что, ты мне помог, я — тебе.
actor_need_help.deactivate_scheme

Функции, поддерживающие работу диалога, теперь выглядят так (файл scriptsactor_need_help.script):
function i_am_friend(talker,target)
return target:relation(talker)==game_object.friend
end

— За основу этой функции взята функция dialogs.actor_have_medkit
function npc_have_medkit(talker, target)
return talker:object(«medkit») ~= nil or
talker:object(«medkit_army») ~= nil or
talker:object(«medkit_scientic») ~= nil
end
function npc_havent_medkit(talker, target)
return not npc_have_medkit(talker,target)
end

— Так как модель поведения еще не написана, вставим заглушки
local scheme_status={}
function scheme_is_active(talker,target)
return scheme_status[target:id()]==true — сравниваем с true, чтобы функция не возвращала nil
end
function scheme_is_not_active(talker,target)
return not scheme_is_active(talker,target)
end
function activate_scheme(talker,target)
scheme_status[talker:id()]=true
end
function deactivate_scheme(talker,target)
scheme_status[talker:id()]=nil — присваиваем nil, чтобы освободить память, занятую этим элементом массива
end
И в файл configgameplaycharacter_dialogs.xml добавлены строки:
actor_will_need_help
actor_will_not_need_help
В результате получился работающий диалог, но NPC выглядит просто как ходячая аптечка. В окончательном варианте, я добавил некоторые «человеческие» реакции. Да и сама модель поведения пока отсутствует — вместо неё стоят заглушки. Исправим это.
[править]
Модель поведения
Начнём создание модели поведения с разработки эвалуаторов. Эвалуатор должен представлять собой объект класса унаследованного от класса property_evaluator.
Возьмём для начала эвалуатор evaluator_faraway определяющий, что NPC находится слишком далеко от ГГ. Этот эвалуатор требуется для того, чтобы NPC не отходил слишком далеко от ГГ и мог в случае надобности быстро подбежать к нему и оказать помощь.
Объявляем класс эвалуатора:
class «evaluator_faraway» (property_evaluator)
Определяем функцию инициализации (в LUA это аналог конструктора объекта)
function evaluator_faraway:__init(name, storage) super (nil, name)
self.st = storage
end
Ключевое слово «super» служит для вызова конструктора базового класса. Член «st» будет хранить ссылку на таблицу состояния нашей модели поведения.
Теперь нужно определить функцию evaluate(), ради которой и создавался эвалуатор. По-видимому всё просто, нужно проверить расстояние от NPC до ГГ и вернуть true, если это расстояние больше определённого значения. Но давайте подумаем. Когда эвалуатор возвратит true, заработает оператор, заставляющий NPC подойти поближе к ГГ, то есть расстояние моментально уменьшится и эвалуатор начнёт возвращать false, что приведёт к переходу NPC под управление игрового ИИ. ИИ может опять решить удалиться от ГГ, что приведёт к повторному срабатыванию эвалуатора. В результате возникнет замкнутый цикл, и NPC будет крутиться на одном месте (на самом деле этот цикл рано или поздно разорвётся из-за изменения игровой ситуации, но лучше вообще избежать его).
Можно использовать разные пути для решения этой проблемы. Попробуем сделать так: будем использовать два расстояния, эвалуатор сработает при достижении первого и будет оставаться активным, пока расстояние не станет меньше второго.
local min_faraway_dist=10
local max_faraway_dist=20

function evaluator_faraway:evaluate()
local actor=db.actor
if not actor then
— ГГ ещё не заспаунился
return false
end
local dist=actor:position():distance_to(self.object:position())
if dist>max_faraway_dist then
self.st.faraway=true
elseif distmax_faraway_dist then
— если NPC находится слишком далеко от ГГ пусть пробежиться побыстрее
npc:set_mental_state(anim.panic)
else
npc:set_mental_state(anim.free)
end
end
Функция настройки планировщика.
function add_to_binder(object, char_ini, scheme, section, st)
local manager = object:motivation_action_manager()
local property_wounded = xr_evaluators_id.sidor_wounded_base

— Удаляем эвалуатор, так как в xr_motivator мы установили его в property_evaluator_const
manager:remove_evaluator(property_faraway)
— и заменяем его нашим
manager:add_evaluator(property_faraway, evaluator_faraway(«evaluator_faraway»,st))
— Создаём оператор
local action = action_stay_close(«action_stay_close»,st)
— и настраиваем предусловия. 1. Сталкер жив
action:add_precondition(world_property(stalker_ids.property_alive, true))
— 2. Сталкер не ранен
action:add_precondition(world_property(property_wounded, false))
— Я использую свой мод для обхода аномалий, иначе от помощников мало толку.
if anomaly_evader then
— 3. Рядом нет аномалий
action:add_precondition (world_property(1099,false))
end
— 4. Сталкер слишком далеко от ГГ
action:add_precondition(world_property(property_faraway, true))
action:add_effect (world_property(property_faraway, false))
— Добавляем оператор в планировшик
manager:add_action (act_stay_close, action)
— Теперь подкорректируем стандартные операторы, чтобы помощник не отвлекался на всякую ерунду.
action=manager:action(stalker_ids.action_alife_planner)
action:add_precondition(world_property(property_faraway, false))
action=manager:action(stalker_ids.action_combat_planner)
action:add_precondition(world_property(property_faraway, false))
action=manager:action(stalker_ids.action_danger_planner)
action:add_precondition(world_property(property_faraway, false))
end
Добавим функции активации/деактивации схемы поведения.
function set_help(npc, ini)
local st = xr_logic.assign_storage_and_bind(npc, ini, «actor_need_help»)
st.enabled=true
end
function disable_scheme(npc, scheme)
local st = db.storage[npc:id()][scheme]
if st then
st.enabled = false
end
end
Изменим диалоговые функции-заглушки.
function activate_scheme(talker,target)
set_help(talker,talker:spawn_ini())
scheme_status[talker:id()]=true
end
function deactivate_scheme(talker,target)
disable_scheme(talker,»actor_need_help»)
scheme_status[talker:id()]=nil
end
Добавим в функцию xr_motivator.addCommonPrecondition() следующие строки, чтобы заблокировать стандартные схемы поведения.
if actor_need_help then
action:add_precondition (world_property(actor_need_help.property_faraway,false))
end
Если попробовать запустить мод сейчас, то игра просто вылетит. Причина в том, что мы добавили предусловие для стандартных схем поведения, но не добавили эвалуатор этого условия. Поэтому добавляем в функцию xr_motivator.net_spawn() следующие строки:
local manager = self.object:motivation_action_manager()
if actor_need_help then
manager:add_evaluator(actor_need_help.property_faraway, property_evaluator_const(false))
end
Для того чтобы снизить нагрузку на процессор, используем property_evaluator_const, который всегда возвращает одно и тоже значение. В результате тестирования выяснилось, что не все NPC подчиняются нашей схеме поведения. Причины этого пока не ясны, требуется дополнительное тестирование и очень желательна помощь разработчиков (хотя бы для того чтобы узнать как выяснить какой оператор действует в данный момент на NPC).

Vot logikA

Год выпуска: 2021
Жанр: Action /Shooter / 3D / 1st Person
Разработчик: GSC Game World
Издатель: Anomaly-team,  Mortan (Forward Frontier/STCoP),  Andrejs Green,  LsdPro,  unethicalrus,  Gunslinger Mod Team,  _Mr_Vlad_
Тип издания: Repack
Платформа: Anomaly
Язык интерфейса: Русский
Язык озвучки: Русский
Таблетка: Вшита
Репак обновлен 29.08.2021 19-36.
СИСТЕМНЫЕ ТРЕБОВАНИЯ:
Операционная система: Windows 7 /Windows 8.1 / Windows 10 (только х64 bit)
Процессор: Intel® Core™2 Duo 2.4 GHz / AMD Athlon(tm) X4
Оперативная память: от 4 Гб (желательно 6/8 и выше)
Видеокарта: 2ГБ / nVIDIA® GeForce™ / ATI Radeon®
Звуковая карта: Звуковое устройство, совместимое с DirectX® 9.0с
Свободное место на жестком диске: 21 Гб


Описание Anomaly:
Anomaly — это один из самых популярных, глобальных, ожидаемых модов на платформе COC. Обновленный геймплей, переработанная графика и атмосфера, война группировок, новые шейдеры, сюжет, который состоит из 4, независимых друг от друга частей, и многое-многое другое ждет в Anomaly.

Описание Boomsticks and Sharpsticks:
Основная идея аддона, по мнению автора, является почти полный отказ от стандартного оружейного пака. В аддоне вы увидите немалое количество нового оружия. Стоит также добавить, что ко всему оружия в придачу идет большой выбор прицелов под любые вкусы и про любителей холодного оружия тоже не забыли. Для некоторых стволов была реализована возможность использования дополнительного прицела, установленного под углом 45 градусов, в спойлере «Дополнительный прицел» как раз показана реализация данной фичи.

Скриншоты

Дополнительный прицел

Особенности Репака
Игра:
Ничего не вырезано
Ничего не перекодировано
Версия Anomaly: 1.5.1
Версия Boomsticks and Sharpsticks: От 26.08.2021

Важно:
Владельцам Windows 7/8/10, если включен «Контроль учетных записей (UAC), запускать игру с правами администратора.
Если не будут работать сохранения в игре, тогда запускать игру с правами администратора.
Если не будет запускаться игра, пробуем удалить файл user.ltx из папки userdata, в корне игры.
Не ставить репак на диск «С» (там где Windows)
Владельцам Windows 8/10, если при запуске мода вылет, в ярлыке поставить совместимость с Windows 7.


Больше изображений

playobs©

playobs©

2 дня назад

Можно использовать аномали редукс?


ZAN ZAN

ZAN ZAN

4 дня назад

Спасибо. За понятное объяснение бэбибумирам. С JSGME моды получается запускать , с МО 2 я за…устал. Все сделал как в обзоре, а по итогу 1.5.2 голая запустилась.


Назар Аниматор

Назар Аниматор

3 месяца назад

ЧТО ДЕЛАТЬ ЕСЛИ ОНО, етот долбаний менеджер аддонов при попитке поставить редукс приосто берет и нахер зависает то что тогда делать ?


Ahmadjon Jurayev

Ahmadjon Jurayev

5 месяцев назад

Архиватир какой скажи пожалуйста


SmuNik

SmuNik

6 месяцев назад

Надеюсь мне ответят, в модинге сталкера ничего не смыслю хочу скачать Original Weapon Restoration Mod на аномали, с помощью этого менеджера модов это возможно сделать ?


Дмитрий Новицкий

Дмитрий Новицкий

7 месяцев назад

К сожалению очень сложно много лишней инфы(


Foksepe ASMR

Foksepe ASMR

8 месяцев назад

А как мне установить через папки если у меня всего на диске с 9гб но комп какого-то хрена использует диск с как буфер. На диске д у меня 700гб


Oskar_Hohlinka

Oskar_Hohlinka

10 месяцев назад

Что делать если я установил мод, активировал, зашёл в игру, а там все как было так и осталось


HaMemoNsiKongg

HaMemoNsiKongg

10 месяцев назад

как анимацию на рюкзак влепить?


Алина Лазаева

Алина Лазаева

10 месяцев назад

Я загружаю игру и не запускается что делать?


Grigx_Blood

Grigx_Blood

1 год назад

Спасибо очень хорошие видео для тех кто не понял как устанавливать аддоны для аномалии ,а то я совсем был отчаянный и вдруг в рекомендации в ютубе это видео высветилось и тут я понял что может быть это видео мне поможет и оно помогло теперь играю с бумстиком спасибо ещё раз больше


Diriohaus

Diriohaus

1 год назад

А как быть, если 2 модификации, а может быть и больше используют 1 файл. Последний просто перезапишет же. Всегда вручную устанавливал. Через winmerge сравнивал и перемещал строки. Хорошо работает. Стабильно и без вылетов. Всё на своём месте.


Діма Муригін

Діма Муригін

1 год назад

Сука я дибил пасибо брат


Tommy Shelby

Tommy Shelby

1 год назад

У тебя нет готовой сборки чтобы как у тебя была графа и оружие?


XOTTABWF

XOTTABWF

1 год назад

Вопрос такой, я его нигде не встречал, если я уже начал играть, и к примеру хочу установить зимний мод(аддон) не знаю как правильно назвать, мне обязательна НИ или можно продолжить?


Саул Тарвиц

Саул Тарвиц

1 год назад

Спасибо
У меня ноут, менеджер подвисает часто, думал что какие то файлы повредились при распаковке


Пушок&Бублик🇺🇦

Пушок&Бублик🇺🇦

1 год назад

Превышен лимит скачиваний …
Что делать ?!?!!


Пушок&Бублик🇺🇦

Пушок&Бублик🇺🇦

1 год назад

А можно гугл диск ? Ну пж я в украине живу просто


Luffi

Luffi

1 год назад

А что делать если у торговцев есть и бумстиковские стволы и ванильные


Kabanmks

Kabanmks

1 год назад

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


Понравилась статья? Поделить с друзьями:
  • Xml error rimworld
  • Xfce как изменить язык
  • Xerox workcentre 5016 ошибка u70
  • Xerox workcentre 3119 open heat error
  • Xerox 700 ошибка 042 326 xerox