В документе приводится описание форматов идентификаторов FRM-файла (FRM ID или FID), идентификатора прототипа (Prototype ID или PID), идентификатора скрипта (Script ID или SID) и идентификатора звукового эффекта (Sound Code ID) для Fallout. Информация о них была получена в ходе разбора соответствующей функции в файлах Fallout2.exe, Fallout.exe и Mapper2.exe.
Автор документа: Anchorite (anchorite2001@yandex.ru).
Идентификаторы представляют собой четырехбайтовые числа однозначно описывающие объекты с которыми оперирует Fallout. Исключением является 'Идентификатор звукового эффекта' (Sound Code ID), который является символом и имеет размер 1 байт.
В общем случае FID представляет собой число следующего вида:
+--|--------|-----------|-----------------------|-----------|-----------------------------------+ |31|30|29|28|27|26|25|24|23|22|21|20|19|18|17|16|15|14|13|12|11|10|09|08|07|06|05|04|03|02|01|00| +--|--------|-----------|-----------------------|-----------|-----------------------------------+ | | | | | | | | | | | ------------------- Индекс в LST-файл | | | | ------------------------------------------- ID1 | | | ------------------------------------------------------------- ID2 | | ------------------------------------------------------------------------------- Тип объекта (ObjType) | ----------------------------------------------------------------------------------------- ID3 ------------------------------------------------------------------------------------------------ Не используется
Поля 'Тип объекта и 'Индекс в лист-файл' используются всегда, а поля 'ID3', 'ID2' и 'ID1' могут игнорироваться в зависимости от значения поля 'Тип объекта' (Таблица 1.1). Значение не используемого бита может быть любым.
ObjType | ID3 | ID2 | ID1 |
---|---|---|---|
0x00: items (предметы) |
|||
0x01: critters (существа) |
x | x | x |
0x02: scenery (пейзаж) |
|||
0x03: walls (стены) |
|||
0x04: tiles (плитки пола) |
|||
0x05: misc (разное) |
|||
0x06: interface (интерфейс) |
|||
0x07: invent (инвентарь) |
|||
0x08: heads (говорящие головы) |
х | х | |
0x09: backgrnd (фон) |
|||
0x0A: skilldex (умения) |
Для FID, не относящегося к существам и «говорящим головам», именем файла является соответствующий Индексу элемент LST-файла.
Имя FRM-файла существа имеет следующий вид
RootSuffix1Suffix2.frExtSuffix где Root - корень имени файла (6 символов) Suffix1 - первый суффикс (1 символ) Suffix2 - второй суффикс (1 символ) ExtSuffix - суффикс расширения имени файла (1 символ)
Пример
Пусть имя файла HAPOWRBA.FR0
тогда Root - HAPOWR Suffix1 - B Suffix2 - A ExtSuffix - 0
В FID существа используются все поля. ID1 определяет Suffix1, ID2 - Suffix2, ID3 - ExtSuffix.
Идентификаторы имеют следующее назначение:
При ID2 равном 0x1B (27 - ANIM_electrify), 0x1D (29 - ANIM_burned_to_nothing), 0x1E (30 - ANIM_electrified_to_nothing), 0x37 (55 - ANIM_electrify_sf), 0x39 (57 - ANIM_burned_to_nothing_sf), 0x3A (58 - ANIM_electrified_to_nothing_sf), 0x21 (33 - ANIM_fire_dance), 0x40 (64 - called shot interface picture) происходит изменение Индекса в LST-файл. Индекс меняется на первое число, стоящее после строки с корнем имени файла.
Пример
Требуется заменить индекс 0x62(98). Смотрим 99 строку файла critters.lst. Там находится nmoldd,11. Соответственно измененный Индекс будет 0x0B(11).
Соответствия между значениями ID1, ID2 и Suffix1, Suffix2 преведены в Таблице 2.2, а между ID3 и ExtSuffix в Таблице 2.3.
ID2 | ID1 | Suffix1 | Suffix2 | Примечания |
---|---|---|---|---|
- | ID1 ≥ 0x0B(11) | - | - | Недопустимое значение |
0x26(38) ≤ ID2 ≤ 0x2F(47) | ID1 = 0x00(0) | - | - | Недопустимое значение |
ID1 ≠ 0x00(0) | char(ID1 + 0x63(99)) 'd' + (ID1 - 1) |
char(ID2 + 0x3D(61)) 'c' + (ID2 - 38) |
||
ID2 = 0x24(36) | - | 'c' | 'h' | |
ID2 = 0x25(37) | - | 'c' | 'j' | |
ID2 = 0x40(64) | - | 'n' | 'a' | |
ID2 ≥ 0x30(48) | - | 'r' | char(ID2 + 0x31(49)) 'a' + (ID2 - 48) |
|
ID2 ≥ 0x14(20) | - | 'b' | char(ID2 + 0x4D(77)) 'a' + (ID2 - 20) |
|
ID2 = 0x12(18) | ID1 = 0x01(1) | 'd' | 'm' | |
ID1 = 0x04(4) | 'g' | 'm' | ||
- | 'a' | 's' | ||
ID2 = 0x0D(13) | ID1 > 0x00(0) | char(ID1 + 0x63) 'd' + (ID1 - 1) |
'e' | |
ID1 = 0x00 | 'a' | 'n' | ||
ID2 ≤ 0x01(1) | ID1 > 0x00(0) | char(ID1 + 0x63(99)) 'd' + (ID1 - 1) |
char(ID2 + 0x61(97)) 'a' + ID2 |
|
- | - | 'a' | char(ID2 + 0x61(97)) 'a' + ID2 |
|
Примечание: Условия из верхних строк таблицы имеют приоритет над условиями из нижних строк |
ID3 | ExtSuffix |
---|---|
0x00 | 'm' |
0x01 | '0' |
0x02 | '1' |
0x03 | '2' |
0x04 | '3' |
0x05 | '4' |
0x06 | '5' |
0x07 | '6' |
Имя FRM-файла «говорящей головы» имеет следующий вид
RootSuffix1Suffix2[Sufix3].frm где Root - корень имени файла (5 символов) Suffix1 - первый суффикс (1 символ) Suffix2 - второй суффикс (1 символ) Suffix3 - третий суффикс (обычно 1 символ, но теоретически может быть и больше, не обязателен)
ID2 определяет Suffix1 и Suffix2, а ID1 - Suffix3 (Таблицы 2.4, 2.5).
ID2 | Suffix1 | Suffix2 |
---|---|---|
0x00 | 'g' | 'v' |
0x01 | 'g' | 'f' |
0x02 | 'g' | 'n' |
0x03 | 'n' | 'g' |
0x04 | 'n' | 'f' |
0x05 | 'n' | 'b' |
0x06 | 'b' | 'n' |
0x07 | 'b' | 'f' |
0x08 | 'b' | 'v' |
0x09 | 'g' | 'p' |
0x0A | 'n' | 'p' |
0x0B | 'b' | 'p' |
Примечание: Если значения Suffix2 = 'f', то в имени FRM файла используется Suffix3 |
ID2 | Suffix3 |
---|---|
0x00 | '0' |
0x01 | '1' |
0x02 | '2' |
... | ... |
Идентификатор прототипа (PID) представляет собой число следующего вида:
+-----------------------|-----------------------------------------------------------------------+ |31|30|29|28|27|26|25|24|23|22|21|20|19|18|17|16|15|14|13|12|11|10|09|08|07|06|05|04|03|02|01|00| +-----------------------|-----------------------------------------------------------------------+ | | | ---------------------------------------- Индекс в LST-файл ------------------------------------------------------------------------------------- Тип объекта (ObjType)
На значение 'Типа объекта' накладывается следующее ограничение:
0x00 ≤ ObjType ≤ 0x0B
но PRO-файлы существуют только для объектов с
0x00 ≤ ObjType ≤ 0x05
(0x00: items (предметы), 0x01: critters (существа), 0x02: scenery (пейзаж), 0x03: walls (стены), 0x04: tiles (плитки пола), 0x05: misc (разное)).
На индекс в LST-файл ограничений нет.
Однако из-за особенностей инициализации внутренних структур Mapper может создать PID только с индексом начиная с единицы. Поэтому PID с нулевым индесом не существует.
Внимание:
Индекс в LST-файл нового PID создаваемого Mapper-ом от BIS является числом уже существующих PRO-файлов для данного типа объекта. Mapper не проверяет существование PRO-файла для нового PID и поэтому возможна ситуация, когда быдет создан PID уже сществующего прототипа.
Идентификатор скрипта (SID) представляет собой число следующего вида:
+-----------------------|-----------------------------------------------------------------------+ |31|30|29|28|27|26|25|24|23|22|21|20|19|18|17|16|15|14|13|12|11|10|09|08|07|06|05|04|03|02|01|00| +-----------------------|-----------------------------------------------------------------------+ | | | ---------------------------------------- Индекс в LST-файл ------------------------------------------------------------------------------------- Тип скрипта (ScriptType)
На значение 'Типа скрипта' накладывается следующее ограничение:
0x00 ≤ ScriptType ≤ 0x04
На индекс в LST-файл ограничений нет.
Типы скриптов приведены в таблице 3.1
Тип скрипта (ScriptType) |
Тип (по информации от SeaWolf) |
Тип (по информации из Mapper2.exe) |
---|---|---|
0x00 | - | s_system |
0x01 | spatial | s_spatial |
0x02 | items | s_time |
0x03 | scenery | s_item |
0x04 | critters | s_critter |
Также следует отметить, что автору не встречались карты (MAP-файлы) в которых использовались скрипты типов 0x00 и 0x02.
Идентификатор звукового эффекта (Sound Code ID) представляет собой символ в имени файла звукового эффекта. Расположение этого символа в имени файла варьируется в зависимости от типа объекта. Может принимать значение '0' - '9','A' - 'Z', '!','@','#','$','_'.
/* Copyright 1998-2003 Interplay Entertainment Corp. All rights reserved. */ #ifndef ANIMCOMD_H #define ANIMCOMD_H /************************************************************ Filename: AnimComd.h Purpose: This file contains all of the defines for animations used in the game. Please do not alter them unless Jesse Reynolds says you can, as they are used for various purposes throughout the game. Created: November 20, 1997 Log: ************************************************************/ // Animation macros & defines // #define ANIMATE_WALK (0) #define ANIMATE_RUN (1) #define ANIMATE_INTERRUPT (16) #define ANIMATE_FORWARD (0) #define ANIMATE_REVERSE (1) #define animate_move_to_tile(X) animate_move_obj_to_tile(self_obj, X, ANIMATE_WALK) #define animate_run_to_tile(X) animate_move_obj_to_tile(self_obj, X, ANIMATE_RUN) #define animate_stand animate_stand_obj(self_obj) #define animate_stand_reverse animate_stand_reverse_obj(self_obj) #define animate_move_to_tile_force(X) animate_move_obj_to_tile(self_obj, X, (ANIMATE_WALK bwor ANIMATE_INTERRUPT)) #define animate_run_to_tile_force(X) animate_move_obj_to_tile(self_obj, X, (ANIMATE_RUN bwor ANIMATE_INTERRUPT)) #define ANIMATE_ROTATION (1000) #define ANIMATE_SET_FRAME (1010) #define MAX_ROTATIONS (6) #define animate_rotation(X) anim(self_obj, ANIMATE_ROTATION, X) #define animate_set_frame(FRAME) anim(self_obj, ANIMATE_SET_FRAME, FRAME) // basic animations 0-19 #define ANIM_stand (0) #define ANIM_walk (1) #define ANIM_jump_begin (2) #define ANIM_jump_end (3) #define ANIM_climb_ladder (4) #define ANIM_falling (5) #define ANIM_up_stairs_right (6) #define ANIM_up_stairs_left (7) #define ANIM_down_stairs_right (8) #define ANIM_down_stairs_left (9) #define ANIM_magic_hands_ground (10) #define ANIM_magic_hands_middle (11) #define ANIM_magic_hands_up (12) #define ANIM_dodge_anim (13) #define ANIM_hit_from_front (14) #define ANIM_hit_from_back (15) #define ANIM_throw_punch (16) #define ANIM_kick_leg (17) #define ANIM_throw_anim (18) #define ANIM_running (19) // knockdown and death 20-35 #define ANIM_fall_back (20) #define ANIM_fall_front (21) #define ANIM_bad_landing (22) #define ANIM_big_hole (23) #define ANIM_charred_body (24) #define ANIM_chunks_of_flesh (25) #define ANIM_dancing_autofire (26) #define ANIM_electrify (27) #define ANIM_sliced_in_half (28) #define ANIM_burned_to_nothing (29) #define ANIM_electrified_to_nothing (30) #define ANIM_exploded_to_nothing (31) #define ANIM_melted_to_nothing (32) #define ANIM_fire_dance (33) #define ANIM_fall_back_blood (34) #define ANIM_fall_front_blood (35) // change positions 36-37 #define ANIM_prone_to_standing (36) #define ANIM_back_to_standing (37) // weapon 38-47 #define ANIM_take_out (38) #define ANIM_put_away (39) #define ANIM_parry_anim (40) #define ANIM_thrust_anim (41) #define ANIM_swing_anim (42) #define ANIM_point (43) #define ANIM_unpoint (44) #define ANIM_fire_single (45) #define ANIM_fire_burst (46) #define ANIM_fire_continuous (47) // single-frame death animations (the last frame of knockdown and death animations) 48-63 #define ANIM_fall_back_sf (48) #define ANIM_fall_front_sf (49) #define ANIM_bad_landing_sf (50) #define ANIM_big_hole_sf (51) #define ANIM_charred_body_sf (52) #define ANIM_chunks_of_flesh_sf (53) #define ANIM_dancing_autofire_sf (54) #define ANIM_electrify_sf (55) #define ANIM_sliced_in_half_sf (56) #define ANIM_burned_to_nothing_sf (57) #define ANIM_electrified_to_nothing_sf (58) #define ANIM_exploded_to_nothing_sf (59) #define ANIM_melted_to_nothing_sf (60) //#define ANIM_fire_dance_sf (61)// doesn't exist, but keeps the enums ordered #define ANIM_fall_back_blood_sf (61) #define ANIM_fall_front_blood_sf (62) // called shot interface picture 64 #define ANIM_called_shot_pic (63) #define ANIM_max_anim (65) // 65 /* Anim Commands */ #define RB_UNRESERVED 1 // unreserved animation sequence, may fail if no available slots #define RB_RESERVED 2 // reserved animation sequence, should never fail #define REG_ANIM_BEGIN 1 #define REG_ANIM_CLEAR 2 #define REG_ANIM_END 3 #define reg_anim_begin() reg_anim_func(REG_ANIM_BEGIN, RB_UNRESERVED) #define reg_anim_clear(who) reg_anim_func(REG_ANIM_CLEAR, who) #define reg_anim_end() reg_anim_func(REG_ANIM_END, 0) #endif // ANIMCOMD_H