Extendable Wide Map Format Draft Specification 10/23/05 James Haley -- haleyjd@hotmail.com ------------------------------------------------------------------------------- This document lays out a draft specification for an extendable wide map format suitable for use in DOOM-based game engines for maps of all types. The goals of the project are as follows: 1. Establish a standard new map format which takes full advantage of modern hardware architecture and lessens the impact of hard data type limits. 2. Establish said format in a manner which is relatively easy to read from file but is capable of being extended with any number of implementation-defined data fields within important record types. 3. Gain wide acceptance of said format by source ports and by at least one each of editor and BSP construction utilities, implementing the latter as part of the project efforts if necessary. 4. Establish and maintain a committee which will have sole authority to standardize and reserve extended field IDs and to publish revised formats when such an action becomes necessary. ------------------------------------------------------------------------------- Map Lumps ------------------------------------------------------------------------------- This standard makes no changes from the current de facto standard for lumps considered to be part of a map, but shall consider standardized the following behavior as is implemented in the zdoom and Eternity Engine source ports: A map can consist of the following lumps: HEADER THINGS LINEDEFS SIDEDEFS VERTEXES SEGS SSECTORS NODES SECTORS REJECT BLOCKMAP BEHAVIOR SCRIPTS An explanation of each lump follows. HEADER ------ This lump may be of any name, and the interpretation of map names is an implementation-dependent detail. This lump is allowed to be of either zero or non-zero length, and editors are required to preserve its content even when they do not understand it. Any contents are strictly implementation dependent. THINGS ------ Holds mapthing records. LINEDEFS -------- Holds linedef records. SIDEDEFS -------- Holds sidedef records. VERTEXES -------- Holds vertices used by linedefs and segs. SEGS ---- Holds BSP-generated line segments. SSECTORS -------- Holds BSP-generated subsectors. NODES ----- Holds the generated BSP tree. SECTORS ------- Holds sector records. REJECT ------ Holds the fast line-of-sight rejection lookup table. This lump is NOT allowed to be of zero length, though source ports may compensate for legacy maps which have zero-length REJECT lumps by building a REJECT of the appropriate size and filling it with zeros or with valid REJECT data should the port have a means of calculating that information. This lump's size should always correspond to the multiple of 8 greater than or equal to the number of sectors squared divided by eight. BLOCKMAP -------- Holds the blockmap. BEHAVIOR -------- This lump holds compiled ACS bytecode, and should used by all implementations to distinguish between DOOM- and HEXEN-format maps, even when those ports do not support the execution of ACS bytecode. This lump is required to exist for maps which follow this specification. DOOM-format maps must therefore never be followed in the wad directory by a lump of name BEHAVIOR, and implementing editors should reorder the wad directory to prevent this when necessary, or at the least issue a clear warning to the user. SCRIPTS ------- Optional lump which holds the source code of scripts for this map. Presence or absence of this lump generally has no significance. ------------------------------------------------------------------------------- Lump Formats ------------------------------------------------------------------------------- The standardized format of each map lump follows in turn. All numeric values shall be stored in little endian byte order. --------------------------------------- THINGS --------------------------------------- * Header * Field Name Length Offset Specified Value ------------------------------------------------------------------------- MAGIC 4 0 xTNG FMTVERSION 4 4 1 TARGETPORT 4 8 standardized value PREFTRANSLATION 4 12 standardized value NUMRECORDS 4 16 COORDFMT 4 20 standardized value CHECKSUM 4 24 lump checksum GUARD 4 28 0 Total Header Length: 32 bytes Explanation of fields: MAGIC -- The "magic number" indicating this is an extended THINGS lump. This value should NOT be relied on alone for verification of the format. The CHECKSUM and GUARD fields must also have appropriate values, or the lump must be treated as either corrupt or as a non-standard older map format. The value xTNG shall be stored in string order and may be detected via string comparison or by comparison against the corresponding integer value. FMTVERSION -- The version of this standard specification to which the lump adheres. Each standard shall define a single digit version number which should be written into this field by editors. Implementing source ports may wish to reject or to handle specially maps depending on the format version they employ. TARGETPORT -- This field holds a standards-defined target source port value. This field is of no benefit to editors, but may be of benefit to source ports which wish to support features of other ports and thus must be aware of what port with which a map is intended to be used. Implementing editors should allow this field to be specified, or should assume its value based on the editing configuration being employed. PREFTRANSLATION -- This field holds a standards-defined preferred translation ID. Translation IDs may be used by implementing source ports to determine what set of mapthing doomednums, line specials, line sectors, and line flag values, which are NOT currently a part of this standard, are to be used when loading this map. Values should be defined by the first finalized version of this standard to represent existing map translations, including but not limited to DOOM, Heretic, Hexen, and Strife. Implementing source ports may reject the map or ignore this field and apply their own interpretation if they do not support the value indicated. NUMRECORDS -- Because records are not of uniform length, it is necessary to store the number of records in the header. COORDFMT -- This field determines the format of numeric coordinates in this lump. Supported values in this version shall be the following: 0: Integer coordinates. 1: 16.16 Fixed-point coordinates. 2: IEEE 32-bit float coordinates. Implementing editors and source ports may not support some coordinate formats. CHECKSUM -- Lump checksum as calculated by a means to be determined in the first finalized version of this standard. This checksum should be used by implementing editors and source ports as part of format verification, since the probability of an old-format lump bearing a proper lump checksum value at this offset is astronomically poor. GUARD -- Guard bytes at the end of the header which must be set to zero by all implementing editors. This should be used in format verification as a further line of defense against data aliasing. * Required Record Fields * The following fields are required to be supported by all implementing editors and source ports. Field Name Length Offset Specified Value ------------------------------------------------------------------------- RECORD_ID 4 0 xTGR TID 4 4 X 4 8 Y 4 12 HEIGHT 4 16 ANGLE 4 20 DOOMEDNUM 4 24 FLAGS 4 28 SPECIAL 4 32 ARGS 20 36 Total Required Fields Length: 56 bytes Explanation of fields: RECORD_ID -- "Magic number" delineating the start of this record. TID -- A thing id number usable by implementing source ports for scripting. The TID value zero shall be reserved as meaning no TID. X, Y -- Coordinates for the mapthing stored in the format indicated in the COORDFMT field of the lump header. HEIGHT -- A distance from the floor or ceiling the mapthing should be offset by at spawning stored in the format indicated in the COORDFMT field of the lump header. ANGLE -- The byte angle at which to spawn the mapthing. Implementations may round the value provided to the nearest 45 degrees when in compatibility mode, but are allowed to interpret the value to its full precision, and so implementing editors should not perform any rounding or chopping. DOOMEDNUM -- The doomednum determining the type of object that will be spawned by the game engine at this point on the map. Doomednum values are implementation and translation dependent and are not a current part of this standard, except that the doomednum zero shall be reserved as a no-op thing type -- no thing type should be spawned at such a location by implementing source ports. FLAGS -- Mapthing flags determining implementation- and translation-dependent options. SPECIAL -- The special of this thing. Special numbers are implementation and translation dependent and are not a current part of this standard, except that the thing special zero shall be reserved as meaning no thing special. ARGS -- 5 integer arguments to be interpreted by implementing source ports relative to the special of this thing. * Implementation-Dependent Record Fields * Implementing editors and source ports shall continue to read the record for implementation-dependent record fields, until such a field is found with the STD_ID of "xEND", a length of 1, and a single word of value zero following. Implementing editors and source ports may ignore any or all of the fields contained in this portion of the record, but record IDs will be registered by implementors with the standards committee and shall remain unique for each unique field usage. Commonly implemented non-standard fields may be considered for standardization by a later revision of this standard. Implementing editors should make effort to preserve implementation-dependent fields which they do not understand. Field Name Length Offset Specified Value ------------------------------------------------------------------------- STD_ID 4 s standardized values LENGTH 4 s + 4 VALUE LENGTH s + 8 --------------------------------------- LINEDEFS --------------------------------------- * Header * Field Name Length Offset Specified Value ------------------------------------------------------------------------- MAGIC 4 0 xLIN FMTVERSION 4 4 1 TARGETPORT 4 8 standardized value PREFTRANSLATION 4 12 standardized value NUMRECORDS 4 16 CHECKSUM 4 20 lump checksum GUARD 4 24 0 Total Header Length: 28 bytes Explanation of fields: MAGIC -- The "magic number" indicating this is an extended LINEDEFS lump. This value should NOT be relied on alone for verification of the format. The CHECKSUM and GUARD fields must also have appropriate values, or the lump must be treated as either corrupt or as a non-standard older map format. The value xLIN shall be stored in string order and may be detected via string comparison or by comparison against the corresponding integer value. FMTVERSION -- The version of this standard specification to which the lump adheres. Each standard shall define a single digit version number which should be written into this field by editors. Implementing source ports may wish to reject or to handle specially maps depending on the format version they employ. TARGETPORT -- This field holds a standards-defined target source port value. This field is of no benefit to editors, but may be of benefit to source ports which wish to support features of other ports and thus must be aware of what port with which a map is intended to be used. Implementing editors should allow this field to be specified, or should assume its value based on the editing configuration being employed. PREFTRANSLATION -- This field holds a standards-defined preferred translation ID. Translation IDs may be used by implementing source ports to determine what set of mapthing doomednums, line specials, line sectors, and line flag values, which are NOT currently a part of this standard, are to be used when loading this map. Values should be defined by the first finalized version of this standard to represent existing map translations, including but not limited to DOOM, Heretic, Hexen, and Strife. Implementing source ports may reject the map or ignore this field and apply their own interpretation if they do not support the value indicated. NUMRECORDS -- Because records are not of uniform length, it is necessary to store the number of records in the header. CHECKSUM -- Lump checksum as calculated by a means to be determined in the first finalized version of this standard. This checksum should be used by implementing editors and source ports as part of format verification, since the probability of an old-format lump bearing a proper lump checksum value at this offset is astronomically poor. GUARD -- Guard bytes at the end of the header which must be set to zero by all implementing editors. This should be used in format verification as a further line of defense against data aliasing. * Required Record Fields * The following fields are required to be supported by all implementing editors and source ports. Field Name Length Offset Specified Value ------------------------------------------------------------------------- RECORD_ID 4 0 xLNR STARTVERTEX 4 4 ENDVERTEX 4 8 FLAGS 4 12 SPECIAL 4 16 TAG_ID 4 20 ARGS 20 24 RIGHTSIDE 4 44 LEFTSIDE 4 48 Total Required Fields Length: 52 bytes Explanation of fields: RECORD_ID -- "Magic number" delineating the start of this record. STARTVERTEX -- The index of the vertex at which this line starts. ENDVERTEX -- The index of the vertex at which this line ends. FLAGS -- Linedef flags determining implementation- and translation-dependent options. SPECIAL -- The special of this line. Special numbers are implementation and translation dependent and are not a current part of this standard, except that the line special zero shall be reserved as meaning no line special. TAG_ID -- A line ID number which may be used by scripting or as a line tag. ARGS -- 5 integer arguments to be interpreted by implementing source ports relative to the special of this line. RIGHTSIDE -- Index of the first sidedef of this line. All lines must have a valid right sidedef. LEFTSIDE -- Index of the second sidedef of this line. If no left sidedef exists, the value -1 should be written to this field. * Implementation-Dependent Record Fields * Implementing editors and source ports shall continue to read the record for implementation-dependent record fields, until such a field is found with the STD_ID of "xEND", a length of 1, and a single word of value zero following. Implementing editors and source ports may ignore any or all of the fields contained in this portion of the record, but record IDs will be registered by implementors with the standards committee and shall remain unique for each unique field usage. Commonly implemented non-standard fields may be considered for standardization by a later revision of this standard. Implementing editors should make effort to preserve implementation-dependent fields which they do not understand. Field Name Length Offset Specified Value ------------------------------------------------------------------------- STD_ID 4 s standardized values LENGTH 4 s + 4 VALUE LENGTH s + 8 --------------------------------------- SIDEDEFS --------------------------------------- The format of the SIDEDEFS lump remains unmodified from the DOOM specs except to add a header, and for the final field which serves as a sector index. The width of this field has been increased by 2 bytes to eliminate unreasonable limitations on the number of sectors. * Header * Field Name Length Offset Specified Value ------------------------------------------------------------------------- MAGIC 4 0 xSID FMTVERSION 4 4 1 CHECKSUM 4 8 lump checksum GUARD 4 12 0 Total Header Length: 16 bytes MAGIC -- The "magic number" indicating this is an extended SIDEDEFS lump. This value should NOT be relied on alone for verification of the format. The CHECKSUM and GUARD fields must also have appropriate values, or the lump must be treated as either corrupt or as a non-standard older map format. The value xSID shall be stored in string order and may be detected via string comparison or by comparison against the corresponding integer value. FMTVERSION -- The version of this standard specification to which the lump adheres. Each standard shall define a single digit version number which should be written into this field by editors. Implementing source ports may wish to reject or to handle specially maps depending on the format version they employ. CHECKSUM -- Lump checksum as calculated by a means to be determined in the first finalized version of this standard. This checksum should be used by implementing editors and source ports as part of format verification, since the probability of an old-format lump bearing a proper lump checksum value at this offset is astronomically poor. GUARD -- Guard bytes at the end of the header which must be set to zero by all implementing editors. This should be used in format verification as a further line of defense against data aliasing. * Required Record Fields * Field Name Length Offset --------------------------------------------- XOFFSET 2 0 YOFFSET 2 2 UPPERTEXTURE 8 4 LOWERTEXTURE 8 12 MIDDLETEXTURE 8 20 SECTOR 4 28 Total Record Length: 32 bytes --------------------------------------- VERTEXES --------------------------------------- The format of the VERTEXES lump is extended to support multiple coordinate formats and to widen the field lengths to acceptable precision. * Header * Field Name Length Offset Specified Value ------------------------------------------------------------------------- MAGIC 4 0 xVTX FMTVERSION 4 4 1 COORDFMT 4 8 standardized value CHECKSUM 4 12 lump checksum GUARD 4 16 0 Total Header Length: 20 bytes MAGIC -- The "magic number" indicating this is an extended VERTEXES lump. This value should NOT be relied on alone for verification of the format. The CHECKSUM and GUARD fields must also have appropriate values, or the lump must be treated as either corrupt or as a non-standard older map format. The value xVTX shall be stored in string order and may be detected via string comparison or by comparison against the corresponding integer value. FMTVERSION -- The version of this standard specification to which the lump adheres. Each standard shall define a single digit version number which should be written into this field by editors. Implementing source ports may wish to reject or to handle specially maps depending on the format version they employ. COORDFMT -- This field determines the format of numeric coordinates in this lump. Supported values in this version shall be the following: 0: Integer coordinates. 1: 16.16 Fixed-point coordinates. 2: IEEE 32-bit float coordinates. Implementing editors and source ports may not support some coordinate formats. CHECKSUM -- Lump checksum as calculated by a means to be determined in the first finalized version of this standard. This checksum should be used by implementing editors and source ports as part of format verification, since the probability of an old-format lump bearing a proper lump checksum value at this offset is astronomically poor. GUARD -- Guard bytes at the end of the header which must be set to zero by all implementing editors. This should be used in format verification as a further line of defense against data aliasing. * Required Record Fields * Field Name Length Offset --------------------------------------------- X 4 0 Y 4 4 Total Record Length: 8 bytes --------------------------------------- SEGS --------------------------------------- The format of the SEGS lump is extended to support reasonable limits on the number of vertices and linedefs. * Header * Field Name Length Offset Specified Value ------------------------------------------------------------------------- MAGIC 4 0 xSEG FMTVERSION 4 4 1 COORDFMT 4 8 standardized value CHECKSUM 4 12 lump checksum GUARD 4 16 0 Total Header Length: 20 bytes MAGIC -- The "magic number" indicating this is an extended SEGS lump. This value should NOT be relied on alone for verification of the format. The CHECKSUM and GUARD fields must also have appropriate values, or the lump must be treated as either corrupt or as a non-standard older map format. The value xSEG shall be stored in string order and may be detected via string comparison or by comparison against the corresponding integer value. FMTVERSION -- The version of this standard specification to which the lump adheres. Each standard shall define a single digit version number which should be written into this field by editors. Implementing source ports may wish to reject or to handle specially maps depending on the format version they employ. COORDFMT -- This field determines the format of numeric coordinates in this lump. Supported values in this version shall be the following: 0: Integer coordinates. 1: 16.16 Fixed-point coordinates. 2: IEEE 32-bit float coordinates. Implementing editors and source ports may not support some coordinate formats. CHECKSUM -- Lump checksum as calculated by a means to be determined in the first finalized version of this standard. This checksum should be used by implementing editors and source ports as part of format verification, since the probability of an old-format lump bearing a proper lump checksum value at this offset is astronomically poor. GUARD -- Guard bytes at the end of the header which must be set to zero by all implementing editors. This should be used in format verification as a further line of defense against data aliasing. * Required Record Fields * Field Name Length Offset --------------------------------------------- STARTVERTEX 4 0 ENDVERTEX 4 4 ANGLE 4 8 LINEDEF 4 12 DIRECTION 4 16 OFFSET 4 20 Total Record Length: 24 bytes --------------------------------------- SSECTORS --------------------------------------- The format of the SSECTORS lump is extended to support reasonable limits on the number of segs. * Header * Field Name Length Offset Specified Value ------------------------------------------------------------------------- MAGIC 4 0 xSSC FMTVERSION 4 4 1 CHECKSUM 4 8 lump checksum GUARD 4 12 0 Total Header Length: 16 bytes MAGIC -- The "magic number" indicating this is an extended SSECTORS lump. This value should NOT be relied on alone for verification of the format. The CHECKSUM and GUARD fields must also have appropriate values, or the lump must be treated as either corrupt or as a non-standard older map format. The value xSSC shall be stored in string order and may be detected via string comparison or by comparison against the corresponding integer value. FMTVERSION -- The version of this standard specification to which the lump adheres. Each standard shall define a single digit version number which should be written into this field by editors. Implementing source ports may wish to reject or to handle specially maps depending on the format version they employ. CHECKSUM -- Lump checksum as calculated by a means to be determined in the first finalized version of this standard. This checksum should be used by implementing editors and source ports as part of format verification, since the probability of an old-format lump bearing a proper lump checksum value at this offset is astronomically poor. GUARD -- Guard bytes at the end of the header which must be set to zero by all implementing editors. This should be used in format verification as a further line of defense against data aliasing. * Required Record Fields * Field Name Length Offset --------------------------------------------- NUMSEGS 4 0 FIRSTSEG 4 4 Total Record Length: 8 bytes --------------------------------------- NODES --------------------------------------- The format of the NODES lump is extended to support reasonable limits on the number of nodes. * Header * Field Name Length Offset Specified Value ------------------------------------------------------------------------- MAGIC 4 0 xNOD FMTVERSION 4 4 1 COORDFMT 4 8 standardized value CHECKSUM 4 12 lump checksum GUARD 4 16 0 Total Header Length: 20 bytes MAGIC -- The "magic number" indicating this is an extended NODES lump. This value should NOT be relied on alone for verification of the format. The CHECKSUM and GUARD fields must also have appropriate values, or the lump must be treated as either corrupt or as a non-standard older map format. The value xNOD shall be stored in string order and may be detected via string comparison or by comparison against the corresponding integer value. FMTVERSION -- The version of this standard specification to which the lump adheres. Each standard shall define a single digit version number which should be written into this field by editors. Implementing source ports may wish to reject or to handle specially maps depending on the format version they employ. COORDFMT -- This field determines the format of numeric coordinates in this lump. Supported values in this version shall be the following: 0: Integer coordinates. 1: 16.16 Fixed-point coordinates. 2: IEEE 32-bit float coordinates. Implementing editors and source ports may not support some coordinate formats. CHECKSUM -- Lump checksum as calculated by a means to be determined in the first finalized version of this standard. This checksum should be used by implementing editors and source ports as part of format verification, since the probability of an old-format lump bearing a proper lump checksum value at this offset is astronomically poor. GUARD -- Guard bytes at the end of the header which must be set to zero by all implementing editors. This should be used in format verification as a further line of defense against data aliasing. * Required Record Fields * Field Name Length Offset --------------------------------------------- X 4 0 Y 4 4 DX 4 8 DY 4 12 BBOX 32 16 CHILDREN 8 48 Total Record Length: 56 bytes --------------------------------------- SECTORS --------------------------------------- The format of the SECTORS lump is extended to support reasonable limits on sector special numbers and tags, and to allow implementation-defined fields. * Header * Field Name Length Offset Specified Value ------------------------------------------------------------------------- MAGIC 4 0 xSEC FMTVERSION 4 4 1 TARGETPORT 4 8 standardized value PREFTRANSLATION 4 12 standardized value NUMRECORDS 4 16 CHECKSUM 4 20 lump checksum GUARD 4 24 0 Total Header Length: 28 bytes MAGIC -- The "magic number" indicating this is an extended SECTORS lump. This value should NOT be relied on alone for verification of the format. The CHECKSUM and GUARD fields must also have appropriate values, or the lump must be treated as either corrupt or as a non-standard older map format. The value xSEC shall be stored in string order and may be detected via string comparison or by comparison against the corresponding integer value. FMTVERSION -- The version of this standard specification to which the lump adheres. Each standard shall define a single digit version number which should be written into this field by editors. Implementing source ports may wish to reject or to handle specially maps depending on the format version they employ. TARGETPORT -- This field holds a standards-defined target source port value. This field is of no benefit to editors, but may be of benefit to source ports which wish to support features of other ports and thus must be aware of what port with which a map is intended to be used. Implementing editors should allow this field to be specified, or should assume its value based on the editing configuration being employed. PREFTRANSLATION -- This field holds a standards-defined preferred translation ID. Translation IDs may be used by implementing source ports to determine what set of mapthing doomednums, line specials, sector specials, and line flag values, which are NOT currently a part of this standard, are to be used when loading this map. Values should be defined by the first finalized version of this standard to represent existing map translations, including but not limited to DOOM, Heretic, Hexen, and Strife. Implementing source ports may reject the map or ignore this field and apply their own interpretation if they do not support the value indicated. NUMRECORDS -- Because records are not of uniform length, it is necessary to store the number of records in the header. CHECKSUM -- Lump checksum as calculated by a means to be determined in the first finalized version of this standard. This checksum should be used by implementing editors and source ports as part of format verification, since the probability of an old-format lump bearing a proper lump checksum value at this offset is astronomically poor. GUARD -- Guard bytes at the end of the header which must be set to zero by all implementing editors. This should be used in format verification as a further line of defense against data aliasing. * Required Record Fields * Field Name Length Offset Specified Value ------------------------------------------------------------------------- RECORD_ID 4 0 xSCR FLOORHEIGHT 4 4 CEILINGHEIGHT 4 8 FLOORTEXTURE 8 12 CEILINGTEXTURE 8 20 LIGHTLEVEL 4 28 SPECIAL 4 32 TAG 4 36 ARGS 20 40 Total Required Fields Length: 60 bytes * Implementation-Dependent Record Fields * Implementing editors and source ports shall continue to read the record for implementation-dependent record fields, until such a field is found with the STD_ID of "xEND", a length of 1, and a single word of value zero following. Implementing editors and source ports may ignore any or all of the fields contained in this portion of the record, but record IDs will be registered by implementors with the standards committee and shall remain unique for each unique field usage. Commonly implemented non-standard fields may be considered for standardization by a later revision of this standard. Implementing editors should make effort to preserve implementation-dependent fields which they do not understand. Field Name Length Offset Specified Value ------------------------------------------------------------------------- STD_ID 4 s standardized values LENGTH 4 s + 4 VALUE LENGTH s + 8 --------------------------------------- REJECT --------------------------------------- No changes are made to this lump in this standard, so it is not documented in this draft. --------------------------------------- BLOCKMAP --------------------------------------- All indices and coordinates in the blockmap are extended to 4-byte precision. * Header * Field Name Length Offset Specified Value ------------------------------------------------------------------------- MAGIC 4 0 xBKM FMTVERSION 4 4 1 COORDFMT 4 8 standardized value CHECKSUM 4 12 lump checksum GUARD 4 16 0 ORIGIN_X 4 20 ORIGIN_Y 4 24 NUMCOLS 4 28 NUMROWS 4 32 Total Header Length: 36 bytes MAGIC -- The "magic number" indicating this is an extended BLOCKMAP lump. This value should NOT be relied on alone for verification of the format. The CHECKSUM and GUARD fields must also have appropriate values, or the lump must be treated as either corrupt or as a non-standard older map format. The value xBKM shall be stored in string order and may be detected via string comparison or by comparison against the corresponding integer value. FMTVERSION -- The version of this standard specification to which the lump adheres. Each standard shall define a single digit version number which should be written into this field by editors. Implementing source ports may wish to reject or to handle specially maps depending on the format version they employ. COORDFMT -- This field determines the format of numeric coordinates in this lump. Supported values in this version shall be the following: 0: Integer coordinates. 1: 16.16 Fixed-point coordinates. 2: IEEE 32-bit float coordinates. Implementing editors and source ports may not support some coordinate formats. CHECKSUM -- Lump checksum as calculated by a means to be determined in the first finalized version of this standard. This checksum should be used by implementing editors and source ports as part of format verification, since the probability of an old-format lump bearing a proper lump checksum value at this offset is astronomically poor. GUARD -- Guard bytes at the end of the header which must be set to zero by all implementing editors. This should be used in format verification as a further line of defense against data aliasing. * Offsets * Block offsets are 4-byte integers, of which there are NUMCOLS * NUMROWS. * Blocklists * Each block list begins with a 4-byte integer with the value zero, followed by 4-byte linedef indices and terminated with a 4-byte integer with the value -1. ------------------------------------------------------------------------------- EOF -------------------------------------------------------------------------------