Editing Parameterized linedef specials

From Eternity Wiki
Jump to navigationJump to search
Warning: You are not logged in. Your IP address will be publicly visible if you make any edits. If you log in or create an account, your edits will be attributed to your username, along with other benefits.

The edit can be undone. Please check the comparison below to verify that this is what you want to do, and then publish the changes below to finish undoing the edit.

Latest revision Your text
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. 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.
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.


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).
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.


'''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.
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!
{{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).


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.
==Doors==
==Specials==
*300:'''Door_Raise'''(''tag'', ''speed'', ''delay'', ''light_tag'')
===Doors===
*301:'''Door_Open'''(''tag'', ''speed'', ''light_tag'')
{|class="wikitable sortable"
*302:'''Door_Close'''(''tag'', ''speed'', ''light_tag'')
! UDMF #
*303:'''Door_CloseWaitOpen'''(''tag'', ''speed'', ''delay'', ''light_tag'')
! ExtraData #
*304:'''Door_WaitRaise'''(''tag'', ''speed'', ''delay'', ''timeoffset'', ''light_tag'')
! Name
*305:'''Door_WaitClose'''(''tag'', ''speed'', ''timeoffset'', ''light_tag'')
! Args
*429:'''Door_LockedRaise'''(''tag'', ''speed'', ''delay'', ''lock'', ''light_tag'') ''(since Feb 25 2016)''
! 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==
{|class="wikitable sortable"
*306:'''Floor_RaiseToHighest''' ( tag, speed, change, crush )
! UDMF #
*307:'''Floor_LowerToHighest''' ( tag, speed, change )
! ExtraData #
*308:'''Floor_RaiseToLowest''' ( tag, change, crush )
! Name
*309:'''Floor_LowerToLowest''' ( tag, speed, change )
! Arg1
*310:'''Floor_RaiseToNearest''' ( tag, speed, change, crush )
! Arg2
*311:'''Floor_LowerToNearest''' ( tag, speed, change )
! Arg3
*312:'''Floor_RaiseToLowestCeiling''' ( tag, speed, change, crush )
! Arg4
*313:'''Floor_LowerToLowestCeiling''' ( tag, speed, change )
! Arg5
*314:'''Floor_RaiseToCeiling''' ( tag, speed, change, crush )
! Description
*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''
*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.
|| 46 || 452 || [[Floor_CrushStop]] || ''tag'' || || || || || Stops crushing floor movement.
|-
|| 66 || 321 || [[Floor_LowerInstant]] || ''tag'' || - || ''height'' || ''change'' || || Lowers floor instantly.
|-
|| 67 || 320 || [[Floor_RaiseInstant]] || ''tag'' || - || ''height'' || ''change'' || ''crush'' || Raises floor instantly.
|-
|| 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 || Boom-like generalized floor.
|-
|| 228 || 475 || [[Plat_RaiseAndStayTx0]] || tag || speed || lock out || || || Variation of [[Floor_RaiseToNearest]].
|-
|| 230 || 476 || [[Plat_UpByValueStayTx]] || tag || speed || height || || || Variation of [[Floor_RaiseByValue]]
|-
|| 231 || 487 || [[Plat_ToggleCeiling]] || tag || || || || || Toggles floor between ceiling and initial position.
|-
|| 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'' || || || Instantly lower floor to lowest neighbour.
|-
|| 258 || 313 || [[Floor_LowerToLowestCeiling]] || ''tag'' || ''speed'' || ''change'' || || || Lower floor to lowest ceiling.
|-
|| 259 || 314 || [[Floor_RaiseToCeiling]] || ''tag'' || ''speed'' || ''change'' || ''crush'' || ''gap'' || Raise floor to ceiling.
|-
|| 260 || 322 || [[Floor_ToCeilingInstant]] || ''tag'' || ''change'' || ''crush'' || ''gap'' || || Raise floor to ceiling instantly.
|-
|| 261 || 316 || [[Floor_LowerByTexture]] || ''tag'' || ''speed'' || ''change'' || || || Lower floor by shortest lower texture.
|-
|}
*397:'''Floor_Waggle''' ( tag, height, speed, offset, timer )
*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 -
:This special implements the sinusoidal floor motion from Hexen. Its tag and speed parameters bear similar properties to the other floor specials, but -
Line 125: Line 62:
*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).
*451:'''Floor_RaiseAndCrush'''(''tag'', ''speed'', ''crush'')
*[[Floor_TransferTrigger]]
:This one is for Hexen compatibility. Please use '''Floor_RaiseToCeiling''' or '''Floor_RaiseToLowestCeiling''' instead.
*[[Floor_TransferNumeric]]
====See also====
*[[Generic_Floor]]
*[[Floor movement classic specials]]: for the Doom format variants.


===Plats, lifts===
==Plats, lifts==
{|class="wikitable sortable"
:410:'''Plat_PerpetualRaise'''(''tag'', ''speed'', ''delay'')
! UDMF #
:411:'''Plat_Stop'''(''tag'')
! DOOM Format #
:412:'''Plat_DownWaitUpStay'''(''tag'', ''speed'', ''delay'')
! Name
:413:'''Plat_DownByValue'''(''tag'', ''speed'', ''delay'', ''height'')
! Arg1
:414:'''Plat_UpWaitDownStay'''(''tag'', ''speed'', ''delay'')
! Arg2
:415:'''Plat_UpByValue'''(''tag'', ''speed'', ''delay'', ''height'')
! Arg3
! Arg4
! Arg5
! Description
|-
|| 60 || 410 || [[Plat_PerpetualRaise]] || tag || speed || delay || || || Perpetual lift with lip of 8
|-
|| 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 ||
|-
|| 203 || 501 || [[Generic_Lift]] || tag || speed || delay || type || height ||
|-
|| 206 || 488 || [[Plat_DownWaitUpStayLip]] || tag || speed || delay || lip ||
|-
|| 207 || 489 || [[Plat_PerpetualRaiseLip]] || tag || speed || delay || lip ||
|}
*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===
==Ceiling movement==
{|class="wikitable sortable"
------------------------------------------------------------------------------
! UDMF #
#    Function                          ExtraData Name
! DOOM Format #
! Name
323 Up to Highest Neighbor Ceiling    Ceiling_RaiseToHighest
! Arg1
324 Up to HnC Instant                  Ceiling_ToHighestInstant
! Arg2
325  Up to Nearest Neighbor Ceiling    Ceiling_RaiseToNearest
! Arg3
326 Down to Nearest Neighbor Ceiling  Ceiling_LowerToNearest
! Arg4
327 Up to Lowest Neighbor Ceiling      Ceiling_RaiseToLowest
! Arg5
328  Down to Lowest Neighbor Ceiling    Ceiling_LowerToLowest
|-
329 Up to Highest Neighbor Floor      Ceiling_RaiseToHighestFloor
|| 95 || 453 || [[FloorAndCeiling_LowerByValue]] || ''tag'' || ''speed'' || ''height'' || ||
330  Down to Highest Neighbor Floor    Ceiling_LowerToHighestFloor
|-
331 Down to Floor Instant              Ceiling_ToFloorInstant
|| 96 || 454 || [[FloorAndCeiling_RaiseByValue]] || ''tag'' || ''speed'' || ''height'' || ||
332  Down to Floor                      Ceiling_LowerToFloor
|-
333 Up Abs Shortest Upper Texture      Ceiling_RaiseByTexture
|| 245 || 458 || [[Elevator_RaiseToNearest]] || ''tag'' || ''speed'' || || ||
334 Down Abs Shortest Upper Texture    Ceiling_LowerByTexture
|-
335  Up Absolute Param                  Ceiling_RaiseByValue
|| 246 || 460 || [[Elevator_MoveToFloor]] || ''tag'' || ''speed'' || || ||
336  Down Absolute Param                Ceiling_LowerByValue
|-
337  To Absolute Height                Ceiling_MoveToValue
|| 247 || 459 || [[Elevator_LowerToNearest]] || ''tag'' || ''speed'' || || ||
338  Up Absolute Param, Instant        Ceiling_RaiseInstant
|}
339  Down Absolute Param, Instant      Ceiling_LowerInstant
 
===Ceiling movement===
Parameters
{|class="wikitable sortable"
---------------------------------------------------------------
! UDMF #
Ceiling_RaiseToHighest       tag, speed, change
! DOOM Format #
Ceiling_ToHighestInstant     tag, change, crush
! Name
Ceiling_RaiseToNearest       tag, speed, change
! Arg1
Ceiling_LowerToNearest       tag, speed, change, crush
! Arg2
Ceiling_RaiseToLowest       tag, speed, change
! Arg3
Ceiling_LowerToLowest       tag, speed, change, crush
! Arg4
Ceiling_RaiseToHighestFloor tag, speed, change
! Arg5
Ceiling_LowerToHighestFloor tag, speed, change, crush
|-
Ceiling_ToFloorInstant       tag, change, crush, gap
|| 38 || 500 || [[Ceiling_Waggle]] || tag || height || speed || offset || timer
Ceiling_LowerToFloor         tag, speed, change, crush, gap
|-
Ceiling_RaiseByTexture       tag, speed, change
|| 40 || 336 || [[Ceiling_LowerByValue]] || tag || speed || height || change || crush
Ceiling_LowerByTexture       tag, speed, change, crush
|-
Ceiling_RaiseByValue         tag, speed, height, change
|| 41 || 335 || [[Ceiling_RaiseByValue]] || tag || speed || height || change ||
Ceiling_LowerByValue         tag, speed, height, change, crush
|-
Ceiling_MoveToValue         tag, speed, height, change, crush
|| 42 || 432 || [[Ceiling_CrushAndRaise]] || tag || speed || crush || crush mode ||
Ceiling_RaiseInstant         tag, height, change
|-
Ceiling_LowerInstant         tag, height, change, crush  
|| 43 || 435 || [[Ceiling_LowerAndCrush]] || tag || speed || crush || crush mode ||
|-
Values
|| 44 || 433 || [[Ceiling_CrushStop]] || tag || stop mode || || ||
---------------------------------------------------------------
|-
tag   : Tag of the sector(s) to affect. A tag of zero means to
|| 45 || 434 || [[Ceiling_CrushRaiseAndStay]] || tag || speed || crush || crush mode ||
          affect the sector on the second side of the line.
|-
speed : Speed of ceiling in eighths of a unit per tic.
|| 47 || 337 || [[Ceiling_MoveToValue]] || tag || speed || height || negate || change
change : This parameter takes the following values:
|-
          0 : No texture or type change.
|| 69 || - || [[Ceiling_MoveToValueTimes8]] || tag || speed || height || negate || change
          1 : Copy texture, zero type; trigger model.
|-
          2 : Copy texture, zero type; numeric model.
|| 97 || 436 || [[Ceiling_LowerAndCrushDist]] || tag || speed || crush || gap || crush mode
          3 : Copy texture, preserve type; trigger model.
|-
          4 : Copy texture, preserve type; numeric model.
|| 104 || 441 || [[Ceiling_CrushAndRaiseSilentDist]] || tag || gap || speed || damage || crush mode
          5 : Copy texture and type; trigger model.
|-
          6 : Copy texture and type; numeric model.
|| 168 || 437 || [[Ceiling_CrushAndRaiseDist]] || tag || gap || speed || damage || crush mode
crush : Amount of crushing damage ceiling inflicts at each
|-
          crushing event (when gametic % 4 = 0). If this
|| 192 || 330 || [[Ceiling_LowerToHighestFloor]] || tag || speed || change || crush || gap to floor
          amount is less than or equal to zero, no crushing
|-
          damage is done.
|| 193 || 339 || [[Ceiling_LowerInstant]] || tag || - || height * 8 || change || crush
height : An integer number of units, either the amount to  
|-
          move the floor by or the exact z coordinate to move
|| 194 || 338 || [[Ceiling_RaiseInstant]] || tag || - || height * 8 || change ||
          the floor toward. Negative numbers are valid for  
|-
          the latter case.
|| 195 || 438 || [[Ceiling_CrushRaiseAndStayA]] || tag || down speed || up speed || damage || crush mode
gap   : Distance to keep from the destination. Useful if crush
|-
          is nonzero
|| 196 || 439 || [[Ceiling_CrushAndRaiseA]] || tag || down speed || up speed || damage || crush mode
------------------------------------------------------------------------------
|-
*465:[[Generic_Ceiling]]
|| 197 || 440 || [[Ceiling_CrushAndRaiseSilentA]] || tag || down speed || up speed || damage || crush mode
===Crushing ceilings===
|-
|| 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:
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 332: Line 158:
*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, stop_mode)
*433: Ceiling_CrushStop(tag)
:*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"
  ------------------------------------------------------------------------------
! UDMF #
#    Function                            ExtraData Name
! DOOM Format #
! Name
340  Build stairs up, DOOM method        Stairs_BuildUpDoom
! Arg1
341  Build stairs down, DOOM method      Stairs_BuildDownDoom
! Arg2
342  Build stairs up sync*, DOOM method  Stairs_BuildUpDoomSync
! Arg3
343  Build stairs dn sync*, DOOM method  Stairs_BuildDownDoomSync
! Arg4
! Arg5
|-
|| 204 || 502 || [[Generic_Stairs]] || ''tag'' || ''speed'' || ''height'' || ''flags'' || ''reset''
|-
|| 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 382: Line 201:
             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===
{|class="wikitable sortable"
348 Marks first line in PolyObject*    Polyobj_StartLine
! UDMF #
349 Explicitly includes a line*        Polyobj_ExplicitLine
! DOOM Format #
350  Open PolyObject as sliding door    Polyobj_DoorSlide
! Name
351 Open PolyObject as swinging door    Polyobj_DoorSwing
! Arg1
352  Move PolyObject in xy plane        Polyobj_Move
! Arg2
353  Move PolyObject w/override**        Polyobj_OR_Move
! Arg3
354  Rotate PolyObject right            Polyobj_RotateRight
! Arg4
355  Rotate PolyObject right w/override  Polyobj_OR_RotateRight
! Arg5
356  Rotate PolyObject left              Polyobj_RotateLeft
|-
357  Rotate PolyObject left w/override  Polyobj_OR_RotateLeft
|| 1 || 348 || [[Polyobj_StartLine]] || id || mirror id || sound sequence || ||
474 Stop PolyObject***                  Polyobj_Stop
|-
|| 2 || 356 || [[Polyobj_RotateLeft]] || id || speed || rotation || ||
* There are two different methods of creating a PolyObject. In the first,
|-
  the "first" line is given the Polyobj_StartLine special, and subsequent
|| 3 || 354 || [[Polyobj_RotateRight]] || id || speed || rotation || ||
  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
|| 4 || 352 || [[Polyobj_Move]] || id || speed || angle || distance ||
  direction, and the last line must end at the same vertex which starts the
|-
  first line (in other words, it must be closed).
|| 5 || 349 || [[Polyobj_ExplicitLine]] || id || line index || mirror id || sound sequence ||
 
|-
  With the second method, every line to be included must be given the
|| 6 || - || [[Polyobj_MoveTimes8]] || id || speed || angle || distance ||
  Polyobj_ExplicitLine special and must be given a linenum param which is
|-
  unique amongst all lines that will added to that polyobject. Polyobjects
|| 7 || 351 || [[Polyobj_DoorSwing]] || id || speed || rotation || delay ||
  of this sort should also be closed for proper rendering, but the game
|-
  engine cannot and will not verify that this is the case.
|| 8 || 350 || [[Polyobj_DoorSlide]] || id || speed || angle || distance || delay
 
|-
  Only PolyObjects created with the Polyobj_StartLine method can have other
|| 59 || 499 || [[Polyobj_OR_MoveToSpot]] || id || speed || [[TID]] || ||
  line specials on the PolyObject's lines themselves.
|-
|| 86 || 496 || [[Polyobj_MoveToSpot]] || id || speed || [[TID]] || ||
** Override types will take effect even if an action is already affecting the
|-
  specified polyobject. Normal actions will fail in this case.
|| 87 || 474 || [[Polyobj_Stop]] || id || || || ||
|-
*** This will stop a polyobject from its action, leaving it free for other movement.
|| 88 || 497 || [[Polyobj_MoveTo]] || id || speed || x || y ||
|-
Parameters
|| 89 || 498 || [[Polyobj_OR_MoveTo]] || id || speed || x || y ||
------------------------------------------------------------------
|-
Polyobj_StartLine      polyobj_id, mirror_id, sndseq_id
|| 90 || 357 || [[Polyobj_OR_RotateLeft]] || id || speed || rotation || ||
Polyobj_ExplicitLine    polyobj_id, linenum, mirror_id, sndseq_id
|-
Polyobj_DoorSlide      polyobj_id, speed, angle, dist, delay
|| 91 || 355 || [[Polyobj_OR_RotateRight]] || id || speed || rotation || ||
Polyobj_DoorSwing      polyobj_id, aspeed, adist, delay
|-
Polyobj_Move            polyobj_id, speed, angle, dist
|| 92 || 353 || [[Polyobj_OR_Move]] || id || speed || angle || distance ||
Polyobj_OR_Move        polyobj_id, speed, angle, dist
|-
Polyobj_RotateRight    polyobj_id, aspeed, adist
|| 93 || - || [[Polyobj_OR_MoveTimes8]] || id || speed || angle || distance ||
Polyobj_OR_RotateRight  polyobj_id, aspeed, adist
|}
Polyobj_RotateLeft      polyobj_id, aspeed, adist
*1 (348) '''Polyobj_StartLine'''(''id'', ''mirror_id'', ''sequence_id'')
Polyobj_OR_RotateLeft  polyobj_id, aspeed, adist
*5 (349) '''Polyobj_ExplicitLine(''id'', ''linenum'', ''mirror_id'', ''sequence_id'')
Polyobj_Stop            polyobj_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).
 
