Stage 0: Введение
Почему (не) WAD-файл
Уровни в оригинальном DOOM описываются с помощью WAD-файлов. В них хранится абсолютно всё: от графики и звуков до описания самих уровней. Название WAD расшифровывается как Where's All the Data? — «А где все данные?».
Если попытаться представить с помощью TypeScript часть сущностей из WAD-файла, которые описывают исключительно геометрию уровня, то можно выделить следующие интерфейсы (или типы):
interface Vertex {
x: number;
y: number;
}
interface Linedef {
startVertex: Vertex;
endVertex: Vertex;
flags: number;
lineType: number;
sectorTag: number;
rightSidedef?: Sidedef;
leftSidedef?: Sidedef;
}
interface Seg {
startVertex: Vertex;
endVertex: Vertex;
slopeAngle: Angle;
linedef: Linedef;
direction: number;
offset: number;
rightSector?: Sector;
leftSector?: Sector;
}
interface Sidedef {
xOffset: number;
yOffset: number;
upperTexture: string;
lowerTexture: string;
middleTexture: string;
sector?: Sector;
}
interface BSPNode {
x: number;
y: number;
changeX: number;
changeY: number;
rightBoxTop: number;
rightBoxBottom: number;
rightBoxLeft: number;
rightBoxRight: number;
leftBoxTop: number;
leftBoxBottom: number;
leftBoxLeft: number;
leftBoxRight: number;
rightChildID: number;
leftChildID: number;
}
interface Sector {
floorHeight: number;
floorTexture: string;
ceilingHeight: number;
ceilingTexture: string;
lightlevel: number;
type: number;
tag: number;
}
Зачем я выше привёл эти типы? Дело в том, что мы будем вводить свои абстракции, но при этом пытаться следовать духу исходного кода DOOM. Другими словами, вы обнаружите, что типы будут пересекаться в именовании и назначении, но одновременно с этим могут незначительно отличаться в составе полей — и это будет ожидаемый результат.
Повторюсь, что целью данного цикла заметок является не создание клона DOOM, а использование его идей. В любом случае ничто не мешает вам переписать получившийся код или, наоборот, написать маппер, преобразующий оригинальные WAD-файлы к описанному нами набору типов.