HOOK СКРИПТЫ

Скрипты крючки - это специальное скрипты, которые запускаются в 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 обработчиков является следующей:

  1. Зарегистрированные обработчики функцией register_hook_proc (выполняются в обратном порядке регистрации).
  2. Зарегистрированные обработчики функцией register_hook (выполняются в обратном порядке регистрации).
  3. Обработчик скрипта hs_<name>.int.
  4. Зарегистрированные обработчики функцией 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 SCRIPT TYPES

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 может выбирать цели по следующим критериям:

  1. Ближайший к атакующему противник.
  2. Враг напавший на атакующего.
  3. Враг атаковавший NPC из той же команды, что и атакующий.
  4. Враг которого атакует NPC из той же команды, что и атакующий.

ПРИМЕЧАНИЕ: С улучшеным поведением 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 - использовать поведение движка игры, любое другое значение - запретит перемещение предмета, перезарядку оружия или подбор/выбрасывание предмета

Примечания для события выбрасывания предмета из инвентаря на карту:


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 отменяет,
               будьте осторожны при переопределение удаляемого и переопределяемого перка с разными текущими уровнями