diff --git a/docs/rh-log.txt b/docs/rh-log.txt index 76ad4dd1f..1bb777d96 100644 --- a/docs/rh-log.txt +++ b/docs/rh-log.txt @@ -1,4 +1,11 @@ -April 13, 2009 +April 13, 2009 (Changes by Graf Zahl) +- Added -noautoload option. +- Added default Raven automap colors set. Needs to be tested because I can't + compare against the DOS version myself. +- Extened A_PlaySound and A_StopSound to be able to set all parameters of the + internal sound code. + +April 13, 2009 - Changed gravity doubling so that it only happens when you run off a ledge. April 10, 2009 diff --git a/specs/udmf.txt b/specs/udmf.txt index d9f0ff52b..ec34d1506 100644 --- a/specs/udmf.txt +++ b/specs/udmf.txt @@ -1,403 +1,442 @@ -=============================================================================== -Universal Doom Map Format Specification v1.0 - 05/28/08 - -Written by James "Quasar" Haley - haleyjd@hotmail.com - -Defined with input from: - -CodeImp -esselfortium -Graf Zahl -Kaiser -SlayeR -SoM -et al. - - Copyright (c) 2008 James Haley. - Permission is granted to copy, distribute and/or modify this document - under the terms of the GNU Free Documentation License, Version 1.2 - or any later version published by the Free Software Foundation; - with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. - -=============================================================================== - -======================================= -I. Grammar / Syntax -======================================= - - translation_unit := global_expr_list - global_expr_list := global_expr global_expr_list - global_expr := block | assignment_expr - block := identifier '{' expr_list '}' - expr_list := assignment_expr expr_list - assignment_expr := identifier '=' value ';' | nil - identifier := [A-Za-z0-9_]+ - value := integer | float | quoted_string | keyword - integer := [+-]?[1-9]+[0-9]* | 0[0-9]+ | 0x[0-9A-Fa-f]+ - float := [+-]?[0-9]+'.'[0-9]*([eE][+-]?[0-9]+)? - quoted_string := "([^"\\]*(\\.[^"\\]*)*)" - keyword := [^{}();"'\n\t ]+ - - -Global assignments and named/indexed global blocks are the only top-level -entities supported. Whitespace is strictly ignored. - -Comments are supported as C-style single and multi-line comments: - - // single line comment - - /* - multi - line - comment - */ - -Multi-line comments may not be nested. - -Implementing editors are not required (but are allowed) to maintain syntactic -comments when rewriting UDMF map lumps. These comments are provided chiefly for -hand-writing and debugging purposes. - -Blocks begin with a keyword identifier. An example of a minimally-defined -entity follows: - - linedef { id = 1; } - -Compliant parsers will ignore all unknown keywords in global assignments, -block-level assignments, and block headers. Compliant parsers should attempt -to preserve as much of such information as is possible by using a flexible -mapping such as hashing. - -Identifiers and keywords are to be treated as case insensitive. - -A field which specifies "boolean" semantics shall accept keyword value -"true" to mean that the field is asserted, and keyword value "false" to -mean that the field is unasserted. Keyword values can only be defined in -this specification, and not by implementing ports. Use quoted strings -instead. - -Fields which do not appear in a block take on their default value. This -allows minimal specification. Note that the default values specified by -UDMF are not necessarily the default values which editors may wish to -apply to those fields during the creation of new entities during editing. -Such editing defaults are not part of this specification. - - -======================================= -II. Implementation Semantics -======================================= - ------------------------------------- -II.A : Storage and Retrieval of Data ------------------------------------- - -Block-defined entities are written and read in top-to-bottom order. For -example, the following linedefs can be assigned in order to a contiguous -block of memory serving as the implementing port's lines array: - - linedef { id = 1; } - linedef { id = 2; } - linedef { id = 3; } - linedef { id = 4; } - -Data types: - -For purposes of internal storage: ---------------------------------- -Integers should be considered signed with a range of at least 32 bits. -Floating-point numbers should be considered double precision. -Strings have no reasonable length limitations. - -Hard Data Type Limits ---------------------- -No limits on number of definitions are defined as part of this specification, -but implementors may face the need to impose such limitations due to -restrictions on the amount of memory available, or the amount that can be -allocated through a single pointer on the host machine or in a private heap -implementation. - -In the event that a map exceeds such an internal engine limitation, an -implementing port or editor should not continue to attempt loading the map, as -doing so could destabilize the program. - ------------------------------------ -II.B : Storage Within Archive Files ------------------------------------ - -UDMF maps shall be layed out within the archive directory as follows: - - (HEADER) - TEXTMAP - ... - ENDMAP - -(HEADER) = Any lump name from 1 to 8 characters. Serves as the name of the map. -TEXTMAP = Single UDMF lump containing all data for the map. -... = Blockmap, reject, BSP tree, and port-specific lumps, if any. The - format and presence of these resources are not defined by UDMF. -ENDMAP = Required closing lump. - -Implementing editors and source ports may distinguish a UDMF map from a -traditional binary map by testing the name of the first directory entry -following the map header. Implementing resource editors will be capable of -keeping all lumps for the map, even non-standard ones, together by properly -scanning for the ENDMAP entry. Non-implementing resource editors will not -recognize the sequence of lumps as a map, and may thus be less likely to -interfere with the order or presence of the lumps. - -Use of non-implementing resource editors to manipulate UDMF-map-containing WAD -files is not recommended, however. - - --------------------------------- -II.C : Implementation Dependence --------------------------------- - -A port's list of supported non-standard fields must be provided to implementing -editors, where they can be provided to the end user as controls, as options -in a dropbox, or through the ability to input any arbitrary -"identifier = value;" pair in a text box. - -Every UDMF map should contain as the first statement in the file the "namespace" -identifier statement, which declares the source port implementation relative to -which this map is to be interpreted. - -Example: - - namespace = "ZDoom"; - -Implementing source ports may ignore this information, or they may use it to -perform automatic runtime translation of maps they would otherwise be unable to -support. - -Implementing source ports should publicly document the value of the "namespace" -variable they intend to identify with when establishing support for UDMF, and -avoid conflicts with existing implementations at all costs. - -The following namespaces are considered reserved for compatibility purposes: - -Doom -Heretic -Hexen -Strife - -The use of one of these namespaces indicates that all line specials, sector -specials, thing types, and if applicable, thing specials contained in the UDMF -map conform to the "vanilla" types for the respective gamemode (with an -exception for Doom) and are therefore 100% compatible with all UDMF -implementors which support the specified gamemode. - -An exception is made for the "Doom" translation type. It is considered to -represent the final fork of the v1.9 Doom engine, and therefore it includes -all line types added in DOOM II. It is also additionally considered to -include all specials defined in the BOOM and MBF source ports. Implementors -who support BOOM linedef types can handle these in the normal manner; ports -which do not support them should zero or otherwise ignore the offending -specials. - -Documentation of the precise meanings of these standardized namespaces will -be provided in separate documents. - -This feature is provided in order to facilitate a universal and lossless -conversion of all existing Doom-engine-game maps to and from UDMF format, -independent of any implementing ports' specific namespaces. - - -======================================= -III. Standardized Fields -======================================= - -The UDMF v1.0 specification considers the following fields standard. They must -be recognized by all implementing ports and editors (support for the features -they signify is not necessarily required, such as for ports which do not -implement Hexen support - all fields unknown to a given port should be -ignored and not treated as an error). - - linedef - { - id = ; // ID of line. Interpreted as tag or scripting id. - // Default = -1. *** see below. - - v1 = ; // Index of first vertex. No valid default. - v2 = ; // Index of second vertex. No valid default. - - // All flags default to false. - - blocking = ; // true = line blocks things. - blockmonsters = ; // true = line blocks monsters. - twosided = ; // true = line is 2S. - dontpegtop = ; // true = upper texture unpegged. - dontpegbottom = ; // true = lower texture unpegged. - secret = ; // true = drawn as 1S on map. - blocksound = ; // true = blocks sound. - dontdraw = ; // true = line never drawn on map. - mapped = ; // true = always appears on map. - - // BOOM passuse flag not supported in Strife/Heretic/Hexen namespaces. - - passuse = ; // true = passes use action. - - // Strife specific flags. Support for other games is not defined by - // default and these flags should be ignored when reading maps not for - // the Strife namespace or maps for a port which supports these flags. - - translucent = ; // true = line is a Strife translucent line. - jumpover = ; // true = line is a Strife railing. - blockfloaters = ; // true = line is a Strife float-blocker. - - // Note: SPAC flags should be set false in Doom/Heretic/Strife - // namespace maps. Specials in those games do not support this - // mechanism and instead imply activation parameters through the - // special number. All flags default to false. - - playercross = ; // true = player can cross. - playeruse = ; // true = player can use. - monstercross = ; // true = monster can cross. - monsteruse = ; // true = monster can use. - impact = ; // true = projectile can activate. - playerpush = ; // true = player can push. - monsterpush = ; // true = monster can push. - missilecross = ; // true = projectile can cross. - repeatspecial = ; // true = repeatable special. - - special = ; // Special. Default = 0. - arg0 = ; // Argument 0. Default = 0. - arg1 = ; // Argument 1. Default = 0. - arg2 = ; // Argument 2. Default = 0. - arg3 = ; // Argument 3. Default = 0. - arg4 = ; // Argument 4. Default = 0. - - sidefront = ; // Sidedef 1 index. No valid default. - sideback = ; // Sidedef 2 index. Default = -1. - - comment = ; // A comment. Implementors should attach no special - // semantic meaning to this field. - } - - sidedef - { - offsetx = ; // X Offset. Default = 0. - offsety = ; // Y Offset. Default = 0. - - texturetop = ; // Upper texture. Default = "-". - texturebottom = ; // Lower texture. Default = "-". - texturemiddle = ; // Middle texture. Default = "-". - - sector = ; // Sector index. No valid default. - - comment = ; // A comment. Implementors should attach no special - // semantic meaning to this field. - } - - vertex - { - x = ; // X coordinate. No valid default. - y = ; // Y coordinate. No valid default. - } - - sector - { - heightfloor = ; // Floor height. Default = 0. - heightceiling = ; // Ceiling height. Default = 0. - - texturefloor = ; // Floor flat. No valid default. - textureceiling = ; // Ceiling flat. No valid default. - - lightlevel = ; // Light level. Default = 160. - - special = ; // Sector special. Default = 0. - id = ; // Sector tag/id. Default = 0. - - comment = ; // A comment. Implementors should attach no special - // semantic meaning to this field. - } - - thing - { - id = ; // Thing ID. Default = 0. - - x = ; // X coordinate. No valid default. - y = ; // Y coordinate. No valid default. - - height = ; // Z height relative to floor. Default = 0. - // (Relative to ceiling for SPAWNCEILING items). - - angle = ; // Map angle of thing in degrees. Default = 0 (East). - - type = ; // DoomedNum. No valid default. - - // All flags default to false. - - skill1 = ; // true = in skill 1. - skill2 = ; // true = in skill 2. - skill3 = ; // true = in skill 3. - skill4 = ; // true = in skill 4. - skill5 = ; // true = in skill 5. - ambush = ; // true = thing is deaf. - single = ; // true = in SP mode. - dm = ; // true = in DM mode. - coop = ; // true = in Coop. - - // MBF friend flag not supported in Strife/Heretic/Hexen namespaces. - - friend = ; // true = MBF friend. - - // Hexen flags; not supported in Doom/Strife/Heretic namespaces. - - dormant = ; // true = dormant thing. - class1 = ; // true = Present for pclass 1. - class2 = ; // true = Present for pclass 2. - class3 = ; // true = Present for pclass 3. - - - // Strife specific flags. Support for other games is not defined by - // default and these flags should be ignored when reading maps not for - // the Strife namespace or maps for a port which supports these flags. - standing = ; // true = Strife NPC flag. - strifeally = ; // true = Strife ally flag. - translucent = ; // true = Strife translucency flag. - invisible = ; // true = Strife invisibility flag. - - // Note: suggested editor defaults for all skill, gamemode, and player - // class flags is true rather than the UDMF default of false. - - // Thing special semantics are only defined for the Hexen namespace or - // ports which implement this feature in their own namespace. - - special = ; // Scripting special. Default = 0; - arg0 = ; // Argument 0. Default = 0. - arg1 = ; // Argument 1. Default = 0. - arg2 = ; // Argument 2. Default = 0. - arg3 = ; // Argument 3. Default = 0. - arg4 = ; // Argument 4. Default = 0. - - comment = ; // A comment. Implementors should attach no special - // semantic meaning to this field. - } - - -*** Tag / ID Behavior for Map Conversion: - - Unlike traditional Doom maps UDMF makes a clear distinction between a line's - ID and the parameter which identifies the object the line's special is - supposed to affect. - - The id will be used to identify this line, and arg0 will be used to identify - the line or sector that this line is to affect or otherwise reference, i.e. - it is effectively a parameter to the line's special. - - Boom used the linedef's tag for both due to lack of other options so in - order to ensure compatibility any map converter converting maps for the - Doom/Heretic/Strife namespaces must store the linedef's tag field as both - the id and as arg0 in each line. The default value of the id field under - these namespaces is defined as 0 rather than -1. - - Since UDMF provides a line id field, the Hexen line special #121 - (Line_SetIdentification) is obsolete. When converting maps to UDMF under - Hexen namespace, special 121 should be written as zero, and the arg0 of - the binary linedef should be written as the id field of the UDMF line. - The arg0 value of the UDMF line should also then be set to zero. - -=============================================================================== -EOF -=============================================================================== +=============================================================================== +Universal Doom Map Format Specification v1.1 - 03/29/09 + +Written by James "Quasar" Haley - haleyjd@hotmail.com + +Defined with input from: + +CodeImp +esselfortium +Graf Zahl +Kaiser +SlayeR +SoM +et al. + + Copyright (c) 2009 James Haley. + Permission is granted to copy, distribute and/or modify this document + under the terms of the GNU Free Documentation License, Version 1.2 + or any later version published by the Free Software Foundation; + with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. + +=============================================================================== + + +======================================= +Preface +======================================= + +The Universal Doom Map Format specification is a collaborative effort to +create and maintain a cross-port standardized textual representation for Doom +engine maps. + +The basic UDMF standard contains a superset of the features of all commercial +Doom engine games, and provides facilities for seamless extension in source +ports, allowing in-editor access to custom map data which would otherwise be +squirreled away in external lumps. + + +======================================= +Changes in v1.1 +======================================= + +This is version 1.1 of the UDMF specification, superceding the previous version +1.0 with the following adjustments: + +* Added Preface. +* Grammar for identifiers altered to forbid initial numerals. +* Made use of true/false keywords for boolean-type fields more explicit. +* Rule added for user-defined fields. + + +======================================= +I. Grammar / Syntax +======================================= + + translation_unit := global_expr_list + global_expr_list := global_expr global_expr_list + global_expr := block | assignment_expr + block := identifier '{' expr_list '}' + expr_list := assignment_expr expr_list + assignment_expr := identifier '=' value ';' | nil + identifier := [A-Za-z_]+[A-Za-z0-9_]* + value := integer | float | quoted_string | keyword + integer := [+-]?[1-9]+[0-9]* | 0[0-9]+ | 0x[0-9A-Fa-f]+ + float := [+-]?[0-9]+'.'[0-9]*([eE][+-]?[0-9]+)? + quoted_string := "([^"\\]*(\\.[^"\\]*)*)" + keyword := [^{}();"'\n\t ]+ + + +Global assignments and named/indexed global blocks are the only top-level +entities supported. Whitespace is strictly ignored. + +Keywords are currently restricted to the values true and false, which are +used as the values of all boolean fields. + +Comments are supported as C-style single and multi-line comments: + + // single line comment + + /* + multi + line + comment + */ + +Multi-line comments may not be nested. + +Implementing editors are not required (but are allowed) to maintain syntactic +comments when rewriting UDMF map lumps. These comments are provided chiefly for +hand-writing and debugging purposes. + +Blocks begin with a keyword identifier. An example of a minimally-defined +entity follows: + + linedef { id = 1; } + +Compliant parsers will ignore all unknown keywords in global assignments, +block-level assignments, and block headers. Compliant parsers should attempt +to preserve as much of such information as is possible by using a flexible +mapping such as hashing. + +For purposes of forward compatibility, user-defined fields are restricted to +beginning with the string "user_", but are otherwise normal identifiers. +Implementing editors should not restrict the entry of custom field names to +those beginning with "user_", however, in order to avoid problems with +out-of-date configurations. + +Identifiers and keywords are to be treated as case-insensitive. + +A field which specifies "boolean" semantics shall accept keyword value +true to mean that the field is asserted, and keyword value false to +mean that the field is unasserted. Keyword values can only be defined in +this specification, and not by implementing ports. Use quoted strings +instead. + +Fields which do not appear in a block take on their default value. This +allows minimal specification. Note that the default values specified by +UDMF are not necessarily the default values which editors may wish to +apply to those fields during the creation of new entities during editing. +Such editing defaults are not part of this specification. + + +======================================= +II. Implementation Semantics +======================================= + +------------------------------------ +II.A : Storage and Retrieval of Data +------------------------------------ + +Block-defined entities are written and read in top-to-bottom order. For +example, the following linedefs can be assigned in order to a contiguous +block of memory serving as the implementing port's lines array: + + linedef { id = 1; } + linedef { id = 2; } + linedef { id = 3; } + linedef { id = 4; } + +Data types: + +For purposes of internal storage: +--------------------------------- +Integers should be considered signed with a range of at least 32 bits. +Floating-point numbers should be considered double precision. +Strings have no reasonable length limitations. + +Hard Data Type Limits +--------------------- +No limits on number of definitions are defined as part of this specification, +but implementors may face the need to impose such limitations due to +restrictions on the amount of memory available, or the amount that can be +allocated through a single pointer on the host machine or in a private heap +implementation. + +In the event that a map exceeds such an internal engine limitation, an +implementing port or editor should not continue to attempt loading the map, as +doing so could destabilize the program. + +----------------------------------- +II.B : Storage Within Archive Files +----------------------------------- + +UDMF maps shall be layed out within the archive directory as follows: + + (HEADER) + TEXTMAP + ... + ENDMAP + +(HEADER) = Any lump name from 1 to 8 characters. Serves as the name of the map. +TEXTMAP = Single UDMF lump containing all data for the map. +... = Blockmap, reject, BSP tree, and port-specific lumps, if any. The + format and presence of these resources are not defined by UDMF. +ENDMAP = Required closing lump. + +Implementing editors and source ports may distinguish a UDMF map from a +traditional binary map by testing the name of the first directory entry +following the map header. Implementing resource editors will be capable of +keeping all lumps for the map, even non-standard ones, together by properly +scanning for the ENDMAP entry. Non-implementing resource editors will not +recognize the sequence of lumps as a map, and may thus be less likely to +interfere with the order or presence of the lumps. + +Use of non-implementing resource editors to manipulate UDMF-map-containing WAD +files is not recommended, however. + + +-------------------------------- +II.C : Implementation Dependence +-------------------------------- + +A port's list of supported non-standard fields must be provided to implementing +editors, where they can be provided to the end user as controls, as options +in a dropbox, or through the ability to input any arbitrary +"identifier = value;" pair in a text box. + +Every UDMF map should contain as the first statement in the file the "namespace" +identifier statement, which declares the source port implementation relative to +which this map is to be interpreted. + +Example: + + namespace = "ZDoom"; + +Implementing source ports may ignore this information, or they may use it to +perform automatic runtime translation of maps they would otherwise be unable to +support. + +Implementing source ports should publicly document the value of the "namespace" +variable they intend to identify with when establishing support for UDMF, and +avoid conflicts with existing implementations at all costs. + +The following namespaces are considered reserved for compatibility purposes: + +Doom +Heretic +Hexen +Strife + +The use of one of these namespaces indicates that all line specials, sector +specials, thing types, and if applicable, thing specials contained in the UDMF +map conform to the "vanilla" types for the respective gamemode (with an +exception for Doom) and are therefore 100% compatible with all UDMF +implementors which support the specified gamemode. + +An exception is made for the "Doom" translation type. It is considered to +represent the final fork of the v1.9 Doom engine, and therefore it includes +all line types added in DOOM II. It is also additionally considered to +include all specials defined in the BOOM and MBF source ports. Implementors +who support BOOM linedef types can handle these in the normal manner; ports +which do not support them should zero or otherwise ignore the offending +specials. + +Documentation of the precise meanings of these standardized namespaces will +be provided in separate documents. + +This feature is provided in order to facilitate a universal and lossless +conversion of all existing Doom-engine-game maps to and from UDMF format, +independent of any implementing ports' specific namespaces. + + +======================================= +III. Standardized Fields +======================================= + +The UDMF v1.0 specification considers the following fields standard. They must +be recognized by all implementing ports and editors (support for the features +they signify is not necessarily required, such as for ports which do not +implement Hexen support - all fields unknown to a given port should be +ignored and not treated as an error). + +All boolean fields take the keyword values true and false. + + linedef + { + id = ; // ID of line. Interpreted as tag or scripting id. + // Default = -1. *** see below. + + v1 = ; // Index of first vertex. No valid default. + v2 = ; // Index of second vertex. No valid default. + + // All flags default to false. + + blocking = ; // true = line blocks things. + blockmonsters = ; // true = line blocks monsters. + twosided = ; // true = line is 2S. + dontpegtop = ; // true = upper texture unpegged. + dontpegbottom = ; // true = lower texture unpegged. + secret = ; // true = drawn as 1S on map. + blocksound = ; // true = blocks sound. + dontdraw = ; // true = line never drawn on map. + mapped = ; // true = always appears on map. + + // BOOM passuse flag not supported in Strife/Heretic/Hexen namespaces. + + passuse = ; // true = passes use action. + + // Strife specific flags. Support for other games is not defined by + // default and these flags should be ignored when reading maps not for + // the Strife namespace or maps for a port which supports these flags. + + translucent = ; // true = line is a Strife translucent line. + jumpover = ; // true = line is a Strife railing. + blockfloaters = ; // true = line is a Strife float-blocker. + + // Note: SPAC flags should be set false in Doom/Heretic/Strife + // namespace maps. Specials in those games do not support this + // mechanism and instead imply activation parameters through the + // special number. All flags default to false. + + playercross = ; // true = player can cross. + playeruse = ; // true = player can use. + monstercross = ; // true = monster can cross. + monsteruse = ; // true = monster can use. + impact = ; // true = projectile can activate. + playerpush = ; // true = player can push. + monsterpush = ; // true = monster can push. + missilecross = ; // true = projectile can cross. + repeatspecial = ; // true = repeatable special. + + special = ; // Special. Default = 0. + arg0 = ; // Argument 0. Default = 0. + arg1 = ; // Argument 1. Default = 0. + arg2 = ; // Argument 2. Default = 0. + arg3 = ; // Argument 3. Default = 0. + arg4 = ; // Argument 4. Default = 0. + + sidefront = ; // Sidedef 1 index. No valid default. + sideback = ; // Sidedef 2 index. Default = -1. + + comment = ; // A comment. Implementors should attach no special + // semantic meaning to this field. + } + + sidedef + { + offsetx = ; // X Offset. Default = 0. + offsety = ; // Y Offset. Default = 0. + + texturetop = ; // Upper texture. Default = "-". + texturebottom = ; // Lower texture. Default = "-". + texturemiddle = ; // Middle texture. Default = "-". + + sector = ; // Sector index. No valid default. + + comment = ; // A comment. Implementors should attach no special + // semantic meaning to this field. + } + + vertex + { + x = ; // X coordinate. No valid default. + y = ; // Y coordinate. No valid default. + } + + sector + { + heightfloor = ; // Floor height. Default = 0. + heightceiling = ; // Ceiling height. Default = 0. + + texturefloor = ; // Floor flat. No valid default. + textureceiling = ; // Ceiling flat. No valid default. + + lightlevel = ; // Light level. Default = 160. + + special = ; // Sector special. Default = 0. + id = ; // Sector tag/id. Default = 0. + + comment = ; // A comment. Implementors should attach no special + // semantic meaning to this field. + } + + thing + { + id = ; // Thing ID. Default = 0. + + x = ; // X coordinate. No valid default. + y = ; // Y coordinate. No valid default. + + height = ; // Z height relative to floor. Default = 0. + // (Relative to ceiling for SPAWNCEILING items). + + angle = ; // Map angle of thing in degrees. Default = 0 (East). + + type = ; // DoomedNum. No valid default. + + // All flags default to false. + + skill1 = ; // true = in skill 1. + skill2 = ; // true = in skill 2. + skill3 = ; // true = in skill 3. + skill4 = ; // true = in skill 4. + skill5 = ; // true = in skill 5. + ambush = ; // true = thing is deaf. + single = ; // true = in SP mode. + dm = ; // true = in DM mode. + coop = ; // true = in Coop. + + // MBF friend flag not supported in Strife/Heretic/Hexen namespaces. + + friend = ; // true = MBF friend. + + // Hexen flags; not supported in Doom/Strife/Heretic namespaces. + + dormant = ; // true = dormant thing. + class1 = ; // true = Present for pclass 1. + class2 = ; // true = Present for pclass 2. + class3 = ; // true = Present for pclass 3. + + + // Strife specific flags. Support for other games is not defined by + // default and these flags should be ignored when reading maps not for + // the Strife namespace or maps for a port which supports these flags. + standing = ; // true = Strife NPC flag. + strifeally = ; // true = Strife ally flag. + translucent = ; // true = Strife translucency flag. + invisible = ; // true = Strife invisibility flag. + + // Note: suggested editor defaults for all skill, gamemode, and player + // class flags is true rather than the UDMF default of false. + + // Thing special semantics are only defined for the Hexen namespace or + // ports which implement this feature in their own namespace. + + special = ; // Scripting special. Default = 0; + arg0 = ; // Argument 0. Default = 0. + arg1 = ; // Argument 1. Default = 0. + arg2 = ; // Argument 2. Default = 0. + arg3 = ; // Argument 3. Default = 0. + arg4 = ; // Argument 4. Default = 0. + + comment = ; // A comment. Implementors should attach no special + // semantic meaning to this field. + } + + +*** Tag / ID Behavior for Map Conversion: + + Unlike traditional Doom maps UDMF makes a clear distinction between a line's + ID and the parameter which identifies the object the line's special is + supposed to affect. + + The id will be used to identify this line, and arg0 will be used to identify + the line or sector that this line is to affect or otherwise reference, i.e. + it is effectively a parameter to the line's special. + + Boom used the linedef's tag for both due to lack of other options so in + order to ensure compatibility any map converter converting maps for the + Doom/Heretic/Strife namespaces must store the linedef's tag field as both + the id and as arg0 in each line. The default value of the id field under + these namespaces is defined as 0 rather than -1. + + Since UDMF provides a line id field, the Hexen line special #121 + (Line_SetIdentification) is obsolete. When converting maps to UDMF under + Hexen namespace, special 121 should be written as zero, and the arg0 of + the binary linedef should be written as the id field of the UDMF line. + The arg0 value of the UDMF line should also then be set to zero. + +=============================================================================== +EOF +=============================================================================== diff --git a/src/am_map.cpp b/src/am_map.cpp index b042546c6..8e1558c09 100644 --- a/src/am_map.cpp +++ b/src/am_map.cpp @@ -104,6 +104,15 @@ static BYTE StrifePaletteVals[11*3] = 187, 59, 0, 219, 171, 0 }; +static AMColor RavenColors[11]; +static BYTE RavenPaletteVals[11*3] = +{ + 0x6c,0x54,0x40, 255, 255, 255, 0x74,0x5c,0x48, + 75, 50, 16, 88, 93, 86, 208, 176, 133, + 103, 59, 31, 236, 236, 236, 0, 0, 0, + 0, 0, 0, 0, 0, 0, +}; + #define MAPBITS 12 #define MapDiv SafeDivScale12 #define MapMul MulScale12 @@ -683,6 +692,7 @@ static void AM_initColors (bool overlayed) { DoomColors[i].FromRGB(DoomPaletteVals[j], DoomPaletteVals[j+1], DoomPaletteVals[j+2]); StrifeColors[i].FromRGB(StrifePaletteVals[j], StrifePaletteVals[j+1], StrifePaletteVals[j+2]); + RavenColors[i].FromRGB(RavenPaletteVals[j], RavenPaletteVals[j+1], RavenPaletteVals[j+2]); } } @@ -784,6 +794,28 @@ static void AM_initColors (bool overlayed) XHairColor = DoomColors[9]; NotSeenColor = DoomColors[10]; break; + + case 3: // Raven + // Use colors corresponding to the original Raven's + Background = RavenColors[0]; + YourColor = RavenColors[1]; + AlmostBackground = DoomColors[2]; + SecretSectorColor = + SecretWallColor = + WallColor = RavenColors[3]; + TSWallColor = RavenColors[4]; + FDWallColor = RavenColors[5]; + LockedColor = + CDWallColor = RavenColors[6]; + ThingColor = + ThingColor_Item = + ThingColor_Friend = + ThingColor_Monster = RavenColors[7]; + GridColor = RavenColors[4]; + XHairColor = RavenColors[9]; + NotSeenColor = RavenColors[10]; + break; + } lastpal = palette; @@ -1433,7 +1465,7 @@ void AM_drawWalls (bool allmap) lines[i].special == ACS_LockedExecuteDoor || (lines[i].special == Generic_Door && lines[i].args[4] !=0 )) { - if (am_colorset == 0) + if (am_colorset == 0 || am_colorset == 3) // Raven games show door colors { int P_GetMapColorForLock(int lock); int lock; diff --git a/src/d_main.cpp b/src/d_main.cpp index 147cec3b3..1be642cc9 100644 --- a/src/d_main.cpp +++ b/src/d_main.cpp @@ -1605,7 +1605,7 @@ void D_DoomMain (void) GameConfig->DoGameSetup (GameNames[gameinfo.gametype]); - if (!(gameinfo.flags & GI_SHAREWARE)) + if (!(gameinfo.flags & GI_SHAREWARE) && !Args->CheckParm("-noautoload")) { FString file; diff --git a/src/m_options.cpp b/src/m_options.cpp index 1372b7331..54ee7bd14 100644 --- a/src/m_options.cpp +++ b/src/m_options.cpp @@ -569,7 +569,8 @@ EXTERN_CVAR (Bool, am_drawmapback) static value_t MapColorTypes[] = { { 0, "Custom" }, { 1, "Traditional Doom" }, - { 2, "Traditional Strife" } + { 2, "Traditional Strife" }, + { 3, "Traditional Raven" } }; static value_t SecretTypes[] = { @@ -591,7 +592,7 @@ static value_t OverlayTypes[] = { }; static menuitem_t AutomapItems[] = { - { discrete, "Map color set", {&am_colorset}, {3.0}, {0.0}, {0.0}, {MapColorTypes} }, + { discrete, "Map color set", {&am_colorset}, {4.0}, {0.0}, {0.0}, {MapColorTypes} }, { more, "Set custom colors", {NULL}, {0.0}, {0.0}, {0.0}, {(value_t*)StartMapColorsMenu} }, { redtext, " ", {NULL}, {0.0}, {0.0}, {0.0}, {NULL} }, { discrete, "Rotate automap", {&am_rotate}, {3.0}, {0.0}, {0.0}, {RotateTypes} }, diff --git a/src/thingdef/thingdef_codeptr.cpp b/src/thingdef/thingdef_codeptr.cpp index 0fd476a44..96c59a3f0 100644 --- a/src/thingdef/thingdef_codeptr.cpp +++ b/src/thingdef/thingdef_codeptr.cpp @@ -238,20 +238,49 @@ DEFINE_ACTION_FUNCTION_PARAMS(AActor, A_BasicAttack) //========================================================================== // -// Custom sound functions. These use misc1 and misc2 in the state structure -// This has been changed to use the parameter array instead of using the -// misc field directly so they can be used in weapon states +// Custom sound functions. // //========================================================================== DEFINE_ACTION_FUNCTION_PARAMS(AActor, A_PlaySound) { - ACTION_PARAM_START(1); + ACTION_PARAM_START(5); ACTION_PARAM_SOUND(soundid, 0); + ACTION_PARAM_INT(channel, 1); + ACTION_PARAM_FLOAT(volume, 2); + ACTION_PARAM_BOOL(looping, 3); + ACTION_PARAM_FLOAT(attenuation, 4); - S_Sound (self, CHAN_BODY, soundid, 1, ATTN_NORM); + if (!looping) + { + S_Sound (self, channel, soundid, volume, attenuation); + } + else + { + if (!S_IsActorPlayingSomething (self, channel&7, soundid)) + { + S_Sound (self, channel | CHAN_LOOP, soundid, volume, attenuation); + } + } } +DEFINE_ACTION_FUNCTION_PARAMS(AActor, A_StopSound) +{ + ACTION_PARAM_START(1); + ACTION_PARAM_INT(slot, 0); + + S_StopSound(self, slot); +} + +//========================================================================== +// +// These come from a time when DECORATE constants did not exist yet and +// the sound interface was less flexible. As a result the parameters are +// not optimal and these functions have been deprecated in favor of extending +// A_PlaySound and A_StopSound. +// +//========================================================================== + DEFINE_ACTION_FUNCTION_PARAMS(AActor, A_PlayWeaponSound) { ACTION_PARAM_START(1); @@ -260,11 +289,6 @@ DEFINE_ACTION_FUNCTION_PARAMS(AActor, A_PlayWeaponSound) S_Sound (self, CHAN_WEAPON, soundid, 1, ATTN_NORM); } -DEFINE_ACTION_FUNCTION(AActor, A_StopSound) -{ - S_StopSound(self, CHAN_VOICE); -} - DEFINE_ACTION_FUNCTION_PARAMS(AActor, A_PlaySoundEx) { ACTION_PARAM_START(4); diff --git a/wadsrc/static/actors/actor.txt b/wadsrc/static/actors/actor.txt index 7dfac00d5..404648106 100644 --- a/wadsrc/static/actors/actor.txt +++ b/wadsrc/static/actors/actor.txt @@ -160,11 +160,11 @@ ACTOR Actor native //: Thinker action native A_MeleeAttack(); action native A_ComboAttack(); action native A_BulletAttack(); - action native A_PlaySound(sound whattoplay); + action native A_PlaySound(sound whattoplay, int slot = CHAN_BODY, float volume = 1.0, bool looping = false, float attenuation = ATTN_NORM); action native A_PlayWeaponSound(sound whattoplay); action native A_FLoopActiveSound(); action native A_LoopActiveSound(); - action native A_StopSound(); + action native A_StopSound(int slot = CHAN_VOICE); // Bad default but that's what is originally was... action native A_PlaySoundEx(sound whattoplay, coerce name slot, bool looping = false, int attenuation = 0); action native A_StopSoundEx(coerce name slot); action native A_SeekerMissile(int threshold, int turnmax); diff --git a/wadsrc/static/actors/constants.txt b/wadsrc/static/actors/constants.txt index 127aeb860..f131e64d5 100644 --- a/wadsrc/static/actors/constants.txt +++ b/wadsrc/static/actors/constants.txt @@ -44,5 +44,28 @@ const int MRF_UNDOBYDEATH = 512; const int MRF_UNDOBYDEATHFORCED = 1024; const int MRF_UNDOBYDEATHSAVES = 2048; +// constants for A_PlaySound +enum +{ + CHAN_AUTO = 0, + CHAN_WEAPON = 1, + CHAN_VOICE = 2, + CHAN_ITEM = 3, + CHAN_BODY = 4, + + // modifier flags + CHAN_LISTENERZ = 8, + CHAN_MAYBE_LOCAL = 16, + CHAN_UI = 32, + CHAN_NOPAUSE = 64 +}; + +// sound attenuation values +const float ATTN_NONE = 0; +const float ATTN_NORM = 1; +const float ATTN_IDLE = 1.001; +const float ATTN_STATIC = 3; + + // This is only here to provide one global variable for testing. native int testglobalvar; diff --git a/wadsrc/static/decorate.txt b/wadsrc/static/decorate.txt index d2178dccd..74ad6431e 100644 --- a/wadsrc/static/decorate.txt +++ b/wadsrc/static/decorate.txt @@ -1,5 +1,5 @@ -#include "actors/actor.txt" #include "actors/constants.txt" +#include "actors/actor.txt" #include "actors/shared/inventory.txt" #include "actors/shared/player.txt"