<?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=Ellmo</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=Ellmo"/>
	<link rel="alternate" type="text/html" href="https://eternity.youfailit.net/wiki/Special:Contributions/Ellmo"/>
	<updated>2026-05-05T09:43:44Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.39.2</generator>
	<entry>
		<id>https://eternity.youfailit.net/index.php?title=Polyobject&amp;diff=3430</id>
		<title>Polyobject</title>
		<link rel="alternate" type="text/html" href="https://eternity.youfailit.net/index.php?title=Polyobject&amp;diff=3430"/>
		<updated>2013-02-12T19:35:56Z</updated>

		<summary type="html">&lt;p&gt;Ellmo: &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 and ZDoom 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, unlike ZDoom, 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;
&#039;&#039;&#039;NOTE:&#039;&#039;&#039; Polyobjects must be convex, to be rendered properly.&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 1S 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;
===&#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;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;Polyobj_ExplicitLine(&#039;&#039;&#039;linedef_tag&#039;&#039;&#039;, &#039;&#039;&#039;linedef_tag&#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;linedef_tag&#039;&#039;&#039;, &#039;&#039;&#039;linedef_tag&#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;linedef_tag&#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;
[[category:Editing reference]]&lt;/div&gt;</summary>
		<author><name>Ellmo</name></author>
	</entry>
	<entry>
		<id>https://eternity.youfailit.net/index.php?title=Polyobject&amp;diff=3429</id>
		<title>Polyobject</title>
		<link rel="alternate" type="text/html" href="https://eternity.youfailit.net/index.php?title=Polyobject&amp;diff=3429"/>
		<updated>2013-02-10T18:40:03Z</updated>

		<summary type="html">&lt;p&gt;Ellmo: /* Creating PolyObjects */&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 and ZDoom 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, unlike ZDoom, 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;
{{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 1S 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;
===&#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;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;Polyobj_ExplicitLine(&#039;&#039;&#039;linedef_tag&#039;&#039;&#039;, &#039;&#039;&#039;linedef_tag&#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;linedef_tag&#039;&#039;&#039;, &#039;&#039;&#039;linedef_tag&#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;linedef_tag&#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;
[[category:Editing reference]]&lt;/div&gt;</summary>
		<author><name>Ellmo</name></author>
	</entry>
	<entry>
		<id>https://eternity.youfailit.net/index.php?title=Polyobject&amp;diff=3428</id>
		<title>Polyobject</title>
		<link rel="alternate" type="text/html" href="https://eternity.youfailit.net/index.php?title=Polyobject&amp;diff=3428"/>
		<updated>2013-02-10T18:38:44Z</updated>

		<summary type="html">&lt;p&gt;Ellmo: /* Method 2: The Polyobj_ExplicitLine Special */&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 and ZDoom 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, unlike ZDoom, 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;
{{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 1S 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;
===&#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;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&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;Polyobj_ExplicitLine(&#039;&#039;&#039;linedef_tag&#039;&#039;&#039;, &#039;&#039;&#039;linedef_tag&#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;linedef_tag&#039;&#039;&#039;, &#039;&#039;&#039;linedef_tag&#039;&#039;&#039;, &#039;&#039;&#039;mirror_id&#039;&#039;&#039;) 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;linedef_tag&#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;
[[category:Editing reference]]&lt;/div&gt;</summary>
		<author><name>Ellmo</name></author>
	</entry>
	<entry>
		<id>https://eternity.youfailit.net/index.php?title=Polyobject&amp;diff=3427</id>
		<title>Polyobject</title>
		<link rel="alternate" type="text/html" href="https://eternity.youfailit.net/index.php?title=Polyobject&amp;diff=3427"/>
		<updated>2013-02-10T18:38:05Z</updated>

		<summary type="html">&lt;p&gt;Ellmo: /* PolyObject Advanced Demo */&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 and ZDoom 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, unlike ZDoom, 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;
{{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 1S 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;
===&#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;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&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;Polyobj_ExplicitLine(&#039;&#039;&#039;linedef_tag&#039;&#039;&#039;, &#039;&#039;&#039;linedef_tag&#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 Polyobj_ExplicitLine 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;linedef_tag&#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;
[[category:Editing reference]]&lt;/div&gt;</summary>
		<author><name>Ellmo</name></author>
	</entry>
	<entry>
		<id>https://eternity.youfailit.net/index.php?title=Polyobject&amp;diff=3426</id>
		<title>Polyobject</title>
		<link rel="alternate" type="text/html" href="https://eternity.youfailit.net/index.php?title=Polyobject&amp;diff=3426"/>
		<updated>2013-02-10T18:37:11Z</updated>

		<summary type="html">&lt;p&gt;Ellmo: /* Creating PolyObjects */&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 and ZDoom 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, unlike ZDoom, 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;
{{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 1S 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;
===&#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;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&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;Polyobj_ExplicitLine(&#039;&#039;&#039;linedef_tag&#039;&#039;&#039;, &#039;&#039;&#039;linedef_tag&#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 Polyobj_ExplicitLine 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;linedef_tag&#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.&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;
[[category:Editing reference]]&lt;/div&gt;</summary>
		<author><name>Ellmo</name></author>
	</entry>
	<entry>
		<id>https://eternity.youfailit.net/index.php?title=Polyobject&amp;diff=3425</id>
		<title>Polyobject</title>
		<link rel="alternate" type="text/html" href="https://eternity.youfailit.net/index.php?title=Polyobject&amp;diff=3425"/>
		<updated>2013-02-10T18:07:38Z</updated>

		<summary type="html">&lt;p&gt;Ellmo: /* Creating PolyObjects */&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 and ZDoom 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, unlike ZDoom, 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;
{{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 1S 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;
*&#039;&#039;&#039;Method 1: The &#039;&#039;Polyobj_StartLine&#039;&#039; Special&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:The Polyobj_StartLine 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 A is assigned the Polyobj_StartLine special and has argument #1 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. &lt;br /&gt;
&lt;br /&gt;
:Starting from line A, 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 A, 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 B and C are the two required objects: &lt;br /&gt;
:* B: 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 PolyObject ID). There must be one and only one of these objects for each PolyObject ID. &lt;br /&gt;
:* C: 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 Polyobj_StartLine 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 &#039;&#039;Polyobj_ExplicitLine&#039;&#039; Special &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:The Polyobj_ExplicitLine 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 the Polyobj_ExplicitLine special, all have argument #1 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 all have argument #2 set to the integer values 1 through 4, corresponding to their labels in the diagram. &lt;br /&gt;
&lt;br /&gt;
:The game engine will search through all linedefs in the entire map for ones with the current PolyObject ID in argument #1 and a value greater than zero in argument #2. The lines will be collected and then sorted by the value in their second argument and added to the PolyObject in that order. Note that unlike Hexen, it is not necessary for the numbers in the second argument to be sequential (ie, a sequence such as { 5, 10, 15, 20 } would also work). &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 StartLine special above. &lt;br /&gt;
:* B: 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 ExplicitLines&#039; first argument (the PolyObject ID). There must be one and only one of these objects for each PolyObject ID. &lt;br /&gt;
:* C: 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 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;
:The complete arguments to Polyobj_ExplicitLine 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;number&#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.&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;
[[category:Editing reference]]&lt;/div&gt;</summary>
		<author><name>Ellmo</name></author>
	</entry>
	<entry>
		<id>https://eternity.youfailit.net/index.php?title=File:Polyobjects_basic.png&amp;diff=3424</id>
		<title>File:Polyobjects basic.png</title>
		<link rel="alternate" type="text/html" href="https://eternity.youfailit.net/index.php?title=File:Polyobjects_basic.png&amp;diff=3424"/>
		<updated>2013-02-10T18:06:29Z</updated>

		<summary type="html">&lt;p&gt;Ellmo: uploaded a new version of &amp;amp;quot;File:Polyobjects basic.png&amp;amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Ellmo</name></author>
	</entry>
	<entry>
		<id>https://eternity.youfailit.net/index.php?title=File:Polyobjects_basic.png&amp;diff=3423</id>
		<title>File:Polyobjects basic.png</title>
		<link rel="alternate" type="text/html" href="https://eternity.youfailit.net/index.php?title=File:Polyobjects_basic.png&amp;diff=3423"/>
		<updated>2013-02-10T18:05:24Z</updated>

		<summary type="html">&lt;p&gt;Ellmo: uploaded a new version of &amp;amp;quot;File:Polyobjects basic.png&amp;amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Ellmo</name></author>
	</entry>
	<entry>
		<id>https://eternity.youfailit.net/index.php?title=File:Polyobjects_adv.png&amp;diff=3422</id>
		<title>File:Polyobjects adv.png</title>
		<link rel="alternate" type="text/html" href="https://eternity.youfailit.net/index.php?title=File:Polyobjects_adv.png&amp;diff=3422"/>
		<updated>2013-02-10T18:04:31Z</updated>

		<summary type="html">&lt;p&gt;Ellmo: uploaded a new version of &amp;amp;quot;File:Polyobjects adv.png&amp;amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Ellmo</name></author>
	</entry>
	<entry>
		<id>https://eternity.youfailit.net/index.php?title=Polyobject&amp;diff=3421</id>
		<title>Polyobject</title>
		<link rel="alternate" type="text/html" href="https://eternity.youfailit.net/index.php?title=Polyobject&amp;diff=3421"/>
		<updated>2013-02-10T17:51:48Z</updated>

		<summary type="html">&lt;p&gt;Ellmo: /* PolyObject Advanced Demo */&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 and ZDoom 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, unlike ZDoom, 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;
{{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 1S 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;
*&#039;&#039;&#039;Method 1: The &#039;&#039;Polyobj_StartLine&#039;&#039; Special&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:The Polyobj_StartLine 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;
    [Control Sector]                     [Main Map Area]&lt;br /&gt;
    +-------------------+          +-------------------------------+&lt;br /&gt;
    |                   |          |                               |&lt;br /&gt;
    |        |          |          |                               |&lt;br /&gt;
    |      +---&amp;gt;+       |          |                               |&lt;br /&gt;
    |      ^    |       |          |                               |&lt;br /&gt;
    |      |    |_      |          |                               |&lt;br /&gt;
    |   A -| B  |       |          |              C                |&lt;br /&gt;
    |      |    v       |          |                               |&lt;br /&gt;
    |      +&amp;lt;---+       |          |                               |&lt;br /&gt;
    |         |         |          |                               |&lt;br /&gt;
    |                   |          |                               |&lt;br /&gt;
    +-------------------+          +-------------------------------+&lt;br /&gt;
:Assume that the linedef A is assigned the Polyobj_StartLine special and has argument #1 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. &lt;br /&gt;
&lt;br /&gt;
:Starting from line A, 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 A, 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 B and C are the two required objects: &lt;br /&gt;
:* B: 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 PolyObject ID). There must be one and only one of these objects for each PolyObject ID. &lt;br /&gt;
:* C: 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 Polyobj_StartLine 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 &#039;&#039;Polyobj_ExplicitLine&#039;&#039; Special &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:The Polyobj_ExplicitLine 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;
    [Control Sector]                     [Main Map Area]&lt;br /&gt;
    +-------------------+          +-------------------------------+&lt;br /&gt;
    |        2          |          |                               |&lt;br /&gt;
    |        |          |          |                               |&lt;br /&gt;
    |      +---&amp;gt;+       |          |                               |&lt;br /&gt;
    |      ^    |       |          |                               |&lt;br /&gt;
    |      |    |_ 4    |          |                               |&lt;br /&gt;
    |   1 -| B  |       |          |              C                |&lt;br /&gt;
    |      |    v       |          |                               |&lt;br /&gt;
    |      +&amp;lt;---+       |          |                               |&lt;br /&gt;
    |         |         |          |                               |&lt;br /&gt;
    |         3         |          |                               |&lt;br /&gt;
    +-------------------+          +-------------------------------+&lt;br /&gt;
:Assume that the linedefs labeled 1 through 4 are assigned the Polyobj_ExplicitLine special, all have argument #1 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 all have argument #2 set to the integer values 1 through 4, corresponding to their labels in the diagram. &lt;br /&gt;
&lt;br /&gt;
:The game engine will search through all linedefs in the entire map for ones with the current PolyObject ID in argument #1 and a value greater than zero in argument #2. The lines will be collected and then sorted by the value in their second argument and added to the PolyObject in that order. Note that unlike Hexen, it is not necessary for the numbers in the second argument to be sequential (ie, a sequence such as { 5, 10, 15, 20 } would also work). &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 StartLine special above. &lt;br /&gt;
:* B: 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 ExplicitLines&#039; first argument (the PolyObject ID). There must be one and only one of these objects for each PolyObject ID. &lt;br /&gt;
:* C: 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 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;
:The complete arguments to Polyobj_ExplicitLine 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;number&#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.&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;
[[category:Editing reference]]&lt;/div&gt;</summary>
		<author><name>Ellmo</name></author>
	</entry>
	<entry>
		<id>https://eternity.youfailit.net/index.php?title=Polyobject&amp;diff=3420</id>
		<title>Polyobject</title>
		<link rel="alternate" type="text/html" href="https://eternity.youfailit.net/index.php?title=Polyobject&amp;diff=3420"/>
		<updated>2013-02-10T17:51:16Z</updated>

		<summary type="html">&lt;p&gt;Ellmo: /* https://s3-eu-west-1.amazonaws.com/eternity/polyobjects_adv.wad PolyObject Advanced Demo */&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 and ZDoom 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, unlike ZDoom, 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;
{{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 1S 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;
*&#039;&#039;&#039;Method 1: The &#039;&#039;Polyobj_StartLine&#039;&#039; Special&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:The Polyobj_StartLine 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;
    [Control Sector]                     [Main Map Area]&lt;br /&gt;
    +-------------------+          +-------------------------------+&lt;br /&gt;
    |                   |          |                               |&lt;br /&gt;
    |        |          |          |                               |&lt;br /&gt;
    |      +---&amp;gt;+       |          |                               |&lt;br /&gt;
    |      ^    |       |          |                               |&lt;br /&gt;
    |      |    |_      |          |                               |&lt;br /&gt;
    |   A -| B  |       |          |              C                |&lt;br /&gt;
    |      |    v       |          |                               |&lt;br /&gt;
    |      +&amp;lt;---+       |          |                               |&lt;br /&gt;
    |         |         |          |                               |&lt;br /&gt;
    |                   |          |                               |&lt;br /&gt;
    +-------------------+          +-------------------------------+&lt;br /&gt;
:Assume that the linedef A is assigned the Polyobj_StartLine special and has argument #1 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. &lt;br /&gt;
&lt;br /&gt;
:Starting from line A, 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 A, 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 B and C are the two required objects: &lt;br /&gt;
:* B: 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 PolyObject ID). There must be one and only one of these objects for each PolyObject ID. &lt;br /&gt;
:* C: 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 Polyobj_StartLine 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 &#039;&#039;Polyobj_ExplicitLine&#039;&#039; Special &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:The Polyobj_ExplicitLine 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;
    [Control Sector]                     [Main Map Area]&lt;br /&gt;
    +-------------------+          +-------------------------------+&lt;br /&gt;
    |        2          |          |                               |&lt;br /&gt;
    |        |          |          |                               |&lt;br /&gt;
    |      +---&amp;gt;+       |          |                               |&lt;br /&gt;
    |      ^    |       |          |                               |&lt;br /&gt;
    |      |    |_ 4    |          |                               |&lt;br /&gt;
    |   1 -| B  |       |          |              C                |&lt;br /&gt;
    |      |    v       |          |                               |&lt;br /&gt;
    |      +&amp;lt;---+       |          |                               |&lt;br /&gt;
    |         |         |          |                               |&lt;br /&gt;
    |         3         |          |                               |&lt;br /&gt;
    +-------------------+          +-------------------------------+&lt;br /&gt;
:Assume that the linedefs labeled 1 through 4 are assigned the Polyobj_ExplicitLine special, all have argument #1 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 all have argument #2 set to the integer values 1 through 4, corresponding to their labels in the diagram. &lt;br /&gt;
&lt;br /&gt;
:The game engine will search through all linedefs in the entire map for ones with the current PolyObject ID in argument #1 and a value greater than zero in argument #2. The lines will be collected and then sorted by the value in their second argument and added to the PolyObject in that order. Note that unlike Hexen, it is not necessary for the numbers in the second argument to be sequential (ie, a sequence such as { 5, 10, 15, 20 } would also work). &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 StartLine special above. &lt;br /&gt;
:* B: 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 ExplicitLines&#039; first argument (the PolyObject ID). There must be one and only one of these objects for each PolyObject ID. &lt;br /&gt;
:* C: 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 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;
:The complete arguments to Polyobj_ExplicitLine 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;number&#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.&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;
[[category:Editing reference]]&lt;/div&gt;</summary>
		<author><name>Ellmo</name></author>
	</entry>
	<entry>
		<id>https://eternity.youfailit.net/index.php?title=Polyobject&amp;diff=3419</id>
		<title>Polyobject</title>
		<link rel="alternate" type="text/html" href="https://eternity.youfailit.net/index.php?title=Polyobject&amp;diff=3419"/>
		<updated>2013-02-10T17:50:43Z</updated>

		<summary type="html">&lt;p&gt;Ellmo: /* PolyObject Examples */&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 and ZDoom 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, unlike ZDoom, 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;
{{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 1S 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;
*&#039;&#039;&#039;Method 1: The &#039;&#039;Polyobj_StartLine&#039;&#039; Special&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:The Polyobj_StartLine 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;
    [Control Sector]                     [Main Map Area]&lt;br /&gt;
    +-------------------+          +-------------------------------+&lt;br /&gt;
    |                   |          |                               |&lt;br /&gt;
    |        |          |          |                               |&lt;br /&gt;
    |      +---&amp;gt;+       |          |                               |&lt;br /&gt;
    |      ^    |       |          |                               |&lt;br /&gt;
    |      |    |_      |          |                               |&lt;br /&gt;
    |   A -| B  |       |          |              C                |&lt;br /&gt;
    |      |    v       |          |                               |&lt;br /&gt;
    |      +&amp;lt;---+       |          |                               |&lt;br /&gt;
    |         |         |          |                               |&lt;br /&gt;
    |                   |          |                               |&lt;br /&gt;
    +-------------------+          +-------------------------------+&lt;br /&gt;
:Assume that the linedef A is assigned the Polyobj_StartLine special and has argument #1 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. &lt;br /&gt;
&lt;br /&gt;
:Starting from line A, 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 A, 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 B and C are the two required objects: &lt;br /&gt;
:* B: 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 PolyObject ID). There must be one and only one of these objects for each PolyObject ID. &lt;br /&gt;
:* C: 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 Polyobj_StartLine 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 &#039;&#039;Polyobj_ExplicitLine&#039;&#039; Special &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:The Polyobj_ExplicitLine 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;
    [Control Sector]                     [Main Map Area]&lt;br /&gt;
    +-------------------+          +-------------------------------+&lt;br /&gt;
    |        2          |          |                               |&lt;br /&gt;
    |        |          |          |                               |&lt;br /&gt;
    |      +---&amp;gt;+       |          |                               |&lt;br /&gt;
    |      ^    |       |          |                               |&lt;br /&gt;
    |      |    |_ 4    |          |                               |&lt;br /&gt;
    |   1 -| B  |       |          |              C                |&lt;br /&gt;
    |      |    v       |          |                               |&lt;br /&gt;
    |      +&amp;lt;---+       |          |                               |&lt;br /&gt;
    |         |         |          |                               |&lt;br /&gt;
    |         3         |          |                               |&lt;br /&gt;
    +-------------------+          +-------------------------------+&lt;br /&gt;
:Assume that the linedefs labeled 1 through 4 are assigned the Polyobj_ExplicitLine special, all have argument #1 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 all have argument #2 set to the integer values 1 through 4, corresponding to their labels in the diagram. &lt;br /&gt;
&lt;br /&gt;
:The game engine will search through all linedefs in the entire map for ones with the current PolyObject ID in argument #1 and a value greater than zero in argument #2. The lines will be collected and then sorted by the value in their second argument and added to the PolyObject in that order. Note that unlike Hexen, it is not necessary for the numbers in the second argument to be sequential (ie, a sequence such as { 5, 10, 15, 20 } would also work). &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 StartLine special above. &lt;br /&gt;
:* B: 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 ExplicitLines&#039; first argument (the PolyObject ID). There must be one and only one of these objects for each PolyObject ID. &lt;br /&gt;
:* C: 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 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;
:The complete arguments to Polyobj_ExplicitLine 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;number&#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.&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;
[[category:Editing reference]]&lt;/div&gt;</summary>
		<author><name>Ellmo</name></author>
	</entry>
	<entry>
		<id>https://eternity.youfailit.net/index.php?title=File:Polyobjects_adv.png&amp;diff=3418</id>
		<title>File:Polyobjects adv.png</title>
		<link rel="alternate" type="text/html" href="https://eternity.youfailit.net/index.php?title=File:Polyobjects_adv.png&amp;diff=3418"/>
		<updated>2013-02-10T17:48:35Z</updated>

		<summary type="html">&lt;p&gt;Ellmo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Ellmo</name></author>
	</entry>
	<entry>
		<id>https://eternity.youfailit.net/index.php?title=File:Polyobjects_basic.png&amp;diff=3417</id>
		<title>File:Polyobjects basic.png</title>
		<link rel="alternate" type="text/html" href="https://eternity.youfailit.net/index.php?title=File:Polyobjects_basic.png&amp;diff=3417"/>
		<updated>2013-02-10T17:47:11Z</updated>

		<summary type="html">&lt;p&gt;Ellmo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Ellmo</name></author>
	</entry>
	<entry>
		<id>https://eternity.youfailit.net/index.php?title=Linked_portal&amp;diff=3416</id>
		<title>Linked portal</title>
		<link rel="alternate" type="text/html" href="https://eternity.youfailit.net/index.php?title=Linked_portal&amp;diff=3416"/>
		<updated>2013-02-10T01:15:57Z</updated>

		<summary type="html">&lt;p&gt;Ellmo: /* demo file */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Linked portals&#039;&#039;&#039; are a powerful feature which make it possible to connect two separate areas of a map via the floor/ceiling or one-sided linedefs, allowing the player to see, shoot, and even move seamlessly from one area into another. They are used similarly to two-way portals, apart from the fact that you can pass through them. They can be used to create 3D architecture and room-over-room effects, with very few limitations.&lt;br /&gt;
{{backto|Portal linedef types}}&lt;br /&gt;
&lt;br /&gt;
==Screenshots==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [[File:Linked_portals_bottom.png|320px]] || [[File:Linked_portals_top.png|320px]]&lt;br /&gt;
|-&lt;br /&gt;
| View from the bottom room || View from the top room.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Line triggers==&lt;br /&gt;
 #     Class  Trig Description&lt;br /&gt;
 &lt;br /&gt;
 358   Ext    --   Apply linked portal to like-tagged ceilings&lt;br /&gt;
 &lt;br /&gt;
 359   Ext    --   Apply linked portal to like-tagged floors&lt;br /&gt;
 &lt;br /&gt;
 360   Ext    --   Linked portal anchor line for special 358&lt;br /&gt;
 &lt;br /&gt;
 361   Ext    --   Linked portal anchor line for special 359&lt;br /&gt;
 &lt;br /&gt;
 376   Ext    --   Apply linked portals to like-tagged lines&lt;br /&gt;
 &lt;br /&gt;
 377   Ext    --   Anchor line for special 376&lt;br /&gt;
 &lt;br /&gt;
 385   Ext    --   Apply portal to front sector&lt;br /&gt;
&lt;br /&gt;
==Terminology==&lt;br /&gt;
Linked portals have their own specific sub-set of terminology used to describe certain aspects and behaviors.&lt;br /&gt;
&lt;br /&gt;
===Portal Plane===&lt;br /&gt;
Unlike the basic portal types, which were rendered and could cover height variances (much like the doom sky), linked portals form an actual map structure. The &#039;&#039;&#039;Portal Plane&#039;&#039;&#039; refers to an X/Y plane that bisects the sector(s) that contain the portal. The z-position of the portal is fixed, and should be the same height on both sides of the linked portal.&lt;br /&gt;
&lt;br /&gt;
===Beyond the Plane===&lt;br /&gt;
Map architecture is said to be beyond the portal plane when its vertical height is equal to or beyond the portal height--that is, at or above a ceiling portal plane or at or below a floor portal plane. When map architecture is beyond a portal plane, the portal will display at the height of the plane.&lt;br /&gt;
&lt;br /&gt;
===Inside the plane===&lt;br /&gt;
Map architecture is said to be inside the portal plane when its vertical height is not beyond the portal plane--that is, below a ceiling portal or above a floor portal. Any architecture that is inside the portal plane will render normally and will obscure rendering of the portal.&lt;br /&gt;
&lt;br /&gt;
==Usage==&lt;br /&gt;
Linked portals use trigger and anchor lines (much like anchored portals) to determine an X and Y offset from one part of the map to another, but there are specific requirements unique to linked portals:&lt;br /&gt;
&lt;br /&gt;
*Linked portals must be two-way, meaning the upper area must reference the lower area and vice versa.&lt;br /&gt;
*Linked portals have specific behavior relating to z-coordinates of the portal plane.&lt;br /&gt;
&lt;br /&gt;
==Setup==&lt;br /&gt;
&lt;br /&gt;
There are two kinds of linked portals: plane portals and line portals. Plane portals are sector floor or ceiling surfaces that vertically connect different sector groups (layers) of the map. Line portals are linedefs that connect areas horizontally.&lt;br /&gt;
&lt;br /&gt;
===Setting up plane portals===&lt;br /&gt;
There must be (at least) two sectors in the map, not linked together by any path (similar to how disjoint areas exist in classic Doom maps and are gameplay-connected only by teleporters).&lt;br /&gt;
&lt;br /&gt;
The ceiling height of one of them must match the floor height of the other. Let&#039;s call the bottom sector A and the top sector B.&lt;br /&gt;
&lt;br /&gt;
Even though the sectors need to have the same outline, they can have different detail inner sectors in them. For example, sector A can have several crate sectors whose outlines don&#039;t need to be copied into upper sector B, which has much less detail. Note that one-sided linedef walls inside sectors (e.g. columns) must have their outlines copied.&lt;br /&gt;
&lt;br /&gt;
Reserve two linedefs for each sector. Make sure the two linedefs selected for sector A will have the same relative coordinates and sizes as the two corresponding linedefs from B.&lt;br /&gt;
&lt;br /&gt;
Tag sector A and its inner details with a number. Tag B and its details with another number.&lt;br /&gt;
&lt;br /&gt;
Give the reserved linedefs from A special 359, tag of B and special 360, tag of A respectively. Give the reserved linedefs from B special 358, tag of A and special 361, tag of B respectively. Here is how they should correspond:&lt;br /&gt;
&lt;br /&gt;
* Reserved linedef 1 of sector A: special 359, tag B (Apply linked portal to floor of B)&lt;br /&gt;
* Reserved linedef 1 of sector B: special 361, tag B (Linked portal anchor line for special 359)&lt;br /&gt;
* Reserved linedef 2 of sector A: special 360, tag A (Linked portal anchor line for special 358)&lt;br /&gt;
* Reserved linedef 2 of sector B: special 358, tag A (Apply linked portal to ceiling of A)&lt;br /&gt;
&lt;br /&gt;
Note that with this implementation, you&#039;ll have to give a tag to every sector which needs a portal. Sometimes this is not practical, because you may want to make various sectors with special effects within A or B. To bypass this problem, you can tag the special sector differently, but one of the linedefs facing it must have special 385 (Apply portal to front sector) and have the tag of the non-special sectors that surround it (A or B). This will copy the portal information into the special sector.&lt;br /&gt;
&lt;br /&gt;
Here is a diagram on how to set up:&lt;br /&gt;
&lt;br /&gt;
 :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::&lt;br /&gt;
 -----------------x---------------------x:::::::::::::      ~-------------------x---------------------x:::::::::::::::::::&lt;br /&gt;
                 /                       \::::::::::::      ~ Neighbour        /                       \::::::::::::::::::&lt;br /&gt;
  Neighbour     /         SECTOR A        \::::::::::       ~ sector of       /         SECTOR B        \:::::::::::::::::&lt;br /&gt;
  sector of    /  x----x             floor \:::::::::       ~ B              /  x----x                   \::::::::::::::::&lt;br /&gt;
  A           /   |::::|             detail \::::::::       ~ (not tagged)  /   |    |                    \:::::::::::::::&lt;br /&gt;
  (untagged) /    |::::|wall         x---x   \:::::::       ~              /    |    |top of wall from A   \::::::::::::::&lt;br /&gt;
 -----------x     x----x             |   |    x:::::::::    ~-------------x     x----x &amp;lt;NOT tagged          x:::::::::::::&lt;br /&gt;
 ::::::::::::\                       x---x   /:::::::::::::::::::::::::::::\                               /::::::::::::::&lt;br /&gt;
 :::::::::::::\    x---x-----x same tag as^ /:::::::::::::::::::::::::::::::\     x-------------x         /:::::::::::::::&lt;br /&gt;
 ::::::::::::::\    \   \    | &amp;lt;  A        x:::::::::::::::::::::::::::::::::\    x-------------x        x::::::::::::::::&lt;br /&gt;
 :::::::::::::::\    x---x---x            /360,A::::::::::::::::::::::::::::::\ ceil. detail            /358,A::::::::::::&lt;br /&gt;
 ::::::::::::::::\ flr.detail    359,B   /:::::::::::::::::::::::::::::::::::::\ tag of B      361,B   /::::::::::::::::::&lt;br /&gt;
 :::::::::::::::::x-------------x-------x:::::::::::::::::::::::::::::::::::::::x-------------x-------x:::::::::::::::::::&lt;br /&gt;
 :::::::::::::::::::::::::::::::::THE PORTAL LINEDEFS:::::::::::::::::::::::::::::::::::::::::THE PORTAL LINEDEFS:::::::::&lt;br /&gt;
&lt;br /&gt;
===Setting up wall portals===&lt;br /&gt;
Wall portals are slightly simpler to implement. The two separate sectors must have the same floor and ceiling heights and the portal linedefs need to be of the same length and angle. They must also be two-sided, passable and have a buffer sector behind them, with enough depth so the portal is walkable by the intended actors (so they don&#039;t bump into the back wall of the buffer sector).&lt;br /&gt;
&lt;br /&gt;
The two linedefs will have the 376 and 377 specials (respectively, order not being important) and a common tag (which doesn&#039;t have to belong to any sector).&lt;br /&gt;
&lt;br /&gt;
Note that to render correctly, the buffer sectors behind them will need to have different light levels from the one in front of them. If the portal works correctly, they will never be visible during the game, and won&#039;t be accessible unless the user activates no-clipping mode.&lt;br /&gt;
&lt;br /&gt;
Here is a diagram on how to set up:&lt;br /&gt;
&lt;br /&gt;
 ----------x &amp;lt;----main area sectors---------&amp;gt;    x---------&lt;br /&gt;
           |        Visible            x---------x&lt;br /&gt;
           |                           |         |&lt;br /&gt;
           |                           |         |&amp;lt;linedef B&lt;br /&gt;
           x-------x                   |         | type 377&lt;br /&gt;
 linedef A&amp;gt;|       |&amp;lt;-buffer sectors-&amp;gt; |         | tag n&lt;br /&gt;
 type 376  |       |                   x---------x&lt;br /&gt;
 tag n     |       |  Never visible in-game      |&lt;br /&gt;
           |       |  but wide enough to fit     |&lt;br /&gt;
 ----------x-------x  walking objects            x---------&lt;br /&gt;
                      Set their light levels to different values from neighbouring main area sectors&lt;br /&gt;
&lt;br /&gt;
===Lifts between plane portals===&lt;br /&gt;
&lt;br /&gt;
You can make the floor or ceiling of a sector move from a sector group (layer) to another by using the [[Attached surface linedef types]].&lt;br /&gt;
&lt;br /&gt;
==Caveats and limitations==&lt;br /&gt;
* Linked areas must have corresponding floor or ceiling heights. It&#039;s not possible to look and move into an area with different Z coordinates.&lt;br /&gt;
* It is possible to make &amp;quot;impossible&amp;quot; structures, both with plane and line portals, but note that Eternity will attempt to render any scene relative to viewer&#039;s coordinates when looking at the portal, including any unrelated sectors placed at the same XY coordinates as the &amp;quot;virtual&amp;quot; tunnel. This undesired effect can be reduced by setting up the layout of the map properly.&lt;br /&gt;
* An &amp;quot;infinite&amp;quot; tunnel can be created, but it must consist of at least three sector groups in a cycle, as well as avoiding any visibility glitches mentioned in the previous point.&lt;br /&gt;
The following four points are valid because linked portals as a reliable feature are not fully implemented, but have been made available to the user, or for experimentation:&lt;br /&gt;
* Currently the hitscan traversal through portals is not implemented, which means that bullet attacks will be stopped, monsters will not be able to see you etc. The monsters will be able to hear and follow you through the portal however, and projectiles will pass through.&lt;br /&gt;
* Currently, an actor standing between two layers separated by a plane portal will jump repeatedly between the two areas and have difficulty walking.&lt;br /&gt;
* Currently sprites aren&#039;t seamlessly rendered through portals, appearing cut off by the portal plane.&lt;br /&gt;
* Currently, moving through portals can result in objects getting stuck, telefragged etc. Previously it was a hazard to the player too, as anything could telefrag, but it has been changed to be less hazardous.&lt;br /&gt;
Regardless, it is still possible to make convincing levels with linked portals even at their current state, as long as you make sure that major combat scenes will not take place between portals. Flying monsters can still follow the player through portals, so they have an advantage.&lt;br /&gt;
&lt;br /&gt;
==Tutorial==&lt;br /&gt;
Refer to Zarkyb&#039;s [[linked portals tutorial]] for more examples on usage.&lt;br /&gt;
&lt;br /&gt;
==Examples==&lt;br /&gt;
===[https://s3-eu-west-1.amazonaws.com/eternity/linked_port.wad Linked Portals Demo]===&lt;br /&gt;
a demonstration of both plane and wall portals.&lt;br /&gt;
Played on &#039;&#039;&#039;Doom2&#039;&#039;&#039; / &#039;&#039;&#039;Map01&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Things to note:&lt;br /&gt;
&lt;br /&gt;
* In compatibility menu the option &#039;&#039;&#039;actors have infinite height&#039;&#039;&#039; needs to be set to &#039;&#039;&#039;false&#039;&#039;&#039; in order for any actor to fall through a portal.&lt;br /&gt;
* The &amp;quot;upper part&amp;quot; is textured differently from the &amp;quot;lower part&amp;quot;. While in game observe when textures change and where exactly the clipping occurs.&lt;br /&gt;
* The lower room has a different shape than the room upstairs. Only the tagged, corresponding sectors which make up a &amp;quot;hole&amp;quot; have to be shaped alike.&lt;br /&gt;
* Any LineDef that copies floor / ceiling requires an appropriate &#039;&#039;&#039;Anchor&#039;&#039;&#039; action on correspodning LineDef in the copied sector. E.g. should the action &#039;&#039;&#039;special: 360; tag: 1&#039;&#039;&#039; be cleared from where it is and set on any other LineDef, you&#039;d get clipping errors, HoM effects or the renderer would simply refuse to connect portals.&lt;br /&gt;
* When viewing automap notice how position is updated. Player doesn&#039;t seem to &amp;quot;teleport&amp;quot; from one place of the map to another, yet his X/Y coordinates change when passing a portal boundary.&lt;br /&gt;
* Use console commands like &#039;&#039;&#039;spawn doomimp&#039;&#039;&#039; to test how monsters see, hear and aim through portals.&lt;br /&gt;
* Use console command &#039;&#039;&#039;fly&#039;&#039;&#039; to test that you can indeed cross portals from both sides of the &amp;quot;hole&amp;quot;.&lt;br /&gt;
* When viewing through map editor note that there&#039;s no sector tagged with a &#039;&#039;&#039;3&#039;&#039;&#039; (tag used to link wall portals). Wall portals clipping is based on LineDefs, not sectors.&lt;br /&gt;
&lt;br /&gt;
[[File:Linked_portals.png]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Editing]]&lt;br /&gt;
[[Category:Editing reference]]&lt;/div&gt;</summary>
		<author><name>Ellmo</name></author>
	</entry>
	<entry>
		<id>https://eternity.youfailit.net/index.php?title=Linked_portal&amp;diff=3415</id>
		<title>Linked portal</title>
		<link rel="alternate" type="text/html" href="https://eternity.youfailit.net/index.php?title=Linked_portal&amp;diff=3415"/>
		<updated>2013-02-10T01:15:33Z</updated>

		<summary type="html">&lt;p&gt;Ellmo: /* Examples */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Linked portals&#039;&#039;&#039; are a powerful feature which make it possible to connect two separate areas of a map via the floor/ceiling or one-sided linedefs, allowing the player to see, shoot, and even move seamlessly from one area into another. They are used similarly to two-way portals, apart from the fact that you can pass through them. They can be used to create 3D architecture and room-over-room effects, with very few limitations.&lt;br /&gt;
{{backto|Portal linedef types}}&lt;br /&gt;
&lt;br /&gt;
==Screenshots==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [[File:Linked_portals_bottom.png|320px]] || [[File:Linked_portals_top.png|320px]]&lt;br /&gt;
|-&lt;br /&gt;
| View from the bottom room || View from the top room.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Line triggers==&lt;br /&gt;
 #     Class  Trig Description&lt;br /&gt;
 &lt;br /&gt;
 358   Ext    --   Apply linked portal to like-tagged ceilings&lt;br /&gt;
 &lt;br /&gt;
 359   Ext    --   Apply linked portal to like-tagged floors&lt;br /&gt;
 &lt;br /&gt;
 360   Ext    --   Linked portal anchor line for special 358&lt;br /&gt;
 &lt;br /&gt;
 361   Ext    --   Linked portal anchor line for special 359&lt;br /&gt;
 &lt;br /&gt;
 376   Ext    --   Apply linked portals to like-tagged lines&lt;br /&gt;
 &lt;br /&gt;
 377   Ext    --   Anchor line for special 376&lt;br /&gt;
 &lt;br /&gt;
 385   Ext    --   Apply portal to front sector&lt;br /&gt;
&lt;br /&gt;
==Terminology==&lt;br /&gt;
Linked portals have their own specific sub-set of terminology used to describe certain aspects and behaviors.&lt;br /&gt;
&lt;br /&gt;
===Portal Plane===&lt;br /&gt;
Unlike the basic portal types, which were rendered and could cover height variances (much like the doom sky), linked portals form an actual map structure. The &#039;&#039;&#039;Portal Plane&#039;&#039;&#039; refers to an X/Y plane that bisects the sector(s) that contain the portal. The z-position of the portal is fixed, and should be the same height on both sides of the linked portal.&lt;br /&gt;
&lt;br /&gt;
===Beyond the Plane===&lt;br /&gt;
Map architecture is said to be beyond the portal plane when its vertical height is equal to or beyond the portal height--that is, at or above a ceiling portal plane or at or below a floor portal plane. When map architecture is beyond a portal plane, the portal will display at the height of the plane.&lt;br /&gt;
&lt;br /&gt;
===Inside the plane===&lt;br /&gt;
Map architecture is said to be inside the portal plane when its vertical height is not beyond the portal plane--that is, below a ceiling portal or above a floor portal. Any architecture that is inside the portal plane will render normally and will obscure rendering of the portal.&lt;br /&gt;
&lt;br /&gt;
==Usage==&lt;br /&gt;
Linked portals use trigger and anchor lines (much like anchored portals) to determine an X and Y offset from one part of the map to another, but there are specific requirements unique to linked portals:&lt;br /&gt;
&lt;br /&gt;
*Linked portals must be two-way, meaning the upper area must reference the lower area and vice versa.&lt;br /&gt;
*Linked portals have specific behavior relating to z-coordinates of the portal plane.&lt;br /&gt;
&lt;br /&gt;
==Setup==&lt;br /&gt;
&lt;br /&gt;
There are two kinds of linked portals: plane portals and line portals. Plane portals are sector floor or ceiling surfaces that vertically connect different sector groups (layers) of the map. Line portals are linedefs that connect areas horizontally.&lt;br /&gt;
&lt;br /&gt;
===Setting up plane portals===&lt;br /&gt;
There must be (at least) two sectors in the map, not linked together by any path (similar to how disjoint areas exist in classic Doom maps and are gameplay-connected only by teleporters).&lt;br /&gt;
&lt;br /&gt;
The ceiling height of one of them must match the floor height of the other. Let&#039;s call the bottom sector A and the top sector B.&lt;br /&gt;
&lt;br /&gt;
Even though the sectors need to have the same outline, they can have different detail inner sectors in them. For example, sector A can have several crate sectors whose outlines don&#039;t need to be copied into upper sector B, which has much less detail. Note that one-sided linedef walls inside sectors (e.g. columns) must have their outlines copied.&lt;br /&gt;
&lt;br /&gt;
Reserve two linedefs for each sector. Make sure the two linedefs selected for sector A will have the same relative coordinates and sizes as the two corresponding linedefs from B.&lt;br /&gt;
&lt;br /&gt;
Tag sector A and its inner details with a number. Tag B and its details with another number.&lt;br /&gt;
&lt;br /&gt;
Give the reserved linedefs from A special 359, tag of B and special 360, tag of A respectively. Give the reserved linedefs from B special 358, tag of A and special 361, tag of B respectively. Here is how they should correspond:&lt;br /&gt;
&lt;br /&gt;
* Reserved linedef 1 of sector A: special 359, tag B (Apply linked portal to floor of B)&lt;br /&gt;
* Reserved linedef 1 of sector B: special 361, tag B (Linked portal anchor line for special 359)&lt;br /&gt;
* Reserved linedef 2 of sector A: special 360, tag A (Linked portal anchor line for special 358)&lt;br /&gt;
* Reserved linedef 2 of sector B: special 358, tag A (Apply linked portal to ceiling of A)&lt;br /&gt;
&lt;br /&gt;
Note that with this implementation, you&#039;ll have to give a tag to every sector which needs a portal. Sometimes this is not practical, because you may want to make various sectors with special effects within A or B. To bypass this problem, you can tag the special sector differently, but one of the linedefs facing it must have special 385 (Apply portal to front sector) and have the tag of the non-special sectors that surround it (A or B). This will copy the portal information into the special sector.&lt;br /&gt;
&lt;br /&gt;
Here is a diagram on how to set up:&lt;br /&gt;
&lt;br /&gt;
 :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::&lt;br /&gt;
 -----------------x---------------------x:::::::::::::      ~-------------------x---------------------x:::::::::::::::::::&lt;br /&gt;
                 /                       \::::::::::::      ~ Neighbour        /                       \::::::::::::::::::&lt;br /&gt;
  Neighbour     /         SECTOR A        \::::::::::       ~ sector of       /         SECTOR B        \:::::::::::::::::&lt;br /&gt;
  sector of    /  x----x             floor \:::::::::       ~ B              /  x----x                   \::::::::::::::::&lt;br /&gt;
  A           /   |::::|             detail \::::::::       ~ (not tagged)  /   |    |                    \:::::::::::::::&lt;br /&gt;
  (untagged) /    |::::|wall         x---x   \:::::::       ~              /    |    |top of wall from A   \::::::::::::::&lt;br /&gt;
 -----------x     x----x             |   |    x:::::::::    ~-------------x     x----x &amp;lt;NOT tagged          x:::::::::::::&lt;br /&gt;
 ::::::::::::\                       x---x   /:::::::::::::::::::::::::::::\                               /::::::::::::::&lt;br /&gt;
 :::::::::::::\    x---x-----x same tag as^ /:::::::::::::::::::::::::::::::\     x-------------x         /:::::::::::::::&lt;br /&gt;
 ::::::::::::::\    \   \    | &amp;lt;  A        x:::::::::::::::::::::::::::::::::\    x-------------x        x::::::::::::::::&lt;br /&gt;
 :::::::::::::::\    x---x---x            /360,A::::::::::::::::::::::::::::::\ ceil. detail            /358,A::::::::::::&lt;br /&gt;
 ::::::::::::::::\ flr.detail    359,B   /:::::::::::::::::::::::::::::::::::::\ tag of B      361,B   /::::::::::::::::::&lt;br /&gt;
 :::::::::::::::::x-------------x-------x:::::::::::::::::::::::::::::::::::::::x-------------x-------x:::::::::::::::::::&lt;br /&gt;
 :::::::::::::::::::::::::::::::::THE PORTAL LINEDEFS:::::::::::::::::::::::::::::::::::::::::THE PORTAL LINEDEFS:::::::::&lt;br /&gt;
&lt;br /&gt;
===Setting up wall portals===&lt;br /&gt;
Wall portals are slightly simpler to implement. The two separate sectors must have the same floor and ceiling heights and the portal linedefs need to be of the same length and angle. They must also be two-sided, passable and have a buffer sector behind them, with enough depth so the portal is walkable by the intended actors (so they don&#039;t bump into the back wall of the buffer sector).&lt;br /&gt;
&lt;br /&gt;
The two linedefs will have the 376 and 377 specials (respectively, order not being important) and a common tag (which doesn&#039;t have to belong to any sector).&lt;br /&gt;
&lt;br /&gt;
Note that to render correctly, the buffer sectors behind them will need to have different light levels from the one in front of them. If the portal works correctly, they will never be visible during the game, and won&#039;t be accessible unless the user activates no-clipping mode.&lt;br /&gt;
&lt;br /&gt;
Here is a diagram on how to set up:&lt;br /&gt;
&lt;br /&gt;
 ----------x &amp;lt;----main area sectors---------&amp;gt;    x---------&lt;br /&gt;
           |        Visible            x---------x&lt;br /&gt;
           |                           |         |&lt;br /&gt;
           |                           |         |&amp;lt;linedef B&lt;br /&gt;
           x-------x                   |         | type 377&lt;br /&gt;
 linedef A&amp;gt;|       |&amp;lt;-buffer sectors-&amp;gt; |         | tag n&lt;br /&gt;
 type 376  |       |                   x---------x&lt;br /&gt;
 tag n     |       |  Never visible in-game      |&lt;br /&gt;
           |       |  but wide enough to fit     |&lt;br /&gt;
 ----------x-------x  walking objects            x---------&lt;br /&gt;
                      Set their light levels to different values from neighbouring main area sectors&lt;br /&gt;
&lt;br /&gt;
===Lifts between plane portals===&lt;br /&gt;
&lt;br /&gt;
You can make the floor or ceiling of a sector move from a sector group (layer) to another by using the [[Attached surface linedef types]].&lt;br /&gt;
&lt;br /&gt;
==Caveats and limitations==&lt;br /&gt;
* Linked areas must have corresponding floor or ceiling heights. It&#039;s not possible to look and move into an area with different Z coordinates.&lt;br /&gt;
* It is possible to make &amp;quot;impossible&amp;quot; structures, both with plane and line portals, but note that Eternity will attempt to render any scene relative to viewer&#039;s coordinates when looking at the portal, including any unrelated sectors placed at the same XY coordinates as the &amp;quot;virtual&amp;quot; tunnel. This undesired effect can be reduced by setting up the layout of the map properly.&lt;br /&gt;
* An &amp;quot;infinite&amp;quot; tunnel can be created, but it must consist of at least three sector groups in a cycle, as well as avoiding any visibility glitches mentioned in the previous point.&lt;br /&gt;
The following four points are valid because linked portals as a reliable feature are not fully implemented, but have been made available to the user, or for experimentation:&lt;br /&gt;
* Currently the hitscan traversal through portals is not implemented, which means that bullet attacks will be stopped, monsters will not be able to see you etc. The monsters will be able to hear and follow you through the portal however, and projectiles will pass through.&lt;br /&gt;
* Currently, an actor standing between two layers separated by a plane portal will jump repeatedly between the two areas and have difficulty walking.&lt;br /&gt;
* Currently sprites aren&#039;t seamlessly rendered through portals, appearing cut off by the portal plane.&lt;br /&gt;
* Currently, moving through portals can result in objects getting stuck, telefragged etc. Previously it was a hazard to the player too, as anything could telefrag, but it has been changed to be less hazardous.&lt;br /&gt;
Regardless, it is still possible to make convincing levels with linked portals even at their current state, as long as you make sure that major combat scenes will not take place between portals. Flying monsters can still follow the player through portals, so they have an advantage.&lt;br /&gt;
&lt;br /&gt;
==Tutorial==&lt;br /&gt;
Refer to Zarkyb&#039;s [[linked portals tutorial]] for more examples on usage.&lt;br /&gt;
&lt;br /&gt;
==Examples==&lt;br /&gt;
===[https://s3-eu-west-1.amazonaws.com/eternity/linked_port.wad demo file]===&lt;br /&gt;
a demonstration of both plane and wall portals.&lt;br /&gt;
Played on &#039;&#039;&#039;Doom2&#039;&#039;&#039; / &#039;&#039;&#039;Map01&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Things to note:&lt;br /&gt;
&lt;br /&gt;
* In compatibility menu the option &#039;&#039;&#039;actors have infinite height&#039;&#039;&#039; needs to be set to &#039;&#039;&#039;false&#039;&#039;&#039; in order for any actor to fall through a portal.&lt;br /&gt;
* The &amp;quot;upper part&amp;quot; is textured differently from the &amp;quot;lower part&amp;quot;. While in game observe when textures change and where exactly the clipping occurs.&lt;br /&gt;
* The lower room has a different shape than the room upstairs. Only the tagged, corresponding sectors which make up a &amp;quot;hole&amp;quot; have to be shaped alike.&lt;br /&gt;
* Any LineDef that copies floor / ceiling requires an appropriate &#039;&#039;&#039;Anchor&#039;&#039;&#039; action on correspodning LineDef in the copied sector. E.g. should the action &#039;&#039;&#039;special: 360; tag: 1&#039;&#039;&#039; be cleared from where it is and set on any other LineDef, you&#039;d get clipping errors, HoM effects or the renderer would simply refuse to connect portals.&lt;br /&gt;
* When viewing automap notice how position is updated. Player doesn&#039;t seem to &amp;quot;teleport&amp;quot; from one place of the map to another, yet his X/Y coordinates change when passing a portal boundary.&lt;br /&gt;
* Use console commands like &#039;&#039;&#039;spawn doomimp&#039;&#039;&#039; to test how monsters see, hear and aim through portals.&lt;br /&gt;
* Use console command &#039;&#039;&#039;fly&#039;&#039;&#039; to test that you can indeed cross portals from both sides of the &amp;quot;hole&amp;quot;.&lt;br /&gt;
* When viewing through map editor note that there&#039;s no sector tagged with a &#039;&#039;&#039;3&#039;&#039;&#039; (tag used to link wall portals). Wall portals clipping is based on LineDefs, not sectors.&lt;br /&gt;
&lt;br /&gt;
[[File:Linked_portals.png]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Editing]]&lt;br /&gt;
[[Category:Editing reference]]&lt;/div&gt;</summary>
		<author><name>Ellmo</name></author>
	</entry>
	<entry>
		<id>https://eternity.youfailit.net/index.php?title=Polyobject&amp;diff=3414</id>
		<title>Polyobject</title>
		<link rel="alternate" type="text/html" href="https://eternity.youfailit.net/index.php?title=Polyobject&amp;diff=3414"/>
		<updated>2013-02-10T01:12:58Z</updated>

		<summary type="html">&lt;p&gt;Ellmo: /* Moving PolyObjects */&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 and ZDoom 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, unlike ZDoom, 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;
{{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 1S 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;
*&#039;&#039;&#039;Method 1: The &#039;&#039;Polyobj_StartLine&#039;&#039; Special&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:The Polyobj_StartLine 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;
    [Control Sector]                     [Main Map Area]&lt;br /&gt;
    +-------------------+          +-------------------------------+&lt;br /&gt;
    |                   |          |                               |&lt;br /&gt;
    |        |          |          |                               |&lt;br /&gt;
    |      +---&amp;gt;+       |          |                               |&lt;br /&gt;
    |      ^    |       |          |                               |&lt;br /&gt;
    |      |    |_      |          |                               |&lt;br /&gt;
    |   A -| B  |       |          |              C                |&lt;br /&gt;
    |      |    v       |          |                               |&lt;br /&gt;
    |      +&amp;lt;---+       |          |                               |&lt;br /&gt;
    |         |         |          |                               |&lt;br /&gt;
    |                   |          |                               |&lt;br /&gt;
    +-------------------+          +-------------------------------+&lt;br /&gt;
:Assume that the linedef A is assigned the Polyobj_StartLine special and has argument #1 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. &lt;br /&gt;
&lt;br /&gt;
:Starting from line A, 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 A, 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 B and C are the two required objects: &lt;br /&gt;
:* B: 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 PolyObject ID). There must be one and only one of these objects for each PolyObject ID. &lt;br /&gt;
:* C: 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 Polyobj_StartLine 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 &#039;&#039;Polyobj_ExplicitLine&#039;&#039; Special &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:The Polyobj_ExplicitLine 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;
    [Control Sector]                     [Main Map Area]&lt;br /&gt;
    +-------------------+          +-------------------------------+&lt;br /&gt;
    |        2          |          |                               |&lt;br /&gt;
    |        |          |          |                               |&lt;br /&gt;
    |      +---&amp;gt;+       |          |                               |&lt;br /&gt;
    |      ^    |       |          |                               |&lt;br /&gt;
    |      |    |_ 4    |          |                               |&lt;br /&gt;
    |   1 -| B  |       |          |              C                |&lt;br /&gt;
    |      |    v       |          |                               |&lt;br /&gt;
    |      +&amp;lt;---+       |          |                               |&lt;br /&gt;
    |         |         |          |                               |&lt;br /&gt;
    |         3         |          |                               |&lt;br /&gt;
    +-------------------+          +-------------------------------+&lt;br /&gt;
:Assume that the linedefs labeled 1 through 4 are assigned the Polyobj_ExplicitLine special, all have argument #1 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 all have argument #2 set to the integer values 1 through 4, corresponding to their labels in the diagram. &lt;br /&gt;
&lt;br /&gt;
:The game engine will search through all linedefs in the entire map for ones with the current PolyObject ID in argument #1 and a value greater than zero in argument #2. The lines will be collected and then sorted by the value in their second argument and added to the PolyObject in that order. Note that unlike Hexen, it is not necessary for the numbers in the second argument to be sequential (ie, a sequence such as { 5, 10, 15, 20 } would also work). &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 StartLine special above. &lt;br /&gt;
:* B: 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 ExplicitLines&#039; first argument (the PolyObject ID). There must be one and only one of these objects for each PolyObject ID. &lt;br /&gt;
:* C: 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 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;
:The complete arguments to Polyobj_ExplicitLine 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;number&#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;
==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;
[[category:Editing reference]]&lt;/div&gt;</summary>
		<author><name>Ellmo</name></author>
	</entry>
	<entry>
		<id>https://eternity.youfailit.net/index.php?title=File:Polyobject_rotating.gif&amp;diff=3413</id>
		<title>File:Polyobject rotating.gif</title>
		<link rel="alternate" type="text/html" href="https://eternity.youfailit.net/index.php?title=File:Polyobject_rotating.gif&amp;diff=3413"/>
		<updated>2013-02-10T01:02:44Z</updated>

		<summary type="html">&lt;p&gt;Ellmo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Ellmo</name></author>
	</entry>
	<entry>
		<id>https://eternity.youfailit.net/index.php?title=Polyobject&amp;diff=3412</id>
		<title>Polyobject</title>
		<link rel="alternate" type="text/html" href="https://eternity.youfailit.net/index.php?title=Polyobject&amp;diff=3412"/>
		<updated>2013-02-09T23:19:07Z</updated>

		<summary type="html">&lt;p&gt;Ellmo: /* PolyObject Door Examples */&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 and ZDoom 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, unlike ZDoom, 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;
{{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 1S 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;
*&#039;&#039;&#039;Method 1: The &#039;&#039;Polyobj_StartLine&#039;&#039; Special&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:The Polyobj_StartLine 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;
    [Control Sector]                     [Main Map Area]&lt;br /&gt;
    +-------------------+          +-------------------------------+&lt;br /&gt;
    |                   |          |                               |&lt;br /&gt;
    |        |          |          |                               |&lt;br /&gt;
    |      +---&amp;gt;+       |          |                               |&lt;br /&gt;
    |      ^    |       |          |                               |&lt;br /&gt;
    |      |    |_      |          |                               |&lt;br /&gt;
    |   A -| B  |       |          |              C                |&lt;br /&gt;
    |      |    v       |          |                               |&lt;br /&gt;
    |      +&amp;lt;---+       |          |                               |&lt;br /&gt;
    |         |         |          |                               |&lt;br /&gt;
    |                   |          |                               |&lt;br /&gt;
    +-------------------+          +-------------------------------+&lt;br /&gt;
:Assume that the linedef A is assigned the Polyobj_StartLine special and has argument #1 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. &lt;br /&gt;
&lt;br /&gt;
:Starting from line A, 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 A, 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 B and C are the two required objects: &lt;br /&gt;
:* B: 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 PolyObject ID). There must be one and only one of these objects for each PolyObject ID. &lt;br /&gt;
:* C: 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 Polyobj_StartLine 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 &#039;&#039;Polyobj_ExplicitLine&#039;&#039; Special &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:The Polyobj_ExplicitLine 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;
    [Control Sector]                     [Main Map Area]&lt;br /&gt;
    +-------------------+          +-------------------------------+&lt;br /&gt;
    |        2          |          |                               |&lt;br /&gt;
    |        |          |          |                               |&lt;br /&gt;
    |      +---&amp;gt;+       |          |                               |&lt;br /&gt;
    |      ^    |       |          |                               |&lt;br /&gt;
    |      |    |_ 4    |          |                               |&lt;br /&gt;
    |   1 -| B  |       |          |              C                |&lt;br /&gt;
    |      |    v       |          |                               |&lt;br /&gt;
    |      +&amp;lt;---+       |          |                               |&lt;br /&gt;
    |         |         |          |                               |&lt;br /&gt;
    |         3         |          |                               |&lt;br /&gt;
    +-------------------+          +-------------------------------+&lt;br /&gt;
:Assume that the linedefs labeled 1 through 4 are assigned the Polyobj_ExplicitLine special, all have argument #1 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 all have argument #2 set to the integer values 1 through 4, corresponding to their labels in the diagram. &lt;br /&gt;
&lt;br /&gt;
:The game engine will search through all linedefs in the entire map for ones with the current PolyObject ID in argument #1 and a value greater than zero in argument #2. The lines will be collected and then sorted by the value in their second argument and added to the PolyObject in that order. Note that unlike Hexen, it is not necessary for the numbers in the second argument to be sequential (ie, a sequence such as { 5, 10, 15, 20 } would also work). &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 StartLine special above. &lt;br /&gt;
:* B: 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 ExplicitLines&#039; first argument (the PolyObject ID). There must be one and only one of these objects for each PolyObject ID. &lt;br /&gt;
:* C: 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 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;
:The complete arguments to Polyobj_ExplicitLine 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;number&#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;
&#039;&#039;&#039;Translating PolyObjects&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
To move a PolyObject in the xy plane, use one of the following line specials: &lt;br /&gt;
* Polyobj_Move &lt;br /&gt;
* Polyobj_OR_Move &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;
&#039;&#039;&#039;Rotating PolyObjects &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
To rotate a PolyObject, use one of the following line specials: &lt;br /&gt;
* Polyobj_RotateRight &lt;br /&gt;
* Polyobj_OR_RotateRight &lt;br /&gt;
* Polyobj_RotateLeft &lt;br /&gt;
* Polyobj_OR_RotateLeft &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 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;
[[category:Editing reference]]&lt;/div&gt;</summary>
		<author><name>Ellmo</name></author>
	</entry>
	<entry>
		<id>https://eternity.youfailit.net/index.php?title=Polyobject&amp;diff=3411</id>
		<title>Polyobject</title>
		<link rel="alternate" type="text/html" href="https://eternity.youfailit.net/index.php?title=Polyobject&amp;diff=3411"/>
		<updated>2013-02-09T20:11:30Z</updated>

		<summary type="html">&lt;p&gt;Ellmo: /* Swinging PolyObject Door */&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 and ZDoom 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, unlike ZDoom, 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;
{{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 1S 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;
*&#039;&#039;&#039;Method 1: The &#039;&#039;Polyobj_StartLine&#039;&#039; Special&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:The Polyobj_StartLine 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;
    [Control Sector]                     [Main Map Area]&lt;br /&gt;
    +-------------------+          +-------------------------------+&lt;br /&gt;
    |                   |          |                               |&lt;br /&gt;
    |        |          |          |                               |&lt;br /&gt;
    |      +---&amp;gt;+       |          |                               |&lt;br /&gt;
    |      ^    |       |          |                               |&lt;br /&gt;
    |      |    |_      |          |                               |&lt;br /&gt;
    |   A -| B  |       |          |              C                |&lt;br /&gt;
    |      |    v       |          |                               |&lt;br /&gt;
    |      +&amp;lt;---+       |          |                               |&lt;br /&gt;
    |         |         |          |                               |&lt;br /&gt;
    |                   |          |                               |&lt;br /&gt;
    +-------------------+          +-------------------------------+&lt;br /&gt;
:Assume that the linedef A is assigned the Polyobj_StartLine special and has argument #1 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. &lt;br /&gt;
&lt;br /&gt;
:Starting from line A, 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 A, 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 B and C are the two required objects: &lt;br /&gt;
:* B: 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 PolyObject ID). There must be one and only one of these objects for each PolyObject ID. &lt;br /&gt;
:* C: 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 Polyobj_StartLine 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 &#039;&#039;Polyobj_ExplicitLine&#039;&#039; Special &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:The Polyobj_ExplicitLine 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;
    [Control Sector]                     [Main Map Area]&lt;br /&gt;
    +-------------------+          +-------------------------------+&lt;br /&gt;
    |        2          |          |                               |&lt;br /&gt;
    |        |          |          |                               |&lt;br /&gt;
    |      +---&amp;gt;+       |          |                               |&lt;br /&gt;
    |      ^    |       |          |                               |&lt;br /&gt;
    |      |    |_ 4    |          |                               |&lt;br /&gt;
    |   1 -| B  |       |          |              C                |&lt;br /&gt;
    |      |    v       |          |                               |&lt;br /&gt;
    |      +&amp;lt;---+       |          |                               |&lt;br /&gt;
    |         |         |          |                               |&lt;br /&gt;
    |         3         |          |                               |&lt;br /&gt;
    +-------------------+          +-------------------------------+&lt;br /&gt;
:Assume that the linedefs labeled 1 through 4 are assigned the Polyobj_ExplicitLine special, all have argument #1 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 all have argument #2 set to the integer values 1 through 4, corresponding to their labels in the diagram. &lt;br /&gt;
&lt;br /&gt;
:The game engine will search through all linedefs in the entire map for ones with the current PolyObject ID in argument #1 and a value greater than zero in argument #2. The lines will be collected and then sorted by the value in their second argument and added to the PolyObject in that order. Note that unlike Hexen, it is not necessary for the numbers in the second argument to be sequential (ie, a sequence such as { 5, 10, 15, 20 } would also work). &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 StartLine special above. &lt;br /&gt;
:* B: 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 ExplicitLines&#039; first argument (the PolyObject ID). There must be one and only one of these objects for each PolyObject ID. &lt;br /&gt;
:* C: 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 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;
:The complete arguments to Polyobj_ExplicitLine 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;number&#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;
&#039;&#039;&#039;Translating PolyObjects&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
To move a PolyObject in the xy plane, use one of the following line specials: &lt;br /&gt;
* Polyobj_Move &lt;br /&gt;
* Polyobj_OR_Move &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;
&#039;&#039;&#039;Rotating PolyObjects &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
To rotate a PolyObject, use one of the following line specials: &lt;br /&gt;
* Polyobj_RotateRight &lt;br /&gt;
* Polyobj_OR_RotateRight &lt;br /&gt;
* Polyobj_RotateLeft &lt;br /&gt;
* Polyobj_OR_RotateLeft &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 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] - 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;
[[category:Editing reference]]&lt;/div&gt;</summary>
		<author><name>Ellmo</name></author>
	</entry>
	<entry>
		<id>https://eternity.youfailit.net/index.php?title=File:Poly_sliding_door.gif&amp;diff=3410</id>
		<title>File:Poly sliding door.gif</title>
		<link rel="alternate" type="text/html" href="https://eternity.youfailit.net/index.php?title=File:Poly_sliding_door.gif&amp;diff=3410"/>
		<updated>2013-02-09T20:11:21Z</updated>

		<summary type="html">&lt;p&gt;Ellmo: uploaded a new version of &amp;amp;quot;File:Poly sliding door.gif&amp;amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Ellmo</name></author>
	</entry>
	<entry>
		<id>https://eternity.youfailit.net/index.php?title=File:Poly_swigning_door.gif&amp;diff=3409</id>
		<title>File:Poly swigning door.gif</title>
		<link rel="alternate" type="text/html" href="https://eternity.youfailit.net/index.php?title=File:Poly_swigning_door.gif&amp;diff=3409"/>
		<updated>2013-02-09T20:10:50Z</updated>

		<summary type="html">&lt;p&gt;Ellmo: uploaded a new version of &amp;amp;quot;File:Poly swigning door.gif&amp;amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Ellmo</name></author>
	</entry>
	<entry>
		<id>https://eternity.youfailit.net/index.php?title=Polyobject&amp;diff=3408</id>
		<title>Polyobject</title>
		<link rel="alternate" type="text/html" href="https://eternity.youfailit.net/index.php?title=Polyobject&amp;diff=3408"/>
		<updated>2013-02-09T20:07:12Z</updated>

		<summary type="html">&lt;p&gt;Ellmo: /* PolyObject Doors */&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 and ZDoom 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, unlike ZDoom, 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;
{{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 1S 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;
*&#039;&#039;&#039;Method 1: The &#039;&#039;Polyobj_StartLine&#039;&#039; Special&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:The Polyobj_StartLine 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;
    [Control Sector]                     [Main Map Area]&lt;br /&gt;
    +-------------------+          +-------------------------------+&lt;br /&gt;
    |                   |          |                               |&lt;br /&gt;
    |        |          |          |                               |&lt;br /&gt;
    |      +---&amp;gt;+       |          |                               |&lt;br /&gt;
    |      ^    |       |          |                               |&lt;br /&gt;
    |      |    |_      |          |                               |&lt;br /&gt;
    |   A -| B  |       |          |              C                |&lt;br /&gt;
    |      |    v       |          |                               |&lt;br /&gt;
    |      +&amp;lt;---+       |          |                               |&lt;br /&gt;
    |         |         |          |                               |&lt;br /&gt;
    |                   |          |                               |&lt;br /&gt;
    +-------------------+          +-------------------------------+&lt;br /&gt;
:Assume that the linedef A is assigned the Polyobj_StartLine special and has argument #1 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. &lt;br /&gt;
&lt;br /&gt;
:Starting from line A, 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 A, 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 B and C are the two required objects: &lt;br /&gt;
:* B: 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 PolyObject ID). There must be one and only one of these objects for each PolyObject ID. &lt;br /&gt;
:* C: 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 Polyobj_StartLine 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 &#039;&#039;Polyobj_ExplicitLine&#039;&#039; Special &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:The Polyobj_ExplicitLine 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;
    [Control Sector]                     [Main Map Area]&lt;br /&gt;
    +-------------------+          +-------------------------------+&lt;br /&gt;
    |        2          |          |                               |&lt;br /&gt;
    |        |          |          |                               |&lt;br /&gt;
    |      +---&amp;gt;+       |          |                               |&lt;br /&gt;
    |      ^    |       |          |                               |&lt;br /&gt;
    |      |    |_ 4    |          |                               |&lt;br /&gt;
    |   1 -| B  |       |          |              C                |&lt;br /&gt;
    |      |    v       |          |                               |&lt;br /&gt;
    |      +&amp;lt;---+       |          |                               |&lt;br /&gt;
    |         |         |          |                               |&lt;br /&gt;
    |         3         |          |                               |&lt;br /&gt;
    +-------------------+          +-------------------------------+&lt;br /&gt;
:Assume that the linedefs labeled 1 through 4 are assigned the Polyobj_ExplicitLine special, all have argument #1 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 all have argument #2 set to the integer values 1 through 4, corresponding to their labels in the diagram. &lt;br /&gt;
&lt;br /&gt;
:The game engine will search through all linedefs in the entire map for ones with the current PolyObject ID in argument #1 and a value greater than zero in argument #2. The lines will be collected and then sorted by the value in their second argument and added to the PolyObject in that order. Note that unlike Hexen, it is not necessary for the numbers in the second argument to be sequential (ie, a sequence such as { 5, 10, 15, 20 } would also work). &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 StartLine special above. &lt;br /&gt;
:* B: 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 ExplicitLines&#039; first argument (the PolyObject ID). There must be one and only one of these objects for each PolyObject ID. &lt;br /&gt;
:* C: 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 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;
:The complete arguments to Polyobj_ExplicitLine 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;number&#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;
&#039;&#039;&#039;Translating PolyObjects&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
To move a PolyObject in the xy plane, use one of the following line specials: &lt;br /&gt;
* Polyobj_Move &lt;br /&gt;
* Polyobj_OR_Move &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;
&#039;&#039;&#039;Rotating PolyObjects &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
To rotate a PolyObject, use one of the following line specials: &lt;br /&gt;
* Polyobj_RotateRight &lt;br /&gt;
* Polyobj_OR_RotateRight &lt;br /&gt;
* Polyobj_RotateLeft &lt;br /&gt;
* Polyobj_OR_RotateLeft &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 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|180px]]&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] - 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;
[[category:Editing reference]]&lt;/div&gt;</summary>
		<author><name>Ellmo</name></author>
	</entry>
	<entry>
		<id>https://eternity.youfailit.net/index.php?title=Polyobject&amp;diff=3407</id>
		<title>Polyobject</title>
		<link rel="alternate" type="text/html" href="https://eternity.youfailit.net/index.php?title=Polyobject&amp;diff=3407"/>
		<updated>2013-02-09T20:01:40Z</updated>

		<summary type="html">&lt;p&gt;Ellmo: /* PolyObject Doors */&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 and ZDoom 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, unlike ZDoom, 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;
{{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 1S 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;
*&#039;&#039;&#039;Method 1: The &#039;&#039;Polyobj_StartLine&#039;&#039; Special&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:The Polyobj_StartLine 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;
    [Control Sector]                     [Main Map Area]&lt;br /&gt;
    +-------------------+          +-------------------------------+&lt;br /&gt;
    |                   |          |                               |&lt;br /&gt;
    |        |          |          |                               |&lt;br /&gt;
    |      +---&amp;gt;+       |          |                               |&lt;br /&gt;
    |      ^    |       |          |                               |&lt;br /&gt;
    |      |    |_      |          |                               |&lt;br /&gt;
    |   A -| B  |       |          |              C                |&lt;br /&gt;
    |      |    v       |          |                               |&lt;br /&gt;
    |      +&amp;lt;---+       |          |                               |&lt;br /&gt;
    |         |         |          |                               |&lt;br /&gt;
    |                   |          |                               |&lt;br /&gt;
    +-------------------+          +-------------------------------+&lt;br /&gt;
:Assume that the linedef A is assigned the Polyobj_StartLine special and has argument #1 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. &lt;br /&gt;
&lt;br /&gt;
:Starting from line A, 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 A, 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 B and C are the two required objects: &lt;br /&gt;
:* B: 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 PolyObject ID). There must be one and only one of these objects for each PolyObject ID. &lt;br /&gt;
:* C: 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 Polyobj_StartLine 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 &#039;&#039;Polyobj_ExplicitLine&#039;&#039; Special &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:The Polyobj_ExplicitLine 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;
    [Control Sector]                     [Main Map Area]&lt;br /&gt;
    +-------------------+          +-------------------------------+&lt;br /&gt;
    |        2          |          |                               |&lt;br /&gt;
    |        |          |          |                               |&lt;br /&gt;
    |      +---&amp;gt;+       |          |                               |&lt;br /&gt;
    |      ^    |       |          |                               |&lt;br /&gt;
    |      |    |_ 4    |          |                               |&lt;br /&gt;
    |   1 -| B  |       |          |              C                |&lt;br /&gt;
    |      |    v       |          |                               |&lt;br /&gt;
    |      +&amp;lt;---+       |          |                               |&lt;br /&gt;
    |         |         |          |                               |&lt;br /&gt;
    |         3         |          |                               |&lt;br /&gt;
    +-------------------+          +-------------------------------+&lt;br /&gt;
:Assume that the linedefs labeled 1 through 4 are assigned the Polyobj_ExplicitLine special, all have argument #1 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 all have argument #2 set to the integer values 1 through 4, corresponding to their labels in the diagram. &lt;br /&gt;
&lt;br /&gt;
:The game engine will search through all linedefs in the entire map for ones with the current PolyObject ID in argument #1 and a value greater than zero in argument #2. The lines will be collected and then sorted by the value in their second argument and added to the PolyObject in that order. Note that unlike Hexen, it is not necessary for the numbers in the second argument to be sequential (ie, a sequence such as { 5, 10, 15, 20 } would also work). &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 StartLine special above. &lt;br /&gt;
:* B: 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 ExplicitLines&#039; first argument (the PolyObject ID). There must be one and only one of these objects for each PolyObject ID. &lt;br /&gt;
:* C: 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 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;
:The complete arguments to Polyobj_ExplicitLine 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;number&#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;
&#039;&#039;&#039;Translating PolyObjects&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
To move a PolyObject in the xy plane, use one of the following line specials: &lt;br /&gt;
* Polyobj_Move &lt;br /&gt;
* Polyobj_OR_Move &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;
&#039;&#039;&#039;Rotating PolyObjects &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
To rotate a PolyObject, use one of the following line specials: &lt;br /&gt;
* Polyobj_RotateRight &lt;br /&gt;
* Polyobj_OR_RotateRight &lt;br /&gt;
* Polyobj_RotateLeft &lt;br /&gt;
* Polyobj_OR_RotateLeft &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 Doors==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [[Image:Poly_swigning_door.gif]] || [[Image:Poly_sliding_door.gif]]&lt;br /&gt;
|-&lt;br /&gt;
| PolyObject swinging door || PolyObject sliding door&lt;br /&gt;
|}&lt;br /&gt;
&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;
[[Image:Poly_swingdoor_schema.png|400px]]&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;
[[Image:Poly_slidedoor_schema.png|400px]]&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] - 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;
[[category:Editing reference]]&lt;/div&gt;</summary>
		<author><name>Ellmo</name></author>
	</entry>
	<entry>
		<id>https://eternity.youfailit.net/index.php?title=File:Poly_slidedoor_schema.png&amp;diff=3406</id>
		<title>File:Poly slidedoor schema.png</title>
		<link rel="alternate" type="text/html" href="https://eternity.youfailit.net/index.php?title=File:Poly_slidedoor_schema.png&amp;diff=3406"/>
		<updated>2013-02-09T19:53:10Z</updated>

		<summary type="html">&lt;p&gt;Ellmo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Ellmo</name></author>
	</entry>
	<entry>
		<id>https://eternity.youfailit.net/index.php?title=Polyobject&amp;diff=3405</id>
		<title>Polyobject</title>
		<link rel="alternate" type="text/html" href="https://eternity.youfailit.net/index.php?title=Polyobject&amp;diff=3405"/>
		<updated>2013-02-09T19:44:43Z</updated>

		<summary type="html">&lt;p&gt;Ellmo: /* PolyObject Door Examples */&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 and ZDoom 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, unlike ZDoom, 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;
{{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 1S 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;
*&#039;&#039;&#039;Method 1: The &#039;&#039;Polyobj_StartLine&#039;&#039; Special&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:The Polyobj_StartLine 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;
    [Control Sector]                     [Main Map Area]&lt;br /&gt;
    +-------------------+          +-------------------------------+&lt;br /&gt;
    |                   |          |                               |&lt;br /&gt;
    |        |          |          |                               |&lt;br /&gt;
    |      +---&amp;gt;+       |          |                               |&lt;br /&gt;
    |      ^    |       |          |                               |&lt;br /&gt;
    |      |    |_      |          |                               |&lt;br /&gt;
    |   A -| B  |       |          |              C                |&lt;br /&gt;
    |      |    v       |          |                               |&lt;br /&gt;
    |      +&amp;lt;---+       |          |                               |&lt;br /&gt;
    |         |         |          |                               |&lt;br /&gt;
    |                   |          |                               |&lt;br /&gt;
    +-------------------+          +-------------------------------+&lt;br /&gt;
:Assume that the linedef A is assigned the Polyobj_StartLine special and has argument #1 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. &lt;br /&gt;
&lt;br /&gt;
:Starting from line A, 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 A, 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 B and C are the two required objects: &lt;br /&gt;
:* B: 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 PolyObject ID). There must be one and only one of these objects for each PolyObject ID. &lt;br /&gt;
:* C: 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 Polyobj_StartLine 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 &#039;&#039;Polyobj_ExplicitLine&#039;&#039; Special &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:The Polyobj_ExplicitLine 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;
    [Control Sector]                     [Main Map Area]&lt;br /&gt;
    +-------------------+          +-------------------------------+&lt;br /&gt;
    |        2          |          |                               |&lt;br /&gt;
    |        |          |          |                               |&lt;br /&gt;
    |      +---&amp;gt;+       |          |                               |&lt;br /&gt;
    |      ^    |       |          |                               |&lt;br /&gt;
    |      |    |_ 4    |          |                               |&lt;br /&gt;
    |   1 -| B  |       |          |              C                |&lt;br /&gt;
    |      |    v       |          |                               |&lt;br /&gt;
    |      +&amp;lt;---+       |          |                               |&lt;br /&gt;
    |         |         |          |                               |&lt;br /&gt;
    |         3         |          |                               |&lt;br /&gt;
    +-------------------+          +-------------------------------+&lt;br /&gt;
:Assume that the linedefs labeled 1 through 4 are assigned the Polyobj_ExplicitLine special, all have argument #1 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 all have argument #2 set to the integer values 1 through 4, corresponding to their labels in the diagram. &lt;br /&gt;
&lt;br /&gt;
:The game engine will search through all linedefs in the entire map for ones with the current PolyObject ID in argument #1 and a value greater than zero in argument #2. The lines will be collected and then sorted by the value in their second argument and added to the PolyObject in that order. Note that unlike Hexen, it is not necessary for the numbers in the second argument to be sequential (ie, a sequence such as { 5, 10, 15, 20 } would also work). &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 StartLine special above. &lt;br /&gt;
:* B: 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 ExplicitLines&#039; first argument (the PolyObject ID). There must be one and only one of these objects for each PolyObject ID. &lt;br /&gt;
:* C: 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 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;
:The complete arguments to Polyobj_ExplicitLine 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;number&#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;
&#039;&#039;&#039;Translating PolyObjects&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
To move a PolyObject in the xy plane, use one of the following line specials: &lt;br /&gt;
* Polyobj_Move &lt;br /&gt;
* Polyobj_OR_Move &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;
&#039;&#039;&#039;Rotating PolyObjects &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
To rotate a PolyObject, use one of the following line specials: &lt;br /&gt;
* Polyobj_RotateRight &lt;br /&gt;
* Polyobj_OR_RotateRight &lt;br /&gt;
* Polyobj_RotateLeft &lt;br /&gt;
* Polyobj_OR_RotateLeft &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 Doors==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [[Image:Poly_swigning_door.gif]] || [[Image:Poly_sliding_door.gif]]&lt;br /&gt;
|-&lt;br /&gt;
| PolyObject swinging door || PolyObject sliding door&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
There are two distinct types of actions provided to allow PolyObjects to function as doors. 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;
[[Image:Poly_swingdoor_schema.png|400px]]&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Polyobj_DoorSlide&#039;&#039;&#039;&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;
* Polyobj_DoorSwing&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;
===PolyObject Door Examples===&lt;br /&gt;
[https://s3-eu-west-1.amazonaws.com/eternity/polyobj_doors.wad PolyObject Doors Demo] - 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;
[[category:Editing reference]]&lt;/div&gt;</summary>
		<author><name>Ellmo</name></author>
	</entry>
	<entry>
		<id>https://eternity.youfailit.net/index.php?title=Polyobject&amp;diff=3404</id>
		<title>Polyobject</title>
		<link rel="alternate" type="text/html" href="https://eternity.youfailit.net/index.php?title=Polyobject&amp;diff=3404"/>
		<updated>2013-02-09T19:44:08Z</updated>

		<summary type="html">&lt;p&gt;Ellmo: /* PolyObject Doors */&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 and ZDoom 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, unlike ZDoom, 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;
{{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 1S 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;
*&#039;&#039;&#039;Method 1: The &#039;&#039;Polyobj_StartLine&#039;&#039; Special&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:The Polyobj_StartLine 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;
    [Control Sector]                     [Main Map Area]&lt;br /&gt;
    +-------------------+          +-------------------------------+&lt;br /&gt;
    |                   |          |                               |&lt;br /&gt;
    |        |          |          |                               |&lt;br /&gt;
    |      +---&amp;gt;+       |          |                               |&lt;br /&gt;
    |      ^    |       |          |                               |&lt;br /&gt;
    |      |    |_      |          |                               |&lt;br /&gt;
    |   A -| B  |       |          |              C                |&lt;br /&gt;
    |      |    v       |          |                               |&lt;br /&gt;
    |      +&amp;lt;---+       |          |                               |&lt;br /&gt;
    |         |         |          |                               |&lt;br /&gt;
    |                   |          |                               |&lt;br /&gt;
    +-------------------+          +-------------------------------+&lt;br /&gt;
:Assume that the linedef A is assigned the Polyobj_StartLine special and has argument #1 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. &lt;br /&gt;
&lt;br /&gt;
:Starting from line A, 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 A, 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 B and C are the two required objects: &lt;br /&gt;
:* B: 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 PolyObject ID). There must be one and only one of these objects for each PolyObject ID. &lt;br /&gt;
:* C: 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 Polyobj_StartLine 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 &#039;&#039;Polyobj_ExplicitLine&#039;&#039; Special &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:The Polyobj_ExplicitLine 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;
    [Control Sector]                     [Main Map Area]&lt;br /&gt;
    +-------------------+          +-------------------------------+&lt;br /&gt;
    |        2          |          |                               |&lt;br /&gt;
    |        |          |          |                               |&lt;br /&gt;
    |      +---&amp;gt;+       |          |                               |&lt;br /&gt;
    |      ^    |       |          |                               |&lt;br /&gt;
    |      |    |_ 4    |          |                               |&lt;br /&gt;
    |   1 -| B  |       |          |              C                |&lt;br /&gt;
    |      |    v       |          |                               |&lt;br /&gt;
    |      +&amp;lt;---+       |          |                               |&lt;br /&gt;
    |         |         |          |                               |&lt;br /&gt;
    |         3         |          |                               |&lt;br /&gt;
    +-------------------+          +-------------------------------+&lt;br /&gt;
:Assume that the linedefs labeled 1 through 4 are assigned the Polyobj_ExplicitLine special, all have argument #1 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 all have argument #2 set to the integer values 1 through 4, corresponding to their labels in the diagram. &lt;br /&gt;
&lt;br /&gt;
:The game engine will search through all linedefs in the entire map for ones with the current PolyObject ID in argument #1 and a value greater than zero in argument #2. The lines will be collected and then sorted by the value in their second argument and added to the PolyObject in that order. Note that unlike Hexen, it is not necessary for the numbers in the second argument to be sequential (ie, a sequence such as { 5, 10, 15, 20 } would also work). &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 StartLine special above. &lt;br /&gt;
:* B: 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 ExplicitLines&#039; first argument (the PolyObject ID). There must be one and only one of these objects for each PolyObject ID. &lt;br /&gt;
:* C: 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 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;
:The complete arguments to Polyobj_ExplicitLine 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;number&#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;
&#039;&#039;&#039;Translating PolyObjects&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
To move a PolyObject in the xy plane, use one of the following line specials: &lt;br /&gt;
* Polyobj_Move &lt;br /&gt;
* Polyobj_OR_Move &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;
&#039;&#039;&#039;Rotating PolyObjects &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
To rotate a PolyObject, use one of the following line specials: &lt;br /&gt;
* Polyobj_RotateRight &lt;br /&gt;
* Polyobj_OR_RotateRight &lt;br /&gt;
* Polyobj_RotateLeft &lt;br /&gt;
* Polyobj_OR_RotateLeft &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 Doors==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [[Image:Poly_swigning_door.gif]] || [[Image:Poly_sliding_door.gif]]&lt;br /&gt;
|-&lt;br /&gt;
| PolyObject swinging door || PolyObject sliding door&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
There are two distinct types of actions provided to allow PolyObjects to function as doors. 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;
[[Image:Poly_swingdoor_schema.png|400px]]&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Polyobj_DoorSlide&#039;&#039;&#039;&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;
* Polyobj_DoorSwing&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;
===PolyObject Door Examples===&lt;br /&gt;
[https://s3-eu-west-1.amazonaws.com/eternity/polyobj_doors.wad PolyObject Doors Demo] - 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 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;
[[category:Editing reference]]&lt;/div&gt;</summary>
		<author><name>Ellmo</name></author>
	</entry>
	<entry>
		<id>https://eternity.youfailit.net/index.php?title=Polyobject&amp;diff=3403</id>
		<title>Polyobject</title>
		<link rel="alternate" type="text/html" href="https://eternity.youfailit.net/index.php?title=Polyobject&amp;diff=3403"/>
		<updated>2013-02-09T19:17:39Z</updated>

		<summary type="html">&lt;p&gt;Ellmo: /* PolyObject Doors */&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 and ZDoom 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, unlike ZDoom, 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;
{{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 1S 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;
*&#039;&#039;&#039;Method 1: The &#039;&#039;Polyobj_StartLine&#039;&#039; Special&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:The Polyobj_StartLine 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;
    [Control Sector]                     [Main Map Area]&lt;br /&gt;
    +-------------------+          +-------------------------------+&lt;br /&gt;
    |                   |          |                               |&lt;br /&gt;
    |        |          |          |                               |&lt;br /&gt;
    |      +---&amp;gt;+       |          |                               |&lt;br /&gt;
    |      ^    |       |          |                               |&lt;br /&gt;
    |      |    |_      |          |                               |&lt;br /&gt;
    |   A -| B  |       |          |              C                |&lt;br /&gt;
    |      |    v       |          |                               |&lt;br /&gt;
    |      +&amp;lt;---+       |          |                               |&lt;br /&gt;
    |         |         |          |                               |&lt;br /&gt;
    |                   |          |                               |&lt;br /&gt;
    +-------------------+          +-------------------------------+&lt;br /&gt;
:Assume that the linedef A is assigned the Polyobj_StartLine special and has argument #1 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. &lt;br /&gt;
&lt;br /&gt;
:Starting from line A, 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 A, 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 B and C are the two required objects: &lt;br /&gt;
:* B: 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 PolyObject ID). There must be one and only one of these objects for each PolyObject ID. &lt;br /&gt;
:* C: 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 Polyobj_StartLine 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 &#039;&#039;Polyobj_ExplicitLine&#039;&#039; Special &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:The Polyobj_ExplicitLine 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;
    [Control Sector]                     [Main Map Area]&lt;br /&gt;
    +-------------------+          +-------------------------------+&lt;br /&gt;
    |        2          |          |                               |&lt;br /&gt;
    |        |          |          |                               |&lt;br /&gt;
    |      +---&amp;gt;+       |          |                               |&lt;br /&gt;
    |      ^    |       |          |                               |&lt;br /&gt;
    |      |    |_ 4    |          |                               |&lt;br /&gt;
    |   1 -| B  |       |          |              C                |&lt;br /&gt;
    |      |    v       |          |                               |&lt;br /&gt;
    |      +&amp;lt;---+       |          |                               |&lt;br /&gt;
    |         |         |          |                               |&lt;br /&gt;
    |         3         |          |                               |&lt;br /&gt;
    +-------------------+          +-------------------------------+&lt;br /&gt;
:Assume that the linedefs labeled 1 through 4 are assigned the Polyobj_ExplicitLine special, all have argument #1 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 all have argument #2 set to the integer values 1 through 4, corresponding to their labels in the diagram. &lt;br /&gt;
&lt;br /&gt;
:The game engine will search through all linedefs in the entire map for ones with the current PolyObject ID in argument #1 and a value greater than zero in argument #2. The lines will be collected and then sorted by the value in their second argument and added to the PolyObject in that order. Note that unlike Hexen, it is not necessary for the numbers in the second argument to be sequential (ie, a sequence such as { 5, 10, 15, 20 } would also work). &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 StartLine special above. &lt;br /&gt;
:* B: 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 ExplicitLines&#039; first argument (the PolyObject ID). There must be one and only one of these objects for each PolyObject ID. &lt;br /&gt;
:* C: 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 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;
:The complete arguments to Polyobj_ExplicitLine 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;number&#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;
&#039;&#039;&#039;Translating PolyObjects&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
To move a PolyObject in the xy plane, use one of the following line specials: &lt;br /&gt;
* Polyobj_Move &lt;br /&gt;
* Polyobj_OR_Move &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;
&#039;&#039;&#039;Rotating PolyObjects &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
To rotate a PolyObject, use one of the following line specials: &lt;br /&gt;
* Polyobj_RotateRight &lt;br /&gt;
* Polyobj_OR_RotateRight &lt;br /&gt;
* Polyobj_RotateLeft &lt;br /&gt;
* Polyobj_OR_RotateLeft &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 Doors==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [[Image:Poly_swigning_door.gif]] || [[Image:Poly_sliding_door.gif]]&lt;br /&gt;
|-&lt;br /&gt;
| PolyObject swinging door || PolyObject sliding door&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
There are two distinct types of actions provided to allow PolyObjects to function as doors. 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;
[[Image:Poly_swingdoor_schema.png|400px]]&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Polyobj_DoorSlide&#039;&#039;&#039;&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;
* Polyobj_DoorSwing&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;
[[category:Editing reference]]&lt;/div&gt;</summary>
		<author><name>Ellmo</name></author>
	</entry>
	<entry>
		<id>https://eternity.youfailit.net/index.php?title=File:Poly_swingdoor_schema.png&amp;diff=3402</id>
		<title>File:Poly swingdoor schema.png</title>
		<link rel="alternate" type="text/html" href="https://eternity.youfailit.net/index.php?title=File:Poly_swingdoor_schema.png&amp;diff=3402"/>
		<updated>2013-02-09T19:15:46Z</updated>

		<summary type="html">&lt;p&gt;Ellmo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Ellmo</name></author>
	</entry>
	<entry>
		<id>https://eternity.youfailit.net/index.php?title=Polyobject&amp;diff=3401</id>
		<title>Polyobject</title>
		<link rel="alternate" type="text/html" href="https://eternity.youfailit.net/index.php?title=Polyobject&amp;diff=3401"/>
		<updated>2013-02-09T18:32:12Z</updated>

		<summary type="html">&lt;p&gt;Ellmo: /* PolyObject Doors */&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 and ZDoom 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, unlike ZDoom, 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;
{{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 1S 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;
*&#039;&#039;&#039;Method 1: The &#039;&#039;Polyobj_StartLine&#039;&#039; Special&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:The Polyobj_StartLine 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;
    [Control Sector]                     [Main Map Area]&lt;br /&gt;
    +-------------------+          +-------------------------------+&lt;br /&gt;
    |                   |          |                               |&lt;br /&gt;
    |        |          |          |                               |&lt;br /&gt;
    |      +---&amp;gt;+       |          |                               |&lt;br /&gt;
    |      ^    |       |          |                               |&lt;br /&gt;
    |      |    |_      |          |                               |&lt;br /&gt;
    |   A -| B  |       |          |              C                |&lt;br /&gt;
    |      |    v       |          |                               |&lt;br /&gt;
    |      +&amp;lt;---+       |          |                               |&lt;br /&gt;
    |         |         |          |                               |&lt;br /&gt;
    |                   |          |                               |&lt;br /&gt;
    +-------------------+          +-------------------------------+&lt;br /&gt;
:Assume that the linedef A is assigned the Polyobj_StartLine special and has argument #1 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. &lt;br /&gt;
&lt;br /&gt;
:Starting from line A, 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 A, 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 B and C are the two required objects: &lt;br /&gt;
:* B: 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 PolyObject ID). There must be one and only one of these objects for each PolyObject ID. &lt;br /&gt;
:* C: 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 Polyobj_StartLine 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 &#039;&#039;Polyobj_ExplicitLine&#039;&#039; Special &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:The Polyobj_ExplicitLine 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;
    [Control Sector]                     [Main Map Area]&lt;br /&gt;
    +-------------------+          +-------------------------------+&lt;br /&gt;
    |        2          |          |                               |&lt;br /&gt;
    |        |          |          |                               |&lt;br /&gt;
    |      +---&amp;gt;+       |          |                               |&lt;br /&gt;
    |      ^    |       |          |                               |&lt;br /&gt;
    |      |    |_ 4    |          |                               |&lt;br /&gt;
    |   1 -| B  |       |          |              C                |&lt;br /&gt;
    |      |    v       |          |                               |&lt;br /&gt;
    |      +&amp;lt;---+       |          |                               |&lt;br /&gt;
    |         |         |          |                               |&lt;br /&gt;
    |         3         |          |                               |&lt;br /&gt;
    +-------------------+          +-------------------------------+&lt;br /&gt;
:Assume that the linedefs labeled 1 through 4 are assigned the Polyobj_ExplicitLine special, all have argument #1 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 all have argument #2 set to the integer values 1 through 4, corresponding to their labels in the diagram. &lt;br /&gt;
&lt;br /&gt;
:The game engine will search through all linedefs in the entire map for ones with the current PolyObject ID in argument #1 and a value greater than zero in argument #2. The lines will be collected and then sorted by the value in their second argument and added to the PolyObject in that order. Note that unlike Hexen, it is not necessary for the numbers in the second argument to be sequential (ie, a sequence such as { 5, 10, 15, 20 } would also work). &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 StartLine special above. &lt;br /&gt;
:* B: 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 ExplicitLines&#039; first argument (the PolyObject ID). There must be one and only one of these objects for each PolyObject ID. &lt;br /&gt;
:* C: 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 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;
:The complete arguments to Polyobj_ExplicitLine 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;number&#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;
&#039;&#039;&#039;Translating PolyObjects&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
To move a PolyObject in the xy plane, use one of the following line specials: &lt;br /&gt;
* Polyobj_Move &lt;br /&gt;
* Polyobj_OR_Move &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;
&#039;&#039;&#039;Rotating PolyObjects &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
To rotate a PolyObject, use one of the following line specials: &lt;br /&gt;
* Polyobj_RotateRight &lt;br /&gt;
* Polyobj_OR_RotateRight &lt;br /&gt;
* Polyobj_RotateLeft &lt;br /&gt;
* Polyobj_OR_RotateLeft &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 Doors==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [[Image:Poly_swigning_door.gif]] || [[Image:Poly_sliding_door.gif]]&lt;br /&gt;
|-&lt;br /&gt;
| PolyObject swinging door || PolyObject sliding door&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
There are two distinct types of actions provided to allow PolyObjects to function as doors. 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;
* Polyobj_DoorSlide&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;
* Polyobj_DoorSwing&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;
[[category:Editing reference]]&lt;/div&gt;</summary>
		<author><name>Ellmo</name></author>
	</entry>
	<entry>
		<id>https://eternity.youfailit.net/index.php?title=File:Poly_sliding_door.gif&amp;diff=3400</id>
		<title>File:Poly sliding door.gif</title>
		<link rel="alternate" type="text/html" href="https://eternity.youfailit.net/index.php?title=File:Poly_sliding_door.gif&amp;diff=3400"/>
		<updated>2013-02-09T18:30:37Z</updated>

		<summary type="html">&lt;p&gt;Ellmo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Ellmo</name></author>
	</entry>
	<entry>
		<id>https://eternity.youfailit.net/index.php?title=Polyobject_linedef_types&amp;diff=3399</id>
		<title>Polyobject linedef types</title>
		<link rel="alternate" type="text/html" href="https://eternity.youfailit.net/index.php?title=Polyobject_linedef_types&amp;diff=3399"/>
		<updated>2013-02-09T18:25:42Z</updated>

		<summary type="html">&lt;p&gt;Ellmo: moved Polyobject linedef types to Polyobject: The article is about Polyobjects, not just any special LineDef types. Also - &amp;quot;singular article titles as per normal wiki style guidelines.&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Polyobject]]&lt;/div&gt;</summary>
		<author><name>Ellmo</name></author>
	</entry>
	<entry>
		<id>https://eternity.youfailit.net/index.php?title=Polyobject&amp;diff=3398</id>
		<title>Polyobject</title>
		<link rel="alternate" type="text/html" href="https://eternity.youfailit.net/index.php?title=Polyobject&amp;diff=3398"/>
		<updated>2013-02-09T18:25:42Z</updated>

		<summary type="html">&lt;p&gt;Ellmo: moved Polyobject linedef types to Polyobject: The article is about Polyobjects, not just any special LineDef types. Also - &amp;quot;singular article titles as per normal wiki style guidelines.&amp;quot;&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 and ZDoom 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, unlike ZDoom, 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;
{{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 1S 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;
*&#039;&#039;&#039;Method 1: The &#039;&#039;Polyobj_StartLine&#039;&#039; Special&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:The Polyobj_StartLine 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;
    [Control Sector]                     [Main Map Area]&lt;br /&gt;
    +-------------------+          +-------------------------------+&lt;br /&gt;
    |                   |          |                               |&lt;br /&gt;
    |        |          |          |                               |&lt;br /&gt;
    |      +---&amp;gt;+       |          |                               |&lt;br /&gt;
    |      ^    |       |          |                               |&lt;br /&gt;
    |      |    |_      |          |                               |&lt;br /&gt;
    |   A -| B  |       |          |              C                |&lt;br /&gt;
    |      |    v       |          |                               |&lt;br /&gt;
    |      +&amp;lt;---+       |          |                               |&lt;br /&gt;
    |         |         |          |                               |&lt;br /&gt;
    |                   |          |                               |&lt;br /&gt;
    +-------------------+          +-------------------------------+&lt;br /&gt;
:Assume that the linedef A is assigned the Polyobj_StartLine special and has argument #1 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. &lt;br /&gt;
&lt;br /&gt;
:Starting from line A, 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 A, 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 B and C are the two required objects: &lt;br /&gt;
:* B: 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 PolyObject ID). There must be one and only one of these objects for each PolyObject ID. &lt;br /&gt;
:* C: 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 Polyobj_StartLine 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 &#039;&#039;Polyobj_ExplicitLine&#039;&#039; Special &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:The Polyobj_ExplicitLine 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;
    [Control Sector]                     [Main Map Area]&lt;br /&gt;
    +-------------------+          +-------------------------------+&lt;br /&gt;
    |        2          |          |                               |&lt;br /&gt;
    |        |          |          |                               |&lt;br /&gt;
    |      +---&amp;gt;+       |          |                               |&lt;br /&gt;
    |      ^    |       |          |                               |&lt;br /&gt;
    |      |    |_ 4    |          |                               |&lt;br /&gt;
    |   1 -| B  |       |          |              C                |&lt;br /&gt;
    |      |    v       |          |                               |&lt;br /&gt;
    |      +&amp;lt;---+       |          |                               |&lt;br /&gt;
    |         |         |          |                               |&lt;br /&gt;
    |         3         |          |                               |&lt;br /&gt;
    +-------------------+          +-------------------------------+&lt;br /&gt;
:Assume that the linedefs labeled 1 through 4 are assigned the Polyobj_ExplicitLine special, all have argument #1 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 all have argument #2 set to the integer values 1 through 4, corresponding to their labels in the diagram. &lt;br /&gt;
&lt;br /&gt;
:The game engine will search through all linedefs in the entire map for ones with the current PolyObject ID in argument #1 and a value greater than zero in argument #2. The lines will be collected and then sorted by the value in their second argument and added to the PolyObject in that order. Note that unlike Hexen, it is not necessary for the numbers in the second argument to be sequential (ie, a sequence such as { 5, 10, 15, 20 } would also work). &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 StartLine special above. &lt;br /&gt;
:* B: 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 ExplicitLines&#039; first argument (the PolyObject ID). There must be one and only one of these objects for each PolyObject ID. &lt;br /&gt;
:* C: 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 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;
:The complete arguments to Polyobj_ExplicitLine 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;number&#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;
&#039;&#039;&#039;Translating PolyObjects&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
To move a PolyObject in the xy plane, use one of the following line specials: &lt;br /&gt;
* Polyobj_Move &lt;br /&gt;
* Polyobj_OR_Move &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;
&#039;&#039;&#039;Rotating PolyObjects &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
To rotate a PolyObject, use one of the following line specials: &lt;br /&gt;
* Polyobj_RotateRight &lt;br /&gt;
* Polyobj_OR_RotateRight &lt;br /&gt;
* Polyobj_RotateLeft &lt;br /&gt;
* Polyobj_OR_RotateLeft &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 Doors==&lt;br /&gt;
&lt;br /&gt;
There are two distinct types of actions provided to allow PolyObjects to function as doors. 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;
* Polyobj_DoorSlide&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;
* Polyobj_DoorSwing&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;
[[category:Editing reference]]&lt;/div&gt;</summary>
		<author><name>Ellmo</name></author>
	</entry>
	<entry>
		<id>https://eternity.youfailit.net/index.php?title=File:Poly_swigning_door.gif&amp;diff=3397</id>
		<title>File:Poly swigning door.gif</title>
		<link rel="alternate" type="text/html" href="https://eternity.youfailit.net/index.php?title=File:Poly_swigning_door.gif&amp;diff=3397"/>
		<updated>2013-02-09T18:25:10Z</updated>

		<summary type="html">&lt;p&gt;Ellmo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Ellmo</name></author>
	</entry>
	<entry>
		<id>https://eternity.youfailit.net/index.php?title=Portal&amp;diff=3396</id>
		<title>Portal</title>
		<link rel="alternate" type="text/html" href="https://eternity.youfailit.net/index.php?title=Portal&amp;diff=3396"/>
		<updated>2013-02-09T01:35:11Z</updated>

		<summary type="html">&lt;p&gt;Ellmo: /* Faked Reflective Flats */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Portals are a powerful mapping feature which allow a variety of rendering effects; they allow an architectural surface to be used as a &amp;quot;window&amp;quot; which can display something besides the texture that would normally cover the surface. Anything from simple fixed plane, to another area of the map can be rendered within these surfaces via the same architecture.&lt;br /&gt;
&lt;br /&gt;
== Terminology ==&lt;br /&gt;
&lt;br /&gt;
=== Portal Window ===&lt;br /&gt;
&lt;br /&gt;
&#039;Portal window&#039; refers to the area of the screen that a portal occupies. For example:&lt;br /&gt;
&lt;br /&gt;
[[Image:Pterminology01.png]]&lt;br /&gt;
&lt;br /&gt;
This is a simple map with no portal surfaces, and no portal window.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:Pterminology02.png]]&lt;br /&gt;
&lt;br /&gt;
This is the same simple map with a fixed plane portal applied to the ceiling of the sector. The portal window is outlined in white.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:Pterminology03.png]]&lt;br /&gt;
&lt;br /&gt;
This is the map, but the same plane portal is applied to the ceiling and the far wall. The two surfaces display the same portal, and as such, they share a common portal window (also outlined in white).&lt;br /&gt;
&lt;br /&gt;
All surfaces in a scene that have a common portal will share the same portal window.&lt;br /&gt;
&lt;br /&gt;
=== Dummy Sector ===&lt;br /&gt;
A sector off of the main map area which is used by line or sector specials as a model, or as housing for lines which need to be a specific size.&lt;br /&gt;
&lt;br /&gt;
== Fixed Plane Portals ==&lt;br /&gt;
&lt;br /&gt;
Fixed plane portals (as the name implies) render a single, fixed plane into the portal window. The plane is always rendered a the same height and texture offset even when the camera changes its position.&lt;br /&gt;
&lt;br /&gt;
Line specials:&lt;br /&gt;
&lt;br /&gt;
:283 Apply fixed plane portal to the ceilings of tagged sectors&lt;br /&gt;
:284 Apply fixed plane portal to the floors of tagged sectors&lt;br /&gt;
:285 Apply fixed plane portal to the floors and ceilings of tagged sectors&lt;br /&gt;
&lt;br /&gt;
The front side sector of the special line is used to generate the plane. The ceiling texture, sector light, and ceiling texture scrolling are all used as attributes for the rendered fixed plane. The absolute height of the ceiling is used as the height of the plane. That is, if the special line front sector has a ceiling height of 64, the plane will always render at 64 units above the camera height. If the ceiling height is 128, the plane will always render at 128 units above the camera height, and so on.&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
&lt;br /&gt;
[[Image:Pfixedplane01.png]]  [[Image:Pfixedplane02.png]]&lt;br /&gt;
&lt;br /&gt;
The left image shows a simple map with a small sector off to the side of the rest of the map. One of the lines in this sector has been given  a 283 special which will apply a fixed play portal to all tagged sector ceilings. The height of the dummy sector is set to 128, the blue water texture FWATER1 is the ceiling texture, there is no scrolling applied to the ceiling, and the ceiling height is 128.&lt;br /&gt;
&lt;br /&gt;
The right image shows what the map looks like in [[Eternity]]. Notice the rendered height of the plane is the same as a ceiling 128 units above eye level.&lt;br /&gt;
&lt;br /&gt;
The line special 289 can be used to apply fixed plane portals to walls as well. The special will find a portal with the same line tag and will display that portal on the surface of the line.&lt;br /&gt;
&lt;br /&gt;
Here is the map from above:&lt;br /&gt;
&lt;br /&gt;
[[Image:Pfixedplane03.png]]  [[Image:Pfixedplane04.png]]&lt;br /&gt;
&lt;br /&gt;
The highlighted wall has been given a special of 289 and tagged to the portal line. In-game, the tagged wall now displays the portal. Note: The 289 line special works for all portal types.&lt;br /&gt;
&lt;br /&gt;
== Horizon Plane Portals ==&lt;br /&gt;
&lt;br /&gt;
Horizon portals display two planes which appear to go on forever until they meet in the middle (horizon). The plane coordinates are not fixed, and will appear to move with the camera. This can be used to achieve the illusion that water or grass goes off far into the distance without having to make overly large sectors.&lt;br /&gt;
&lt;br /&gt;
Line specials:&lt;br /&gt;
&lt;br /&gt;
:286 Apply horizon portal to the ceilings of tagged sectors&lt;br /&gt;
:287 Apply horizon portal to the floors of tagged sectors&lt;br /&gt;
:288 Apply horizon portal to the floors and ceilings of tagged sectors&lt;br /&gt;
&lt;br /&gt;
Like the fixed plane portals, the front sector of the special line is used. The top plane uses the front sector ceiling (height, texture, scrolling, light) as its model, and the bottom plane uses the front sector floor (height, texture, scrolling, light) as its model. Example:&lt;br /&gt;
&lt;br /&gt;
[[Image:Phorizon01.png]]&lt;br /&gt;
&lt;br /&gt;
This map has a horizon portal applied to the ceiling and wall of the sector where the player starts. Both sectors have a floor height of 0, and a ceiling height of 72, but the floor texture in the dummy sector is set to a grass texture, and the ceiling texture is set to FSKY_1. This produces a field of grass which goes on into the horizon. If the camera moves up or down, the floor plane will appear to move along with it. If the ceiling plane had a regular texture on it, it would also move with the camera and appear to go off into the distance.&lt;br /&gt;
&lt;br /&gt;
Note: If the camera ever travels below the floor height of a horizon portal, the bottom plane will appear to move in the opposite direction of the camera movement until the camera is once again above the floor height.&lt;br /&gt;
&lt;br /&gt;
== Skybox Portals ==&lt;br /&gt;
&lt;br /&gt;
Skybox portals draw another part of the map into the portal window. The scene in the portal window will use the angle from the player camera, but will render the scene from the location of the skybox camera. This helps create the illusion that the contents of the skybox actually surround the map and are much larger in size than they really are.&lt;br /&gt;
&lt;br /&gt;
Line specials:&lt;br /&gt;
&lt;br /&gt;
:290 Apply skybox portals to the ceilings of tagged sectors&lt;br /&gt;
:291 Apply skybox portals to the floors of tagged sectors&lt;br /&gt;
:292 Apply skybox portals to the floors and ceilings of tagged sectors&lt;br /&gt;
&lt;br /&gt;
The front sector of the special line becomes the &amp;quot;skybox sector&amp;quot;. This is not the only sector that gets rendered, but this sector is where [[Eternity]] will look for the skybox camera object which will be the point the skybox is rendered from.&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
&lt;br /&gt;
[[Image:Pskybox01.png]]&lt;br /&gt;
&lt;br /&gt;
This map has a skybox portal applied to the ceiling and wall of the sector with the player start. The &amp;quot;Skybox sector&amp;quot; is the small rectangular one which contains the EESkyboxCam object. The camera object always spawns on the floor, so the skybox sector has been made a glass floor 48 units above the surrounding area so the camera will be above the floor of the box.&lt;br /&gt;
&lt;br /&gt;
[[Image:Pskybox02.png]] [[Image:Pskybox03.png]]&lt;br /&gt;
&lt;br /&gt;
The first image is the view in-game when the player no-clips into the sky box. The second image is the view from inside the main map area with the skybox portal applied. No matter where the player moves inside the map area, the skybox portal will always render from the location of the camera inside the skybox, however, the skybox is rendered from the angle the player is looking. [[ExtraData]] also provides a means of assigning a z-height to objects in maps. This could also be used to raise the skybox camera off the floor. If the skybox camera is left on the floor, the floor plane will not render and result in [[Doom Wiki:HOM|HOM]].&lt;br /&gt;
&lt;br /&gt;
The skybox is not restricted to simple boxes. Any map architecture the skybox camera can see can be part of a skybox. Below is an example of a basic mountainous landscape created with map architecture. &lt;br /&gt;
&lt;br /&gt;
[[Image:Pskybox04.png]]&lt;br /&gt;
&lt;br /&gt;
== Anchored Portals ==&lt;br /&gt;
&lt;br /&gt;
Anchored portals are the most powerful and complex of all the basic portal types. Anchored portals will render another area of the map into the portal window, but the portal camera moves as the player moves, creating the illusion that the other area of the map is actually connected to the main area. This can be used to create the appearance of 3D architecture. Before use, however, an understanding of how these portals work is important.&lt;br /&gt;
&lt;br /&gt;
In order to piece the parts of a map together, an anchored portal needs to know how far apart they are. The distance is determined with the use of specific line specials. Each anchored portal needs a &amp;quot;portal line&amp;quot; (the line with the anchored portal special) which usually area the portal should render, and an &amp;quot;anchor line&amp;quot; which is usually located in the main map area. The distance between these lines becomes the offset, that is, how far [[Eternity]] needs to move the camera from where the player stands to get the portal area.&lt;br /&gt;
&lt;br /&gt;
Line specials:&lt;br /&gt;
&lt;br /&gt;
:295 Apply anchored portal to the ceilings of all tagged sectors&lt;br /&gt;
:296 Apply anchored portal to the floors of all tagged sectors&lt;br /&gt;
:297 Apply anchored portal to the floors and ceilings of all tagged sectors&lt;br /&gt;
:298 Anchor line (for specials 295 and 297)&lt;br /&gt;
:299 Anchor line (for special 296)&lt;br /&gt;
&lt;br /&gt;
There are two different anchor line types so a different anchored portal can be placed on the ceiling and floor of the same sector. The two portals will share the sector tag.&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
&lt;br /&gt;
[[Image:Panchored01.png]]&lt;br /&gt;
&lt;br /&gt;
The above map has a single anchored portal applied to the inner sector of the area the player start is in. The &amp;quot;portal area&amp;quot; is to the right, and the &amp;quot;main area&amp;quot; is to the left. The view height is not changed, so the portal area needs to be set above the main area, or there will be [[Doom Wiki:HOM|HOM]] in the portal window. Note that no camera objects are needed for this effect. The portal will create a temporary camera automatically.&lt;br /&gt;
&lt;br /&gt;
Here&#039;s how it works:&lt;br /&gt;
&lt;br /&gt;
When the map is loaded, the the centers of both lines (the portal and the anchor line) are calculated, and the distance between those centers is determined:&lt;br /&gt;
&lt;br /&gt;
[[Image:Panchored03.png]]&lt;br /&gt;
&lt;br /&gt;
In the example, the distance is 512 units to the east and 0 units north. This set of numbers becomes the &amp;quot;portal offset&amp;quot; (distance between where the player stands and where the portal camera should go) and when the portal is rendered, the portal camera is place 512 map units east of the player camera, and the map is rendered from the portal camera. &lt;br /&gt;
&lt;br /&gt;
If the portal camera becomes obstructed, unwanted results can occur:&lt;br /&gt;
&lt;br /&gt;
[[Image:Panchored04.png]]&lt;br /&gt;
&lt;br /&gt;
In the example above, the camera actually &amp;quot;wanders&amp;quot; out of the portal area and into the main part of the map resulting in an unwanted wall rendering in the portal window. To prevent occurrences such as this, it is usually a good idea to place the portal area a good distance away from any other map architecture to prevent the camera from &amp;quot;wandering into&amp;quot; anything else. If the camera moves out of the portal area, it won&#039;t cause problems as long as it is not obstructed by other map architecture.&lt;br /&gt;
&lt;br /&gt;
== Portals Faking Reflective Flats ==&lt;br /&gt;
[[Image:Reflective_portals.png|320px]]&lt;br /&gt;
&lt;br /&gt;
When paired with &#039;&#039;[[ExtraData]]&#039;&#039; lump, anchored portals can fake a reflecting floor / ceiling effect.&lt;br /&gt;
&lt;br /&gt;
To achieve this you need to:&lt;br /&gt;
* Recreate an z-mirrored copy of the rooms you want to be reflected.&lt;br /&gt;
* Connect portals as you&#039;d normally do.&lt;br /&gt;
* Enable &#039;&#039;&#039;ExtraData&#039;&#039;&#039; definition for a sector (i.e. give a &#039;&#039;401&#039;&#039; special to a LineDef facing the sector which flat&#039;s alpha you want to modify).&lt;br /&gt;
* Add [[MapInfo]] lump that calls specific &#039;&#039;&#039;ExtraData&#039;&#039;&#039; script when map is played:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[MAP01]&lt;br /&gt;
    levelname = my level&lt;br /&gt;
    extradata = EXTRA01&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Add &#039;&#039;&#039;EXTRA01&#039;&#039;&#039; lump containing something along those lines:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sector {&lt;br /&gt;
	recordnum 1&lt;br /&gt;
	portalflags.floor overlay&lt;br /&gt;
	overlayalpha.floor 50%&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: &#039;&#039;See: [[Portal#Examples]]&#039;&#039; for a demonstration file&lt;br /&gt;
&lt;br /&gt;
== Linked Portals ==&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;See: [[Linked portals]]&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Category:Editing]]&lt;br /&gt;
&lt;br /&gt;
==Examples==&lt;br /&gt;
[https://s3-eu-west-1.amazonaws.com/eternity/portals_reflective.wad portals faking reflective floors]&lt;/div&gt;</summary>
		<author><name>Ellmo</name></author>
	</entry>
	<entry>
		<id>https://eternity.youfailit.net/index.php?title=Portal&amp;diff=3395</id>
		<title>Portal</title>
		<link rel="alternate" type="text/html" href="https://eternity.youfailit.net/index.php?title=Portal&amp;diff=3395"/>
		<updated>2013-02-09T01:12:30Z</updated>

		<summary type="html">&lt;p&gt;Ellmo: /* Faked reflective floors */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Portals are a powerful mapping feature which allow a variety of rendering effects; they allow an architectural surface to be used as a &amp;quot;window&amp;quot; which can display something besides the texture that would normally cover the surface. Anything from simple fixed plane, to another area of the map can be rendered within these surfaces via the same architecture.&lt;br /&gt;
&lt;br /&gt;
== Terminology ==&lt;br /&gt;
&lt;br /&gt;
=== Portal Window ===&lt;br /&gt;
&lt;br /&gt;
&#039;Portal window&#039; refers to the area of the screen that a portal occupies. For example:&lt;br /&gt;
&lt;br /&gt;
[[Image:Pterminology01.png]]&lt;br /&gt;
&lt;br /&gt;
This is a simple map with no portal surfaces, and no portal window.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:Pterminology02.png]]&lt;br /&gt;
&lt;br /&gt;
This is the same simple map with a fixed plane portal applied to the ceiling of the sector. The portal window is outlined in white.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:Pterminology03.png]]&lt;br /&gt;
&lt;br /&gt;
This is the map, but the same plane portal is applied to the ceiling and the far wall. The two surfaces display the same portal, and as such, they share a common portal window (also outlined in white).&lt;br /&gt;
&lt;br /&gt;
All surfaces in a scene that have a common portal will share the same portal window.&lt;br /&gt;
&lt;br /&gt;
=== Dummy Sector ===&lt;br /&gt;
A sector off of the main map area which is used by line or sector specials as a model, or as housing for lines which need to be a specific size.&lt;br /&gt;
&lt;br /&gt;
== Fixed Plane Portals ==&lt;br /&gt;
&lt;br /&gt;
Fixed plane portals (as the name implies) render a single, fixed plane into the portal window. The plane is always rendered a the same height and texture offset even when the camera changes its position.&lt;br /&gt;
&lt;br /&gt;
Line specials:&lt;br /&gt;
&lt;br /&gt;
:283 Apply fixed plane portal to the ceilings of tagged sectors&lt;br /&gt;
:284 Apply fixed plane portal to the floors of tagged sectors&lt;br /&gt;
:285 Apply fixed plane portal to the floors and ceilings of tagged sectors&lt;br /&gt;
&lt;br /&gt;
The front side sector of the special line is used to generate the plane. The ceiling texture, sector light, and ceiling texture scrolling are all used as attributes for the rendered fixed plane. The absolute height of the ceiling is used as the height of the plane. That is, if the special line front sector has a ceiling height of 64, the plane will always render at 64 units above the camera height. If the ceiling height is 128, the plane will always render at 128 units above the camera height, and so on.&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
&lt;br /&gt;
[[Image:Pfixedplane01.png]]  [[Image:Pfixedplane02.png]]&lt;br /&gt;
&lt;br /&gt;
The left image shows a simple map with a small sector off to the side of the rest of the map. One of the lines in this sector has been given  a 283 special which will apply a fixed play portal to all tagged sector ceilings. The height of the dummy sector is set to 128, the blue water texture FWATER1 is the ceiling texture, there is no scrolling applied to the ceiling, and the ceiling height is 128.&lt;br /&gt;
&lt;br /&gt;
The right image shows what the map looks like in [[Eternity]]. Notice the rendered height of the plane is the same as a ceiling 128 units above eye level.&lt;br /&gt;
&lt;br /&gt;
The line special 289 can be used to apply fixed plane portals to walls as well. The special will find a portal with the same line tag and will display that portal on the surface of the line.&lt;br /&gt;
&lt;br /&gt;
Here is the map from above:&lt;br /&gt;
&lt;br /&gt;
[[Image:Pfixedplane03.png]]  [[Image:Pfixedplane04.png]]&lt;br /&gt;
&lt;br /&gt;
The highlighted wall has been given a special of 289 and tagged to the portal line. In-game, the tagged wall now displays the portal. Note: The 289 line special works for all portal types.&lt;br /&gt;
&lt;br /&gt;
== Horizon Plane Portals ==&lt;br /&gt;
&lt;br /&gt;
Horizon portals display two planes which appear to go on forever until they meet in the middle (horizon). The plane coordinates are not fixed, and will appear to move with the camera. This can be used to achieve the illusion that water or grass goes off far into the distance without having to make overly large sectors.&lt;br /&gt;
&lt;br /&gt;
Line specials:&lt;br /&gt;
&lt;br /&gt;
:286 Apply horizon portal to the ceilings of tagged sectors&lt;br /&gt;
:287 Apply horizon portal to the floors of tagged sectors&lt;br /&gt;
:288 Apply horizon portal to the floors and ceilings of tagged sectors&lt;br /&gt;
&lt;br /&gt;
Like the fixed plane portals, the front sector of the special line is used. The top plane uses the front sector ceiling (height, texture, scrolling, light) as its model, and the bottom plane uses the front sector floor (height, texture, scrolling, light) as its model. Example:&lt;br /&gt;
&lt;br /&gt;
[[Image:Phorizon01.png]]&lt;br /&gt;
&lt;br /&gt;
This map has a horizon portal applied to the ceiling and wall of the sector where the player starts. Both sectors have a floor height of 0, and a ceiling height of 72, but the floor texture in the dummy sector is set to a grass texture, and the ceiling texture is set to FSKY_1. This produces a field of grass which goes on into the horizon. If the camera moves up or down, the floor plane will appear to move along with it. If the ceiling plane had a regular texture on it, it would also move with the camera and appear to go off into the distance.&lt;br /&gt;
&lt;br /&gt;
Note: If the camera ever travels below the floor height of a horizon portal, the bottom plane will appear to move in the opposite direction of the camera movement until the camera is once again above the floor height.&lt;br /&gt;
&lt;br /&gt;
== Skybox Portals ==&lt;br /&gt;
&lt;br /&gt;
Skybox portals draw another part of the map into the portal window. The scene in the portal window will use the angle from the player camera, but will render the scene from the location of the skybox camera. This helps create the illusion that the contents of the skybox actually surround the map and are much larger in size than they really are.&lt;br /&gt;
&lt;br /&gt;
Line specials:&lt;br /&gt;
&lt;br /&gt;
:290 Apply skybox portals to the ceilings of tagged sectors&lt;br /&gt;
:291 Apply skybox portals to the floors of tagged sectors&lt;br /&gt;
:292 Apply skybox portals to the floors and ceilings of tagged sectors&lt;br /&gt;
&lt;br /&gt;
The front sector of the special line becomes the &amp;quot;skybox sector&amp;quot;. This is not the only sector that gets rendered, but this sector is where [[Eternity]] will look for the skybox camera object which will be the point the skybox is rendered from.&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
&lt;br /&gt;
[[Image:Pskybox01.png]]&lt;br /&gt;
&lt;br /&gt;
This map has a skybox portal applied to the ceiling and wall of the sector with the player start. The &amp;quot;Skybox sector&amp;quot; is the small rectangular one which contains the EESkyboxCam object. The camera object always spawns on the floor, so the skybox sector has been made a glass floor 48 units above the surrounding area so the camera will be above the floor of the box.&lt;br /&gt;
&lt;br /&gt;
[[Image:Pskybox02.png]] [[Image:Pskybox03.png]]&lt;br /&gt;
&lt;br /&gt;
The first image is the view in-game when the player no-clips into the sky box. The second image is the view from inside the main map area with the skybox portal applied. No matter where the player moves inside the map area, the skybox portal will always render from the location of the camera inside the skybox, however, the skybox is rendered from the angle the player is looking. [[ExtraData]] also provides a means of assigning a z-height to objects in maps. This could also be used to raise the skybox camera off the floor. If the skybox camera is left on the floor, the floor plane will not render and result in [[Doom Wiki:HOM|HOM]].&lt;br /&gt;
&lt;br /&gt;
The skybox is not restricted to simple boxes. Any map architecture the skybox camera can see can be part of a skybox. Below is an example of a basic mountainous landscape created with map architecture. &lt;br /&gt;
&lt;br /&gt;
[[Image:Pskybox04.png]]&lt;br /&gt;
&lt;br /&gt;
== Anchored Portals ==&lt;br /&gt;
&lt;br /&gt;
Anchored portals are the most powerful and complex of all the basic portal types. Anchored portals will render another area of the map into the portal window, but the portal camera moves as the player moves, creating the illusion that the other area of the map is actually connected to the main area. This can be used to create the appearance of 3D architecture. Before use, however, an understanding of how these portals work is important.&lt;br /&gt;
&lt;br /&gt;
In order to piece the parts of a map together, an anchored portal needs to know how far apart they are. The distance is determined with the use of specific line specials. Each anchored portal needs a &amp;quot;portal line&amp;quot; (the line with the anchored portal special) which usually area the portal should render, and an &amp;quot;anchor line&amp;quot; which is usually located in the main map area. The distance between these lines becomes the offset, that is, how far [[Eternity]] needs to move the camera from where the player stands to get the portal area.&lt;br /&gt;
&lt;br /&gt;
Line specials:&lt;br /&gt;
&lt;br /&gt;
:295 Apply anchored portal to the ceilings of all tagged sectors&lt;br /&gt;
:296 Apply anchored portal to the floors of all tagged sectors&lt;br /&gt;
:297 Apply anchored portal to the floors and ceilings of all tagged sectors&lt;br /&gt;
:298 Anchor line (for specials 295 and 297)&lt;br /&gt;
:299 Anchor line (for special 296)&lt;br /&gt;
&lt;br /&gt;
There are two different anchor line types so a different anchored portal can be placed on the ceiling and floor of the same sector. The two portals will share the sector tag.&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
&lt;br /&gt;
[[Image:Panchored01.png]]&lt;br /&gt;
&lt;br /&gt;
The above map has a single anchored portal applied to the inner sector of the area the player start is in. The &amp;quot;portal area&amp;quot; is to the right, and the &amp;quot;main area&amp;quot; is to the left. The view height is not changed, so the portal area needs to be set above the main area, or there will be [[Doom Wiki:HOM|HOM]] in the portal window. Note that no camera objects are needed for this effect. The portal will create a temporary camera automatically.&lt;br /&gt;
&lt;br /&gt;
Here&#039;s how it works:&lt;br /&gt;
&lt;br /&gt;
When the map is loaded, the the centers of both lines (the portal and the anchor line) are calculated, and the distance between those centers is determined:&lt;br /&gt;
&lt;br /&gt;
[[Image:Panchored03.png]]&lt;br /&gt;
&lt;br /&gt;
In the example, the distance is 512 units to the east and 0 units north. This set of numbers becomes the &amp;quot;portal offset&amp;quot; (distance between where the player stands and where the portal camera should go) and when the portal is rendered, the portal camera is place 512 map units east of the player camera, and the map is rendered from the portal camera. &lt;br /&gt;
&lt;br /&gt;
If the portal camera becomes obstructed, unwanted results can occur:&lt;br /&gt;
&lt;br /&gt;
[[Image:Panchored04.png]]&lt;br /&gt;
&lt;br /&gt;
In the example above, the camera actually &amp;quot;wanders&amp;quot; out of the portal area and into the main part of the map resulting in an unwanted wall rendering in the portal window. To prevent occurrences such as this, it is usually a good idea to place the portal area a good distance away from any other map architecture to prevent the camera from &amp;quot;wandering into&amp;quot; anything else. If the camera moves out of the portal area, it won&#039;t cause problems as long as it is not obstructed by other map architecture.&lt;br /&gt;
&lt;br /&gt;
== Faked Reflective Flats ==&lt;br /&gt;
[[Image:Reflective_portals.png|320px]]&lt;br /&gt;
&lt;br /&gt;
When paired with &#039;&#039;[[ExtraData]]&#039;&#039; lump, anchored portals can fake a reflecting floor / ceiling effect.&lt;br /&gt;
&lt;br /&gt;
To achieve this you need to:&lt;br /&gt;
* Recreate an z-mirrored copy of the rooms you want to be reflected.&lt;br /&gt;
* Connect portals as you&#039;d normally do.&lt;br /&gt;
* Enable &#039;&#039;&#039;ExtraData&#039;&#039;&#039; definition for a sector (i.e. give a &#039;&#039;401&#039;&#039; special to a LineDef facing the sector which flat&#039;s alpha you want to modify).&lt;br /&gt;
* Add [[MapInfo]] lump that calls specific &#039;&#039;&#039;ExtraData&#039;&#039;&#039; script when map is played:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[MAP01]&lt;br /&gt;
    levelname = my level&lt;br /&gt;
    extradata = EXTRA01&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Add &#039;&#039;&#039;EXTRA01&#039;&#039;&#039; lump containing something along those lines:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sector {&lt;br /&gt;
	recordnum 1&lt;br /&gt;
	portalflags.floor overlay&lt;br /&gt;
	overlayalpha.floor 50%&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: &#039;&#039;See: [[Portal#Examples]]&#039;&#039; for a demonstration file&lt;br /&gt;
&lt;br /&gt;
== Linked Portals ==&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;See: [[Linked portals]]&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Category:Editing]]&lt;br /&gt;
&lt;br /&gt;
==Examples==&lt;br /&gt;
[https://s3-eu-west-1.amazonaws.com/eternity/portals_reflective.wad portals faking reflective floors]&lt;/div&gt;</summary>
		<author><name>Ellmo</name></author>
	</entry>
	<entry>
		<id>https://eternity.youfailit.net/index.php?title=Portal&amp;diff=3394</id>
		<title>Portal</title>
		<link rel="alternate" type="text/html" href="https://eternity.youfailit.net/index.php?title=Portal&amp;diff=3394"/>
		<updated>2013-02-09T01:11:08Z</updated>

		<summary type="html">&lt;p&gt;Ellmo: /* Faked reflective floors */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Portals are a powerful mapping feature which allow a variety of rendering effects; they allow an architectural surface to be used as a &amp;quot;window&amp;quot; which can display something besides the texture that would normally cover the surface. Anything from simple fixed plane, to another area of the map can be rendered within these surfaces via the same architecture.&lt;br /&gt;
&lt;br /&gt;
== Terminology ==&lt;br /&gt;
&lt;br /&gt;
=== Portal Window ===&lt;br /&gt;
&lt;br /&gt;
&#039;Portal window&#039; refers to the area of the screen that a portal occupies. For example:&lt;br /&gt;
&lt;br /&gt;
[[Image:Pterminology01.png]]&lt;br /&gt;
&lt;br /&gt;
This is a simple map with no portal surfaces, and no portal window.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:Pterminology02.png]]&lt;br /&gt;
&lt;br /&gt;
This is the same simple map with a fixed plane portal applied to the ceiling of the sector. The portal window is outlined in white.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:Pterminology03.png]]&lt;br /&gt;
&lt;br /&gt;
This is the map, but the same plane portal is applied to the ceiling and the far wall. The two surfaces display the same portal, and as such, they share a common portal window (also outlined in white).&lt;br /&gt;
&lt;br /&gt;
All surfaces in a scene that have a common portal will share the same portal window.&lt;br /&gt;
&lt;br /&gt;
=== Dummy Sector ===&lt;br /&gt;
A sector off of the main map area which is used by line or sector specials as a model, or as housing for lines which need to be a specific size.&lt;br /&gt;
&lt;br /&gt;
== Fixed Plane Portals ==&lt;br /&gt;
&lt;br /&gt;
Fixed plane portals (as the name implies) render a single, fixed plane into the portal window. The plane is always rendered a the same height and texture offset even when the camera changes its position.&lt;br /&gt;
&lt;br /&gt;
Line specials:&lt;br /&gt;
&lt;br /&gt;
:283 Apply fixed plane portal to the ceilings of tagged sectors&lt;br /&gt;
:284 Apply fixed plane portal to the floors of tagged sectors&lt;br /&gt;
:285 Apply fixed plane portal to the floors and ceilings of tagged sectors&lt;br /&gt;
&lt;br /&gt;
The front side sector of the special line is used to generate the plane. The ceiling texture, sector light, and ceiling texture scrolling are all used as attributes for the rendered fixed plane. The absolute height of the ceiling is used as the height of the plane. That is, if the special line front sector has a ceiling height of 64, the plane will always render at 64 units above the camera height. If the ceiling height is 128, the plane will always render at 128 units above the camera height, and so on.&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
&lt;br /&gt;
[[Image:Pfixedplane01.png]]  [[Image:Pfixedplane02.png]]&lt;br /&gt;
&lt;br /&gt;
The left image shows a simple map with a small sector off to the side of the rest of the map. One of the lines in this sector has been given  a 283 special which will apply a fixed play portal to all tagged sector ceilings. The height of the dummy sector is set to 128, the blue water texture FWATER1 is the ceiling texture, there is no scrolling applied to the ceiling, and the ceiling height is 128.&lt;br /&gt;
&lt;br /&gt;
The right image shows what the map looks like in [[Eternity]]. Notice the rendered height of the plane is the same as a ceiling 128 units above eye level.&lt;br /&gt;
&lt;br /&gt;
The line special 289 can be used to apply fixed plane portals to walls as well. The special will find a portal with the same line tag and will display that portal on the surface of the line.&lt;br /&gt;
&lt;br /&gt;
Here is the map from above:&lt;br /&gt;
&lt;br /&gt;
[[Image:Pfixedplane03.png]]  [[Image:Pfixedplane04.png]]&lt;br /&gt;
&lt;br /&gt;
The highlighted wall has been given a special of 289 and tagged to the portal line. In-game, the tagged wall now displays the portal. Note: The 289 line special works for all portal types.&lt;br /&gt;
&lt;br /&gt;
== Horizon Plane Portals ==&lt;br /&gt;
&lt;br /&gt;
Horizon portals display two planes which appear to go on forever until they meet in the middle (horizon). The plane coordinates are not fixed, and will appear to move with the camera. This can be used to achieve the illusion that water or grass goes off far into the distance without having to make overly large sectors.&lt;br /&gt;
&lt;br /&gt;
Line specials:&lt;br /&gt;
&lt;br /&gt;
:286 Apply horizon portal to the ceilings of tagged sectors&lt;br /&gt;
:287 Apply horizon portal to the floors of tagged sectors&lt;br /&gt;
:288 Apply horizon portal to the floors and ceilings of tagged sectors&lt;br /&gt;
&lt;br /&gt;
Like the fixed plane portals, the front sector of the special line is used. The top plane uses the front sector ceiling (height, texture, scrolling, light) as its model, and the bottom plane uses the front sector floor (height, texture, scrolling, light) as its model. Example:&lt;br /&gt;
&lt;br /&gt;
[[Image:Phorizon01.png]]&lt;br /&gt;
&lt;br /&gt;
This map has a horizon portal applied to the ceiling and wall of the sector where the player starts. Both sectors have a floor height of 0, and a ceiling height of 72, but the floor texture in the dummy sector is set to a grass texture, and the ceiling texture is set to FSKY_1. This produces a field of grass which goes on into the horizon. If the camera moves up or down, the floor plane will appear to move along with it. If the ceiling plane had a regular texture on it, it would also move with the camera and appear to go off into the distance.&lt;br /&gt;
&lt;br /&gt;
Note: If the camera ever travels below the floor height of a horizon portal, the bottom plane will appear to move in the opposite direction of the camera movement until the camera is once again above the floor height.&lt;br /&gt;
&lt;br /&gt;
== Skybox Portals ==&lt;br /&gt;
&lt;br /&gt;
Skybox portals draw another part of the map into the portal window. The scene in the portal window will use the angle from the player camera, but will render the scene from the location of the skybox camera. This helps create the illusion that the contents of the skybox actually surround the map and are much larger in size than they really are.&lt;br /&gt;
&lt;br /&gt;
Line specials:&lt;br /&gt;
&lt;br /&gt;
:290 Apply skybox portals to the ceilings of tagged sectors&lt;br /&gt;
:291 Apply skybox portals to the floors of tagged sectors&lt;br /&gt;
:292 Apply skybox portals to the floors and ceilings of tagged sectors&lt;br /&gt;
&lt;br /&gt;
The front sector of the special line becomes the &amp;quot;skybox sector&amp;quot;. This is not the only sector that gets rendered, but this sector is where [[Eternity]] will look for the skybox camera object which will be the point the skybox is rendered from.&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
&lt;br /&gt;
[[Image:Pskybox01.png]]&lt;br /&gt;
&lt;br /&gt;
This map has a skybox portal applied to the ceiling and wall of the sector with the player start. The &amp;quot;Skybox sector&amp;quot; is the small rectangular one which contains the EESkyboxCam object. The camera object always spawns on the floor, so the skybox sector has been made a glass floor 48 units above the surrounding area so the camera will be above the floor of the box.&lt;br /&gt;
&lt;br /&gt;
[[Image:Pskybox02.png]] [[Image:Pskybox03.png]]&lt;br /&gt;
&lt;br /&gt;
The first image is the view in-game when the player no-clips into the sky box. The second image is the view from inside the main map area with the skybox portal applied. No matter where the player moves inside the map area, the skybox portal will always render from the location of the camera inside the skybox, however, the skybox is rendered from the angle the player is looking. [[ExtraData]] also provides a means of assigning a z-height to objects in maps. This could also be used to raise the skybox camera off the floor. If the skybox camera is left on the floor, the floor plane will not render and result in [[Doom Wiki:HOM|HOM]].&lt;br /&gt;
&lt;br /&gt;
The skybox is not restricted to simple boxes. Any map architecture the skybox camera can see can be part of a skybox. Below is an example of a basic mountainous landscape created with map architecture. &lt;br /&gt;
&lt;br /&gt;
[[Image:Pskybox04.png]]&lt;br /&gt;
&lt;br /&gt;
== Anchored Portals ==&lt;br /&gt;
&lt;br /&gt;
Anchored portals are the most powerful and complex of all the basic portal types. Anchored portals will render another area of the map into the portal window, but the portal camera moves as the player moves, creating the illusion that the other area of the map is actually connected to the main area. This can be used to create the appearance of 3D architecture. Before use, however, an understanding of how these portals work is important.&lt;br /&gt;
&lt;br /&gt;
In order to piece the parts of a map together, an anchored portal needs to know how far apart they are. The distance is determined with the use of specific line specials. Each anchored portal needs a &amp;quot;portal line&amp;quot; (the line with the anchored portal special) which usually area the portal should render, and an &amp;quot;anchor line&amp;quot; which is usually located in the main map area. The distance between these lines becomes the offset, that is, how far [[Eternity]] needs to move the camera from where the player stands to get the portal area.&lt;br /&gt;
&lt;br /&gt;
Line specials:&lt;br /&gt;
&lt;br /&gt;
:295 Apply anchored portal to the ceilings of all tagged sectors&lt;br /&gt;
:296 Apply anchored portal to the floors of all tagged sectors&lt;br /&gt;
:297 Apply anchored portal to the floors and ceilings of all tagged sectors&lt;br /&gt;
:298 Anchor line (for specials 295 and 297)&lt;br /&gt;
:299 Anchor line (for special 296)&lt;br /&gt;
&lt;br /&gt;
There are two different anchor line types so a different anchored portal can be placed on the ceiling and floor of the same sector. The two portals will share the sector tag.&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
&lt;br /&gt;
[[Image:Panchored01.png]]&lt;br /&gt;
&lt;br /&gt;
The above map has a single anchored portal applied to the inner sector of the area the player start is in. The &amp;quot;portal area&amp;quot; is to the right, and the &amp;quot;main area&amp;quot; is to the left. The view height is not changed, so the portal area needs to be set above the main area, or there will be [[Doom Wiki:HOM|HOM]] in the portal window. Note that no camera objects are needed for this effect. The portal will create a temporary camera automatically.&lt;br /&gt;
&lt;br /&gt;
Here&#039;s how it works:&lt;br /&gt;
&lt;br /&gt;
When the map is loaded, the the centers of both lines (the portal and the anchor line) are calculated, and the distance between those centers is determined:&lt;br /&gt;
&lt;br /&gt;
[[Image:Panchored03.png]]&lt;br /&gt;
&lt;br /&gt;
In the example, the distance is 512 units to the east and 0 units north. This set of numbers becomes the &amp;quot;portal offset&amp;quot; (distance between where the player stands and where the portal camera should go) and when the portal is rendered, the portal camera is place 512 map units east of the player camera, and the map is rendered from the portal camera. &lt;br /&gt;
&lt;br /&gt;
If the portal camera becomes obstructed, unwanted results can occur:&lt;br /&gt;
&lt;br /&gt;
[[Image:Panchored04.png]]&lt;br /&gt;
&lt;br /&gt;
In the example above, the camera actually &amp;quot;wanders&amp;quot; out of the portal area and into the main part of the map resulting in an unwanted wall rendering in the portal window. To prevent occurrences such as this, it is usually a good idea to place the portal area a good distance away from any other map architecture to prevent the camera from &amp;quot;wandering into&amp;quot; anything else. If the camera moves out of the portal area, it won&#039;t cause problems as long as it is not obstructed by other map architecture.&lt;br /&gt;
&lt;br /&gt;
== Faked reflective floors ==&lt;br /&gt;
[[Image:Reflective_portals.png|320px]]&lt;br /&gt;
&lt;br /&gt;
When paired with &#039;&#039;[[ExtraData]]&#039;&#039; lump, anchored portals can fake a reflecting floor / ceiling effect.&lt;br /&gt;
&lt;br /&gt;
To achieve this you need to:&lt;br /&gt;
* Recreate an z-mirrored copy of the rooms you want to be reflected.&lt;br /&gt;
* Connect portals as you&#039;d normally do.&lt;br /&gt;
* Enable &#039;&#039;&#039;ExtraData&#039;&#039;&#039; definition for a sector (i.e. give a &#039;&#039;401&#039;&#039; special to a LineDef facing the sector which flat&#039;s alpha you want to modify).&lt;br /&gt;
* Add [[MapInfo]] lump that calls specific &#039;&#039;&#039;ExtraData&#039;&#039;&#039; script when map is played:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[MAP01]&lt;br /&gt;
    levelname = my level&lt;br /&gt;
    extradata = EXTRA01&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Add &#039;&#039;&#039;EXTRA01&#039;&#039;&#039; lump containing something along those lines:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sector {&lt;br /&gt;
	recordnum 1&lt;br /&gt;
	portalflags.floor overlay&lt;br /&gt;
	overlayalpha.floor 50%&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: &#039;&#039;See: [[Portal#Examples]]&#039;&#039; for a demonstration file&lt;br /&gt;
&lt;br /&gt;
== Linked Portals ==&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;See: [[Linked portals]]&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Category:Editing]]&lt;br /&gt;
&lt;br /&gt;
==Examples==&lt;br /&gt;
[https://s3-eu-west-1.amazonaws.com/eternity/portals_reflective.wad portals faking reflective floors]&lt;/div&gt;</summary>
		<author><name>Ellmo</name></author>
	</entry>
	<entry>
		<id>https://eternity.youfailit.net/index.php?title=Portal&amp;diff=3393</id>
		<title>Portal</title>
		<link rel="alternate" type="text/html" href="https://eternity.youfailit.net/index.php?title=Portal&amp;diff=3393"/>
		<updated>2013-02-09T01:10:29Z</updated>

		<summary type="html">&lt;p&gt;Ellmo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Portals are a powerful mapping feature which allow a variety of rendering effects; they allow an architectural surface to be used as a &amp;quot;window&amp;quot; which can display something besides the texture that would normally cover the surface. Anything from simple fixed plane, to another area of the map can be rendered within these surfaces via the same architecture.&lt;br /&gt;
&lt;br /&gt;
== Terminology ==&lt;br /&gt;
&lt;br /&gt;
=== Portal Window ===&lt;br /&gt;
&lt;br /&gt;
&#039;Portal window&#039; refers to the area of the screen that a portal occupies. For example:&lt;br /&gt;
&lt;br /&gt;
[[Image:Pterminology01.png]]&lt;br /&gt;
&lt;br /&gt;
This is a simple map with no portal surfaces, and no portal window.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:Pterminology02.png]]&lt;br /&gt;
&lt;br /&gt;
This is the same simple map with a fixed plane portal applied to the ceiling of the sector. The portal window is outlined in white.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:Pterminology03.png]]&lt;br /&gt;
&lt;br /&gt;
This is the map, but the same plane portal is applied to the ceiling and the far wall. The two surfaces display the same portal, and as such, they share a common portal window (also outlined in white).&lt;br /&gt;
&lt;br /&gt;
All surfaces in a scene that have a common portal will share the same portal window.&lt;br /&gt;
&lt;br /&gt;
=== Dummy Sector ===&lt;br /&gt;
A sector off of the main map area which is used by line or sector specials as a model, or as housing for lines which need to be a specific size.&lt;br /&gt;
&lt;br /&gt;
== Fixed Plane Portals ==&lt;br /&gt;
&lt;br /&gt;
Fixed plane portals (as the name implies) render a single, fixed plane into the portal window. The plane is always rendered a the same height and texture offset even when the camera changes its position.&lt;br /&gt;
&lt;br /&gt;
Line specials:&lt;br /&gt;
&lt;br /&gt;
:283 Apply fixed plane portal to the ceilings of tagged sectors&lt;br /&gt;
:284 Apply fixed plane portal to the floors of tagged sectors&lt;br /&gt;
:285 Apply fixed plane portal to the floors and ceilings of tagged sectors&lt;br /&gt;
&lt;br /&gt;
The front side sector of the special line is used to generate the plane. The ceiling texture, sector light, and ceiling texture scrolling are all used as attributes for the rendered fixed plane. The absolute height of the ceiling is used as the height of the plane. That is, if the special line front sector has a ceiling height of 64, the plane will always render at 64 units above the camera height. If the ceiling height is 128, the plane will always render at 128 units above the camera height, and so on.&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
&lt;br /&gt;
[[Image:Pfixedplane01.png]]  [[Image:Pfixedplane02.png]]&lt;br /&gt;
&lt;br /&gt;
The left image shows a simple map with a small sector off to the side of the rest of the map. One of the lines in this sector has been given  a 283 special which will apply a fixed play portal to all tagged sector ceilings. The height of the dummy sector is set to 128, the blue water texture FWATER1 is the ceiling texture, there is no scrolling applied to the ceiling, and the ceiling height is 128.&lt;br /&gt;
&lt;br /&gt;
The right image shows what the map looks like in [[Eternity]]. Notice the rendered height of the plane is the same as a ceiling 128 units above eye level.&lt;br /&gt;
&lt;br /&gt;
The line special 289 can be used to apply fixed plane portals to walls as well. The special will find a portal with the same line tag and will display that portal on the surface of the line.&lt;br /&gt;
&lt;br /&gt;
Here is the map from above:&lt;br /&gt;
&lt;br /&gt;
[[Image:Pfixedplane03.png]]  [[Image:Pfixedplane04.png]]&lt;br /&gt;
&lt;br /&gt;
The highlighted wall has been given a special of 289 and tagged to the portal line. In-game, the tagged wall now displays the portal. Note: The 289 line special works for all portal types.&lt;br /&gt;
&lt;br /&gt;
== Horizon Plane Portals ==&lt;br /&gt;
&lt;br /&gt;
Horizon portals display two planes which appear to go on forever until they meet in the middle (horizon). The plane coordinates are not fixed, and will appear to move with the camera. This can be used to achieve the illusion that water or grass goes off far into the distance without having to make overly large sectors.&lt;br /&gt;
&lt;br /&gt;
Line specials:&lt;br /&gt;
&lt;br /&gt;
:286 Apply horizon portal to the ceilings of tagged sectors&lt;br /&gt;
:287 Apply horizon portal to the floors of tagged sectors&lt;br /&gt;
:288 Apply horizon portal to the floors and ceilings of tagged sectors&lt;br /&gt;
&lt;br /&gt;
Like the fixed plane portals, the front sector of the special line is used. The top plane uses the front sector ceiling (height, texture, scrolling, light) as its model, and the bottom plane uses the front sector floor (height, texture, scrolling, light) as its model. Example:&lt;br /&gt;
&lt;br /&gt;
[[Image:Phorizon01.png]]&lt;br /&gt;
&lt;br /&gt;
This map has a horizon portal applied to the ceiling and wall of the sector where the player starts. Both sectors have a floor height of 0, and a ceiling height of 72, but the floor texture in the dummy sector is set to a grass texture, and the ceiling texture is set to FSKY_1. This produces a field of grass which goes on into the horizon. If the camera moves up or down, the floor plane will appear to move along with it. If the ceiling plane had a regular texture on it, it would also move with the camera and appear to go off into the distance.&lt;br /&gt;
&lt;br /&gt;
Note: If the camera ever travels below the floor height of a horizon portal, the bottom plane will appear to move in the opposite direction of the camera movement until the camera is once again above the floor height.&lt;br /&gt;
&lt;br /&gt;
== Skybox Portals ==&lt;br /&gt;
&lt;br /&gt;
Skybox portals draw another part of the map into the portal window. The scene in the portal window will use the angle from the player camera, but will render the scene from the location of the skybox camera. This helps create the illusion that the contents of the skybox actually surround the map and are much larger in size than they really are.&lt;br /&gt;
&lt;br /&gt;
Line specials:&lt;br /&gt;
&lt;br /&gt;
:290 Apply skybox portals to the ceilings of tagged sectors&lt;br /&gt;
:291 Apply skybox portals to the floors of tagged sectors&lt;br /&gt;
:292 Apply skybox portals to the floors and ceilings of tagged sectors&lt;br /&gt;
&lt;br /&gt;
The front sector of the special line becomes the &amp;quot;skybox sector&amp;quot;. This is not the only sector that gets rendered, but this sector is where [[Eternity]] will look for the skybox camera object which will be the point the skybox is rendered from.&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
&lt;br /&gt;
[[Image:Pskybox01.png]]&lt;br /&gt;
&lt;br /&gt;
This map has a skybox portal applied to the ceiling and wall of the sector with the player start. The &amp;quot;Skybox sector&amp;quot; is the small rectangular one which contains the EESkyboxCam object. The camera object always spawns on the floor, so the skybox sector has been made a glass floor 48 units above the surrounding area so the camera will be above the floor of the box.&lt;br /&gt;
&lt;br /&gt;
[[Image:Pskybox02.png]] [[Image:Pskybox03.png]]&lt;br /&gt;
&lt;br /&gt;
The first image is the view in-game when the player no-clips into the sky box. The second image is the view from inside the main map area with the skybox portal applied. No matter where the player moves inside the map area, the skybox portal will always render from the location of the camera inside the skybox, however, the skybox is rendered from the angle the player is looking. [[ExtraData]] also provides a means of assigning a z-height to objects in maps. This could also be used to raise the skybox camera off the floor. If the skybox camera is left on the floor, the floor plane will not render and result in [[Doom Wiki:HOM|HOM]].&lt;br /&gt;
&lt;br /&gt;
The skybox is not restricted to simple boxes. Any map architecture the skybox camera can see can be part of a skybox. Below is an example of a basic mountainous landscape created with map architecture. &lt;br /&gt;
&lt;br /&gt;
[[Image:Pskybox04.png]]&lt;br /&gt;
&lt;br /&gt;
== Anchored Portals ==&lt;br /&gt;
&lt;br /&gt;
Anchored portals are the most powerful and complex of all the basic portal types. Anchored portals will render another area of the map into the portal window, but the portal camera moves as the player moves, creating the illusion that the other area of the map is actually connected to the main area. This can be used to create the appearance of 3D architecture. Before use, however, an understanding of how these portals work is important.&lt;br /&gt;
&lt;br /&gt;
In order to piece the parts of a map together, an anchored portal needs to know how far apart they are. The distance is determined with the use of specific line specials. Each anchored portal needs a &amp;quot;portal line&amp;quot; (the line with the anchored portal special) which usually area the portal should render, and an &amp;quot;anchor line&amp;quot; which is usually located in the main map area. The distance between these lines becomes the offset, that is, how far [[Eternity]] needs to move the camera from where the player stands to get the portal area.&lt;br /&gt;
&lt;br /&gt;
Line specials:&lt;br /&gt;
&lt;br /&gt;
:295 Apply anchored portal to the ceilings of all tagged sectors&lt;br /&gt;
:296 Apply anchored portal to the floors of all tagged sectors&lt;br /&gt;
:297 Apply anchored portal to the floors and ceilings of all tagged sectors&lt;br /&gt;
:298 Anchor line (for specials 295 and 297)&lt;br /&gt;
:299 Anchor line (for special 296)&lt;br /&gt;
&lt;br /&gt;
There are two different anchor line types so a different anchored portal can be placed on the ceiling and floor of the same sector. The two portals will share the sector tag.&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
&lt;br /&gt;
[[Image:Panchored01.png]]&lt;br /&gt;
&lt;br /&gt;
The above map has a single anchored portal applied to the inner sector of the area the player start is in. The &amp;quot;portal area&amp;quot; is to the right, and the &amp;quot;main area&amp;quot; is to the left. The view height is not changed, so the portal area needs to be set above the main area, or there will be [[Doom Wiki:HOM|HOM]] in the portal window. Note that no camera objects are needed for this effect. The portal will create a temporary camera automatically.&lt;br /&gt;
&lt;br /&gt;
Here&#039;s how it works:&lt;br /&gt;
&lt;br /&gt;
When the map is loaded, the the centers of both lines (the portal and the anchor line) are calculated, and the distance between those centers is determined:&lt;br /&gt;
&lt;br /&gt;
[[Image:Panchored03.png]]&lt;br /&gt;
&lt;br /&gt;
In the example, the distance is 512 units to the east and 0 units north. This set of numbers becomes the &amp;quot;portal offset&amp;quot; (distance between where the player stands and where the portal camera should go) and when the portal is rendered, the portal camera is place 512 map units east of the player camera, and the map is rendered from the portal camera. &lt;br /&gt;
&lt;br /&gt;
If the portal camera becomes obstructed, unwanted results can occur:&lt;br /&gt;
&lt;br /&gt;
[[Image:Panchored04.png]]&lt;br /&gt;
&lt;br /&gt;
In the example above, the camera actually &amp;quot;wanders&amp;quot; out of the portal area and into the main part of the map resulting in an unwanted wall rendering in the portal window. To prevent occurrences such as this, it is usually a good idea to place the portal area a good distance away from any other map architecture to prevent the camera from &amp;quot;wandering into&amp;quot; anything else. If the camera moves out of the portal area, it won&#039;t cause problems as long as it is not obstructed by other map architecture.&lt;br /&gt;
&lt;br /&gt;
== Faked reflective floors ==&lt;br /&gt;
[[Image:Reflective_portals.png|320px]]&lt;br /&gt;
&lt;br /&gt;
When paired with &#039;&#039;[[ExtraData]]&#039;&#039; lump anchored portals can fake a reflecting floor / ceiling effect.&lt;br /&gt;
&lt;br /&gt;
To achieve this you need to:&lt;br /&gt;
* Recreate an z-mirrored copy of the rooms you want to be reflected&lt;br /&gt;
* Connect portals as you&#039;d normally do&lt;br /&gt;
* Enable &#039;&#039;&#039;ExtraData&#039;&#039;&#039; definition for a sector (i.e. give a &#039;&#039;401&#039;&#039; special to a LineDef facing the sector which flat&#039;s alpha you want to modify)&lt;br /&gt;
* Add [[MapInfo]] lump that calls specific &#039;&#039;&#039;ExtraData&#039;&#039;&#039; script when map is played:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[MAP01]&lt;br /&gt;
    levelname = my level&lt;br /&gt;
    extradata = EXTRA01&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Add &#039;&#039;&#039;EXTRA01&#039;&#039;&#039; lump containing something along those lines:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sector {&lt;br /&gt;
	recordnum 1&lt;br /&gt;
	portalflags.floor overlay&lt;br /&gt;
	overlayalpha.floor 50%&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: &#039;&#039;See: [[Portal#Examples]]&#039;&#039; for a demonstration file&lt;br /&gt;
&lt;br /&gt;
== Linked Portals ==&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;See: [[Linked portals]]&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Category:Editing]]&lt;br /&gt;
&lt;br /&gt;
==Examples==&lt;br /&gt;
[https://s3-eu-west-1.amazonaws.com/eternity/portals_reflective.wad portals faking reflective floors]&lt;/div&gt;</summary>
		<author><name>Ellmo</name></author>
	</entry>
	<entry>
		<id>https://eternity.youfailit.net/index.php?title=File:Reflective_portals.png&amp;diff=3392</id>
		<title>File:Reflective portals.png</title>
		<link rel="alternate" type="text/html" href="https://eternity.youfailit.net/index.php?title=File:Reflective_portals.png&amp;diff=3392"/>
		<updated>2013-02-09T00:45:50Z</updated>

		<summary type="html">&lt;p&gt;Ellmo: A screenshot from Reflective Portals Demo.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;A screenshot from Reflective Portals Demo.&lt;/div&gt;</summary>
		<author><name>Ellmo</name></author>
	</entry>
	<entry>
		<id>https://eternity.youfailit.net/index.php?title=Linked_portal&amp;diff=3391</id>
		<title>Linked portal</title>
		<link rel="alternate" type="text/html" href="https://eternity.youfailit.net/index.php?title=Linked_portal&amp;diff=3391"/>
		<updated>2013-02-08T23:04:22Z</updated>

		<summary type="html">&lt;p&gt;Ellmo: /* Examples */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Linked portals&#039;&#039;&#039; are a powerful feature which make it possible to connect two separate areas of a map via the floor/ceiling or one-sided linedefs, allowing the player to see, shoot, and even move seamlessly from one area into another. They are used similarly to two-way portals, apart from the fact that you can pass through them. They can be used to create 3D architecture and room-over-room effects, with very few limitations.&lt;br /&gt;
{{backto|Portal linedef types}}&lt;br /&gt;
&lt;br /&gt;
==Screenshots==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [[File:Linked_portals_bottom.png|320px]] || [[File:Linked_portals_top.png|320px]]&lt;br /&gt;
|-&lt;br /&gt;
| View from the bottom room || View from the top room.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Line triggers==&lt;br /&gt;
 #     Class  Trig Description&lt;br /&gt;
 &lt;br /&gt;
 358   Ext    --   Apply linked portal to like-tagged ceilings&lt;br /&gt;
 &lt;br /&gt;
 359   Ext    --   Apply linked portal to like-tagged floors&lt;br /&gt;
 &lt;br /&gt;
 360   Ext    --   Linked portal anchor line for special 358&lt;br /&gt;
 &lt;br /&gt;
 361   Ext    --   Linked portal anchor line for special 359&lt;br /&gt;
 &lt;br /&gt;
 376   Ext    --   Apply linked portals to like-tagged lines&lt;br /&gt;
 &lt;br /&gt;
 377   Ext    --   Anchor line for special 376&lt;br /&gt;
 &lt;br /&gt;
 385   Ext    --   Apply portal to front sector&lt;br /&gt;
&lt;br /&gt;
==Terminology==&lt;br /&gt;
Linked portals have their own specific sub-set of terminology used to describe certain aspects and behaviors.&lt;br /&gt;
&lt;br /&gt;
===Portal Plane===&lt;br /&gt;
Unlike the basic portal types, which were rendered and could cover height variances (much like the doom sky), linked portals form an actual map structure. The &#039;&#039;&#039;Portal Plane&#039;&#039;&#039; refers to an X/Y plane that bisects the sector(s) that contain the portal. The z-position of the portal is fixed, and should be the same height on both sides of the linked portal.&lt;br /&gt;
&lt;br /&gt;
===Beyond the Plane===&lt;br /&gt;
Map architecture is said to be beyond the portal plane when its vertical height is equal to or beyond the portal height--that is, at or above a ceiling portal plane or at or below a floor portal plane. When map architecture is beyond a portal plane, the portal will display at the height of the plane.&lt;br /&gt;
&lt;br /&gt;
===Inside the plane===&lt;br /&gt;
Map architecture is said to be inside the portal plane when its vertical height is not beyond the portal plane--that is, below a ceiling portal or above a floor portal. Any architecture that is inside the portal plane will render normally and will obscure rendering of the portal.&lt;br /&gt;
&lt;br /&gt;
==Usage==&lt;br /&gt;
Linked portals use trigger and anchor lines (much like anchored portals) to determine an X and Y offset from one part of the map to another, but there are specific requirements unique to linked portals:&lt;br /&gt;
&lt;br /&gt;
*Linked portals must be two-way, meaning the upper area must reference the lower area and vice versa.&lt;br /&gt;
*Linked portals have specific behavior relating to z-coordinates of the portal plane.&lt;br /&gt;
&lt;br /&gt;
==Setup==&lt;br /&gt;
&lt;br /&gt;
There are two kinds of linked portals: plane portals and line portals. Plane portals are sector floor or ceiling surfaces that vertically connect different sector groups (layers) of the map. Line portals are linedefs that connect areas horizontally.&lt;br /&gt;
&lt;br /&gt;
===Setting up plane portals===&lt;br /&gt;
There must be (at least) two sectors in the map, not linked together by any path (similar to how disjoint areas exist in classic Doom maps and are gameplay-connected only by teleporters).&lt;br /&gt;
&lt;br /&gt;
The ceiling height of one of them must match the floor height of the other. Let&#039;s call the bottom sector A and the top sector B.&lt;br /&gt;
&lt;br /&gt;
Even though the sectors need to have the same outline, they can have different detail inner sectors in them. For example, sector A can have several crate sectors whose outlines don&#039;t need to be copied into upper sector B, which has much less detail. Note that one-sided linedef walls inside sectors (e.g. columns) must have their outlines copied.&lt;br /&gt;
&lt;br /&gt;
Reserve two linedefs for each sector. Make sure the two linedefs selected for sector A will have the same relative coordinates and sizes as the two corresponding linedefs from B.&lt;br /&gt;
&lt;br /&gt;
Tag sector A and its inner details with a number. Tag B and its details with another number.&lt;br /&gt;
&lt;br /&gt;
Give the reserved linedefs from A special 359, tag of B and special 360, tag of A respectively. Give the reserved linedefs from B special 358, tag of A and special 361, tag of B respectively. Here is how they should correspond:&lt;br /&gt;
&lt;br /&gt;
* Reserved linedef 1 of sector A: special 359, tag B (Apply linked portal to floor of B)&lt;br /&gt;
* Reserved linedef 1 of sector B: special 361, tag B (Linked portal anchor line for special 359)&lt;br /&gt;
* Reserved linedef 2 of sector A: special 360, tag A (Linked portal anchor line for special 358)&lt;br /&gt;
* Reserved linedef 2 of sector B: special 358, tag A (Apply linked portal to ceiling of A)&lt;br /&gt;
&lt;br /&gt;
Note that with this implementation, you&#039;ll have to give a tag to every sector which needs a portal. Sometimes this is not practical, because you may want to make various sectors with special effects within A or B. To bypass this problem, you can tag the special sector differently, but one of the linedefs facing it must have special 385 (Apply portal to front sector) and have the tag of the non-special sectors that surround it (A or B). This will copy the portal information into the special sector.&lt;br /&gt;
&lt;br /&gt;
Here is a diagram on how to set up:&lt;br /&gt;
&lt;br /&gt;
 :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::&lt;br /&gt;
 -----------------x---------------------x:::::::::::::      ~-------------------x---------------------x:::::::::::::::::::&lt;br /&gt;
                 /                       \::::::::::::      ~ Neighbour        /                       \::::::::::::::::::&lt;br /&gt;
  Neighbour     /         SECTOR A        \::::::::::       ~ sector of       /         SECTOR B        \:::::::::::::::::&lt;br /&gt;
  sector of    /  x----x             floor \:::::::::       ~ B              /  x----x                   \::::::::::::::::&lt;br /&gt;
  A           /   |::::|             detail \::::::::       ~ (not tagged)  /   |    |                    \:::::::::::::::&lt;br /&gt;
  (untagged) /    |::::|wall         x---x   \:::::::       ~              /    |    |top of wall from A   \::::::::::::::&lt;br /&gt;
 -----------x     x----x             |   |    x:::::::::    ~-------------x     x----x &amp;lt;NOT tagged          x:::::::::::::&lt;br /&gt;
 ::::::::::::\                       x---x   /:::::::::::::::::::::::::::::\                               /::::::::::::::&lt;br /&gt;
 :::::::::::::\    x---x-----x same tag as^ /:::::::::::::::::::::::::::::::\     x-------------x         /:::::::::::::::&lt;br /&gt;
 ::::::::::::::\    \   \    | &amp;lt;  A        x:::::::::::::::::::::::::::::::::\    x-------------x        x::::::::::::::::&lt;br /&gt;
 :::::::::::::::\    x---x---x            /360,A::::::::::::::::::::::::::::::\ ceil. detail            /358,A::::::::::::&lt;br /&gt;
 ::::::::::::::::\ flr.detail    359,B   /:::::::::::::::::::::::::::::::::::::\ tag of B      361,B   /::::::::::::::::::&lt;br /&gt;
 :::::::::::::::::x-------------x-------x:::::::::::::::::::::::::::::::::::::::x-------------x-------x:::::::::::::::::::&lt;br /&gt;
 :::::::::::::::::::::::::::::::::THE PORTAL LINEDEFS:::::::::::::::::::::::::::::::::::::::::THE PORTAL LINEDEFS:::::::::&lt;br /&gt;
&lt;br /&gt;
===Setting up wall portals===&lt;br /&gt;
Wall portals are slightly simpler to implement. The two separate sectors must have the same floor and ceiling heights and the portal linedefs need to be of the same length and angle. They must also be two-sided, passable and have a buffer sector behind them, with enough depth so the portal is walkable by the intended actors (so they don&#039;t bump into the back wall of the buffer sector).&lt;br /&gt;
&lt;br /&gt;
The two linedefs will have the 376 and 377 specials (respectively, order not being important) and a common tag (which doesn&#039;t have to belong to any sector).&lt;br /&gt;
&lt;br /&gt;
Note that to render correctly, the buffer sectors behind them will need to have different light levels from the one in front of them. If the portal works correctly, they will never be visible during the game, and won&#039;t be accessible unless the user activates no-clipping mode.&lt;br /&gt;
&lt;br /&gt;
Here is a diagram on how to set up:&lt;br /&gt;
&lt;br /&gt;
 ----------x &amp;lt;----main area sectors---------&amp;gt;    x---------&lt;br /&gt;
           |        Visible            x---------x&lt;br /&gt;
           |                           |         |&lt;br /&gt;
           |                           |         |&amp;lt;linedef B&lt;br /&gt;
           x-------x                   |         | type 377&lt;br /&gt;
 linedef A&amp;gt;|       |&amp;lt;-buffer sectors-&amp;gt; |         | tag n&lt;br /&gt;
 type 376  |       |                   x---------x&lt;br /&gt;
 tag n     |       |  Never visible in-game      |&lt;br /&gt;
           |       |  but wide enough to fit     |&lt;br /&gt;
 ----------x-------x  walking objects            x---------&lt;br /&gt;
                      Set their light levels to different values from neighbouring main area sectors&lt;br /&gt;
&lt;br /&gt;
===Lifts between plane portals===&lt;br /&gt;
&lt;br /&gt;
You can make the floor or ceiling of a sector move from a sector group (layer) to another by using the [[Attached surface linedef types]].&lt;br /&gt;
&lt;br /&gt;
==Caveats and limitations==&lt;br /&gt;
* Linked areas must have corresponding floor or ceiling heights. It&#039;s not possible to look and move into an area with different Z coordinates.&lt;br /&gt;
* It is possible to make &amp;quot;impossible&amp;quot; structures, both with plane and line portals, but note that Eternity will attempt to render any scene relative to viewer&#039;s coordinates when looking at the portal, including any unrelated sectors placed at the same XY coordinates as the &amp;quot;virtual&amp;quot; tunnel. This undesired effect can be reduced by setting up the layout of the map properly.&lt;br /&gt;
* An &amp;quot;infinite&amp;quot; tunnel can be created, but it must consist of at least three sector groups in a cycle, as well as avoiding any visibility glitches mentioned in the previous point.&lt;br /&gt;
The following four points are valid because linked portals as a reliable feature are not fully implemented, but have been made available to the user, or for experimentation:&lt;br /&gt;
* Currently the hitscan traversal through portals is not implemented, which means that bullet attacks will be stopped, monsters will not be able to see you etc. The monsters will be able to hear and follow you through the portal however, and projectiles will pass through.&lt;br /&gt;
* Currently, an actor standing between two layers separated by a plane portal will jump repeatedly between the two areas and have difficulty walking.&lt;br /&gt;
* Currently sprites aren&#039;t seamlessly rendered through portals, appearing cut off by the portal plane.&lt;br /&gt;
* Currently, moving through portals can result in objects getting stuck, telefragged etc. Previously it was a hazard to the player too, as anything could telefrag, but it has been changed to be less hazardous.&lt;br /&gt;
Regardless, it is still possible to make convincing levels with linked portals even at their current state, as long as you make sure that major combat scenes will not take place between portals. Flying monsters can still follow the player through portals, so they have an advantage.&lt;br /&gt;
&lt;br /&gt;
==Tutorial==&lt;br /&gt;
Refer to Zarkyb&#039;s [[linked portals tutorial]] for more examples on usage.&lt;br /&gt;
&lt;br /&gt;
==Examples==&lt;br /&gt;
[https://s3-eu-west-1.amazonaws.com/eternity/linked_port.wad demo file] - a demonstration of both plane and wall portals.&lt;br /&gt;
Played on &#039;&#039;&#039;Doom2, Map01&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Things to note:&lt;br /&gt;
&lt;br /&gt;
* In compatibility menu the option &#039;&#039;&#039;actors have infinite height&#039;&#039;&#039; needs to be set to &#039;&#039;&#039;false&#039;&#039;&#039; in order for any actor to fall through a portal.&lt;br /&gt;
* The &amp;quot;upper part&amp;quot; is textured differently from the &amp;quot;lower part&amp;quot;. While in game observe when textures change and where exactly the clipping occurs.&lt;br /&gt;
* The lower room has a different shape than the room upstairs. Only the tagged, corresponding sectors which make up a &amp;quot;hole&amp;quot; have to be shaped alike.&lt;br /&gt;
* Any LineDef that copies floor / ceiling requires an appropriate &#039;&#039;&#039;Anchor&#039;&#039;&#039; action on correspodning LineDef in the copied sector. E.g. should the action &#039;&#039;&#039;special: 360; tag: 1&#039;&#039;&#039; be cleared from where it is and set on any other LineDef, you&#039;d get clipping errors, HoM effects or the renderer would simply refuse to connect portals.&lt;br /&gt;
* When viewing automap notice how position is updated. Player doesn&#039;t seem to &amp;quot;teleport&amp;quot; from one place of the map to another, yet his X/Y coordinates change when passing a portal boundary.&lt;br /&gt;
* Use console commands like &#039;&#039;&#039;spawn doomimp&#039;&#039;&#039; to test how monsters see, hear and aim through portals.&lt;br /&gt;
* Use console command &#039;&#039;&#039;fly&#039;&#039;&#039; to test that you can indeed cross portals from both sides of the &amp;quot;hole&amp;quot;.&lt;br /&gt;
* When viewing through map editor note that there&#039;s no sector tagged with a &#039;&#039;&#039;3&#039;&#039;&#039; (tag used to link wall portals). Wall portals clipping is based on LineDefs, not sectors.&lt;br /&gt;
&lt;br /&gt;
[[File:Linked_portals.png]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Editing]]&lt;br /&gt;
[[Category:Editing reference]]&lt;/div&gt;</summary>
		<author><name>Ellmo</name></author>
	</entry>
	<entry>
		<id>https://eternity.youfailit.net/index.php?title=Linked_portal&amp;diff=3390</id>
		<title>Linked portal</title>
		<link rel="alternate" type="text/html" href="https://eternity.youfailit.net/index.php?title=Linked_portal&amp;diff=3390"/>
		<updated>2013-02-08T22:52:52Z</updated>

		<summary type="html">&lt;p&gt;Ellmo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Linked portals&#039;&#039;&#039; are a powerful feature which make it possible to connect two separate areas of a map via the floor/ceiling or one-sided linedefs, allowing the player to see, shoot, and even move seamlessly from one area into another. They are used similarly to two-way portals, apart from the fact that you can pass through them. They can be used to create 3D architecture and room-over-room effects, with very few limitations.&lt;br /&gt;
{{backto|Portal linedef types}}&lt;br /&gt;
&lt;br /&gt;
==Screenshots==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [[File:Linked_portals_bottom.png|320px]] || [[File:Linked_portals_top.png|320px]]&lt;br /&gt;
|-&lt;br /&gt;
| View from the bottom room || View from the top room.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Line triggers==&lt;br /&gt;
 #     Class  Trig Description&lt;br /&gt;
 &lt;br /&gt;
 358   Ext    --   Apply linked portal to like-tagged ceilings&lt;br /&gt;
 &lt;br /&gt;
 359   Ext    --   Apply linked portal to like-tagged floors&lt;br /&gt;
 &lt;br /&gt;
 360   Ext    --   Linked portal anchor line for special 358&lt;br /&gt;
 &lt;br /&gt;
 361   Ext    --   Linked portal anchor line for special 359&lt;br /&gt;
 &lt;br /&gt;
 376   Ext    --   Apply linked portals to like-tagged lines&lt;br /&gt;
 &lt;br /&gt;
 377   Ext    --   Anchor line for special 376&lt;br /&gt;
 &lt;br /&gt;
 385   Ext    --   Apply portal to front sector&lt;br /&gt;
&lt;br /&gt;
==Terminology==&lt;br /&gt;
Linked portals have their own specific sub-set of terminology used to describe certain aspects and behaviors.&lt;br /&gt;
&lt;br /&gt;
===Portal Plane===&lt;br /&gt;
Unlike the basic portal types, which were rendered and could cover height variances (much like the doom sky), linked portals form an actual map structure. The &#039;&#039;&#039;Portal Plane&#039;&#039;&#039; refers to an X/Y plane that bisects the sector(s) that contain the portal. The z-position of the portal is fixed, and should be the same height on both sides of the linked portal.&lt;br /&gt;
&lt;br /&gt;
===Beyond the Plane===&lt;br /&gt;
Map architecture is said to be beyond the portal plane when its vertical height is equal to or beyond the portal height--that is, at or above a ceiling portal plane or at or below a floor portal plane. When map architecture is beyond a portal plane, the portal will display at the height of the plane.&lt;br /&gt;
&lt;br /&gt;
===Inside the plane===&lt;br /&gt;
Map architecture is said to be inside the portal plane when its vertical height is not beyond the portal plane--that is, below a ceiling portal or above a floor portal. Any architecture that is inside the portal plane will render normally and will obscure rendering of the portal.&lt;br /&gt;
&lt;br /&gt;
==Usage==&lt;br /&gt;
Linked portals use trigger and anchor lines (much like anchored portals) to determine an X and Y offset from one part of the map to another, but there are specific requirements unique to linked portals:&lt;br /&gt;
&lt;br /&gt;
*Linked portals must be two-way, meaning the upper area must reference the lower area and vice versa.&lt;br /&gt;
*Linked portals have specific behavior relating to z-coordinates of the portal plane.&lt;br /&gt;
&lt;br /&gt;
==Setup==&lt;br /&gt;
&lt;br /&gt;
There are two kinds of linked portals: plane portals and line portals. Plane portals are sector floor or ceiling surfaces that vertically connect different sector groups (layers) of the map. Line portals are linedefs that connect areas horizontally.&lt;br /&gt;
&lt;br /&gt;
===Setting up plane portals===&lt;br /&gt;
There must be (at least) two sectors in the map, not linked together by any path (similar to how disjoint areas exist in classic Doom maps and are gameplay-connected only by teleporters).&lt;br /&gt;
&lt;br /&gt;
The ceiling height of one of them must match the floor height of the other. Let&#039;s call the bottom sector A and the top sector B.&lt;br /&gt;
&lt;br /&gt;
Even though the sectors need to have the same outline, they can have different detail inner sectors in them. For example, sector A can have several crate sectors whose outlines don&#039;t need to be copied into upper sector B, which has much less detail. Note that one-sided linedef walls inside sectors (e.g. columns) must have their outlines copied.&lt;br /&gt;
&lt;br /&gt;
Reserve two linedefs for each sector. Make sure the two linedefs selected for sector A will have the same relative coordinates and sizes as the two corresponding linedefs from B.&lt;br /&gt;
&lt;br /&gt;
Tag sector A and its inner details with a number. Tag B and its details with another number.&lt;br /&gt;
&lt;br /&gt;
Give the reserved linedefs from A special 359, tag of B and special 360, tag of A respectively. Give the reserved linedefs from B special 358, tag of A and special 361, tag of B respectively. Here is how they should correspond:&lt;br /&gt;
&lt;br /&gt;
* Reserved linedef 1 of sector A: special 359, tag B (Apply linked portal to floor of B)&lt;br /&gt;
* Reserved linedef 1 of sector B: special 361, tag B (Linked portal anchor line for special 359)&lt;br /&gt;
* Reserved linedef 2 of sector A: special 360, tag A (Linked portal anchor line for special 358)&lt;br /&gt;
* Reserved linedef 2 of sector B: special 358, tag A (Apply linked portal to ceiling of A)&lt;br /&gt;
&lt;br /&gt;
Note that with this implementation, you&#039;ll have to give a tag to every sector which needs a portal. Sometimes this is not practical, because you may want to make various sectors with special effects within A or B. To bypass this problem, you can tag the special sector differently, but one of the linedefs facing it must have special 385 (Apply portal to front sector) and have the tag of the non-special sectors that surround it (A or B). This will copy the portal information into the special sector.&lt;br /&gt;
&lt;br /&gt;
Here is a diagram on how to set up:&lt;br /&gt;
&lt;br /&gt;
 :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::&lt;br /&gt;
 -----------------x---------------------x:::::::::::::      ~-------------------x---------------------x:::::::::::::::::::&lt;br /&gt;
                 /                       \::::::::::::      ~ Neighbour        /                       \::::::::::::::::::&lt;br /&gt;
  Neighbour     /         SECTOR A        \::::::::::       ~ sector of       /         SECTOR B        \:::::::::::::::::&lt;br /&gt;
  sector of    /  x----x             floor \:::::::::       ~ B              /  x----x                   \::::::::::::::::&lt;br /&gt;
  A           /   |::::|             detail \::::::::       ~ (not tagged)  /   |    |                    \:::::::::::::::&lt;br /&gt;
  (untagged) /    |::::|wall         x---x   \:::::::       ~              /    |    |top of wall from A   \::::::::::::::&lt;br /&gt;
 -----------x     x----x             |   |    x:::::::::    ~-------------x     x----x &amp;lt;NOT tagged          x:::::::::::::&lt;br /&gt;
 ::::::::::::\                       x---x   /:::::::::::::::::::::::::::::\                               /::::::::::::::&lt;br /&gt;
 :::::::::::::\    x---x-----x same tag as^ /:::::::::::::::::::::::::::::::\     x-------------x         /:::::::::::::::&lt;br /&gt;
 ::::::::::::::\    \   \    | &amp;lt;  A        x:::::::::::::::::::::::::::::::::\    x-------------x        x::::::::::::::::&lt;br /&gt;
 :::::::::::::::\    x---x---x            /360,A::::::::::::::::::::::::::::::\ ceil. detail            /358,A::::::::::::&lt;br /&gt;
 ::::::::::::::::\ flr.detail    359,B   /:::::::::::::::::::::::::::::::::::::\ tag of B      361,B   /::::::::::::::::::&lt;br /&gt;
 :::::::::::::::::x-------------x-------x:::::::::::::::::::::::::::::::::::::::x-------------x-------x:::::::::::::::::::&lt;br /&gt;
 :::::::::::::::::::::::::::::::::THE PORTAL LINEDEFS:::::::::::::::::::::::::::::::::::::::::THE PORTAL LINEDEFS:::::::::&lt;br /&gt;
&lt;br /&gt;
===Setting up wall portals===&lt;br /&gt;
Wall portals are slightly simpler to implement. The two separate sectors must have the same floor and ceiling heights and the portal linedefs need to be of the same length and angle. They must also be two-sided, passable and have a buffer sector behind them, with enough depth so the portal is walkable by the intended actors (so they don&#039;t bump into the back wall of the buffer sector).&lt;br /&gt;
&lt;br /&gt;
The two linedefs will have the 376 and 377 specials (respectively, order not being important) and a common tag (which doesn&#039;t have to belong to any sector).&lt;br /&gt;
&lt;br /&gt;
Note that to render correctly, the buffer sectors behind them will need to have different light levels from the one in front of them. If the portal works correctly, they will never be visible during the game, and won&#039;t be accessible unless the user activates no-clipping mode.&lt;br /&gt;
&lt;br /&gt;
Here is a diagram on how to set up:&lt;br /&gt;
&lt;br /&gt;
 ----------x &amp;lt;----main area sectors---------&amp;gt;    x---------&lt;br /&gt;
           |        Visible            x---------x&lt;br /&gt;
           |                           |         |&lt;br /&gt;
           |                           |         |&amp;lt;linedef B&lt;br /&gt;
           x-------x                   |         | type 377&lt;br /&gt;
 linedef A&amp;gt;|       |&amp;lt;-buffer sectors-&amp;gt; |         | tag n&lt;br /&gt;
 type 376  |       |                   x---------x&lt;br /&gt;
 tag n     |       |  Never visible in-game      |&lt;br /&gt;
           |       |  but wide enough to fit     |&lt;br /&gt;
 ----------x-------x  walking objects            x---------&lt;br /&gt;
                      Set their light levels to different values from neighbouring main area sectors&lt;br /&gt;
&lt;br /&gt;
===Lifts between plane portals===&lt;br /&gt;
&lt;br /&gt;
You can make the floor or ceiling of a sector move from a sector group (layer) to another by using the [[Attached surface linedef types]].&lt;br /&gt;
&lt;br /&gt;
==Caveats and limitations==&lt;br /&gt;
* Linked areas must have corresponding floor or ceiling heights. It&#039;s not possible to look and move into an area with different Z coordinates.&lt;br /&gt;
* It is possible to make &amp;quot;impossible&amp;quot; structures, both with plane and line portals, but note that Eternity will attempt to render any scene relative to viewer&#039;s coordinates when looking at the portal, including any unrelated sectors placed at the same XY coordinates as the &amp;quot;virtual&amp;quot; tunnel. This undesired effect can be reduced by setting up the layout of the map properly.&lt;br /&gt;
* An &amp;quot;infinite&amp;quot; tunnel can be created, but it must consist of at least three sector groups in a cycle, as well as avoiding any visibility glitches mentioned in the previous point.&lt;br /&gt;
The following four points are valid because linked portals as a reliable feature are not fully implemented, but have been made available to the user, or for experimentation:&lt;br /&gt;
* Currently the hitscan traversal through portals is not implemented, which means that bullet attacks will be stopped, monsters will not be able to see you etc. The monsters will be able to hear and follow you through the portal however, and projectiles will pass through.&lt;br /&gt;
* Currently, an actor standing between two layers separated by a plane portal will jump repeatedly between the two areas and have difficulty walking.&lt;br /&gt;
* Currently sprites aren&#039;t seamlessly rendered through portals, appearing cut off by the portal plane.&lt;br /&gt;
* Currently, moving through portals can result in objects getting stuck, telefragged etc. Previously it was a hazard to the player too, as anything could telefrag, but it has been changed to be less hazardous.&lt;br /&gt;
Regardless, it is still possible to make convincing levels with linked portals even at their current state, as long as you make sure that major combat scenes will not take place between portals. Flying monsters can still follow the player through portals, so they have an advantage.&lt;br /&gt;
&lt;br /&gt;
==Tutorial==&lt;br /&gt;
Refer to Zarkyb&#039;s [[linked portals tutorial]] for more examples on usage.&lt;br /&gt;
&lt;br /&gt;
==Examples==&lt;br /&gt;
[https://s3-eu-west-1.amazonaws.com/eternity/linked_port.wad demo file] - a demonstration of both plane and wall portals.&lt;br /&gt;
Played on &#039;&#039;&#039;Doom2, Map01&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Things to note:&lt;br /&gt;
&lt;br /&gt;
* In compatibility menu the option &#039;&#039;&#039;actors have infinite height&#039;&#039;&#039; needs to be set to &#039;&#039;&#039;false&#039;&#039;&#039; in order for any actor to fall through a portal.&lt;br /&gt;
* The &amp;quot;upper part&amp;quot; is textured differently from the &amp;quot;lower part&amp;quot;. While in game observe when textures change and where exactly the clipping occurs.&lt;br /&gt;
* The lower room has a different shape than the room upstairs. Only the tagged, corresponding sectors which make up a &amp;quot;hole&amp;quot; have to be shaped alike.&lt;br /&gt;
* Any LineDef that copies floor / ceiling requires an appropriate &#039;&#039;&#039;Anchor&#039;&#039;&#039; action on correspodning LineDef in the copied sector. E.g. should the action &#039;&#039;&#039;special: 360; tag: 1&#039;&#039;&#039; be cleared from where it is and set on any other LineDef, you&#039;d get clipping errors, HoM effects or the renderer would simply refuse to connect portals.&lt;br /&gt;
* When viewing automap notice how position is updated. Player doesn&#039;t seem to &amp;quot;teleport&amp;quot; from one place of the map to another, yet his X/Y coordinates change when passing a portal boundary.&lt;br /&gt;
* Use console commands like &#039;&#039;&#039;spawn doomimp&#039;&#039;&#039; to test how monsters see, hear and aim through portals.&lt;br /&gt;
* When viewing through map editor note that there&#039;s no sector tagged with a &#039;&#039;&#039;3&#039;&#039;&#039; (tag used to link wall portals). Wall portals clipping is based on LineDefs, not sectors.&lt;br /&gt;
&lt;br /&gt;
[[File:Linked_portals.png]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Editing]]&lt;br /&gt;
[[Category:Editing reference]]&lt;/div&gt;</summary>
		<author><name>Ellmo</name></author>
	</entry>
	<entry>
		<id>https://eternity.youfailit.net/index.php?title=Linked_portal&amp;diff=3389</id>
		<title>Linked portal</title>
		<link rel="alternate" type="text/html" href="https://eternity.youfailit.net/index.php?title=Linked_portal&amp;diff=3389"/>
		<updated>2013-02-08T22:48:10Z</updated>

		<summary type="html">&lt;p&gt;Ellmo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Linked portals&#039;&#039;&#039; are a powerful feature which make it possible to connect two separate areas of a map via the floor/ceiling or one-sided linedefs, allowing the player to see, shoot, and even move seamlessly from one area into another. They are used similarly to two-way portals, apart from the fact that you can pass through them. They can be used to create 3D architecture and room-over-room effects, with very few limitations.&lt;br /&gt;
{{backto|Portal linedef types}}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [[File:Linked_portals_bottom.png|320px]] || [[File:Linked_portals_top.png|320px]]&lt;br /&gt;
|-&lt;br /&gt;
| View from the bottom room || View from the top room.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Line triggers==&lt;br /&gt;
 #     Class  Trig Description&lt;br /&gt;
 &lt;br /&gt;
 358   Ext    --   Apply linked portal to like-tagged ceilings&lt;br /&gt;
 &lt;br /&gt;
 359   Ext    --   Apply linked portal to like-tagged floors&lt;br /&gt;
 &lt;br /&gt;
 360   Ext    --   Linked portal anchor line for special 358&lt;br /&gt;
 &lt;br /&gt;
 361   Ext    --   Linked portal anchor line for special 359&lt;br /&gt;
 &lt;br /&gt;
 376   Ext    --   Apply linked portals to like-tagged lines&lt;br /&gt;
 &lt;br /&gt;
 377   Ext    --   Anchor line for special 376&lt;br /&gt;
 &lt;br /&gt;
 385   Ext    --   Apply portal to front sector&lt;br /&gt;
&lt;br /&gt;
==Terminology==&lt;br /&gt;
Linked portals have their own specific sub-set of terminology used to describe certain aspects and behaviors.&lt;br /&gt;
&lt;br /&gt;
===Portal Plane===&lt;br /&gt;
Unlike the basic portal types, which were rendered and could cover height variances (much like the doom sky), linked portals form an actual map structure. The &#039;&#039;&#039;Portal Plane&#039;&#039;&#039; refers to an X/Y plane that bisects the sector(s) that contain the portal. The z-position of the portal is fixed, and should be the same height on both sides of the linked portal.&lt;br /&gt;
&lt;br /&gt;
===Beyond the Plane===&lt;br /&gt;
Map architecture is said to be beyond the portal plane when its vertical height is equal to or beyond the portal height--that is, at or above a ceiling portal plane or at or below a floor portal plane. When map architecture is beyond a portal plane, the portal will display at the height of the plane.&lt;br /&gt;
&lt;br /&gt;
===Inside the plane===&lt;br /&gt;
Map architecture is said to be inside the portal plane when its vertical height is not beyond the portal plane--that is, below a ceiling portal or above a floor portal. Any architecture that is inside the portal plane will render normally and will obscure rendering of the portal.&lt;br /&gt;
&lt;br /&gt;
==Usage==&lt;br /&gt;
Linked portals use trigger and anchor lines (much like anchored portals) to determine an X and Y offset from one part of the map to another, but there are specific requirements unique to linked portals:&lt;br /&gt;
&lt;br /&gt;
*Linked portals must be two-way, meaning the upper area must reference the lower area and vice versa.&lt;br /&gt;
*Linked portals have specific behavior relating to z-coordinates of the portal plane.&lt;br /&gt;
&lt;br /&gt;
==Setup==&lt;br /&gt;
&lt;br /&gt;
There are two kinds of linked portals: plane portals and line portals. Plane portals are sector floor or ceiling surfaces that vertically connect different sector groups (layers) of the map. Line portals are linedefs that connect areas horizontally.&lt;br /&gt;
&lt;br /&gt;
===Setting up plane portals===&lt;br /&gt;
There must be (at least) two sectors in the map, not linked together by any path (similar to how disjoint areas exist in classic Doom maps and are gameplay-connected only by teleporters).&lt;br /&gt;
&lt;br /&gt;
The ceiling height of one of them must match the floor height of the other. Let&#039;s call the bottom sector A and the top sector B.&lt;br /&gt;
&lt;br /&gt;
Even though the sectors need to have the same outline, they can have different detail inner sectors in them. For example, sector A can have several crate sectors whose outlines don&#039;t need to be copied into upper sector B, which has much less detail. Note that one-sided linedef walls inside sectors (e.g. columns) must have their outlines copied.&lt;br /&gt;
&lt;br /&gt;
Reserve two linedefs for each sector. Make sure the two linedefs selected for sector A will have the same relative coordinates and sizes as the two corresponding linedefs from B.&lt;br /&gt;
&lt;br /&gt;
Tag sector A and its inner details with a number. Tag B and its details with another number.&lt;br /&gt;
&lt;br /&gt;
Give the reserved linedefs from A special 359, tag of B and special 360, tag of A respectively. Give the reserved linedefs from B special 358, tag of A and special 361, tag of B respectively. Here is how they should correspond:&lt;br /&gt;
&lt;br /&gt;
* Reserved linedef 1 of sector A: special 359, tag B (Apply linked portal to floor of B)&lt;br /&gt;
* Reserved linedef 1 of sector B: special 361, tag B (Linked portal anchor line for special 359)&lt;br /&gt;
* Reserved linedef 2 of sector A: special 360, tag A (Linked portal anchor line for special 358)&lt;br /&gt;
* Reserved linedef 2 of sector B: special 358, tag A (Apply linked portal to ceiling of A)&lt;br /&gt;
&lt;br /&gt;
Note that with this implementation, you&#039;ll have to give a tag to every sector which needs a portal. Sometimes this is not practical, because you may want to make various sectors with special effects within A or B. To bypass this problem, you can tag the special sector differently, but one of the linedefs facing it must have special 385 (Apply portal to front sector) and have the tag of the non-special sectors that surround it (A or B). This will copy the portal information into the special sector.&lt;br /&gt;
&lt;br /&gt;
Here is a diagram on how to set up:&lt;br /&gt;
&lt;br /&gt;
 :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::&lt;br /&gt;
 -----------------x---------------------x:::::::::::::      ~-------------------x---------------------x:::::::::::::::::::&lt;br /&gt;
                 /                       \::::::::::::      ~ Neighbour        /                       \::::::::::::::::::&lt;br /&gt;
  Neighbour     /         SECTOR A        \::::::::::       ~ sector of       /         SECTOR B        \:::::::::::::::::&lt;br /&gt;
  sector of    /  x----x             floor \:::::::::       ~ B              /  x----x                   \::::::::::::::::&lt;br /&gt;
  A           /   |::::|             detail \::::::::       ~ (not tagged)  /   |    |                    \:::::::::::::::&lt;br /&gt;
  (untagged) /    |::::|wall         x---x   \:::::::       ~              /    |    |top of wall from A   \::::::::::::::&lt;br /&gt;
 -----------x     x----x             |   |    x:::::::::    ~-------------x     x----x &amp;lt;NOT tagged          x:::::::::::::&lt;br /&gt;
 ::::::::::::\                       x---x   /:::::::::::::::::::::::::::::\                               /::::::::::::::&lt;br /&gt;
 :::::::::::::\    x---x-----x same tag as^ /:::::::::::::::::::::::::::::::\     x-------------x         /:::::::::::::::&lt;br /&gt;
 ::::::::::::::\    \   \    | &amp;lt;  A        x:::::::::::::::::::::::::::::::::\    x-------------x        x::::::::::::::::&lt;br /&gt;
 :::::::::::::::\    x---x---x            /360,A::::::::::::::::::::::::::::::\ ceil. detail            /358,A::::::::::::&lt;br /&gt;
 ::::::::::::::::\ flr.detail    359,B   /:::::::::::::::::::::::::::::::::::::\ tag of B      361,B   /::::::::::::::::::&lt;br /&gt;
 :::::::::::::::::x-------------x-------x:::::::::::::::::::::::::::::::::::::::x-------------x-------x:::::::::::::::::::&lt;br /&gt;
 :::::::::::::::::::::::::::::::::THE PORTAL LINEDEFS:::::::::::::::::::::::::::::::::::::::::THE PORTAL LINEDEFS:::::::::&lt;br /&gt;
&lt;br /&gt;
===Setting up wall portals===&lt;br /&gt;
Wall portals are slightly simpler to implement. The two separate sectors must have the same floor and ceiling heights and the portal linedefs need to be of the same length and angle. They must also be two-sided, passable and have a buffer sector behind them, with enough depth so the portal is walkable by the intended actors (so they don&#039;t bump into the back wall of the buffer sector).&lt;br /&gt;
&lt;br /&gt;
The two linedefs will have the 376 and 377 specials (respectively, order not being important) and a common tag (which doesn&#039;t have to belong to any sector).&lt;br /&gt;
&lt;br /&gt;
Note that to render correctly, the buffer sectors behind them will need to have different light levels from the one in front of them. If the portal works correctly, they will never be visible during the game, and won&#039;t be accessible unless the user activates no-clipping mode.&lt;br /&gt;
&lt;br /&gt;
Here is a diagram on how to set up:&lt;br /&gt;
&lt;br /&gt;
 ----------x &amp;lt;----main area sectors---------&amp;gt;    x---------&lt;br /&gt;
           |        Visible            x---------x&lt;br /&gt;
           |                           |         |&lt;br /&gt;
           |                           |         |&amp;lt;linedef B&lt;br /&gt;
           x-------x                   |         | type 377&lt;br /&gt;
 linedef A&amp;gt;|       |&amp;lt;-buffer sectors-&amp;gt; |         | tag n&lt;br /&gt;
 type 376  |       |                   x---------x&lt;br /&gt;
 tag n     |       |  Never visible in-game      |&lt;br /&gt;
           |       |  but wide enough to fit     |&lt;br /&gt;
 ----------x-------x  walking objects            x---------&lt;br /&gt;
                      Set their light levels to different values from neighbouring main area sectors&lt;br /&gt;
&lt;br /&gt;
===Lifts between plane portals===&lt;br /&gt;
&lt;br /&gt;
You can make the floor or ceiling of a sector move from a sector group (layer) to another by using the [[Attached surface linedef types]].&lt;br /&gt;
&lt;br /&gt;
==Caveats and limitations==&lt;br /&gt;
* Linked areas must have corresponding floor or ceiling heights. It&#039;s not possible to look and move into an area with different Z coordinates.&lt;br /&gt;
* It is possible to make &amp;quot;impossible&amp;quot; structures, both with plane and line portals, but note that Eternity will attempt to render any scene relative to viewer&#039;s coordinates when looking at the portal, including any unrelated sectors placed at the same XY coordinates as the &amp;quot;virtual&amp;quot; tunnel. This undesired effect can be reduced by setting up the layout of the map properly.&lt;br /&gt;
* An &amp;quot;infinite&amp;quot; tunnel can be created, but it must consist of at least three sector groups in a cycle, as well as avoiding any visibility glitches mentioned in the previous point.&lt;br /&gt;
The following four points are valid because linked portals as a reliable feature are not fully implemented, but have been made available to the user, or for experimentation:&lt;br /&gt;
* Currently the hitscan traversal through portals is not implemented, which means that bullet attacks will be stopped, monsters will not be able to see you etc. The monsters will be able to hear and follow you through the portal however, and projectiles will pass through.&lt;br /&gt;
* Currently, an actor standing between two layers separated by a plane portal will jump repeatedly between the two areas and have difficulty walking.&lt;br /&gt;
* Currently sprites aren&#039;t seamlessly rendered through portals, appearing cut off by the portal plane.&lt;br /&gt;
* Currently, moving through portals can result in objects getting stuck, telefragged etc. Previously it was a hazard to the player too, as anything could telefrag, but it has been changed to be less hazardous.&lt;br /&gt;
Regardless, it is still possible to make convincing levels with linked portals even at their current state, as long as you make sure that major combat scenes will not take place between portals. Flying monsters can still follow the player through portals, so they have an advantage.&lt;br /&gt;
&lt;br /&gt;
==Tutorial==&lt;br /&gt;
Refer to Zarkyb&#039;s [[linked portals tutorial]] for more examples on usage.&lt;br /&gt;
&lt;br /&gt;
==Examples==&lt;br /&gt;
[https://s3-eu-west-1.amazonaws.com/eternity/linked_port.wad demo file] - a demonstration of both plane and wall portals.&lt;br /&gt;
Played on &#039;&#039;&#039;Doom2, Map01&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Things to note:&lt;br /&gt;
&lt;br /&gt;
* In compatibility menu the option &#039;&#039;&#039;actors have infinite height&#039;&#039;&#039; needs to be set to &#039;&#039;&#039;false&#039;&#039;&#039; in order for any actor to fall through a portal.&lt;br /&gt;
* The &amp;quot;upper part&amp;quot; is textured differently from the &amp;quot;lower part&amp;quot;. While in game observe when textures change and where exactly the clipping occurs.&lt;br /&gt;
* The lower room has a different shape than the room upstairs. Only the tagged, corresponding sectors which make up a &amp;quot;hole&amp;quot; have to be shaped alike.&lt;br /&gt;
* Any LineDef that copies floor / ceiling requires an appropriate &#039;&#039;&#039;Anchor&#039;&#039;&#039; action on correspodning LineDef in the copied sector. E.g. should the action &#039;&#039;&#039;special: 360; tag: 1&#039;&#039;&#039; be cleared from where it is and set on any other LineDef, you&#039;d get clipping errors, HoM effects or the renderer would simply refuse to connect portals.&lt;br /&gt;
* When viewing automap notice how position is updated. Player doesn&#039;t seem to &amp;quot;teleport&amp;quot; from one place of the map to another, yet his X/Y coordinates change when passing a portal boundary.&lt;br /&gt;
* Use console commands like &#039;&#039;&#039;spawn doomimp&#039;&#039;&#039; to test how monsters see, hear and aim through portals.&lt;br /&gt;
* When viewing through map editor note that there&#039;s no sector tagged with a &#039;&#039;&#039;3&#039;&#039;&#039; (tag used to link wall portals). Wall portals clipping is based on LineDefs, not sectors.&lt;br /&gt;
&lt;br /&gt;
[[File:Linked_portals.png]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Editing]]&lt;br /&gt;
[[Category:Editing reference]]&lt;/div&gt;</summary>
		<author><name>Ellmo</name></author>
	</entry>
	<entry>
		<id>https://eternity.youfailit.net/index.php?title=File:Linked_portals_top.png&amp;diff=3388</id>
		<title>File:Linked portals top.png</title>
		<link rel="alternate" type="text/html" href="https://eternity.youfailit.net/index.php?title=File:Linked_portals_top.png&amp;diff=3388"/>
		<updated>2013-02-08T22:43:58Z</updated>

		<summary type="html">&lt;p&gt;Ellmo: Linked portals as shown in demo map. Top part.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Linked portals as shown in demo map. Top part.&lt;/div&gt;</summary>
		<author><name>Ellmo</name></author>
	</entry>
	<entry>
		<id>https://eternity.youfailit.net/index.php?title=File:Linked_portals_bottom.png&amp;diff=3387</id>
		<title>File:Linked portals bottom.png</title>
		<link rel="alternate" type="text/html" href="https://eternity.youfailit.net/index.php?title=File:Linked_portals_bottom.png&amp;diff=3387"/>
		<updated>2013-02-08T22:43:31Z</updated>

		<summary type="html">&lt;p&gt;Ellmo: Linked portals as shown in demo map. Bottom part.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Linked portals as shown in demo map. Bottom part.&lt;/div&gt;</summary>
		<author><name>Ellmo</name></author>
	</entry>
	<entry>
		<id>https://eternity.youfailit.net/index.php?title=Linked_portal&amp;diff=3386</id>
		<title>Linked portal</title>
		<link rel="alternate" type="text/html" href="https://eternity.youfailit.net/index.php?title=Linked_portal&amp;diff=3386"/>
		<updated>2013-02-08T22:36:53Z</updated>

		<summary type="html">&lt;p&gt;Ellmo: /* Examples */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Linked portals&#039;&#039;&#039; are a powerful feature which make it possible to connect two separate areas of a map via the floor/ceiling or one-sided linedefs, allowing the player to see, shoot, and even move seamlessly from one area into another. They are used similarly to two-way portals, apart from the fact that you can pass through them. They can be used to create 3D architecture and room-over-room effects, with very few limitations.&lt;br /&gt;
{{backto|Portal linedef types}}&lt;br /&gt;
&lt;br /&gt;
==Line triggers==&lt;br /&gt;
 #     Class  Trig Description&lt;br /&gt;
 &lt;br /&gt;
 358   Ext    --   Apply linked portal to like-tagged ceilings&lt;br /&gt;
 &lt;br /&gt;
 359   Ext    --   Apply linked portal to like-tagged floors&lt;br /&gt;
 &lt;br /&gt;
 360   Ext    --   Linked portal anchor line for special 358&lt;br /&gt;
 &lt;br /&gt;
 361   Ext    --   Linked portal anchor line for special 359&lt;br /&gt;
 &lt;br /&gt;
 376   Ext    --   Apply linked portals to like-tagged lines&lt;br /&gt;
 &lt;br /&gt;
 377   Ext    --   Anchor line for special 376&lt;br /&gt;
 &lt;br /&gt;
 385   Ext    --   Apply portal to front sector&lt;br /&gt;
&lt;br /&gt;
==Terminology==&lt;br /&gt;
Linked portals have their own specific sub-set of terminology used to describe certain aspects and behaviors.&lt;br /&gt;
&lt;br /&gt;
===Portal Plane===&lt;br /&gt;
Unlike the basic portal types, which were rendered and could cover height variances (much like the doom sky), linked portals form an actual map structure. The &#039;&#039;&#039;Portal Plane&#039;&#039;&#039; refers to an X/Y plane that bisects the sector(s) that contain the portal. The z-position of the portal is fixed, and should be the same height on both sides of the linked portal.&lt;br /&gt;
&lt;br /&gt;
===Beyond the Plane===&lt;br /&gt;
Map architecture is said to be beyond the portal plane when its vertical height is equal to or beyond the portal height--that is, at or above a ceiling portal plane or at or below a floor portal plane. When map architecture is beyond a portal plane, the portal will display at the height of the plane.&lt;br /&gt;
&lt;br /&gt;
===Inside the plane===&lt;br /&gt;
Map architecture is said to be inside the portal plane when its vertical height is not beyond the portal plane--that is, below a ceiling portal or above a floor portal. Any architecture that is inside the portal plane will render normally and will obscure rendering of the portal.&lt;br /&gt;
&lt;br /&gt;
==Usage==&lt;br /&gt;
Linked portals use trigger and anchor lines (much like anchored portals) to determine an X and Y offset from one part of the map to another, but there are specific requirements unique to linked portals:&lt;br /&gt;
&lt;br /&gt;
*Linked portals must be two-way, meaning the upper area must reference the lower area and vice versa.&lt;br /&gt;
*Linked portals have specific behavior relating to z-coordinates of the portal plane.&lt;br /&gt;
&lt;br /&gt;
==Setup==&lt;br /&gt;
&lt;br /&gt;
There are two kinds of linked portals: plane portals and line portals. Plane portals are sector floor or ceiling surfaces that vertically connect different sector groups (layers) of the map. Line portals are linedefs that connect areas horizontally.&lt;br /&gt;
&lt;br /&gt;
===Setting up plane portals===&lt;br /&gt;
There must be (at least) two sectors in the map, not linked together by any path (similar to how disjoint areas exist in classic Doom maps and are gameplay-connected only by teleporters).&lt;br /&gt;
&lt;br /&gt;
The ceiling height of one of them must match the floor height of the other. Let&#039;s call the bottom sector A and the top sector B.&lt;br /&gt;
&lt;br /&gt;
Even though the sectors need to have the same outline, they can have different detail inner sectors in them. For example, sector A can have several crate sectors whose outlines don&#039;t need to be copied into upper sector B, which has much less detail. Note that one-sided linedef walls inside sectors (e.g. columns) must have their outlines copied.&lt;br /&gt;
&lt;br /&gt;
Reserve two linedefs for each sector. Make sure the two linedefs selected for sector A will have the same relative coordinates and sizes as the two corresponding linedefs from B.&lt;br /&gt;
&lt;br /&gt;
Tag sector A and its inner details with a number. Tag B and its details with another number.&lt;br /&gt;
&lt;br /&gt;
Give the reserved linedefs from A special 359, tag of B and special 360, tag of A respectively. Give the reserved linedefs from B special 358, tag of A and special 361, tag of B respectively. Here is how they should correspond:&lt;br /&gt;
&lt;br /&gt;
* Reserved linedef 1 of sector A: special 359, tag B (Apply linked portal to floor of B)&lt;br /&gt;
* Reserved linedef 1 of sector B: special 361, tag B (Linked portal anchor line for special 359)&lt;br /&gt;
* Reserved linedef 2 of sector A: special 360, tag A (Linked portal anchor line for special 358)&lt;br /&gt;
* Reserved linedef 2 of sector B: special 358, tag A (Apply linked portal to ceiling of A)&lt;br /&gt;
&lt;br /&gt;
Note that with this implementation, you&#039;ll have to give a tag to every sector which needs a portal. Sometimes this is not practical, because you may want to make various sectors with special effects within A or B. To bypass this problem, you can tag the special sector differently, but one of the linedefs facing it must have special 385 (Apply portal to front sector) and have the tag of the non-special sectors that surround it (A or B). This will copy the portal information into the special sector.&lt;br /&gt;
&lt;br /&gt;
Here is a diagram on how to set up:&lt;br /&gt;
&lt;br /&gt;
 :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::&lt;br /&gt;
 -----------------x---------------------x:::::::::::::      ~-------------------x---------------------x:::::::::::::::::::&lt;br /&gt;
                 /                       \::::::::::::      ~ Neighbour        /                       \::::::::::::::::::&lt;br /&gt;
  Neighbour     /         SECTOR A        \::::::::::       ~ sector of       /         SECTOR B        \:::::::::::::::::&lt;br /&gt;
  sector of    /  x----x             floor \:::::::::       ~ B              /  x----x                   \::::::::::::::::&lt;br /&gt;
  A           /   |::::|             detail \::::::::       ~ (not tagged)  /   |    |                    \:::::::::::::::&lt;br /&gt;
  (untagged) /    |::::|wall         x---x   \:::::::       ~              /    |    |top of wall from A   \::::::::::::::&lt;br /&gt;
 -----------x     x----x             |   |    x:::::::::    ~-------------x     x----x &amp;lt;NOT tagged          x:::::::::::::&lt;br /&gt;
 ::::::::::::\                       x---x   /:::::::::::::::::::::::::::::\                               /::::::::::::::&lt;br /&gt;
 :::::::::::::\    x---x-----x same tag as^ /:::::::::::::::::::::::::::::::\     x-------------x         /:::::::::::::::&lt;br /&gt;
 ::::::::::::::\    \   \    | &amp;lt;  A        x:::::::::::::::::::::::::::::::::\    x-------------x        x::::::::::::::::&lt;br /&gt;
 :::::::::::::::\    x---x---x            /360,A::::::::::::::::::::::::::::::\ ceil. detail            /358,A::::::::::::&lt;br /&gt;
 ::::::::::::::::\ flr.detail    359,B   /:::::::::::::::::::::::::::::::::::::\ tag of B      361,B   /::::::::::::::::::&lt;br /&gt;
 :::::::::::::::::x-------------x-------x:::::::::::::::::::::::::::::::::::::::x-------------x-------x:::::::::::::::::::&lt;br /&gt;
 :::::::::::::::::::::::::::::::::THE PORTAL LINEDEFS:::::::::::::::::::::::::::::::::::::::::THE PORTAL LINEDEFS:::::::::&lt;br /&gt;
&lt;br /&gt;
===Setting up wall portals===&lt;br /&gt;
Wall portals are slightly simpler to implement. The two separate sectors must have the same floor and ceiling heights and the portal linedefs need to be of the same length and angle. They must also be two-sided, passable and have a buffer sector behind them, with enough depth so the portal is walkable by the intended actors (so they don&#039;t bump into the back wall of the buffer sector).&lt;br /&gt;
&lt;br /&gt;
The two linedefs will have the 376 and 377 specials (respectively, order not being important) and a common tag (which doesn&#039;t have to belong to any sector).&lt;br /&gt;
&lt;br /&gt;
Note that to render correctly, the buffer sectors behind them will need to have different light levels from the one in front of them. If the portal works correctly, they will never be visible during the game, and won&#039;t be accessible unless the user activates no-clipping mode.&lt;br /&gt;
&lt;br /&gt;
Here is a diagram on how to set up:&lt;br /&gt;
&lt;br /&gt;
 ----------x &amp;lt;----main area sectors---------&amp;gt;    x---------&lt;br /&gt;
           |        Visible            x---------x&lt;br /&gt;
           |                           |         |&lt;br /&gt;
           |                           |         |&amp;lt;linedef B&lt;br /&gt;
           x-------x                   |         | type 377&lt;br /&gt;
 linedef A&amp;gt;|       |&amp;lt;-buffer sectors-&amp;gt; |         | tag n&lt;br /&gt;
 type 376  |       |                   x---------x&lt;br /&gt;
 tag n     |       |  Never visible in-game      |&lt;br /&gt;
           |       |  but wide enough to fit     |&lt;br /&gt;
 ----------x-------x  walking objects            x---------&lt;br /&gt;
                      Set their light levels to different values from neighbouring main area sectors&lt;br /&gt;
&lt;br /&gt;
===Lifts between plane portals===&lt;br /&gt;
&lt;br /&gt;
You can make the floor or ceiling of a sector move from a sector group (layer) to another by using the [[Attached surface linedef types]].&lt;br /&gt;
&lt;br /&gt;
==Caveats and limitations==&lt;br /&gt;
* Linked areas must have corresponding floor or ceiling heights. It&#039;s not possible to look and move into an area with different Z coordinates.&lt;br /&gt;
* It is possible to make &amp;quot;impossible&amp;quot; structures, both with plane and line portals, but note that Eternity will attempt to render any scene relative to viewer&#039;s coordinates when looking at the portal, including any unrelated sectors placed at the same XY coordinates as the &amp;quot;virtual&amp;quot; tunnel. This undesired effect can be reduced by setting up the layout of the map properly.&lt;br /&gt;
* An &amp;quot;infinite&amp;quot; tunnel can be created, but it must consist of at least three sector groups in a cycle, as well as avoiding any visibility glitches mentioned in the previous point.&lt;br /&gt;
The following four points are valid because linked portals as a reliable feature are not fully implemented, but have been made available to the user, or for experimentation:&lt;br /&gt;
* Currently the hitscan traversal through portals is not implemented, which means that bullet attacks will be stopped, monsters will not be able to see you etc. The monsters will be able to hear and follow you through the portal however, and projectiles will pass through.&lt;br /&gt;
* Currently, an actor standing between two layers separated by a plane portal will jump repeatedly between the two areas and have difficulty walking.&lt;br /&gt;
* Currently sprites aren&#039;t seamlessly rendered through portals, appearing cut off by the portal plane.&lt;br /&gt;
* Currently, moving through portals can result in objects getting stuck, telefragged etc. Previously it was a hazard to the player too, as anything could telefrag, but it has been changed to be less hazardous.&lt;br /&gt;
Regardless, it is still possible to make convincing levels with linked portals even at their current state, as long as you make sure that major combat scenes will not take place between portals. Flying monsters can still follow the player through portals, so they have an advantage.&lt;br /&gt;
&lt;br /&gt;
==Tutorial==&lt;br /&gt;
Refer to Zarkyb&#039;s [[linked portals tutorial]] for more examples on usage.&lt;br /&gt;
&lt;br /&gt;
==Examples==&lt;br /&gt;
[https://s3-eu-west-1.amazonaws.com/eternity/linked_port.wad demo file] - a demonstration of both plane and wall portals.&lt;br /&gt;
Played on &#039;&#039;&#039;Doom2, Map01&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Things to note:&lt;br /&gt;
&lt;br /&gt;
* In compatibility menu the option &#039;&#039;&#039;actors have infinite height&#039;&#039;&#039; needs to be set to &#039;&#039;&#039;false&#039;&#039;&#039; in order for any actor to fall through a portal.&lt;br /&gt;
* The &amp;quot;upper part&amp;quot; is textured differently from the &amp;quot;lower part&amp;quot;. While in game observe when textures change and where exactly the clipping occurs.&lt;br /&gt;
* The lower room has a different shape than the room upstairs. Only the tagged, corresponding sectors which make up a &amp;quot;hole&amp;quot; have to be shaped alike.&lt;br /&gt;
* Any LineDef that copies floor / ceiling requires an appropriate &#039;&#039;&#039;Anchor&#039;&#039;&#039; action on correspodning LineDef in the copied sector. E.g. should the action &#039;&#039;&#039;special: 360; tag: 1&#039;&#039;&#039; be cleared from where it is and set on any other LineDef, you&#039;d get clipping errors, HoM effects or the renderer would simply refuse to connect portals.&lt;br /&gt;
* When viewing automap notice how position is updated. Player doesn&#039;t seem to &amp;quot;teleport&amp;quot; from one place of the map to another, yet his X/Y coordinates change when passing a portal boundary.&lt;br /&gt;
* Use console commands like &#039;&#039;&#039;spawn doomimp&#039;&#039;&#039; to test how monsters see, hear and aim through portals.&lt;br /&gt;
* When viewing through map editor note that there&#039;s no sector tagged with a &#039;&#039;&#039;3&#039;&#039;&#039; (tag used to link wall portals). Wall portals clipping is based on LineDefs, not sectors.&lt;br /&gt;
&lt;br /&gt;
[[File:Linked_portals.png]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Editing]]&lt;br /&gt;
[[Category:Editing reference]]&lt;/div&gt;</summary>
		<author><name>Ellmo</name></author>
	</entry>
	<entry>
		<id>https://eternity.youfailit.net/index.php?title=Linked_portal&amp;diff=3385</id>
		<title>Linked portal</title>
		<link rel="alternate" type="text/html" href="https://eternity.youfailit.net/index.php?title=Linked_portal&amp;diff=3385"/>
		<updated>2013-02-08T22:18:21Z</updated>

		<summary type="html">&lt;p&gt;Ellmo: /* Examples */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Linked portals&#039;&#039;&#039; are a powerful feature which make it possible to connect two separate areas of a map via the floor/ceiling or one-sided linedefs, allowing the player to see, shoot, and even move seamlessly from one area into another. They are used similarly to two-way portals, apart from the fact that you can pass through them. They can be used to create 3D architecture and room-over-room effects, with very few limitations.&lt;br /&gt;
{{backto|Portal linedef types}}&lt;br /&gt;
&lt;br /&gt;
==Line triggers==&lt;br /&gt;
 #     Class  Trig Description&lt;br /&gt;
 &lt;br /&gt;
 358   Ext    --   Apply linked portal to like-tagged ceilings&lt;br /&gt;
 &lt;br /&gt;
 359   Ext    --   Apply linked portal to like-tagged floors&lt;br /&gt;
 &lt;br /&gt;
 360   Ext    --   Linked portal anchor line for special 358&lt;br /&gt;
 &lt;br /&gt;
 361   Ext    --   Linked portal anchor line for special 359&lt;br /&gt;
 &lt;br /&gt;
 376   Ext    --   Apply linked portals to like-tagged lines&lt;br /&gt;
 &lt;br /&gt;
 377   Ext    --   Anchor line for special 376&lt;br /&gt;
 &lt;br /&gt;
 385   Ext    --   Apply portal to front sector&lt;br /&gt;
&lt;br /&gt;
==Terminology==&lt;br /&gt;
Linked portals have their own specific sub-set of terminology used to describe certain aspects and behaviors.&lt;br /&gt;
&lt;br /&gt;
===Portal Plane===&lt;br /&gt;
Unlike the basic portal types, which were rendered and could cover height variances (much like the doom sky), linked portals form an actual map structure. The &#039;&#039;&#039;Portal Plane&#039;&#039;&#039; refers to an X/Y plane that bisects the sector(s) that contain the portal. The z-position of the portal is fixed, and should be the same height on both sides of the linked portal.&lt;br /&gt;
&lt;br /&gt;
===Beyond the Plane===&lt;br /&gt;
Map architecture is said to be beyond the portal plane when its vertical height is equal to or beyond the portal height--that is, at or above a ceiling portal plane or at or below a floor portal plane. When map architecture is beyond a portal plane, the portal will display at the height of the plane.&lt;br /&gt;
&lt;br /&gt;
===Inside the plane===&lt;br /&gt;
Map architecture is said to be inside the portal plane when its vertical height is not beyond the portal plane--that is, below a ceiling portal or above a floor portal. Any architecture that is inside the portal plane will render normally and will obscure rendering of the portal.&lt;br /&gt;
&lt;br /&gt;
==Usage==&lt;br /&gt;
Linked portals use trigger and anchor lines (much like anchored portals) to determine an X and Y offset from one part of the map to another, but there are specific requirements unique to linked portals:&lt;br /&gt;
&lt;br /&gt;
*Linked portals must be two-way, meaning the upper area must reference the lower area and vice versa.&lt;br /&gt;
*Linked portals have specific behavior relating to z-coordinates of the portal plane.&lt;br /&gt;
&lt;br /&gt;
==Setup==&lt;br /&gt;
&lt;br /&gt;
There are two kinds of linked portals: plane portals and line portals. Plane portals are sector floor or ceiling surfaces that vertically connect different sector groups (layers) of the map. Line portals are linedefs that connect areas horizontally.&lt;br /&gt;
&lt;br /&gt;
===Setting up plane portals===&lt;br /&gt;
There must be (at least) two sectors in the map, not linked together by any path (similar to how disjoint areas exist in classic Doom maps and are gameplay-connected only by teleporters).&lt;br /&gt;
&lt;br /&gt;
The ceiling height of one of them must match the floor height of the other. Let&#039;s call the bottom sector A and the top sector B.&lt;br /&gt;
&lt;br /&gt;
Even though the sectors need to have the same outline, they can have different detail inner sectors in them. For example, sector A can have several crate sectors whose outlines don&#039;t need to be copied into upper sector B, which has much less detail. Note that one-sided linedef walls inside sectors (e.g. columns) must have their outlines copied.&lt;br /&gt;
&lt;br /&gt;
Reserve two linedefs for each sector. Make sure the two linedefs selected for sector A will have the same relative coordinates and sizes as the two corresponding linedefs from B.&lt;br /&gt;
&lt;br /&gt;
Tag sector A and its inner details with a number. Tag B and its details with another number.&lt;br /&gt;
&lt;br /&gt;
Give the reserved linedefs from A special 359, tag of B and special 360, tag of A respectively. Give the reserved linedefs from B special 358, tag of A and special 361, tag of B respectively. Here is how they should correspond:&lt;br /&gt;
&lt;br /&gt;
* Reserved linedef 1 of sector A: special 359, tag B (Apply linked portal to floor of B)&lt;br /&gt;
* Reserved linedef 1 of sector B: special 361, tag B (Linked portal anchor line for special 359)&lt;br /&gt;
* Reserved linedef 2 of sector A: special 360, tag A (Linked portal anchor line for special 358)&lt;br /&gt;
* Reserved linedef 2 of sector B: special 358, tag A (Apply linked portal to ceiling of A)&lt;br /&gt;
&lt;br /&gt;
Note that with this implementation, you&#039;ll have to give a tag to every sector which needs a portal. Sometimes this is not practical, because you may want to make various sectors with special effects within A or B. To bypass this problem, you can tag the special sector differently, but one of the linedefs facing it must have special 385 (Apply portal to front sector) and have the tag of the non-special sectors that surround it (A or B). This will copy the portal information into the special sector.&lt;br /&gt;
&lt;br /&gt;
Here is a diagram on how to set up:&lt;br /&gt;
&lt;br /&gt;
 :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::&lt;br /&gt;
 -----------------x---------------------x:::::::::::::      ~-------------------x---------------------x:::::::::::::::::::&lt;br /&gt;
                 /                       \::::::::::::      ~ Neighbour        /                       \::::::::::::::::::&lt;br /&gt;
  Neighbour     /         SECTOR A        \::::::::::       ~ sector of       /         SECTOR B        \:::::::::::::::::&lt;br /&gt;
  sector of    /  x----x             floor \:::::::::       ~ B              /  x----x                   \::::::::::::::::&lt;br /&gt;
  A           /   |::::|             detail \::::::::       ~ (not tagged)  /   |    |                    \:::::::::::::::&lt;br /&gt;
  (untagged) /    |::::|wall         x---x   \:::::::       ~              /    |    |top of wall from A   \::::::::::::::&lt;br /&gt;
 -----------x     x----x             |   |    x:::::::::    ~-------------x     x----x &amp;lt;NOT tagged          x:::::::::::::&lt;br /&gt;
 ::::::::::::\                       x---x   /:::::::::::::::::::::::::::::\                               /::::::::::::::&lt;br /&gt;
 :::::::::::::\    x---x-----x same tag as^ /:::::::::::::::::::::::::::::::\     x-------------x         /:::::::::::::::&lt;br /&gt;
 ::::::::::::::\    \   \    | &amp;lt;  A        x:::::::::::::::::::::::::::::::::\    x-------------x        x::::::::::::::::&lt;br /&gt;
 :::::::::::::::\    x---x---x            /360,A::::::::::::::::::::::::::::::\ ceil. detail            /358,A::::::::::::&lt;br /&gt;
 ::::::::::::::::\ flr.detail    359,B   /:::::::::::::::::::::::::::::::::::::\ tag of B      361,B   /::::::::::::::::::&lt;br /&gt;
 :::::::::::::::::x-------------x-------x:::::::::::::::::::::::::::::::::::::::x-------------x-------x:::::::::::::::::::&lt;br /&gt;
 :::::::::::::::::::::::::::::::::THE PORTAL LINEDEFS:::::::::::::::::::::::::::::::::::::::::THE PORTAL LINEDEFS:::::::::&lt;br /&gt;
&lt;br /&gt;
===Setting up wall portals===&lt;br /&gt;
Wall portals are slightly simpler to implement. The two separate sectors must have the same floor and ceiling heights and the portal linedefs need to be of the same length and angle. They must also be two-sided, passable and have a buffer sector behind them, with enough depth so the portal is walkable by the intended actors (so they don&#039;t bump into the back wall of the buffer sector).&lt;br /&gt;
&lt;br /&gt;
The two linedefs will have the 376 and 377 specials (respectively, order not being important) and a common tag (which doesn&#039;t have to belong to any sector).&lt;br /&gt;
&lt;br /&gt;
Note that to render correctly, the buffer sectors behind them will need to have different light levels from the one in front of them. If the portal works correctly, they will never be visible during the game, and won&#039;t be accessible unless the user activates no-clipping mode.&lt;br /&gt;
&lt;br /&gt;
Here is a diagram on how to set up:&lt;br /&gt;
&lt;br /&gt;
 ----------x &amp;lt;----main area sectors---------&amp;gt;    x---------&lt;br /&gt;
           |        Visible            x---------x&lt;br /&gt;
           |                           |         |&lt;br /&gt;
           |                           |         |&amp;lt;linedef B&lt;br /&gt;
           x-------x                   |         | type 377&lt;br /&gt;
 linedef A&amp;gt;|       |&amp;lt;-buffer sectors-&amp;gt; |         | tag n&lt;br /&gt;
 type 376  |       |                   x---------x&lt;br /&gt;
 tag n     |       |  Never visible in-game      |&lt;br /&gt;
           |       |  but wide enough to fit     |&lt;br /&gt;
 ----------x-------x  walking objects            x---------&lt;br /&gt;
                      Set their light levels to different values from neighbouring main area sectors&lt;br /&gt;
&lt;br /&gt;
===Lifts between plane portals===&lt;br /&gt;
&lt;br /&gt;
You can make the floor or ceiling of a sector move from a sector group (layer) to another by using the [[Attached surface linedef types]].&lt;br /&gt;
&lt;br /&gt;
==Caveats and limitations==&lt;br /&gt;
* Linked areas must have corresponding floor or ceiling heights. It&#039;s not possible to look and move into an area with different Z coordinates.&lt;br /&gt;
* It is possible to make &amp;quot;impossible&amp;quot; structures, both with plane and line portals, but note that Eternity will attempt to render any scene relative to viewer&#039;s coordinates when looking at the portal, including any unrelated sectors placed at the same XY coordinates as the &amp;quot;virtual&amp;quot; tunnel. This undesired effect can be reduced by setting up the layout of the map properly.&lt;br /&gt;
* An &amp;quot;infinite&amp;quot; tunnel can be created, but it must consist of at least three sector groups in a cycle, as well as avoiding any visibility glitches mentioned in the previous point.&lt;br /&gt;
The following four points are valid because linked portals as a reliable feature are not fully implemented, but have been made available to the user, or for experimentation:&lt;br /&gt;
* Currently the hitscan traversal through portals is not implemented, which means that bullet attacks will be stopped, monsters will not be able to see you etc. The monsters will be able to hear and follow you through the portal however, and projectiles will pass through.&lt;br /&gt;
* Currently, an actor standing between two layers separated by a plane portal will jump repeatedly between the two areas and have difficulty walking.&lt;br /&gt;
* Currently sprites aren&#039;t seamlessly rendered through portals, appearing cut off by the portal plane.&lt;br /&gt;
* Currently, moving through portals can result in objects getting stuck, telefragged etc. Previously it was a hazard to the player too, as anything could telefrag, but it has been changed to be less hazardous.&lt;br /&gt;
Regardless, it is still possible to make convincing levels with linked portals even at their current state, as long as you make sure that major combat scenes will not take place between portals. Flying monsters can still follow the player through portals, so they have an advantage.&lt;br /&gt;
&lt;br /&gt;
==Tutorial==&lt;br /&gt;
Refer to Zarkyb&#039;s [[linked portals tutorial]] for more examples on usage.&lt;br /&gt;
&lt;br /&gt;
==Examples==&lt;br /&gt;
[https://s3-eu-west-1.amazonaws.com/eternity/linked_port.wad demo file] - a demonstration of both plane and wall portals.&lt;br /&gt;
Played on &#039;&#039;&#039;Doom2, Map01&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Things to note:&lt;br /&gt;
&lt;br /&gt;
* In compatibility menu the option &#039;&#039;&#039;actors have infinite height&#039;&#039;&#039; needs to be set to &#039;&#039;&#039;false&#039;&#039;&#039; in order for any actor to fall through a portal.&lt;br /&gt;
* The &amp;quot;upper part&amp;quot; is textured differently from the lower part. While in game observe when textures change and where exactly the clipping occurs.&lt;br /&gt;
* When viewing automap notice how position is updated. Player doesn&#039;t seem to &amp;quot;teleport&amp;quot; from one place of the map to another, yet his X/Y coordinates change when passing a portal boundary.&lt;br /&gt;
* Use console commands like &#039;&#039;&#039;spawn doomimp&#039;&#039;&#039; to test how monsters see, hear and aim through portals.&lt;br /&gt;
* When viewing through map editor note that there&#039;s no sector tagged with a &#039;&#039;&#039;3&#039;&#039;&#039; (tag used to link wall portals). Wall portals clipping is based on LineDefs, not sectors.&lt;br /&gt;
&lt;br /&gt;
[[File:Linked_portals.png]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Editing]]&lt;br /&gt;
[[Category:Editing reference]]&lt;/div&gt;</summary>
		<author><name>Ellmo</name></author>
	</entry>
	<entry>
		<id>https://eternity.youfailit.net/index.php?title=Linked_portal&amp;diff=3384</id>
		<title>Linked portal</title>
		<link rel="alternate" type="text/html" href="https://eternity.youfailit.net/index.php?title=Linked_portal&amp;diff=3384"/>
		<updated>2013-02-08T22:07:23Z</updated>

		<summary type="html">&lt;p&gt;Ellmo: /* Examples */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Linked portals&#039;&#039;&#039; are a powerful feature which make it possible to connect two separate areas of a map via the floor/ceiling or one-sided linedefs, allowing the player to see, shoot, and even move seamlessly from one area into another. They are used similarly to two-way portals, apart from the fact that you can pass through them. They can be used to create 3D architecture and room-over-room effects, with very few limitations.&lt;br /&gt;
{{backto|Portal linedef types}}&lt;br /&gt;
&lt;br /&gt;
==Line triggers==&lt;br /&gt;
 #     Class  Trig Description&lt;br /&gt;
 &lt;br /&gt;
 358   Ext    --   Apply linked portal to like-tagged ceilings&lt;br /&gt;
 &lt;br /&gt;
 359   Ext    --   Apply linked portal to like-tagged floors&lt;br /&gt;
 &lt;br /&gt;
 360   Ext    --   Linked portal anchor line for special 358&lt;br /&gt;
 &lt;br /&gt;
 361   Ext    --   Linked portal anchor line for special 359&lt;br /&gt;
 &lt;br /&gt;
 376   Ext    --   Apply linked portals to like-tagged lines&lt;br /&gt;
 &lt;br /&gt;
 377   Ext    --   Anchor line for special 376&lt;br /&gt;
 &lt;br /&gt;
 385   Ext    --   Apply portal to front sector&lt;br /&gt;
&lt;br /&gt;
==Terminology==&lt;br /&gt;
Linked portals have their own specific sub-set of terminology used to describe certain aspects and behaviors.&lt;br /&gt;
&lt;br /&gt;
===Portal Plane===&lt;br /&gt;
Unlike the basic portal types, which were rendered and could cover height variances (much like the doom sky), linked portals form an actual map structure. The &#039;&#039;&#039;Portal Plane&#039;&#039;&#039; refers to an X/Y plane that bisects the sector(s) that contain the portal. The z-position of the portal is fixed, and should be the same height on both sides of the linked portal.&lt;br /&gt;
&lt;br /&gt;
===Beyond the Plane===&lt;br /&gt;
Map architecture is said to be beyond the portal plane when its vertical height is equal to or beyond the portal height--that is, at or above a ceiling portal plane or at or below a floor portal plane. When map architecture is beyond a portal plane, the portal will display at the height of the plane.&lt;br /&gt;
&lt;br /&gt;
===Inside the plane===&lt;br /&gt;
Map architecture is said to be inside the portal plane when its vertical height is not beyond the portal plane--that is, below a ceiling portal or above a floor portal. Any architecture that is inside the portal plane will render normally and will obscure rendering of the portal.&lt;br /&gt;
&lt;br /&gt;
==Usage==&lt;br /&gt;
Linked portals use trigger and anchor lines (much like anchored portals) to determine an X and Y offset from one part of the map to another, but there are specific requirements unique to linked portals:&lt;br /&gt;
&lt;br /&gt;
*Linked portals must be two-way, meaning the upper area must reference the lower area and vice versa.&lt;br /&gt;
*Linked portals have specific behavior relating to z-coordinates of the portal plane.&lt;br /&gt;
&lt;br /&gt;
==Setup==&lt;br /&gt;
&lt;br /&gt;
There are two kinds of linked portals: plane portals and line portals. Plane portals are sector floor or ceiling surfaces that vertically connect different sector groups (layers) of the map. Line portals are linedefs that connect areas horizontally.&lt;br /&gt;
&lt;br /&gt;
===Setting up plane portals===&lt;br /&gt;
There must be (at least) two sectors in the map, not linked together by any path (similar to how disjoint areas exist in classic Doom maps and are gameplay-connected only by teleporters).&lt;br /&gt;
&lt;br /&gt;
The ceiling height of one of them must match the floor height of the other. Let&#039;s call the bottom sector A and the top sector B.&lt;br /&gt;
&lt;br /&gt;
Even though the sectors need to have the same outline, they can have different detail inner sectors in them. For example, sector A can have several crate sectors whose outlines don&#039;t need to be copied into upper sector B, which has much less detail. Note that one-sided linedef walls inside sectors (e.g. columns) must have their outlines copied.&lt;br /&gt;
&lt;br /&gt;
Reserve two linedefs for each sector. Make sure the two linedefs selected for sector A will have the same relative coordinates and sizes as the two corresponding linedefs from B.&lt;br /&gt;
&lt;br /&gt;
Tag sector A and its inner details with a number. Tag B and its details with another number.&lt;br /&gt;
&lt;br /&gt;
Give the reserved linedefs from A special 359, tag of B and special 360, tag of A respectively. Give the reserved linedefs from B special 358, tag of A and special 361, tag of B respectively. Here is how they should correspond:&lt;br /&gt;
&lt;br /&gt;
* Reserved linedef 1 of sector A: special 359, tag B (Apply linked portal to floor of B)&lt;br /&gt;
* Reserved linedef 1 of sector B: special 361, tag B (Linked portal anchor line for special 359)&lt;br /&gt;
* Reserved linedef 2 of sector A: special 360, tag A (Linked portal anchor line for special 358)&lt;br /&gt;
* Reserved linedef 2 of sector B: special 358, tag A (Apply linked portal to ceiling of A)&lt;br /&gt;
&lt;br /&gt;
Note that with this implementation, you&#039;ll have to give a tag to every sector which needs a portal. Sometimes this is not practical, because you may want to make various sectors with special effects within A or B. To bypass this problem, you can tag the special sector differently, but one of the linedefs facing it must have special 385 (Apply portal to front sector) and have the tag of the non-special sectors that surround it (A or B). This will copy the portal information into the special sector.&lt;br /&gt;
&lt;br /&gt;
Here is a diagram on how to set up:&lt;br /&gt;
&lt;br /&gt;
 :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::&lt;br /&gt;
 -----------------x---------------------x:::::::::::::      ~-------------------x---------------------x:::::::::::::::::::&lt;br /&gt;
                 /                       \::::::::::::      ~ Neighbour        /                       \::::::::::::::::::&lt;br /&gt;
  Neighbour     /         SECTOR A        \::::::::::       ~ sector of       /         SECTOR B        \:::::::::::::::::&lt;br /&gt;
  sector of    /  x----x             floor \:::::::::       ~ B              /  x----x                   \::::::::::::::::&lt;br /&gt;
  A           /   |::::|             detail \::::::::       ~ (not tagged)  /   |    |                    \:::::::::::::::&lt;br /&gt;
  (untagged) /    |::::|wall         x---x   \:::::::       ~              /    |    |top of wall from A   \::::::::::::::&lt;br /&gt;
 -----------x     x----x             |   |    x:::::::::    ~-------------x     x----x &amp;lt;NOT tagged          x:::::::::::::&lt;br /&gt;
 ::::::::::::\                       x---x   /:::::::::::::::::::::::::::::\                               /::::::::::::::&lt;br /&gt;
 :::::::::::::\    x---x-----x same tag as^ /:::::::::::::::::::::::::::::::\     x-------------x         /:::::::::::::::&lt;br /&gt;
 ::::::::::::::\    \   \    | &amp;lt;  A        x:::::::::::::::::::::::::::::::::\    x-------------x        x::::::::::::::::&lt;br /&gt;
 :::::::::::::::\    x---x---x            /360,A::::::::::::::::::::::::::::::\ ceil. detail            /358,A::::::::::::&lt;br /&gt;
 ::::::::::::::::\ flr.detail    359,B   /:::::::::::::::::::::::::::::::::::::\ tag of B      361,B   /::::::::::::::::::&lt;br /&gt;
 :::::::::::::::::x-------------x-------x:::::::::::::::::::::::::::::::::::::::x-------------x-------x:::::::::::::::::::&lt;br /&gt;
 :::::::::::::::::::::::::::::::::THE PORTAL LINEDEFS:::::::::::::::::::::::::::::::::::::::::THE PORTAL LINEDEFS:::::::::&lt;br /&gt;
&lt;br /&gt;
===Setting up wall portals===&lt;br /&gt;
Wall portals are slightly simpler to implement. The two separate sectors must have the same floor and ceiling heights and the portal linedefs need to be of the same length and angle. They must also be two-sided, passable and have a buffer sector behind them, with enough depth so the portal is walkable by the intended actors (so they don&#039;t bump into the back wall of the buffer sector).&lt;br /&gt;
&lt;br /&gt;
The two linedefs will have the 376 and 377 specials (respectively, order not being important) and a common tag (which doesn&#039;t have to belong to any sector).&lt;br /&gt;
&lt;br /&gt;
Note that to render correctly, the buffer sectors behind them will need to have different light levels from the one in front of them. If the portal works correctly, they will never be visible during the game, and won&#039;t be accessible unless the user activates no-clipping mode.&lt;br /&gt;
&lt;br /&gt;
Here is a diagram on how to set up:&lt;br /&gt;
&lt;br /&gt;
 ----------x &amp;lt;----main area sectors---------&amp;gt;    x---------&lt;br /&gt;
           |        Visible            x---------x&lt;br /&gt;
           |                           |         |&lt;br /&gt;
           |                           |         |&amp;lt;linedef B&lt;br /&gt;
           x-------x                   |         | type 377&lt;br /&gt;
 linedef A&amp;gt;|       |&amp;lt;-buffer sectors-&amp;gt; |         | tag n&lt;br /&gt;
 type 376  |       |                   x---------x&lt;br /&gt;
 tag n     |       |  Never visible in-game      |&lt;br /&gt;
           |       |  but wide enough to fit     |&lt;br /&gt;
 ----------x-------x  walking objects            x---------&lt;br /&gt;
                      Set their light levels to different values from neighbouring main area sectors&lt;br /&gt;
&lt;br /&gt;
===Lifts between plane portals===&lt;br /&gt;
&lt;br /&gt;
You can make the floor or ceiling of a sector move from a sector group (layer) to another by using the [[Attached surface linedef types]].&lt;br /&gt;
&lt;br /&gt;
==Caveats and limitations==&lt;br /&gt;
* Linked areas must have corresponding floor or ceiling heights. It&#039;s not possible to look and move into an area with different Z coordinates.&lt;br /&gt;
* It is possible to make &amp;quot;impossible&amp;quot; structures, both with plane and line portals, but note that Eternity will attempt to render any scene relative to viewer&#039;s coordinates when looking at the portal, including any unrelated sectors placed at the same XY coordinates as the &amp;quot;virtual&amp;quot; tunnel. This undesired effect can be reduced by setting up the layout of the map properly.&lt;br /&gt;
* An &amp;quot;infinite&amp;quot; tunnel can be created, but it must consist of at least three sector groups in a cycle, as well as avoiding any visibility glitches mentioned in the previous point.&lt;br /&gt;
The following four points are valid because linked portals as a reliable feature are not fully implemented, but have been made available to the user, or for experimentation:&lt;br /&gt;
* Currently the hitscan traversal through portals is not implemented, which means that bullet attacks will be stopped, monsters will not be able to see you etc. The monsters will be able to hear and follow you through the portal however, and projectiles will pass through.&lt;br /&gt;
* Currently, an actor standing between two layers separated by a plane portal will jump repeatedly between the two areas and have difficulty walking.&lt;br /&gt;
* Currently sprites aren&#039;t seamlessly rendered through portals, appearing cut off by the portal plane.&lt;br /&gt;
* Currently, moving through portals can result in objects getting stuck, telefragged etc. Previously it was a hazard to the player too, as anything could telefrag, but it has been changed to be less hazardous.&lt;br /&gt;
Regardless, it is still possible to make convincing levels with linked portals even at their current state, as long as you make sure that major combat scenes will not take place between portals. Flying monsters can still follow the player through portals, so they have an advantage.&lt;br /&gt;
&lt;br /&gt;
==Tutorial==&lt;br /&gt;
Refer to Zarkyb&#039;s [[linked portals tutorial]] for more examples on usage.&lt;br /&gt;
&lt;br /&gt;
==Examples==&lt;br /&gt;
[https://s3-eu-west-1.amazonaws.com/eternity/linked_port.wad demo file] - a demonstration of both plane and wall portals.&lt;br /&gt;
Played on &#039;&#039;&#039;Doom2, Map01&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Things to note:&lt;br /&gt;
&lt;br /&gt;
* In compatibility menu the option &#039;&#039;&#039;actors have infinite height&#039;&#039;&#039; needs to be set to &#039;&#039;&#039;false&#039;&#039;&#039; in order for any actor to fall through a portal.&lt;br /&gt;
* The &amp;quot;upper part&amp;quot; is textured differently from the lower part. While in game observe when textures change and where exactly the clipping occurs.&lt;br /&gt;
* When viewing automap notice how position is updated. Player doesn&#039;t seem to &amp;quot;teleport&amp;quot; from one place of the map to another, yet his X/Y coordinates change when passing a portal boundary.&lt;br /&gt;
* Use console commands like &#039;&#039;&#039;spawn doomimp&#039;&#039;&#039; to test how monsters see, hear and aim through portals.&lt;br /&gt;
&lt;br /&gt;
[[File:Linked_portals.png]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Editing]]&lt;br /&gt;
[[Category:Editing reference]]&lt;/div&gt;</summary>
		<author><name>Ellmo</name></author>
	</entry>
	<entry>
		<id>https://eternity.youfailit.net/index.php?title=Linked_portal&amp;diff=3383</id>
		<title>Linked portal</title>
		<link rel="alternate" type="text/html" href="https://eternity.youfailit.net/index.php?title=Linked_portal&amp;diff=3383"/>
		<updated>2013-02-08T21:54:35Z</updated>

		<summary type="html">&lt;p&gt;Ellmo: Added a wad example with a map editor screenshot and short description.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Linked portals&#039;&#039;&#039; are a powerful feature which make it possible to connect two separate areas of a map via the floor/ceiling or one-sided linedefs, allowing the player to see, shoot, and even move seamlessly from one area into another. They are used similarly to two-way portals, apart from the fact that you can pass through them. They can be used to create 3D architecture and room-over-room effects, with very few limitations.&lt;br /&gt;
{{backto|Portal linedef types}}&lt;br /&gt;
&lt;br /&gt;
==Line triggers==&lt;br /&gt;
 #     Class  Trig Description&lt;br /&gt;
 &lt;br /&gt;
 358   Ext    --   Apply linked portal to like-tagged ceilings&lt;br /&gt;
 &lt;br /&gt;
 359   Ext    --   Apply linked portal to like-tagged floors&lt;br /&gt;
 &lt;br /&gt;
 360   Ext    --   Linked portal anchor line for special 358&lt;br /&gt;
 &lt;br /&gt;
 361   Ext    --   Linked portal anchor line for special 359&lt;br /&gt;
 &lt;br /&gt;
 376   Ext    --   Apply linked portals to like-tagged lines&lt;br /&gt;
 &lt;br /&gt;
 377   Ext    --   Anchor line for special 376&lt;br /&gt;
 &lt;br /&gt;
 385   Ext    --   Apply portal to front sector&lt;br /&gt;
&lt;br /&gt;
==Terminology==&lt;br /&gt;
Linked portals have their own specific sub-set of terminology used to describe certain aspects and behaviors.&lt;br /&gt;
&lt;br /&gt;
===Portal Plane===&lt;br /&gt;
Unlike the basic portal types, which were rendered and could cover height variances (much like the doom sky), linked portals form an actual map structure. The &#039;&#039;&#039;Portal Plane&#039;&#039;&#039; refers to an X/Y plane that bisects the sector(s) that contain the portal. The z-position of the portal is fixed, and should be the same height on both sides of the linked portal.&lt;br /&gt;
&lt;br /&gt;
===Beyond the Plane===&lt;br /&gt;
Map architecture is said to be beyond the portal plane when its vertical height is equal to or beyond the portal height--that is, at or above a ceiling portal plane or at or below a floor portal plane. When map architecture is beyond a portal plane, the portal will display at the height of the plane.&lt;br /&gt;
&lt;br /&gt;
===Inside the plane===&lt;br /&gt;
Map architecture is said to be inside the portal plane when its vertical height is not beyond the portal plane--that is, below a ceiling portal or above a floor portal. Any architecture that is inside the portal plane will render normally and will obscure rendering of the portal.&lt;br /&gt;
&lt;br /&gt;
==Usage==&lt;br /&gt;
Linked portals use trigger and anchor lines (much like anchored portals) to determine an X and Y offset from one part of the map to another, but there are specific requirements unique to linked portals:&lt;br /&gt;
&lt;br /&gt;
*Linked portals must be two-way, meaning the upper area must reference the lower area and vice versa.&lt;br /&gt;
*Linked portals have specific behavior relating to z-coordinates of the portal plane.&lt;br /&gt;
&lt;br /&gt;
==Setup==&lt;br /&gt;
&lt;br /&gt;
There are two kinds of linked portals: plane portals and line portals. Plane portals are sector floor or ceiling surfaces that vertically connect different sector groups (layers) of the map. Line portals are linedefs that connect areas horizontally.&lt;br /&gt;
&lt;br /&gt;
===Setting up plane portals===&lt;br /&gt;
There must be (at least) two sectors in the map, not linked together by any path (similar to how disjoint areas exist in classic Doom maps and are gameplay-connected only by teleporters).&lt;br /&gt;
&lt;br /&gt;
The ceiling height of one of them must match the floor height of the other. Let&#039;s call the bottom sector A and the top sector B.&lt;br /&gt;
&lt;br /&gt;
Even though the sectors need to have the same outline, they can have different detail inner sectors in them. For example, sector A can have several crate sectors whose outlines don&#039;t need to be copied into upper sector B, which has much less detail. Note that one-sided linedef walls inside sectors (e.g. columns) must have their outlines copied.&lt;br /&gt;
&lt;br /&gt;
Reserve two linedefs for each sector. Make sure the two linedefs selected for sector A will have the same relative coordinates and sizes as the two corresponding linedefs from B.&lt;br /&gt;
&lt;br /&gt;
Tag sector A and its inner details with a number. Tag B and its details with another number.&lt;br /&gt;
&lt;br /&gt;
Give the reserved linedefs from A special 359, tag of B and special 360, tag of A respectively. Give the reserved linedefs from B special 358, tag of A and special 361, tag of B respectively. Here is how they should correspond:&lt;br /&gt;
&lt;br /&gt;
* Reserved linedef 1 of sector A: special 359, tag B (Apply linked portal to floor of B)&lt;br /&gt;
* Reserved linedef 1 of sector B: special 361, tag B (Linked portal anchor line for special 359)&lt;br /&gt;
* Reserved linedef 2 of sector A: special 360, tag A (Linked portal anchor line for special 358)&lt;br /&gt;
* Reserved linedef 2 of sector B: special 358, tag A (Apply linked portal to ceiling of A)&lt;br /&gt;
&lt;br /&gt;
Note that with this implementation, you&#039;ll have to give a tag to every sector which needs a portal. Sometimes this is not practical, because you may want to make various sectors with special effects within A or B. To bypass this problem, you can tag the special sector differently, but one of the linedefs facing it must have special 385 (Apply portal to front sector) and have the tag of the non-special sectors that surround it (A or B). This will copy the portal information into the special sector.&lt;br /&gt;
&lt;br /&gt;
Here is a diagram on how to set up:&lt;br /&gt;
&lt;br /&gt;
 :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::&lt;br /&gt;
 -----------------x---------------------x:::::::::::::      ~-------------------x---------------------x:::::::::::::::::::&lt;br /&gt;
                 /                       \::::::::::::      ~ Neighbour        /                       \::::::::::::::::::&lt;br /&gt;
  Neighbour     /         SECTOR A        \::::::::::       ~ sector of       /         SECTOR B        \:::::::::::::::::&lt;br /&gt;
  sector of    /  x----x             floor \:::::::::       ~ B              /  x----x                   \::::::::::::::::&lt;br /&gt;
  A           /   |::::|             detail \::::::::       ~ (not tagged)  /   |    |                    \:::::::::::::::&lt;br /&gt;
  (untagged) /    |::::|wall         x---x   \:::::::       ~              /    |    |top of wall from A   \::::::::::::::&lt;br /&gt;
 -----------x     x----x             |   |    x:::::::::    ~-------------x     x----x &amp;lt;NOT tagged          x:::::::::::::&lt;br /&gt;
 ::::::::::::\                       x---x   /:::::::::::::::::::::::::::::\                               /::::::::::::::&lt;br /&gt;
 :::::::::::::\    x---x-----x same tag as^ /:::::::::::::::::::::::::::::::\     x-------------x         /:::::::::::::::&lt;br /&gt;
 ::::::::::::::\    \   \    | &amp;lt;  A        x:::::::::::::::::::::::::::::::::\    x-------------x        x::::::::::::::::&lt;br /&gt;
 :::::::::::::::\    x---x---x            /360,A::::::::::::::::::::::::::::::\ ceil. detail            /358,A::::::::::::&lt;br /&gt;
 ::::::::::::::::\ flr.detail    359,B   /:::::::::::::::::::::::::::::::::::::\ tag of B      361,B   /::::::::::::::::::&lt;br /&gt;
 :::::::::::::::::x-------------x-------x:::::::::::::::::::::::::::::::::::::::x-------------x-------x:::::::::::::::::::&lt;br /&gt;
 :::::::::::::::::::::::::::::::::THE PORTAL LINEDEFS:::::::::::::::::::::::::::::::::::::::::THE PORTAL LINEDEFS:::::::::&lt;br /&gt;
&lt;br /&gt;
===Setting up wall portals===&lt;br /&gt;
Wall portals are slightly simpler to implement. The two separate sectors must have the same floor and ceiling heights and the portal linedefs need to be of the same length and angle. They must also be two-sided, passable and have a buffer sector behind them, with enough depth so the portal is walkable by the intended actors (so they don&#039;t bump into the back wall of the buffer sector).&lt;br /&gt;
&lt;br /&gt;
The two linedefs will have the 376 and 377 specials (respectively, order not being important) and a common tag (which doesn&#039;t have to belong to any sector).&lt;br /&gt;
&lt;br /&gt;
Note that to render correctly, the buffer sectors behind them will need to have different light levels from the one in front of them. If the portal works correctly, they will never be visible during the game, and won&#039;t be accessible unless the user activates no-clipping mode.&lt;br /&gt;
&lt;br /&gt;
Here is a diagram on how to set up:&lt;br /&gt;
&lt;br /&gt;
 ----------x &amp;lt;----main area sectors---------&amp;gt;    x---------&lt;br /&gt;
           |        Visible            x---------x&lt;br /&gt;
           |                           |         |&lt;br /&gt;
           |                           |         |&amp;lt;linedef B&lt;br /&gt;
           x-------x                   |         | type 377&lt;br /&gt;
 linedef A&amp;gt;|       |&amp;lt;-buffer sectors-&amp;gt; |         | tag n&lt;br /&gt;
 type 376  |       |                   x---------x&lt;br /&gt;
 tag n     |       |  Never visible in-game      |&lt;br /&gt;
           |       |  but wide enough to fit     |&lt;br /&gt;
 ----------x-------x  walking objects            x---------&lt;br /&gt;
                      Set their light levels to different values from neighbouring main area sectors&lt;br /&gt;
&lt;br /&gt;
===Lifts between plane portals===&lt;br /&gt;
&lt;br /&gt;
You can make the floor or ceiling of a sector move from a sector group (layer) to another by using the [[Attached surface linedef types]].&lt;br /&gt;
&lt;br /&gt;
==Caveats and limitations==&lt;br /&gt;
* Linked areas must have corresponding floor or ceiling heights. It&#039;s not possible to look and move into an area with different Z coordinates.&lt;br /&gt;
* It is possible to make &amp;quot;impossible&amp;quot; structures, both with plane and line portals, but note that Eternity will attempt to render any scene relative to viewer&#039;s coordinates when looking at the portal, including any unrelated sectors placed at the same XY coordinates as the &amp;quot;virtual&amp;quot; tunnel. This undesired effect can be reduced by setting up the layout of the map properly.&lt;br /&gt;
* An &amp;quot;infinite&amp;quot; tunnel can be created, but it must consist of at least three sector groups in a cycle, as well as avoiding any visibility glitches mentioned in the previous point.&lt;br /&gt;
The following four points are valid because linked portals as a reliable feature are not fully implemented, but have been made available to the user, or for experimentation:&lt;br /&gt;
* Currently the hitscan traversal through portals is not implemented, which means that bullet attacks will be stopped, monsters will not be able to see you etc. The monsters will be able to hear and follow you through the portal however, and projectiles will pass through.&lt;br /&gt;
* Currently, an actor standing between two layers separated by a plane portal will jump repeatedly between the two areas and have difficulty walking.&lt;br /&gt;
* Currently sprites aren&#039;t seamlessly rendered through portals, appearing cut off by the portal plane.&lt;br /&gt;
* Currently, moving through portals can result in objects getting stuck, telefragged etc. Previously it was a hazard to the player too, as anything could telefrag, but it has been changed to be less hazardous.&lt;br /&gt;
Regardless, it is still possible to make convincing levels with linked portals even at their current state, as long as you make sure that major combat scenes will not take place between portals. Flying monsters can still follow the player through portals, so they have an advantage.&lt;br /&gt;
&lt;br /&gt;
==Tutorial==&lt;br /&gt;
Refer to Zarkyb&#039;s [[linked portals tutorial]] for more examples on usage.&lt;br /&gt;
&lt;br /&gt;
==Examples==&lt;br /&gt;
[https://s3-eu-west-1.amazonaws.com/eternity/linked_port.wad demo file] - a demonstration of both plane and wall portals.&lt;br /&gt;
Played on &#039;&#039;&#039;Doom2, Map01&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Please note the &amp;quot;upper part&amp;quot; is textured differently from the lower part. While in game observe when textures change and where exactly the clipping occurs.&lt;br /&gt;
&lt;br /&gt;
Also note how your position is updated when viewing automap. Player doesn&#039;t seem to &amp;quot;teleport&amp;quot; from one place of the map to another, yet his X/Y coordinates change when passing a portal boundary.&lt;br /&gt;
&lt;br /&gt;
[[File:Linked_portals.png]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Editing]]&lt;br /&gt;
[[Category:Editing reference]]&lt;/div&gt;</summary>
		<author><name>Ellmo</name></author>
	</entry>
	<entry>
		<id>https://eternity.youfailit.net/index.php?title=File:Linked_portals.png&amp;diff=3382</id>
		<title>File:Linked portals.png</title>
		<link rel="alternate" type="text/html" href="https://eternity.youfailit.net/index.php?title=File:Linked_portals.png&amp;diff=3382"/>
		<updated>2013-02-08T21:49:30Z</updated>

		<summary type="html">&lt;p&gt;Ellmo: Linked portals schema.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Linked portals schema.&lt;/div&gt;</summary>
		<author><name>Ellmo</name></author>
	</entry>
	<entry>
		<id>https://eternity.youfailit.net/index.php?title=File:Linked_portals_2.png&amp;diff=3381</id>
		<title>File:Linked portals 2.png</title>
		<link rel="alternate" type="text/html" href="https://eternity.youfailit.net/index.php?title=File:Linked_portals_2.png&amp;diff=3381"/>
		<updated>2013-02-08T21:47:52Z</updated>

		<summary type="html">&lt;p&gt;Ellmo: Linked portals schema.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Linked portals schema.&lt;/div&gt;</summary>
		<author><name>Ellmo</name></author>
	</entry>
</feed>