home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Doom 2 Explosion
/
Doom2Explosion.bin
/
doom2exp
/
programs
/
mde10
/
dmspcs12.txt
next >
Wrap
Text File
|
1994-03-10
|
60KB
|
1,362 lines
-----------------------------------------------------------------------------
T H E U N O F F I C I A L *-D-*-*-O-*-*-O-*-*-M-* S P E C S
Release v1.2 - March 6, 1994 EST
Written by: Matt Fell (matt.burnett@acebbs.com)
Released by: Hank Leukart (ap641@cleveland.freenet.edu)
"DOOM: Where hackers gnaw the bones left from the banquet
of data prepared by the mighty wizards of id."
"The poets talk about love, but what I talk about is DOOM,
because in the end, DOOM is all that counts."
- Alex Machine/George Stark/Stephen King, _The Dark Half_
-----------------------------------------------------------------------------
----------
DISCLAIMER
----------
These specs are to aid in informing the public about the game DOOM,
by id Software. In no way should this promote your killing yourself, killing
others, or killing in any other fashion. Additionally, neither Hank Leukart
nor Matt Fell claim ANY responsibility regarding ANY illegal activity
concerning this file, or indirectly related to this file. The information
contained in this file only reflects id Software indirectly, and questioning
id Software regarding any information in this file is not recommended.
---------
COPYRIGHT
---------
You may NOT distribute this work by any non-electronic media,
including but not limited to books, newsletters, magazines, manuals,
catalogs, and speech. You may NOT distribute this work in electronic
magazines, or within computer software without prior written explicit
permission. These rights are temporary and revocable upon written, oral,
or other notice by Hank Leukart. This copyright notice shall be governed
by the laws of the state of Ohio.
If you would like additional rights beyond those granted above,
write to the distributor at "ap641@cleveland.freenet.edu" on the Internet.
------------
INTRODUCTION
------------
Here are the long awaited unofficial specs for DOOM. These specs
should be used for creating add-on software for the game. I would like to
request that these specs be used in making utilities that ONLY work on the
registered version of DOOM.
I do not understand much of what is contained in this file, so if
you have any questions about the information, write to Matt Fell at
"matt.burnett@acebbs.com" on the Internet. If you would like to request a
copy of this file, or have any questions about its distribution, write to me,
Hank Leukart, at "ap641@cleveland.freenet.edu" on the Internet.
--------
CONTENTS
--------
[1] Author's Notes
[1-1] Acknowledgements
[2] Basics
[3] Directory Overview
[4] The Maps, The Levels
[4-1] ExMy
[4-2] THINGS
[4-2-1] Thing Types
[4-3] LINEDEFS
[4-3-1] Linedef Attributes
[4-3-2] Linedef Types
[4-4] SIDEDEFS
[4-5] VERTEXES
[4-6] SEGS
[4-7] SSECTORS
[4-8] NODES
[4-9] SECTORS
[4-10] REJECT
[4-11] BLOCKMAP
[5] Pictures' Format
[5-1] Headers
[5-2] Pointers
[5-3] Pixel Data
[6] Floor and Ceiling Textures
[6-1] Animated floors
[7] Songs and Sounds
[7-1] Songs
[7-2] Sounds
[8] Miscellaneous Non-Picture Resources
[8-1] PLAYPAL
[8-2] COLORMAP
[8-3] DEMOs
[8-4] TEXTURE1 and TEXTURE2
[8-4-1] Animated walls
[8-5] PNAMES
---------------------------
CHAPTER [1]: Author's Notes
---------------------------
I didn't want to release another incomplete version of the specs, but
the NODES structure is so much more difficult than all of the other stuff,
I'm not sure how much longer it will be until either I or someone
helping me can figure it out. Since I have almost complete information
on everything else, I felt I should go ahead and release this now.
Without knowing how to do the NODES, we still can't create levels from
scratch. So these specs will have to undergo another revision. I've heard
rumors of the hint book, with the official specs, being released "soon";
if anyone knows more about this, or if they get the book, please contact me.
I haven't kept track of all the minor revisions that have been made since
1.1, sorry. You can get rid of the 1.1 specs, as this has everything it
had except the errors :-)
id SOFTWARE'S COPYRIGHT AND THE SHAREWARE VERSION:
I'm moving the location of the soapbox I had in the 1.1 Specs to here. I'm
certainly not an official spokesman for id. I have made some inquiries to
them regarding specific questions on third-party additions. Until they
respond, though, I'll just make a couple excerpts from the official
documents we have at this time:
The LICENSE.DOC says
"You may not: rent, lease, modify, translate, disassemble,
decompile, reverse engineer, or create derivative works based
upon the Software. Notwithstanding the foregoing, you may create
a map editor, modify maps and make your own maps (collectively
referenced as the "Permitted Derivative Works") for the Software.
You may not sell or distribute any Permitted Derivative Works but
you may exchange the Permitted Derivative Works at no charge
amongst other end-users."
It also says
(except for backup purposes) "You may not otherwise reproduce,
copy or disclose to others, in whole or in any part, the Software."
I think this is clear. You may not distribute a WAD file that contains
any of the original entries from DOOM.WAD.
Then how can you just make a new set of THINGS for a level? Simple. Have
a pwad file that has only two entries - E3M1 for example, and THINGS.
The README.EXE says
"id Software respectfully requests that you do not modify the
levels for the shareware version of DOOM. We feel that the
distribution of new levels that work with the shareware version
of DOOM will lessen a potential user's incentive to purchase the
registered version.
"If you would like to work with modified levels of DOOM, we
encourage you to purchase the registered version of the game."
I feel that this is also pretty clear: if you distribute levels, they should
not work with the shareware version. This is easily accomplished: do
not distribute ANY episode one maps! The shareware version cannot work
with episode 2 or 3 pwads, but it can work with episode 1 pwads (they
should have disabled the -file feature in the shareware).
If you are writing a utility that will operate on DOOM, have it first check
the WAD file for the existence of an "E3M1" entry in the directory (explained
below), or some other entry that will only be in the registered version.
If it's not there, the program should quit. You should not be making
programs that will work on the shareware version.
The point is that the regular shareware players shouldn't be able to exceed
their rights. They are getting a complete game as it is!
[1-1]: Acknowledgements
=======================
I have received much assistance lately from the following people. They
either brought mistakes to my attention, or provided additional information
that I've incorporated into these specs:
Ted (tedv@geom.umn.ed) - I had the THING angles wrong. Unforgivable.
Matt Tagliaferri (matt.tagliaferri@pcohio.com) - I forgot to describe the
TEXTURE1/2 pointer table. Also, gave lots of help with linedef types.
Raphael Quinet (quinet@montefiore.ulg.ac.be) - The author of the NEWDEU
editor; new info on linedef types and attributes, special sectors.
Robert Fenske (fenske@swri.edu) - part of the VERDA team, gave lots of help
on linedef attributes and types, blockmap list, special sectors,
and other stuff
John A. Matzen (jamatzen@cs.twsu.edu) - instrument names in GENMIDI.
Jeff Bird (jeff@wench.ece.jcu.edu.au) - good ideas and suggestions about
the nodes.
Sorry if I left anyone out. Thanks for all the help!
If you have any comments, have spotted any errors, or have any possible
additions, please send me e-mail. Questions will be gladly answered also,
no matter how trivial, unless I get too many, which I doubt. Please note,
however, that if it's not in here, I'm either working on it or I just don't
know it. If YOU know "it", tell me!
-------------------
CHAPTER [2]: Basics
-------------------
Don't make episode 1 maps! Don't make utilities that work on the shareware
version! For more information on this, see Chapter [1].
There are two types of WAD files. The original DOOM.WAD file is an "IWAD",
meaning it contains all of the data necessary to play. The other type is the
"PWAD" file, an external file which has the same structure, but with far
fewer entries in the directory (explained below). The data in a PWAD is
substituted for the original data in the DOOM.WAD, thus allowing for much
easier distribution of new levels. Only what the PWAD wants to change is
changed, everything else stays the same. Most PWADs will contain the 11
entries necessary to define a single level. For example, if Bill Clinton
were to create a new level 7 for episode 3, he might call it BILLC-37.WAD
To use this level instead of the original E3M7 level, a player would type
DOOM -FILE BILLC-37.WAD
at the command line, along with any other parameters. More than one can be
done at the same time, thus in general
DOOM -FILE [pwad_filename] [pwad_filename] [pwad_filename] ...
When the game loads, a "modified game" message will appear if there are any
PWADs involved, reminding the player that id Software will not give technical
support or answer questions regarding modified levels.
Note that PWAD files must have the .WAD extension to work - I've tried
extensions like .PWD and .37 and they don't work.
The original doom levels are pretty complicated, and they are from 50-200
kilobytes in size, uncompressed. My simple prototype levels are just a
few kbytes. I'm estimating that my first epsiode 2 with 9 complete levels
plus a few other things, will be about 1 megabyte uncompressed, about 300k
in a ZIP file.
The first twelve bytes of a WAD file are as follows:
Bytes 0 to 3 - must contain the ASCII letters "IWAD" or "PWAD"
Bytes 4 to 7 - contain a long integer which is the number of entries in the
"directory"
Bytes 8 to 11 - contain a pointer to the first byte of the "directory"
(Bytes 12 to the start of the directory contain resource data)
The directory referred to is a list, located at the end of the WAD file,
which contains the pointers, lengths, and names of all the resources in the
WAD file. The resources in the wad include item pictures, monster's pictures
for animation, wall patches, floor and ceiling textures, songs, sound
effects, map data, and many others.
Specifically, the first 12 bytes of the DOOM.WAD file in version 1.2, which
I am working with, are (in hexadecimal):
49 57 41 44 fd 07 00 00 84 2e 9e 00
This is "IWAD", then 7fd hex (=2045 decimal) for the number of directory
entries, then 9e2e84 (=10366596 decimal) for the first byte of the directory.
Each directory entry is 16 bytes long, arranged this way:
First four bytes: pointer to start of resource (a long integer)
Next four bytes: length of resource (another long integer)
Last eight bytes: name of resource, in ASCII letters, ending with
00s if less than eight bytes.
-------------------------------
CHAPTER [3]: Directory Overview
-------------------------------
This is a list of most of the directory entries.
PLAYPAL contains fourteen 256 color palettes, used while playing Doom.
COLORMAP maps colors in the palette down to darker ones, for areas of less
than maximum brightness (quite a few of these places, huh?).
ENDOOM is the text message displayed when you exit to DOS.
DEMOx x=1-3, are the demos which will play if you just sit and watch.
E1M1 etc, to E3M9, along with its 10 subsequent entries, defines the
map data for a single level or mission.
TEXTURE1 is a list of wall type names used in the SIDEDEF portion of each
level's data, and their composition data, i.e. what wall patches
make up each "meta-wall".
TEXTURE2 contains the walls that are only in the registered version.
PNAMES is the list of wall patches, which are referenced by number in
the TEXTURE1/2 resources.
GENMIDI has the names of every General Midi standard instrument in order
from 0-127. Anyone know more...?
DMXGUS obviously has to do with Gravis Ultra Sound...
D_ExMy is the music for episode x level y.
D_INTER is the music played on the summary screen between levels.
D_INTRO is the the 4 second music played when the game starts.
D_INTROA is also intoductory music.
D_VICTOR is the music played on the victory text-screen after an episode.
D_BUNNY is music for while a certain rabbit has his story told...
DP_xxxxx DP and DS come in pairs and are the sound effects.
DS_xxxxx DP_ are the PC speaker sounds, DS_ are the sound card sounds.
all the remaining entries in the directory, except the floor textures at the
end, and the "separators" like S_START, refer to resources which are pictures
in the doom/wad picture format described in chapter [4].
The next seven are full screen (320 by 200 pixel) pictures:
HELP1 The ad-screen that says Register!, with some screen shots
HELP2 The actual help, all the controls explained
TITLEPIC Maybe this is the title screen? Gee, I dunno...
CREDIT The credits, the people at id Software who created this great game
VICTORY2 The screen shown after a victorious end to episode 2
PFUB1 A nice little rabbit minding his own peas and queues...
PFUB2 ...maybe a hint of what's waiting in Doom Commercial version.
ENDx x=0-6, "THE END" text, with (x) bullet holes.
AMMNUMx x=0-9, are the grey digits used in the status bar for ammo count.
STxxxxxx are small pictures and text used on the status bar.
M_xxxxxx are text messages (yes, in picture format) used in the menus.
BRDR_xxx are tiny two pixel wide pictures use to frame the viewing window
when it is not full screen.
WIxxxxxx are pictures and messages used on the summary screen after
the completion of a level.
WIMAPx x=0-2, are the summary-screen maps used by each episode.
S_START has 0 length and is right before the item/enemy section
S_END is immediately after the last "sprite"
P_START marks the beginning of the wall patches
P1_START before the first of the shareware wall patches
P1_END after the last of the shareware wall patches
P2_START before the first of the registered wall patches
P2_END before the first of the registered wall patches
P_END marks the end of the wall patches
F_START marks the beginnning of the floors
F1_START before the first shareware floor texture
F1_END after the last shareware floor texture
F2_START before the first registered floor texture
F2_END after the last registered floor texture
F_END marks the end of the floors
And that's the end of the directory. Detailed info on specific resources
follows...
---------------------------------
CHAPTER [4]: The Maps, The Levels
---------------------------------
Each level needs eleven resources/directory entries: E[x]M[y] (where x is a
single digit 1-3 for the episode number and y is 1-9 for the mission/level
#), THINGS, LINEDEFS, SIDEDEFS, VERTEXES, SEGS, SSECTORS, NODES, SECTORS,
REJECT, BLOCKMAP.
[4-1]: ExMy
===========
This is just the name resource for a (single) level, and has zero length.
In the DOOM.WAD file, each is followed by all ten of the component resources
for that level. In a pwad external file, they don't all need to be present.
Whichever entries are in a pwad will be substituted for the originals.
For example, a pwad with just two entries, E3M1 and THINGS, would use all
the walls and such from the original E3M1, but could have a completely
different set of THINGS on it.
[4-2]: THINGS
=============
Each thing is ten bytes, consisting of five (integer) fields:
(1) X coordinate of thing
(2) Y coordinate of thing
Each level has a different "range" to its coordinates. On E1M1, X ranges
from (c.) -288 to +3440, and Y ranges from (c.) -4832 to -2144.
On the automap within the game, with the grid on (press 'G'), the lines are
hex 80 (decimal 128) apart, two lines = hex 100, dec 256.
(3) Angle the thing faces. On the automap, 0 is east, 90 is north, 180 is
west, 270 is south.
This value is only used for enemies, player starts, deathmatch random starts,
and teleporter incoming spots. Other things look the same from all
directions. Values are rounded to the nearest 45 degree angle, so if the
value is 80, it will actually face 90 - north.
(4) Type of thing, see next subsection
(5) Attributes of thing, which are set by bits:
bit 0 is set if the THING is present at skill 1 and 2
bit 1 is set if the THING is on skill 3 (hurt me plenty)
bit 2 is set if the THING is on skill 4 and 5 (ultra-violence, nightmare)
The skill settings are most used with the ENEMIES, of course...the
most common skill level settings are hex 07/0f (on all skills),
06/0e (on skill 3-4-5), and 04/0c (only on skill 4-5).
bit 3 is set to indicate a deaf guard. This only has meaning for enemies,
who will not attack until they see a player if they are "deaf".
Otherwise, they will activate when they hear gunshots, etc. Sound
does not travel through solid walls (walls that are solid at the
time of the noise). Also, lines can be set so that sound does not
pass through them (see [3-3-1] bit 6). This attribute is also
known as the "ambush" attribute.
bit 4 makes the THING only appear in multiplayer mode.
bits 5-15 have no effect.
[4-2-1]: Thing Types
--------------------
Bytes 6-7 of each thing are an integer which specifies what kind it is.
Symbol means
CAPITAL It's a monster; counts towards KILL ratio at end of level.
$ A regular item that you can get.
! An artifact item whose acquisition counts towards the ITEM ratio
at the end of a level
* An obstacle, something that players and monsters can't move through.
2,3,4 Indicates number of different frames for animated things, except
monsters
Decimal Hex Thing is:
0 0000 (nothing?)
1 0001 Player 1 start
2 0002 Player 2 start for cooperative mode multiplayer games.
3 0003 Player 3 start " "
4 0004 Player 4 start " "
5 0005 2$ Blue keycard
6 0006 2$ Yellow keycard
7 0007 * SPIDER DEMON: giant walking brain boss (SPID)
8 0008 2$ Backpack
9 0009 * FORMER HUMAN SERGEANT: black armor shotgunners (SPOS)
10 000a Bloody mess (an exploded player)
11 000b Deathmatch start positions. Must be at least 4 per level.
12 000c Bloody mess, exactly the same as 10
13 000d 2$ Red Keycard
14 000e Marks the spot where a player (or enemy) lands when
they teleport to the SECTOR that contains this thing.
15 000f Dead player
16 0010 * CYBER-DEMON: robo-boss, rocket launcher (CYBR)
17 0011 $ Cell charge pack
18 0012 Dead former human
19 0013 Dead former sargeant
20 0014 Dead imp
21 0015 Dead demon
22 0016 Dead cacodemon
23 0017 Dead lost soul, invisible since they blow up when killed
24 0018 Pool of blood
25 0019 * Impaled human
26 001a 2* Twitching impaled human
27 001b * Skull on a pole
28 001c * 5 skulls shishkebob
29 001d 2* Pile of skulls and candles
30 001e * Tall green pillar
31 001f * Short green pillar
32 0020 * Tall red pillar
33 0021 * Short red pillar
34 0022 Candle
35 0023 * Candelabra
36 0024 2* Short green pillar with beating heart
37 0025 * Short red pillar with skull
38 0026 2$ Red skullkey
39 0027 2$ Yellow skullkey
40 0028 2$ Blue skullkey
41 0029 3* Eye in symbol
42 002a 3* Flaming skull-rock
43 002b * Grey tree
44 002c 4* Tall blue firestick
45 002d 4* Tall green firestick
46 002e 4* Tall red firestick
47 002f * Small brown scrub
48 0030 * Tall, techno column
49 0031 3* Hanging victim, swaying, legs gone
50 0032 * Hanging victim, arms out
51 0033 * Hanging victim, 1-legged
52 0034 * Hanging victim, upside-down, upper body gone
53 0035 * Hanging severed leg
54 0036 * Large brown tree
55 0037 4* Short blue firestick
56 0038 4* Short green firestick
57 0039 4* Short red firestick
58 003a * SPECTRE: invisible version of the DEMON (SARG)
59 003b Hanging victim, arms out
60 003c Hanging victim, upside-down, upper body gone
61 003d Hanging victim, 1-legged
62 003e Hanging severed leg
63 003f 3 Hanging victim, swaying, legs gone
2001 07d1 $ Shotgun
2002 07d2 $ Chaingun, gatling gun, mini-gun, whatever
2003 07d3 $ Rocket launcher
2004 07d4 $ Plasma gun
2005 07d5 $ Chainsaw
2006 07d6 $ BFG9000
2007 07d7 $ Ammo clip
2008 07d8 $ 4 shotgun shells
2010 07da $ 1 rocket
2011 07db $ Stimpak
2012 07dc $ Medikit
2013 07dd 4! Soulsphere, Supercharge, +100% health
2014 07de 4! Health bonus
2015 07df 4! Armor bonus
2018 07e2 2$ Green armor 100%
2019 07e3 2$ Blue armor 200%
2022 07e6 4! Invulnerability
2023 07e7 ! Berserk Strength
2024 07e8 4! Invisibility
2025 07e9 ! Radiation suit
2026 07ea 4! Computer map
2028 07ec * Floor lamp
2035 07f3 2* Barrel - if blown up, doesn't block way anymore.
2045 07fd 2! Lite goggles
2046 07fe $ Box of Rockets
2047 07ff $ Cell charge
2048 0800 $ Box of Ammo
2049 0801 $ Box of Shells
3001 0bb9 * IMP: brown fireball hurlers (TROO)
3002 0bba * DEMON: pink bull-like chewers (SARG)
3003 0bbb * BARON OF HELL: cloven hooved boss (BOSS)
3004 0bbc * FORMER HUMAN: regular pistol shooting slimy human (POSS)
3005 0bbd * CACODEMON: red one-eyed floating heads. Behold... (HEAD)
3006 0bbe * LOST SOUL: flying flaming skulls, like to bite (SKUL)
[4-3]: LINEDEFS
===============
Each linedef represents a line from one of the VERTEXES to another, and each
is 14 bytes, containing 7 (integer) fields:
(1) from the VERTEX with this number (the first vertex is 0).
(2) to the VERTEX with this number (31 is the 32nd vertex).
(3) attributes, see [3-3-1] below.
(4) types, see [3-3-2] below.
(5) is a "trigger" or "tag" number which ties this line's "effect" type to
all SECTORS that have the same "trigger" number in their last field.
(6) "right" SIDEDEF, indexed number.
(7) "left" SIDEDEF, if this line adjoins 2 SECTORS. Otherwise, it is equal
to -1 (FFFF hex).
"right" and "left" are based on the direction of the linedef as indicated
by the "from" and "to" VERTEXES. This attempt at a sketch should make it
clear what I mean:
"left" side "right" side
FROM -----------------> TO <----------------- FROM
"right" side "left" side
In the original episodes, a line with a single side ALWAYS has that side
as the "right" side. So it would probably be best to follow the convention.
[4-3-1]: Linedef Attributes
---------------------------
The third field of each linedef is an integer which controls that line's
attributes with bits, as follows:
bit # condition if it is set (=1)
bit 0 Impassibile. Players and monsters cannot cross this line, and
projectiles explode or "end" if they hit this line. Note, however,
that if there is no sector on the other side, beings can't go through
this line anyway. Important: if bit 2 is also set, projectiles CAN go
through the line, and if there is no sector on the other side, they
can go "forever", usually causing a CRASH.
bit 1 Monster-blocker. Monsters cannot cross this line.
bit 2 Two-sided. If this bit is set, then the linedef's two sidedefs can
have "-" as a texture, which means "transparent". If this bit is not
set, the sidedefs can't be transparent: if "-" is viewed, it will
result in the same hyper-junk that you see when you use the walk-
thru-walls cheat to go outside into nowhere. However, the linedef CAN
have two non-transparent sidedefs, even if this bit is not set, if it
is between two sectors.
Another side effect of this bit is that if it is set, then
projectiles can go through it no matter what, and gunfire (pistol,
etc.) can go through it if there is a sector on the other side.
bit 3 Upper texture is "unpegged". This is usually done at windows.
"Pegged" textures move up and down when the neighbor sector moves up
or down. For example, if a ceiling comes down, then a pegged texture
on its side will move down with it so that it looks right. If the
side isn't pegged, it just sits there, the new material is
spontaneously created. The best way to get an idea of this is to
change a linedef on an elevator or door, which are always pegged,
and observe the result.
bit 4 Lower texture is unpegged.
bit 5 Secret. The automap will draw this line like a normal solid line that
doesn't have anything on the other side, thus protecting the secret
until it is opened. This bit is NOT what determines the SECRET ratio
at the end of a level, that is done by special sectors (#9).
bit 6 Blocks sound. Sound cannot cross a line that has this bit set.
Sound normally travels from sector to sector, so long as the floor
and ceiling heights allow it (e.g. sound wouldn't go from a sector
with 0/64 floor/ceiling height to one with 72/128, but sound WOULD
go from a sector with 0/64 to one with 56/128).
bit 7 Not on map. The line is not shown on the regular automap, not even if
the computer all-map power up is gained. All lines show up on the
cheater's map, however (Booooo! I wish there were no cheat codes!)
bit 8 Already on map. When the level is begun, this line is already on the
automap, even if it hasn't been "seen" yet.
bits 9-15 are unused, EXCEPT for a large section of e2m7, where every wall
on the border of the section has bits 9-15 set, so they have values
like 1111111000000000 (-511) and 1111111000010000 (-495). This area
of e2m7 is also the only place in all 27 levels where there is a
linedef 4 value of -1. But the linedef isn't a switch. These unique
values either do nothing, or something that is as yet unknown. The
currently prevailing opinion is that they do nothing.
[4-3-2]: Linedef Types
----------------------
The integers in field 4 of a linedef control various special characteristics,
mostly to do with what happens to a "triggered" SECTOR when the line is
crossed or activated by a player.
Except for "Doors", the end-level switches, and the special type 48 (hex 30),
all these effects need "trigger" or "tag" numbers. Then any and all sectors
whose last field contains the same trigger number are affected when the
linedef's function is activated.
What the letters in the ACT column mean:
W means the function happens when a player WALKS across the linedef. S means
a player must push SPACEBAR near the linedef to activate it (doors and
switches). G means a player must shoot the linedef (GUN).
1 means it works once only. R means it is a repeatable function. This is
tentative, because some functions that appear to work only once might
actually work again if the conditions were reset. E.g. a sector ceiling
rises, opening a little room with baddies in it. Usually, that's it. But
perhaps if some other linedef triggered that sector ceiling to come down
again, then the original trigger could make it go up, etc...
Dec/Hex ACT EFFECT
-1 ffff ? ? None? Only once in whole game, on e2m7, (960,768)-(928,768)
0 00 - - nothing
1 01 S R Door. Sector on the other "side" of this line has its
ceiling rise c. 96 in altitude, then comes back down
after c. 5 seconds.
2 02 W 1 ceiling rises like door
3 03 W 1 ceiling lowers
5 05 W 1 floor rises to match neighbor sector floor height.
7 07 S 1 staircase rises up from floor in appropriate sectors.
8 08 W 1 stairs
Note: The stairs function requires special handling. In the original
episodes,
an even number of steps get raised up; the first step and every other one
thereafter are sectors which have the "trigger" number that the control
linedef has, OR they (the sectors/steps) will have 999 or 99 as their
trigger number. I can't figure out why the game uses the 999 thing, since
just using the original trigger number works fine. Also, I don't know yet
if all the steps must be the same size/shape, as they always are in real-map
examples.
9 09 S 1 floor lowers; neighbor sector's floor rises and changes
TEXTURE to match yet another neighbor, and sector special
type changes to 0.
10 0a W 1 floor lowers, wait 3 seconds, rises
11 0b S - End level. Go to next level.
13 0d W 1 brightness goes to 255
14 0e S 1 floor rises to c. 64 above neighbor sector's floor
16 10 W 1 ceiling closes, opens after c. 30 seconds.
18 12 S 1 floor rises to equal first neighbor "on the way up"
19 13 W 1 floor lowers to equal the highest of the neighboring
sector's floors
20 14 S 1 floor rises, TEXTURE change also.
21 15 S 1 floor lowers to equal, for c. 3 seconds, then rises back
up to stop 8 below neighbor's ceiling height
22 16 W 1 floor rises, TEXTURE change also
23 17 S 1 floor lowers to match LOWEST neighbor sector?
26 1a S R Door. Need blue key to open. Closes after 5 seconds.
27 1b S R Door. Yellow key.
28 1c S R Door. Red key.
29 1d S 1 ceiling rises, closes after c. 6 seconds?
30 1e W 1 floor rises to c. 100-128 above neighbor's floor?
31 1f S 1 Door. Stays open.
32 20 S 1 Door. Blue key. Stays open.
33 21 S 1 Door. Yellow key. Stays open.
34 22 S 1 Door. Red key. Stays open.
35 23 W ? brightness goes to 0.
36 24 W ? lower floor to 8 above neighbor.
37 25 W 1 floor lowers, change floor to acid (special sector 7).
38 26 W 1 floor lowers
39 27 W 1 teleport to sector. make sure only one sector has the same
trigger number as a line with this effect!
40 28 W 1 ceiling raises, like 2?
41 29 S 1 ceiling lowers to floor
42 2a S R ceiling closes like door
44 2c W 1? ceiling lowers to 8 above floor
46 2e G 1 Shoot this line, then sector ceiling rises like a door
48 30 - - Animated, horizontally scrolling wall.
51 33 S - End level. Go to secret level 9.
52 34 W - End level. Go to next level
56 38 W ? crushing floor rises to 8 below ceiling
58 3a W 1 floor rises c. 24-48
59 3b W 1 floor rises 8, TEXTURE change to neighbor also
61 3d S R ceiling rises like door
62 3e S R floor lowers, rises after c. 3 seconds
63 3f S R? ceiling rises, lowers after c. 3 seconds
70 46 S R sector floor drops quickly to 8 above neighbor
73 49 W R start crushing ceiling, slow crush but fast damage
74 4a W R stops crushing ceiling
75 4b W R ceiling closes, and ?
76 4c W ? ceiling closes like door, opens after c. 10 seconds
77 4d W R start crushing ceiling, fast crush but slow damage
80 50 W 1? brightness to 255
82 52 W R floor lowers to equal neighbor
86 56 W R ceiling rises, closes after c. 5 seconds
87 57 W R? floor rises and lowers every 5 seconds
88 58 W R floor lowers quickly, rises back up after c. 3 seconds
89 59 W R? stops the up/down syndrome started by #87
90 5a W R ceiling rises, wait 5 seconds, comes down
91 5b W R floor rises to (neighbor ceiling - 8)
97 61 W R teleport to sector. make sure only one sector has the same
trigger number as a line with this effect!
98 62 W R floor lowers to 8 above neighbor
102 66 S ? floor lowers to equal neighbor
103 67 S 1? ceiling rises like door, stays open
104 68 S 1 light drops to lowest light level amongst neighbor sectors
[4-4]: SIDEDEFS
===============
A sidedef is a definition of what wall meta-textures to draw along a LINEDEF,
and a group of sidedefs define a SECTOR.
There will be one sidedef for a line that borders only one sector, since it
is not necessary to define what the doom player would see from the "other"
side of that line because the doom player can't go there. The doom player
can only "go" where there is a sector (unless you use the no clipping cheat,
which will cause the screen to freak out if you go "outside" to a non-sector
area).
Each SIDEDEF is 30 bytes, comprising 2 (integer) fields, then 3 (8-byte
string) fields, then a final (integer) field:
(1) X offset for pasting the appropriate wall texture onto the wall's
"space": positive offset moves "into" the texture, so the left portion
gets cut off (# of columns off left side = offset). Negative offset moves
texture
farther right, in the wall's "space"
(2) Y offset: analogous to the X, for vertical.
(3) "upper" texture name: the part "above" the juncture with a lower ceiling
of an adjacent SECTOR.
(4) "lower" texture name: the part "below" a juncture with a higher floored
adjacent SECTOR.
(5) "full" texture name: the regular part of the wall
The texture names are from the TEXTURE1/2 resources. The names of wall
patches in the DIRECTORY are not directly used, they are referenced
through PNAMES.
Simple sidedefs have no upper or lower texture, and so they will have
"-" instead of a texture name. Also, two-sided lines can be transparent,
in which case "-" means transparent (no texture)
00s fill the space after a wall name that is less than 8 characters.
(6) SECTOR that this sidedef "helps to surround" or "faces"
[4-5]: VERTEXES
===============
These are the beginnings and ends for LINEDEFS and SEGS, each is 4 bytes,
2 (integer) fields:
(1) X coordinate
(2) Y coordinate
[4-6]: SEGS
===========
The SEGS are in a sequential order determined by the SSECTORS, which are
part of the NODES recursive tree.
Each SEG is 12 bytes, having 6 (integer) fields:
(1) from VERTEX with this number
(2) to VERTEX
(3) angle: 0= east, 16384=north, -16384=south, -32768=west.
In hex, it's 0000=east, 4000=north, 8000=west, c000=south.
(4) LINEDEF that this seg goes along
(5) 0 = this seg is on the front "side" of the linedef.
1 = this seg is on the back "side" of the linedef.
This could also be thought of as direction: 0 if the seg goes the same
direction as the linedef it's on, 1 if it goes the opposite direction.
(6) Is the distance along the linedef that the seg begins. If the seg begins
at one of the two endpoints of the linedef, this will be 0. If the seg
and linedef are a "diagonal" line, the length will be according to the
distance in the coordinate plane of the vertexes, i.e.
SQR((X2 - X1)^2 + (Y2 - Y1)^2).
Actually, it seems to be off by 1 or 2 from what it should be, like they
are using ABS(X2 - X1) values that are 1 less than the "real" value
should be.
[4-7]: SSECTORS
===============
Each SSECTOR is 4 bytes, having 2 (integer) fields
(1) This many SEGS are in this SSECTOR...
(2) ...starting with this SEG number
Ssector stands for sub-sector. These divide up all the SECTORS into
non-convex polygons. They are then referenced through the NODES resources.
[4-8]: NODES
============
This is what we need to figure out!
The nodes are branches in a binary space partition that divides up the level
and is used to determine which walls and floors are in front of others, thus
"clipping" the walls behind from the virtual view. The nodes/ssectors/segs
resources are used exclusively for these display purposes, and seem to be
precalculated to ease the burden on the game engine.
There are ((number of SSECTORS) - 1) NODES. Each NODE has 14 (integer)
fields:
(1) X coordinate of partition line's start
(2) Y coordinate of partition line's start
(3) DX, change in X to end of partion line
(4) DY, change in Y to end of partion line
thus 64, 128, -64, -64 would be a partition line from (64,128) to (0,64)
(5) Y upper bound for the first bounding-box
(6) Y lower bound
(7) X upper bound
(8) X lower bound
(9) Y upper bound for the second bounding box
(10) Y lower bound
(11) X upper bound
(12) X lower bound
Each node has two "children", each of which is either a node or a
ssector. The bounding box is just big enough to contain whatever is
in the "child", e.g. if the child is a ssector with 1 seg, then the
bounding box will be just big enough to contain the extents of the
seg (and thus a bounding "box" can have zero width, for a horizontal
or verical seg)
If the child is a node, the bounding box will be just big enough to
hold both of its children.
(13) a NODE or SSECTOR number for the first bounding box. If bit 15 is set,
then the rest of the number represents the child SSECTOR. If not, the
child is a recursed node.
(14) a NODE or SSECTOR number for the second bounding box.
So there is a heavy iterative aspect to this structure. The final NODE is
always the size of the entire level.
I am optimistic that a valid set of nodes/ssectors/segs can be generated
from a set of vertices and lines by some automatic algorithm, but so far it
isn't happening. Once this problem is solved, we will be able to create
levels from scratch!
[4-9]: SECTORS
==============
A SECTOR is a horiontal (east-west and north-south) area of the map where a
floor height and ceiling height is defined, so a doom player may go there.
Any change in floor or ceiling "altitude" or texture requires a new SECTOR
(and therefore separating LINEDEF(s) and SIDEDEF(s)).
Each is 26 bytes, comprising 2 (integer) fields, then 2 (8-byte string)
fields, then 3 (integer) fields:
(1) Floor is at this "altitude" for this sector
(2) Ceiling altitude
The altitudes can probably range from about -500 to 500. A difference
of 30 between the floor heights of two adjacent sectors is passable
(upwards), but a difference of 32 is "too high". The player may fall
any amount.
(3) name of floor texture, from the DIRECTORY
(4) name of ceiling texture, from DIRECTORY
All the "floor" pictures in the DIRECTORY work as either floors or
ceilings. F_SKY1 is used as a ceiling to indicate that it is transparent
to the sky above/behind.
(5) brightness of this sector: 0 = total dark, 255 (ff) = maximum light
(6) special sector:
0 00 is normal, no special characteristic.
1 01 light level goes to 0 for a fraction of a second, at random times.
2 02 light pulsates abruptly for 0.5 second
3 03 light pulsates abruptly for 1.0 second
4 04 -10/20% health AND lights on/off every 0.5 seconds
5 05 -5/10% health (-5% at skill 1, -10% at higher skills)
7 07 -2/5% health, this is the usual NUKAGE acid-floor.
8 08 light oscillates from 255 (this sector's brightness) to whatever
light level is lowest amongst all the adjacent sectors.
9 09 SECRET (a player must walk into this sector to get credit for
discovering this "secret")
10 0a Still undetermined: This is a strange one. 30 seconds after a level
is begun, the ceiling of any sector with this number will come down
to the floor. If it hits a player's head, it stops (without crushing).
Also the ceiling seems to be blocked by a barrel, but is not blocked
by many other objects. And sometimes the ceiling will take off UP,
never stopping. Definately a mystery, this one.
11 0b -10/20% health; when player's HEALTH <= 10%, then the level ends.
If it is a level 8, then the episode ends.
12 0c light smoothly oscillates between value in (5) and 0.
13 0d light on/off every 0.25 seconds
14 0e ?
16 10 -10/20% health
All other values cause an "UNKOWN SPECIAL SECTOR" error - exit to DOS.
(7) is a "trigger" number corresponding to a certain LINEDEF with the same
"trigger" number. When that LINEDEF is crossed, something happens to this
SECTOR - it goes up or down, etc...
There are a few unusual trigger numbers. 99 and 999 can be used in
staircases, see [3-3-2] under linedef types 7 and 8. 666 is used on e1m8,
any sector with that trigger number has it's floor go all the way down
to equal the height of the lowest neighbor floor. This happens when
the last Baron of Hell on the level is killed. The function does not
work on any other level, including e2m8 and e3m8, and it only applies
to the Barons, not the other bosses. Are there any other special
trigger events?
[4-10]: REJECT
==============
Reject is an array of bits. It's size in bytes is
(number of SECTORS ^ 2) / 8, rounded up.
"It is used for optimization and all the bits may be set to 0" -
this is a quote from John Carmack at id software.
In fact, the length of the object may be made 0 (same as making it all 0s),
and I can't detect any difference.
[4-11]: BLOCKMAP
================
The BLOCKMAP is a pre-calculated structure that the game engine uses to
simplify collision-detection between moving things and walls. It is possible
to make an algorithm that generates the BLOCKMAP, given the locations of all
the LINEDEFS. For reasons of space, and the fact that I haven't made one,
the algorithm is not included here.
If you don't have a BLOCKMAP, the level displays fine, but everybody walks
through walls, and no one can hurt anyone else with their gunfire.
All of BLOCKMAP's fields are integers.
The whole level is cut into "blocks", each is a 128 (hex 80) wide square (the
grid lines in the automap correspond to these blocks).
The first two integers are XORIGIN and YORIGIN, which specify the coordinates
of the bottom-left corner of the bottom-left (southwest) block.
Then come XBLOCKS and YBLOCKS, which specify how many "blocks" there are in
the X and Y directions. XBLOCKS is the number of COLUMNS, YBLOCKS is the
number of ROWS.
Then come (ROWS * COLUMNS) integers which are pointers to the offset within
the BLOCKMAP resource for that "block". These "offsets" refer to the INTEGER
number, NOT the byte number, where to find the block's list. The blocks go
right (east) and up (north). The first block is at row 0, column 0; the next
at row 0, column 1; if there are 34 columns like on e1m1, the 35th block is
row 1, column 0, etc.
After all the pointers, come the block lists. Each blocklist describes the
numbers of all the LINEDEFS which are partially or wholly "in" that block.
An "empty" block is two integers: 0 and then -1.
A non-empty block will go something like: 0 330 331 333 -1. This means that
LINEDEFS 330, 331, and 333 are "in" that block. Part of each of those line
segments lies within the (hex 80 by 80) boundaries of that block.
What about the block that has LINEDEF 0? It goes: 0 0 ... etc ... -1.
Here's another way of describing BLOCKMAP as a list of the integers, in
order:
Coordinate of block-grid X origin
Coordinate of block-grid Y origin
# of columns (blocks in X direction)
# of rows (blocks in Y direction)
Block 0 offset from start of BLOCKMAP, in integers
.
.
Block N-1 offset (N = number of columns * number of rows)
Block 0 list: 0, numbers of every LINEDEF in block 0, -1 (ffff)
.
.
Block N-1 list: 0, numbers of every LINEDEF in block N-1, -1 (ffff)
-----------------------------
CHAPTER [5]: Pictures' Format
-----------------------------
The great majority of the entries if the directory reference resources that
are in a special "picture" format. The same format is used for the pictures
of items (like medikits), the sprites for the enemies (like imps), the
wall patches, and various miscellaneous pictures for the status bar, menu
text, inter-level map, and etc. The floor and ceiling textures are NOT in
this format, they are raw data; see chapter 5.
Each picture has three sections, basically. First, a four-integer header.
Then a number of long-integer pointers. Then the picture pixel color data.
[5-1]: Header
=============
The header has four fields:
(1) Width. The number of columns of picture data.
(2) Height. The number of rows.
This defines a rectangular space or limits for drawing a picture within.
(3) Left offset. The number of pixels to the left of the center; where the
first column gets drawn.
(4) Top offset. The number of pixels above the origin; where the top row is.
To be "centered", (3) is usually about half of the total width. If the
picture had 30 columns, and (3) was 10, then it would be off-center to
the right, especially when the player is standing right in front of it,
looking at it. If a picture has 30 rows, and (4) is 60, it will appear
to "float" like a blue soul-sphere. If (4) equals the number of rows,
it will appear to rest on the ground. If (4) is less than that for an
object, the bottom part of the picture looks awkward.
With walls patches, (3) is always (columns/2)-1, and (4) is always
(rows)-5. This is because the walls are drawn consistently within their
own space (There are two integers in each SIDEDEF which can offset the
beginning of a wall's texture).
Finally, if (3) and (4) are NEGATIVE integers, then they are the absolute
coordinates from the top-left corner of the screen, to begin drawing the
picture, assuming the VIEW is FULL-SCREEN (the full 320x200). This is
only done with the picture of the doom player's current weapon - fist,
chainsaw, bfg9000, etc. The game engine scales the picture down
appropriately if the view is less than full-screen.
[5-2]: Pointers
===============
After the header, there are N = (# of columns) long integers (4 bytes each).
These are pointers to the data for each COLUMN. The value of the pointer
represents the offset in bytes from the first byte of the picture resource.
[5-3]: Pixel Data
=================
Each column is composed of some number of BYTES (NOT integers), arranged in
"posts":
The first byte is the row to begin drawing this post at. 0 means whatever
height the header (4) upwards-offset describes, larger numbers move
correspondingly down.
The second byte is how many colored pixels (non-transparent) to draw, going
downwards.
Then follow (# of pixels) + 2 bytes, which define what color each pixel is,
using the game palette. The first and last bytes AREN'T drawn, and I don't
know why they are there. Probably just leftovers from the creation process on
the NExT machines. Only the middle (# of pixels in this post) are drawn,
starting at the row specified in byte 1 of the post.
After the last byte of a post, either the column ends, or there is another
post, which will start as stated above.
255 (hex FF) ends the column, so a column that starts this way is a null
column, all "transparent". Goes to the next column.
Thus, transparent areas can be defined for either items or walls.
Note that all the item and enemy sprites' names are in the DIRECTORY between
the S_START and S_END entries, and all the wall patches are between the
P_START and P_END entries.
---------------------------------------
CHAPTER [6]: Floor and Ceiling Textures
---------------------------------------
All the names for these textures are in the DIRECTORY between the F_START and
F_END entries. There is no look-up or meta-structure as with the walls.
Each texture is 4096 raw bytes, making a square 64 by 64 pixels, which is
pasted onto a BLOCK's floor or ceiling, with the same orientation as the
automap would imply, i.e. the first byte is the color at the NW corner, the
64th is the color at the NE, etc.
The data in F_SKY1 isn't even used since the game engine interprets that
"special" ceiling as see-thru to the SKY texture beyond. So the F_SKY1 entry
can have zero length.
[6-1]: Animated floors
----------------------
See Chapter [8-4-1] for a discussion of how the animated floors and walls
work.
-----------------------------
CHAPTER [7]: Sounds and Songs
-----------------------------
Not much detail here, and I'm just guessing at the song format anyway.
[7-1]: D_[xxxxxx]
=================
Songs. What format are they? Somewhere I read that they are in the MUS
format, which I have absolutely no knowledge of. But it's obvious what each
song is for, from their names.
[7-2]: DP[xxxxxx] and DS[xxxxxx]
================================
These are the sound effects. They come in pairs - DP for pc speaker sounds,
DS for sound cards.
The DS sounds are in RAW format: they have a four integer header, then the
sound samples (each is 1 byte since they are 8-bit samples).
The headers' four integers are: 3, then 11025 (the sample rate), then the
# of samples, then 0.
------------------------------------------------
CHAPTER [8]: Miscellaneous Non-picture Resources
------------------------------------------------
[8-1]: PLAYPAL
==============
There are 14 palettes here, each is 768 bytes = 256 rgb triples. That is, the
first three bytes of a palette are the red, green, and blue portions of
color 0. And so on.
Palette 0 is the one that is used for almost everything.
Palettes 10-12 are used (briefly) when an item is picked up, the more items
that are picked up in quick succession, the brighter it gets, palette 12
being the brightest.
Palette 13 is used while wearing a radiation suit.
Palettes 3, then 2, then 1 again are used after getting beserk strength.
If the player is hurt, then the palette shifts up to X, then comes "down" one
every half second or so, to palette 2, then palette 0 (normal) again. What X
is depends on how badly the player got hurt: Over 100% damage (add health
loss and armor loss), X=8. 93%, X=7. 81%, X=6. 55%, X=5. 35%, X=4. 16%, X=2.
Palettes 1 and 9 contain the secret codes which allow you to play
Commercial Doom eight months before it gets released. Just kidding!
Maybe F_SKY1 has that data in it. Let's get outta here!
[8-2]: COLORMAP
===============
This resource contains 34 sets of 256 bytes, which "map" the colors "down" in
brightness. (Brightness is controlled by the 5th field in the SECTORS, see
Chapter 4-9 above). E.g. at very low brightness, almost all the colors are
"mapped" to black, the darkest grey, green, blue, etc. In each set of 256
bytes, byte 0 will have the number of the palette color to which original
color 0 gets mapped. Etc. Which set of 34 corresponds to which exact
brightness level is something I haven't bothered to figure out. Better things
to do...like the maps.
[8-3]: DEMOs
==============
These are the demos that will be shown if you start doom, but don't play an
episode. Each has a record of the keystrokes. Didn't bother to figure the
formats out, since demos can be created using the devparm parameter:
DOOM -devparm -record DEMONAME
The extension .LMP is automatically added to the DEMONAME. Other parameters
may be used simultaneously, such as -skill [1-5], -warp [1-3] [1-9]. The
demos in the WAD are in exactly the same format as these LMP files, so a LMP
file may be simply pasted or assembled into a WAD, and if its length and
pointer directory entries are correct, it will work.
I've read that someone is collecting LMP files which show truly heroic feats,
like slaughtering boss guys with just a pistol, killing a whole level of bad
guys with just beserk punch, while at 1% health, etc. By the time you read
this, it's probably too late to join in the fun (i.e. submit a good one), but
who knows. At this moment, I don't know who to contact, please send me any
information you have.
I've also read that some are worried that if the .LMP formats are cracked,
cheaters will make bogus demos and destroy the whole point of distributing
.LMPs to prove how great a player one is. I think it would be a ridiculously
difficult feat to make a fake demo, but out of deference to paranoia, I'll
never even attempt to crack the structure, nor distribute info on it.
[8-4]: TEXTURE1 and TEXTURE2
============================
These resources contains a list of the wall names used in the various
SIDEDEFS sections of the level data. Each wall name actually references a
meta-structure, defined in this list. TEXTURE2 has all the walls that are
only in the registered version.
First is a table of pointers to the start of the entries. There is a long
integer (say, N) which is the number of entries in the TEXTURE resource.
Then follow N long integers which are the offsets in bytes from the beginning
of the TEXTURE resource to the start of that texture's definition entry.
Then follow N texture entries, which each consist of a 8-byte name field and
then a variable number of 2-byte integer fields:
(1) The name of the texture, like STARTAN3, is the name that is used in a
SIDEDEFS resource.
(2) always 0. Purpose unkown.
(3) always 0. Purpose unkown.
(4) total width of texture
(5) total height of texture
The fourth and fifth fields define a "space" (usually 32 by 128 or 64 by 72
or etc...) in which individual wall patches are "placed" to form the overall
picture. This is done because there are some wall patches that are used in
several different walls, like computer screens, etc.
(6) always 0. Purpose unkown.
(7) always 0. Purpose unkown.
(8) Number of 5-field patches that follow. This is why each texture entry
has variable length. Many entries have just 1 patch, one has 64 patches!
1. x offset from top-left corner of texture space defined in field
4/5 to start placement of this patch
2. y offset
3. number, from 0 to whatever, of the entry in the PNAMES resource,
which contains the name from the DIRECTORY, of the wall patch to
use...
4. always 1, is for something called "stepdir"...
5. always 0, is for "colormap"...
Note that patches can have transparent parts, since they are in the same
picture format as everything else. Thus there can be (and are) transparent
wall textures. These should only be used on a border between two sectors, to
avoid the "displaying nothing" problems discussed earlier.
Here is how one can "add" walls, while still retaining all the original ones
it came with: in a pwad, have replacement entries for PNAMES and TEXTURE2.
These will be the same as the originals, but with more entries, for the wall
patches and assembled textures that you're adding. Then have P_START,
P2_START, ..., P2_END, and P_END entries, with the ... representing however
many entries are needed for the number of new wall patches you have.
Note you must be careful with naming the entries. If the name duplicates an
entry in the main DOOM.WAD, the one in the pwad will replace the original,
and if they aren't the same size in pixel dimensions, problems could occur
in the display (no crashes, probably, just ugly walls to look at because
of the random junk).
So names like "WALL66_6" or "W119_24" whatever are probably not a good idea,
unless you are using some great program that indexes and keeps track of all
the wall names in the universe (If you have such a program, please send it
to me!). Names like "JS_W12_3" and "JOEWALL2" are better.
[8-4-1]: Animated walls
-----------------------
It is possible to change the walls and floors that are animated, like the
green blocks with a sewer-like grate that's spewing green slime (SLADRIPx).
The game engine sets up as many as 8 animation cycles for walls and 5
for floors based on the entries in the TEXTURE resources. The entries in
"First" and "Last", and all the entries between them (in the order that they
occur in a TEXTURE list), are linked. If one of them is called by a SIDEDEF,
that SIDEDEF will change texture to the next in the cycle about 5 times a
second (?), going back to "First" after "Last". Note that the entries between
First and Last need not be the same in number as in the original, nor do they
have to follow the same naming pattern, though that would probaly be wise.
E.g. one could set up ROCKRED1, ROCKREDA, ROCKREDB, ROCKREDC, ROCKREDD,
ROCKREDE, ROCKRED3 for a 7-frame animated wall!
If "First" and "Last" aren't in either TEXTURE, no problem. Then that cycle
isn't used. But if "First" is, and "Last" either isn't or is listed BEFORE
"First", then an error occurs.
First Last Normal # of frames
BLODGR1 BLODGR4 4
BLODRIP1 BLODRIP4 4
FIREBLU1 FIREBLU2 2
FIRELAV3 FIRELAVA 2
FIREMAG1 FIREMAG3 3
FIREWALA FIREWALL 3
GSTFONT1 GSTFONT3 3
ROCKRED1 ROCKRED3 3
SLADRIP1 SLADRIP3 3
(floor/ceiling animations) -
NUKAGE1 NUKAGE3 3
FWATER1 FWATER3 3
SWATER1 SWATER4 4?
LAVA1 LAVA4 4
BLOOD1 BLOOD3 3
Note that the SWATER entries aren't in the regular DOOM.WAD, so there's your
easy opportunity to put in a custom floor animation without taking away any
originals...
[8-5]: PNAMES
=============
This is a lookup table for the numbers in TEXTURE[1 or 2] to reference to an
actual entry in the DIRECTORY which is a wall patch (in the picture format
described in chapter 4).
The first two bytes of the PNAMES resource is an integer P which is how
many entries there are in the list.
Then come P 8-byte names, each of which duplicates an entry in the DIRECTORY.
If a patch name can't be found in the directory (including the external
pwad's directories), an error will occur. This naming of resources is
apparently not case-sensitive, lowercase letters will match uppercase.
The middle integer of each 5-integer "set" of a TEXTURE1 entry is something
from 0 to whatever. Number 0 means the first entry in this PNAMES list, 1 is
the second, etc...