User:MascaraSnake/UDMF/Specification
These are my notes on the in-progress UDMF specification for SRB2. Keep in mind that this was written before v2.2's release and may in part be outdated.
Contents
Subpages
- Setup of linedef types: /Linedef types
- Setup of Thing types: /Thing types
- Setup of sector types: /Sector types
Standardized fields
Any valid UDMF implementation must recognize these fields, although it's allowed to just ignore the ones that aren't used.
Linedef
Name | Type | Description | Default | Do we need this? |
---|---|---|---|---|
id | Integer | Tag | -1 | Yes |
v1 | Integer | Index of first vertex | none | Yes |
v2 | Integer | Index of second vertex | none | Yes |
blocking | Boolean | Impassable flag | false | Yes |
blockmonsters | Boolean | Block Enemies flag | false | Yes |
twosided | Boolean | Double-Sided flag | false | Yes |
dontpegtop | Boolean | Upper Unpegged flag | false | Yes |
dontpegbottom | Boolean | Lower Unpegged flag | false | Yes |
secret | Boolean | Flag: Drawn as one-sided on automap | false | No |
blocksound | Boolean | Flag: Blocks sound | false | No |
dontdraw | Boolean | Flag: Not drawn on automap | false | No |
mapped | Boolean | Flag: Always drawn on automap | false | No |
passuse | Boolean | Boom flag: Passes use action | false | No |
translucent | Boolean | Strife flag: Translucent | false | No |
jumpover | Boolean | Strife flag: Railing | false | No |
blockfloaters | Boolean | Strife flag: Blocks floating monsters | false | No |
playercross | Boolean | ZDoom special activator flag: Activated when crossed by player | false | No |
playeruse | Boolean | ZDoom special activator flag: Activated when used by player | false | No |
monstercross | Boolean | ZDoom special activator flag: Activated when crossed by monster | false | No |
monsteruse | Boolean | ZDoom special activator flag: Activated when used by monster | false | No |
impact | Boolean | ZDoom special activator flag: Activated when hit by projectile | false | No |
playerpush | Boolean | ZDoom special activator flag: Activated when pushed by player | false | No |
monsterpush | Boolean | ZDoom special activator flag: Activated when pushed by monster | false | No |
missilecross | Boolean | ZDoom special activator flag: Activated when crossed by projectile | false | No |
repeatspecial | Boolean | ZDoom special activator flag: Can be activated repeatedly | false | No |
special | Integer | Linedef action aka linedef type | 0 | Yes |
arg0 | Integer | Action argument 0 | 0 | Yes |
arg1 | Integer | Action argument 1 | 0 | Yes |
arg2 | Integer | Action argument 2 | 0 | Yes |
arg3 | Integer | Action argument 3 | 0 | Yes |
arg4 | Integer | Action argument 4 | 0 | Yes |
sidefront | Integer | Front sidedef index | none | Yes |
sideback | Integer | Back sidedef index | -1 | Yes |
comment | String | Comment field for mappers | empty | Yes |
Sidedef
Name | Type | Description | Default | Do we need this? |
---|---|---|---|---|
offsetx | Integer | Texture X offset | 0 | Yes |
offsety | Integer | Texture Y offset | 0 | Yes |
texturetop | String | Upper texture | - | Yes |
texturebottom | String | Lower texture | - | Yes |
texturemiddle | String | Middle texture | - | Yes |
sector | String | Sector index | none | Yes |
comment | String | Comment field for mappers | empty | Yes |
Vertex
Name | Type | Description | Default | Do we need this? |
---|---|---|---|---|
x | Float | X coordinate | none | Yes |
y | Float | Y coordinate | none | Yes |
Sector
Name | Type | Description | Default | Do we need this? |
---|---|---|---|---|
heightfloor | Integer | Floor height | 0 | Yes |
heightceiling | Integer | Ceiling height | 0 | Yes |
texturefloor | String | Floor flat | none | Yes |
textureceiling | String | Ceiling flat | none | Yes |
lightlevel | Integer | Light level | 160 | Yes |
special | Integer | Sector special aka sector type | 0 | Unclear |
id | Integer | Tag | 0 | Yes |
comment | String | Comment field for mappers | empty | Yes |
Thing
Name | Type | Description | Default | Do we need this? |
---|---|---|---|---|
id | Integer | Tag | 0 | Yes |
x | Float | X coordinate | none | Yes |
y | Float | Y coordinate | none | Yes |
height | Float | Height/Z position relative to the floor (or ceiling if flipped) | 0 | Yes |
angle | Integer | Angle in degrees | 0 | Yes |
type | Integer | Thing type | none | Yes |
skill1 | Boolean | Flag: Appears on skill level 1 | false | No |
skill2 | Boolean | Flag: Appears on skill level 2 | false | No |
skill3 | Boolean | Flag: Appears on skill level 3 | false | No |
skill4 | Boolean | Flag: Appears on skill level 4 | false | No |
skill5 | Boolean | Flag: Appears on skill level 5 | false | No |
ambush | Boolean | Ambush flag | false | Probably not? |
single | Boolean | Flag: Appears in Single Player mode | false | No |
dm | Boolean | Flag: Appears in Match mode | false | No |
coop | Boolean | Flag: Appears in Coop mode | false | No |
friend | Boolean | MBF flag: Friend | false | No |
dormant | Boolean | Hexen flag: Dormant | false | No |
class1 | Boolean | Hexen flag: Appears for player class 1 | false | No |
class2 | Boolean | Hexen flag: Appears for player class 2 | false | No |
class3 | Boolean | Hexen flag: Appears for player class 3 | false | No |
standing | Boolean | Strife flag: NPC | false | No |
strifeally | Boolean | Strife flag: Ally | false | No |
translucent | Boolean | Strife flag: Translucent | false | No |
invisible | Boolean | Strife flag: Invisible | false | No |
special | Integer | Linedef action executed on death/pickup | 0 | No |
arg0 | Integer | Action argument 0 | 0 | No |
arg1 | Integer | Action argument 1 | 0 | No |
arg2 | Integer | Action argument 2 | 0 | No |
arg3 | Integer | Action argument 3 | 0 | No |
arg4 | Integer | Action argument 4 | 0 | No |
comment | String | Comment field for mappers | empty | Yes |
ZDoom fields
Fields added for ZDoom's UDMF implementation. Some of them are useful for SRB2 as well.
Linedef
Name | Type | Description | Default | Do we need this? |
---|---|---|---|---|
alpha | Float | Translucency | 1.0 | Yes, replaces linedef type 900–908 |
renderstyle | String | Rendering style, "translucent" or "add" | translucent | No |
playeruseback | Boolean | ZDoom special activator flag: Activated when used by player from back side | False | No |
anycross | Boolean | ZDoom special activator flag: Activated when crossed by non-projectile | False | No |
monsteractivate | Boolean | Flag: Can be activated by monsters | False | No |
blockplayers | Boolean | Flag: Block players | False | No |
blockeverything | Boolean | Flag: Block all objects | False | No |
firstsideonly | Boolean | Flag: Can only be activated from the front side | False | No |
zoneboundary | Boolean | Flag: Boundary for sound reverb zones | False | No |
clipmidtex | Boolean | Flag: Middle textures are clipped to floor and ceiling | False | Maybe |
wrapmidtex | Boolean | Repeat Midtexture flag | False | Yes |
midtex3d | Boolean | Solid Midtexture flag | False | Yes |
midtex3dimpassible | Boolean | Flag: Used in conjunction with midtex3d to make the middle texture behave like an impassable linedef, i.e., projectiles can pass through
|
False | No |
checkswitchrange | Boolean | Flag: Switches can only be activated when vertically reachable | False | No |
blockprojectiles | Boolean | Flag: Block all projectiles | False | No |
blockuse | Boolean | Flag: Block all use actions | False | No |
blocksight | Boolean | Flag: Block line of sight of monster | False | No |
blockhitscan | Boolean | Flag: Block hitscan attacks | False | No |
locknumber | Integer | Linedef special must be unlocked by key | 0 | No |
arg0str | String | Alternate string-based version of arg0, used for ACS scripts | empty | Yes, but as a standalone parameter separate from arg0 |
moreids | String | Additional tags, specified as a space-separated list, e.g. "2 666 1003 4505" | empty | Yes |
transparent | Boolean | Strife: Transparent line (alpha 0.25) | False | No |
Sidedef
Name | Type | Description | Default | Do we need this? |
---|---|---|---|---|
scalex_top | Float | Upper texture X scale | 1.0 | Maybe |
scaley_top | Float | Upper texture Y scale | 1.0 | Maybe |
scalex_mid | Float | Middle texture X scale | 1.0 | Maybe |
scaley_mid | Float | Middle texture Y scale | 1.0 | Maybe |
scalex_bottom | Float | Lower texture X scale | 1.0 | Maybe |
scaley_bottom | Float | Lower texture Y scale | 1.0 | Maybe |
offsetx_top | Float | Upper texture X offset | 0.0 | Maybe |
offsety_top | Float | Upper texture Y offset | 0.0 | Maybe |
offsetx_mid | Float | Middle texture X offset | 0.0 | Maybe |
offsety_mid | Float | Middle texture Y offset | 0.0 | Maybe |
offsetx_bottom | Float | Lower texture X offset | 0.0 | Maybe |
offsety_bottom | Float | Lower texture Y offset | 0.0 | Maybe |
light | Integer | Light level | 0 | No |
lightabsolute | Boolean | Light level is absolute value instead of relative to sector's light level | False | No |
lightfog | Boolean | Light level is used even in fog sector | False | No |
nofakecontrast | Boolean | Disable fake contrast | False | Maybe |
smoothlighting | Boolean | Smooth fake contrast | False | Maybe |
clipmidtex | Boolean | Middle textures are clipped to floor and ceiling | False | No |
wrapmidtex | Boolean | Repeat midtexture | False | Maybe |
nodecals | Boolean | Disable decals | False | No |
Vertex
Name | Type | Description | Default | Do we need this? |
---|---|---|---|---|
zfloor | Float | Floor height, used to define slopes in triangular sectors | none (use sector's floor height) | Yes |
zceiling | Float | Ceiling height, used to define slopes in triangular sectors | none (use sector's ceiling height) | Yes |
Sector
Name | Type | Description | Default | Do we need this? |
---|---|---|---|---|
xpanningfloor | Float | Floor texture X offset | 0.0 | Yes, replaces linedef type 7 |
ypanningfloor | Float | Floor texture Y offset | 0.0 | Yes, replaces linedef type 7 |
xpanningceiling | Float | Ceiling texture X offset | 0.0 | Yes, replaces linedef type 7 |
ypanningceiling | Float | Ceiling texture Y offset | 0.0 | Yes, replaces linedef type 7 |
xscalefloor | Float | Floor texture X scale | 1.0 | Maybe |
yscalefloor | Float | Floor texture Y scale | 1.0 | Maybe |
xscaleceiling | Float | Ceiling texture X scale | 1.0 | Maybe |
yscaleceiling | Float | Ceiling texture Y scale | 1.0 | Maybe |
rotationfloor | Float | Floor texture rotation in degrees | 0.0 | Yes, replaces linedef type 7 |
rotationceiling | Float | Ceiling texture rotation in degrees | 0.0 | Yes, replaces linedef type 7 |
ceilingplane_a | Float | Used for defining a ceiling slope via equation | 0.0 | No |
ceilingplane_b | Float | Used for defining a ceiling slope via equation | 0.0 | No |
ceilingplane_c | Float | Used for defining a ceiling slope via equation | 0.0 | No |
ceilingplane_d | Float | Used for defining a ceiling slope via equation | 0.0 | No |
floorplane_a | Float | Used for defining a floor slope via equation | 0.0 | No |
floorplane_b | Float | Used for defining a floor slope via equation | 0.0 | No |
floorplane_c | Float | Used for defining a floor slope via equation | 0.0 | No |
floorplane_d | Float | Used for defining a floor slope via equation | 0.0 | No |
lightfloor | Integer | Floor's light level, relative to sector's light level | 0 | Yes, replaces linedef type 600 |
lightceiling | Integer | Ceiling's light level, relative to sector's light level | 0 | Yes, replaces linedef type 601 |
lightfloorabsolute | Boolean | Floor's light level is an absolute value | False | Yes |
lightceilingabsolute | Boolean | Ceiling's light level is an absolute value | False | Yes |
alphafloor | Float | Floor's translucency, for portals | 1.0 | No |
alphaceiling | Float | Ceiling's translucency, for portals | 1.0 | No |
renderstylefloor | String | Floor's rendering style, for portals | translucent | No |
renderstyleceiling | String | Ceiling's rendering style, for portals | translucent | No |
gravity | Float | Gravity | 1.0 | Yes, partially replaces linedef type 1 |
lightcolor | Integer | Light colormap | 0xFFFFFF
|
Yes, replaces linedef type 606 |
fadecolor | Integer | Fog colormap | 0x000000
|
Yes, replaces linedef type 606 |
desaturation | Float | Colormap intensity | 0 | Yes, replaces linedef type 606 |
silent | Boolean | Objects in this sector make no sound | False | No |
nofallingdamage | Boolean | Falling damage is disabled | False | No |
noattack | Boolean | Monster attacks are blocked in this sector | False | No |
dropactors | Boolean | Objects drop with instantly moving floors | False | No |
norespawn | Boolean | Players cannot respawn in this sector | False | No |
soundsequence | String | Sound sequence to play when the player moves | empty | No |
hidden | Boolean | Not drawn on textured automap | False | No |
waterzone | Boolean | Underwater sector | False | No |
moreids | String | Additional tags, specified as a space-separated list, e.g. "2 666 1003 4505" | empty | Yes |
damageamount | Integer | Amount of damage inflicted by this sector | 0 | No |
damagetype | String | Type of damage inflicted by this sector | None | Yes, replaces damage sector types |
damageinterval | Integer | Interval in tics between damage application | 32 | No |
leakiness | Integer | Probability of damage leaking through radiation suit | 0 | No |
damageterraineffect | Boolean | Will draw a terrain splash effect when damage is inflicted | False | No |
damagehazard | Boolean | Use Strife's delayed damage | False | No |
floorterrain | String | Floor terrain | use floor flat's terrain | No |
ceilingterrain | String | Floor terrain | use ceiling flat's terrain | No |
floor_reflect | Float | Reflectiveness of floor | 0.0 | No |
ceiling_reflect | Float | Reflectiveness of ceiling | 0.0 | No |
fogdensity | Integer | Fog density | 0 | No |
floorglowcolor | Integer | Color of floor's glow effect as RRGGBB value
|
use floor flat's glow effect | No |
floorglowheight | Float | Height of floor's glow effect | 0.0 | No |
ceilingglowcolor | Integer | Color of ceiling's glow effect as RRGGBB value
|
use ceiling flat's glow effect | No |
ceilingglowheight | Float | Height of ceiling's glow effect | 0.0 | No |
color_floor | Integer | Floor color | 0xFFFFFF
|
No |
color_ceiling | Integer | Ceiling color | 0xFFFFFF
|
No |
color_walltop | Integer | Color of upper walls in the sector | 0xFFFFFF
|
No |
color_wallbottom | Integer | Color of lower walls in the sector | 0xFFFFFF
|
No |
color_sprites | Integer | Color of sprites in the sector | 0xFFFFFF
|
No |
portal_ceil_blocksound | Boolean | Ceiling portal blocks sound | False | No |
portal_ceil_disabled | Boolean | Ceiling portal disabled | False | No |
portal_ceil_nopass | Boolean | Ceiling portal blocks movement | False | No |
portal_ceil_norender | Boolean | Ceiling portal not rendered | False | No |
portal_ceil_overlaytype | String | Ceiling portal translucency | translucent | No |
portal_floor_blocksound | Boolean | Floor portal blocks sound | False | No |
portal_floor_disabled | Boolean | Floor portal disabled | False | No |
portal_floor_nopass | Boolean | Floor portal blocks movement | False | No |
portal_floor_norender | Boolean | Floor portal not rendered | False | No |
portal_floor_overlaytype | String | Floor portal translucency | translucent | No |
Thing
Name | Type | Description | Default | Do we need this? |
---|---|---|---|---|
skill6–16 | Boolean | Flags: Appears on skill level 1–16 | false | No |
class4–16 | Boolean | Flags: Appears for player class 4–16 | false | No |
conversation | Integer | Conversation ID | 0 (none) | No |
countsecret | Boolean | Flags: Picking up this Object counts as a secret | 0 (none) | No |
arg0str | String | Alternate string-based version of arg0, used for ACS scripts | empty | No |
gravity | Float | Per-object gravity | 1.0 | No |
health | Float | Per-object health | 1 | No |
renderstyle | String | Per-object rendering style | empty | No |
fillcolor | Integer | Fill color for stencil rendering styles | 0x000000
|
No |
alpha | Float | Translucency | 1.0 | No |
score | Integer | Score value | 0 | No |
pitch | Integer | Pitch in degrees | 0 | Yes |
roll | Integer | Roll in degrees | 0 | Yes |
scalex | Float | Vertical scale | 0 (ignored) | No |
scaley | Float | Horizontal scale | 0 (ignored) | No |
scale | Float | Total scale | 0 (ignored) | Yes |
floatbobphase | Integer | Floatbobphase | -1 | No |
New fields
Fields added for SRB2's UDMF implementation.
Linedef
Name | Type | Description | Default |
---|---|---|---|
skewtd | Boolean | Slope Skew flag | False |
noclimb | Boolean | Not Climbable flag | False |
noskew | Boolean | No Midtexture Skew flag | False |
midpeg | Boolean | Peg Midtexture flag | False |
netonly | Boolean | Netgame Only flag | False |
nonet | Boolean | No Netgame flag | False |
bouncy | Boolean | Bouncy Wall flag | False |
transferline | Boolean | Transfer Line flag | False |
executordelay | Integer | Delay for linedef executor (replaces Upper Unpegged + back sector floor, can be set via linedef type 453) | 0 |
arg5 | Integer | Another linedef action argument | 0 |
arg1str | String | A second string-based linedef action argument | empty |
horizoneffect | Boolean | Flag: Horizon effect (replaces linedef type 41) | False |
fogwall | Boolean | Flag: Fog wall (replaces linedef type 909) | False |
notriggerorder | Boolean | Flag: Trigger out of order (replaces Repeat Midtexture on linedef executor triggers) | False |
Sidedef
Name | Type | Description | Default |
---|---|---|---|
repeatcnt | Integer | Number of middle texture repetitions | 0 |
Sector
Name | Type | Description | Default |
---|---|---|---|
friction | Float | Friction (replaces linedef type 540) | 1.0 |
specialeffectplanes | Integer | Special effects apply to: 0 = floor, 1 = ceiling, 2 = both (Partially replaces linedef type 8) | 0 |
specialontouch | Boolean | Special effects already apply when the player barely touches the sector (Partially replaces linedef type 8) | False |
fadestart | Integer | Start of colormap fade range (partially replaces linedef type 606) | 0 |
fadeend | Integer | End of colormap fade range (partially replaces linedef type 606) | 33 |
foglighting | Boolean | Use fog-like plane lighting for translucent FOFs and PolyObjects (partially replaces linedef type 606) | False |
flip | Boolean | Flag: Vertically flip players if gravity is negative (replaces a setting of linedef type 1) | False |
heatwave | Boolean | Flag: Heat wave effect (replaces linedef type 13) | False |
spacecountdown | Boolean | Flag: Space Countdown | False |
doublestepup | Boolean | Flag: Ramp Sector | False |
nostepdown | Boolean | Flag: Non-Ramp Sector | False |
eggcapsule | Boolean | Flag: Egg Capsule | False |
starpostactivator | Boolean | Flag: Star Post Activator | False |
exitsector | Boolean | Flag: Exit Sector | False |
specialstagepit | Boolean | Flag: Special Stage Pit | False |
returnflag | Boolean | Flag: CTF Return Flag | False |
supertransform | Boolean | Flag: Super Sonic Transform | False |
forcespin | Boolean | Flag: Force Spin | False |
finishline | Boolean | Flag: Circuit Finish Line | False |
intangibletocamera | Boolean | Flag: Intangible to the Camera | False |
ringdrain | Integer | Number of rings drained per second while the player is in the sector | 0 |
damagearea | Integer | Area in which the damage specified by damagetype and ringdrain applies (0 = Floor, 1 = Ceiling, 2 = Floor and ceiling, 3 = Entire sector)
|
0 |
triggersector | Boolean | Can sector trigger linedef executors? | False |
triggerarea | Integer | Area in which linedef executors can be triggered (0 = Floor, 1 = Ceiling, 2 = Floor and ceiling, 3 = Entire sector) | 0 |
triggerobject | Integer | Objects that can trigger linedef executors (0 = Any player, 1 = All players, 2 = Any pushable object, 3 = Any object with a thinker) | 0 |
teambase | Integer | CTF team base (0 = None, 1 = Red, 2 = Blue) | 0 |
Possible values for damagetype
:
- "None"
- "Generic"
- "Water"
- "Fire"
- "Electrical"
- "Spikes"
- "DeathPitTilt"
- "DeathPitNoTilt"
- "InstantKill"
- "SpecialStage"
Thing
Name | Type | Description | Default |
---|---|---|---|
param0–param5 | Integer | Configurable parameters whose semantics depend on the Thing type (similar to linedef arguments), replaces Parameter field in binary format | 0 |
param0str–param1str | String | String-based parameters | empty |
flip | Boolean | Flip flag (the other flags are made obsolete by the param fields) | False |
spawntrigger | Integer | Tag of trigger linedef to activate when SpawnTrigger is called
|
0 |
seetrigger | Integer | Tag of trigger linedef to activate when SeeTrigger is called
|
0 |
paintrigger | Integer | Tag of trigger linedef to activate when PainTrigger is called
|
0 |
meleetrigger | Integer | Tag of trigger linedef to activate when MeleeTrigger is called
|
0 |
missiletrigger | Integer | Tag of trigger linedef to activate when MissileTrigger is called
|
0 |
deathtrigger | Integer | Tag of trigger linedef to activate when DeathTrigger is called
|
0 |
xdeathtrigger | Integer | Tag of trigger linedef to activate when XDeathTrigger is called
|
0 |
raisetrigger | Integer | Tag of trigger linedef to activate when RaiseTrigger is called
|
0 |
GZDoom Builder field types
Number | Type | Base type |
---|---|---|
0 | Integer (32-bit unsigned) | |
1 | Float (double precision) | |
2 | String | |
3 | Boolean (true/false) | |
4 | Linedef type | Integer |
5 | Sector type | Integer |
6 | Texture | String |
7 | Flat | String |
8 | Angle in degrees | Integer |
9 | Angle in radians | Float |
10 | Color in XXRRGGBB format
|
Integer |
11 | Enum choice | Integer |
12 | Enum flags | Integer |
13 | Sector tag | Integer |
14 | Thing tag | Integer |
15 | Linedef tag | Integer |
16 | Enum choice | String |
17 | Angle in degrees (0–359) | Float |
18 | Thing type | Integer |
19 | Thing class | String |
20 | Random integer | Integer |
21 | Random float | Float |
22 | Angle as byte (0–255) | Integer |
23 | Thing radius | Integer |
24 | Thing height | Integer |
25 | PolyObject number | Integer |
26 | Enum choice and flags | Integer |
Note: UMDF's linedef arguments are all integers, so they can only be set to field types whose base type is integer. Booleans can be represented with a "noyes" or "yesno" enum choice. Since SRB2 uses fixed-point math anyway, I should probably add a field type for fixed-point "pseudo-floats". Strings definitely need their own argument field though.