<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://eternity.youfailit.net/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Printz</id>
	<title>Eternity Wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://eternity.youfailit.net/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Printz"/>
	<link rel="alternate" type="text/html" href="https://eternity.youfailit.net/wiki/Special:Contributions/Printz"/>
	<updated>2026-07-01T03:17:54Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.39.2</generator>
	<entry>
		<id>https://eternity.youfailit.net/index.php?title=Polyobject&amp;diff=6558</id>
		<title>Polyobject</title>
		<link rel="alternate" type="text/html" href="https://eternity.youfailit.net/index.php?title=Polyobject&amp;diff=6558"/>
		<updated>2026-06-14T14:12:31Z</updated>

		<summary type="html">&lt;p&gt;Printz: /* Polyobjects with 2-sided lines */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;PolyObjects are special sets of one-sided linedefs which, unlike any other lines, can be moved on the map during gameplay. Unlike the Hexen implementation of PolyObjects, Eternity does not restrict these objects to one per subsector, and they are also allowed to move any distance from their spawn point, even across subsector boundaries. &lt;br /&gt;
&lt;br /&gt;
PolyObjects fully clip normal objects such as the player and enemies, optionally doing crushing damage depending upon the type of spawn spot used. They also block bullet tracers and monsters&#039; lines of sight. They do not, however, clip sound propagation, so it may be necessary to use sound blocking lines near areas where PolyObjects are meant to function as a normal wall until they move. &lt;br /&gt;
&lt;br /&gt;
Although Eternity does allow PolyObjects to move between different subsectors, this will only work properly if the subsectors on both sides of a line have the same properties (floor &amp;amp; ceiling heights, light level, and flat). However, since the implementation of [[dynaseg]]s, Eternity does not require a &amp;quot;PolyObject-aware&amp;quot; node builder. &lt;br /&gt;
&lt;br /&gt;
Finally, Eternity allows PolyObjects to be used in DOOM-format maps via the use of [[ExtraData]]. See the subsections below for more information on how to create and move PolyObjects. &lt;br /&gt;
&lt;br /&gt;
{{Backto|Linedef types}}&lt;br /&gt;
&lt;br /&gt;
==Creating PolyObjects==&lt;br /&gt;
&lt;br /&gt;
PolyObjects are a combination of a set of lines, which are typically placed in a &amp;quot;control sector&amp;quot; area outside of the main map, and exactly two mapthings: one spawn spot, and one anchor point. There are two different methods for grouping lines into a PolyObject.&lt;br /&gt;
&lt;br /&gt;
The lines are typically one-sided walls, but two-sided line polyobjects are also possible.&lt;br /&gt;
&lt;br /&gt;
===&#039;&#039;&#039;Method 1: The &amp;lt;code&amp;gt;Polyobj_StartLine&amp;lt;/code&amp;gt; Special&#039;&#039;&#039;===&lt;br /&gt;
&lt;br /&gt;
:The &amp;lt;code&amp;gt;348:Polyobj_StartLine(&#039;&#039;&#039;polyobj_id&#039;&#039;&#039;, &#039;&#039;&#039;mirror_id&#039;&#039;&#039;)&amp;lt;/code&amp;gt; special marks the first line in a PolyObject which is made up of a cyclic set of linedefs (that is, each line &amp;quot;points toward&amp;quot; the next line, ending at the first vertex of the first line). &lt;br /&gt;
&lt;br /&gt;
:Diagrammatic Example: &lt;br /&gt;
:[[File:Polyobjects_basic.png]]&lt;br /&gt;
:Assume that the linedef &#039;&#039;&#039;A&#039;&#039;&#039; is assigned the &amp;lt;code&amp;gt;Polyobj_StartLine&amp;lt;/code&amp;gt; special and has argument #1 set to &amp;quot;1&amp;quot; -- this is its &#039;&#039;&#039;PolyObject ID number&#039;&#039;&#039;, which must be unique amongst all on the map, and must be a number greater than zero. &lt;br /&gt;
&lt;br /&gt;
:Starting from line &#039;&#039;&#039;A&#039;&#039;&#039;, the engine will go from vertex to vertex, adding the first line found which shares the current line&#039;s second vertex as its first vertex. In this example, since the object is closed as is required, the process will end at the first vertex of line &#039;&#039;&#039;A&#039;&#039;&#039;, and there will be four lines in the PolyObject (note that unlike Hexen, there is NO limit to the number of lines that can be placed in one PolyObject). &lt;br /&gt;
&lt;br /&gt;
:Now, once the lines are added, it is necessary to define the control objects. Points &#039;&#039;&#039;B&#039;&#039;&#039; and &#039;&#039;&#039;C&#039;&#039;&#039; are the two required objects: &lt;br /&gt;
:* &#039;&#039;&#039;B&#039;&#039;&#039;: This is the PolyObject&#039;s anchor point (type EEPolyObjAnchor with DoomEd #9300). It defines the point relative to which all the lines in the PolyObject will be translated to the spawn point. This object&#039;s angle must be set to the same value as the StartLine&#039;s first argument (the &#039;&#039;&#039;PolyObject ID&#039;&#039;&#039;). There must be one and only one of these objects for each &#039;&#039;&#039;PolyObject ID&#039;&#039;&#039;. &lt;br /&gt;
:* &#039;&#039;&#039;C&#039;&#039;&#039;: This is the PolyObject&#039;s spawn point (one of EEPolyObjSpawnSpot [9301] or EEPolyObjSpawnSpotCrush [9302]). It defines the point where the PolyObject will initially spawn on the map. The anchor point will be translated to this exact location, and all lines in the PolyObject will maintain their relative positions to it. This object must also have its angle field set to the same value as both the StartLine&#039;s first argument and the anchor point&#039;s angle field. There must be one and only one of these objects for each PolyObject ID. Use 9302 to cause the PolyObject to do crushing damage to things that block it while it is in motion. &lt;br /&gt;
&lt;br /&gt;
:Note that when you use this method, the other lines belonging to the PolyObject can be given their own line specials, including ones which affect the PolyObject itself. When the player presses the PolyObject, the specials will work as expected. &lt;br /&gt;
&lt;br /&gt;
:The complete arguments to &amp;lt;code&amp;gt;Polyobj_StartLine(&#039;&#039;&#039;polyobj_id&#039;&#039;&#039;, &#039;&#039;&#039;mirror_id&#039;&#039;&#039;)&amp;lt;/code&amp;gt; are as follows: &lt;br /&gt;
:* &#039;&#039;polyobj_id&#039;&#039; : the unique ID number (greater than zero) of the PolyObject &lt;br /&gt;
:* &#039;&#039;mirror_id&#039;&#039; : the ID number of a PolyObject that you want to mirror every action that affects this PolyObject. This number cannot be the same as the PolyObject&#039;s own ID. &lt;br /&gt;
&lt;br /&gt;
:In order to use this line special in a DOOM-format map, it is necessary to use [[ExtraData]]. In that case, you must give the line you want to have the Polyobj_StartLine special the ExtraData linedef control special (#270) instead, and then specify Polyobj_StartLine and its arguments in its corresponding ExtraData linedef record. &lt;br /&gt;
&lt;br /&gt;
===&#039;&#039;&#039;Method 2: The &amp;lt;code&amp;gt;Polyobj_ExplicitLine&amp;lt;/code&amp;gt; Special&#039;&#039;&#039;===&lt;br /&gt;
&lt;br /&gt;
:The &amp;lt;code&amp;gt;349:Polyobj_ExplicitLine(&#039;&#039;&#039;polyobj_id&#039;&#039;&#039;, &#039;&#039;&#039;index&#039;&#039;&#039;, &#039;&#039;&#039;mirror_id&#039;&#039;&#039;)&amp;lt;/code&amp;gt; special demarcates every line that will be added to a PolyObject and the exact order in which the lines will be added. This affords a bit more flexibility in the construction of PolyObjects at the price of not allowing any other line specials to be placed on the object itself. &lt;br /&gt;
&lt;br /&gt;
:Diagrammatic Example: &lt;br /&gt;
:[[File:Polyobjects_adv.png]]&lt;br /&gt;
:Assume that the linedefs labeled 1 through 4 are assigned (via [[ExtraData]]) the &amp;lt;code&amp;gt;Polyobj_ExplicitLine&amp;lt;/code&amp;gt; special, all have argument &#039;&#039;&#039;#1&#039;&#039;&#039; set to &amp;quot;1&amp;quot; -- this is its PolyObject ID number (which must be unique amongst all on the map, and must be a number greater than zero), and argument &#039;&#039;&#039;#2&#039;&#039;&#039; set also to whatever their tag is (in this case again it&#039;s &#039;&#039;1&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
:The game engine will search through all linedefs in the entire map for ones with the current &#039;&#039;&#039;PolyObject ID&#039;&#039;&#039; in argument &#039;&#039;&#039;#1&#039;&#039;&#039; and a value greater than zero in argument &#039;&#039;&#039;#2&#039;&#039;&#039;. The lines will be collected and then sorted by the &#039;&#039;&#039;LineDef id&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
:Now, once the lines are added, it is necessary to define the control objects. This is exactly the same as it is for the &amp;lt;code&amp;gt;StartLine(...)&amp;lt;/code&amp;gt; special above. &lt;br /&gt;
:* &#039;&#039;&#039;B&#039;&#039;&#039;: This is the PolyObject&#039;s anchor point (type EEPolyObjAnchor with DoomEd #9300). It defines the point relative to which all the lines in the PolyObject will be translated to the spawn point. This object&#039;s angle must be set to the same value as the &amp;lt;code&amp;gt;ExplicitLines&#039;&amp;lt;/code&amp;gt; first argument (the &#039;&#039;&#039;PolyObject ID&#039;&#039;&#039;). There must be one and only one of these objects for each &#039;&#039;&#039;PolyObject ID&#039;&#039;&#039;. &lt;br /&gt;
:* &#039;&#039;&#039;C&#039;&#039;&#039;: This is the PolyObject&#039;s spawn point (one of EEPolyObjSpawnSpot [9301] or EEPolyObjSpawnSpotCrush [9302]). It defines the point where the PolyObject will initially spawn on the map. The anchor point will be translated to this exact location, and all lines in the PolyObject will maintain their relative positions to it. This object must also have its angle field set to the same value as both the ExplicitLines&#039; first argument and the anchor point&#039;s angle field. There must be one and only one of these objects for each &#039;&#039;&#039;PolyObject ID&#039;&#039;&#039;. Use 9302 to cause the PolyObject to do crushing damage to things that block it while it is in motion. &lt;br /&gt;
&lt;br /&gt;
:The complete arguments to &amp;lt;code&amp;gt;Polyobj_ExplicitLine(&#039;&#039;&#039;polyobj_id&#039;&#039;&#039;, &#039;&#039;&#039;index&#039;&#039;&#039;, &#039;&#039;&#039;mirror_id&#039;&#039;&#039;)&amp;lt;/code&amp;gt; are as follows: &lt;br /&gt;
:* &#039;&#039;polyobj_id&#039;&#039; : the unique ID number (greater than zero) of the PolyObject &lt;br /&gt;
:* &#039;&#039;index&#039;&#039; : specifies the order in which the line will be added to the PolyObject. This number should be unique amongst all lines to be added to the same object, and must be a value greater than zero. &lt;br /&gt;
:* &#039;&#039;mirror_id&#039;&#039; : the ID number of a PolyObject that you want to mirror every action that affects this PolyObject. This number cannot be the same as the PolyObject&#039;s own ID. &lt;br /&gt;
&lt;br /&gt;
:In order to use this line special in a DOOM-format map, it is necessary to use ExtraData. In that case, you can either give the lines you want to have the Polyobj_ExplicitLine special the ExtraData linedef control special (#270) instead, and then specify Polyobj_ExplicitLine and its arguments in all the corresponding ExtraData linedef records; or simply use the line special normally, and specify the ExtraData record number in the linedef&#039;s tag, specifying only the arguments inside the ExtraData record.&lt;br /&gt;
&lt;br /&gt;
===Note===&lt;br /&gt;
As of EE 3.37.00, thing type 9303 is available, which is similar to the ZDoom damaging polyobject type.&lt;br /&gt;
&lt;br /&gt;
==Moving PolyObjects==&lt;br /&gt;
&lt;br /&gt;
There are two types of basic motion which PolyObjects can currently undergo: translation and rotation. Using &amp;quot;override&amp;quot; actions, it is possible to combine the two to have a PolyObject which rotates while moving in the xy plane. &lt;br /&gt;
&lt;br /&gt;
[[File:Polyobject_rotating.gif]]&lt;br /&gt;
&lt;br /&gt;
===Translating PolyObjects===&lt;br /&gt;
&lt;br /&gt;
To move a PolyObject in the xy plane, use one of the following line specials: &lt;br /&gt;
* &amp;lt;code&amp;gt;Polyobj_Move(&#039;&#039;&#039;polyobj_id&#039;&#039;&#039;,  &#039;&#039;&#039;speed&#039;&#039;&#039;, &#039;&#039;&#039;angle&#039;&#039;&#039;, &#039;&#039;&#039;dist&#039;&#039;&#039;)&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;Polyobj_OR_Move(&#039;&#039;&#039;polyobj_id&#039;&#039;&#039;,  &#039;&#039;&#039;speed&#039;&#039;&#039;, &#039;&#039;&#039;angle&#039;&#039;&#039;, &#039;&#039;&#039;dist&#039;&#039;&#039;)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Both of these line specials use the same arguments:&lt;br /&gt;
* &#039;&#039;polyobj_id&#039;&#039; : Specifies which PolyObject to intially move. If the object is already moving, nothing will happen unless the action is Polyobj_OR_Move. If this object has a mirror, the same action will be recursively applied to every mirror PolyObject, reversing the angle of movement for each subsequent mirror. &lt;br /&gt;
* &#039;&#039;speed&#039;&#039; : Speed of the motion in eighths of a unit per tic. &lt;br /&gt;
* &#039;&#039;angle&#039;&#039; : Byte angle specifying the direction of motion. To convert from degrees to byte angles, use this formula: byteangle = (degrees * 256) / 360. Round or chop the result to an integer. 0 means East, 64 means North, 128 means West, and 192 means South. &lt;br /&gt;
* &#039;&#039;dist&#039;&#039; : The total distance to move the object in units. &lt;br /&gt;
&lt;br /&gt;
All PolyObjects will inflict thrust on objects which block them with force proportional to the speed of motion. If the PolyObject was spawned with the EEPolyObjSpawnSpotCrush object (DoomEd num 9302), then if the object does not fit at the location it is being pushed toward, it will be damaged 3 hitpoints per tic (105 damage per second). &lt;br /&gt;
&lt;br /&gt;
===Rotating PolyObjects===&lt;br /&gt;
&lt;br /&gt;
To rotate a PolyObject, use one of the following line specials: &lt;br /&gt;
* &amp;lt;code&amp;gt;Polyobj_RotateRight(&#039;&#039;&#039;polyobj_id&#039;&#039;&#039;,  &#039;&#039;&#039;aspeed&#039;&#039;&#039;, &#039;&#039;&#039;adist&#039;&#039;&#039;)&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;Polyobj_OR_RotateRight(&#039;&#039;&#039;polyobj_id&#039;&#039;&#039;,  &#039;&#039;&#039;aspeed&#039;&#039;&#039;, &#039;&#039;&#039;adist&#039;&#039;&#039;)&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;Polyobj_RotateLeft(&#039;&#039;&#039;polyobj_id&#039;&#039;&#039;,  &#039;&#039;&#039;aspeed&#039;&#039;&#039;, &#039;&#039;&#039;adist&#039;&#039;&#039;)&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;Polyobj_OR_RotateLeft(&#039;&#039;&#039;polyobj_id&#039;&#039;&#039;,  &#039;&#039;&#039;aspeed&#039;&#039;&#039;, &#039;&#039;&#039;adist&#039;&#039;&#039;)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
All these line specials use the same arguments:&lt;br /&gt;
* &#039;&#039;polyobj_id&#039;&#039; : Specifies which PolyObject to initially rotate. If the object is already moving, nothing will happen unless the action is Polyobj_OR_RotateRight or Polyobj_OR_RotateLeft. If this object has a mirror, the same action will be recursively applied to every mirror PolyObject, reversing the direction of rotation for each subsequent mirror. &lt;br /&gt;
* &#039;&#039;aspeed&#039;&#039; : Angular speed of the rotation in byte angles per tic. Same as for the &amp;quot;angle&amp;quot; parameter to Move actions. &lt;br /&gt;
* &#039;&#039;adist&#039;&#039; : Angular distance to rotate in byte angles. Same as for aspeed, except with two special caveats: &lt;br /&gt;
&lt;br /&gt;
The byte angle value 0 (zero) means to rotate exactly 360 degrees. &lt;br /&gt;
&lt;br /&gt;
The byte angle value 255 means to rotate perpetually. This type of action never ends and thus only override actions can subsequently be applied to the PolyObject.&lt;br /&gt;
&lt;br /&gt;
===PolyObject Examples===&lt;br /&gt;
====[https://s3-eu-west-1.amazonaws.com/eternity/polyobjects.wad PolyObject Demo]====&lt;br /&gt;
A demonstration of both rotating and translating PolyObjects. Plays on &#039;&#039;&#039;Doom 2&#039;&#039;&#039; / &#039;&#039;&#039;Map01&#039;&#039;&#039;. The map is linked to an [[ExtraData]] lump (via [[EMAPINFO]]).&lt;br /&gt;
&lt;br /&gt;
It is recommended that you open the Demo WAD in a WAD manager program like &#039;&#039;&#039;SLADE3&#039;&#039;&#039; or &#039;&#039;&#039;XWE&#039;&#039;&#039; to read the &#039;&#039;&#039;ExtraData&#039;&#039;&#039; and &#039;&#039;&#039;ACS&#039;&#039;&#039; scripts together with provided comments. For example this script explains how LineDefs are configured for a manually operated rotating PolyObject:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//===============================&lt;br /&gt;
//= MANUALLY ROTATING POLYOBJECT&lt;br /&gt;
//=============================&lt;br /&gt;
&lt;br /&gt;
// This PolyObject doesn&#039;t move unless activated by a a nearby switch.&lt;br /&gt;
linedef {&lt;br /&gt;
  recordnum = 2&lt;br /&gt;
  special = PolyObj_StartLine&lt;br /&gt;
  args = { 2 }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
linedef {&lt;br /&gt;
  recordnum = 3&lt;br /&gt;
  extflags = &amp;quot;use player&amp;quot; // Defines how the LineDef action is activated.&lt;br /&gt;
                          // The lack of &amp;quot;repeat&amp;quot; flag means it&#039;s a one-time&lt;br /&gt;
                          // action.&lt;br /&gt;
  &lt;br /&gt;
  special = Polyobj_RotateRight&lt;br /&gt;
  args = { 2, 2, 255 }  // Starts Rotating PolyObject with PolyID: 2&lt;br /&gt;
                        // at a speed of 2 units and angular distance&lt;br /&gt;
                        // of 255 units - which means it&#039;ll rotate&lt;br /&gt;
                        // continuously.&lt;br /&gt;
}  (...)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====[https://s3-eu-west-1.amazonaws.com/eternity/polyobjects_adv.wad PolyObject Advanced Demo]====&lt;br /&gt;
A demonstration of rotating and translating PolyObjects made with &amp;lt;code&amp;gt;PolyObj_ExplicitLine()&amp;lt;/code&amp;gt; Plays on &#039;&#039;&#039;Doom 2&#039;&#039;&#039; / &#039;&#039;&#039;Map01&#039;&#039;&#039;. The map is linked to an [[ExtraData]] lump (via [[EMAPINFO]]). It shows how more advanced PolyObjects can be constructed and moved to fake 3D objects. It also includes PolyObject Doors discussed in the next section of this article.&lt;br /&gt;
&lt;br /&gt;
It is recommended that you play go through  the first Demo in the series and open the Demo WAD in a WAD manager program like &#039;&#039;&#039;SLADE3&#039;&#039;&#039; or &#039;&#039;&#039;XWE&#039;&#039;&#039; to read the &#039;&#039;&#039;ExtraData&#039;&#039;&#039; and &#039;&#039;&#039;ACS&#039;&#039;&#039; scripts together with provided comments.&lt;br /&gt;
&lt;br /&gt;
==PolyObject Doors==&lt;br /&gt;
There are two distinct types of actions provided to allow PolyObjects to function as doors: swinging and sliding. There are no override versions of door actions, and applying other overrides to currently moving PolyObject doors will most likely cause the doors to malfunction and move erratically. &lt;br /&gt;
&lt;br /&gt;
All PolyObject doors accept a delay parameter, and this specifies the amount of time the door will wait before closing. A door which is closing will reopen if blocked by an object.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Swinging PolyObject Door===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [[Image:Poly_swingdoor_schema.png|200px]] || [[Image:Poly_swigning_door.gif]]&lt;br /&gt;
|-&lt;br /&gt;
| PolyObject swinging door schema || PolyObject swinging door&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;Polyobj_DoorSwing (&#039;&#039;&#039;polyobj_id&#039;&#039;&#039;, &#039;&#039;&#039;aspeed&#039;&#039;&#039;, &#039;&#039;&#039;adist&#039;&#039;&#039;, &#039;&#039;&#039;delay&#039;&#039;&#039;)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This action creates a swinging door from a PolyObject and takes the following arguments: &lt;br /&gt;
:* &#039;&#039;polyobj_id&#039;&#039; : The ID number of PolyObject to affect. Mirroring works for doors as well and is the most common use for PolyObject mirroring. &lt;br /&gt;
:* &#039;&#039;aspeed&#039;&#039; : Angular speed in byte angles per tic. &lt;br /&gt;
:* &#039;&#039;adist&#039;&#039; : Angular distance to rotate when opening, and again but in the opposite direction when closing. &lt;br /&gt;
:* &#039;&#039;delay&#039;&#039; : Amount of time before the door attempts to close after fully opening in tics. If the door is forced to reopen due to being blocked, it will also wait this amount of time before once again closing. &lt;br /&gt;
Swinging doors currently only rotate left. A right-rotating swinging door special will be added in the near future.&lt;br /&gt;
&lt;br /&gt;
===Sliding PolyObject Door===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [[Image:Poly_slidedoor_schema.png|200px]] || [[Image:Poly_sliding_door.gif|180px]]&lt;br /&gt;
|-&lt;br /&gt;
| PolyObject sliding door schema || PolyObject sliding door&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;Polyobj_DoorSlide (&#039;&#039;&#039;polyobj_id&#039;&#039;&#039;, &#039;&#039;&#039;speed&#039;&#039;&#039;, &#039;&#039;&#039;angle&#039;&#039;&#039;, &#039;&#039;&#039;dist&#039;&#039;&#039;, &#039;&#039;&#039;delay&#039;&#039;&#039;)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:This action creates a sliding door from a PolyObject and takes the following arguments: &lt;br /&gt;
:* &#039;&#039;polyobj_id&#039;&#039; : The ID number of PolyObject to affect. Mirroring works for doors as well and is the most common use for PolyObject mirroring. &lt;br /&gt;
:* &#039;&#039;speed&#039;&#039; : Speed of the door&#039;s opening and closing in eighths of a unit per tic. &lt;br /&gt;
:* &#039;&#039;angle&#039;&#039; : Byte angle of door&#039;s initial motion. This angle is reversed when the door closes. &lt;br /&gt;
:* &#039;&#039;dist&#039;&#039; : Distance the door moves when opening, and again when closing, in units. &lt;br /&gt;
:* &#039;&#039;delay&#039;&#039; : Amount of time before the door attempts to close after fully opening in tics. If the door is forced to reopen due to being blocked, it will also wait this amount of time before once again closing. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===PolyObject Door Examples===&lt;br /&gt;
====[https://s3-eu-west-1.amazonaws.com/eternity/polyobj_doors.wad PolyObject Doors Demo]====&lt;br /&gt;
A demonstration of both swinging and sliding doors, mirrored and single. Plays on &#039;&#039;&#039;Doom 2&#039;&#039;&#039; / &#039;&#039;&#039;Map01&#039;&#039;&#039;. The map is linked to an [[ExtraData]] lump (via [[EMAPINFO]]).&lt;br /&gt;
&lt;br /&gt;
It is recommended that you open the Demo WAD in a WAD manager program like &#039;&#039;&#039;SLADE3&#039;&#039;&#039; or &#039;&#039;&#039;XWE&#039;&#039;&#039; to read the &#039;&#039;&#039;ExtraData&#039;&#039;&#039; scripts together with provided comments. For example the first script explains how LineDefs are configured for a single swinging door:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//=============================&lt;br /&gt;
//= BASIC SINGLE SWINGING DOOR&lt;br /&gt;
//===========================&lt;br /&gt;
linedef {&lt;br /&gt;
  recordnum = 1 // corresponds to a LineDef with action: 270, tag: 1&lt;br /&gt;
  &lt;br /&gt;
  special = PolyObj_StartLine // this defines the current LineDef as a&lt;br /&gt;
                              // starting point for the PolyObject&lt;br /&gt;
                &lt;br /&gt;
  args = { 1 }  // since this is a very basic PolyObj, it requires only one&lt;br /&gt;
                // argument (it&#039;s not to be confused with LineDef / Sector tag)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
linedef {&lt;br /&gt;
  recordnum = 2 // corresponds to a LineDef with action: 270, tag: 2&lt;br /&gt;
  &lt;br /&gt;
  extflags = &amp;quot;use player repeat&amp;quot; // describes how the LineDef is activated&lt;br /&gt;
  &lt;br /&gt;
  special = PolyObj_DoorSwing&lt;br /&gt;
  args = { 1,20,64,160 } // swing the door with PolyId: 1, AngularSpeed: 20&lt;br /&gt;
                         // AngularDeistance 64 units (90 deg),&lt;br /&gt;
                         // Delay: 160 tics&lt;br /&gt;
}  (...)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Polyobjects with portals==&lt;br /&gt;
:See [[Linked_portals#Polyobject_portals | Polyobject portals]]&lt;br /&gt;
&lt;br /&gt;
==Polyobjects with 2-sided lines==&lt;br /&gt;
Polyobjects made of 2-sided lines have always worked in all games which had polyobjects, but with limitations. Keep in mind that Polyobj_StartLine only works for closed polygons of linedefs going the same way. Otherwise, use Polyobj_ExplicitLine for all involved lines. You will need to use an OPEN [[ACS]] script with the [[SetLineSpecial]] and [[SetLineActivation]] if you want lines with Polyobj_ExplicitLine to have in-game activation effects. In Eternity, a polyobject can have any number of one-sided and two-sided lines.&lt;br /&gt;
&lt;br /&gt;
As of Eternity 4.06.00, the following improvements have been made to 2-sided lines belonging to polyobjects:&lt;br /&gt;
# Passable lines no longer push things standing in their way, if they can just move into them (normally in Hexen they would push). Pushing will only happen on the category of solid things affected by the specific blocking type (monsters, players or both)&lt;br /&gt;
# Textures will retain their initial Y offset when the line moves across different sector elevations. Previously in Hexen they would always make sure the Y offset agrees to the current sectors where they&#039;re located.&lt;br /&gt;
# No more collision detection influenced by the source control sector. Previously in Hexen you would need to match the height of the control sector with the one of the game sector. Normally this wasn&#039;t an issue, because of the subsector restriction, which no longer exists in Eternity.&lt;br /&gt;
# 2-sided lines with actions will also trigger if actor stands still and is crossed by the polyobject.&lt;br /&gt;
# 3DMidTex lines now work properly and as expected. You can use them as horizontal moving platforms.&lt;br /&gt;
# Impassable 2-sided lines also behave as transporters to things above if moving below sector portals.&lt;br /&gt;
&lt;br /&gt;
[[category:Editing reference]]&lt;/div&gt;</summary>
		<author><name>Printz</name></author>
	</entry>
	<entry>
		<id>https://eternity.youfailit.net/index.php?title=ExtraData&amp;diff=6557</id>
		<title>ExtraData</title>
		<link rel="alternate" type="text/html" href="https://eternity.youfailit.net/index.php?title=ExtraData&amp;diff=6557"/>
		<updated>2026-06-14T14:11:42Z</updated>

		<summary type="html">&lt;p&gt;Printz: /* extflags */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;With support of [[Universal Doom Map Format]] in releases of Eternity, ExtraData is now considered {{Deprecated}}. In the future new features introduced into UDMF will not be supported by ExtraData. ExtraData maps will still work, but new projects should use UDMF due to its greatly streamlined mapping experience, especially if using editors such as [https://www.doomworld.com/forum/topic/96943 Doom Builder X] or [https://forum.zdoom.org/viewtopic.php?t=54957 GZDoomBuilder-Bugfix] are used (the former including specific improvements for Eternity&#039;s UDMF, such as for [[linked portals]]).&lt;br /&gt;
&lt;br /&gt;
ExtraData is a new data specification language for the [[Eternity Engine]] that allows arbitrary extension of mapthings, lines, and sectors with any number of new fields, with data provided in more or less any format. The use of a textual input language forever removes any future problems caused by binary format limitations. The ExtraData parser is based on the libConfuse configuration file parser library by Martin Hedenfalk, which is also used by GFS and EDF. &lt;br /&gt;
&lt;br /&gt;
Each section in this document deals with one of the ExtraData constructs, as well as how to embed ExtraData in a WAD and how to associate it with a given map.&lt;br /&gt;
{{Backto|Eternity Engine}}&lt;br /&gt;
{{editref}}&lt;br /&gt;
=General Syntax=&lt;br /&gt;
&#039;&#039;See [[EDF#Syntax|EDF Syntax]], as it is the same.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=Embedding and Associating ExtraData =&lt;br /&gt;
&lt;br /&gt;
ExtraData is embedded directly as a text script into a lump of any name. This can be done with any number of wad file management tools, such as SLumpEd, SLADE 3, or XWE. &lt;br /&gt;
&lt;br /&gt;
An ExtraData script is associated with a map via use of the [[MapInfo]] variable &#039;&#039;&#039;extradata&#039;&#039;&#039;. A map can only have one ExtraData script, but it is possible for multiple maps to share the same script. &lt;br /&gt;
&lt;br /&gt;
Example of ExtraData specification via EMAPINFO: &lt;br /&gt;
   [MAP01]&lt;br /&gt;
   extradata = EDLUMP01&lt;br /&gt;
&lt;br /&gt;
=Mapthings =&lt;br /&gt;
&lt;br /&gt;
Mapthings define monsters, lamps, control points, items, etc -- anything that is spawned on the map at level start. &lt;br /&gt;
&lt;br /&gt;
Each field in the mapthing definition, with the exception of the &#039;&#039;&#039;recordnum&#039;&#039;&#039; field, is optional. If a field is not provided, it takes on the default value indicated below the syntax information. Fields may also be provided in any order. &lt;br /&gt;
&lt;br /&gt;
Note that the order of mapthing definitions in ExtraData is not important. The &#039;&#039;&#039;recordnum&#039;&#039;&#039; field serves to identify mapthing records. &lt;br /&gt;
&lt;br /&gt;
==Creating ExtraData Control Objects ==&lt;br /&gt;
&lt;br /&gt;
Mapthing records in ExtraData are only associated with a special control object that must be placed on the map in the usual manner. &lt;br /&gt;
&lt;br /&gt;
The ExtraData control object has a &#039;&#039;&#039;doomednum&#039;&#039;&#039; of 5004. Each control object specifies its corresponding ExtraData mapthing record number as an integer value in its mapthing &#039;&#039;&#039;options&#039;&#039;&#039; field. If your editor does not allow entering arbitrary values into the options field of mapthings, you will need to use the BOOM command-line editor, CLED. As of the initial writing time of this document, both DETH and Doom Builder support entering arbitrary integer values for the options field. Check your editor&#039;s documentation or user interface to verify if it supports this. &lt;br /&gt;
&lt;br /&gt;
The x, y, and angle fields of the ExtraData control object are passed on to the thing which will be spawned at the control point&#039;s location, so those fields of the control object should be set normally. The true type and options fields of the thing to be spawned, along with any extended fields, are specified in the ExtraData record. &lt;br /&gt;
&lt;br /&gt;
Any number of ExtraData control objects can reference the same ExtraData record. In the event that a control object references a non-existent ExtraData record, the ExtraData script for a level is missing, or the thing type referenced by an ExtraData record isn&#039;t valid, an [[Unknown]] thing will be spawned at the control point&#039;s location.  Note that you cannot spawn ExtraData control objects using ExtraData. Attempting this will also result in an Unknown thing. &lt;br /&gt;
&lt;br /&gt;
==Mapthing Syntax and Fields ==&lt;br /&gt;
&lt;br /&gt;
The syntax of the ExtraData mapthing record is as follows. Remember that all fields except the &#039;&#039;&#039;recordnum&#039;&#039;&#039; field are optional and can be specified in any order. &lt;br /&gt;
 mapthing&lt;br /&gt;
 {&lt;br /&gt;
   recordnum &amp;lt;unique number&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
   // These fields are normal mapthing fields&lt;br /&gt;
   type      &amp;lt;doomednum&amp;gt; OR &amp;lt;EDF thingtype mnemonic&amp;gt;&lt;br /&gt;
   options   &amp;lt;options flag list&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
   // These fields are ExtraData extensions&lt;br /&gt;
   tid       &amp;lt;number&amp;gt;&lt;br /&gt;
   special   &amp;lt;number&amp;gt;&lt;br /&gt;
   args      { &amp;lt;special field&amp;gt;, ... }&lt;br /&gt;
   height    &amp;lt;number&amp;gt;&lt;br /&gt;
 }&lt;br /&gt;
===Explanation of fields:=== &lt;br /&gt;
====recordnum====&lt;br /&gt;
The recordnum serves to identify this record, and is the number which ExtraData control objects must use to associate themselves with a mapthing record. Every ExtraData mapthing record must have a unique record number. If a duplicate record number is detected, the engine will currently exit with an error message. The record number is limited to values between 0 and 65535 inclusive. Some editors may only allow input of numbers up to 32767 in the mapthing options field, or may treat values above 32767 as negative numbers. Beware of this. &lt;br /&gt;
&lt;br /&gt;
====type====&lt;br /&gt;
Default: No meaningful default value; an Unknown thing will be spawned if not valid.&lt;br /&gt;
&lt;br /&gt;
This field specifies the type of object to spawn at the location and angle of ExtraData control objects using this record. This field can accept one of two types of values. The first is a normal thingtype doomednum as specified via [[EDF]] and used by all editors. For example, the DOOM Imp&#039;s doomednum is 3001. &lt;br /&gt;
&lt;br /&gt;
This field can also accept EDF thingtype mnemonics. EDF thingtype mnemonics must be prefixed with &#039;&#039;thing:&#039;&#039; -- this allows the parser to know it is dealing with a string instead of a number. EDF thingtypes must have a unique doomednum to be specified in an ExtraData mapthing record. If the specified EDF thingtype doesn&#039;t exist or has a doomednum of -1, an Unknown object will be spawned instead. &lt;br /&gt;
&lt;br /&gt;
See [[Thing types]] for a list of potentially useful types, new to Eternity, to use here.&lt;br /&gt;
&lt;br /&gt;
Example: &lt;br /&gt;
    mapthing { type 3001 }          // This record specifies an Imp via its doomednum&lt;br /&gt;
    &lt;br /&gt;
    mapthing { type DoomImp } // This record specifies an Imp by its EDF mnemonic&lt;br /&gt;
&lt;br /&gt;
====options====&lt;br /&gt;
Default: No flags are set by default. &lt;br /&gt;
&lt;br /&gt;
This field specifies the options (also known as mapthing flags). This field uses the same syntax as BEX/EDF flag strings, but the syntax will be reviewed here for completeness. &lt;br /&gt;
&lt;br /&gt;
A BEX flag list is a string of flag names separated by whitespace, pipe characters, commas, or plus characters. In ExtraData, if a flag list contains whitespace, commas, or plus signs, it must be enclosed in double or single quotations. Flags are combined using bitwise-OR logic, so a flag name can be specified more than once. Specifying a flag name causes that flag to be turned on. The default state of all flags is off. &lt;br /&gt;
&lt;br /&gt;
These are the flag values which are available for this field: &lt;br /&gt;
    Flag name   Meaning&lt;br /&gt;
    ------------------------------------------------------------------------------&lt;br /&gt;
    EASY        Thing appears in easy difficulties&lt;br /&gt;
    NORMAL      Thing appears in &amp;quot;Hurt Me Plenty&amp;quot;&lt;br /&gt;
    HARD        Thing appears in Ultra-Violence and Nightmare&lt;br /&gt;
    AMBUSH      Thing is &amp;quot;deaf&amp;quot;, will not wake up via sound&lt;br /&gt;
    NOTSINGLE   Thing doesn&#039;t appear in single-player mode&lt;br /&gt;
    NOTDM       Thing doesn&#039;t appear in deathmatch&lt;br /&gt;
    NOTCOOP     Thing doesn&#039;t appear in cooperative multiplayer&lt;br /&gt;
    FRIEND      Thing uses MBF friendly logic&lt;br /&gt;
    DORMANT     Thing is dormant at map startup (script feature)&lt;br /&gt;
    STANDING    Currently only used for [[Thing_types#Sector_actions|sector actions]].&lt;br /&gt;
    ------------------------------------------------------------------------------&lt;br /&gt;
    &lt;br /&gt;
The mapthing options value 256 (0x0100) is reserved. If this bit is set, all BOOM, MBF, and Eternity extended mapthing bits will be cleared. This is to guard against editors like Hellmaker which set all bits they do not understand, instead of leaving them zero. &lt;br /&gt;
&lt;br /&gt;
Example options fields -- All of these are equivalent: &lt;br /&gt;
    // This is the only syntax that does not require quotations.&lt;br /&gt;
    &lt;br /&gt;
    mapthing { options EASY|NORMAL|HARD }&lt;br /&gt;
    &lt;br /&gt;
    // All of these syntaxes must be quoted, because unquoted strings in &lt;br /&gt;
    // ExtraData cannot contain spaces, commas, or plus signs.&lt;br /&gt;
    &lt;br /&gt;
    mapthing { options &amp;quot;EASY NORMAL HARD&amp;quot; }&lt;br /&gt;
    mapthing { options &amp;quot;EASY | NORMAL | HARD&amp;quot; }&lt;br /&gt;
    mapthing { options &amp;quot;EASY+NORMAL+HARD&amp;quot; }&lt;br /&gt;
    mapthing { options &amp;quot;EASY + NORMAL + HARD&amp;quot; }&lt;br /&gt;
    mapthing { options &amp;quot;EASY,NORMAL,HARD&amp;quot; }&lt;br /&gt;
    mapthing { options &amp;quot;EASY, NORMAL, HARD&amp;quot; }&lt;br /&gt;
&lt;br /&gt;
====tid====&lt;br /&gt;
Default: 0 &lt;br /&gt;
&lt;br /&gt;
The TID, or &amp;quot;Thing ID&amp;quot;, is a tag for mapthings which is used for identification in [[ACS]] scripts. TID values must be positive numbers between 1 and 65535. The TID value zero means no TID. Negative TID values are reserved and are used to indicate special things within the engine. TIDs are not required to be unique, and most ACS functions that accept TIDs will perform an action on all mapthings which bear the same TID.&lt;br /&gt;
&lt;br /&gt;
====special====&lt;br /&gt;
Default: 0&lt;br /&gt;
&lt;br /&gt;
The thing special field, which will execute when thing dies if it&#039;s a monster or picked up if it&#039;s an item. Use &#039;&#039;&#039;args&#039;&#039;&#039; to control the parameters.&lt;br /&gt;
&lt;br /&gt;
====args====&lt;br /&gt;
Default: All args values default to zero. &lt;br /&gt;
&lt;br /&gt;
The args field is a list of up to five special values which can have a broad range of meanings. Any values not provided in the args list will default, and if more than five values are provided, only the first five will be used. Currently, all args values are interpreted as integers (a non-number string evaluates to zero). This may change in the future. &lt;br /&gt;
&lt;br /&gt;
Example args list: &lt;br /&gt;
    mapthing { args { 0, 1, 2, 3, 4 } }&lt;br /&gt;
    &lt;br /&gt;
====height====&lt;br /&gt;
Default: 0 &lt;br /&gt;
&lt;br /&gt;
For normal objects, this field indicates a distance above the floor that the thing will spawn at level start. For objects with the SPAWNCEILING flag, this field indicates a distance below the ceiling instead. This field will have no effect on objects which spawn at a randomized height.&lt;br /&gt;
&lt;br /&gt;
=Linedefs =&lt;br /&gt;
&lt;br /&gt;
Linedefs define walls, two-sided textures, and provide action triggers within maps. &lt;br /&gt;
&lt;br /&gt;
Each field in the linedef definition, with the exception of the &#039;&#039;&#039;recordnum&#039;&#039;&#039; field, is optional. If a field is not provided, it takes on the default value indicated below the syntax information. Fields may also be provided in any order. &lt;br /&gt;
&lt;br /&gt;
Note that the order of linedef definitions in ExtraData is not important. The &#039;&#039;&#039;recordnum&#039;&#039;&#039; field serves to identify linedef records. &lt;br /&gt;
&lt;br /&gt;
==Creating ExtraData Linedefs ==&lt;br /&gt;
&lt;br /&gt;
Linedef records in ExtraData are associated either with lines which bear the ExtraData Control Line Special (270), or with any linedef in a DOOM-format map which uses a parameterized line special. You can place the 270 special, as well as parameterized special numbers, into the normal &amp;quot;special&amp;quot; field of a line using virtually any map editor. Editors with Eternity-specific configurations should support these specials natively.&lt;br /&gt;
&lt;br /&gt;
Each control linedef (or directly-used parameterized special) specifies its corresponding ExtraData linedef record number as an integer value in its linedef tag field. If your editor does not allow entering arbitrary values up to 32767 into the tag field of linedefs, you will need to use the BOOM command-line editor, CLED. As of the initial writing time of this document, both DETH and Doom Builder support entering arbitrary integer values for the tag field. Check your editor&#039;s documentation or user interface to verify if it supports this. &lt;br /&gt;
&lt;br /&gt;
The flags, sidedefs, textures, and location of the ExtraData control linedef are used normally by the line and cannot be altered from within ExtraData. The true special (if 270 is used) and tag fields of the linedef, along with any extended fields, are specified in the ExtraData record which the control linedef references. &lt;br /&gt;
&lt;br /&gt;
Any number of linedefs can reference the same ExtraData record. In the event that a control linedef references a non-existent ExtraData record or the ExtraData script for a level is missing, the special and tag of the ExtraData control linedef will both be set to zero. &lt;br /&gt;
&lt;br /&gt;
==Linedef Syntax and Fields ==&lt;br /&gt;
&lt;br /&gt;
The syntax of the ExtraData linedef record is as follows. Remember that all fields except the &#039;&#039;&#039;recordnum&#039;&#039;&#039; field are optional and can be specified in any order. &lt;br /&gt;
 linedef&lt;br /&gt;
 {&lt;br /&gt;
   recordnum &amp;lt;unique number&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
   // These fields are normal linedef fields&lt;br /&gt;
   special &amp;lt;number&amp;gt; OR &amp;lt;special name&amp;gt;&lt;br /&gt;
   tag &amp;lt;number&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
   // These fields are ExtraData extensions&lt;br /&gt;
   extflags &amp;lt;extended line flags list&amp;gt;&lt;br /&gt;
   args { &amp;lt;special field&amp;gt;, ... }&lt;br /&gt;
   id &amp;lt;number&amp;gt;&lt;br /&gt;
   alpha &amp;lt;number&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
   portalid &amp;lt;number&amp;gt;&lt;br /&gt;
 }&lt;br /&gt;
===Explanation of fields: ===&lt;br /&gt;
====recordnum====&lt;br /&gt;
The recordnum serves to identify this record, and is the number which ExtraData control linedefs must use to associate themselves with a linedef record. Every ExtraData linedef record must have a unique record number. If a duplicate record number is detected, the engine will currently exit with an error message. The record number is limited to values between 0 and 32767 inclusive. Some editors may only allow input of numbers up to 255 in the linedef tag field. Beware of this. &lt;br /&gt;
&lt;br /&gt;
====special====&lt;br /&gt;
:&#039;&#039;Default: 0 &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The special field determines what [[Linedef_types|type of action]] may be taken when a line is crossed, used, shot, etc. There are three types of linedef specials in Eternity: normal, generalized, and parameterized. Parameterized specials use the &#039;&#039;&#039;args&#039;&#039;&#039; field documented below to provide complete customization of line actions. &lt;br /&gt;
&lt;br /&gt;
This field can accept numbers for any special type, including generalized and parameterized, but it can also accept special names for parameterized line types. See the [[Detailed parameterized linedef specification]] for a complete list of the available names.&lt;br /&gt;
&lt;br /&gt;
====tag====&lt;br /&gt;
:&#039;&#039;Default: 0 &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The tag of the linedef, used by DOOM-style line specials and sector effects.&lt;br /&gt;
&lt;br /&gt;
====extflags====&lt;br /&gt;
:&#039;&#039;Default: No flags are set by default. &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
This field specifies extended linedef flag values which impact the functionality of parameterized linedef specials. This field uses the same syntax as BEX/EDF flag strings, but the syntax will be reviewed here for completeness. &lt;br /&gt;
&lt;br /&gt;
A BEX flag list is a string of flag names separated by whitespace, pipe characters, commas, or plus characters. In ExtraData, if a flag list contains whitespace, commas, or plus signs, it must be enclosed in double or single quotations. Flags are combined using bitwise-OR logic, so a flag name can be specified more than once. Specifying a flag name causes that flag to be turned on. The default state of all flags is off. &lt;br /&gt;
&lt;br /&gt;
These are the flag values which are available for this field: &lt;br /&gt;
    Flag name   Meaning&lt;br /&gt;
    ---------------------------------------------------------------------------------------&lt;br /&gt;
    CROSS         Linedef can be activated by being crossed.&lt;br /&gt;
    USE           Linedef can be activated by being used.&lt;br /&gt;
    IMPACT        Linedef can be activated by being shot.&lt;br /&gt;
    PUSH          Linedef can be activated by being pushed.&lt;br /&gt;
    PLAYER        Linedef can be activated by players.&lt;br /&gt;
    MONSTER       Linedef can be activated by objects with SPACMONSTER flag.&lt;br /&gt;
    MISSILE       Linedef can be activated by objects with SPACMISSILE flag.&lt;br /&gt;
    POLYOBJECT    Linedef can be activated by polyobjects (only works with CROSS)&lt;br /&gt;
    REPEAT        Linedef action is repeatable.&lt;br /&gt;
    1SONLY        Linedef can only be activated from first side.&lt;br /&gt;
    ADDITIVE      Linedef&#039;s midtexture is drawn with additive blending.&lt;br /&gt;
    BLOCKALL      Linedef will block everything that can be clipped.&lt;br /&gt;
    ZONEBOUNDARY  Linedef will work as a reverb effect boundary. Not needed for one-sided lines.&lt;br /&gt;
    CLIPMIDTEX    Linedef middle texture will not &amp;quot;bleed&amp;quot; on floor and ceiling.&lt;br /&gt;
    WRAPMIDTEX    Linedef middle texture of two-sided is repeated vertically instead of being drawn only once.&lt;br /&gt;
    3DMTPASSPROJ  Linedef will always let projectiles pass even if marked as 3DMidTex&lt;br /&gt;
    LOWERPORTAL   Linedef copies floor portal from its backside to its lower visible edge&lt;br /&gt;
    UPPERPORTAL   Linedef copies ceiling portal from its backside to its upper visible edge&lt;br /&gt;
    ---------------------------------------------------------------------------------------&lt;br /&gt;
    &lt;br /&gt;
Notes: IMPACT is currently only implemented for bullet weapons.&lt;br /&gt;
&lt;br /&gt;
LOWERPORTAL and UPPERPORTAL are used to enable portals on the front side&#039;s upper and/or lower edges of a linedef, if the sector in front of the linedef is tall enough compared to the back sector to expose them. It is the only way to enable such portals, which will copy the sector portal(s) from the backside, if any.&lt;br /&gt;
&lt;br /&gt;
Example flags fields -- All of these are equivalent: &lt;br /&gt;
    // This is the only syntax that does not require quotations.&lt;br /&gt;
    &lt;br /&gt;
    linedef { extflags CROSS|PLAYER|MISSILE|REPEAT }&lt;br /&gt;
    &lt;br /&gt;
    // All of these syntaxes must be quoted, because unquoted strings in &lt;br /&gt;
    // ExtraData cannot contain spaces, commas, or plus signs.&lt;br /&gt;
    &lt;br /&gt;
    linedef { extflags &amp;quot;CROSS PLAYER MISSILE REPEAT&amp;quot; }&lt;br /&gt;
    linedef { extflags &amp;quot;CROSS | PLAYER | MISSILE | REPEAT&amp;quot; }&lt;br /&gt;
    linedef { extflags &amp;quot;CROSS+PLAYER+MISSILE+REPEAT&amp;quot; }&lt;br /&gt;
    linedef { extflags &amp;quot;CROSS + PLAYER + MISSILE + REPEAT&amp;quot; }&lt;br /&gt;
    linedef { extflags &amp;quot;CROSS,PLAYER,MISSILE,REPEAT&amp;quot; }&lt;br /&gt;
    linedef { extflags &amp;quot;CROSS, PLAYER, MISSILE, REPEAT&amp;quot; }&lt;br /&gt;
&lt;br /&gt;
====args====&lt;br /&gt;
:&#039;&#039;Default: All args values default to zero. &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The args field is a list of up to five special values which can have a broad range of meanings. Any values not provided in the args list will default, and if more than five values are provided, only the first five will be used. Currently, all args values are interpreted as integers (a non-number string evaluates to zero). This may change in the future. The args list is used by parameterized linedef specials. &lt;br /&gt;
&lt;br /&gt;
Example args list: &lt;br /&gt;
    linedef { args { 0, 1, 2, 3, 4 } }&lt;br /&gt;
&lt;br /&gt;
====id====&lt;br /&gt;
:&#039;&#039;Default: 0&#039;&#039;&lt;br /&gt;
This field is equivalent to &#039;&#039;&#039;tag&#039;&#039;&#039;. It will only have effect if &#039;&#039;&#039;tag&#039;&#039;&#039; is not already set.&lt;br /&gt;
&lt;br /&gt;
====alpha====&lt;br /&gt;
:&#039;&#039;Default: Alpha defaults to 1.0.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The alpha field takes a value from 0.0 to 1.0 to set the opacity at which this linedef&#039;s midtexture is drawn. When combined with the ADDITIVE extflag, this can be used for additive-blended translucency as well.&lt;br /&gt;
&lt;br /&gt;
====portalid====&lt;br /&gt;
:&#039;&#039;Default: none&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Portal ID to apply on front side middle part, as defined from [[Portal_Define]].&lt;br /&gt;
&lt;br /&gt;
=Sectors=&lt;br /&gt;
&lt;br /&gt;
Sectors define distinct areas of the map that are bordered by linedefs, with floor and ceiling properties, lighting data, and specials. &lt;br /&gt;
&lt;br /&gt;
Each field in the sector definition, with the exception of the &#039;&#039;&#039;recordnum&#039;&#039;&#039; field, is optional. If a field is not provided, it takes on the default value indicated below the syntax information. Fields may also be provided in any order. &lt;br /&gt;
&lt;br /&gt;
Note that the order of sector definitions in ExtraData is not important. The &#039;&#039;&#039;recordnum&#039;&#039;&#039; field serves to identify sector records. &lt;br /&gt;
&lt;br /&gt;
==Creating ExtraData Sectors==&lt;br /&gt;
&lt;br /&gt;
Sector records in ExtraData are associated with lines which bear the ExtraData Sector Control Special (401). The linedef&#039;s front side sector is the map sector that will receive properties from the ExtraData record which is specified by number in the linedef&#039;s tag.&lt;br /&gt;
&lt;br /&gt;
Since ExtraData is attached to sectors via linedefs and not through overriding any of the sectors&#039; native fields, you specify all of the normal data for a sector in the map itself, and overriding that data through ExtraData sector records is not supported.&lt;br /&gt;
&lt;br /&gt;
Any number of linedefs can reference the same ExtraData sector record. In the event that a control linedef references a non-existent ExtraData record or the ExtraData script for a level is missing, the tag of the ExtraData sector control linedef will be set to zero and will otherwise be ignored.&lt;br /&gt;
&lt;br /&gt;
==Sector Syntax and Fields ==&lt;br /&gt;
&lt;br /&gt;
The syntax of the ExtraData sector record is as follows. Remember that all fields except the &#039;&#039;&#039;recordnum&#039;&#039;&#039; field are optional and can be specified in any order. &lt;br /&gt;
 sector&lt;br /&gt;
 {&lt;br /&gt;
   recordnum &amp;lt;unique number&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
   // These fields are ExtraData extensions to sector data&lt;br /&gt;
   flags &amp;lt;sector flag list&amp;gt;&lt;br /&gt;
   flags.add &amp;lt;sector flag list&amp;gt;&lt;br /&gt;
   flags.remove &amp;lt;sector flag list&amp;gt;&lt;br /&gt;
   damage &amp;lt;integer&amp;gt;&lt;br /&gt;
   damagemask &amp;lt;integer&amp;gt;&lt;br /&gt;
   damagemod &amp;lt;method of damage type&amp;gt;&lt;br /&gt;
   damageflags &amp;lt;sector damage flags list&amp;gt;&lt;br /&gt;
   damageflags.add &amp;lt;sector damage flags list&amp;gt;&lt;br /&gt;
   damageflags.remove &amp;lt;sector damage flags list&amp;gt;&lt;br /&gt;
   floorterrain &amp;lt;terrain name&amp;gt;&lt;br /&gt;
   floorangle &amp;lt;float&amp;gt;  &lt;br /&gt;
   flooroffsetx &amp;lt;float&amp;gt;&lt;br /&gt;
   flooroffsety &amp;lt;float&amp;gt;&lt;br /&gt;
   floorscalex &amp;lt;float&amp;gt;&lt;br /&gt;
   floorscaley &amp;lt;float&amp;gt;&lt;br /&gt;
   ceilingterrain &amp;lt;terrain name&amp;gt;&lt;br /&gt;
   ceilingangle &amp;lt;float&amp;gt;&lt;br /&gt;
   ceilingoffsetx &amp;lt;float&amp;gt;&lt;br /&gt;
   ceilingoffsety &amp;lt;float&amp;gt;&lt;br /&gt;
   ceilingscalex &amp;lt;float&amp;gt;&lt;br /&gt;
   ceilingscaley &amp;lt;float&amp;gt;&lt;br /&gt;
   colormaptop &amp;lt;lump name&amp;gt;&lt;br /&gt;
   colormapmid &amp;lt;lump name&amp;gt;&lt;br /&gt;
   colormapbottom &amp;lt;lump name&amp;gt;&lt;br /&gt;
   portalflags.floor &amp;lt;portal flags list&amp;gt;&lt;br /&gt;
   portalflags.ceiling &amp;lt;portal flags list&amp;gt;&lt;br /&gt;
   overlayalpha.floor &amp;lt;percentage or value from 0 to 255&amp;gt;&lt;br /&gt;
   overlayalpha.ceiling &amp;lt;percentage or value from 0 to 255&amp;gt;&lt;br /&gt;
   portalid.floor &amp;lt;number&amp;gt;&lt;br /&gt;
   portalid.ceiling &amp;lt;number&amp;gt;&lt;br /&gt;
 }&lt;br /&gt;
===Explanation of fields: ===&lt;br /&gt;
====recordnum====&lt;br /&gt;
The recordnum serves to identify this record, and is the number which ExtraData sector control linedefs must use to associate themselves with a sector record. Every ExtraData sector record must have a unique record number. If a duplicate record number is detected, the engine will currently exit with an error message. The record number is limited to values between 0 and 32767 inclusive. Some editors may only allow input of numbers up to 255 in the linedef tag field. Beware of this. &lt;br /&gt;
&lt;br /&gt;
====flags====&lt;br /&gt;
:&#039;&#039;Default: No flags are set by default. &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
This field specifies sector flag values which specify various properties of sectors. This field uses the same syntax as BEX/EDF flag strings. &lt;br /&gt;
&lt;br /&gt;
These are the flag values which are available for this field: &lt;br /&gt;
&lt;br /&gt;
    Flag name     Meaning&lt;br /&gt;
    ---------------------------------------------------------------------------------------&lt;br /&gt;
    SECRET        Sector is secret&lt;br /&gt;
    FRICTION      Sector has friction enabled, if targeted by a BOOM friction transfer line&lt;br /&gt;
    PUSH          Sector has BOOM push effects enabled&lt;br /&gt;
    KILLSOUND     Objects in sector cannot make sounds.&lt;br /&gt;
    KILLMOVESOUND Sector makes no movement sounds, even if it has a special sound sequence&lt;br /&gt;
    PHASEDLIGHT   Sector is phased light sequence start&lt;br /&gt;
    LIGHTSEQUENCE Sector is phased light sequence step (alternates with below flag)&lt;br /&gt;
    LIGHTSEQALT   Sector is phased light sequence alternate step (alternates with above flag)&lt;br /&gt;
    ---------------------------------------------------------------------------------------&lt;br /&gt;
    &lt;br /&gt;
Example flags fields -- All of these are equivalent: &lt;br /&gt;
    // This is the only syntax that does not require quotations.&lt;br /&gt;
    &lt;br /&gt;
    sector { flags SECRET|FRICTION|KILLMOVESOUND }&lt;br /&gt;
    &lt;br /&gt;
    // All of these syntaxes must be quoted, because unquoted strings in &lt;br /&gt;
    // ExtraData cannot contain spaces, commas, or plus signs.&lt;br /&gt;
    &lt;br /&gt;
    sector { flags &amp;quot;SECRET FRICTION KILLMOVESOUND&amp;quot; }&lt;br /&gt;
    sector { flags &amp;quot;SECRET | FRICTION | KILLMOVESOUND&amp;quot; }&lt;br /&gt;
    sector { flags &amp;quot;SECRET+FRICTION+KILLMOVESOUND&amp;quot; }&lt;br /&gt;
    sector { flags &amp;quot;SECRET + FRICTION + KILLMOVESOUND&amp;quot; }&lt;br /&gt;
    sector { flags &amp;quot;SECRET,FRICTION,KILLMOVESOUND&amp;quot; }&lt;br /&gt;
    sector { flags &amp;quot;SECRET, FRICTION, KILLMOVESOUND&amp;quot; }&lt;br /&gt;
&lt;br /&gt;
====flags.add====&lt;br /&gt;
:&#039;&#039;Default: No flags are set by default. &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
This is a list of sector flags to add to the sector. This is supported because some sector specials (such as sector special 9, &amp;quot;Secret&amp;quot;) imply that certain sector flags will be set on the sector before ExtraData is applied. If you wish to only add flags and not override any that may have been set by sector specials, use this field to specify only the flags that you wish to be added to the sector.&lt;br /&gt;
&lt;br /&gt;
====flags.remove====&lt;br /&gt;
:&#039;&#039;Default: No flags are set by default. &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
This is a list of sector flags to remove from the sector. If you wish to only remove flags and not override any that may have been set by sector specials, use this field to specify only the flags that you wish to be removed from the sector.&lt;br /&gt;
&lt;br /&gt;
====damage====&lt;br /&gt;
:&#039;&#039;Default: 0&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Specifies the amount of damage this sector does to players if the players are standing inside the sector and do not meet any special exemption criteria, such as wearing a Radiation Suit. This amount is done at each damage opportunity, which is determined by the &#039;&#039;&#039;damagemask&#039;&#039;&#039; field.&lt;br /&gt;
&lt;br /&gt;
====damagemask====&lt;br /&gt;
:&#039;&#039;Default: 0&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Specifies the interval in gametics between damage opportunities for a player standing in this sector. The default value of 0 will cause the sector to do constant and instantaneous damage every gametic. Setting this value to an integer greater than 0 will cause damage to be done every Nth gametic, with N being the value of this field. The default DOOM nukage types all use a damagemask of 32, which is roughly once per in-game second (there are 35 gametics per second).&lt;br /&gt;
&lt;br /&gt;
====damagemod====&lt;br /&gt;
:&#039;&#039;Default: &amp;quot;Unknown&amp;quot;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Specifies the type of damage done by this sector. If &amp;quot;Unknown&amp;quot; is specified, the damage done is generic. The value specified should be a valid EDF damagetype mnemonic. If it is not, &amp;quot;Unknown&amp;quot; will be used. This can be used to have a sector type trigger special pain and death states when it deals damage. For example, you can use &#039;&#039;&#039;slime&#039;&#039;&#039; or &#039;&#039;&#039;lava&#039;&#039;&#039; damagemod.&lt;br /&gt;
&lt;br /&gt;
====damageflags====&lt;br /&gt;
:&#039;&#039;Default: No flags are set by default.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
This field specifies sector damage flag values which affect the manner in which a sector does damage. This field uses the same syntax as BEX/EDF flag strings. &lt;br /&gt;
&lt;br /&gt;
These are the flag values which are available for this field: &lt;br /&gt;
&lt;br /&gt;
    Flag name     Meaning&lt;br /&gt;
    ---------------------------------------------------------------------------------------&lt;br /&gt;
    LEAKYSUIT     The player may take damage at random even if he has the radsuit powerup&lt;br /&gt;
    IGNORESUIT    Radiation suit powerups are ignored entirely&lt;br /&gt;
    ENDGODMODE    God mode will be disabled when the player enters this sector&lt;br /&gt;
    EXITLEVEL     The player will exit if has &amp;lt; 11 health and this sector tries to do damage&lt;br /&gt;
    TERRAINHIT    A TerrainTypes hit will occur when this sector does damage&lt;br /&gt;
    ---------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
====damageflags.add====&lt;br /&gt;
:&#039;&#039;Default: No flags are set by default.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Because some sector types imply the activation of various sector damageflags (for example, DOOM sector type 11 sets sector damageflags ENDGODMODE and EXITLEVEL), this field is supported to add additional damageflags to any that may have been set by the  map itself. Simply specify whatever flags you wish to have added to those that are already set.&lt;br /&gt;
&lt;br /&gt;
====damageflags.remove====&lt;br /&gt;
:&#039;&#039;Default: No flags are set by default.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
As with damageflags.add, it may be desirable to turn off some flags that were set by sector specials or other portions of the map data. Use this field to specify any sector damage flags you want to remove from sectors.&lt;br /&gt;
&lt;br /&gt;
====floorterrain====&lt;br /&gt;
:&#039;&#039;Default: &amp;quot;@flat&amp;quot;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Specifies an EDF TerrainTypes mnemonic for the type of terrain this sector should exhibit on its floor. If left to default or specified with an invalid name, the terrain of the sector will be determined by its floorpic as usual.&lt;br /&gt;
&lt;br /&gt;
====floorangle====&lt;br /&gt;
:&#039;&#039;Default: 0 (East, or upper edge to the north)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Specifies the angle of the floor flat in floating-point degrees from 0 to 359. Note that for compatibility with ZDoom, the angle specified advances in a &#039;&#039;&#039;clockwise&#039;&#039;&#039; fashion, contrary to most other angles in the DOOM engine.&lt;br /&gt;
&lt;br /&gt;
====flooroffsetx/flooroffsety====&lt;br /&gt;
:&#039;&#039;Default: 0&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Specifies the x and y offsets of the floor flat, relative to the normal floor grid, in floating point units.&lt;br /&gt;
&lt;br /&gt;
====floorscalex/floorscaley====&lt;br /&gt;
:&#039;&#039;Default: 1.0&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Specifies the x and y offsets of the floor flat. A higher number means a smaller texture.&lt;br /&gt;
&lt;br /&gt;
====ceilingterrain====&lt;br /&gt;
:&#039;&#039;Default: &amp;quot;@flat&amp;quot;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Specifies an EDF TerrainTypes mnemonic for the type of terrain this sector should exhibit on its ceiling. If left to default or specified with an invalid name, the terrain of the sector will be determined by its floorpic as usual. This currently only affects the behavior of bullet puffs when particles are enabled.&lt;br /&gt;
&lt;br /&gt;
====ceilingangle====&lt;br /&gt;
:&#039;&#039;Default: 0 (East, or upper edge to the north)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Specifies the angle of the ceiling flat in floating-point degrees from 0 to 359. Note that for compatibility with ZDoom, the angle specified advances in a &#039;&#039;&#039;clockwise&#039;&#039;&#039; fashion, contrary to most other angles in the DOOM engine.&lt;br /&gt;
&lt;br /&gt;
====ceilingoffsetx/ceilingoffsety====&lt;br /&gt;
:&#039;&#039;Default: 0&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Specifies the x and y offsets of the ceiling flat, relative to the normal ceiling grid, in floating point units.&lt;br /&gt;
&lt;br /&gt;
====ceilingscalex/ceilingscaley====&lt;br /&gt;
:&#039;&#039;Default: 1.0&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Specifies the x and y offsets of the ceiling flat. A higher number means a smaller texture.&lt;br /&gt;
&lt;br /&gt;
====colormaptop====&lt;br /&gt;
:&#039;&#039;Default: &amp;quot;@default&amp;quot;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Specifies the colormap lump to use when a player&#039;s viewpoint is above the fake ceiling of a BOOM 242 &amp;quot;deep water&amp;quot; effect applying to this sector. If left to default, the global colormap from MapInfo will be used as normal, unless one is specified by the 242 effect.&lt;br /&gt;
&lt;br /&gt;
====colormapmid====&lt;br /&gt;
:&#039;&#039;Default: &amp;quot;@default&amp;quot;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Specifies the colormap lump to use when a player&#039;s viewpoint is between the normal floor and ceiling for an ordinary sector, or between the fake floor and ceiling for a BOOM 242 &amp;quot;deep water&amp;quot; sector. If left to default, the global colormap from MapInfo will be used as normal, unless one is specified by a 242 effect.&lt;br /&gt;
&lt;br /&gt;
====colormapbottom====&lt;br /&gt;
:&#039;&#039;Default: &amp;quot;@default&amp;quot;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Specifies the colormap lump to use when a player&#039;s viewpoint is below the fake floor of a BOOM 242 &amp;quot;deep water&amp;quot; effect applying to this sector. If left to default, the global colormap from MapInfo will be used as normal, unless one is specified by the 242 effect.&lt;br /&gt;
&lt;br /&gt;
====portalflags.floor/portalflags.ceiling====&lt;br /&gt;
:&#039;&#039;Default: No flags are set by default.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
These two fields (portalflags.floor and portalflags.ceiling) specify portal property flag values which affect the rendering and behavior of portals attached to this sector&#039;s surfaces. These fields use the same syntax as BEX/EDF flag strings. &lt;br /&gt;
&lt;br /&gt;
These are the flag values which are available for this field: &lt;br /&gt;
&lt;br /&gt;
    Flag name     Meaning&lt;br /&gt;
    ---------------------------------------------------------------------------------------&lt;br /&gt;
    DISABLED        Portal is completely disabled&lt;br /&gt;
    NORENDER        Portal will not be rendered, but may still be interactive&lt;br /&gt;
    NOPASS          Objects cannot pass through the portal even if it is a linked portal&lt;br /&gt;
    BLOCKSOUND      Sound will not traverse through a linked portal&lt;br /&gt;
    OVERLAY         The portal will render the sector&#039;s flat as a blended overlay&lt;br /&gt;
    ADDITIVE        If OVERLAY is also specified, the overlay will use additive blending&lt;br /&gt;
    USEGLOBALTEX    Reserved for future per-portal texture specification&lt;br /&gt;
    ATTACHEDPORTAL  If a linked portal is on the respective floor or ceiling, move it along &lt;br /&gt;
                    with the surface. Useful for vertically moving platforms.&lt;br /&gt;
    ---------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
====overlayalpha.floor/overlayalpha.ceiling====&lt;br /&gt;
:&#039;&#039;Default&#039;&#039;: 100%&lt;br /&gt;
&lt;br /&gt;
These two fields (overlayalpha.floor and overlayalpha.ceiling) specify the opacity of the corresponding portal overlay, if any exists. You can specify either a percentage value from 0% to 100%, or a plain integer number from 0 to 255. 100%/255 are completely solid, while 0% is invisible.&lt;br /&gt;
&lt;br /&gt;
====portalid.floor/portalid.ceiling====&lt;br /&gt;
:&#039;&#039;Default&#039;&#039;: 0&lt;br /&gt;
&lt;br /&gt;
These two fields control the placement of portals defined by [[Portal_Define]] on the floor or ceiling of this sector. Values can be positive (in which case the direct portal will be used) or negative (in which case the opposite direction portal will be used, &#039;&#039;if&#039;&#039; applicable).&lt;/div&gt;</summary>
		<author><name>Printz</name></author>
	</entry>
	<entry>
		<id>https://eternity.youfailit.net/index.php?title=ExtraData&amp;diff=6556</id>
		<title>ExtraData</title>
		<link rel="alternate" type="text/html" href="https://eternity.youfailit.net/index.php?title=ExtraData&amp;diff=6556"/>
		<updated>2026-06-14T14:11:34Z</updated>

		<summary type="html">&lt;p&gt;Printz: /* extflags */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;With support of [[Universal Doom Map Format]] in releases of Eternity, ExtraData is now considered {{Deprecated}}. In the future new features introduced into UDMF will not be supported by ExtraData. ExtraData maps will still work, but new projects should use UDMF due to its greatly streamlined mapping experience, especially if using editors such as [https://www.doomworld.com/forum/topic/96943 Doom Builder X] or [https://forum.zdoom.org/viewtopic.php?t=54957 GZDoomBuilder-Bugfix] are used (the former including specific improvements for Eternity&#039;s UDMF, such as for [[linked portals]]).&lt;br /&gt;
&lt;br /&gt;
ExtraData is a new data specification language for the [[Eternity Engine]] that allows arbitrary extension of mapthings, lines, and sectors with any number of new fields, with data provided in more or less any format. The use of a textual input language forever removes any future problems caused by binary format limitations. The ExtraData parser is based on the libConfuse configuration file parser library by Martin Hedenfalk, which is also used by GFS and EDF. &lt;br /&gt;
&lt;br /&gt;
Each section in this document deals with one of the ExtraData constructs, as well as how to embed ExtraData in a WAD and how to associate it with a given map.&lt;br /&gt;
{{Backto|Eternity Engine}}&lt;br /&gt;
{{editref}}&lt;br /&gt;
=General Syntax=&lt;br /&gt;
&#039;&#039;See [[EDF#Syntax|EDF Syntax]], as it is the same.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=Embedding and Associating ExtraData =&lt;br /&gt;
&lt;br /&gt;
ExtraData is embedded directly as a text script into a lump of any name. This can be done with any number of wad file management tools, such as SLumpEd, SLADE 3, or XWE. &lt;br /&gt;
&lt;br /&gt;
An ExtraData script is associated with a map via use of the [[MapInfo]] variable &#039;&#039;&#039;extradata&#039;&#039;&#039;. A map can only have one ExtraData script, but it is possible for multiple maps to share the same script. &lt;br /&gt;
&lt;br /&gt;
Example of ExtraData specification via EMAPINFO: &lt;br /&gt;
   [MAP01]&lt;br /&gt;
   extradata = EDLUMP01&lt;br /&gt;
&lt;br /&gt;
=Mapthings =&lt;br /&gt;
&lt;br /&gt;
Mapthings define monsters, lamps, control points, items, etc -- anything that is spawned on the map at level start. &lt;br /&gt;
&lt;br /&gt;
Each field in the mapthing definition, with the exception of the &#039;&#039;&#039;recordnum&#039;&#039;&#039; field, is optional. If a field is not provided, it takes on the default value indicated below the syntax information. Fields may also be provided in any order. &lt;br /&gt;
&lt;br /&gt;
Note that the order of mapthing definitions in ExtraData is not important. The &#039;&#039;&#039;recordnum&#039;&#039;&#039; field serves to identify mapthing records. &lt;br /&gt;
&lt;br /&gt;
==Creating ExtraData Control Objects ==&lt;br /&gt;
&lt;br /&gt;
Mapthing records in ExtraData are only associated with a special control object that must be placed on the map in the usual manner. &lt;br /&gt;
&lt;br /&gt;
The ExtraData control object has a &#039;&#039;&#039;doomednum&#039;&#039;&#039; of 5004. Each control object specifies its corresponding ExtraData mapthing record number as an integer value in its mapthing &#039;&#039;&#039;options&#039;&#039;&#039; field. If your editor does not allow entering arbitrary values into the options field of mapthings, you will need to use the BOOM command-line editor, CLED. As of the initial writing time of this document, both DETH and Doom Builder support entering arbitrary integer values for the options field. Check your editor&#039;s documentation or user interface to verify if it supports this. &lt;br /&gt;
&lt;br /&gt;
The x, y, and angle fields of the ExtraData control object are passed on to the thing which will be spawned at the control point&#039;s location, so those fields of the control object should be set normally. The true type and options fields of the thing to be spawned, along with any extended fields, are specified in the ExtraData record. &lt;br /&gt;
&lt;br /&gt;
Any number of ExtraData control objects can reference the same ExtraData record. In the event that a control object references a non-existent ExtraData record, the ExtraData script for a level is missing, or the thing type referenced by an ExtraData record isn&#039;t valid, an [[Unknown]] thing will be spawned at the control point&#039;s location.  Note that you cannot spawn ExtraData control objects using ExtraData. Attempting this will also result in an Unknown thing. &lt;br /&gt;
&lt;br /&gt;
==Mapthing Syntax and Fields ==&lt;br /&gt;
&lt;br /&gt;
The syntax of the ExtraData mapthing record is as follows. Remember that all fields except the &#039;&#039;&#039;recordnum&#039;&#039;&#039; field are optional and can be specified in any order. &lt;br /&gt;
 mapthing&lt;br /&gt;
 {&lt;br /&gt;
   recordnum &amp;lt;unique number&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
   // These fields are normal mapthing fields&lt;br /&gt;
   type      &amp;lt;doomednum&amp;gt; OR &amp;lt;EDF thingtype mnemonic&amp;gt;&lt;br /&gt;
   options   &amp;lt;options flag list&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
   // These fields are ExtraData extensions&lt;br /&gt;
   tid       &amp;lt;number&amp;gt;&lt;br /&gt;
   special   &amp;lt;number&amp;gt;&lt;br /&gt;
   args      { &amp;lt;special field&amp;gt;, ... }&lt;br /&gt;
   height    &amp;lt;number&amp;gt;&lt;br /&gt;
 }&lt;br /&gt;
===Explanation of fields:=== &lt;br /&gt;
====recordnum====&lt;br /&gt;
The recordnum serves to identify this record, and is the number which ExtraData control objects must use to associate themselves with a mapthing record. Every ExtraData mapthing record must have a unique record number. If a duplicate record number is detected, the engine will currently exit with an error message. The record number is limited to values between 0 and 65535 inclusive. Some editors may only allow input of numbers up to 32767 in the mapthing options field, or may treat values above 32767 as negative numbers. Beware of this. &lt;br /&gt;
&lt;br /&gt;
====type====&lt;br /&gt;
Default: No meaningful default value; an Unknown thing will be spawned if not valid.&lt;br /&gt;
&lt;br /&gt;
This field specifies the type of object to spawn at the location and angle of ExtraData control objects using this record. This field can accept one of two types of values. The first is a normal thingtype doomednum as specified via [[EDF]] and used by all editors. For example, the DOOM Imp&#039;s doomednum is 3001. &lt;br /&gt;
&lt;br /&gt;
This field can also accept EDF thingtype mnemonics. EDF thingtype mnemonics must be prefixed with &#039;&#039;thing:&#039;&#039; -- this allows the parser to know it is dealing with a string instead of a number. EDF thingtypes must have a unique doomednum to be specified in an ExtraData mapthing record. If the specified EDF thingtype doesn&#039;t exist or has a doomednum of -1, an Unknown object will be spawned instead. &lt;br /&gt;
&lt;br /&gt;
See [[Thing types]] for a list of potentially useful types, new to Eternity, to use here.&lt;br /&gt;
&lt;br /&gt;
Example: &lt;br /&gt;
    mapthing { type 3001 }          // This record specifies an Imp via its doomednum&lt;br /&gt;
    &lt;br /&gt;
    mapthing { type DoomImp } // This record specifies an Imp by its EDF mnemonic&lt;br /&gt;
&lt;br /&gt;
====options====&lt;br /&gt;
Default: No flags are set by default. &lt;br /&gt;
&lt;br /&gt;
This field specifies the options (also known as mapthing flags). This field uses the same syntax as BEX/EDF flag strings, but the syntax will be reviewed here for completeness. &lt;br /&gt;
&lt;br /&gt;
A BEX flag list is a string of flag names separated by whitespace, pipe characters, commas, or plus characters. In ExtraData, if a flag list contains whitespace, commas, or plus signs, it must be enclosed in double or single quotations. Flags are combined using bitwise-OR logic, so a flag name can be specified more than once. Specifying a flag name causes that flag to be turned on. The default state of all flags is off. &lt;br /&gt;
&lt;br /&gt;
These are the flag values which are available for this field: &lt;br /&gt;
    Flag name   Meaning&lt;br /&gt;
    ------------------------------------------------------------------------------&lt;br /&gt;
    EASY        Thing appears in easy difficulties&lt;br /&gt;
    NORMAL      Thing appears in &amp;quot;Hurt Me Plenty&amp;quot;&lt;br /&gt;
    HARD        Thing appears in Ultra-Violence and Nightmare&lt;br /&gt;
    AMBUSH      Thing is &amp;quot;deaf&amp;quot;, will not wake up via sound&lt;br /&gt;
    NOTSINGLE   Thing doesn&#039;t appear in single-player mode&lt;br /&gt;
    NOTDM       Thing doesn&#039;t appear in deathmatch&lt;br /&gt;
    NOTCOOP     Thing doesn&#039;t appear in cooperative multiplayer&lt;br /&gt;
    FRIEND      Thing uses MBF friendly logic&lt;br /&gt;
    DORMANT     Thing is dormant at map startup (script feature)&lt;br /&gt;
    STANDING    Currently only used for [[Thing_types#Sector_actions|sector actions]].&lt;br /&gt;
    ------------------------------------------------------------------------------&lt;br /&gt;
    &lt;br /&gt;
The mapthing options value 256 (0x0100) is reserved. If this bit is set, all BOOM, MBF, and Eternity extended mapthing bits will be cleared. This is to guard against editors like Hellmaker which set all bits they do not understand, instead of leaving them zero. &lt;br /&gt;
&lt;br /&gt;
Example options fields -- All of these are equivalent: &lt;br /&gt;
    // This is the only syntax that does not require quotations.&lt;br /&gt;
    &lt;br /&gt;
    mapthing { options EASY|NORMAL|HARD }&lt;br /&gt;
    &lt;br /&gt;
    // All of these syntaxes must be quoted, because unquoted strings in &lt;br /&gt;
    // ExtraData cannot contain spaces, commas, or plus signs.&lt;br /&gt;
    &lt;br /&gt;
    mapthing { options &amp;quot;EASY NORMAL HARD&amp;quot; }&lt;br /&gt;
    mapthing { options &amp;quot;EASY | NORMAL | HARD&amp;quot; }&lt;br /&gt;
    mapthing { options &amp;quot;EASY+NORMAL+HARD&amp;quot; }&lt;br /&gt;
    mapthing { options &amp;quot;EASY + NORMAL + HARD&amp;quot; }&lt;br /&gt;
    mapthing { options &amp;quot;EASY,NORMAL,HARD&amp;quot; }&lt;br /&gt;
    mapthing { options &amp;quot;EASY, NORMAL, HARD&amp;quot; }&lt;br /&gt;
&lt;br /&gt;
====tid====&lt;br /&gt;
Default: 0 &lt;br /&gt;
&lt;br /&gt;
The TID, or &amp;quot;Thing ID&amp;quot;, is a tag for mapthings which is used for identification in [[ACS]] scripts. TID values must be positive numbers between 1 and 65535. The TID value zero means no TID. Negative TID values are reserved and are used to indicate special things within the engine. TIDs are not required to be unique, and most ACS functions that accept TIDs will perform an action on all mapthings which bear the same TID.&lt;br /&gt;
&lt;br /&gt;
====special====&lt;br /&gt;
Default: 0&lt;br /&gt;
&lt;br /&gt;
The thing special field, which will execute when thing dies if it&#039;s a monster or picked up if it&#039;s an item. Use &#039;&#039;&#039;args&#039;&#039;&#039; to control the parameters.&lt;br /&gt;
&lt;br /&gt;
====args====&lt;br /&gt;
Default: All args values default to zero. &lt;br /&gt;
&lt;br /&gt;
The args field is a list of up to five special values which can have a broad range of meanings. Any values not provided in the args list will default, and if more than five values are provided, only the first five will be used. Currently, all args values are interpreted as integers (a non-number string evaluates to zero). This may change in the future. &lt;br /&gt;
&lt;br /&gt;
Example args list: &lt;br /&gt;
    mapthing { args { 0, 1, 2, 3, 4 } }&lt;br /&gt;
    &lt;br /&gt;
====height====&lt;br /&gt;
Default: 0 &lt;br /&gt;
&lt;br /&gt;
For normal objects, this field indicates a distance above the floor that the thing will spawn at level start. For objects with the SPAWNCEILING flag, this field indicates a distance below the ceiling instead. This field will have no effect on objects which spawn at a randomized height.&lt;br /&gt;
&lt;br /&gt;
=Linedefs =&lt;br /&gt;
&lt;br /&gt;
Linedefs define walls, two-sided textures, and provide action triggers within maps. &lt;br /&gt;
&lt;br /&gt;
Each field in the linedef definition, with the exception of the &#039;&#039;&#039;recordnum&#039;&#039;&#039; field, is optional. If a field is not provided, it takes on the default value indicated below the syntax information. Fields may also be provided in any order. &lt;br /&gt;
&lt;br /&gt;
Note that the order of linedef definitions in ExtraData is not important. The &#039;&#039;&#039;recordnum&#039;&#039;&#039; field serves to identify linedef records. &lt;br /&gt;
&lt;br /&gt;
==Creating ExtraData Linedefs ==&lt;br /&gt;
&lt;br /&gt;
Linedef records in ExtraData are associated either with lines which bear the ExtraData Control Line Special (270), or with any linedef in a DOOM-format map which uses a parameterized line special. You can place the 270 special, as well as parameterized special numbers, into the normal &amp;quot;special&amp;quot; field of a line using virtually any map editor. Editors with Eternity-specific configurations should support these specials natively.&lt;br /&gt;
&lt;br /&gt;
Each control linedef (or directly-used parameterized special) specifies its corresponding ExtraData linedef record number as an integer value in its linedef tag field. If your editor does not allow entering arbitrary values up to 32767 into the tag field of linedefs, you will need to use the BOOM command-line editor, CLED. As of the initial writing time of this document, both DETH and Doom Builder support entering arbitrary integer values for the tag field. Check your editor&#039;s documentation or user interface to verify if it supports this. &lt;br /&gt;
&lt;br /&gt;
The flags, sidedefs, textures, and location of the ExtraData control linedef are used normally by the line and cannot be altered from within ExtraData. The true special (if 270 is used) and tag fields of the linedef, along with any extended fields, are specified in the ExtraData record which the control linedef references. &lt;br /&gt;
&lt;br /&gt;
Any number of linedefs can reference the same ExtraData record. In the event that a control linedef references a non-existent ExtraData record or the ExtraData script for a level is missing, the special and tag of the ExtraData control linedef will both be set to zero. &lt;br /&gt;
&lt;br /&gt;
==Linedef Syntax and Fields ==&lt;br /&gt;
&lt;br /&gt;
The syntax of the ExtraData linedef record is as follows. Remember that all fields except the &#039;&#039;&#039;recordnum&#039;&#039;&#039; field are optional and can be specified in any order. &lt;br /&gt;
 linedef&lt;br /&gt;
 {&lt;br /&gt;
   recordnum &amp;lt;unique number&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
   // These fields are normal linedef fields&lt;br /&gt;
   special &amp;lt;number&amp;gt; OR &amp;lt;special name&amp;gt;&lt;br /&gt;
   tag &amp;lt;number&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
   // These fields are ExtraData extensions&lt;br /&gt;
   extflags &amp;lt;extended line flags list&amp;gt;&lt;br /&gt;
   args { &amp;lt;special field&amp;gt;, ... }&lt;br /&gt;
   id &amp;lt;number&amp;gt;&lt;br /&gt;
   alpha &amp;lt;number&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
   portalid &amp;lt;number&amp;gt;&lt;br /&gt;
 }&lt;br /&gt;
===Explanation of fields: ===&lt;br /&gt;
====recordnum====&lt;br /&gt;
The recordnum serves to identify this record, and is the number which ExtraData control linedefs must use to associate themselves with a linedef record. Every ExtraData linedef record must have a unique record number. If a duplicate record number is detected, the engine will currently exit with an error message. The record number is limited to values between 0 and 32767 inclusive. Some editors may only allow input of numbers up to 255 in the linedef tag field. Beware of this. &lt;br /&gt;
&lt;br /&gt;
====special====&lt;br /&gt;
:&#039;&#039;Default: 0 &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The special field determines what [[Linedef_types|type of action]] may be taken when a line is crossed, used, shot, etc. There are three types of linedef specials in Eternity: normal, generalized, and parameterized. Parameterized specials use the &#039;&#039;&#039;args&#039;&#039;&#039; field documented below to provide complete customization of line actions. &lt;br /&gt;
&lt;br /&gt;
This field can accept numbers for any special type, including generalized and parameterized, but it can also accept special names for parameterized line types. See the [[Detailed parameterized linedef specification]] for a complete list of the available names.&lt;br /&gt;
&lt;br /&gt;
====tag====&lt;br /&gt;
:&#039;&#039;Default: 0 &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The tag of the linedef, used by DOOM-style line specials and sector effects.&lt;br /&gt;
&lt;br /&gt;
====extflags====&lt;br /&gt;
:&#039;&#039;Default: No flags are set by default. &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
This field specifies extended linedef flag values which impact the functionality of parameterized linedef specials. This field uses the same syntax as BEX/EDF flag strings, but the syntax will be reviewed here for completeness. &lt;br /&gt;
&lt;br /&gt;
A BEX flag list is a string of flag names separated by whitespace, pipe characters, commas, or plus characters. In ExtraData, if a flag list contains whitespace, commas, or plus signs, it must be enclosed in double or single quotations. Flags are combined using bitwise-OR logic, so a flag name can be specified more than once. Specifying a flag name causes that flag to be turned on. The default state of all flags is off. &lt;br /&gt;
&lt;br /&gt;
These are the flag values which are available for this field: &lt;br /&gt;
    Flag name   Meaning&lt;br /&gt;
    ---------------------------------------------------------------------------------------&lt;br /&gt;
    CROSS         Linedef can be activated by being crossed.&lt;br /&gt;
    USE           Linedef can be activated by being used.&lt;br /&gt;
    IMPACT        Linedef can be activated by being shot.&lt;br /&gt;
    PUSH          Linedef can be activated by being pushed.&lt;br /&gt;
    PLAYER        Linedef can be activated by players.&lt;br /&gt;
    MONSTER       Linedef can be activated by objects with SPACMONSTER flag.&lt;br /&gt;
    MISSILE       Linedef can be activated by objects with SPACMISSILE flag.&lt;br /&gt;
    POLYOBJECT    Linedef can be activated by polyobjects (only works with CROSS)&lt;br /&gt;
    REPEAT        Linedef action is repeatable.&lt;br /&gt;
    1SONLY        Linedef can only be activated from first side.&lt;br /&gt;
    ADDITIVE      Linedef&#039;s midtexture is drawn with additive blending.&lt;br /&gt;
    BLOCKALL      Linedef will block everything that can be clipped.&lt;br /&gt;
    ZONEBOUNDARY  Linedef will work as a reverb effect boundary. Not needed for one-sided lines.&lt;br /&gt;
    CLIPMIDTEX    Linedef middle texture will not &amp;quot;bleed&amp;quot; on floor and ceiling.&lt;br /&gt;
    WRAPMIDTEX    Linedef middle texture of two-sided is repeated vertically instead of being drawn only once.&lt;br /&gt;
    3DMDPASSPROJ  Linedef will always let projectiles pass even if marked as 3DMidTex&lt;br /&gt;
    LOWERPORTAL   Linedef copies floor portal from its backside to its lower visible edge&lt;br /&gt;
    UPPERPORTAL   Linedef copies ceiling portal from its backside to its upper visible edge&lt;br /&gt;
    ---------------------------------------------------------------------------------------&lt;br /&gt;
    &lt;br /&gt;
Notes: IMPACT is currently only implemented for bullet weapons.&lt;br /&gt;
&lt;br /&gt;
LOWERPORTAL and UPPERPORTAL are used to enable portals on the front side&#039;s upper and/or lower edges of a linedef, if the sector in front of the linedef is tall enough compared to the back sector to expose them. It is the only way to enable such portals, which will copy the sector portal(s) from the backside, if any.&lt;br /&gt;
&lt;br /&gt;
Example flags fields -- All of these are equivalent: &lt;br /&gt;
    // This is the only syntax that does not require quotations.&lt;br /&gt;
    &lt;br /&gt;
    linedef { extflags CROSS|PLAYER|MISSILE|REPEAT }&lt;br /&gt;
    &lt;br /&gt;
    // All of these syntaxes must be quoted, because unquoted strings in &lt;br /&gt;
    // ExtraData cannot contain spaces, commas, or plus signs.&lt;br /&gt;
    &lt;br /&gt;
    linedef { extflags &amp;quot;CROSS PLAYER MISSILE REPEAT&amp;quot; }&lt;br /&gt;
    linedef { extflags &amp;quot;CROSS | PLAYER | MISSILE | REPEAT&amp;quot; }&lt;br /&gt;
    linedef { extflags &amp;quot;CROSS+PLAYER+MISSILE+REPEAT&amp;quot; }&lt;br /&gt;
    linedef { extflags &amp;quot;CROSS + PLAYER + MISSILE + REPEAT&amp;quot; }&lt;br /&gt;
    linedef { extflags &amp;quot;CROSS,PLAYER,MISSILE,REPEAT&amp;quot; }&lt;br /&gt;
    linedef { extflags &amp;quot;CROSS, PLAYER, MISSILE, REPEAT&amp;quot; }&lt;br /&gt;
&lt;br /&gt;
====args====&lt;br /&gt;
:&#039;&#039;Default: All args values default to zero. &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The args field is a list of up to five special values which can have a broad range of meanings. Any values not provided in the args list will default, and if more than five values are provided, only the first five will be used. Currently, all args values are interpreted as integers (a non-number string evaluates to zero). This may change in the future. The args list is used by parameterized linedef specials. &lt;br /&gt;
&lt;br /&gt;
Example args list: &lt;br /&gt;
    linedef { args { 0, 1, 2, 3, 4 } }&lt;br /&gt;
&lt;br /&gt;
====id====&lt;br /&gt;
:&#039;&#039;Default: 0&#039;&#039;&lt;br /&gt;
This field is equivalent to &#039;&#039;&#039;tag&#039;&#039;&#039;. It will only have effect if &#039;&#039;&#039;tag&#039;&#039;&#039; is not already set.&lt;br /&gt;
&lt;br /&gt;
====alpha====&lt;br /&gt;
:&#039;&#039;Default: Alpha defaults to 1.0.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The alpha field takes a value from 0.0 to 1.0 to set the opacity at which this linedef&#039;s midtexture is drawn. When combined with the ADDITIVE extflag, this can be used for additive-blended translucency as well.&lt;br /&gt;
&lt;br /&gt;
====portalid====&lt;br /&gt;
:&#039;&#039;Default: none&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Portal ID to apply on front side middle part, as defined from [[Portal_Define]].&lt;br /&gt;
&lt;br /&gt;
=Sectors=&lt;br /&gt;
&lt;br /&gt;
Sectors define distinct areas of the map that are bordered by linedefs, with floor and ceiling properties, lighting data, and specials. &lt;br /&gt;
&lt;br /&gt;
Each field in the sector definition, with the exception of the &#039;&#039;&#039;recordnum&#039;&#039;&#039; field, is optional. If a field is not provided, it takes on the default value indicated below the syntax information. Fields may also be provided in any order. &lt;br /&gt;
&lt;br /&gt;
Note that the order of sector definitions in ExtraData is not important. The &#039;&#039;&#039;recordnum&#039;&#039;&#039; field serves to identify sector records. &lt;br /&gt;
&lt;br /&gt;
==Creating ExtraData Sectors==&lt;br /&gt;
&lt;br /&gt;
Sector records in ExtraData are associated with lines which bear the ExtraData Sector Control Special (401). The linedef&#039;s front side sector is the map sector that will receive properties from the ExtraData record which is specified by number in the linedef&#039;s tag.&lt;br /&gt;
&lt;br /&gt;
Since ExtraData is attached to sectors via linedefs and not through overriding any of the sectors&#039; native fields, you specify all of the normal data for a sector in the map itself, and overriding that data through ExtraData sector records is not supported.&lt;br /&gt;
&lt;br /&gt;
Any number of linedefs can reference the same ExtraData sector record. In the event that a control linedef references a non-existent ExtraData record or the ExtraData script for a level is missing, the tag of the ExtraData sector control linedef will be set to zero and will otherwise be ignored.&lt;br /&gt;
&lt;br /&gt;
==Sector Syntax and Fields ==&lt;br /&gt;
&lt;br /&gt;
The syntax of the ExtraData sector record is as follows. Remember that all fields except the &#039;&#039;&#039;recordnum&#039;&#039;&#039; field are optional and can be specified in any order. &lt;br /&gt;
 sector&lt;br /&gt;
 {&lt;br /&gt;
   recordnum &amp;lt;unique number&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
   // These fields are ExtraData extensions to sector data&lt;br /&gt;
   flags &amp;lt;sector flag list&amp;gt;&lt;br /&gt;
   flags.add &amp;lt;sector flag list&amp;gt;&lt;br /&gt;
   flags.remove &amp;lt;sector flag list&amp;gt;&lt;br /&gt;
   damage &amp;lt;integer&amp;gt;&lt;br /&gt;
   damagemask &amp;lt;integer&amp;gt;&lt;br /&gt;
   damagemod &amp;lt;method of damage type&amp;gt;&lt;br /&gt;
   damageflags &amp;lt;sector damage flags list&amp;gt;&lt;br /&gt;
   damageflags.add &amp;lt;sector damage flags list&amp;gt;&lt;br /&gt;
   damageflags.remove &amp;lt;sector damage flags list&amp;gt;&lt;br /&gt;
   floorterrain &amp;lt;terrain name&amp;gt;&lt;br /&gt;
   floorangle &amp;lt;float&amp;gt;  &lt;br /&gt;
   flooroffsetx &amp;lt;float&amp;gt;&lt;br /&gt;
   flooroffsety &amp;lt;float&amp;gt;&lt;br /&gt;
   floorscalex &amp;lt;float&amp;gt;&lt;br /&gt;
   floorscaley &amp;lt;float&amp;gt;&lt;br /&gt;
   ceilingterrain &amp;lt;terrain name&amp;gt;&lt;br /&gt;
   ceilingangle &amp;lt;float&amp;gt;&lt;br /&gt;
   ceilingoffsetx &amp;lt;float&amp;gt;&lt;br /&gt;
   ceilingoffsety &amp;lt;float&amp;gt;&lt;br /&gt;
   ceilingscalex &amp;lt;float&amp;gt;&lt;br /&gt;
   ceilingscaley &amp;lt;float&amp;gt;&lt;br /&gt;
   colormaptop &amp;lt;lump name&amp;gt;&lt;br /&gt;
   colormapmid &amp;lt;lump name&amp;gt;&lt;br /&gt;
   colormapbottom &amp;lt;lump name&amp;gt;&lt;br /&gt;
   portalflags.floor &amp;lt;portal flags list&amp;gt;&lt;br /&gt;
   portalflags.ceiling &amp;lt;portal flags list&amp;gt;&lt;br /&gt;
   overlayalpha.floor &amp;lt;percentage or value from 0 to 255&amp;gt;&lt;br /&gt;
   overlayalpha.ceiling &amp;lt;percentage or value from 0 to 255&amp;gt;&lt;br /&gt;
   portalid.floor &amp;lt;number&amp;gt;&lt;br /&gt;
   portalid.ceiling &amp;lt;number&amp;gt;&lt;br /&gt;
 }&lt;br /&gt;
===Explanation of fields: ===&lt;br /&gt;
====recordnum====&lt;br /&gt;
The recordnum serves to identify this record, and is the number which ExtraData sector control linedefs must use to associate themselves with a sector record. Every ExtraData sector record must have a unique record number. If a duplicate record number is detected, the engine will currently exit with an error message. The record number is limited to values between 0 and 32767 inclusive. Some editors may only allow input of numbers up to 255 in the linedef tag field. Beware of this. &lt;br /&gt;
&lt;br /&gt;
====flags====&lt;br /&gt;
:&#039;&#039;Default: No flags are set by default. &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
This field specifies sector flag values which specify various properties of sectors. This field uses the same syntax as BEX/EDF flag strings. &lt;br /&gt;
&lt;br /&gt;
These are the flag values which are available for this field: &lt;br /&gt;
&lt;br /&gt;
    Flag name     Meaning&lt;br /&gt;
    ---------------------------------------------------------------------------------------&lt;br /&gt;
    SECRET        Sector is secret&lt;br /&gt;
    FRICTION      Sector has friction enabled, if targeted by a BOOM friction transfer line&lt;br /&gt;
    PUSH          Sector has BOOM push effects enabled&lt;br /&gt;
    KILLSOUND     Objects in sector cannot make sounds.&lt;br /&gt;
    KILLMOVESOUND Sector makes no movement sounds, even if it has a special sound sequence&lt;br /&gt;
    PHASEDLIGHT   Sector is phased light sequence start&lt;br /&gt;
    LIGHTSEQUENCE Sector is phased light sequence step (alternates with below flag)&lt;br /&gt;
    LIGHTSEQALT   Sector is phased light sequence alternate step (alternates with above flag)&lt;br /&gt;
    ---------------------------------------------------------------------------------------&lt;br /&gt;
    &lt;br /&gt;
Example flags fields -- All of these are equivalent: &lt;br /&gt;
    // This is the only syntax that does not require quotations.&lt;br /&gt;
    &lt;br /&gt;
    sector { flags SECRET|FRICTION|KILLMOVESOUND }&lt;br /&gt;
    &lt;br /&gt;
    // All of these syntaxes must be quoted, because unquoted strings in &lt;br /&gt;
    // ExtraData cannot contain spaces, commas, or plus signs.&lt;br /&gt;
    &lt;br /&gt;
    sector { flags &amp;quot;SECRET FRICTION KILLMOVESOUND&amp;quot; }&lt;br /&gt;
    sector { flags &amp;quot;SECRET | FRICTION | KILLMOVESOUND&amp;quot; }&lt;br /&gt;
    sector { flags &amp;quot;SECRET+FRICTION+KILLMOVESOUND&amp;quot; }&lt;br /&gt;
    sector { flags &amp;quot;SECRET + FRICTION + KILLMOVESOUND&amp;quot; }&lt;br /&gt;
    sector { flags &amp;quot;SECRET,FRICTION,KILLMOVESOUND&amp;quot; }&lt;br /&gt;
    sector { flags &amp;quot;SECRET, FRICTION, KILLMOVESOUND&amp;quot; }&lt;br /&gt;
&lt;br /&gt;
====flags.add====&lt;br /&gt;
:&#039;&#039;Default: No flags are set by default. &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
This is a list of sector flags to add to the sector. This is supported because some sector specials (such as sector special 9, &amp;quot;Secret&amp;quot;) imply that certain sector flags will be set on the sector before ExtraData is applied. If you wish to only add flags and not override any that may have been set by sector specials, use this field to specify only the flags that you wish to be added to the sector.&lt;br /&gt;
&lt;br /&gt;
====flags.remove====&lt;br /&gt;
:&#039;&#039;Default: No flags are set by default. &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
This is a list of sector flags to remove from the sector. If you wish to only remove flags and not override any that may have been set by sector specials, use this field to specify only the flags that you wish to be removed from the sector.&lt;br /&gt;
&lt;br /&gt;
====damage====&lt;br /&gt;
:&#039;&#039;Default: 0&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Specifies the amount of damage this sector does to players if the players are standing inside the sector and do not meet any special exemption criteria, such as wearing a Radiation Suit. This amount is done at each damage opportunity, which is determined by the &#039;&#039;&#039;damagemask&#039;&#039;&#039; field.&lt;br /&gt;
&lt;br /&gt;
====damagemask====&lt;br /&gt;
:&#039;&#039;Default: 0&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Specifies the interval in gametics between damage opportunities for a player standing in this sector. The default value of 0 will cause the sector to do constant and instantaneous damage every gametic. Setting this value to an integer greater than 0 will cause damage to be done every Nth gametic, with N being the value of this field. The default DOOM nukage types all use a damagemask of 32, which is roughly once per in-game second (there are 35 gametics per second).&lt;br /&gt;
&lt;br /&gt;
====damagemod====&lt;br /&gt;
:&#039;&#039;Default: &amp;quot;Unknown&amp;quot;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Specifies the type of damage done by this sector. If &amp;quot;Unknown&amp;quot; is specified, the damage done is generic. The value specified should be a valid EDF damagetype mnemonic. If it is not, &amp;quot;Unknown&amp;quot; will be used. This can be used to have a sector type trigger special pain and death states when it deals damage. For example, you can use &#039;&#039;&#039;slime&#039;&#039;&#039; or &#039;&#039;&#039;lava&#039;&#039;&#039; damagemod.&lt;br /&gt;
&lt;br /&gt;
====damageflags====&lt;br /&gt;
:&#039;&#039;Default: No flags are set by default.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
This field specifies sector damage flag values which affect the manner in which a sector does damage. This field uses the same syntax as BEX/EDF flag strings. &lt;br /&gt;
&lt;br /&gt;
These are the flag values which are available for this field: &lt;br /&gt;
&lt;br /&gt;
    Flag name     Meaning&lt;br /&gt;
    ---------------------------------------------------------------------------------------&lt;br /&gt;
    LEAKYSUIT     The player may take damage at random even if he has the radsuit powerup&lt;br /&gt;
    IGNORESUIT    Radiation suit powerups are ignored entirely&lt;br /&gt;
    ENDGODMODE    God mode will be disabled when the player enters this sector&lt;br /&gt;
    EXITLEVEL     The player will exit if has &amp;lt; 11 health and this sector tries to do damage&lt;br /&gt;
    TERRAINHIT    A TerrainTypes hit will occur when this sector does damage&lt;br /&gt;
    ---------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
====damageflags.add====&lt;br /&gt;
:&#039;&#039;Default: No flags are set by default.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Because some sector types imply the activation of various sector damageflags (for example, DOOM sector type 11 sets sector damageflags ENDGODMODE and EXITLEVEL), this field is supported to add additional damageflags to any that may have been set by the  map itself. Simply specify whatever flags you wish to have added to those that are already set.&lt;br /&gt;
&lt;br /&gt;
====damageflags.remove====&lt;br /&gt;
:&#039;&#039;Default: No flags are set by default.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
As with damageflags.add, it may be desirable to turn off some flags that were set by sector specials or other portions of the map data. Use this field to specify any sector damage flags you want to remove from sectors.&lt;br /&gt;
&lt;br /&gt;
====floorterrain====&lt;br /&gt;
:&#039;&#039;Default: &amp;quot;@flat&amp;quot;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Specifies an EDF TerrainTypes mnemonic for the type of terrain this sector should exhibit on its floor. If left to default or specified with an invalid name, the terrain of the sector will be determined by its floorpic as usual.&lt;br /&gt;
&lt;br /&gt;
====floorangle====&lt;br /&gt;
:&#039;&#039;Default: 0 (East, or upper edge to the north)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Specifies the angle of the floor flat in floating-point degrees from 0 to 359. Note that for compatibility with ZDoom, the angle specified advances in a &#039;&#039;&#039;clockwise&#039;&#039;&#039; fashion, contrary to most other angles in the DOOM engine.&lt;br /&gt;
&lt;br /&gt;
====flooroffsetx/flooroffsety====&lt;br /&gt;
:&#039;&#039;Default: 0&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Specifies the x and y offsets of the floor flat, relative to the normal floor grid, in floating point units.&lt;br /&gt;
&lt;br /&gt;
====floorscalex/floorscaley====&lt;br /&gt;
:&#039;&#039;Default: 1.0&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Specifies the x and y offsets of the floor flat. A higher number means a smaller texture.&lt;br /&gt;
&lt;br /&gt;
====ceilingterrain====&lt;br /&gt;
:&#039;&#039;Default: &amp;quot;@flat&amp;quot;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Specifies an EDF TerrainTypes mnemonic for the type of terrain this sector should exhibit on its ceiling. If left to default or specified with an invalid name, the terrain of the sector will be determined by its floorpic as usual. This currently only affects the behavior of bullet puffs when particles are enabled.&lt;br /&gt;
&lt;br /&gt;
====ceilingangle====&lt;br /&gt;
:&#039;&#039;Default: 0 (East, or upper edge to the north)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Specifies the angle of the ceiling flat in floating-point degrees from 0 to 359. Note that for compatibility with ZDoom, the angle specified advances in a &#039;&#039;&#039;clockwise&#039;&#039;&#039; fashion, contrary to most other angles in the DOOM engine.&lt;br /&gt;
&lt;br /&gt;
====ceilingoffsetx/ceilingoffsety====&lt;br /&gt;
:&#039;&#039;Default: 0&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Specifies the x and y offsets of the ceiling flat, relative to the normal ceiling grid, in floating point units.&lt;br /&gt;
&lt;br /&gt;
====ceilingscalex/ceilingscaley====&lt;br /&gt;
:&#039;&#039;Default: 1.0&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Specifies the x and y offsets of the ceiling flat. A higher number means a smaller texture.&lt;br /&gt;
&lt;br /&gt;
====colormaptop====&lt;br /&gt;
:&#039;&#039;Default: &amp;quot;@default&amp;quot;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Specifies the colormap lump to use when a player&#039;s viewpoint is above the fake ceiling of a BOOM 242 &amp;quot;deep water&amp;quot; effect applying to this sector. If left to default, the global colormap from MapInfo will be used as normal, unless one is specified by the 242 effect.&lt;br /&gt;
&lt;br /&gt;
====colormapmid====&lt;br /&gt;
:&#039;&#039;Default: &amp;quot;@default&amp;quot;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Specifies the colormap lump to use when a player&#039;s viewpoint is between the normal floor and ceiling for an ordinary sector, or between the fake floor and ceiling for a BOOM 242 &amp;quot;deep water&amp;quot; sector. If left to default, the global colormap from MapInfo will be used as normal, unless one is specified by a 242 effect.&lt;br /&gt;
&lt;br /&gt;
====colormapbottom====&lt;br /&gt;
:&#039;&#039;Default: &amp;quot;@default&amp;quot;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Specifies the colormap lump to use when a player&#039;s viewpoint is below the fake floor of a BOOM 242 &amp;quot;deep water&amp;quot; effect applying to this sector. If left to default, the global colormap from MapInfo will be used as normal, unless one is specified by the 242 effect.&lt;br /&gt;
&lt;br /&gt;
====portalflags.floor/portalflags.ceiling====&lt;br /&gt;
:&#039;&#039;Default: No flags are set by default.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
These two fields (portalflags.floor and portalflags.ceiling) specify portal property flag values which affect the rendering and behavior of portals attached to this sector&#039;s surfaces. These fields use the same syntax as BEX/EDF flag strings. &lt;br /&gt;
&lt;br /&gt;
These are the flag values which are available for this field: &lt;br /&gt;
&lt;br /&gt;
    Flag name     Meaning&lt;br /&gt;
    ---------------------------------------------------------------------------------------&lt;br /&gt;
    DISABLED        Portal is completely disabled&lt;br /&gt;
    NORENDER        Portal will not be rendered, but may still be interactive&lt;br /&gt;
    NOPASS          Objects cannot pass through the portal even if it is a linked portal&lt;br /&gt;
    BLOCKSOUND      Sound will not traverse through a linked portal&lt;br /&gt;
    OVERLAY         The portal will render the sector&#039;s flat as a blended overlay&lt;br /&gt;
    ADDITIVE        If OVERLAY is also specified, the overlay will use additive blending&lt;br /&gt;
    USEGLOBALTEX    Reserved for future per-portal texture specification&lt;br /&gt;
    ATTACHEDPORTAL  If a linked portal is on the respective floor or ceiling, move it along &lt;br /&gt;
                    with the surface. Useful for vertically moving platforms.&lt;br /&gt;
    ---------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
====overlayalpha.floor/overlayalpha.ceiling====&lt;br /&gt;
:&#039;&#039;Default&#039;&#039;: 100%&lt;br /&gt;
&lt;br /&gt;
These two fields (overlayalpha.floor and overlayalpha.ceiling) specify the opacity of the corresponding portal overlay, if any exists. You can specify either a percentage value from 0% to 100%, or a plain integer number from 0 to 255. 100%/255 are completely solid, while 0% is invisible.&lt;br /&gt;
&lt;br /&gt;
====portalid.floor/portalid.ceiling====&lt;br /&gt;
:&#039;&#039;Default&#039;&#039;: 0&lt;br /&gt;
&lt;br /&gt;
These two fields control the placement of portals defined by [[Portal_Define]] on the floor or ceiling of this sector. Values can be positive (in which case the direct portal will be used) or negative (in which case the opposite direction portal will be used, &#039;&#039;if&#039;&#039; applicable).&lt;/div&gt;</summary>
		<author><name>Printz</name></author>
	</entry>
	<entry>
		<id>https://eternity.youfailit.net/index.php?title=Thing_types&amp;diff=6555</id>
		<title>Thing types</title>
		<link rel="alternate" type="text/html" href="https://eternity.youfailit.net/index.php?title=Thing_types&amp;diff=6555"/>
		<updated>2026-06-14T14:08:14Z</updated>

		<summary type="html">&lt;p&gt;Printz: /* New to Eternity */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Backto|Editing reference}}&lt;br /&gt;
== New to BOOM ==&lt;br /&gt;
BOOM has implemented two new thing types as well, BoomPushPoint (5001), and BoomPullPoint (5002). These control the origin of the point source wind effect controlled by linedef type 226 in Doom format, or [[PointPush_SetForce]] in [[UDMF]], and set whether the wind blows towards or away from the origin depending on which is used.&lt;br /&gt;
&lt;br /&gt;
== New to MBF ==&lt;br /&gt;
&lt;br /&gt;
MBF introduces the following mapthing type:&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MBFHelperDog (DoomEd #888, DeHackEd #140)&#039;&#039;&#039;&lt;br /&gt;
:A dog similar to the one found in Wolfenstein. This dog is the one normally spawned with the player when the -dogs command-line option is used. It is not friendly by default, but must be given the FRIEND thing flag if you wish to make it so. Otherwise it will act as a normal enemy.&lt;br /&gt;
&lt;br /&gt;
== New to SMMU ==&lt;br /&gt;
&lt;br /&gt;
SMMU introduces the following mapthing type:&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;SMMUCameraSpot (5003)&#039;&#039;&#039;&lt;br /&gt;
:A general-purpose camera place-holder. These cameras will be randomly chosen during &amp;quot;cool demo playback&amp;quot; and for a view of the level during the intermission.&lt;br /&gt;
&lt;br /&gt;
== New to Eternity ==&lt;br /&gt;
&lt;br /&gt;
Eternity introduces the following new mapthing types. Note that this list does not currently contain any Heretic mapthings, which may be documented in the future. Note that there are also some mapthing types within the engine which are not currently documented. Maps should refrain from using those things until they are made official, as they could change or be deleted later.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;EEEnviroSequence (1200 - 1300)&#039;&#039;&#039;&lt;br /&gt;
:This group of objects are all translated into EEEnviroSequence with DoomEdNum 1300. These objects are used to add environmental sound sequences to the environmental sequence manager. For types 1200 through 1299, the sequence number to add is type - 1200. For type 1300, the sequence number is the value in args[0] as specified via [[ExtraData]] or the Hexen map format. &lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;EESectorSequence (1400 - 1500)&#039;&#039;&#039;&lt;br /&gt;
:This group of objects are all translated into EESectorSequence with DoomEdNum 1500. These objects are used to assign sound sequences to sectors by number. For types 1400 through 1499, the sequence number is type - 1400. For type 1500, the sequence number is the value in args[0] as specified via [[ExtraData]] or the Hexen map format. For type 1500, if args[0] is 0, the sector is reset to default sound sequence behavior, even if the [[MapInfo]] variable &amp;quot;noautosequences&amp;quot; has been set to &amp;quot;true&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;ExtraData Thing Control Object (5004)&#039;&#039;&#039;&lt;br /&gt;
:This doomednum is used to reference an [[ExtraData]] mapthing record, the number of which must be placed in the options field of this mapthing. There is no [[EDF]] thingtype which corresponds to the ExtraData control point; it is only used during map startup to spawn the appropriate ExtraData-defined thing at the location and angle of this mapthing. In the cases that an ExtraData control object references an invalid ExtraData mapthing record, attempts to spawn another ExtraData control object, or references an unknown EDF thingtype mnemonic, the &amp;quot;Unknown&amp;quot; object described below will be spawned as a placeholder. If an EDF thingtype is used which has a doomednum of -1, no thing will be spawned at all. See the ExtraData Reference for full information.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Unknown (5005)&#039;&#039;&#039;&lt;br /&gt;
:This thing type is used as a placeholder by EDF, ExtraData, and scripting. It may be spawned when an unknown thing type is requested, and its definition is required by the EDF language, so it is guaranteed to always exist. It uses DoomEd #5005 so that it can be used by ExtraData, but it will not generally be useful in maps. &lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;EESkyboxCam (5006)&#039;&#039;&#039;&lt;br /&gt;
:This thing type determines the origin for rendering of a skybox portal. See the [[Portals#Skybox_Portals|Skybox Portal]] documentation for complete information. &lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;EEParticleDrip (5007)&#039;&#039;&#039;&lt;br /&gt;
:A parameterized particle drip will be spawned at this mapthing&#039;s location with properties determined by the mapthing&#039;s ExtraData/Hexen arguments list. See the &#039;&#039;&#039;particlefx&#039;&#039;&#039; field documentation in the [[thingtype]] EDF Documentation for more information on particle effects, and see the [[ExtraData]] Documentation for full information on the ExtraData system. &lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;EEMapSpot (9001)&#039;&#039;&#039;&lt;br /&gt;
:This is a Hexen/ZDoom-compatible mapspot for scripting purposes. It is especially handy for playing sounds or spawning objects at a particular location without needing to remember the location&#039;s x/y/z coordinates. &lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;EEMapSpotGravity (9013)&#039;&#039;&#039;&lt;br /&gt;
:This object is exactly the same as EEMapSpot, but it will fall under gravity, allowing it to move up or down with sector floors/ceilings. &lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;EEParticleFountain (9027 - 9033)&#039;&#039;&#039;&lt;br /&gt;
:A particle fountain will be spawned at the mapthing&#039;s location. The fountain color depends on the mapthing number used, as follows:&lt;br /&gt;
:* 9027: Red&lt;br /&gt;
:* 9028: Green&lt;br /&gt;
:* 9029: Blue&lt;br /&gt;
:* 9030: Yellow&lt;br /&gt;
:* 9031: Purple&lt;br /&gt;
:* 9032: Black&lt;br /&gt;
:* 9033: White &lt;br /&gt;
*&#039;&#039;&#039;EEPolyObjAnchor (9300)&#039;&#039;&#039;&lt;br /&gt;
:This is a Hexen/zdoom-compatible PolyObject anchor spot. Each PolyObject defined in a map must have one and only one of these objects, and the object&#039;s angle field must be set to the PolyObject&#039;s integer id number. This spot determines the point relative to which lines will be translated and rotated. &lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;EEPolyObjSpawnSpot (9301)&#039;&#039;&#039;&lt;br /&gt;
:This is a Hexen/zdoom-compatible PolyObject spawn spot. Each PolyObject defined in a map must have one and only one of these objects, and the object&#039;s angle field must be set to the PolyObject&#039;s integer id number. This spot determines the exact location at which the PolyObject will start at the beginning of play on the map. The anchor spot will be translated exactly to this point, and all lines in the PolyObject are translated relative to it. &lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;EEPolyObjSpawnSpotCrush (9302)&#039;&#039;&#039;&lt;br /&gt;
:Exactly the same as EEPolyObjSpawnSpot, but PolyObjects which use this object instead will inflict damage upon shootable things which block the course of their movement at a rate of 3 HP/gametic (105 damage per second). &lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;EEPolyObjSpawnSpotDamage (9303)&#039;&#039;&#039;&lt;br /&gt;
:Harmful polyobject: this particular type of polyobject causes damage to any actor who touches it, without the need for crushing. It has the same doomednum as ZDoom&#039;s equivalent. New to Eternity 3.37.00.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;EEAmbience (14001 - 14065)&#039;&#039;&#039;&lt;br /&gt;
:This group of objects are all translated into EEAmbience with DoomEdNum 14065. These objects define control points that utilize [[EDF]] ambience definitions. For types 14001 through 14064, the ambience index used by that object is type - 14000. For type 14065, the ambience index used by the object is the value in args[0] as specified via [[ExtraData]] or the Hexen map format.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;EESoundEnvironment (9048)&#039;&#039;&#039;&lt;br /&gt;
:Partially ZDoom-compatible method of assigning an environmental effect to a sound zone. This thingtype uses its first two map arguments as the ID1 and ID2 to match an EDF reverb definition and assigns that definition to its spawn sector&#039;s sound zone.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;EENightmareSpectre (889; Dehacked number 158)&#039;&#039;&#039;&lt;br /&gt;
:Implements PlayStation Doom&#039;s subtractively blended spectre w/300 spawnhealth.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;EEPSXSpectre (890, Dehacked number 159)&#039;&#039;&#039;&lt;br /&gt;
:Implements PlayStation Doom&#039;s additive spectre.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;EEPSXBloodyChain (891, Dehacked number 160)&#039;&#039;&#039;&lt;br /&gt;
:Implements PlayStation Doom&#039;s bloody chain decorative object. A sprite is not included in eternity.pke. Requires BLCHA0 to be useful.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;EEBetaLostSoul (9037; Dehacked number 161)&#039;&#039;&#039;&lt;br /&gt;
:Slightly edited Lost Soul from the press release beta version of Doom.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;EEMusicChanger (14100 - 14165)&#039;&#039;&#039;&lt;br /&gt;
:Music changer from Risen3D and PrBoom+. You place it in the map. The player who steps inside the sector with this thing will have their music changed. For 14101-14164, see [[Doom Wiki:MUSINFO|MUSINFO]] in the Doom Wiki for info on how to use it. The MUSINFO lump is supported in Eternity. Type 14100 will reset the music to the current level music, while 14165 is the parameterized type, which will use the first argument.&lt;br /&gt;
:Another way to change music at runtime is to use [[ACS]] scripting with the [[LocalSetMusic]] function.&lt;br /&gt;
===Sector actions===&lt;br /&gt;
*&#039;&#039;&#039;EESectorActionEnter&#039;&#039;&#039; (9998), &#039;&#039;&#039;EESectorActionExit&#039;&#039;&#039; (9997)&lt;br /&gt;
:Special thing that triggers an [[Parameterized linedef specials|action special]] whenever someone enters or exits the sector this object is placed in at map startup. Use [[UDMF]] or [[ExtraData]] to provide it the special # and the args. You need to give it the following flags (in the editor or ExtraData) to control how it&#039;s activated:&lt;br /&gt;
:*deaf/ambush: can be activated by monsters;&lt;br /&gt;
:*dormant: can be activated by projectiles;&lt;br /&gt;
:*friend: cannot be activated by players;&lt;br /&gt;
:*standing (UDMF only): single-use only, not repeatable;&lt;br /&gt;
&lt;br /&gt;
==Special==&lt;br /&gt;
DOOM thingtypes can now be spawned in other gamemodes&#039; maps via use of DoomEd numbers in the 6000 range.&lt;br /&gt;
&lt;br /&gt;
For a normal thingtype with a DoomEd number between 0 and 255, simply add 6000 to its DoomEd number. For example the Arch-vile, with a normal DoomEd number of 64, can be spawned in Heretic using DoomEd number 6064.&lt;br /&gt;
&lt;br /&gt;
For DoomEd numbers in the 2000 and 3000 ranges, subtract 2000 or 3000 respectively and then add 6200 or 6300, respectively. For example, 3001 DoomImp can be spawned in Heretic using DoomEd number 6301.&lt;br /&gt;
&lt;br /&gt;
==Credits==&lt;br /&gt;
This document uses text from the old documentation and new Bifrost feature list (eternity.mancubus.net/text/bifrost_docs.txt)&lt;br /&gt;
[[Category:Editing reference]]&lt;/div&gt;</summary>
		<author><name>Printz</name></author>
	</entry>
	<entry>
		<id>https://eternity.youfailit.net/index.php?title=Polyobject&amp;diff=6554</id>
		<title>Polyobject</title>
		<link rel="alternate" type="text/html" href="https://eternity.youfailit.net/index.php?title=Polyobject&amp;diff=6554"/>
		<updated>2026-06-14T14:04:49Z</updated>

		<summary type="html">&lt;p&gt;Printz: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;PolyObjects are special sets of one-sided linedefs which, unlike any other lines, can be moved on the map during gameplay. Unlike the Hexen implementation of PolyObjects, Eternity does not restrict these objects to one per subsector, and they are also allowed to move any distance from their spawn point, even across subsector boundaries. &lt;br /&gt;
&lt;br /&gt;
PolyObjects fully clip normal objects such as the player and enemies, optionally doing crushing damage depending upon the type of spawn spot used. They also block bullet tracers and monsters&#039; lines of sight. They do not, however, clip sound propagation, so it may be necessary to use sound blocking lines near areas where PolyObjects are meant to function as a normal wall until they move. &lt;br /&gt;
&lt;br /&gt;
Although Eternity does allow PolyObjects to move between different subsectors, this will only work properly if the subsectors on both sides of a line have the same properties (floor &amp;amp; ceiling heights, light level, and flat). However, since the implementation of [[dynaseg]]s, Eternity does not require a &amp;quot;PolyObject-aware&amp;quot; node builder. &lt;br /&gt;
&lt;br /&gt;
Finally, Eternity allows PolyObjects to be used in DOOM-format maps via the use of [[ExtraData]]. See the subsections below for more information on how to create and move PolyObjects. &lt;br /&gt;
&lt;br /&gt;
{{Backto|Linedef types}}&lt;br /&gt;
&lt;br /&gt;
==Creating PolyObjects==&lt;br /&gt;
&lt;br /&gt;
PolyObjects are a combination of a set of lines, which are typically placed in a &amp;quot;control sector&amp;quot; area outside of the main map, and exactly two mapthings: one spawn spot, and one anchor point. There are two different methods for grouping lines into a PolyObject.&lt;br /&gt;
&lt;br /&gt;
The lines are typically one-sided walls, but two-sided line polyobjects are also possible.&lt;br /&gt;
&lt;br /&gt;
===&#039;&#039;&#039;Method 1: The &amp;lt;code&amp;gt;Polyobj_StartLine&amp;lt;/code&amp;gt; Special&#039;&#039;&#039;===&lt;br /&gt;
&lt;br /&gt;
:The &amp;lt;code&amp;gt;348:Polyobj_StartLine(&#039;&#039;&#039;polyobj_id&#039;&#039;&#039;, &#039;&#039;&#039;mirror_id&#039;&#039;&#039;)&amp;lt;/code&amp;gt; special marks the first line in a PolyObject which is made up of a cyclic set of linedefs (that is, each line &amp;quot;points toward&amp;quot; the next line, ending at the first vertex of the first line). &lt;br /&gt;
&lt;br /&gt;
:Diagrammatic Example: &lt;br /&gt;
:[[File:Polyobjects_basic.png]]&lt;br /&gt;
:Assume that the linedef &#039;&#039;&#039;A&#039;&#039;&#039; is assigned the &amp;lt;code&amp;gt;Polyobj_StartLine&amp;lt;/code&amp;gt; special and has argument #1 set to &amp;quot;1&amp;quot; -- this is its &#039;&#039;&#039;PolyObject ID number&#039;&#039;&#039;, which must be unique amongst all on the map, and must be a number greater than zero. &lt;br /&gt;
&lt;br /&gt;
:Starting from line &#039;&#039;&#039;A&#039;&#039;&#039;, the engine will go from vertex to vertex, adding the first line found which shares the current line&#039;s second vertex as its first vertex. In this example, since the object is closed as is required, the process will end at the first vertex of line &#039;&#039;&#039;A&#039;&#039;&#039;, and there will be four lines in the PolyObject (note that unlike Hexen, there is NO limit to the number of lines that can be placed in one PolyObject). &lt;br /&gt;
&lt;br /&gt;
:Now, once the lines are added, it is necessary to define the control objects. Points &#039;&#039;&#039;B&#039;&#039;&#039; and &#039;&#039;&#039;C&#039;&#039;&#039; are the two required objects: &lt;br /&gt;
:* &#039;&#039;&#039;B&#039;&#039;&#039;: This is the PolyObject&#039;s anchor point (type EEPolyObjAnchor with DoomEd #9300). It defines the point relative to which all the lines in the PolyObject will be translated to the spawn point. This object&#039;s angle must be set to the same value as the StartLine&#039;s first argument (the &#039;&#039;&#039;PolyObject ID&#039;&#039;&#039;). There must be one and only one of these objects for each &#039;&#039;&#039;PolyObject ID&#039;&#039;&#039;. &lt;br /&gt;
:* &#039;&#039;&#039;C&#039;&#039;&#039;: This is the PolyObject&#039;s spawn point (one of EEPolyObjSpawnSpot [9301] or EEPolyObjSpawnSpotCrush [9302]). It defines the point where the PolyObject will initially spawn on the map. The anchor point will be translated to this exact location, and all lines in the PolyObject will maintain their relative positions to it. This object must also have its angle field set to the same value as both the StartLine&#039;s first argument and the anchor point&#039;s angle field. There must be one and only one of these objects for each PolyObject ID. Use 9302 to cause the PolyObject to do crushing damage to things that block it while it is in motion. &lt;br /&gt;
&lt;br /&gt;
:Note that when you use this method, the other lines belonging to the PolyObject can be given their own line specials, including ones which affect the PolyObject itself. When the player presses the PolyObject, the specials will work as expected. &lt;br /&gt;
&lt;br /&gt;
:The complete arguments to &amp;lt;code&amp;gt;Polyobj_StartLine(&#039;&#039;&#039;polyobj_id&#039;&#039;&#039;, &#039;&#039;&#039;mirror_id&#039;&#039;&#039;)&amp;lt;/code&amp;gt; are as follows: &lt;br /&gt;
:* &#039;&#039;polyobj_id&#039;&#039; : the unique ID number (greater than zero) of the PolyObject &lt;br /&gt;
:* &#039;&#039;mirror_id&#039;&#039; : the ID number of a PolyObject that you want to mirror every action that affects this PolyObject. This number cannot be the same as the PolyObject&#039;s own ID. &lt;br /&gt;
&lt;br /&gt;
:In order to use this line special in a DOOM-format map, it is necessary to use [[ExtraData]]. In that case, you must give the line you want to have the Polyobj_StartLine special the ExtraData linedef control special (#270) instead, and then specify Polyobj_StartLine and its arguments in its corresponding ExtraData linedef record. &lt;br /&gt;
&lt;br /&gt;
===&#039;&#039;&#039;Method 2: The &amp;lt;code&amp;gt;Polyobj_ExplicitLine&amp;lt;/code&amp;gt; Special&#039;&#039;&#039;===&lt;br /&gt;
&lt;br /&gt;
:The &amp;lt;code&amp;gt;349:Polyobj_ExplicitLine(&#039;&#039;&#039;polyobj_id&#039;&#039;&#039;, &#039;&#039;&#039;index&#039;&#039;&#039;, &#039;&#039;&#039;mirror_id&#039;&#039;&#039;)&amp;lt;/code&amp;gt; special demarcates every line that will be added to a PolyObject and the exact order in which the lines will be added. This affords a bit more flexibility in the construction of PolyObjects at the price of not allowing any other line specials to be placed on the object itself. &lt;br /&gt;
&lt;br /&gt;
:Diagrammatic Example: &lt;br /&gt;
:[[File:Polyobjects_adv.png]]&lt;br /&gt;
:Assume that the linedefs labeled 1 through 4 are assigned (via [[ExtraData]]) the &amp;lt;code&amp;gt;Polyobj_ExplicitLine&amp;lt;/code&amp;gt; special, all have argument &#039;&#039;&#039;#1&#039;&#039;&#039; set to &amp;quot;1&amp;quot; -- this is its PolyObject ID number (which must be unique amongst all on the map, and must be a number greater than zero), and argument &#039;&#039;&#039;#2&#039;&#039;&#039; set also to whatever their tag is (in this case again it&#039;s &#039;&#039;1&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
:The game engine will search through all linedefs in the entire map for ones with the current &#039;&#039;&#039;PolyObject ID&#039;&#039;&#039; in argument &#039;&#039;&#039;#1&#039;&#039;&#039; and a value greater than zero in argument &#039;&#039;&#039;#2&#039;&#039;&#039;. The lines will be collected and then sorted by the &#039;&#039;&#039;LineDef id&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
:Now, once the lines are added, it is necessary to define the control objects. This is exactly the same as it is for the &amp;lt;code&amp;gt;StartLine(...)&amp;lt;/code&amp;gt; special above. &lt;br /&gt;
:* &#039;&#039;&#039;B&#039;&#039;&#039;: This is the PolyObject&#039;s anchor point (type EEPolyObjAnchor with DoomEd #9300). It defines the point relative to which all the lines in the PolyObject will be translated to the spawn point. This object&#039;s angle must be set to the same value as the &amp;lt;code&amp;gt;ExplicitLines&#039;&amp;lt;/code&amp;gt; first argument (the &#039;&#039;&#039;PolyObject ID&#039;&#039;&#039;). There must be one and only one of these objects for each &#039;&#039;&#039;PolyObject ID&#039;&#039;&#039;. &lt;br /&gt;
:* &#039;&#039;&#039;C&#039;&#039;&#039;: This is the PolyObject&#039;s spawn point (one of EEPolyObjSpawnSpot [9301] or EEPolyObjSpawnSpotCrush [9302]). It defines the point where the PolyObject will initially spawn on the map. The anchor point will be translated to this exact location, and all lines in the PolyObject will maintain their relative positions to it. This object must also have its angle field set to the same value as both the ExplicitLines&#039; first argument and the anchor point&#039;s angle field. There must be one and only one of these objects for each &#039;&#039;&#039;PolyObject ID&#039;&#039;&#039;. Use 9302 to cause the PolyObject to do crushing damage to things that block it while it is in motion. &lt;br /&gt;
&lt;br /&gt;
:The complete arguments to &amp;lt;code&amp;gt;Polyobj_ExplicitLine(&#039;&#039;&#039;polyobj_id&#039;&#039;&#039;, &#039;&#039;&#039;index&#039;&#039;&#039;, &#039;&#039;&#039;mirror_id&#039;&#039;&#039;)&amp;lt;/code&amp;gt; are as follows: &lt;br /&gt;
:* &#039;&#039;polyobj_id&#039;&#039; : the unique ID number (greater than zero) of the PolyObject &lt;br /&gt;
:* &#039;&#039;index&#039;&#039; : specifies the order in which the line will be added to the PolyObject. This number should be unique amongst all lines to be added to the same object, and must be a value greater than zero. &lt;br /&gt;
:* &#039;&#039;mirror_id&#039;&#039; : the ID number of a PolyObject that you want to mirror every action that affects this PolyObject. This number cannot be the same as the PolyObject&#039;s own ID. &lt;br /&gt;
&lt;br /&gt;
:In order to use this line special in a DOOM-format map, it is necessary to use ExtraData. In that case, you can either give the lines you want to have the Polyobj_ExplicitLine special the ExtraData linedef control special (#270) instead, and then specify Polyobj_ExplicitLine and its arguments in all the corresponding ExtraData linedef records; or simply use the line special normally, and specify the ExtraData record number in the linedef&#039;s tag, specifying only the arguments inside the ExtraData record.&lt;br /&gt;
&lt;br /&gt;
===Note===&lt;br /&gt;
As of EE 3.37.00, thing type 9303 is available, which is similar to the ZDoom damaging polyobject type.&lt;br /&gt;
&lt;br /&gt;
==Moving PolyObjects==&lt;br /&gt;
&lt;br /&gt;
There are two types of basic motion which PolyObjects can currently undergo: translation and rotation. Using &amp;quot;override&amp;quot; actions, it is possible to combine the two to have a PolyObject which rotates while moving in the xy plane. &lt;br /&gt;
&lt;br /&gt;
[[File:Polyobject_rotating.gif]]&lt;br /&gt;
&lt;br /&gt;
===Translating PolyObjects===&lt;br /&gt;
&lt;br /&gt;
To move a PolyObject in the xy plane, use one of the following line specials: &lt;br /&gt;
* &amp;lt;code&amp;gt;Polyobj_Move(&#039;&#039;&#039;polyobj_id&#039;&#039;&#039;,  &#039;&#039;&#039;speed&#039;&#039;&#039;, &#039;&#039;&#039;angle&#039;&#039;&#039;, &#039;&#039;&#039;dist&#039;&#039;&#039;)&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;Polyobj_OR_Move(&#039;&#039;&#039;polyobj_id&#039;&#039;&#039;,  &#039;&#039;&#039;speed&#039;&#039;&#039;, &#039;&#039;&#039;angle&#039;&#039;&#039;, &#039;&#039;&#039;dist&#039;&#039;&#039;)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Both of these line specials use the same arguments:&lt;br /&gt;
* &#039;&#039;polyobj_id&#039;&#039; : Specifies which PolyObject to intially move. If the object is already moving, nothing will happen unless the action is Polyobj_OR_Move. If this object has a mirror, the same action will be recursively applied to every mirror PolyObject, reversing the angle of movement for each subsequent mirror. &lt;br /&gt;
* &#039;&#039;speed&#039;&#039; : Speed of the motion in eighths of a unit per tic. &lt;br /&gt;
* &#039;&#039;angle&#039;&#039; : Byte angle specifying the direction of motion. To convert from degrees to byte angles, use this formula: byteangle = (degrees * 256) / 360. Round or chop the result to an integer. 0 means East, 64 means North, 128 means West, and 192 means South. &lt;br /&gt;
* &#039;&#039;dist&#039;&#039; : The total distance to move the object in units. &lt;br /&gt;
&lt;br /&gt;
All PolyObjects will inflict thrust on objects which block them with force proportional to the speed of motion. If the PolyObject was spawned with the EEPolyObjSpawnSpotCrush object (DoomEd num 9302), then if the object does not fit at the location it is being pushed toward, it will be damaged 3 hitpoints per tic (105 damage per second). &lt;br /&gt;
&lt;br /&gt;
===Rotating PolyObjects===&lt;br /&gt;
&lt;br /&gt;
To rotate a PolyObject, use one of the following line specials: &lt;br /&gt;
* &amp;lt;code&amp;gt;Polyobj_RotateRight(&#039;&#039;&#039;polyobj_id&#039;&#039;&#039;,  &#039;&#039;&#039;aspeed&#039;&#039;&#039;, &#039;&#039;&#039;adist&#039;&#039;&#039;)&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;Polyobj_OR_RotateRight(&#039;&#039;&#039;polyobj_id&#039;&#039;&#039;,  &#039;&#039;&#039;aspeed&#039;&#039;&#039;, &#039;&#039;&#039;adist&#039;&#039;&#039;)&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;Polyobj_RotateLeft(&#039;&#039;&#039;polyobj_id&#039;&#039;&#039;,  &#039;&#039;&#039;aspeed&#039;&#039;&#039;, &#039;&#039;&#039;adist&#039;&#039;&#039;)&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;Polyobj_OR_RotateLeft(&#039;&#039;&#039;polyobj_id&#039;&#039;&#039;,  &#039;&#039;&#039;aspeed&#039;&#039;&#039;, &#039;&#039;&#039;adist&#039;&#039;&#039;)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
All these line specials use the same arguments:&lt;br /&gt;
* &#039;&#039;polyobj_id&#039;&#039; : Specifies which PolyObject to initially rotate. If the object is already moving, nothing will happen unless the action is Polyobj_OR_RotateRight or Polyobj_OR_RotateLeft. If this object has a mirror, the same action will be recursively applied to every mirror PolyObject, reversing the direction of rotation for each subsequent mirror. &lt;br /&gt;
* &#039;&#039;aspeed&#039;&#039; : Angular speed of the rotation in byte angles per tic. Same as for the &amp;quot;angle&amp;quot; parameter to Move actions. &lt;br /&gt;
* &#039;&#039;adist&#039;&#039; : Angular distance to rotate in byte angles. Same as for aspeed, except with two special caveats: &lt;br /&gt;
&lt;br /&gt;
The byte angle value 0 (zero) means to rotate exactly 360 degrees. &lt;br /&gt;
&lt;br /&gt;
The byte angle value 255 means to rotate perpetually. This type of action never ends and thus only override actions can subsequently be applied to the PolyObject.&lt;br /&gt;
&lt;br /&gt;
===PolyObject Examples===&lt;br /&gt;
====[https://s3-eu-west-1.amazonaws.com/eternity/polyobjects.wad PolyObject Demo]====&lt;br /&gt;
A demonstration of both rotating and translating PolyObjects. Plays on &#039;&#039;&#039;Doom 2&#039;&#039;&#039; / &#039;&#039;&#039;Map01&#039;&#039;&#039;. The map is linked to an [[ExtraData]] lump (via [[EMAPINFO]]).&lt;br /&gt;
&lt;br /&gt;
It is recommended that you open the Demo WAD in a WAD manager program like &#039;&#039;&#039;SLADE3&#039;&#039;&#039; or &#039;&#039;&#039;XWE&#039;&#039;&#039; to read the &#039;&#039;&#039;ExtraData&#039;&#039;&#039; and &#039;&#039;&#039;ACS&#039;&#039;&#039; scripts together with provided comments. For example this script explains how LineDefs are configured for a manually operated rotating PolyObject:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//===============================&lt;br /&gt;
//= MANUALLY ROTATING POLYOBJECT&lt;br /&gt;
//=============================&lt;br /&gt;
&lt;br /&gt;
// This PolyObject doesn&#039;t move unless activated by a a nearby switch.&lt;br /&gt;
linedef {&lt;br /&gt;
  recordnum = 2&lt;br /&gt;
  special = PolyObj_StartLine&lt;br /&gt;
  args = { 2 }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
linedef {&lt;br /&gt;
  recordnum = 3&lt;br /&gt;
  extflags = &amp;quot;use player&amp;quot; // Defines how the LineDef action is activated.&lt;br /&gt;
                          // The lack of &amp;quot;repeat&amp;quot; flag means it&#039;s a one-time&lt;br /&gt;
                          // action.&lt;br /&gt;
  &lt;br /&gt;
  special = Polyobj_RotateRight&lt;br /&gt;
  args = { 2, 2, 255 }  // Starts Rotating PolyObject with PolyID: 2&lt;br /&gt;
                        // at a speed of 2 units and angular distance&lt;br /&gt;
                        // of 255 units - which means it&#039;ll rotate&lt;br /&gt;
                        // continuously.&lt;br /&gt;
}  (...)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====[https://s3-eu-west-1.amazonaws.com/eternity/polyobjects_adv.wad PolyObject Advanced Demo]====&lt;br /&gt;
A demonstration of rotating and translating PolyObjects made with &amp;lt;code&amp;gt;PolyObj_ExplicitLine()&amp;lt;/code&amp;gt; Plays on &#039;&#039;&#039;Doom 2&#039;&#039;&#039; / &#039;&#039;&#039;Map01&#039;&#039;&#039;. The map is linked to an [[ExtraData]] lump (via [[EMAPINFO]]). It shows how more advanced PolyObjects can be constructed and moved to fake 3D objects. It also includes PolyObject Doors discussed in the next section of this article.&lt;br /&gt;
&lt;br /&gt;
It is recommended that you play go through  the first Demo in the series and open the Demo WAD in a WAD manager program like &#039;&#039;&#039;SLADE3&#039;&#039;&#039; or &#039;&#039;&#039;XWE&#039;&#039;&#039; to read the &#039;&#039;&#039;ExtraData&#039;&#039;&#039; and &#039;&#039;&#039;ACS&#039;&#039;&#039; scripts together with provided comments.&lt;br /&gt;
&lt;br /&gt;
==PolyObject Doors==&lt;br /&gt;
There are two distinct types of actions provided to allow PolyObjects to function as doors: swinging and sliding. There are no override versions of door actions, and applying other overrides to currently moving PolyObject doors will most likely cause the doors to malfunction and move erratically. &lt;br /&gt;
&lt;br /&gt;
All PolyObject doors accept a delay parameter, and this specifies the amount of time the door will wait before closing. A door which is closing will reopen if blocked by an object.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Swinging PolyObject Door===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [[Image:Poly_swingdoor_schema.png|200px]] || [[Image:Poly_swigning_door.gif]]&lt;br /&gt;
|-&lt;br /&gt;
| PolyObject swinging door schema || PolyObject swinging door&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;Polyobj_DoorSwing (&#039;&#039;&#039;polyobj_id&#039;&#039;&#039;, &#039;&#039;&#039;aspeed&#039;&#039;&#039;, &#039;&#039;&#039;adist&#039;&#039;&#039;, &#039;&#039;&#039;delay&#039;&#039;&#039;)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This action creates a swinging door from a PolyObject and takes the following arguments: &lt;br /&gt;
:* &#039;&#039;polyobj_id&#039;&#039; : The ID number of PolyObject to affect. Mirroring works for doors as well and is the most common use for PolyObject mirroring. &lt;br /&gt;
:* &#039;&#039;aspeed&#039;&#039; : Angular speed in byte angles per tic. &lt;br /&gt;
:* &#039;&#039;adist&#039;&#039; : Angular distance to rotate when opening, and again but in the opposite direction when closing. &lt;br /&gt;
:* &#039;&#039;delay&#039;&#039; : Amount of time before the door attempts to close after fully opening in tics. If the door is forced to reopen due to being blocked, it will also wait this amount of time before once again closing. &lt;br /&gt;
Swinging doors currently only rotate left. A right-rotating swinging door special will be added in the near future.&lt;br /&gt;
&lt;br /&gt;
===Sliding PolyObject Door===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [[Image:Poly_slidedoor_schema.png|200px]] || [[Image:Poly_sliding_door.gif|180px]]&lt;br /&gt;
|-&lt;br /&gt;
| PolyObject sliding door schema || PolyObject sliding door&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;Polyobj_DoorSlide (&#039;&#039;&#039;polyobj_id&#039;&#039;&#039;, &#039;&#039;&#039;speed&#039;&#039;&#039;, &#039;&#039;&#039;angle&#039;&#039;&#039;, &#039;&#039;&#039;dist&#039;&#039;&#039;, &#039;&#039;&#039;delay&#039;&#039;&#039;)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:This action creates a sliding door from a PolyObject and takes the following arguments: &lt;br /&gt;
:* &#039;&#039;polyobj_id&#039;&#039; : The ID number of PolyObject to affect. Mirroring works for doors as well and is the most common use for PolyObject mirroring. &lt;br /&gt;
:* &#039;&#039;speed&#039;&#039; : Speed of the door&#039;s opening and closing in eighths of a unit per tic. &lt;br /&gt;
:* &#039;&#039;angle&#039;&#039; : Byte angle of door&#039;s initial motion. This angle is reversed when the door closes. &lt;br /&gt;
:* &#039;&#039;dist&#039;&#039; : Distance the door moves when opening, and again when closing, in units. &lt;br /&gt;
:* &#039;&#039;delay&#039;&#039; : Amount of time before the door attempts to close after fully opening in tics. If the door is forced to reopen due to being blocked, it will also wait this amount of time before once again closing. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===PolyObject Door Examples===&lt;br /&gt;
====[https://s3-eu-west-1.amazonaws.com/eternity/polyobj_doors.wad PolyObject Doors Demo]====&lt;br /&gt;
A demonstration of both swinging and sliding doors, mirrored and single. Plays on &#039;&#039;&#039;Doom 2&#039;&#039;&#039; / &#039;&#039;&#039;Map01&#039;&#039;&#039;. The map is linked to an [[ExtraData]] lump (via [[EMAPINFO]]).&lt;br /&gt;
&lt;br /&gt;
It is recommended that you open the Demo WAD in a WAD manager program like &#039;&#039;&#039;SLADE3&#039;&#039;&#039; or &#039;&#039;&#039;XWE&#039;&#039;&#039; to read the &#039;&#039;&#039;ExtraData&#039;&#039;&#039; scripts together with provided comments. For example the first script explains how LineDefs are configured for a single swinging door:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//=============================&lt;br /&gt;
//= BASIC SINGLE SWINGING DOOR&lt;br /&gt;
//===========================&lt;br /&gt;
linedef {&lt;br /&gt;
  recordnum = 1 // corresponds to a LineDef with action: 270, tag: 1&lt;br /&gt;
  &lt;br /&gt;
  special = PolyObj_StartLine // this defines the current LineDef as a&lt;br /&gt;
                              // starting point for the PolyObject&lt;br /&gt;
                &lt;br /&gt;
  args = { 1 }  // since this is a very basic PolyObj, it requires only one&lt;br /&gt;
                // argument (it&#039;s not to be confused with LineDef / Sector tag)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
linedef {&lt;br /&gt;
  recordnum = 2 // corresponds to a LineDef with action: 270, tag: 2&lt;br /&gt;
  &lt;br /&gt;
  extflags = &amp;quot;use player repeat&amp;quot; // describes how the LineDef is activated&lt;br /&gt;
  &lt;br /&gt;
  special = PolyObj_DoorSwing&lt;br /&gt;
  args = { 1,20,64,160 } // swing the door with PolyId: 1, AngularSpeed: 20&lt;br /&gt;
                         // AngularDeistance 64 units (90 deg),&lt;br /&gt;
                         // Delay: 160 tics&lt;br /&gt;
}  (...)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Polyobjects with portals==&lt;br /&gt;
:See [[Linked_portals#Polyobject_portals | Polyobject portals]]&lt;br /&gt;
&lt;br /&gt;
==Polyobjects with 2-sided lines==&lt;br /&gt;
Polyobjects made of 2-sided lines have always worked in all games which had polyobjects, but with limitations. Keep in mind that Polyobj_StartLine only works for closed polygons of linedefs going the same way. Otherwise, use Polyobj_ExplicitLine for all involved lines. You will need to use an OPEN [[ACS]] script with the [[SetLineSpecial]] and [[SetLineActivation]] if you want lines with Polyobj_ExplicitLine to have in-game activation effects. In Eternity, a polyobject can have any number of one-sided and two-sided lines.&lt;br /&gt;
&lt;br /&gt;
As of Eternity 4.06.00, the following improvements have been made to 2-sided lines belonging to polyobjects:&lt;br /&gt;
# Passable lines no longer push things standing in their way, if they can just move into them (normally in Hexen they would push). Pushing will only happen on the category of solid things affected by the specific blocking type (monsters, players or both)&lt;br /&gt;
# Textures will retain their initial Y offset when the line moves across different sector elevations. Previously in Hexen they would always make sure the Y offset agrees to the current sectors where they&#039;re located.&lt;br /&gt;
# No more collision detection influenced by the source control sector. Previously in Hexen you would need to match the height of the control sector with the one of the game sector. Normally this wasn&#039;t an issue, because of the subsector restriction, which no longer exists in Eternity.&lt;br /&gt;
# 3DMidTex lines now work properly and as expected. You can use them as horizontal moving platforms.&lt;br /&gt;
# Impassable 2-sided lines also behave as transporters to things above if moving below sector portals.&lt;br /&gt;
&lt;br /&gt;
[[category:Editing reference]]&lt;/div&gt;</summary>
		<author><name>Printz</name></author>
	</entry>
	<entry>
		<id>https://eternity.youfailit.net/index.php?title=ExtraData&amp;diff=6553</id>
		<title>ExtraData</title>
		<link rel="alternate" type="text/html" href="https://eternity.youfailit.net/index.php?title=ExtraData&amp;diff=6553"/>
		<updated>2026-06-14T13:56:07Z</updated>

		<summary type="html">&lt;p&gt;Printz: /* extflags */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;With support of [[Universal Doom Map Format]] in releases of Eternity, ExtraData is now considered {{Deprecated}}. In the future new features introduced into UDMF will not be supported by ExtraData. ExtraData maps will still work, but new projects should use UDMF due to its greatly streamlined mapping experience, especially if using editors such as [https://www.doomworld.com/forum/topic/96943 Doom Builder X] or [https://forum.zdoom.org/viewtopic.php?t=54957 GZDoomBuilder-Bugfix] are used (the former including specific improvements for Eternity&#039;s UDMF, such as for [[linked portals]]).&lt;br /&gt;
&lt;br /&gt;
ExtraData is a new data specification language for the [[Eternity Engine]] that allows arbitrary extension of mapthings, lines, and sectors with any number of new fields, with data provided in more or less any format. The use of a textual input language forever removes any future problems caused by binary format limitations. The ExtraData parser is based on the libConfuse configuration file parser library by Martin Hedenfalk, which is also used by GFS and EDF. &lt;br /&gt;
&lt;br /&gt;
Each section in this document deals with one of the ExtraData constructs, as well as how to embed ExtraData in a WAD and how to associate it with a given map.&lt;br /&gt;
{{Backto|Eternity Engine}}&lt;br /&gt;
{{editref}}&lt;br /&gt;
=General Syntax=&lt;br /&gt;
&#039;&#039;See [[EDF#Syntax|EDF Syntax]], as it is the same.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=Embedding and Associating ExtraData =&lt;br /&gt;
&lt;br /&gt;
ExtraData is embedded directly as a text script into a lump of any name. This can be done with any number of wad file management tools, such as SLumpEd, SLADE 3, or XWE. &lt;br /&gt;
&lt;br /&gt;
An ExtraData script is associated with a map via use of the [[MapInfo]] variable &#039;&#039;&#039;extradata&#039;&#039;&#039;. A map can only have one ExtraData script, but it is possible for multiple maps to share the same script. &lt;br /&gt;
&lt;br /&gt;
Example of ExtraData specification via EMAPINFO: &lt;br /&gt;
   [MAP01]&lt;br /&gt;
   extradata = EDLUMP01&lt;br /&gt;
&lt;br /&gt;
=Mapthings =&lt;br /&gt;
&lt;br /&gt;
Mapthings define monsters, lamps, control points, items, etc -- anything that is spawned on the map at level start. &lt;br /&gt;
&lt;br /&gt;
Each field in the mapthing definition, with the exception of the &#039;&#039;&#039;recordnum&#039;&#039;&#039; field, is optional. If a field is not provided, it takes on the default value indicated below the syntax information. Fields may also be provided in any order. &lt;br /&gt;
&lt;br /&gt;
Note that the order of mapthing definitions in ExtraData is not important. The &#039;&#039;&#039;recordnum&#039;&#039;&#039; field serves to identify mapthing records. &lt;br /&gt;
&lt;br /&gt;
==Creating ExtraData Control Objects ==&lt;br /&gt;
&lt;br /&gt;
Mapthing records in ExtraData are only associated with a special control object that must be placed on the map in the usual manner. &lt;br /&gt;
&lt;br /&gt;
The ExtraData control object has a &#039;&#039;&#039;doomednum&#039;&#039;&#039; of 5004. Each control object specifies its corresponding ExtraData mapthing record number as an integer value in its mapthing &#039;&#039;&#039;options&#039;&#039;&#039; field. If your editor does not allow entering arbitrary values into the options field of mapthings, you will need to use the BOOM command-line editor, CLED. As of the initial writing time of this document, both DETH and Doom Builder support entering arbitrary integer values for the options field. Check your editor&#039;s documentation or user interface to verify if it supports this. &lt;br /&gt;
&lt;br /&gt;
The x, y, and angle fields of the ExtraData control object are passed on to the thing which will be spawned at the control point&#039;s location, so those fields of the control object should be set normally. The true type and options fields of the thing to be spawned, along with any extended fields, are specified in the ExtraData record. &lt;br /&gt;
&lt;br /&gt;
Any number of ExtraData control objects can reference the same ExtraData record. In the event that a control object references a non-existent ExtraData record, the ExtraData script for a level is missing, or the thing type referenced by an ExtraData record isn&#039;t valid, an [[Unknown]] thing will be spawned at the control point&#039;s location.  Note that you cannot spawn ExtraData control objects using ExtraData. Attempting this will also result in an Unknown thing. &lt;br /&gt;
&lt;br /&gt;
==Mapthing Syntax and Fields ==&lt;br /&gt;
&lt;br /&gt;
The syntax of the ExtraData mapthing record is as follows. Remember that all fields except the &#039;&#039;&#039;recordnum&#039;&#039;&#039; field are optional and can be specified in any order. &lt;br /&gt;
 mapthing&lt;br /&gt;
 {&lt;br /&gt;
   recordnum &amp;lt;unique number&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
   // These fields are normal mapthing fields&lt;br /&gt;
   type      &amp;lt;doomednum&amp;gt; OR &amp;lt;EDF thingtype mnemonic&amp;gt;&lt;br /&gt;
   options   &amp;lt;options flag list&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
   // These fields are ExtraData extensions&lt;br /&gt;
   tid       &amp;lt;number&amp;gt;&lt;br /&gt;
   special   &amp;lt;number&amp;gt;&lt;br /&gt;
   args      { &amp;lt;special field&amp;gt;, ... }&lt;br /&gt;
   height    &amp;lt;number&amp;gt;&lt;br /&gt;
 }&lt;br /&gt;
===Explanation of fields:=== &lt;br /&gt;
====recordnum====&lt;br /&gt;
The recordnum serves to identify this record, and is the number which ExtraData control objects must use to associate themselves with a mapthing record. Every ExtraData mapthing record must have a unique record number. If a duplicate record number is detected, the engine will currently exit with an error message. The record number is limited to values between 0 and 65535 inclusive. Some editors may only allow input of numbers up to 32767 in the mapthing options field, or may treat values above 32767 as negative numbers. Beware of this. &lt;br /&gt;
&lt;br /&gt;
====type====&lt;br /&gt;
Default: No meaningful default value; an Unknown thing will be spawned if not valid.&lt;br /&gt;
&lt;br /&gt;
This field specifies the type of object to spawn at the location and angle of ExtraData control objects using this record. This field can accept one of two types of values. The first is a normal thingtype doomednum as specified via [[EDF]] and used by all editors. For example, the DOOM Imp&#039;s doomednum is 3001. &lt;br /&gt;
&lt;br /&gt;
This field can also accept EDF thingtype mnemonics. EDF thingtype mnemonics must be prefixed with &#039;&#039;thing:&#039;&#039; -- this allows the parser to know it is dealing with a string instead of a number. EDF thingtypes must have a unique doomednum to be specified in an ExtraData mapthing record. If the specified EDF thingtype doesn&#039;t exist or has a doomednum of -1, an Unknown object will be spawned instead. &lt;br /&gt;
&lt;br /&gt;
See [[Thing types]] for a list of potentially useful types, new to Eternity, to use here.&lt;br /&gt;
&lt;br /&gt;
Example: &lt;br /&gt;
    mapthing { type 3001 }          // This record specifies an Imp via its doomednum&lt;br /&gt;
    &lt;br /&gt;
    mapthing { type DoomImp } // This record specifies an Imp by its EDF mnemonic&lt;br /&gt;
&lt;br /&gt;
====options====&lt;br /&gt;
Default: No flags are set by default. &lt;br /&gt;
&lt;br /&gt;
This field specifies the options (also known as mapthing flags). This field uses the same syntax as BEX/EDF flag strings, but the syntax will be reviewed here for completeness. &lt;br /&gt;
&lt;br /&gt;
A BEX flag list is a string of flag names separated by whitespace, pipe characters, commas, or plus characters. In ExtraData, if a flag list contains whitespace, commas, or plus signs, it must be enclosed in double or single quotations. Flags are combined using bitwise-OR logic, so a flag name can be specified more than once. Specifying a flag name causes that flag to be turned on. The default state of all flags is off. &lt;br /&gt;
&lt;br /&gt;
These are the flag values which are available for this field: &lt;br /&gt;
    Flag name   Meaning&lt;br /&gt;
    ------------------------------------------------------------------------------&lt;br /&gt;
    EASY        Thing appears in easy difficulties&lt;br /&gt;
    NORMAL      Thing appears in &amp;quot;Hurt Me Plenty&amp;quot;&lt;br /&gt;
    HARD        Thing appears in Ultra-Violence and Nightmare&lt;br /&gt;
    AMBUSH      Thing is &amp;quot;deaf&amp;quot;, will not wake up via sound&lt;br /&gt;
    NOTSINGLE   Thing doesn&#039;t appear in single-player mode&lt;br /&gt;
    NOTDM       Thing doesn&#039;t appear in deathmatch&lt;br /&gt;
    NOTCOOP     Thing doesn&#039;t appear in cooperative multiplayer&lt;br /&gt;
    FRIEND      Thing uses MBF friendly logic&lt;br /&gt;
    DORMANT     Thing is dormant at map startup (script feature)&lt;br /&gt;
    STANDING    Currently only used for [[Thing_types#Sector_actions|sector actions]].&lt;br /&gt;
    ------------------------------------------------------------------------------&lt;br /&gt;
    &lt;br /&gt;
The mapthing options value 256 (0x0100) is reserved. If this bit is set, all BOOM, MBF, and Eternity extended mapthing bits will be cleared. This is to guard against editors like Hellmaker which set all bits they do not understand, instead of leaving them zero. &lt;br /&gt;
&lt;br /&gt;
Example options fields -- All of these are equivalent: &lt;br /&gt;
    // This is the only syntax that does not require quotations.&lt;br /&gt;
    &lt;br /&gt;
    mapthing { options EASY|NORMAL|HARD }&lt;br /&gt;
    &lt;br /&gt;
    // All of these syntaxes must be quoted, because unquoted strings in &lt;br /&gt;
    // ExtraData cannot contain spaces, commas, or plus signs.&lt;br /&gt;
    &lt;br /&gt;
    mapthing { options &amp;quot;EASY NORMAL HARD&amp;quot; }&lt;br /&gt;
    mapthing { options &amp;quot;EASY | NORMAL | HARD&amp;quot; }&lt;br /&gt;
    mapthing { options &amp;quot;EASY+NORMAL+HARD&amp;quot; }&lt;br /&gt;
    mapthing { options &amp;quot;EASY + NORMAL + HARD&amp;quot; }&lt;br /&gt;
    mapthing { options &amp;quot;EASY,NORMAL,HARD&amp;quot; }&lt;br /&gt;
    mapthing { options &amp;quot;EASY, NORMAL, HARD&amp;quot; }&lt;br /&gt;
&lt;br /&gt;
====tid====&lt;br /&gt;
Default: 0 &lt;br /&gt;
&lt;br /&gt;
The TID, or &amp;quot;Thing ID&amp;quot;, is a tag for mapthings which is used for identification in [[ACS]] scripts. TID values must be positive numbers between 1 and 65535. The TID value zero means no TID. Negative TID values are reserved and are used to indicate special things within the engine. TIDs are not required to be unique, and most ACS functions that accept TIDs will perform an action on all mapthings which bear the same TID.&lt;br /&gt;
&lt;br /&gt;
====special====&lt;br /&gt;
Default: 0&lt;br /&gt;
&lt;br /&gt;
The thing special field, which will execute when thing dies if it&#039;s a monster or picked up if it&#039;s an item. Use &#039;&#039;&#039;args&#039;&#039;&#039; to control the parameters.&lt;br /&gt;
&lt;br /&gt;
====args====&lt;br /&gt;
Default: All args values default to zero. &lt;br /&gt;
&lt;br /&gt;
The args field is a list of up to five special values which can have a broad range of meanings. Any values not provided in the args list will default, and if more than five values are provided, only the first five will be used. Currently, all args values are interpreted as integers (a non-number string evaluates to zero). This may change in the future. &lt;br /&gt;
&lt;br /&gt;
Example args list: &lt;br /&gt;
    mapthing { args { 0, 1, 2, 3, 4 } }&lt;br /&gt;
    &lt;br /&gt;
====height====&lt;br /&gt;
Default: 0 &lt;br /&gt;
&lt;br /&gt;
For normal objects, this field indicates a distance above the floor that the thing will spawn at level start. For objects with the SPAWNCEILING flag, this field indicates a distance below the ceiling instead. This field will have no effect on objects which spawn at a randomized height.&lt;br /&gt;
&lt;br /&gt;
=Linedefs =&lt;br /&gt;
&lt;br /&gt;
Linedefs define walls, two-sided textures, and provide action triggers within maps. &lt;br /&gt;
&lt;br /&gt;
Each field in the linedef definition, with the exception of the &#039;&#039;&#039;recordnum&#039;&#039;&#039; field, is optional. If a field is not provided, it takes on the default value indicated below the syntax information. Fields may also be provided in any order. &lt;br /&gt;
&lt;br /&gt;
Note that the order of linedef definitions in ExtraData is not important. The &#039;&#039;&#039;recordnum&#039;&#039;&#039; field serves to identify linedef records. &lt;br /&gt;
&lt;br /&gt;
==Creating ExtraData Linedefs ==&lt;br /&gt;
&lt;br /&gt;
Linedef records in ExtraData are associated either with lines which bear the ExtraData Control Line Special (270), or with any linedef in a DOOM-format map which uses a parameterized line special. You can place the 270 special, as well as parameterized special numbers, into the normal &amp;quot;special&amp;quot; field of a line using virtually any map editor. Editors with Eternity-specific configurations should support these specials natively.&lt;br /&gt;
&lt;br /&gt;
Each control linedef (or directly-used parameterized special) specifies its corresponding ExtraData linedef record number as an integer value in its linedef tag field. If your editor does not allow entering arbitrary values up to 32767 into the tag field of linedefs, you will need to use the BOOM command-line editor, CLED. As of the initial writing time of this document, both DETH and Doom Builder support entering arbitrary integer values for the tag field. Check your editor&#039;s documentation or user interface to verify if it supports this. &lt;br /&gt;
&lt;br /&gt;
The flags, sidedefs, textures, and location of the ExtraData control linedef are used normally by the line and cannot be altered from within ExtraData. The true special (if 270 is used) and tag fields of the linedef, along with any extended fields, are specified in the ExtraData record which the control linedef references. &lt;br /&gt;
&lt;br /&gt;
Any number of linedefs can reference the same ExtraData record. In the event that a control linedef references a non-existent ExtraData record or the ExtraData script for a level is missing, the special and tag of the ExtraData control linedef will both be set to zero. &lt;br /&gt;
&lt;br /&gt;
==Linedef Syntax and Fields ==&lt;br /&gt;
&lt;br /&gt;
The syntax of the ExtraData linedef record is as follows. Remember that all fields except the &#039;&#039;&#039;recordnum&#039;&#039;&#039; field are optional and can be specified in any order. &lt;br /&gt;
 linedef&lt;br /&gt;
 {&lt;br /&gt;
   recordnum &amp;lt;unique number&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
   // These fields are normal linedef fields&lt;br /&gt;
   special &amp;lt;number&amp;gt; OR &amp;lt;special name&amp;gt;&lt;br /&gt;
   tag &amp;lt;number&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
   // These fields are ExtraData extensions&lt;br /&gt;
   extflags &amp;lt;extended line flags list&amp;gt;&lt;br /&gt;
   args { &amp;lt;special field&amp;gt;, ... }&lt;br /&gt;
   id &amp;lt;number&amp;gt;&lt;br /&gt;
   alpha &amp;lt;number&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
   portalid &amp;lt;number&amp;gt;&lt;br /&gt;
 }&lt;br /&gt;
===Explanation of fields: ===&lt;br /&gt;
====recordnum====&lt;br /&gt;
The recordnum serves to identify this record, and is the number which ExtraData control linedefs must use to associate themselves with a linedef record. Every ExtraData linedef record must have a unique record number. If a duplicate record number is detected, the engine will currently exit with an error message. The record number is limited to values between 0 and 32767 inclusive. Some editors may only allow input of numbers up to 255 in the linedef tag field. Beware of this. &lt;br /&gt;
&lt;br /&gt;
====special====&lt;br /&gt;
:&#039;&#039;Default: 0 &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The special field determines what [[Linedef_types|type of action]] may be taken when a line is crossed, used, shot, etc. There are three types of linedef specials in Eternity: normal, generalized, and parameterized. Parameterized specials use the &#039;&#039;&#039;args&#039;&#039;&#039; field documented below to provide complete customization of line actions. &lt;br /&gt;
&lt;br /&gt;
This field can accept numbers for any special type, including generalized and parameterized, but it can also accept special names for parameterized line types. See the [[Detailed parameterized linedef specification]] for a complete list of the available names.&lt;br /&gt;
&lt;br /&gt;
====tag====&lt;br /&gt;
:&#039;&#039;Default: 0 &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The tag of the linedef, used by DOOM-style line specials and sector effects.&lt;br /&gt;
&lt;br /&gt;
====extflags====&lt;br /&gt;
:&#039;&#039;Default: No flags are set by default. &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
This field specifies extended linedef flag values which impact the functionality of parameterized linedef specials. This field uses the same syntax as BEX/EDF flag strings, but the syntax will be reviewed here for completeness. &lt;br /&gt;
&lt;br /&gt;
A BEX flag list is a string of flag names separated by whitespace, pipe characters, commas, or plus characters. In ExtraData, if a flag list contains whitespace, commas, or plus signs, it must be enclosed in double or single quotations. Flags are combined using bitwise-OR logic, so a flag name can be specified more than once. Specifying a flag name causes that flag to be turned on. The default state of all flags is off. &lt;br /&gt;
&lt;br /&gt;
These are the flag values which are available for this field: &lt;br /&gt;
    Flag name   Meaning&lt;br /&gt;
    ---------------------------------------------------------------------------------------&lt;br /&gt;
    CROSS         Linedef can be activated by being crossed.&lt;br /&gt;
    USE           Linedef can be activated by being used.&lt;br /&gt;
    IMPACT        Linedef can be activated by being shot.&lt;br /&gt;
    PUSH          Linedef can be activated by being pushed.&lt;br /&gt;
    PLAYER        Linedef can be activated by players.&lt;br /&gt;
    MONSTER       Linedef can be activated by objects with SPACMONSTER flag.&lt;br /&gt;
    MISSILE       Linedef can be activated by objects with SPACMISSILE flag.&lt;br /&gt;
    POLYOBJECT    Linedef can be activated by polyobjects (only works with CROSS)&lt;br /&gt;
    REPEAT        Linedef action is repeatable.&lt;br /&gt;
    1SONLY        Linedef can only be activated from first side.&lt;br /&gt;
    ADDITIVE      Linedef&#039;s midtexture is drawn with additive blending.&lt;br /&gt;
    BLOCKALL      Linedef will block everything that can be clipped.&lt;br /&gt;
    ZONEBOUNDARY  Linedef will work as a reverb effect boundary. Not needed for one-sided lines.&lt;br /&gt;
    CLIPMIDTEX    Linedef middle texture will not &amp;quot;bleed&amp;quot; on floor and ceiling.&lt;br /&gt;
    WRAPMIDTEX    Linedef middle texture of two-sided is repeated vertically instead of being drawn only once.&lt;br /&gt;
    LOWERPORTAL   Linedef copies floor portal from its backside to its lower visible edge&lt;br /&gt;
    UPPERPORTAL   Linedef copies ceiling portal from its backside to its upper visible edge&lt;br /&gt;
    ---------------------------------------------------------------------------------------&lt;br /&gt;
    &lt;br /&gt;
Notes: IMPACT is currently only implemented for bullet weapons.&lt;br /&gt;
&lt;br /&gt;
LOWERPORTAL and UPPERPORTAL are used to enable portals on the front side&#039;s upper and/or lower edges of a linedef, if the sector in front of the linedef is tall enough compared to the back sector to expose them. It is the only way to enable such portals, which will copy the sector portal(s) from the backside, if any.&lt;br /&gt;
&lt;br /&gt;
Example flags fields -- All of these are equivalent: &lt;br /&gt;
    // This is the only syntax that does not require quotations.&lt;br /&gt;
    &lt;br /&gt;
    linedef { extflags CROSS|PLAYER|MISSILE|REPEAT }&lt;br /&gt;
    &lt;br /&gt;
    // All of these syntaxes must be quoted, because unquoted strings in &lt;br /&gt;
    // ExtraData cannot contain spaces, commas, or plus signs.&lt;br /&gt;
    &lt;br /&gt;
    linedef { extflags &amp;quot;CROSS PLAYER MISSILE REPEAT&amp;quot; }&lt;br /&gt;
    linedef { extflags &amp;quot;CROSS | PLAYER | MISSILE | REPEAT&amp;quot; }&lt;br /&gt;
    linedef { extflags &amp;quot;CROSS+PLAYER+MISSILE+REPEAT&amp;quot; }&lt;br /&gt;
    linedef { extflags &amp;quot;CROSS + PLAYER + MISSILE + REPEAT&amp;quot; }&lt;br /&gt;
    linedef { extflags &amp;quot;CROSS,PLAYER,MISSILE,REPEAT&amp;quot; }&lt;br /&gt;
    linedef { extflags &amp;quot;CROSS, PLAYER, MISSILE, REPEAT&amp;quot; }&lt;br /&gt;
&lt;br /&gt;
====args====&lt;br /&gt;
:&#039;&#039;Default: All args values default to zero. &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The args field is a list of up to five special values which can have a broad range of meanings. Any values not provided in the args list will default, and if more than five values are provided, only the first five will be used. Currently, all args values are interpreted as integers (a non-number string evaluates to zero). This may change in the future. The args list is used by parameterized linedef specials. &lt;br /&gt;
&lt;br /&gt;
Example args list: &lt;br /&gt;
    linedef { args { 0, 1, 2, 3, 4 } }&lt;br /&gt;
&lt;br /&gt;
====id====&lt;br /&gt;
:&#039;&#039;Default: 0&#039;&#039;&lt;br /&gt;
This field is equivalent to &#039;&#039;&#039;tag&#039;&#039;&#039;. It will only have effect if &#039;&#039;&#039;tag&#039;&#039;&#039; is not already set.&lt;br /&gt;
&lt;br /&gt;
====alpha====&lt;br /&gt;
:&#039;&#039;Default: Alpha defaults to 1.0.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The alpha field takes a value from 0.0 to 1.0 to set the opacity at which this linedef&#039;s midtexture is drawn. When combined with the ADDITIVE extflag, this can be used for additive-blended translucency as well.&lt;br /&gt;
&lt;br /&gt;
====portalid====&lt;br /&gt;
:&#039;&#039;Default: none&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Portal ID to apply on front side middle part, as defined from [[Portal_Define]].&lt;br /&gt;
&lt;br /&gt;
=Sectors=&lt;br /&gt;
&lt;br /&gt;
Sectors define distinct areas of the map that are bordered by linedefs, with floor and ceiling properties, lighting data, and specials. &lt;br /&gt;
&lt;br /&gt;
Each field in the sector definition, with the exception of the &#039;&#039;&#039;recordnum&#039;&#039;&#039; field, is optional. If a field is not provided, it takes on the default value indicated below the syntax information. Fields may also be provided in any order. &lt;br /&gt;
&lt;br /&gt;
Note that the order of sector definitions in ExtraData is not important. The &#039;&#039;&#039;recordnum&#039;&#039;&#039; field serves to identify sector records. &lt;br /&gt;
&lt;br /&gt;
==Creating ExtraData Sectors==&lt;br /&gt;
&lt;br /&gt;
Sector records in ExtraData are associated with lines which bear the ExtraData Sector Control Special (401). The linedef&#039;s front side sector is the map sector that will receive properties from the ExtraData record which is specified by number in the linedef&#039;s tag.&lt;br /&gt;
&lt;br /&gt;
Since ExtraData is attached to sectors via linedefs and not through overriding any of the sectors&#039; native fields, you specify all of the normal data for a sector in the map itself, and overriding that data through ExtraData sector records is not supported.&lt;br /&gt;
&lt;br /&gt;
Any number of linedefs can reference the same ExtraData sector record. In the event that a control linedef references a non-existent ExtraData record or the ExtraData script for a level is missing, the tag of the ExtraData sector control linedef will be set to zero and will otherwise be ignored.&lt;br /&gt;
&lt;br /&gt;
==Sector Syntax and Fields ==&lt;br /&gt;
&lt;br /&gt;
The syntax of the ExtraData sector record is as follows. Remember that all fields except the &#039;&#039;&#039;recordnum&#039;&#039;&#039; field are optional and can be specified in any order. &lt;br /&gt;
 sector&lt;br /&gt;
 {&lt;br /&gt;
   recordnum &amp;lt;unique number&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
   // These fields are ExtraData extensions to sector data&lt;br /&gt;
   flags &amp;lt;sector flag list&amp;gt;&lt;br /&gt;
   flags.add &amp;lt;sector flag list&amp;gt;&lt;br /&gt;
   flags.remove &amp;lt;sector flag list&amp;gt;&lt;br /&gt;
   damage &amp;lt;integer&amp;gt;&lt;br /&gt;
   damagemask &amp;lt;integer&amp;gt;&lt;br /&gt;
   damagemod &amp;lt;method of damage type&amp;gt;&lt;br /&gt;
   damageflags &amp;lt;sector damage flags list&amp;gt;&lt;br /&gt;
   damageflags.add &amp;lt;sector damage flags list&amp;gt;&lt;br /&gt;
   damageflags.remove &amp;lt;sector damage flags list&amp;gt;&lt;br /&gt;
   floorterrain &amp;lt;terrain name&amp;gt;&lt;br /&gt;
   floorangle &amp;lt;float&amp;gt;  &lt;br /&gt;
   flooroffsetx &amp;lt;float&amp;gt;&lt;br /&gt;
   flooroffsety &amp;lt;float&amp;gt;&lt;br /&gt;
   floorscalex &amp;lt;float&amp;gt;&lt;br /&gt;
   floorscaley &amp;lt;float&amp;gt;&lt;br /&gt;
   ceilingterrain &amp;lt;terrain name&amp;gt;&lt;br /&gt;
   ceilingangle &amp;lt;float&amp;gt;&lt;br /&gt;
   ceilingoffsetx &amp;lt;float&amp;gt;&lt;br /&gt;
   ceilingoffsety &amp;lt;float&amp;gt;&lt;br /&gt;
   ceilingscalex &amp;lt;float&amp;gt;&lt;br /&gt;
   ceilingscaley &amp;lt;float&amp;gt;&lt;br /&gt;
   colormaptop &amp;lt;lump name&amp;gt;&lt;br /&gt;
   colormapmid &amp;lt;lump name&amp;gt;&lt;br /&gt;
   colormapbottom &amp;lt;lump name&amp;gt;&lt;br /&gt;
   portalflags.floor &amp;lt;portal flags list&amp;gt;&lt;br /&gt;
   portalflags.ceiling &amp;lt;portal flags list&amp;gt;&lt;br /&gt;
   overlayalpha.floor &amp;lt;percentage or value from 0 to 255&amp;gt;&lt;br /&gt;
   overlayalpha.ceiling &amp;lt;percentage or value from 0 to 255&amp;gt;&lt;br /&gt;
   portalid.floor &amp;lt;number&amp;gt;&lt;br /&gt;
   portalid.ceiling &amp;lt;number&amp;gt;&lt;br /&gt;
 }&lt;br /&gt;
===Explanation of fields: ===&lt;br /&gt;
====recordnum====&lt;br /&gt;
The recordnum serves to identify this record, and is the number which ExtraData sector control linedefs must use to associate themselves with a sector record. Every ExtraData sector record must have a unique record number. If a duplicate record number is detected, the engine will currently exit with an error message. The record number is limited to values between 0 and 32767 inclusive. Some editors may only allow input of numbers up to 255 in the linedef tag field. Beware of this. &lt;br /&gt;
&lt;br /&gt;
====flags====&lt;br /&gt;
:&#039;&#039;Default: No flags are set by default. &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
This field specifies sector flag values which specify various properties of sectors. This field uses the same syntax as BEX/EDF flag strings. &lt;br /&gt;
&lt;br /&gt;
These are the flag values which are available for this field: &lt;br /&gt;
&lt;br /&gt;
    Flag name     Meaning&lt;br /&gt;
    ---------------------------------------------------------------------------------------&lt;br /&gt;
    SECRET        Sector is secret&lt;br /&gt;
    FRICTION      Sector has friction enabled, if targeted by a BOOM friction transfer line&lt;br /&gt;
    PUSH          Sector has BOOM push effects enabled&lt;br /&gt;
    KILLSOUND     Objects in sector cannot make sounds.&lt;br /&gt;
    KILLMOVESOUND Sector makes no movement sounds, even if it has a special sound sequence&lt;br /&gt;
    PHASEDLIGHT   Sector is phased light sequence start&lt;br /&gt;
    LIGHTSEQUENCE Sector is phased light sequence step (alternates with below flag)&lt;br /&gt;
    LIGHTSEQALT   Sector is phased light sequence alternate step (alternates with above flag)&lt;br /&gt;
    ---------------------------------------------------------------------------------------&lt;br /&gt;
    &lt;br /&gt;
Example flags fields -- All of these are equivalent: &lt;br /&gt;
    // This is the only syntax that does not require quotations.&lt;br /&gt;
    &lt;br /&gt;
    sector { flags SECRET|FRICTION|KILLMOVESOUND }&lt;br /&gt;
    &lt;br /&gt;
    // All of these syntaxes must be quoted, because unquoted strings in &lt;br /&gt;
    // ExtraData cannot contain spaces, commas, or plus signs.&lt;br /&gt;
    &lt;br /&gt;
    sector { flags &amp;quot;SECRET FRICTION KILLMOVESOUND&amp;quot; }&lt;br /&gt;
    sector { flags &amp;quot;SECRET | FRICTION | KILLMOVESOUND&amp;quot; }&lt;br /&gt;
    sector { flags &amp;quot;SECRET+FRICTION+KILLMOVESOUND&amp;quot; }&lt;br /&gt;
    sector { flags &amp;quot;SECRET + FRICTION + KILLMOVESOUND&amp;quot; }&lt;br /&gt;
    sector { flags &amp;quot;SECRET,FRICTION,KILLMOVESOUND&amp;quot; }&lt;br /&gt;
    sector { flags &amp;quot;SECRET, FRICTION, KILLMOVESOUND&amp;quot; }&lt;br /&gt;
&lt;br /&gt;
====flags.add====&lt;br /&gt;
:&#039;&#039;Default: No flags are set by default. &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
This is a list of sector flags to add to the sector. This is supported because some sector specials (such as sector special 9, &amp;quot;Secret&amp;quot;) imply that certain sector flags will be set on the sector before ExtraData is applied. If you wish to only add flags and not override any that may have been set by sector specials, use this field to specify only the flags that you wish to be added to the sector.&lt;br /&gt;
&lt;br /&gt;
====flags.remove====&lt;br /&gt;
:&#039;&#039;Default: No flags are set by default. &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
This is a list of sector flags to remove from the sector. If you wish to only remove flags and not override any that may have been set by sector specials, use this field to specify only the flags that you wish to be removed from the sector.&lt;br /&gt;
&lt;br /&gt;
====damage====&lt;br /&gt;
:&#039;&#039;Default: 0&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Specifies the amount of damage this sector does to players if the players are standing inside the sector and do not meet any special exemption criteria, such as wearing a Radiation Suit. This amount is done at each damage opportunity, which is determined by the &#039;&#039;&#039;damagemask&#039;&#039;&#039; field.&lt;br /&gt;
&lt;br /&gt;
====damagemask====&lt;br /&gt;
:&#039;&#039;Default: 0&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Specifies the interval in gametics between damage opportunities for a player standing in this sector. The default value of 0 will cause the sector to do constant and instantaneous damage every gametic. Setting this value to an integer greater than 0 will cause damage to be done every Nth gametic, with N being the value of this field. The default DOOM nukage types all use a damagemask of 32, which is roughly once per in-game second (there are 35 gametics per second).&lt;br /&gt;
&lt;br /&gt;
====damagemod====&lt;br /&gt;
:&#039;&#039;Default: &amp;quot;Unknown&amp;quot;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Specifies the type of damage done by this sector. If &amp;quot;Unknown&amp;quot; is specified, the damage done is generic. The value specified should be a valid EDF damagetype mnemonic. If it is not, &amp;quot;Unknown&amp;quot; will be used. This can be used to have a sector type trigger special pain and death states when it deals damage. For example, you can use &#039;&#039;&#039;slime&#039;&#039;&#039; or &#039;&#039;&#039;lava&#039;&#039;&#039; damagemod.&lt;br /&gt;
&lt;br /&gt;
====damageflags====&lt;br /&gt;
:&#039;&#039;Default: No flags are set by default.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
This field specifies sector damage flag values which affect the manner in which a sector does damage. This field uses the same syntax as BEX/EDF flag strings. &lt;br /&gt;
&lt;br /&gt;
These are the flag values which are available for this field: &lt;br /&gt;
&lt;br /&gt;
    Flag name     Meaning&lt;br /&gt;
    ---------------------------------------------------------------------------------------&lt;br /&gt;
    LEAKYSUIT     The player may take damage at random even if he has the radsuit powerup&lt;br /&gt;
    IGNORESUIT    Radiation suit powerups are ignored entirely&lt;br /&gt;
    ENDGODMODE    God mode will be disabled when the player enters this sector&lt;br /&gt;
    EXITLEVEL     The player will exit if has &amp;lt; 11 health and this sector tries to do damage&lt;br /&gt;
    TERRAINHIT    A TerrainTypes hit will occur when this sector does damage&lt;br /&gt;
    ---------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
====damageflags.add====&lt;br /&gt;
:&#039;&#039;Default: No flags are set by default.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Because some sector types imply the activation of various sector damageflags (for example, DOOM sector type 11 sets sector damageflags ENDGODMODE and EXITLEVEL), this field is supported to add additional damageflags to any that may have been set by the  map itself. Simply specify whatever flags you wish to have added to those that are already set.&lt;br /&gt;
&lt;br /&gt;
====damageflags.remove====&lt;br /&gt;
:&#039;&#039;Default: No flags are set by default.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
As with damageflags.add, it may be desirable to turn off some flags that were set by sector specials or other portions of the map data. Use this field to specify any sector damage flags you want to remove from sectors.&lt;br /&gt;
&lt;br /&gt;
====floorterrain====&lt;br /&gt;
:&#039;&#039;Default: &amp;quot;@flat&amp;quot;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Specifies an EDF TerrainTypes mnemonic for the type of terrain this sector should exhibit on its floor. If left to default or specified with an invalid name, the terrain of the sector will be determined by its floorpic as usual.&lt;br /&gt;
&lt;br /&gt;
====floorangle====&lt;br /&gt;
:&#039;&#039;Default: 0 (East, or upper edge to the north)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Specifies the angle of the floor flat in floating-point degrees from 0 to 359. Note that for compatibility with ZDoom, the angle specified advances in a &#039;&#039;&#039;clockwise&#039;&#039;&#039; fashion, contrary to most other angles in the DOOM engine.&lt;br /&gt;
&lt;br /&gt;
====flooroffsetx/flooroffsety====&lt;br /&gt;
:&#039;&#039;Default: 0&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Specifies the x and y offsets of the floor flat, relative to the normal floor grid, in floating point units.&lt;br /&gt;
&lt;br /&gt;
====floorscalex/floorscaley====&lt;br /&gt;
:&#039;&#039;Default: 1.0&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Specifies the x and y offsets of the floor flat. A higher number means a smaller texture.&lt;br /&gt;
&lt;br /&gt;
====ceilingterrain====&lt;br /&gt;
:&#039;&#039;Default: &amp;quot;@flat&amp;quot;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Specifies an EDF TerrainTypes mnemonic for the type of terrain this sector should exhibit on its ceiling. If left to default or specified with an invalid name, the terrain of the sector will be determined by its floorpic as usual. This currently only affects the behavior of bullet puffs when particles are enabled.&lt;br /&gt;
&lt;br /&gt;
====ceilingangle====&lt;br /&gt;
:&#039;&#039;Default: 0 (East, or upper edge to the north)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Specifies the angle of the ceiling flat in floating-point degrees from 0 to 359. Note that for compatibility with ZDoom, the angle specified advances in a &#039;&#039;&#039;clockwise&#039;&#039;&#039; fashion, contrary to most other angles in the DOOM engine.&lt;br /&gt;
&lt;br /&gt;
====ceilingoffsetx/ceilingoffsety====&lt;br /&gt;
:&#039;&#039;Default: 0&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Specifies the x and y offsets of the ceiling flat, relative to the normal ceiling grid, in floating point units.&lt;br /&gt;
&lt;br /&gt;
====ceilingscalex/ceilingscaley====&lt;br /&gt;
:&#039;&#039;Default: 1.0&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Specifies the x and y offsets of the ceiling flat. A higher number means a smaller texture.&lt;br /&gt;
&lt;br /&gt;
====colormaptop====&lt;br /&gt;
:&#039;&#039;Default: &amp;quot;@default&amp;quot;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Specifies the colormap lump to use when a player&#039;s viewpoint is above the fake ceiling of a BOOM 242 &amp;quot;deep water&amp;quot; effect applying to this sector. If left to default, the global colormap from MapInfo will be used as normal, unless one is specified by the 242 effect.&lt;br /&gt;
&lt;br /&gt;
====colormapmid====&lt;br /&gt;
:&#039;&#039;Default: &amp;quot;@default&amp;quot;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Specifies the colormap lump to use when a player&#039;s viewpoint is between the normal floor and ceiling for an ordinary sector, or between the fake floor and ceiling for a BOOM 242 &amp;quot;deep water&amp;quot; sector. If left to default, the global colormap from MapInfo will be used as normal, unless one is specified by a 242 effect.&lt;br /&gt;
&lt;br /&gt;
====colormapbottom====&lt;br /&gt;
:&#039;&#039;Default: &amp;quot;@default&amp;quot;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Specifies the colormap lump to use when a player&#039;s viewpoint is below the fake floor of a BOOM 242 &amp;quot;deep water&amp;quot; effect applying to this sector. If left to default, the global colormap from MapInfo will be used as normal, unless one is specified by the 242 effect.&lt;br /&gt;
&lt;br /&gt;
====portalflags.floor/portalflags.ceiling====&lt;br /&gt;
:&#039;&#039;Default: No flags are set by default.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
These two fields (portalflags.floor and portalflags.ceiling) specify portal property flag values which affect the rendering and behavior of portals attached to this sector&#039;s surfaces. These fields use the same syntax as BEX/EDF flag strings. &lt;br /&gt;
&lt;br /&gt;
These are the flag values which are available for this field: &lt;br /&gt;
&lt;br /&gt;
    Flag name     Meaning&lt;br /&gt;
    ---------------------------------------------------------------------------------------&lt;br /&gt;
    DISABLED        Portal is completely disabled&lt;br /&gt;
    NORENDER        Portal will not be rendered, but may still be interactive&lt;br /&gt;
    NOPASS          Objects cannot pass through the portal even if it is a linked portal&lt;br /&gt;
    BLOCKSOUND      Sound will not traverse through a linked portal&lt;br /&gt;
    OVERLAY         The portal will render the sector&#039;s flat as a blended overlay&lt;br /&gt;
    ADDITIVE        If OVERLAY is also specified, the overlay will use additive blending&lt;br /&gt;
    USEGLOBALTEX    Reserved for future per-portal texture specification&lt;br /&gt;
    ATTACHEDPORTAL  If a linked portal is on the respective floor or ceiling, move it along &lt;br /&gt;
                    with the surface. Useful for vertically moving platforms.&lt;br /&gt;
    ---------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
====overlayalpha.floor/overlayalpha.ceiling====&lt;br /&gt;
:&#039;&#039;Default&#039;&#039;: 100%&lt;br /&gt;
&lt;br /&gt;
These two fields (overlayalpha.floor and overlayalpha.ceiling) specify the opacity of the corresponding portal overlay, if any exists. You can specify either a percentage value from 0% to 100%, or a plain integer number from 0 to 255. 100%/255 are completely solid, while 0% is invisible.&lt;br /&gt;
&lt;br /&gt;
====portalid.floor/portalid.ceiling====&lt;br /&gt;
:&#039;&#039;Default&#039;&#039;: 0&lt;br /&gt;
&lt;br /&gt;
These two fields control the placement of portals defined by [[Portal_Define]] on the floor or ceiling of this sector. Values can be positive (in which case the direct portal will be used) or negative (in which case the opposite direction portal will be used, &#039;&#039;if&#039;&#039; applicable).&lt;/div&gt;</summary>
		<author><name>Printz</name></author>
	</entry>
	<entry>
		<id>https://eternity.youfailit.net/index.php?title=3DMidTex_tutorial&amp;diff=6552</id>
		<title>3DMidTex tutorial</title>
		<link rel="alternate" type="text/html" href="https://eternity.youfailit.net/index.php?title=3DMidTex_tutorial&amp;diff=6552"/>
		<updated>2026-06-14T13:54:55Z</updated>

		<summary type="html">&lt;p&gt;Printz: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Eternity]] provides the possibility of using the middle textures of linedefs as solid objects that can be walked over or under, and can block map object passage. Monsters can walk across them, and they can even be moved (with the assistance of some linedef specials) to create lifts, doors, anything you like. They are quite useful and easy to implement. &lt;br /&gt;
&lt;br /&gt;
This feature is called [[3DMidTex]], and this tutorial covers the basics of how to use it. Once you are finished with here, you may want to read [[3DMidTex advanced topics]] to learn about the use of 3DMidTex lines with switches, doors, and lifts.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Your first 3D bridge ==&lt;br /&gt;
&lt;br /&gt;
For the purposes of this tutorial, I&#039;ll assume you are familiar with Doom editing and your level editor, and with the use of middle textures. You will need to use an editor that either has support for Eternity features (e.g. [[Doom wiki:Doom Builder|Doom Builder]]) or an editor that allows you to manually change the flags value for linedefs.&lt;br /&gt;
&lt;br /&gt;
First, open up a new Doom 2 level for editing, and create a simple room with a pit running through it.&lt;br /&gt;
&lt;br /&gt;
[[Image:3dmidtex_tut1.jpg]]&lt;br /&gt;
&lt;br /&gt;
(I added cool, ultra-hurty lava to mine)&lt;br /&gt;
&lt;br /&gt;
Now you need to create the structure the player will eventually be able to cross to get to safety. Again, I assume you know how to create two sided lines and place and align middle textures in them.&lt;br /&gt;
&lt;br /&gt;
[[Image:3dmidtex_tut2.jpg]]&lt;br /&gt;
&lt;br /&gt;
If you run this map, the player obviously falls down through your middle texture bridge. So we perform the final step: setting the lindef flag. The flag is 1024 (0x400 in HEX), so if you are editing the flags yourself, just add 1024 to your flag value; if you are using Doom Builder, and you don&#039;t see the lindef flag called &amp;quot;3dMidTex&amp;quot;, press F2 and make sure you are editing your map as an Eternity map. Once your flags are set for your linedefs, run the map, and the player should now be able to cross the bridge as if the middle textures were solid objects.&lt;br /&gt;
&lt;br /&gt;
== Some things to watch out for ==&lt;br /&gt;
&lt;br /&gt;
=== Holes in your structures ===&lt;br /&gt;
&lt;br /&gt;
Each structure needs to be closed enough to support the objects running over it. That is, the lines need to be close enough together so that an object can&#039;t slip through the gaps.&lt;br /&gt;
&lt;br /&gt;
[[Image:3dmidtex_tut3.jpg]]&lt;br /&gt;
&lt;br /&gt;
=== Clipping ===&lt;br /&gt;
&lt;br /&gt;
It is important to note that clipping is determined by the &#039;&#039;&#039;front side&#039;&#039;&#039; offset and texture height, so if both sides of the 3DMidTex aren&#039;t aligned to be in the same spot or the textures are different heights, the solid part of the line will be where the front side texture is. 3DMidTex lines will only block objects and not bullets. So a 3DMidTex will stop a rocket but not a shotgun blast.&lt;br /&gt;
&lt;br /&gt;
Also, please note that the entire height of the texture is considered solid regardless of the transparency of the texture. So the player can&#039;t pass through a 64x32 unit hole in a texture.&lt;br /&gt;
&lt;br /&gt;
=== Monsters crossing ===&lt;br /&gt;
&lt;br /&gt;
Because of the way monster AI in Doom works, it can be VERY tricky to get monsters to cross a 3D bridge. When a monster contacts a line in a map with a drop that&#039;s too far for it, the monster will not cross that line, because the engine assumes there is nothing on the other side for the monster to step on. Here are some tips to help you overcome this.&lt;br /&gt;
&lt;br /&gt;
When a monster comes in contact with a 3DMidTex line that it can stand on (i.e., is not under or high above) the monster will ignore all lines with big drop-offs that it would otherwise not cross. The easiest way is to ensure that the monster will not cross any big dropoff lines before stepping on a 3DMidTex line. One way to do this is to create stair steps on either side of your bridge that drop 16 units down, and place a 3DMidTex line inside the niche you just created.&lt;br /&gt;
&lt;br /&gt;
[[Image:3dmidtex_tut4.jpg]]&lt;br /&gt;
&lt;br /&gt;
Now monsters are much more likely to cross your bridge. Another thing to note is that monsters have no idea which line is the edge of the 3D bridge, and will hang off the edges. They won&#039;t fall down, so don&#039;t worry, but it just looks bad. One remedy is to make the outer edges monster impassible. When the 3DMidTex flag and this are used in conjunction, monsters will be blocked when they try to cross on top of that 3DMidTex; however, they won&#039;t be blocked by going under it.&lt;br /&gt;
&lt;br /&gt;
Now that you&#039;ve mastered the art of the 3D bridge, you should give [[3DMidTex advanced topics]] a try.&lt;br /&gt;
&lt;br /&gt;
=== Wrap-midtex ===&lt;br /&gt;
If the UDMF &#039;&#039;&#039;wrapmidtex&#039;&#039;&#039; or ExtraData &#039;&#039;&#039;WRAPMIDTEX&#039;&#039;&#039; flag is set, the texture will visually continue by the entire height of the area, and as such, the 3DMidTex blocking will also cover the entire area.&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
*[[3DMidTex advanced topics]]&lt;br /&gt;
*[[Linked portal]] (see also &amp;quot;Edge portals&amp;quot; and &amp;quot;Attached portals&amp;quot; for solid-looking 3D bridges).&lt;br /&gt;
&lt;br /&gt;
[[Category:Tutorials]]&lt;/div&gt;</summary>
		<author><name>Printz</name></author>
	</entry>
	<entry>
		<id>https://eternity.youfailit.net/index.php?title=3DMidTex_advanced_topics&amp;diff=6551</id>
		<title>3DMidTex advanced topics</title>
		<link rel="alternate" type="text/html" href="https://eternity.youfailit.net/index.php?title=3DMidTex_advanced_topics&amp;diff=6551"/>
		<updated>2026-06-14T13:52:57Z</updated>

		<summary type="html">&lt;p&gt;Printz: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[3DMidTex]] are useful for more than just bridges. This tutorial will walk you through the process of making a door, a lift, and a floating switch. If you have not read the first tutorial, you may want to read [[3DMidTex tutorial]].&lt;br /&gt;
&lt;br /&gt;
== 3DMidTex switches ==&lt;br /&gt;
When a 3DMidTex line has a linedef switch special, the 3DMidTex acts as the switch, and is height restrictive. This means the player has to be touching the switch (on the Z axis, as well as X and Y) to trigger it. &lt;br /&gt;
&lt;br /&gt;
== Linking a 3DMidTex to sector movement ==&lt;br /&gt;
[[Eternity]] provides linedef specials which allow you to link sector movement (either floor or ceiling) to 3DMidTex lines. Using these specials you can create any kind of moving structure.&lt;br /&gt;
&lt;br /&gt;
:On [[UDMF]] or [[ExtraData]]: [[Sector_Attach3dMidtex]]&lt;br /&gt;
:On the classic Doom format:&lt;br /&gt;
::Special 281 - Link linedef front sector floor movement to all tagged 3DMidTex lines.&lt;br /&gt;
::Special 282 - Link linedef front sector ceiling movement to all tagged 3DMidTex lines.&lt;br /&gt;
&lt;br /&gt;
(Note: In [[Doom wiki:Doom Builder|Doom Builder]]&#039;s current Eternity configuration, these specials can be found in the &amp;quot;Sector&amp;quot; category.)&lt;br /&gt;
&lt;br /&gt;
=== Making a 3D door ===&lt;br /&gt;
Making a 3DMidTex door is very simple. First, create the door.&lt;br /&gt;
&lt;br /&gt;
[[Image:3dmidtex_tut5.jpg]]&lt;br /&gt;
&lt;br /&gt;
Here, the example door is in the middle of a bridge that crosses a large expanse, and a fence has been built on either side of the bridge to prevent the player from running around the door. Notice the door is made into two lines, both lines having their front sides facing out. Set the special of both these lines to [[Door_Raise]] (or on Doom format: 63, &amp;quot;SR Open door wait close&amp;quot;) and set their tags to 1 (if on [[UDMF]], also set the first argument of [[Door_Raise]] to 1). If you run the map right now, nothing will happen because these two lines comprise the door that the player will interact with. The actual movement is going to be caused off screen.&lt;br /&gt;
&lt;br /&gt;
Create a small sector out of the way. Set the floor height to 0, the ceiling height to 0 (so it&#039;s closed) and set the tag to 1. This sector will become the sector that moves the 3DMidTex door, and this door will be triggered when the player presses on the 3DMidTex door. Next, create another sector attached to your first one. Set the floor to 0, the ceiling to 64 and set the tag to 0. This sector will give the door sector you just created a height to raise up to.&lt;br /&gt;
&lt;br /&gt;
Last, set one of the linedefs of the door sector (make sure it&#039;s one that faces in the door sector) to have a [[Sector_Attach3dMidtex]] special with &#039;&#039;do_ceiling&#039;&#039; set to 1 (or give it linedef special 282 on the Doom format), and the &#039;&#039;line_id&#039;&#039; (or tag on the Doom format) of 1. This links the movement of the sector&#039;s ceiling to the 3DMidTex door (which you will remember also has a tag of 1).&lt;br /&gt;
&lt;br /&gt;
[[Image:3dmidtex_tut6.jpg]]&lt;br /&gt;
&lt;br /&gt;
Now simply run the map and press on the 3DMidTex door. The door should now raise up, wait for 3 seconds, and close. If the player is caught under the door, it will now close (just like if the player was caught under a sector ceiling closing) because the link is two way. This also means that crushing ceilings will cause 3DMidTex lines to do damage to things when they are caught.&lt;br /&gt;
&lt;br /&gt;
==Making a polyobject 3DMidTex moving platform==&lt;br /&gt;
A polyobject may be made of two-sided lines, not just one-sided walls. Such two-sided lines can be marked as 3DMidTex. Objects currently standing on top of such 3DMidTex lines will be transported when the polyobject moves. Pushing and crushing will only happen if the touched objects stand in the way of the 3dmidtex lines of the polyobject. It is also possible to move the lines vertically using the sector linking mechanism.&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
*[[3DMidTex]]&lt;br /&gt;
*[[Linked portal]] (see also &amp;quot;Edge portals&amp;quot; and &amp;quot;Attached portals&amp;quot; for solid-looking 3D bridges).&lt;br /&gt;
&lt;br /&gt;
[[Category:Tutorials]]&lt;/div&gt;</summary>
		<author><name>Printz</name></author>
	</entry>
	<entry>
		<id>https://eternity.youfailit.net/index.php?title=UDMF&amp;diff=6550</id>
		<title>UDMF</title>
		<link rel="alternate" type="text/html" href="https://eternity.youfailit.net/index.php?title=UDMF&amp;diff=6550"/>
		<updated>2026-06-14T13:50:11Z</updated>

		<summary type="html">&lt;p&gt;Printz: /* Linedefs */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;UDMF is the extensible format that replaces the classic Doom format and [[ExtraData]]. Each level, instead of being defined by the classic lumps (THINGS, LINEDEFS, SIDEDEFS etc.) is defined by a human-readable lump named TEXTMAP, and can have associated lumps (e.g. ZNODES, BLOCKMAP, REJECT if needed) and other lumps, until a marker lump named ENDMAP.&lt;br /&gt;
&lt;br /&gt;
TEXTMAP has a well-defined language. Check the UDMF article at doomwiki.org. Each game and port has its own namespace(s), for example we have these namespaces: &amp;quot;doom&amp;quot;, &amp;quot;heretic&amp;quot;, &amp;quot;hexen&amp;quot;, &amp;quot;strife&amp;quot;, &amp;quot;zdoom&amp;quot; and others. Eternity has the &amp;quot;eternity&amp;quot; namespace.&lt;br /&gt;
&lt;br /&gt;
At its core, UDMF is made of many blocks, each titled &amp;quot;vertex&amp;quot;, &amp;quot;sector&amp;quot;, &amp;quot;sidedef&amp;quot;, &amp;quot;linedef&amp;quot;, &amp;quot;thing&amp;quot; and containing several properties, some mandatory, others optional. Each game or port namespace can define its own set, which is typically hard-coded, though it&#039;s also possible for the user to add their own fields (which have to be preceded by a safe prefix, to avoid conflicts with the standard).&lt;br /&gt;
&lt;br /&gt;
Maps designed in UDMF no longer need ExtraData.&lt;br /&gt;
&lt;br /&gt;
The standard was defined by James &amp;quot;Quasar&amp;quot; Haley and has also been successfully implemented in Vavoom, ZDoom and the ZDoom-derivative ports.&lt;br /&gt;
&lt;br /&gt;
* See also the [https://www.doomworld.com/eternity/engine/stuff/udmf11.txt base UDMF specifications]&lt;br /&gt;
&lt;br /&gt;
==Basics==&lt;br /&gt;
&lt;br /&gt;
Eternity supports the &amp;quot;doom&amp;quot; and &amp;quot;eternity&amp;quot; namespaces. In the rest of this article, we&#039;ll detail the &amp;quot;eternity&amp;quot; namespace. See the [https://www.doomworld.com/eternity/engine/stuff/udmf11.txt base UDMF specifications] for the options not detailed in this document.&lt;br /&gt;
&lt;br /&gt;
A TEXTMAP for Eternity must start with this:&lt;br /&gt;
 namespace = &amp;quot;eternity&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
===Eternity compatibility===&lt;br /&gt;
You can also add the following field in UDMF TEXTMAP:&lt;br /&gt;
 ee_compat = true;&lt;br /&gt;
which, no matter the namespace used (e.g. &amp;quot;zdoom&amp;quot;), assumes the map is going to work in Eternity. In other words, it is equivalent to setting namespace as &amp;quot;eternity&amp;quot;. Any fields not supported by Eternity, however, may make the mod fail.&lt;br /&gt;
&lt;br /&gt;
===Node format===&lt;br /&gt;
&lt;br /&gt;
Nodes for UDMF use the uncompressed GL-nodes format under the ZNODES name. Tools such as ZDBSP should build such a lump upon detecting a TEXTMAP lump.&lt;br /&gt;
&lt;br /&gt;
==Linedefs==&lt;br /&gt;
 linedef&lt;br /&gt;
 {&lt;br /&gt;
   blocklandmonsters = &amp;lt;boolean&amp;gt;;&lt;br /&gt;
   blockplayers = &amp;lt;boolean&amp;gt;;&lt;br /&gt;
 &lt;br /&gt;
   polycross = &amp;lt;boolean&amp;gt;;&lt;br /&gt;
   monstershoot = &amp;lt;boolean&amp;gt;;&lt;br /&gt;
 &lt;br /&gt;
   midtex3d = &amp;lt;boolean&amp;gt;;&lt;br /&gt;
   firstsideonly = &amp;lt;boolean&amp;gt;;&lt;br /&gt;
   blockeverything = &amp;lt;boolean&amp;gt;;&lt;br /&gt;
   zoneboundary = &amp;lt;boolean&amp;gt;;&lt;br /&gt;
   clipmidtex = &amp;lt;boolean&amp;gt;;&lt;br /&gt;
   wrapmidtex = &amp;lt;boolean&amp;gt;;&lt;br /&gt;
   midtex3dimpassible = &amp;lt;boolean&amp;gt;;&lt;br /&gt;
   lowerportal = &amp;lt;boolean&amp;gt;;&lt;br /&gt;
   upperportal = &amp;lt;boolean&amp;gt;;&lt;br /&gt;
 &lt;br /&gt;
   portal = &amp;lt;integer&amp;gt;;&lt;br /&gt;
 &lt;br /&gt;
   alpha = &amp;lt;floating-point&amp;gt;;        // default 1.0&lt;br /&gt;
   renderstyle = &amp;lt;string&amp;gt;;&lt;br /&gt;
   tranmap = &amp;lt;string&amp;gt;;&lt;br /&gt;
 }&lt;br /&gt;
===Explanation of fields===&lt;br /&gt;
*&#039;&#039;&#039;blocklandmonsters&#039;&#039;&#039;&lt;br /&gt;
:If true, linedef blocks walking monsters but allows fliers to pass. Players can pass anyway.&lt;br /&gt;
*&#039;&#039;&#039;blockplayers&#039;&#039;&#039;&lt;br /&gt;
:If true, linedef blocks players but allows monsters and projectiles to pass.&lt;br /&gt;
*&#039;&#039;&#039;polycross&#039;&#039;&#039;&lt;br /&gt;
:If true, linedef is activated when a polyobject&#039;s center point crosses it.&lt;br /&gt;
*&#039;&#039;&#039;monstershoot&#039;&#039;&#039;&lt;br /&gt;
:If true, linedef is activated when a monster fires hitscan on it.&lt;br /&gt;
*&#039;&#039;&#039;midtex3d&#039;&#039;&#039;&lt;br /&gt;
:If true, this linedef&#039;s middle texture uses [[3DMidTex_tutorial|3dmidtex]] physics.&lt;br /&gt;
*&#039;&#039;&#039;firstsideonly&#039;&#039;&#039;&lt;br /&gt;
:Linedef can only be activated from front side.&lt;br /&gt;
*&#039;&#039;&#039;blockeverything&#039;&#039;&#039;&lt;br /&gt;
:Linedef blocks all objects, acting like an external solid wall&lt;br /&gt;
*&#039;&#039;&#039;zoneboundary&#039;&#039;&#039;&lt;br /&gt;
:Linedef acts like a boundary for [[EDF_sound_reference#Sound_environments|reverb]] effects.&lt;br /&gt;
*&#039;&#039;&#039;clipmidtex&#039;&#039;&#039;&lt;br /&gt;
:Middle texture of two-sided line is clipped against the floor or ceiling as if a light change took place.&lt;br /&gt;
*&#039;&#039;&#039;wrapmidtex&#039;&#039;&#039;&lt;br /&gt;
:Middle texture of two-sided is repeated vertically instead of being drawn only once. This will make &#039;&#039;&#039;midtex3d&#039;&#039;&#039; lines also physically occupy the whole vertical space.&lt;br /&gt;
*&#039;&#039;&#039;midtex3dimpassible&#039;&#039;&#039;&lt;br /&gt;
:Treat the 3dmidtex line as a classic impassable middle texture, with regards to projectiles (i.e. they will pass through, just like hitscans).&lt;br /&gt;
*&#039;&#039;&#039;lowerportal&#039;&#039;&#039;, &#039;&#039;&#039;upperportal&#039;&#039;&#039;&lt;br /&gt;
:Apply [[edge portals|edge portal]] on the lower or upper part of this linedef, copying back sector&#039;s floor or ceiling portal into it.&lt;br /&gt;
*&#039;&#039;&#039;portal&#039;&#039;&#039;&lt;br /&gt;
:The ID of the portal to apply on this linedef, as defined from [[Portal_Define]]&lt;br /&gt;
*&#039;&#039;&#039;alpha&#039;&#039;&#039; (default: 1.0)&lt;br /&gt;
:Opacity of this line.&lt;br /&gt;
*&#039;&#039;&#039;renderstyle&#039;&#039;&#039;&lt;br /&gt;
:Either &amp;quot;translucent&amp;quot; or &amp;quot;add&amp;quot;. Default is &amp;quot;&amp;quot;.&lt;br /&gt;
*&#039;&#039;&#039;tranmap&#039;&#039;&#039;&lt;br /&gt;
:Boom [[translucency map]]. Mutually exclusive with alpha and renderstyle.&lt;br /&gt;
&lt;br /&gt;
==Sidedefs==&lt;br /&gt;
 sidedef&lt;br /&gt;
 {&lt;br /&gt;
   offsetx = &amp;lt;floating-point&amp;gt;;&lt;br /&gt;
   offsety = &amp;lt;floating-point&amp;gt;; &lt;br /&gt;
   offsetx_top = &amp;lt;floating-point&amp;gt;;&lt;br /&gt;
   offsety_top = &amp;lt;floating-point&amp;gt;;&lt;br /&gt;
   offsetx_mid = &amp;lt;floating-point&amp;gt;;&lt;br /&gt;
   offsety_mid = &amp;lt;floating-point&amp;gt;;&lt;br /&gt;
   offsetx_bottom = &amp;lt;floating-point&amp;gt;;&lt;br /&gt;
   offsety_bottom = &amp;lt;floating-point&amp;gt;;&lt;br /&gt;
 &lt;br /&gt;
   scalex_top = &amp;lt;floating-point&amp;gt;;&lt;br /&gt;
   scaley_top = &amp;lt;floating-point&amp;gt;;&lt;br /&gt;
   scalex_mid = &amp;lt;floating-point&amp;gt;;&lt;br /&gt;
   scaley_mid = &amp;lt;floating-point&amp;gt;;&lt;br /&gt;
   scalex_bottom = &amp;lt;floating-point&amp;gt;;&lt;br /&gt;
   scaley_bottom = &amp;lt;floating-point&amp;gt;;&lt;br /&gt;
 &lt;br /&gt;
   light = &amp;lt;integer&amp;gt;;&lt;br /&gt;
   lightabsolute = &amp;lt;boolean&amp;gt;;&lt;br /&gt;
   light_top = &amp;lt;integer&amp;gt;;&lt;br /&gt;
   lightabsolute_top = &amp;lt;boolean&amp;gt;;&lt;br /&gt;
   light_mid = &amp;lt;integer&amp;gt;;&lt;br /&gt;
   lightabsolute_mid = &amp;lt;boolean&amp;gt;;&lt;br /&gt;
   light_bottom = &amp;lt;integer&amp;gt;;&lt;br /&gt;
   lightabsolute_bottom = &amp;lt;boolean&amp;gt;;&lt;br /&gt;
 &lt;br /&gt;
   skew_top_type = &amp;lt;string&amp;gt;;&lt;br /&gt;
   skew_middle_type = &amp;lt;string&amp;gt;;&lt;br /&gt;
   skew_bottom_type = &amp;lt;string&amp;gt;;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
===Explanation of fields===&lt;br /&gt;
*&#039;&#039;&#039;offsetx&#039;&#039;&#039;, &#039;&#039;&#039;offsety&#039;&#039;&#039;&lt;br /&gt;
:Overall horizontal and vertical offsets for the top, middle, and bottom textures of this sidedef.&lt;br /&gt;
*&#039;&#039;&#039;offsetx_top&#039;&#039;&#039;, &#039;&#039;&#039;offsety_top&#039;&#039;&#039;, &#039;&#039;&#039;offsetx_mid&#039;&#039;&#039;, &#039;&#039;&#039;offsety_mid&#039;&#039;&#039;, &#039;&#039;&#039;offsetx_bottom&#039;&#039;&#039;, &#039;&#039;&#039;offsety_bottom&#039;&#039;&#039;&lt;br /&gt;
:Horizontal and vertical offsets for the individual top, middle, and bottom portions of this sidedef.&lt;br /&gt;
*&#039;&#039;&#039;scalex_top&#039;&#039;&#039;, &#039;&#039;&#039;scaley_top&#039;&#039;&#039;, &#039;&#039;&#039;scalex_mid&#039;&#039;&#039;, &#039;&#039;&#039;scaley_mid&#039;&#039;&#039;, &#039;&#039;&#039;scalex_bottom&#039;&#039;&#039;, &#039;&#039;&#039;scaley_bottom&#039;&#039;&#039;&lt;br /&gt;
:Horizontal and vertical scaling of parts of the sidedef.&lt;br /&gt;
*&#039;&#039;&#039;light&#039;&#039;&#039;, &#039;&#039;&#039;light_top&#039;&#039;&#039;, &#039;&#039;&#039;light_mid&#039;&#039;&#039;, &#039;&#039;&#039;light_bottom&#039;&#039;&#039;, &#039;&#039;&#039;lightabsolute&#039;&#039;&#039;, &#039;&#039;&#039;lightabsolute_top&#039;&#039;&#039;, &#039;&#039;&#039;lightabsolute_mid&#039;&#039;&#039;, &#039;&#039;&#039;lightabsolute_bottom&#039;&#039;&#039;&lt;br /&gt;
:Brightness for the whole, and the individual top, middle, and bottom portions of this sidedef. By default the values are additive to the inherited brightness. If the &amp;quot;absolute&amp;quot; properties are set to &amp;quot;true&amp;quot; the values are not additive anymore, but absolute.&lt;br /&gt;
*&#039;&#039;&#039;skew_top_type&#039;&#039;&#039;, &#039;&#039;&#039;skew_bottom_type&#039;&#039;&#039;, &#039;&#039;&#039;skew_middle_type&#039;&#039;&#039;&lt;br /&gt;
:The type of skewing that the a given texture of this sidedef has. This skew starts at the left side of the sidedef (if viewing the sidedef straight-on) and conforms to either the slope on the front or back side of the line the sidedef is on. Either the floor or ceiling slope can be picked as the slope for the skewing to conform to. Values are &amp;quot;none&amp;quot;, &amp;quot;front_floor&amp;quot;, &amp;quot;front_ceiling&amp;quot;, &amp;quot;back_floor&amp;quot;, and &amp;quot;back_ceiling&amp;quot;, with &amp;quot;none&amp;quot; being the default.&lt;br /&gt;
&lt;br /&gt;
==Vertices==&lt;br /&gt;
No change yet from the base &amp;quot;doom&amp;quot; namespace.&lt;br /&gt;
==Sectors==&lt;br /&gt;
 sector&lt;br /&gt;
 {&lt;br /&gt;
   heightfloor = &amp;lt;floating-point&amp;gt;;&lt;br /&gt;
   heightceiling = &amp;lt;floating-point&amp;gt;;&lt;br /&gt;
 &lt;br /&gt;
   xpanningfloor = &amp;lt;floating-point&amp;gt;;&lt;br /&gt;
   ypanningfloor = &amp;lt;floating-point&amp;gt;;&lt;br /&gt;
   xpanningceiling = &amp;lt;floating-point&amp;gt;;&lt;br /&gt;
   ypanningceiling = &amp;lt;floating-point&amp;gt;;&lt;br /&gt;
 &lt;br /&gt;
   xscalefloor = &amp;lt;floating-point&amp;gt;;&lt;br /&gt;
   yscalefloor = &amp;lt;floating-point&amp;gt;;&lt;br /&gt;
   xscaleceiling = &amp;lt;floating-point&amp;gt;;&lt;br /&gt;
   yscaleceiling = &amp;lt;floating-point&amp;gt;;&lt;br /&gt;
   rotationfloor = &amp;lt;floating-point&amp;gt;;&lt;br /&gt;
   rotationceiling = &amp;lt;floating-point&amp;gt;;&lt;br /&gt;
 &lt;br /&gt;
   secret = &amp;lt;boolean&amp;gt;;&lt;br /&gt;
   friction = &amp;lt;integer&amp;gt;;&lt;br /&gt;
 &lt;br /&gt;
   leakiness = &amp;lt;integer&amp;gt;;&lt;br /&gt;
   damageamount = &amp;lt;integer&amp;gt;;&lt;br /&gt;
   damageinterval = &amp;lt;integer&amp;gt;;&lt;br /&gt;
   damage_endgodmode = &amp;lt;boolean&amp;gt;;&lt;br /&gt;
   damage_exitlevel = &amp;lt;boolean&amp;gt;;&lt;br /&gt;
   damageterraineffect = &amp;lt;boolean&amp;gt;;&lt;br /&gt;
   damagetype = &amp;lt;string&amp;gt;;&lt;br /&gt;
 &lt;br /&gt;
   floorterrain = &amp;lt;string&amp;gt;;&lt;br /&gt;
   ceilingterrain = &amp;lt;string&amp;gt;;&lt;br /&gt;
 &lt;br /&gt;
   lightfloor = &amp;lt;integer&amp;gt;;&lt;br /&gt;
   lightceiling = &amp;lt;integer&amp;gt;;&lt;br /&gt;
   lightfloorabsolute = &amp;lt;boolean&amp;gt;;&lt;br /&gt;
   lightceilingabsolute = &amp;lt;boolean&amp;gt;;&lt;br /&gt;
 &lt;br /&gt;
   phasedlight = &amp;lt;boolean&amp;gt;;&lt;br /&gt;
   lightsequence = &amp;lt;boolean&amp;gt;;&lt;br /&gt;
   lightseqalt = &amp;lt;boolean&amp;gt;;&lt;br /&gt;
 &lt;br /&gt;
   colormaptop = &amp;lt;string&amp;gt;;&lt;br /&gt;
   colormapmid = &amp;lt;string&amp;gt;;&lt;br /&gt;
   colormapbottom = &amp;lt;string&amp;gt;;&lt;br /&gt;
 &lt;br /&gt;
   scroll_ceil_x = &amp;lt;floating-point&amp;gt;;&lt;br /&gt;
   scroll_ceil_y = &amp;lt;floating-point&amp;gt;;&lt;br /&gt;
   scroll_ceil_type = &amp;lt;string&amp;gt;;&lt;br /&gt;
   scroll_floor_x = &amp;lt;floating-point&amp;gt;;&lt;br /&gt;
   scroll_floor_y = &amp;lt;floating-point&amp;gt;;&lt;br /&gt;
   scroll_floor_type = &amp;lt;string&amp;gt;;&lt;br /&gt;
 &lt;br /&gt;
   floorid = &amp;lt;integer&amp;gt;;&lt;br /&gt;
   ceilingid = &amp;lt;integer&amp;gt;;&lt;br /&gt;
   attachfloor = &amp;lt;integer&amp;gt;;&lt;br /&gt;
   attachceiling = &amp;lt;integer&amp;gt;;&lt;br /&gt;
 &lt;br /&gt;
   soundsequence = &amp;lt;string&amp;gt;;&lt;br /&gt;
 &lt;br /&gt;
   portalfloor = &amp;lt;integer&amp;gt;;&lt;br /&gt;
   portalceiling = &amp;lt;integer&amp;gt;;&lt;br /&gt;
 &lt;br /&gt;
   portal_floor_disabled = &amp;lt;boolean&amp;gt;;&lt;br /&gt;
   portal_floor_norender = &amp;lt;boolean&amp;gt;;&lt;br /&gt;
   portal_floor_nopass = &amp;lt;boolean&amp;gt;;&lt;br /&gt;
   portal_floor_blocksound = &amp;lt;boolean&amp;gt;;&lt;br /&gt;
   portal_floor_useglobaltex = &amp;lt;boolean&amp;gt;;&lt;br /&gt;
   portal_floor_overlaytype = &amp;lt;string&amp;gt;;&lt;br /&gt;
   alphafloor = &amp;lt;floating-point&amp;gt;;&lt;br /&gt;
   portal_floor_attached = &amp;lt;boolean&amp;gt;;&lt;br /&gt;
 &lt;br /&gt;
   portal_ceil_disabled = &amp;lt;boolean&amp;gt;;&lt;br /&gt;
   portal_ceil_norender = &amp;lt;boolean&amp;gt;;&lt;br /&gt;
   portal_ceil_nopass = &amp;lt;boolean&amp;gt;;&lt;br /&gt;
   portal_ceil_blocksound = &amp;lt;boolean&amp;gt;;&lt;br /&gt;
   portal_ceil_useglobaltex = &amp;lt;boolean&amp;gt;;&lt;br /&gt;
   portal_ceil_overlaytype = &amp;lt;string&amp;gt;;&lt;br /&gt;
   alphaceiling = &amp;lt;floating-point&amp;gt;;&lt;br /&gt;
   portal_ceil_attached = &amp;lt;boolean&amp;gt;;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Explanation of fields ===&lt;br /&gt;
*&#039;&#039;&#039;heightfloor&#039;&#039;&#039;, &#039;&#039;&#039;heightceiling&#039;&#039;&#039; (mandatory)&lt;br /&gt;
:Unlike the base field from the core specs, these ones allow floating-point values.&lt;br /&gt;
*&#039;&#039;&#039;xpanningfloor&#039;&#039;&#039;, &#039;&#039;&#039;ypanningfloor&#039;&#039;&#039;, &#039;&#039;&#039;xpanningceiling&#039;&#039;&#039;, &#039;&#039;&#039;ypanningceiling&#039;&#039;&#039;&lt;br /&gt;
:These properties control the panning of the floor or ceiling flat.&lt;br /&gt;
*&#039;&#039;&#039;xscalefloor&#039;&#039;&#039;, &#039;&#039;&#039;yscalefloor&#039;&#039;&#039;, &#039;&#039;&#039;xscaleceiling&#039;&#039;&#039;, &#039;&#039;&#039;yscaleceiling&#039;&#039;&#039; (default: 1.0)&lt;br /&gt;
:These properties control the scaling of the floor or ceiling flat. Greater values result in smaller textures.&lt;br /&gt;
*&#039;&#039;&#039;rotationfloor&#039;&#039;&#039;, &#039;&#039;&#039;rotationceiling&#039;&#039;&#039;&lt;br /&gt;
:These properties control the clockwise rotation of the floor or ceiling flat, in degrees.&lt;br /&gt;
*&#039;&#039;&#039;secret&#039;&#039;&#039;&lt;br /&gt;
:If true, the sector counts as a secret when visited by player.&lt;br /&gt;
*&#039;&#039;&#039;friction&#039;&#039;&#039; (default: -1)&lt;br /&gt;
:This one controls the friction of movement on the floor. The value of this field is equivalent to the length of a horizontal linedef with the classic Boom friction special. Default value: -1 (use usual Doom friction).&lt;br /&gt;
*&#039;&#039;&#039;leakiness&#039;&#039;&#039;&lt;br /&gt;
:This one controls the probability that, if this sector is also damaging, it will leak damage through the radiation suit. As reference, the classic Doom 20% sector has 5 leakiness. For damage which always goes through the suit, use 256.&lt;br /&gt;
*&#039;&#039;&#039;damageamount&#039;&#039;&#039;&lt;br /&gt;
:Damage per hit for players on the floor.&lt;br /&gt;
*&#039;&#039;&#039;damageinterval&#039;&#039;&#039;&lt;br /&gt;
:Time between hits. The classic Doom damaging floors use a 32 period.&lt;br /&gt;
*&#039;&#039;&#039;damage_endgodmode&#039;&#039;&#039;&lt;br /&gt;
:If true, it will cause the damaging floor to disable the godmode cheat.&lt;br /&gt;
*&#039;&#039;&#039;damage_exitlevel&#039;&#039;&#039;&lt;br /&gt;
:If true, it will cause the damaging floor to exit the level in victory if the player has too little health.&lt;br /&gt;
*&#039;&#039;&#039;damageterraineffect&#039;&#039;&#039;&lt;br /&gt;
:If true, then each damage hit will produce a splash, like the Heretic lava.&lt;br /&gt;
*&#039;&#039;&#039;damagetype&#039;&#039;&#039; (default: &amp;quot;Unknown&amp;quot;)&lt;br /&gt;
:The [[damagetype|damage type]] of the floor. For Doom damaging floors you can use &amp;quot;Slime&amp;quot;.&lt;br /&gt;
*&#039;&#039;&#039;floorterrain&#039;&#039;&#039; (default: &amp;quot;@flat&amp;quot;)&lt;br /&gt;
:The [[terrain]] effect of the floor.&lt;br /&gt;
*&#039;&#039;&#039;ceilingterrain&#039;&#039;&#039; (default: &amp;quot;@flat&amp;quot;)&lt;br /&gt;
:The [[terrain]] effect of the ceiling. Currently used for particle recolouring.&lt;br /&gt;
*&#039;&#039;&#039;lightfloor&#039;&#039;&#039;, &#039;&#039;&#039;lightceiling&#039;&#039;&#039;&lt;br /&gt;
:The light amount to add to the floor or ceiling, relative to the designated light level.&lt;br /&gt;
*&#039;&#039;&#039;lightfloorabsolute&#039;&#039;&#039;, &#039;&#039;&#039;lightceilingabsolute&#039;&#039;&#039;&lt;br /&gt;
:If true, then &#039;&#039;&#039;lightfloor&#039;&#039;&#039; or &#039;&#039;&#039;lightceiling&#039;&#039;&#039; just overrides the light.&lt;br /&gt;
* phasedlight = &amp;lt;boolean&amp;gt;;&lt;br /&gt;
:Equivalent to ExtraData flag.&lt;br /&gt;
* lightsequence = &amp;lt;boolean&amp;gt;;&lt;br /&gt;
:Equivalent to ExtraData flag.&lt;br /&gt;
* lightseqalt = &amp;lt;boolean&amp;gt;;&lt;br /&gt;
:Equivalent to ExtraData flag.&lt;br /&gt;
*&#039;&#039;&#039;colormaptop&#039;&#039;&#039;, &#039;&#039;&#039;colormapmid&#039;&#039;&#039;, &#039;&#039;&#039;colormapbottom&#039;&#039;&#039; (default: &amp;quot;@default&amp;quot;)&lt;br /&gt;
:The colormap to set for the top, normal or bottom part of a Boom sector with fake flats. Or for any normal part, if it&#039;s &#039;&#039;&#039;colormapmid&#039;&#039;&#039;. Use a lump from between &#039;&#039;&#039;C_START&#039;&#039;&#039; and &#039;&#039;&#039;C_END&#039;&#039;&#039;. &amp;quot;WATERMAP&amp;quot; and &amp;quot;LAVAMAP&amp;quot; are provided by Eternity.&lt;br /&gt;
*&#039;&#039;&#039;scroll_ceil_x&#039;&#039;&#039;, &#039;&#039;&#039;scroll_ceil_y&#039;&#039;&#039;, &#039;&#039;&#039;scroll_floor_x&#039;&#039;&#039;, &#039;&#039;&#039;scroll_floor_y&#039;&#039;&#039;&lt;br /&gt;
:These fields make the sector ceiling or floor scroll at startup. The values you input there are the equivalents of a Boom trigger linedef length divided by 10. So to emulate a linedef pointing east of length 64 having a scroll trigger, set value 6.4 on &#039;&#039;&#039;scroll_ceil_x&#039;&#039;&#039; or &#039;&#039;&#039;scroll_floor_x&#039;&#039;&#039;.&lt;br /&gt;
*&#039;&#039;&#039;scroll_ceil_type&#039;&#039;&#039;, &#039;&#039;&#039;scroll_floor_type&#039;&#039;&#039; (default: &amp;quot;none&amp;quot;)&lt;br /&gt;
:These fields control the kind of scrolling for each surface and can be: &amp;quot;none&amp;quot; (no scrolling enabled), &amp;quot;visual&amp;quot; (only scroll the texture), &amp;quot;physical&amp;quot; (only carry the things), &amp;quot;both&amp;quot; (both scroll and carry). For now, &#039;&#039;&#039;scroll_ceil_type&#039;&#039;&#039; only supports &amp;quot;none&amp;quot; or &amp;quot;visual&amp;quot;.&lt;br /&gt;
*&#039;&#039;&#039;floorid&#039;&#039;&#039;, &#039;&#039;&#039;ceilingid&#039;&#039;&#039;&lt;br /&gt;
:ID of the floor or ceiling of this sector to use for [[attached surfaces]]. Use this id in &#039;&#039;&#039;attachfloor&#039;&#039;&#039; and &#039;&#039;&#039;attachceiling&#039;&#039;&#039;.&lt;br /&gt;
*&#039;&#039;&#039;attachfloor&#039;&#039;&#039;, &#039;&#039;&#039;attachceiling&#039;&#039;&#039;&lt;br /&gt;
:Makes the floor or ceiling of this sector move whenever sectors with &#039;&#039;&#039;floorid&#039;&#039;&#039; or &#039;&#039;&#039;ceilingid&#039;&#039;&#039; with the same number move their respective surfaces. If you want this sector&#039;s floor or ceiling to move in opposite direction, use the negative value.&lt;br /&gt;
*&#039;&#039;&#039;soundsequence&#039;&#039;&#039;&lt;br /&gt;
:Name of the [[soundsequence]] to use for the movement of this sector. It will only work if said soundsequence has an &#039;&#039;&#039;id&#039;&#039;&#039;. It can also be a number (the sound sequence &#039;&#039;&#039;id&#039;&#039;&#039;) surrounded by quotes.&lt;br /&gt;
*&#039;&#039;&#039;portalfloor&#039;&#039;&#039;, &#039;&#039;&#039;portalceiling&#039;&#039;&#039;&lt;br /&gt;
:Portal ID to use on the floor or ceiling of this sector, using the same value as the one set in [[Portal_Define]]. For two-way portals, use the negative number for the opposite portal (i.e. one way uses portal &#039;&#039;n&#039;&#039;, and the other way uses -&#039;&#039;n&#039;&#039;).&lt;br /&gt;
*&#039;&#039;&#039;portal_floor_disabled&#039;&#039;&#039;, &#039;&#039;&#039;portal_ceil_disabled&#039;&#039;&#039;&lt;br /&gt;
:If true, the portal is disabled (has no effect).&lt;br /&gt;
*&#039;&#039;&#039;portal_floor_norender&#039;&#039;&#039;, &#039;&#039;&#039;portal_ceil_norended&#039;&#039;&#039;&lt;br /&gt;
:If true, the portal is not rendered but may have effects.&lt;br /&gt;
*&#039;&#039;&#039;portal_floor_nopass&#039;&#039;&#039;, &#039;&#039;&#039;portal_ceil_nopass&#039;&#039;&#039;&lt;br /&gt;
:If true, it disables any linked portals interaction.&lt;br /&gt;
*&#039;&#039;&#039;portal_floor_blocksound&#039;&#039;&#039;, &#039;&#039;&#039;portal_ceil_blocksound&#039;&#039;&#039;&lt;br /&gt;
:If true, it blocks sounds from monsters listening for alerts.&lt;br /&gt;
*&#039;&#039;&#039;portal_floor_useglobaltex&#039;&#039;&#039;, &#039;&#039;&#039;portal_ceil_useglobaltex&#039;&#039;&#039;&lt;br /&gt;
:Reserved.&lt;br /&gt;
*&#039;&#039;&#039;portal_floor_overlaytype&#039;&#039;&#039;, &#039;&#039;&#039;portal_ceil_overlaytype&#039;&#039;&#039; (default: &amp;quot;none&amp;quot;)&lt;br /&gt;
:Can be &amp;quot;none&amp;quot;, &amp;quot;translucent&amp;quot; or &amp;quot;additive&amp;quot;. Controls the rendering of portal overlays.&lt;br /&gt;
*&#039;&#039;&#039;alphafloor&#039;&#039;&#039;, &#039;&#039;&#039;alphaceiling&#039;&#039;&#039; (default: 1.0)&lt;br /&gt;
:Alpha of the portal overlay. 1.0 makes it fully visible, 0.0 is invisible.&lt;br /&gt;
*&#039;&#039;&#039;portal_floor_attached&#039;&#039;&#039;, &#039;&#039;&#039;portal_ceil_attached&#039;&#039;&#039;&lt;br /&gt;
:If true, and the sector has a linked portal on the floor or ceiling, the portal will move along with the floor or ceiling surface, instead of remaining at the same height as default. This is useful for easily moving platforms vertically.&lt;br /&gt;
&lt;br /&gt;
==Things==&lt;br /&gt;
 thing&lt;br /&gt;
 {&lt;br /&gt;
   health = &amp;lt;floating-point&amp;gt;;&lt;br /&gt;
 }&lt;br /&gt;
===Explanation of fields===&lt;br /&gt;
*&#039;&#039;&#039;health&#039;&#039;&#039;&lt;br /&gt;
:Health modifier. Works like in ZDoom: 0 means no change from [[EDF]], positive values multiply the initial spawn health, and negative values change the absolute spawn health.&lt;/div&gt;</summary>
		<author><name>Printz</name></author>
	</entry>
	<entry>
		<id>https://eternity.youfailit.net/index.php?title=UDMF&amp;diff=6549</id>
		<title>UDMF</title>
		<link rel="alternate" type="text/html" href="https://eternity.youfailit.net/index.php?title=UDMF&amp;diff=6549"/>
		<updated>2026-06-14T13:48:16Z</updated>

		<summary type="html">&lt;p&gt;Printz: /* Sidedefs */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;UDMF is the extensible format that replaces the classic Doom format and [[ExtraData]]. Each level, instead of being defined by the classic lumps (THINGS, LINEDEFS, SIDEDEFS etc.) is defined by a human-readable lump named TEXTMAP, and can have associated lumps (e.g. ZNODES, BLOCKMAP, REJECT if needed) and other lumps, until a marker lump named ENDMAP.&lt;br /&gt;
&lt;br /&gt;
TEXTMAP has a well-defined language. Check the UDMF article at doomwiki.org. Each game and port has its own namespace(s), for example we have these namespaces: &amp;quot;doom&amp;quot;, &amp;quot;heretic&amp;quot;, &amp;quot;hexen&amp;quot;, &amp;quot;strife&amp;quot;, &amp;quot;zdoom&amp;quot; and others. Eternity has the &amp;quot;eternity&amp;quot; namespace.&lt;br /&gt;
&lt;br /&gt;
At its core, UDMF is made of many blocks, each titled &amp;quot;vertex&amp;quot;, &amp;quot;sector&amp;quot;, &amp;quot;sidedef&amp;quot;, &amp;quot;linedef&amp;quot;, &amp;quot;thing&amp;quot; and containing several properties, some mandatory, others optional. Each game or port namespace can define its own set, which is typically hard-coded, though it&#039;s also possible for the user to add their own fields (which have to be preceded by a safe prefix, to avoid conflicts with the standard).&lt;br /&gt;
&lt;br /&gt;
Maps designed in UDMF no longer need ExtraData.&lt;br /&gt;
&lt;br /&gt;
The standard was defined by James &amp;quot;Quasar&amp;quot; Haley and has also been successfully implemented in Vavoom, ZDoom and the ZDoom-derivative ports.&lt;br /&gt;
&lt;br /&gt;
* See also the [https://www.doomworld.com/eternity/engine/stuff/udmf11.txt base UDMF specifications]&lt;br /&gt;
&lt;br /&gt;
==Basics==&lt;br /&gt;
&lt;br /&gt;
Eternity supports the &amp;quot;doom&amp;quot; and &amp;quot;eternity&amp;quot; namespaces. In the rest of this article, we&#039;ll detail the &amp;quot;eternity&amp;quot; namespace. See the [https://www.doomworld.com/eternity/engine/stuff/udmf11.txt base UDMF specifications] for the options not detailed in this document.&lt;br /&gt;
&lt;br /&gt;
A TEXTMAP for Eternity must start with this:&lt;br /&gt;
 namespace = &amp;quot;eternity&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
===Eternity compatibility===&lt;br /&gt;
You can also add the following field in UDMF TEXTMAP:&lt;br /&gt;
 ee_compat = true;&lt;br /&gt;
which, no matter the namespace used (e.g. &amp;quot;zdoom&amp;quot;), assumes the map is going to work in Eternity. In other words, it is equivalent to setting namespace as &amp;quot;eternity&amp;quot;. Any fields not supported by Eternity, however, may make the mod fail.&lt;br /&gt;
&lt;br /&gt;
===Node format===&lt;br /&gt;
&lt;br /&gt;
Nodes for UDMF use the uncompressed GL-nodes format under the ZNODES name. Tools such as ZDBSP should build such a lump upon detecting a TEXTMAP lump.&lt;br /&gt;
&lt;br /&gt;
==Linedefs==&lt;br /&gt;
 linedef&lt;br /&gt;
 {&lt;br /&gt;
   blocklandmonsters = &amp;lt;boolean&amp;gt;;&lt;br /&gt;
   blockplayers = &amp;lt;boolean&amp;gt;;&lt;br /&gt;
 &lt;br /&gt;
   polycross = &amp;lt;boolean&amp;gt;;&lt;br /&gt;
   monstershoot = &amp;lt;boolean&amp;gt;;&lt;br /&gt;
 &lt;br /&gt;
   midtex3d = &amp;lt;boolean&amp;gt;;&lt;br /&gt;
   firstsideonly = &amp;lt;boolean&amp;gt;;&lt;br /&gt;
   blockeverything = &amp;lt;boolean&amp;gt;;&lt;br /&gt;
   zoneboundary = &amp;lt;boolean&amp;gt;;&lt;br /&gt;
   clipmidtex = &amp;lt;boolean&amp;gt;;&lt;br /&gt;
   midtex3dimpassible = &amp;lt;boolean&amp;gt;;&lt;br /&gt;
   lowerportal = &amp;lt;boolean&amp;gt;;&lt;br /&gt;
   upperportal = &amp;lt;boolean&amp;gt;;&lt;br /&gt;
 &lt;br /&gt;
   portal = &amp;lt;integer&amp;gt;;&lt;br /&gt;
 &lt;br /&gt;
   alpha = &amp;lt;floating-point&amp;gt;;        // default 1.0&lt;br /&gt;
   renderstyle = &amp;lt;string&amp;gt;;&lt;br /&gt;
   tranmap = &amp;lt;string&amp;gt;;&lt;br /&gt;
 }&lt;br /&gt;
===Explanation of fields===&lt;br /&gt;
*&#039;&#039;&#039;blocklandmonsters&#039;&#039;&#039;&lt;br /&gt;
:If true, linedef blocks walking monsters but allows fliers to pass. Players can pass anyway.&lt;br /&gt;
*&#039;&#039;&#039;blockplayers&#039;&#039;&#039;&lt;br /&gt;
:If true, linedef blocks players but allows monsters and projectiles to pass.&lt;br /&gt;
*&#039;&#039;&#039;polycross&#039;&#039;&#039;&lt;br /&gt;
:If true, linedef is activated when a polyobject&#039;s center point crosses it.&lt;br /&gt;
*&#039;&#039;&#039;monstershoot&#039;&#039;&#039;&lt;br /&gt;
:If true, linedef is activated when a monster fires hitscan on it.&lt;br /&gt;
*&#039;&#039;&#039;midtex3d&#039;&#039;&#039;&lt;br /&gt;
:If true, this linedef&#039;s middle texture uses [[3DMidTex_tutorial|3dmidtex]] physics.&lt;br /&gt;
*&#039;&#039;&#039;firstsideonly&#039;&#039;&#039;&lt;br /&gt;
:Linedef can only be activated from front side.&lt;br /&gt;
*&#039;&#039;&#039;blockeverything&#039;&#039;&#039;&lt;br /&gt;
:Linedef blocks all objects, acting like an external solid wall&lt;br /&gt;
*&#039;&#039;&#039;zoneboundary&#039;&#039;&#039;&lt;br /&gt;
:Linedef acts like a boundary for [[EDF_sound_reference#Sound_environments|reverb]] effects.&lt;br /&gt;
*&#039;&#039;&#039;clipmidtex&#039;&#039;&#039;&lt;br /&gt;
:Middle texture is clipped against the floor or ceiling as if a light change took place.&lt;br /&gt;
*&#039;&#039;&#039;midtex3dimpassible&#039;&#039;&#039;&lt;br /&gt;
:Treat the 3dmidtex line as a classic impassable middle texture, with regards to projectiles (i.e. they will pass through, just like hitscans).&lt;br /&gt;
*&#039;&#039;&#039;lowerportal&#039;&#039;&#039;, &#039;&#039;&#039;upperportal&#039;&#039;&#039;&lt;br /&gt;
:Apply [[edge portals|edge portal]] on the lower or upper part of this linedef, copying back sector&#039;s floor or ceiling portal into it.&lt;br /&gt;
*&#039;&#039;&#039;portal&#039;&#039;&#039;&lt;br /&gt;
:The ID of the portal to apply on this linedef, as defined from [[Portal_Define]]&lt;br /&gt;
*&#039;&#039;&#039;alpha&#039;&#039;&#039; (default: 1.0)&lt;br /&gt;
:Opacity of this line.&lt;br /&gt;
*&#039;&#039;&#039;renderstyle&#039;&#039;&#039;&lt;br /&gt;
:Either &amp;quot;translucent&amp;quot; or &amp;quot;add&amp;quot;. Default is &amp;quot;&amp;quot;.&lt;br /&gt;
*&#039;&#039;&#039;tranmap&#039;&#039;&#039;&lt;br /&gt;
:Boom [[translucency map]]. Mutually exclusive with alpha and renderstyle.&lt;br /&gt;
&lt;br /&gt;
==Sidedefs==&lt;br /&gt;
 sidedef&lt;br /&gt;
 {&lt;br /&gt;
   offsetx = &amp;lt;floating-point&amp;gt;;&lt;br /&gt;
   offsety = &amp;lt;floating-point&amp;gt;; &lt;br /&gt;
   offsetx_top = &amp;lt;floating-point&amp;gt;;&lt;br /&gt;
   offsety_top = &amp;lt;floating-point&amp;gt;;&lt;br /&gt;
   offsetx_mid = &amp;lt;floating-point&amp;gt;;&lt;br /&gt;
   offsety_mid = &amp;lt;floating-point&amp;gt;;&lt;br /&gt;
   offsetx_bottom = &amp;lt;floating-point&amp;gt;;&lt;br /&gt;
   offsety_bottom = &amp;lt;floating-point&amp;gt;;&lt;br /&gt;
 &lt;br /&gt;
   scalex_top = &amp;lt;floating-point&amp;gt;;&lt;br /&gt;
   scaley_top = &amp;lt;floating-point&amp;gt;;&lt;br /&gt;
   scalex_mid = &amp;lt;floating-point&amp;gt;;&lt;br /&gt;
   scaley_mid = &amp;lt;floating-point&amp;gt;;&lt;br /&gt;
   scalex_bottom = &amp;lt;floating-point&amp;gt;;&lt;br /&gt;
   scaley_bottom = &amp;lt;floating-point&amp;gt;;&lt;br /&gt;
 &lt;br /&gt;
   light = &amp;lt;integer&amp;gt;;&lt;br /&gt;
   lightabsolute = &amp;lt;boolean&amp;gt;;&lt;br /&gt;
   light_top = &amp;lt;integer&amp;gt;;&lt;br /&gt;
   lightabsolute_top = &amp;lt;boolean&amp;gt;;&lt;br /&gt;
   light_mid = &amp;lt;integer&amp;gt;;&lt;br /&gt;
   lightabsolute_mid = &amp;lt;boolean&amp;gt;;&lt;br /&gt;
   light_bottom = &amp;lt;integer&amp;gt;;&lt;br /&gt;
   lightabsolute_bottom = &amp;lt;boolean&amp;gt;;&lt;br /&gt;
 &lt;br /&gt;
   skew_top_type = &amp;lt;string&amp;gt;;&lt;br /&gt;
   skew_middle_type = &amp;lt;string&amp;gt;;&lt;br /&gt;
   skew_bottom_type = &amp;lt;string&amp;gt;;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
===Explanation of fields===&lt;br /&gt;
*&#039;&#039;&#039;offsetx&#039;&#039;&#039;, &#039;&#039;&#039;offsety&#039;&#039;&#039;&lt;br /&gt;
:Overall horizontal and vertical offsets for the top, middle, and bottom textures of this sidedef.&lt;br /&gt;
*&#039;&#039;&#039;offsetx_top&#039;&#039;&#039;, &#039;&#039;&#039;offsety_top&#039;&#039;&#039;, &#039;&#039;&#039;offsetx_mid&#039;&#039;&#039;, &#039;&#039;&#039;offsety_mid&#039;&#039;&#039;, &#039;&#039;&#039;offsetx_bottom&#039;&#039;&#039;, &#039;&#039;&#039;offsety_bottom&#039;&#039;&#039;&lt;br /&gt;
:Horizontal and vertical offsets for the individual top, middle, and bottom portions of this sidedef.&lt;br /&gt;
*&#039;&#039;&#039;scalex_top&#039;&#039;&#039;, &#039;&#039;&#039;scaley_top&#039;&#039;&#039;, &#039;&#039;&#039;scalex_mid&#039;&#039;&#039;, &#039;&#039;&#039;scaley_mid&#039;&#039;&#039;, &#039;&#039;&#039;scalex_bottom&#039;&#039;&#039;, &#039;&#039;&#039;scaley_bottom&#039;&#039;&#039;&lt;br /&gt;
:Horizontal and vertical scaling of parts of the sidedef.&lt;br /&gt;
*&#039;&#039;&#039;light&#039;&#039;&#039;, &#039;&#039;&#039;light_top&#039;&#039;&#039;, &#039;&#039;&#039;light_mid&#039;&#039;&#039;, &#039;&#039;&#039;light_bottom&#039;&#039;&#039;, &#039;&#039;&#039;lightabsolute&#039;&#039;&#039;, &#039;&#039;&#039;lightabsolute_top&#039;&#039;&#039;, &#039;&#039;&#039;lightabsolute_mid&#039;&#039;&#039;, &#039;&#039;&#039;lightabsolute_bottom&#039;&#039;&#039;&lt;br /&gt;
:Brightness for the whole, and the individual top, middle, and bottom portions of this sidedef. By default the values are additive to the inherited brightness. If the &amp;quot;absolute&amp;quot; properties are set to &amp;quot;true&amp;quot; the values are not additive anymore, but absolute.&lt;br /&gt;
*&#039;&#039;&#039;skew_top_type&#039;&#039;&#039;, &#039;&#039;&#039;skew_bottom_type&#039;&#039;&#039;, &#039;&#039;&#039;skew_middle_type&#039;&#039;&#039;&lt;br /&gt;
:The type of skewing that the a given texture of this sidedef has. This skew starts at the left side of the sidedef (if viewing the sidedef straight-on) and conforms to either the slope on the front or back side of the line the sidedef is on. Either the floor or ceiling slope can be picked as the slope for the skewing to conform to. Values are &amp;quot;none&amp;quot;, &amp;quot;front_floor&amp;quot;, &amp;quot;front_ceiling&amp;quot;, &amp;quot;back_floor&amp;quot;, and &amp;quot;back_ceiling&amp;quot;, with &amp;quot;none&amp;quot; being the default.&lt;br /&gt;
&lt;br /&gt;
==Vertices==&lt;br /&gt;
No change yet from the base &amp;quot;doom&amp;quot; namespace.&lt;br /&gt;
==Sectors==&lt;br /&gt;
 sector&lt;br /&gt;
 {&lt;br /&gt;
   heightfloor = &amp;lt;floating-point&amp;gt;;&lt;br /&gt;
   heightceiling = &amp;lt;floating-point&amp;gt;;&lt;br /&gt;
 &lt;br /&gt;
   xpanningfloor = &amp;lt;floating-point&amp;gt;;&lt;br /&gt;
   ypanningfloor = &amp;lt;floating-point&amp;gt;;&lt;br /&gt;
   xpanningceiling = &amp;lt;floating-point&amp;gt;;&lt;br /&gt;
   ypanningceiling = &amp;lt;floating-point&amp;gt;;&lt;br /&gt;
 &lt;br /&gt;
   xscalefloor = &amp;lt;floating-point&amp;gt;;&lt;br /&gt;
   yscalefloor = &amp;lt;floating-point&amp;gt;;&lt;br /&gt;
   xscaleceiling = &amp;lt;floating-point&amp;gt;;&lt;br /&gt;
   yscaleceiling = &amp;lt;floating-point&amp;gt;;&lt;br /&gt;
   rotationfloor = &amp;lt;floating-point&amp;gt;;&lt;br /&gt;
   rotationceiling = &amp;lt;floating-point&amp;gt;;&lt;br /&gt;
 &lt;br /&gt;
   secret = &amp;lt;boolean&amp;gt;;&lt;br /&gt;
   friction = &amp;lt;integer&amp;gt;;&lt;br /&gt;
 &lt;br /&gt;
   leakiness = &amp;lt;integer&amp;gt;;&lt;br /&gt;
   damageamount = &amp;lt;integer&amp;gt;;&lt;br /&gt;
   damageinterval = &amp;lt;integer&amp;gt;;&lt;br /&gt;
   damage_endgodmode = &amp;lt;boolean&amp;gt;;&lt;br /&gt;
   damage_exitlevel = &amp;lt;boolean&amp;gt;;&lt;br /&gt;
   damageterraineffect = &amp;lt;boolean&amp;gt;;&lt;br /&gt;
   damagetype = &amp;lt;string&amp;gt;;&lt;br /&gt;
 &lt;br /&gt;
   floorterrain = &amp;lt;string&amp;gt;;&lt;br /&gt;
   ceilingterrain = &amp;lt;string&amp;gt;;&lt;br /&gt;
 &lt;br /&gt;
   lightfloor = &amp;lt;integer&amp;gt;;&lt;br /&gt;
   lightceiling = &amp;lt;integer&amp;gt;;&lt;br /&gt;
   lightfloorabsolute = &amp;lt;boolean&amp;gt;;&lt;br /&gt;
   lightceilingabsolute = &amp;lt;boolean&amp;gt;;&lt;br /&gt;
 &lt;br /&gt;
   phasedlight = &amp;lt;boolean&amp;gt;;&lt;br /&gt;
   lightsequence = &amp;lt;boolean&amp;gt;;&lt;br /&gt;
   lightseqalt = &amp;lt;boolean&amp;gt;;&lt;br /&gt;
 &lt;br /&gt;
   colormaptop = &amp;lt;string&amp;gt;;&lt;br /&gt;
   colormapmid = &amp;lt;string&amp;gt;;&lt;br /&gt;
   colormapbottom = &amp;lt;string&amp;gt;;&lt;br /&gt;
 &lt;br /&gt;
   scroll_ceil_x = &amp;lt;floating-point&amp;gt;;&lt;br /&gt;
   scroll_ceil_y = &amp;lt;floating-point&amp;gt;;&lt;br /&gt;
   scroll_ceil_type = &amp;lt;string&amp;gt;;&lt;br /&gt;
   scroll_floor_x = &amp;lt;floating-point&amp;gt;;&lt;br /&gt;
   scroll_floor_y = &amp;lt;floating-point&amp;gt;;&lt;br /&gt;
   scroll_floor_type = &amp;lt;string&amp;gt;;&lt;br /&gt;
 &lt;br /&gt;
   floorid = &amp;lt;integer&amp;gt;;&lt;br /&gt;
   ceilingid = &amp;lt;integer&amp;gt;;&lt;br /&gt;
   attachfloor = &amp;lt;integer&amp;gt;;&lt;br /&gt;
   attachceiling = &amp;lt;integer&amp;gt;;&lt;br /&gt;
 &lt;br /&gt;
   soundsequence = &amp;lt;string&amp;gt;;&lt;br /&gt;
 &lt;br /&gt;
   portalfloor = &amp;lt;integer&amp;gt;;&lt;br /&gt;
   portalceiling = &amp;lt;integer&amp;gt;;&lt;br /&gt;
 &lt;br /&gt;
   portal_floor_disabled = &amp;lt;boolean&amp;gt;;&lt;br /&gt;
   portal_floor_norender = &amp;lt;boolean&amp;gt;;&lt;br /&gt;
   portal_floor_nopass = &amp;lt;boolean&amp;gt;;&lt;br /&gt;
   portal_floor_blocksound = &amp;lt;boolean&amp;gt;;&lt;br /&gt;
   portal_floor_useglobaltex = &amp;lt;boolean&amp;gt;;&lt;br /&gt;
   portal_floor_overlaytype = &amp;lt;string&amp;gt;;&lt;br /&gt;
   alphafloor = &amp;lt;floating-point&amp;gt;;&lt;br /&gt;
   portal_floor_attached = &amp;lt;boolean&amp;gt;;&lt;br /&gt;
 &lt;br /&gt;
   portal_ceil_disabled = &amp;lt;boolean&amp;gt;;&lt;br /&gt;
   portal_ceil_norender = &amp;lt;boolean&amp;gt;;&lt;br /&gt;
   portal_ceil_nopass = &amp;lt;boolean&amp;gt;;&lt;br /&gt;
   portal_ceil_blocksound = &amp;lt;boolean&amp;gt;;&lt;br /&gt;
   portal_ceil_useglobaltex = &amp;lt;boolean&amp;gt;;&lt;br /&gt;
   portal_ceil_overlaytype = &amp;lt;string&amp;gt;;&lt;br /&gt;
   alphaceiling = &amp;lt;floating-point&amp;gt;;&lt;br /&gt;
   portal_ceil_attached = &amp;lt;boolean&amp;gt;;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Explanation of fields ===&lt;br /&gt;
*&#039;&#039;&#039;heightfloor&#039;&#039;&#039;, &#039;&#039;&#039;heightceiling&#039;&#039;&#039; (mandatory)&lt;br /&gt;
:Unlike the base field from the core specs, these ones allow floating-point values.&lt;br /&gt;
*&#039;&#039;&#039;xpanningfloor&#039;&#039;&#039;, &#039;&#039;&#039;ypanningfloor&#039;&#039;&#039;, &#039;&#039;&#039;xpanningceiling&#039;&#039;&#039;, &#039;&#039;&#039;ypanningceiling&#039;&#039;&#039;&lt;br /&gt;
:These properties control the panning of the floor or ceiling flat.&lt;br /&gt;
*&#039;&#039;&#039;xscalefloor&#039;&#039;&#039;, &#039;&#039;&#039;yscalefloor&#039;&#039;&#039;, &#039;&#039;&#039;xscaleceiling&#039;&#039;&#039;, &#039;&#039;&#039;yscaleceiling&#039;&#039;&#039; (default: 1.0)&lt;br /&gt;
:These properties control the scaling of the floor or ceiling flat. Greater values result in smaller textures.&lt;br /&gt;
*&#039;&#039;&#039;rotationfloor&#039;&#039;&#039;, &#039;&#039;&#039;rotationceiling&#039;&#039;&#039;&lt;br /&gt;
:These properties control the clockwise rotation of the floor or ceiling flat, in degrees.&lt;br /&gt;
*&#039;&#039;&#039;secret&#039;&#039;&#039;&lt;br /&gt;
:If true, the sector counts as a secret when visited by player.&lt;br /&gt;
*&#039;&#039;&#039;friction&#039;&#039;&#039; (default: -1)&lt;br /&gt;
:This one controls the friction of movement on the floor. The value of this field is equivalent to the length of a horizontal linedef with the classic Boom friction special. Default value: -1 (use usual Doom friction).&lt;br /&gt;
*&#039;&#039;&#039;leakiness&#039;&#039;&#039;&lt;br /&gt;
:This one controls the probability that, if this sector is also damaging, it will leak damage through the radiation suit. As reference, the classic Doom 20% sector has 5 leakiness. For damage which always goes through the suit, use 256.&lt;br /&gt;
*&#039;&#039;&#039;damageamount&#039;&#039;&#039;&lt;br /&gt;
:Damage per hit for players on the floor.&lt;br /&gt;
*&#039;&#039;&#039;damageinterval&#039;&#039;&#039;&lt;br /&gt;
:Time between hits. The classic Doom damaging floors use a 32 period.&lt;br /&gt;
*&#039;&#039;&#039;damage_endgodmode&#039;&#039;&#039;&lt;br /&gt;
:If true, it will cause the damaging floor to disable the godmode cheat.&lt;br /&gt;
*&#039;&#039;&#039;damage_exitlevel&#039;&#039;&#039;&lt;br /&gt;
:If true, it will cause the damaging floor to exit the level in victory if the player has too little health.&lt;br /&gt;
*&#039;&#039;&#039;damageterraineffect&#039;&#039;&#039;&lt;br /&gt;
:If true, then each damage hit will produce a splash, like the Heretic lava.&lt;br /&gt;
*&#039;&#039;&#039;damagetype&#039;&#039;&#039; (default: &amp;quot;Unknown&amp;quot;)&lt;br /&gt;
:The [[damagetype|damage type]] of the floor. For Doom damaging floors you can use &amp;quot;Slime&amp;quot;.&lt;br /&gt;
*&#039;&#039;&#039;floorterrain&#039;&#039;&#039; (default: &amp;quot;@flat&amp;quot;)&lt;br /&gt;
:The [[terrain]] effect of the floor.&lt;br /&gt;
*&#039;&#039;&#039;ceilingterrain&#039;&#039;&#039; (default: &amp;quot;@flat&amp;quot;)&lt;br /&gt;
:The [[terrain]] effect of the ceiling. Currently used for particle recolouring.&lt;br /&gt;
*&#039;&#039;&#039;lightfloor&#039;&#039;&#039;, &#039;&#039;&#039;lightceiling&#039;&#039;&#039;&lt;br /&gt;
:The light amount to add to the floor or ceiling, relative to the designated light level.&lt;br /&gt;
*&#039;&#039;&#039;lightfloorabsolute&#039;&#039;&#039;, &#039;&#039;&#039;lightceilingabsolute&#039;&#039;&#039;&lt;br /&gt;
:If true, then &#039;&#039;&#039;lightfloor&#039;&#039;&#039; or &#039;&#039;&#039;lightceiling&#039;&#039;&#039; just overrides the light.&lt;br /&gt;
* phasedlight = &amp;lt;boolean&amp;gt;;&lt;br /&gt;
:Equivalent to ExtraData flag.&lt;br /&gt;
* lightsequence = &amp;lt;boolean&amp;gt;;&lt;br /&gt;
:Equivalent to ExtraData flag.&lt;br /&gt;
* lightseqalt = &amp;lt;boolean&amp;gt;;&lt;br /&gt;
:Equivalent to ExtraData flag.&lt;br /&gt;
*&#039;&#039;&#039;colormaptop&#039;&#039;&#039;, &#039;&#039;&#039;colormapmid&#039;&#039;&#039;, &#039;&#039;&#039;colormapbottom&#039;&#039;&#039; (default: &amp;quot;@default&amp;quot;)&lt;br /&gt;
:The colormap to set for the top, normal or bottom part of a Boom sector with fake flats. Or for any normal part, if it&#039;s &#039;&#039;&#039;colormapmid&#039;&#039;&#039;. Use a lump from between &#039;&#039;&#039;C_START&#039;&#039;&#039; and &#039;&#039;&#039;C_END&#039;&#039;&#039;. &amp;quot;WATERMAP&amp;quot; and &amp;quot;LAVAMAP&amp;quot; are provided by Eternity.&lt;br /&gt;
*&#039;&#039;&#039;scroll_ceil_x&#039;&#039;&#039;, &#039;&#039;&#039;scroll_ceil_y&#039;&#039;&#039;, &#039;&#039;&#039;scroll_floor_x&#039;&#039;&#039;, &#039;&#039;&#039;scroll_floor_y&#039;&#039;&#039;&lt;br /&gt;
:These fields make the sector ceiling or floor scroll at startup. The values you input there are the equivalents of a Boom trigger linedef length divided by 10. So to emulate a linedef pointing east of length 64 having a scroll trigger, set value 6.4 on &#039;&#039;&#039;scroll_ceil_x&#039;&#039;&#039; or &#039;&#039;&#039;scroll_floor_x&#039;&#039;&#039;.&lt;br /&gt;
*&#039;&#039;&#039;scroll_ceil_type&#039;&#039;&#039;, &#039;&#039;&#039;scroll_floor_type&#039;&#039;&#039; (default: &amp;quot;none&amp;quot;)&lt;br /&gt;
:These fields control the kind of scrolling for each surface and can be: &amp;quot;none&amp;quot; (no scrolling enabled), &amp;quot;visual&amp;quot; (only scroll the texture), &amp;quot;physical&amp;quot; (only carry the things), &amp;quot;both&amp;quot; (both scroll and carry). For now, &#039;&#039;&#039;scroll_ceil_type&#039;&#039;&#039; only supports &amp;quot;none&amp;quot; or &amp;quot;visual&amp;quot;.&lt;br /&gt;
*&#039;&#039;&#039;floorid&#039;&#039;&#039;, &#039;&#039;&#039;ceilingid&#039;&#039;&#039;&lt;br /&gt;
:ID of the floor or ceiling of this sector to use for [[attached surfaces]]. Use this id in &#039;&#039;&#039;attachfloor&#039;&#039;&#039; and &#039;&#039;&#039;attachceiling&#039;&#039;&#039;.&lt;br /&gt;
*&#039;&#039;&#039;attachfloor&#039;&#039;&#039;, &#039;&#039;&#039;attachceiling&#039;&#039;&#039;&lt;br /&gt;
:Makes the floor or ceiling of this sector move whenever sectors with &#039;&#039;&#039;floorid&#039;&#039;&#039; or &#039;&#039;&#039;ceilingid&#039;&#039;&#039; with the same number move their respective surfaces. If you want this sector&#039;s floor or ceiling to move in opposite direction, use the negative value.&lt;br /&gt;
*&#039;&#039;&#039;soundsequence&#039;&#039;&#039;&lt;br /&gt;
:Name of the [[soundsequence]] to use for the movement of this sector. It will only work if said soundsequence has an &#039;&#039;&#039;id&#039;&#039;&#039;. It can also be a number (the sound sequence &#039;&#039;&#039;id&#039;&#039;&#039;) surrounded by quotes.&lt;br /&gt;
*&#039;&#039;&#039;portalfloor&#039;&#039;&#039;, &#039;&#039;&#039;portalceiling&#039;&#039;&#039;&lt;br /&gt;
:Portal ID to use on the floor or ceiling of this sector, using the same value as the one set in [[Portal_Define]]. For two-way portals, use the negative number for the opposite portal (i.e. one way uses portal &#039;&#039;n&#039;&#039;, and the other way uses -&#039;&#039;n&#039;&#039;).&lt;br /&gt;
*&#039;&#039;&#039;portal_floor_disabled&#039;&#039;&#039;, &#039;&#039;&#039;portal_ceil_disabled&#039;&#039;&#039;&lt;br /&gt;
:If true, the portal is disabled (has no effect).&lt;br /&gt;
*&#039;&#039;&#039;portal_floor_norender&#039;&#039;&#039;, &#039;&#039;&#039;portal_ceil_norended&#039;&#039;&#039;&lt;br /&gt;
:If true, the portal is not rendered but may have effects.&lt;br /&gt;
*&#039;&#039;&#039;portal_floor_nopass&#039;&#039;&#039;, &#039;&#039;&#039;portal_ceil_nopass&#039;&#039;&#039;&lt;br /&gt;
:If true, it disables any linked portals interaction.&lt;br /&gt;
*&#039;&#039;&#039;portal_floor_blocksound&#039;&#039;&#039;, &#039;&#039;&#039;portal_ceil_blocksound&#039;&#039;&#039;&lt;br /&gt;
:If true, it blocks sounds from monsters listening for alerts.&lt;br /&gt;
*&#039;&#039;&#039;portal_floor_useglobaltex&#039;&#039;&#039;, &#039;&#039;&#039;portal_ceil_useglobaltex&#039;&#039;&#039;&lt;br /&gt;
:Reserved.&lt;br /&gt;
*&#039;&#039;&#039;portal_floor_overlaytype&#039;&#039;&#039;, &#039;&#039;&#039;portal_ceil_overlaytype&#039;&#039;&#039; (default: &amp;quot;none&amp;quot;)&lt;br /&gt;
:Can be &amp;quot;none&amp;quot;, &amp;quot;translucent&amp;quot; or &amp;quot;additive&amp;quot;. Controls the rendering of portal overlays.&lt;br /&gt;
*&#039;&#039;&#039;alphafloor&#039;&#039;&#039;, &#039;&#039;&#039;alphaceiling&#039;&#039;&#039; (default: 1.0)&lt;br /&gt;
:Alpha of the portal overlay. 1.0 makes it fully visible, 0.0 is invisible.&lt;br /&gt;
*&#039;&#039;&#039;portal_floor_attached&#039;&#039;&#039;, &#039;&#039;&#039;portal_ceil_attached&#039;&#039;&#039;&lt;br /&gt;
:If true, and the sector has a linked portal on the floor or ceiling, the portal will move along with the floor or ceiling surface, instead of remaining at the same height as default. This is useful for easily moving platforms vertically.&lt;br /&gt;
&lt;br /&gt;
==Things==&lt;br /&gt;
 thing&lt;br /&gt;
 {&lt;br /&gt;
   health = &amp;lt;floating-point&amp;gt;;&lt;br /&gt;
 }&lt;br /&gt;
===Explanation of fields===&lt;br /&gt;
*&#039;&#039;&#039;health&#039;&#039;&#039;&lt;br /&gt;
:Health modifier. Works like in ZDoom: 0 means no change from [[EDF]], positive values multiply the initial spawn health, and negative values change the absolute spawn health.&lt;/div&gt;</summary>
		<author><name>Printz</name></author>
	</entry>
	<entry>
		<id>https://eternity.youfailit.net/index.php?title=OPTIONS&amp;diff=6548</id>
		<title>OPTIONS</title>
		<link rel="alternate" type="text/html" href="https://eternity.youfailit.net/index.php?title=OPTIONS&amp;diff=6548"/>
		<updated>2026-06-14T13:44:51Z</updated>

		<summary type="html">&lt;p&gt;Printz: /* OPTIONS full listing */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;New to MBF, the OPTIONS lump allows wads to set game options, such as Doom Compatibility options, chat strings, and enemies options. &lt;br /&gt;
&lt;br /&gt;
The OPTIONS lump has the same format as eternity.cfg: A text file listing option names and values, optionally separated by blank or comment lines. Eternity.cfg indicates options which are allowed to be set in wads, with asterisks (*).&lt;br /&gt;
&lt;br /&gt;
Wad authors are urged to use these options responsibly, because they should not be used to limit players, but to enhance the game. Many options such as automap colors are allowed to be set from wads, but they should only be done so if there are strong reasons to do so. More recommended to enforce are the compatibility (comp_) settings, because certain map effects (such as moving floor combinations) may depend on them to work properly. [[Linked portals]] for example require the setting &amp;quot;comp_overunder 0&amp;quot; in order to work (and in fact enforce it as such, even if set otherwise by user), and in addition, due to Doom&#039;s default definition of solid static decorations, it is recommended to also set &amp;quot;comp_theights 0&amp;quot; (which itself is not enforced by portals).&lt;br /&gt;
&lt;br /&gt;
If a wad with OPTIONS lump is loaded, it will not overwrite the user configuration file.&lt;br /&gt;
{{backto|Eternity Engine}}&lt;br /&gt;
{{mbfref}}&lt;br /&gt;
==Options settable using the lump==&lt;br /&gt;
The Eternity.cfg file provides user-friendly explanation on each flag and if it&#039;s allowed to be set in wads. At the end of this document there is an excerpt from the default Eternity.cfg, with only the wad-settable options. Note that the lines beginning with semicolons or brackets are treated as comments and do nothing.&lt;br /&gt;
&lt;br /&gt;
===Common options which are set in other lumps===&lt;br /&gt;
&lt;br /&gt;
There may be other options you may be looking for, which for now aren&#039;t set here, but in other wad lumps:&lt;br /&gt;
*To disable jumping, set &#039;&#039;&#039;disable-jump&#039;&#039;&#039; in [[EMAPINFO]] for each needed level.&lt;br /&gt;
*See also [[EDF game properties]], which are for customizing global game-specific options.&lt;br /&gt;
&lt;br /&gt;
==OPTIONS full listing==&lt;br /&gt;
 [0-1(0)] 1 to enable variable pitch in sound effects (from id&#039;s original code) *&lt;br /&gt;
 pitched_sounds                0&lt;br /&gt;
 &lt;br /&gt;
 [0-1(1)] 1 to enable translucency for some things *&lt;br /&gt;
 translucency                  1&lt;br /&gt;
 &lt;br /&gt;
 [0-100(66)] set percentage of foreground/background translucency mix *&lt;br /&gt;
 tran_filter_pct              66&lt;br /&gt;
 &lt;br /&gt;
 [0-1(0)] 1 to enable recoil from weapon fire *&lt;br /&gt;
 weapon_recoil                 0&lt;br /&gt;
 &lt;br /&gt;
 [0-1(0)] 0 - don&#039;t center weapon when firing, 1 - center weapon when firing&lt;br /&gt;
 r_centerfire                  0&lt;br /&gt;
 &lt;br /&gt;
 [0-4(0)] 0 - normal, 1 - classic, 2 - 11k, 3 - bouncing!, 4 - burst *&lt;br /&gt;
 bfgtype                       0&lt;br /&gt;
 &lt;br /&gt;
 [0-3(0)] 0 - none, 1 - cross, 2 - angle *&lt;br /&gt;
 crosshair                     0&lt;br /&gt;
 &lt;br /&gt;
 [0-1(0)] 0 - no highlighting, 1 - aim highlighting enabled *&lt;br /&gt;
 crosshair_hilite              0&lt;br /&gt;
 &lt;br /&gt;
 [0-1(1)] 0 - scale crosshair, 1 - draw crosshair unscaled *&lt;br /&gt;
 crosshair_scale               1&lt;br /&gt;
 &lt;br /&gt;
 [0-1(0)] show scores in deathmatch *&lt;br /&gt;
 show_scores                   0&lt;br /&gt;
 &lt;br /&gt;
 [0-1(0)] 0 - right handed, 1 - left handed *&lt;br /&gt;
 lefthanded                    0&lt;br /&gt;
 &lt;br /&gt;
 [0-1(0)] 1 to keep switching weapon while holding hotkey&lt;br /&gt;
 weapon_hotkey_holding         0&lt;br /&gt;
 &lt;br /&gt;
 [0-1(1)] 1 to enable player bobbing (view moving up/down slightly) *&lt;br /&gt;
 player_bobbing                1&lt;br /&gt;
 &lt;br /&gt;
 [0-1(0)] 1 to enable monsters remembering enemies after killing others *&lt;br /&gt;
 monsters_remember             0&lt;br /&gt;
 &lt;br /&gt;
 [0-1(1)] 1 to enable monsters fighting against each other when provoked *&lt;br /&gt;
 monster_infighting            1&lt;br /&gt;
 &lt;br /&gt;
 [0-1(0)] 1 to enable monsters backing away from targets *&lt;br /&gt;
 monster_backing               0&lt;br /&gt;
 &lt;br /&gt;
 [0-1(0)] 1 to enable monsters to intelligently avoid hazards *&lt;br /&gt;
 monster_avoid_hazards         0&lt;br /&gt;
 &lt;br /&gt;
 [0-1(0)] 1 to enable monsters to move up/down steep stairs *&lt;br /&gt;
 monkeys                       0&lt;br /&gt;
 &lt;br /&gt;
 [0-1(1)] 1 to enable monsters to be affected by friction *&lt;br /&gt;
 monster_friction              1&lt;br /&gt;
 &lt;br /&gt;
 [0-1(1)] 1 to enable monsters to help dying friends *&lt;br /&gt;
 help_friends                  1&lt;br /&gt;
 &lt;br /&gt;
 [0-3(0)] number of single-player helpers *&lt;br /&gt;
 player_helpers                0&lt;br /&gt;
 &lt;br /&gt;
 [0-999(128)] distance friends stay away *&lt;br /&gt;
 friend_distance             128&lt;br /&gt;
 &lt;br /&gt;
 [0-1(1)] 1 to enable dogs to jump *&lt;br /&gt;
 dog_jumping                   1&lt;br /&gt;
 &lt;br /&gt;
 [0-1(1)] 1 to enable monster roaring when last enemy is remembered *&lt;br /&gt;
 p_lastenemyroar               1&lt;br /&gt;
 &lt;br /&gt;
 [0-1(1)] 1 to enable flying in the direction you are looking *&lt;br /&gt;
 p_pitchedflight               1&lt;br /&gt;
 &lt;br /&gt;
 [0-1(1)] 1 to disable use of color on status bar *&lt;br /&gt;
 sts_always_red                1&lt;br /&gt;
 &lt;br /&gt;
 [0-1(0)] 1 to make percent signs on status bar always gray *&lt;br /&gt;
 sts_pct_always_gray           0&lt;br /&gt;
 &lt;br /&gt;
 [0-1(0)] 1 to disable doubled card and skull key display on status bar *&lt;br /&gt;
 sts_traditional_keys          0&lt;br /&gt;
 &lt;br /&gt;
 [0-1(1)] Zombie players can exit levels *&lt;br /&gt;
 comp_zombie                   1&lt;br /&gt;
 &lt;br /&gt;
 [0-1(1)] Powerup cheats are not infinite duration *&lt;br /&gt;
 comp_infcheat                 1&lt;br /&gt;
 &lt;br /&gt;
 [0-1(1)] Build stairs exactly the same way that Doom does *&lt;br /&gt;
 comp_stairs                   1&lt;br /&gt;
 &lt;br /&gt;
 [0-1(0)] Monsters can telefrag on MAP30 *&lt;br /&gt;
 comp_telefrag                 0&lt;br /&gt;
 &lt;br /&gt;
 [0-1(0)] Some objects never move over tall ledges *&lt;br /&gt;
 comp_dropoff                  0&lt;br /&gt;
 &lt;br /&gt;
 [0-1(0)] Objects don&#039;t fall off ledges under their own weight *&lt;br /&gt;
 comp_falloff                  0&lt;br /&gt;
 &lt;br /&gt;
 [0-1(0)] Monsters randomly walk off of moving lifts *&lt;br /&gt;
 comp_staylift                 0&lt;br /&gt;
 &lt;br /&gt;
 [0-1(0)] Monsters get stuck on doortracks *&lt;br /&gt;
 comp_doorstuck                0&lt;br /&gt;
 &lt;br /&gt;
 [0-1(0)] Monsters don&#039;t give up pursuit of targets *&lt;br /&gt;
 comp_pursuit                  0&lt;br /&gt;
 &lt;br /&gt;
 [0-1(1)] Arch-Vile resurrects invincible ghosts *&lt;br /&gt;
 comp_vile                     1&lt;br /&gt;
 &lt;br /&gt;
 [0-1(0)] Pain Elemental limited to 20 lost souls *&lt;br /&gt;
 comp_pain                     0&lt;br /&gt;
 &lt;br /&gt;
 [0-1(1)] Lost souls get stuck behind walls *&lt;br /&gt;
 comp_skull                    1&lt;br /&gt;
 &lt;br /&gt;
 [0-1(0)] Blazing doors make double closing sounds *&lt;br /&gt;
 comp_blazing                  0&lt;br /&gt;
 &lt;br /&gt;
 [0-1(0)] Tagged doors don&#039;t trigger special lighting *&lt;br /&gt;
 comp_doorlight                0&lt;br /&gt;
 &lt;br /&gt;
 [0-1(1)] God mode isn&#039;t absolute *&lt;br /&gt;
 comp_god                      1&lt;br /&gt;
 &lt;br /&gt;
 [0-1(1)] Sky is unaffected by invulnerability *&lt;br /&gt;
 comp_skymap                   1&lt;br /&gt;
 &lt;br /&gt;
 [0-1(0)] Use exactly Doom&#039;s floor motion behavior *&lt;br /&gt;
 comp_floors                   0&lt;br /&gt;
 &lt;br /&gt;
 [0-1(0)] Use exactly Doom&#039;s linedef trigger model *&lt;br /&gt;
 comp_model                    0&lt;br /&gt;
 &lt;br /&gt;
 [0-1(0)] Linedef effects work with sector tag = 0 *&lt;br /&gt;
 comp_zerotags                 0&lt;br /&gt;
 &lt;br /&gt;
 [0-1(1)] Terrain effects not activated on floor contact *&lt;br /&gt;
 comp_terrain                  1&lt;br /&gt;
 &lt;br /&gt;
 [0-1(0)] Creatures with no spawnpoint respawn at (0,0) *&lt;br /&gt;
 comp_respawnfix               0&lt;br /&gt;
 &lt;br /&gt;
 [0-1(1)] Players do not take falling damage *&lt;br /&gt;
 comp_fallingdmg               1&lt;br /&gt;
 &lt;br /&gt;
 [0-1(0)] Lost souls do not bounce on floors *&lt;br /&gt;
 comp_soul                     0&lt;br /&gt;
 &lt;br /&gt;
 [0-1(0)] Things not fully clipped with respect to z coord *&lt;br /&gt;
 comp_overunder                0&lt;br /&gt;
 &lt;br /&gt;
 [0-1(0)] DOOM thingtypes use inaccurate height information *&lt;br /&gt;
 comp_theights                 0&lt;br /&gt;
 &lt;br /&gt;
 [0-1(0)] Tracer shots cannot hit the floor or ceiling *&lt;br /&gt;
 comp_planeshoot               0&lt;br /&gt;
 &lt;br /&gt;
 [0-1(0)] One-time line specials are cleared on failure *&lt;br /&gt;
 comp_special                  0&lt;br /&gt;
 &lt;br /&gt;
 [0-1(0)] Silent spawns at W/SW/S-facing DM spots *&lt;br /&gt;
 comp_ninja                    0&lt;br /&gt;
 &lt;br /&gt;
 [0-1(1)] Disable jumping for DOOM/Heretic *&lt;br /&gt;
 comp_aircontrol               1&lt;br /&gt;
 &lt;br /&gt;
 [0-1(0)] MObjs are lit by transfered light *&lt;br /&gt;
 comp_thingsectorlight         0&lt;br /&gt;
 &lt;br /&gt;
 [(&amp;quot;No&amp;quot;)] chat string associated with 0 key *&lt;br /&gt;
 chatmacro0                &amp;quot;No&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 [(&amp;quot;I&#039;m ready to kick butt!&amp;quot;)] chat string associated with 1 key *&lt;br /&gt;
 chatmacro1                &amp;quot;I&#039;m ready to kick butt!&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 [(&amp;quot;I&#039;m OK.&amp;quot;)] chat string associated with 2 key *&lt;br /&gt;
 chatmacro2                &amp;quot;I&#039;m OK.&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 [(&amp;quot;I&#039;m not looking too good!&amp;quot;)] chat string associated with 3 key *&lt;br /&gt;
 chatmacro3                &amp;quot;I&#039;m not looking too good!&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 [(&amp;quot;Help!&amp;quot;)] chat string associated with 4 key *&lt;br /&gt;
 chatmacro4                &amp;quot;Help!&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 [(&amp;quot;You suck!&amp;quot;)] chat string associated with 5 key *&lt;br /&gt;
 chatmacro5                &amp;quot;You suck!&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 [(&amp;quot;Next time, scumbag...&amp;quot;)] chat string associated with 6 key *&lt;br /&gt;
 chatmacro6                &amp;quot;Next time, scumbag...&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 [(&amp;quot;Come here!&amp;quot;)] chat string associated with 7 key *&lt;br /&gt;
 chatmacro7                &amp;quot;Come here!&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 [(&amp;quot;I&#039;ll take care of it.&amp;quot;)] chat string associated with 8 key *&lt;br /&gt;
 chatmacro8                &amp;quot;I&#039;ll take care of it.&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 [(&amp;quot;Yes&amp;quot;)] chat string associated with 9 key *&lt;br /&gt;
 chatmacro9                &amp;quot;Yes&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 [0-255(247)] color used as background for automap *&lt;br /&gt;
 mapcolor_back               247&lt;br /&gt;
 &lt;br /&gt;
 [0-255(104)] color used for automap grid lines *&lt;br /&gt;
 mapcolor_grid               104&lt;br /&gt;
 &lt;br /&gt;
 [0-255(181)] color used for one side walls on automap *&lt;br /&gt;
 mapcolor_wall               181&lt;br /&gt;
 &lt;br /&gt;
 [0-255(166)] color used for lines floor height changes across *&lt;br /&gt;
 mapcolor_fchg               166&lt;br /&gt;
 &lt;br /&gt;
 [0-255(231)] color used for lines ceiling height changes across *&lt;br /&gt;
 mapcolor_cchg               231&lt;br /&gt;
 &lt;br /&gt;
 [0-255(231)] color used for lines denoting closed doors, objects *&lt;br /&gt;
 mapcolor_clsd               231&lt;br /&gt;
 &lt;br /&gt;
 [0-255(175)] color used for red key sprites *&lt;br /&gt;
 mapcolor_rkey               175&lt;br /&gt;
 &lt;br /&gt;
 [0-255(204)] color used for blue key sprites *&lt;br /&gt;
 mapcolor_bkey               204&lt;br /&gt;
 &lt;br /&gt;
 [0-255(231)] color used for yellow key sprites *&lt;br /&gt;
 mapcolor_ykey               231&lt;br /&gt;
 &lt;br /&gt;
 [0-255(175)] color used for closed red doors *&lt;br /&gt;
 mapcolor_rdor               175&lt;br /&gt;
 &lt;br /&gt;
 [0-255(204)] color used for closed blue doors *&lt;br /&gt;
 mapcolor_bdor               204&lt;br /&gt;
 &lt;br /&gt;
 [0-255(231)] color used for closed yellow doors *&lt;br /&gt;
 mapcolor_ydor               231&lt;br /&gt;
 &lt;br /&gt;
 [0-255(119)] color used for teleporter lines *&lt;br /&gt;
 mapcolor_tele               119&lt;br /&gt;
 &lt;br /&gt;
 [0-255(176)] color used for lines around secret sectors *&lt;br /&gt;
 mapcolor_secr               176&lt;br /&gt;
 &lt;br /&gt;
 [0-255(0)] color used for exit lines *&lt;br /&gt;
 mapcolor_exit                 0&lt;br /&gt;
 &lt;br /&gt;
 [0-255(96)] color used for lines not seen without computer map *&lt;br /&gt;
 mapcolor_unsn                96&lt;br /&gt;
 &lt;br /&gt;
 [0-255(88)] color used for lines with no height changes *&lt;br /&gt;
 mapcolor_flat                88&lt;br /&gt;
 &lt;br /&gt;
 [0-255(112)] color used as things *&lt;br /&gt;
 mapcolor_sprt               112&lt;br /&gt;
 &lt;br /&gt;
 [0-255(208)] color used for dot crosshair denoting center of map *&lt;br /&gt;
 mapcolor_hair               208&lt;br /&gt;
 &lt;br /&gt;
 [0-255(208)] color used for the single player arrow *&lt;br /&gt;
 mapcolor_sngl               208&lt;br /&gt;
 &lt;br /&gt;
 [0-255(112)] color used for the green player arrow *&lt;br /&gt;
 mapcolor_ply1               112&lt;br /&gt;
 &lt;br /&gt;
 [0-255(88)] color used for the gray player arrow *&lt;br /&gt;
 mapcolor_ply2                88&lt;br /&gt;
 &lt;br /&gt;
 [0-255(64)] color used for the brown player arrow *&lt;br /&gt;
 mapcolor_ply3                64&lt;br /&gt;
 &lt;br /&gt;
 [0-255(176)] color used for the red player arrow *&lt;br /&gt;
 mapcolor_ply4               176&lt;br /&gt;
 &lt;br /&gt;
 [0-255(252)] color used for friends *&lt;br /&gt;
 mapcolor_frnd               252&lt;br /&gt;
 &lt;br /&gt;
 [0-255(109)] color for lines not in the player&#039;s portal area *&lt;br /&gt;
 mapcolor_prtl               109&lt;br /&gt;
 &lt;br /&gt;
 [0-1(1)] 1 to overlay different linked portal areas in the automap *&lt;br /&gt;
 mapportal_overlay             1&lt;br /&gt;
 &lt;br /&gt;
 [0-1(1)] 1 to show automap pointer coordinates in non-follow mode *&lt;br /&gt;
 map_point_coord               1&lt;br /&gt;
 &lt;br /&gt;
 [0-1(1)] 1 to not show secret sectors till after entered *&lt;br /&gt;
 map_secret_after              1&lt;br /&gt;
 &lt;br /&gt;
 [0-1(1)] enable secret notification *&lt;br /&gt;
 secret_notification           1&lt;br /&gt;
 &lt;br /&gt;
 [1-16(1)] number of lines in review display *&lt;br /&gt;
 hud_msg_lines                 1&lt;br /&gt;
 &lt;br /&gt;
 [0-1(1)] 1 enables message review list scrolling upward *&lt;br /&gt;
 hud_msg_scrollup              1&lt;br /&gt;
 &lt;br /&gt;
 [0-4(2)] fullscreen hud layout *&lt;br /&gt;
 hud_overlaylayout             2&lt;br /&gt;
 &lt;br /&gt;
 [0-1(1)] fullscreen hud enabled *&lt;br /&gt;
 hud_enabled                   1&lt;br /&gt;
 &lt;br /&gt;
 [0-1(0)] hide kills/items/secrets info on fullscreen hud *&lt;br /&gt;
 hud_hidestatus                0&lt;br /&gt;
 &lt;br /&gt;
 [0-1(1)] display current level time on automap *&lt;br /&gt;
 hu_showtime                   1&lt;br /&gt;
 &lt;br /&gt;
 [0-1(1)] display player/pointer coordinates on automap *&lt;br /&gt;
 hu_showcoords                 1&lt;br /&gt;
 &lt;br /&gt;
 [0-9(6)] color of automap level time widget *&lt;br /&gt;
 hu_timecolor                  6&lt;br /&gt;
 &lt;br /&gt;
 [0-9(6)] color of automap level name widget *&lt;br /&gt;
 hu_levelnamecolor             6&lt;br /&gt;
 &lt;br /&gt;
 [0-9(6)] color of automap coordinates widget *&lt;br /&gt;
 hu_coordscolor                6&lt;br /&gt;
 &lt;br /&gt;
 [0-200(25)] amount of health for red to yellow transition *&lt;br /&gt;
 health_red                   25&lt;br /&gt;
 &lt;br /&gt;
 [0-200(50)] amount of health for yellow to green transition *&lt;br /&gt;
 health_yellow                50&lt;br /&gt;
 &lt;br /&gt;
 [0-200(100)] amount of health for green to blue transition *&lt;br /&gt;
 health_green                100&lt;br /&gt;
 &lt;br /&gt;
 [0-200(25)] amount of armor for red to yellow transition *&lt;br /&gt;
 armor_red                    25&lt;br /&gt;
 &lt;br /&gt;
 [0-200(50)] amount of armor for yellow to green transition *&lt;br /&gt;
 armor_yellow                 50&lt;br /&gt;
 &lt;br /&gt;
 [0-200(100)] amount of armor for green to blue transition *&lt;br /&gt;
 armor_green                 100&lt;br /&gt;
 &lt;br /&gt;
 [0-1(1)] reflect armor class using blue or green color *&lt;br /&gt;
 armor_byclass                 1&lt;br /&gt;
 &lt;br /&gt;
 [0-100(25)] percent of ammo for red to yellow transition *&lt;br /&gt;
 ammo_red                     25&lt;br /&gt;
 &lt;br /&gt;
 [0-100(50)] percent of ammo for yellow to green transition *&lt;br /&gt;
 ammo_yellow                  50&lt;br /&gt;
 &lt;br /&gt;
 [0-100(100)] fullscreen HUD translucency level *&lt;br /&gt;
 st_fsalpha                  100&lt;br /&gt;
 &lt;br /&gt;
 [0-1(0)] obituaries on/off *&lt;br /&gt;
 obituaries                    0&lt;br /&gt;
 &lt;br /&gt;
 [0-1(0)] toggle particle effects on or off *&lt;br /&gt;
 draw_particles                0&lt;br /&gt;
 &lt;br /&gt;
 [0-2(1)] particle translucency (0 = none, 1 = smooth, 2 = general) *&lt;br /&gt;
 particle_trans                1&lt;br /&gt;
 &lt;br /&gt;
 [0-2(0)] use sprites, particles, or both for blood (sprites = 0) *&lt;br /&gt;
 blood_particles               0&lt;br /&gt;
 &lt;br /&gt;
 [0-2(0)] use sprites, particles, or both for bullet puffs (sprites = 0) *&lt;br /&gt;
 bullet_particles              0&lt;br /&gt;
 &lt;br /&gt;
 [0-1(0)] draw particle rocket trails *&lt;br /&gt;
 rocket_trails                 0&lt;br /&gt;
 &lt;br /&gt;
 [0-1(0)] draw particle grenade trails *&lt;br /&gt;
 grenade_trails                0&lt;br /&gt;
 &lt;br /&gt;
 [0-1(0)] draw particle bfg cloud *&lt;br /&gt;
 bfg_cloud                     0&lt;br /&gt;
 &lt;br /&gt;
 [0-1(0)] draw particle rocket explosions *&lt;br /&gt;
 pevent_rexpl                  0&lt;br /&gt;
 &lt;br /&gt;
 [0-1(0)] draw particle bfg explosions *&lt;br /&gt;
 pevent_bfgexpl                0&lt;br /&gt;
 &lt;br /&gt;
 [0-1(1)] 1 to show ENDOOM at exit *&lt;br /&gt;
 showendoom                    1&lt;br /&gt;
 &lt;br /&gt;
 [0-1(1)] 1 to enable autoaiming *&lt;br /&gt;
 autoaim                       1&lt;br /&gt;
 &lt;br /&gt;
 [0-1(0)] 1 to allow players to look up/down *&lt;br /&gt;
 allowmlook                    0&lt;br /&gt;
 &lt;br /&gt;
 [0-1(0)] 1 to enable use of full classic menu emulation *&lt;br /&gt;
 mn_classic_menus              0&lt;br /&gt;
 &lt;br /&gt;
 [(&amp;quot;default&amp;quot;)] menu background *&lt;br /&gt;
 mn_background             &amp;quot;default&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 [0-2(1)] Doom object translucency style (0 = none, 1 = Boom, 2 = new) *&lt;br /&gt;
 r_tlstyle                     1&lt;br /&gt;
 &lt;br /&gt;
 [0-2(1)] 0 = none, 1 = melt, 2 = fade *&lt;br /&gt;
 wipetype                      1&lt;br /&gt;
 &lt;br /&gt;
 [1-6(1)] preamp volume factor for SPC music *&lt;br /&gt;
 snd_spcpreamp                 1&lt;br /&gt;
 &lt;br /&gt;
 [1-31(8)] bass boost for SPC music (logarithmic scale, 8 = normal) *&lt;br /&gt;
 snd_spcbassboost              8&lt;br /&gt;
 &lt;br /&gt;
 [-1-0(-1)] device used for MIDI playback *&lt;br /&gt;
 snd_mididevice               -1&lt;br /&gt;
 &lt;br /&gt;
 [1-8(2)] TODO: adlmidi_numcards description *&lt;br /&gt;
 snd_numchips                  2&lt;br /&gt;
 &lt;br /&gt;
 [0-75(72)] TODO: adlmidi_bank description *&lt;br /&gt;
 snd_bank                     72&lt;/div&gt;</summary>
		<author><name>Printz</name></author>
	</entry>
	<entry>
		<id>https://eternity.youfailit.net/index.php?title=List_of_cheat_codes&amp;diff=6547</id>
		<title>List of cheat codes</title>
		<link rel="alternate" type="text/html" href="https://eternity.youfailit.net/index.php?title=List_of_cheat_codes&amp;diff=6547"/>
		<updated>2026-06-14T13:42:33Z</updated>

		<summary type="html">&lt;p&gt;Printz: /* Eternity Cheats */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The Eternity Engine supports several cheat codes besides what vanilla Doom has. The list follows.&lt;br /&gt;
{{Backto|Eternity Engine}}&lt;br /&gt;
{{editref}}&lt;br /&gt;
==Classic Doom cheats==&lt;br /&gt;
These cheats are available in Doom and Doom 2, and function mostly if not identically the same.&lt;br /&gt;
===IDMUS===&lt;br /&gt;
IDMUS allows the music to be changed to any other internally defined music. Type IDMUS and then the level number to hear the song that plays on that map (in DOOM and Heretic, use the episode and then map; in DOOM II, use the 2-digit map number). Typing numbers beyond the number of levels in the game will allow you to hear other songs such as intermission, title, and ending music. This cheat won&#039;t crash on bad numbers like DOOM originally could.&lt;br /&gt;
===IDCHOPPERS===&lt;br /&gt;
IDCHOPPERS gives you the chainsaw. It is named after a game entered in a state programming contest, and the message it gives is related to it.&lt;br /&gt;
===IDDQD===&lt;br /&gt;
IDDQD sets the player&#039;s health to 100 and toggles god mode. DQD stands for Delta-Q-Delta, a supposed fraternity for programmers where the requirement for entry was at least one Q (a mark given in college for a class withdrawal) on your transcript.&lt;br /&gt;
===IDK, IDKFA, IDFA===&lt;br /&gt;
These cheats give the following: &lt;br /&gt;
*IDK: All six DOOM keys &lt;br /&gt;
*IDKFA: All six keys, full ammo and weapons, and armor &lt;br /&gt;
*IDFA: Full ammo, weapons, and armor, but no keys &lt;br /&gt;
IDK is new as of the BOOM engine. According to the Linux DOOM source, KFA either stands for killer fraggin&#039; arsenal (although a less kosher word is used for fraggin&#039;), or Keys and Full Ammo. You can take your pick.&lt;br /&gt;
===IDCLIP, IDSPISPOPD===&lt;br /&gt;
These two cheats have identical functionality, which is turning off the game&#039;s clipping code for the player. This allows you to walk through walls and solid things, and even completely out of the map. SPISPOPD stands for &amp;quot;Smashing Pumpkins Into Small Piles Of Putrid Debris,&amp;quot; and has its origins in the pre-DOOM-release Usenet mayhem.&lt;br /&gt;
===IDBEHOLD===&lt;br /&gt;
Typing IDBEHOLD will bring up a small menu where you can choose to enable one of various powerup effects. To choose a powerup, use the following keys: &lt;br /&gt;
*R: Toggles radiation suit &lt;br /&gt;
*I: Toggles partial invisibility &lt;br /&gt;
*V: Toggles invulnerability (with inverse colormap) &lt;br /&gt;
*A: Toggles all-map cheat (reveals the automap) &lt;br /&gt;
*L: Toggles lite-amp goggles &lt;br /&gt;
*S: Toggles berserk strength &lt;br /&gt;
In DOOM, some of these effects would wear off after the normal amount of time. By default, Eternity allows them to stay on forever until you explicitly turn them off by typing the cheat again.&lt;br /&gt;
===IDCLEV===&lt;br /&gt;
This cheat allows you to change levels. In DOOM or Heretic, type the episode number and then the map number after the cheat. In DOOM II, type the two-digit level number. You can only warp to levels which are normally in the game, even if other map numbers are available in the wad (to warp to oddly-named or higher-numbered levels, use Eternity&#039;s map console command).&lt;br /&gt;
===IDMYPOS===&lt;br /&gt;
This cheat prints detailed information about your current location. The format of its output has been improved over that which was used in DOOM; however, this cheat&#039;s function is mostly obsoleted by the automap coordinates widget.&lt;br /&gt;
===IDDT===&lt;br /&gt;
To activate this cheat, go to the automap and type IDDT. Doing this once will allow you to see all lines in the map. Doing it again will allow you to also see all things in the map. Type it a third time to return the automap to normal. You can see some areas of the map with IDDT that you cannot see with the all-map powerup.&lt;br /&gt;
==Classic Heretic cheats==&lt;br /&gt;
These cheats are available in Heretic,.&lt;br /&gt;
===QUICKEN===&lt;br /&gt;
Toggles god mode (invulnerability).&lt;br /&gt;
===PONCE===&lt;br /&gt;
Restores health (to the initial player class health).&lt;br /&gt;
===IDDQD===&lt;br /&gt;
Fake bait cheat, actually kills the player.&lt;br /&gt;
===SKEL===&lt;br /&gt;
Gives all keys.&lt;br /&gt;
===MASSACRE===&lt;br /&gt;
Kills all monsters.&lt;br /&gt;
===KITTY===&lt;br /&gt;
Toggles no-clipping mode (walking through walls).&lt;br /&gt;
===ENGAGE===&lt;br /&gt;
Followed by the episode and level number, changes the current level. All equipment is reset to wand start.&lt;br /&gt;
===RAVMAP===&lt;br /&gt;
Usable in automap mode, toggles between normal display, displaying the entire map and also displaying things.&lt;br /&gt;
===RAVPOWER===&lt;br /&gt;
Followed by any of the following initials, gives or takes player one of the following powers:&lt;br /&gt;
*v: invulnerability&lt;br /&gt;
*g: shadowsphere&lt;br /&gt;
*a: map scroll&lt;br /&gt;
*t: torch&lt;br /&gt;
*f: wings of wrath&lt;br /&gt;
*r: damaging floor protection (no such powerup in Heretic)&lt;br /&gt;
===GIMME===&lt;br /&gt;
Followed by any of the following letters, then by amount, it gives the player an inventory item of the following type:&lt;br /&gt;
*a: ring of invulnerability&lt;br /&gt;
*b: shadowsphere&lt;br /&gt;
*c: quartz flask&lt;br /&gt;
*d: mystic urn&lt;br /&gt;
*e: tome of power&lt;br /&gt;
*f: torch&lt;br /&gt;
*g: time bomb of the ancients&lt;br /&gt;
*h: morph ovum&lt;br /&gt;
*i: wings of wrath&lt;br /&gt;
*j: chaos device&lt;br /&gt;
===RAMBO===&lt;br /&gt;
Gives all weapons, bag of holding and armour.&lt;br /&gt;
===COCKADOODLEDOO===&lt;br /&gt;
Toggles player morphing into a chicken.&lt;br /&gt;
==BOOM and MBF Cheats==&lt;br /&gt;
These cheats were added in BOOM and MBF. Some of them have been changed slightly (in BOOM, many of them had a TNT prefix, which was removed in MBF).&lt;br /&gt;
===COMP===&lt;br /&gt;
This cheat toggles all of the compatibility vector variables at once, turning them on or off.&lt;br /&gt;
===KILLEM===&lt;br /&gt;
This cheat kills all monsters on the map, keeping count (it counts monsters which do not normally count for kills, such as Lost Souls, so the number may be higher than the kill count for the map). If there are no enemy monsters on the map and you type this, it will kill all friends on the map (not including the player, of course).&lt;br /&gt;
&lt;br /&gt;
Same as the &amp;quot;nuke&amp;quot; console command.&lt;br /&gt;
===HOM===&lt;br /&gt;
This cheat toggles the BOOM HOM detection feature. Depending on your settings, HOM will appear either as solid red or as a red flashing area when this cheat is enabled.&lt;br /&gt;
&lt;br /&gt;
Same as the &amp;quot;r_showhom /&amp;quot; console command.&lt;br /&gt;
===KEY===&lt;br /&gt;
Type KEY to bring up a menu, then type R, Y, or B to choose a key color (red, yellow, or blue). Then, type C or S to select card or skull. Once you make the final selection, the key will either be given to you if you don&#039;t have it, or it will be taken away. This lets you select the key you need (especially useful in maps with missing keys).&lt;br /&gt;
===WEAP===&lt;br /&gt;
Type WEAP, then type a number (1-9 in DOOM II, 1-8 in DOOM). The selected weapon which is associated with that slot will either be added or removed, depending on whether you have it or not (note the Super Shotgun is weapon #9 in DOOM II). You can remove the fist, chainsaw, and pistol with this code, but cannot get them back unless you type it again.&lt;br /&gt;
===AMMO===&lt;br /&gt;
Type AMMO, then either type a number from 1 to 4, or B for Backpack. The selected ammo will be added or taken away (yes, you can remove the backpack if you already have it). Ammo types are bullets, shells, rockets, and cells.&lt;br /&gt;
===TRAN===&lt;br /&gt;
This code toggles translucency rendering effects (both BOOM-style and DosDOOM-style). Sometimes turning this off can help the framerate a bit, especially on really old machines.&lt;br /&gt;
===ICE===&lt;br /&gt;
Type this cheat to toggle BOOM friction effects.&lt;br /&gt;
===PUSH===&lt;br /&gt;
Type this cheat to toggle BOOM pusher effects.&lt;br /&gt;
&lt;br /&gt;
Same as the &amp;quot;pushers /&amp;quot; console command.&lt;br /&gt;
===NUKE===&lt;br /&gt;
Type this cheat to toggle the effects of damaging sectors.&lt;br /&gt;
&lt;br /&gt;
==Eternity Cheats==&lt;br /&gt;
These cheat codes are new to Eternity.&lt;br /&gt;
===HIDEME ===&lt;br /&gt;
&lt;br /&gt;
This cheat toggles the new total invisibility powerup effect. When totally invisible, enemies will not awaken by seeing you. Deaf enemies cannot awaken at all, since they can neither see nor hear you. However, if a normal enemy hears you, this cheat will only become as good as partial invisibility, as the demons have a sense for where you are even when you are invisible. &lt;br /&gt;
&lt;br /&gt;
===GHOST===&lt;br /&gt;
&lt;br /&gt;
This cheat toggles the Heretic shadowsphere effect. You will become translucent, and if you move slowly and keep at a distance, enemies may fail to see you. They also cannot aim at you well even when they do see you, just as with partial and total invisibility. &lt;br /&gt;
&lt;br /&gt;
Same as the &amp;quot;r_trans /&amp;quot; console command.&lt;br /&gt;
&lt;br /&gt;
===INFSHOTS ===&lt;br /&gt;
&lt;br /&gt;
This cheat toggles infinite ammo. When turned on, none of your weapons will use any ammo whatsoever. &lt;br /&gt;
&lt;br /&gt;
===SILENCE ===&lt;br /&gt;
&lt;br /&gt;
This cheat toggles the new silencer powerup effect. When active, your weapons&#039; sounds will not cause enemies to awaken. When combined with HIDEME, enemies will never wake up unless you hurt them. &lt;br /&gt;
&lt;br /&gt;
===IAMTHEONE ===&lt;br /&gt;
&lt;br /&gt;
This is a master cheat which will make you all-powerful. It will turn on god mode, infinite ammo, total invisibility, and silencer effects if they are not on (it will not deactivate them if you type it again). It also gives full ammo, weapons, and armor.&lt;br /&gt;
&lt;br /&gt;
===IDDKT, IDDIT, IDDST===&lt;br /&gt;
These cheat codes work when automap is active, and move the cursor to the next remaining monster, item or secret which counts for the final score.&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
* [[List of console commands]]&lt;/div&gt;</summary>
		<author><name>Printz</name></author>
	</entry>
	<entry>
		<id>https://eternity.youfailit.net/index.php?title=BFGSpray&amp;diff=6546</id>
		<title>BFGSpray</title>
		<link rel="alternate" type="text/html" href="https://eternity.youfailit.net/index.php?title=BFGSpray&amp;diff=6546"/>
		<updated>2026-06-14T13:38:41Z</updated>

		<summary type="html">&lt;p&gt;Printz: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{codepointer|description=BFGSpray is a codepointer which causes a BFG explosion effect.|usage=&#039;&#039;&#039;BFGSpray&#039;&#039;&#039;(&#039;&#039;sprayType&#039;&#039;, &#039;&#039;numRays&#039;&#039;, &#039;&#039;damageCount&#039;&#039;, &#039;&#039;fov&#039;&#039;, &#039;&#039;maxDist&#039;&#039;, &#039;&#039;damageMOD&#039;&#039;)&lt;br /&gt;
|parameters=&lt;br /&gt;
*&#039;&#039;sprayType&#039;&#039;: name of thing type to spawn on hit targets. Default is the thingtype with dehackednum 43, which in Doom is BFGFlash.&lt;br /&gt;
*&#039;&#039;numRays&#039;&#039;: number of rays. Default: 40.&lt;br /&gt;
*&#039;&#039;damageCount&#039;&#039;: how many times to add the random 1-8 damage for each ray. Default: 15.&lt;br /&gt;
*&#039;&#039;fov&#039;&#039;: angle in degrees of the spread. Default: 90.&lt;br /&gt;
*&#039;&#039;maxDist&#039;&#039;: range of each ray. Default: 1024.&lt;br /&gt;
*&#039;&#039;damageMOD&#039;&#039;: means-of-death (damage type). Default: BFG_Splash.&lt;br /&gt;
|notes=&lt;br /&gt;
The effect differs depending on the player&#039;s selected type of BFG:&lt;br /&gt;
&lt;br /&gt;
*Normal BFG: &#039;&#039;numRays&#039;&#039; tracers will emanate from the object which fired the projectile in the general direction in which the projectile was fired, each doing damage that is the sum of &#039;&#039;damageCount&#039;&#039; rolls of an 8-sided die.&lt;br /&gt;
*BFG11K: Control is transferred to the [[BFG11KHit]] codepointer.&lt;br /&gt;
*Bouncing BFG: Control is transferred to the [[BouncingBFG]] codepointer.&lt;br /&gt;
*Plasma Burst BFG: Control is transferred to the [[BFGBurst]] codepointer.&lt;br /&gt;
&lt;br /&gt;
Note: this will not trigger the Doom beta BFG attack if its gameplay setting is enabled. There is a separate set of frames for the classic BFG that replace the normal BFG9000.|seealso=&lt;br /&gt;
*[[BFG11KHit]]&lt;br /&gt;
*[[BFGBurst]]&lt;br /&gt;
*[[BouncingBFG]]|examples=&lt;br /&gt;
{{example|description=From base\doom\frames.edf:|code=&amp;lt;nowiki&amp;gt;frame S_BFGLAND3 { cmp = &amp;quot;BFE1|2|T|8|BFGSpray|@next&amp;quot;;       dehackednum = 119 }&amp;lt;/nowiki&amp;gt;}}}}&lt;/div&gt;</summary>
		<author><name>Printz</name></author>
	</entry>
	<entry>
		<id>https://eternity.youfailit.net/index.php?title=VileAttack&amp;diff=6545</id>
		<title>VileAttack</title>
		<link rel="alternate" type="text/html" href="https://eternity.youfailit.net/index.php?title=VileAttack&amp;diff=6545"/>
		<updated>2026-06-14T13:37:30Z</updated>

		<summary type="html">&lt;p&gt;Printz: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Type: Monster attack, normal&lt;br /&gt;
&lt;br /&gt;
Purpose: If the object&#039;s target is valid and can currently be seen by the object, an Archvile explosion attack will occur. The object will face its target, emit the &amp;quot;barexp&amp;quot; sound, and damage the object directly for 20 points of damage. This attack will also impart an upward velocity to the target of (1000 / mass) units per tic. If the object has a currently spawned VileFire object, that object will emit a blast radius of 70 units, with maximum damage of 70 at the center of the explosion. This explosion can damage the attacking object if it is not immune to blast radius damage.&lt;br /&gt;
&lt;br /&gt;
Thunk: Yes.&lt;br /&gt;
&lt;br /&gt;
==Optional parameters==&lt;br /&gt;
Even though VileAttack is a classic Doom codepointer, it accepts the following optional arguments:&lt;br /&gt;
# name of sound to play (default &amp;quot;barexp&amp;quot;)&lt;br /&gt;
# direct damage (default 20)&lt;br /&gt;
# blast damage (default 70)&lt;br /&gt;
# blast radius (default 70)&lt;br /&gt;
# thrust factor (default 1.0)&lt;br /&gt;
# damage type of direct hit (default: actor&#039;s MOD)&lt;br /&gt;
# damage type of blast hit (default: actor&#039;s MOD)&lt;br /&gt;
==See also==&lt;br /&gt;
*[[VileTarget]]&lt;/div&gt;</summary>
		<author><name>Printz</name></author>
	</entry>
	<entry>
		<id>https://eternity.youfailit.net/index.php?title=VileTarget&amp;diff=6544</id>
		<title>VileTarget</title>
		<link rel="alternate" type="text/html" href="https://eternity.youfailit.net/index.php?title=VileTarget&amp;diff=6544"/>
		<updated>2026-06-14T13:34:42Z</updated>

		<summary type="html">&lt;p&gt;Printz: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Type: Monster attack, normal&lt;br /&gt;
&lt;br /&gt;
Purpose: Causes the object to [[FaceTarget|face]] its target, and spawns a VileFire object at the target&#039;s location. The [[Fire]] codepointer will be called on the VileFire object after it is spawned.&lt;br /&gt;
&lt;br /&gt;
==Optional parameter==&lt;br /&gt;
VileTarget accepts an optional parameter: thing type to spawn. If omitted, it will be the VileFire (dehackednum 5) type.&lt;br /&gt;
==See also==&lt;br /&gt;
*[[VileAttack]]&lt;/div&gt;</summary>
		<author><name>Printz</name></author>
	</entry>
	<entry>
		<id>https://eternity.youfailit.net/index.php?title=VileTarget&amp;diff=6543</id>
		<title>VileTarget</title>
		<link rel="alternate" type="text/html" href="https://eternity.youfailit.net/index.php?title=VileTarget&amp;diff=6543"/>
		<updated>2026-06-14T13:34:23Z</updated>

		<summary type="html">&lt;p&gt;Printz: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Type: Monster attack, normal&lt;br /&gt;
&lt;br /&gt;
Purpose: Causes the object to [[FaceTarget|face]] its target, and spawns a VileFire object at the target&#039;s location. The [[Fire]] codepointer will be called on the VileFire object after it is spawned.&lt;br /&gt;
&lt;br /&gt;
==Optional parameter==&lt;br /&gt;
VileTarget accepts an optional parameter: thing type to spawn. If omitted, it will be the VileFire (dehackednum 5) type.&lt;/div&gt;</summary>
		<author><name>Printz</name></author>
	</entry>
	<entry>
		<id>https://eternity.youfailit.net/index.php?title=DEMOLOOP&amp;diff=6542</id>
		<title>DEMOLOOP</title>
		<link rel="alternate" type="text/html" href="https://eternity.youfailit.net/index.php?title=DEMOLOOP&amp;diff=6542"/>
		<updated>2026-06-14T13:07:47Z</updated>

		<summary type="html">&lt;p&gt;Printz: /* Explanation of fields */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Eternity supports the DEMOLOOP lump, which is part of the id24 specifications. This lump lets you define the startup sequence, when the game typically shows you various screens and game demos (replays) in sequence, repeating in a loop. Previously you would need to replace various lumps (like TITLEPIC and credits for the art screens, or the DEMOx lumps, possibly emptying them to remove demos) or set EDF [[gameproperties]], but the DEMOLOOP lump gives you complete control over this sequence.&lt;br /&gt;
&lt;br /&gt;
DEMOLOOP must contain a JSON text data. The content of DEMOLOOP must be of the form:&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
     &amp;quot;type&amp;quot;:    &amp;quot;demoloop&amp;quot;,&lt;br /&gt;
     &amp;quot;version&amp;quot;: &amp;quot;1.0.0&amp;quot;,&lt;br /&gt;
     &amp;quot;metadata&amp;quot;: {&lt;br /&gt;
         &amp;quot;author&amp;quot;:      &amp;quot;...&amp;quot;,&lt;br /&gt;
         &amp;quot;timestamp&amp;quot;:   &amp;quot;...&amp;quot;,&lt;br /&gt;
         &amp;quot;application&amp;quot;: &amp;quot;...&lt;br /&gt;
     },&lt;br /&gt;
 &lt;br /&gt;
     &amp;quot;data&amp;quot;: {&lt;br /&gt;
         &amp;quot;entries&amp;quot;: [&lt;br /&gt;
             {&lt;br /&gt;
                 &amp;quot;type&amp;quot;:          0,&lt;br /&gt;
                 &amp;quot;primarylump&amp;quot;:   &amp;quot;IMAGE1&amp;quot;,&lt;br /&gt;
                 &amp;quot;secondarylump&amp;quot;: &amp;quot;MUSIC1&amp;quot;,&lt;br /&gt;
                 &amp;quot;duration&amp;quot;:      5.5,&lt;br /&gt;
                 &amp;quot;outrowipe&amp;quot;:     1&lt;br /&gt;
             },&lt;br /&gt;
             {&lt;br /&gt;
                 &amp;quot;type&amp;quot;:       1,&lt;br /&gt;
                 &amp;quot;primarylump: &amp;quot;DEMO5&amp;quot;,&lt;br /&gt;
                 &amp;quot;outrowipe&amp;quot;:  0&lt;br /&gt;
             }&lt;br /&gt;
         ]&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==Explanation of fields==&lt;br /&gt;
*&amp;quot;type&amp;quot;: must be &amp;quot;demoloop&amp;quot;.&lt;br /&gt;
*&amp;quot;version&amp;quot;: must be &amp;quot;1.0.0&amp;quot; maximum.&lt;br /&gt;
*&amp;quot;metadata&amp;quot;: required id24 information. Eternity does not consume them, but they should be provided.&lt;br /&gt;
*&amp;quot;data&amp;quot;: must contain a single &amp;quot;entries&amp;quot; array of one or more elements (the example above shows two entries). Each element is described below:&lt;br /&gt;
:*&amp;quot;type&amp;quot;: can be 0 or 1. 0 means art screen, 1 means demo (game replay). Caution: demos will only replay reliably in Eternity if the they are recorded in MBF-compatible or below (Boom or vanilla Doom) ports. Do not rely on Eternity-recorded demos to stay in sync with any Eternity update.&lt;br /&gt;
:*&amp;quot;primarylump&amp;quot;: if &amp;quot;type&amp;quot; is 0 (art screen), this is the name of the graphics lump to display as the art screen. If &amp;quot;type&amp;quot; is 1 (demo), this is the name of the demo lump, and it&#039;s required.&lt;br /&gt;
:*&amp;quot;outrowipe&amp;quot;: can be 0 or 1. 0 means no screen wipe effect (e.g. melt) will occur after the end of the current stage. 1 means to apply the wipe effect.&lt;br /&gt;
:*&amp;quot;secondarylump&amp;quot;: only applies if &amp;quot;type&amp;quot; is 0 (art screen). This is optional and will be the lump name of the music to play during the display of the art screen. Eternity allows omitting the game-specific prefix such as &amp;quot;D_&amp;quot; on Doom; for example both &amp;quot;runnin&amp;quot; and &amp;quot;D_RUNNIN&amp;quot; are valid for Doom 2. The name is case insensitive. Completely omitting &amp;quot;secondarylump&amp;quot; will just keep playing the music from the previous stage. Demos don&#039;t use this option because the levels they replay have their own music.&lt;br /&gt;
:*&amp;quot;duration&amp;quot;: only applies when &amp;quot;type&amp;quot; is 0 (art screen). This is time in seconds that the art screen will display before going to the next stage. It can be expressed in decimal quantities. It should be set for every entry of &amp;quot;type&amp;quot; 0.&lt;/div&gt;</summary>
		<author><name>Printz</name></author>
	</entry>
	<entry>
		<id>https://eternity.youfailit.net/index.php?title=DEMOLOOP&amp;diff=6541</id>
		<title>DEMOLOOP</title>
		<link rel="alternate" type="text/html" href="https://eternity.youfailit.net/index.php?title=DEMOLOOP&amp;diff=6541"/>
		<updated>2026-06-14T13:07:27Z</updated>

		<summary type="html">&lt;p&gt;Printz: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Eternity supports the DEMOLOOP lump, which is part of the id24 specifications. This lump lets you define the startup sequence, when the game typically shows you various screens and game demos (replays) in sequence, repeating in a loop. Previously you would need to replace various lumps (like TITLEPIC and credits for the art screens, or the DEMOx lumps, possibly emptying them to remove demos) or set EDF [[gameproperties]], but the DEMOLOOP lump gives you complete control over this sequence.&lt;br /&gt;
&lt;br /&gt;
DEMOLOOP must contain a JSON text data. The content of DEMOLOOP must be of the form:&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
     &amp;quot;type&amp;quot;:    &amp;quot;demoloop&amp;quot;,&lt;br /&gt;
     &amp;quot;version&amp;quot;: &amp;quot;1.0.0&amp;quot;,&lt;br /&gt;
     &amp;quot;metadata&amp;quot;: {&lt;br /&gt;
         &amp;quot;author&amp;quot;:      &amp;quot;...&amp;quot;,&lt;br /&gt;
         &amp;quot;timestamp&amp;quot;:   &amp;quot;...&amp;quot;,&lt;br /&gt;
         &amp;quot;application&amp;quot;: &amp;quot;...&lt;br /&gt;
     },&lt;br /&gt;
 &lt;br /&gt;
     &amp;quot;data&amp;quot;: {&lt;br /&gt;
         &amp;quot;entries&amp;quot;: [&lt;br /&gt;
             {&lt;br /&gt;
                 &amp;quot;type&amp;quot;:          0,&lt;br /&gt;
                 &amp;quot;primarylump&amp;quot;:   &amp;quot;IMAGE1&amp;quot;,&lt;br /&gt;
                 &amp;quot;secondarylump&amp;quot;: &amp;quot;MUSIC1&amp;quot;,&lt;br /&gt;
                 &amp;quot;duration&amp;quot;:      5.5,&lt;br /&gt;
                 &amp;quot;outrowipe&amp;quot;:     1&lt;br /&gt;
             },&lt;br /&gt;
             {&lt;br /&gt;
                 &amp;quot;type&amp;quot;:       1,&lt;br /&gt;
                 &amp;quot;primarylump: &amp;quot;DEMO5&amp;quot;,&lt;br /&gt;
                 &amp;quot;outrowipe&amp;quot;:  0&lt;br /&gt;
             }&lt;br /&gt;
         ]&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==Explanation of fields==&lt;br /&gt;
*&amp;quot;type&amp;quot;: must be &amp;quot;demoloop&amp;quot;.&lt;br /&gt;
*&amp;quot;version&amp;quot;: must be &amp;quot;1.0.0&amp;quot; maximum.&lt;br /&gt;
*&amp;quot;metadata&amp;quot;: required id24 information. Eternity does not consume them, but they should be provided.&lt;br /&gt;
*&amp;quot;data&amp;quot;: must contain a single &amp;quot;entries&amp;quot; array of one or more elements (the example above shows two entries). Each element is described below:&lt;br /&gt;
:*&amp;quot;type&amp;quot;: can be 0 or 1. 0 means art screen, 1 means demo (game replay). Caution: demos will only replay reliably in Eternity if the they are recorded in MBF-compatible or below (Boom or vanilla Doom) ports. Do not rely on Eternity-recorded demos to stay in sync with any Eternity update.&lt;br /&gt;
:*&amp;quot;primarylump&amp;quot;: if &amp;quot;type&amp;quot; is 0 (art screen), this is the name of the graphics lump to display as the art screen. Eternity tolerates a missing &amp;quot;primarylump&amp;quot;, in which case it will show the Eternity credits screen, but this is nonstandard and not portable. If &amp;quot;type&amp;quot; is 1 (demo), this is the name of the demo lump, and it&#039;s required.&lt;br /&gt;
:*&amp;quot;outrowipe&amp;quot;: can be 0 or 1. 0 means no screen wipe effect (e.g. melt) will occur after the end of the current stage. 1 means to apply the wipe effect.&lt;br /&gt;
:*&amp;quot;secondarylump&amp;quot;: only applies if &amp;quot;type&amp;quot; is 0 (art screen). This is optional and will be the lump name of the music to play during the display of the art screen. Eternity allows omitting the game-specific prefix such as &amp;quot;D_&amp;quot; on Doom; for example both &amp;quot;runnin&amp;quot; and &amp;quot;D_RUNNIN&amp;quot; are valid for Doom 2. The name is case insensitive. Completely omitting &amp;quot;secondarylump&amp;quot; will just keep playing the music from the previous stage. Demos don&#039;t use this option because the levels they replay have their own music.&lt;br /&gt;
:*&amp;quot;duration&amp;quot;: only applies when &amp;quot;type&amp;quot; is 0 (art screen). This is time in seconds that the art screen will display before going to the next stage. It can be expressed in decimal quantities. It should be set for every entry of &amp;quot;type&amp;quot; 0.&lt;/div&gt;</summary>
		<author><name>Printz</name></author>
	</entry>
	<entry>
		<id>https://eternity.youfailit.net/index.php?title=DEMOLOOP&amp;diff=6540</id>
		<title>DEMOLOOP</title>
		<link rel="alternate" type="text/html" href="https://eternity.youfailit.net/index.php?title=DEMOLOOP&amp;diff=6540"/>
		<updated>2026-06-14T13:07:11Z</updated>

		<summary type="html">&lt;p&gt;Printz: /* Example */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Eternity supports the DEMOLOOP lump, which is part of the id24 specifications. This lump lets you define the startup sequence, when the game typically shows you various screens and game demos (replays) in sequence, repeating in a loop. Previously you would need to replace various lumps (like TITLEPIC and credits for the art screens, or the DEMOx lumps, possibly emptying them to remove demos) or set EDF [[gameproperties]], but the DEMOLOOP lump gives you complete control over this sequence.&lt;br /&gt;
&lt;br /&gt;
DEMOLOOP must contain a JSON text data. The content of DEMOLOOP must be of the form:&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
     &amp;quot;type&amp;quot;:    &amp;quot;demoloop&amp;quot;,&lt;br /&gt;
     &amp;quot;version&amp;quot;: &amp;quot;1.0.0&amp;quot;,&lt;br /&gt;
     &amp;quot;metadata&amp;quot;: {&lt;br /&gt;
         &amp;quot;author&amp;quot;:      &amp;quot;...&amp;quot;,&lt;br /&gt;
         &amp;quot;timestamp&amp;quot;:   &amp;quot;...&amp;quot;,&lt;br /&gt;
         &amp;quot;application&amp;quot;: &amp;quot;...&lt;br /&gt;
     },&lt;br /&gt;
 &lt;br /&gt;
     &amp;quot;data&amp;quot;: {&lt;br /&gt;
         &amp;quot;entries&amp;quot;: [&lt;br /&gt;
             {&lt;br /&gt;
                 &amp;quot;type&amp;quot;:          0,&lt;br /&gt;
                 &amp;quot;primarylump&amp;quot;:   &amp;quot;IMAGE1&amp;quot;,&lt;br /&gt;
                 &amp;quot;secondarylump&amp;quot;: &amp;quot;MUSIC1&amp;quot;,&lt;br /&gt;
                 &amp;quot;duration&amp;quot;:      5.5,&lt;br /&gt;
                 &amp;quot;outrowipe&amp;quot;:     1&lt;br /&gt;
             },&lt;br /&gt;
             {&lt;br /&gt;
                 &amp;quot;type&amp;quot;:       1,&lt;br /&gt;
                 &amp;quot;primarylump: &amp;quot;DEMO5&amp;quot;,&lt;br /&gt;
                 &amp;quot;outrowipe&amp;quot;:  0&lt;br /&gt;
             }&lt;br /&gt;
         ]&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==Explanation of fields==&lt;br /&gt;
*&amp;quot;type&amp;quot;: must be &amp;quot;demoloop&amp;quot;.&lt;br /&gt;
*&amp;quot;version&amp;quot;: must be &amp;quot;1.0.0&amp;quot; maximum.&lt;br /&gt;
*&amp;quot;metadata&amp;quot;: required id24 information. Eternity does not consume them, but they should be provided.&lt;br /&gt;
*&amp;quot;data&amp;quot;: must contain a single &amp;quot;entries&amp;quot; array of one or more elements (the example above shows two entries). Each element is described below:&lt;br /&gt;
:*&amp;quot;type&amp;quot;: can be 0 or 1. 0 means art screen, 1 means demo (game replay). Caution: demos will only replay reliably in Eternity if the they are recorded in MBF-compatible or below (Boom or vanilla Doom) ports. Do not rely on Eternity-recorded demos to stay in sync with any Eternity update.&lt;br /&gt;
:*&amp;quot;primarylump&amp;quot;: if &amp;quot;type&amp;quot; is 0 (art screen), this is the name of the graphics lump to display as the art screen. Eternity tolerates a missing &amp;quot;primarylump&amp;quot;, in which case it will show the Eternity credits screen, but this is nonstandard and not portable. If &amp;quot;type&amp;quot; is 1 (demo), this is the name of the demo lump, and it&#039;s required.&lt;br /&gt;
:*&amp;quot;outrowipe&amp;quot;: can be 0 or 1. 0 means no screen wipe effect (e.g. melt) will occur after the end of the current stage. 1 means to apply the wipe effect.&lt;br /&gt;
:*&amp;quot;secondarylump&amp;quot;: only applies if &amp;quot;type&amp;quot; is 0 (art screen). This is optional and will be the lump name of the music to play during the display of the art screen. Eternity allows omitting the game-specific prefix such as &amp;quot;D_&amp;quot; on Doom; for example both &amp;quot;runnin&amp;quot; and &amp;quot;D_RUNNIN&amp;quot; are valid for Doom 2. The name is case insensitive. Completely omitting &amp;quot;secondarylump&amp;quot; will just keep playing the music from the previous stage. Demos don&#039;t use this option because the levels they replay have their own music.&lt;br /&gt;
:*&amp;quot;duration&amp;quot;: only applies when &amp;quot;type&amp;quot; is 0 (art screen). This is time in seconds that the art screen will display before going to the next stage. It can be expressed in decimal quantities. It should be set for every entry of &amp;quot;type&amp;quot; 0.&lt;br /&gt;
&lt;br /&gt;
==Example==&lt;br /&gt;
Below is how the sequence in Ultimate Doom would be defined. Keep in mind that Eternity by default has it hardcoded, but a representation in the DEMOLOOP would look like the following. Important: only the value of &amp;quot;entries&amp;quot; is shown below, but remember to adhere to the complete format to make it valid:&lt;br /&gt;
&lt;br /&gt;
 [&lt;br /&gt;
     {&lt;br /&gt;
         &amp;quot;type&amp;quot;:          0,&lt;br /&gt;
         &amp;quot;primarylump&amp;quot;:   &amp;quot;TITLEPIC&amp;quot;,&lt;br /&gt;
         &amp;quot;secondarylump&amp;quot;: &amp;quot;intro&amp;quot;,&lt;br /&gt;
         &amp;quot;outrowipe&amp;quot;:     1,&lt;br /&gt;
         &amp;quot;duration&amp;quot;:      4.85714285714285714286&lt;br /&gt;
     },&lt;br /&gt;
     {&lt;br /&gt;
         &amp;quot;type&amp;quot;:          1,&lt;br /&gt;
         &amp;quot;primarylump&amp;quot;:   &amp;quot;DEMO1&amp;quot;,&lt;br /&gt;
         &amp;quot;outrowipe&amp;quot;:     1&lt;br /&gt;
     },&lt;br /&gt;
     {&lt;br /&gt;
         &amp;quot;type&amp;quot;:          0,&lt;br /&gt;
         &amp;quot;outrowipe&amp;quot;:     1,&lt;br /&gt;
         &amp;quot;duration&amp;quot;:      11&lt;br /&gt;
     },&lt;br /&gt;
     {&lt;br /&gt;
         &amp;quot;type&amp;quot;:          1,&lt;br /&gt;
         &amp;quot;primarylump&amp;quot;:   &amp;quot;DEMO2&amp;quot;,&lt;br /&gt;
         &amp;quot;outrowipe&amp;quot;:     1&lt;br /&gt;
     },&lt;br /&gt;
     {&lt;br /&gt;
         &amp;quot;type&amp;quot;:          0,&lt;br /&gt;
         &amp;quot;primarylump&amp;quot;:   &amp;quot;CREDIT&amp;quot;,&lt;br /&gt;
         &amp;quot;outrowipe&amp;quot;:     1,&lt;br /&gt;
         &amp;quot;duration&amp;quot;:      11&lt;br /&gt;
     },&lt;br /&gt;
     {&lt;br /&gt;
         &amp;quot;type&amp;quot;:          1,&lt;br /&gt;
         &amp;quot;primarylump&amp;quot;:   &amp;quot;DEMO3&amp;quot;,&lt;br /&gt;
         &amp;quot;outrowipe&amp;quot;:     1&lt;br /&gt;
     },&lt;br /&gt;
     {&lt;br /&gt;
         &amp;quot;type&amp;quot;:          1,&lt;br /&gt;
         &amp;quot;primarylump&amp;quot;:   &amp;quot;DEMO4&amp;quot;,&lt;br /&gt;
         &amp;quot;outrowipe&amp;quot;:     1&lt;br /&gt;
     }&lt;br /&gt;
 ]&lt;br /&gt;
&lt;br /&gt;
The very exact &amp;quot;duration&amp;quot; of the title entry is equivalent to the built-in duration of 170 tics. The third entry (second art screen) is missing its &amp;quot;primarylump&amp;quot; because it shows the Eternity credits instead (Eternity extension).&lt;/div&gt;</summary>
		<author><name>Printz</name></author>
	</entry>
	<entry>
		<id>https://eternity.youfailit.net/index.php?title=DEMOLOOP&amp;diff=6539</id>
		<title>DEMOLOOP</title>
		<link rel="alternate" type="text/html" href="https://eternity.youfailit.net/index.php?title=DEMOLOOP&amp;diff=6539"/>
		<updated>2026-06-14T13:04:37Z</updated>

		<summary type="html">&lt;p&gt;Printz: /* Explanation of fields */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Eternity supports the DEMOLOOP lump, which is part of the id24 specifications. This lump lets you define the startup sequence, when the game typically shows you various screens and game demos (replays) in sequence, repeating in a loop. Previously you would need to replace various lumps (like TITLEPIC and credits for the art screens, or the DEMOx lumps, possibly emptying them to remove demos) or set EDF [[gameproperties]], but the DEMOLOOP lump gives you complete control over this sequence.&lt;br /&gt;
&lt;br /&gt;
DEMOLOOP must contain a JSON text data. The content of DEMOLOOP must be of the form:&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
     &amp;quot;type&amp;quot;:    &amp;quot;demoloop&amp;quot;,&lt;br /&gt;
     &amp;quot;version&amp;quot;: &amp;quot;1.0.0&amp;quot;,&lt;br /&gt;
     &amp;quot;metadata&amp;quot;: {&lt;br /&gt;
         &amp;quot;author&amp;quot;:      &amp;quot;...&amp;quot;,&lt;br /&gt;
         &amp;quot;timestamp&amp;quot;:   &amp;quot;...&amp;quot;,&lt;br /&gt;
         &amp;quot;application&amp;quot;: &amp;quot;...&lt;br /&gt;
     },&lt;br /&gt;
 &lt;br /&gt;
     &amp;quot;data&amp;quot;: {&lt;br /&gt;
         &amp;quot;entries&amp;quot;: [&lt;br /&gt;
             {&lt;br /&gt;
                 &amp;quot;type&amp;quot;:          0,&lt;br /&gt;
                 &amp;quot;primarylump&amp;quot;:   &amp;quot;IMAGE1&amp;quot;,&lt;br /&gt;
                 &amp;quot;secondarylump&amp;quot;: &amp;quot;MUSIC1&amp;quot;,&lt;br /&gt;
                 &amp;quot;duration&amp;quot;:      5.5,&lt;br /&gt;
                 &amp;quot;outrowipe&amp;quot;:     1&lt;br /&gt;
             },&lt;br /&gt;
             {&lt;br /&gt;
                 &amp;quot;type&amp;quot;:       1,&lt;br /&gt;
                 &amp;quot;primarylump: &amp;quot;DEMO5&amp;quot;,&lt;br /&gt;
                 &amp;quot;outrowipe&amp;quot;:  0&lt;br /&gt;
             }&lt;br /&gt;
         ]&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==Explanation of fields==&lt;br /&gt;
*&amp;quot;type&amp;quot;: must be &amp;quot;demoloop&amp;quot;.&lt;br /&gt;
*&amp;quot;version&amp;quot;: must be &amp;quot;1.0.0&amp;quot; maximum.&lt;br /&gt;
*&amp;quot;metadata&amp;quot;: required id24 information. Eternity does not consume them, but they should be provided.&lt;br /&gt;
*&amp;quot;data&amp;quot;: must contain a single &amp;quot;entries&amp;quot; array of one or more elements (the example above shows two entries). Each element is described below:&lt;br /&gt;
:*&amp;quot;type&amp;quot;: can be 0 or 1. 0 means art screen, 1 means demo (game replay). Caution: demos will only replay reliably in Eternity if the they are recorded in MBF-compatible or below (Boom or vanilla Doom) ports. Do not rely on Eternity-recorded demos to stay in sync with any Eternity update.&lt;br /&gt;
:*&amp;quot;primarylump&amp;quot;: if &amp;quot;type&amp;quot; is 0 (art screen), this is the name of the graphics lump to display as the art screen. Eternity tolerates a missing &amp;quot;primarylump&amp;quot;, in which case it will show the Eternity credits screen, but this is nonstandard and not portable. If &amp;quot;type&amp;quot; is 1 (demo), this is the name of the demo lump, and it&#039;s required.&lt;br /&gt;
:*&amp;quot;outrowipe&amp;quot;: can be 0 or 1. 0 means no screen wipe effect (e.g. melt) will occur after the end of the current stage. 1 means to apply the wipe effect.&lt;br /&gt;
:*&amp;quot;secondarylump&amp;quot;: only applies if &amp;quot;type&amp;quot; is 0 (art screen). This is optional and will be the lump name of the music to play during the display of the art screen. Eternity allows omitting the game-specific prefix such as &amp;quot;D_&amp;quot; on Doom; for example both &amp;quot;runnin&amp;quot; and &amp;quot;D_RUNNIN&amp;quot; are valid for Doom 2. The name is case insensitive. Completely omitting &amp;quot;secondarylump&amp;quot; will just keep playing the music from the previous stage. Demos don&#039;t use this option because the levels they replay have their own music.&lt;br /&gt;
:*&amp;quot;duration&amp;quot;: only applies when &amp;quot;type&amp;quot; is 0 (art screen). This is time in seconds that the art screen will display before going to the next stage. It can be expressed in decimal quantities. It should be set for every entry of &amp;quot;type&amp;quot; 0.&lt;br /&gt;
&lt;br /&gt;
==Example==&lt;br /&gt;
Below is how the sequence in Ultimate Doom would be defined. Keep in mind that Eternity by default has it hardcoded, but a representation in the DEMOLOOP would look like the following. Important: only the value of &amp;quot;entries&amp;quot; is shown below, but remember to adhere to the complete format to make it valid:&lt;br /&gt;
&lt;br /&gt;
 [&lt;br /&gt;
     {&lt;br /&gt;
         &amp;quot;type&amp;quot;:          0,&lt;br /&gt;
         &amp;quot;primarylump&amp;quot;:   &amp;quot;TITLEPIC&amp;quot;,&lt;br /&gt;
         &amp;quot;secondarylump&amp;quot;: &amp;quot;intro&amp;quot;,&lt;br /&gt;
         &amp;quot;outrowipe&amp;quot;:     1,&lt;br /&gt;
         &amp;quot;duration&amp;quot;:      4.85714285714285714286&lt;br /&gt;
     },&lt;br /&gt;
     {&lt;br /&gt;
         &amp;quot;type&amp;quot;:          1,&lt;br /&gt;
         &amp;quot;primarylump&amp;quot;:   &amp;quot;DEMO1&amp;quot;,&lt;br /&gt;
         &amp;quot;outrowipe&amp;quot;:     1&lt;br /&gt;
     },&lt;br /&gt;
     {&lt;br /&gt;
         &amp;quot;type&amp;quot;:          0,&lt;br /&gt;
         &amp;quot;outrowipe&amp;quot;:     1,&lt;br /&gt;
         &amp;quot;duration&amp;quot;:      11&lt;br /&gt;
     },&lt;br /&gt;
     {&lt;br /&gt;
         &amp;quot;type&amp;quot;:          1,&lt;br /&gt;
         &amp;quot;primarylump&amp;quot;:   &amp;quot;DEMO2&amp;quot;,&lt;br /&gt;
         &amp;quot;outrowipe&amp;quot;:     1&lt;br /&gt;
     },&lt;br /&gt;
     {&lt;br /&gt;
         &amp;quot;type&amp;quot;:          0,&lt;br /&gt;
         &amp;quot;primarylump&amp;quot;:   &amp;quot;CREDIT&amp;quot;,&lt;br /&gt;
         &amp;quot;outrowipe&amp;quot;:     1,&lt;br /&gt;
         &amp;quot;duration&amp;quot;:      11&lt;br /&gt;
     },&lt;br /&gt;
     {&lt;br /&gt;
         &amp;quot;type&amp;quot;:          1,&lt;br /&gt;
         &amp;quot;primarylump&amp;quot;:   &amp;quot;DEMO3&amp;quot;,&lt;br /&gt;
         &amp;quot;outrowipe&amp;quot;:     1&lt;br /&gt;
     },&lt;br /&gt;
     {&lt;br /&gt;
         &amp;quot;type&amp;quot;:          1,&lt;br /&gt;
         &amp;quot;primarylump&amp;quot;:   &amp;quot;DEMO4&amp;quot;,&lt;br /&gt;
         &amp;quot;outrowipe&amp;quot;:     1&lt;br /&gt;
     }&lt;br /&gt;
 ]&lt;/div&gt;</summary>
		<author><name>Printz</name></author>
	</entry>
	<entry>
		<id>https://eternity.youfailit.net/index.php?title=EDF_game_properties_reference&amp;diff=6538</id>
		<title>EDF game properties reference</title>
		<link rel="alternate" type="text/html" href="https://eternity.youfailit.net/index.php?title=EDF_game_properties_reference&amp;diff=6538"/>
		<updated>2026-06-14T13:03:16Z</updated>

		<summary type="html">&lt;p&gt;Printz: /* Demo control */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This unique block changes global game properties from established hardcoded defaults.&lt;br /&gt;
==Usage==&lt;br /&gt;
Simply add a block named &amp;lt;code&amp;gt;gameproperties { }&amp;lt;/code&amp;gt; in your EDF lump, and set the items you want to change from the base game. If you have multiple such blocks in your EDF code, the last one will be considered.&lt;br /&gt;
&lt;br /&gt;
The descriptions of the available fields are below. &lt;br /&gt;
==Structure==&lt;br /&gt;
 gameproperties&lt;br /&gt;
 {&lt;br /&gt;
  flags.add                &amp;lt;string&amp;gt;&lt;br /&gt;
  flags.remove             &amp;lt;string&amp;gt;&lt;br /&gt;
  missionflags.add         &amp;lt;string&amp;gt;&lt;br /&gt;
  missionflags.remove      &amp;lt;string&amp;gt;&lt;br /&gt;
  demo.titletics           &amp;lt;integer&amp;gt;&lt;br /&gt;
  demo.advisortics         &amp;lt;integer&amp;gt;&lt;br /&gt;
  demo.pagetics            &amp;lt;integer&amp;gt;&lt;br /&gt;
  menu.background          &amp;lt;string&amp;gt;&lt;br /&gt;
  menu.transframe          &amp;lt;string&amp;gt;&lt;br /&gt;
  menu.skvattacksound      &amp;lt;string&amp;gt;&lt;br /&gt;
  menu.offset              &amp;lt;integer&amp;gt;&lt;br /&gt;
  menu.pointer1            &amp;lt;string&amp;gt;&lt;br /&gt;
  menu.pointer2            &amp;lt;string&amp;gt;&lt;br /&gt;
  menu.startmap            &amp;lt;string&amp;gt;&lt;br /&gt;
  border.flat              &amp;lt;string&amp;gt;&lt;br /&gt;
  border.topleft           &amp;lt;string&amp;gt;&lt;br /&gt;
  border.top               &amp;lt;string&amp;gt;&lt;br /&gt;
  border.topright          &amp;lt;string&amp;gt;&lt;br /&gt;
  border.left              &amp;lt;string&amp;gt;&lt;br /&gt;
  border.right             &amp;lt;string&amp;gt;&lt;br /&gt;
  border.bottomleft        &amp;lt;string&amp;gt;&lt;br /&gt;
  border.bottom            &amp;lt;string&amp;gt;&lt;br /&gt;
  border.bottomright       &amp;lt;string&amp;gt;&lt;br /&gt;
  console.charsperline     &amp;lt;integer&amp;gt;&lt;br /&gt;
  console.bellsound        &amp;lt;string&amp;gt;&lt;br /&gt;
  console.chatsound        &amp;lt;string&amp;gt;&lt;br /&gt;
  console.backdrop         &amp;lt;string&amp;gt;&lt;br /&gt;
  hud.pausepatch           &amp;lt;string&amp;gt;&lt;br /&gt;
  game.autoflightartifact  &amp;lt;string&amp;gt;&lt;br /&gt;
  game.pufftype            &amp;lt;string&amp;gt;&lt;br /&gt;
  game.telefogtype         &amp;lt;string&amp;gt;&lt;br /&gt;
  game.telefogheight       &amp;lt;integer&amp;gt;&lt;br /&gt;
  game.telesound           &amp;lt;string&amp;gt;&lt;br /&gt;
  game.thrustfactor        &amp;lt;integer&amp;gt;&lt;br /&gt;
  game.defpclass           &amp;lt;string&amp;gt;&lt;br /&gt;
  game.endgamefinaletype   &amp;lt;string&amp;gt;&lt;br /&gt;
  game.skillammomultiplier &amp;lt;floating-point&amp;gt;&lt;br /&gt;
  game.monstermeleerange   &amp;lt;value&amp;gt;&lt;br /&gt;
  game.itemheight          &amp;lt;floating-point&amp;gt;&lt;br /&gt;
  game.skillammomultiplier &amp;lt;number&amp;gt;&lt;br /&gt;
  game.lookpitchup         &amp;lt;integer&amp;gt;&lt;br /&gt;
  game.lookpitchdown       &amp;lt;integer&amp;gt;&lt;br /&gt;
  finale.text.x            &amp;lt;integer&amp;gt;&lt;br /&gt;
  finale.text.y            &amp;lt;integer&amp;gt;&lt;br /&gt;
  castcall.title.y         &amp;lt;integer&amp;gt;&lt;br /&gt;
  castcall.name.y          &amp;lt;integer&amp;gt;&lt;br /&gt;
  intermission.pic         &amp;lt;string&amp;gt;&lt;br /&gt;
  sound.defaultmusname     &amp;lt;string&amp;gt;&lt;br /&gt;
  sound.defaultsndname     &amp;lt;string&amp;gt;&lt;br /&gt;
  credit.background        &amp;lt;string&amp;gt;&lt;br /&gt;
  credit.y                 &amp;lt;integer&amp;gt;&lt;br /&gt;
  credit.titlestep         &amp;lt;integer&amp;gt;&lt;br /&gt;
  exit.endtextname         &amp;lt;string&amp;gt;&lt;br /&gt;
  blood.defaultnormal      &amp;lt;string&amp;gt;&lt;br /&gt;
  blood.defaultrip         &amp;lt;string&amp;gt;&lt;br /&gt;
  blood.defaultcrush       &amp;lt;string&amp;gt;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==Description==&lt;br /&gt;
===Flags===&lt;br /&gt;
&#039;&#039;&#039;flags.add&#039;&#039;&#039; and &#039;&#039;&#039;flags.remove&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Adds or removes general gameplay flags from the default set. Group them using the usual syntax, separating them by | (vertical bar), + or &amp;quot;,&amp;quot; (comma). For plus and comma, you need to surround all flags in quotes.&lt;br /&gt;
====List of flags====&lt;br /&gt;
You can use the flags from the following categories:&lt;br /&gt;
=====Gameplay=====&lt;br /&gt;
These flags control gameplay physics:&lt;br /&gt;
:*&#039;&#039;&#039;CHASEFAST&#039;&#039;&#039;: accelerates all the [[Chase]] states of monsters on skill 5 and &#039;&#039;&#039;-fast&#039;&#039;&#039; like in Heretic.&lt;br /&gt;
:*&#039;&#039;&#039;HASMADMELEE&#039;&#039;&#039;: causes all monsters to fight each other when player dies in single player (like in Heretic).&lt;br /&gt;
:*&#039;&#039;&#039;LOSTSOULBOUNCE&#039;&#039;&#039;: for demo compatibility, decide whether lost souls should bounce on floors (normally it&#039;s a user or [[OPTIONS]] gameplay setting).&lt;br /&gt;
:*&#039;&#039;&#039;SKILL5RESPAWN&#039;&#039;&#039;: make monsters respawn on skill 5.&lt;br /&gt;
=====Game flow control=====&lt;br /&gt;
These flags don&#039;t control gameplay per se, but are important for player control and progression:&lt;br /&gt;
:*&#039;&#039;&#039;DOOMWEAPONOFFSET&#039;&#039;&#039;: setup weapon frame &#039;&#039;&#039;offset()&#039;&#039;&#039; attributes to render like in Doom. Necessary for Dehacked compatibility.&lt;br /&gt;
:*&#039;&#039;&#039;INVALWAYSOPEN&#039;&#039;&#039;: Inventory is always open (like Strife, but not Heretic).&lt;br /&gt;
:*&#039;&#039;&#039;MAPXY&#039;&#039;&#039;: use &#039;&#039;MAPxy&#039;&#039; map names by default. This implies that the &#039;&#039;&#039;-warp&#039;&#039;&#039; command-line parameter will expect one value, and any legacy features which depended on the &#039;&#039;ExMy&#039;&#039; vs. &#039;&#039;MAPxy&#039;&#039; arrangements will favour &#039;&#039;MAPxy&#039;&#039;.&lt;br /&gt;
:*&#039;&#039;&#039;NODIEHI&#039;&#039;&#039;: avoid playing the &#039;&#039;&#039;pdiehi&#039;&#039;&#039; (high) death sound.&lt;br /&gt;
:*&#039;&#039;&#039;SETENDOFGAME&#039;&#039;&#039;: [[Teleport_EndGame]] enables the cast finale.&lt;br /&gt;
=====Cosmetic=====&lt;br /&gt;
These flags control minor display differences between the games. Usually they&#039;re of limited use for mod authors, only relevant for the base game differences. Check this list if you have particular issues to solve in your mod:&lt;br /&gt;
:*&#039;&#039;&#039;CENTERHUDMSG&#039;&#039;&#039;: make messages always show in center. Typical with Heretic.&lt;br /&gt;
:*&#039;&#039;&#039;CHEATSOUND&#039;&#039;&#039;: make the menu sound when cheating.&lt;br /&gt;
:*&#039;&#039;&#039;HASADVISORY&#039;&#039;&#039;: display the advisory popup in the title screen. This means drawing an &amp;quot;ADVISOR&amp;quot; lump image at coordinates (4, 160) of a virtual 320x200 screen space, soon as the title screen appears.&lt;br /&gt;
:*&#039;&#039;&#039;HUDSTARTBARNAME&#039;&#039;&#039;: displays the automap level name and time relative to the status bar instead of at a hardcoded position.&lt;br /&gt;
:*&#039;&#039;&#039;IMPACTBLOOD&#039;&#039;&#039;: &#039;&#039;&#039;(unused)&#039;&#039;&#039;. Projectiles causing blood on impact is a [[thingtype]] flag now.&lt;br /&gt;
:*&#039;&#039;&#039;MNBIGFONT&#039;&#039;&#039;: use big font for menu titles.&lt;br /&gt;
:*&#039;&#039;&#039;SAVESOUND&#039;&#039;&#039;: make a sound in save and load menus. This is a small interface detail.&lt;br /&gt;
:*&#039;&#039;&#039;SHADOWTITLES&#039;&#039;&#039;: adds shadows font effects to the titles in menus.&lt;br /&gt;
:*&#039;&#039;&#039;SKILL5WARNING&#039;&#039;&#039;: warn player if they want to start a new game on skill 5.&lt;br /&gt;
:*&#039;&#039;&#039;WOLFHACK&#039;&#039;&#039;: is subject to German-edition restriction on secret levels. Typical for Doom 2.&lt;br /&gt;
&lt;br /&gt;
====Internally preset flags====&lt;br /&gt;
The games supported by Eternity start with the following flags preset:&lt;br /&gt;
=====Doom=====&lt;br /&gt;
Common to all variants: &#039;&#039;&#039;DOOMWEAPONOFFSET&#039;&#039;&#039;, &#039;&#039;&#039;HUDSTATBARNAME&#039;&#039;&#039;, &#039;&#039;&#039;SKILL5RESPAWN&#039;&#039;&#039;, &#039;&#039;&#039;SKILL5WARNING&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
In addition, the following variants of Doom have extra flags:&lt;br /&gt;
*shareware: &#039;&#039;&#039;NODIEHI&#039;&#039;&#039;&lt;br /&gt;
*retail (Ultimate Doom): &#039;&#039;&#039;LOSTSOULBOUNCE&#039;&#039;&#039;&lt;br /&gt;
*commercial (Doom II): &#039;&#039;&#039;MAPXY&#039;&#039;&#039;, &#039;&#039;&#039;SETENDOFGAME&#039;&#039;&#039;, &#039;&#039;&#039;WOLFHACK&#039;&#039;&#039;&lt;br /&gt;
:Final Doom, the Xbox and the BFG edition versions also have &#039;&#039;&#039;LOSTSOULBOUNCE&#039;&#039;&#039;.&lt;br /&gt;
=====Heretic=====&lt;br /&gt;
For Heretic, the preset flags are: &#039;&#039;&#039;CENTERHUDMSG&#039;&#039;&#039;, &#039;&#039;&#039;CHASEFAST&#039;&#039;&#039;, &#039;&#039;&#039;CHEATSOUND&#039;&#039;&#039;, &#039;&#039;&#039;HASADVISORY&#039;&#039;&#039;, &#039;&#039;&#039;HASMADMELEE&#039;&#039;&#039;, &#039;&#039;&#039;MNBIGFONT&#039;&#039;&#039;, &#039;&#039;&#039;SAVESOUND&#039;&#039;&#039;, &#039;&#039;&#039;SHADOWTITLES&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
===Mission flags===&lt;br /&gt;
&#039;&#039;&#039;missionflags.add&#039;&#039;&#039; and &#039;&#039;&#039;missionflags.remove&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Adds or removes mission-specific flags. A mission is a variant of a game, such as how we have Ultimate Doom, Doom II, Final Doom etc. The available mission flags are:&lt;br /&gt;
====List of flags====&lt;br /&gt;
*&#039;&#039;&#039;ALLOWEXITTAG&#039;&#039;&#039;: mission allows tagged normal exit lines.&lt;br /&gt;
*&#039;&#039;&#039;ALLOWSECRETTAG&#039;&#039;&#039;: mission allows tagged secret exit lines.&lt;br /&gt;
*&#039;&#039;&#039;CONBACKTITLE&#039;&#039;&#039;: use &#039;&#039;&#039;console.backdrop&#039;&#039;&#039; (settable here) instead of TITLEPIC for the console background.&lt;br /&gt;
*&#039;&#039;&#039;DEMOIFDEMO4&#039;&#039;&#039;: fine control for DEMO4 lump&#039;s existence.&lt;br /&gt;
*&#039;&#039;&#039;DOOM2MISSIONS&#039;&#039;&#039;: supports the Doom II mission packs.&lt;br /&gt;
*&#039;&#039;&#039;HASBETRAY&#039;&#039;&#039;: has the &amp;quot;Betray&amp;quot; secret MAP33 level.&lt;br /&gt;
*&#039;&#039;&#039;NOGDHIGH&#039;&#039;&#039;: BFG edition setup flag.&lt;br /&gt;
*&#039;&#039;&#039;NOTELEPORTZ&#039;&#039;&#039;: preserves Z coordinate when teleporting, like in Final Doom. Only acts like this in vanilla/demo compatibility.&lt;br /&gt;
*&#039;&#039;&#039;WOLFNAMEHACKS&#039;&#039;&#039;: override Wolfenstein secret level names.&lt;br /&gt;
====Mission-preset flags====&lt;br /&gt;
Those missions have the following flags set:&lt;br /&gt;
*Doom II: &#039;&#039;&#039;DOOM2MISSIONS&#039;&#039;&#039;&lt;br /&gt;
*Final Doom: &#039;&#039;&#039;DEMOIFDEMO4&#039;&#039;&#039;, &#039;&#039;&#039;NOTELEPORTZ&#039;&#039;&#039;&lt;br /&gt;
*Xbox and BFG edition: &#039;&#039;&#039;DOOM2MISSIONS&#039;&#039;&#039;, &#039;&#039;&#039;HASBETRAY&#039;&#039;&#039;, &#039;&#039;&#039;NOGDHIGH&#039;&#039;&#039;, &#039;&#039;&#039;WOLFNAMEHACKS&#039;&#039;&#039;&lt;br /&gt;
All other missions have 0 flags.&lt;br /&gt;
===Demo control===&lt;br /&gt;
NOTE: for finer control of the title and demo sequence, you can instead use a [[DEMOLOOP]] lump.&lt;br /&gt;
*&#039;&#039;&#039;demo.titletics&#039;&#039;&#039;&lt;br /&gt;
:Time to show the title screen. Defaults: 170 (Doom I), 385 (Doom II), 210 (Heretic).&lt;br /&gt;
*&#039;&#039;&#039;demo.advisortics&#039;&#039;&#039;&lt;br /&gt;
:Time to show the advisory banner over the title screen. This adds up to the whole time the title pic is shown. Only nonzero default is 140 in Heretic.&lt;br /&gt;
*&#039;&#039;&#039;demo.pagetics&#039;&#039;&#039;&lt;br /&gt;
:Time to show the page between demos. Defaults: 385 (Doom), 200 (Heretic).&lt;br /&gt;
&lt;br /&gt;
===Menu customization===&lt;br /&gt;
*&#039;&#039;&#039;menu.background&#039;&#039;&#039;&lt;br /&gt;
:The default menu background flat. Defaults: FLOOR4_6 (Doom), FLOOR16 (Heretic), CONS1_5 (HacX mission).&lt;br /&gt;
*&#039;&#039;&#039;menu.transframe&#039;&#039;&#039;&lt;br /&gt;
:Name of [[frame]] to use in the video menu translucency preview. Defaults: S_TBALL1 (Doom), S_MUMMYFX1_1 (Heretic).&lt;br /&gt;
*&#039;&#039;&#039;menu.skvattacksound&#039;&#039;&#039;&lt;br /&gt;
:Name of [[sound]] to play when simulating attacking in the skin viewer. Defaults: shotgn (Doom), gldhit (Heretic).&lt;br /&gt;
*&#039;&#039;&#039;menu.offset&#039;&#039;&#039;&lt;br /&gt;
:Vertical offset upwards to draw the menu. Defaults: 0 (Doom), 4 (Heretic).&lt;br /&gt;
*&#039;&#039;&#039;menu.pointer1&#039;&#039;&#039; and &#039;&#039;&#039;menu.pointer2&#039;&#039;&#039;&lt;br /&gt;
:Graphic patches to use for the menu selector. Defaults: M_SKULL1 and M_SKULL2 (Doom), M_SLCTR1 and M_SLCTR2 (Heretic).&lt;br /&gt;
*&#039;&#039;&#039;menu.startmap&#039;&#039;&#039;&lt;br /&gt;
:Map lump name to load when the new game menu item is selected. This will skip the menus for episode and skill level selection. Default: No default&lt;br /&gt;
&lt;br /&gt;
===Border customization===&lt;br /&gt;
*&#039;&#039;&#039;border.flat&#039;&#039;&#039;&lt;br /&gt;
:The flat to use for the background around the status bar and when the view window is reduced. Defaults: FLOOR7_2 (Doom I), GRNROCK (Doom II), FLOOR04 (Heretic shareware), FLAT513 (Heretic full).&lt;br /&gt;
*&#039;&#039;&#039;border.topleft&#039;&#039;&#039;, &#039;&#039;&#039;.top&#039;&#039;&#039;, &#039;&#039;&#039;.topright&#039;&#039;&#039;, &#039;&#039;&#039;.left&#039;&#039;&#039;, &#039;&#039;&#039;.right&#039;&#039;&#039;, &#039;&#039;&#039;.bottomleft&#039;&#039;&#039;, &#039;&#039;&#039;.bottom&#039;&#039;&#039; and &#039;&#039;&#039;.bottomright&#039;&#039;&#039;&lt;br /&gt;
:Pictures to use for the border. Defaults: BRDR_TL, BRDR_T, BRDR_TR, BRDR_L, BRDR_R, BRDR_BL, BRDR_B and BRDR_BR (Doom); BORD** (Heretic), same suffixes.&lt;br /&gt;
===Console customization===&lt;br /&gt;
*&#039;&#039;&#039;console.charsperline&#039;&#039;&#039;&lt;br /&gt;
:Number of characters per line to display in console. Default: 40.&lt;br /&gt;
*&#039;&#039;&#039;console.bellsound&#039;&#039;&#039;&lt;br /&gt;
:The beep error sound to use from the console, such as when errors occur. Defaults: tink (Doom), ht_chat (Heretic).&lt;br /&gt;
*&#039;&#039;&#039;console.chatsound&#039;&#039;&#039;&lt;br /&gt;
:The sound to play when receiving messages from other players. Defaults: tink (Doom I), radio (Doom II), ht_chat (Heretic).&lt;br /&gt;
*&#039;&#039;&#039;console.backdrop&#039;&#039;&#039;&lt;br /&gt;
:The name of the graphics lump to display for the console. Defaults: TITLEPIC (Doom), TITLE (Heretic).&lt;br /&gt;
===Heads-up display===&lt;br /&gt;
*&#039;&#039;&#039;hud.pausepatch&#039;&#039;&#039;&lt;br /&gt;
:The name of the graphics lump to display for the pause banner. Defaults: M_PAUSE (Doom), PAUSED (Heretic).&lt;br /&gt;
===Gameplay===&lt;br /&gt;
These options are relevant for gameplay physics. See also the similar gameplay flags.&lt;br /&gt;
{|class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
! Doom default&lt;br /&gt;
! Heretic default&lt;br /&gt;
|-&lt;br /&gt;
||&#039;&#039;&#039;game.autoflightartifact&#039;&#039;&#039;||The artifact to use when commanding the player to fly up.||(none)||ArtiFly&lt;br /&gt;
|-&lt;br /&gt;
||&#039;&#039;&#039;game.lookpitchup&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;game.lookpitchdown&#039;&#039;&#039;&lt;br /&gt;
||Set the player view pitch limits up and down respectively, in degrees. Valid values are between 0 and 45 inclusive, integer only.||45||32&lt;br /&gt;
|-&lt;br /&gt;
||&#039;&#039;&#039;game.pufftype&#039;&#039;&#039;||The default hitscan puff when no EDF [[pufftype]] is specified.||BulletPuff||HereticStaffPuff&lt;br /&gt;
|-&lt;br /&gt;
||&#039;&#039;&#039;game.telefogtype&#039;&#039;&#039;||The teleportation fog thing type.||DoomTeleFog||HereticTeleFog&lt;br /&gt;
|-&lt;br /&gt;
||&#039;&#039;&#039;game.telefogheight&#039;&#039;&#039;||The distance of the telefog from the ground.||0||32&lt;br /&gt;
|-&lt;br /&gt;
||&#039;&#039;&#039;game.telesound&#039;&#039;&#039;||The teleportation sound.||telept||htelept&lt;br /&gt;
|-&lt;br /&gt;
||&#039;&#039;&#039;game.thrustfactor&#039;&#039;&#039;||The percentage of how much to thrust things based on damage.||100||150&lt;br /&gt;
|-&lt;br /&gt;
||&#039;&#039;&#039;game.defpclass&#039;&#039;&#039;||The default player class when starting a new game.||DoomMarine||Corvus&lt;br /&gt;
|-&lt;br /&gt;
||&#039;&#039;&#039;game.endgamefinaletype&#039;&#039;&#039;||Default behavior for [[Teleport_EndGame]]. Supported options are:&lt;br /&gt;
:*text&lt;br /&gt;
:*doom_credits&lt;br /&gt;
:*doom_deimos&lt;br /&gt;
:*doom_bunny&lt;br /&gt;
:*doom_marine&lt;br /&gt;
:*htic_credits&lt;br /&gt;
:*htic_water&lt;br /&gt;
:*htic_demon&lt;br /&gt;
:*psx_udoom&lt;br /&gt;
:*psx_doom2&lt;br /&gt;
||doom_credits (Doom I), text (Doom II)||htic_credits&lt;br /&gt;
|-&lt;br /&gt;
||&#039;&#039;&#039;game.skillammomultiplier&#039;&#039;&#039;||Floating-point value for skill 1 and 5 ammo multiplier.||2||1.5&lt;br /&gt;
|-&lt;br /&gt;
||&#039;&#039;&#039;game.monstermeleerange&#039;&#039;&#039;||Mode to calculate melee range. Supported options are:&lt;br /&gt;
:*doom: range is 44 + radius(enemy)&lt;br /&gt;
:*raven: range is 64&lt;br /&gt;
||doom||raven&lt;br /&gt;
|-&lt;br /&gt;
||&#039;&#039;&#039;game.itemheight&#039;&#039;&#039;||Item pick-up height. Unlike expectations, the height is not thingtype&#039;s height, but this value.||8.0||32.0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Finale and intermission===&lt;br /&gt;
*&#039;&#039;&#039;finale.text.x&#039;&#039;&#039; and &#039;&#039;&#039;finale.text.y&#039;&#039;&#039;&lt;br /&gt;
:Finale text coordinates. Defaults: 10, 10 (Doom); 20, 5 (Heretic)&lt;br /&gt;
*&#039;&#039;&#039;castcall.title.y&#039;&#039;&#039;&lt;br /&gt;
:Cast call title Y. Default: 20&lt;br /&gt;
*&#039;&#039;&#039;castcall.name.y&#039;&#039;&#039;&lt;br /&gt;
:Cast call name Y. Default: 180&lt;br /&gt;
*&#039;&#039;&#039;intermission.pic&#039;&#039;&#039;&lt;br /&gt;
:Intermission backdrop. Default: INTERPIC&lt;br /&gt;
===Sound===&lt;br /&gt;
*&#039;&#039;&#039;sound.defaultmusname&#039;&#039;&#039;&lt;br /&gt;
:Default music to play if none specified. Defaults: e1m1 (Doom I and Heretic), runnin (Doom II)&lt;br /&gt;
*&#039;&#039;&#039;sound.defaultsndname&#039;&#039;&#039;&lt;br /&gt;
:Sound to play when the one specified in EDF is unavailable. Defaults: pistol (Doom), gldhit (Heretic)&lt;br /&gt;
*&#039;&#039;&#039;sound.titlemusic&#039;&#039;&#039;&lt;br /&gt;
:Title screen music. No default.&lt;br /&gt;
===Credits===&lt;br /&gt;
*&#039;&#039;&#039;credit.background&#039;&#039;&#039;&lt;br /&gt;
:Swirling flat to use in the Eternity credits background. Defaults: NUKAGE1 (Doom I), SLIME05 (Doom II), SLIME01 (Hacx mission), FLTWAWA1 (Heretic)&lt;br /&gt;
*&#039;&#039;&#039;credit.y&#039;&#039;&#039;&lt;br /&gt;
:Credits Y coordinate. Defaults: 20 (Doom), 8 (Heretic)&lt;br /&gt;
*&#039;&#039;&#039;credit.titlestep&#039;&#039;&#039;&lt;br /&gt;
:Y step for each line. Defaults: 12 (Doom), 8 (Heretic)&lt;br /&gt;
===ENDOOM===&lt;br /&gt;
*&#039;&#039;&#039;exit.endtextname&#039;&#039;&#039;&lt;br /&gt;
:Exit text lump. Defaults: ENDOOM (Doom), ENDTEXT (Heretic)&lt;br /&gt;
===Blood===&lt;br /&gt;
*&#039;&#039;&#039;blood.defaultnormal&#039;&#039;&#039;&lt;br /&gt;
:Thing type for the default blood splat. Defaults: DoomBlood (Doom), HereticBloodSplatter (Heretic)&lt;br /&gt;
*&#039;&#039;&#039;blood.defaultrip&#039;&#039;&#039;&lt;br /&gt;
:Thing type for the piercing RIP projectiles. Defaults: DoomBlood (Doom), HereticBlood (Heretic)&lt;br /&gt;
*&#039;&#039;&#039;blood.defaultcrush&#039;&#039;&#039;&lt;br /&gt;
:Thing type for the crushing ceiling blood. Defaults: DoomBlood (Doom), HereticBlood (Heretic)&lt;/div&gt;</summary>
		<author><name>Printz</name></author>
	</entry>
	<entry>
		<id>https://eternity.youfailit.net/index.php?title=DEMOLOOP&amp;diff=6537</id>
		<title>DEMOLOOP</title>
		<link rel="alternate" type="text/html" href="https://eternity.youfailit.net/index.php?title=DEMOLOOP&amp;diff=6537"/>
		<updated>2026-06-14T13:01:49Z</updated>

		<summary type="html">&lt;p&gt;Printz: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Eternity supports the DEMOLOOP lump, which is part of the id24 specifications. This lump lets you define the startup sequence, when the game typically shows you various screens and game demos (replays) in sequence, repeating in a loop. Previously you would need to replace various lumps (like TITLEPIC and credits for the art screens, or the DEMOx lumps, possibly emptying them to remove demos) or set EDF [[gameproperties]], but the DEMOLOOP lump gives you complete control over this sequence.&lt;br /&gt;
&lt;br /&gt;
DEMOLOOP must contain a JSON text data. The content of DEMOLOOP must be of the form:&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
     &amp;quot;type&amp;quot;:    &amp;quot;demoloop&amp;quot;,&lt;br /&gt;
     &amp;quot;version&amp;quot;: &amp;quot;1.0.0&amp;quot;,&lt;br /&gt;
     &amp;quot;metadata&amp;quot;: {&lt;br /&gt;
         &amp;quot;author&amp;quot;:      &amp;quot;...&amp;quot;,&lt;br /&gt;
         &amp;quot;timestamp&amp;quot;:   &amp;quot;...&amp;quot;,&lt;br /&gt;
         &amp;quot;application&amp;quot;: &amp;quot;...&lt;br /&gt;
     },&lt;br /&gt;
 &lt;br /&gt;
     &amp;quot;data&amp;quot;: {&lt;br /&gt;
         &amp;quot;entries&amp;quot;: [&lt;br /&gt;
             {&lt;br /&gt;
                 &amp;quot;type&amp;quot;:          0,&lt;br /&gt;
                 &amp;quot;primarylump&amp;quot;:   &amp;quot;IMAGE1&amp;quot;,&lt;br /&gt;
                 &amp;quot;secondarylump&amp;quot;: &amp;quot;MUSIC1&amp;quot;,&lt;br /&gt;
                 &amp;quot;duration&amp;quot;:      5.5,&lt;br /&gt;
                 &amp;quot;outrowipe&amp;quot;:     1&lt;br /&gt;
             },&lt;br /&gt;
             {&lt;br /&gt;
                 &amp;quot;type&amp;quot;:       1,&lt;br /&gt;
                 &amp;quot;primarylump: &amp;quot;DEMO5&amp;quot;,&lt;br /&gt;
                 &amp;quot;outrowipe&amp;quot;:  0&lt;br /&gt;
             }&lt;br /&gt;
         ]&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==Explanation of fields==&lt;br /&gt;
*&amp;quot;type&amp;quot;: must be &amp;quot;demoloop&amp;quot;.&lt;br /&gt;
*&amp;quot;version&amp;quot;: must be &amp;quot;1.0.0&amp;quot; maximum.&lt;br /&gt;
*&amp;quot;metadata&amp;quot;: required id24 information. Eternity does not consume them, but they should be provided.&lt;br /&gt;
*&amp;quot;data&amp;quot;: must contain a single &amp;quot;entries&amp;quot; array of one or more elements (the example above shows two entries). Each element is described below:&lt;br /&gt;
:*&amp;quot;type&amp;quot;: can be 0 or 1. 0 means art screen, 1 means demo (game replay).&lt;br /&gt;
:*&amp;quot;primarylump&amp;quot;: if &amp;quot;type&amp;quot; is 0 (art screen), this is the name of the graphics lump to display as the art screen. Eternity tolerates a missing &amp;quot;primarylump&amp;quot;, in which case it will show the Eternity credits screen, but this is nonstandard and not portable. If &amp;quot;type&amp;quot; is 1 (demo), this is the name of the demo lump, and it&#039;s required.&lt;br /&gt;
:*&amp;quot;outrowipe&amp;quot;: can be 0 or 1. 0 means no screen wipe effect (e.g. melt) will occur after the end of the current stage. 1 means to apply the wipe effect.&lt;br /&gt;
:*&amp;quot;secondarylump&amp;quot;: only applies if &amp;quot;type&amp;quot; is 0 (art screen). This is optional and will be the lump name of the music to play during the display of the art screen. Eternity allows omitting the game-specific prefix such as &amp;quot;D_&amp;quot; on Doom; for example both &amp;quot;runnin&amp;quot; and &amp;quot;D_RUNNIN&amp;quot; are valid for Doom 2. The name is case insensitive. Completely omitting &amp;quot;secondarylump&amp;quot; will just keep playing the music from the previous stage. Demos don&#039;t use this option because the levels they replay have their own music.&lt;br /&gt;
:*&amp;quot;duration&amp;quot;: only applies when &amp;quot;type&amp;quot; is 0 (art screen). This is time in seconds that the art screen will display before going to the next stage. It can be expressed in decimal quantities. It should be set for every entry of &amp;quot;type&amp;quot; 0.&lt;br /&gt;
&lt;br /&gt;
==Example==&lt;br /&gt;
Below is how the sequence in Ultimate Doom would be defined. Keep in mind that Eternity by default has it hardcoded, but a representation in the DEMOLOOP would look like the following. Important: only the value of &amp;quot;entries&amp;quot; is shown below, but remember to adhere to the complete format to make it valid:&lt;br /&gt;
&lt;br /&gt;
 [&lt;br /&gt;
     {&lt;br /&gt;
         &amp;quot;type&amp;quot;:          0,&lt;br /&gt;
         &amp;quot;primarylump&amp;quot;:   &amp;quot;TITLEPIC&amp;quot;,&lt;br /&gt;
         &amp;quot;secondarylump&amp;quot;: &amp;quot;intro&amp;quot;,&lt;br /&gt;
         &amp;quot;outrowipe&amp;quot;:     1,&lt;br /&gt;
         &amp;quot;duration&amp;quot;:      4.85714285714285714286&lt;br /&gt;
     },&lt;br /&gt;
     {&lt;br /&gt;
         &amp;quot;type&amp;quot;:          1,&lt;br /&gt;
         &amp;quot;primarylump&amp;quot;:   &amp;quot;DEMO1&amp;quot;,&lt;br /&gt;
         &amp;quot;outrowipe&amp;quot;:     1&lt;br /&gt;
     },&lt;br /&gt;
     {&lt;br /&gt;
         &amp;quot;type&amp;quot;:          0,&lt;br /&gt;
         &amp;quot;outrowipe&amp;quot;:     1,&lt;br /&gt;
         &amp;quot;duration&amp;quot;:      11&lt;br /&gt;
     },&lt;br /&gt;
     {&lt;br /&gt;
         &amp;quot;type&amp;quot;:          1,&lt;br /&gt;
         &amp;quot;primarylump&amp;quot;:   &amp;quot;DEMO2&amp;quot;,&lt;br /&gt;
         &amp;quot;outrowipe&amp;quot;:     1&lt;br /&gt;
     },&lt;br /&gt;
     {&lt;br /&gt;
         &amp;quot;type&amp;quot;:          0,&lt;br /&gt;
         &amp;quot;primarylump&amp;quot;:   &amp;quot;CREDIT&amp;quot;,&lt;br /&gt;
         &amp;quot;outrowipe&amp;quot;:     1,&lt;br /&gt;
         &amp;quot;duration&amp;quot;:      11&lt;br /&gt;
     },&lt;br /&gt;
     {&lt;br /&gt;
         &amp;quot;type&amp;quot;:          1,&lt;br /&gt;
         &amp;quot;primarylump&amp;quot;:   &amp;quot;DEMO3&amp;quot;,&lt;br /&gt;
         &amp;quot;outrowipe&amp;quot;:     1&lt;br /&gt;
     },&lt;br /&gt;
     {&lt;br /&gt;
         &amp;quot;type&amp;quot;:          1,&lt;br /&gt;
         &amp;quot;primarylump&amp;quot;:   &amp;quot;DEMO4&amp;quot;,&lt;br /&gt;
         &amp;quot;outrowipe&amp;quot;:     1&lt;br /&gt;
     }&lt;br /&gt;
 ]&lt;/div&gt;</summary>
		<author><name>Printz</name></author>
	</entry>
	<entry>
		<id>https://eternity.youfailit.net/index.php?title=DEMOLOOP&amp;diff=6536</id>
		<title>DEMOLOOP</title>
		<link rel="alternate" type="text/html" href="https://eternity.youfailit.net/index.php?title=DEMOLOOP&amp;diff=6536"/>
		<updated>2026-06-14T12:59:07Z</updated>

		<summary type="html">&lt;p&gt;Printz: /* Explanation of fields */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Eternity supports the DEMOLOOP lump, which is part of the id24 specifications. This lump lets you define the startup sequence, when the game typically shows you various screens and game demos (replays) in sequence, repeating in a loop. Previously you would need to replace various lumps (like TITLEPIC and credits for the art screens, or the DEMOx lumps, possibly emptying them to remove demos), but the DEMOLOOP lump gives you complete control over this sequence.&lt;br /&gt;
&lt;br /&gt;
DEMOLOOP must contain a JSON text data. The content of DEMOLOOP must be of the form:&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
     &amp;quot;type&amp;quot;:    &amp;quot;demoloop&amp;quot;,&lt;br /&gt;
     &amp;quot;version&amp;quot;: &amp;quot;1.0.0&amp;quot;,&lt;br /&gt;
     &amp;quot;metadata&amp;quot;: {&lt;br /&gt;
         &amp;quot;author&amp;quot;:      &amp;quot;...&amp;quot;,&lt;br /&gt;
         &amp;quot;timestamp&amp;quot;:   &amp;quot;...&amp;quot;,&lt;br /&gt;
         &amp;quot;application&amp;quot;: &amp;quot;...&lt;br /&gt;
     },&lt;br /&gt;
 &lt;br /&gt;
     &amp;quot;data&amp;quot;: {&lt;br /&gt;
         &amp;quot;entries&amp;quot;: [&lt;br /&gt;
             {&lt;br /&gt;
                 &amp;quot;type&amp;quot;:          0,&lt;br /&gt;
                 &amp;quot;primarylump&amp;quot;:   &amp;quot;IMAGE1&amp;quot;,&lt;br /&gt;
                 &amp;quot;secondarylump&amp;quot;: &amp;quot;MUSIC1&amp;quot;,&lt;br /&gt;
                 &amp;quot;duration&amp;quot;:      5.5,&lt;br /&gt;
                 &amp;quot;outrowipe&amp;quot;:     1&lt;br /&gt;
             },&lt;br /&gt;
             {&lt;br /&gt;
                 &amp;quot;type&amp;quot;:       1,&lt;br /&gt;
                 &amp;quot;primarylump: &amp;quot;DEMO5&amp;quot;,&lt;br /&gt;
                 &amp;quot;outrowipe&amp;quot;:  0&lt;br /&gt;
             }&lt;br /&gt;
         ]&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==Explanation of fields==&lt;br /&gt;
*&amp;quot;type&amp;quot;: must be &amp;quot;demoloop&amp;quot;.&lt;br /&gt;
*&amp;quot;version&amp;quot;: must be &amp;quot;1.0.0&amp;quot; maximum.&lt;br /&gt;
*&amp;quot;metadata&amp;quot;: required id24 information. Eternity does not consume them, but they should be provided.&lt;br /&gt;
*&amp;quot;data&amp;quot;: must contain a single &amp;quot;entries&amp;quot; array of one or more elements (the example above shows two entries). Each element is described below:&lt;br /&gt;
:*&amp;quot;type&amp;quot;: can be 0 or 1. 0 means art screen, 1 means demo (game replay).&lt;br /&gt;
:*&amp;quot;primarylump&amp;quot;: if &amp;quot;type&amp;quot; is 0 (art screen), this is the name of the graphics lump to display as the art screen. Eternity tolerates a missing &amp;quot;primarylump&amp;quot;, in which case it will show the Eternity credits screen, but this is nonstandard and not portable. If &amp;quot;type&amp;quot; is 1 (demo), this is the name of the demo lump, and it&#039;s required.&lt;br /&gt;
:*&amp;quot;outrowipe&amp;quot;: can be 0 or 1. 0 means no screen wipe effect (e.g. melt) will occur after the end of the current stage. 1 means to apply the wipe effect.&lt;br /&gt;
:*&amp;quot;secondarylump&amp;quot;: only applies if &amp;quot;type&amp;quot; is 0 (art screen). This is optional and will be the lump name of the music to play during the display of the art screen. Eternity allows omitting the game-specific prefix such as &amp;quot;D_&amp;quot; on Doom; for example both &amp;quot;runnin&amp;quot; and &amp;quot;D_RUNNIN&amp;quot; are valid for Doom 2. The name is case insensitive. Completely omitting &amp;quot;secondarylump&amp;quot; will just keep playing the music from the previous stage. Demos don&#039;t use this option because the levels they replay have their own music.&lt;br /&gt;
:*&amp;quot;duration&amp;quot;: only applies when &amp;quot;type&amp;quot; is 0 (art screen). This is time in seconds that the art screen will display before going to the next stage. It can be expressed in decimal quantities. It should be set for every entry of &amp;quot;type&amp;quot; 0.&lt;br /&gt;
&lt;br /&gt;
==Example==&lt;br /&gt;
Below is how the sequence in Ultimate Doom would be defined. Keep in mind that Eternity by default has it hardcoded, but a representation in the DEMOLOOP would look like the following. Important: only the value of &amp;quot;entries&amp;quot; is shown below, but remember to adhere to the complete format to make it valid:&lt;br /&gt;
&lt;br /&gt;
 [&lt;br /&gt;
     {&lt;br /&gt;
         &amp;quot;type&amp;quot;:          0,&lt;br /&gt;
         &amp;quot;primarylump&amp;quot;:   &amp;quot;TITLEPIC&amp;quot;,&lt;br /&gt;
         &amp;quot;secondarylump&amp;quot;: &amp;quot;intro&amp;quot;,&lt;br /&gt;
         &amp;quot;outrowipe&amp;quot;:     1,&lt;br /&gt;
         &amp;quot;duration&amp;quot;:      4.85714285714285714286&lt;br /&gt;
     },&lt;br /&gt;
     {&lt;br /&gt;
         &amp;quot;type&amp;quot;:          1,&lt;br /&gt;
         &amp;quot;primarylump&amp;quot;:   &amp;quot;DEMO1&amp;quot;,&lt;br /&gt;
         &amp;quot;outrowipe&amp;quot;:     1&lt;br /&gt;
     },&lt;br /&gt;
     {&lt;br /&gt;
         &amp;quot;type&amp;quot;:          0,&lt;br /&gt;
         &amp;quot;outrowipe&amp;quot;:     1,&lt;br /&gt;
         &amp;quot;duration&amp;quot;:      11&lt;br /&gt;
     },&lt;br /&gt;
     {&lt;br /&gt;
         &amp;quot;type&amp;quot;:          1,&lt;br /&gt;
         &amp;quot;primarylump&amp;quot;:   &amp;quot;DEMO2&amp;quot;,&lt;br /&gt;
         &amp;quot;outrowipe&amp;quot;:     1&lt;br /&gt;
     },&lt;br /&gt;
     {&lt;br /&gt;
         &amp;quot;type&amp;quot;:          0,&lt;br /&gt;
         &amp;quot;primarylump&amp;quot;:   &amp;quot;CREDIT&amp;quot;,&lt;br /&gt;
         &amp;quot;outrowipe&amp;quot;:     1,&lt;br /&gt;
         &amp;quot;duration&amp;quot;:      11&lt;br /&gt;
     },&lt;br /&gt;
     {&lt;br /&gt;
         &amp;quot;type&amp;quot;:          1,&lt;br /&gt;
         &amp;quot;primarylump&amp;quot;:   &amp;quot;DEMO3&amp;quot;,&lt;br /&gt;
         &amp;quot;outrowipe&amp;quot;:     1&lt;br /&gt;
     },&lt;br /&gt;
     {&lt;br /&gt;
         &amp;quot;type&amp;quot;:          1,&lt;br /&gt;
         &amp;quot;primarylump&amp;quot;:   &amp;quot;DEMO4&amp;quot;,&lt;br /&gt;
         &amp;quot;outrowipe&amp;quot;:     1&lt;br /&gt;
     }&lt;br /&gt;
 ]&lt;/div&gt;</summary>
		<author><name>Printz</name></author>
	</entry>
	<entry>
		<id>https://eternity.youfailit.net/index.php?title=DEMOLOOP&amp;diff=6535</id>
		<title>DEMOLOOP</title>
		<link rel="alternate" type="text/html" href="https://eternity.youfailit.net/index.php?title=DEMOLOOP&amp;diff=6535"/>
		<updated>2026-06-14T12:58:50Z</updated>

		<summary type="html">&lt;p&gt;Printz: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Eternity supports the DEMOLOOP lump, which is part of the id24 specifications. This lump lets you define the startup sequence, when the game typically shows you various screens and game demos (replays) in sequence, repeating in a loop. Previously you would need to replace various lumps (like TITLEPIC and credits for the art screens, or the DEMOx lumps, possibly emptying them to remove demos), but the DEMOLOOP lump gives you complete control over this sequence.&lt;br /&gt;
&lt;br /&gt;
DEMOLOOP must contain a JSON text data. The content of DEMOLOOP must be of the form:&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
     &amp;quot;type&amp;quot;:    &amp;quot;demoloop&amp;quot;,&lt;br /&gt;
     &amp;quot;version&amp;quot;: &amp;quot;1.0.0&amp;quot;,&lt;br /&gt;
     &amp;quot;metadata&amp;quot;: {&lt;br /&gt;
         &amp;quot;author&amp;quot;:      &amp;quot;...&amp;quot;,&lt;br /&gt;
         &amp;quot;timestamp&amp;quot;:   &amp;quot;...&amp;quot;,&lt;br /&gt;
         &amp;quot;application&amp;quot;: &amp;quot;...&lt;br /&gt;
     },&lt;br /&gt;
 &lt;br /&gt;
     &amp;quot;data&amp;quot;: {&lt;br /&gt;
         &amp;quot;entries&amp;quot;: [&lt;br /&gt;
             {&lt;br /&gt;
                 &amp;quot;type&amp;quot;:          0,&lt;br /&gt;
                 &amp;quot;primarylump&amp;quot;:   &amp;quot;IMAGE1&amp;quot;,&lt;br /&gt;
                 &amp;quot;secondarylump&amp;quot;: &amp;quot;MUSIC1&amp;quot;,&lt;br /&gt;
                 &amp;quot;duration&amp;quot;:      5.5,&lt;br /&gt;
                 &amp;quot;outrowipe&amp;quot;:     1&lt;br /&gt;
             },&lt;br /&gt;
             {&lt;br /&gt;
                 &amp;quot;type&amp;quot;:       1,&lt;br /&gt;
                 &amp;quot;primarylump: &amp;quot;DEMO5&amp;quot;,&lt;br /&gt;
                 &amp;quot;outrowipe&amp;quot;:  0&lt;br /&gt;
             }&lt;br /&gt;
         ]&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==Explanation of fields==&lt;br /&gt;
*&amp;quot;type&amp;quot;: must be &amp;quot;demoloop&amp;quot;.&lt;br /&gt;
*&amp;quot;version&amp;quot;: must be &amp;quot;1.0.0&amp;quot; maximum.&lt;br /&gt;
*&amp;quot;metadata&amp;quot;: required id24 information. Eternity does not consume them, but they should be provided.&lt;br /&gt;
*&amp;quot;data&amp;quot;: must contain a single &amp;quot;entries&amp;quot; array of one or more elements (the example above shows two entries). Each element is described below:&lt;br /&gt;
:*&amp;quot;type&amp;quot;: can be 0 or 1. 0 means art screen, 1 means demo (game replay).&lt;br /&gt;
:*&amp;quot;primarylump&amp;quot;: if &amp;quot;type&amp;quot; is 0 (art screen), this is the name of the graphics lump to display as the art screen. Eternity tolerates a missing &amp;quot;primarylump&amp;quot;, in which case it will show the Eternity credits screen, but this is nonstandard and not portable. If &amp;quot;type&amp;quot; is 1 (demo), this is the name of the demo lump, and it&#039;s required.&lt;br /&gt;
:*&amp;quot;outrowipe&amp;quot;: can be 0 or 1. 0 means no screen wipe effect (e.g. melt) will occur after the end of the current stage. 1 means to apply the wipe effect.&lt;br /&gt;
:*&amp;quot;secondarylump&amp;quot;: only applies if &amp;quot;type&amp;quot; is 0 (art screen). This is optional and will be the lump name of the music to play during the display of the art screen. Eternity allows omitting the game-specific prefix such as &amp;quot;D_&amp;quot; on Doom; for example both &amp;quot;runnin&amp;quot; and &amp;quot;D_RUNNIN&amp;quot; are valid for Doom 2. The name is case insensitive. Completely omitting &amp;quot;secondarylump&amp;quot; will just keep playing the music from the previous stage. Demos don&#039;t use this option because the levels they replay have their own music.&lt;br /&gt;
:*&amp;quot;duration&amp;quot;: only applies when &amp;quot;type&amp;quot; is 0 (art screen). This is time in seconds that the art screen will display before going to the next stage. It can be expressed in decimal quantities. It should be set for every entry.&lt;br /&gt;
&lt;br /&gt;
==Example==&lt;br /&gt;
Below is how the sequence in Ultimate Doom would be defined. Keep in mind that Eternity by default has it hardcoded, but a representation in the DEMOLOOP would look like the following. Important: only the value of &amp;quot;entries&amp;quot; is shown below, but remember to adhere to the complete format to make it valid:&lt;br /&gt;
&lt;br /&gt;
 [&lt;br /&gt;
     {&lt;br /&gt;
         &amp;quot;type&amp;quot;:          0,&lt;br /&gt;
         &amp;quot;primarylump&amp;quot;:   &amp;quot;TITLEPIC&amp;quot;,&lt;br /&gt;
         &amp;quot;secondarylump&amp;quot;: &amp;quot;intro&amp;quot;,&lt;br /&gt;
         &amp;quot;outrowipe&amp;quot;:     1,&lt;br /&gt;
         &amp;quot;duration&amp;quot;:      4.85714285714285714286&lt;br /&gt;
     },&lt;br /&gt;
     {&lt;br /&gt;
         &amp;quot;type&amp;quot;:          1,&lt;br /&gt;
         &amp;quot;primarylump&amp;quot;:   &amp;quot;DEMO1&amp;quot;,&lt;br /&gt;
         &amp;quot;outrowipe&amp;quot;:     1&lt;br /&gt;
     },&lt;br /&gt;
     {&lt;br /&gt;
         &amp;quot;type&amp;quot;:          0,&lt;br /&gt;
         &amp;quot;outrowipe&amp;quot;:     1,&lt;br /&gt;
         &amp;quot;duration&amp;quot;:      11&lt;br /&gt;
     },&lt;br /&gt;
     {&lt;br /&gt;
         &amp;quot;type&amp;quot;:          1,&lt;br /&gt;
         &amp;quot;primarylump&amp;quot;:   &amp;quot;DEMO2&amp;quot;,&lt;br /&gt;
         &amp;quot;outrowipe&amp;quot;:     1&lt;br /&gt;
     },&lt;br /&gt;
     {&lt;br /&gt;
         &amp;quot;type&amp;quot;:          0,&lt;br /&gt;
         &amp;quot;primarylump&amp;quot;:   &amp;quot;CREDIT&amp;quot;,&lt;br /&gt;
         &amp;quot;outrowipe&amp;quot;:     1,&lt;br /&gt;
         &amp;quot;duration&amp;quot;:      11&lt;br /&gt;
     },&lt;br /&gt;
     {&lt;br /&gt;
         &amp;quot;type&amp;quot;:          1,&lt;br /&gt;
         &amp;quot;primarylump&amp;quot;:   &amp;quot;DEMO3&amp;quot;,&lt;br /&gt;
         &amp;quot;outrowipe&amp;quot;:     1&lt;br /&gt;
     },&lt;br /&gt;
     {&lt;br /&gt;
         &amp;quot;type&amp;quot;:          1,&lt;br /&gt;
         &amp;quot;primarylump&amp;quot;:   &amp;quot;DEMO4&amp;quot;,&lt;br /&gt;
         &amp;quot;outrowipe&amp;quot;:     1&lt;br /&gt;
     }&lt;br /&gt;
 ]&lt;/div&gt;</summary>
		<author><name>Printz</name></author>
	</entry>
	<entry>
		<id>https://eternity.youfailit.net/index.php?title=DEMOLOOP&amp;diff=6534</id>
		<title>DEMOLOOP</title>
		<link rel="alternate" type="text/html" href="https://eternity.youfailit.net/index.php?title=DEMOLOOP&amp;diff=6534"/>
		<updated>2026-06-14T12:54:28Z</updated>

		<summary type="html">&lt;p&gt;Printz: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Eternity supports the DEMOLOOP lump, which is part of the id24 specifications. This lump lets you define the startup sequence, when the game typically shows you various screens and game demos (replays) in sequence, repeating in a loop. Previously you would need to replace various lumps (like TITLEPIC and credits for the art screens, or the DEMOx lumps, possibly emptying them to remove demos), but the DEMOLOOP lump gives you complete control over this sequence.&lt;br /&gt;
&lt;br /&gt;
DEMOLOOP must contain a JSON text data. The content of DEMOLOOP must be of the form:&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
     &amp;quot;type&amp;quot;:    &amp;quot;demoloop&amp;quot;,&lt;br /&gt;
     &amp;quot;version&amp;quot;: &amp;quot;1.0.0&amp;quot;,&lt;br /&gt;
     &amp;quot;metadata&amp;quot;: {&lt;br /&gt;
         &amp;quot;author&amp;quot;:      &amp;quot;...&amp;quot;,&lt;br /&gt;
         &amp;quot;timestamp&amp;quot;:   &amp;quot;...&amp;quot;,&lt;br /&gt;
         &amp;quot;application&amp;quot;: &amp;quot;...&lt;br /&gt;
     },&lt;br /&gt;
 &lt;br /&gt;
     &amp;quot;data&amp;quot;: {&lt;br /&gt;
         &amp;quot;entries&amp;quot;: [&lt;br /&gt;
             {&lt;br /&gt;
                 &amp;quot;type&amp;quot;:          0,&lt;br /&gt;
                 &amp;quot;primarylump&amp;quot;:   &amp;quot;IMAGE1&amp;quot;,&lt;br /&gt;
                 &amp;quot;secondarylump&amp;quot;: &amp;quot;MUSIC1&amp;quot;,&lt;br /&gt;
                 &amp;quot;duration&amp;quot;:      5.5,&lt;br /&gt;
                 &amp;quot;outrowipe&amp;quot;:     1&lt;br /&gt;
             },&lt;br /&gt;
             {&lt;br /&gt;
                 &amp;quot;type&amp;quot;:       1,&lt;br /&gt;
                 &amp;quot;primarylump: &amp;quot;DEMO5&amp;quot;,&lt;br /&gt;
                 &amp;quot;outrowipe&amp;quot;:  0&lt;br /&gt;
             }&lt;br /&gt;
         ]&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==Explanation of fields==&lt;br /&gt;
*&amp;quot;type&amp;quot;: must be &amp;quot;demoloop&amp;quot;.&lt;br /&gt;
*&amp;quot;version&amp;quot;: must be &amp;quot;1.0.0&amp;quot; maximum.&lt;br /&gt;
*&amp;quot;metadata&amp;quot;: required id24 information. Eternity does not consume them, but they should be provided.&lt;br /&gt;
*&amp;quot;data&amp;quot;: must contain a single &amp;quot;entries&amp;quot; array of one or more elements (the example above shows two entries). Each element is described below:&lt;br /&gt;
:*&amp;quot;type&amp;quot;: can be 0 or 1. 0 means art screen, 1 means demo (game replay).&lt;br /&gt;
:*&amp;quot;primarylump&amp;quot;: if &amp;quot;type&amp;quot; is 0 (art screen), this is the name of the graphics lump to display as the art screen. Eternity tolerates a missing &amp;quot;primarylump&amp;quot;, in which case it will show the Eternity credits screen, but this is nonstandard and not portable. If &amp;quot;type&amp;quot; is 1 (demo), this is the name of the demo lump, and it&#039;s required.&lt;br /&gt;
:*&amp;quot;outrowipe&amp;quot;: can be 0 or 1. 0 means no screen wipe effect (e.g. melt) will occur after the end of the current stage. 1 means to apply the wipe effect.&lt;br /&gt;
:*&amp;quot;secondarylump&amp;quot;: only applies if &amp;quot;type&amp;quot; is 0 (art screen). This is optional and will be the lump name of the music to play during the display of the art screen. Eternity allows omitting the game-specific prefix such as &amp;quot;D_&amp;quot; on Doom; for example both &amp;quot;runnin&amp;quot; and &amp;quot;D_RUNNIN&amp;quot; are valid for Doom 2. The name is case insensitive. Completely omitting &amp;quot;secondarylump&amp;quot; will just keep playing the music from the previous stage. Demos don&#039;t use this option because the levels they replay have their own music.&lt;br /&gt;
:*&amp;quot;duration&amp;quot;: only applies when &amp;quot;type&amp;quot; is 0 (art screen). This is time in seconds that the art screen will display before going to the next stage. It can be expressed in decimal quantities.&lt;br /&gt;
==Example==&lt;br /&gt;
Below is how the sequence in Ultimate Doom would be defined. Keep in mind that Eternity by default has it hardcoded, but a representation in the DEMOLOOP would look like the following. Important: only the value of &amp;quot;entries&amp;quot; is shown below, but remember to adhere to the complete format to make it valid:&lt;br /&gt;
&lt;br /&gt;
 [&lt;br /&gt;
     {&lt;br /&gt;
         &amp;quot;type&amp;quot;:          0,&lt;br /&gt;
         &amp;quot;primarylump&amp;quot;:   &amp;quot;TITLEPIC&amp;quot;,&lt;br /&gt;
         &amp;quot;secondarylump&amp;quot;: &amp;quot;intro&amp;quot;,&lt;br /&gt;
         &amp;quot;outrowipe&amp;quot;:     1,&lt;br /&gt;
         &amp;quot;duration&amp;quot;:      4.85714285714285714286&lt;br /&gt;
     },&lt;br /&gt;
     {&lt;br /&gt;
         &amp;quot;type&amp;quot;:          1,&lt;br /&gt;
         &amp;quot;primarylump&amp;quot;:   &amp;quot;DEMO1&amp;quot;,&lt;br /&gt;
         &amp;quot;outrowipe&amp;quot;:     1&lt;br /&gt;
     },&lt;br /&gt;
     {&lt;br /&gt;
         &amp;quot;type&amp;quot;:          0,&lt;br /&gt;
         &amp;quot;outrowipe&amp;quot;:     1,&lt;br /&gt;
         &amp;quot;duration&amp;quot;:      11&lt;br /&gt;
     },&lt;br /&gt;
     {&lt;br /&gt;
         &amp;quot;type&amp;quot;:          1,&lt;br /&gt;
         &amp;quot;primarylump&amp;quot;:   &amp;quot;DEMO2&amp;quot;,&lt;br /&gt;
         &amp;quot;outrowipe&amp;quot;:     1&lt;br /&gt;
     },&lt;br /&gt;
     {&lt;br /&gt;
         &amp;quot;type&amp;quot;:          0,&lt;br /&gt;
         &amp;quot;primarylump&amp;quot;:   &amp;quot;CREDIT&amp;quot;,&lt;br /&gt;
         &amp;quot;outrowipe&amp;quot;:     1,&lt;br /&gt;
         &amp;quot;duration&amp;quot;:      11&lt;br /&gt;
     },&lt;br /&gt;
     {&lt;br /&gt;
         &amp;quot;type&amp;quot;:          1,&lt;br /&gt;
         &amp;quot;primarylump&amp;quot;:   &amp;quot;DEMO3&amp;quot;,&lt;br /&gt;
         &amp;quot;outrowipe&amp;quot;:     1&lt;br /&gt;
     },&lt;br /&gt;
     {&lt;br /&gt;
         &amp;quot;type&amp;quot;:          1,&lt;br /&gt;
         &amp;quot;primarylump&amp;quot;:   &amp;quot;DEMO4&amp;quot;,&lt;br /&gt;
         &amp;quot;outrowipe&amp;quot;:     1&lt;br /&gt;
     }&lt;br /&gt;
 ]&lt;/div&gt;</summary>
		<author><name>Printz</name></author>
	</entry>
	<entry>
		<id>https://eternity.youfailit.net/index.php?title=DEMOLOOP&amp;diff=6533</id>
		<title>DEMOLOOP</title>
		<link rel="alternate" type="text/html" href="https://eternity.youfailit.net/index.php?title=DEMOLOOP&amp;diff=6533"/>
		<updated>2026-06-14T12:38:11Z</updated>

		<summary type="html">&lt;p&gt;Printz: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Eternity supports the DEMOLOOP lump, which is part of the id24 specifications. This lump lets you define the startup sequence, when the game typically shows you various screens and game demos (replays) in sequence, repeating in a loop. Previously you would need to replace various lumps (like TITLEPIC and credits for the art screens, or the DEMOx lumps, possibly emptying them to remove demos), but the DEMOLOOP lump gives you complete control over this sequence.&lt;br /&gt;
&lt;br /&gt;
DEMOLOOP must contain a JSON text data. The content of DEMOLOOP must be of the form:&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
     &amp;quot;type&amp;quot;:    &amp;quot;demoloop&amp;quot;,&lt;br /&gt;
     &amp;quot;version&amp;quot;: &amp;quot;1.0.0&amp;quot;,&lt;br /&gt;
     &amp;quot;metadata&amp;quot;: {&lt;br /&gt;
         &amp;quot;author&amp;quot;:      &amp;quot;...&amp;quot;,&lt;br /&gt;
         &amp;quot;timestamp&amp;quot;:   &amp;quot;...&amp;quot;,&lt;br /&gt;
         &amp;quot;application&amp;quot;: &amp;quot;...&lt;br /&gt;
     },&lt;br /&gt;
 &lt;br /&gt;
     &amp;quot;data&amp;quot;: {&lt;br /&gt;
         &amp;quot;entries&amp;quot;: [&lt;br /&gt;
             {&lt;br /&gt;
                 &amp;quot;type&amp;quot;:          0,&lt;br /&gt;
                 &amp;quot;primarylump&amp;quot;:   &amp;quot;IMAGE1&amp;quot;,&lt;br /&gt;
                 &amp;quot;secondarylump&amp;quot;: &amp;quot;MUSIC1&amp;quot;,&lt;br /&gt;
                 &amp;quot;duration&amp;quot;:      5.5,&lt;br /&gt;
                 &amp;quot;outrowipe&amp;quot;:     1&lt;br /&gt;
             },&lt;br /&gt;
             {&lt;br /&gt;
                 &amp;quot;type&amp;quot;:       1,&lt;br /&gt;
                 &amp;quot;primarylump: &amp;quot;DEMO5&amp;quot;,&lt;br /&gt;
                 &amp;quot;outrowipe&amp;quot;:  0&lt;br /&gt;
             }&lt;br /&gt;
         ]&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==Explanation of fields==&lt;br /&gt;
*&amp;quot;type&amp;quot;: must be &amp;quot;demoloop&amp;quot;.&lt;br /&gt;
*&amp;quot;version&amp;quot;: must be &amp;quot;1.0.0&amp;quot; maximum.&lt;br /&gt;
*&amp;quot;metadata&amp;quot;: required id24 information. Eternity does not consume them, but they should be provided.&lt;br /&gt;
*&amp;quot;data&amp;quot;: must contain a single &amp;quot;entries&amp;quot; array of one or more elements (the example above shows two entries). Each element is described below:&lt;br /&gt;
:*&amp;quot;type&amp;quot;: can be 0 or 1. 0 means art screen, 1 means demo (game replay).&lt;br /&gt;
:*&amp;quot;primarylump&amp;quot;: if &amp;quot;type&amp;quot; is 0 (art screen), this is the name of the graphics lump to display as the art screen. Eternity tolerates a missing &amp;quot;primarylump&amp;quot;, in which case it will show the credits screen, but this is nonstandard and not portable. If &amp;quot;type&amp;quot; is 1 (demo), this is the name of the demo lump, and it&#039;s required.&lt;br /&gt;
:*&amp;quot;outrowipe&amp;quot;: can be 0 or 1. 0 means no screen wipe effect (e.g. melt) will occur after the end of the current stage. 1 means to apply the wipe effect.&lt;br /&gt;
:*&amp;quot;secondarylump&amp;quot;: only applies if &amp;quot;type&amp;quot; is 0 (art screen). This is optional and will be the lump name of the music to play during the display of the art screen. Eternity allows omitting the game-specific prefix such as &amp;quot;D_&amp;quot; on Doom; for example both &amp;quot;runnin&amp;quot; and &amp;quot;D_RUNNIN&amp;quot; are valid for Doom 2. The name is case insensitive. Demos don&#039;t use this option because the levels they replay have their own music.&lt;br /&gt;
:*&amp;quot;duration&amp;quot;: only applies when &amp;quot;type&amp;quot; is 0 (art screen). This is time in seconds that the art screen will display before going to the next stage. It can be expressed in decimal quantities.&lt;/div&gt;</summary>
		<author><name>Printz</name></author>
	</entry>
	<entry>
		<id>https://eternity.youfailit.net/index.php?title=DEMOLOOP&amp;diff=6532</id>
		<title>DEMOLOOP</title>
		<link rel="alternate" type="text/html" href="https://eternity.youfailit.net/index.php?title=DEMOLOOP&amp;diff=6532"/>
		<updated>2026-06-14T12:34:30Z</updated>

		<summary type="html">&lt;p&gt;Printz: /* Explanation of fields */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Eternity supports the DEMOLOOP lump, which is part of the id24 specifications.&lt;br /&gt;
&lt;br /&gt;
DEMOLOOP must contain a JSON text data. The content of DEMOLOOP must be of the form:&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
     &amp;quot;type&amp;quot;:    &amp;quot;demoloop&amp;quot;,&lt;br /&gt;
     &amp;quot;version&amp;quot;: &amp;quot;1.0.0&amp;quot;,&lt;br /&gt;
     &amp;quot;metadata&amp;quot;: {&lt;br /&gt;
         &amp;quot;author&amp;quot;:      &amp;quot;...&amp;quot;,&lt;br /&gt;
         &amp;quot;timestamp&amp;quot;:   &amp;quot;...&amp;quot;,&lt;br /&gt;
         &amp;quot;application&amp;quot;: &amp;quot;...&lt;br /&gt;
     },&lt;br /&gt;
 &lt;br /&gt;
     &amp;quot;data&amp;quot;: {&lt;br /&gt;
         &amp;quot;entries&amp;quot;: [&lt;br /&gt;
             {&lt;br /&gt;
                 &amp;quot;type&amp;quot;:          0,&lt;br /&gt;
                 &amp;quot;primarylump&amp;quot;:   &amp;quot;IMAGE1&amp;quot;,&lt;br /&gt;
                 &amp;quot;secondarylump&amp;quot;: &amp;quot;MUSIC1&amp;quot;,&lt;br /&gt;
                 &amp;quot;duration&amp;quot;:      5.5,&lt;br /&gt;
                 &amp;quot;outrowipe&amp;quot;:     1&lt;br /&gt;
             },&lt;br /&gt;
             {&lt;br /&gt;
                 &amp;quot;type&amp;quot;:       1,&lt;br /&gt;
                 &amp;quot;primarylump: &amp;quot;DEMO5&amp;quot;,&lt;br /&gt;
                 &amp;quot;outrowipe&amp;quot;:  0&lt;br /&gt;
             }&lt;br /&gt;
         ]&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==Explanation of fields==&lt;br /&gt;
*&amp;quot;type&amp;quot;: must be &amp;quot;demoloop&amp;quot;.&lt;br /&gt;
*&amp;quot;version&amp;quot;: must be &amp;quot;1.0.0&amp;quot; maximum.&lt;br /&gt;
*&amp;quot;metadata&amp;quot;: required id24 information. Eternity does not consume them, but they should be provided.&lt;br /&gt;
*&amp;quot;data&amp;quot;: must contain a single &amp;quot;entries&amp;quot; array of one or more elements. Each element is described below:&lt;br /&gt;
:*&amp;quot;type&amp;quot;: can be 0 or 1. 0 means art screen, 1 means demo (game replay).&lt;br /&gt;
:*&amp;quot;primarylump&amp;quot;: if &amp;quot;type&amp;quot; is 0 (art screen), this is the name of the graphics lump to display as the art screen. Eternity tolerates a missing &amp;quot;primarylump&amp;quot;, in which case it will show the credits screen, but this is nonstandard and not portable. If &amp;quot;type&amp;quot; is 1 (demo), this is the name of the demo lump, and it&#039;s required.&lt;br /&gt;
:*&amp;quot;outrowipe&amp;quot;: can be 0 or 1. 0 means no screen wipe effect (e.g. melt) will occur after the end of the current stage. 1 means to apply the wipe effect.&lt;br /&gt;
:*&amp;quot;secondarylump&amp;quot;: only applies if &amp;quot;type&amp;quot; is 0 (art screen). This is optional and will be the lump name of the music to play during the display of the art screen. Eternity allows omitting the game-specific prefix such as &amp;quot;D_&amp;quot; on Doom; for example both &amp;quot;runnin&amp;quot; and &amp;quot;D_RUNNIN&amp;quot; are valid for Doom 2. The name is case insensitive. Demos don&#039;t use this option because the levels they replay have their own music.&lt;br /&gt;
:*&amp;quot;duration&amp;quot;: only applies when &amp;quot;type&amp;quot; is 0 (art screen). This is time in seconds that the art screen will display before going to the next stage. It can be expressed in decimal quantities.&lt;/div&gt;</summary>
		<author><name>Printz</name></author>
	</entry>
	<entry>
		<id>https://eternity.youfailit.net/index.php?title=DEMOLOOP&amp;diff=6531</id>
		<title>DEMOLOOP</title>
		<link rel="alternate" type="text/html" href="https://eternity.youfailit.net/index.php?title=DEMOLOOP&amp;diff=6531"/>
		<updated>2026-06-14T12:34:03Z</updated>

		<summary type="html">&lt;p&gt;Printz: /* Explanation of fields */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Eternity supports the DEMOLOOP lump, which is part of the id24 specifications.&lt;br /&gt;
&lt;br /&gt;
DEMOLOOP must contain a JSON text data. The content of DEMOLOOP must be of the form:&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
     &amp;quot;type&amp;quot;:    &amp;quot;demoloop&amp;quot;,&lt;br /&gt;
     &amp;quot;version&amp;quot;: &amp;quot;1.0.0&amp;quot;,&lt;br /&gt;
     &amp;quot;metadata&amp;quot;: {&lt;br /&gt;
         &amp;quot;author&amp;quot;:      &amp;quot;...&amp;quot;,&lt;br /&gt;
         &amp;quot;timestamp&amp;quot;:   &amp;quot;...&amp;quot;,&lt;br /&gt;
         &amp;quot;application&amp;quot;: &amp;quot;...&lt;br /&gt;
     },&lt;br /&gt;
 &lt;br /&gt;
     &amp;quot;data&amp;quot;: {&lt;br /&gt;
         &amp;quot;entries&amp;quot;: [&lt;br /&gt;
             {&lt;br /&gt;
                 &amp;quot;type&amp;quot;:          0,&lt;br /&gt;
                 &amp;quot;primarylump&amp;quot;:   &amp;quot;IMAGE1&amp;quot;,&lt;br /&gt;
                 &amp;quot;secondarylump&amp;quot;: &amp;quot;MUSIC1&amp;quot;,&lt;br /&gt;
                 &amp;quot;duration&amp;quot;:      5.5,&lt;br /&gt;
                 &amp;quot;outrowipe&amp;quot;:     1&lt;br /&gt;
             },&lt;br /&gt;
             {&lt;br /&gt;
                 &amp;quot;type&amp;quot;:       1,&lt;br /&gt;
                 &amp;quot;primarylump: &amp;quot;DEMO5&amp;quot;,&lt;br /&gt;
                 &amp;quot;outrowipe&amp;quot;:  0&lt;br /&gt;
             }&lt;br /&gt;
         ]&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==Explanation of fields==&lt;br /&gt;
*&amp;quot;type&amp;quot;: must be &amp;quot;demoloop&amp;quot;.&lt;br /&gt;
*&amp;quot;version&amp;quot;: must be &amp;quot;1.0.0&amp;quot; maximum.&lt;br /&gt;
*&amp;quot;metadata&amp;quot;: required id24 information. Eternity does not consume them, but they should be provided.&lt;br /&gt;
*&amp;quot;data&amp;quot;: must contain a single &amp;quot;entries&amp;quot; array of one or more elements. Each element is described below:&lt;br /&gt;
:*&amp;quot;type&amp;quot;: can be 0 or 1. 0 means art screen, 1 means demo (game replay).&lt;br /&gt;
:*&amp;quot;primarylump&amp;quot;: if &amp;quot;type&amp;quot; is 0 (art screen), this is the name of the graphics lump to display as the art screen. Eternity tolerates a missing &amp;quot;primarylump&amp;quot;, in which case it will show the credits screen, but this is nonstandard and not portable. If &amp;quot;type&amp;quot; is 1 (demo), this is the name of the demo lump, and it&#039;s required.&lt;br /&gt;
:*&amp;quot;outrowipe&amp;quot;: can be 0 or 1. 0 means no screen wipe effect (e.g. melt) will occur after the end of the current stage. 1 means to apply the wipe effect.&lt;br /&gt;
:*&amp;quot;secondarylump&amp;quot;: only applies if &amp;quot;type&amp;quot; is 0 (art screen). This is optional and will be the lump name of the music to play during the display of the art screen. Eternity allows omitting the game-specific prefix such as &amp;quot;D_&amp;quot; on Doom. The name is case insensitive. Demos don&#039;t use this option because the levels they replay have their own music.&lt;br /&gt;
:*&amp;quot;duration&amp;quot;: only applies when &amp;quot;type&amp;quot; is 0 (art screen). This is time in seconds that the art screen will display before going to the next stage. It can be expressed in decimal quantities.&lt;/div&gt;</summary>
		<author><name>Printz</name></author>
	</entry>
	<entry>
		<id>https://eternity.youfailit.net/index.php?title=DEMOLOOP&amp;diff=6530</id>
		<title>DEMOLOOP</title>
		<link rel="alternate" type="text/html" href="https://eternity.youfailit.net/index.php?title=DEMOLOOP&amp;diff=6530"/>
		<updated>2026-06-14T12:30:05Z</updated>

		<summary type="html">&lt;p&gt;Printz: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Eternity supports the DEMOLOOP lump, which is part of the id24 specifications.&lt;br /&gt;
&lt;br /&gt;
DEMOLOOP must contain a JSON text data. The content of DEMOLOOP must be of the form:&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
     &amp;quot;type&amp;quot;:    &amp;quot;demoloop&amp;quot;,&lt;br /&gt;
     &amp;quot;version&amp;quot;: &amp;quot;1.0.0&amp;quot;,&lt;br /&gt;
     &amp;quot;metadata&amp;quot;: {&lt;br /&gt;
         &amp;quot;author&amp;quot;:      &amp;quot;...&amp;quot;,&lt;br /&gt;
         &amp;quot;timestamp&amp;quot;:   &amp;quot;...&amp;quot;,&lt;br /&gt;
         &amp;quot;application&amp;quot;: &amp;quot;...&lt;br /&gt;
     },&lt;br /&gt;
 &lt;br /&gt;
     &amp;quot;data&amp;quot;: {&lt;br /&gt;
         &amp;quot;entries&amp;quot;: [&lt;br /&gt;
             {&lt;br /&gt;
                 &amp;quot;type&amp;quot;:          0,&lt;br /&gt;
                 &amp;quot;primarylump&amp;quot;:   &amp;quot;IMAGE1&amp;quot;,&lt;br /&gt;
                 &amp;quot;secondarylump&amp;quot;: &amp;quot;MUSIC1&amp;quot;,&lt;br /&gt;
                 &amp;quot;duration&amp;quot;:      5.5,&lt;br /&gt;
                 &amp;quot;outrowipe&amp;quot;:     1&lt;br /&gt;
             },&lt;br /&gt;
             {&lt;br /&gt;
                 &amp;quot;type&amp;quot;:       1,&lt;br /&gt;
                 &amp;quot;primarylump: &amp;quot;DEMO5&amp;quot;,&lt;br /&gt;
                 &amp;quot;outrowipe&amp;quot;:  0&lt;br /&gt;
             }&lt;br /&gt;
         ]&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==Explanation of fields==&lt;br /&gt;
*&amp;quot;type&amp;quot;: must be &amp;quot;demoloop&amp;quot;.&lt;br /&gt;
*&amp;quot;version&amp;quot;: must be &amp;quot;1.0.0&amp;quot; maximum.&lt;br /&gt;
*&amp;quot;metadata&amp;quot;: required id24 information. Eternity does not consume them, but they should be provided.&lt;br /&gt;
*&amp;quot;data&amp;quot;: must contain a single &amp;quot;entries&amp;quot; array of one or more elements. Each element is described below:&lt;br /&gt;
:*&amp;quot;type&amp;quot;: can be 0 or 1. 0 means art screen, 1 means demo (game replay).&lt;br /&gt;
:*&amp;quot;primarylump&amp;quot;: if &amp;quot;type&amp;quot; is 0 (art screen), this is the name of the graphics lump to display as the art screen. Eternity tolerates a missing &amp;quot;primarylump&amp;quot;, in which case it will show the credits screen, but this is nonstandard and not portable. If &amp;quot;type&amp;quot; is 1 (demo), this is the name of the demo lump, and it&#039;s required.&lt;br /&gt;
:*&amp;quot;outrowipe&amp;quot;: can be 0 or 1. 0 means no screen wipe effect (e.g. melt) will occur after the end of the current stage. 1 means to apply the wipe effect.&lt;br /&gt;
:*&amp;quot;secondarylump&amp;quot;: only applies if &amp;quot;type&amp;quot; is 0 (art screen). This is optional and will be the lump name of the music to play during the display of the art screen. Demos don&#039;t use this option because the levels they replay have their own music.&lt;br /&gt;
:*&amp;quot;duration&amp;quot;: only applies when &amp;quot;type&amp;quot; is 0 (art screen). This is time in seconds that the art screen will display before going to the next stage. It can be expressed in decimal quantities.&lt;/div&gt;</summary>
		<author><name>Printz</name></author>
	</entry>
	<entry>
		<id>https://eternity.youfailit.net/index.php?title=DEMOLOOP&amp;diff=6529</id>
		<title>DEMOLOOP</title>
		<link rel="alternate" type="text/html" href="https://eternity.youfailit.net/index.php?title=DEMOLOOP&amp;diff=6529"/>
		<updated>2026-06-14T10:13:18Z</updated>

		<summary type="html">&lt;p&gt;Printz: Created page with &amp;quot;Eternity supports the DEMOLOOP lump, which is part of the id24 specifications.  DEMOLOOP must contain a JSON text data. The content of DEMOLOOP must be of the form:   {      &amp;quot;type&amp;quot;:    &amp;quot;demoloop&amp;quot;,      &amp;quot;version&amp;quot;: &amp;quot;1.0.0&amp;quot;,      &amp;quot;metadata&amp;quot;: {          &amp;quot;author&amp;quot;:      &amp;quot;...&amp;quot;,          &amp;quot;timestamp&amp;quot;:   &amp;quot;...&amp;quot;,          &amp;quot;application&amp;quot;: &amp;quot;...      },        &amp;quot;data&amp;quot;: {          &amp;quot;entries: [              {                  &amp;quot;type&amp;quot;:          0,                  &amp;quot;primarylump&amp;quot;:   &amp;quot;IMAGE1&amp;quot;,...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Eternity supports the DEMOLOOP lump, which is part of the id24 specifications.&lt;br /&gt;
&lt;br /&gt;
DEMOLOOP must contain a JSON text data. The content of DEMOLOOP must be of the form:&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
     &amp;quot;type&amp;quot;:    &amp;quot;demoloop&amp;quot;,&lt;br /&gt;
     &amp;quot;version&amp;quot;: &amp;quot;1.0.0&amp;quot;,&lt;br /&gt;
     &amp;quot;metadata&amp;quot;: {&lt;br /&gt;
         &amp;quot;author&amp;quot;:      &amp;quot;...&amp;quot;,&lt;br /&gt;
         &amp;quot;timestamp&amp;quot;:   &amp;quot;...&amp;quot;,&lt;br /&gt;
         &amp;quot;application&amp;quot;: &amp;quot;...&lt;br /&gt;
     },&lt;br /&gt;
 &lt;br /&gt;
     &amp;quot;data&amp;quot;: {&lt;br /&gt;
         &amp;quot;entries: [&lt;br /&gt;
             {&lt;br /&gt;
                 &amp;quot;type&amp;quot;:          0,&lt;br /&gt;
                 &amp;quot;primarylump&amp;quot;:   &amp;quot;IMAGE1&amp;quot;,&lt;br /&gt;
                 &amp;quot;secondarylump&amp;quot;: &amp;quot;MUSIC1&amp;quot;,&lt;br /&gt;
                 &amp;quot;duration&amp;quot;:      5,&lt;br /&gt;
                 &amp;quot;outrowipe&amp;quot;:     1&lt;br /&gt;
             },&lt;br /&gt;
             {&lt;br /&gt;
                 &amp;quot;type&amp;quot;:       1,&lt;br /&gt;
                 &amp;quot;primarylump: &amp;quot;DEMO5&amp;quot;,&lt;br /&gt;
                 &amp;quot;outrowipe&amp;quot;:  0&lt;br /&gt;
             }&lt;br /&gt;
         ]&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;/div&gt;</summary>
		<author><name>Printz</name></author>
	</entry>
	<entry>
		<id>https://eternity.youfailit.net/index.php?title=Predefined_lumps&amp;diff=6528</id>
		<title>Predefined lumps</title>
		<link rel="alternate" type="text/html" href="https://eternity.youfailit.net/index.php?title=Predefined_lumps&amp;diff=6528"/>
		<updated>2026-06-14T09:58:00Z</updated>

		<summary type="html">&lt;p&gt;Printz: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Most predefined lumps used in BOOM and MBF are still present in Eternity, although not all are used. These lumps can be found in eternity.pke and are no longer stored inside the executable, primarily for reasons of code size and compile time.&lt;br /&gt;
{{Backto|Editing reference}}&lt;br /&gt;
&lt;br /&gt;
== New lump list ==&lt;br /&gt;
 Menu text&lt;br /&gt;
 ---------&lt;br /&gt;
 M_KEYBND       Key Bindings entry in setup menu&lt;br /&gt;
 M_AUTO         Automap entry in setup menu&lt;br /&gt;
 M_CHATM        Chat strings entry in setup menu (Replaces M_CHAT, New to SMMU)&lt;br /&gt;
 M_ENEM         Enemies options entry in setup menu&lt;br /&gt;
 M_STAT         Status bar and Hud entry in setup menu&lt;br /&gt;
 M_WEAP         Weapons entry in setup menu&lt;br /&gt;
 M_COLORS       Palette color picker diagram&lt;br /&gt;
 M_PALNO        Xed-out symbol for unused automap features&lt;br /&gt;
 M_BUTT1        Setup reset button off state (currently unused)&lt;br /&gt;
 M_BUTT2        Setup reset button on state (currently unused)&lt;br /&gt;
 M_LDSV         Load/Save menu graphic (new to SMMU)&lt;br /&gt;
 M_FEAT         Features menu graphic (new to SMMU)&lt;br /&gt;
 M_MULTI        Multiplayer options menu graphic (new to SMMU)&lt;br /&gt;
 M_ABOUT        About menu graphic (new to SMMU)&lt;br /&gt;
 M_DEMOS        Demos menu graphic (new to SMMU)&lt;br /&gt;
 M_WAD          Wad loading menu graphic (new to SMMU)&lt;br /&gt;
 M_SOUND        Sound options menu graphic (new to SMMU)&lt;br /&gt;
 M_VIDEO        Video options menu graphic (new to SMMU)&lt;br /&gt;
 M_MOUSE        Mouse options menu graphic (new to SMMU)&lt;br /&gt;
 M_HUD          Heads-up options menu graphic (new to SMMU)&lt;br /&gt;
 M_TCPIP        TCP/IP connect menu graphic (new to SMMU)&lt;br /&gt;
 M_SERIAL       Serial connect menu graphic (new to SMMU)&lt;br /&gt;
 M_PLAYER       Player options menu graphic (new to SMMU)&lt;br /&gt;
 M_COMPAT       Compatibility options menu graphic (new to MBF)&lt;br /&gt;
 M_SLIDEM       Small slider gfx, middle segment (new to SMMU)&lt;br /&gt;
 M_SLIDEL       Small slider gfx, left end (new to SMMU)&lt;br /&gt;
 M_SLIDEO       Small slider gfx, caret (new to SMMU)&lt;br /&gt;
 M_SLIDER       Small slider gfx, right end (new to SMMU)&lt;br /&gt;
 MBFTEXT        Marine&#039;s Best Friend menu graphic (new to MBF, currently unused)&lt;br /&gt;
 M_ETCOPT       Eternity options menu graphic (new to Eternity)&lt;br /&gt;
 &lt;br /&gt;
 Font chars&lt;br /&gt;
 ----------&lt;br /&gt;
 STCFN096       ` character for standard DOOM font&lt;br /&gt;
 STCFN123       left end of console horizontal divider bar  (new to SMMU)&lt;br /&gt;
 STCFN124       center of console horizontal divider bar    (new to SMMU)&lt;br /&gt;
 STCFN125       right end of console horizontal divider bar (new to SMMU)&lt;br /&gt;
 &lt;br /&gt;
 STBR123        HUD font bargraph char, full, 4 vertical bars&lt;br /&gt;
 STBR124        HUD font bargraph char, partial, 3 vertical bars&lt;br /&gt;
 STBR125        HUD font bargraph char, partial, 2 vertical bars&lt;br /&gt;
 STBR126        HUD font bargraph char, partial, 1 vertical bars&lt;br /&gt;
 STBR127        HUD font bargraph char, empty, 0 vertical bars&lt;br /&gt;
 &lt;br /&gt;
 DIG0         HUD font 0 char&lt;br /&gt;
 DIG1         HUD font 1 char&lt;br /&gt;
 DIG2         HUD font 2 char&lt;br /&gt;
 DIG3         HUD font 3 char&lt;br /&gt;
 DIG4         HUD font 4 char&lt;br /&gt;
 DIG5         HUD font 5 char&lt;br /&gt;
 DIG6         HUD font 6 char&lt;br /&gt;
 DIG7         HUD font 7 char&lt;br /&gt;
 DIG8         HUD font 8 char&lt;br /&gt;
 DIG9         HUD font 9 char&lt;br /&gt;
 DIGA         HUD font A char&lt;br /&gt;
 DIGB         HUD font B char&lt;br /&gt;
 DIGC         HUD font C char&lt;br /&gt;
 DIGD         HUD font D char&lt;br /&gt;
 DIGE         HUD font E char&lt;br /&gt;
 DIGF         HUD font F char&lt;br /&gt;
 DIGG         HUD font G char&lt;br /&gt;
 DIGH         HUD font H char&lt;br /&gt;
 DIGI         HUD font I char&lt;br /&gt;
 DIGJ         HUD font J char&lt;br /&gt;
 DIGK         HUD font K char&lt;br /&gt;
 DIGL         HUD font L char&lt;br /&gt;
 DIGM         HUD font M char&lt;br /&gt;
 DIGN         HUD font N char&lt;br /&gt;
 DIGO         HUD font O char&lt;br /&gt;
 DIGP         HUD font P char&lt;br /&gt;
 DIGQ         HUD font Q char&lt;br /&gt;
 DIGR         HUD font R char&lt;br /&gt;
 DIGS         HUD font S char&lt;br /&gt;
 DIGT         HUD font T char&lt;br /&gt;
 DIGU         HUD font U char&lt;br /&gt;
 DIGV         HUD font V char&lt;br /&gt;
 DIGW         HUD font W char&lt;br /&gt;
 DIGX         HUD font X char&lt;br /&gt;
 DIGY         HUD font Y char&lt;br /&gt;
 DIGZ         HUD font Z char&lt;br /&gt;
 DIG45        HUD font - char&lt;br /&gt;
 DIG47        HUD font / char&lt;br /&gt;
 DIG58        HUD font : char&lt;br /&gt;
 DIG91        HUD font [ char&lt;br /&gt;
 DIG93        HUD font ] char&lt;br /&gt;
 &lt;br /&gt;
 Status bar&lt;br /&gt;
 ----------&lt;br /&gt;
 STKEYS6        Both blue keys graphic&lt;br /&gt;
 STKEYS7        Both yellow keys graphic&lt;br /&gt;
 STKEYS8        Both red keys graphic&lt;br /&gt;
 &lt;br /&gt;
 Box chars&lt;br /&gt;
 ---------&lt;br /&gt;
 BOXUL        Upper left corner of box&lt;br /&gt;
 BOXUC        Center of upper border of box&lt;br /&gt;
 BOXUR        Upper right corner of box&lt;br /&gt;
 BOXCL        Center of left border of box&lt;br /&gt;
 BOXCC        Center of box&lt;br /&gt;
 BOXCR        Center of right border of box&lt;br /&gt;
 BOXLL        Lower left corner of box&lt;br /&gt;
 BOXLC        Center of lower border of box&lt;br /&gt;
 BOXLR        Lower right corner of box &lt;br /&gt;
 &lt;br /&gt;
 Misc HUD Graphics&lt;br /&gt;
 -----------------&lt;br /&gt;
 HU_FRAGS     Frags display header graphic (new to SMMU)&lt;br /&gt;
 HU_FRAGBX    Frags display name plate graphic (new to SMMU)&lt;br /&gt;
 CROSS1       + crosshair graphic (new to SMMU)&lt;br /&gt;
 CROSS2       Angle crosshair graphic (new to SMMU)&lt;br /&gt;
 VPO          Visplane overflow indicator (new to SMMU)&lt;br /&gt;
 OPENSOCK     Network connection error indicator (new to SMMU) &lt;br /&gt;
 &lt;br /&gt;
 Misc Graphics&lt;br /&gt;
 -------------&lt;br /&gt;
 UDTTL00      Hires Ultimate DOOM title screen, upper left (new to SMMU)&lt;br /&gt;
 UDTTL01      Hires Ultimate DOOM title screen, lower left (new to SMMU)&lt;br /&gt;
 UDTTL10      Hires Ultimate DOOM title screen, upper rght (new to SMMU)&lt;br /&gt;
 UDTTL11      Hires Ultimate DOOM title screen, lower rght (new to SMMU)&lt;br /&gt;
 D2TTL00      Hires DOOM II title screen, upper left (new to SMMU)&lt;br /&gt;
 D2TTL01      Hires DOOM II title screen, lower left (new to SMMU)&lt;br /&gt;
 D2TTL10      Hires DOOM II title screen, upper rght (new to SMMU)&lt;br /&gt;
 D2TTL11      Hires DOOM II title screen, lower rght (new to SMMU)&lt;br /&gt;
 DLGBACK      Default dialog background graphic (new to Eternity) &lt;br /&gt;
 &lt;br /&gt;
 Lumps missing in v1.1&lt;br /&gt;
 ---------------------&lt;br /&gt;
 STTMINUS       minus sign for neg frags in status bar&lt;br /&gt;
 WIMINUS        minus sign for neg frags on end screen&lt;br /&gt;
 M_NMARE        nightmare skill menu string&lt;br /&gt;
 STBAR          status bar background&lt;br /&gt;
 DSGETPOW       sound for obtaining power-up &lt;br /&gt;
 &lt;br /&gt;
 Sprites&lt;br /&gt;
 -------&lt;br /&gt;
 TNT1A0         Invisible sprite for push/pull controller things&lt;br /&gt;
 DOGS*          MBF helper dog sprite (new to MBF)&lt;br /&gt;
 PLS1*          BFG 2704 plasma 1 sprite (new to MBF)&lt;br /&gt;
 PLS2*          BFG 2704 plasma 2 sprite (new to MBF)&lt;br /&gt;
 SLDG*          FLOOR_SLUDGE TerrainType fx sprite (new to Eternity)&lt;br /&gt;
 LVAS*          FLOOR_LAVA TerrainType fx sprite (new to Eternity)&lt;br /&gt;
 SPSH*          FLOOR_WATER TerrainType fx sprite (new to Eternity) &lt;br /&gt;
 &lt;br /&gt;
 Misc Sounds&lt;br /&gt;
 -----------&lt;br /&gt;
 DSDGSIT        MBF helper dog alert (new to MBF)&lt;br /&gt;
 DSDGATK        MBF helper dog attack (new to MBF)&lt;br /&gt;
 DSDGACT        MBF helper dog idle (new to MBF)&lt;br /&gt;
 DSDGDTH        MBF helper dog death (new to MBF)&lt;br /&gt;
 DSDGPAIN       MBF helper dog pain (new to MBF)&lt;br /&gt;
 DSPLFEET       Light player impact (new to Eternity)&lt;br /&gt;
 DSFALLHT       Falling damage impact death (new to Eternity)&lt;br /&gt;
 DSPLFALL       Falling damage player scream (new to Eternity)&lt;br /&gt;
 DSTHUNDR       MapInfo global thunder effect (new to Eternity)&lt;br /&gt;
 DSMUCK         FLOOR_SLUDGE TerrainType sound (new to Eternity)&lt;br /&gt;
 DSBURN         FLOOR_LAVA TerrainType sound (new to Eternity)&lt;br /&gt;
 DSGLOOP        FLOOR_WATER TerrainType sound (new to Eternity) &lt;br /&gt;
 &lt;br /&gt;
 Flats&lt;br /&gt;
 -----&lt;br /&gt;
 METAL          Complimentary brown metal flat (new to SMMU)&lt;br /&gt;
 F_SKY2         Dummy flat for Hexen-style sky sectors (new to Eternity) &lt;br /&gt;
 &lt;br /&gt;
 Switches and Animations&lt;br /&gt;
 -----------------------&lt;br /&gt;
 SWITCHES       Definition of switch textures recognized&lt;br /&gt;
 ANIMATED       Definition of animated textures and flats recognized&lt;br /&gt;
==SWITCHES format==&lt;br /&gt;
&lt;br /&gt;
The SWITCHES lump makes the names of the switch textures used in the game known to the engine. It consists of a list of records each 20 bytes long, terminated by an entry (not used) whose last 2 bytes are 0.&lt;br /&gt;
&lt;br /&gt;
 9 bytes        Null terminated string naming &amp;quot;off&amp;quot; state texture for switch&lt;br /&gt;
 9 bytes        Null terminated string naming &amp;quot;off&amp;quot; state texture for switch&lt;br /&gt;
 2 bytes        Short integer for the IWADs switch will work in&lt;br /&gt;
     1 = shareware&lt;br /&gt;
     2 = registered/retail DOOM or shareware&lt;br /&gt;
     3 = DOOM II, registered/retail DOOM, or shareware&lt;br /&gt;
     0 = terminates list of known switches&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;NOTE&#039;&#039;&#039;: for defining new switches, use [[EDF switch]], unless you need Boom compatibility. You can also use [[ANIMDEFS]] if you need GZDoom compatibility.&lt;br /&gt;
&lt;br /&gt;
==ANIMATED format==&lt;br /&gt;
&lt;br /&gt;
The ANIMATED lump makes the names of the animated flats and textures known to the engine. It consists of a list of records, each 23 bytes long, terminated by a record (not used) whose first byte is -1 (255).&lt;br /&gt;
&lt;br /&gt;
 1 byte         -1 to terminate list, 0 if a flat, 1 if a texture&lt;br /&gt;
 9 bytes        Null terminated string naming last texture/flat in animation&lt;br /&gt;
 9 bytes        Null terminated string naming first texture/flat in animation&lt;br /&gt;
 4 bytes        Animation speed, number of frames between animation changes&lt;br /&gt;
The [http://www.doomworld.com/idgames/index.php?id=9463 BOOM utility package] contains a program, SWANTBLS.EXE that will generate both the SWITCHES and ANIMATED lumps from a text file. An example is provided, DEFSWANI.DAT that generates the standard set of switches and animations for DOOM.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;NOTE&#039;&#039;&#039;: for defining new animations, use [[EDF animation]], unless you need Boom compatibility. You can also use [[ANIMDEFS]] if you need GZDoom compatibility.&lt;br /&gt;
&lt;br /&gt;
==OPTIONS lump==&lt;br /&gt;
New to MBF, this lump allows you to set certain game settings for when the wad is loaded. See the [[OPTIONS]] documentation for more information.&lt;br /&gt;
&lt;br /&gt;
== New to SMMU ==&lt;br /&gt;
&lt;br /&gt;
Setting the animation speed for a flat to a number higher than 65535 will&lt;br /&gt;
cause the flat to use the swirling liquid effect rather than animation.&lt;br /&gt;
&lt;br /&gt;
===Colormaps===&lt;br /&gt;
 WATERMAP       Custom greenish colormap for underwater use&lt;br /&gt;
 LAVAMAP        Custom red colormap for lava (new to SMMU)&lt;br /&gt;
The WATERMAP lump has the same format as COLORMAP, 34 tables of 256 bytes each, see the [http://www.doomworld.com/idgames/index.php?id=1138 UDS] for details. Note that colormaps you add to a PWAD must be between C_START and C_END markers.&lt;br /&gt;
&lt;br /&gt;
The BOOM utility package contains a program, CMAPTOOL.EXE, that will generate custom colormaps for use with Eternity. It also includes 7 premade colormaps, and an add-on wad containing them.&lt;br /&gt;
&lt;br /&gt;
===Color translation tables===&lt;br /&gt;
 CRBRICK        Translates red range to brick red&lt;br /&gt;
 CRTAN          Translates red range to tan&lt;br /&gt;
 CRGRAY         Translates red range to gray&lt;br /&gt;
 CRGREEN        Translates red range to green&lt;br /&gt;
 CRBROWN        Translates red range to brown&lt;br /&gt;
 CRGOLD         Translates red range to dark yellow&lt;br /&gt;
 CRRED          Translates red range to red range (no change)&lt;br /&gt;
 CRBLUE         Translates red range to light blue&lt;br /&gt;
 CRBLUE2        Translates red range to dark blue (status bar numerals)&lt;br /&gt;
 CRORANGE       Translates red range to orange&lt;br /&gt;
 CRYELLOW       Translates red range to light yellow&lt;br /&gt;
These tables are used to translate the red font characters to other colors. They are made replaceable in order to support custom palettes in TC&#039;s better. Note however that the font character graphics must be defined using the palette indices for the standard red range of the palette 176-191.&lt;br /&gt;
&lt;br /&gt;
== Eternity Note ==&lt;br /&gt;
&lt;br /&gt;
The default text translation range in Heretic is gray rather than red, and replacement fonts should use the gray range in the palette to support color translations.&lt;br /&gt;
&lt;br /&gt;
 Data Lumps and Scripts&lt;br /&gt;
 ----------------------&lt;br /&gt;
 TXTRCONV       DOOM -&amp;gt; DOOM II texture conversion table (new to SMMU)&lt;br /&gt;
 KEYDEFS        Default keybindings (new to Eternity)&lt;br /&gt;
==TXTRCONV format==&lt;br /&gt;
&lt;br /&gt;
The TXTRCONV lump is used to translate DOOM textures to DOOM II textures, for the purpose of playing ExMy levels under DOOM II (accessed via the map command). The format of this lump is currently very strict. The pairs of texture names must be aligned precisely, with the first texture name (&amp;lt;= 8 character) starting in column 0, followed by spaces up to column 16, where the second DOOM II replacement texture name must start. Only one pair must be on a line, and lines must be terminated with a line break. This lump is ASCII text. &lt;br /&gt;
&lt;br /&gt;
==KEYDEFS format==&lt;br /&gt;
&lt;br /&gt;
KEYDEFS contains the engine&#039;s default key bindings. This lump is written to file as keys.csc when a file by that name cannot be found. Editing of this defaults lump is not generally desirable, but it is a simple console script, the syntax of which is expounded upon in the Eternity Engine Console Reference. This lump is ASCII text.&lt;br /&gt;
&lt;br /&gt;
==Sprite colour translation tables==&lt;br /&gt;
[[Thingtype]] [[EDF]] definitions allow a sprite&#039;s colour range to be translated, similar to how the green range is changed with the TRANSLATION1 and TRANSLATION2 [[thing type flags]], but in this case, by using custom external tables. These lumps are 256 bytes large and must be included between T_START and T_END. Normally, they will consist of consecutive 8-bit numbers from 0 to 255 if there is no translation, but the indices which need to be changed will have the numbers of the target colours.&lt;br /&gt;
&lt;br /&gt;
==Demo loop control==&lt;br /&gt;
See [[DEMOLOOP]].&lt;br /&gt;
&lt;br /&gt;
[[Category:Editing reference]]&lt;/div&gt;</summary>
		<author><name>Printz</name></author>
	</entry>
	<entry>
		<id>https://eternity.youfailit.net/index.php?title=Eternity_Engine&amp;diff=6527</id>
		<title>Eternity Engine</title>
		<link rel="alternate" type="text/html" href="https://eternity.youfailit.net/index.php?title=Eternity_Engine&amp;diff=6527"/>
		<updated>2026-06-14T09:56:56Z</updated>

		<summary type="html">&lt;p&gt;Printz: /* Making mods for Eternity */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The Eternity Engine is [[Doom Wiki:Team Eternity|Team Eternity]]&#039;s advanced [[Doom Wiki:Doom|Doom]] [[Doom Wiki:Source port|source port]] and the primary subject of this Wiki. It is meant as a versatile feature port which keeps gameplay compatibility with its roots (DOOM, [[BOOM]], [[MBF]] and so on) while advancing with powerful features such as new ways to design levels ([[linked portals]], [[3DMidTex]], [[polyobjects]] etc.) and modding capabilities (using the [[EDF]] definition language). Every new feature we add is tested not to affect anything that exists so far. &lt;br /&gt;
&lt;br /&gt;
==History==&lt;br /&gt;
The Eternity Engine began in 1998 as a simple modification of [[Doom Wiki:Boom|Boom]] meant to power [[Doom Wiki:Eternity TC|Eternity TC]], which was at that time a new and active project. When [[Doom Wiki:Lee Killough|Lee Killough]] began the [[MBF]] project, [[Doom Wiki:James_Haley_(Quasar)|James &amp;quot;Quasar&amp;quot; Haley]] became a beta tester after emailing Lee with questions about the early Doom alpha versions. The Eternity project moved to an MBF code base after that port&#039;s first release.&lt;br /&gt;
&lt;br /&gt;
In late 1999, [[Doom Wiki:Simon &amp;quot;Fraggle&amp;quot; Howard|Fraggle]] released v3.10 of his MBF-based source port [[SMMU]], which contained support for the new [[Doom Wiki:FraggleScript|FraggleScript]] scripting language. Although activity in the Eternity TC project by editors had steadily dropped to almost nothing, Quasar was still interested in developing the code associated with it. Needing features such as scripting and the [[console]], he then moved the Eternity project&#039;s code into SMMU.&lt;br /&gt;
&lt;br /&gt;
Despite this long history of jumping between Boom-based ports, no public release of Eternity based on any port other than SMMU was ever made. The first private alpha, released to a select few beta testers, was derived from SMMU 3.21 with selected modifications from 3.30. Because of this, Eternity began at version 3.29.&lt;br /&gt;
&lt;br /&gt;
After the release of the [[Doom Wiki:Caverns_of_Darkness|Caverns of Darkness]] project, which used a customized version of Eternity Engine v3.29 Development Beta 5, the project began to attract more attention. A second programmer, [[Doom Wiki:Stephen_McGranahan_(SoM)|Steven &amp;quot;SoM&amp;quot; McGranahan]], joined the project and immediately set to work porting the code to use [[Wikipedia:Simple_DirectMedia_Layer|SDL]], making it capable of running on many operating systems, including [[Wikipedia:Microsoft Windows|Windows]].&lt;br /&gt;
&lt;br /&gt;
Now it has [[Universal Doom Map Format|UDMF]] support and a dynamic weapon and inventory system. It supports linked portals for full room-over-room gameplay. Current major goals for the engine include completing support for [[Doom Wiki:Heretic|Heretic]].&lt;br /&gt;
&lt;br /&gt;
==Getting started==&lt;br /&gt;
You can download Eternity either from [https://www.doomworld.com/forum/25-eternity/ Doomworld] (as official releases) or from [https://devbuilds.drdteam.org/eternity/ DRDTeam] (as &amp;quot;beta quality&amp;quot; development builds, which in practice are generally stable, and may be needed for some modding features listed on this wiki).&lt;br /&gt;
&lt;br /&gt;
Eternity&#039;s goal that makes it different from feature ports such as [[Doom Wiki:GZDoom|GZDoom]] is demo compatibility similar to that of [[Doom Wiki:PrBoom+|PrBoom+]], kept specifically to ensure that every new feature we add fits seamlessly with what exists so far, and that we don&#039;t stray from the bases made so far in the DOOM gameplay.&lt;br /&gt;
&lt;br /&gt;
Support for [[Doom Wiki:Heretic|Heretic]] is growing, though still under way. While we don&#039;t support vanilla Heretic demos for playback yet, a possibility exists in the horizon.&lt;br /&gt;
&lt;br /&gt;
===Playing Eternity===&lt;br /&gt;
When run directly, Eternity tries to find the DOOM, DOOM 2 or Final DOOM megawads in some standard locations. If it can&#039;t find them, it will let you know. If it finds several of them, it will start with a picker screen, letting you choose.&lt;br /&gt;
&lt;br /&gt;
On [[Wikipedia:Windows|Windows]] you can use the drag-and-drop feature of Explorer by moving WADs and PKEs into Eternity&#039;s executable. Or you can use Powershell or Command Prompt in a manner similar to starting [[Doom Wiki:Vanilla Doom|vanilla DOOM]]. See [[list of command line parameters]]. For more advanced cases, you can use [[GFS]] files to quickly load multiple files and settings together.&lt;br /&gt;
&lt;br /&gt;
The [[Wikipedia:macOS|macOS]] version of Eternity also comes with a visual dialog-box launcher, hiding the complexity behind starting a terminal.&lt;br /&gt;
&lt;br /&gt;
For advanced technical stuff, cheating and testing maps, Eternity has a [[console]] similar to [[Wikipedia:Quake|Quake&#039;s]].&lt;br /&gt;
&lt;br /&gt;
====Loading main game WADs====&lt;br /&gt;
Eternity looks for the main game WADs (IWADs), e.g. doom2.wad, at these locations:&lt;br /&gt;
* IWAD file paths in user/system.cfg;&lt;br /&gt;
* the -iwad command-line parameter;&lt;br /&gt;
* the [[Doom Wiki:Environment variables|&#039;&#039;&#039;DOOMWADDIR&#039;&#039;&#039; or &#039;&#039;&#039;DOOMWADPATH&#039;&#039;&#039; environment variables]];&lt;br /&gt;
* the IWAD in the working directory;&lt;br /&gt;
* the IWAD file under the appropriate game folder of the base directory, which can be found using the -game parameter.&lt;br /&gt;
&lt;br /&gt;
====Loading Master Levels for DOOM II====&lt;br /&gt;
Eternity offers a menu for conveniently loading each WAD from the Master Levels. To start the Master Levels:&lt;br /&gt;
# Start Eternity with DOOM II;&lt;br /&gt;
# Go to the Options menu, under the Game Files section, select WAD Options;&lt;br /&gt;
# Under the Master Levels section, you may need to specify Master Levels Dir to the path with the WADs;&lt;br /&gt;
# Once the path is configured, enter Play Master Levels.&lt;br /&gt;
Once the Master Levels Dir is configured, entering New Game from the menu will give you the choice to start the Master Levels.&lt;br /&gt;
&lt;br /&gt;
===Making mods for Eternity===&lt;br /&gt;
The editors [[Doom Wiki:Doom Builder X|Doom Builder X]], [[Doom Wiki:GZDoom Builder|GZDoom Builder]], [[Doom Wiki:Eureka|Eureka]] and [[Doom Wiki:SLADE|SLADE]] have Eternity level editing support of varying degrees. For [[UDMF]] (modern advanced format) you can use Doom Builder X, GZDoom Builder or SLADE. However, if you lack access to a UDMF-capable editor or don&#039;t want the complexity it brings, you can also use the classic DOOM format, combined with [[ExtraData]]&lt;br /&gt;
&lt;br /&gt;
For general modding, Eternity relies on [[EDF]], its own content definition language. For level definitions in particular it uses [[EMAPINFO]]. Eternity also has growing support for some lumps from [[Doom Wiki:GZDoom|GZDoom]], [[Doom Wiki:Hexen|Hexen]] and recently the id24 standard such as [[ANIMDEFS]] or [[DEMOLOOP]], thus increasing the support for cross-port mods.&lt;br /&gt;
&lt;br /&gt;
Eternity can load [[PKE]] archives, not just [[Doom Wiki:WAD|WADs]]. It can also load unarchived folders structured the same as PKE archives (you can use the -file command-line parameter on folders), facilitating project work. You can use powerful editors such as [[Wikipedia:Visual Studio Code|Visual Studio Code]] on such folders to edit your EDF modifications.&lt;br /&gt;
&lt;br /&gt;
See [[Editing reference|all editing reference]] to get started on modding.&lt;br /&gt;
&lt;br /&gt;
==Major Features==&lt;br /&gt;
&lt;br /&gt;
===Cardboard engine===&lt;br /&gt;
[[Cardboard]] is a floating-point rendering engine created by [[Doom Wiki:Stephen_McGranahan_(SoM)|SoM]] that fixes several problems inherent with the classic fixed-point [[Doom Wiki:Doom rendering engine|Doom rendering engine]].&lt;br /&gt;
&lt;br /&gt;
===EDF===&lt;br /&gt;
[[EDF]], which stands for Eternity Definition Files, is a textual input language that allows specification of almost all the static game data which was once contained inside the executable. This includes [[thingtype|thing types]], [[frame|frames]], sprites, terrain definitions, and more. EDF has a relaxed [[Wikipedia:C programming language|C]]-like syntax and can be used from both files and [[WAD]] lumps.&lt;br /&gt;
&lt;br /&gt;
===ExtraData===&lt;br /&gt;
[[ExtraData]] is another EDF-like data specification language that allows the Doom map format to be extended with any kind of data. Use of special thing, line, and sector types within a map allows the editor to attach ExtraData records to those objects. Special data for the objects is then given inside the script.&lt;br /&gt;
&lt;br /&gt;
===Linked portals===&lt;br /&gt;
[[Linked portals]] are surfaces that, like regular [[portals]], connect different areas of the map, but in addition can be walked through, thus allowing multistory maps to be designed in Doom.&lt;br /&gt;
&lt;br /&gt;
===[[MapInfo]]===&lt;br /&gt;
Eternity expands SMMU&#039;s level info system significantly, allowing dozens of new properties to be specified, and allowing cascading global EMAPINFO lumps as an alternative to inserting MapInfo data into level headers. Among other things, MapInfo is used to tie ExtraData and ACS scripts to the maps that use them.&lt;br /&gt;
&lt;br /&gt;
==Releases==&lt;br /&gt;
A complete list of Eternity&#039;s release history follows. You can find most of these releases on the [https://www.doomworld.com/forum/25-eternity/ Doomworld Eternity forum], on the [https://github.com/team-eternity/eternity/releases GitHub Eternity repository] and the older releases on the [http://eternity.mancubus.net/ee-old/ Eternity Mancubus website]. Most of the releases are Windows only, but the most recent ones are also available on macOS.&lt;br /&gt;
&lt;br /&gt;
For finer grained non-official releases, see also the [[Eternity Engine#Development builds|development builds]] below.&lt;br /&gt;
&lt;br /&gt;
===Version 3.29===&lt;br /&gt;
* 3.29 Private Alpha - September 14, 2000&lt;br /&gt;
* 3.29 Public Beta 1 - January 8, 2001&lt;br /&gt;
* 3.29 Public Beta 2 - January 9, 2001&lt;br /&gt;
* 3.29 Public Beta 3 - May 10, 2001&lt;br /&gt;
* 3.29 Public Beta 4 - June 30, 2001&lt;br /&gt;
* 3.29 Development Beta 5 - October 2, 2001&lt;br /&gt;
* 3.29 &amp;quot;Gamma&amp;quot; - July 4, 2002&lt;br /&gt;
&lt;br /&gt;
===Version 3.31===&lt;br /&gt;
* 3.31 Public Beta 1 - September 11, 2002&lt;br /&gt;
* 3.31 Public Beta 2 - March 5, 2003&lt;br /&gt;
* 3.31 Public Beta 3 - August 8, 2003&lt;br /&gt;
* 3.31 Public Beta 4 - November 29, 2003&lt;br /&gt;
* 3.31 Public Beta 5 - December 17, 2003&lt;br /&gt;
* 3.31 Public Beta 6 - February 29, 2004&lt;br /&gt;
* 3.31 Public Beta 7 - April 11, 2004&lt;br /&gt;
* 3.31 &amp;quot;Delta&amp;quot; Pre-Release Alpha 1 - August 23, 2004&lt;br /&gt;
* 3.31 &amp;quot;Delta&amp;quot; Pre-Release Alpha 2 - November 11, 2004&lt;br /&gt;
* 3.31.10 &amp;quot;Delta&amp;quot; - January 19, 2005&lt;br /&gt;
&lt;br /&gt;
===Version 3.33===&lt;br /&gt;
* 3.33.00 &amp;quot;Genesis&amp;quot; - May 26, 2005&lt;br /&gt;
* 3.33.01 &amp;quot;Outcast&amp;quot; - June 24, 2005&lt;br /&gt;
* 3.33.02 &amp;quot;Warrior&amp;quot; - October 1, 2005&lt;br /&gt;
* 3.33.33 &amp;quot;Paladin&amp;quot; - May 17, 2006&lt;br /&gt;
* 3.33.50 &amp;quot;Phoenix&amp;quot; - October 23, 2006&lt;br /&gt;
&lt;br /&gt;
===Version 3.35===&lt;br /&gt;
* [http://www.doomworld.com/vb/eternity/45146-eternity-engine-v3-35-90-simorgh/ 3.35.90] &amp;quot;Simorgh&amp;quot; - January 11, 2009&lt;br /&gt;
* [http://www.doomworld.com/vb/eternity/45757-eternity-engine-3-35-92-nekhbet/ 3.35.92] &amp;quot;Nekhbet&amp;quot; - March 22, 2009&lt;br /&gt;
&lt;br /&gt;
===Version 3.37===&lt;br /&gt;
* [http://www.doomworld.com/vb/eternity/49268-eternity-engine-3-37-00-sekhmet/ 3.37.00] &amp;quot;Sekhmet&amp;quot; - January 1, 2010&lt;br /&gt;
&lt;br /&gt;
===Version 3.39===&lt;br /&gt;
* [http://www.doomworld.com/vb/eternity/52873-eternity-engine-v3-39-20-resheph/ 3.39.20] &amp;quot;Resheph&amp;quot; - October 10, 2010&lt;br /&gt;
&lt;br /&gt;
===Version 3.40===&lt;br /&gt;
* [http://www.doomworld.com/vb/eternity/53944-eternity-engine-v3-40-00-rebirth/ 3.40.00] &amp;quot;Rebirth&amp;quot; - January 8, 2011&lt;br /&gt;
* [http://www.doomworld.com/vb/eternity/55219-announcing-the-blue-box-ee-3-40-11-and-vaporware-demo/ 3.40.11] &amp;quot;Aasgard&amp;quot; - May 2, 2011&lt;br /&gt;
* [http://www.doomworld.com/vb/eternity/55874-eternity-engine-3-40-15-wodanaz/ 3.40.15] &amp;quot;Wodanaz&amp;quot; - June 22, 2011&lt;br /&gt;
* [http://www.doomworld.com/vb/eternity/58281-eternity-engine-v3-40-20-mjolnir/ 3.40.20] &amp;quot;Mjolnir&amp;quot; - December 26, 2011&lt;br /&gt;
* [http://www.doomworld.com/vb/eternity/61245-eternity-engine-3-40-25-midgard/ 3.40.25] &amp;quot;Midgard&amp;quot; - August 27, 2012&lt;br /&gt;
* [http://www.doomworld.com/vb/eternity/62087-eternity-engine-3-40-30-alfheim/ 3.40.30] &amp;quot;Alfheim&amp;quot; - November 4, 2012&lt;br /&gt;
* [http://www.doomworld.com/vb/eternity/64382-eternity-engine-3-40-37-gungnir/ 3.40.37] &amp;quot;Gungnir&amp;quot; - May 27, 2013&lt;br /&gt;
* [http://www.doomworld.com/vb/eternity/67069-eternity-engine-3-40-46-bifrost/ 3.40.46] &amp;quot;Bifröst&amp;quot; - January 19, 2014 - &#039;&#039;first one with a macOS release&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===Version 3.42===&lt;br /&gt;
* [https://www.doomworld.com/forum/topic/94046-eternity-engine-34202-heimdal-files-documentation-buglist/ 3.42.02] &amp;quot;Heimdal&amp;quot; - May 7, 2017&lt;br /&gt;
* [https://www.doomworld.com/forum/topic/95351-eternity-engine-34203a-heimdal-release-2-hotfix/ 3.42.03a] &amp;quot;Heimdal&amp;quot; release 2 - August 2, 2017&lt;br /&gt;
&lt;br /&gt;
===Version 4.00===&lt;br /&gt;
* [https://www.doomworld.com/forum/topic/99957-eternity-engine-40000-v%C3%B6lusp%C3%A1/ 4.00.00] &amp;quot;Völuspá&amp;quot; - March 17, 2018&lt;br /&gt;
&lt;br /&gt;
===Version 4.01===&lt;br /&gt;
* [https://www.doomworld.com/forum/topic/117429-eternity-engine-40100-tyrfing/ 4.01.00] &amp;quot;Tyrfing&amp;quot; - October 13, 2020&lt;br /&gt;
&lt;br /&gt;
===Version 4.02===&lt;br /&gt;
* [https://www.doomworld.com/forum/topic/119425-eternity-engine-40200-forseti/ 4.02.00] &amp;quot;Forseti&amp;quot; - January 27, 2021&lt;br /&gt;
&lt;br /&gt;
===Version 4.04===&lt;br /&gt;
* [https://www.doomworld.com/forum/topic/148678-eternity-engine-40400-glitnir/ 4.04.00] &amp;quot;Glitnir&amp;quot; - October 12, 2024&lt;br /&gt;
* [https://www.doomworld.com/forum/topic/148678-eternity-engine-40401-glitnir-update-1/ 4.04.01] &amp;quot;Glitnir&amp;quot; Update 1 - October 20, 2024&lt;br /&gt;
* [https://www.doomworld.com/forum/topic/148678-eternity-engine-40402-glitnir-update-2/ 4.04.02] &amp;quot;Glitnir&amp;quot; Update 2 - November 18, 2024&lt;br /&gt;
&lt;br /&gt;
===Version 4.05===&lt;br /&gt;
* [https://www.doomworld.com/forum/topic/154848-eternity-engine-40504-citadel/ 4.05.04] &amp;quot;Citadel&amp;quot; - August 23, 2025&lt;br /&gt;
&lt;br /&gt;
===Version 4.06===&lt;br /&gt;
* [https://www.doomworld.com/forum/topic/158835-eternity-engine-40600-nidhogg/ 4.06.00] &amp;quot;Nidhogg&amp;quot; — June 13, 2026&lt;br /&gt;
&lt;br /&gt;
==Cross-platform development==&lt;br /&gt;
Eternity is built by using the [[Wikipedia:CMake|CMake]] utility. You can download the Eternity [[Wikipedia:source code|source code]] from [[Wikipedia:GitHub|GitHub]] and execute CMake. Eternity&#039;s source code repository, as well as the latest releases, are located [https://github.com/team-eternity/eternity/ here].&lt;br /&gt;
&lt;br /&gt;
==Development builds==&lt;br /&gt;
Development builds (&amp;quot;beta&amp;quot; releases) for Eternity are available for Windows and macOS at [http://devbuilds.drdteam.org/eternity/ DRDTeam&#039;s website]. They are recommended if you encounter serious bugs with any of the official releases, or if you want to test brand new features that didn&#039;t exist in the latest official releases. Due to their beta status, they may be untested and have other problems. However, due to the sometimes sporadic release cycles, it&#039;s often recommended to just try the development builds. The only problem is that by upgrading Eternity often, savegames tend to become unusable, so exercise caution before upgrading Eternity if you rely on games with saves.&lt;br /&gt;
&lt;br /&gt;
==System features==&lt;br /&gt;
*[[Cardboard engine]]&lt;br /&gt;
*[[List of command line parameters]]&lt;br /&gt;
*[[Console]]&lt;br /&gt;
*[[List of cheat codes]]&lt;br /&gt;
*[[GFS|GFS files]]&lt;br /&gt;
*[[ZIP|ZIP mods]]&lt;br /&gt;
&lt;br /&gt;
==Gameplay and modding features==&lt;br /&gt;
*[[DeHackEd / BEX Reference]]&lt;br /&gt;
*[[List of codepointers]]&lt;br /&gt;
*[[EDF|EDF files]]&lt;br /&gt;
*[[Editing reference]]&lt;br /&gt;
*[[OPTIONS|OPTIONS lump]]&lt;br /&gt;
*[[MapInfo]]&lt;br /&gt;
*[[SMMU|Features inherited from SMMU]]&lt;br /&gt;
*[[ExtraData]]&lt;br /&gt;
*[[Hexen format SNDINFO]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Source ports]]&lt;/div&gt;</summary>
		<author><name>Printz</name></author>
	</entry>
	<entry>
		<id>https://eternity.youfailit.net/index.php?title=Main_Page&amp;diff=6526</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://eternity.youfailit.net/index.php?title=Main_Page&amp;diff=6526"/>
		<updated>2026-06-14T09:55:50Z</updated>

		<summary type="html">&lt;p&gt;Printz: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
==Welcome to the Eternity Engine Wiki== &lt;br /&gt;
 &lt;br /&gt;
The [[Eternity Engine]] [[Wikipedia:Wiki|Wiki]] is a community-maintained documentation resource for the Eternity Engine [[Doom Wiki:Source port|source port]] and everything related to it. It is powered by [[Wikipedia:MediaWiki|MediaWiki]]. Feel free to edit and create articles to help make this a valuable source of knowledge. If you&#039;re not familiar with wiki markup, [[Wikipedia:Help:Wikitext|look here]] for some examples.&lt;br /&gt;
&lt;br /&gt;
==About Eternity==&lt;br /&gt;
See general info about the port in the [[Eternity Engine]] page.&lt;br /&gt;
&lt;br /&gt;
==Level editing==&lt;br /&gt;
See [[Editing reference]] for the full documentation. Below are some of the more popular features:&lt;br /&gt;
*[[EMAPINFO|Map info (EMAPINFO lump)]]&lt;br /&gt;
:*[[UMAPINFO]]&lt;br /&gt;
*[[ACS scripting]]&lt;br /&gt;
:*[[ACS built-in functions]]&lt;br /&gt;
*[[UDMF]]&lt;br /&gt;
*[[ExtraData]]&lt;br /&gt;
*[[Linedef types|Classic linedef specials]]&lt;br /&gt;
*[[Detailed parameterized linedef specification|Parameterized linedef specials]]&lt;br /&gt;
*[[Linedef flags|New linedef flags in Eternity]]&lt;br /&gt;
*[[Thing types|New Eternity thing types]]&lt;br /&gt;
&lt;br /&gt;
==Wad storage==&lt;br /&gt;
*[[ZIP|PKE files or directory structure]]&lt;br /&gt;
&lt;br /&gt;
==Tutorials==&lt;br /&gt;
*[[Polyobject]]&lt;br /&gt;
*[[3DMidTex tutorial]]&lt;br /&gt;
*[[3DMidTex advanced topics]]&lt;br /&gt;
*[[Portals]]&lt;br /&gt;
*[[Linked portals]]&lt;br /&gt;
&lt;br /&gt;
==Gameplay editing==&lt;br /&gt;
===Eternity definition files===&lt;br /&gt;
*[[EDF|Full EDF reference]]&lt;br /&gt;
*[[Thingtype]]&lt;br /&gt;
*[[Thing type flags]]&lt;br /&gt;
*[[Frame]]&lt;br /&gt;
*[[List of codepointers]]&lt;br /&gt;
*[[Sound]]&lt;br /&gt;
*[[OPTIONS]]&lt;br /&gt;
===Cross-port definition lumps===&lt;br /&gt;
*[[ANIMDEFS]]&lt;br /&gt;
*[[Dehacked]]&lt;br /&gt;
*[[DEMOLOOP]]&lt;br /&gt;
*[[S_SKIN]]&lt;br /&gt;
===Base game data===&lt;br /&gt;
*Frames.edf: [https://github.com/team-eternity/eternity/blob/master/base/doom/frames.edf list of Doom thing frames (states)]&lt;br /&gt;
*Things.edf: [https://github.com/team-eternity/eternity/blob/master/base/doom/things.edf list of Doom thing types (classes)]&lt;br /&gt;
&lt;br /&gt;
==Console and command line==&lt;br /&gt;
*[[List of command line parameters]]&lt;br /&gt;
:*[[Environment variables]]&lt;br /&gt;
*[[Console]]&lt;br /&gt;
:*[[List of console commands and variables|Console commands and variables]]&lt;br /&gt;
&lt;br /&gt;
==Inherited stuff==&lt;br /&gt;
*[[SMMU]]&lt;br /&gt;
*[[MBF]]&lt;br /&gt;
*[[Boom]]&lt;br /&gt;
&lt;br /&gt;
==Eternity maps and mods==&lt;br /&gt;
*[[List of maps and mods made for Eternity]]&lt;br /&gt;
&lt;br /&gt;
==Latest version==&lt;br /&gt;
The latest version of the Eternity Engine is currently {{Latest}}.&lt;br /&gt;
*[[Eternity_Engine#Releases|List of Eternity releases]]&lt;br /&gt;
*[https://devbuilds.drdteam.org/eternity/ Daily unofficial development builds.]&lt;br /&gt;
&lt;br /&gt;
[[Category:Eternity Wiki]]&lt;/div&gt;</summary>
		<author><name>Printz</name></author>
	</entry>
	<entry>
		<id>https://eternity.youfailit.net/index.php?title=EMAPINFO&amp;diff=6525</id>
		<title>EMAPINFO</title>
		<link rel="alternate" type="text/html" href="https://eternity.youfailit.net/index.php?title=EMAPINFO&amp;diff=6525"/>
		<updated>2026-06-14T09:52:41Z</updated>

		<summary type="html">&lt;p&gt;Printz: /* Level identification */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The &#039;&#039;&#039;EMAPINFO&#039;&#039;&#039; lump customizes the properties of maps. It is the main Eternity lump for this purpose.&lt;br /&gt;
{{Backto|Eternity Engine}}&lt;br /&gt;
{{editref}}&lt;br /&gt;
&lt;br /&gt;
==Usage==&lt;br /&gt;
Level info data is stored in the global EMAPINFO lump, which is a plain-text lump containing information for all maps together. Variables for each level must be placed under a section header that has the same name as the map&#039;s header lump.&lt;br /&gt;
&lt;br /&gt;
Do note that older Eternity and [[SMMU]] compatible releases had level info stored inside each map&#039;s header lump. This is deprecated however, kept only for backward compatibility.&lt;br /&gt;
&lt;br /&gt;
==Syntax==&lt;br /&gt;
*Each map definition begins with a block header. This consists of the map&#039;s lump name in brackets, such as [MAP01], [E1M1], or [MYLEVEL].&lt;br /&gt;
*Variables are specified in the lines following the block header.&lt;br /&gt;
*All values are treated as text strings, and quotation marks are not required.&lt;br /&gt;
*Comments may start with &#039;#&#039;, &#039;;&#039;, or &#039;//&#039;. All three comments are single line only, and extend to the end of the line.&lt;br /&gt;
*An optional equal sign can be placed between a variable and the value it is given. It is not an error to omit it.&lt;br /&gt;
&lt;br /&gt;
==EMAPINFO Variables==&lt;br /&gt;
===Level identification===&lt;br /&gt;
{|class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
! Variable&lt;br /&gt;
! Description&lt;br /&gt;
! Example&lt;br /&gt;
|-&lt;br /&gt;
||creator||The level author&#039;s name. As of Eternity 4.06.00, the creator name will show up in the intermission under the level name. This is adapted from the [[UMAPINFO]] specifications for &amp;quot;author&amp;quot;. You can view the current creator in the console using the &amp;quot;creator&amp;quot; console command. If this value is not provided, the default value is &amp;quot;unknown&amp;quot;, which will not show up in the intermission.||&lt;br /&gt;
 creator = Edwin Chadwick &#039;chadders&#039;&lt;br /&gt;
|-&lt;br /&gt;
||edf-intername||Boolean value which, if true, enables the use of [[EDF]]-defined intermission map name strings which will be drawn using the FONTB graphics (provided in eternity.wad for DOOM/DOOM II, and natively supported by Heretic). This feature is meant to obsolete the levelpic variable and to remove the need for authors to create title graphics for their maps in DOOM/DOOM II. It also allows intermission map name replacement to work correctly for the next level and for Heretic without any hacks.&lt;br /&gt;
The EDF string which will be used as the intermission name for the current map should have the mnemonic _IN_NAME_&amp;lt;mapname&amp;gt;, where &amp;lt;mapname&amp;gt; is the exact name of the map&#039;s header lump (Example: _IN_NAME_MAP01).&lt;br /&gt;
In order for the name of the next map to display correctly, the current level must either define its nextlevel/nextsecret values explicitly, or it must be an ExMy or MAPxy level.&lt;br /&gt;
||&lt;br /&gt;
 edf-intername = true&lt;br /&gt;
|-&lt;br /&gt;
||enterpic||Name of a 320x200 graphic lump to be displayed as the background of the statistics intermission during the &#039;&#039;entering&#039;&#039; of this map&#039;s stage. If omitted and previous map&#039;s &#039;&#039;&#039;interpic&#039;&#039;&#039; property is set, it will continue displaying that.||&lt;br /&gt;
 enterpic = INTOCAVE&lt;br /&gt;
|-&lt;br /&gt;
||inter-levelname||Name of the map to display in the intermission score screen. This is separate from &#039;&#039;&#039;levelname&#039;&#039;&#039; which is for the automap display, and can be used as an alternative to &#039;&#039;&#039;levelpic&#039;&#039;&#039; which is a graphic lump for the intermission name. If both &#039;&#039;&#039;inter-levelname&#039;&#039;&#039; and &#039;&#039;&#039;levelpic&#039;&#039;&#039; are present, &#039;&#039;&#039;levelpic&#039;&#039;&#039; takes precedence. Unlike &#039;&#039;&#039;levelpic&#039;&#039;&#039;, this one also works in Heretic.||&lt;br /&gt;
 inter-levelname = Circle of death&lt;br /&gt;
|-&lt;br /&gt;
||interpic||Name of a 320x200 graphic lump to be displayed as the background of the statistics intermission.||&lt;br /&gt;
 interpic = BOSSBACK&lt;br /&gt;
|-&lt;br /&gt;
||killstats||Boolean value that allows the statistics intermission between two maps to be disabled. If the map has a finale sequence to be displayed, it will start immediately, otherwise the next map will be loaded.||&lt;br /&gt;
 killstats = true&lt;br /&gt;
|-&lt;br /&gt;
||levelname||This is the name of the level which will be displayed in the automap. This value overrides any string provided via DeHackEd. If you want to change the level name displayed in the intermission, change &#039;&#039;&#039;levelpic&#039;&#039;&#039; or &#039;&#039;&#039;inter-levelname&#039;&#039;&#039;.||&lt;br /&gt;
 levelname = chadders&#039; lair&lt;br /&gt;
|-&lt;br /&gt;
||levelnum||Integer value used to identify it for the [[Parameterized_linedef_specials#Exits|Teleport_NewMap]] special. When the map&#039;s lump name does not follow the format MAPxx or ExMy, a numeric value is required.||&lt;br /&gt;
 [D2DM1]&lt;br /&gt;
 levelnum = 1&lt;br /&gt;
|-&lt;br /&gt;
||levelpic||This is the name of a graphic lump which will be shown as the level name during the statistics intermission when this map is the previous map which was just beaten. This value is only used for DOOM and DOOM II maps. You can also use &#039;&#039;&#039;inter-levelname&#039;&#039;&#039; to set the intermission display level name, which will use the necessary font, already included in Eternity.||&lt;br /&gt;
 levelpic = E1M1PIC&lt;br /&gt;
|-&lt;br /&gt;
||levelpicnext||The level pic to show for the next level, only when taking the normal exit. If omitted, it will try that level&#039;s &#039;&#039;&#039;levelpic&#039;&#039;&#039; or write the name of it using the font.||&lt;br /&gt;
|-&lt;br /&gt;
||levelpicsecret||Same as &#039;&#039;&#039;levelpicnext&#039;&#039;&#039;, but for taking the secret exit instead.||&lt;br /&gt;
|-&lt;br /&gt;
||nextlevel||The exact header name of the next level to go to when a normal exit occurs on this map. This can specify *any* lump name, but the lump should be a valid level header or an error will occur.||&lt;br /&gt;
 nextlevel = CHAD2&lt;br /&gt;
|-&lt;br /&gt;
||nextsecret||The exact header name of the next level to go to when a secret exit occurs on this map. This can specify *any* lump name, but the lump should be a valid level header or an error will occur. Note that except for maps which normally have secret exits, the default behavior is to repeat the same level. This MapInfo value allows you to avoid that and use a secret exit on any map.||&lt;br /&gt;
 nextsecret = MAP34&lt;br /&gt;
|-&lt;br /&gt;
||allowexittags||If true, allows the exit linedef &#039;&#039;classic&#039;&#039; linedef specials to use their tags to specify the number of the level to go to. This doesn&#039;t apply to the parameterized specials||&lt;br /&gt;
 allowexittags = true&lt;br /&gt;
|-&lt;br /&gt;
||allowsecrettags||Same as &#039;&#039;&#039;allowexittags&#039;&#039;&#039;, but applies to the secret exit &#039;&#039;classic&#039;&#039; linedef specials.||&lt;br /&gt;
 allowsecrettags = true&lt;br /&gt;
|-&lt;br /&gt;
||partime||Partime for the map in seconds. This value overrides any value provided via DeHackEd. Note that partimes are only supported in episodes 1-3 of DOOM and any map of DOOM II. Ultimate DOOM episode 4, Heretic, and non-standard maps currently never display par times.||&lt;br /&gt;
 partime = 200&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Scripting===&lt;br /&gt;
{|class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
! Variable&lt;br /&gt;
! Description&lt;br /&gt;
! Example&lt;br /&gt;
|-&lt;br /&gt;
||acsopendelay||Boolean value that determines whether or not scripts&#039; execution within the first 35 tics after entering the map is delayed until 35 tics have passed.||&lt;br /&gt;
 acsopendelay = true&lt;br /&gt;
|-&lt;br /&gt;
||acsscript||Name of the lump containing the compiled ACS script for this map. &#039;&#039;&#039;Not needed for UDMF, which uses the BEHAVIOR lump between TEXTMAP and ENDMAP, as added by the level editor.&#039;&#039;&#039;||&lt;br /&gt;
 acsscript = SCRIPT01&lt;br /&gt;
|-&lt;br /&gt;
||extradata||Name of the ExtraData script lump for this map. See the ExtraData Reference for full information on ExtraData. There are no naming restrictions on ExtraData script lumps. &#039;&#039;&#039;Not needed for UDMF, only for the classic format.&#039;&#039;&#039;||&lt;br /&gt;
 extradata = EXTRDT01&lt;br /&gt;
|-&lt;br /&gt;
||levelscript||Name of a compiled {{Deprecated}} Small script lump which will serve as the Levelscript for this map. NOTE: use &#039;&#039;&#039;acsscript&#039;&#039;&#039; for compiled ACS scripts.||&lt;br /&gt;
|}&lt;br /&gt;
===Physics===&lt;br /&gt;
{|class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
! Variable&lt;br /&gt;
! Description&lt;br /&gt;
! Example&lt;br /&gt;
|-&lt;br /&gt;
||aircontrol||How much control the player has when attempting to move while in mid-air. By default Doom and Heretic have it 0 (no control whatsoever) and Hexen and Strife have a tiny value, just enough to allow jumping on objects.&lt;br /&gt;
&lt;br /&gt;
Default value is 0. Keep in mind you can set the &#039;&#039;&#039;comp_aircontrol&#039;&#039;&#039; property in the [[OPTIONS]] lump to &amp;quot;yes&amp;quot; or &amp;quot;no&amp;quot;, which if enabled, will produce the Hexen effect. Maximum air control is 65536, so anything between 0 and 65536 is equivalent to air control between 0 and 100%.&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
||airfriction||This is an optional field, useful if &#039;&#039;&#039;aircontrol&#039;&#039;&#039; is significant, in order to limit player&#039;s speed when moving in mid-air. &#039;&#039;Non-player objects, such as projectiles, are not affected by this&#039;&#039;. Default value is 0 (no friction, like in the original games), and the maximum is 65536 (no acceleration whatsoever). In order to feel realistic, if it&#039;s needed, make sure to keep &#039;&#039;&#039;airfriction&#039;&#039;&#039; very low, or lower than the ground friction anyway, as it &#039;&#039;only&#039;&#039; applies while you&#039;re above ground.||&lt;br /&gt;
|-&lt;br /&gt;
||disable-jump||If set to &#039;&#039;&#039;true&#039;&#039;&#039;, it will disable player jumping in current level. Default is &#039;&#039;&#039;false&#039;&#039;&#039;. See also [[playerclass]] in EDF, and comp_aircontrol in [[OPTIONS]].||&lt;br /&gt;
 disable-jump = true&lt;br /&gt;
|-&lt;br /&gt;
||gravity||Global gravity factor for the current level. The default gravity value is 65536.||&lt;br /&gt;
 # Enable 50% gravity&lt;br /&gt;
 gravity = 32768&lt;br /&gt;
|}&lt;br /&gt;
===Ambience===&lt;br /&gt;
{|class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
! Variable&lt;br /&gt;
! Description&lt;br /&gt;
! Example&lt;br /&gt;
|-&lt;br /&gt;
||altskyname||Name of a texture to display instead of the normal sky texture during a lightning strike. This value is only used if lightning is enabled for this level. If this value is not provided, no sky animation will occur during lightning strikes.||&lt;br /&gt;
 altskyname = LBOLTSKY&lt;br /&gt;
|-&lt;br /&gt;
||colormap||Name of a colormap lump to use as the global colormap for this level. This colormap is applied to any sectors which do not have their own colormaps specified either via use of 242 height transfer linedefs or scripting. This lump must be between C_START and C_END tags or the &amp;quot;colormaps&amp;quot; directory in the PKE.||&lt;br /&gt;
 colormap = FOGMAP&lt;br /&gt;
|-&lt;br /&gt;
||outdoorfog||Name of a colormap lump to use as the outdoors colormap for this level. This lump must be between C_START and C_END tags or the &amp;quot;colormaps&amp;quot; directory in the PKE.||&lt;br /&gt;
 outdoorfog = FOGMAP&lt;br /&gt;
|-&lt;br /&gt;
||defaultenvironment||Sets the default sound environment (reverb) effect to happen in the map. Use two identifiers, as defined in [[EDF]].||&lt;br /&gt;
 defaultenvironment = 1 2&lt;br /&gt;
|-&lt;br /&gt;
||doublesky||Boolean value that determines whether or not this map uses double skies. When double skies are enabled, any F_SKY1 or F_SKY2 sectors *not* affected by MBF sky transfer lines will use both the primary and secondary sky textures together. The secondary texture will be drawn first, normally, then the primary texture will be drawn over it, omitting any pixels which use palette index zero (this is usually pure black). Any MapInfo sky delta values provided will be applied to their respective textures.||&lt;br /&gt;
 doublesky = true&lt;br /&gt;
|-&lt;br /&gt;
||fullbright||Boolean value that determines whether fullbright can be used on this level. When fullbright is disabled, player gun flashes will not occur, and fullbright sprites and particles will be drawn normally. This should be used with most custom colormaps, since flashes and fullbright sprites usually look incorrect with them.||&lt;br /&gt;
 fullbright = false&lt;br /&gt;
|-&lt;br /&gt;
||lightning||Boolean value that toggles the global lightning effect. When set to true, all sky sectors on the map will flash at randomly determined intervals along with a thunder sound and optional animation of the normal sky texture. Warning: sectors must currently have a sky ceiling at the beginning of the level in order to be affected by lightning. The only current method to make non-sky sectors flash during lightning strikes is via use of BOOM lighting transfer linedefs. This may be improved in the near future.||&lt;br /&gt;
 lightning = true&lt;br /&gt;
|-&lt;br /&gt;
||music||Provides the name of a MUS or MIDI lump to use as music. In DOOM gamemodes, the string provided should be the lump name minus the &amp;quot;D_&amp;quot; prefix. In Heretic, the string provided should be the lump name minus the &amp;quot;MUS_&amp;quot; prefix. You are *not* limited to using only the built-in music lump names; Eternity automatically adds any new lump which matches the naming convention for the current gamemode to the internal music list.||&lt;br /&gt;
 music = cheese&lt;br /&gt;
|-&lt;br /&gt;
||noautosequences||Determines the default assignment of sound sequences. If set to true, no sound sequences will be automatically assigned to sectors. The sequence of all sectors by default will be sequence number 0. If set to false, the default sound sequences defined in &#039;&#039;&#039;sounds.edf&#039;&#039;&#039; will be used. These sequences implement the normal, default behaviors for DOOM and Heretic, and can be easily overridden by the user if desired.||&lt;br /&gt;
 noautosequences = true&lt;br /&gt;
|-&lt;br /&gt;
||sector-colormaps||This optional property can be used to enforce classic Boom or SMMU-style behaviour for sector colormap applications using either the [[Transfer_Heights]] linedef special or [[ExtraData]] or [[UDMF]] sector properties. Possible values are:&lt;br /&gt;
*&#039;&#039;normal&#039;&#039;: this is the default value. It makes the [[Transfer_Heights]] special apply the Boom behaviour, where the sector the player is in causes the entire view to change colour, while [[ExtraData]] and [[UDMF]] use the SMMU-introduced behaviour, where the sector colour is local to the sector, as if having local coloured light or fog effect. It&#039;s default because of required compatibility with past Boom and MBF wad releases, whereas the new SMMU introduced behaviour can be more useful for new maps with ExtraData or UDMF.&lt;br /&gt;
*&#039;&#039;Boom&#039;&#039;: the Boom sector colormap behaviour will apply to all kinds of colormap settings, like in Boom or MBF.&lt;br /&gt;
*&#039;&#039;SMMU&#039;&#039;: the SMMU sector colormap behaviour will apply to all kinds of colormap settings, like in previous Eternity versions.&lt;br /&gt;
||&lt;br /&gt;
 sector-colormaps = normal&lt;br /&gt;
|-&lt;br /&gt;
||skydelta||Pixels per gametic that the primary sky texture should scroll. This effect will only be applied to double skies and to F_SKY1 sectors which are NOT affected by any MBF sky transfer linedefs.||&lt;br /&gt;
 skydelta = 5&lt;br /&gt;
|-&lt;br /&gt;
||sky2delta||Pixels per gametic that the secondary sky texture should scroll. This effect will only be applied to double skies and to F_SKY2 sectors (which cannot be affected by MBF sky transfer linedefs).||&lt;br /&gt;
 sky2delta = 7&lt;br /&gt;
|-&lt;br /&gt;
||skyname||Name of a texture to use as the primary sky for this map. This sky will appear in all sectors which use the F_SKY1 flat, and it will also appear as the top layer of Hexen-style double skies. The name provided for this lump must be a valid texture or an error will occur.||&lt;br /&gt;
 skyname = SKY2&lt;br /&gt;
|-&lt;br /&gt;
||sky2name||Name of a texture to use as the secondary sky for this map. This sky will appear in all sectors which use the F_SKY2 flat, and it will also appear as the bottom layer of Hexen- style double skies. The name provided for this lump must be a valid texture or an error will occur. If no name is provided for the secondary sky, the primary sky name will be copied to it, so it is not an error to use F_SKY2 or double skies in a level where the sky2 texture is not explicitly defined.||&lt;br /&gt;
 sky2name = SKY4&lt;br /&gt;
|-&lt;br /&gt;
||skyrowoffset||Set the vertical offset of the sky. This is useful to give you control from which height to draw the sky. Above this offset, the sky will appear as fading to a single colour. Usual values are:&lt;br /&gt;
*100: draw like in vanilla Doom, where it assumed that the player can&#039;t look up and down.&lt;br /&gt;
*200: draw like in Heretic, where the view pitch is ±32 degrees.&lt;br /&gt;
*260: draw for the view pitch of ±45 degrees, as set by default in Eternity Doom.&lt;br /&gt;
You can customize the player view pitch in [[EDF game properties]].&lt;br /&gt;
&lt;br /&gt;
If unspecified, Eternity will autodetect based on sky height. If at least 200 units, tall, it will set to 200. If less, it will set to 100. Note that even 200 is insufficient for the default ±45 degree view pitch; you may want to set 260 for that. NOTE: for PrBoom wad compatibility, and only for DOOM wads, the same autodetection rule doesn&#039;t apply if the tall sky is purely specified via a texture replacement: those will always be drawn as vanilla, as long as no &#039;&#039;&#039;skyname&#039;&#039;&#039; replacement is set in EMAPINFO.&lt;br /&gt;
&lt;br /&gt;
Also, beware that [[Static_Init (sky transfer)]] specials use their own sidedef Y offset to adjust the sky location, bypassing this setting.&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
||sky2rowoffset||Same as &#039;&#039;&#039;skyrowoffset&#039;&#039;&#039;, but for &#039;&#039;&#039;sky2name&#039;&#039;&#039;. If you use &#039;&#039;&#039;doublesky&#039;&#039;&#039; as in Hexen, you may want to set both these row offset fields.||&lt;br /&gt;
|-&lt;br /&gt;
||unevenlight||Boolean value that determines whether walls parallel to the x and y axes of the game world are given lighting values 1 level higher or lower than other walls. This can dramatically affect the perceived light level of an area, so only use it for maps that are designed specifically for it. Maps which use custom global colormaps should usually set this value to false, since it only generally looks appropriate with the normal colormap.||&lt;br /&gt;
 unevenlight = false&lt;br /&gt;
|-&lt;br /&gt;
||sound-*||There are several sound-* commands which can be used to replace the default sounds in a map with sounds, using their mnemonics defined in [[EDF]].&lt;br /&gt;
&lt;br /&gt;
Sounds available for replacement:&lt;br /&gt;
 swtchx&lt;br /&gt;
 swtchn&lt;br /&gt;
 stnmov&lt;br /&gt;
 pstop&lt;br /&gt;
 pstart&lt;br /&gt;
 bdcls&lt;br /&gt;
 bdopn&lt;br /&gt;
 dorcls&lt;br /&gt;
 doropn&lt;br /&gt;
 fcmove&lt;br /&gt;
||&lt;br /&gt;
 sound-swtchx = newswtch&lt;br /&gt;
 sound-doropn = dorcreak&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Finale control===&lt;br /&gt;
{|class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
! Variable&lt;br /&gt;
! Description&lt;br /&gt;
! Example&lt;br /&gt;
|-&lt;br /&gt;
||&#039;&#039;&#039;boss-specials&#039;&#039;&#039;||A flags field that specifies what formerly level-specific boss &amp;quot;magic codepointer&amp;quot; actions are enabled for this level. This field takes a value in the same format as that used by [[EDF]], DeHackEd/BEX, and ExtraData flag fields, but the format will be reviewed here for completeness.&lt;br /&gt;
&lt;br /&gt;
A BEX flag list is a string of flag names separated by whitespace, pipe characters, commas, or plus characters. Flags are combined using bitwise-OR logic, so a flag name can be specified more than once. Specifying a flag name causes that flag to be turned on. The default state of all flags is off.&lt;br /&gt;
&lt;br /&gt;
These are the flag values which are available for this field:&lt;br /&gt;
          Flag name  Decimal  Hex     Meaning&lt;br /&gt;
          -----------------------------------------------------------------&lt;br /&gt;
          MAP07_1    1        0x0001  MAP07 Special 1 (BossDeath only)&lt;br /&gt;
          MAP07_2    2        0x0002  MAP07 Special 2 (BossDeath only)&lt;br /&gt;
          E1M8       4        0x0004  E1M8 Special&lt;br /&gt;
          E2M8       8        0x0008  E2M8 Special&lt;br /&gt;
          E3M8       16       0x0010  E3M8 Special&lt;br /&gt;
          E4M6       32       0x0020  E4M6 Special (BossDeath only)&lt;br /&gt;
          E4M8       64       0x0040  E4M8 Special&lt;br /&gt;
          E5M8       128      0x0080  E5M8 Special (HticBossDeath Only)&lt;br /&gt;
          -----------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Notes: Actions differ depending on whether monsters use the [[BossDeath]] or [[HticBossDeath]] codepointers. See the documentation for those specific codepointers to see what actions they perform. The monsters which must be dead for a given special to activate are controlled by various [[EDF]]/BEX thingtype flags. Together, these features allow complete customization.&lt;br /&gt;
||&lt;br /&gt;
All of these are equivalent:&lt;br /&gt;
 boss-specials = MAP07_1|MAP07_2&lt;br /&gt;
 boss-specials = MAP07_1 | MAP07_2&lt;br /&gt;
          &lt;br /&gt;
 boss-specials = MAP07_1+MAP07_2&lt;br /&gt;
 boss-specials = MAP07_2 + MAP07_2&lt;br /&gt;
          &lt;br /&gt;
 boss-specials = MAP07_1,MAP07_2&lt;br /&gt;
 boss-specials = MAP07_1, MAP07_2&lt;br /&gt;
          &lt;br /&gt;
 boss-specials = MAP07_1 MAP07_2&lt;br /&gt;
|-&lt;br /&gt;
||&#039;&#039;&#039;endofgame&#039;&#039;&#039;||Boolean value which, if true, causes a DOOM II cast call to occur when this map is exited. This value is currently only usable in DOOM II. A level must also have intermission text defined for a cast call to take place.||&lt;br /&gt;
 endofgame = true&lt;br /&gt;
|-&lt;br /&gt;
||&#039;&#039;&#039;endpic&#039;&#039;&#039;||String value. If &#039;&#039;&#039;finaletype&#039;&#039;&#039; has been set to &#039;&#039;&#039;endpic&#039;&#039;&#039;, this value specifies the picture lump to display for the finale.||&lt;br /&gt;
 finaletype = endpic&lt;br /&gt;
 endpic = FINALPIC    // show a custom patch lump named FINALPIC&lt;br /&gt;
|-&lt;br /&gt;
||&#039;&#039;&#039;finale-early&#039;&#039;&#039;||Boolean value which, if true, indicates that a text intermission should occur after this map without displaying the usual score screen. If no intermission text is defined for this map, this variable has no effect.||&lt;br /&gt;
 finale-early = true&lt;br /&gt;
|-&lt;br /&gt;
||&#039;&#039;&#039;finale-normal&#039;&#039;&#039;||Boolean value which, if true, indicates that a text intermission should only occur after this map if a normal exit was taken. If no intermission text is defined for this map, this variable has no effect.||&lt;br /&gt;
 finale-normal = true&lt;br /&gt;
|-&lt;br /&gt;
||&#039;&#039;&#039;finale-secret&#039;&#039;&#039;||Boolean value which, if true, indicates that a text intermission should only occur after this map if a secret exit was taken. If no intermission text is defined for this map, this variable has no effect.||&lt;br /&gt;
 finale-secret = true&lt;br /&gt;
|-&lt;br /&gt;
||&#039;&#039;&#039;finaletype&#039;&#039;&#039;||Specifies which finale image sequence to use. Possible values are:&lt;br /&gt;
*&#039;&#039;&#039;text&#039;&#039;&#039;: Only the intertext will be displayed. Play will then continue to the next level normally.&lt;br /&gt;
*&#039;&#039;&#039;doom_credits&#039;&#039;&#039;: The DOOM CREDITS screen will be displayed after the intertext. Play ends after this map.&lt;br /&gt;
*&#039;&#039;&#039;doom_deimos&#039;&#039;&#039;: The DOOM picture of Deimos above Hell will be displayed after the intertext. Play ends after this map.&lt;br /&gt;
*&#039;&#039;&#039;doom_bunny&#039;&#039;&#039;: The scrolling picture of Daisy&#039;s head on a pike will be displayed, accompanied by the words &amp;quot;THE END&amp;quot; which are shot up with several bullets. Play ends after this map.&lt;br /&gt;
*&#039;&#039;&#039;doom_marine&#039;&#039;&#039;: The E4 ending picture of the Marine holding Daisy&#039;s head is displayed after the intertext. Play ends after this map.&lt;br /&gt;
*&#039;&#039;&#039;htic_credits&#039;&#039;&#039;: The Heretic CREDITS screen will be displayed after the intertext. Play ends after this map.&lt;br /&gt;
*&#039;&#039;&#039;htic_water&#039;&#039;&#039;: The Heretic underwater screen with special palette is displayed after the intertext. Play ends after this map.&lt;br /&gt;
*&#039;&#039;&#039;htic_demon&#039;&#039;&#039;: The Heretic demon scroller is displayed after the intertext. Play ends after this map.&lt;br /&gt;
*&#039;&#039;&#039;psx_udoom&#039;&#039;&#039;: PSX Ultimate DOOM finale&lt;br /&gt;
*&#039;&#039;&#039;psx_doom2&#039;&#039;&#039;: PSX DOOM II finale&lt;br /&gt;
*&#039;&#039;&#039;endpic&#039;&#039;&#039;: End the game with a custom static picture set by the &#039;&#039;&#039;endpic&#039;&#039;&#039; property (see its relevant row in this table). This is a generalization of the DOOM I and Heretic intermediary episode endings.&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
||&#039;&#039;&#039;finalesecrettype&#039;&#039;&#039;||Like above, but for the secret exit.||&lt;br /&gt;
|-&lt;br /&gt;
||&#039;&#039;&#039;inter-backdrop&#039;&#039;&#039;||Name of a 64x64 flat OR a 320x200 graphic lump to be displayed as the background of a text intermission which occurs after this map. The flat namespace will be searched first, so if both a flat and a 320x200 picture of the same name exist, the flat will be chosen.||&lt;br /&gt;
 inter-backdrop = FLATHUH1&lt;br /&gt;
|-&lt;br /&gt;
||&#039;&#039;&#039;intermusic&#039;&#039;&#039;||Name of a MUS or MIDI lump to use as music during a text intermission which occurs after this map. If no intertext is defined for the map, this value will not be used. In DOOM gamemodes, the string provided should be the lump name minus the &amp;quot;D_&amp;quot; prefix. In Heretic, the string provided should be the lump name minus the &amp;quot;MUS_&amp;quot; prefix. You are *not* limited to using only the built-in music lump names; Eternity automatically adds any new lump which matches the naming convention for the current gamemode to the internal music list.||&lt;br /&gt;
 intermusic = ROMERO&lt;br /&gt;
|-&lt;br /&gt;
||&#039;&#039;&#039;intertext&#039;&#039;&#039;||Lump name of a text lump to be loaded as intermission text for this level. If the level has an intermission by default, this will replace the default intermission text, even if it has been edited via DeHackEd. If there is not normally a text intermission after this map, the presence of this variable serves to enable it. If no intertext is defined, a text intermission will not occur after a map. The formatting of the text inside the indicated lump will be preserved exactly, with the exception of tabs, which are converted to spaces. There is no length limitation, but only one screen of text (40 columns, 17 rows) can be displayed. Any extra text will be drawn off the bottom of the screen.||&lt;br /&gt;
 intertext = MAP04TXT&lt;br /&gt;
|-&lt;br /&gt;
||&#039;&#039;&#039;intertext-secret&#039;&#039;&#039;||Like &#039;&#039;&#039;intertext&#039;&#039;&#039;, but for the secret exit.||&lt;br /&gt;
|-&lt;br /&gt;
||&#039;&#039;&#039;killfinale&#039;&#039;&#039;||Boolean value that allows built-in text intermission points to be disabled. For example, if you do not want text to appear after DOOM II MAP11, set this variable to true.||&lt;br /&gt;
 killfinale = true&lt;br /&gt;
|-&lt;br /&gt;
||&#039;&#039;&#039;levelaction&#039;&#039;&#039;||Specifies what happens when certain species of monsters all die in the map. The syntax is such: &#039;&#039;thingtype&#039;&#039; &#039;&#039;special&#039;&#039; [&#039;&#039;arg1&#039;&#039; [&#039;&#039;arg2&#039;&#039; [&#039;&#039;arg3&#039;&#039; [&#039;&#039;arg4&#039;&#039; [&#039;&#039;arg5&#039;&#039;]]]]]. You can even have more than one per level.&lt;br /&gt;
&lt;br /&gt;
NOTE: this does not depend on the presence of the [[BossDeath]] or [[HticBossDeath]] codepointer in a monster&#039;s death sequence. Instead, it triggers immediately when the last monster is killed. In fact, if used in a map without such monsters, it will activate from the start. Also, it can only be used for actual monsters (&#039;&#039;&#039;COUNTKILL&#039;&#039;&#039; or &#039;&#039;&#039;KILLABLE&#039;&#039;&#039; in &#039;&#039;&#039;cflags&#039;&#039;&#039;), not for picking up items. Use &#039;&#039;&#039;levelaction-bossdeath&#039;&#039;&#039; if you want triggering when said codepointers are run.&lt;br /&gt;
||&lt;br /&gt;
 levelaction = BaronOfHell Floor_LowerToLowest 671 8&lt;br /&gt;
 levelaction = Arachnotron Floor_RaiseByValue  667 8 24&lt;br /&gt;
|-&lt;br /&gt;
||&#039;&#039;&#039;levelaction-bossdeath&#039;&#039;&#039;||Like &#039;&#039;&#039;levelaction&#039;&#039;&#039;, but activated only during [[BossDeath]] or [[HticBossDeath]] from a dead monster of the intended species. Same syntax as &#039;&#039;&#039;levelaction&#039;&#039;&#039;. Warning: this one is susceptible to unexpected effects if the monsters can respawn or resurrect, then die again, retriggering the action. Use with care.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Examples of EMAPINFO Definitions==&lt;br /&gt;
A basic EMAPINFO lump may be similar to this:&lt;br /&gt;
&lt;br /&gt;
    [MAP01]&lt;br /&gt;
    levelname = Evil Hell Lab&lt;br /&gt;
    creator = DooMGuy667&lt;br /&gt;
 &lt;br /&gt;
    [E1M1]&lt;br /&gt;
    levelname = Not Hangar&lt;br /&gt;
    creator = Not Romero&lt;br /&gt;
    skyname = SKY3&lt;br /&gt;
    skydelta = 1&lt;br /&gt;
&lt;br /&gt;
The first example would change the automap and intermission screen names for MAP01 to &amp;quot;Evil Hell Lab&amp;quot; and when the &amp;lt;tt&amp;gt;creator&amp;lt;/tt&amp;gt; command is used in the console, output &amp;quot;DooMGuy667&amp;quot;. The name in the brackets is the map the EMAPINFO applies to, so by changing &amp;lt;tt&amp;gt;[MAP01]&amp;lt;/tt&amp;gt; to &amp;lt;tt&amp;gt;[MAP02]&amp;lt;/tt&amp;gt;, the changes would apply to MAP02 instead.&lt;br /&gt;
&lt;br /&gt;
The second example also sets a name and creator for the map (for the E1M1 mapslot, in this case), and also specifies that it will use SKY3 and scroll the sky slowly, using the skydelta variable.&lt;br /&gt;
==See also==&lt;br /&gt;
*[[UMAPINFO]]&lt;br /&gt;
[[Category:Editing]]&lt;/div&gt;</summary>
		<author><name>Printz</name></author>
	</entry>
	<entry>
		<id>https://eternity.youfailit.net/index.php?title=UMAPINFO&amp;diff=6524</id>
		<title>UMAPINFO</title>
		<link rel="alternate" type="text/html" href="https://eternity.youfailit.net/index.php?title=UMAPINFO&amp;diff=6524"/>
		<updated>2026-06-14T09:51:18Z</updated>

		<summary type="html">&lt;p&gt;Printz: /* UMAPINFO - EMAPINFO equivalence table */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Eternity supports the common UMAPINFO lump, a standard defined in PrBoom+um. See its [https://github.com/kraflab/umapinfo/blob/master/docs/spec.md specification]. Make sure to adhere to the strict standard if you want the maps to be playable on all implementing ports. Otherwise, if you make the mod for Eternity, [[EMAPINFO]] is more recommended, since it contains the entire feature set.&lt;br /&gt;
&lt;br /&gt;
==UMAPINFO - EMAPINFO equivalence table==&lt;br /&gt;
{|class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
!UMAPINFO property&lt;br /&gt;
!EMAPINFO equivalent&lt;br /&gt;
|-&lt;br /&gt;
||&#039;&#039;&#039;author&#039;&#039;&#039;||&#039;&#039;&#039;creator&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
||&#039;&#039;&#039;levelname&#039;&#039;&#039;, &#039;&#039;&#039;label&#039;&#039;&#039;||Both of these influence &#039;&#039;&#039;levelname&#039;&#039;&#039; and &#039;&#039;&#039;inter-levelname&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
||&#039;&#039;&#039;levelpic&#039;&#039;&#039;||&#039;&#039;&#039;levelpic&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
||&#039;&#039;&#039;next&#039;&#039;&#039;||&#039;&#039;&#039;nextlevel&#039;&#039;&#039;. Beware that omitting &#039;&#039;&#039;next&#039;&#039;&#039; in UMAPINFO will reset &#039;&#039;&#039;nextlevel&#039;&#039;&#039; to the next numbered map (if following the ExMy/MAPxy format).&lt;br /&gt;
|-&lt;br /&gt;
||&#039;&#039;&#039;nextsecret&#039;&#039;&#039;||&#039;&#039;&#039;nextsecret&#039;&#039;&#039;. Same situations as with UMAPINFO &#039;&#039;&#039;next&#039;&#039;&#039;.&lt;br /&gt;
|-&lt;br /&gt;
||&#039;&#039;&#039;skytexture&#039;&#039;&#039;||&#039;&#039;&#039;skyname&#039;&#039;&#039;. For more advanced sky effects, you need EMAPINFO.&lt;br /&gt;
|-&lt;br /&gt;
||&#039;&#039;&#039;music&#039;&#039;&#039;||&#039;&#039;&#039;music&#039;&#039;&#039;. Beware that in UMAPINFO you must specify the entire lump length (including D_ or MUS_, based on game).&lt;br /&gt;
|-&lt;br /&gt;
||&#039;&#039;&#039;exitpic&#039;&#039;&#039;||&#039;&#039;&#039;interpic&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
||&#039;&#039;&#039;enterpic&#039;&#039;&#039;||&#039;&#039;&#039;enterpic&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
||&#039;&#039;&#039;partime&#039;&#039;&#039;||&#039;&#039;&#039;partime&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
||&#039;&#039;&#039;endgame = false&#039;&#039;&#039;||&lt;br /&gt;
:&#039;&#039;&#039;finaletype text&#039;&#039;&#039;&lt;br /&gt;
:&#039;&#039;&#039;endofgame false&#039;&#039;&#039;&lt;br /&gt;
:&#039;&#039;&#039;finale-early false&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
||&#039;&#039;&#039;endgame = true&#039;&#039;&#039;||Effect depends on the current episode (if map lump is named in a standard manner).&lt;br /&gt;
|-&lt;br /&gt;
||&#039;&#039;&#039;endpic&#039;&#039;&#039;||&lt;br /&gt;
:&#039;&#039;&#039;endofgame false&#039;&#039;&#039;&lt;br /&gt;
:&#039;&#039;&#039;finaletype endpic&#039;&#039;&#039;&lt;br /&gt;
:&#039;&#039;&#039;endpic&#039;&#039;&#039; &#039;&#039;lump&#039;&#039;&lt;br /&gt;
It also enables the finale for both the normal and secret exits.&lt;br /&gt;
|-&lt;br /&gt;
||&#039;&#039;&#039;endbunny = true&#039;&#039;&#039;||&lt;br /&gt;
:&#039;&#039;&#039;endofgame false&#039;&#039;&#039;&lt;br /&gt;
:&#039;&#039;&#039;finaletype doom_bunny&#039;&#039;&#039;&lt;br /&gt;
It also enables the finale for both the normal and secret exits.&lt;br /&gt;
|-&lt;br /&gt;
||&#039;&#039;&#039;endcast = true&#039;&#039;&#039;||&lt;br /&gt;
:&#039;&#039;&#039;endofgame true&#039;&#039;&#039;&lt;br /&gt;
:&#039;&#039;&#039;finaletype text&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
||&#039;&#039;&#039;nointermission&#039;&#039;&#039;||&#039;&#039;&#039;finale-early&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
||&#039;&#039;&#039;intertext&#039;&#039;&#039;, &#039;&#039;&#039;intertextsecret&#039;&#039;&#039;&#039;||Like &#039;&#039;&#039;intertext&#039;&#039;&#039; and &#039;&#039;&#039;intertext-secret&#039;&#039;&#039; but gets the text directly from UMAPINFO. It also sets or clears &#039;&#039;&#039;finale-normal&#039;&#039;&#039; and &#039;&#039;&#039;finale-secret&#039;&#039;&#039;.&lt;br /&gt;
|-&lt;br /&gt;
||&#039;&#039;&#039;interbackdrop&#039;&#039;&#039;||&#039;&#039;&#039;inter-backdrop&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
||&#039;&#039;&#039;intermusic&#039;&#039;&#039;||&#039;&#039;&#039;intermusic&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
||&#039;&#039;&#039;episode&#039;&#039;&#039;||[[EDF menu reference]]. See &#039;&#039;&#039;mn_episode&#039;&#039;&#039; in particular. If mod has this EDF menu defined, it takes priority over UMAPINFO.&lt;br /&gt;
|-&lt;br /&gt;
||&#039;&#039;&#039;bossaction&#039;&#039;&#039;||&#039;&#039;&#039;levelaction-bossdeath&#039;&#039;&#039;. However, the UMAPINFO always uses classic specials, whereas the EMAPINFO version uses UDMF parameterized specials. Clearing &#039;&#039;&#039;bossaction&#039;&#039;&#039; is like setting EMAPINFO &#039;&#039;&#039;boss-specials 0&#039;&#039;&#039;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
*[[EMAPINFO]]&lt;/div&gt;</summary>
		<author><name>Printz</name></author>
	</entry>
	<entry>
		<id>https://eternity.youfailit.net/index.php?title=Eternity_Engine&amp;diff=6523</id>
		<title>Eternity Engine</title>
		<link rel="alternate" type="text/html" href="https://eternity.youfailit.net/index.php?title=Eternity_Engine&amp;diff=6523"/>
		<updated>2026-06-13T21:16:35Z</updated>

		<summary type="html">&lt;p&gt;Printz: /* Releases */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The Eternity Engine is [[Doom Wiki:Team Eternity|Team Eternity]]&#039;s advanced [[Doom Wiki:Doom|Doom]] [[Doom Wiki:Source port|source port]] and the primary subject of this Wiki. It is meant as a versatile feature port which keeps gameplay compatibility with its roots (DOOM, [[BOOM]], [[MBF]] and so on) while advancing with powerful features such as new ways to design levels ([[linked portals]], [[3DMidTex]], [[polyobjects]] etc.) and modding capabilities (using the [[EDF]] definition language). Every new feature we add is tested not to affect anything that exists so far. &lt;br /&gt;
&lt;br /&gt;
==History==&lt;br /&gt;
The Eternity Engine began in 1998 as a simple modification of [[Doom Wiki:Boom|Boom]] meant to power [[Doom Wiki:Eternity TC|Eternity TC]], which was at that time a new and active project. When [[Doom Wiki:Lee Killough|Lee Killough]] began the [[MBF]] project, [[Doom Wiki:James_Haley_(Quasar)|James &amp;quot;Quasar&amp;quot; Haley]] became a beta tester after emailing Lee with questions about the early Doom alpha versions. The Eternity project moved to an MBF code base after that port&#039;s first release.&lt;br /&gt;
&lt;br /&gt;
In late 1999, [[Doom Wiki:Simon &amp;quot;Fraggle&amp;quot; Howard|Fraggle]] released v3.10 of his MBF-based source port [[SMMU]], which contained support for the new [[Doom Wiki:FraggleScript|FraggleScript]] scripting language. Although activity in the Eternity TC project by editors had steadily dropped to almost nothing, Quasar was still interested in developing the code associated with it. Needing features such as scripting and the [[console]], he then moved the Eternity project&#039;s code into SMMU.&lt;br /&gt;
&lt;br /&gt;
Despite this long history of jumping between Boom-based ports, no public release of Eternity based on any port other than SMMU was ever made. The first private alpha, released to a select few beta testers, was derived from SMMU 3.21 with selected modifications from 3.30. Because of this, Eternity began at version 3.29.&lt;br /&gt;
&lt;br /&gt;
After the release of the [[Doom Wiki:Caverns_of_Darkness|Caverns of Darkness]] project, which used a customized version of Eternity Engine v3.29 Development Beta 5, the project began to attract more attention. A second programmer, [[Doom Wiki:Stephen_McGranahan_(SoM)|Steven &amp;quot;SoM&amp;quot; McGranahan]], joined the project and immediately set to work porting the code to use [[Wikipedia:Simple_DirectMedia_Layer|SDL]], making it capable of running on many operating systems, including [[Wikipedia:Microsoft Windows|Windows]].&lt;br /&gt;
&lt;br /&gt;
Now it has [[Universal Doom Map Format|UDMF]] support and a dynamic weapon and inventory system. It supports linked portals for full room-over-room gameplay. Current major goals for the engine include completing support for [[Doom Wiki:Heretic|Heretic]].&lt;br /&gt;
&lt;br /&gt;
==Getting started==&lt;br /&gt;
You can download Eternity either from [https://www.doomworld.com/forum/25-eternity/ Doomworld] (as official releases) or from [https://devbuilds.drdteam.org/eternity/ DRDTeam] (as &amp;quot;beta quality&amp;quot; development builds, which in practice are generally stable, and may be needed for some modding features listed on this wiki).&lt;br /&gt;
&lt;br /&gt;
Eternity&#039;s goal that makes it different from feature ports such as [[Doom Wiki:GZDoom|GZDoom]] is demo compatibility similar to that of [[Doom Wiki:PrBoom+|PrBoom+]], kept specifically to ensure that every new feature we add fits seamlessly with what exists so far, and that we don&#039;t stray from the bases made so far in the DOOM gameplay.&lt;br /&gt;
&lt;br /&gt;
Support for [[Doom Wiki:Heretic|Heretic]] is growing, though still under way. While we don&#039;t support vanilla Heretic demos for playback yet, a possibility exists in the horizon.&lt;br /&gt;
&lt;br /&gt;
===Playing Eternity===&lt;br /&gt;
When run directly, Eternity tries to find the DOOM, DOOM 2 or Final DOOM megawads in some standard locations. If it can&#039;t find them, it will let you know. If it finds several of them, it will start with a picker screen, letting you choose.&lt;br /&gt;
&lt;br /&gt;
On [[Wikipedia:Windows|Windows]] you can use the drag-and-drop feature of Explorer by moving WADs and PKEs into Eternity&#039;s executable. Or you can use Powershell or Command Prompt in a manner similar to starting [[Doom Wiki:Vanilla Doom|vanilla DOOM]]. See [[list of command line parameters]]. For more advanced cases, you can use [[GFS]] files to quickly load multiple files and settings together.&lt;br /&gt;
&lt;br /&gt;
The [[Wikipedia:macOS|macOS]] version of Eternity also comes with a visual dialog-box launcher, hiding the complexity behind starting a terminal.&lt;br /&gt;
&lt;br /&gt;
For advanced technical stuff, cheating and testing maps, Eternity has a [[console]] similar to [[Wikipedia:Quake|Quake&#039;s]].&lt;br /&gt;
&lt;br /&gt;
====Loading main game WADs====&lt;br /&gt;
Eternity looks for the main game WADs (IWADs), e.g. doom2.wad, at these locations:&lt;br /&gt;
* IWAD file paths in user/system.cfg;&lt;br /&gt;
* the -iwad command-line parameter;&lt;br /&gt;
* the [[Doom Wiki:Environment variables|&#039;&#039;&#039;DOOMWADDIR&#039;&#039;&#039; or &#039;&#039;&#039;DOOMWADPATH&#039;&#039;&#039; environment variables]];&lt;br /&gt;
* the IWAD in the working directory;&lt;br /&gt;
* the IWAD file under the appropriate game folder of the base directory, which can be found using the -game parameter.&lt;br /&gt;
&lt;br /&gt;
====Loading Master Levels for DOOM II====&lt;br /&gt;
Eternity offers a menu for conveniently loading each WAD from the Master Levels. To start the Master Levels:&lt;br /&gt;
# Start Eternity with DOOM II;&lt;br /&gt;
# Go to the Options menu, under the Game Files section, select WAD Options;&lt;br /&gt;
# Under the Master Levels section, you may need to specify Master Levels Dir to the path with the WADs;&lt;br /&gt;
# Once the path is configured, enter Play Master Levels.&lt;br /&gt;
Once the Master Levels Dir is configured, entering New Game from the menu will give you the choice to start the Master Levels.&lt;br /&gt;
&lt;br /&gt;
===Making mods for Eternity===&lt;br /&gt;
The editors [[Doom Wiki:Doom Builder X|Doom Builder X]], [[Doom Wiki:GZDoom Builder|GZDoom Builder]], [[Doom Wiki:Eureka|Eureka]] and [[Doom Wiki:SLADE|SLADE]] have Eternity level editing support of varying degrees. For [[UDMF]] (modern advanced format) you can use Doom Builder X, GZDoom Builder or SLADE. However, if you lack access to a UDMF-capable editor or don&#039;t want the complexity it brings, you can also use the classic DOOM format, combined with [[ExtraData]]&lt;br /&gt;
&lt;br /&gt;
For general modding, Eternity relies on [[EDF]], its own content definition language. For level definitions in particular it uses [[EMAPINFO]]. Eternity also has growing support for some lumps from [[Doom Wiki:GZDoom|GZDoom]] and [[Doom Wiki:Hexen|Hexen]] such as [[ANIMDEFS]], thus increasing the support for cross-port mods.&lt;br /&gt;
&lt;br /&gt;
Eternity can load [[PKE]] archives, not just [[Doom Wiki:WAD|WADs]]. It can also load unarchived folders structured the same as PKE archives (you can use the -file command-line parameter on folders), facilitating project work. You can use powerful editors such as [[Wikipedia:Visual Studio Code|Visual Studio Code]] on such folders to edit your EDF modifications.&lt;br /&gt;
&lt;br /&gt;
See [[Editing reference|all editing reference]] to get started on modding.&lt;br /&gt;
&lt;br /&gt;
==Major Features==&lt;br /&gt;
&lt;br /&gt;
===Cardboard engine===&lt;br /&gt;
[[Cardboard]] is a floating-point rendering engine created by [[Doom Wiki:Stephen_McGranahan_(SoM)|SoM]] that fixes several problems inherent with the classic fixed-point [[Doom Wiki:Doom rendering engine|Doom rendering engine]].&lt;br /&gt;
&lt;br /&gt;
===EDF===&lt;br /&gt;
[[EDF]], which stands for Eternity Definition Files, is a textual input language that allows specification of almost all the static game data which was once contained inside the executable. This includes [[thingtype|thing types]], [[frame|frames]], sprites, terrain definitions, and more. EDF has a relaxed [[Wikipedia:C programming language|C]]-like syntax and can be used from both files and [[WAD]] lumps.&lt;br /&gt;
&lt;br /&gt;
===ExtraData===&lt;br /&gt;
[[ExtraData]] is another EDF-like data specification language that allows the Doom map format to be extended with any kind of data. Use of special thing, line, and sector types within a map allows the editor to attach ExtraData records to those objects. Special data for the objects is then given inside the script.&lt;br /&gt;
&lt;br /&gt;
===Linked portals===&lt;br /&gt;
[[Linked portals]] are surfaces that, like regular [[portals]], connect different areas of the map, but in addition can be walked through, thus allowing multistory maps to be designed in Doom.&lt;br /&gt;
&lt;br /&gt;
===[[MapInfo]]===&lt;br /&gt;
Eternity expands SMMU&#039;s level info system significantly, allowing dozens of new properties to be specified, and allowing cascading global EMAPINFO lumps as an alternative to inserting MapInfo data into level headers. Among other things, MapInfo is used to tie ExtraData and ACS scripts to the maps that use them.&lt;br /&gt;
&lt;br /&gt;
==Releases==&lt;br /&gt;
A complete list of Eternity&#039;s release history follows. You can find most of these releases on the [https://www.doomworld.com/forum/25-eternity/ Doomworld Eternity forum], on the [https://github.com/team-eternity/eternity/releases GitHub Eternity repository] and the older releases on the [http://eternity.mancubus.net/ee-old/ Eternity Mancubus website]. Most of the releases are Windows only, but the most recent ones are also available on macOS.&lt;br /&gt;
&lt;br /&gt;
For finer grained non-official releases, see also the [[Eternity Engine#Development builds|development builds]] below.&lt;br /&gt;
&lt;br /&gt;
===Version 3.29===&lt;br /&gt;
* 3.29 Private Alpha - September 14, 2000&lt;br /&gt;
* 3.29 Public Beta 1 - January 8, 2001&lt;br /&gt;
* 3.29 Public Beta 2 - January 9, 2001&lt;br /&gt;
* 3.29 Public Beta 3 - May 10, 2001&lt;br /&gt;
* 3.29 Public Beta 4 - June 30, 2001&lt;br /&gt;
* 3.29 Development Beta 5 - October 2, 2001&lt;br /&gt;
* 3.29 &amp;quot;Gamma&amp;quot; - July 4, 2002&lt;br /&gt;
&lt;br /&gt;
===Version 3.31===&lt;br /&gt;
* 3.31 Public Beta 1 - September 11, 2002&lt;br /&gt;
* 3.31 Public Beta 2 - March 5, 2003&lt;br /&gt;
* 3.31 Public Beta 3 - August 8, 2003&lt;br /&gt;
* 3.31 Public Beta 4 - November 29, 2003&lt;br /&gt;
* 3.31 Public Beta 5 - December 17, 2003&lt;br /&gt;
* 3.31 Public Beta 6 - February 29, 2004&lt;br /&gt;
* 3.31 Public Beta 7 - April 11, 2004&lt;br /&gt;
* 3.31 &amp;quot;Delta&amp;quot; Pre-Release Alpha 1 - August 23, 2004&lt;br /&gt;
* 3.31 &amp;quot;Delta&amp;quot; Pre-Release Alpha 2 - November 11, 2004&lt;br /&gt;
* 3.31.10 &amp;quot;Delta&amp;quot; - January 19, 2005&lt;br /&gt;
&lt;br /&gt;
===Version 3.33===&lt;br /&gt;
* 3.33.00 &amp;quot;Genesis&amp;quot; - May 26, 2005&lt;br /&gt;
* 3.33.01 &amp;quot;Outcast&amp;quot; - June 24, 2005&lt;br /&gt;
* 3.33.02 &amp;quot;Warrior&amp;quot; - October 1, 2005&lt;br /&gt;
* 3.33.33 &amp;quot;Paladin&amp;quot; - May 17, 2006&lt;br /&gt;
* 3.33.50 &amp;quot;Phoenix&amp;quot; - October 23, 2006&lt;br /&gt;
&lt;br /&gt;
===Version 3.35===&lt;br /&gt;
* [http://www.doomworld.com/vb/eternity/45146-eternity-engine-v3-35-90-simorgh/ 3.35.90] &amp;quot;Simorgh&amp;quot; - January 11, 2009&lt;br /&gt;
* [http://www.doomworld.com/vb/eternity/45757-eternity-engine-3-35-92-nekhbet/ 3.35.92] &amp;quot;Nekhbet&amp;quot; - March 22, 2009&lt;br /&gt;
&lt;br /&gt;
===Version 3.37===&lt;br /&gt;
* [http://www.doomworld.com/vb/eternity/49268-eternity-engine-3-37-00-sekhmet/ 3.37.00] &amp;quot;Sekhmet&amp;quot; - January 1, 2010&lt;br /&gt;
&lt;br /&gt;
===Version 3.39===&lt;br /&gt;
* [http://www.doomworld.com/vb/eternity/52873-eternity-engine-v3-39-20-resheph/ 3.39.20] &amp;quot;Resheph&amp;quot; - October 10, 2010&lt;br /&gt;
&lt;br /&gt;
===Version 3.40===&lt;br /&gt;
* [http://www.doomworld.com/vb/eternity/53944-eternity-engine-v3-40-00-rebirth/ 3.40.00] &amp;quot;Rebirth&amp;quot; - January 8, 2011&lt;br /&gt;
* [http://www.doomworld.com/vb/eternity/55219-announcing-the-blue-box-ee-3-40-11-and-vaporware-demo/ 3.40.11] &amp;quot;Aasgard&amp;quot; - May 2, 2011&lt;br /&gt;
* [http://www.doomworld.com/vb/eternity/55874-eternity-engine-3-40-15-wodanaz/ 3.40.15] &amp;quot;Wodanaz&amp;quot; - June 22, 2011&lt;br /&gt;
* [http://www.doomworld.com/vb/eternity/58281-eternity-engine-v3-40-20-mjolnir/ 3.40.20] &amp;quot;Mjolnir&amp;quot; - December 26, 2011&lt;br /&gt;
* [http://www.doomworld.com/vb/eternity/61245-eternity-engine-3-40-25-midgard/ 3.40.25] &amp;quot;Midgard&amp;quot; - August 27, 2012&lt;br /&gt;
* [http://www.doomworld.com/vb/eternity/62087-eternity-engine-3-40-30-alfheim/ 3.40.30] &amp;quot;Alfheim&amp;quot; - November 4, 2012&lt;br /&gt;
* [http://www.doomworld.com/vb/eternity/64382-eternity-engine-3-40-37-gungnir/ 3.40.37] &amp;quot;Gungnir&amp;quot; - May 27, 2013&lt;br /&gt;
* [http://www.doomworld.com/vb/eternity/67069-eternity-engine-3-40-46-bifrost/ 3.40.46] &amp;quot;Bifröst&amp;quot; - January 19, 2014 - &#039;&#039;first one with a macOS release&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===Version 3.42===&lt;br /&gt;
* [https://www.doomworld.com/forum/topic/94046-eternity-engine-34202-heimdal-files-documentation-buglist/ 3.42.02] &amp;quot;Heimdal&amp;quot; - May 7, 2017&lt;br /&gt;
* [https://www.doomworld.com/forum/topic/95351-eternity-engine-34203a-heimdal-release-2-hotfix/ 3.42.03a] &amp;quot;Heimdal&amp;quot; release 2 - August 2, 2017&lt;br /&gt;
&lt;br /&gt;
===Version 4.00===&lt;br /&gt;
* [https://www.doomworld.com/forum/topic/99957-eternity-engine-40000-v%C3%B6lusp%C3%A1/ 4.00.00] &amp;quot;Völuspá&amp;quot; - March 17, 2018&lt;br /&gt;
&lt;br /&gt;
===Version 4.01===&lt;br /&gt;
* [https://www.doomworld.com/forum/topic/117429-eternity-engine-40100-tyrfing/ 4.01.00] &amp;quot;Tyrfing&amp;quot; - October 13, 2020&lt;br /&gt;
&lt;br /&gt;
===Version 4.02===&lt;br /&gt;
* [https://www.doomworld.com/forum/topic/119425-eternity-engine-40200-forseti/ 4.02.00] &amp;quot;Forseti&amp;quot; - January 27, 2021&lt;br /&gt;
&lt;br /&gt;
===Version 4.04===&lt;br /&gt;
* [https://www.doomworld.com/forum/topic/148678-eternity-engine-40400-glitnir/ 4.04.00] &amp;quot;Glitnir&amp;quot; - October 12, 2024&lt;br /&gt;
* [https://www.doomworld.com/forum/topic/148678-eternity-engine-40401-glitnir-update-1/ 4.04.01] &amp;quot;Glitnir&amp;quot; Update 1 - October 20, 2024&lt;br /&gt;
* [https://www.doomworld.com/forum/topic/148678-eternity-engine-40402-glitnir-update-2/ 4.04.02] &amp;quot;Glitnir&amp;quot; Update 2 - November 18, 2024&lt;br /&gt;
&lt;br /&gt;
===Version 4.05===&lt;br /&gt;
* [https://www.doomworld.com/forum/topic/154848-eternity-engine-40504-citadel/ 4.05.04] &amp;quot;Citadel&amp;quot; - August 23, 2025&lt;br /&gt;
&lt;br /&gt;
===Version 4.06===&lt;br /&gt;
* [https://www.doomworld.com/forum/topic/158835-eternity-engine-40600-nidhogg/ 4.06.00] &amp;quot;Nidhogg&amp;quot; — June 13, 2026&lt;br /&gt;
&lt;br /&gt;
==Cross-platform development==&lt;br /&gt;
Eternity is built by using the [[Wikipedia:CMake|CMake]] utility. You can download the Eternity [[Wikipedia:source code|source code]] from [[Wikipedia:GitHub|GitHub]] and execute CMake. Eternity&#039;s source code repository, as well as the latest releases, are located [https://github.com/team-eternity/eternity/ here].&lt;br /&gt;
&lt;br /&gt;
==Development builds==&lt;br /&gt;
Development builds (&amp;quot;beta&amp;quot; releases) for Eternity are available for Windows and macOS at [http://devbuilds.drdteam.org/eternity/ DRDTeam&#039;s website]. They are recommended if you encounter serious bugs with any of the official releases, or if you want to test brand new features that didn&#039;t exist in the latest official releases. Due to their beta status, they may be untested and have other problems. However, due to the sometimes sporadic release cycles, it&#039;s often recommended to just try the development builds. The only problem is that by upgrading Eternity often, savegames tend to become unusable, so exercise caution before upgrading Eternity if you rely on games with saves.&lt;br /&gt;
&lt;br /&gt;
==System features==&lt;br /&gt;
*[[Cardboard engine]]&lt;br /&gt;
*[[List of command line parameters]]&lt;br /&gt;
*[[Console]]&lt;br /&gt;
*[[List of cheat codes]]&lt;br /&gt;
*[[GFS|GFS files]]&lt;br /&gt;
*[[ZIP|ZIP mods]]&lt;br /&gt;
&lt;br /&gt;
==Gameplay and modding features==&lt;br /&gt;
*[[DeHackEd / BEX Reference]]&lt;br /&gt;
*[[List of codepointers]]&lt;br /&gt;
*[[EDF|EDF files]]&lt;br /&gt;
*[[Editing reference]]&lt;br /&gt;
*[[OPTIONS|OPTIONS lump]]&lt;br /&gt;
*[[MapInfo]]&lt;br /&gt;
*[[SMMU|Features inherited from SMMU]]&lt;br /&gt;
*[[ExtraData]]&lt;br /&gt;
*[[Hexen format SNDINFO]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Source ports]]&lt;/div&gt;</summary>
		<author><name>Printz</name></author>
	</entry>
	<entry>
		<id>https://eternity.youfailit.net/index.php?title=Template:Latest&amp;diff=6522</id>
		<title>Template:Latest</title>
		<link rel="alternate" type="text/html" href="https://eternity.youfailit.net/index.php?title=Template:Latest&amp;diff=6522"/>
		<updated>2026-06-13T21:03:16Z</updated>

		<summary type="html">&lt;p&gt;Printz: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[https://www.doomworld.com/forum/topic/158835-eternity-engine-40600-nidhogg/ 4.06.00]&lt;/div&gt;</summary>
		<author><name>Printz</name></author>
	</entry>
	<entry>
		<id>https://eternity.youfailit.net/index.php?title=SectorSound&amp;diff=6521</id>
		<title>SectorSound</title>
		<link rel="alternate" type="text/html" href="https://eternity.youfailit.net/index.php?title=SectorSound&amp;diff=6521"/>
		<updated>2026-05-31T15:05:36Z</updated>

		<summary type="html">&lt;p&gt;Printz: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ACSFunction|description=Plays a sound at calling line&#039;s front sector.&lt;br /&gt;
|usage=&#039;&#039;void&#039;&#039; &#039;&#039;&#039;SectorSound&#039;&#039;&#039;(&#039;&#039;str sound&#039;&#039;, &#039;&#039;int volume&#039;&#039;)&lt;br /&gt;
|parameters=&lt;br /&gt;
* &#039;&#039;sound&#039;&#039;: name of sound to play.&lt;br /&gt;
* &#039;&#039;volume&#039;&#039;: volume of sound. Uses the same range as in other places sounds are used. The usual volume for Doom sounds is 127.&lt;br /&gt;
|notes=This function will only work if the script is called from a linedef.&lt;br /&gt;
|id=ACC internal&lt;br /&gt;
|seealso=&lt;br /&gt;
*[[ActivatorSound]]&lt;br /&gt;
*[[AmbientSound]]}}&lt;/div&gt;</summary>
		<author><name>Printz</name></author>
	</entry>
	<entry>
		<id>https://eternity.youfailit.net/index.php?title=IsTIDUsed&amp;diff=6520</id>
		<title>IsTIDUsed</title>
		<link rel="alternate" type="text/html" href="https://eternity.youfailit.net/index.php?title=IsTIDUsed&amp;diff=6520"/>
		<updated>2026-05-10T10:20:00Z</updated>

		<summary type="html">&lt;p&gt;Printz: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ACSFunction|description=Returns 1 if any thing with tag &#039;&#039;tid&#039;&#039; exists in the level.&lt;br /&gt;
|usage=&#039;&#039;Boolean&#039;&#039; &#039;&#039;&#039;IsTIDUsed&#039;&#039;&#039;(&#039;&#039;int&#039;&#039; &#039;&#039;tid&#039;&#039;)&lt;br /&gt;
|parameters=&lt;br /&gt;
*&#039;&#039;tid&#039;&#039;: [[TID]] to check&lt;br /&gt;
|return=&lt;br /&gt;
&#039;&#039;&#039;TRUE&#039;&#039;&#039; if a thing with given TID exists.&lt;br /&gt;
|notes=It doesn&#039;t matter if such tagged things are dead or alive. This works for any special values for TID, so for example you can check if player 2 is present in the game by checking &#039;&#039;&#039;IsTIDUsed&#039;&#039;&#039;(-2). See the [[TID]] definition for details.&lt;br /&gt;
|id=-47&lt;br /&gt;
|seealso=&lt;br /&gt;
*[[UniqueTID]]}}&lt;/div&gt;</summary>
		<author><name>Printz</name></author>
	</entry>
	<entry>
		<id>https://eternity.youfailit.net/index.php?title=UniqueTID&amp;diff=6519</id>
		<title>UniqueTID</title>
		<link rel="alternate" type="text/html" href="https://eternity.youfailit.net/index.php?title=UniqueTID&amp;diff=6519"/>
		<updated>2026-05-10T10:19:35Z</updated>

		<summary type="html">&lt;p&gt;Printz: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ACSFunction|description=Returns a free TID to apply to new things.&lt;br /&gt;
|usage=&#039;&#039;int&#039;&#039; &#039;&#039;&#039;UniqueTID&#039;&#039;&#039;([&#039;&#039;int start&#039;&#039;[, &#039;&#039;int limit&#039;&#039;]])}&lt;br /&gt;
|parameters=&lt;br /&gt;
*&#039;&#039;start&#039;&#039;: optional start [[TID]] to count from&lt;br /&gt;
*&#039;&#039;limit&#039;&#039;: optional limit of retries&lt;br /&gt;
|return=New free TID to use, or 0 if it couldn&#039;t find one within limit.&lt;br /&gt;
|notes=If &#039;&#039;start&#039;&#039; is not provided, it will start by trying a random TID.&lt;br /&gt;
&lt;br /&gt;
If attempted TID is currently in use, it will increment by up to &#039;&#039;limit&#039;&#039; tries, or keep looking if no limit. There&#039;s a limit of 32767 TIDs.&lt;br /&gt;
|id=-46&lt;br /&gt;
|seealso=&lt;br /&gt;
*[[IsTIDUsed]]}}&lt;/div&gt;</summary>
		<author><name>Printz</name></author>
	</entry>
	<entry>
		<id>https://eternity.youfailit.net/index.php?title=ACS_built-in_functions&amp;diff=6518</id>
		<title>ACS built-in functions</title>
		<link rel="alternate" type="text/html" href="https://eternity.youfailit.net/index.php?title=ACS_built-in_functions&amp;diff=6518"/>
		<updated>2026-05-10T09:10:17Z</updated>

		<summary type="html">&lt;p&gt;Printz: /* Scripts */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;These are predefined ACS functions with no [[parameterized linedef specials|parameterized linedef special]] equivalents, accessible only through ACS scripts.&lt;br /&gt;
&lt;br /&gt;
NOTE: most of these functions are meant to be compatible with those from ZDoom. For any ones not yet documented on this wiki, you can check the ZDoom wiki. A few of them may be incompletely implemented in Eternity. Don&#039;t hesitate to update the wiki in case of any mistakes. &lt;br /&gt;
==Special TID info==&lt;br /&gt;
For functions affecting things, some TIDs (thing tags) carry special meaning. TID 0 means the activator, and TIDs -1 ... -4 mean each of the four players in the game -- this is an Eternity extension&lt;br /&gt;
==Data type info==&lt;br /&gt;
You may see specifiers such as &#039;&#039;void&#039;&#039;, &#039;&#039;str&#039;&#039;, &#039;&#039;int&#039;&#039; and others in ACS function signatures. They act as a guide on what kinds of values are expected, but in ACS there really are only two types: &#039;&#039;&#039;str&#039;&#039;&#039; and &#039;&#039;&#039;int&#039;&#039;&#039; (and &#039;&#039;&#039;str&#039;&#039;&#039; internally is merely a string ID number). Most importantly: &lt;br /&gt;
*&#039;&#039;void&#039;&#039; means that a function should be used as a procedure (command) without returning anything,&lt;br /&gt;
*&#039;&#039;fixed&#039;&#039; means you can use the decimal point notation: 1.0 is equivalent to 65536, 1.5 to 98304 etc. In ACS, such values are still of &#039;&#039;&#039;int&#039;&#039;&#039; type, but whether you use the decimal point or not is quite relevant. A value such as 128.0 is &#039;&#039;not&#039;&#039; the same as 128: it&#039;s actually equal to 8388608 (no decimal point).&lt;br /&gt;
==Function list==&lt;br /&gt;
===Sound and music===&lt;br /&gt;
*[[ActivatorSound]]&lt;br /&gt;
*[[AmbientSound]]&lt;br /&gt;
*[[LocalAmbientSound]]&lt;br /&gt;
*[[PlayActorSound]]&lt;br /&gt;
*[[PlaySound]]&lt;br /&gt;
*[[SectorSound]]&lt;br /&gt;
*[[SetMusic]]&lt;br /&gt;
*[[LocalSetMusic]]&lt;br /&gt;
*[[SoundSequence]]&lt;br /&gt;
*[[SoundSequenceOnActor]]&lt;br /&gt;
*[[StopSound]]&lt;br /&gt;
*[[ThingSound]]&lt;br /&gt;
&lt;br /&gt;
===Sectors===&lt;br /&gt;
{|class=&amp;quot;wikitable sortable&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
||[[ChangeCeiling]]||Changes the ceiling texture.&lt;br /&gt;
|-&lt;br /&gt;
||[[ChangeFloor]]||Changes the floor texture.&lt;br /&gt;
|-&lt;br /&gt;
||[[GetSectorCeilingZ]]||Gets the ceiling height.&lt;br /&gt;
|-&lt;br /&gt;
||[[GetSectorFloorZ]]||Gets the floor height.&lt;br /&gt;
|-&lt;br /&gt;
||[[GetSectorLightLevel]]||Gets the light level.&lt;br /&gt;
|-&lt;br /&gt;
||[[SectorDamage]]||Damages things in sector.&lt;br /&gt;
|-&lt;br /&gt;
||[[SetSectorDamage]]||Modifies the damaging floor status.&lt;br /&gt;
|-&lt;br /&gt;
||[[TagWait]]||Waits for sectors to stop movement.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Things===&lt;br /&gt;
*[[ActivatorTID]]&lt;br /&gt;
*[[ChangeActorAngle]]&lt;br /&gt;
*[[ChangeActorPitch]]&lt;br /&gt;
*[[CheckActorCeilingTexture]]&lt;br /&gt;
*[[CheckActorClass]]&lt;br /&gt;
*[[CheckActorFloorTexture]]&lt;br /&gt;
*[[CheckActorProperty]]&lt;br /&gt;
*bool [[CheckFlag]](int tid, str flag)&lt;br /&gt;
:Returns true if the first thing with the given tid has the given flag enabled.&lt;br /&gt;
*[[CheckProximity]]&lt;br /&gt;
*bool [[CheckSight]](int source, int dest, int flags)&lt;br /&gt;
:Returns true if there&#039;s a line of sight between at least one thing tagged as source and one thing tagged as dest. Currently flags is reserved and must be 0.&lt;br /&gt;
*int [[ClassifyActor]](int tid)&lt;br /&gt;
:Checks the kind of thing tagged tid. It returns a set of flags, possibly combined:&lt;br /&gt;
:*ACTOR_PLAYER (2): it&#039;s player-controlled&lt;br /&gt;
:*ACTOR_VOODOODOLL (8): it&#039;s a duplicate player start, not controlled by the player but still linked to it. Used in Boom maps for advanced mapping tricks&lt;br /&gt;
:*ACTOR_MONSTER (16): it&#039;s a monster (has COUNTKILL or KILLABLE thing type flag set)&lt;br /&gt;
:*ACTOR_MISSILE (128): it&#039;s a projectile in flight (has MISSILE thing type flag set)&lt;br /&gt;
:*ACTOR_GENERIC (256): neither a monster, nor a projectile&lt;br /&gt;
:*ACTOR_ALIVE (32): has positive health&lt;br /&gt;
:*ACTOR_DEAD (64): has health &amp;lt;= 0&lt;br /&gt;
:*ACTOR_NONE (0): no thing found with this TID&lt;br /&gt;
:*ACTOR_WORLD (1): TID is 0 but activator isn&#039;t a thing&lt;br /&gt;
*[[GetActorAngle]]&lt;br /&gt;
*[[GetActorCeilingZ]]&lt;br /&gt;
*[[GetActorFloorZ]]&lt;br /&gt;
*[[GetActorLightLevel]]&lt;br /&gt;
*[[GetActorPitch]]&lt;br /&gt;
*[[GetActorProperty]]&lt;br /&gt;
*[[GetActorVelX]]&lt;br /&gt;
*[[GetActorVelY]]&lt;br /&gt;
*[[GetActorVelZ]]&lt;br /&gt;
*[[GetActorX]]&lt;br /&gt;
*[[GetActorY]]&lt;br /&gt;
*[[GetActorZ]]&lt;br /&gt;
*[[IsTIDUsed]]&lt;br /&gt;
*[[SetActivator]]&lt;br /&gt;
*[[SetActivatorToTarget]]&lt;br /&gt;
*void [[SetActorAngle]] (int tid, fixed angle)&lt;br /&gt;
*[[SetActorVelocity]]&lt;br /&gt;
*void [[SetActorPitch]] (int tid, int pitch)&lt;br /&gt;
*[[SetActorPosition]]&lt;br /&gt;
*void [[SetThingSpecial]] (int tid, int special [, int arg0 [, int arg1 [, int arg2 [, int arg3 [, int arg4]]]]])&lt;br /&gt;
*int [[SetActorState]](int tid, str statename[, bool exact]);&lt;br /&gt;
*[[SetActorProperty]]&lt;br /&gt;
*int [[Spawn]] (str classname, fixed x, fixed y, fixed z [, int tid [, int angle]])&lt;br /&gt;
*int [[SpawnForced]] (str classname, fixed x, fixed y, fixed z [, int tid [, int angle]])&lt;br /&gt;
*[[SpawnProjectile]]&lt;br /&gt;
*[[SpawnSpot]]&lt;br /&gt;
*int [[SpawnSpotFacing]] (str classname, int spottid [, int tid])&lt;br /&gt;
*[[SpawnSpotFacingForced]]&lt;br /&gt;
*[[SpawnSpotForced]]&lt;br /&gt;
*int [[ThingCount]] (int type, int tid)&lt;br /&gt;
*int [[ThingCountName]] (str classname, int tid)&lt;br /&gt;
*int [[ThingCountSector]] (int type, int tid, int tag)&lt;br /&gt;
*int [[ThingCountNameSector]] (str classname, int tid, int tag)&lt;br /&gt;
*int [[Thing_Damage2]] (int tid, int amount, str type);&lt;br /&gt;
*void [[Thing_Projectile2]] (int tid, int type, int angle, int speed, int vspeed, int gravity, int newtid)&lt;br /&gt;
*int [[UniqueTID]] ([int tid[, int limit]])&lt;br /&gt;
&lt;br /&gt;
===Player===&lt;br /&gt;
*[[CheckInventory]]&lt;br /&gt;
*[[CheckWeapon]]&lt;br /&gt;
*[[ClearInventory]]&lt;br /&gt;
*[[GetMaxInventory]]&lt;br /&gt;
*[[GetSigilPieces]]&lt;br /&gt;
*[[GetWeapon]]&lt;br /&gt;
*[[GiveInventory]]&lt;br /&gt;
*[[PlayerArmorPoints]]&lt;br /&gt;
*[[PlayerCount]]&lt;br /&gt;
*[[PlayerFrags]]&lt;br /&gt;
*[[PlayerHealth]]&lt;br /&gt;
*[[PlayerNumber]]&lt;br /&gt;
*[[SetWeapon]]&lt;br /&gt;
*[[TakeInventory]]&lt;br /&gt;
*[[UseInventory]]&lt;br /&gt;
&lt;br /&gt;
===Linedefs and sidedefs===&lt;br /&gt;
{|class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
! zspecial.acs index&lt;br /&gt;
! Name&lt;br /&gt;
! Return type&lt;br /&gt;
! Parameters&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
||internal|| [[ClearLineSpecial]] || nothing || nothing || Clears the trigger linedef&#039;s special.&lt;br /&gt;
|-&lt;br /&gt;
|| || [[GetLineRowOffset]] || || ||&lt;br /&gt;
|-&lt;br /&gt;
|| || [[GetLineX]] || || ||&lt;br /&gt;
|-&lt;br /&gt;
|| || [[GetLineY]] || || ||&lt;br /&gt;
|-&lt;br /&gt;
|| || [[LineSide]] || || ||&lt;br /&gt;
|-&lt;br /&gt;
|| || [[ReplaceTextures]] || nothing || str old_texture_name, str new_texture_name[, int flags] ||&lt;br /&gt;
|-&lt;br /&gt;
|| || [[SetLineBlocking]] || || ||&lt;br /&gt;
|-&lt;br /&gt;
||internal|| [[SetLineMonsterBlocking]] || || || Makes a linedef block or not block monsters.&lt;br /&gt;
|-&lt;br /&gt;
|| || [[SetLineActivation]] || nothing || int lineid, int activation[, int repeat] ||&lt;br /&gt;
|-&lt;br /&gt;
|| || [[SetLineSpecial]] || || ||&lt;br /&gt;
|-&lt;br /&gt;
|| || [[SetLineTexture]] || nothing || int line_id, int line_side, int sidedef_texture, str texture_name ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Sky===&lt;br /&gt;
*[[SetSkyScrollSpeed]]&lt;br /&gt;
&lt;br /&gt;
===Scripts===&lt;br /&gt;
Eternity allows referring to scripts by name. The following actions are available in Eternity:&lt;br /&gt;
*bool ACS_NamedExecuteAlways(str script, int map, int arg1, int arg2, int arg3)&lt;br /&gt;
:*Executes a named script, starting a new instance if one already exists. Returns true if successfully started.&lt;br /&gt;
*bool ACS_NamedExecute(str script, int map, int arg1, int arg2, int arg3)&lt;br /&gt;
:*Executes a named script. Returns true if successfully started.&lt;br /&gt;
*int ACS_NamedExecuteWithResult (string script, int s_arg1, int s_arg2, int s_arg3, int s_arg4)&lt;br /&gt;
*bool ACS_NamedSuspend (string script, int map)&lt;br /&gt;
*bool ACS_NamedTerminate (string script, int map)&lt;br /&gt;
They behave the same as the corresponding numbered linedef specials.&lt;br /&gt;
&lt;br /&gt;
===Console===&lt;br /&gt;
*int [[GetCVar]] (str cvar)&lt;br /&gt;
*string [[GetCVarString]] (str cvar)&lt;br /&gt;
*int [[GetPlayerInput]] (int player, int input)&lt;br /&gt;
&lt;br /&gt;
===Polyobjects===&lt;br /&gt;
*[[GetPolyobjX]]&lt;br /&gt;
*[[GetPolyobjY]]&lt;br /&gt;
*[[PolyWait]]&lt;br /&gt;
*[[SetPolyobjXY]]&lt;br /&gt;
&lt;br /&gt;
===Quake===&lt;br /&gt;
*[[Radius_Quake2]]&lt;br /&gt;
&lt;br /&gt;
===Math===&lt;br /&gt;
*[[Cos]]&lt;br /&gt;
*fixed [[FixedSqrt]] (fixed number)&lt;br /&gt;
*int [[Random]] (int min, int max)&lt;br /&gt;
*int [[Sqrt]] (int number)&lt;br /&gt;
*[[Sin]]&lt;br /&gt;
*[[VectorAngle]]&lt;br /&gt;
*int [[VectorLength]] (int x, int y)&lt;br /&gt;
&lt;br /&gt;
===Strings===&lt;br /&gt;
*str StrLeft (str string, int length)&lt;br /&gt;
*str StrMid (str string, int start, int length)&lt;br /&gt;
*str StrRight (str string, int length)&lt;br /&gt;
&lt;br /&gt;
===Level state===&lt;br /&gt;
*[[GameSkill]]&lt;br /&gt;
*[[GameType]]&lt;br /&gt;
*[[GetLevelInfo]]&lt;br /&gt;
*[[SetAirControl]]&lt;br /&gt;
*[[SetAirFriction]]&lt;br /&gt;
*[[SetGravity]]&lt;br /&gt;
*[[SinglePlayer]]&lt;br /&gt;
*[[Timer]]&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
*[[Parameterized linedef specials]]&lt;br /&gt;
&lt;br /&gt;
[[Category:ACS]]&lt;br /&gt;
[[Category:Editing reference]]&lt;/div&gt;</summary>
		<author><name>Printz</name></author>
	</entry>
	<entry>
		<id>https://eternity.youfailit.net/index.php?title=GetPlayerInput&amp;diff=6517</id>
		<title>GetPlayerInput</title>
		<link rel="alternate" type="text/html" href="https://eternity.youfailit.net/index.php?title=GetPlayerInput&amp;diff=6517"/>
		<updated>2026-05-10T09:08:30Z</updated>

		<summary type="html">&lt;p&gt;Printz: Created page with &amp;quot;{{ACSFunction|description=Gets information about a player&amp;#039;s input. |usage=&amp;#039;&amp;#039;int&amp;#039;&amp;#039; &amp;#039;&amp;#039;&amp;#039;GetPlayerInput&amp;#039;&amp;#039;&amp;#039;(&amp;#039;&amp;#039;int player&amp;#039;&amp;#039;, &amp;#039;&amp;#039;int type&amp;#039;&amp;#039;) |parameters= *&amp;#039;&amp;#039;player&amp;#039;&amp;#039;: player index, from 0 to 3. Use -1 for activator. *&amp;#039;&amp;#039;type&amp;#039;&amp;#039;: one of the following: :*&amp;#039;&amp;#039;&amp;#039;INPUT_OLDBUTTONS&amp;#039;&amp;#039;&amp;#039; (0): unused, returns 0 :*&amp;#039;&amp;#039;&amp;#039;INPUT_BUTTONS&amp;#039;&amp;#039;&amp;#039; (1): will return a combination of the following flags: ::*&amp;#039;&amp;#039;&amp;#039;BT_ATTACK&amp;#039;&amp;#039;&amp;#039; (1): normal weapon attack ::*&amp;#039;&amp;#039;&amp;#039;BT_USE&amp;#039;&amp;#039;&amp;#039; (2): switch or door activation ::*&amp;#039;&amp;#039;&amp;#039;BT_JUMP&amp;#039;&amp;#039;&amp;#039;...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ACSFunction|description=Gets information about a player&#039;s input.&lt;br /&gt;
|usage=&#039;&#039;int&#039;&#039; &#039;&#039;&#039;GetPlayerInput&#039;&#039;&#039;(&#039;&#039;int player&#039;&#039;, &#039;&#039;int type&#039;&#039;)&lt;br /&gt;
|parameters=&lt;br /&gt;
*&#039;&#039;player&#039;&#039;: player index, from 0 to 3. Use -1 for activator.&lt;br /&gt;
*&#039;&#039;type&#039;&#039;: one of the following:&lt;br /&gt;
:*&#039;&#039;&#039;INPUT_OLDBUTTONS&#039;&#039;&#039; (0): unused, returns 0&lt;br /&gt;
:*&#039;&#039;&#039;INPUT_BUTTONS&#039;&#039;&#039; (1): will return a combination of the following flags:&lt;br /&gt;
::*&#039;&#039;&#039;BT_ATTACK&#039;&#039;&#039; (1): normal weapon attack&lt;br /&gt;
::*&#039;&#039;&#039;BT_USE&#039;&#039;&#039; (2): switch or door activation&lt;br /&gt;
::*&#039;&#039;&#039;BT_JUMP&#039;&#039;&#039; (4): jump or attempting to jump&lt;br /&gt;
::*&#039;&#039;&#039;BT_ALTATTACK&#039;&#039;&#039; (32): secondary fire button&lt;br /&gt;
::*&#039;&#039;&#039;BT_RELOAD&#039;&#039;&#039; (64): weapon reload&lt;br /&gt;
::*&#039;&#039;&#039;BT_ZOOM&#039;&#039;&#039; (128): weapon view zoom&lt;br /&gt;
::*&#039;&#039;&#039;BT_USER1&#039;&#039;&#039; (2097152), &#039;&#039;&#039;BT_USER2&#039;&#039;&#039; (4194304), &#039;&#039;&#039;BT_USER3&#039;&#039;&#039; (8388608), &#039;&#039;&#039;BT_USER4&#039;&#039;&#039; (16777216): user-defined buttons&lt;br /&gt;
:*&#039;&#039;&#039;INPUT_PITCH&#039;&#039;&#039; (2): view pitch change (looking up or down)&lt;br /&gt;
:*&#039;&#039;&#039;INPUT_YAW&#039;&#039;&#039; (3): angle turn&lt;br /&gt;
:*&#039;&#039;&#039;INPUT_FORWARDMOVE&#039;&#039;&#039; (5): forward and backward move&lt;br /&gt;
:*&#039;&#039;&#039;INPUT_SIDEMOVE&#039;&#039;&#039; (6): strafing&lt;br /&gt;
:*&#039;&#039;&#039;INPUT_UPMOVE&#039;&#039;&#039; (7): flight (if available)&lt;br /&gt;
|return=The value for the given &#039;&#039;type&#039;&#039;&lt;br /&gt;
|notes=In Eternity, there are also &#039;&#039;&#039;MODINPUT_...&#039;&#039;&#039; options, but they mean the same as the &#039;&#039;&#039;INPUT_...&#039;&#039;&#039; ones. Anything else will just return 0.&lt;br /&gt;
|id=ACC internal}}&lt;/div&gt;</summary>
		<author><name>Printz</name></author>
	</entry>
	<entry>
		<id>https://eternity.youfailit.net/index.php?title=ACS_built-in_functions&amp;diff=6516</id>
		<title>ACS built-in functions</title>
		<link rel="alternate" type="text/html" href="https://eternity.youfailit.net/index.php?title=ACS_built-in_functions&amp;diff=6516"/>
		<updated>2026-05-10T09:00:56Z</updated>

		<summary type="html">&lt;p&gt;Printz: /* Console */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;These are predefined ACS functions with no [[parameterized linedef specials|parameterized linedef special]] equivalents, accessible only through ACS scripts.&lt;br /&gt;
&lt;br /&gt;
NOTE: most of these functions are meant to be compatible with those from ZDoom. For any ones not yet documented on this wiki, you can check the ZDoom wiki. A few of them may be incompletely implemented in Eternity. Don&#039;t hesitate to update the wiki in case of any mistakes. &lt;br /&gt;
==Special TID info==&lt;br /&gt;
For functions affecting things, some TIDs (thing tags) carry special meaning. TID 0 means the activator, and TIDs -1 ... -4 mean each of the four players in the game -- this is an Eternity extension&lt;br /&gt;
==Data type info==&lt;br /&gt;
You may see specifiers such as &#039;&#039;void&#039;&#039;, &#039;&#039;str&#039;&#039;, &#039;&#039;int&#039;&#039; and others in ACS function signatures. They act as a guide on what kinds of values are expected, but in ACS there really are only two types: &#039;&#039;&#039;str&#039;&#039;&#039; and &#039;&#039;&#039;int&#039;&#039;&#039; (and &#039;&#039;&#039;str&#039;&#039;&#039; internally is merely a string ID number). Most importantly: &lt;br /&gt;
*&#039;&#039;void&#039;&#039; means that a function should be used as a procedure (command) without returning anything,&lt;br /&gt;
*&#039;&#039;fixed&#039;&#039; means you can use the decimal point notation: 1.0 is equivalent to 65536, 1.5 to 98304 etc. In ACS, such values are still of &#039;&#039;&#039;int&#039;&#039;&#039; type, but whether you use the decimal point or not is quite relevant. A value such as 128.0 is &#039;&#039;not&#039;&#039; the same as 128: it&#039;s actually equal to 8388608 (no decimal point).&lt;br /&gt;
==Function list==&lt;br /&gt;
===Sound and music===&lt;br /&gt;
*[[ActivatorSound]]&lt;br /&gt;
*[[AmbientSound]]&lt;br /&gt;
*[[LocalAmbientSound]]&lt;br /&gt;
*[[PlayActorSound]]&lt;br /&gt;
*[[PlaySound]]&lt;br /&gt;
*[[SectorSound]]&lt;br /&gt;
*[[SetMusic]]&lt;br /&gt;
*[[LocalSetMusic]]&lt;br /&gt;
*[[SoundSequence]]&lt;br /&gt;
*[[SoundSequenceOnActor]]&lt;br /&gt;
*[[StopSound]]&lt;br /&gt;
*[[ThingSound]]&lt;br /&gt;
&lt;br /&gt;
===Sectors===&lt;br /&gt;
{|class=&amp;quot;wikitable sortable&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
||[[ChangeCeiling]]||Changes the ceiling texture.&lt;br /&gt;
|-&lt;br /&gt;
||[[ChangeFloor]]||Changes the floor texture.&lt;br /&gt;
|-&lt;br /&gt;
||[[GetSectorCeilingZ]]||Gets the ceiling height.&lt;br /&gt;
|-&lt;br /&gt;
||[[GetSectorFloorZ]]||Gets the floor height.&lt;br /&gt;
|-&lt;br /&gt;
||[[GetSectorLightLevel]]||Gets the light level.&lt;br /&gt;
|-&lt;br /&gt;
||[[SectorDamage]]||Damages things in sector.&lt;br /&gt;
|-&lt;br /&gt;
||[[SetSectorDamage]]||Modifies the damaging floor status.&lt;br /&gt;
|-&lt;br /&gt;
||[[TagWait]]||Waits for sectors to stop movement.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Things===&lt;br /&gt;
*[[ActivatorTID]]&lt;br /&gt;
*[[ChangeActorAngle]]&lt;br /&gt;
*[[ChangeActorPitch]]&lt;br /&gt;
*[[CheckActorCeilingTexture]]&lt;br /&gt;
*[[CheckActorClass]]&lt;br /&gt;
*[[CheckActorFloorTexture]]&lt;br /&gt;
*[[CheckActorProperty]]&lt;br /&gt;
*bool [[CheckFlag]](int tid, str flag)&lt;br /&gt;
:Returns true if the first thing with the given tid has the given flag enabled.&lt;br /&gt;
*[[CheckProximity]]&lt;br /&gt;
*bool [[CheckSight]](int source, int dest, int flags)&lt;br /&gt;
:Returns true if there&#039;s a line of sight between at least one thing tagged as source and one thing tagged as dest. Currently flags is reserved and must be 0.&lt;br /&gt;
*int [[ClassifyActor]](int tid)&lt;br /&gt;
:Checks the kind of thing tagged tid. It returns a set of flags, possibly combined:&lt;br /&gt;
:*ACTOR_PLAYER (2): it&#039;s player-controlled&lt;br /&gt;
:*ACTOR_VOODOODOLL (8): it&#039;s a duplicate player start, not controlled by the player but still linked to it. Used in Boom maps for advanced mapping tricks&lt;br /&gt;
:*ACTOR_MONSTER (16): it&#039;s a monster (has COUNTKILL or KILLABLE thing type flag set)&lt;br /&gt;
:*ACTOR_MISSILE (128): it&#039;s a projectile in flight (has MISSILE thing type flag set)&lt;br /&gt;
:*ACTOR_GENERIC (256): neither a monster, nor a projectile&lt;br /&gt;
:*ACTOR_ALIVE (32): has positive health&lt;br /&gt;
:*ACTOR_DEAD (64): has health &amp;lt;= 0&lt;br /&gt;
:*ACTOR_NONE (0): no thing found with this TID&lt;br /&gt;
:*ACTOR_WORLD (1): TID is 0 but activator isn&#039;t a thing&lt;br /&gt;
*[[GetActorAngle]]&lt;br /&gt;
*[[GetActorCeilingZ]]&lt;br /&gt;
*[[GetActorFloorZ]]&lt;br /&gt;
*[[GetActorLightLevel]]&lt;br /&gt;
*[[GetActorPitch]]&lt;br /&gt;
*[[GetActorProperty]]&lt;br /&gt;
*[[GetActorVelX]]&lt;br /&gt;
*[[GetActorVelY]]&lt;br /&gt;
*[[GetActorVelZ]]&lt;br /&gt;
*[[GetActorX]]&lt;br /&gt;
*[[GetActorY]]&lt;br /&gt;
*[[GetActorZ]]&lt;br /&gt;
*[[IsTIDUsed]]&lt;br /&gt;
*[[SetActivator]]&lt;br /&gt;
*[[SetActivatorToTarget]]&lt;br /&gt;
*void [[SetActorAngle]] (int tid, fixed angle)&lt;br /&gt;
*[[SetActorVelocity]]&lt;br /&gt;
*void [[SetActorPitch]] (int tid, int pitch)&lt;br /&gt;
*[[SetActorPosition]]&lt;br /&gt;
*void [[SetThingSpecial]] (int tid, int special [, int arg0 [, int arg1 [, int arg2 [, int arg3 [, int arg4]]]]])&lt;br /&gt;
*int [[SetActorState]](int tid, str statename[, bool exact]);&lt;br /&gt;
*[[SetActorProperty]]&lt;br /&gt;
*int [[Spawn]] (str classname, fixed x, fixed y, fixed z [, int tid [, int angle]])&lt;br /&gt;
*int [[SpawnForced]] (str classname, fixed x, fixed y, fixed z [, int tid [, int angle]])&lt;br /&gt;
*[[SpawnProjectile]]&lt;br /&gt;
*[[SpawnSpot]]&lt;br /&gt;
*int [[SpawnSpotFacing]] (str classname, int spottid [, int tid])&lt;br /&gt;
*[[SpawnSpotFacingForced]]&lt;br /&gt;
*[[SpawnSpotForced]]&lt;br /&gt;
*int [[ThingCount]] (int type, int tid)&lt;br /&gt;
*int [[ThingCountName]] (str classname, int tid)&lt;br /&gt;
*int [[ThingCountSector]] (int type, int tid, int tag)&lt;br /&gt;
*int [[ThingCountNameSector]] (str classname, int tid, int tag)&lt;br /&gt;
*int [[Thing_Damage2]] (int tid, int amount, str type);&lt;br /&gt;
*void [[Thing_Projectile2]] (int tid, int type, int angle, int speed, int vspeed, int gravity, int newtid)&lt;br /&gt;
*int [[UniqueTID]] ([int tid[, int limit]])&lt;br /&gt;
&lt;br /&gt;
===Player===&lt;br /&gt;
*[[CheckInventory]]&lt;br /&gt;
*[[CheckWeapon]]&lt;br /&gt;
*[[ClearInventory]]&lt;br /&gt;
*[[GetMaxInventory]]&lt;br /&gt;
*[[GetSigilPieces]]&lt;br /&gt;
*[[GetWeapon]]&lt;br /&gt;
*[[GiveInventory]]&lt;br /&gt;
*[[PlayerArmorPoints]]&lt;br /&gt;
*[[PlayerCount]]&lt;br /&gt;
*[[PlayerFrags]]&lt;br /&gt;
*[[PlayerHealth]]&lt;br /&gt;
*[[PlayerNumber]]&lt;br /&gt;
*[[SetWeapon]]&lt;br /&gt;
*[[TakeInventory]]&lt;br /&gt;
*[[UseInventory]]&lt;br /&gt;
&lt;br /&gt;
===Linedefs and sidedefs===&lt;br /&gt;
{|class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
! zspecial.acs index&lt;br /&gt;
! Name&lt;br /&gt;
! Return type&lt;br /&gt;
! Parameters&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
||internal|| [[ClearLineSpecial]] || nothing || nothing || Clears the trigger linedef&#039;s special.&lt;br /&gt;
|-&lt;br /&gt;
|| || [[GetLineRowOffset]] || || ||&lt;br /&gt;
|-&lt;br /&gt;
|| || [[GetLineX]] || || ||&lt;br /&gt;
|-&lt;br /&gt;
|| || [[GetLineY]] || || ||&lt;br /&gt;
|-&lt;br /&gt;
|| || [[LineSide]] || || ||&lt;br /&gt;
|-&lt;br /&gt;
|| || [[ReplaceTextures]] || nothing || str old_texture_name, str new_texture_name[, int flags] ||&lt;br /&gt;
|-&lt;br /&gt;
|| || [[SetLineBlocking]] || || ||&lt;br /&gt;
|-&lt;br /&gt;
||internal|| [[SetLineMonsterBlocking]] || || || Makes a linedef block or not block monsters.&lt;br /&gt;
|-&lt;br /&gt;
|| || [[SetLineActivation]] || nothing || int lineid, int activation[, int repeat] ||&lt;br /&gt;
|-&lt;br /&gt;
|| || [[SetLineSpecial]] || || ||&lt;br /&gt;
|-&lt;br /&gt;
|| || [[SetLineTexture]] || nothing || int line_id, int line_side, int sidedef_texture, str texture_name ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Sky===&lt;br /&gt;
*[[SetSkyScrollSpeed]]&lt;br /&gt;
&lt;br /&gt;
===Scripts===&lt;br /&gt;
*bool ACS_NamedExecuteAlways(str script, int map, int arg1, int arg2, int arg3)&lt;br /&gt;
:*Executes a named script, starting a new instance if one already exists. Returns true if successfully started.&lt;br /&gt;
*bool ACS_NamedExecute(str script, int map, int arg1, int arg2, int arg3)&lt;br /&gt;
:*Executes a named script. Returns true if successfully started.&lt;br /&gt;
*int ACS_NamedExecuteWithResult (string script, int s_arg1, int s_arg2, int s_arg3, int s_arg4)&lt;br /&gt;
*bool ACS_NamedSuspend (string script, int map)&lt;br /&gt;
*bool ACS_NamedTerminate (string script, int map)&lt;br /&gt;
&lt;br /&gt;
===Console===&lt;br /&gt;
*int [[GetCVar]] (str cvar)&lt;br /&gt;
*string [[GetCVarString]] (str cvar)&lt;br /&gt;
*int [[GetPlayerInput]] (int player, int input)&lt;br /&gt;
&lt;br /&gt;
===Polyobjects===&lt;br /&gt;
*[[GetPolyobjX]]&lt;br /&gt;
*[[GetPolyobjY]]&lt;br /&gt;
*[[PolyWait]]&lt;br /&gt;
*[[SetPolyobjXY]]&lt;br /&gt;
&lt;br /&gt;
===Quake===&lt;br /&gt;
*[[Radius_Quake2]]&lt;br /&gt;
&lt;br /&gt;
===Math===&lt;br /&gt;
*[[Cos]]&lt;br /&gt;
*fixed [[FixedSqrt]] (fixed number)&lt;br /&gt;
*int [[Random]] (int min, int max)&lt;br /&gt;
*int [[Sqrt]] (int number)&lt;br /&gt;
*[[Sin]]&lt;br /&gt;
*[[VectorAngle]]&lt;br /&gt;
*int [[VectorLength]] (int x, int y)&lt;br /&gt;
&lt;br /&gt;
===Strings===&lt;br /&gt;
*str StrLeft (str string, int length)&lt;br /&gt;
*str StrMid (str string, int start, int length)&lt;br /&gt;
*str StrRight (str string, int length)&lt;br /&gt;
&lt;br /&gt;
===Level state===&lt;br /&gt;
*[[GameSkill]]&lt;br /&gt;
*[[GameType]]&lt;br /&gt;
*[[GetLevelInfo]]&lt;br /&gt;
*[[SetAirControl]]&lt;br /&gt;
*[[SetAirFriction]]&lt;br /&gt;
*[[SetGravity]]&lt;br /&gt;
*[[SinglePlayer]]&lt;br /&gt;
*[[Timer]]&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
*[[Parameterized linedef specials]]&lt;br /&gt;
&lt;br /&gt;
[[Category:ACS]]&lt;br /&gt;
[[Category:Editing reference]]&lt;/div&gt;</summary>
		<author><name>Printz</name></author>
	</entry>
	<entry>
		<id>https://eternity.youfailit.net/index.php?title=GetLevelInfo&amp;diff=6515</id>
		<title>GetLevelInfo</title>
		<link rel="alternate" type="text/html" href="https://eternity.youfailit.net/index.php?title=GetLevelInfo&amp;diff=6515"/>
		<updated>2026-05-10T08:39:07Z</updated>

		<summary type="html">&lt;p&gt;Printz: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ACSFunction|description=Gets various information from level.&lt;br /&gt;
|usage=&#039;&#039;int&#039;&#039; &#039;&#039;&#039;GetLevelInfo&#039;&#039;&#039;(&#039;&#039;int type&#039;&#039;)&lt;br /&gt;
|parameters=&lt;br /&gt;
*&#039;&#039;type&#039;&#039;: one of the following:&lt;br /&gt;
:*&#039;&#039;&#039;LEVELINFO_PAR_TIME&#039;&#039;&#039; (0): par time, in seconds&lt;br /&gt;
:*&#039;&#039;&#039;LEVELINFO_CLUSTERNUM&#039;&#039;&#039; (1): episode index, in episode&lt;br /&gt;
:*&#039;&#039;&#039;LEVELINFO_LEVELNUM&#039;&#039;&#039; (2): level index, in episode&lt;br /&gt;
:*&#039;&#039;&#039;LEVELINFO_TOTAL_SECRETS&#039;&#039;&#039; (3): amount of secrets available in map&lt;br /&gt;
:*&#039;&#039;&#039;LEVELINFO_FOUND_SECRETS&#039;&#039;&#039; (4): total found secrets by all players&lt;br /&gt;
:*&#039;&#039;&#039;LEVELINFO_TOTAL_ITEMS&#039;&#039;&#039; (5): amount of [[MF_COUNTITEM]] items available in map&lt;br /&gt;
:*&#039;&#039;&#039;LEVELINFO_FOUND_ITEMS&#039;&#039;&#039; (6): total collected items by all players&lt;br /&gt;
:*&#039;&#039;&#039;LEVELINFO_TOTAL_MONSTERS&#039;&#039;&#039; (7): amount of monsters placed in map&lt;br /&gt;
:*&#039;&#039;&#039;LEVELINFO_KILLED_MONSTERS&#039;&#039;&#039; (8): total killed monsters, both by players and non-players&lt;br /&gt;
:*&#039;&#039;&#039;LEVELINFO_SUCK_TIME&#039;&#039;&#039; (9): level time in seconds after which the intermission will show &amp;quot;SUCKS&amp;quot;.&lt;br /&gt;
|return=The needed property value&lt;br /&gt;
|id=ACC internal&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Printz</name></author>
	</entry>
	<entry>
		<id>https://eternity.youfailit.net/index.php?title=GetLevelInfo&amp;diff=6514</id>
		<title>GetLevelInfo</title>
		<link rel="alternate" type="text/html" href="https://eternity.youfailit.net/index.php?title=GetLevelInfo&amp;diff=6514"/>
		<updated>2026-05-10T08:24:25Z</updated>

		<summary type="html">&lt;p&gt;Printz: Created page with &amp;quot;{{ACSFunction|description=Gets various information from level. |usage=&amp;#039;&amp;#039;int&amp;#039;&amp;#039; &amp;#039;&amp;#039;&amp;#039;GetLevelInfo&amp;#039;&amp;#039;&amp;#039;(&amp;#039;&amp;#039;int type&amp;#039;&amp;#039;) |parameters= *&amp;#039;&amp;#039;type&amp;#039;&amp;#039;: one of the following: :*&amp;#039;&amp;#039;&amp;#039;LEVELINFO_PAR_TIME&amp;#039;&amp;#039;&amp;#039; (0): par time, in seconds :*&amp;#039;&amp;#039;&amp;#039;LEVELINFO_LEVELNUM&amp;#039;&amp;#039;&amp;#039; (2): level index, in episode :*&amp;#039;&amp;#039;&amp;#039;LEVELINFO_TOTAL_SECRETS&amp;#039;&amp;#039;&amp;#039; (3): amount of secrets available in map :*&amp;#039;&amp;#039;&amp;#039;LEVELINFO_FOUND_SECRETS&amp;#039;&amp;#039;&amp;#039; (4): total found secrets by all players :*&amp;#039;&amp;#039;&amp;#039;LEVELINFO_TOTAL_ITEMS&amp;#039;&amp;#039;&amp;#039; (5): amount of MF_COUNTITEM ite...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ACSFunction|description=Gets various information from level.&lt;br /&gt;
|usage=&#039;&#039;int&#039;&#039; &#039;&#039;&#039;GetLevelInfo&#039;&#039;&#039;(&#039;&#039;int type&#039;&#039;)&lt;br /&gt;
|parameters=&lt;br /&gt;
*&#039;&#039;type&#039;&#039;: one of the following:&lt;br /&gt;
:*&#039;&#039;&#039;LEVELINFO_PAR_TIME&#039;&#039;&#039; (0): par time, in seconds&lt;br /&gt;
:*&#039;&#039;&#039;LEVELINFO_LEVELNUM&#039;&#039;&#039; (2): level index, in episode&lt;br /&gt;
:*&#039;&#039;&#039;LEVELINFO_TOTAL_SECRETS&#039;&#039;&#039; (3): amount of secrets available in map&lt;br /&gt;
:*&#039;&#039;&#039;LEVELINFO_FOUND_SECRETS&#039;&#039;&#039; (4): total found secrets by all players&lt;br /&gt;
:*&#039;&#039;&#039;LEVELINFO_TOTAL_ITEMS&#039;&#039;&#039; (5): amount of [[MF_COUNTITEM]] items available in map&lt;br /&gt;
:*&#039;&#039;&#039;LEVELINFO_FOUND_ITEMS&#039;&#039;&#039; (6): total collected items by all players&lt;br /&gt;
:*&#039;&#039;&#039;LEVELINFO_TOTAL_MONSTERS&#039;&#039;&#039; (7): amount of monsters placed in map&lt;br /&gt;
:*&#039;&#039;&#039;LEVELINFO_KILLED_MONSTERS&#039;&#039;&#039; (8): total killed monsters, both by players and non-players&lt;br /&gt;
|return=The needed property value&lt;br /&gt;
|id=ACC internal&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Printz</name></author>
	</entry>
	<entry>
		<id>https://eternity.youfailit.net/index.php?title=GetCVarString&amp;diff=6513</id>
		<title>GetCVarString</title>
		<link rel="alternate" type="text/html" href="https://eternity.youfailit.net/index.php?title=GetCVarString&amp;diff=6513"/>
		<updated>2026-05-10T08:17:43Z</updated>

		<summary type="html">&lt;p&gt;Printz: Redirected page to GetCVar&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[GetCVar]]&lt;/div&gt;</summary>
		<author><name>Printz</name></author>
	</entry>
	<entry>
		<id>https://eternity.youfailit.net/index.php?title=GetCVar&amp;diff=6512</id>
		<title>GetCVar</title>
		<link rel="alternate" type="text/html" href="https://eternity.youfailit.net/index.php?title=GetCVar&amp;diff=6512"/>
		<updated>2026-05-10T08:17:26Z</updated>

		<summary type="html">&lt;p&gt;Printz: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ACSFunction|description=Get the value of an integer or string [[console variable]].&lt;br /&gt;
|usage=&lt;br /&gt;
&#039;&#039;int&#039;&#039; &#039;&#039;&#039;GetCVar&#039;&#039;&#039;(&#039;&#039;str cvar&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;str&#039;&#039; &#039;&#039;&#039;GetCVarString&#039;&#039;&#039;(&#039;&#039;str cvar&#039;&#039;)&lt;br /&gt;
|parameters=&lt;br /&gt;
*&#039;&#039;cvar&#039;&#039;: console variable name&lt;br /&gt;
|return=The value of the console variable, or 0 if unauthorized or inexistent.&lt;br /&gt;
|notes=This only works with server variables affecting all players, otherwise it will display an error and return 0.&lt;br /&gt;
|id=ACC internal for &#039;&#039;&#039;GetCVar&#039;&#039;&#039;, -56 for &#039;&#039;&#039;GetCVarString&#039;&#039;&#039;}}&lt;/div&gt;</summary>
		<author><name>Printz</name></author>
	</entry>
	<entry>
		<id>https://eternity.youfailit.net/index.php?title=GetCVar&amp;diff=6511</id>
		<title>GetCVar</title>
		<link rel="alternate" type="text/html" href="https://eternity.youfailit.net/index.php?title=GetCVar&amp;diff=6511"/>
		<updated>2026-05-10T08:17:02Z</updated>

		<summary type="html">&lt;p&gt;Printz: Created page with &amp;quot;{{ACSFunction|description=Get the value of an integer or string console variable. |usage= &amp;#039;&amp;#039;int&amp;#039;&amp;#039; &amp;#039;&amp;#039;&amp;#039;GetCVar&amp;#039;&amp;#039;&amp;#039;(&amp;#039;&amp;#039;str cvar&amp;#039;&amp;#039;)  &amp;#039;&amp;#039;str&amp;#039;&amp;#039; &amp;#039;&amp;#039;&amp;#039;GetCVarString&amp;#039;&amp;#039;&amp;#039;(&amp;#039;&amp;#039;str cvar&amp;#039;&amp;#039;) |parameters= *&amp;#039;&amp;#039;cvar&amp;#039;&amp;#039;: console variable name |return=The value of the console variable, or 0 if unauthorized or inexistent. |notes=This only works with server variables, otherwise it will display an error and return 0. |id=ACC internal for &amp;#039;&amp;#039;&amp;#039;GetCVar&amp;#039;&amp;#039;&amp;#039;, -56 for &amp;#039;&amp;#039;&amp;#039;GetCVarString&amp;#039;&amp;#039;&amp;#039;}}&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ACSFunction|description=Get the value of an integer or string [[console variable]].&lt;br /&gt;
|usage=&lt;br /&gt;
&#039;&#039;int&#039;&#039; &#039;&#039;&#039;GetCVar&#039;&#039;&#039;(&#039;&#039;str cvar&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;str&#039;&#039; &#039;&#039;&#039;GetCVarString&#039;&#039;&#039;(&#039;&#039;str cvar&#039;&#039;)&lt;br /&gt;
|parameters=&lt;br /&gt;
*&#039;&#039;cvar&#039;&#039;: console variable name&lt;br /&gt;
|return=The value of the console variable, or 0 if unauthorized or inexistent.&lt;br /&gt;
|notes=This only works with server variables, otherwise it will display an error and return 0.&lt;br /&gt;
|id=ACC internal for &#039;&#039;&#039;GetCVar&#039;&#039;&#039;, -56 for &#039;&#039;&#039;GetCVarString&#039;&#039;&#039;}}&lt;/div&gt;</summary>
		<author><name>Printz</name></author>
	</entry>
	<entry>
		<id>https://eternity.youfailit.net/index.php?title=ACS_built-in_functions&amp;diff=6510</id>
		<title>ACS built-in functions</title>
		<link rel="alternate" type="text/html" href="https://eternity.youfailit.net/index.php?title=ACS_built-in_functions&amp;diff=6510"/>
		<updated>2026-05-10T07:14:53Z</updated>

		<summary type="html">&lt;p&gt;Printz: /* Things */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;These are predefined ACS functions with no [[parameterized linedef specials|parameterized linedef special]] equivalents, accessible only through ACS scripts.&lt;br /&gt;
&lt;br /&gt;
NOTE: most of these functions are meant to be compatible with those from ZDoom. For any ones not yet documented on this wiki, you can check the ZDoom wiki. A few of them may be incompletely implemented in Eternity. Don&#039;t hesitate to update the wiki in case of any mistakes. &lt;br /&gt;
==Special TID info==&lt;br /&gt;
For functions affecting things, some TIDs (thing tags) carry special meaning. TID 0 means the activator, and TIDs -1 ... -4 mean each of the four players in the game -- this is an Eternity extension&lt;br /&gt;
==Data type info==&lt;br /&gt;
You may see specifiers such as &#039;&#039;void&#039;&#039;, &#039;&#039;str&#039;&#039;, &#039;&#039;int&#039;&#039; and others in ACS function signatures. They act as a guide on what kinds of values are expected, but in ACS there really are only two types: &#039;&#039;&#039;str&#039;&#039;&#039; and &#039;&#039;&#039;int&#039;&#039;&#039; (and &#039;&#039;&#039;str&#039;&#039;&#039; internally is merely a string ID number). Most importantly: &lt;br /&gt;
*&#039;&#039;void&#039;&#039; means that a function should be used as a procedure (command) without returning anything,&lt;br /&gt;
*&#039;&#039;fixed&#039;&#039; means you can use the decimal point notation: 1.0 is equivalent to 65536, 1.5 to 98304 etc. In ACS, such values are still of &#039;&#039;&#039;int&#039;&#039;&#039; type, but whether you use the decimal point or not is quite relevant. A value such as 128.0 is &#039;&#039;not&#039;&#039; the same as 128: it&#039;s actually equal to 8388608 (no decimal point).&lt;br /&gt;
==Function list==&lt;br /&gt;
===Sound and music===&lt;br /&gt;
*[[ActivatorSound]]&lt;br /&gt;
*[[AmbientSound]]&lt;br /&gt;
*[[LocalAmbientSound]]&lt;br /&gt;
*[[PlayActorSound]]&lt;br /&gt;
*[[PlaySound]]&lt;br /&gt;
*[[SectorSound]]&lt;br /&gt;
*[[SetMusic]]&lt;br /&gt;
*[[LocalSetMusic]]&lt;br /&gt;
*[[SoundSequence]]&lt;br /&gt;
*[[SoundSequenceOnActor]]&lt;br /&gt;
*[[StopSound]]&lt;br /&gt;
*[[ThingSound]]&lt;br /&gt;
&lt;br /&gt;
===Sectors===&lt;br /&gt;
{|class=&amp;quot;wikitable sortable&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
||[[ChangeCeiling]]||Changes the ceiling texture.&lt;br /&gt;
|-&lt;br /&gt;
||[[ChangeFloor]]||Changes the floor texture.&lt;br /&gt;
|-&lt;br /&gt;
||[[GetSectorCeilingZ]]||Gets the ceiling height.&lt;br /&gt;
|-&lt;br /&gt;
||[[GetSectorFloorZ]]||Gets the floor height.&lt;br /&gt;
|-&lt;br /&gt;
||[[GetSectorLightLevel]]||Gets the light level.&lt;br /&gt;
|-&lt;br /&gt;
||[[SectorDamage]]||Damages things in sector.&lt;br /&gt;
|-&lt;br /&gt;
||[[SetSectorDamage]]||Modifies the damaging floor status.&lt;br /&gt;
|-&lt;br /&gt;
||[[TagWait]]||Waits for sectors to stop movement.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Things===&lt;br /&gt;
*[[ActivatorTID]]&lt;br /&gt;
*[[ChangeActorAngle]]&lt;br /&gt;
*[[ChangeActorPitch]]&lt;br /&gt;
*[[CheckActorCeilingTexture]]&lt;br /&gt;
*[[CheckActorClass]]&lt;br /&gt;
*[[CheckActorFloorTexture]]&lt;br /&gt;
*[[CheckActorProperty]]&lt;br /&gt;
*bool [[CheckFlag]](int tid, str flag)&lt;br /&gt;
:Returns true if the first thing with the given tid has the given flag enabled.&lt;br /&gt;
*[[CheckProximity]]&lt;br /&gt;
*bool [[CheckSight]](int source, int dest, int flags)&lt;br /&gt;
:Returns true if there&#039;s a line of sight between at least one thing tagged as source and one thing tagged as dest. Currently flags is reserved and must be 0.&lt;br /&gt;
*int [[ClassifyActor]](int tid)&lt;br /&gt;
:Checks the kind of thing tagged tid. It returns a set of flags, possibly combined:&lt;br /&gt;
:*ACTOR_PLAYER (2): it&#039;s player-controlled&lt;br /&gt;
:*ACTOR_VOODOODOLL (8): it&#039;s a duplicate player start, not controlled by the player but still linked to it. Used in Boom maps for advanced mapping tricks&lt;br /&gt;
:*ACTOR_MONSTER (16): it&#039;s a monster (has COUNTKILL or KILLABLE thing type flag set)&lt;br /&gt;
:*ACTOR_MISSILE (128): it&#039;s a projectile in flight (has MISSILE thing type flag set)&lt;br /&gt;
:*ACTOR_GENERIC (256): neither a monster, nor a projectile&lt;br /&gt;
:*ACTOR_ALIVE (32): has positive health&lt;br /&gt;
:*ACTOR_DEAD (64): has health &amp;lt;= 0&lt;br /&gt;
:*ACTOR_NONE (0): no thing found with this TID&lt;br /&gt;
:*ACTOR_WORLD (1): TID is 0 but activator isn&#039;t a thing&lt;br /&gt;
*[[GetActorAngle]]&lt;br /&gt;
*[[GetActorCeilingZ]]&lt;br /&gt;
*[[GetActorFloorZ]]&lt;br /&gt;
*[[GetActorLightLevel]]&lt;br /&gt;
*[[GetActorPitch]]&lt;br /&gt;
*[[GetActorProperty]]&lt;br /&gt;
*[[GetActorVelX]]&lt;br /&gt;
*[[GetActorVelY]]&lt;br /&gt;
*[[GetActorVelZ]]&lt;br /&gt;
*[[GetActorX]]&lt;br /&gt;
*[[GetActorY]]&lt;br /&gt;
*[[GetActorZ]]&lt;br /&gt;
*[[IsTIDUsed]]&lt;br /&gt;
*[[SetActivator]]&lt;br /&gt;
*[[SetActivatorToTarget]]&lt;br /&gt;
*void [[SetActorAngle]] (int tid, fixed angle)&lt;br /&gt;
*[[SetActorVelocity]]&lt;br /&gt;
*void [[SetActorPitch]] (int tid, int pitch)&lt;br /&gt;
*[[SetActorPosition]]&lt;br /&gt;
*void [[SetThingSpecial]] (int tid, int special [, int arg0 [, int arg1 [, int arg2 [, int arg3 [, int arg4]]]]])&lt;br /&gt;
*int [[SetActorState]](int tid, str statename[, bool exact]);&lt;br /&gt;
*[[SetActorProperty]]&lt;br /&gt;
*int [[Spawn]] (str classname, fixed x, fixed y, fixed z [, int tid [, int angle]])&lt;br /&gt;
*int [[SpawnForced]] (str classname, fixed x, fixed y, fixed z [, int tid [, int angle]])&lt;br /&gt;
*[[SpawnProjectile]]&lt;br /&gt;
*[[SpawnSpot]]&lt;br /&gt;
*int [[SpawnSpotFacing]] (str classname, int spottid [, int tid])&lt;br /&gt;
*[[SpawnSpotFacingForced]]&lt;br /&gt;
*[[SpawnSpotForced]]&lt;br /&gt;
*int [[ThingCount]] (int type, int tid)&lt;br /&gt;
*int [[ThingCountName]] (str classname, int tid)&lt;br /&gt;
*int [[ThingCountSector]] (int type, int tid, int tag)&lt;br /&gt;
*int [[ThingCountNameSector]] (str classname, int tid, int tag)&lt;br /&gt;
*int [[Thing_Damage2]] (int tid, int amount, str type);&lt;br /&gt;
*void [[Thing_Projectile2]] (int tid, int type, int angle, int speed, int vspeed, int gravity, int newtid)&lt;br /&gt;
*int [[UniqueTID]] ([int tid[, int limit]])&lt;br /&gt;
&lt;br /&gt;
===Player===&lt;br /&gt;
*[[CheckInventory]]&lt;br /&gt;
*[[CheckWeapon]]&lt;br /&gt;
*[[ClearInventory]]&lt;br /&gt;
*[[GetMaxInventory]]&lt;br /&gt;
*[[GetSigilPieces]]&lt;br /&gt;
*[[GetWeapon]]&lt;br /&gt;
*[[GiveInventory]]&lt;br /&gt;
*[[PlayerArmorPoints]]&lt;br /&gt;
*[[PlayerCount]]&lt;br /&gt;
*[[PlayerFrags]]&lt;br /&gt;
*[[PlayerHealth]]&lt;br /&gt;
*[[PlayerNumber]]&lt;br /&gt;
*[[SetWeapon]]&lt;br /&gt;
*[[TakeInventory]]&lt;br /&gt;
*[[UseInventory]]&lt;br /&gt;
&lt;br /&gt;
===Linedefs and sidedefs===&lt;br /&gt;
{|class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
! zspecial.acs index&lt;br /&gt;
! Name&lt;br /&gt;
! Return type&lt;br /&gt;
! Parameters&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
||internal|| [[ClearLineSpecial]] || nothing || nothing || Clears the trigger linedef&#039;s special.&lt;br /&gt;
|-&lt;br /&gt;
|| || [[GetLineRowOffset]] || || ||&lt;br /&gt;
|-&lt;br /&gt;
|| || [[GetLineX]] || || ||&lt;br /&gt;
|-&lt;br /&gt;
|| || [[GetLineY]] || || ||&lt;br /&gt;
|-&lt;br /&gt;
|| || [[LineSide]] || || ||&lt;br /&gt;
|-&lt;br /&gt;
|| || [[ReplaceTextures]] || nothing || str old_texture_name, str new_texture_name[, int flags] ||&lt;br /&gt;
|-&lt;br /&gt;
|| || [[SetLineBlocking]] || || ||&lt;br /&gt;
|-&lt;br /&gt;
||internal|| [[SetLineMonsterBlocking]] || || || Makes a linedef block or not block monsters.&lt;br /&gt;
|-&lt;br /&gt;
|| || [[SetLineActivation]] || nothing || int lineid, int activation[, int repeat] ||&lt;br /&gt;
|-&lt;br /&gt;
|| || [[SetLineSpecial]] || || ||&lt;br /&gt;
|-&lt;br /&gt;
|| || [[SetLineTexture]] || nothing || int line_id, int line_side, int sidedef_texture, str texture_name ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Sky===&lt;br /&gt;
*[[SetSkyScrollSpeed]]&lt;br /&gt;
&lt;br /&gt;
===Scripts===&lt;br /&gt;
*bool ACS_NamedExecuteAlways(str script, int map, int arg1, int arg2, int arg3)&lt;br /&gt;
:*Executes a named script, starting a new instance if one already exists. Returns true if successfully started.&lt;br /&gt;
*bool ACS_NamedExecute(str script, int map, int arg1, int arg2, int arg3)&lt;br /&gt;
:*Executes a named script. Returns true if successfully started.&lt;br /&gt;
*int ACS_NamedExecuteWithResult (string script, int s_arg1, int s_arg2, int s_arg3, int s_arg4)&lt;br /&gt;
*bool ACS_NamedSuspend (string script, int map)&lt;br /&gt;
*bool ACS_NamedTerminate (string script, int map)&lt;br /&gt;
&lt;br /&gt;
===Console===&lt;br /&gt;
*int [[GetCVar]] (str cvar)&lt;br /&gt;
*string [[GetCVarString]] (str cvar)&lt;br /&gt;
*int GetPlayerInput (int player, int input)&lt;br /&gt;
&lt;br /&gt;
===Polyobjects===&lt;br /&gt;
*[[GetPolyobjX]]&lt;br /&gt;
*[[GetPolyobjY]]&lt;br /&gt;
*[[PolyWait]]&lt;br /&gt;
*[[SetPolyobjXY]]&lt;br /&gt;
&lt;br /&gt;
===Quake===&lt;br /&gt;
*[[Radius_Quake2]]&lt;br /&gt;
&lt;br /&gt;
===Math===&lt;br /&gt;
*[[Cos]]&lt;br /&gt;
*fixed [[FixedSqrt]] (fixed number)&lt;br /&gt;
*int [[Random]] (int min, int max)&lt;br /&gt;
*int [[Sqrt]] (int number)&lt;br /&gt;
*[[Sin]]&lt;br /&gt;
*[[VectorAngle]]&lt;br /&gt;
*int [[VectorLength]] (int x, int y)&lt;br /&gt;
&lt;br /&gt;
===Strings===&lt;br /&gt;
*str StrLeft (str string, int length)&lt;br /&gt;
*str StrMid (str string, int start, int length)&lt;br /&gt;
*str StrRight (str string, int length)&lt;br /&gt;
&lt;br /&gt;
===Level state===&lt;br /&gt;
*[[GameSkill]]&lt;br /&gt;
*[[GameType]]&lt;br /&gt;
*[[GetLevelInfo]]&lt;br /&gt;
*[[SetAirControl]]&lt;br /&gt;
*[[SetAirFriction]]&lt;br /&gt;
*[[SetGravity]]&lt;br /&gt;
*[[SinglePlayer]]&lt;br /&gt;
*[[Timer]]&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
*[[Parameterized linedef specials]]&lt;br /&gt;
&lt;br /&gt;
[[Category:ACS]]&lt;br /&gt;
[[Category:Editing reference]]&lt;/div&gt;</summary>
		<author><name>Printz</name></author>
	</entry>
	<entry>
		<id>https://eternity.youfailit.net/index.php?title=FixedSqrt&amp;diff=6509</id>
		<title>FixedSqrt</title>
		<link rel="alternate" type="text/html" href="https://eternity.youfailit.net/index.php?title=FixedSqrt&amp;diff=6509"/>
		<updated>2026-05-10T07:14:14Z</updated>

		<summary type="html">&lt;p&gt;Printz: Redirected page to Sqrt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Sqrt]]&lt;/div&gt;</summary>
		<author><name>Printz</name></author>
	</entry>
</feed>