Values
: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.
---------------------------------------------------------------
polyobj_id : ID number of the PolyObject of which this line is
              a part. PolyObject ID numbers are defined in the
              angle field of their EEPolyObjSpawnSpot object
              (DoomEd numbers 9301 or 9302). Every PolyObject
              must be given a valid unique ID number greater
              than zero.
mirror_id  : 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.
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)
    
    
:Only polyobjects created with the '''Polyobj_StartLine''' method can have other line specials on the polyobject's lines themselves.
  To convert from degrees to byte angles, use the following calculation:
 
 
:''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.
  byteangle = (degrees * 256) / 360
*4 (352) '''Polyobj_Move'''(''id'', ''speed'', ''angle'', ''distance'')
:Slides a polyobject in the direction given in ''angle'' by ''distance''.
  Chop or round the result to an integer.
*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.
  Valid byte angles fall between 0 and 255, so adjust any angles less than
*2 (356) '''Polyobj_RotateLeft'''(''id'', ''speed'', ''distance'')
  0 or greater than or equal to 360 before performing this conversion.
: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'')
** For the adist parameter to Polyobj_Rotate-type specials (excluding
: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.
    Polyobj_DoorSwing), the values 0 and 255 have the following special
*92 (353) '''Polyobj_OR_Move'''(''id'', ''speed'', ''angle'', ''distance'')
    meanings:
:Like '''Polyobj_Move''', but overrides the current movement.
  0  == The PolyObject will rotate exactly 360 degrees.
*93 '''Polyobj_OR_MoveTimes8'''(''id'', ''speed'', ''angle'', ''distance'')
  255 == The PolyObject will rotate perpetually.
:Like '''Polyobj_MoveTimes8''', but overrides the current movement.
  All other byte angle values have their normal meaning.
*90 (357) '''Polyobj_OR_RotateLeft'''(''id'', ''speed'', ''distance'')
------------------------------------------------------------------------------
:Like '''Polyobj_RotateLeft''', but overrides the current movement.
*91 (355) '''Polyobj_OR_RotateRight'''(''id'', ''speed'', ''distance'')
==Pillar building==
: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===
{|class="wikitable sortable"
! 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
  #    Function                            ExtraData Name
Line 519: Line 357:
  ------------------------------------------------------------------------------
  ------------------------------------------------------------------------------
*[[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 551: Line 364:
: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 560: Line 371:
: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 615: Line 391:
*473:'''Light_MinNeighbor'''(''tag'')
*473:'''Light_MinNeighbor'''(''tag'')
:Sets the lights in tagged sectors to their minimum neighbors' values
: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===
==Things==
{|class="wikitable sortable"
*398:'''Thing_Spawn'''(tid, type, angle)
! UDMF #
: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.
! DOOM Format #
*399:'''Thing_SpawnNoFog'''(tid, type, angle)
! Name
:Similar to above, but without teleportation fog.
! 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 || new_tid ||
|-
|| 136 || 403 || [[Thing_ProjectileGravity]] || tid || type || angle || speed || vertical speed
|-
|| 137 || 399 || [[Thing_SpawnNoFog]] || tid || type || angle || new_tid ||
|-
|| 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 673: Line 421:
*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 680: Line 426:
:*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 713: Line 434:
*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.
*'''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===
{|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 770: Line 451:
: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.


===Portals===
==Binary format specific==
{|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. Do not use in UDMF.
:Sets the linedef identification number (separate from tag) to ''id''. Useful for various specials that use the line id.
 
===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===
==Exits==
{|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 || ExtraData only || [[Scroll_Texture_Offsets]]
|}
*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), displacement scroller (1) or accelerative 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.
 
===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===
{|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 entire game in victory. This triggers the current game's assigned ending cutscene and the player can only choose to start a new game.
:Ends the game in victory.
*447:'''Exit_Normal'''(reserved)
*447:'''Exit_Normal'''(reserved)
:Exits to a normal destination level. The argument is reserved and must be 0.
:Exits to a normal destination level. The argument is reserved and must be 0.
Line 923: Line 464:
*449:'''Teleport_NewMap'''(level_number, reserved, reserved)
*449:'''Teleport_NewMap'''(level_number, reserved, reserved)
:Exits to the given map.  The last two arguments are reserved and must be 0.
: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==
*[[ACS functions]]


[[Category:Editing]]
[[Category:Editing reference]]
[[Category:Editing reference]]
Please note that all contributions to Eternity Wiki are considered to be released under the GNU Free Documentation License 1.2 (see Eternity Wiki:Copyrights for details). If you do not want your writing to be edited mercilessly and redistributed at will, then do not submit it here.
You are also promising us that you wrote this yourself, or copied it from a public domain or similar free resource. Do not submit copyrighted work without permission!
Cancel Editing help (opens in new window)

Templates used on this page: