Linedef type

Linedefs may be assigned types in order to perform special effects. Doom includes a wide selection of linedef types used in its levels, which may also be reused by level authors. Hexen also includes some extra linedef types. Some source ports also add their own linedef types.

Python code to generate and decode linedef type numbers is available.

The Unofficial Doom Specs document has additional information about linedef types.

This article is based on the file boomref.txt from the Boom source code distribution. The Boom linedef types incorporate all the Doom linedef types, and many modern source ports support Boom linedef types.

Terminology
In BOOM (like Doom), actions are caused to happen thru linedef types. BOOM has three kinds of linedef types:


 * Regular - the linedef types that were already in DOOM II v1.9


 * Extended - linedef types not in DOOM II v1.9 but less than 8192 in value


 * Generalized - linedef types over 8192 in value that contain bit fields that independently control the actions of the sector affected.

A linedef with non-zero linedef type is called a linedef trigger. A linedef trigger is always activated in one of three ways - pushing on the first sidedef of the linedef, walking over the linedef, or shooting the linedef with an impact weapon (fists, chainsaw, pistol, shotgun, super shotgun, or chaingun).

Linedefs activated by pushing on them come in two varieties. A manual linedef affects the sector on the second sidedef of the line pushed. A switched linedef affects all sectors that have the same tag field as the linedef that was pushed.

Nearly all switched, walkover, and gun linedefs operate on the sectors with the same tag as that in the tag field of the linedef.

Some linedefs are never activated per se, but simply create or control an effect thru their existence and properties, usually affecting the sectors sharing the linedef's tags. There are also a few special case like line-line teleporters and exit linedefs that do not affect sectors.

Some linedefs are only triggerable once, others are triggerable as many times as you like.

Triggering types are denoted by the letters P, S, W, and G for manual(push), switched, walkover, and gun. Their retriggerability is denoted by a 1 or R following the letter. So the triggering types for linedefs are:

P1 PR S1 SR W1 WR G1 GR

Often linedef actions depend on values in neighboring sectors. A neighboring sector is one that shares a linedef in common, just sharing a vertex is not sufficient.

In DOOM only one action on a sector could occur at a time. BOOM supports one floor action, one ceiling action, and one lighting action simultaneously.

Doors
A door is a sector, usually placed between two rooms, whose ceiling raises to open, and lowers to close.

A door is fully closed when its ceiling height is equal to its floor height.

A door is fully open when its ceiling height is 4 less than the lowest neighbor ceiling adjacent to it.

A door may be set to an intermediate state initially, or thru the action of a linedef trigger that affects ceilings or floors. The door is passable to a player when its ceiling is at least 56 units higher than its floor. In general the door is passable to a monster or a thing when its ceiling is at least the monster or thing's height above the floor.

If a door has a ceiling height ABOVE the fully open height, then an open door action moves the ceiling to the fully open height instantly.

If a door has a ceiling height BELOW the fully closed height (that is the ceiling of the door sector is lower than the floor of the door sector) a close door action moves the ceiling to the fully closed height instantly.

Door functions

 * Open, Wait, Then Close - On activation, door opens fully, waits a specified period, then closes fully.


 * Open and Stay Open - On activation, door opens fully and remains there.


 * Close and Stay Closed - On activation, door closes fully, and remains there.


 * Close, Wait, Then Open - On activation, door closes fully, waits a specified period, then opens fully.

Varieties of doors
A door can be triggered by pushing on it, walking over or pressing a linedef trigger tagged to it, or shooting a linedef tagged to it. These are called manual, walkover, switched, or gun doors resp.

Since a push door (P1/PR) has no use for its tag, BOOM has extended the functionality to include changing any tagged sectors to maximum neighbor lighting on fully opening, then to minimum neighbor lighting on fully closing. This is true for regular, extended, and generalized doors with push triggers.

A door trigger can be locked. This means that the door function will only operate if the player is in possession of the right key(s). Regular and extended door triggers only care if the player has a key of the right color, they do not care which. Generalized door triggers can distinguish between skull and card keys, and can also require any key, or all keys in order to activate.

A door can have different speeds, slow, normal, fast or turbo.

A door can wait for different amounts of time.

A door may or may not be activatable by monsters.

Any door function except Close and Stay Closed, when closing and encountering a monster or player's head will bounce harmlessly off that head and return to fully open. A Close and Stay Closed will rest on the head until it leaves the door sector.

Door linedef types
There are two generalized door linedef types, Generalized Door, and Generalized Locked Door. The following tables show the possibilities for each parameter, any combination of parameters is allowed:
 * Regular and Extended Door Types
 * Regular and Extended Locked Door Types

Slow and Fast represent the same speeds as slow and fast regular doors. Normal is twice as fast as slow, Fast is twice normal, Turbo is twice Fast.


 * Generalized Door Types


 * Generalized Locked Door Types

Floor targets

 * Lowest Neighbor Floor (LnF)


 * This means that the floor moves to the height of the lowest neighboring floor including the floor itself. If the floor direction is up (only possible with generalized floors) motion is instant, else at the floor's speed.


 * Next Neighbor Floor (NnF)


 * This means that the floor moves up to the height of the lowest adjacent floor greater in height than the current, or down to the height of the highest adjacent floor less in height than the current, as determined by the floor's direction. Instant motion is not possible in this case. If no such floor exists, the floor does not move.


 * Lowest Neighbor Ceiling (LnC)
 * This means that the floor height changes to the height of the lowest ceiling possessed by any neighboring sector, including that floor's ceiling. If the target height is in the opposite direction to floor motion, motion is instant, otherwise at the floor action's speed.


 * 8 Under Lowest Neighbor Ceiling (8uLnC)
 * This means that the floor height changes to 8 less than the height of the lowest ceiling possessed by any neighboring sector, including that floor's ceiling. If the target height is in the opposite direction to floor motion, motion is instant, otherwise at the floor action's speed.


 * Highest Neighbor Floor (HnF)
 * This means that the floor height changes to the height of the highest neighboring floor, excluding the floor itself. If no neighbor floor exists, the floor moves down to -32000. If the target height is in the opposite direction to floor motion, the motion is instant, otherwise it occurs at the floor action's speed.


 * 8 Above Highest Neighbor Floor (8aHnF)
 * This means that the floor height changes to 8 above the height of the highest neighboring floor, excluding the floor itself. If no neighbor floor exists, the floor moves down to -31992. If the target height is in the opposite direction to floor motion, the motion is instant, otherwise it occurs at the floor action's speed.


 * Ceiling
 * The floor moves up until it's at ceiling height, instantly if floor direction is down (only available with generalized types), at the floor speed if the direction is up.


 * 24 Units (24)
 * The floor moves 24 units in the floor action's direction. Instant motion is not possible with this linedef type.


 * 32 Units (32)
 * The floor moves 32 units in the floor action's direction. Instant motion is not possible with this linedef type.


 * 512 Units (512)
 * The floor moves 512 units in the floor action's direction. Instant motion is not possible with this linedef type.


 * Shortest Lower Texture (SLT)
 * The floor moves to the height of the shortest lower texture on the boundary of the sector, in the floor direction. Instant motion is not possible with this type. In the case that there is no surrounding texture the motion is to -32000 or +32000 depending on direction.


 * None
 * Some pure texture type changes are provided for changing the floor texture and/or sector type without moving the floor.

