Difference between revisions of "Parameterized linedef specials"

From Eternity Wiki
Jump to: navigation, search
(Floor movement, earthquake)
(125 intermediate revisions by 2 users not shown)
Line 1: Line 1:
The parameterized linedefs types are Hexen-like action specials with arguments, whose purpose is to be more customizable than the Boom generalized types. Currently they can be implemented by using [[ExtraData]] lumps attached via [[MapInfo|EMAPINFO]] to each map, or by designing the level in the Hexen format. They can also be called from ACS. When called in ExtraData or ACS, their parameters aren't limited to 0-255 as it is the case with the Hexen map format.
+
The parameterized linedefs types are Hexen-like action specials with arguments, whose purpose is to be more customizable than the Boom generalized types. When mapping in UDMF, you have to use these parameterized specials instead of the classic parameter-less ones. They're also used in Hexen format maps (which is necessary when Hexen is going to be supported in Eternity), though Hexen format is not recommended or fully supported for other maps than vanilla Hexen in Eternity. To use parameterized specials in classic (Doom) format maps, provide an [[ExtraData]] lump by attaching it via [[MapInfo|EMAPINFO]] to the map. [[ACS]] scripts can also call parameterized specials. They're meant to be as compatible as possible with the ZDoom implementation, so minimal changes to zspecial.acs are needed, though Eternity may have extensions of its own. Most likely however the base zspecial.acs is going to be updated for Eternity. Parameters are only limited to 0-255 in the Hexen format (and some specials may have some legacy workarounds for that interval), but otherwise they're in the normal integer range for other environments (UDMF, ExtraData, ACS). Some specials have never been added to ExtraData, because of their mere purpose being to work under the limits of the Hexen map format.
  
Each parameterized line special has a name and two associated numbers: one for ExtraData support, set this way to avoid conflicts with classic Boom specials, and one for Hexen, ACS and (upcoming) UDMF formats.
+
Each parameterized line special has a name and two associated numbers: one for UDMF, ACS and Hexen formats, and another one for ExtraData support, set this way to avoid conflicts with classic Boom specials (since it's possible to use their number in the editor instead of the 270 "ExtraData special"). If you only see one number mentioned in the documentation, then it's the UDMF number (for ExtraData it's preferred to use the names).
  
For any parameterized special with first argument defined as ''tag'', if it's 0, it will affect the sector behind the line (if any). It will not affect all sectors with tag 0, or be rejected, as it is with classic specials.
+
'''IMPORTANT''': all ''reserved'' parameters must be set to 0. Failure to do so will result in your maps being broken in later Eternity versions! Also, for "flag" arguments, do not add or provide other values than in the intended range, for the same reason.
  
'''IMPORTANT''': all ''reserved'' parameters must be set to 0. Failure to do so will result in your maps being broken in later Eternity versions!
 
 
{{Backto|Linedef types}}
 
{{Backto|Linedef types}}
 +
==General info==
 +
All sector tags, unless otherwise specified, have a special meaning if 0: that means to affect the sector behind the trigger linedef (like regular doors in vanilla Doom).
  
==Doors==
+
Thing tags (TIDs) have special meaning for values 0 and negative: 0 means activator, and -1 to -4 mean to affect players 1 to 4 (if present). '''Consider other negative values reserved''' and do not use them in your maps.
*300:'''Door_Raise'''(''tag'', ''speed'', ''delay'', ''light_tag'')
+
==Specials==
*301:'''Door_Open'''(''tag'', ''speed'', ''light_tag'')
+
===Doors===
*302:'''Door_Close'''(''tag'', ''speed'', ''light_tag'')
+
{|class="wikitable sortable"
*303:'''Door_CloseWaitOpen'''(''tag'', ''speed'', ''delay'', ''light_tag'')
+
! UDMF #
*304:'''Door_WaitRaise'''(''tag'', ''speed'', ''delay'', ''timeoffset'', ''light_tag'')
+
! ExtraData #
*305:'''Door_WaitClose'''(''tag'', ''speed'', ''timeoffset'', ''light_tag'')
+
! Name
*429:'''Door_LockedRaise'''(''tag'', ''speed'', ''delay'', ''lock'', ''light_tag'') ''(since Feb 25 2016)''
+
! Args
*457:'''Door_LockedOpen'''(''tag'', ''speed'', ''lock'', ''light_tag'')
+
! Summary
 +
|-
 +
|| 10 || 302 || [[Door_Close]] || ''tag'', ''speed'', ''light_tag'' || Closes a door.
 +
|-
 +
|| 11 || 301 || [[Door_Open]] || ''tag'', ''speed'', ''light_tag'' || Opens a door.
 +
|-
 +
|| 12 || 300 || [[Door_Raise]] || ''tag'', ''speed'', ''delay'', ''light_tag'' || Opens a door temporarily.
 +
|-
 +
|| 13 || 429 || [[Door_LockedRaise]] || ''tag'', ''speed'', ''delay'', ''lock'', ''light_tag'' || Opens a locked door.
 +
|-
 +
|| 105 || 304 || [[Door_WaitRaise]] || ''tag'', ''speed'', ''delay'', ''timeoffset'', ''light_tag'' || Opens a door temporarily after a delay.
 +
|-
 +
|| 106 || 305 || [[Door_WaitClose]] || ''tag'', ''speed'', ''timeoffset'', ''light_tag'' || Closes a door after a delay.
 +
|-
 +
|| 249 || 303 || [[Door_CloseWaitOpen]] || ''tag'', ''speed'', ''delay_octics'', ''light_tag'' || Closes a door, waits a bit, then opens it back.
 +
|}
 
:''tag'': Tag of sector to affect. If it's 0, then the sector behind the linedef will be activated, if applicable.
 
:''tag'': Tag of sector to affect. If it's 0, then the sector behind the linedef will be activated, if applicable.
 
:''speed'': How fast, in eights of units per tic, the door should move. Doom normal doors are as fast as 16, and blazing doors are 64.
 
:''speed'': How fast, in eights of units per tic, the door should move. Doom normal doors are as fast as 16, and blazing doors are 64.
 
:''delay'': Time in tics (1/35 seconds) for the door before it returns to its opposite movement.
 
:''delay'': Time in tics (1/35 seconds) for the door before it returns to its opposite movement.
 +
:''delay_octics'': Delay, but expressed in octics, which is eighths of second (i.e. 8 octics = 1 second).
 
:''timeoffset'': Time in tics before the door activates.
 
:''timeoffset'': Time in tics before the door activates.
 
:''light_tag'': Sector tag to receive light changes to maximum or minimum neighbor depending on whether the door is closed or opened.
 
:''light_tag'': Sector tag to receive light changes to maximum or minimum neighbor depending on whether the door is closed or opened.
 
:''lock'': One of the [[lock identifiers]] to specify the key or set of keys.
 
:''lock'': One of the [[lock identifiers]] to specify the key or set of keys.
  
==Floor movement, earthquake==
+
===Floor movement, earthquake===
*306:'''Floor_RaiseToHighest''' ( tag, speed, change, crush )
+
{|class="wikitable sortable"
*307:'''Floor_LowerToHighest''' ( tag, speed, change )
+
! UDMF #
*308:'''Floor_RaiseToLowest''' ( tag, change, crush )
+
! ExtraData #
*309:'''Floor_LowerToLowest''' ( tag, speed, change )
+
! Name
*310:'''Floor_RaiseToNearest''' ( tag, speed, change, crush )
+
! Arg1
*311:'''Floor_LowerToNearest''' ( tag, speed, change )
+
! Arg2
*312:'''Floor_RaiseToLowestCeiling''' ( tag, speed, change, crush )
+
! Arg3
*313:'''Floor_LowerToLowestCeiling''' ( tag, speed, change )
+
! Arg4
*314:'''Floor_RaiseToCeiling''' ( tag, speed, change, crush )
+
! Arg5
*315:'''Floor_RaiseByTexture''' ( tag, speed, change, crush )
+
|-
*316:'''Floor_LowerByTexture''' ( tag, speed, change )
+
|| 20 || 318 || [[Floor_LowerByValue]] || ''tag'' || ''speed'' || ''height'' || ''change'' ||
*317:'''Floor_RaiseByValue''' ( tag, speed, height, change, crush )
+
|-
*318:'''Floor_LowerByValue''' ( tag, speed, height, change )
+
|| 21 || 309 || [[Floor_LowerToLowest]] || ''tag'' || ''speed'' || ''change'' || ||
*319:'''Floor_MoveToValue''' ( tag, speed, height, change, crush )
+
|-
*320:'''Floor_RaiseInstant''' ( tag, height, change, crush )
+
|| 22 || 311 || [[Floor_LowerToNearest]] || ''tag'' || ''speed'' || ''change'' || ||
*321:'''Floor_LowerInstant''' ( tag, height, change )
+
|-
*322:'''Floor_ToCeilingInstant''' ( tag, change, crush )
+
|| 23 || 317 || [[Floor_RaiseByValue]] || ''tag'' || ''speed'' || ''height'' || ''change'' || ''crush''
:Most of these are self-explanatory. The first six functions move the floor relative to the neighbor ''floor'' and the next two to the neighbor ceiling. The 'ByTexture' types move by the shortest lower texture's height. Parameters follow -  
+
|-
:*tag - the target sector(s) tag. If set to 0, it will target the sector beyond the triggering linedef, like how manual doors work.
+
|| 24 || 306 || [[Floor_RaiseToHighest]] || ''tag'' || ''speed'' || ''change'' || ''crush'' ||
:*speed - speed in eights of units per tic. As a reference most of the Doom regular type floors move by 8.
+
|-
:*change - 0 : No texture or type change.
+
|| 25 || 310 || [[Floor_RaiseToNearest]] || ''tag'' || ''speed'' || ''change'' || ''crush'' ||
::1 : Copy texture, zero type; trigger model.
+
|-
::2 : Copy texture, zero type; numeric model.
+
|| 28 || 451 || [[Floor_RaiseAndCrush]] || tag || speed || crush || ||
::3 : Copy texture, preserve type; trigger model.
+
|-
::4 : Copy texture, preserve type; numeric model.
+
|| 35 || - || [[Floor_RaiseByValueTimes8]] || ''tag'' || ''speed'' || ''height'' || ''change'' || ''crush''
::5 : Copy texture and type; trigger model.
+
|-
::6 : Copy texture and type; numeric model.
+
|| 36 || - || [[Floor_LowerByValueTimes8]] || ''tag'' || ''speed'' || ''height'' || ''change'' ||
:*crush - nonzero if to crush, and by how much damage per each event. Regular Doom crushers have 10 damage.
+
|-
:*height - integer value specifying how much to move the floor, or which is the absolute destination Z coordinate to move it.
+
|| 37 || 319 || [[Floor_MoveToValue]] || ''tag'' || ''speed'' || ''height'' || ''neg'' || ''change''
 +
|-
 +
|| 46 || 452 || [[Floor_CrushStop]] || ''tag'' || || || ||
 +
|-
 +
|| 66 || 321 || [[Floor_LowerInstant]] || ''tag'' || - || ''height'' || ''change'' ||
 +
|-
 +
|| 67 || 320 || [[Floor_RaiseInstant]] || ''tag'' || - || ''height'' || ''change'' || ''crush''
 +
|-
 +
|| 68 || - || [[Floor_MoveToValueTimes8]] || ''tag'' || ''speed'' || ''height'' || ''neg'' || ''change''
 +
|-
 +
|| 120 || 375 || [[Radius_Quake]] || intensity || duration || damage radius || tremor radius || foci tid
 +
|-
 +
|| 138 || 397 || [[Floor_Waggle]] || tag || height || speed || offset || timer
 +
|-
 +
|| 200 || 464 || [[Generic_Floor]] || tag || speed || height || target || flags
 +
|-
 +
|| 228 || 475 || [[Plat_RaiseAndStayTx0]] || tag || speed || lock out || ||
 +
|-
 +
|| 230 || 476 || [[Plat_UpByValueStayTx]] || tag || speed || height || ||
 +
|-
 +
|| 231 || 487 || [[Plat_ToggleCeiling]] || tag || || || ||
 +
|-
 +
|| 235 || 466 || [[Floor_TransferTrigger]] || ''tag'' || || || ||
 +
|-
 +
|| 236 || 467 || [[Floor_TransferNumeric]] || ''tag'' || || || ||
 +
|-
 +
|| 238 || 312 || [[Floor_RaiseToLowestCeiling]] || ''tag'' || ''speed'' || ''change'' || ''crush'' || ''gap''
 +
|-
 +
|| 240 || 315 || [[Floor_RaiseByTexture]] || ''tag'' || ''speed'' || ''change'' || ''crush'' ||
 +
|-
 +
|| 242 || 416 || [[Floor_LowerToHighest]] || ''tag'' || ''speed'' || ''adjust'' || ''force_adjust'' ||
 +
|-
 +
|| 250 || 431 || [[Floor_Donut]] || pillar tag || pillar speed || pool speed || ||
 +
|-
 +
|| 256 || 307 || [[Floor_LowerToHighestEE]] || ''tag'' || ''speed'' || ''change'' || ||
 +
|-
 +
|| 257 || 308 || [[Floor_RaiseToLowest]] || ''tag'' || ''change'' || ''crush'' || ||
 +
|-
 +
|| 258 || 313 || [[Floor_LowerToLowestCeiling]] || ''tag'' || ''speed'' || ''change'' || ||
 +
|-
 +
|| 259 || 314 || [[Floor_RaiseToCeiling]] || ''tag'' || ''speed'' || ''change'' || ''crush'' || ''gap''
 +
|-
 +
|| 260 || 322 || [[Floor_ToCeilingInstant]] || ''tag'' || ''change'' || ''crush'' || ''gap'' ||
 +
|-
 +
|| 261 || 316 || [[Floor_LowerByTexture]] || ''tag'' || ''speed'' || ''change'' || ||
 +
|-
 +
|}
 +
 
 
*431:'''Floor_Donut''' (pillar_tag, pillar_speed, surrounding_speed)
 
*431:'''Floor_Donut''' (pillar_tag, pillar_speed, surrounding_speed)
 
:Does the donut movement behavior, allowing you to choose pillar speed and surrounding pool speed. The tag belongs to the pillar.
 
:Does the donut movement behavior, allowing you to choose pillar speed and surrounding pool speed. The tag belongs to the pillar.
Line 63: Line 127:
 
*375:'''Radius_Quake''' (intensity, duration, damageradius, quakeradius, tid)
 
*375:'''Radius_Quake''' (intensity, duration, damageradius, quakeradius, tid)
 
:This special implements the earthquake effect, centred on the map spot with the given ''tid'', with user-selectable intensity, duration and separate thing damage radius and tremor radius (both being multiplied with 64).
 
:This special implements the earthquake effect, centred on the map spot with the given ''tid'', with user-selectable intensity, duration and separate thing damage radius and tremor radius (both being multiplied with 64).
*[[Floor_TransferTrigger]]
+
*464:'''Generic_Floor'''(''tag'', ''speed'', ''height'', ''target'', ''flags'')
*[[Floor_TransferNumeric]]
 
*'''Generic_Floor'''(''tag'', ''speed'', ''height'', ''target'', ''flags'')
 
 
:Encapsulates and applies Boom generalized specials, including all their peculiarities. ''Height'' applies only if it's set to move by a parameterized abount. ''Target'' has the following meanings: 0 (move by ''height''), 1 (to highest neighbor floor), 2 (to lowest neighbor floor), 3 (to next neighbor floor), 4 (to lowest neighbor ceiling), 5 (to ceiling), 6 (by shortest lower texture). By default the floor moves down. To make it move up, add 8 to ''flags''. To make it crush, add 16 to ''flags''. To make it change floor texture, add 1 (zero special), 2 (keep special) or 3 (change special) to ''flags''. In this case, by default it will use the trigger model. To make it use the numeric model, add 4 to ''flags''.
 
:Encapsulates and applies Boom generalized specials, including all their peculiarities. ''Height'' applies only if it's set to move by a parameterized abount. ''Target'' has the following meanings: 0 (move by ''height''), 1 (to highest neighbor floor), 2 (to lowest neighbor floor), 3 (to next neighbor floor), 4 (to lowest neighbor ceiling), 5 (to ceiling), 6 (by shortest lower texture). By default the floor moves down. To make it move up, add 8 to ''flags''. To make it crush, add 16 to ''flags''. To make it change floor texture, add 1 (zero special), 2 (keep special) or 3 (change special) to ''flags''. In this case, by default it will use the trigger model. To make it use the numeric model, add 4 to ''flags''.
 
:It is recommended to use the other floor specials instead. Use this if you need some exact Boom behavior.
 
:It is recommended to use the other floor specials instead. Use this if you need some exact Boom behavior.
*'''Floor_CrushStop'''(''tag'')
+
*452:'''Floor_CrushStop'''(''tag'')
 
:For Hexen compatibility (and set to emulate Hexen bugs when run on classic Hexen maps), it stops any (and only) crushing floors from moving, and lets you apply other floor movement specials on those sectors (unlike crushing ceiling stoppers).
 
:For Hexen compatibility (and set to emulate Hexen bugs when run on classic Hexen maps), it stops any (and only) crushing floors from moving, and lets you apply other floor movement specials on those sectors (unlike crushing ceiling stoppers).
 +
*451:'''Floor_RaiseAndCrush'''(''tag'', ''speed'', ''crush'')
 +
:This one is for Hexen compatibility. Please use '''Floor_RaiseToCeiling''' or '''Floor_RaiseToLowestCeiling''' instead.
 +
*475:'''Plat_RaiseAndStayTx0'''(''tag'', ''speed'', ''hereticemu'')
 +
:This one is for Doom/Heretic compatibility. Raises a floor to the nearest neighbor and changes the texture and zeroes the type, according to the trigger model. If the sector is blocked by a thing, it will return to its initial position. '''Hereticemu''' emulates a Heretic bug where such lines would cause the sector to remain in stasis, with no possibility of being reused.
 +
*476:'''Plat_UpByValueStayTX'''(''tag'', ''speed'', ''distance'')
 +
:This one is for Doom/Heretic compatibility. Raises a floor by ''distance'' * 8 units. If a thing blocks the sector, the sector will return to its initial position. The texture will be changed, but not the sector type.
 +
====See also====
 +
*[[Floor movement classic specials]]: for the Doom format variants.
 +
 +
===Plats, lifts===
 +
{|class="wikitable sortable"
 +
! UDMF #
 +
! DOOM Format #
 +
! Name
 +
! Arg1
 +
! Arg2
 +
! Arg3
 +
! Arg4
 +
! Arg5
 +
|-
 +
|| 60 || 410 || [[Plat_PerpetualRaise]] || tag || speed || delay || ||
 +
|-
 +
|| 61 || 411 || [[Plat_Stop]] || tag || stop_mode || || ||
 +
|-
 +
|| 62 || 412 || [[Plat_DownWaitUpStay]] || tag || speed || delay || ||
 +
|-
 +
|| 63 || 413 || [[Plat_DownByValue]] || tag || speed || delay || height ||
 +
|-
 +
|| 64 || 414 || [[Plat_UpWaitDownStay]] || tag || speed || delay || ||
 +
|-
 +
|| 65 || 415 || [[Plat_UpByValue]] || tag || speed || delay || height ||
 +
|-
 +
|| 206 || 488 || [[Plat_DownWaitUpStayLip]] || tag || speed || delay || lip ||
 +
|-
 +
|| 207 || 489 || [[Plat_PerpetualRaiseLip]] || tag || speed || delay || lip ||
 +
|}
 +
*60 (410) '''Plat_PerpetualRaise'''(''tag'', ''speed'', ''delay'')
 +
:Starts a perpetual platform moving periodically between the lowest adjacent '''plus 8 units''' and highest adjacent neighbor floor. Important: this is not like the classic Doom special, and inherits the Hexen one. To act like Doom, use '''Plat_PerpetualRaiseLip''' with a lip of 0 units. The starting direction is decided randomly.
 +
*207 (489) '''Plat_PerpetualRaiseLip'''(''tag'', ''speed'', ''delay'', ''lip'')
 +
:Like '''Plat_PerpetualRaise''', but lets you choose a "lip" (distance from lowest adjacent floor to move down to). If ''lip'' is 0, it will work like classic Doom perpetual plats.
 +
*61 (411) '''Plat_Stop'''(''tag'', ''stop_mode'')
 +
:Pauses or stops a perpetual platform from moving. The behavior depends on ''stop_mode'':
 +
:*1: the platform will be merely suspended. It will only be retriggerable by other '''Plat_PerpetualRaise''' or '''Plat_PerpetualRaiseLip''' (or in Doom-format maps, by similar specials), continuing from the exact same state it stopped.
 +
:*2: the platform movement will be stopped at the current position. It will be retriggerable by any other special. If restarted by '''Plat_PerpetualRaise''' or '''Plat_PerpetualRaiseLip''' it may not remember the last state.
 +
:*0 (default): will act based on compatibility with current game mode. On Doom/Heretic/Hexen, it will act like mode 1, while in Hexen it will act like mode 2.
 +
*62 (412) '''Plat_DownWaitUpStay'''(''tag'', ''speed'', ''delay'')
 +
:Lowers the plat as a lift to the lowest adjacent floor '''plus 8 units'''. Use '''Plat_DownWaitUpStayLip''' with 0 lip if you want classic Doom-like lifts.
 +
*206 (488) '''Plat_DownWaitUpStayLip'''(''tag'', ''speed'', ''delay'', ''lip'')
 +
:Like '''Plat_DownWaitUpStay''' but with settable ''lip''.
 +
*63 (413) '''Plat_DownByValue'''(''tag'', ''speed'', ''delay'', ''height'')
 +
:Lowers a lift by an absolute ''height'', '''multiplied by 8'''. It will rise back after ''delay'' tics.
 +
*64 (414) '''Plat_UpWaitDownStay'''(''tag'', ''speed'', ''delay'')
 +
:Raises a lift to the highest neighbor floor. It will lower back after ''delay'' tics.
 +
*65 (415) '''Plat_UpByValue'''(''tag'', ''speed'', ''delay'', ''height'')
 +
:Raises a lift by an absolute ''height'', '''multiplied by 8'''. It will lower back after ''delay'' tics.
 +
*231 (487) '''Plat_ToggleCeiling'''(''tag'')
 +
:Toggles a floor between the default position and touching the ceiling. It will be left busy after that.
  
==Plats, lifts==
+
===Elevators===
:410:'''Plat_PerpetualRaise'''(''tag'', ''speed'', ''delay'')
+
{|class="wikitable sortable"
:411:'''Plat_Stop'''(''tag'')
+
! UDMF #
:412:'''Plat_DownWaitUpStay'''(''tag'', ''speed'', ''delay'')
+
! DOOM Format #
:413:'''Plat_DownByValue'''(''tag'', ''speed'', ''delay'', ''height'')
+
! Name
:414:'''Plat_UpWaitDownStay'''(''tag'', ''speed'', ''delay'')
+
! Arg1
:415:'''Plat_UpByValue'''(''tag'', ''speed'', ''delay'', ''height'')
+
! Arg2
:458:'''Elevator_RaiseToNearest'''(''tag'', ''speed'')
+
! Arg3
:459:'''Elevator_LowerToNearest'''(''tag'', ''speed'')
+
! Arg4
:460:'''Elevator_MoveToFloor'''(''tag'', ''speed'')
+
! Arg5
:454:'''FloorAndCeiling_RaiseByValue'''(''tag'', ''speed'', ''height'')
+
|-
:453:'''FloorAndCeiling_LowerByValue'''(''tag'', ''speed'', ''height'')
+
|| 95 || 453 || [[FloorAndCeiling_LowerByValue]] || ''tag'' || ''speed'' || ''height'' || ||
 +
|-
 +
|| 96 || 454 || [[FloorAndCeiling_RaiseByValue]] || ''tag'' || ''speed'' || ''height'' || ||
 +
|-
 +
|| 245 || 458 || [[Elevator_RaiseToNearest]] || ''tag'' || ''speed'' || || ||
 +
|-
 +
|| 246 || 460 || [[Elevator_MoveToFloor]] || ''tag'' || ''speed'' || || ||
 +
|-
 +
|| 247 || 459 || [[Elevator_LowerToNearest]] || ''tag'' || ''speed'' || || ||
 +
|}
  
==Ceiling movement==
+
===Ceiling movement===
------------------------------------------------------------------------------
+
{|class="wikitable sortable"
#    Function                          ExtraData Name
+
! UDMF #
+
! DOOM Format #
323 Up to Highest Neighbor Ceiling    Ceiling_RaiseToHighest
+
! Name
324 Up to HnC Instant                  Ceiling_ToHighestInstant
+
! Arg1
325  Up to Nearest Neighbor Ceiling    Ceiling_RaiseToNearest
+
! Arg2
326 Down to Nearest Neighbor Ceiling  Ceiling_LowerToNearest
+
! Arg3
327 Up to Lowest Neighbor Ceiling      Ceiling_RaiseToLowest
+
! Arg4
328  Down to Lowest Neighbor Ceiling    Ceiling_LowerToLowest
+
! Arg5
329 Up to Highest Neighbor Floor      Ceiling_RaiseToHighestFloor
+
|-
330  Down to Highest Neighbor Floor    Ceiling_LowerToHighestFloor
+
|| 40 || 336 || [[Ceiling_LowerByValue]] || tag || speed || height || change || crush
331 Down to Floor Instant              Ceiling_ToFloorInstant
+
|-
332  Down to Floor                      Ceiling_LowerToFloor
+
|| 41 || 335 || [[Ceiling_RaiseByValue]] || tag || speed || height || change ||
333 Up Abs Shortest Upper Texture      Ceiling_RaiseByTexture
+
|-
334 Down Abs Shortest Upper Texture    Ceiling_LowerByTexture
+
|| 42 || 432 || [[Ceiling_CrushAndRaise]] || tag || speed || crush || crush mode ||
335  Up Absolute Param                  Ceiling_RaiseByValue
+
|-
336  Down Absolute Param                Ceiling_LowerByValue
+
|| 43 || 435 || [[Ceiling_LowerAndCrush]] || tag || speed || crush || crush mode ||
337  To Absolute Height                Ceiling_MoveToValue
+
|-
338  Up Absolute Param, Instant        Ceiling_RaiseInstant
+
|| 44 || 433 || [[Ceiling_CrushStop]] || tag || stop mode || || ||
339  Down Absolute Param, Instant      Ceiling_LowerInstant
+
|-
+
|| 45 || 434 || [[Ceiling_CrushRaiseAndStay]] || tag || speed || crush || crush mode ||
Parameters
+
|-
---------------------------------------------------------------
+
|| 47 || 337 || [[Ceiling_MoveToValue]] || tag || speed || height || negate || change
Ceiling_RaiseToHighest       tag, speed, change
+
|-
Ceiling_ToHighestInstant     tag, change, crush
+
|| 69 || - || [[Ceiling_MoveToValueTimes8]] || tag || speed || height || negate || change
Ceiling_RaiseToNearest       tag, speed, change
+
|-
Ceiling_LowerToNearest       tag, speed, change, crush
+
|| 97 || 436 || [[Ceiling_LowerAndCrushDist]] || tag || speed || crush || gap || crush mode
Ceiling_RaiseToLowest       tag, speed, change
+
|-
Ceiling_LowerToLowest       tag, speed, change, crush
+
|| 104 || 441 || [[Ceiling_CrushAndRaiseSilentDist]] || tag || gap || speed || damage || crush mode
Ceiling_RaiseToHighestFloor tag, speed, change
+
|-
Ceiling_LowerToHighestFloor tag, speed, change, crush
+
|| 168 || 437 || [[Ceiling_CrushAndRaiseDist]] || tag || gap || speed || damage || crush mode
Ceiling_ToFloorInstant       tag, change, crush, gap
+
|-
Ceiling_LowerToFloor         tag, speed, change, crush, gap
+
|| 192 || 330 || [[Ceiling_LowerToHighestFloor]] || tag || speed || change || crush || gap to floor
Ceiling_RaiseByTexture       tag, speed, change
+
|-
Ceiling_LowerByTexture       tag, speed, change, crush
+
|| 193 || 339 || [[Ceiling_LowerInstant]] || tag || - || height * 8 || change || crush
Ceiling_RaiseByValue         tag, speed, height, change
+
|-
Ceiling_LowerByValue         tag, speed, height, change, crush
+
|| 194 || 338 || [[Ceiling_RaiseInstant]] || tag || - || height * 8 || change ||
Ceiling_MoveToValue         tag, speed, height, change, crush
+
|-
Ceiling_RaiseInstant         tag, height, change
+
|| 195 || 438 || [[Ceiling_CrushRaiseAndStayA]] || tag || down speed || up speed || damage || crush mode
Ceiling_LowerInstant         tag, height, change, crush  
+
|-
+
|| 196 || 439 || [[Ceiling_CrushAndRaiseA]] || tag || down speed || up speed || damage || crush mode
Values
+
|-
---------------------------------------------------------------
+
|| 197 || 440 || [[Ceiling_CrushAndRaiseSilentA]] || tag || down speed || up speed || damage || crush mode
tag   : Tag of the sector(s) to affect. A tag of zero means to
+
|-
          affect the sector on the second side of the line.
+
|| 198 || - || [[Ceiling_RaiseByValueTimes8]] || tag || speed || height * 8 || change ||
speed : Speed of ceiling in eighths of a unit per tic.
+
|-
change : This parameter takes the following values:
+
|| 199 || - || [[Ceiling_LowerByValueTimes8]] || tag || speed || height * 8 || change || crush
          0 : No texture or type change.
+
|-
          1 : Copy texture, zero type; trigger model.
+
|| 201 || 465 || [[Generic_Ceiling]] || tag || speed || height || target || flags
          2 : Copy texture, zero type; numeric model.
+
|-
          3 : Copy texture, preserve type; trigger model.
+
|| 205 || 443 || [[Generic_Crusher]] || tag || down speed || up speed || silent || damage
          4 : Copy texture, preserve type; numeric model.
+
|-
          5 : Copy texture and type; trigger model.
+
|| 252 || 325 || [[Ceiling_RaiseToNearest]] || tag || speed || change || ||
          6 : Copy texture and type; numeric model.
+
|-
crush : Amount of crushing damage ceiling inflicts at each
+
|| 253 || 328 || [[Ceiling_LowerToLowest]] || tag || speed || change || crush ||
          crushing event (when gametic % 4 = 0). If this
+
|-
          amount is less than or equal to zero, no crushing
+
|| 254 || 332 || [[Ceiling_LowerToFloor]] || tag || speed || change || crush || gap
          damage is done.
+
|-
height : An integer number of units, either the amount to  
+
|| 255 || 442 || [[Ceiling_CrushRaiseAndStaySilA]] || tag || down speed || up speed || damage || crush mode
          move the floor by or the exact z coordinate to move
+
|-
          the floor toward. Negative numbers are valid for  
+
|| 262 || 323 || [[Ceiling_RaiseToHighest]] || tag || speed || change || ||
          the latter case.
+
|-
gap   : Distance to keep from the destination. Useful if crush
+
|| 263 || 324 || [[Ceiling_ToHighestInstant]] || tag || change || crush || ||
          is nonzero
+
|-
------------------------------------------------------------------------------
+
|| 264 || 326 || [[Ceiling_LowerToNearest]] || tag || speed || change || crush ||
 +
|-
 +
|| 265 || 327 || [[Ceiling_RaiseToLowest]] || tag || speed || change || ||
 +
|-
 +
|| 266 || 329 || [[Ceiling_RaiseToHighestFloor]] || tag || speed || change || ||
 +
|-
 +
|| 267 || 331 || [[Ceiling_ToFloorInstant]] || tag || change || crush || gap ||
 +
|-
 +
|| 268 || 333 || [[Ceiling_RaiseByTexture]] || tag || speed || change || ||
 +
|-
 +
|| 269 || 334 || [[Ceiling_LowerByTexture]] || tag || speed || change || crush ||
 +
|}
 +
*323:'''Ceiling_RaiseToHighest'''      ( tag, speed, change               )
 +
*324:'''Ceiling_ToHighestInstant'''    ( tag, change, crush               )
 +
*325:'''Ceiling_RaiseToNearest'''      ( tag, speed, change               )
 +
*326:'''Ceiling_LowerToNearest'''      ( tag, speed, change, crush         )
 +
*327:'''Ceiling_RaiseToLowest'''      ( tag, speed, change               )
 +
*328:'''Ceiling_LowerToLowest'''      ( tag, speed, change, crush         )
 +
*329:'''Ceiling_RaiseToHighestFloor''' ( tag, speed, change               )
 +
*330:'''Ceiling_LowerToHighestFloor''' ( tag, speed, change, crush, gap    )
 +
*331:'''Ceiling_ToFloorInstant'''      ( tag, change, crush, gap           )
 +
*332:'''Ceiling_LowerToFloor'''        ( tag, speed, change, crush, gap   )
 +
*333:'''Ceiling_RaiseByTexture'''      ( tag, speed, change               )
 +
*334:'''Ceiling_LowerByTexture'''      ( tag, speed, change, crush         )
 +
*335:'''Ceiling_RaiseByValue'''        ( tag, speed, height, change       )
 +
*336:'''Ceiling_LowerByValue'''        ( tag, speed, height, change, crush )
 +
*337:'''Ceiling_MoveToValue'''        ( tag, speed, height, change, crush )
 +
*338:'''Ceiling_RaiseInstant'''        ( tag, height, change               )
 +
*339:'''Ceiling_LowerInstant'''        ( tag, height, change, crush       )
 +
:Values for these specials:
 +
:*tag: Tag of the sector(s) to affect. A tag of zero means to affect the sector on the second side of the line.
 +
:*speed: Speed of ceiling in eighths of a unit per tic.
 +
:*change: This parameter takes the following values:
 +
::0 : No texture or type change.
 +
::1 : Copy texture, zero type; trigger model.
 +
::2 : Copy texture, zero type; numeric model.
 +
::3 : Copy texture, preserve type; trigger model.
 +
::4 : Copy texture, preserve type; numeric model.
 +
::5 : Copy texture and type; trigger model.
 +
::6 : Copy texture and type; numeric model.
 +
:*crush: Amount of crushing damage ceiling inflicts at each crushing event (when gametic % 4 = 0). If this amount is less than or equal to zero, no crushing damage is done.
 +
:*height: An integer number of units, either the amount to move the floor by or the exact z coordinate to move the floor toward. Negative numbers are valid for the latter case.
 +
:*gap: Distance to keep from the destination. Useful if crush is nonzero
 
*465:'''Generic_Ceiling'''(''tag'', ''speed'', ''height'', ''target'', ''flag'')
 
*465:'''Generic_Ceiling'''(''tag'', ''speed'', ''height'', ''target'', ''flag'')
 
:See '''Generic_Floor''' for an explanation of parameters.
 
:See '''Generic_Floor''' for an explanation of parameters.
===Crushing ceilings===
+
 
 +
====Crushing ceilings====
 
There are some crushing ceilings available now. Some originate from Hexen while others are extensions from ZDoom. ZDoom compatibility is considered where relevant. For all specials where it applies, ''crushmode'' can take one of these values:
 
There are some crushing ceilings available now. Some originate from Hexen while others are extensions from ZDoom. ZDoom compatibility is considered where relevant. For all specials where it applies, ''crushmode'' can take one of these values:
 
*0: compatibility. Act like it would do in ZDoom. This means that in Doom the crusher keeps pushing into the things it crushes, while in Hexen it stays on position while dealing damage. And if the game is Doom, the special has "Dist" in the name and the speed is set to 8, it will also slow down to speed 1 when crushing.
 
*0: compatibility. Act like it would do in ZDoom. This means that in Doom the crusher keeps pushing into the things it crushes, while in Hexen it stays on position while dealing damage. And if the game is Doom, the special has "Dist" in the name and the speed is set to 8, it will also slow down to speed 1 when crushing.
Line 169: Line 340:
 
*435: Ceiling_LowerAndCrush(tag, speed, damage, crushmode)
 
*435: Ceiling_LowerAndCrush(tag, speed, damage, crushmode)
 
*436: Ceiling_LowerAndCrushDist(tag, speed, damage, ground_distance, crushmode)
 
*436: Ceiling_LowerAndCrushDist(tag, speed, damage, ground_distance, crushmode)
*433: Ceiling_CrushStop(tag)
+
*433: Ceiling_CrushStop(tag, stop_mode)
 +
:*stop_mode can be: 0 (compatibility), 1 (Doom: pause crusher), 2 (Hexen: remove crusher and release the ceiling)
 
*443: Generic_Crusher(tag, down_speed, up_speed, silent, damage)
 
*443: Generic_Crusher(tag, down_speed, up_speed, silent, damage)
  
==Stair building==
+
===Stair building===
  ------------------------------------------------------------------------------
+
{|class="wikitable sortable"
#    Function                            ExtraData Name
+
! UDMF #
+
! DOOM Format #
340  Build stairs up, DOOM method        Stairs_BuildUpDoom
+
! Name
341  Build stairs down, DOOM method      Stairs_BuildDownDoom
+
! Arg1
342  Build stairs up sync*, DOOM method  Stairs_BuildUpDoomSync
+
! Arg2
343  Build stairs dn sync*, DOOM method  Stairs_BuildDownDoomSync
+
! Arg3
+
! Arg4
 +
! Arg5
 +
|-
 +
|| 217 || 340 || [[Stairs_BuildUpDoom]] || ''tag'' || ''speed'' || ''stepsize'' || ''delay'' || ''reset''
 +
|-
 +
|| 270 || 341 || [[Stairs_BuildDownDoom]] || ''tag'' || ''speed'' || ''stepsize'' || ''delay'' || ''reset''
 +
|-
 +
|| 271 || 342 || [[Stairs_BuildUpDoomSync]] || ''tag'' || ''speed'' || ''stepsize'' || ''reset'' ||
 +
|-
 +
|| 272 || 343 || [[Stairs_BuildDownDoomSync]] || ''tag'' || ''speed'' || ''stepsize'' || ''reset'' ||
 +
|}
 +
  ------------------------------------------------------------------------------  
 
  * Synchronized stairs have each step move at a different speed so that all the
 
  * Synchronized stairs have each step move at a different speed so that all the
 
   steps reach the destination height at the same time. This stair building
 
   steps reach the destination height at the same time. This stair building
 
   style is only available with these parameterized line types.  
 
   style is only available with these parameterized line types.  
 
Parameters
 
---------------------------------------------------------------
 
Stairs_BuildUpDoom        tag, speed, stepsize, delay, reset
 
Stairs_BuildDownDoom      tag, speed, stepsize, delay, reset
 
Stairs_BuildUpDoomSync    tag, speed, stepsize, reset
 
Stairs_BuildDownDoomSync  tag, speed, stepsize, reset
 
 
   
 
   
 
  Values
 
  Values
Line 212: Line 388:
 
             building action but in the reverse direction. If
 
             building action but in the reverse direction. If
 
             zero, the stairs will never reset.
 
             zero, the stairs will never reset.
------------------------------------------------------------------------------
 
 
==PolyObject control==
 
 
  ------------------------------------------------------------------------------
 
  ------------------------------------------------------------------------------
#   Function                            ExtraData Name  
+
 
+
===Polyobjects===
348 Marks first line in PolyObject*    Polyobj_StartLine
+
{|class="wikitable sortable"
349 Explicitly includes a line*        Polyobj_ExplicitLine
+
! UDMF #
350 Open PolyObject as sliding door    Polyobj_DoorSlide
+
! DOOM Format #
351  Open PolyObject as swinging door    Polyobj_DoorSwing
+
! Name
352  Move PolyObject in xy plane        Polyobj_Move
+
! Arg1
353  Move PolyObject w/override**        Polyobj_OR_Move
+
! Arg2
354  Rotate PolyObject right            Polyobj_RotateRight
+
! Arg3
355 Rotate PolyObject right w/override  Polyobj_OR_RotateRight
+
! Arg4
356  Rotate PolyObject left              Polyobj_RotateLeft
+
! Arg5
357  Rotate PolyObject left w/override  Polyobj_OR_RotateLeft
+
|-
474  Stop PolyObject***                  Polyobj_Stop
+
|| 1 || 348 || [[Polyobj_StartLine]] || id || mirror id || sound sequence || ||
+
|-
* There are two different methods of creating a PolyObject. In the first,
+
|| 2 || 356 || [[Polyobj_RotateLeft]] || id || speed || rotation || ||
  the "first" line is given the Polyobj_StartLine special, and subsequent
+
|-
  lines are added to the PolyObject by following segs from vertex to vertex.
+
|| 3 || 354 || [[Polyobj_RotateRight]] || id || speed || rotation || ||
  To use this, all the lines around the PolyObject must run in the same
+
|-
  direction, and the last line must end at the same vertex which starts the
+
|| 4 || 352 || [[Polyobj_Move]] || id || speed || angle || distance ||
  first line (in other words, it must be closed).
+
|-
 +
|| 5 || 349 || [[Polyobj_ExplicitLine]] || id || line index || mirror id || sound sequence ||
 +
|-
 +
|| 6 || - || [[Polyobj_MoveTimes8]] || id || speed || angle || distance ||
 +
|-
 +
|| 7 || 351 || [[Polyobj_DoorSwing]] || id || speed || rotation || delay ||
 +
|-
 +
|| 8 || 350 || [[Polyobj_DoorSlide]] || id || speed || angle || distance || delay
 +
|-
 +
|| 87 || 474 || [[Polyobj_Stop]] || id || || || ||
 +
|-
 +
|| 90 || 357 || [[Polyobj_OR_RotateLeft]] || id || speed || rotation || ||
 +
|-
 +
|| 91 || 355 || [[Polyobj_OR_RotateRight]] || id || speed || rotation || ||
 +
|-
 +
|| 92 || 353 || [[Polyobj_OR_Move]] || id || speed || angle || distance ||
 +
|-
 +
|| 93 || - || [[Polyobj_OR_MoveTimes8]] || id || speed || angle || distance ||
 +
|}
 +
*1 (348) '''Polyobj_StartLine'''(''id'', ''mirror_id'', ''sequence_id'')
 +
*5 (349) '''Polyobj_ExplicitLine(''id'', ''linenum'', ''mirror_id'', ''sequence_id'')
 +
:There are two different methods of creating a polyobject. In the first, the "first" line is given the '''Polyobj_StartLine''' special, and subsequent lines are added to the PolyObject by following segs from vertex to vertex. To use this, all the lines around the polyobject must run in the same direction, and the last line must end at the same vertex which starts the first line (in other words, it must be closed).
 +
 
 +
:With the second method, every line to be included must be given the '''Polyobj_ExplicitLine''' special and must be given a ''linenum'' param which is unique amongst all lines that will added to that polyobject. Polyobjects of this sort should also be closed for proper rendering, but the game engine cannot and will not verify that this is the case.
 
    
 
    
  With the second method, every line to be included must be given the
+
:Only polyobjects created with the '''Polyobj_StartLine''' method can have other line specials on the polyobject's lines themselves.  
  Polyobj_ExplicitLine special and must be given a linenum param which is
+
 
  unique amongst all lines that will added to that polyobject. Polyobjects
+
:''Mirror_id'' is the ID number of a PolyObject that wants to mirror every action that this PolyObject makes. This number cannot refer to the self-same PolyObject, nor should PolyObjects attempt to mirror each other in a cycle since this will create problems with override actions. Angle of motion is always reversed when applying an action to a mirroring PolyObject. If a mirror is already in motion for a non-override action, the mirror will not be affected even if the main object was moved. Mirror polyobjects can themselves define a mirror, and an action will affect all mirroring polyobjects in the chain.
  of this sort should also be closed for proper rendering, but the game
+
*4 (352) '''Polyobj_Move'''(''id'', ''speed'', ''angle'', ''distance'')
  engine cannot and will not verify that this is the case.
+
:Slides a polyobject in the direction given in ''angle'' by ''distance''.
 
+
*6 '''Polyobj_MoveTimes8'''(''id'', ''speed'', ''angle'', ''distance'')
  Only PolyObjects created with the Polyobj_StartLine method can have other
+
:Like '''Polyobj_Move''' but with ''distance'' multiplied by 8. Needed only for the Hexen format and supported for legacy reasons.
  line specials on the PolyObject's lines themselves.  
+
*2 (356) '''Polyobj_RotateLeft'''(''id'', ''speed'', ''distance'')
+
:Rotates a polyobject counterclockwise by the ''distance'' [[byte angle]] difference. If ''distance'' is 0, it means 360 degrees. If ''distance'' is 255, it means perpetual spinning.
** Override types will take effect even if an action is already affecting the
+
*3 (354) '''Polyobj_RotateRight'''(''id'', ''speed'', ''distance'')
  specified polyobject. Normal actions will fail in this case.
+
:Rotates a polyobject clockwise by the ''distance'' [[byte angle]] difference. If ''distance'' is 0, it means 360 degrees. If ''distance'' is 255, it means perpetual spinning.
+
*92 (353) '''Polyobj_OR_Move'''(''id'', ''speed'', ''angle'', ''distance'')
*** This will stop a polyobject from its action, leaving it free for other movement.
+
:Like '''Polyobj_Move''', but overrides the current movement.
+
*93 '''Polyobj_OR_MoveTimes8'''(''id'', ''speed'', ''angle'', ''distance'')
Parameters
+
:Like '''Polyobj_MoveTimes8''', but overrides the current movement.
------------------------------------------------------------------
+
*90 (357) '''Polyobj_OR_RotateLeft'''(''id'', ''speed'', ''distance'')
Polyobj_StartLine      polyobj_id, mirror_id, sndseq_id
+
:Like '''Polyobj_RotateLeft''', but overrides the current movement.
Polyobj_ExplicitLine    polyobj_id, linenum, mirror_id, sndseq_id
+
*91 (355) '''Polyobj_OR_RotateRight'''(''id'', ''speed'', ''distance'')
Polyobj_DoorSlide      polyobj_id, speed, angle, dist, delay
+
:Like '''Polyobj_RotateRight''', but overrides the current movement.
Polyobj_DoorSwing      polyobj_id, aspeed, adist, delay
+
*8 (350) '''Polyobj_DoorSlide'''(''id'', ''speed'', ''angle'', ''distance'', ''delay'')
Polyobj_Move            polyobj_id, speed, angle, dist
+
:Slides a polyobject like a door which closes after a ''delay'' and deflects if it gets jammed.
Polyobj_OR_Move        polyobj_id, speed, angle, dist
+
*7 (351) '''Polyobj_DoorSwing'''(''id'', ''speed'', ''distance'', ''delay'')
Polyobj_RotateRight    polyobj_id, aspeed, adist
+
:Swings a polyobject like a door which closes after a ''delay'' and deflects if it gets jammed. There are no special behaviors for setting ''distance'' to 0 or 255, unlike '''Polyobj_RotateLeft''' and derivatives.
Polyobj_OR_RotateRight  polyobj_id, aspeed, adist
+
*87 (474) '''Polyobj_Stop'''(''id'')
Polyobj_RotateLeft      polyobj_id, aspeed, adist
+
:Stops a polyobject from movement. It will then be free for other activations.
Polyobj_OR_RotateLeft  polyobj_id, aspeed, adist
+
 
Polyobj_Stop            polyobj_id
+
===Pillar building===
+
{|class="wikitable sortable"
Values
+
! UDMF #
---------------------------------------------------------------
+
! DOOM Format #
polyobj_id : ID number of the PolyObject of which this line is
+
! Name
              a part. PolyObject ID numbers are defined in the
+
! Arg1
              angle field of their EEPolyObjSpawnSpot object
+
! Arg2
              (DoomEd numbers 9301 or 9302). Every PolyObject
+
! Arg3
              must be given a valid unique ID number greater
+
! Arg4
              than zero.
+
! Arg5
mirror_id  : The ID number of a PolyObject that wants to mirror
+
|-
              every action that this PolyObject makes. This
+
|| 29 || 362 || [[Pillar_Build]] || tag || speed || height || ||
              number cannot refer to the self-same PolyObject,
+
|-
              nor should PolyObjects attempt to mirror each
+
|| 30 || 364 || [[Pillar_Open]] || tag || speed || floor dist || ceil dist ||
              other in a cycle since this will create problems
+
|-
              with override actions. Angle of motion is always
+
|| 94 || 363 || [[Pillar_BuildAndCrush]] || tag || speed || height || damage ||
              reversed when applying an action to a mirroring
+
|-
              PolyObject. If a mirror is already in motion for
+
|| 251 || 468 || [[FloorAndCeiling_LowerRaise]] || tag || floor speed || ceiling speed || Boom emulation ||
              a non-override action, the mirror will not be
+
|}
              affected even if the main object was moved. Mirror
 
              polyobjects can themselves define a mirror, and
 
              an action will affect all mirroring polyobjects
 
              in the chain.
 
sndseq_id  : Selects the EDF sound sequence this
 
              PolyObject uses when moving.
 
linenum    : For Polyobj_ExplicitLine only, specifies the
 
              order in which lines should be added to the
 
              PolyObject. Each line must have a number greater
 
              than zero which is unique within all lines that
 
              belong to that PolyObject. Although, unlike Hexen,
 
              there is no requirement that the numbers be in
 
              consecutive order or that they start at 1.
 
speed     : Linear speed of PolyObject motion in eighths of a
 
              unit per tic.
 
angle      : Byte angle of linear motion. *
 
dist      : Total linear distance to move in units.
 
delay      : Time to wait before closing in tics.
 
aspeed    : Byte angle specifying speed in degrees per tic. *
 
adist      : Byte angle specifying total angular distance to
 
              rotate. *, **
 
---------------------------------------------------------------
 
 
* Byte angles follow this system:
 
    0 =  0 degrees (East)
 
    64 =  90 degrees (North)
 
  128 = 180 degrees (West)
 
  192 = 270 degrees (South)
 
 
 
  To convert from degrees to byte angles, use the following calculation:
 
 
 
  byteangle = (degrees * 256) / 360
 
 
  Chop or round the result to an integer.
 
 
 
  Valid byte angles fall between 0 and 255, so adjust any angles less than
 
  0 or greater than or equal to 360 before performing this conversion.
 
 
 
** For the adist parameter to Polyobj_Rotate-type specials (excluding
 
    Polyobj_DoorSwing), the values 0 and 255 have the following special
 
    meanings:
 
  0  == The PolyObject will rotate exactly 360 degrees.
 
  255 == The PolyObject will rotate perpetually.
 
  All other byte angle values have their normal meaning.
 
------------------------------------------------------------------------------
 
 
==Pillar building==
 
 
  ------------------------------------------------------------------------------
 
  ------------------------------------------------------------------------------
 
  #    Function                            ExtraData Name
 
  #    Function                            ExtraData Name
Line 368: Line 517:
 
  ------------------------------------------------------------------------------
 
  ------------------------------------------------------------------------------
 
*[[FloorAndCeiling_LowerRaise]]
 
*[[FloorAndCeiling_LowerRaise]]
==ACS Scripts==
+
 
 +
===ACS Scripts===
 +
{|class="wikitable sortable"
 +
! UDMF #
 +
! DOOM Format #
 +
! Name
 +
! Arg1
 +
! Arg2
 +
! Arg3
 +
! Arg4
 +
! Arg5
 +
|-
 +
|| 80 || 365 || [[ACS_Execute]] || script || map || arg1 || arg2 || arg3
 +
|-
 +
|| 81 || 366 || [[ACS_Suspend]] || script || map || || ||
 +
|-
 +
|| 82 || 367 || [[ACS_Terminate]] || script || map || || ||
 +
|-
 +
|| 83 || 430 || [[ACS_LockedExecute]] || script || map || arg1 || arg2 || lock id
 +
|-
 +
|| 84 || 420 || [[ACS_ExecuteWithResult]] || script || arg1 || arg2 || arg3 || arg4
 +
|-
 +
|| 85 || 490 || [[ACS_LockedExecuteDoor]] || script || map || arg1 || arg2 || lock id
 +
|-
 +
|| 226 || 477 || [[ACS_ExecuteAlways]] || script || map || arg1 || arg2 || arg3
 +
|}
 
{{zdoomwiki}}
 
{{zdoomwiki}}
 
Eternity supports ACS script calling.
 
Eternity supports ACS script calling.
Line 375: Line 549:
 
:If the specified script was previously executed but then suspended, then execution will begin at the point immediately after where it was suspended instead of starting over again at the beginning.
 
:If the specified script was previously executed but then suspended, then execution will begin at the point immediately after where it was suspended instead of starting over again at the beginning.
 
:The number of usable arguments is limited to 3.
 
:The number of usable arguments is limited to 3.
 +
*477:'''ACS_ExecuteAlways'''(''scriptnum'', ''mapnum'', ''arg0'', ''arg1'', ''arg2'')
 +
:Same as ACS_Execute, but will not be blocked if an instance of ''scriptnum'' is already running.
 
*366:'''ACS_Suspend'''(''scriptnum'', ''mapnum'')
 
*366:'''ACS_Suspend'''(''scriptnum'', ''mapnum'')
 
:Suspends execution of a script until an ACS_Execute special resumes it.
 
:Suspends execution of a script until an ACS_Execute special resumes it.
Line 382: Line 558:
 
:This one executes a script that requires the player to have a key or more. See [[Lock identifiers]] for info on what to put for the ''lock'' argument.
 
:This one executes a script that requires the player to have a key or more. See [[Lock identifiers]] for info on what to put for the ''lock'' argument.
  
==Lights==
+
===Lights===
 +
{|class="wikitable sortable"
 +
! UDMF #
 +
! DOOM Format #
 +
! Name
 +
! Arg1
 +
! Arg2
 +
! Arg3
 +
! Arg4
 +
! Arg5
 +
|-
 +
|| 110 || 368 || [[Light_RaiseByValue]] || tag || level || || ||
 +
|-
 +
|| 111 || 369 || [[Light_LowerByValue]] || tag || level || || ||
 +
|-
 +
|| 112 || 370 || [[Light_ChangeToValue]] || tag || level || || ||
 +
|-
 +
|| 113 || 371 || [[Light_Fade]] || tag || dest value || tics || ||
 +
|-
 +
|| 114 || 372 || [[Light_Glow]] || tag || max || min || tics ||
 +
|-
 +
|| 115 || 373 || [[Light_Flicker]] || tag || max || min || ||
 +
|-
 +
|| 116 || 374 || [[Light_Strobe]] || tag || max value || min value || max time || min time
 +
|-
 +
|| 232 || 463 || [[Light_StrobeDoom]] || tag || max time || min time || ||
 +
|-
 +
|| 233 || 473 || [[Light_MinNeighbor]] || ''tag'' || || || ||
 +
|-
 +
|| 234 || 461 || [[Light_MaxNeighbor]] || ''tag'' || || || ||
 +
|-
 +
|}
 +
If ''tag'' is 0, any such parameterized special will affect the sector behind the linedef, if applicable.
 +
* '''Light_MinNeighbor''' sets the lights in tagged sectors to their minimum neighbors' values.
 +
* '''Light_MaxNeighbor''' sets the lights in tagged sectors to their maximum neighbors' values.
 +
 
 
Eternity supports the following light level controlling parameterized linedef specials. If ''tag'' is 0, any such parameterized special will affect the sector behind the linedef, if applicable.
 
Eternity supports the following light level controlling parameterized linedef specials. If ''tag'' is 0, any such parameterized special will affect the sector behind the linedef, if applicable.
 
*368:'''Light_RaiseByValue'''(''tag'', ''lvl'')
 
*368:'''Light_RaiseByValue'''(''tag'', ''lvl'')
Line 405: Line 616:
 
:Sets the lights in tagged sectors to their maximum neighbors' values
 
:Sets the lights in tagged sectors to their maximum neighbors' values
  
==Things==
+
===Things===
*398:'''Thing_Spawn'''(tid, type, angle)
+
{|class="wikitable sortable"
:Spawns an object of '''acs_spawndata''' '''num''' ''type'' on top of map spot things marked with TID ''tid''. Note: teleportation fog is spawned as well.
+
! UDMF #
*399:'''Thing_SpawnNoFog'''(tid, type, angle)
+
! DOOM Format #
:Similar to above, but without teleportation fog.
+
! Name
 +
! Arg1
 +
! Arg2
 +
! Arg3
 +
! Arg4
 +
! Arg5
 +
|-
 +
|| 17 || 422 || [[Thing_Raise]] || tid || || || ||
 +
|-
 +
|| 19 || 423 || [[Thing_Stop]] || tid || || || ||
 +
|-
 +
|| 72 || 424 || [[ThrustThing]] || angle || speed || - || tid ||
 +
|-
 +
|| 73 || 426 || [[DamageThing]] || damage || mod || || ||
 +
|-
 +
|| 119 || 427 || [[Thing_Damage]] || tid || damage || mod || ||
 +
|-
 +
|| 128 || 425 || [[ThrustThingZ]] || tid || speed || up or down || set or add ||
 +
|-
 +
|| 130 || 404 || [[Thing_Activate]] || tid || || || ||
 +
|-
 +
|| 131 || 405 || [[Thing_Deactivate]] || tid || || || ||
 +
|-
 +
|| 132 || 478 || [[Thing_Remove]] || tid || || || ||
 +
|-
 +
|| 133 || 428 || [[Thing_Destroy]] || tid || - || sector tag || ||
 +
|-
 +
|| 134 || 402 || [[Thing_Projectile]] || tid || type || angle || speed || vertical speed
 +
|-
 +
|| 135 || 398 || [[Thing_Spawn]] || tid || type || angle || ||
 +
|-
 +
|| 136 || 403 || [[Thing_ProjectileGravity]] || tid || type || angle || speed || vertical speed
 +
|-
 +
|| 137 || 399 || [[Thing_SpawnNoFog]] || tid || type || angle || ||
 +
|-
 +
|| 176 || 421 || [[Thing_ChangeTID]] || oldtid || newtid || || ||
 +
|-
 +
|| 248 || 469 || [[HealThing]] || amount || max health || || ||
 +
|}
 
*402:'''Thing_Projectile'''(tid, type, angle, speed, verticalspeed)
 
*402:'''Thing_Projectile'''(tid, type, angle, speed, verticalspeed)
 
:Throws a projectile from a map spot. Can also be used to throw a flying monster. Like in Thing_Spawn, ''type'' is an '''acs_spawndata num'''. Note that ''speed'' and ''verticalspeed'' are in eighths (units per 8 tics). Up is positive for ''verticalspeed''.
 
:Throws a projectile from a map spot. Can also be used to throw a flying monster. Like in Thing_Spawn, ''type'' is an '''acs_spawndata num'''. Note that ''speed'' and ''verticalspeed'' are in eighths (units per 8 tics). Up is positive for ''verticalspeed''.
 
*403:'''Thing_ProjectileGravity'''(tid, type, angle, speed, verticalspeed)
 
*403:'''Thing_ProjectileGravity'''(tid, type, angle, speed, verticalspeed)
 
:Same as above, but the thrown projectile or monster will be subject to gravity.
 
:Same as above, but the thrown projectile or monster will be subject to gravity.
*404:'''Thing_Activate'''(tid)
 
:"Activates" an object of TID ''tid''. The object will enter ''activestate'' while playing ''activatesound''. If the object is a monster (SHOOTABLE or KILLABLE flag set), its DORMANT flag will be reset as well, "waking it up" from a statue.
 
*405:'''Thing_Deactivate'''(tid)
 
:Analogous/opposite to the above, the object will enter ''inactivestate'' while playing ''deactivatesound''. If the object is a monster (SHOOTABLE or KILLABLE flag set), its DORMANT flag will be set as well, turning it into a statue.
 
 
*421:'''Thing_ChangeTID'''(oldtid, newtid) ''(since Nov 14 2015)''
 
*421:'''Thing_ChangeTID'''(oldtid, newtid) ''(since Nov 14 2015)''
 
:Sets the TID of all things which currently have ''oldtid'' to the value ''newtid''. If ''oldtid'' is zero, it will change the TID of the activator.
 
:Sets the TID of all things which currently have ''oldtid'' to the value ''newtid''. If ''oldtid'' is zero, it will change the TID of the activator.
*422:'''Thing_Raise'''(tid) ''(since Feb 24 2016)''
 
:Resurrects all corpses having ''tid'' if they have room. They will retain their alignment (friend or foe) before their death. If ''tid'' is 0, it will resurrect the activator. Doesn't work on players.
 
*423:'''Thing_Stop'''(tid) ''(since Feb 24 2016)''
 
:Stops the movement of all things tagged ''tid''. If ''tid'' is 0, it will stop the activator. It works by resetting velocity to 0, which means that it will work against players, projectiles and other thrusted objects. It will not "paralyze" monsters because they use a different kind of movement.
 
*424:'''ThrustThing'''(angle, speed, reserved, tid) ''(since Feb 24 2016)''
 
:Pushes the thing in a direction using the specified speed. If ''tid'' is 0 it will push the activator. The argument ''reserved'' must be 0 and is intended to be used when Eternity has a working high-speed movement system. If the map is made for vanilla Hexen, it will only be activated from the front side; otherwise it will depend on the '''1SONLY''' [[ExtraData]] flag.
 
*425:'''ThrustThingZ'''(tid, speed, up_down, set_add) ''(since Feb 24 2016)''
 
:Pushes the things tagged ''tid'' vertically. The value from ''speed'' will be divided by 4 before being added to the thing's vertical speed. ''Up_down'' will cause the thing to be thrusted upwards if 0, downwards if 1. ''Set_add'' will cause the speed to override the current value if 0, or add to the current value if 1.
 
 
*426:'''DamageThing'''(damage, mod) ''(since Feb 24 2016)''
 
*426:'''DamageThing'''(damage, mod) ''(since Feb 24 2016)''
 
:Damages the activator. ''Mod'' is a means-of-death ([[damagetype]]), which can be used for custom obituaries and damage resistances. If ''damage'' is 0, it will actually do 10000 (gibbing) damage.
 
:Damages the activator. ''Mod'' is a means-of-death ([[damagetype]]), which can be used for custom obituaries and damage resistances. If ''damage'' is 0, it will actually do 10000 (gibbing) damage.
Line 434: Line 671:
 
*428:'''Thing_Destroy'''(tid, reserved, sectortag) ''(since Feb 24 2016)''
 
*428:'''Thing_Destroy'''(tid, reserved, sectortag) ''(since Feb 24 2016)''
 
:Causes 10000 damage to all things tagged ''tid''. Beware that, in accordance to Hexen, ''tid'' 0 will NOT affect the activator; for that use '''DamageThing'''. ''Reserved'' must be set to 0. ''Sectortag'' can be used to only kill things inside sectors with given tag.
 
:Causes 10000 damage to all things tagged ''tid''. Beware that, in accordance to Hexen, ''tid'' 0 will NOT affect the activator; for that use '''DamageThing'''. ''Reserved'' must be set to 0. ''Sectortag'' can be used to only kill things inside sectors with given tag.
 +
*478:'''Thing_Remove'''(tid)
 +
:Directly removes objects tagged ''tid'' from the game.
 
*469:'''HealThing'''(amount, maxhealth)
 
*469:'''HealThing'''(amount, maxhealth)
 
:Heals the activator by ''amount''. ''Maxhealth'' influences maximum health and only affects player activators. For monsters and other objects, the maximum health is always the spawn health. On players, ''maxhealth'' has the following meanings:
 
:Heals the activator by ''amount''. ''Maxhealth'' influences maximum health and only affects player activators. For monsters and other objects, the maximum health is always the spawn health. On players, ''maxhealth'' has the following meanings:
Line 439: Line 678:
 
:*If 1, it will heal the player up to the soulsphere maximum health (in default Doom) or the initial health + 100 (if no soulsphere is defined in current game mode)
 
:*If 1, it will heal the player up to the soulsphere maximum health (in default Doom) or the initial health + 100 (if no soulsphere is defined in current game mode)
 
:*Otherwise, it will heal the player up to ''maxhealth''.
 
:*Otherwise, it will heal the player up to ''maxhealth''.
 +
*227 (480) '''PointPush_SetForce'''(''tag'', ''tid'', ''amount'', ''use_line'')
 +
:Enables and sets wind for Boom push/pull source things. If ''tag'' is non-zero, it looks for such things inside a tagged sector. Only one push/pull thing will be used for each tagged sector. If ''tag'' is zero, it will enable pushing for things tagged ''tid''. ''Amount'' is the force, and depending on thing type, it will be attractive or repulsive. If ''use_line'' is 1, it will use the linedef length as amount, not the ''amount'' argument. Either the tagged sector (if ''tag'' is non-zero) or the sectors containing the ''tid'' things must have the Boom generalized wind special.
  
==Sectors==
+
===Sectors===
 +
{|class="wikitable sortable"
 +
! UDMF #
 +
! DOOM Format #
 +
! Static
 +
! Name
 +
! Arg1
 +
! Arg2
 +
! Arg3
 +
! Arg4
 +
! Arg5
 +
|-
 +
|| 48 || 482 || yes || [[Sector_Attach3dMidtex]] || line id || optional sector tag || use ceiling || ||
 +
|-
 +
|| 140 || 495 || || [[Sector_ChangeSound]] || tag || sequence id || || ||
 +
|-
 +
|| 185 || 470 || || [[Sector_SetRotation]] || tag || floor angle || ceiling angle || ||
 +
|-
 +
|| 186 || 472 || || [[Sector_SetCeilingPanning]] || tag || x integer || x fractional || y integer || y fractional
 +
|-
 +
|| 187 || 471 || || [[Sector_SetFloorPanning]] || tag || x integer || x fractional || y integer || y fractional
 +
|-
 +
|| 190 || 481 || yes || [[Static_Init (sky transfer)]] || tag || 255 || flip sky || ||
 +
|}
 
*470:'''Sector_SetRotation'''(tag, floor_angle, ceiling_angle)
 
*470:'''Sector_SetRotation'''(tag, floor_angle, ceiling_angle)
 
:Sets the floor and ceiling texture rotation of tagged sectors to the given values in degrees (0-360).
 
:Sets the floor and ceiling texture rotation of tagged sectors to the given values in degrees (0-360).
Line 447: Line 711:
 
*472:'''Sector_SetCeilingPanning'''(tag, x_int, x_frac, y_int, y_frac)
 
*472:'''Sector_SetCeilingPanning'''(tag, x_int, x_frac, y_int, y_frac)
 
:Same as Sector_SetFloorPanning, but for the ceiling texture.
 
:Same as Sector_SetFloorPanning, but for the ceiling texture.
==Slopes==
+
*'''Sector_SetFriction'''(tag, amount)
*455:'''Plane_Align'''(''floor'', ''ceiling'')
+
:Sets friction in the target sectors. Those sectors must have the Boom generalized friction special enabled to work. ''Amount'' is an optional argument. If 0, it will use the length of the linedef to specify friction. Otherwise, the friction will be settable by ''amount''. As a rule, smaller values than 100 mean sludge (high friction) and greater than 100 mean slippery surface (low friction).
:Only activated on map startup, it sets up slopes in front (1), back (2) or both (3) parts of a line, for ''floor'' and ''ceiling''.
+
*218 (457) '''Sector_SetWind'''(''tag'', ''strength'', ''angle'', ''flags'')
 +
:Creates wind in the tagged sectors, which, if Boom-style, must have the wind generalized special set. ''Flags'' can be the sum of the following values:
 +
:*1: if added, it will cause the wind to be defined by the linedef's length and direction, instead of the ''strength'' and ''angle'' ([[byte angle]]) parameters;
 +
:*2: if added, it will use Heretic-style winds, which have a slightly different behavior and scale, and will not require the Boom wind sector special to be set.
 +
*220 (479) '''Sector_SetCurrent'''(''tag'', ''strength'', ''angle'', ''flags'')
 +
:Similar to '''Sector_SetWind''', but meant for water flow setup, not air wind.
 +
 
 +
===Slopes===
 +
{|class="wikitable sortable"
 +
! UDMF #
 +
! DOOM Format #
 +
! Name
 +
! Arg1
 +
! Arg2
 +
! Arg3
 +
! Arg4
 +
! Arg5
 +
|-
 +
|| 118 || 493 || [[Plane_Copy]] || front floor tag || front ceiling tag || back floor tag || back ceiling tag || share slope
 +
|-
 +
|| 181 || 455 || [[Plane_Align]] || floor || ceiling || || ||
 +
|}
  
==Teleportation==
+
===Teleportation===
 +
{|class="wikitable sortable"
 +
! UDMF #
 +
! DOOM Format #
 +
! Name
 +
! Arg1
 +
! Arg2
 +
! Arg3
 +
! Arg4
 +
! Arg5
 +
|-
 +
|| 70 || 444 || [[Teleport]] || tid || sector tag || || ||
 +
|-
 +
|| 71 || 445 || [[Teleport_NoFog]] || tid || use angle || sector tag || keep height ||
 +
|-
 +
|| 215 || 446 || [[Teleport_Line]] || - || dest_id || flip || ||
 +
|}
 
*444:'''Teleport'''(tid, sector_tag, reserved)
 
*444:'''Teleport'''(tid, sector_tag, reserved)
 
:Teleports the activator. Depending on whether ''tid'' or ''sector_tag'' is nonzero, the behavior will be Hexen or Doom compatible. If ''tid'' is zero, then it will teleport like in Doom, into the first teleport destination found on sectors tagged ''sector_tag''.
 
:Teleports the activator. Depending on whether ''tid'' or ''sector_tag'' is nonzero, the behavior will be Hexen or Doom compatible. If ''tid'' is zero, then it will teleport like in Doom, into the first teleport destination found on sectors tagged ''sector_tag''.
Line 467: Line 768:
 
:Encapsulates the Boom line-teleporting functions. ''Dest_id'' is the tag of the target line. ''Flip'' will cause the user to rotate 180 degrees after teleporting.
 
:Encapsulates the Boom line-teleporting functions. ''Dest_id'' is the tag of the target line. ''Flip'' will cause the user to rotate 180 degrees after teleporting.
  
==Binary format specific==
+
===Portals===
 +
{|class="wikitable sortable"
 +
! UDMF #
 +
! DOOM Format #
 +
! Name
 +
! Arg1
 +
! Arg2
 +
! Arg3
 +
! Arg4
 +
! Arg5
 +
|-
 +
|| 9 || 450 || [[Line_Horizon]] || || || || ||
 +
|-
 +
|| 300 || 492 || [[Portal_Define]] || portal id || type || anchor line id || z parameter || flipped anchor
 +
|-
 +
|| 301 || 491 || [[Line_QuickPortal]] || visual-only || || || ||
 +
|}
 +
*'''Line_Horizon'''
 +
:Simple linedef specials which converts the middle part with a horizon portal which uses front sector's floor and ceiling.
 +
*'''Portal_Define'''
 +
:See the [[Portal_Define|linked article]] for its description.
 +
 
 +
*'''Line_QuickPortal'''(''non-interactive'')
 +
:Convenience linedef special to quickly create a portal between two areas, through a linedef's middle part. The two lines must be of equal length, and of opposite angles (if linked/interactive) or any angle if not linked. They must have the same, unique tag and the same ''non-interactive'' value, which is 0 for linked portals and 1 for two-way non-linked portals.
 +
 
 +
*'''Sector_SetPortal'''(''tag'', ''type'', ''plane'', ''misc'')
 +
:'''Only needed for easily converting old maps with portals'''. You can skip this part if you're designing a new UDMF map.
 +
:Only activates on map starts, this one sets a sector portal on floor and/or ceiling on the ''tag''ged sectors. See [[Portal]] for visual examples.
 +
:''Plane'' can be 0 (display portal on floor), 1 (display portal on ceiling), 2 (display portal on both);
 +
:''Type'' can be:
 +
:*0: anchored portal. This line must correspond to another line named "anchor", whose first 3 parameters are the same with this one, except that ''misc'' is 0 for the anchor, while the source line has ''misc'' 1.
 +
:*2: skybox portal. Uses the skybox camera object as a source, and displays the skybox (view of this camera) in tagged sectors.
 +
:*3: plane portal. Renders the ceiling texture of line's front sector at a fixed camera distance.
 +
:*4: horizon portal. Renders the floor and ceiling textures of line's front sector at relative camera distance, useful for infinite horizontal planes such as seas.
 +
:*6: linked portal. Interactive anchored portals (through which gameplay passes seamlessly). Has the same rule as anchored portals with regard to anchor lines. Requires consistent offsets if there are multiple linked portals in the map, otherwise linked portals are disabled.
 +
:''Type'' can also be used for copying already placed portals:
 +
:*1: copy the portal from a sector tagged with ''misc'' into the tagged sectors if ''tag'' is nonzero, or to the front sector if ''tag'' is 0.
 +
:*5: copy the portal from a sector tagged with ''misc'' into the tagged lines if ''tag'' is nonzero, or to the current line if ''tag'' is 0.
 +
:''Misc'' has values depending on the ''type'' chosen. It makes sense for anchored and linked portals (with 0 meaning source line, and 1 meaning anchor line) and it also has a meaning for the copy types (1 and 5) where it specifies the tag of the sector with portals to copy.
 +
 
 +
===Binary format specific===
 
*378:'''Line_SetIdentification'''(id)
 
*378:'''Line_SetIdentification'''(id)
:Sets the linedef identification number (separate from tag) to ''id''. Useful for various specials that use the line id.
+
:Sets the linedef identification number (separate from tag) to ''id''. Useful for various specials that use the line id. Do not use in UDMF.
 +
 
 +
===Property transfer===
 +
{|class="wikitable sortable"
 +
! UDMF #
 +
! DOOM Format #
 +
! Static
 +
! Name
 +
! Arg1
 +
! Arg2
 +
! Arg3
 +
! Arg4
 +
! Arg5
 +
|-
 +
|| 209 || 242 || yes || [[Transfer_Heights]] || tag || || || ||
 +
|-
 +
|| 210 || 213 || yes || [[Transfer_FloorLight]] || tag || || || ||
 +
|-
 +
|| 211 || 261 || yes || [[Transfer_CeilingLight]] || tag || || || ||
 +
|}
 +
*'''Transfer_FloorLight'''(tag)
 +
*'''Transfer_CeilingLight'''(tag)
 +
:These two are the same as the Boom special, but applicable in parameterized namespaces.
 +
*'''Transfer_Heights'''(tag, reserved)
 +
:This also acts like the Boom special 242. Argument ''reserved'' must be 0.
 +
*190 (481) '''Static_Init'''(''tag'', ''type'', ''flip_or_ceiling'', ''move_type'')
 +
:This is a multi-purpose special encapsulating several static specials from MBF and Boom. ''Tag'' is the tag of the target sector(s). ''Type'' can be 255 for MBF sky transfers. If ''flip_or_ceiling'' is 1, the sky will be flipped horizontally. If ''type'' is 255, ''move_type'' must be 0.
 +
 
 +
===Scrollers===
 +
{|class="wikitable sortable"
 +
! UDMF #
 +
! DOOM Format #
 +
! Name
 +
! Arg1
 +
! Arg2
 +
! Arg3
 +
! Arg4
 +
! Arg5
 +
|-
 +
|| 100 || 406 || [[Scroll_Texture_Left]] || amount || || || ||
 +
|-
 +
|| 101 || 407 || [[Scroll_Texture_Right]] || amount || || || ||
 +
|-
 +
|| 102 || 408 || [[Scroll_Texture_Up]] || amount || || || ||
 +
|-
 +
|| 103 || 409 || [[Scroll_Texture_Down]] || amount || || || ||
 +
|-
 +
|| 222 || 485 || [[Scroll_Texture_Model]] || line id || kind || || ||
 +
|-
 +
|| 223 || 484 || [[Scroll_Floor]] || tag || kind || move things || x || y
 +
|-
 +
|| 224 || 483 || [[Scroll_Ceiling]] || tag || kind || - || x || y
 +
|-
 +
|| 225 || 255 || [[Scroll_Texture_Offset]] || || || || ||
 +
|}
 +
*223 (484) '''Scroll_Floor'''(''tag'', ''kind'', ''scroll_things'', ''x'', ''y'')
 +
*224 (483) '''Scroll_Ceiling'''(''tag'', ''kind'', ''unused'', ''x'', ''y'')
 +
*222 (485) '''Scroll_Texture_Model'''(''line_id'', ''kind'')
 +
:These specials do standard Boom scrolling. ''Kind'' specifies if it's a static scroller (0), accelerative scroller (1) or displacement scroller (2), and 4 can be added to it to discard arguments ''x'' and ''y'' and instead use the linedef's vertex coordinates do determine the scrolling vector. ''Scroll_things'' only apples for '''Scroll_Floor''' and means simple visual scrolling (0), thing movement with static floor (1) or thing movement with floor (2). ''X'' and ''y'' are the velocity components with which to scroll, if ''kind'' is less than 4 (otherwise the line's size is used).
 +
 
 +
:'''Scroll_Texture_Model''' does wall texture scrolling according to line's vector relative to the target lines.
 +
*225 (255) '''Scroll_Texture_Offsets'''()
 +
:This scrolls the current linedef based on texture offsets.
 +
 
 +
===Pushers===
 +
{|class="wikitable sortable"
 +
! UDMF #
 +
! DOOM Format #
 +
! Name
 +
! Arg1
 +
! Arg2
 +
! Arg3
 +
! Arg4
 +
! Arg5
 +
|-
 +
|| 218 || 457 || [[Sector_SetWind]] || tag || force || angle || flags ||
 +
|-
 +
|| 219 || 223 || [[Sector_SetFriction]] || tag || || || ||
 +
|-
 +
|| 220 || 479 || [[Sector_SetCurrent]] || tag || force || angle || flags ||
 +
|-
 +
|| 227 || 480 || [[PointPush_SetForce]] || tag || tid || force || use line ||
 +
|}
  
==Exits==
+
===Exits===
 +
{|class="wikitable sortable"
 +
! UDMF #
 +
! DOOM Format #
 +
! Name
 +
! Arg1
 +
! Arg2
 +
! Arg3
 +
! Arg4
 +
! Arg5
 +
|-
 +
|| 74 || 449 || [[Teleport_NewMap]] || level number || || || ||
 +
|-
 +
|| 75 || 400 || [[Teleport_EndGame]] || || || || ||
 +
|-
 +
|| 179 || 462 || [[ChangeSkill]] || skill || || || ||
 +
|-
 +
|| 243 || 447 || [[Exit_Normal]] || || || || ||
 +
|-
 +
|| 244 || 448 || [[Exit_Secret]] || || || || ||
 +
|}
 
*400:'''Teleport_EndGame'''
 
*400:'''Teleport_EndGame'''
 
:Ends the game in victory.
 
:Ends the game in victory.
Line 483: Line 926:
 
:Changes the current difficulty level, where ''skill'' is from 0 (I'm too young to die) to 4 inclusive (Nightmare!).
 
:Changes the current difficulty level, where ''skill'' is from 0 (I'm too young to die) to 4 inclusive (Nightmare!).
  
 +
==See also==
 +
*[[ACS functions]]
 +
 +
[[Category:Editing]]
 
[[Category:Editing reference]]
 
[[Category:Editing reference]]

Revision as of 01:33, 25 July 2019

The parameterized linedefs types are Hexen-like action specials with arguments, whose purpose is to be more customizable than the Boom generalized types. When mapping in UDMF, you have to use these parameterized specials instead of the classic parameter-less ones. They're also used in Hexen format maps (which is necessary when Hexen is going to be supported in Eternity), though Hexen format is not recommended or fully supported for other maps than vanilla Hexen in Eternity. To use parameterized specials in classic (Doom) format maps, provide an ExtraData lump by attaching it via EMAPINFO to the map. ACS scripts can also call parameterized specials. They're meant to be as compatible as possible with the ZDoom implementation, so minimal changes to zspecial.acs are needed, though Eternity may have extensions of its own. Most likely however the base zspecial.acs is going to be updated for Eternity. Parameters are only limited to 0-255 in the Hexen format (and some specials may have some legacy workarounds for that interval), but otherwise they're in the normal integer range for other environments (UDMF, ExtraData, ACS). Some specials have never been added to ExtraData, because of their mere purpose being to work under the limits of the Hexen map format.

Each parameterized line special has a name and two associated numbers: one for UDMF, ACS and Hexen formats, and another one for ExtraData support, set this way to avoid conflicts with classic Boom specials (since it's possible to use their number in the editor instead of the 270 "ExtraData special"). If you only see one number mentioned in the documentation, then it's the UDMF number (for ExtraData it's preferred to use the names).

IMPORTANT: all reserved parameters must be set to 0. Failure to do so will result in your maps being broken in later Eternity versions! Also, for "flag" arguments, do not add or provide other values than in the intended range, for the same reason.

Back to Linedef types

General info

All sector tags, unless otherwise specified, have a special meaning if 0: that means to affect the sector behind the trigger linedef (like regular doors in vanilla Doom).

Thing tags (TIDs) have special meaning for values 0 and negative: 0 means activator, and -1 to -4 mean to affect players 1 to 4 (if present). Consider other negative values reserved and do not use them in your maps.

Specials

Doors

UDMF # ExtraData # Name Args Summary
10 302 Door_Close tag, speed, light_tag Closes a door.
11 301 Door_Open tag, speed, light_tag Opens a door.
12 300 Door_Raise tag, speed, delay, light_tag Opens a door temporarily.
13 429 Door_LockedRaise tag, speed, delay, lock, light_tag Opens a locked door.
105 304 Door_WaitRaise tag, speed, delay, timeoffset, light_tag Opens a door temporarily after a delay.
106 305 Door_WaitClose tag, speed, timeoffset, light_tag Closes a door after a delay.
249 303 Door_CloseWaitOpen tag, speed, delay_octics, light_tag Closes a door, waits a bit, then opens it back.
tag: Tag of sector to affect. If it's 0, then the sector behind the linedef will be activated, if applicable.
speed: How fast, in eights of units per tic, the door should move. Doom normal doors are as fast as 16, and blazing doors are 64.
delay: Time in tics (1/35 seconds) for the door before it returns to its opposite movement.
delay_octics: Delay, but expressed in octics, which is eighths of second (i.e. 8 octics = 1 second).
timeoffset: Time in tics before the door activates.
light_tag: Sector tag to receive light changes to maximum or minimum neighbor depending on whether the door is closed or opened.
lock: One of the lock identifiers to specify the key or set of keys.

Floor movement, earthquake

UDMF # ExtraData # Name Arg1 Arg2 Arg3 Arg4 Arg5
20 318 Floor_LowerByValue tag speed height change
21 309 Floor_LowerToLowest tag speed change
22 311 Floor_LowerToNearest tag speed change
23 317 Floor_RaiseByValue tag speed height change crush
24 306 Floor_RaiseToHighest tag speed change crush
25 310 Floor_RaiseToNearest tag speed change crush
28 451 Floor_RaiseAndCrush tag speed crush
35 - Floor_RaiseByValueTimes8 tag speed height change crush
36 - Floor_LowerByValueTimes8 tag speed height change
37 319 Floor_MoveToValue tag speed height neg change
46 452 Floor_CrushStop tag
66 321 Floor_LowerInstant tag - height change
67 320 Floor_RaiseInstant tag - height change crush
68 - Floor_MoveToValueTimes8 tag speed height neg change
120 375 Radius_Quake intensity duration damage radius tremor radius foci tid
138 397 Floor_Waggle tag height speed offset timer
200 464 Generic_Floor tag speed height target flags
228 475 Plat_RaiseAndStayTx0 tag speed lock out
230 476 Plat_UpByValueStayTx tag speed height
231 487 Plat_ToggleCeiling tag
235 466 Floor_TransferTrigger tag
236 467 Floor_TransferNumeric tag
238 312 Floor_RaiseToLowestCeiling tag speed change crush gap
240 315 Floor_RaiseByTexture tag speed change crush
242 416 Floor_LowerToHighest tag speed adjust force_adjust
250 431 Floor_Donut pillar tag pillar speed pool speed
256 307 Floor_LowerToHighestEE tag speed change
257 308 Floor_RaiseToLowest tag change crush
258 313 Floor_LowerToLowestCeiling tag speed change
259 314 Floor_RaiseToCeiling tag speed change crush gap
260 322 Floor_ToCeilingInstant tag change crush gap
261 316 Floor_LowerByTexture tag speed change
  • 431:Floor_Donut (pillar_tag, pillar_speed, surrounding_speed)
Does the donut movement behavior, allowing you to choose pillar speed and surrounding pool speed. The tag belongs to the pillar.
  • 397:Floor_Waggle ( tag, height, speed, offset, timer )
This special implements the sinusoidal floor motion from Hexen. Its tag and speed parameters bear similar properties to the other floor specials, but -
  • height - waggle amplitude in 1/8 units
  • offset - phase offset; how much to delay the waggle in relation to others (0 to 63, in byte angles)
  • timer - time in seconds the waggle lasts. Zero means permanent
  • 375:Radius_Quake (intensity, duration, damageradius, quakeradius, tid)
This special implements the earthquake effect, centred on the map spot with the given tid, with user-selectable intensity, duration and separate thing damage radius and tremor radius (both being multiplied with 64).
  • 464:Generic_Floor(tag, speed, height, target, flags)
Encapsulates and applies Boom generalized specials, including all their peculiarities. Height applies only if it's set to move by a parameterized abount. Target has the following meanings: 0 (move by height), 1 (to highest neighbor floor), 2 (to lowest neighbor floor), 3 (to next neighbor floor), 4 (to lowest neighbor ceiling), 5 (to ceiling), 6 (by shortest lower texture). By default the floor moves down. To make it move up, add 8 to flags. To make it crush, add 16 to flags. To make it change floor texture, add 1 (zero special), 2 (keep special) or 3 (change special) to flags. In this case, by default it will use the trigger model. To make it use the numeric model, add 4 to flags.
It is recommended to use the other floor specials instead. Use this if you need some exact Boom behavior.
  • 452:Floor_CrushStop(tag)
For Hexen compatibility (and set to emulate Hexen bugs when run on classic Hexen maps), it stops any (and only) crushing floors from moving, and lets you apply other floor movement specials on those sectors (unlike crushing ceiling stoppers).
  • 451:Floor_RaiseAndCrush(tag, speed, crush)
This one is for Hexen compatibility. Please use Floor_RaiseToCeiling or Floor_RaiseToLowestCeiling instead.
  • 475:Plat_RaiseAndStayTx0(tag, speed, hereticemu)
This one is for Doom/Heretic compatibility. Raises a floor to the nearest neighbor and changes the texture and zeroes the type, according to the trigger model. If the sector is blocked by a thing, it will return to its initial position. Hereticemu emulates a Heretic bug where such lines would cause the sector to remain in stasis, with no possibility of being reused.
  • 476:Plat_UpByValueStayTX(tag, speed, distance)
This one is for Doom/Heretic compatibility. Raises a floor by distance * 8 units. If a thing blocks the sector, the sector will return to its initial position. The texture will be changed, but not the sector type.

See also

Plats, lifts

UDMF # DOOM Format # Name Arg1 Arg2 Arg3 Arg4 Arg5
60 410 Plat_PerpetualRaise tag speed delay
61 411 Plat_Stop tag stop_mode
62 412 Plat_DownWaitUpStay tag speed delay
63 413 Plat_DownByValue tag speed delay height
64 414 Plat_UpWaitDownStay tag speed delay
65 415 Plat_UpByValue tag speed delay height
206 488 Plat_DownWaitUpStayLip tag speed delay lip
207 489 Plat_PerpetualRaiseLip tag speed delay lip
  • 60 (410) Plat_PerpetualRaise(tag, speed, delay)
Starts a perpetual platform moving periodically between the lowest adjacent plus 8 units and highest adjacent neighbor floor. Important: this is not like the classic Doom special, and inherits the Hexen one. To act like Doom, use Plat_PerpetualRaiseLip with a lip of 0 units. The starting direction is decided randomly.
  • 207 (489) Plat_PerpetualRaiseLip(tag, speed, delay, lip)
Like Plat_PerpetualRaise, but lets you choose a "lip" (distance from lowest adjacent floor to move down to). If lip is 0, it will work like classic Doom perpetual plats.
  • 61 (411) Plat_Stop(tag, stop_mode)
Pauses or stops a perpetual platform from moving. The behavior depends on stop_mode:
  • 1: the platform will be merely suspended. It will only be retriggerable by other Plat_PerpetualRaise or Plat_PerpetualRaiseLip (or in Doom-format maps, by similar specials), continuing from the exact same state it stopped.
  • 2: the platform movement will be stopped at the current position. It will be retriggerable by any other special. If restarted by Plat_PerpetualRaise or Plat_PerpetualRaiseLip it may not remember the last state.
  • 0 (default): will act based on compatibility with current game mode. On Doom/Heretic/Hexen, it will act like mode 1, while in Hexen it will act like mode 2.
  • 62 (412) Plat_DownWaitUpStay(tag, speed, delay)
Lowers the plat as a lift to the lowest adjacent floor plus 8 units. Use Plat_DownWaitUpStayLip with 0 lip if you want classic Doom-like lifts.
  • 206 (488) Plat_DownWaitUpStayLip(tag, speed, delay, lip)
Like Plat_DownWaitUpStay but with settable lip.
  • 63 (413) Plat_DownByValue(tag, speed, delay, height)
Lowers a lift by an absolute height, multiplied by 8. It will rise back after delay tics.
  • 64 (414) Plat_UpWaitDownStay(tag, speed, delay)
Raises a lift to the highest neighbor floor. It will lower back after delay tics.
  • 65 (415) Plat_UpByValue(tag, speed, delay, height)
Raises a lift by an absolute height, multiplied by 8. It will lower back after delay tics.
  • 231 (487) Plat_ToggleCeiling(tag)
Toggles a floor between the default position and touching the ceiling. It will be left busy after that.

Elevators

UDMF # DOOM Format # Name Arg1 Arg2 Arg3 Arg4 Arg5
95 453 FloorAndCeiling_LowerByValue tag speed height
96 454 FloorAndCeiling_RaiseByValue tag speed height
245 458 Elevator_RaiseToNearest tag speed
246 460 Elevator_MoveToFloor tag speed
247 459 Elevator_LowerToNearest tag speed

Ceiling movement

UDMF # DOOM Format # Name Arg1 Arg2 Arg3 Arg4 Arg5
40 336 Ceiling_LowerByValue tag speed height change crush
41 335 Ceiling_RaiseByValue tag speed height change
42 432 Ceiling_CrushAndRaise tag speed crush crush mode
43 435 Ceiling_LowerAndCrush tag speed crush crush mode
44 433 Ceiling_CrushStop tag stop mode
45 434 Ceiling_CrushRaiseAndStay tag speed crush crush mode
47 337 Ceiling_MoveToValue tag speed height negate change
69 - Ceiling_MoveToValueTimes8 tag speed height negate change
97 436 Ceiling_LowerAndCrushDist tag speed crush gap crush mode
104 441 Ceiling_CrushAndRaiseSilentDist tag gap speed damage crush mode
168 437 Ceiling_CrushAndRaiseDist tag gap speed damage crush mode
192 330 Ceiling_LowerToHighestFloor tag speed change crush gap to floor
193 339 Ceiling_LowerInstant tag - height * 8 change crush
194 338 Ceiling_RaiseInstant tag - height * 8 change
195 438 Ceiling_CrushRaiseAndStayA tag down speed up speed damage crush mode
196 439 Ceiling_CrushAndRaiseA tag down speed up speed damage crush mode
197 440 Ceiling_CrushAndRaiseSilentA tag down speed up speed damage crush mode
198 - Ceiling_RaiseByValueTimes8 tag speed height * 8 change
199 - Ceiling_LowerByValueTimes8 tag speed height * 8 change crush
201 465 Generic_Ceiling tag speed height target flags
205 443 Generic_Crusher tag down speed up speed silent damage
252 325 Ceiling_RaiseToNearest tag speed change
253 328 Ceiling_LowerToLowest tag speed change crush
254 332 Ceiling_LowerToFloor tag speed change crush gap
255 442 Ceiling_CrushRaiseAndStaySilA tag down speed up speed damage crush mode
262 323 Ceiling_RaiseToHighest tag speed change
263 324 Ceiling_ToHighestInstant tag change crush
264 326 Ceiling_LowerToNearest tag speed change crush
265 327 Ceiling_RaiseToLowest tag speed change
266 329 Ceiling_RaiseToHighestFloor tag speed change
267 331 Ceiling_ToFloorInstant tag change crush gap
268 333 Ceiling_RaiseByTexture tag speed change
269 334 Ceiling_LowerByTexture tag speed change crush
  • 323:Ceiling_RaiseToHighest ( tag, speed, change )
  • 324:Ceiling_ToHighestInstant ( tag, change, crush )
  • 325:Ceiling_RaiseToNearest ( tag, speed, change )
  • 326:Ceiling_LowerToNearest ( tag, speed, change, crush )
  • 327:Ceiling_RaiseToLowest ( tag, speed, change )
  • 328:Ceiling_LowerToLowest ( tag, speed, change, crush )
  • 329:Ceiling_RaiseToHighestFloor ( tag, speed, change )
  • 330:Ceiling_LowerToHighestFloor ( tag, speed, change, crush, gap )
  • 331:Ceiling_ToFloorInstant ( tag, change, crush, gap )
  • 332:Ceiling_LowerToFloor ( tag, speed, change, crush, gap )
  • 333:Ceiling_RaiseByTexture ( tag, speed, change )
  • 334:Ceiling_LowerByTexture ( tag, speed, change, crush )
  • 335:Ceiling_RaiseByValue ( tag, speed, height, change )
  • 336:Ceiling_LowerByValue ( tag, speed, height, change, crush )
  • 337:Ceiling_MoveToValue ( tag, speed, height, change, crush )
  • 338:Ceiling_RaiseInstant ( tag, height, change )
  • 339:Ceiling_LowerInstant ( tag, height, change, crush )
Values for these specials:
  • tag: Tag of the sector(s) to affect. A tag of zero means to affect the sector on the second side of the line.
  • speed: Speed of ceiling in eighths of a unit per tic.
  • change: This parameter takes the following values:
0 : No texture or type change.
1 : Copy texture, zero type; trigger model.
2 : Copy texture, zero type; numeric model.
3 : Copy texture, preserve type; trigger model.
4 : Copy texture, preserve type; numeric model.
5 : Copy texture and type; trigger model.
6 : Copy texture and type; numeric model.
  • crush: Amount of crushing damage ceiling inflicts at each crushing event (when gametic % 4 = 0). If this amount is less than or equal to zero, no crushing damage is done.
  • height: An integer number of units, either the amount to move the floor by or the exact z coordinate to move the floor toward. Negative numbers are valid for the latter case.
  • gap: Distance to keep from the destination. Useful if crush is nonzero
  • 465:Generic_Ceiling(tag, speed, height, target, flag)
See Generic_Floor for an explanation of parameters.

Crushing ceilings

There are some crushing ceilings available now. Some originate from Hexen while others are extensions from ZDoom. ZDoom compatibility is considered where relevant. For all specials where it applies, crushmode can take one of these values:

  • 0: compatibility. Act like it would do in ZDoom. This means that in Doom the crusher keeps pushing into the things it crushes, while in Hexen it stays on position while dealing damage. And if the game is Doom, the special has "Dist" in the name and the speed is set to 8, it will also slow down to speed 1 when crushing.
  • 1: Doom mode without slowdown. Same as classic Doom's fast crushers.
  • 2: Hexen mode. It will rest in position while crushing.
  • 3: Doom mode with slowdown. Same as classic Doom's slow crushers. Currently the crushing speed is hardcoded to 1.

The specials are the following. Take care that Ceiling_CrushAndRaise is mainly for Hexen compatibility: it will rise at half the speed it lowers. For Doom-like crushers use Ceiling_CrushAndRaiseA (all "A" crushers let you specify the rising speed) or Ceiling_CrushAndRaiseDist (all "Dist" crushers rise at the same speed as they lower, but instead let you specify the gap size to the ground). Finally, Generic_Crusher aims to act like the Boom crushers, having the following particularities: it will slow down when crushing if speed is less than 24, and it will be totally silent if specified in the parameter (won't even make clunk noises).

  • 432: Ceiling_CrushAndRaise(tag, speed, damage, crushmode)
  • 439: Ceiling_CrushAndRaiseA(tag, down_speed, up_speed, damage, crushmode)
  • 440: Ceiling_CrushAndRaiseSilentA(tag, down_speed, up_speed, damage, crushmode)
  • 437: Ceiling_CrushAndRaiseDist(tag, ground_distance, speed, damage, crushmode)
  • 441: Ceiling_CrushAndRaiseSilentDist(tag, ground_distance, speed, damage, crushmode)
  • 434: Ceiling_CrushAndRaiseAndStay(tag, speed, damage, crushmode)
  • 438: Ceiling_CrushAndRaiseAndStayA(tag, down_speed, up_speed, damage, crushmode)
  • 442: Ceiling_CrushAndRaiseAndStaySilA(tag, down_speed, up_speed, damage, crushmode)
  • 435: Ceiling_LowerAndCrush(tag, speed, damage, crushmode)
  • 436: Ceiling_LowerAndCrushDist(tag, speed, damage, ground_distance, crushmode)
  • 433: Ceiling_CrushStop(tag, stop_mode)
  • stop_mode can be: 0 (compatibility), 1 (Doom: pause crusher), 2 (Hexen: remove crusher and release the ceiling)
  • 443: Generic_Crusher(tag, down_speed, up_speed, silent, damage)

Stair building

UDMF # DOOM Format # Name Arg1 Arg2 Arg3 Arg4 Arg5
217 340 Stairs_BuildUpDoom tag speed stepsize delay reset
270 341 Stairs_BuildDownDoom tag speed stepsize delay reset
271 342 Stairs_BuildUpDoomSync tag speed stepsize reset
272 343 Stairs_BuildDownDoomSync tag speed stepsize reset
------------------------------------------------------------------------------ 
* Synchronized stairs have each step move at a different speed so that all the
  steps reach the destination height at the same time. This stair building
  style is only available with these parameterized line types. 

Values
---------------------------------------------------------------
tag       : Tag of first sector to raise or lower as a step.
            When the stair building method is DOOM, subsequent
            steps are found by searching across two-sided
            lines where the first side belongs to the current
            sector and the floor texture is the same. The
            Hexen stair building method is not yet supported.
speed     : Speed of steps in eights of a unit per tic. If the
            build style is synchronized, only the first step
            moves at this speed. Other steps will move at a
            speed which allows them to reach their 
            destination height at the same time.
stepsize  : Step size in units.
delay     : Delay time in tics between steps
reset     : If greater than zero, the stairs will wait this
            amount of time in tics after completely building
            and will then reset by repeating the same stair
            building action but in the reverse direction. If
            zero, the stairs will never reset.
------------------------------------------------------------------------------

Polyobjects

UDMF # DOOM Format # Name Arg1 Arg2 Arg3 Arg4 Arg5
1 348 Polyobj_StartLine id mirror id sound sequence
2 356 Polyobj_RotateLeft id speed rotation
3 354 Polyobj_RotateRight id speed rotation
4 352 Polyobj_Move id speed angle distance
5 349 Polyobj_ExplicitLine id line index mirror id sound sequence
6 - Polyobj_MoveTimes8 id speed angle distance
7 351 Polyobj_DoorSwing id speed rotation delay
8 350 Polyobj_DoorSlide id speed angle distance delay
87 474 Polyobj_Stop id
90 357 Polyobj_OR_RotateLeft id speed rotation
91 355 Polyobj_OR_RotateRight id speed rotation
92 353 Polyobj_OR_Move id speed angle distance
93 - Polyobj_OR_MoveTimes8 id speed angle distance
  • 1 (348) Polyobj_StartLine(id, mirror_id, sequence_id)
  • 5 (349) Polyobj_ExplicitLine(id, linenum, mirror_id, sequence_id)
There are two different methods of creating a polyobject. In the first, the "first" line is given the Polyobj_StartLine special, and subsequent lines are added to the PolyObject by following segs from vertex to vertex. To use this, all the lines around the polyobject must run in the same direction, and the last line must end at the same vertex which starts the first line (in other words, it must be closed).
With the second method, every line to be included must be given the Polyobj_ExplicitLine special and must be given a linenum param which is unique amongst all lines that will added to that polyobject. Polyobjects of this sort should also be closed for proper rendering, but the game engine cannot and will not verify that this is the case.
Only polyobjects created with the Polyobj_StartLine method can have other line specials on the polyobject's lines themselves.
Mirror_id is the ID number of a PolyObject that wants to mirror every action that this PolyObject makes. This number cannot refer to the self-same PolyObject, nor should PolyObjects attempt to mirror each other in a cycle since this will create problems with override actions. Angle of motion is always reversed when applying an action to a mirroring PolyObject. If a mirror is already in motion for a non-override action, the mirror will not be affected even if the main object was moved. Mirror polyobjects can themselves define a mirror, and an action will affect all mirroring polyobjects in the chain.
  • 4 (352) Polyobj_Move(id, speed, angle, distance)
Slides a polyobject in the direction given in angle by distance.
  • 6 Polyobj_MoveTimes8(id, speed, angle, distance)
Like Polyobj_Move but with distance multiplied by 8. Needed only for the Hexen format and supported for legacy reasons.
  • 2 (356) Polyobj_RotateLeft(id, speed, distance)
Rotates a polyobject counterclockwise by the distance byte angle difference. If distance is 0, it means 360 degrees. If distance is 255, it means perpetual spinning.
  • 3 (354) Polyobj_RotateRight(id, speed, distance)
Rotates a polyobject clockwise by the distance byte angle difference. If distance is 0, it means 360 degrees. If distance is 255, it means perpetual spinning.
  • 92 (353) Polyobj_OR_Move(id, speed, angle, distance)
Like Polyobj_Move, but overrides the current movement.
  • 93 Polyobj_OR_MoveTimes8(id, speed, angle, distance)
Like Polyobj_MoveTimes8, but overrides the current movement.
  • 90 (357) Polyobj_OR_RotateLeft(id, speed, distance)
Like Polyobj_RotateLeft, but overrides the current movement.
  • 91 (355) Polyobj_OR_RotateRight(id, speed, distance)
Like Polyobj_RotateRight, but overrides the current movement.
  • 8 (350) Polyobj_DoorSlide(id, speed, angle, distance, delay)
Slides a polyobject like a door which closes after a delay and deflects if it gets jammed.
  • 7 (351) Polyobj_DoorSwing(id, speed, distance, delay)
Swings a polyobject like a door which closes after a delay and deflects if it gets jammed. There are no special behaviors for setting distance to 0 or 255, unlike Polyobj_RotateLeft and derivatives.
  • 87 (474) Polyobj_Stop(id)
Stops a polyobject from movement. It will then be free for other activations.

Pillar building

UDMF # DOOM Format # Name Arg1 Arg2 Arg3 Arg4 Arg5
29 362 Pillar_Build tag speed height
30 364 Pillar_Open tag speed floor dist ceil dist
94 363 Pillar_BuildAndCrush tag speed height damage
251 468 FloorAndCeiling_LowerRaise tag floor speed ceiling speed Boom emulation
------------------------------------------------------------------------------
#    Function                            ExtraData Name

362  Build pillar                        Pillar_Build
363  Build pillar and crush              Pillar_BuildAndCrush
364  Open pillar                         Pillar_Open 

Parameters
---------------------------------------------------------------
Pillar_Build                  tag, speed, height
Pillar_BuildAndCrush          tag, speed, height, crush
Pillar_Open                   tag, speed, fdist, cdist

Values
---------------------------------------------------------------
tag       : Tag of sector to close or open as a pillar. For the
            action to succeed, neither surface may have an 
            action running on it already. If the tag is zero,
            the sector on the backside of a 2S line with this
            special will be used.
speed     : Speed of the surface with the greatest distance to
            move in eights of a unit per tic. The other surface
            will move at a speed which causes it to reach its
            destination at the same time.
height    : For Build and BuildAndCrush types, this is the 
            height relative to the floor where the floor and 
            ceiling should meet. If this value is zero, the 
            floor and ceiling will meet exactly half-way.
crush     : For BuildAndCrush type only, this specifies the 
            amount of damage to inflict per crush event.
fdist     : For Open type only, this is the distance the floor
            should move down. If this value is zero, the floor
            will move to its lowest neighboring floor.
cdist     : For Open type only, this is the distance the
            ceiling should move up. If this value is zero, the
            ceiling will move to its highest neighboring 
            ceiling.          
------------------------------------------------------------------------------

ACS Scripts

UDMF # DOOM Format # Name Arg1 Arg2 Arg3 Arg4 Arg5
80 365 ACS_Execute script map arg1 arg2 arg3
81 366 ACS_Suspend script map
82 367 ACS_Terminate script map
83 430 ACS_LockedExecute script map arg1 arg2 lock id
84 420 ACS_ExecuteWithResult script arg1 arg2 arg3 arg4
85 490 ACS_LockedExecuteDoor script map arg1 arg2 lock id
226 477 ACS_ExecuteAlways script map arg1 arg2 arg3
This part incorporates text from the open-content ZDoom Wiki

Eternity supports ACS script calling.

  • 365:ACS_Execute(scriptnum, mapnum, arg0, arg1, arg2)
Executes the specified script. A map value of zero indicates that the script is on the current map. If the script is on a different map, then the execution of the script will be delayed until the player enters the map that contains it. Only one copy of a script can be running at a time when started with this special.
If the specified script was previously executed but then suspended, then execution will begin at the point immediately after where it was suspended instead of starting over again at the beginning.
The number of usable arguments is limited to 3.
  • 477:ACS_ExecuteAlways(scriptnum, mapnum, arg0, arg1, arg2)
Same as ACS_Execute, but will not be blocked if an instance of scriptnum is already running.
  • 366:ACS_Suspend(scriptnum, mapnum)
Suspends execution of a script until an ACS_Execute special resumes it.
  • 367:ACS_Terminate(scriptnum, mapnum)
Terminates the script.
  • 430:ACS_LockedExecute(scriptnum, mapnum, arg1, arg2, lock) (since Feb 25 2016)
This one executes a script that requires the player to have a key or more. See Lock identifiers for info on what to put for the lock argument.

Lights

UDMF # DOOM Format # Name Arg1 Arg2 Arg3 Arg4 Arg5
110 368 Light_RaiseByValue tag level
111 369 Light_LowerByValue tag level
112 370 Light_ChangeToValue tag level
113 371 Light_Fade tag dest value tics
114 372 Light_Glow tag max min tics
115 373 Light_Flicker tag max min
116 374 Light_Strobe tag max value min value max time min time
232 463 Light_StrobeDoom tag max time min time
233 473 Light_MinNeighbor tag
234 461 Light_MaxNeighbor tag

If tag is 0, any such parameterized special will affect the sector behind the linedef, if applicable.

  • Light_MinNeighbor sets the lights in tagged sectors to their minimum neighbors' values.
  • Light_MaxNeighbor sets the lights in tagged sectors to their maximum neighbors' values.

Eternity supports the following light level controlling parameterized linedef specials. If tag is 0, any such parameterized special will affect the sector behind the linedef, if applicable.

  • 368:Light_RaiseByValue(tag, lvl)
Adds the lvl value to the light levels of tagged sectors, capping them to 255.
  • 369:Light_LowerByValue(tag, lvl)
Substracts the lvl value from the light levels of tagged sectors, limiting them to 0.
  • 370:Light_ChangeToValue(tag, lvl)
Sets the lvl value for the light level of tagged sectors, and caps it between 0 and 255 inclusive.
  • 371:Light_Fade(tag, destvalue, tics)
Makes the light level of tagged sectors gradually go to destvalue, for the given amount of tics. tics must be greater than 0.
  • 372:Light_Glow(tag, maxval, minval, tics)
Enables periodic glowing light effect on tagged sectors. tics is the duration between the extreme light levels and must be positive. The sequence starts by fading down.
  • 373:Light_Flicker(tag, maxval, minval)
Enables flickering light effect on tagged sectors.
  • 374:Light_Strobe(tag, maxval, minval, maxtime, mintime)
Enables strobing light effect on tagged sectors. Light will periodically flash, staying at maxval level for maxtime tics and at minval level for mintime tics.
  • 463:Light_StrobeDoom(tag, maxtime, mintime)
Enables strobing light effect on tagged sectors, using Doom's logic of choosing the minimum and maximum light levels.
  • 473:Light_MinNeighbor(tag)
Sets the lights in tagged sectors to their minimum neighbors' values
  • 461:Light_MaxNeighbor(tag)
Sets the lights in tagged sectors to their maximum neighbors' values

Things

UDMF # DOOM Format # Name Arg1 Arg2 Arg3 Arg4 Arg5
17 422 Thing_Raise tid
19 423 Thing_Stop tid
72 424 ThrustThing angle speed - tid
73 426 DamageThing damage mod
119 427 Thing_Damage tid damage mod
128 425 ThrustThingZ tid speed up or down set or add
130 404 Thing_Activate tid
131 405 Thing_Deactivate tid
132 478 Thing_Remove tid
133 428 Thing_Destroy tid - sector tag
134 402 Thing_Projectile tid type angle speed vertical speed
135 398 Thing_Spawn tid type angle
136 403 Thing_ProjectileGravity tid type angle speed vertical speed
137 399 Thing_SpawnNoFog tid type angle
176 421 Thing_ChangeTID oldtid newtid
248 469 HealThing amount max health
  • 402:Thing_Projectile(tid, type, angle, speed, verticalspeed)
Throws a projectile from a map spot. Can also be used to throw a flying monster. Like in Thing_Spawn, type is an acs_spawndata num. Note that speed and verticalspeed are in eighths (units per 8 tics). Up is positive for verticalspeed.
  • 403:Thing_ProjectileGravity(tid, type, angle, speed, verticalspeed)
Same as above, but the thrown projectile or monster will be subject to gravity.
  • 421:Thing_ChangeTID(oldtid, newtid) (since Nov 14 2015)
Sets the TID of all things which currently have oldtid to the value newtid. If oldtid is zero, it will change the TID of the activator.
  • 426:DamageThing(damage, mod) (since Feb 24 2016)
Damages the activator. Mod is a means-of-death (damagetype), which can be used for custom obituaries and damage resistances. If damage is 0, it will actually do 10000 (gibbing) damage.
  • 427:Thing_Damage(tid, damage, mod) (since Feb 24 2016)
Same as DamageThing, but with the possibility to select TID (where 0 will mean the activator). It's done this way for ZDoom compatibility. Unlike DamageThing, it will not cause 10000 damage if damage is 0.
  • 428:Thing_Destroy(tid, reserved, sectortag) (since Feb 24 2016)
Causes 10000 damage to all things tagged tid. Beware that, in accordance to Hexen, tid 0 will NOT affect the activator; for that use DamageThing. Reserved must be set to 0. Sectortag can be used to only kill things inside sectors with given tag.
  • 478:Thing_Remove(tid)
Directly removes objects tagged tid from the game.
  • 469:HealThing(amount, maxhealth)
Heals the activator by amount. Maxhealth influences maximum health and only affects player activators. For monsters and other objects, the maximum health is always the spawn health. On players, maxhealth has the following meanings:
  • If 0, it will heal the player up to the initial health (such as the maximum medikit health in default Doom).
  • If 1, it will heal the player up to the soulsphere maximum health (in default Doom) or the initial health + 100 (if no soulsphere is defined in current game mode)
  • Otherwise, it will heal the player up to maxhealth.
  • 227 (480) PointPush_SetForce(tag, tid, amount, use_line)
Enables and sets wind for Boom push/pull source things. If tag is non-zero, it looks for such things inside a tagged sector. Only one push/pull thing will be used for each tagged sector. If tag is zero, it will enable pushing for things tagged tid. Amount is the force, and depending on thing type, it will be attractive or repulsive. If use_line is 1, it will use the linedef length as amount, not the amount argument. Either the tagged sector (if tag is non-zero) or the sectors containing the tid things must have the Boom generalized wind special.

Sectors

UDMF # DOOM Format # Static Name Arg1 Arg2 Arg3 Arg4 Arg5
48 482 yes Sector_Attach3dMidtex line id optional sector tag use ceiling
140 495 Sector_ChangeSound tag sequence id
185 470 Sector_SetRotation tag floor angle ceiling angle
186 472 Sector_SetCeilingPanning tag x integer x fractional y integer y fractional
187 471 Sector_SetFloorPanning tag x integer x fractional y integer y fractional
190 481 yes Static_Init (sky transfer) tag 255 flip sky
  • 470:Sector_SetRotation(tag, floor_angle, ceiling_angle)
Sets the floor and ceiling texture rotation of tagged sectors to the given values in degrees (0-360).
  • 471:Sector_SetFloorPanning(tag, x_int, x_frac, y_int, y_frac)
Sets the floor texture panning of tagged sectors to given X and Y values. A value is calculated as x_int + 0.01 * x_frac.
  • 472:Sector_SetCeilingPanning(tag, x_int, x_frac, y_int, y_frac)
Same as Sector_SetFloorPanning, but for the ceiling texture.
  • Sector_SetFriction(tag, amount)
Sets friction in the target sectors. Those sectors must have the Boom generalized friction special enabled to work. Amount is an optional argument. If 0, it will use the length of the linedef to specify friction. Otherwise, the friction will be settable by amount. As a rule, smaller values than 100 mean sludge (high friction) and greater than 100 mean slippery surface (low friction).
  • 218 (457) Sector_SetWind(tag, strength, angle, flags)
Creates wind in the tagged sectors, which, if Boom-style, must have the wind generalized special set. Flags can be the sum of the following values:
  • 1: if added, it will cause the wind to be defined by the linedef's length and direction, instead of the strength and angle (byte angle) parameters;
  • 2: if added, it will use Heretic-style winds, which have a slightly different behavior and scale, and will not require the Boom wind sector special to be set.
  • 220 (479) Sector_SetCurrent(tag, strength, angle, flags)
Similar to Sector_SetWind, but meant for water flow setup, not air wind.

Slopes

UDMF # DOOM Format # Name Arg1 Arg2 Arg3 Arg4 Arg5
118 493 Plane_Copy front floor tag front ceiling tag back floor tag back ceiling tag share slope
181 455 Plane_Align floor ceiling

Teleportation

UDMF # DOOM Format # Name Arg1 Arg2 Arg3 Arg4 Arg5
70 444 Teleport tid sector tag
71 445 Teleport_NoFog tid use angle sector tag keep height
215 446 Teleport_Line - dest_id flip
  • 444:Teleport(tid, sector_tag, reserved)
Teleports the activator. Depending on whether tid or sector_tag is nonzero, the behavior will be Hexen or Doom compatible. If tid is zero, then it will teleport like in Doom, into the first teleport destination found on sectors tagged sector_tag.
If tid is non-zero, it will teleport to one random target thing (doesn't matter the type) among the ones tagged tid. If in this case sector_tag is also non-zero, it will only seek a destination thing located in these tagged sectors. This behavior is based on the Hexen teleporters.
  • 445:Teleport_NoFog(tid, use_angle, sector_tag, keep_height)
Teleports the activator silently, without fog and without holding it. Tid and sector_tag are used the same as in Teleport.
Use_angle sets how the activator angle should be set after teleportation, and can take one of the following values:
  • 0: default Hexen behavior. The thing won't change its angle at all during teleportation.
  • 1: set thing's angle to the same angle as the one of the destination spot
  • 2: use Boom's original, buggy behavior: shift angle opposite to that of the difference between destination spot's angle and the line normal's angle
  • 3: use Boom's supposedly intended behavior: shift angle by the difference between destination spot's angle and line normal's angle.
If use_angle is 2 or 3 and the special is not triggered from a linedef, then it will work like mode 1.
Keep_height: setting this to 1 will make the thing preserve its distance to the floor after teleporting. If it's 0, the thing will be teleported on the floor, like in Hexen.
  • 446:Teleport_Line(reserved, dest_id, flip)
Encapsulates the Boom line-teleporting functions. Dest_id is the tag of the target line. Flip will cause the user to rotate 180 degrees after teleporting.

Portals

UDMF # DOOM Format # Name Arg1 Arg2 Arg3 Arg4 Arg5
9 450 Line_Horizon
300 492 Portal_Define portal id type anchor line id z parameter flipped anchor
301 491 Line_QuickPortal visual-only
  • Line_Horizon
Simple linedef specials which converts the middle part with a horizon portal which uses front sector's floor and ceiling.
  • Portal_Define
See the linked article for its description.
  • Line_QuickPortal(non-interactive)
Convenience linedef special to quickly create a portal between two areas, through a linedef's middle part. The two lines must be of equal length, and of opposite angles (if linked/interactive) or any angle if not linked. They must have the same, unique tag and the same non-interactive value, which is 0 for linked portals and 1 for two-way non-linked portals.
  • Sector_SetPortal(tag, type, plane, misc)
Only needed for easily converting old maps with portals. You can skip this part if you're designing a new UDMF map.
Only activates on map starts, this one sets a sector portal on floor and/or ceiling on the tagged sectors. See Portal for visual examples.
Plane can be 0 (display portal on floor), 1 (display portal on ceiling), 2 (display portal on both);
Type can be:
  • 0: anchored portal. This line must correspond to another line named "anchor", whose first 3 parameters are the same with this one, except that misc is 0 for the anchor, while the source line has misc 1.
  • 2: skybox portal. Uses the skybox camera object as a source, and displays the skybox (view of this camera) in tagged sectors.
  • 3: plane portal. Renders the ceiling texture of line's front sector at a fixed camera distance.
  • 4: horizon portal. Renders the floor and ceiling textures of line's front sector at relative camera distance, useful for infinite horizontal planes such as seas.
  • 6: linked portal. Interactive anchored portals (through which gameplay passes seamlessly). Has the same rule as anchored portals with regard to anchor lines. Requires consistent offsets if there are multiple linked portals in the map, otherwise linked portals are disabled.
Type can also be used for copying already placed portals:
  • 1: copy the portal from a sector tagged with misc into the tagged sectors if tag is nonzero, or to the front sector if tag is 0.
  • 5: copy the portal from a sector tagged with misc into the tagged lines if tag is nonzero, or to the current line if tag is 0.
Misc has values depending on the type chosen. It makes sense for anchored and linked portals (with 0 meaning source line, and 1 meaning anchor line) and it also has a meaning for the copy types (1 and 5) where it specifies the tag of the sector with portals to copy.

Binary format specific

  • 378:Line_SetIdentification(id)
Sets the linedef identification number (separate from tag) to id. Useful for various specials that use the line id. Do not use in UDMF.

Property transfer

UDMF # DOOM Format # Static Name Arg1 Arg2 Arg3 Arg4 Arg5
209 242 yes Transfer_Heights tag
210 213 yes Transfer_FloorLight tag
211 261 yes Transfer_CeilingLight tag
  • Transfer_FloorLight(tag)
  • Transfer_CeilingLight(tag)
These two are the same as the Boom special, but applicable in parameterized namespaces.
  • Transfer_Heights(tag, reserved)
This also acts like the Boom special 242. Argument reserved must be 0.
  • 190 (481) Static_Init(tag, type, flip_or_ceiling, move_type)
This is a multi-purpose special encapsulating several static specials from MBF and Boom. Tag is the tag of the target sector(s). Type can be 255 for MBF sky transfers. If flip_or_ceiling is 1, the sky will be flipped horizontally. If type is 255, move_type must be 0.

Scrollers

UDMF # DOOM Format # Name Arg1 Arg2 Arg3 Arg4 Arg5
100 406 Scroll_Texture_Left amount
101 407 Scroll_Texture_Right amount
102 408 Scroll_Texture_Up amount
103 409 Scroll_Texture_Down amount
222 485 Scroll_Texture_Model line id kind
223 484 Scroll_Floor tag kind move things x y
224 483 Scroll_Ceiling tag kind - x y
225 255 Scroll_Texture_Offset
  • 223 (484) Scroll_Floor(tag, kind, scroll_things, x, y)
  • 224 (483) Scroll_Ceiling(tag, kind, unused, x, y)
  • 222 (485) Scroll_Texture_Model(line_id, kind)
These specials do standard Boom scrolling. Kind specifies if it's a static scroller (0), accelerative scroller (1) or displacement scroller (2), and 4 can be added to it to discard arguments x and y and instead use the linedef's vertex coordinates do determine the scrolling vector. Scroll_things only apples for Scroll_Floor and means simple visual scrolling (0), thing movement with static floor (1) or thing movement with floor (2). X and y are the velocity components with which to scroll, if kind is less than 4 (otherwise the line's size is used).
Scroll_Texture_Model does wall texture scrolling according to line's vector relative to the target lines.
  • 225 (255) Scroll_Texture_Offsets()
This scrolls the current linedef based on texture offsets.

Pushers

UDMF # DOOM Format # Name Arg1 Arg2 Arg3 Arg4 Arg5
218 457 Sector_SetWind tag force angle flags
219 223 Sector_SetFriction tag
220 479 Sector_SetCurrent tag force angle flags
227 480 PointPush_SetForce tag tid force use line

Exits

UDMF # DOOM Format # Name Arg1 Arg2 Arg3 Arg4 Arg5
74 449 Teleport_NewMap level number
75 400 Teleport_EndGame
179 462 ChangeSkill skill
243 447 Exit_Normal
244 448 Exit_Secret
  • 400:Teleport_EndGame
Ends the game in victory.
  • 447:Exit_Normal(reserved)
Exits to a normal destination level. The argument is reserved and must be 0.
  • 448:Exit_Secret(reserved)
Exits to the secret destination level. The argument is reserved and must be 0.
  • 449:Teleport_NewMap(level_number, reserved, reserved)
Exits to the given map. The last two arguments are reserved and must be 0.
  • 462:ChangeSkill(skill)
Changes the current difficulty level, where skill is from 0 (I'm too young to die) to 4 inclusive (Nightmare!).

See also