home *** CD-ROM | disk | FTP | other *** search
/ Supergames 2 / SupergamesVolume2.bin / faqs / dmspcs11.txt < prev    next >
Text File  |  1994-02-21  |  39KB  |  988 lines

  1. -----------------------------------------------------------------------------
  2.        T H E   U N O F F I C I A L   *-D-*-*-O-*-*-O-*-*-M-*   S P E C S
  3.                         Release v1.1 - February 19, 1994
  4.                   Written by: Matt Fell (matt.burnett@acebbs.com)
  5.               Released by: Hank Leukart (ap641@cleveland.freenet.edu)
  6.           "DOOM: Where hackers gnaw the bones left from the banquet
  7.                  of data prepared by the mighty wizards of id."
  8.            "The poets talk about love, but what I talk about is DOOM,
  9.                  because in the end, DOOM is all that counts."
  10.            - Alex Machine/George Stark/Stephen King, _The Dark Half_
  11. -----------------------------------------------------------------------------
  12.  
  13. ----------
  14. DISCLAIMER
  15. ----------
  16.  
  17.         These specs are to aid in informing the public about the game DOOM,
  18. by id Software.  In no way should this promote your killing yourself, killing
  19. others, or killing in any other fashion.  Additionally, neither Hank Leukart
  20. nor Matt Fell claim ANY responsibility regarding ANY illegal activity
  21. concerning this file, or indirectly related to this file.  The information
  22. contained in this file only reflects id Software indirectly, and questioning
  23. id Software regarding any information in this file is not recommended.
  24.  
  25. ---------
  26. COPYRIGHT
  27. ---------
  28.  
  29.         You may NOT distribute this work by any non-electronic media,
  30. including but not limited to books, newsletters, magazines, manuals,
  31. catalogs, and speech.  You may NOT distribute this work in electronic
  32. magazines, or within computer software without prior written explicit
  33. permission.  These rights are temporary and revocable upon written, oral,
  34. or other notice by Hank Leukart.  This copyright notice shall be governed
  35. by the laws of the state of Ohio.
  36.         If you would like additional rights beyond those granted above,
  37. write to the distributor at "ap641@cleveland.freenet.edu" on the Internet.
  38.  
  39. ------------
  40. INTRODUCTION
  41. ------------
  42.  
  43.         Here are the long awaited unofficial specs for DOOM.  These specs
  44. should be used for creating add-on software for the game.  I would like to
  45. request that these specs be used in making utilities that ONLY work on the
  46. registered version of DOOM.  You may not use these for modifing, translating,
  47. disassembling, decompiling, reverse engineering, or creating derivative works
  48. based upon DOOM.  Notwithstanding the foregoing, you may create a map editor,
  49. modify maps and make your own maps (collectively referenced as the "Permitted
  50. Derivative Works") for the Software.  You may not sell or distribute any
  51. Permitted Derivative Works but you may exchange the Permitted Derivative
  52. Works at no charge amongst other end-users.
  53.         I do not understand much of what is contained in this file, so if
  54. you have any questions about the information, write to Matt Fell at
  55. "matt.burnett@acebbs.com" on the Internet.  If you would like to request a
  56. copy of this file, or have any questions about its distribution, write to me,
  57. Hank Leukart, at "ap641@cleveland.freenet.edu" on the Internet.
  58.  
  59. --------------------
  60. (LONG) AUTHOR'S NOTE
  61. --------------------
  62.  
  63. This document is a summary and explanation of almost all the data structures
  64. in the DOOM.WAD file. ALMOST all. The structure of the NODES/SSECTOR/SEGS
  65. objects is apparent, but their exact purpose is proving elusive. Everything
  66. else is fairly easy. Thankfully, there is no compression or encryption used,
  67. that would really complicate things.
  68.  
  69. All of this information is true to the best of my knowledge at this time,
  70. which means that there's certainly a few things in here which are WRONG!
  71. So here's the obligatory reminder to back up your DOOM.WAD file and any other
  72. files you intend to change, unless you enjoy re-installing the whole package
  73. [ Hope you have 11 megs just lying around :-) ]. If you aren't experienced
  74. with programming and/or data structures, you probably shouldn't be fooling
  75. around anyway. And remember, id Software will NOT give technical support for
  76. modifications.
  77.  
  78. Whatever you do, do NOT distribute any data extracted from the original
  79. doom.wad file. It is COPYRIGHTED. This includes pictures, sounds, and the
  80. original maps. I don't know about the technicality of it, but I'm also,
  81. especially, referring to distributing changed versions of the original maps.
  82. E.g. you change one or two of the items on a level, or you move some walls
  83. around. Great! But don't distribute it! It's still THEIR level.
  84.  
  85. As far as I can determine at this point in time, here is the preferred
  86. method of handling third-party additions:
  87.  
  88. If you are writing a utility that will operate on DOOM, have it first check
  89. the WAD file for the existence of an "E3M1" entry in the directory (explained
  90. below), or some other entry that will only be in the registered version.
  91.  
  92. If you are going to be distributing a modified map, plan on using the -file
  93. parameter. At the command line, the user will type
  94.  
  95. DOOM -DEVPARM -FILE yourfile.wad
  96.  
  97. (in addition to any other command line parameters they are using). This
  98. causes doom to use any resources in the "yourfile.wad" instead of the
  99. originals in the "doom.wad" file. Thus, if you only make one level (good
  100. luck on even making one!), you can distribute a wad file which will be very
  101. small compared to the full wad file. Your external wad file for a single
  102. level would have just eleven entries in its directory.
  103.  
  104. When doom loads, the doom OS will say "adding external file (whatever).wad"
  105. Call your file something like JOELEVEL.WAD or XMENRULE.WAD; if you use a name
  106. like E1M1.WAD or E3M6.WAD or probably any real name from the real directory,
  107. it will either not work, or lock-up.
  108.  
  109. By the way, I've known most of this info for weeks now, but have been
  110. "sitting" on it for various reasons....And if you like difficult levels
  111. oriented towards combat and thinking, remember me. When I get good enough
  112. tools, I guarantee I will make some interesting levels. The desire to create
  113. levels is what really got me started on this whole thing; my resume includes
  114. some critically acclaimed levels for wolf and spear.
  115.  
  116. If you have any comments, or even better, possible additions, please send me
  117. e-mail. Questions will be gladly answered also, no matter how trivial, unless
  118. I get too many, which I doubt. Please note, however, that if it's not in
  119. here, I'm either working on it or I just don't know it. If YOU know "it", tell
  120. me!
  121.  
  122. --------
  123. CONTENTS
  124. --------
  125.  
  126. [1] Basics
  127. [2] Directory Overview
  128. [3] The Maps, The Levels
  129.         [3-1] ExMy
  130.         [3-2] THINGS
  131.                 [3-2-1] Thing Types
  132.         [3-3] LINEDEFS
  133.                 [3-3-1] Linedef Attributes
  134.                 [3-3-2] Linedef Types
  135.         [3-4] SIDEDEFS
  136.         [3-5] VERTEXES
  137.         [3-6] SEGS
  138.         [3-7] SSECTORS
  139.         [3-8] NODES
  140.         [3-9] SECTORS
  141.         [3-10] REJECT
  142.         [3-11] BLOCKMAP
  143. [4] Pictures' Format
  144.         [4-1] Headers
  145.         [4-2] Pointers
  146.         [4-3] Pixel Data
  147. [5] Floor and Ceiling Textures
  148. [6] Songs and Sounds
  149.         [6-1] Songs
  150.         [6-2] Sounds
  151. [7] Miscellaneous Non-Picture Resources
  152.         [7-1] PLAYPAL
  153.         [7-2] COLORMAP
  154.         [7-3] DEMOs
  155.         [7-4] TEXTURE1 and TEXTURE2
  156.         [7-5] PNAMES
  157.  
  158. -------------------
  159. CHAPTER [1]: Basics
  160. -------------------
  161.  
  162. The first twelve bytes of a *.WAD file are as follows:
  163.  
  164. Bytes 0 to 3 - contain the ASCII letters "IWAD"
  165.                may also contain "PWAD", which will give the "modified game"
  166.                message during the Doom OS startup. Therefore, I recommend
  167.                that all modified WAD files have PWAD instead of IWAD. I have
  168.                been unable to find out what ID thinks about this, they are so
  169.                busy...
  170. Bytes 4 to 7 - contain a long integer which is the number of entries in the
  171.                "directory"
  172. Bytes 8 to 11 - contain a pointer to the first byte of the "directory"
  173.  
  174. (Bytes 12 to the start of the directory contain resource data)
  175.  
  176. The directory referred to is a list, located at the end of the WAD file,
  177. which contains the pointers, lengths, and names of all the resources in the
  178. WAD file. The resources in the wad: item pictures, enemies' pictures for
  179. animation, wall patches, floor and ceiling textures, songs, sound effects,
  180. map data, and many others.
  181.  
  182. Specifically, the first 12 bytes of the DOOM.WAD file in version 1.1, which
  183. I am working with, are:
  184.  
  185. 49 57 41 44 1a 08 00 00 be 20 9e 00
  186.  
  187. This is "IWAD", then 81a hex (=2074 decimal) for the number of directory
  188. entries, then 9e20be (=10363070 decimal) for the first byte of the directory.
  189.  
  190. Each directory entry is 16 bytes long, arranged this way:
  191.  
  192. First four bytes: pointer to start of resource (a long integer)
  193. Next four bytes: length of resource (another long integer)
  194. Last eight bytes: name of resource, in ASCII capitals, ending with 00s if
  195.         less than eight bytes.
  196.  
  197. -------------------------------
  198. CHAPTER [2]: Directory Overview
  199. -------------------------------
  200.  
  201. PLAYPAL   contains fourteen 256 color palettes, used while playing Doom.
  202. COLORMAP  maps colors in the palette down to darker ones, for areas of less
  203.           than maximum brightness (quite a few of these places, huh?)
  204. ENDOOM    is the text message displayed when you exit to DOS.
  205. DEMO[1-3] are the demos which will play if you just sit and watch.
  206.  
  207. E1M1      etc, to E3M9, along with its 10 subsequent entries, defines the
  208.           map data for a single level or mission. More on this below.
  209.  
  210. TEXTURE1  is a list of wall type names used in the SIDEDEF portion of each
  211.           level's data, and their composition data, i.e. what wall patches
  212.           make up each "meta-wall".
  213. TEXTURE2  contains the walls that are only in the registered version.
  214. PNAMES    is the list of wall patches, which are referenced by number in
  215.           the TEXTURE1/2 objects.
  216.  
  217. GENMIDI   has some instrument names in it, and obviously has to do with the
  218.           MIDI mappings used for the songs...?
  219. DMXGUS    has to do with Gravis Ultra Sound, I suppose.
  220.  
  221. D_xxxxxx  is a song
  222. DP_xxxxx  DP and DS come in pairs and are the sound effects.
  223. DS_xxxxx     DP_ are the PC speaker sounds, DS_ are the sound card sounds.
  224.  
  225. all the remaining entries in the directory, except the floor textures at the
  226. end, and the "separators" like S_START, refer to resources which are pictures
  227.  
  228. in the doom/wad picture format described in chapter 6. I could've listed here
  229.  
  230. what every single one of them is, e.g. WIMSTBP3 is text "FOUR" in grey, but
  231. I figured it to be a waste of time.
  232.  
  233. HELP[1-2] These are full screen (320 by 200 pixel) pictures.
  234. TITLEPIC
  235. CREDIT
  236. VICTORY2
  237. PFUB[1-2]
  238.  
  239. END[0-6]  "THE END" text, with 0 to 6 bullet holes.
  240.  
  241. AMMNUM[0-9] are the grey digits used in the status bar for ammo count.
  242. STxxxxxx  are small pictures and text used on the status bar.
  243. M_xxxxxx  are text messages (yes, in picture format), used in the menus.
  244. BRDR_xxx  are tiny two pixel wide pictures use to frame the viewing window
  245.           when it is not full screen.
  246. WIxxxxxx  are pictures and messages used on the summary screen done after
  247.           the completion of a level.
  248. WIMAP[0-2] are full screen, 320 by 200.
  249.  
  250. S_START   has 0 length and is right before the item/enemy section
  251. S_END     is immediately after the last "frame"
  252. P_START   the beginning of the wall patches
  253. P1_START      before the first of the shareware wall patches
  254. P1_END        after the last of the shareware wall patches
  255. P2_START      before the first of the registered wall patches
  256. P2_END        before the first of the registered wall patches
  257. P_END     the end of the wall patches
  258. F_START   the beginnning of the floors
  259. F1_START      before the first shareware floor texture
  260. F1_END        after the last shareware floor texture
  261. F2_START      before the first registered floor texture
  262. F2_END        after the last registered floor texture
  263. F_END     the end of the floors
  264.  
  265. And that's the end of the directory. Detailed info on specific resources
  266. follows...
  267.  
  268. ---------------------------------
  269. CHAPTER [3]: The Maps, The Levels
  270. ---------------------------------
  271.  
  272. Each level has eleven resources/directory entries: E[x]M[y] (where x
  273. is a single digit 1-3 for the episode number and y is 1-9 for the
  274. mission/level #),THINGS, LINEDEFS, SIDEDEFS, VERTEXES, SEGS,
  275. SSECTORS, NODES, SECTORS, REJECT, BLOCKMAP.
  276.  
  277. [3-1]: ExMy
  278. ===========
  279.  
  280. This is just the name resource for a (single) level, and has zero
  281. length. The next 10 entries in the directory after one of these must
  282. be THINGS...BLOCKMAP.
  283.  
  284. [3-2]: THINGS
  285. =============
  286.  
  287. Each thing is ten bytes, consisting of five (integer) fields:
  288.  
  289. 1. X coordinate of thing
  290. 2. Y coordinate of thing
  291.  
  292. Each level has a different "range" to its coordinates. On E1M1, X ranges
  293. from (c.) -288 to +3440, and Y ranges from (c.) -4832 to -2144.
  294. On the automap within the game, with the grid on (press 'G'), the lines are
  295. hex 80 (decimal 128) apart, two lines = hex 100, dec 256.
  296.  
  297. 3. Angle the thing faces, 0 is west (according to automap).
  298.  
  299. May be 0,45,90,135,180,225,270,315. Only important for enemies.
  300.  
  301. 4. Type of thing, see next subsection
  302. 5. Attributes of thing, which are set by bits:
  303.  
  304. bit 0  is set if the THING is present at skill 1 and 2
  305. bit 1  is set if the THING is on skill 3 (hurt me plenty)
  306. bit 2  is set if the THING is on skill 4 (ultra-violence)
  307. bit 3  is set to indicate a deaf guard. This only has meaning for enemies,
  308. who will not attack until they see a player if they are "deaf". Otherwise,
  309. they will activate when they hear gunshots, etc. Sound does not travel
  310. through solid walls (walls that are solid at the time of the noise).
  311. bit 4  makes the THING only appear in multiplayer mode.
  312. bits 5-15 are never set in any THING , and have no effect.
  313.  
  314. The skill settings are most used with the ENEMIES, of course...the most
  315. common skill level settings are hex 07/0f (on all skills), 06/0e (on skill
  316. 3-4), and 04/0c (only on skill 4).
  317.  
  318. [3-2-1]: Thing Types
  319. --------------------
  320.  
  321. Bytes 6-7 of each thing are an integer which means the thing at that x,y
  322. location is one of these:
  323.  
  324. 1       Player 1 start
  325. 2       Player 2 start
  326. 3       Player 3 start
  327. 4       Player 4 start
  328. 5       Blue keycard
  329. 6       Yellow keycard
  330. 7       SPIDER BOSS (SPID)
  331. 8       Backpack
  332. 9       FORMER HUMAN SERGEANT (SPOS)
  333. 10      Bloody mess
  334. 11      The possible start positions for players in deathmatch mode. There
  335.         must be at least FOUR 11s on each level.
  336. 12      Bloody mess 2
  337. 13      Red Keycard
  338. 14      Marks the spot where a player (or enemy) lands when they teleport
  339.         to the SECTOR that contains this thing.
  340. 15      Dead player
  341. 16      CYBER-BOSS (CYBR)
  342. 17      Cell charge pack
  343. 18      Dead former human
  344. 19      Dead former sargeant
  345. 20      Dead imp
  346. 21      Dead demon
  347. 22      Dead cacodemon
  348. 23      ?
  349. 24      Pool of blood
  350. 25      Impaled human
  351. 26      Twitching impaled human
  352. 27      Skulltop pole
  353. 28      Head shishkebob
  354. 29      Pile of skulls with candle
  355. 30      Tall green pillar
  356. 31      Short green pillar
  357. 32      Tall red pillar
  358. 33      Short red pillar
  359. 34      Candle
  360. 35      Candelabra
  361. 36      Pedestal w/heart
  362. 37      Short red pillar with skull
  363. 38      Red skullkey
  364. 39      Yellow skullkey
  365. 40      Blue skullkey
  366. 41      Eye in symbol
  367. 42      Flaming skull-rock
  368. 43      Grey tree
  369. 44      Tall blue firestick
  370. 45      Tall green firestick
  371. 46      Tall red firestick
  372. 47      Small brown scrub
  373. 48      Tall, techno column
  374. 49      Swaying body
  375. 50      Hung by ankle, arms out
  376. 51      Hanging 1-legged human
  377. 52      Hanging torso
  378. 53      Severed Leg
  379. 54      Large brown tree
  380. 55      Short blue firestick
  381. 56      Short green firestick
  382. 57      Short red firestick
  383. 58      SPECTRE (SARG)
  384. 59      Hanging torso
  385. 60      Severed leg
  386. 61      Hanging 1-legged human
  387. 62      Hung by ankle, arms out
  388. 63      Swaying body
  389. 2001    Shotgun
  390. 2002    Chaingun
  391. 2003    Rocket launcher
  392. 2004    Plasma gun
  393. 2005    Chainsaw
  394. 2006    BFG9000
  395. 2007    Ammo clip
  396. 2008    4 shotgun shells
  397. 2010    1 rocket
  398. 2011    Stimpak
  399. 2012    Medikit
  400. 2013    Soulsphere = +100% health
  401. 2014    Health bonus
  402. 2015    Armor bonus
  403. 2018    Green armor 100%
  404. 2019    Blue armor 200%
  405. 2022    Invlnerability
  406. 2023    Berserk Strength
  407. 2024    Invisibility
  408. 2025    Radiation suit
  409. 2026    Computer map
  410. 2028    Floor lamp
  411. 2035    Barrel
  412. 2045    Lite goggles
  413. 2046    Box of Rockets
  414. 2047    Cell charge
  415. 2048    Box of Ammo
  416. 2049    Box of Shells
  417. 3001    IMP (TROO)
  418. 3002    DEMON (SARG)
  419. 3003    GOAT BOSS (BOSS)
  420. 3004    FORMER HUMAN (POSS)
  421. 3005    CACODEMON (HEAD)
  422. 3006    LOST SOUL (SKUL)
  423.  
  424. [3-3]: LINEDEFS
  425. ===============
  426.  
  427. Each linedef represents a line from one of the VERTEXES to another, and each
  428. has 7 (integer) fields:
  429.  
  430. 1. from the VERTEX with this number (the first vertex is 0)
  431. 2. to the VERTEX with this number (31 is the 32nd vertex)
  432. 3. attributes, see below
  433. 4. types, see below
  434. 5. is a "trigger" number which ties crossing this line to the SECTOR with
  435. this same number as its last field.
  436. 6. SIDEDEF one (always present, since this line adjoins at least 1 SECTOR)
  437. 7. SIDEDEF two, if this line adjoins 2 SECTORS
  438.  
  439. [3-3-1]: Linedef Attributes
  440. ---------------------------
  441.  
  442. The third field of each linedef is an integer which controls that line's
  443. attributes, as follows:
  444.  
  445. bit# = condition if it is set (=1)
  446.  
  447. bit0 =  impassibile (by players). Only really matters for lines between 2
  448.         sectors, lines adjoining just one sector are impassible regardless.
  449. bit1 =  ?, has to do with the above/below.
  450. bit2 =  may shoot through; also, "transparent", meaning the "above" and
  451.         "below" wall textures are displayed as appropriate.
  452. bit3 =  ?, has to do with the above/below.
  453. bit4 =  enemies do not cross this line (I think)
  454. bit5 =  a secret. this is NOT what determines the SECRET ratio at the end of
  455.         a level, that is done by special sectors (#9). So this bit is only
  456.         really useful for mapping.
  457. bit6 =  ?, to do with being high up/overhang.
  458. bit7 =  the "above" part is transparent to the sky behind. this one is
  459.         usually used in the outside courtyard areas.
  460. bit8-15 unused.
  461.  
  462. [3-3-2]: Linedef Types
  463. ----------------------
  464.  
  465. The integers in field 4 of a linedef control various special characteristics
  466. of that line, mostly to do with what happens to a "triggered" SECTOR when the
  467. line is crossed by a player.
  468.  
  469. The * means the linedef needs a trigger # (in field 5) to link it to the
  470. appropriate sector(s). $ and & mean the player activates the function by
  471. pressing spacebar: $ is for switches which operate once only, & is for doors
  472. which can be used over and over. And yes, some of the switches can be used
  473. over and over, which ones are they? @ means I'm not sure yet if it is
  474. one-time or repeatable.
  475.  
  476. Value = Effect
  477.  
  478. -1
  479. 0       Nothing special.
  480. 1 &     Door. Sector ceiling rises.
  481. 2 *     removes/raises sector permanently
  482. 3
  483. 5 *
  484. 7 *$    staircase rises up from floor in appropriate sectors.
  485. 8 *     stairs
  486. 9 *@
  487. 10
  488. 11 $    End level. Go to next level.
  489. 13
  490. 14
  491. 16 *
  492. 18 *$   floor of sector rises to equal height of neighbor sector. The first
  493.         sector height it finds "on the way up", amongst its neighbors, is
  494.         where it stops.
  495. 19
  496. 20 *$   floor rises to equal neighbor, and the floor's texture changes to
  497.         match that neighbor also.
  498. 21
  499. 22
  500. 23
  501. 24
  502. 26 &    Door. Need blue key to open.
  503. 27 &    Door. Yellow key.
  504. 28 &    Door. Red key.
  505. 29
  506. 30
  507. 31
  508. 32 $    Door. Blue key. Stays open.
  509. 33 $    Door. Yellow key. Stays open.
  510. 34 $    Door. Red key. Stays open.
  511. 35 *    sector's brightness goes to 0.
  512. 36 *    sector's floor drops to 8 above neighbor.
  513. 37
  514. 38
  515. 39 *    teleport to sector
  516. 40
  517. 41
  518. 42
  519. 44
  520. 46 *    Shoot this line, then sector ceiling rises to neighbor
  521. 48      Animated, horizontal scrolling wall.
  522. 51 $    End level. Go to secret level 9.
  523. 52
  524. 56
  525. 58
  526. 59
  527. 61
  528. 62
  529. 63
  530. 70 *@   sector floor drops to just above neighbor
  531. 73
  532. 74
  533. 75
  534. 76
  535. 77 *    Crushing ceiling!
  536. 82
  537. 86
  538. 87
  539. 88 *    sector floor drops to match neighbor
  540. 89
  541. 90
  542. 91
  543. 97 *    Teleport to...
  544. 98
  545. 102
  546. 103
  547. 104
  548.  
  549. Obviously, I'm still working on this list. These are all the values that
  550. occur anywhere in the registered version, but I haven't tested many of them
  551. yet.
  552.  
  553. [3-4]: SIDEDEFS
  554. ===============
  555.  
  556. A sidedef is a definition of what wall meta-textures to draw along the
  557. various LINEDEFS, and a group of sidedefs define a SECTOR.
  558.  
  559. There will be one sidedef for a line that borders only one sector, since it
  560. is not necessary to define what the doom player would see from the "other"
  561. side of that line because the doom player can't go there. The doom player
  562. can only "go" where there is a sector (unless you use the no clipping cheat,
  563. which will cause the screen to freak out if you go "outside" to a non-sector
  564. area).
  565.  
  566. Each SIDEDEF has 2 (integer) fields, then 3 (8-byte string) fields, then a
  567. final (integer) field:
  568.  
  569. 1. X offset for pasting the appropriate wall texture onto the wall's "space":
  570.    positive offset moves "into" the texture, so the left portion gets cut off
  571.    (# of columns off left side = offset). negative offset moves texture
  572.    farther right, in the wall's "space"
  573. 2. Y offset: analogous to the X, for vertical.
  574. 3. name of wall type 1 = the part "above" the juncture with a lower ceiling
  575.    of an adjacent SECTOR.
  576. 4. name of wall type 2 = the part "below" a juncture with a higher floored
  577.    adjacent SECTOR
  578. 5. name of wall type 3 = the regular part of the wall
  579. 6. SECTOR that this sidedef "helps to surround"
  580.  
  581. The wall type fields will be "-" if nothing, thus the sidedef for looking IN
  582. a "window" is "-" "-" "-". A typical sidedef, with no above or below, is
  583. "-" "-" "WALLNAME".
  584.  
  585. 00s fill the space after a wall name that is less than 8 characters.
  586.  
  587. The wall names are from the TEXTURE1/2 objects. The names in the DIRECTORY
  588. are not directly used, they are referenced through PNAMES.
  589.  
  590. [3-5]: VERTEXES
  591. ===============
  592.  
  593. These are the beginnings and ends for LINEDEFS and SEGS, each has
  594. 2 (integer) fields:
  595.  
  596. 1. X coordinate
  597. 2. Y coordinate
  598.  
  599. [3-6]: SEGS
  600. ===========
  601.  
  602. Each SEG has 6 (integer) fields
  603.  
  604. 1. from vertex #
  605. 2. to vertex #
  606. 3. angle: 0= east, 16384=north, -16384=south, -32768=west.
  607.    In hex, it's 0000=east, 4000=north, 8000=west, c000=south.
  608. 4. linedef that this seg goes along
  609. 5. 0 if it goes in the same direction as the linedef it is on. 1 if it goes
  610.    the opposite direction. "direction" is indicated by which vertex is first.
  611. 6. Is the distance along the linedef that the seg begins. If the seg begins
  612.    at one of the two endpoints of the linedef, this will be 0. If the seg and
  613.    linedef are a "diagonal" line, the length will be according to the
  614.    distance in the coordinate plane of the vertexes, i.e.
  615.  
  616.    SQR((X2 - X1)^2 + (Y2 - Y1)^2).
  617.  
  618.    Actually, it seems to be off by 1 or 2 from what it should be, like they
  619.    are using ABS(X2 - X1) values that are 1 less than the "real" value
  620.    should be.
  621.  
  622. [3-7]: SSECTORS
  623. ===============
  624.  
  625. each SSECTOR has 2 (integer) fields
  626.  
  627. 1. # of SEGS in this SSECTOR
  628. 2. starting with this SEG #
  629.  
  630. The segs that make up a ssector are the sides (or parts of the sides) of a
  631. polygon, SOMETIMES. Many of the ssectors are only 1 SEG.
  632.  
  633. [3-8]: NODES
  634. ============
  635.  
  636. There are ((number of SSECTORS) - 1) NODES. Each NODE has 14 (integer)
  637. fields:
  638.  
  639. 1. X coordinate of nodeline's start
  640. 2. Y coordinate of nodeline's start
  641. 3. X offset to end of nodeline
  642. 4. Y offset to end of nodeline
  643.  
  644. thus 64, 128, -64, -64 would be a nodeline from (64,128) to (0,64)
  645.  
  646. 5/6.    Y coordinates bounding the nodesq1 on the right side of the nodeline.
  647. 7/8.    X coordinates bounding the nodesq1 on the right side of the nodeline.
  648. 9/10.   Y coords bounding the nodesq2 on the left side of the nodeline.
  649. 11/12.  X coords bounding the nodesq2 on the left side of the nodeline.
  650. 13.     Is a NODE or SSECTOR number for nodesq1. If bit15 of this 2-byte
  651.         field is set, it means that the nodesq1 contains the SSECTOR whose
  652.         number is in the remaining bits. If the bit15 is not set, then
  653.         nodesq1 is a previously listed NODE.
  654. 14.     As with field 13, for nodesq2 on the left.
  655.  
  656. Each node is thus a "sum" of two other rectangular horizontal spaces, each
  657. of which contains either a NODE or a SSECTOR. So there is a heavy iterative
  658. aspect to this structure. The final NODE is always the size of the entire
  659. level. When a SSECTOR is being "contained", the X and Y coordinates of the
  660. nodesq are such that every SEG in that SSECTOR is completely within the
  661. nodesq. If a NODE is being "contained", then the coordinates will bound the
  662. furthest extent of that (recursed) NODE.
  663.  
  664. So what are the nodes for? I don't know yet. Stopped working on it a while
  665. back. Will finish sooner or later. Also, need to create an algorithm to
  666. generate the segs, ssectors, and nodes, given the vertexes and linedefs.
  667.  
  668. [3-9]: SECTORS
  669. ==============
  670.  
  671. A SECTOR is a horizontal (east-west and north-south) area of the map where a
  672. floor height and ceiling height is defined, so a doom player may go there.
  673. Any change in floor or ceiling "altitude" or texture requires a new SECTOR
  674. (and therefore separating LINEDEF(s) and SIDEDEF(s)).
  675.  
  676. Each is 2 (integer) fields, 2 (8-byte string) fields, then 3 (integer)
  677. fields:
  678.  
  679. 1. floor is at this "altitude" for this sector
  680. 2. ceiling altitude
  681.  
  682. the altitudes range from -264 to 264. a difference of 28 between the floor
  683. heights of two adjacent sectors is passable (upwards), but a difference of
  684. 32 is "too high". The player may fall any amount.
  685.  
  686. 3. name of floor texture, from the DIRECTORY
  687. 4. name of ceiling texture, from DIRECTORY
  688.  
  689. (note: all the ones listed in the DIRECTORY work as either floors or
  690. ceilings)
  691.  
  692. 5. brightness of this sector: 0=total dark, 255=maximum bright
  693. 6. special sector:
  694.         0 is normal
  695.         1 light level "blinks" randomly
  696.         2 light quickly pulsates
  697.         3 blinks: off for a while, then on quickly
  698.         4 pulsates AND take 10/20% health hit when stand here
  699.         5 -5/10% health (-5% at skill 1, -10% at higher skills)
  700.         6 UNKNOWN SPECIAL SECTOR, causes program to exit to DOS
  701.         7 -2/5%
  702.         8 ?, light pulsates usually, but not always.
  703.         9 SECRET (player must walk into this sector to get credit for
  704.           discovering this "secret")
  705.         10 ?
  706.         11 -10/20% health
  707.         12 blink
  708.         13 quick pulsate
  709.         14 ?
  710.         15 UNKNOWN SPECIAL SECTOR, useless
  711.         16 -10/20%
  712.  
  713.         17 and up are all UNKNOWN
  714.  
  715. 7. is a "trigger" number corresponding to a certain LINEDEF with the same
  716.    "trigger" number. When that LINEDEF is crossed, something happens to this
  717.    SECTOR - it goes up or down, etc...
  718.  
  719. [3-10]: REJECT
  720. ==============
  721.  
  722. Reject is an array of bits. It's size in bytes is
  723.  
  724. (number of SECTORS ^ 2) / 8, rounded up.
  725.  
  726. "It is used for optimization and all the bits may be set to 0" -
  727. this is from John Carmack at id software.
  728.  
  729. In fact, the length of the object may be made 0 (same as making it all 0s),
  730. and the only thing different about the level is that sometimes enemies seem
  731. to "float" when they walk off a step or platform to a lower one.
  732.  
  733. [3-11]: BLOCKMAP
  734. ================
  735.  
  736. All of BLOCKMAP's fields are integers.
  737.  
  738. The whole level is cut into "blocks", each hex 8                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                k will go something like: 0 330 331 333 -1. This means that
  739. LINEDEFS 330, 331, and 333 are "in" that block. Part of each of those line
  740. segments lies within the (hex 80 by 80) boundaries of that block.
  741.  
  742. What about the block that has LINEDEF 0? It goes: 0 0 ... etc ... -1.
  743.  
  744. If you don't have a BLOCKMAP, the level displays fine, but everybody walks
  745. through walls, and no one can hurt anyone else with their gunfire.
  746.  
  747. -----------------------------
  748. CHAPTER [4]: Pictures' Format
  749. -----------------------------
  750.  
  751. The great majority of the entries if the directory reference resources that
  752. are in a special "picture" format. The same format is used for the pictures
  753. of items (like medikits), the frames that make up enemies (like demons), the
  754. wall patches, and various miscellaneous pictures for the status bar, menu
  755. text, inter-level map, and etc. The floor and ceiling textures are NOT in
  756. this format, they are raw data; see chapter 5.
  757.  
  758. Each picture has three sections, basically. First, a four-integer header.
  759. Then a number of long-integer pointers. Then the picture pixel color data.
  760.  
  761. [4-1]: Header
  762. =============
  763.  
  764. The header has four fields:
  765.  
  766. 1. The number of columns of picture data
  767. 2. The number of rows
  768.  
  769. this defines a rectangular "space" or limits for drawing a picture within
  770.  
  771. 3. leftwards x offset from the center to begin the first column. positive
  772.    value moves left.
  773. 4. upwards y offset from the bottom to begin the first row. positive value
  774.    moves up.
  775.  
  776. To be "centered", #3 is usually about half of the total width. If the picture
  777.  
  778. had 30 columns, and #3 was 0, then it would be off-center to the right,
  779. especially when the player is standing right in front of it, looking at it.
  780. If a picture has 30 rows, and #4 is 60, it will appear to "float" like a
  781. blue soul-sphere. If #4 equals the number of rows, it will appear to rest on
  782. the ground. If #4 is more than 5 less than #2, the bottom part of the picture
  783.  
  784. looks akward.
  785.  
  786. With walls patches, #3 is always (columns/2)-1, and #4 is always (rows)-5.
  787. This is because the walls are drawn consistently within their own space.
  788. (There are two integers in each SIDEDEF which can offset the beginning of a
  789. wall)
  790.  
  791. Finally, if #3 and #4 are NEGATIVE integers, then they are the absolute
  792. coordinates from the top-left corner of the screen, to begin drawing the
  793. picture, assuming the VIEW is FULL-SCREEN (the full 320x200). This is only
  794. done with the pictures of the weapons of the doom player - fist, chainsaw,
  795. bfg9000, etc. The game engine scales the picture down appropriately if the
  796. view is less than full-screen.
  797.  
  798. [4-2]: Pointers
  799. ===============
  800.  
  801. After the header, there are N = (# of columns) long integers (4 bytes each).
  802. These are pointers to the data for each COLUMN. The value of the pointer
  803. represents the offset from the first byte of that picture.
  804.  
  805. [4-3]: Pixel Data
  806. =================
  807.  
  808. Each column is composed of some number of BYTES (NOT integers), arranged in
  809. sets:
  810.  
  811. The first byte is the row to begin drawing this set at. 0 means whatever
  812. height the header#4 upwards-offset describes.
  813.  
  814. The second byte is how many colored pixels (non-transparent) to draw, going
  815. downwards.
  816.  
  817. Then follow (# of pixels) + 2 bytes, which define what color each pixel is,
  818. using the game palette. The first and last bytes AREN'T drawn, and I don't
  819. know why they are there. Probably just leftovers from the creation process on
  820. the NeXT machines. Only the middle (# of pixels in this set) are drawn,
  821. starting at the row specified in byte 1 of the set.
  822.  
  823. After the last byte of a set, either the column ends, or there is another
  824. set,
  825. which will start as stated above.
  826.  
  827. 255 (hex FF) ends the column, so a column that starts this way is a null
  828. column, all "transparent". Goes to the next column.
  829.  
  830. Thus, transparent areas can be defined for either items or walls (but you
  831. should only use a wall with transparent parts on a SIDEDEF between two
  832. SECTORS):
  833.  
  834. Note that all the item and enemy pictures names are in the DIRECTORY between
  835. the S_START and S_END entries, and all the wall patches are  between the
  836. P_START and P_END entries.
  837.  
  838. ---------------------------------------
  839. CHAPTER [5]: Floor and Ceiling Textures
  840. ---------------------------------------
  841.  
  842. All the names for these textures are in the DIRECTORY between the F_START and
  843. F_END entries. There is no look-up or meta-structure as with the walls.
  844.  
  845. Each texture is 4096 raw bytes, making a square 64 by 64 pixels, which is
  846. pasted onto a BLOCK's floor or ceiling, with the same orientation as the
  847. automap would imply, i.e. the first byte is the color at the NW corner, the
  848. 64th is the color at the NE, etc.
  849.  
  850. The data in F_SKY1 isn't even used since the game engine interprets that
  851. "special" ceiling as see-thru to the SKY texture beyond. So the F_SKY1 entry
  852. can have zero length.
  853.  
  854. -----------------------------
  855. CHAPTER [6]: Sounds and Songs
  856. -----------------------------
  857. Not much detail necessary here, since I'm just guessing at the song format
  858. anyway.
  859.  
  860. [6-1]: D_[xxxxxx]
  861. =================
  862.  
  863. Songs, probably in general MIDI format. It's obvious what each song is for,
  864. from their names.
  865.  
  866. [6-2]: DP[xxxxxx] and DS[xxxxxx]
  867. ================================
  868.  
  869. These are the sound effects. They come in pairs - DP for pc speaker sounds,
  870. DS for sound cards.
  871.  
  872. The DS sounds are in RAW format: they have a four integer header, then the
  873. sound samples (each sample is 1 byte).
  874.  
  875. The headers' four integers are: 3, then 11025 (the sample rate), then the
  876. # of samples, then 0.
  877.  
  878. ------------------------------------------------
  879. CHAPTER [7]: Miscellaneous Non-picture Resources
  880. ------------------------------------------------
  881.  
  882. [7-1]: PLAYPAL
  883. ==============
  884.  
  885. There are 14 palettes here, each is 768 bytes = 256 rgb triples. That is, the
  886.  
  887. first three bytes of a palette are the red, green, and blue portions of
  888. color 0. And so on.
  889.  
  890. Palette 0 is the one that is used for almost everything.
  891.  
  892. Palette 10-12 are used (briefly) when an item is picked up, the more items
  893. that are picked up in quick succession, the brighter it gets, palette 12
  894. being the brightest.
  895.  
  896. Palette 13 is used while wearing a rad suit.
  897.  
  898. Palettes 3, then 2, are used after getting beserk strength.
  899.  
  900. If the player is hurt, then the palette shifts up to X, then comes "down" one
  901.  
  902. every half second or so, to palette 2, then palette 0 (normal) again.
  903. What X is depends on how badly the player got hurt: Over 100% damage
  904. (add health loss and armor loss), X=8. 93%, X=7. 81%, X=6. 55%, X=5.
  905. 35%, X=4. 16%, X=2.
  906.  
  907. Palettes 1 and 9 contain the secret codes which allow you to play
  908. Commercial Doom eight months before it gets released. Just kidding!
  909.  
  910. [7-2]: COLORMAP
  911. ===============
  912.  
  913. This resource contains 34 sets of 256 bytes, which "map" the colors "down" in
  914.  
  915. brightness. (Brightness is controlled by the 5th field in the SECTORS, see
  916. chapter 3-9 above). E.g. at very low brightness, almost all the colors are
  917. "mapped" to black, the darkest grey, green, blue, etc. In each set of 256
  918. bytes, byte 0 will have the number of the palette color to which original
  919. color 0 gets mapped. Etc. Which set of 34 corresponds to which exact
  920. brightness level is something I haven't bothered to figure out. Better things
  921.  
  922. to do...like the maps.
  923.  
  924. [7-3]: DEMOs
  925. ==============
  926.  
  927. These are the demos that will be shown if you start doom, but don't play an
  928. episode. Each has a record of the keystrokes. Didn't bother to figure the
  929. formats out, since demos can be created using the devparm parameter:
  930.  
  931. DOOM -devparm -record DEMONAME
  932.  
  933. The extension .LMP is automatically added to the DEMONAME. Other parameters
  934. may be used simultaneously, such as -skill [1-4], -warp [1-3] [1-9]. The
  935. demos in the WAD are in exactly the same format as these LMP files, so a LMP
  936. file may be simply pasted or assembled into a WAD, and if its length and
  937. pointer directory entries are correct, it will work.
  938.  
  939. [7-4]: TEXTURE1 and TEXTURE2
  940. ============================
  941.  
  942. These resources contains a list of the wall names used in the various
  943. SIDEDEFS sections of the level data. Each wall name actually references a
  944. meta-structure, defined in this list. TEXTURE2 has all the walls that are
  945. only in the registered version.
  946.  
  947. Each entry in this list begins with a 8-byte "name" field, but then each
  948. entry has variable length.
  949.  
  950. All the remaining fields of an entry are integers.
  951. The second and third fields are always 0 and 0. Purpose is unknown.
  952.  
  953. The fourth and fifth fields define the width in columns and height in rows,
  954. for this entry, thus defining a "space" (usually 32 by 128 or 64 by 72
  955. or etc...) in which individual wall textures are "placed" to form the overall
  956. picture. This is done because there are some wall patches that are used in
  957. several different walls, like computer screens, etc.
  958.  
  959. The sixth and seventh fields are 0 and 0. Purpose unknown.
  960.  
  961. The eigth field is the number of 5-integer "sets" that follow. Each "set"
  962. defines a wall texture for placement, and the integers within each set mean
  963. this:
  964.  
  965. 1. x offset from top-left corner of "space" (size defined in field 4/5) to
  966.    start placement of this "patch"
  967. 2. y offset
  968. 3. number, from 0 to 349, of the entry in the PNAMES object, which contains
  969.    the name from the DIRECTORY, of the wall patch to use...
  970. 4. always 1
  971. 5. always 0
  972.  
  973. Some of the entries have 1 "patch", one has 64 "patches"!
  974.  
  975. [7-5]: PNAMES
  976. =============
  977.  
  978. This is a lookup table for the numbers in TEXTURE[1 or 2] to reference
  979. to an actual entry in the DIRECTORY which is a wall patch (in the
  980. picture format described in chapter 4).  The middle integer of each
  981. 5-integer "set" of a TEXTURE1 entry is something from 0 to 349.
  982. Number 0 means the first entry in this PNAMES list, 1 is the second,
  983. etc...
  984.  
  985. Every entry in this list is eight bytes, and exactly duplicates an entry in
  986. the DIRECTORY.
  987.  
  988.