Varieties of floors
A floor can be activated by pushing on a linedef bounding it (generalized types only), or by pushing on a switch with the same tag as the floor sector, or by walking over a linedef with the same tag as the floor, or by shooting a linedef with the same tag as the floor with an impact weapon.

A floor can move either Up or Down.

A floor can move with speeds of Slow, Normal, Fast, or Turbo. If the target height specified by the floor function (see Floor Targets above) is in the opposite direction to the floor's motion, then travel is instantaneous, otherwise its at the speed specified.

A floor action can be a texture change type, in which case after the action the floor texture of the affected floor, and possibly the sector type of the affected floor are changed to those of a model sector. The sector type may be zeroed instead of copied from the model, or not changed at all. These change types are referred to below as Tx (texture only), Tx0 (type zeroed), and TxTy (texture and type changed). The model sector for the change may be the sector on the first sidedef of the trigger (trigger model) or the sector with floor at destination height across the lowest numbered two-sided linedef surrounding the affected sector (numeric model). If no model sector exists, no change occurs. If a change occurs, floor texture is always affected, lighting is never affected, even that corresponding to the sector's type, nor is any other sector property other than the sector's type.

Numeric model algorithm:


 * 1) Find all floors adjacent to the tagged floor at destination height
 * 2) Find the lowest numbered linedef separating those floors from that tagged
 * 3) The sector on the other side of that linedef is the model

A floor action can have the crush property, in which case players and monsters are crushed when the floor tries to move above the point where they fit exactly underneath the ceiling. This means they take damage until they die, leave the sector, or the floor action is stopped.

A floor action never reverses on encountering an obstacle, even if the crush property is not true, the floor merely remains in the same position until the obstacle is removed or dies, then continues.

Floor linedef types
The following tables show the possibilities for generalized floor linedef type parameters. Any combination of parameters is allowed:
 * Regular and Extended Floor Types

Slow and Fast represent the same speeds as slow and fast regular floors. Normal is twice as fast as slow, Fast is twice normal, Turbo is twice Fast.


 * Generalized Floor Types


 * 1) Chg - Mon(ster) enabled must be No if Chg field is not None
 * 2) *Tx = Texture copied only
 * 3) *Tx0 = Texture copied and Type->0
 * 4) *TxTy = Texture and Type copied
 * 5) Mdl
 * 6) *Trg = Trigger Model
 * 7) *Num = Numeric Model

Ceiling Targets

 * Highest Neighbor Ceiling (HnC)
 * This means that the ceiling moves to the height of the highest neighboring ceiling NOT including the ceiling itself. If the ceiling direction is down (only possible with generalized ceilings) motion is instant, else at the ceiling's speed. If no adjacent ceiling exists the ceiling moves to -32000 units.


 * Next Neighbor Ceiling (NnC)
 * This means that the ceiling moves up to the height of the lowest adjacent ceiling greater in height than the current, or to the height of the highest adjacent ceiling less in height than the current, as determined by the ceiling's direction. Instant motion is not possible in this case. If no such ceiling exists, the ceiling does not move.


 * Lowest Neighbor Ceiling (LnC)
 * This means that the ceiling height changes to the height of the lowest ceiling possessed by any neighboring sector, NOT including itself. If the target height is in the opposite direction to ceiling motion, motion is instant, otherwise at the ceiling action's speed. If no adjacent ceiling exists the ceiling moves to 32000 units.


 * Highest Neighbor Floor (HnF)
 * This means that the ceiling height changes to the height of the highest neighboring floor, excluding the ceiling's floor itself. If no neighbor floor exists, the ceiling moves down to -32000 or the ceiling's floor, whichever is higher. If the target height is in the opposite direction to ceiling motion, the motion is instant, otherwise it occurs at the ceiling action's speed.


 * Floor
 * The ceiling moves down until its at floor height, instantly if ceiling direction is up (only available with generalized types), at the ceiling speed if the direction is down.


 * 8 Above Floor (8aF)
 * This means that the ceiling height changes to 8 above the height of the ceiling's floor. If the target height is in the opposite direction to ceiling motion, the motion is instant, otherwise it occurs at the ceiling action's speed.


 * 24 Units (24)
 * The ceiling moves 24 units in the ceiling action's direction. Instant motion is not possible with this linedef type.


 * 32 Units (32)
 * The ceiling moves 32 units in the ceiling action's direction. Instant motion is not possible with this linedef type.


 * Shortest Upper Texture (SUT)
 * The ceiling moves the height of the shortest upper texture on the boundary of the sector, in the ceiling direction. Instant motion is not possible with this type. In the case that there is no surrounding texture the motion is to -32000 or +32000 depending on direction.

Varieties of ceilings
A ceiling can be activated by pushing on a linedef bounding it (generalized types only), or by pushing on a switch with the same tag as the ceiling sector, or by walking over a linedef with the same tag as the ceiling, or by shooting a linedef with the same tag as the ceiling with an impact weapon (generalized types only).

A ceiling can move either Up or Down.

A ceiling can move with speeds of Slow, Normal, Fast, or Turbo. If the target height specified by the ceiling function (see Ceiling Targets above) is in the opposite direction to the ceiling's motion, then travel is instantaneous, otherwise its at the speed specified.

