|
QUOTE (Fakeman) |
|
Вы это как к QUOTE (Fakeman) добавляете ник?
|
[ quote = ник ] без пробелов.
|
QUOTE (Fakeman) |
|
не ну я то это понял, но что-то они как то не особо то и тратили свои оставшиеся очки, ладно.
|
Ещё зависит от настроек AI пакета (AI.txt).
|
QUOTE (Fakeman) |
|
не замечал никакого бага со start, только единственное что он 2 раза подряд выполняется.
|
"Видишь суслика? Нет. И я не вижу. А он есть!" © :-p
|
QUOTE |
Скриптовые действия ..... start в Fallout2 вызывается при первом запуске скрипта, в Fallout1 для каждого действия Примечания: В Fallout1 является главным обработчиком, через который вызываются все остальные. Типы действия передаются обработчику через параметр script_action, после чего происходит вызов нужного обработчика (обычно это делатеся через if-then-else). Номера обработчиков см. в Приложении. ..... int script_action возвращает действие, активировавшее этот скрипт (в скриптах Fallout2 не используется) Аргументы: нет Возвращаемое значение: номер стандартного обработчика (см. Приложение): Примечания: В Fallout1 играет важную роль. Используется в контексте обработчика start.
|
Информация в примечаниях частично актуальна для демо-версии, поскольку даже процедуры start не существовало всегда вызывалась самая_первая_процедура с заданным параметром script_action.
Начиная с версии 1.0 и F1 и F2 стали использовать именные стандартные обработчики (start, spatial_p_proc и т.д.) только в F1 description_p_proc называется desc_p_proc (надо бы имя в sslc компилятор добавить 'Protect("desc_p_proc");'). Для совместимости способ вызова через самая_первая_процедура+script_action оставили, хотя подозреваю что подумывали отказаться в обоих движках остались неиспользуемые кусочки кода, которые должны были обрабатывать вариант отсутствия именного стандартного обработчика (в F1 для debug-режима даже сообщение осталось "Error: exec_script_proc: Can't Find script procedure!!!").
В общем алгоритм вызова обработчиков и в F1 и в F2 стал таким если есть именная процедура (destroy_p_proc и т.д.), то вызвать её, в противном случае установить script_action (18 для destroy_p_proc) и вызвать самую_первую_процедуру. Тут ошибочка и появилась.
Обычно именная процедура start описана как самая_первая_процедура, но в отдельных случаях это не так (декомпиляция и компиляция стандартного скрипта, в исходнике которого добавляется checkPartyMembersNearDoor в качестве самой_первой_процедуры, да даже бегло просмотрел существующие исходники и видел start не в качестве самой_первой_процедуры). Последствия слегка упомянуты в примечании к описанию critter_p_proc из BIS_help.html:
|
QUOTE |
|
critter_p_proc отвечает за поведение объекта в целом, выполняется постоянно (несколько раз в секунду). В качестве параметра получает fixed_param урон, нанесённый криттеру в последний ход. Примечание: если в скрипте криттера данная процедура отсутствует, то могут возникать глюки, например, в качестве этого обработчика может быть воспринята первая попавшаяся процедура, которая будет выполняться несколько раз в секунду.
|
Не первая попавшаяся, а точно самая первая. Да и critter_p_proc не единственный пострадавший отсутствие любого именного стандартного обработчика при попытке его вызова приведёт к вызову самой_первой_процедуры+script_action, и повезёт если там вместо start окажется безобидная процедура.
Исправил теперь вместо фиксированного вызова самой_первой_процедуры движок сначала узнаёт номер процедуры start, а уже затем её вызывает.