Журнал "Вопросы аудио и видео" №3


Такие дела.
Курт Воннегут


Наш журнал посвящен звукам, поэтому в этом выпуске мы займемся ни чем иным, как изучением PRO-файлов и скриптов ;)  Но для начала


Еще несколько слов о фоновой музыке

Для изменения фоновой музыки в процессе игры может быть использован опкод set_map_music:

	procedure set_map_music(map_id, music_name);inline;
	begin
		int 80E2 end;
	end;

Опкод принимает два параметра:

Например, для изменения фоновой музыки, звучащей на карте перед Храмом (локация Arroyo Temple, идентификатор 126), можно использовать следующий вызов:

	set_map_music (126, 'akiss');

Данный опкод, по сути дела, замещает настройки в файле data\maps.txt. То есть, единожды поменяв фоновую музыку, можно наслаждаться изменениями вплоть до выхода из игры (при следующей загрузке Fallout перечитает настройки из data\maps.txt).

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


Звуки предметов

Существует всего два с половиной случая, когда предмет производит некоторый звук:

Последний пункт - это тема отдельного выпуска. Здесь же мы будем считать стволы просто палками или коробками, которые можно кидать, поднимать, отдавать и, изредка, использовать (последнее есть изврат, но изврат вполне реализуемый :)

1. Подбирание предмета

Звуковой эффект, который издается при поднимании предмета, самым непосредственным и, можно сказать, наглым образом связан с тем, как этот предмет выглядит. А еще точнее, действует правило "как пишыца, так и слышыца":
Название звукового файла, используемого при подбирании предмета с земли, совпадает с названием FRM-файла, содержащего изображение лежащего предмета.

Последовательность действий, необходимая для определения фрейма, которым представляется лежащий предмет, достаточно подробно описана в документе "Концепция объектов в Fallout 2".

В качестве примера рассмотрим Power Armor:

  1. ObjectID=3
  2. Третья строчка в файле proto\items\items.lst содержит 00000014.pro, значит, имя PRO-файла будет proto\items\00000014.pro
  3. DWORD по смещению 8 в этом PRO-файле даёт нам 00 00 00 23
  4. Строчка номер 0x23+1=36 в файле art\items\items.lst гласит pwrarmor.frm
Вот этот самый pwrarmor и используется в качестве названия звукового эффекта. То есть, когда мы поднимаем Силовую Броню с земли (или чего у нас там под ногами), мы слышим звук sound\sfx\pwrarmor.acm.

Ну и соответствующим образом можно задать звучание нового предмета (или изменить эффект уже существующего):

  1. рисуем новое изображение лежащего предмета (допустим, мы назвали его newitem.frm), добавляем этот фрейм в каталог data\art\items и регистрируем в списковом файле art\items\items.lst;
  2. делаем новый звуковой эффект (22 050 Гц, 16 бит, моно), запихиваем его в sound\sfx\newitem.acm и регистрируем;
  3. и, наконец, прописываем FrameID по смещению 8 в PRO-файле нашего предмета.

2. Скрипты предметов

Мда, похоже, придётся несколько выйти за пределы тематики журнала. Дело в том, что скрипты, "навешанные" на различные объекты, в том числе, и на предметы, охватывают практически все области Фоллауто-модификации, в частности, картографию и предметостроение. Здесь мы не станем углубляться ни в создание карт, ни в написание скриптов - этим темам посвящены или будут посвящены другие документы.

Если для предмета задан некоторый скрипт, то [почти] все действия, производимые с предметом, вызывают выполнение соответствующей функции-обработчика этого скрипта (если таковая функция определена в скрипте).

Вот далеко не полный список названий этих обработчиков (привожу только те из них, в которые может понадобиться добавить звуки):
ДействиеФункция-обработчик
обычное использование предметаuse_p_proc
использование предмета на объектuse_obj_on_p_proc
предмет выбрасываетсяdrop_p_proc
предмет подбираетсяpickup_p_proc
требуется короткое описание предмета
(при наведении курсора на предмет)
look_at_p_proc
вывод длинного описания предмета
(при выборе бинокля из контекстного меню)
description_p_proc