A ceiling action can be a texture change type, in which case after the action the ceiling texture of the affected ceiling, and possibly the sector type of the affected ceiling are changed to those of a model sector. The sector type may be zeroed instead of copied from the model, or not changed at all. These change types are referred to below as Tx (texture only), Tx0 (type set to 0), and TxTy (texture and type copied from model). The model sector for the change may be the sector on the first sidedef of the trigger (trigger model) or the sector with ceiling at destination height across the lowest numbered two-sided linedef surrounding the affected sector (numeric model). If no model sector exists, no change occurs. If a change occurs, ceiling texture is always affected, lighting is never affected, even that corresponding to the sector's type, nor is any other sector property other than the sector's type.

Numeric model algorithm:


 * 1) Find all ceilings adjacent to the tagged ceiling at destination height
 * 2) Find the lowest numbered linedef separating those ceilings from that tagged
 * 3) The sector on the other side of that linedef is the model

A ceiling action can have the crush property (generalized types only), in which case players and monsters are crushed when the ceiling tries to move below the point where they fit exactly underneath the ceiling. This means they take damage until they die, leave the sector, or the ceiling action is stopped. A ceiling action never reverses on encountering an obstacle, even if the crush property is not true, the ceiling merely remains in the same position until the obstacle is removed or dies, then continues.

Ceiling linedef types

 * Regular and Extended Ceiling Types
 * Generalized Ceiling Types


 * 1) Chg - Mon(ster) enabled must be No if Chg field is not None
 * 2) * Tx = Texture copied only
 * 3) * Tx0 = Texture copied and Type->0
 * 4) * TxTy = Texture and Type copied
 * 5) Mdl
 * 6) * Trg = Trigger Model
 * 7) * Num = Numeric Model

Platforms (Lifts)
A platform is basically a floor action involving two heights. The simple raise platform actions, for example, differ from the corresponding floor actions in that if they encounter an obstacle, they reverse direction and return to their former height.

The most often used kind of platform is a lift which travels from its current height to the target height, then waits a specified time and returns to it former height.

Platform Targets

 * Lowest Neighbor Floor
 * This means that the platforms "low" height is the height of the lowest surrounding floor, including the platform itself. The "high" height is the original height of the floor.


 * Next Lowest Neighbor Floor
 * This means that the platforms "low" height is the height of the highest surrounding floor lower than the floor itself. If no lower floor exists, no motion occurs as the "low" and "high" heights are then both equal to the floors current height.


 * Lowest Neighbor Ceiling
 * This means that the platforms "low" height is the height of the lowest surrounding ceiling unless this is higher than the floor itself. If no adjacent ceiling exists, or is higher than the floor no motion occurs as the "low" and "high" heights are then both equal to the floors current height.


 * Lowest and Highest Floor
 * This target sets the "low" height to the lowest neighboring floor, including the floor itself, and the "high" height to the highest neighboring floor, including the floor itself. When this target is used the floor moves perpetually between the two heights. Once triggered this type of linedef runs permanently, even if the motion is temporarily suspended with a Stop type. No other floor action can be commanded on the sector after this type is begun.


 * Ceiling
 * This target sets the "high" height to the ceiling of the sector and the "low" height to the floor height of the sector and is only used in the instant toggle type that switches the floor between the ceiling and its original height on each activation. This is also the ONLY instant platform type.


 * Raise Next Floor
 * This means that the "high" height is the lowest surrounding floor higher than the platform. If no higher adjacent floor exists no motion will occur.


 * Raise 24 Units
 * The "low" height is the original floor height, the "high" height is 24 more.


 * Raise 32 Units
 * The "low" height is the original floor height, the "high" height is 32 more.

Varieties of Platforms
A platform can be activated by pushing on a linedef bounding it (generalized types only), or by pushing on a switch with the same tag as the platform sector, or by walking over a linedef with the same tag as the platform, or by shooting a linedef with the same tag as the platform with an impact weapon.

A platform can move with speeds of Slow, Normal, Fast, or Turbo. Only the instant toggle platform moves instantly, all others move at the platform's speed.

A platform can have a delay, in between when it reaches "high" height and returns to "low" height, or at both ends of the motion in the case of perpetual lifts.

A platform action can be a texture change type, in which case after the action the floor texture of the affected floor, and possibly the sector type of the affected floor are changed to those of a model sector. The sector type may be zeroed instead of copied from the model, or not changed at all. These change types are referred to below as Tx (texture only), Tx0 (type zeroed), and TxTy (texture and type changed). The model sector for the change is always the sector on the first sidedef of the trigger (trigger model). If a change occurs, floor texture is always affected, lighting is never affected, even that corresponding to the sector's type, nor is any other sector property other than the sector's type.

Platform Linedef types

 * Regular and Extended Platform Types
 * Generalized Lift Types

Crusher Ceilings
A crusher ceiling is a linedef type that causes the ceiling to cycle between its starting height and 8 above the floor, damaging monsters and players that happen to be in between. Barrels explode when crushed.

Once a crusher ceiling is started it remains running for the remainder of the level even if temporarily suspended with a stop type. No other ceiling action can be used in that sector thereafter.

Varieties of Crushers
A crusher can be activated by pushing on a linedef bounding it (generalized types only), or by pushing on a switch with the same tag as the crusher sector, or by walking over a linedef with the same tag as the crusher, or by shooting a linedef with the same tag as the crusher with an impact weapon (generalized types only).

A crusher has a speed: slow, normal, fast, or turbo. The slower the speed, the more damage the crusher does when crushing, simply thru being applied longer. When a slow or normal crusher is moving down and encounters something to crush, it slows down even more, by a factor of 8. This persists until it reaches bottom of stroke and starts up again. Fast and turbo crushers do not slow down.

A crusher can be silent. The regular silent crusher makes platform stop and start noises at top and bottom of stroke. The generalized silent crusher is completely quiet.

A crusher linedef is provided to stop a crusher in its current position. Care should be used that this doesn't lock the player out of an area of the level if the crusher is too low to pass. A crusher can be restarted, but not changed, with any crusher linedef.

Crusher Linedef Types

 * Regular and Extended Crusher Types
 * Generalized Crusher Types

