Jump to content
Search In
  • More options...
Find results that contain...
Find results in...
Sign in to follow this  

ZDoom Scrapbook

Recommended Posts

Hello there, everybody, some times ago I tried to make a scrapbook thread in ZDoom forums so that anybody with some useful info, who wanted to share it with others knowed where to write it and all of us who wanted to look for info about new features of ZDoom looked for it at this thread and easily find it.

That was bound to fail, because the forums did not bring the newest posts to the front and eventually it got out of sight, i.e. out of mind, so now I decided start a new scrapbooc here to prevent the problem.

I will add any bit and scrap of knowledge about ZDoom here and hope you help me to keep this fresh with your additional info about ZDoom, Its level design tips, Scripts, MapInfo and SndInfo tips, Dehacked addons, Troubleshooting...

You may want to write links to other forum threads or web pages or downloadable files after you described the target (better in detail), and quite frankly, self promotion is appreciated here, if it adds to the knowledge of the readers. ;)

The original thread was here: ZDoom Scrapbook and I will extract the useful info from it and add them here.

Thanx in advance.

P.S. I have just added bits and scraps at the end, but I know that some of you have the patience to collect info and post them in a more organized way (something like NiGHTMARE`s first post here); Please do so even if you think parts of it have already been posted here.

Share this post

Link to post


OK, well for a start, here's what I can remember off the top of my head as things that have been added to Dehacked since the last major release. There may well be more.

SNDINFO entry support

It is possible to put SNDINFO sound definitions directly into a dehacked patch, thereby getting past the limited numer of sounds supported by the original EXE


Thing 2 (Trooper)
Alert sound = grunt/sight
Death sound = grunt/death
Pain sound = grunt/pain
Action sound = human/idle

Bullet sounds

If you give a bullet puff a see sound, that sound will be played when an actor is hit. If you give it an attack sound, then that sound will be played when something else is hit. The puffs in Heretic and Hexen take advantage of this.


The translucency, and style of translucency can be set via a dehacked patch. Add the appropriate values to the things section for the item you want to change.

Alpha = (alpha amount)

Sets the alpha value for the thing. It can be in the range 0.0 - 1.0. You need to set an alpha value for many of the following effects.

Render Style = (style)

Specifies how to draw the thing. (Style) can be:
STYLE_None - Don't draw it at all
STYLE_Normal - Draw the thing without doing anything special
STYLE_Translucent - Draw the thing with regular translucency
STYLE_Add - Draw the thing using a type of translucency that keeps the
background at full intensity. (Useful for a brighter type of translucency.)
STYLE_Fuzzy - Draw with the fuzz effect.
STYLE_OptFuzzy - Draw with fuzz or translucency depending on the r_drawfuzz
STYLE_SoulTrans - Draw translucent, but use the transsouls cvar to get the alpha value.


Thing 14 (Net Dog)
Render Style = STYLE_Translucent
Alpha = 0.6

Thing Bits

There are some new thing bits

MCROSS allows the item to activate monster activatable lines

FLOORCLIP means the bottom of the object's sprites are clipped when standing on any flats with a floorclip value specified in the terrain lump.

FLOATBOB makes an item float and bob like a Heretic/Hexen powerup

Items can have their sprites scaled by putting in a scale value. 1 is no change to the size, 0.5 is half size etc.


Thing 131 (Example)
Scale = 0.5

Render styles

Code pointers

The following code pointers can be added to a frame


when played creates a damage radius effect (similar to code pointer 127 or Explode). The missile damage of the item sets the severity of the detonation.


Allows a monster to fire a railgun - damage is set by giving the monster concerned a missile damage.


Seems pretty self explanatory. When the pointer is played, it simply seems to kill the item in question.


Puts up a mushroom cloud of (I think) Mancubus fireballs


Can be used to toggle the floorclipping of an item


The thing vanishes, and reappears. I don't remember if this is a simple invisibility or if the thing effectively disappears off the map until UnHideThing is used - like the Hexen green serpent sludge monsters. I think it is the second option.


Toggle invulnerability for the thing


Toggle the item reflecting projectiles


Toggle invulnerability and reflectiveness in one go (like Hexen Centaurs).


Toggles whether a thing can be shot or not.


Thing stops responding to gravity.

Misc things

ie things to put in the misc section of a dehacked patch.

The rocket explosion type can be specified in a dehacked patch

Rocket Explosion Style
Rocket Explosion Alpha


Misc 0
Rocket Explosion Style = STYLE_Add
Rocket Explosion Alpha = 1.0

The ability to stop monsters infighting completely. This is currently a bit broken as it also makes them invulnerable to player projectile attacks.

Monsters Ignore Each Other = 1

Weapons section

The ammount of ammo a weapon uses can be tailored

Ammo use

sets how much the ammo count will go down per weapon code pointer played during the firing sequence. eg the super shotgun could be set to use 1 ammo or 20 ammo per shot

min ammo

Sets an ammo value that you have to have in your inventory before the weapon can be selected or fired (like the default behaviour of the BFG with less than 40 cells in the inventory)

Weapon 1 (Pistol)
Ammo use = 2
min ammo = 2

makes the pistol use 2 ammo per shot, and not allow it to be used with less than 2 bullets in the inventory.

Share this post

Link to post


And now a few other things that sprang to mind whilst thinking about the dehacked stuff. This is nowhere near an exhaustive list, just a few cool things I remembered.

Scripting stuff

The following can be spawned as projectiles in Doom to give the impression of rubble/dirt or glass shards as part of an explosion. Graphics resources need to be included in your wad - the ones from Hexen are just what the doctor ordered.

Rocks are spawn numbers (41-43)
dirt (44-49)
stained glass (54-63)

Healthing now accepts 2 parameters

If the second parameter is 0 it will use the thing's spawn health as max. 1 will use the soulsphere health as max. Anything greater than that will be the maximum possible. And monsters will always use their spawn health as max no matter what.

Thing_Damage (tid) can be used to damage a thing specified by tid, rather than just damaging the actor that started the script.


You can limit the number of sounds of one type plated in the same place using a SNDINFO command.


$limit [soundname] [maximum]. If [maximum] is 0, then any number of sounds can be played.


can be used as a sound entry to give the caco bite a sound.

Terrain stuff

Splashes can accept "none" as an actor to avoid wasting sprites on splashes you want to be sound only.

Splashes can be set to NoAlert so that the sound they make does not wake monsters.


splash dirt
smallclass None
smallclip 0
smallsound njmt

baseclass None
chunkclass None
chunkxvelshift 0
chunkyvelshift 0
chunkzvelshift 0
chunkbasezvel 0
sound floor/dirt


Also there is the ability to define new decoration and pick up items. Detailed in this thread.

Sounds Good

Share this post

Link to post



Render styles

I accidentally put this heading in. The stuff that was going to go in it ended up in the translucency section. No information is missing.

You can limit the number of sounds of one type plated in the same...

should be

You can limit the number of sounds of one type played in the same...

and I know the word amount should only have one m, not two. I know there are a few other minor typos in there too.

Interestingly enough, my spellchecker suggested that the word transsouls was really a mis spelled transsexuals.

Share this post

Link to post


Here are the bits that i tested but don't work:


Basicly, all the MF3_ flags don't work.

Here's the ones that DID work:

FireDamage - causes hexen enemies to go through burning frames
IceDamage - causes hexen enemies to freeze and break into tiny ice chunks
SeekerMissile - Causes seeking? not sure
WindThrust - You should know already...
CantLeaveFloorPic - haven't tested it...
NonShootable - Opposite of shootable? haven't tested it...

Share this post

Link to post

Randy Heit:

Here's something I don't think anybody knows about yet:

If you use sounds in your wad and they're not really short, you can compress them using Ogg Vorbis to save space. Just make sure they're mono.

Share this post

Link to post


And then of course there has been all that wonderful stuff added to enhance key bindings, console commands and config files.

Including, the ability to rebind keys in aliases, provide default bindings for keys, add your own entries to the key config menu and much more. Too much to try and consolidate here, but the main thread where it was discussed is below:

Key Binding?

Share this post

Link to post

Ty Halderman:

I've compiled a web page showing what I hope is current detailed information on how to use the variety of variables and arrays available in ACS in ZDoom. Now to see if I can just throw a link in here using my HTML skillz...

Variable use in ZDoom ACS script files

I'll drop a new note to the editing phorum as well since new stuff doesn't move to the top here.

Feedback welcome.

Share this post

Link to post


Oh yeah, on the terrain sounds thing. It is now possible to specify "none" as an actor for your splash. This allows you to add a "sound splash" without having to use up a splash graphic, as an invisible splash. Also, the NoAlert flag can be added to mean monsters will not react to the sound being played.


splash gravel
smallclass None
smallclip 0
smallsound njmt

baseclass None
chunkclass None
chunkxvelshift 0
chunkyvelshift 0
chunkzvelshift 0
chunkbasezvel 0
sound floor/gravel

Decorate lump instructions - copied from info from Randy (thanks Randy).

To create new decorations and pickups, you need to create a DECORATE lump. This is a regular text file that defines your new actors. The general form for a single decoration is:


<Name> is the decoration's name and needs to be unique among all the classes defined in the source code and any you define in DECORATE.

There are several properties you can use:

DoomEdNum <x> - <x> is the thing number you use to place it in an editor.

SpawnNum <x> - <x> is the number you use to create it with the Thing_Spawn specials.

Sprite <ABCD> - <ABCD> is the name of the sprite to use.

Frames "sequence" - The sequence of frames to use for the animation. I'll describe this further down.

Alpha <x> - <x> is a number in the range [0, 1] and modifies the RenderStyle.

RenderStyle <style> - <style> is the method used to draw this decoration. It can be one of:
STYLE_None - Invisible.
STYLE_Normal - Nothing special.
STYLE_Fuzzy - Spectre effect.
STYLE_SoulTrans - Translucent, amount comes from transsouls cvar.
STYLE_OptFuzzy - Spectre or translucent, depending on cvar r_drawfuzz.
STYLE_Translucent - Actor is see-through.
STYLE_Add - Actor is see-through and brightens the background.

Radius <x> - <x> is the "radius" of this actor's
bounding box.

Height <x> - <x> is it's height.

Translation1 <x> - <x> is 0, 1, or 2 and corresponds to the standard Doom translations of gray, brown, and red.

Translation2 <x> - <x> is in the range [0,31] and corresponds to a translation you set up in a level using ACS.

Solid - Blocks movement.

NoSector - Is not drawn but effects movement.

NoBlockmap - Is drawn but does not interact with the world.

SpawnCeiling - Spawns on the ceiling.

NoGravity - Does not fall with gravity.

LowGravity - Does not accelerate as quickly while

WindThrust - Can be thrust by wind. I'm not sure if I have this fully implemented yet. It works for Heretic's windy sectors, but I don't think it works with Boom wind yet.

SpawnFloat - Spawns at a random height between the floor and ceiling.

Pushable - Can be pushed.

CannotPush - Cannot push other things that get in the way if it's being pushed.

FloatBob - Bobs like Heretic's and Hexen's items.

Reflective - Reflects missiles.

DontSplash - Does not splash in liquids.

You can also create "fake" pickup items by adding the word pickup before the decoration's name. These behave just like normal items, except they just disappear when you touch them. The assumption is that you'll use the item's special to do something when a player picks it up. You can use a few more properties with pickups than you can with static decorations:

PickupMessage "text" - The message to print when the player picks it up. If you don't specify this, "You got a pickup!" is used.

PickupSound "sound" - The sound to play when the player picks it up. If you don't specify this, "misc/i_pkup" is played.

Respawns - This item can respawn after it's taken if the dmflags are set accordingly.

The Frames property is a special sequence of characters that defines the animation to use for the actor. A sequence definition looks like this:


Rate is a number describing the number of tics between frames in this sequence. If you don't specify it, then a rate of 4 is used. Frames is a list of consecutive frame characters. Each frame can be postfixed with the * character to indicate that it is fullbright.

ShortRedTorch looks like this:

HeadCandles looks like this:

TechLamp looks like this:

BloodyTwich looks like this:
"10:A, 15:B, 8:C, 6:B"

Notice that if you want an animation with a non-constant rate, you can use commas to separate multiple sequences in the string used with the Frames property.

Here are some things I created for testing that show working definitions in full:

DoomEdNum 20000
Sprite GOR1
Frames "1:A*B*C*B*, 10:ABCB"
Radius 16
Height 68

pickup SuperBlueKey
DoomEdNum 20001
Sprite BKEY
Frames "2:AB*"
PickupMessage "You got that funky key-like thing."
PickupSound "*xdeath"

Share this post

Link to post

Randy Heit:

Anyway, I want to talk about the set command. It can be more powerful than any of you seem to realize. Not only can it assign values to predefined cvars, but you can also create your own. Example:

set foobar 34

This creates a new cvar called foobar and assigns it the value 34. If foobar already exists, it just gives it the value 32 without creating a new cvar.

You can also take advantage of variable substitution to copy the value of one cvar into another:

set oldcrosshair $crosshair

This will set the value of oldcrosshair (creating it if neccessary) to match the value of crosshair. Variable substitution works with most commands, not just set, so you could do something like this:

echo The crosshair is $crosshair. It was $oldcrosshair.

(Caveat: Variable substitution with echo currently only works if the variable is the only word. I will fix this.)

Finally, if the variable already exists, set is optional. So "set autoaim 0" and "autoaim 0" are functionally equivalent. The only exception to this is when you pass console commands on the command line. In that case, you should explicitly specify the set command.

And since this thread is all about funky alias bindings, I'd like to add a very simple Scheme-like language to the console, so you can really create more than just simple aliases. Nijel's zoom script could look like this:

(alias startzoom (set basepitch m_pitch) (set baseyaw m_yaw) (set baseaim autoaim) (zoom1))
(alias zoom1 (startzoom) (fov 60) (m_pitch (* basepitch .6)) (m_yaw (* baseyaw .8)) (echo zoom setting 1) (autoaim 0) (r_drawplayersprites 0) (playsound scope) (rebind zoom2))
(alias zoom2 (fov 30) (m_pitch (* basepitch .3)) (m_yaw (* baseyaw .8)) (echo zoom setting 2) (playsound scope) (rebind zoom3))
(alias zoom3 (fov 10) (m_pitch (* basepitch .125)) (m_yaw (* baseyaw .2)) (echo Full zoom) (playsound scope) (rebind zoom0))
(alias zoom0 (fov 90) (m_pitch basepitch) (m_yaw baseyaw) (echo No zoom) (autoaim baseaim) (r_drawplayersprites 1) (playsound scope) (rebind zoom1))

That's just a taste of the sort of functionality I would like to add to the console, so I won't explain it too much. The syntax is slightly different from standard console commands, but it's basically the same. The significant new functionality here is that the player can keep their preferred m_pitch and m_yaw settings, and the zoom script will adapt. It also uses rebind so that it doesn't need to be used exclusively with the 8 key.

For some really interesting things, I do want to add support for conditionals like if, so the scripts can make decisions. Simple example:

(alias showrunning (if cl_run (echo You are running) (echo You are not running)))

However, this enhanced console language is not high on my priority list and may never get done. Do a lot of you think it would be a good addition? If so, I might make the time to add it sooner rather than later.

Share this post

Link to post

Randy Heit:

Thanks to suggestions in this thread, I have now added two new features that should be helpful:

  1. The command archivecvar. You use this to indicate that one of your user-created cvars should be saved in the ini file. (archivecvar oldcrosshair).

  2. The cvar atexit. This works similar to an alias, except it is executed automatically whenever you quit. Hmm... I should make this a command you can call multiple times without removing whatever was set with it before in case the user wants to mix different cfgs that each use atexit. That way you don't have to worry about overriding the atexit from another mod with your own.
I'll have to give some thought to saving custom keybindings on a per-mod basis, but it will probably use a command that you execute with atexit.

Share this post

Link to post

Randy Heit:

I have added two more console commands to make these scripts easier for the end-user to use. They are used to store bindings in a special ini section (so they don't get loaded if the user doesn't want them) and to also add them to the customize controls menu. They are

addkeysection menu_name ini_name

    This command does two things. First, it loads the bindings from the ini file in the [Game.ini_name.Bindings] and [Game.ini_name.DoubleBindings] sections. Second, it adds a new section to the controls menu with the title menu_name.
addmenukey description command
    This command adds a new key to the controls menu in the most recent section defined with addkeysection. Any keys bound to command will also be saved to the special ini sections described above.

This system requires that the command bound to a key remains constant, so you have to change aliases instead. A simple useless example of this would be executing the following from a cfg:
    addkeysection "Useless Example" UselessExample
    addmenukey "Show a Number" number
    alias number1 "echo 1; alias number number2"
    alias number2 "echo 2; alias number number3"
    alias number3 "echo 3; alias number number1"
    alias number number1
I plan to make it possible to automatically exec cfg files that appear at the beginning of the command line (like zdoom useless.cfg) so that users can simply drag the cfg on top of ZDoom to use it. Since I am leary of allowing wads to automatically execute console commands, I will add another command that only works in cfgs that can be used to load a wad at startup.

Is there anything else any of you want to see me add?

Share this post

Link to post

Just wanted to add some site addresses here:

Enjay`s place

A perfect place to learn about Dehacked and stuff, and some nice demo wads for ZDoom, and if you are lucky, you may have a peep at some unreachable *aspects* of Doom! :p

Rex`s Nexus

Some great example megawads to show off Zdoom features, he is a good designer, but be warned, because in that place you may get paranoid or experiment the darkets hour of your life! ;)

Share this post

Link to post

This is a slightly edited compilation of stuff from the ZDoom phorums to do with making creatures friendly, attack other creatures, etc.



Thing_Hate (tid1, tid2, type)

(note: tid1 and tid2 are required, but type is entirely optional)

Example of usage:

Thing_Hate (1, 2)

This makes the monster with TID #1 go after the monster with TID #2, with normal Thing_Hate behavior...

Thing_Hate must be set by script. Monsters can exist with tags assigned from the start, or can be spawned at any time in the game with a tag number. Those tag numbers are used by Thing_Hate. You can also use the ThingSetSpecial script to assign and unassign Thing_Hate.


0 - Behaves normally (everything with tid1 chases after the first thing with tid2 and then promptly forgets their hate once that thing dies)

1 - It and other actors with tid1 look for actors with tid2. If they can't find anything, they'll go back to sleep. They will ignore the player unless you attack them, in which case they'll start attacking you.

2 - Same as 1, but will chase after actors with tid1 without seeing them first

3 - Hunt actors with given TID and also players

4 - Same as 3, but will chase after monsters without seeing them first

5 - Hate actors with given TID and ignore player attacks

6 - Same as 5, but will chase after enemies without seeing them first

Using Thing_Hate with Thing_SetGoal

Example of usage:

Thing_Hate (1, 9999, 1);
Thing_SetGoal (1, 2, 0);

This makes the monster prefer to attack anything with TID 9999. As long as you don't have any things with that TID and it doesn't get attacked, it will follow the path starting at patrol point 2.

(note: this means you could have a level with marines just walking around, then have monsters teleport in which have a TID of 9999 or whatever, and the marines will start attacking them)


Thing_ChangeTID (oldtid, newtid)

Changes the TID of anything with oldtid to newtid. If oldtid is zero, then whatever activates it gets its TID changed to newtid.

Marine thing types

9100 Marine w/ Nothing
9101 Marine w/ Fist
9102 Marine w/ Berserk Fist
9103 Marine w/ Chainsaw
9104 Marine w/ Pistol
9105 Marine w/ Shotgun
9106 Marine w/ Super Shotgun
9107 Marine w/ Chaingun
9108 Marine w/ Rocket Launcher
9109 Marine w/ Plasma Rifle
9110 Marine w/ Railgun
9111 Marine w/ BFG 9000

Changing a marine's weapon


SetMarineWeapon (tid, weapon);

Substitute one of the following for weapon:


If you want a marine with a rocket launcher, you might also find this helpful:

SetActorProperty (tid, APROP_Health, new-health);

The marine's spawn health is only 100, they have no armor, and they have no sense to not fire when close to something. So if you get a marine with a rocket launcher in close quarters, he's almost sure to die unless you give him more health.

Check the zdefs.acs that comes with ACC 1.27 for other APROP_ values you can use. There's also a GetActorProperty (tid, property) command you can use to find out an actor's current value for a property.

Changing a marine's skin

Create a dummy thing with DECORATE to load the sprite:

Sprite XYZZ
Frames "A"

Then to make a marine use the sprite XYZZ instead of PLAY, use this command in a script:

SetMarineSprite (marine-tid, "SpriteXYZZ");

Note that you specify the name of the actor you created in DECORATE and not the sprite.

Thing Type #9076

This is a new invisible thing that you can make monsters attack using Thing_Hate. It's probably best to place this next to something solid, since it blocks projectiles (including the player's) and affects the player's aim. The angle you give it determines how much health it has, 1 degree is 10 hit points, 2 degrees is 20 hit points, etc. Give it an angle of 0, and it never dies. The angle field is used for this instead of one of the argument fields so that it can still execute a death special.

(note: there are many possible uses for this. One obvious one is to make a marine with a rocket launcher appear to destroy a wall)

Share this post

Link to post

Enjay: from boomdeh.txt

The basic Dehacked file is understood and properly evaluated to change
such things as sounds, frame rewiring, Thing attributes, etc. No change
is required to the original .deh file for those things. However, text
is handled differently in BOOM for several reasons:

1. Dehacked by the nature of the program was simply doing a search and
replace action on the strings as found in the executable. This is
clumsy and dangerous, though as good as can be done when dealing with
a compiled executable program. We now have the ability to change the
actual string values during play, a safer and better solution.

2. Because Dehacked used the original string to find the place to
plug in the replacement, there was no way to write a generic hack that
would replace strings in all versions regardless of language. In BOOM,
the strings are identified by their names, which are the same in all

3. Because Dehacked was replacing strings in a physical location in
the program file, it was limited to approximately the same size string
as the original. Though this is generally practical, it is limiting in
flexibility. BOOM allows any length string to replace any of the ones
in the game (this also applies to cheats).

4. The purpose of replacing a string is to show the player some text
at a particular point in the game. Finding the original text that was
there and replacing it with other text worked, but logically what the
author should have been able to do was assign strings depending on the
desired purpose, and not have to recognize the original text to do so.
In BOOM, all strings are identified by a mnemonic name (actually the
name of the internal variable), making it easier to assign a string to
its desired purpose. In later versions we may also make other aliases
for some of those.

Share this post

Link to post


Hi, here's a tip to zoom in:
Put in zdoom.cfg:
alias +fz "fov 20;m_pitch 0.07;m_yaw 0.07;"
alias -fz "fov 90;m_pitch 0.2;m_yaw 0.2;"
bind "f" "+fz"

Now pressing f zoom's in and releasing f zoom's out. I guess most of you know this

Or this one: pressing q selects md2 models, pressing q again returns sprites:
alias "md2" "+md2"
alias "+md2" "g_bmd2 1;alias md2 -md2;"
alias "-md2" "g_bmd2 0;alias md2 +md2;"
bind "q" "md2"

Any of you have other alias/binding tips?

Share this post

Link to post


Ok. Let's say you have a script for the player, where you've set everything up and he's got, say a shotgun full of shells when the game loads.

Now, you take the same script and change the weapon to the chain gun. So, now you have two seperate scripts.

Let's say you make a front-end that has two buttons - one for each script version. So, you've got Player one with one script that gave him the Shotgun, and Player two enters running the other script that gives him the chain gun.

Will there be any errors or problems? Or are the scripts specific to THAT player.

I guess the easiest way of looking at it is as if you had a different script for each of the 8 players, each script giving the player a different weapon.

If the actual weapons are unchanged and the scripts are simply applying the weapon and ammo to the player, will that screw things up?

Randy Heit:

Use LilWhiteMouse's suggestion. If you want to make it slightly faster, you can rewrite it like this (be sure each case ends with a break):

script 1 ENTER
switch (PlayerNumber ())
case 0:
GiveInventory ("Shotgun", 1);
GiveInventory ("Shell", 200);

case 1:
GiveInventory ("Chaingun", 1);
GiveInventory ("Clip", 200);

// Add cases 2-7 here if you want them:
case 2:

Share this post

Link to post

Randy Heit:

Functions look like C's, except you need to use the function keyword.

A function that returns a value:

function int MyFunction (int parameter1, int parameter2)
// do something
return something_else;

A function that does not return a value:

function void MyFunction2 (int parameter1, int parameter2)
// do something

Note that functions cannot do anything that would make the script wait, such as calling delay or tagwait.

Share this post

Link to post

RandomLag: about attenuated sound definition in SNDINFO lump

Forgot the stupid gt and lt sign stuff, the () are normally lt, gt

$ambient (num) (logical name) [point [atten]|surround] (type) [secs] (relative volume)



Share this post

Link to post

Randy Heit:

To be sure anyone who reads this thread understands, despite what macvilewhore said, do not copy and paste the entire SNDINFO from zdoom.wad into your own wad. It contains entries that are meant to be read only once. Your SNDINFO should only contain those parts that you want to change/add.

Share this post

Link to post

Randy Heit:

In ZDoom 2.0.46, you can create new projectiles using DECORATE. The format is basically the same as for normal decorations, except you add the keyword "projectile" before its name, and you get to define the following additional properties:

DeathSprite - Sprite used when the projectile "dies".

DeathFrames - Animation sequence when the projectile "dies".

ExplosionRadius - Distance from the projectile's impact that its explosion can be felt.

ExplosionDamage - Amount of explosion damage done at the projectile's impact site. This is separate from Damage, and if you don't specify it, it will be the same as ExplosionRadius.

DoNotHurtShooter - Explosion damage does not hurt the thing that shot it.

DamageType - Can be one of Normal, Fire, or Ice.

Speed - How fast the projectile moves when you spawn it with the summon cheat.

SpawnSound - Sound the projectile makes when it spawns.

DeathSound - Sound the projectile makes when it "dies".

And here's the projectile I used for testing:

projectile FooShot
SpawnNum 255
Sprite PLSS
Frames "24:AB"
DeathSprite PLSE
DeathFrames "ABCDE"
Radius 13
Height 8
Speed 70
Damage 1
SpawnSound "weapons/plasmaf"
DeathSound "weapons/rocklx"
ExplosionRadius 1024
ExplosionDamage 16
DamageType Ice

Randy Heit:

Woo, I didn't even give a description for Damage. This is the damage the projectile does to whatever it directly hits and is actually a random amount based on the value you specify for it here.

Share this post

Link to post

Randy Heit:

Decorations that you can break:

Add breakable before the decoration's name, and you can give it the following properties in addition to the standard decoration properties:

DeathFrames - Like frames, but gets played when the actor dies.

IceDeathFrames - Like DeathFrames, except it is used when the actor freezes to death.

BurnDeathFrames - Like DeathFrames, except it is used when the actor burns to death.

GenericIceDeath - Like IceDeathFrames, except you don't specify any frames here. The game will create a generic ice death for you.

BurnsAway - If you include this, then the thing disappears after it finishes the BurnDeathFrames animation. Otherwise, it stays at the last frame in the sequence.

DiesAway - Like BurnsAway, but it applies to normal DeathFrames instead.

DeathHeight - How tall the actor is after a normal death.

SolidOnDeath - Include this, and the actor will stick block you after it dies. Useful with DeathHeight.

BurnHeight - How tall the actor is after a burning death.

SolidOnBurn - Include this, and the actor will still block you after it burns to death. Useful with BurnHeight.

DeathSound - Sound the actor makes during a normal death.

BurnDeathSound - Sound the actor makes during a burning death.

Health - The actor's initial health.

Here's the decoration I used for testing (needs hexen.wad):

breakable FooTree
Sprite TRDT
Frames A
DeathFrames BCDEFG
BurnDeathFrames H*I*J*K*L*M*N*OPQ
BurnDeathSound TreeExplode
BurnHeight 20
DeathHeight 20
DeathSound BishopDeath
Radius 15
Height 180
Health 70
Mass 700000

Note that the only death you need to include is the normal one. You don't need to provide an ice death and a burn death if you don't want to.

Share this post

Link to post

The Ultimate DooMer:

Is there a property similar to the passmobj flag?


It's called 'CanPass' in DECORATE.

Share this post

Link to post


Full syntax for code pointers:

FRAME 118 = Detonate
FRAME 119 = null
FRAME 199 = SetReflectiveInvulnerable
FRAME 200 = FaceTarget
FRAME 201 = CyberAttack
Frame 283 = MonsterRail

etc etc

Bits are applied to the item section, eg

Thing whatever (whatever)
Initial frame = number
Hit points = number

The MF, MF2, MF3 and MF4 bits refered to above are applied as follows

MF - just like the example above
MF2 - They reset other bits the item has, so you need to include all the bits you want in your bits line (eg making a projectile be able to freeze enemies resets its noteleport, pcross and impact bits so you put all these on the bits line)
MF3 - Cannot be applied via dehacked - I'm not aware of any plans to change that.
MF4 - I *think* these are essentially "beta bits". They are included, should work, but Randy give no guarantees.

All the bits can be found in actor.h of the source code. Ahhh sod it, here they are...

// --- mobj.flags ---

MF_SPECIAL = 0x00000001, // call P_SpecialThing when touched
MF_SOLID = 0x00000002,
MF_SHOOTABLE = 0x00000004,
MF_NOSECTOR = 0x00000008, // don't use the sector links
// (invisible but touchable)
MF_NOBLOCKMAP = 0x00000010, // don't use the blocklinks
// (inert but displayable)
MF_AMBUSH = 0x00000020, // not activated by sound; deaf monster
MF_JUSTHIT = 0x00000040, // try to attack right back
MF_JUSTATTACKED = 0x00000080, // take at least one step before attacking
MF_SPAWNCEILING = 0x00000100, // hang from ceiling instead of floor
MF_NOGRAVITY = 0x00000200, // don't apply gravity every tic

// movement flags
MF_DROPOFF = 0x00000400, // allow jumps from high places
MF_PICKUP = 0x00000800, // for players to pick up items
MF_NOCLIP = 0x00001000, // player cheat
MF_SLIDE = 0x00002000, // keep info about sliding along walls
MF_FLOAT = 0x00004000, // allow moves to any height, no gravity
MF_TELEPORT = 0x00008000, // don't cross lines or look at heights
MF_MISSILE = 0x00010000, // don't hit same species, explode on block

MF_DROPPED = 0x00020000, // dropped by a demon, not level spawned
MF_SHADOW = 0x00040000, // actor is hard for monsters to see
MF_NOBLOOD = 0x00080000, // don't bleed when shot (use puff)
MF_CORPSE = 0x00100000, // don't stop moving halfway off a step
MF_INFLOAT = 0x00200000, // floating to a height for a move, don't
// auto float to target's height
MF_INBOUNCE = 0x00200000, // used by Heretic bouncing missiles

MF_COUNTKILL = 0x00400000, // count towards intermission kill total
MF_COUNTITEM = 0x00800000, // count towards intermission item total

MF_SKULLFLY = 0x01000000, // skull in flight
MF_NOTDMATCH = 0x02000000, // don't spawn in death match (key cards)

MF_UNMORPHED = 0x10000000, // [RH] Actor is the unmorphed version of something else
MF_NOLIFTDROP = 0x20000000, // [RH] Used with MF_NOGRAVITY to avoid dropping with lifts
MF_STEALTH = 0x40000000, // [RH] Andy Baker's stealth monsters
MF_ICECORPSE = 0x80000000, // a frozen corpse (for blasting) [RH] was 0x800000

// --- mobj.flags2 ---

MF2_LOGRAV = 0x00000001, // alternate gravity setting
MF2_WINDTHRUST = 0x00000002, // gets pushed around by the wind specials
MF2_BOUNCE1 = 0x00000004,
MF2_BLASTED = 0x00000008, // actor will temporarily take damage from impact
MF2_FLY = 0x00000010, // fly mode is active
MF2_FLOORCLIP = 0x00000020, // if feet are allowed to be clipped
MF2_SPAWNFLOAT = 0x00000040, // spawn random float z
MF2_NOTELEPORT = 0x00000080, // does not teleport
MF2_RIP = 0x00000100, // missile rips through solid targets
MF2_PUSHABLE = 0x00000200, // can be pushed by other moving actors
MF2_SLIDE = 0x00000400, // slides against walls
MF2_ONMOBJ = 0x00000800, // actor is resting on top of another actor
MF2_PASSMOBJ = 0x00001000, // Enable z block checking. If on,
// this flag will allow the actor to
// pass over/under other actors.
MF2_CANNOTPUSH = 0x00002000, // cannot push other pushable mobjs
MF2_THRUGHOST = 0x00004000, // missile will pass through ghosts [RH] was 8
MF2_BOSS = 0x00008000, // mobj is a major boss
MF2_FIREDAMAGE = 0x00010000, // does fire damage
MF2_NODMGTHRUST = 0x00020000, // does not thrust target when damaging
MF2_TELESTOMP = 0x00040000, // mobj can stomp another
MF2_FLOATBOB = 0x00080000, // use float bobbing z movement
MF2_BOUNCE2 = 0x00100000,
MF2_IMPACT = 0x00200000, // an MF_MISSILE mobj can activate SPAC_IMPACT
MF2_PUSHWALL = 0x00400000, // mobj can push walls
MF2_MCROSS = 0x00800000, // can activate monster cross lines
MF2_PCROSS = 0x01000000, // can activate projectile cross lines
MF2_CANTLEAVEFLOORPIC = 0x02000000, // stay within a certain floor type
MF2_NONSHOOTABLE = 0x04000000, // mobj is totally non-shootable,
// but still considered solid
MF2_INVULNERABLE = 0x08000000, // mobj is invulnerable
MF2_DORMANT = 0x10000000, // thing is dormant
MF2_ICEDAMAGE = 0x20000000, // does ice damage
MF2_SEEKERMISSILE = 0x40000000, // is a seeker (for reflection)
MF2_REFLECTIVE = 0x80000000, // reflects missiles

// The three types of bounciness are:
// HERETIC - Missile will only bounce off the floor once and then enter
// its death state. It does not bounce off walls at all.
// HEXEN - Missile bounces off of walls and floors indefinitely.
// DOOM - Like Hexen, but the bounce turns off if its vertical velocity
// is too low.


// --- mobj.flags3 ---

MF3_FLOORHUGGER = 0x00000001, // Missile stays on floor
MF3_CEILINGHUGGER = 0x00000002, // Missile stays on ceiling
MF3_NORADIUSDMG = 0x00000004, // Actor does not take radius damage
MF3_GHOST = 0x00000008, // Actor is a ghost
MF3_ALWAYSPUFF = 0x00000010, // Puff always appears, even when hit nothing
MF3_SPECIALFLOORCLIP= 0x00000020, // Actor uses floorclip for special effect (e.g. Wraith)
MF3_DONTSPLASH = 0x00000040, // Thing doesn't make a splash
MF3_NOSIGHTCHECK = 0x00000080, // Go after first acceptable target without checking sight
MF3_DONTOVERLAP = 0x00000100, // Don't pass over/under other things with this bit set
MF3_DONTMORPH = 0x00000200, // Immune to arti_egg
MF3_DONTSQUASH = 0x00000400, // Death ball can't squash this actor
MF3_EXPLOCOUNT = 0x00000800, // Don't explode until special2 counts to special1
MF3_FULLVOLACTIVE = 0x00001000, // Active sound is played at full volume
MF3_ISMONSTER = 0x00002000, // Actor is a monster
MF3_SKYEXPLODE = 0x00004000, // Explode missile when hitting sky
MF3_STAYMORPHED = 0x00008000, // Monster cannot unmorph
MF3_DONTBLAST = 0x00010000, // Actor cannot be pushed by blasting
MF3_CANBLAST = 0x00020000, // Actor is not a monster but can be blasted
MF3_NOTARGET = 0x00040000, // This actor not targetted when it hurts something else
MF3_DONTGIB = 0x00080000, // Don't gib this corpse
MF3_NOBLOCKMONST = 0x00100000, // Can cross ML_BLOCKMONSTERS lines
MF3_CRASHED = 0x00200000, // Actor entered its crash state
MF3_FULLVOLDEATH = 0x00400000, // DeathSound is played full volume (for missiles)
MF3_CANBOUNCEWATER = 0x00800000, // Missile can bounce on water
MF3_NOWALLBOUNCESND = 0x01000000, // Don't make noise when bouncing off a wall
MF3_FOILINVUL = 0x02000000, // Actor can hurt MF2_INVULNERABLE things
MF3_NOTELEOTHER = 0x04000000, // Monster is unaffected by teleport other artifact
MF3_BLOODLESSIMPACT = 0x08000000, // Projectile does not leave blood
MF3_NOEXPLODEFLOOR = 0x10000000, // Missile stops at floor instead of exploding
MF3_WARNBOT = 0x20000000, // Missile warns bot
MF3_PUFFONACTORS = 0x40000000, // Puff appears even when hit actors
MF3_HUNTPLAYERS = 0x80000000, // Used with TIDtoHate, means to hate players too

// --- mobj.flags4 ---

MF4_NOHATEPLAYERS = 0x00000001, // Ignore player attacks
MF4_QUICKTORETALIATE= 0x00000002, // Always switch targets when hurt
MF4_NOICEDEATH = 0x00000004, // Actor never enters an ice death, not even the generic one
MF4_BOSSDEATH = 0x00000008, // A_FreezeDeathChunks calls A_BossDeath
MF4_RANDOMIZE = 0x00000010, // Missile has random initial tic count

And the code pointers, which I thin the original question was about. These come from d_dehackedactions.h





Share this post

Link to post


Randy is there a way to define names for ambient sounds for zeth?

also new graphic and names for items designed by DEHACKED or DECORATE lumps?

For instance I want to make a new resource file for ZDoom and I want to add some cfg files to be added to Zeth for easy use of new features inside the resource file.

Randy Heit:

See the existing cfg files. You can create enum lists for anything you want, including ambient sounds. And new things are added just like the existing ones.

Share this post

Link to post

Randy Heit:

My attempt at a simple explanation of using libraries:

Put all your common scripts and functions that you want to be used for each map in a single .acs file. At the top of that file, before #include "zcommon.acs", add a #library line, so it looks like this:

#library "somelib"
#include "zcommon.acs"
. Rest of library's code goes here

The name after #library is the name it will have inside the wad. In this case, it's somelib. You need to compile this .acs file with ACC and insert it into the wad between A_START and A_END markers using this name, so somewhere in the wad directory, you have this:


Then at the beginning of your script's code, you use #import to tell the map that you want to use the scripts and functions from that library. The #import should come after the #include "zcommon.acs". #import is sort of like a fancy version of the #include command. Note that the name you use with #import is the of the .acs script file and not its name inside the wad:

#include "zcommon.acs"
#import "zoom-shared.acs"
. Rest of map's scripting goes here

If you don't understand all that, looking at the example from LilWhiteMouse should clear things up.


Sorry for the delay, haven't been able to get into the forum. A very simple demo: DemoLib
The *.ACS is the library script that I compiled and inserted between the two A_START/A_END markers.

Randy Heit:

You can only declare variables with world scope.

Share this post

Link to post

Here's an update to what I posted in the original thread:

SeekerMissile - Used by the hexen bishop projectiles to keep track of the player's position.(Use Tracer Code Pointer instead)
WindThrust - Heretic wind sector special pushes this thing(but not Boom wind!).
CantLeaveFloorPic - The monster can't leave the floor type it was spawned on(monsters spawned over water are blocked by land and vice-versa).
NonShootable - Hitscan weapons pass through this thing(eg. Doom marble pillar)

Oops, I forgot to read the entire thread before posting... Sorry about that.

Share this post

Link to post

neat, I've been keeping a bunch of crap on the new features for my own ref, it's just a bunch of txt files, I was originally gonna make it public or something but i never got around to it but:


Share this post

Link to post

Ok, to add a little bit more info to Cyb's codeptr.txt:

282 - Causes the Archvile's flame to stick to whatever the archvile is targeting. The code pointer does nothing if the target moves out of the Archvile's line-of-sight

786 no longer crashes when there is no spawn point on the level.

Monster code pointers can now be used on weapon frames.

257 enables radius explosion when used before 264

Share this post

Link to post

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this