2.5D Renderer

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-файлы к описанному нами набору типов.