Stair Builders
A stair builder is a linedef type that sets a sequence of sectors defined by a complex rule to an ascending or descending sequence of heights.

The rule for stair building is as follows:


 * 1) The first step to rise or fall is the tagged sector. It rises or falls by the stair stepsize, at the stair speed, in the stair direction.
 * 2) To find the next step (sector) affected examine each two-sided linedef with first sidedef facing into the previous step in numerical order. For each such linedef if the sector on the other side is already active, or has already risen from this stair, the linedef is skipped. If textures are not ignored then any linedef with a different floor texture on its second side is also skipped. The next step to rise is the sector on the other side of the first linedef not skipped. If none exists, stair building ceases. The next step moves to the height of the previous step plus or minus the stepsize depending on the direction the stairs build, up or down.  If the motion is in the same direction as the stairs build, it occurs at stair build speed, otherwise it is instant.
 * 3) Repeat step 2 until stair building ceases.

Varieties of Stair Builders
A stair can be activated by pushing on a linedef bounding it (generalized types only), or by pushing on a switch with the same tag as the stair sector, or by walking over a linedef with the same tag as the stair, or by shooting a linedef with the same tag as the stair with an impact weapon (generalized types only).

Only extended and generalized stair types are retriggerable. The extended retriggerable stairs are mostly useless, though triggering a stair with stepsize 8 twice might be used. The generalized retriggerable stairs alternate building up and down on each activation which is much more useful.

A stair can build up or down (generalized types only).

A stair can have a step size of 4, 8, 16, or 24. Only generalized types support stepsize of 4 or 24.

A stair can have build speeds of slow, normal, fast or turbo. Only generalized types support speeds of normal or turbo.

A stair can stop on encountering a different texture or ignore (generalized types only) different textures and continue.

Only the regular build fast, stepsize 16 stair has the property that monsters and players can be crushed by the motion, all others do not crush.

Regular and Extended Stair Builder Types

 * Regular and Extended Stairs Types
 * Generalized Stairs Types

Elevators
An elevator is a linedef type that moves both floor and ceiling together. All elevator linedefs are extended, there are no regular or generalized elevator types. Instant elevator motion is not possible, and monsters cannot activate elevators. All elevator triggers are either switched or walkover.

Elevator Targets

 * Next Highest Floor
 * The elevator floor moves to the lowest adjacent floor higher than the elevator's floor, the ceiling staying the same height above the floor. If there is no higher floor the elevator doesn't move.


 * Next Lowest Floor
 * The elevator floor moves to the highest adjacent floor lower than the current floor, the ceiling staying the same height above the floor. If there is no lower floor the elevator doesn't move.


 * Current Floor
 * The elevator floor moves to the height of the floor on the first sidedef of the triggering line, the ceiling remaining the same height above the elevator floor.

Elevator Linedef Types

 * Extended Elevator types

Lighting
The lighting linedef types change the lighting in the tagged sector. All are regular or extended types, there are no generalized lighting types. All are switched or walkovers.

Lighting Targets

 * Lights to Minimum Neighbor
 * Each tagged sector is set to the minimum light level found in any adjacent sector. The tagged sectors are changed in numerical order, and this may influence the result.


 * Lights to Maximum Neighbor
 * Each tagged sector is set to the maximum light level found in any adjacent sector. The tagged sectors are changed in numerical order, and this may influence the result.


 * Blinking
 * Each tagged sector begins blinking between two light levels. The brighter level is the light level in the tagged sector. The darker level is the minimum neighbor light level, or 0 if all neighbor sectors have lighting greater than or equal to the sector's at the time of activation. The blinking is non-synchronous, beginning 1-9 gametics after activation, with a dark period of 1 sec (35 gametics) and a bright period of 1/7 sec (5 gametics).


 * 35 Units
 * Each tagged sector is set to a light level of 35 units.


 * 255 Units
 * Each tagged sector is set to a light level of 255 units.

Lighting Linedef Types

 * Regular and Extended Lighting types

Exits
An exit linedef type ends the current level bringing up the intermission screen with its report of kills/items/secrets or frags in the case of deathmatch. Obviously, none are retriggerable, and none require tags, since no sector is affected.

Exit Varieties
An exit can be activated by pushing on a switch with the exit type or by walking over a linedef with the exit type, or by shooting a linedef with the exit type with an impact weapon.

An exit can be normal or secret. The normal exit simply ends the level and takes you to the next level via the intermission screen. A secret exit only works in a special level depending on the IWAD being played. In DOOM the secret exits can be on E1M3, E2M5, or E3M6. In DOOM II they can be in levels 15 and 31. If a secret exit is used in any other level, it brings you back to the start of the current level. In DOOM the secret exits go from E1M3 to E1M9, E2M5 to E2M9, and E3M6 to E3M9. In DOOM II they go from 15 to 31 and from 31 to 32. In DOOM II a normal exit from 31 or 32 goes to level 16.

Exit Linedef Types

 * Regular and Extended Exit types

Teleporters
A teleporter is a linedef that when crossed or switched makes the player or monster appear elsewhere in the level. There are only regular and extended teleporters, no generalized teleporters exist (yet). Teleporters are the only direction sensitive walkover triggers in DOOM (to allow them to be exited without teleporting again). They must be crossed from the first sidedef side in order to work.

The place that the player or monster appears is set in one of two ways. The more common is by a teleport thing in the sector tagged to the teleport line. The newer completely player preserving line-line silent teleport makes the player appear relative to the exit line (identified by having the same tag as the entry line) with the same orientation, position, momentum and height that they had relative to the entry line just before teleportation. A special kind of line-line teleporter is also provided that reverses the player's orientation by 180 degrees.

In the case of several lines tagged the same as the teleport line, or several sectors tagged the same, or several teleport things in the tagged sector, in all cases the lowest numbered one is used.

In DOOM crossing a W1 teleport line in the wrong direction used it up, and it was never activatable. In BOOM this is not the case, it does not teleport but remains active until next crossed in the right direction.

If the exit of a teleporter is blocked a monster (or anything besides a player) will not teleport thru it. However if the exit of teleporter is blocked a player will, including into a down crusher, a monster, or another player. In the latter two cases the monster/player occupying the spot dies messily, and this is called a telefrag.

Teleport Varieties
A teleporter can be walkover or switched, and retriggerable or not.

A teleporter can have destination set by a teleport thing in the tagged sector, or by a line tagged the same as the teleport line. These are called thing teleporters and line teleporters resp.

A teleporter can preserve orientation or set orientation from the position, height, and angle of the teleport thing. Note a thing destination teleporter always sets position, though it may preserve orientation otherwise.

A teleporter can produce green fog and a whoosh noise, or it can be silent, in which case it does neither.

A teleporter can transport monsters only, or both players and monsters.

Teleport Linedef types

 * Regular and Extended Teleport types

Donuts
A donut is a very specialized linedef type that lowers a pillar in a surrounding pool, while raising the pool and changing its texture and type.

The tagged sector is the pillar, and its lowest numbered line must be two-sided. The sector on the other side of that is the pool. The pool must have a two-sided line whose second sidedef does not adjoin the pillar, and the sector on the second side of the lowest numbered such linedef is the model for the pool's texture change. The model sector floor also provides the destination height both for lowering the pillar and raising the pool.

No generalized donut linedefs exist, and all are switched or walkover.

Donut Linedef types
Regular and Extended Donut types

Property Transfer
These linedefs are special purpose and are used to transfer properties from the linedef itself or the sector on its first sidedef to the tagged sector(s). None are triggered, they simply exist.


 * Extended Property Transfer Linedefs


 * 213 Ext -- Set Tagged Floor Lighting to Lighting on 1st Sidedef's Sector

Used to give the floor of a sector a different light level from the remainder of the sector. For example bright lava in a dark room.


 * 261  Ext --   Set Tagged Ceiling Lighting to Lighting on 1st Sidedef's Sector

Used to give the ceiling of a sector a different light level from the remainder of the sector.


 * 260  Ext --   Make Tagged Lines (or this line if tag==0) Translucent

Used to make 2s normal textures translucent. If tag==0, then this linedef's normal texture is made translucent if it's 2s, and the default translucency map TRANMAP is used as the filter. If tag!=0, then all similarly-tagged 2s linedefs' normal textures are made translucent, and if this linedef's first sidedef contains a valid lump name for its middle texture (as opposed to a texture name), and the lump is 64K long, then that lump will be used as the translucency filter instead of the default TRANMAP, allowing different filters to be used in different parts of the same maps. If the first side's normal texture is not a valid translucency filter lump name, it must be a valid texture name, and will be displayed as such on this linedef.


 * 242  Ext --   Set Tagged Lighting, Flats Heights to 1st Sidedef's Sector, and set colormap based on sidedef textures.

This allows the tagged sector to have two levels -- an actual floor and ceiling, and another floor or ceiling where more flats are rendered. Things will stand on the actual floor or hang from the actual ceiling, while this function provides another rendered floor and ceiling at the heights of the sector on the first sidedef of the linedef. Typical use is "deep water" that can be over the player's head.

-- < real sector's ceiling height |        real ceiling             | < control sector's ceiling texture |                                 |    |                                  | < control sector's lightlevel |             A                   | |                                 | < upper texture as colormap |                                 |    |                                  | < control sector's floor texture -- < control sector's ceiling height |        fake ceiling             | < real sector's ceiling texture |                                 |    |                                  | < real sector's lightlevel |             B                   | |                                 | < normal texture as colormap |                                 |    |          fake floor              | < real sector's floor texture -- < control sector's floor height |                                 | < control sector's ceiling texture |                                 |    |                                  | < control sector's lightlevel |             C                   | |                                 | < lower texture as colormap |                                 |    |          real floor              | < control sector's floor texture -- < real sector's floor height

Boom sectors controlled by a 242 linedef are partitioned into 3 spaces. The viewer's xyz coordinates uniquely determine which space they are in.

If they are in space B (normal space), then the floor and ceiling textures and lightlevel from the real sector are used, and the colormap from the 242 linedef's first sidedef's normal texture is used (COLORMAP is used if it's invalid or missing). The floor and ceiling are rendered at the control sector's heights.

If they are in space C ("underwater"), then the floor and ceiling textures and lightlevel from the control sector are used, and the lower texture in the 242 linedef's first sidedef is used as the colormap.

If they are in space A ("head over ceiling"), then the floor and ceiling textures and lightlevel from the control sector are used, and the upper texture in the 242 linedef's first sidedef is used as the colormap.

If only two of these adjacent partitions in z-space are used, such as underwater and normal space, one has complete control over floor textures, ceiling textures, light level, and colormaps, in each of the two partitions. The control sector determines the textures and lighting in the more "unusual" case (e.g. underwater).

It's also possible for the fake floor to extend below the real floor, in which case an invisible platform / stair effect is created. In that case, the picture looks like this (barring any ceiling effects too):

-- < real sector's ceiling texture |  real ceiling = fake ceiling    | |                                 |    |                                  |    |              B                   | < real sector's lightlevel |                                 | < normal texture's colormap |                                 |    |          real floor              | -- < invisible, no texture drawn |                                 |    |                                  |    |                                  | < real sector's lightlevel |             C                   | < normal texture's colormap |                                 |    |                                  |    |          fake floor              | < real sector's floor texture -- < fake sector's floor height

In this case, since the viewer is always at or above the fake floor, no colormap/lighting/texture changes occur -- the fake floor just gets drawn at the control sector's height, but at the real sector's lighting and texture, while objects stand on the higher height of the real floor.

It's the viewer's position relative to the fake floor and/or fake ceiling, which determines whether the control sector's lighting and textures should be used, and which colormap should be used. If the viewer is always between the fake floor and fake ceiling, then no colormap, lighting, or texture changes occur, and the view just sees the real sector's textures and light level drawn at possibly different heights.

If the viewer is below the fake floor height set by the control sector, or is above the fake ceiling height set by the control sector, then the corresponding colormap is used (lower or upper texture name), and the textures and lighting are taken from the control sector rather than the real sector. They are still stacked vertically in standard order -- the control sector's ceiling is always drawn above the viewer, and the control sector's floor is always drawn below the viewer.

The kaleidescope effect only occurs when F_SKY1 is used as the control sector's floor or ceiling. If F_SKY1 is used as the control sector's ceiling texture, then under water, only the control sector's floor appears, but it "envelops" the viewer. Similarly, if F_SKY1 is used as the control sector's floor texture, then when the player's head is over a fake ceiling, the control sector's ceiling is used throughout.

F_SKY1 causes HOM when used as a fake ceiling between the viewer and normal space. Since there is no other good use for it, this kaleidescope is an option turned on by F_SKY1. Note that this does not preclude the use of sky REAL ceilings over deep water -- this is the control sector's ceiling, the one displayed when the viewer is underwater, not the real one.

A colormap has the same size and format as Doom's COLORMAP. Extra colormaps may defined in Boom by adding them between C_START and C_END markers in wads. Colormaps between C_START and C_END are automatically merged by Boom with any previously defined colormaps.

WATERMAP is a colormap predefined by Boom which can be used to provide a blue-green tint while the player is under water. WATERMAP can be modified by pwads.

Ceiling bleeding may occur if required upper textures are not used.


 * 223  Ext --   Length Sets Friction in tagged Sector, Sludge < 100, Ice > 100

The length of the linedef with type 223 controls the amount of friction experienced by the player in the tagged sector, when in contact with the floor. Lengths less than 100 are sticker than normal, lengths greater than 100 are slipperier than normal. The effect is only present in the tagged sector when its friction enable bit (bit 8) in the sector type is set. This allows the flat to be changed in conjunction with turning the effect on or off thru texture/type changes.

Constant pushers
Two types of constant pushers are available, wind and current. Depending on whether you are above, on, or below (special water sectors) the ground level, the amount of force varies.

The length of the linedef defines the 'full' magnitude of the force, and the linedef's angle defines the direction.

The linedef should be tagged to the sector where you want the effect. The special type of the sector should have bit 9 set (0x200). If this bit is turned off, the effect goes away. For example, a fan creating a wind could be turned off, and the wind dies, by changing the sector type and clearing that bit.

Constant pushers can be combined with scrolling effects and point pushers.


 * 224 Ext  --   Length/Direction Sets Wind Force in tagged Sectors


 * 225 Ext  --   Length/Direction Sets Current Force in tagged Sectors

Point pushers
Two types of point pushers are available, push and pull.

The previous implementation of these was SECTOR-SPECIFIC. The new implementation ignores sector boundaries and provides the effect in a circular area whose center is defined by a Thing of type 5001 (push) or 5002 (pull). You now also don't have to set any option flags on these Things. A new linedef type of 226 is used to control the effect, and this line should be tagged to the sector with the 5001/5002 Thing.

The length of the linedef defines the 'full' magnitude of the force, and the force is inversely proportional to distance from the point source. If the length of the controlling linedef is L, then the force is reduced to zero at a distance of 2L.

The angle of the controlling linedef is not used.

The sector where the 5001/5002 Things reside must have bit 9 set (0x200) in its type. If this is turned off, the effect goes away.

Point pushers can be combined with scrolling effects and constant pushers.


 * 226 Ext  --   Length Sets Point Source Wind/Current Force in Tagged Sectors

Static Scrollers
The most basic kind of scrolling linedef causes some part of the tagged sector or tagged wall to scroll, in proportion to the length of the linedef the trigger is on, and according to the direction that trigger linedef lies. For each 32 units of length of the trigger, the tagged object scrolls 1 unit per frame. Since the length of a linedef doesn't change during gameplay, these types are static, the scrolling effect remains constant during gameplay. However, these effects can be combined with, and/or canceled by, other scrollers.


 * 250   -- Scroll Tagged Ceiling

The ceiling of the tagged sector scrolls in the direction of the linedef trigger, 1 unit per frame for each 32 units of linedef trigger length. Objects attached to the ceiling do not move.


 * 251 -- Scroll Tagged Floor

The floor of the tagged sector scrolls in the direction of the linedef trigger, 1 unit per frame for each 32 units of linedef trigger length. Objects resting on the floor do not move.


 * 252   -- Carry Objects on Tagged Floor

Objects on the floor of the tagged sector move in the direction of the linedef trigger, 1 unit per frame for each 32 units of linedef trigger length. The floor itself does not scroll.


 * 253   -- Scroll Tagged Floor, Carry Objects

Both the floor of the tagged sector and objects resting on that floor move in the direction of the linedef trigger, 1 unit per frame for each 32 units of linedef trigger length.


 * 254   -- Scroll Tagged Wall, Same as Floor/Ceiling

Walls with the same tag as the linedef trigger scroll at the same rate as a floor or ceiling controlled by one of 250-253, allowing their motion to be synchronized. When the linedef trigger is not parallel to the wall, the component of the linedef in the direction perpendicular to the wall causes the wall to scroll vertically. The length of the component parallel to the wall sets the horizontal scroll rate, the length of the component perpendicular to the wall sets the vertical scroll rate.

Simple Static Scrollers
For convenience three simpler static scroll functions are provided for when you just need a wall to scroll and don't need to control its rate and don't want to bother with proportionality.


 * 255   -- Scroll Wall Using Sidedef Offsets

For simplicity, a static scroller is provided that scrolls the first sidedef of a linedef, based on its x- and y- offsets. No tag is used. The x offset controls the rate of horizontal scrolling, 1 unit per frame per x offset, and the y offset controls the rate of vertical scrolling, 1 unit per frame per y offset.


 * 48    -- Animated wall, Scrolls Left

A linedef with this type scrolls its first sidedef left at a constant rate of 1 unit per frame.


 * 85    -- Animated wall, Scrolls Right

A linedef with this type scrolls its first sidedef right at a constant rate of 1 unit per frame.

Dynamic Scrolling
To achieve dynamic scrolling effects, the position or rate of scrolling is controlled by the relative position of the floor and ceiling of the sector on the scrolling trigger's first sidedef. The direction of scrolling remains controlled by the direction of the linedef trigger. Either the floor or ceiling may move in the controlling sector, or both. The control variable is the amount of change in the sum of the floor and ceiling heights.

All scroll effects are additive, and thus two or more effects may reinforce and/or cancel each other.

Displacement Scrollers
In the first kind, displacement scrolling, the position of the scrolled objects or walls changes proportionally to the motion of the floor or ceiling in the sector on the first sidedef of the scrolling trigger. The proportionality is set by the length of the linedef trigger. If it is 32 units long, the wall, floor, ceiling, or object moves 1 unit for each unit the floor or ceiling of the controlling sector moves. If it is 64 long, they move 2 units per unit of relative floor/ceiling motion in the controlling sector and so on.


 * 245   -- Scroll Tagged Ceiling w.r.t. 1st Side's Sector

The tagged sector's ceiling texture scrolls in the direction of the scrolling trigger line, when the sector on the trigger's first sidedef changes height. The amount moved is the height change times the trigger length, divided by 32. Objects attached to the ceiling do not move.


 * 246   -- Scroll Tagged Floor w.r.t. 1st Side's Sector

The tagged sector's floor texture scrolls in the direction of the scrolling trigger line when the sector on the trigger's first sidedef changes height. The amount moved is the height change times the trigger length, divided by 32. Objects on the floor do not move.


 * 247   -- Push Objects on Tagged Floor wrt 1st Side's Sector

Objects on the tagged sector's floor move in the direction of the scrolling trigger line when the sector on the trigger's first sidedef changes height. The amount moved is the height change times the trigger length, divided by 32.


 * 248   -- Push Objects & Tagged Floor wrt 1st Side's Sector

The tagged sector's floor texture, and objects on the floor, move in the direction of the scrolling trigger line when the sector on the trigger's first sidedef changes height. The amount moved is the height change times the trigger length, divided by 32.


 * 249   -- Scroll Tagged Wall w.r.t 1st Side's Sector

Walls with the same tag as the linedef trigger scroll at the same rate as a floor or ceiling controlled by one of 245-249, allowing their motion to be synchronized. When the linedef trigger is not parallel to the wall, the component of the linedef in the direction perpendicular to the wall causes the wall to scroll vertically. The length of the component parallel to the wall sets the horizontal scroll displacement, the length of the component perpendicular to the wall sets the vertical scroll displacement. The distance scrolled is the controlling sector's height change times the trigger length, divided by 32.

Accelerative Scrollers
The second kind of dynamic scrollers, accelerative scrollers, also react to height changes in the sector on the first sidedef of the linedef trigger, but the RATE of scrolling changes, not the displacement. That is, changing the controlling sector's height speeds up or slows down the scrolling by the change in height times the trigger's length, divided by 32.

An on/off scroller can be made by using an accelerative scroller and any linedef that changes the controlling sector's heights. If a scroll effect which is initially on is desired, then the accelerative scroller should be combined with a static one which turns the scroll effect on initially. The accelerative scroller would then need to be set up to cancel the static scroller's effect when the controlling sector's height changes.


 * 214   -- Accel Tagged Ceiling w.r.t. 1st Side's Sector

The tagged sector's ceiling's rate of scroll changes in the direction of the trigger linedef (use vector addition if already scrolling) by the change in height of the sector on the trigger's first sidedef times the length of the linedef trigger, divided by 32. For example, if the ceiling is motionless originally, the linedef trigger is 32 long, and the ceiling of the controlling sector moves 1 unit, the tagged ceiling will start scrolling at 1 unit per frame.


 * 215   -- Accel Tagged Floor w.r.t. 1st Side's Sector

The tagged sector's floor's rate of scroll changes in the direction of the trigger linedef (use vector addition if already scrolling) by the change in height of the sector on the trigger's first sidedef times the length of the linedef trigger, divided by 32. For example, if the floor is motionless originally, the linedef trigger is 32 long, and the ceiling of the controlling sector moves 1 unit, the tagged floor will start scrolling at 1 unit per frame.


 * 216   -- Accel Objects on Tagged Floor wrt 1st Side's Sector

Objects on the tagged sector's floor's rate of motion changes in the direction of the trigger linedef (use vector addition if already moving) by the change in height of the sector on the trigger's first sidedef times the length of the linedef trigger divided by 32. For example, if the objects are motionless originally, the linedef trigger is 32 long, and the ceiling of the controlling sector moves 1 unit, the objects on the tagged floor will start moving at 1 unit per frame.


 * 217   -- Accel Objects&Tagged Floor wrt 1st Side's Sector

The tagged sector's floor, and objects on it, change its rate of motion in the direction of the trigger linedef (use vector addition if already moving) by the change in height of the sector on the trigger's first sidedef times the length of the linedef trigger, divided by 32. For example, if the floor and objects are motionless originally, the linedef trigger is 32 long, and the ceiling of the controlling sector moves 1 unit, the objects and the tagged floor will start moving at 1 unit per frame.


 * 218   -- Accel Tagged Wall w.r.t 1st Side's Sector

Walls with the same tag as the linedef trigger increase their scroll rate in sync with a floor or ceiling controlled by one of 214-217. When the linedef trigger is not parallel to the wall, the component of the linedef in the direction perpendicular to the wall causes the wall to increase its vertical scroll rate. The length of the component parallel to the wall sets the change in horizontal scroll rate, the length of the component perpendicular to the wall sets the change in vertical scroll rate. The rate change is the height change times the trigger length, divided by 32.

Detailed Generalized Linedef Specification
BOOM has added generalized linedef types that permit the parameters of linedef actions to be nearly independently chosen.

To support these, DETH has been modified to support them via dialogs for each generalized type; each dialog allows the parameters for that type to be independently specified by choice from a array of radio buttons. A parser has also been added to support reading back the function of a generalized linedef from its type number.

NOTE to WAD authors:


 * This requires a lot of type numbers, 20608 in all so far. Some editors may object to the presence of these new types thru assuming that a lookup table of size 256 suffices (or some other reason). For those that must continue to use such an editor, it may be necessary to stick to the old linedef types, which are still present.


 * We are also providing command line tools to set these linedef types, independent of which editor you happen to use, but they are a lot less slick, and more difficult to use than DETH. See TRIGCALC.EXE and CLED.EXE in the EDITUTIL.ZIP package of the BOOM distribution.


 * Generalized Linedef Ranges

There are types for Floors, Ceilings, Doors, Locked Doors, Lifts, Stairs, and Crushers. The allocation of linedef type field numbers is according to the following table:

The following sections define the placement and meaning of the bit fields within each linedef category. Fields in the description are listed in increasing numeric order.

Some nomenclature:

Target height designations:

H means highest, L means lowest, N means next, F means floor, C means ceiling, n means neighbor, Cr means crush, sT means shortest lower texture.

Texture change designations:


 * c0n - change texture, change sector type to 0, numeric model change
 * c0t - change texture, change sector type to 0, trigger model change
 * cTn - change texture only, numeric model change
 * cTt - change texture only, trigger model change
 * cSn - change texture and sector type to model's, numeric model change
 * cSt - change texture and sector type to model's, trigger model change

A trigger model change uses the sector on the first side of the trigger for its model. A numeric model change looks at the sectors adjoining the tagged sector at the target height, and chooses the one across the lowest numbered two sided line for its model. If no model exists, no change occurs. Note that in DOOM II v1.9, no model meant an illegal sector type was generated.

Generalized floors (8192 types)
DETH Nomenclature:

W1[m] F->HnF DnS [c0t] [Cr] WR[m] F->LnF DnN [c0n] S1[m] F->NnF DnF [cTt] SR[m] F->LnC DnT [cTn] G1[m] F->C  UpS [cSt] GR[m] FbysT UpN [cSn] D1[m] Fby24 UpF DR[m] Fby32 UpT

Notes:


 * 1) When change is nochg, model is 1 when monsters can activate trigger otherwise monsters cannot activate it.
 * 2) The change fields mean the following:
 * 3) *  nochg   - means no texture change or type change
 * 4) *  zero    - means sector type is zeroed, texture copied from model
 * 5) *  txtonly - means sector type unchanged, texture copied from model
 * 6) *  type    - means sector type and floor texture are copied from model
 * 7) down/up specifies the "normal" direction for moving. If the target specifies motion in the opposite direction, motion is instant. Otherwise it occurs at speed specified by speed field.
 * 8) Speed is 1/2/4/8 units per tic
 * 9) If change is nonzero then model determines which sector is copied. If model is 0 its the sector on the first side of the trigger. If model is 1 (numeric) then the model sector is the sector at destination height on the opposite side of the lowest numbered two sided linedef around the tagged sector. If it doesn't exist no change occurs.