Весьма часто в функциях-обработчиках используется опкод, отменяющий обычную обработку действия игрой. Это опкод 80B9, который называется script_overrides в fallout2.exe (у нас же этот опкод известен под партизанской кличкой Writeln  %-\).

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

	procedure pickup_p_proc;
	begin
		script_overrides;
		Say (Sender, 'I''m not going to touch THIS!', 2);
	end;
В результате все попытки взять такой предмет окажутся неудачными, а попытавшийся персонаж гневно (красным цветом) заявит, что он, мол, даже трогать это не станет.

Действия, которые может осуществлять предмет, прописываются в его PRO-файле по смещению 0x1A. Не все биты этого байта флагов изучены, но вполне достоверно известно, что третий бит (значение 0x08) отвечает за режим "USE", а четвертый (значение 0x10) - за режим "USE ON". Следующая табличка всё прояснит:
Третий бит=0Третий бит=1
4й бит=0
Контекстное менюбез руки
ничего не вызывается
Режим предмета в рукенет
Пример предметаЗажигалка
Контекстное менюесть рука
вызывается use_p_proc
Режим предмета в рукеUSE
Пример предметаHintbook
4й бит=1
Контекстное менюесть рука
вызывается use_obj_on_p_proc
Режим предмета в рукеUSE ON
Пример предметаСтимпак
Контекстное менюесть рука
вызывается use_p_proc
Режим предмета в рукеUSE ON
Пример предметаХолодиски
Вне зависимости от значения байта 0x1C, предмет можно использовать на какой-либо объект, выбрав рюкзак из контекстного меню этого объекта. При этом вызывается обработчик use_obj_on_p_proc из скрипта предмета.

Существует два способа задания скрипта для предмета:

  1. скрипт прописывается в MAP- или SAV-файле локации;
  2. номер скрипта указывается в PRO-файле.
Для тех предметов, которые уже находятся в игре (то есть, уже разложены в ящичках и карманах персонажей, а также главного героя), скрипты жестко прописаны в файлах соответствующих локаций. Так что для добавления или изменения "поведения" у существующих предметов необходимо изменить карту. Картография находится вне компетенции автора журнала, так что вопрос модификации карт мы затрагивать не будем :)

Рассмотрим второй способ задания скрипта для предмета: через PRO-файл возможно установить скрипт для тех предметов, которые "изготовляются" в процессе игры, то есть создаются при помощи опкода CreateObj (он же create_object по терминологии fallout2.exe; опкод 80B7). Номер скрипта, с которым будет связываться создаваемый предмет, указывается в PRO-файле по смещению 0x1C. Обычно здесь записано значение FF FF FF FF, означающее "скрипта нет"; значение же вида 03 00 NN NN как раз задаёт номер скрипта.

Пример: совершенно бесполезный предмет под названием Fallout 2 Hintbook (ObjectID=483). Соответствующий PRO-файл по смещению 0x1C содержит значение 03 00 04 56. Смотрим 1111-ю строчку (0x0456+1=1111) в файле scripts\scripts.lst и видим ни что иное, как

	niF2Hint.int    ; New Reno Fallout 2 Hintbook ...



Про удаление файлов Fallout'ом

Продолжительные эксперименты над игрой показали, что пропатченная версия пытается удалять следующие файлы:

(отмечу, что на протяжении загрузки игра зачем-то пытается удалять одни и те же файлы несколько раз ;)

Таким образом, атрибут ReadOnly достаточно ставить только на новые PRO-файлы предметов и криттеров - все остальные модифицированные файлы Fallout, похоже, не трогает.



© TeamX Press, 2002
Редактор: ABel
Ежи - форева!
тот, кто ничего не знает, может ожидать чего угодно