Скрипты крючки - это специальное скрипты, которые запускаются в sfall в определенных точках игровой механики, чтобы позволить
вашим модам более гибким способом переопределять поведение движка, без использования конфигурационных ini-файлов sfall.
В дополнение к коду скрипта который он переопределяет, чтобы обеспечить инициализацию необходимых параметров скрипт будет запускаться каждый раз при начале игры, а также при каждой загрузке сохраненной игры.
Hook скрипты имеют набор предоставляемых необязательных аргументов, которые вы можете использовать.
Скрипты также могут возвращать значения обратно в код игрового алгоритма, если вы желаете переопределить значение алгоритма по умолчанию.
Чтобы обеспечить совместимость с модами, избегайте использования предопределенных скриптов с именами hs_<name>.int.
Вместо этого рекомендуется использовать обычный глобальный скрипт в сочетании с функциями register_hook_proc или register_hook.
В этом случае скрипты выполняются в обратном порядке по отношению к тому, как они были зарегистрированы, т.е. первый зарегистрированный будет выполняться последним в цепочке hook обработчиков.
Пример стандартного подключения скрипта крюка для мода:
procedure start begin
if game_loaded then begin
register_hook_proc(HOOK_TOHIT, tohit_hook_handler);
end
end
procedure tohit_hook_handler begin
display_msg("Modifying hit_hook " + get_sfall_arg);
set_hit_chance_max(100);
set_sfall_return(100);
end
Ниже предоставлены функции скриптов, предназначенные только для скриптов крючка:
int init_hook()Функция эквивалентна game_loaded, и возвращает 1, когда скрипт загружается в первый раз или когда игрок перезагружает игру, в противном случае возвращается 0.
mixed get_sfall_arg()Получает значение из аргумента крючка.
При каждом вызове возвращается значение для следующего аргумента, в противном случае если больше не осталось аргументов возвращается 0.
Вы можете произвольно получить значение любого аргумента, используя функцию sfall_func1("get_sfall_arg_at", argNum).
array get_sfall_args()Возвращает значения всех аргументов крючка в виде временного массива.
void set_sfall_return(any value)Используется для возврата переопределенных значений из скрипта в алгоритм движка.
При каждом вызове, функция будет устанавливать следующее возвращаемое значение для аргумента, если уже были установили все возвращаемые значения, то функция ничего не будет делать.
void set_sfall_arg(int argNum, int value)Изменяет значение аргумента.
Это полезно, если у вас есть несколько скриптов крючков, зарегистрированных к одному типу крючка (см. ниже).
Отсчет номера аргументов (argNum) начинаются с индекса 0.
void register_hook(int hookID)Используется в глобальном скрипте для регистрации hook скрипта. В этом случае процедура start в текущем глобальном скрипте будет выполняться в качестве обработчика крючка.
Определения типа крючка, которые следует использовать для идентификатора hookID, находятся в файле заголовка sfall.h.
Вы можете использовать все вышеперечисленные функции как обычно.
Чтобы более гибко взаимодействовать с порядком выполнения hook обработчиков, порядок регистрации обработчиков начиная с версии sfall 4.2 для этой функции был изменен, поэтому зарегистрированные обработчики этой функцией будут выполняться после всех обработчиков, которые были зарегистрированы функцией register_hook_proc.
Для того чтобы вернуться к предыдущей системе регистрации, используйте опцию BackwardHooksRegistration в файле ddraw.ini.
ПРИМЕЧАНИЕ: Начиная с sfall версии 5.0 опция BackwardHooksRegistration была удалена, а данное правило регистрации для функции является окончательно утвержденным.
void register_hook_proc(int hookID, procedure proc)Выполняет тоже самое, что и register_hook, за исключением того, что указывается, какая процедура в текущем скрипте должна вызываться как hook обработчик (вместо start по умолчанию).
Передайте процедуру в аргумент proc так же, как вы используете функции параметров диалогового окна.
Это рекомендуемый способ регистрации hook скриптов, поскольку он обеспечивает модульность (логика каждого мода в отдельном глобальном скрипте, без каких либо конфликтов), так и гибкость, вы можете разместить все связанные hook скрипты для конкретного мода в одном глобальном скрипте!
void register_hook_proc_spec(int hookID, procedure proc)Работает также как и register_hook_proc, за исключением того, что функция регистрирует текущий скрипт в самом конце последовательности выполнения hook обработчиков, т.е. обработчик будет выполнен после всех ранее зарегистрированных обработчиков того же типа крючка, включая скрипт hs_<name>.int.
В дополнение все hook обработчики, зарегистрированные к одному типу крючка с помощью этой функции, выполняются в точном порядке того, как они были зарегистрированы, в отличие от способа относящегося к функциям register_hook, и register_hook_proc.
Последовательность выполнения hook обработчиков является следующей:
register_hook_proc (выполняются в обратном порядке регистрации). register_hook (выполняются в обратном порядке регистрации). hs_<name>.int. register_hook_proc_spec (выполняются в том-же порядке регистрации).Вы можете подключить несколько скриптов к одному типу крючка, например, если это разные моды от разных авторов или просто несколько разных аспектов одного большого мода.
Когда один из скриптов в цепочке возвращает значение с помощью set_sfall_return, следующий сценарий может переопределить это значение, если снова вызовет set_sfall_return.
Пример:
Иногда вам необходимо умножить определенное значение в цепочке hook скриптов.
Допустим, у нас есть Mod A, который уменьшает все шансы попадания на 50%. Тогда код может выглядеть следующим образом:
original_chance = get_sfall_arg;
set_sfall_return(original_chance / 2);
Mod B также хочет глобально повлиять на шансы попадания, увеличив их на 50%.
Теперь, чтобы оба мода работали вместе, нам нужно добавить дополнительную строку в скрипт Mod A:
set_sfall_arg(0, (original_chance / 2));
Это в изменит аргумент крючка для следующего скрипта.
Код скрипта Mod B должен быть таким:
original_chance = get_sfall_arg;
set_sfall_return(original_chance * 1.5);
set_sfall_arg(0, (original_chance * 1.5));
Таким образом, если вы объедините оба мода вместе, они будут выполняться по цепочке, и конечный результат будет составлять 75% от первоначального шанса попадания (порядок регистрации крючков в этом случае не имеет значения, если вы используете set_sfall_arg в обоих скриптах).
HOOK_TOHIT (hs_tohit.int)Запускается, когда рассчитывается шанс вероятности поразит цель для атаки.
Выполняется после того, как шанс попадания полностью рассчитан игрой, включая применение 95% ограничения.
int arg0 - Шанс попадания (ограниченный)
Critter arg1 - Атакующий
Critter arg2 - Атакуемая цель
int arg3 - Атакуемая часть тела (константы BODY_HIT_*)
int arg4 - Исходной гекс (может отличаться от гекса атакующего, когда AI рассматривает потенциальную огневую позицию)
int arg5 - Тип атаки (см. константы ATKTYPE_*)
int arg6 - Флаг учета расстояния, когда установлено в 1, в расчете шанса учитывается дистанция между целью и атакующим,
иначе 0, когда AI проверяет вероятность поразить цель
int arg7 - Исходной шанс попадания, т.е. без применения модификаторов ограничений
int arg8 - Значение рассчитанного модификатора бонуса/штрафа к шансу точности за расстояние и восприятие (это значение уже содержится в шансе)
int ret0 - Переопределенный шанс вероятности
HOOK_AFTERHITROLL (hs_afterhitroll.int)Запускается после того, как игра определит, является ли атака успешной (попадание), неудачной (промах) или критической.
int arg0 - Результат атаки: 0 - критический промах, 1 - промах, 2 - попадание, 3 - критическое попадание (см. ROLL_* константы в condtion.h)
Critter arg1 - Атакующий
Critter arg2 - Атакуемая цель
int arg3 - Атакуемая часть тела (см. константы BODY_HIT_*)
int arg4 - Шанс попадания
int ret0 - Переопределяет результат попадание/промах
int ret1 - Переопределяет атакуемая часть тела (не рекомендуется, сделайте это лучше в HOOK_COMBATATTACK)
Critter ret2 - Переопределяет цель атаки (не рекомендуется)
HOOK_CALCAPCOST (hs_calcapcost.int)Запускается всякий раз, когда игра рассчитывает стоимость AP при использовании предмета (оружия или невооруженной атаки). Не запускается для расчета очков передвижения.
Обратите внимание, что при первой загрузке игры, этот крючек не запускается до того, как будет отрисован интерфейс, поэтому, если ваш скрипт влияет на стоимость AP, к тому что в текущий момент находится в руках у игрока, на интерфейсе будет отображена неправильная стоимость AP, это будет исправлено только при следующей перерисовке интерфейса.
Critter arg0 - Криттер, выполняющий действие
int arg1 - Тип атаки (см. константы ATKTYPE_*)
int arg2 - Является ли атака прицельной (1 или 0)
int arg3 - Нормальная стоимость AP (значение по умолчанию для игры)
Item arg4 - Предмет, для которого рассчитывается стоимость. Если это равно 0, то в этом случае указатель на предмет может быть получен значением "Тип атаки", указывающим на слот, содержащий предмет
int ret0 - Новая стоимость AP
Вы можете получить предмет оружия, проверив слот предмета по типу атаки (ATKTYPE_LWEP1, ATKTYPE_LWEP2 и т.д.), а затем использовав функцию critter_inven_obj.
HOOK_DEATHANIM1 (hs_deathanim1.int)Запускается до того, как игра попытается вычислить анимацию смерти для криттера. Позволяет вам изменить, какое оружие будет использоваться в вычислении.
Это не будет запускаться для криттеров в состоянии нокдауна (knockdown) или нокаута (knockout).
int arg0 - Идентификатор оружия (PID), выполняющий атаку. (Может быть равно -1, если атака является безоружной)
Critter arg1 - Атакующий криттер
Critter arg2 - Атакуемый криттер (цель)
int arg3 - Количество полученных повреждений криттера (цели)
int arg4 - Не используется, всегда -1. Используйте это, если вы используете одну и туже процедуру для HOOK_DEATHANIM1 и HOOK_DEATHANIM2 (только с sfall 4.1/3.8.24)
int ret0 - Идентификатор предмета для переопределения атакующего оружия
HOOK_DEATHANIM2 (hs_deathanim2.int)Запускается после того, как игра рассчитает анимацию смерти для криттера. Позволяет вам установить другой идентификатор фрейма для анимации, этот крючек является более мощным, чем HOOK_DEATHANIM1, но не выполняет проверки.
При использовании функции critter_dmg этот крючек также будет запущен. В этом случае PID оружия будет равен -1, а атакующий будет указывать на объект с FID равный obj_art_fid == 0x20001F5.
Это не будет запускаться для криттеров в состоянии нокдауна (knockdown) или нокаута (knockout).
Item arg0 - Идентификатор оружия (PID), выполняющий атаку. (Может быть равно -1, если атака является безоружной)
Critter arg1 - Атакующий
Critter arg2 - Атакуемый криттер (цель)
int arg3 - Количество полученных повреждений криттера (цели)
int arg4 - Идентификатор анимации смерти, вычисленный игрой
int ret0 - Новый идентификатор анимации смерти
HOOK_COMBATDAMAGE (hs_combatdamage.int)Запускается когда:
1) Игра рассчитывает, сколько урона получит каждая цель. Сюда входит и основная цель, а также все дополнительные (от взрывов и очереди). Это происходит ДО фактической анимации атаки.
2) AI проверяет может ли он нанести урон дружественным криттерам, т.е. безопасно ли использовать атаку по площади (очереди и взрывы).
Это не работает при промахах или не боевых повреждениях таких как взрывы от динамита.
ВНИМАНИЕ: Если вы хотите воссоздать весь алгоритм непосредственно в вашем скрипте (см. оригинальную реализацию в gl_compute_damage.ssl), то в этом случае вы потеряете некоторые sfall модификаторы, и его моды влияющие на расчеты в данном алгоритме.
Critter arg0 - Цель
Critter arg1 - Атакующий
int arg2 - Количество повреждений, нанесенных цели
int arg3 - Количество повреждений, нанесенных атакующему
int arg4 - Флаги специальных эффектов для цели (используйте bwand DAM_* для проверки флагов)
int arg5 - Флаги специальных эффектов для атакующего (используйте bwand DAM_* для проверки флагов)
int arg6 - Оружие, использованное при атаки
int arg7 - Часть тела (bodypart), которая была атакована
int arg8 - Множитель урона. Обычно это значение 2 (это значение делится на 2, поэтому значение 3 наносит 1.5-кратный урон, а 8 нанесет 4х кратный урон. Для критических попаданий значение берется из таблицы критических попаданий, а с перком "Тихая смерть" (Silent Death) и соответствующими условиями атаки, значение будет удвоено)
int arg9 - Количество пуль, фактически попавших в цель (1 для атак ближнего боя)
int arg10 - Значение отбрасывания (knockback) для цели (т.е. сила эффекта отбрасывания)
int arg11 - Тип атаки (см. константы ATKTYPE_*)
mixed arg12 - Данные атаки (см. C_ATTACK_* для смещений и используйте функции get/set_object_data для получения и установки данных)
int ret0 - Урон для цели
int ret1 - Урон для нападающего
int ret2 - Флаги специальных эффектов для цели
int ret3 - Флаги специальных эффектов для атакующего
int ret4 - Значение отбрасывания для цели
HOOK_SUBCOMBATDAMAGE (hs_subcombatdmg.int)Этот крючок может заменить оригинальную формулу расчета урона на свою реализацию.
Запускается когда:
1) После того как игра рассчитает, сколько урона получит цель (также запускается для всех дополнительных целей от взрывов и выстрелов очередей).
2) AI проверяет может ли он нанести урон дружественным криттерам, т.е. безопасно ли использовать атаку по площади (очереди и взрывы).
Не работает для промахов, и не боевых повреждений, таких как взрывы динамита (или если в ddraw.ini выбрана одна из формул повреждений - действительно до sfall 5.0.4).
Critter arg0 - Атакующий
Critter arg1 - Цель
Item arg2 - Оружие, использованное при атаке
int arg3 - тип атаки (см. константы ATKTYPE_*)
int arg4 - Количество пуль, фактически попавших в цель или 1 для атак ближнего боя (melee)
int arg5 - Значение сопротивления урону (DR) цели (на это влияют эффекты критического удара, преимущества, черты характера и специальные атаки без оружия)
int arg6 - Значение порога повреждения (DT) цели (на это влияют эффекты критического удара, преимущества, характеристики и специальные атаки без оружия)
int arg7 - Бонусный урон от перка "Bonus Ranged Damage"
int arg8 - Множитель урона, обычно это 2 (урон делится на 2, поэтому значение 3 наносит х1.5 кратный урон, а 8 - 4-х кратный.
Для критических попаданий значение берется из таблицы критических попаданий. С перком "Тихая смерть" (Silent Death) и соответствующими условиями атаки, значение будет удвоено)
int arg9 - Множитель сложности боя (125 - сложный, 100 - нормальный, 75 - легкий, для игрока или его партийцев значение всегда 100)
int arg10 - Рассчитанное оригинальной формулой игры количество повреждений которые будут нанесены цели
mixed arg11 - Данные атаки (см. C_ATTACK_* для смещений и используйте функции get/set_object_data для получения и установки данных)
int ret0 - Возвращаемая сумма урона
HOOK_ONDEATH (hs_ondeath.int)Запускается сразу после смерти криттера по любой причине.
Возвращаемые значения отсутствуют. Этот крючек удобен, когда вам нужно сделать что-то после смерти для большого количества различных криттеров и вы не хотите писать сценарий для каждого из них.
Critter arg0 - Криттер, который только что умер
HOOK_FINDTARGET (hs_findtarget.int)Запускается, когда AI пытается выбрать цель в бою.
Fallout сначала выбирает список из 4 возможных целей, затем сортирует их в порядке слабости/расстояния и т.п. в зависимости от настроек AI атакующего в AI.txt.
Этот крючек заменяет функцию сортировки, и позволяя вам сортировать цели произвольным образом, или же предоставить новые цели.
Возвращаемые значения могут включать криттеры, которых не было в списке возможных целей, но дополнительные цели могут быть отброшены позже в ходе боя, если они находятся вне зоны восприятия атакующего или шанс успешного попадания слишком мал.
Список возможных целей часто содержит дублирующие цели (исправлено в sfall 4.2.3/3.8.23).
Используйте set_sfall_return, чтобы указать 4 цели, в порядке предпочтения. Если вы хотите указать менее 4 целей, заполните лишние пробелы 0 или передайте -1, чтобы пропустить возвращаемое значение.
Fallout может выбирать цели по следующим критериям:
ПРИМЕЧАНИЕ: С улучшеным поведением AI, цели выбираются иначе.
Critter arg0 - Атакующий
Critter arg1 - Первая возможная цель
Critter arg2 - Вторая возможная цель
Critter arg3 - Третья возможная цель
Critter arg4 - Четвертая возможная цель
Critter ret0 - Первая выбранная цель
Critter ret1 - Вторая выбранная цель
Critter ret2 - Третья выбранная цель
Critter ret3 - Четвертая выбранная цель
HOOK_USEOBJON (hs_useobjon.int)Запускается когда:
1) Игрок/криттер использует предмет на другом криттере (или на себе).
2) Игрок использует предмет из экрана инвентаря И у этого предмета не установлен флаг действия Use, и это не активный предмет вспышки (flare) или взрывчатки.
3) Игрок или AI употребляет любой наркотик (drug).
Это происходит перед использованием объекта, и выполняются соответствующие процедуры скрипта use_obj_on.
Вы можете изменить поведение предметов по умолчанию.
ПРИМЕЧАНИЕ: Вы не можете удалить и/или уничтожить этот объект/предмет во время выполнения хук-скрипта (иначе игра потерпит крах). Чтобы удалить предмет, верните значение 1.
Critter arg0 - Криттер на котором используют предмет (цель)
Critter arg1 - Криттер используемый предмет
Item arg2 - Используемый предмет
int ret0 - Переопределяет обработчик, и выбирает, что должно произойти с предметом: 0 - поместить обратно, 1 - удалить, -1 - использовать обработчик по умолчанию
HOOK_USEOBJ (hs_useobj.int)Запускается когда:
1) Игрок/криттер использует предмет из инвентаря, у которого установлен флаг действия Use, или это активный предмет вспышки (flare) или взрывчатки.
2) Игрок использует предмет из основного интерфейса.
Это происходит перед использованием объекта, и выполняются соответствующие процедуры скрипта use_obj.
Вы можете изменить поведение предметов по умолчанию.
ПРИМЕЧАНИЕ: Вы не можете удалить и/или уничтожить этот объект/предмет во время выполнения хук-скрипта (иначе игра потерпит крах). Чтобы удалить предмет, верните значение 1.
Critter arg0 - Криттер на котором используется предмет (цель)
Item arg1 - Используемый предмет
int ret0 - Переопределяет обработчик, и выбирает, что должно произойти с предметом: 0 - поместить обратно, 1 - удалить, 2 - выбросить на карту, -1 - использовать обработчик по умолчанию
HOOK_REMOVEINVENOBJ (hs_removeinvenobj.int)Запускается, когда объект перемещается/удаляется из контейнера или инвентаря криттера по любой причине.
Object arg0 - Владелец, у которого удаляется объект
Item arg1 - Предмет, который удаляется
int arg2 - Количество предметов для удаления
int arg3 - Причина удаления объекта (см. константы RMOBJ_*)
Object arg4 - Объект назначения при перемещении предмета в другой объект, 0 в противном случае
HOOK_ITEMCOST (hs_itemcost.int)Запускается каждый раз при запросе стоимости предмета, например в режиме бартера.
int arg0 - Тип предмета
Item arg1 - Указатель на предмет
int arg2 - Базовая стоимость предмета (без каких либо модификаторов)
int arg3 - Общая стоимость для предмета, если предмет является типом:
оружие с заряженными патронами - это будет включать стоимость имеющихся патронов,
контейнером - это будет включать стоимость всех предметов содержащихся в контейнере,
патронами - это будет содержать рассчитанную стоимость для неполной упаковки патронов,
для других типов это значение будет эквивалентно базовой стоимости предмета
int ret0 - Новая общая стоимость предмета
HOOK_BARTERPRICE (hs_barterprice.int)Запускается всякий раз, когда рассчитывается стоимость приобретаемых товаров.
ПРИМЕЧАНИЕ: Крючок выполняется дважды при входе в экран бартера или после транзакции: первый раз - для игрока, второй - для NPC.
Critter arg0 - NPC, осуществляющей обмен (обычно это dude_obj, либо inven_dude)
Critter arg1 - NPC, с которым совершается бартер
int arg2 - Вычисленная стоимость товара по умолчанию
Critter arg3 - Указатель на инвентарь (стек) с покупаемым товаром у NPC
int arg4 - Фактическое количество монет/крышек в бартерном стеке
int arg5 - Стоимость всех покупаемых товаров (без модификации от навыков)
Critter arg6 - Указатель на инвентарь продаваемых игроком товаров
int arg7 - Стоимость всех товаров, продаваемых игроком (без модификации от навыков)
int arg8 - 1, если кнопка "Продажа" была нажата (не для бартера с партийцем), 0 в противном случае
int arg9 - 1, если бартер ведется с партийцем, 0 в противном случае
int ret0 - Измененная стоимость всех покупаемых товаров (передайте -1, если вы хотите изменить только стоимость продаваемых товаров)
int ret1 - Измененная стоимость всех продаваемые товаров
HOOK_MOVECOST (hs_movecost.int)Запускается при расчете стоимости AP для передвижения.
Critter arg0 - Криттер, выполняющий перемещение
int arg1 - Количество перемещаемых гексов
int arg2 - Стоимость AP за 1 гекс перемещения
int ret0 - Новая стоимость AP
HOOK_HEXMOVEBLOCKING (hs_hexmoveblocking.int)HOOK_HEXAIBLOCKING (hs_hexaiblocking.int)HOOK_HEXSHOOTBLOCKING (hs_hexshootblocking.int)HOOK_HEXSIGHTBLOCKING (hs_hexsightblocking.int)Запускаются, когда проверяется не блокирует ли гекс, например в ситуациях при движение, или при проверки линии выстрела.
ВНИМАНИЕ: Скрипты HOOK_HEXMOVEBLOCKING и HOOK_HEXSHOOTBLOCKING, могут сильно нагружать игру, и вам следует избегать их использование.
По этой причине крючки HOOK_HEXMOVEBLOCKING и HOOK_HEXSHOOTBLOCKING в полном объеме не поддерживаются кодом в sfall.
Если вы хотите проверить, заблокирована ли какая-то плитка или путь, используйте функции: obj_blocking_tile, obj_blocking_line, path_find_to.
Если вы хотите, чтобы скрипт вызывался каждый раз, когда NPC перемещается на новый гекс в бою, используйте крючек HOOK_MOVECOST.
Critter arg0 - Криттер, выполняющей перемещение/проверку
int arg1 - Номер проверяемого гекса
int arg2 - проверяемый уровень карты
int arg3 - 1, если проверяемый гекс блокируется
Object ret0 - Передайте 0, чтобы указать что гекс не блокируется, или любой указатель на объект, для блокировки
HOOK_ITEMDAMAGE (hs_itemdamage.int)Запускается при получении рейтинга урона используемого оружия для совершенной атаки. Это могут быть и безоружные атаки.
ВНИМАНИЕ: Используйте функцию set_sfall_arg(6, myCalcDmg) для согласования нового рейтинга урона с другими скриптами крючка.
int arg0 - Минимальный урон (для MELEE/UNARMED включает бонус от перка PERK_bonus_hth_damage)
int arg1 - Максимальный урон (для рукопашной атаки включает бонус от STAT_melee_dmg атакующего)
Item arg2 - Использованное оружие, или 0 для рукопашной атаки
Critter arg3 - Атакующий совершающий атаку
int arg4 - Тип атаки (см. константы ATKTYPE_*)
int arg5 - Значение STAT_melee_dmg атакующего, если это рукопашная атака или использовано оружие ближнего боя (MELEE/UNARMED), иначе это 0
int arg6 - Значение рейтинга урона на основе броска кубика рассчитанное игрой
int ret0 - Новый минимальный урон, или новый рейтинг урона рассчитанный вами (если значение для 'ret1' не задается)
int ret1 - Новый максимальный урон (игра произведет расчет рейтинга урона на основе возвращенных min/max значений)
HOOK_DISPLAYDAMAGE (hs_displaydamage.int)Запускается при статистическом расчете минимального и максимального урона, например при отображении урона для экипированного оружия или рукопашных атак в инвентаре игрока, и при получении значений с помощью скриптовых функций get_weapon_damage и get_attack_damage.
Critter arg0 - Критттер для которого рассчитывается урон (обычно это dude_obj)
Item arg1 - Экипированное оружие, или 0 для рукопашной атаки
int arg2 - Тип атаки (см. константы ATKTYPE_*)
int arg3 - Минимальный урон (для MELEE/UNARMED включает бонус от перка PERK_bonus_hth_damage)
int arg4 - Максимальный урон (для рукопашной атаки включает бонус от STAT_melee_dmg криттера)
int ret0 - Новый минимальный урон
int ret1 - Новый максимальный урон
HOOK_AMMOCOST (hs_ammocost.int)Запускается при расчете стоимости патронов для оружия. Это не влияет на нанесенный урон, только на количество расходуемых патронов.
По умолчанию в игре независимо от расчета стоимости боеприпасов оружие может совершать атаки, если остался хотя бы один патрон.
ВНИМАНИЕ: Если текущее количество патронов/зарядов в оружии не хватает для выстрела, то нанесенные повреждения будут уменьшены
по формуле dmg * (currentAmmo / reqAmmo), это правило не действует на оружие которое использует тип атаки очередью.
Item arg0 - Используемое оружие
int arg1 - Используемое количество пуль в очереди, или 1 для одиночных выстрелов
int arg2 - Стоимость патронов, количество расходуемых патронов рассчитываемое по оригинальной функции (обычно это 2 для "Super Cattle Prod" и "Mega Power Fist")
ПРИМЕЧАНИЕ: для 2-го типа крючка, это значение является стоимостью патрона за очередь (по умолчанию всегда 1)
int arg3 - Тип события крючка:
0 - при расчете стоимости боеприпаса для вычитания патронов при атаке одиночного выстрела
1 - при проверке текущего количества боеприпасов в оружии "out of ammo" до совершения атаки (начиная с sfall 5.0.9 только для атак очередью)
2 - при расчете количества патронов в очереди в зависимости от стоимости боеприпаса
3 - при расчете стоимости боеприпаса для вычитания патронов при атаке очередью
int ret0 - Новое количество расходуемых патронов, или стоимость патрона за очередь для крючка типа 2 (передайте 0 для неограниченного количества патронов)
HOOK_KEYPRESS (hs_keypress.int)Запускается каждый раз, когда любая клавиша была нажата или отпущена.
ВНИМАНИЕ: Если вы хотите переопределить клавишу на другую, то новый DX сканкод клавиши должен быть одинаковым для событий нажатия и отпускания.
int arg0 - Тип события: 1 - нажата (pressed), 0 - отпущена (released)
int arg1 - DX сканкод клавиши
int arg2 - VK код клавиши (очень похожи на ASCII коды)
int ret0 - Передайте новый DX сканкод клавиши чтобы переопределить нажатую клавишу (0 если переопределять не требуется), или -1 для отмены события
HOOK_MOUSECLICK (hs_mouseclick.int)Запускается каждый раз, когда кнопка мыши была нажата или отпущена.
int arg0 - Тип события: 1 - нажата (pressed), 0 - отпущена (released)
int arg1 - Номер кнопки (0 - левая, 1 - правая, до 7)
HOOK_MOUSEWHEEL (hs_mousewheel.int)Запускается каждый раз, когда колесо мыши было прокручено вверх или вниз.
ВНИМАНИЕ: Для запуска крючка опция UseScrollWheel в ddraw.ini должна быть включена.
int arg0 - Количество прокрученных позиций колеса, где положительное значение вверх, отрицательное вниз
HOOK_USESKILL (hs_useskill.int)Запускается при использовании любого умения на любом объекте. Не запускается при взломе замков.
Это действие происходит до вызова обработчиков по умолчанию, которые вы можете переопределить.
В этом случае вы должны полностью написать свой собственный обработчик использования навыка, иначе ничего не произойдет (это должно включать в себя затухание и восстановление экрана, задержку времени и сообщения - все это может быть заскриптовано. Для получения ванильных текстовых сообщений используйте message_str_game вместе с sprintf).
Предлагаемое использование: Переопределение навыков первой помощи или врача, чтобы изменить их поведение, переопределение навыка воровства, чтобы например запретить осмотр инвентаря NPC в некоторых случаях.
Critter arg0 - Криттер который использует умение
Object arg1 - Целевой объект на котором используют
int arg2 - Номер используемого навыка
int arg3 - Бонус к навыку от таких предметов, как например аптечки первой помощи
Item arg4 - Используемый предмет, или 0 если применяется только умение
int ret0 - Переопределяет обработчик: -1 - использовать обработчик движка Fallout, любое другое значение - переопределяет алгоритм на собственный (при значение 0 использованный предмет будет удален с вероятностью в 10%)
HOOK_STEAL (hs_steal.int)Запускается при проверки попытки украсть или подложить предмет в инвентарь NPC с помощью умения Steal.
Это действие происходит до вызова обработчиков по умолчанию, которые вы можете переопределить.
В этом случае вы ДОЛЖНЫ предоставить игроку сообщение о результате: “Вы украли %s”, “Вас поймали за попытку подложить %s” и т.д.
Пример сообщения (ванильная реализация):display_msg(sprintf(mstr_skill(570 + (isSuccess != false) + arg3 * 2), obj_name(arg2)));
Critter arg0 - Вор (обычно это игрок)
Object arg1 - Цель
Item arg2 - Предмет который пытаются украсть или подложить
int arg3 - 0 при краже, 1 при подкладывании
int arg4 - Количество перемещаемых предметов
int ret0 - Переопределяет обработчик: 0 - принудительная не удача, 1 - успех, 2 - не удача (без закрытия интерфейса), -1 - использовать обработчик движка Fallout
HOOK_WITHINPERCEPTION (hs_withinperception.int)Запускается при проверке того, видит ли один криттер другого криттера. Это используется в различных ситуациях, таких как боевой AI.
Результат этой проверки можно переопределить.
ПРИМЕЧАНИЕ: Функция obj_can_see_obj в первую очередь вызывает этот крючек, когда решает, может ли существо видеть другое существо с точки зрения восприятия, освещения и других факторов.
Если проверка завершается неудачей, конечный результат будет ложным (0). Если проверка проходит успешно (например, тварь находится в пределах досягаемости восприятия), выполняется еще одна проверка, имеется ли какая-либо блокирующая плитка между двумя тварями (которая включает в себя такие вещи, как окна, большие кусты, бочки и т.д.), и если есть - проверка по-прежнему не выполняется.
Вы можете переопределить проверку “в пределах восприятия”, вернув 0 или 1, или вы можете переопределить проверку блокировки “прямой видимости” (после проверки восприятия), вернув значение 2, но в этом случае вам следует добавить проверку “прямой видимости” в свой скрипт, иначе криттеры будут видеть через стены и другие блокирующие объекты.
Крючек выполняется после того, как расчет по умолчанию был сделан.
Critter arg0 - Объект наблюдателя
Object arg1 - Целевой объект (обычно это криттер)
int arg2 - Результат проверки функции: 1 - в пределах диапазона восприятия, 0 - в противном случае
int arg3 - Тип крючка:
1 - при вызове из скриптовой функции obj_can_see_obj
2 - при вызове из скриптовой функции obj_can_hear_obj (необходимо установить ObjCanHearObjFix в ddraw.ini)
3 - когда AI определяет, видит ли он потенциальную цель при выборе целей для атаки
4 - событие "notify friends" происходит, когда криттер-наблюдатель проверяет видит ли он дружественного криттера для присоединения к бою
10 - когда наблюдатель (игрок или его напарники) пытается увидеть объект в режиме "Туман войны" (только для встроенного HRP)
0 - все остальные случаи
int ret0 - Переопределяет возвращаемый результат функции:
0 - не в пределах восприятия (не может видеть)
1 - в пределах восприятия (может видеть, если линия обзора не заблокирована)
2 - принудительное обнаружение (используется только в скриптовой функции obj_can_see_obj, которая вызывается для каждого криттера в игре)
HOOK_INVENTORYMOVE (hs_inventorymove.int)Запускается перед перемещением предметов между слотами инвентаря в интерфейсе игрока. Вы можете переопределить это действие.
Что вы НЕ можете сделать с помощью этого крючка:
Что вы можете сделать:
int arg0 - Целевой слот:
0 - основной рюкзак
1 - слот левой руки
2 - слот правой руки
3 - слот брони
4 - оружие, при перезарядке его путем сброса патронов
5 - контейнер, например сумка/рюкзак
6 - действие выбрасывание предмета на карту (выполняется из любого инвентаря игрока)
7 - поднятие предмета с карты (перемещение предмета в инвентарь игрока)
8 - сбрасывание/перемещение предмета на портрет персонажа игрока
Item arg1 - Перемещаемый предмет.
Item arg2 - Заменяемый предмет (перезаряжаемое оружие или заполняемый контейнер), это также может быть равно 0
int ret0 - Переопределение: -1 - использовать поведение движка игры, любое другое значение - запретит перемещение предмета, перезарядку оружия или подбор/выбрасывание предмета
Примечания для события выбрасывания предмета из инвентаря на карту:
get_weapon_ammo_countPID_BOTTLE_CAPS событие вызывается только один раз, при этом узнать количество выбрасываемых единиц можно в значении поля предмета OBJ_DATA_CUR_CHARGES (или функцией get_weapon_ammo_count)HOOK_INVENWIELD (hs_invenwield.int)Запускается перед тем, как заставить криттера или игрока надеть/снять (wield/unwield) броню или оружие (кроме случаев использования инвентаря игрока).
Примером использования может быть изменение FID криттера в зависимости от используемой брони или динамической настройка анимации оружия.
NOTE: При замене ранее одетых доспехов или оружия, крючек unwielding не выполняется.
Если вам нужно полагаться на это, попробуйте проверить, экипирована ли уже броня/оружие, когда выполняется wielding крючек.
Critter arg0 - Криттер
Item arg1 - Снимаемый или экипируемый предмет (оружие/броня)
int arg2 - Слот (INVEN_TYPE_*)
int arg3 - 1 - при экипировки (wielding), 0 - при снятии (unwielding)
int arg4 - 1 - если происходит удаление/перемещение экипированного предмета из инвентаря, 0 в противном случае
int ret0 - Переопределяет игровой обработчик: -1 - использовать обработчик движка, любое другое значение переопределяет действие (НЕ РЕКОМЕНДУЕТСЯ)
HOOK_ADJUSTFID (hs_adjustfid.int)Запускается после расчета FID для персонажа в интерфейсе инвентаря, всякий раз, когда игра решает, что внешность персонажа может измениться.
Это также происходит и в других интерфейсах, например, в бартере.
ПРИМЕЧАНИЕ: FID имеет следующий формат: 0x0ABBCDDD, где: A - тип объекта, BB - код анимации (в данном случае всегда 0), C - код оружия, DDD - Индекс FRM в .LST файле.
int arg0 - Изначальный FID, рассчитываемый движком в соответствии с базовым FID криттера и используемой броней и оружием
int arg1 - Модифицированный FID, рассчитанный внутренним кодом sfall (например, Hero Appearance Mod)
int ret0 - Переопределяет рассчитанный FID предоставленным значением
HOOK_COMBATTURN (hs_combatturn.int)Запускается до и после каждого хода в бою (как для PC, так и для NPC).
int arg0 - Тип события:
1 - начало хода криттера (begin turn)
2 - перед началом совершения криттером атаки (start turn)
0 - нормальное завершение текущего хода криттера (end turn)
-1 - бой заканчивается внезапно (по сценарию или при нажатии Enter во время хода игрока)
-2 - бой заканчивается нормально (всегда запускается в конце боя)
Critter arg1 - Криттер, выполняющий ход
int arg2 - Устанавливается в 1, в начале хода игрока, когда бой уже был инициирован (например, после загрузки игры сохраненной в боевом режиме)
int arg3 - Значение Override скрипта криттера, устанавливается в событии 2, если в обработчике combat_p_proc, была вызвана функция script_overrides
int arg4 - Текущий счетчик количества сделанных оборотов боя (turn cycles)
int ret0 - Передайте значение 1 в начале хода или атаки, чтобы пропустить ход, передайте -1 в начале хода, чтобы пропустить выполнение следующих событий,
или -1 в конце хода, чтобы принудительно завершить бой
HOOK_CARTRAVEL (hs_cartravel.int)Выполняется непрерывно во время путешествия по карте мира на автомобиле.
int arg0 - Скорость автомобиля (от 3 до 8 "шагов")
int arg1 - Фактический расход топлива для текущей скорости автомобиля (значение от 100 и ниже, полное значение заряда 80000 ед.)
int ret0 - Переопределяет скорость автомобиля (передайте -1, если вы просто хотите переопределить расход топлива)
int ret1 - Переопределение расхода топлива
HOOK_SETGLOBALVAR (hs_setglobalvar.int)Запускается при установке значения глобальной переменной.
int arg0 - Номер (индекс) устанавливаемой глобальной переменной
int arg1 - Устанавливаемое значение глобальной переменной
int ret0 - Переопределяет устанавливаемое значение глобальной переменной
HOOK_SETRESTTIMER (hs_setresttimer.int)Выполняется один раз перед тем как игрок начинает отдыхать с помошью будильника в интерфейсе Pipboy.
Вы можете переопределить время продолжительности отдыха.
ВНИМАНИЕ: Не запускается при выборе опций “Отдыхать до выздоровления” или “Отдыхать до выздоровления всей группы”.
int arg0 - Выбранная линия опции времени отдыха в Pipboy (отсчет с нуля)
int arg1 - Часовая продолжительность времени отдыха
int arg2 - Минутная продолжительность времени отдыха
int ret0 - Переопределение значения часов отдыха, или -1 для пропуска возвращаемого аргумента
int ret1 - Переопределение значения минут отдыха
HOOK_RESTTIMER (hs_resttimer.int)Выполняется непрерывно, пока игрок отдыхает с помошью будильника в интерфейсе Pipboy.
int arg0 - Время игры в тиках, которое будет установлено после выполнения крючка
int arg1 - Тип события: 1 - когда отдых по таймеру заканчивается (нормально), -1 - прерывание таймера отдыха при нажатии клавиши ESC, 0 - в противном случае
int arg2 - Часовая часть продолжительности времени отдыха
int arg3 - Минутная часть продолжительности времени отдыха
int ret0 - Передайте 1 для прерывания таймера отдыха, или 0 для продолжения отдыха, если таймер был прерван нажатием клавиши ESC
HOOK_GAMEMODECHANGE (hs_gamemodechange.int)Запускается каждый раз, когда режим игры был изменен, например, открытие/закрытие инвентаря, интерфейса персонажа, пип-боя и т.д.
int arg0 - Тип события: 1 - когда игрок выходит из игры в главное меню,
2 - когда происходит сброс состояния игры (при выходе в главное меню или загрузки сохраненной игры),
0 - в противном случае
int arg1 - Предыдущий режим игры (текущий можно узнать функцией get_game_mode)
HOOK_MAPUSEOBJECT (hs_mapuseobject.int)Запускается перед использованием объекта типа Scenery или Container на карте, или когда криттер хочет подобрать предмет расположенный на карте.
Обработчик будет срабатывать непосредственно перед анимацией ходьбы или бега, если криттер находится на расстоянии от объекта.
Critter arg0 - Криттер, который использует объект
Object arg1 - Используемый объект карты
int ret0 - Переопределяет объект карты
HOOK_USEANIMOBJ (hs_useanimobj.int)Запускается перед тем как зарегистрировать и воспроизвести анимацию использования use (обычно это magic hands), когда криттер подбирает предметы или использует объекты Scenery или Container на карте.
Обработчик будет срабатывать непосредственно перед анимацией ходьбы или бега, если криттер находится на расстоянии от объекта.
Critter arg0 - Криттер, который использует объект (обычно это dude_obj)
Object arg1 - Используемый объект
int arg2 - Код анимации использования (см. ANIM_* в animcomd.h)
int ret0 - Переопределяет код анимации (передайте -1, если хотите пропустить регистрацию анимации)
HOOK_EXPLOSIVETIMER (hs_explosivetimer.int)Запускается после установки таймера взрыва. Вы можете переопределить результат установки.
int arg0 - Установленное время в тиках для таймера
Object arg1 - Предмет взрывчатки
int arg2 - Результат расчета игры успешности установки таймера: 1 - неудача, 2 - успех (аналогично ROLL_* в condtion.h)
int ret0 - Переопределяет установленное время таймера (максимум 18000 тиков)
int ret1 - Переопределяет результат расчета: 0/1 - неудача, 2/3 - успех (аналогично ROLL_*), любое другое значение - использовать обработчик игры
HOOK_DESCRIPTIONOBJ (hs_descriptionobj.int)Запускается при использовании иконки действия “Изучить” для отображения описания объекта. Вы можете переопределить текст описания.
Примером использования может быть добавление дополнительного описания к предмету на основе статов/навыков игрока.
ВНИМАНИЕ: Не запускается, если скрипт объекта переопределяет описание.
Object arg0 - Объект который осматривается
string ret0 - Новый текст описания (или указатель на текст полученный с помощью функции get_string_pointer)
HOOK_USESKILLON (hs_useskillon.int)Запускается перед использованием любого умения (skill) на любом объекте. Позволяет вам переопределить криттера, использующий навык.
ПРИМЕЧАНИЕ: При переопределении, движковая реализация алгоритма выбора партийца будет опущена. Криттер не может быть переопределен при использовании навыка кражи Steal.
Critter arg0 - Криттер использующий навык (обычно это dude_obj)
Object arg1 - Объект или криттер на который применяется умение
int arg2 - Номер применяемого умения
int ret0 - Новый криттер, использующий умение. Передайте значение -1, чтобы отменить использование навыка, передайте 0, чтобы пропустить это возвращаемое значение
int ret1 - Передайте значение 1, чтобы разрешить использование навыка в бою (только для dude_obj или криттера, управляемого игроком)
HOOK_ONEXPLOSION (hs_onexplosion.int)Запускается, когда игра проверяет гексы в радиусе взрыва (до того, как произойдет сам взрыв), на наличие дополнительных целей для поражения.
Проверка будет прервана при получении 6-ти целей типа Сritters.
int arg0 - Тип события: 1 - при проверке объектов в радиусе взрыва без нанесения им ущерба (например игрок сбрасывает активную взрывчатку), 0 - иначе
Object arg1 - Объект/криттер, который произвел атаку (в случае взрыва динамита здесь будет сам объект взрыва)
int arg2 - Гекс на котором произошел основной взрыв
int arg3 - Проверяемый гекс в радиусе взрыва
Object arg4 - Первый найденный объект типа Walls/Scenery/Critters на проверяемом гексе
Object arg5 - Объект/криттер который получит основное повреждение, это может быть 0 при промахе, или равно атакующему в случае установленного флага DAM_EXPLODE
int arg6 - Устанавливается в 1 при использовании метательного оружия (например гранаты), иначе 0
Object arg7 - Основная цель совершенной атаки (это отличается от аргумента #5)
int ret0 - Переопределяет найденный объект на гексе, передайте 0, чтобы пропустить цель (в качестве цели для поражения может быть выбран только криттер)
HOOK_SETLIGHTING (hs_setlighting.int)Запускается перед установкой уровня освещенности карты, или для объекта (делает объект способным излучать свет). Вы можете переопределить результат.
Object arg0 - Объект для которого устанавливается освещенность, или 0 при установке уровня освещенности карты
int arg1 - Интенсивность света
int arg2 - Радиус освещения, или -1 при установке уровня освещения для карты
int ret0 - Переопределяет интенсивность освещения. Диапазон интенсивности от 0 до 65536
int ret1 - Переопределяет радиус освещения. Диапазон радиуса от 0 до 8 (действительно только для объектов)
HOOK_SNEAK (hs_sneak.int)Запускается при активации навыка Sneak, или когда игра проводит очередную проверку “Красться” после того, как время действия текущей проверки закончилось.
Вы можете переопределить результат случайной проверки “Красться” или время действия текущего результата.
int arg0 - Результат Sneak проверки: 1 - успех, 0 - провал
int arg1 - Продолжительность в тиках для текущей проверки "Красться" (время зависит от уровня навыка Sneak)
Critter arg2 - Криттер (обычно это dude_obj)
int ret0 - Переопределяет результат проверки "Красться"
int ret1 - Переопределяет время продолжительности для текущего результата
HOOK_STDPROCEDURE, HOOK_STDPROCEDURE_END (hs_stdprocedure.int)Запускается до или после того, как движок Fallout выполнит стандартную процедуру (обработчик) в скрипте объектов.
ПРИМЕЧАНИЕ: Этот крючок не будет выполняться для start, critter_p_proc, timed_event_p_proc, и map_update_p_proc процедур.
int arg0 - Номер стандартного обработчика сценариев (см. определение процедур в define.h)
Object arg1 - Объект, которому принадлежит этот обработчик (self_obj)
Object arg2 - Объект, вызвавший этот обработчик source_obj, это может быть 0
int arg3 - 1 всегда после выполнения процедуры для HOOK_STDPROCEDURE_END, 0 в противном случае
Object arg4 - Цель объекта данного вызова (target_obj), это также может быть идентично с self_obj
int arg5 - Значение (fixed_param) данного скрипта, полезно для combat_p_proc
int arg6 - Значение 1 указывает, что скриптом вызвана функция script_overrides для переопределения стандартного поведения движка (только для HOOK_STDPROCEDURE_END)
int ret0 - Передайте -1, для отмены выполнения скриптового обработчика (только для HOOK_STDPROCEDURE)
HOOK_TARGETOBJECT (hs_targetobject.int)Запускается при наведении курсора на объект или при попытке игрока атаковать объект.
Вы можете переопределить целевой объект или запретить игроку атаковать выбранную цель.
ПРИМЕЧАНИЕ: Если вы не возвращаете предопределенный объект при выполнении атаки (тип события 1), то действительный объект будет взят при наведении курсора (тип события 0)
но только в том случае, если в событии 0 было осуществленно переопределение объекта (данное поведение может быть удалено в следующих версиях sfall).
int arg0 - Тип события: 0 - при наведении курсора на объект, 1 - при попытке атаковать целевой объект
int arg1 - Значение 1 если целевой объект действителен для атаки, 0 в противном случае
Object arg2 - Целевой объект
Object ret0 - Переопределяет целевой объект, или используйте значение -1, чтобы запретить атаковать данный объект
HOOK_ENCOUNTER (hs_encounter.int)Запускается всякий раз, когда происходит случайное столкновение (за исключением встречи с Horrigan, и скриптовых столкновений), а также когда игрок переходит на локальную карту с карты мира.
Вы можете переопределить карту для загрузки или столкновения.
int arg0 - Тип события: 0 - когда происходит случайная встреча, 1 - когда игрок входит с карты мира
int arg1 - Идентификатор карты, который будет загружен при столкновении (см. MAPS.h или Maps.txt)
int arg2 - Для особых встреч это устанавливается в 1, или 0 в противном случае
int arg3 - Номер таблицы встреч для случайной встречи, или -1 в противном случае
int arg4 - Индекс встречи в таблице, или -1, если случайной встречи нет
int ret0 - Переопределяет идентификатор карты, или передайте значение -1 (в событии типа 0), чтобы отменить встречу и продолжить путешествие
int ret1 - Передайте значение 1, чтобы отменить встречу и загрузить указанную карту из 'ret0' (только для события типа 0)
HOOK_ADJUSTPOISON (hs_adjustpoison.int)Запускается при изменении уровня яда у криттера или когда игрок получает урон от яда.
Critter arg0 - Криттер
int arg1 - Количество добавляемого/удаляемого яда
int arg2 - Значение урона яда, которое будет применено к эффекту от яда
(урон от эффекта яда реализован только для персонажа игрока и его партийцев, для обычных криттеров значение урона будет равно нулю)
int arg3 - Устанавливается в 1, когда крючек вызывается по таймерному событию при нанесении урона, иначе 0
int ret0 - Новое количество добавляемого/удаляемого яда
int ret1 - Новое значение урона (допускаются и отрицательные значения), передайте 0 чтобы перейти к след. аргументу
int ret2 - Время задержки в секундах для наступления (следующего) события эффекта/урона яда, значение задержки 0 отменяет событие
HOOK_ADJUSTRADS (hs_adjustrads.int)Запускается при изменении уровня радиации у криттера.
Critter arg0 - Криттер (обычно это dude_obj)
int arg1 - Количество добавляемого/удаляемого излучения
int ret0 - Новое значение добавляемого/удаляемого излучения
HOOK_ROLLCHECK (hs_rollcheck.int)Запускается, когда игровое событие выполняет случайный бросок “кубика” для проверки шансов на успех или неудачу.
int arg0 - Тип события:
1 - проверяет шанс (вероятность) попадания атаки в цель
2 - проверяет шанс попадания пули из очередей в любую цель (для атак очередью)
3 - проверяет шанс при использовании навыков (не перечисленных ниже)
4 - проверка шанса использования навыка ремонта "Repair"
5 - проверка шанса использования навыка доктора "Doctor"
6 - проверка шанса использования навыка кражи "Steal" для вора (обычно это игрок)
7 - вторая проверка шанса навыка кражи для цели, чтобы поймать вора, при которой неудача цели является результатом успеха вора
int arg1 - Значение результата броска (см. константы ROLL_*), которое вычисляется как:
- для ROLL_CRITICAL_SUCCESS: random(1, 100) <= (random_chance / 10) + bonus
- для ROLL_CRITICAL_FAILURE: random(1, 100) <= -random_chance / 10"
int arg2 - Значение шанса (chance)
int arg3 - Значение бонуса, используемое при проверке критического успеха
int arg4 - Случайный шанс, рассчитанный как: chance - random(1, 100), где отрицательное значение означает неудачную проверку (ROLL_FAILURE)
int ret0 - Переопределяет результат броска
HOOK_BESTWEAPON (hs_bestweapon.int)Запускается, во время поиска в инвентаре и выбора этого оружия, когда AI в бою решает какое оружие (из двух) является лучшим для экипировки.
Это также выполняется, когда игрок нажимает кнопку “Использовать лучшее оружие” в панели управления напарниками.
Critter arg0 - Криттер, который осуществляет поиск оружия
Item arg1 - Выбранное лучшее оружие (из двух предметов ниже)
Item arg2 - Первый предмет оружия (для оценки)
Item arg3 - Второй предмет оружия (для оценки)
Critter arg4 - Цель криттера при выборе оружия (может быть 0)
Item ret0 - Переопределяет выбранное лучшее оружие
HOOK_CANUSEWEAPON (hs_canuseweapon.int)Запускается, когда AI проверяет, может ли он использовать оружие, или когда игра проверяет, может ли игрок использовать предмет (оружие) в слоте руки.
Для AI это в основном происходит, когда NPC пытаются найти оружие в своем инвентаре или на карте.
Для игрока это происходит, когда игра обновляет данные о предмете в слоте активного предмета на панели интерфейса игрока.
Critter arg0 - Криттер, для которого выполняется проверка
Item arg1 - Проверяемый предмет
int arg2 - Тип атаки (см. константы ATKTYPE_*), или -1 для dude_obj
int arg3 - Исходный результат функции проверки: 1 - может использовать, 0 - нельзя использовать
int ret0 - Переопределяет исходный результат работы функции проверки (любое ненулевое значение позволяет использовать оружие)
HOOK_DRUGSEFFECT (hs_drugseffect.int)Запускается когда применяется эффекты от предмета типа Drugs.
Это последовательно срабатывает для первого мгновенного, второго и третьего отложенных эффектов, если они имеются.
Вы можете переопределить некоторые параметры применяемых эффектов.
Critter arg0 - Криттер, к которому применяется "Drugs" эффект
int arg1 - Номер PID применяемого предмета
int arg2 - Длительность времени в игровых тиках (с учетом модификатора трейта "Chem Resistant"), через которое примениться эффект (600 эквивалентно 1 игровой минуте),
если это значение равно 0, эффект применяется мгновенно, значение -1 означает, что исчерпан лимит использования (эффекты не будут применены)
int arg3 - stat0 характеристика эффекта (-1 - не используется)
int arg4 - amount0 значение эффекта
int arg5 - stat1
int arg6 - amount1
int arg7 - stat2
int arg8 - amount2
int arg9 - Номер перка зависимости (только для первого эффекта, иначе -1)
int arg10 - Процентный шанс получить зависимость (без учета модификаторов от трейтов "Chem Reliant", "Chem Resistant", "Flower Child")
int arg11 - Длительность времени в тиках (1 эквивалентно одной игровой минуте), через которое примениться эффект зависимости (только для первого эффекта, иначе -1)
int ret0 - Новое значение задержки применения эффекта, при мгновенном эффекте это значение для задержки применения эффекта зависимости (передайте -1, чтобы просто перейти к следующему параметру)
int ret1 - Новое значение шанса зависимости, передайте -1 чтобы просто перейти к следующему параметру (только для первого эффекта, иначе это не делает ничего)
int ret2 - Новое значение для stat0
int ret3 - Новое значение для amount0
int ret4 - Новое значение для stat1
int ret5 - Новое значение для amount1
int ret6 - новое значение для stat2
int ret7 - Новое значение для amount2
HOOK_ITEMWEIGHT (hs_itemweight.int)Запускается при получении веса предмета.
Item arg0 - Предмет
float arg1 - Значение веса предмета
int/float ret0 - Переопределенный вес
HOOK_TOTALWEIGHT (hs_totalweight.int)Запускается после вычисления веса всех имеющихся предметов в инвентаре объекта.
ВНИМАНИЕ: Будьте осторожны, при использовании скриптовых функций подсчета веса из крючка, возможно рекурсивное выполнение крючка для одного и того-же объекта.
Object arg0 - Объект для которого происходит вычисление
float arg1 - Подсчитанный общий вес всех предметов в инвентаре объекта (начиная с sfall v5.1.1 тип переменой изменена на Float)
int/float ret0 - Переопределенный подсчитанный вес
HOOK_INVENTORYPICK (hs_inventorypick.int)Запускается при взятии игроком/мышкой предмета из слота в любом из инвентаре.
ВНИМАНИЕ: Не рекомендуется проводить манипуляции со взятым предметом до его отпускания во избежания непредвиденных проблем в игре.
int arg0 - Событие: 1 - при взятие предмета, 0 - при сбрасывании предмета
Item arg1 - Предмет, который был взят игроком в инвентаре
Object arg2 - При взятии предмета, это содержит указатель на объект инвентаря из которого был взят предмет (узнать принадлежность предмета можно с помощью поля OBJ_DATA_OWNER)
При сбрасывании содержит указатель на объект инвентаря куда был сброшен предмет, это будет содержать 0, если предмет не был перемещен в другой инвентарь
int arg3 - Код слота инвентаря при взятии предмета: 0-99 слоты инвентаря игрока (50 - слот брони, 51/52 слот руки), 100-199 слоты NPC/Контейнера, 200-299 стол бартера игрока, 300-399 стол бартера NPC
HOOK_EXPLOSIONDAMAGE (hs_explosiondamage.int)Запускается каждый раз при расчете повреждений криттеру от взрыва взрывчатки (например такими как динамит), или от взрыва выполненный скриптовой функцией explosion.
ПРИМЕЧАНИЕ: Гекс на котором произошел взрыв, может быть взят из крючка HOOK_ONEXPLOSION.
Item arg0 - PID предмета взрывчатки, для скритового взрыва это равно нулю
Critter arg1 - Криттер, к которому принадлежал предмет взрывчатки, обычно это игрок или его партийцы (ноль для скритового взрыва)
Critter arg2 - Криттер, который получает повреждения
int arg3 - Минимальное значение повреждений наносимые взрывчаткой
int arg4 - Максимальное значение повреждений наносимые взрывчаткой
int arg5 - Дополнительный бонус к повреждению
int arg6 - Итоговое повреждение расчитанное игрой
int arg7 - Рассчитанное значение ударной волны от взрыва (Knockback)
int arg8 - Случайное повреждение расчитанное игрой в диапазоне минимального и максимального значения повреждений
int ret0 - Переопределенное итоговое значение повреждения (для пропуска передайте значение -1)
int ret1 - Переопределенное значение Knockback
HOOK_COMBATATTACK (hs_combatattack.int)Запускается каждый раз в начале и в конце совершенной атаки. Вы можете переопределить значения крючка только в начале атаки.
int arg0 - Тип события: 0 - начало атаки, 1 - конец текущей атаки (происходит после всех совершенных действий и анимаций)
Critter arg1 - Криттер, начавший атаку (атакующий)
Object arg2 - Атакующая цель (криттер или объект)
Item arg3 - Оружие атакующего криттера
int arg4 - Атакуемая часть тела (см. константы BODY_HIT_*), для цели не являющимся типом криттер это всегда равно 8 (BODY_UNCALLED)
int arg5 - Тип атаки атакующего (см. константы ATKTYPE_*)
int ret0 - Переопределение атакуемой части тела, или -1 для перехода к следующему аргументу
int ret1 - Переопределение типа атаки
HOOK_ATTACKHITROLL (hs_attackhitroll.int)Запускается при выполнении проверки атаки (успешной или неудачной) ранее вычисленного результата в HOOK_AFTERHITROLL.
Critter arg0 - Атакующий
Critter arg1 - Атакуемая цель
Item arg2 - Используемое оружие в атаке
int arg3 - Текущий результат атаки (см. ROLL_* в condtion.h)
int arg4 - Содержит значение номера ID перка, когда результат вычисленной атаки становится критически успешным или провальным от воздействия
перков игрока/напарника PERK_slayer, PERK_silent_death и особенностей игрока PERK_jinxed/TRAIT_jinxed,
в случае успешного критического результата от рукопашного удара атакующего это значение будет установлено в -1
int arg5 - Тип атаки (см. константы ATKTYPE_*)
int arg6 - Атакуемая часть тела (см. константы BODY_HIT_*)
int ret0 - Переопределяет результат атаки
HOOK_TRAIT (hs_trait.int)Запускается при добавлении или удаления особенности к криттеру, это происходит при получении перков, или какой-либо зависимости.
Critter arg0 - Криттер для которого происходит добавление/удаление особенности
int arg1 - Событие: 0 - удаление перка, 1 - добавление перка, 2 - удаление трейта, 3 - добавление трейта
int arg2 - ID номер трейта 0..15, или перка 0..255 (включая номера дополнительных перков)
int arg3 - Количество добавляемых/удаляемых уровней перка (для трейтов это всегда 1)
int ret0 - Переопределяет ID номер добавляемой или удаляемой особенности (нельзя переопределить удаляемый трейт), значение -1 отменяет,
будьте осторожны при переопределение удаляемого и переопределяемого перка с разными текущими уровнями