Generalized ceilings (8192 types)
DETH Nomenclature:

W1[m] C->HnC DnS [Cr] [c0t] WR[m] C->LnC DnN     [c0n] S1[m] C->NnC DnF     [cTt] SR[m] C->HnF DnT     [cTn] G1[m] C->F  UpS      [cSt] GR[m] CbysT UpN      [cSn] D1[m] Cby24 UpF DR[m] Cby32 UpT

Notes:


 * 1) When change is nochg, model is 1 when monsters can activate trigger otherwise monsters cannot activate it.
 * 2) The change fields mean the following:
 * 3) *nochg  - means no texture change or type change
 * 4) *zero   - means sector type is zeroed, texture copied from model
 * 5) *txtonly - means sector type unchanged, texture copied from model
 * 6) *type   - means sector type and ceiling texture are copied from model
 * 7) down/up specifies the "normal" direction for moving. If the target specifies motion in the opposite direction, motion is instant. Otherwise it occurs at speed specified by speed field.
 * 8) Speed is 1/2/4/8 units per tic
 * 9) If change is nonzero then model determines which sector is copied. If model is 0 its the sector on the first side of the trigger. If model is 1 (numeric) then the model sector is the sector at destination height on the opposite side of the lowest numbered two sided linedef around the tagged sector. If it doesn't exist no change occurs.

Generalized doors (1024 types)
DETH Nomenclature:

W1[m] OpnD{1|4|9|30}Cls S WR[m] Opn              N S1[m] ClsD{1|4|9|30}Opn F SR[m] Cls               T G1[m] GR[m] D1[m] DR[m]

Notes:


 * 1) The odc (Open, Delay, Close) and cdo (Close, Delay, Open) kinds use the delay field. The o (Open and Stay) and c (Close and Stay) kinds do not.
 * 2) The precise delay timings in gametics are: 35/150/300/1050
 * 3) Speed is 2/4/8/16 units per tic

Generalized locked doors (1024 types)
DETH Nomenclature:

W1[m] OpnDCls          S Any WR[m] Opn              N R{C|S|K} S1[m]                  F B{C|S|K} SR[m]                  T Y{C|S|K} G1[m]                    All{3|6} GR[m] D1[m] DR[m]

Notes:


 * 1) Delay for odc kind is constant at 150 gametics or about 4.333 secs
 * 2) The lock field allows any key to open a door, or a specific key to open a door, or all keys to open a door.
 * 3) If the sk=ck field is 0 (n) skull and cards are different keys, otherwise they are treated identically. Hence an "all" type door requires 3 keys if sk=ck is 1, and 6 keys if sk=ck is 0.
 * 4) Speed is 2/4/8/16 units per tic

Generalized lifts (1024 types)
DETH Nomenclature:

W1[m] Lft F->LnFD{1|3|5|10}    S WR[m]      F->NnFD{1|3|5|10}    N S1[m]      F->LnCD{1|3|5|10}    F SR[m]      HnF<->LnFD{1|3|5|10} T G1[m] GR[m] D1[m] DR[m]

Notes:


 * 1) The precise delay timings in gametics are: 35/105/165/350
 * 2) Speed is 1/2/4/8 units per tic
 * 3) If the target specified is above starting floor height, or does not exist the lift does not move when triggered. NnF is Next Lowest Neighbor Floor.
 * 4) Starting a perpetual lift between lowest and highest neighboring floors locks out all other floor actions on the sector, even if it is stopped with the non-extended stop perpetual floor function.

Generalized stairs (1024 types)
DETH Nomenclature:

W1[m] Stair Dn s4 S [Ign] WR[m]      Up s8  N S1[m]          s16 F SR[m]          s24 T G1[m] GR[m] D1[m] DR[m]

Notes:


 * 1) Speed is .25/.5/2/4 units per tic
 * 2) If igntxt is 1, then the staircase will not stop building when a step does not have the same texture as the previous.
 * 3) A retriggerable stairs builds up and down alternately on each trigger.

Generalized crushers (128 types)
DETH Nomenclature:

W1[m] Crusher S [Silent] WR[m]        N S1[m]         F SR[m]         T G1[m] GR[m] D1[m] DR[m]

Notes:


 * 1) Speed is 1/2/4/8 units per second, faster means slower damage as usual.
 * 2) If silent is 1, the crusher is totally quiet, no start/stop sounds.