Editing EDF thing reference

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:
Thing types define monsters, lamps, control points, items, etc -- anything that moves, occupies space, can display a sprite, or is useful for singling out locations. Things have unique names, or mnemonics, for easy identification. They're referenced in several places by their name, such as the console command ''Summon'', or [[List of codepointers|action functions]] dealing with spawning things (such as [[Spawn]] or [[MissileAttack]]).
Thing types define monsters, lamps, control points, items, etc -- anything that moves, occupies space, can display a sprite, or is useful for singling out locations.  


If a thing type's mnemonic is not unique, the latest definition of a thing type with that mnemonic replaces any earlier ones. Like most other identifiers in EDF (but not lump names or subnames), thing type mnemonics are completely case-insensitive.
Each thing type must be given a unique mnemonic in its definition's header, and this is the name used to identify the thing type elsewhere. Each field in the thing type definition is optional. If a field is not provided, it takes on the default value indicated below the syntax information. Fields may also be provided in any order.  


New objects, created via EDF files or wad lumps, can be later tweaked with Dehacked (BEX) patches, if they're given a unique '''dehackednum''' entry. For forward compatibility, the '''dehackednum''' has to be greater than or equal to 10000.
If a thing type's mnemonic is not unique, the latest definition of a thing type with that mnemonic replaces any earlier ones. See the information below for more on this. Thing type mnemonics are completely case-insensitive. This means that a thing type defined with a mnemonic that differs from an existing one only by case of letters will overwrite the original type.  


For placing the thing on the map, an integer field called '''doomednum''' must be specified. For forward compatibility it has to be greater than or equal to 20000 or in the 3000-3999 range. Due to how binary WAD files format their THINGS lumps, '''doomednum''' values have to be less than 32767, though textmode representations such as [[ExtraData]] or UDMF solve this limit.
Note that the order of thing type definitions in [[EDF]] is not important. For purposes of DeHackEd, the number used to access a thing type is now defined in the type itself. For the original thing types, these happen to be the same as their order.  


If you want to know the base game thing types from Doom, you can look on the [https://github.com/team-eternity/eternity/blob/master/base/doom/things.edf list of Doom thing types].
User thing types that need to be accessible from [[DeHackEd]] or by parameterized codepointers can define a unique DeHackEd number, which for purposes of forward compatibility, should be greater than or equal to 10000 and less than 32768. User types not needing access via DeHackEd or by parameterized codepointers can be given a DeHackEd number of -1. If a thingtype with a DeHackEd number of -1 is used by name in a misc or args field using the "thing:" prefix, it will be automatically assigned a unique DeHackEd number by the game engine. The previous behavior was to post a warning message and replace the thing with the "Unknown" type. This largely removes the need for users to assign and keep track of DeHackEd numbers.
 
{{See|Thing type flags}}
{{See|thinggroup}}. Some of the customization should be set in '''thinggroup''' blocks, which group multiple things. Most notably, infighting control. There are also flags and '''damagefactor''' "immune" (see this page) settings.
{{Backto|EDF}}
 
==Eternity Alfheim syntax==
For versions of Eternity from Alfheim up, EDF thingtypes support the following syntax. Make sure to add:
setdialect("ALFHEIM")
before using this syntax:
thingtype <unique name> : <inherited thingtype>, <doomednum>, <dehackednum>
{
  <other attributes>
}
===Header properties===
* ''<inherited thingtype>'' must be a value, even if the thingtype doesn't inherit from anything else. In that case, it must be '''Mobj''', which is a placeholder value belonging to no real thingtype.
* ''<doomednum>'' and ''<dehackednum>'' can be -1 if not used. If both are -1, they can be omitted, leaving just this:
thingtype <unique name> : <inherited thingtype> {<attributes>}
* If header properties are used, the pre-Alfheim '''inherits''', '''doomednum''' and '''dehackednum''' attributes are not used.


==Syntax==
==Syntax==
  thingtype <unique name> [: <parent type> [, <doomednum> [, <dehackednum>]]]
  thingtype <unique name>
  {
  {
   doomednum              <number>
   doomednum              <number>
   dehackednum            <unique number>
   dehackednum            <unique number>
   inherits              <thingtype>
   inherits              <thingtype>
  compatname            <name>
   basictype              <basic type qualifier>
   basictype              <basic type qualifier>
    
    
  // NOTE: for this section, see the "states" field below and use it instead of these.
   spawnstate            <frame>
   spawnstate            <frame>
   seestate              <frame>
   seestate              <frame>
Line 51: Line 31:
   xdeathstate            <frame>
   xdeathstate            <frame>
   raisestate            <frame>
   raisestate            <frame>
  healstate              <frame>  // since Feb 21 2016
   crashstate            <frame>
   crashstate            <frame>
  activestate            <frame>
  inactivestate          <frame>
   
   
   seesound              <sound>
   seesound              <sound>
Line 61: Line 38:
   deathsound            <sound>
   deathsound            <sound>
   activesound            <sound>
   activesound            <sound>
  activatesound          <sound>
  deactivatesound        <sound>
   
   
   spawnhealth            <number>
   spawnhealth            <number>
  gibhealth              <number>
   reactiontime          <number>
   reactiontime          <number>
   painchance            <number>
   painchance            <number>
Line 79: Line 53:
   damage                <number>
   damage                <number>
   dmgspecial            <dmgspecial name>
   dmgspecial            <dmgspecial name>
  aimshift              <number>
   
   
   damagefactor          <damage type>, <floating point number>|immune
   damagefactor          <damage type>, <floating point number>
   damagefactor          <damage type>, <floating point number>|immune
   damagefactor          <damage type>, <floating point number>
   ...
   ...
   
   
Line 94: Line 67:
   nukespecial            <BEX codepointer mnemonic>
   nukespecial            <BEX codepointer mnemonic>
   droptype              <thing type mnemonic>
   droptype              <thing type mnemonic>
  bloodbehavior          <action>, <behavior>
  clearbloodbehaviors
  bloodtype.normal      <name>
  bloodtype.impact      <name>
  bloodtype.rip          <name>
  bloodtype.crush        <name>
  cleardropitems
  dropitem              <type>, [, <chance> [, <amount> [, <toss>]]]
  dropitem.remove        <type>
  collectionspawn        <thingtype> [, <spchance> [, <coopchance> [, <dmchance>]]]
  itemrespawnat          <thingtype>
   
   
   cflags                <flag list>
   cflags                <flag list>
Line 115: Line 75:
   flags3                <flag list>
   flags3                <flag list>
   flags4                <flag list>
   flags4                <flag list>
  flags5                <flag list>
   particlefx            <particle effect flag list>
   particlefx            <particle effect flag list>
   
   
   translucency          <number OR percentage>
   translucency          <number OR percentage>
   translation            <number OR translation table lump name>
   translation            <number OR translation table lump name>
  tranmap                <lump name>
   skinsprite            <sprite>
   skinsprite            <sprite>
   defaultsprite          <sprite>
   defaultsprite          <sprite>
Line 128: Line 86:
   
   
   acs_spawndata          {num <number> modes <mnemonic>}
   acs_spawndata          {num <number> modes <mnemonic>}
  pickupeffect
  {
    effects              <effect1>, ...
    changeweapon        <weapon>
    message              <text>
    sound                <sound>
    flags                <flags>
  }
  clearpickupeffect
  firstdecoratestate    <frame>
  states                <[[DECORATE state syntax]] heredoc>
  }
  }
===Explanation of fields===
===Explanation of fields===
Line 146: Line 91:
*'''doomednum'''
*'''doomednum'''
:Default = -1
:Default = -1
:The identification number, which makes this actor type placeable in maps. Zombieman monsters for example have '''doomednum''' 3004. Objects which don't need to be placed on the map can have '''doomednum''' -1. For EDF, recommended numbers are in the ranges 3000-3999 and 20000 up. Other numbers may be used by future versions of Eternity, so they're not safe to use.
:The identification number, which makes this actor type placeable in maps. [[Zombieman]] monsters for example have the doomednum 3004. Objects which don't need to be placed on the map can have the doomednum -1. For EDF, recommended numbers are in the ranges 3000-3999 and 20000 up. Other numbers may be used by future versions of Eternity, so they're not safe to use.
:NOTE: you can just use the first number following the inherited class, in the title. Just remember to start the script with <code>setdialect("alfheim")</code>.
*'''dehackednum'''
*'''dehackednum'''
:Default = -1
:Default = -1
:Fake array index number, for Dehacked patch (BEX or DEH file) compatibility. It has to be an unique number if not -1. Safe numbers are from 10000 up.
:Fake array index number, for Dehacked patch (BEX or DEH file) compatibility. It has to be an unique number if not -1. Safe numbers are from 10000 up.
:NOTE: you can use the second number following the inherited class in the title. For this, you also need <code>setdialect("alfheim")</code>.
*'''inherits'''
*'''inherits'''
:Default = (nothing)
:Default = (nothing)
:Sets the thing type from which this will copy properties. All of the properties except '''dehackednum''' will be copied from the base actor type.
:Sets the thing type from which this will copy the properties.
:NOTE: you can use the class in the title properties after the colon, instead of '''inherits''' in the '''thingtype''' body. You also need <code>setdialect("alfheim")</code>.
*'''compatname'''
:Default = (nothing)
:Sets a "compatible name" useful for [[ACS]] scripts copied from GZDoom mods or for cross-port usage. Typically the need for this is because of ACS scripts assuming thingtype names from GZDoom, and in the base Eternity definitions, '''compatname''' is set to names which GZDoom uses for its thingtypes.
:Setting this flag is not needed and shouldn't be done in mods.
*'''basictype'''
*'''basictype'''
:Default = (nothing)
:Default = (nothing)
:'''Basictype''' is a list of common flags used in Doom and derived games. Using '''basictype''' instead of setting individual flags is encouraged, in order to keep up with Eternity engine updates. Other flags may be subsequently added or removed with '''addflags''' or '''remflags'''. See the [[Thing type flags]] page for a full list. The '''basictype''' mnemonics follow:
:Basictype is a list of common flags used in Doom and derived games. Using basictype instead of setting individual flags is encouraged, in order to keep up with Eternity engine updates. Other flags may be added or removed with addflags or remflags. The basictype mnemonics follow:
:*''Monster''
:*''Monster''
::An ordinary walking monster with no fancy features.
::An ordinary walking monster with no fancy features.
::'''cflags''' "SOLID+SHOOTABLE+COUNTKILL+FOOTCLIP+SPACMONSTER+PASSMOBJ"
::cflags = SOLID+SHOOTABLE+COUNTKILL+FOOTCLIP+SPACMONSTER+PASSMOBJ  


:*''FlyingMonster''
:*''FlyingMonster''
::An ordinary flying monster.
::An ordinary flying monster.
::'''cflags''' "SOLID+SHOOTABLE+COUNTKILL+NOGRAVITY+FLOAT+SPACMONSTER+PASSMOBJ"
::cflags = SOLID+SHOOTABLE+COUNTKILL+NOGRAVITY+FLOAT+SPACMONSTER+PASSMOBJ  


:*''FriendlyHelper''
:*''FriendlyHelper''
::A player helper with maximum friendliness options.
::A player helper with maximum friendliness options.
::'''cflags''' "SOLID+SHOOTABLE+COUNTKILL+FRIEND+JUMPDOWN+FOOTCLIP+WINDTHRUST+SUPERFRIEND+SPACMONSTER+PASSMOBJ"
::cflags = SOLID+SHOOTABLE+COUNTKILL+FRIEND+JUMPDOWN+FOOTCLIP+WINDTHRUST+SUPERFRIEND+SPACMONSTER+PASSMOBJ  


:*''Projectile''
:*''Projectile''
::A standard projectile.
::A standard projectile.
::'''cflags''' "NOBLOCKMAP+NOGRAVITY+DROPOFF+MISSILE+NOCROSS"
::cflags = NOBLOCKMAP+NOGRAVITY+DROPOFF+MISSILE+NOCROSS  


:*''PlayerProjectile''
:*''PlayerProjectile''
::A projectile for use by players.
::A projectile for use by players.
::'''cflags''' "NOBLOCKMAP+NOGRAVITY+DROPOFF+MISSILE+NOCROSS+SPACMISSILE"
::cflags = NOBLOCKMAP+NOGRAVITY+DROPOFF+MISSILE+NOCROSS+SPACMISSILE  


:*''Seeker''
:*''Seeker''
::A missile prepared to be fired by homing missile codepointers.
::A missile prepared to be fired by homing missile codepointers.
::'''cflags''' "NOBLOCKMAP+NOGRAVITY+DROPOFF+MISSILE+NOCROSS+SEEKERMISSILE"
::cflags = NOBLOCKMAP+NOGRAVITY+DROPOFF+MISSILE+NOCROSS+SEEKERMISSILE  


:*''SolidDecor''
:*''SolidDecor''
::A solid decorative item.
::A solid decorative item.
::'''cflags''' SOLID
::cflags = SOLID  


:*''HangingDecor''
:*''HangingDecor''
::A hanging decorative item that is passable even without 3D object clipping.
::A hanging decorative item that is passable even without 3D object clipping.
::'''cflags''' "SPAWNCEILING+NOGRAVITY"
::cflags = SPAWNCEILING+NOGRAVITY  


:*''SolidHangingDecor''
:*''SolidHangingDecor''
::A solid hanging decorative item.
::A solid hanging decorative item.
::'''cflags''' "SOLID+SPAWNCEILING+NOGRAVITY"
::cflags = SOLID+SPAWNCEILING+NOGRAVITY  


:*''ShootableDecor''
:*''ShootableDecor''
::A shootable decorative item.
::A shootable decorative item.
::'''cflags''' "SOLID+SHOOTABLE+NOBLOOD"
::cflags = SOLID+SHOOTABLE+NOBLOOD  


:*''Fog''
:*''Fog''
::A fog item such as telefog or item fog.
::A fog item such as telefog or item fog.
::'''cflags''' "NOBLOCKMAP+NOGRAVITY+TRANSLUCENT+NOSPLASH"
::cflags = NOBLOCKMAP+NOGRAVITY+TRANSLUCENT+NOSPLASH  


:*''Item''
:*''Item''
::A collectable item. Doesn't count towards the item score.
::A collectable item. Doesn't count.
::'''cflags''' SPECIAL
::cflags = SPECIAL  


:*''ItemCount''
:*''ItemCount''
::A collectable item. Counts for item score.
::A collectable item. Counts for item %.
::'''cflags''' "SPECIAL+COUNTITEM"
::cflags = SPECIAL+COUNTITEM  


:*''TerrainBase''
:*''TerrainBase''
::A TerrainTypes base item.
::A TerrainTypes base item.
::'''cflags''' "NOBLOCKMAP+NOGRAVITY+NOSPLASH"
::cflags = NOBLOCKMAP+NOGRAVITY+NOSPLASH  


:*''TerrainChunk''
:*''TerrainChunk''
::A TerrainTypes chunk item.
::A TerrainTypes chunk item.
::'''cflags''' "NOBLOCKMAP+DROPOFF+MISSILE+LOGRAV+NOSPLASH+NOCROSS+CANNOTPUSH"
::cflags = NOBLOCKMAP+DROPOFF+MISSILE+LOGRAV+NOSPLASH+NOCROSS+CANNOTPUSH  


:*''ControlPoint''
:*''ControlPoint''
::An inert control point.
::An inert control point.
::'''cflags''' "NOBLOCKMAP+NOSECTOR+NOGRAVITY"
::cflags = NOBLOCKMAP+NOSECTOR+NOGRAVITY
::'''spawnstate''' S_TNT1  
::spawnstate = S_TNT1  


:*''ControlPointGrav''
:*''ControlPointGrav''
::An control point that is subject to gravity. Because of this, it's not considered inert.
::An control point that is subject to gravity. Because of this, it's not considered inert.
::'''cflags''' "DONTDRAW+NOSPLASH"
::cflags = DONTDRAW+NOSPLASH
::'''spawnstate''' S_TNT1
::spawnstate = S_TNT1  
 
====States====
====States====
*'''firstdecoratestate'''
:Sets the first frame in a sequential list of dummy frames that use the internal Decorate-style defined '''states''' of this actor for [[EDF delta structures|framedelta]] compatibility. It's not required unless the intention is to make the Decorate states of this thing accessible from other thing types. Default games' (Doom, Heretic) thing types use externalized frames for all thing types, for compatibility.
*'''states'''
{{see|DECORATE state syntax}}
:Default = nothing
:Defines frames using [http://zdoom.org/wiki/DECORATE DECORATE]-style state definitions. This means it won't be necessary to define separate [[frame]] blocks for each individual frame. See the DECORATE reference at the ZDoom wiki for documentation on its syntax. Using the '''states''' field instead of any of the ones below results in more concise text, but also the newly created frames won't be accessible from outside (other thingtypes, Dehacked patches or delta structures), unless you use the '''firstdecoratestate''' field as well. Like normally, [[List of codepointers|codepointers]] may or may not be preceded by '''A_'''. The DECORATE code has to be implemented via a heredoc: a text string that spans on multiple lines. Unlike a regular string which uses quotation marks, the heredoc is marked by @" and "@ respectively. Example on an imp-like monster (the '=' sign is optional):
states =
  @"
  Spawn:
      TROO AB 10 A_Look
      loop
  See:
      TROO AABBCCDD 3 A_Chase
      loop
  Pain:
      TROO H 2
      TROO H 2 A_Pain
      goto See
  Melee:
  Missile:
      TROO EF 8 A_FaceTarget
      TROO G  6 A_TroopAttack
      goto See 
  Death:
      TROO I  8
      TROO J  8  A_Scream
      TROO K  6
      TROO L  6  A_Fall
      TROO M -1
      stop
  XDeath:
      TROO N    5
      TROO O    5 A_XScream
      TROO P    5
      TROO Q    5 A_Fall
      TROO RST  5
      TROO U  -1
      stop
  Raise:
      TROO ML  8
      TROO KJI 6
      goto See
  "@
:A "fast" flag is now allowed between the tics and action function of DECORATE states (along with the pre-existing "bright" flag) which determines if that state halves its "tics" value when the game is in -fast or Nightmare skill. Example (from demon's states):
  states
  @"
  See:
    SARG AABBCCDD 2 fast A_Chase
    loop
  Melee:
    SARG EF 8 fast A_FaceTarget
    SARG G  8 fast A_SargAttack
    goto See
  Pain:
    SARG H 2 fast
    SARG H 2 fast A_Pain
    goto See
  "@ 
*'''spawnstate'''
*'''spawnstate'''
:Default = S_NULL
:Default = S_NULL
:Sets the frame which a thing starts in when it is spawned. Monsters generally use this frame to stand still and look for targets. If the object is supposed to have any dynamic purpose or be visible, do not leave the '''spawnstate''' at S_NULL.
:Sets the frame which a thing starts in when it is spawned. Monsters generally use this frame to stand still and look for targets.  
*'''seestate'''
*'''seestate'''
:Default = S_NULL
:Default = S_NULL
:Sets the frame which a monster will jump to when it sees or hears a target during a [[Look]] (monster standing unawakened) check. If an object is alive and has a seestate, it is considered ''sentient'' by certain game mechanics.
:Sets the frame which a monster will jump to when it sees or hears a target. Also called walking frames, or first moving frame.  
*'''painstate'''
*'''painstate'''
:Default = S_NULL
:Default = S_NULL
:Sets the frame a thing may randomly enter when it has been injured. If set to S_NULL, the creature will be removed instantly from the game if the random check succeeds.
:Sets the frame a thing may randomly enter when it has been injured.
*'''dmg_painstates'''
*'''dmg_painstates'''
:Default = (nothing)
:Default = (nothing)
Line 309: Line 188:
     Lava, S_HPLAY_LPAIN1
     Lava, S_HPLAY_LPAIN1
  }
  }
makes the actor go to frame S_HPLAY_FPAIN1 when damaged by fire, or to S_HPLAY_LPAIN1 when harmed by lava. It defaults to its '''painstate''' if the damage is of another nature. The damage type of an actor is set up through the '''mod''' field.
makes the actor go to frame S_HPLAY_FPAIN1 when damaged by fire, or to S_HPLAY_LPAIN1 when harmed by lava. It defaults to its painstate if the damage is of another nature.
*'''dmg_painstates.add'''
*'''dmg_painstates.add'''
*'''dmg_painstates.remove'''
*'''dmg_painstates.remove'''
Line 317: Line 196:
     Fire, lava
     Fire, lava
  }
  }
makes them get hurt normally from fire or lava, without going to special pain states.
makes them die normally from fire or lava, without going to special pain states.
*'''meleestate'''
*'''meleestate'''
:Default = S_NULL
:Default = S_NULL
:If this frame is not S_NULL, monsters will have a slightly lower range attack probability and when they are within about 64 units of their target, they will enter this frame to perform a melee attack.
:If this frame is not S_NULL, monsters chasing a target will attempt to close to melee range quickly. When they determine they are within 64 units of their target, they may randomly enter this frame to perform a melee attack.  
*'''missilestate'''
*'''missilestate'''
:Default = S_NULL
:Default = S_NULL
Line 331: Line 210:
*'''dmg_deathstates.remove'''
*'''dmg_deathstates.remove'''
:Defaults = (nothing)
:Defaults = (nothing)
:These three properties work similar to ''dmg_painstates*'', in that they allow the object to enter special frames depending on the damage type suffered, but if they die. The formats are the same.
:These three properties work similar to ''dmg_painstates*'', in that they allow the object to enter special frames depending on the damage type suffered.
*'''xdeathstate'''
*'''xdeathstate'''
:Default = S_NULL
:Default = S_NULL
Line 337: Line 216:
*'''raisestate'''
*'''raisestate'''
:Default = S_NULL
:Default = S_NULL
:If this frame is not S_NULL, a creature running [[VileChase]] codepointers can perform a resurrection on this actor. When this occurs, the actor will enter this frame along with being restored.
:If this frame is not S_NULL, a creature running [[VileChase]] codepointers can perform a resurrection on this actor. When this occurs, the actor will enter this frame.
*'''healstate''' (since Feb 21 2016)
:Default = S_NULL
:Sets the frame to jump to if, during a [[VileChase]] frame, the thing encounters a corpse and raises it. If not set (or set to S_NULL), it will actually default to S_VILE_HEAL1, same as in Doom.
*'''crashstate'''
*'''crashstate'''
:Default = S_NULL
:Default = S_NULL
:When a thing with this state dies and then subsequently hits the ground, it will enter this state. If this state S_NULL, it is not used.
:When a thing with this state dies and then subsequently hits the ground, it will enter this state. If this state S_NULL, it is not used.
*'''activestate'''
:Default = S_NULL
:State to enter when triggered by the '''Thing_Activate''' parameterized special.
*'''inactivestate'''
:Default = S_NULL
:State to enter when triggered by the '''Thing_Deactivate''' parameterized special.
====Sounds====
====Sounds====
*'''seesound'''
*'''seesound'''
Line 367: Line 236:
:Default = none
:Default = none
:Sets the sound used by a thing when it is wandering around. A thing is given a 3 out of 256 chance (1.17%) of making this sound every time it calls the Chase codepointer. There are some new flags3 flags which can alter the behavior of this sound.  
:Sets the sound used by a thing when it is wandering around. A thing is given a 3 out of 256 chance (1.17%) of making this sound every time it calls the Chase codepointer. There are some new flags3 flags which can alter the behavior of this sound.  
*'''activatesound'''
:Default = none
:Sound to play when triggered by the '''Thing_Activate''' parameterized special.
*'''deactivatesound'''
:Default = none
:Sound to play when triggered by the '''Thing_Deactivate''' parameterized special.
====Basic Stats====
====Basic Stats====
*'''spawnhealth'''
*'''spawnhealth'''
:Default = 1000
:Default = 1000
:Sets a thing's maximum amount of life.
:Sets a thing's maximum amount of life.
*'''gibhealth''' ''number''
:gibhealth overrides the gamemode default behavior for determining the negative amount of health at which a thing uses its "extreme" death state rather than its normal one. This is ordinarily defined in terms of the spawnhealth (Doom and Strife thingtypes gib at -spawnhealth; Heretic and Hexen thingtypes gib at -(spawnhealth/2).
:If an inheriting thingtype changes its spawnhealth, it will "lose" the inherited definition of gibhealth from its parent. If changing spawnhealth when inheriting from a thingtype that customizes gibhealth, be sure to re-customize the gibhealth in the inheriting thingtype.
*'''reactiontime'''
*'''reactiontime'''
:Default = 8
:Default = 8
Line 414: Line 274:
*'''damage'''
*'''damage'''
:Default = 0
:Default = 0
:This number is used as a damage multiplier when a [[Thing type flags|MISSILE]] or SKULLFLY actor hits a SHOOTABLE. The damage formula used for impact damage is:  
:This number is used as a damage multiplier when a missile hits a thing. The damage formula used is:  
       ((rnd % 8) + 1) * damage    
       damage = ((rnd % 8) + 1) * missiledamage    
:This field is also used as a parameter by some parameterized codepointers, including [[Scratch]], [[BetaSkullAttack]] and [[Detonate]].  
:This field is also used as a parameter by some new, parameterized codepointers, including [[BetaSkullAttack]] and [[Detonate]].  
*'''dmgspecial'''
*'''dmgspecial'''
:Default = "none"
:Default = "none"
Line 428: Line 288:
:*''Whirlwind''
:*''Whirlwind''
::The target will have its angle and x/y momenta modified by random amounts. If the current level time has the 5th bit (value 16) set and the target is not a boss (possesses the BOSS flag), the target will be given randomized z momentum up to but no greater than 12 units per tic. When the level time is divisible by 8, the target will be hit directly for 3 damage.  
::The target will have its angle and x/y momenta modified by random amounts. If the current level time has the 5th bit (value 16) set and the target is not a boss (possesses the BOSS flag), the target will be given randomized z momentum up to but no greater than 12 units per tic. When the level time is divisible by 8, the target will be hit directly for 3 damage.  
 
:*'''DamageFactor'''
*'''aimshift''' ''number''
:This sets up the monster's resistance to various damage types. 0 means invincible, 1 full damage. This property has a distinct syntax: there may be as many ''DamageFactor'' lines as damage resistances. Example:
:If in the range of 0 to 24, this value overrides the "shift" amount that enemies of this object experience while trying to aim at it due to effects like SHADOW, GHOST, and TOTALINVISIBLE. A larger number in this field makes enemies more inaccurate when aiming at this creature. The default value of -1 means that no aiming inaccuracy is experienced *except* what may be incurred from what flags this monster has. A value larger than 24 will, on the other hand, override the creature's flags and cause enemies to experience no inaccuracy due to to those flags (so for example a creature inheriting from Spectre and setting its aimshift to 25 will behave as though it does not have the SHADOW flag other than for rendering purposes). Values of 20 and 21 are used by the various built-in flag effects.
 
*'''damagefactor'''
:This sets up the monster's resistance to various [[EDF damagetype reference|damage types]] ("means of death"). 0 means invincible (''but still suffering pain''), 1 full damage. This property has a distinct syntax: there may be as many ''DamageFactor'' lines as damage resistances. Note that setting the factor to 0 won't prevent monster retaliation. Example of usage:
  damagefactor fire, 0.3
  damagefactor fire, 0.3
  damagefactor lava, 0.2
  damagefactor lava, 0.2
:As seen above, no braces are used, and the arguments are separated by commas.
As seen above, no braces are used, and the arguments are separated by commas.
:You can also use the '''immune''' keyword to make a thingtype truly immune to certain damage types, preventing any reaction or infighting. Example:
damagefactor fire, immune


*'''topdamage'''
*'''topdamage'''
Line 448: Line 302:
*'''mod'''
*'''mod'''
:Default = UNKNOWN (0)
:Default = UNKNOWN (0)
:Originally standing for "Means of Death", this field allows you to associate a '''[[damagetype]]''' to an inflictor (such as projectile) thing type. Then, you'll be able to make other thing types resistant to the given damage type by using the '''damagefactor''' field. You can give them specific pain or death states as well. Damage types also have the role in multiplayer to specify what obituaries are shown depending on which weapon the player uses.
:Special Means of Death flag for this thing type. Currently supported values follow below. The use of numbers in this field is now considered deprecated. Please use the descriptive textual MOD names in all new EDF projects.  
:The mnemonics were initially hard-coded, but are now available inside ''base\things.edf'' as '''damagetype''' blocks. Notice that the default damage types (means of death) have been differentiated for each player attack, as well as for the various slime types and whatnot, so as to have the obituaries differentiated. Monsters don't need new damage types to have new obituaries, because these are defined within the '''thingtype''' block. See the two fields below.
    Mod Name    Number
    ------------------
    UNKNOWN      0
    FIST          1
    PISTOL        2
    SHOTGUN      3
    CHAINGUN      4
    ROCKET        5
    R_SPLASH      6
    PLASMA        7
    BFG          8
    BFG_SPLASH    9
    CHAINSAW      10
    SSHOTGUN      11
    SLIME        12
    LAVA          13
    CRUSH        14
    TELEFRAG      15
    FALLING      16
    SUICIDE      17
    BARREL        18
    SPLASH        19
    HIT          20
    BFG11K_SPLASH 21
    BETABFG      22
    BFGBURST      23
    PLAYERMISC    24
    GRENADE      25
*'''obituary_normal'''
*'''obituary_normal'''
:Default = empty
:Default = empty
Line 455: Line 336:
*'''obituary_melee'''
*'''obituary_melee'''
:Default = empty
:Default = empty
:Defines the obituary seen by players when killed by a monster's melee attack. If the obituary is not defined for this type, it will simply read that the player died. Note that you are only allowed to specify an obituary starting immediately after the player's name. If you want an obituary to say "Player was stabbed mercilessly", then simply make the obituary read "was stabbed mercilessly".
:Defines the obituary seen by players when killed by a monster's melee attack. If the obituary is not defined for this type, it will simply read that the player died. Note that you are only allowed to specify an obituary starting immediately after the player's name. If you want an obituary to say "Player was stabbed mercilessly", then simply make the obituary read "was stabbed mercilessly".  
 
:Specifying this field is not necessary for most thing types. It IS highly useful for controlling the obituaries triggered by player projectiles, however. Some of the values above are not fully supported yet. Eventually the LAVA type will cause fire death animations for things which define them.
====Pain/Death Properties====
====Pain/Death Properties====
*'''nukespecial'''
:Default = NULL
:This field is the name of a special codepointer to call when the player uses the KILLEM cheat to kill all monsters. Currently only two special pointers are provided for this purpose, PainNukeSpec and SorcNukeSpec. These enable monsters with spawn-on-death actions to either spawn enemies early, or not at all. See the Eternity Engine Definitive Codepointer Reference for detailed information.
*'''droptype'''
:Default = NONE
:This field allows the type of thing that is dropped by this thing when it dies to be edited. This field should either be a valid thing type mnemonic, or the special value NONE.
*'''cleardropitems'''
:The '''cleardropitems''' flag, if present, removes ALL dropitems from a thingtype. This is applied *before* any dropitem or droptype fields defined within this thingtype itself. This allows removing all inherited dropitems at once. This field is a flag and does not accept any value. Its presence in a thingtype is not inheritable (things which inherit from this type must again specify cleardropitems if they want to in turn remove any items this type added).
*'''dropitem ''type'', [, ''chance'' [, ''amount'' [, ''toss'']]]'''
:dropitem defines a Doom- or Heretic-style drop item; any number of dropitems can be defined. All are dropped when an enemy dies, subject to possible randomization.
:*''type'': name of EDF thing type to spawn
:*''chance'': If specified, chance between 0 and 255 to spawn this drop, 0 being no chance and 255 being 100%.
:*''amount'': If specified, overrides the '''dropamount''' field of an '''ammoeffect''' definition. Does not affect any other item effect type. If zero, this field is ignored.
:*''toss'': Flag value. If specified as +toss, the item is a Heretic-style item drop which will be thrown out during the A_Fall action function with randomized velocity. If this flag is not specified, or is specified as -toss, the item is a Doom-style drop item which will be spawned on the floor as soon as the dying thing has reached 0 health.
:Note: The older '''droptype''' field is still supported, and defines a Doom-style dropitem (100% chance, no dropamount override, and never tossed).
*'''dropitem.remove'''
:removes from this thingtype's dropitem list the named EDF thingtype. Useful when inheriting.
*'''collectionspawn''' ''thingtype'' [, ''spchance'' [, ''coopchance'' [, ''dmchance'']]]
:collectionspawn defines a thingtype at which THIS thingtype will select one instance out of all instances on the map at which to spawn itself at level start. This attribute is used by the Heretic Fire Mace. See the example in [https://github.com/team-eternity/eternity/blob/master/base/heretic/things.edf#L3213 Heretic's things.edf] on how it's used.
:Explanation of collectionspawn multivalue properties:
:*''thingtype'': Name of the EDF thingtype at which to spawn at random. If this is invalid, this collectionspawn definition will be disregarded.
:*''spchance'': if specified, chance this item will spawn at all in single player, from 0 to 255. Default is 255.
:*''coopchance'': if specified, chance this item will spawn at all in coop mode, from 0 to 255. Default is 255.
:*''dmchance'': if specified, chance this item will spawn at all in deathmatch mode, from 0 to 255. Default is 255.
*'''itemrespawnat''' ''thingtype''
:itemrespawnat defines an EDF thingtype at which this thingtype will respawn if it becomes subject to Heretic-style item respawning.
=====Blood properties=====
*'''bloodcolor'''
*'''bloodcolor'''
:Default = 0
:Default = 0
Line 501: Line 354:
     Orange              8
     Orange              8
     --------------------------
     --------------------------
 
*'''bloodbehavior'''
*'''nukespecial'''
:Syntax: '''bloodbehavior''' ''action'', ''behavior''
:Default = NULL
:A '''thingtype''' can have one or more of these entries. ''Action'' can be one of: '''shot''', '''impact''', '''rip''' or '''crush'''. ''Behavior'' can be one of: '''Doom''', '''Heretic''', '''HereticRip''', '''Hexen''', '''HexenRip''', '''Strife''' or '''crush'''. Setting this will override game's default settings, which for Doom are respectively ('''Doom''', '''Heretic''', '''HereticRip''', '''crush''') and for Heretic are ('''Heretic''', '''Heretic''', '''HereticRip''', '''crush'''). Due to Doom having no innate impact or rip attacks, it borrows the behaviors from Heretic. The meanings of the actions are as such:
:This field is the name of a special codepointer to call when the player uses the KILLEM cheat to kill all monsters. Currently only two special pointers are provided for this purpose, PainNukeSpec and SorcNukeSpec. These enable monsters with spawn-on-death actions to either spawn enemies early, or not at all. See the Eternity Engine Definitive Codepointer Reference for detailed information.  
:*'''shot''': from bullet (hitscan) attacks.
*'''droptype'''
:*'''impact''': from projectiles with the '''DRAWSBLOOD''' flag (Heretic projectiles commonly have this).
:Default = NONE
:*'''rip''': from projectiles with the '''RIP''' flag (Heretic's powered dragonclaw attack has this).
:This field allows the type of thing that is dropped by this thing when it dies to be edited. This field should either be a valid thing type mnemonic, or the special value NONE.  
:*'''crush''': from crushing surfaces (except for polyobjects).
:The behaviors assigned to each action can be:
:*'''Doom''': spawns the given blood objects with a small vertical speed of 2 and lowers the tic count of the first frame. If damage is less than 9, it will jump to Decorate state '''Blood3''' (or if missing, '''dehackednum''' 92). If damage is between 9 and 12, it will jump to Decorate state '''Blood2''' (or if missing, '''dehackednum''' 91).
:*'''Heretic''': similar to the '''Doom''' behavior, but without the state transition or randomization, and with a random horizontal spread.
:*'''HereticRip''': spawns the blood object at a slight distance away from inflictor or (if missing) target, clears it of gravity and propels it in a direction of inflictor/target's speed. It will also randomly increase the duration of the first state by 0-3.
:*'''Hexen''': like '''Heretic''' but with even more spread.
:*'''HexenRip''': like '''HereticRip''' but with gravity (won't add '''NOGRAVITY''').
:*'''Strife''': similar to Doom but with no duration randomization and with transitions to '''Blood2''', '''Blood1''', '''Blood0''' for damages 0-6, 7-9 or 10-13 respectively.
:*'''crush''': blood splat will be spread horizontally.
 
====Flags====
====Flags====
*'''cflags'''
*'''cflags'''
Line 540: Line 383:
:Similar to flags, but takes a different set of values with different meanings. See the [[Thing type flags]] List, for the values which can be used in this field. Remember that if whitespace or disallowed characters are used, this field's value must be enclosed in quotation marks.  
:Similar to flags, but takes a different set of values with different meanings. See the [[Thing type flags]] List, for the values which can be used in this field. Remember that if whitespace or disallowed characters are used, this field's value must be enclosed in quotation marks.  
*'''flags4'''
*'''flags4'''
:Default = ""
:Similar to flags, but takes a different set of values with different meanings. See the [[Thing type flags]] List, for the values which can be used in this field. Remember that if whitespace or disallowed characters are used, this field's value must be enclosed in quotation marks.
*'''flags5'''
:Default = ""
:Default = ""
:Similar to flags, but takes a different set of values with different meanings. See the [[Thing type flags]] List, for the values which can be used in this field. Remember that if whitespace or disallowed characters are used, this field's value must be enclosed in quotation marks.  
:Similar to flags, but takes a different set of values with different meanings. See the [[Thing type flags]] List, for the values which can be used in this field. Remember that if whitespace or disallowed characters are used, this field's value must be enclosed in quotation marks.  
Line 581: Line 421:
     particlefx = "BFG + GREENFOUNTAIN"
     particlefx = "BFG + GREENFOUNTAIN"


====Graphic Properties====
====Graphic Properites====
*'''translucency'''
*'''translucency'''
:Default = 65536 (100%)
:Default = 65536 (100%)
Line 590: Line 430:
*'''translation'''
*'''translation'''
:Default = 0
:Default = 0
:Sets a translation for the thing's sprite. Translation tables are 256-byte lumps which can be used to remap any range of colors in a sprite. When this field defaults, no translation will be used. Otherwise, you may either provide a number to access one of the internal player translation tables, or you may provide the name of a translation lump, which must be found either inside the '''translations''' folder inside a [[PKE]], or between T_START and T_END markers inside a [[Doom Wiki:WAD|wad]]. Numeric values for player translations are as follows. All of the player translations remap the pure green range:
:Sets a translation for the thing's sprite. Translation tables are 256-byte lumps which can be used to remap any range of colors in a sprite. When this field defaults, no translation will be used. Otherwise, you may either provide a number to access one of the internal player translation tables, or you may provide the name of a translation lump, which must be found between T_START and T_END markers amongst one of the currently loaded wad files. Numeric values for player translations are as follows. All of the player translations remap the pure green range.
:*1: indigo
    Number    Color
:*2: brown
    ------------------
:*3: red
    1       Indigo
:*4: tomato
    2       Brown
:*5: dirt
    3       Red
:*6: blue
    4       Tomato
:*7: gold
    5       Dirt
:*8: sea
    6       Blue
:*9: black
    7       Gold
:*10: purple
    8       Felt
:*11: orange
    9       Black
:*12: pink
    10       Purple
:*13: cream
    11       "Vomit"
:*14: white
    12       Pink
 
    13       Cream
*'''tranmap'''
    14       Yellow
:Default: not used
    ------------------
:This is a [[translucency map]] lump name to use to render the thing. NOTE: it should NOT be between T_START and T_END. Useful if you want custom translucency effects, not easily available with simple parameterized means.
   
 
*'''skinsprite'''
*'''skinsprite'''
:Default = "noskin"
:Default = "noskin"
:The skinsprite field defines a sprite that will be used to override the sprite value in any frame a thing of this type enters. This allows the creation of thingtypes which behave identically but look different without the creation of any new frames. Note that when things are crushed into gibs, the skinsprite is cleared at that time. If an Archvile resurrects such a thing, the proper skinsprite is then restored.
:The skinsprite field defines a sprite that will be used to override the sprite value in any frame a thing of this type enters. This allows the creation of thingtypes which behave identically but look different without the creation of any new frames. Note that when things are crushed into gibs, the skinsprite is cleared at that time. If an Archvile resurrects such a thing, the proper skinsprite is then restored.
:NOTE: for any use of '''skinsprite''', you need to add the sprite to the '''spritenames''' list, e.g. <code>spritenames += { SPRT }</code> (for a sprite named <code>SPRT</code>)
*'''defaultsprite'''
*'''defaultsprite'''
:Default = the object's first spawn state's sprite
:Default = NULL
:Controls the remapping behavior of skins for objects that use more than one sprite. Any frame not using the defaultsprite is ignored for remapping by the skin. If not set, the defaultsprite is adapted from the object's first spawn state.
*'''alphavelocity'''
*'''alphavelocity'''
:Default = 0.0
:Default = 0.0
:If nonzero, the thing's opacity (alpha value) will raise up to full solidity, or lower to full invisibility, depending on '''alphavelocity''''s sign and quantity per tic. If the '''CYCLEALPHA''' [[Thing type flags|flag]] is set, the thing will cycle between visibility and invisibility with this speed.
:If nonzero, the thing's translucency (alpha value) will cycle on and off by this velocity.
*'''xscale'''
*'''xscale'''
:Default = 1.0
:Default = 1.0
Line 626: Line 463:
:Default = 1.0
:Default = 1.0
:Sets how much the vertical component of the sprite is to be scaled.
:Sets how much the vertical component of the sprite is to be scaled.
====Pick-up effect====
*'''pickupeffect'''
:You can define the details of an item with the '''SPECIAL''' [[Thing type flags|flag]] in this block. See the [[pickupeffect|standalone block definition]] for explanation of the available fields.
*'''clearpickupeffect'''
:If added, it will clear the previous '''pickupeffect''' definition from an inherited '''thingtype''' or when using a '''thingdelta'''. By default it will be copied.
====ACS Spawn Data Sub-Block====
====ACS Spawn Data Sub-Block====
*'''acs_spawndata'''
*'''acs_spawndata'''
:Default = (nothing)
:Default = (nothing)
:This specifies the identification number for various parameterized specials, such as [[Thing_Spawn]] or [[Thing_SpawnNoFog]]. It also limits the number to a game namespace. For example, by default the Zombieman has
:This specifies the identification number for various parameterized specials that, if ran from the Hexen format, wouldn't support numbers higher than 255. It also limits the number to a game namespace. For example, by default the Zombieman has
  acs_spawndata { num 4; modes doom }
  acs_spawndata { num 4; modes doom }
:Heretic objects will use '''modes heretic''' instead of '''modes doom'''. To make it work for any game mode, use '''modes all''' or simply omit it. You shouldn't need to use '''modes''' in any custom mod unless it's available for more than one game.
:Heretic objects will use "modes heretic" instead of "modes doom".
:'''num''' must be between 0 and 255 inclusive.
[[category:EDF]]
 
==References==
This document has content from:
*New Bifrost features, on Eternity website: http://eternity.mancubus.net/text/bifrost_docs.txt
*Old documentation
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: