Modern features for Blood mappers
[Apr 16 2023]

This is off-line version! Please visit to stay updated!

The following features was made by NoOne and it's fully supported by NBlood and Raze source ports. The latest dev builds always available on (for NBlood) or (for Raze).

I'm not against to add same features in all other existing ports and maintain it. If authors is interested, they can just mail me to or search for me in Discord channel dedicated to Blood so we can discuss it. Coders may also visit modern features on GitHub.

Hope this helps to make maps better than ever and generally turn map editing to the next level. Adding even more new features is planning as well. If you have any questions, problems, bug reports or suggestions, you may use contacts above to talk with me. The same you can do if you want to update, for instance, my "perfect" english in this documentation.


There is two ways to let the port(s) know that you are aiming for modern level design:

  1. Put an magic sprite in the map.

    1. Put an sprite.
    2. Press [ALT] + [F6] on it in 2d mode to edit it's properties.
    3. Set RX ID and TX ID to 60.
    4. Set Cmd to 100: 36.
  2. Enable save map file with new version in the editor.

    If you are using XMAPEDIT, you must open XMAPEDIT.INI, which usually can be found in XMAPEDIT directory, search for [General] section and change "SaveAsModernMap" value to 1. If you stick with PMAPEDIT, you must apply a patch that makes the edtor save the map with version 7.1. Note that using it is not recommended since is not supported anymore.


  1. Apr 16 2023

    • Large update for Custom dude (type 254) type. Now it using completely new system and allows to setup way more parameters. Refer to chapter to get the details.
  2. Dec 03 2022

  3. Aug 18 2022

  4. Mar 25 2022

  5. Aug 03 2021

  6. May 09 2020

  7. Jan 14 2020

    • Support of BloodGDX port is discontinued.
    • New modern type Player Control was added! It designed to change many various player properties right in the game. It can do:
      • Change movement speed and jump height.
      • Set player's look and rotate angles.
      • Play QAV animations instead of weapon or in fullscreen.
      • Play screen effects (delirium, pain, darkening and so on).
      • Copy properties of it's sprite to player sprite, so it's possible to use player RX channels.
      • Operate with inventory: give or erase weapons, items, keys and so on.
    • Player RX channels was added.
    • Update for Properties changer type.
    • Update for Effect Gen type.
    • Update for Resizer type.
    • Update for Damager type.
    • Update for Custom Dude Spawn type.
    • There is some cool features has been added for Custom dude
      • Dynamic dispersion.
      • Dynamic damage resistance.
      • Dynamic attack distance.
      • Much better behavior when attacking the target.
  8. Sep 09 2019

    • There was added physics control for PropertiesChanger type!
    • New features has been added for Path Marker type.
    • 1-way switch type now working for walls.
    • Teleport Target type can now be triggered!
    • New features has been added for Ecto Skull Gen (aka Missile Gen) type.
    • New features has been added for Data changer type.
    • New features has been added for Picture changer type.
    • New features has been added for Damager type.
    • New features has been added for SFX Gen.
    • New features has been added for RandomTX type.
    • New modern type Inc-Dec has been added.
    • New features for SEQ Spawner type.
    • New features for Effect Gen type.
    • Update and new features for Sector wind generator type.
    • New features for SequentialTX type.
    • Custom dude
      • Can have different mass: the bigger sprite and clipdist, the greater mass.
      • Can use custom clipdist (mass multiplier).
      • Can damage target by stomp if heavy enough.
      • Recoil chance now counts by taking in account weapon type and mass. The greater mass, the less chance to recoil dude. If is melee, the chance is even less than usual.
      • Burning state is now optional.
      • Electrocution state is now optional.
      • Underwater states is now optional.
      • Duck states is now optional.
      • Can be Kamikaze.
      • Can summon other enemies.
    • Updates for random item generators.
    • Proximity trigger flag has been updated.
    • Touch trigger flag has been updated.
    • Sight trigger flag is now working.
    • New features for PropertiesChanger type.
    • Item Shrink Shroom is now working.
    • Item Grow Shroom is now working.
    • New features for weapon, ammo and health pickups, also check this one.
    • General update for most of modern types. It now supports to send any command to destination object. Command 5: Link = just perform operations and don't change state or trigger destination object, while other commands will trigger object after generator operations was performed.
    • A lot of minor changes and fixes.
  9. May 05 2019

    • I'm happy to announce that NBLOOD port officially support all of the features! I will now add new features to both GDX and NBLOOD and continue their support.
    • Changes for SequentialTX type
  10. Mar 07 2019

  11. Feb 03 2019

    • Initial release of this document.

Modern features

Dec 03 2022

  1. Gib and Explode objects (Types 416, 417) has been updated. It now allows to spawn gibs on TX ID sprites and setup gib FX appearance in details. You can override picnum, palette and many other properties by setting required flags.

    • data1 = set gib FX type 1
    • data2 = set gib FX type 2
    • data4 = sound ID to play
    • busyTime = set custom remove timer (in ticks, 0 is default).
    • hi-tag = gib FX appearance settings:
      • flag1: inherit palette
      • flag2: inherit shade
      • flag4: inherit x and y repeat
      • flag8: inherit tile
      • flag16: inherit cstat (except invisible)
      • flag32: inherit angle
      • flag64: inherit from destination sprite (from source otherwise)
      • flag128: spawn gibs on TX ID sprite(s)


    Data Name Description
    1 Glass shards (triangular) Fall to the ground and disappear
    2 Glass shards (long) Fall to the ground and disappear
    3 Burning Wood chunks Fall to the ground and disappear
    4 Wood chips Fall to the ground and disappear
    5 Bones Fall to the ground and disappear
    6 Particles (orange) Fall to the ground and disappear
    7 Particles (blue) Fall to the ground and disappear
    8 Meat chunks Fall to the ground and leave blood stains for a few seconds
    9 Bubbles (small) Fall to the ground and disappear
    10 Bubbles (medium) Float up to the ceiling and disappear
    11 Bubbles (large) Float up to the ceiling and disappear
    12 Glass shards (triangular) Fall to the ground and disappear, but more dense
    13 Glass shards (long) Fall to the ground and disappear, but more dense
    14 Colored glass shards Fall to the ground and disappear
    15 Burning wood chips Fall to the ground and disappear
    16 Hands, eyes and stuff Fall to the ground and remain there
    17 Meat, bones, shards and particles Fall to the ground and leave blood stains for a few seconds
    18 White particles (small) Fall to the ground and disappear
    19 Meat chunks Fall to the ground and leave blood stains for a few seconds
    20 Rock chunks Fall to the ground and disappear
    21 Burning paper Fall to the ground and disappear
    22 Leaves Fall to the ground and disappear
    23 Sparks (vertical) Go up and down and disappear
    24 Sparks (horizontal) Go left and right and disappear
    25 Sparks and particles Sparks go horizontal and disappear
    26 Flames 1 Go horizontal and then up a bit and disappear
    27 Flames 2 Fall to the ground and disappear
    28 Zombie head stack Gives 3 heads with blood stains for a few seconds, but the heads will remain
    29 Mime parts Fall to the ground and remain
    30 Hellhound parts Fall to the ground and remain
    31 Gargoyle parts Fall to the ground and remain
  2. Blood and Water drip generatos (Types 701, 702) got update as well. It's allowed to disable annoying drip sound or replace it with your own. It also allowed to set initial falling speed of a drip. If sprite have TX ID, the drips will be spawned on destination sprites.

    • data1 = randomize busyTime
    • data2 = sound ID to play
      • -1: mute the sound
      •  0: play default sound
      •  N: custom sound ID
    • data4 = initial drip falling multiplier

Aug 18 2022

  1. Event Causer TX Channel (TX ID 50)

    Every action in the game can be treated as an event. For example when you pressing a switch, enter sector, touching walls or even destroying gib objects, the game produces an event, which may send command on given TX ID. Sometimes we may need to send command on object if it does not have an RX ID assigned or it's ID is unknown. For that a special TX ID 50 is created.

    event causer

    In this example the Damager have TX 50 (event causer channel) which leads to interesting result: it does the damage (sends the command) to any sprite in proximity radius even if the destination sprite RX ID is unknown. This allows to create a complex and very flexible trigger sequences, especially in conjunction with conditional triggers (IF).

    There is some limitations, however: objects that using TX 50 must send the command immediately - using waitTime is not safe, because the command may be send to the wrong object.

  2. Move outside sprites with movable sector

    It's possible to make sprites that were attached to outside walls of movable sector to travel with that sector automatically. This means that there is no need to create a second sector which duplicates properties of the first one anymore.

    sprites near z-motion sector

    In this example the sprites placed outside the Z-motion sector, but still close enough to it's walls. Once that sector activates and ceiling moves, the sprites will travel in tact.

    For obvious reason this feature intended for all sectors that is supposed to move, but not for marked sector types. For example it works for "Rotate" type, but not for "Rotate Marked", works for "Slide" and "Z-motion", but doesn't for "Slide marked" and "Z-motion SPRITE".

    To make this feature work, you need to place sprites close to the walls of sector you want to travel sprites with. Each sector can move up to 256 sprites. The distance between walls and the sprite cannot be longer than 16. Also, to avoid conflicts, sector which contains the sprites cannot be movable and always must be next to the walls of the target sector.

    After that you need setup sprites just like you do it for common traveling e.g. blue sprites travels in sector direction and green sprites in opposite. For Z-Motion blue sprites means that it travels with floor and green means that it travels with ceiling.

Aug 03 2021

  1. Dude flags and patrolling

    .MAP It's possible to make patrol location by any enemy that can move with using Path Marker (type 15) and dude flags. Basically, this means that AI will follow from one marker to another and go back when is not found. The next marker can be referenced to any of previous markers and can be inserted in underwater sectors, so you can make loops and do many other interesting things which makes your maps more alive.

    You must first actually create at least one marker; just put sprite and set type 15. The first marker enemy selects is always the closest marker it can see and it must have no "Locked" or "DudeLockout" flags enabled. There is two ways to make enemy to follow it:

    • The first one and the easiest way is to just set dude flag "P" (aka "Reserved" in vanilla MAPEDIT) in the enemy sprite properties. This means that dude will follow markers once level started.
    • The second one allows to start (or stop) patrol by sending command "Set Dude Flags" to the destination enemy sprite from any source sprite by RX/TX system. Enemy that receive this command will inherit states of all dude flags.

    What if you want the enemy to follow another marker after first one is reached? Just create second marker same way you did it for the first, but set data1 (id of the marker) value, then get back to the first marker and set data2 (id of the next marker) according to data1 of the second one. This is very same way you setup path for sectors. If you create two or more markers with same ID, the AI will select next marker randomly, which could make path a bit unpredictable for the player.

    image Linear patrolling

    image Marker branches

    Path marker that gets reached (see clipdist) by the enemy will be automatically triggered if have TX ID or Command 15 (Set Dude Flags). If it have no TX ID, but still have "Set Dude Flags" command, all dude flags that marker have will be inherited by the enemy that just reached it. This allows you to change dude flags dynamically, but may also lead to unexpected results such as breaking the patrol when is not supposed to be stopped, so you have to be carefully.

    Sometimes it may be useful make enemy to stay for some period of time before it goes to the next marker. There is two ways to make it possible: by enterring fixed value in the waitTime field of the marker after which it starts the move again (similar to path sector) or set same values in both data1 (marker id) and data2 (next marker id) which makes the enemy stay until target is spotted. The second way is very useful to build dynamic path using Data Changer or Inc-Dec since you can change data values.

    If you want to break the patrol once marker gets reached, you may set value of the data2 (next marker) to -1 or set it to -2 if you want enemy to go back same path.


    • clipDist = defines the radius at which the marker treated as reached for the enemy.
    • goingOn = trigger marker when enemy reached it.
    • goingOff = trigger marker when enemy leaves it.
    • 1-shot = enemy can visit this marker only once.
    • busyTime = enemy velocity.
    • hi-tag = flags:
      • flag1: enable enemy crouching.
      • flag2: disable enemy crouching.
      • flag3: toggle enemy crouching.
      • flag4: do not turn to the marker's angle at all.
      • flag8: do not turn 180deg relative to marker's angle when coming back.
      • flag16: enables turning in random direction with random delay while waiting.

    Let's back to the dude flags.
    The rest of it ((D)eaf, (B)lind, (A)larm, (S)tealth) currently are working only when patrol flag is active and brings additional effects to the enemy:

    Deaf The enemy is deaf, so the player can be spotted with a sight or touch only.
    Blind The enemy is blind, so the player can be spotted with a hear or touch only. This flag also known as dudeGuard in vanilla mapedit.
    Alarm The enemy will activate all other enemies in sight radius once player is spotted. If there is other enemies in patrol and have Alarm flag checked, it will activate enemies that they see too. This flag also known as dudeAmbush in vanilla mapedit.
    Stealth A special flag that brings some kind of stealth mechanics. This allows the player to sneak around while enemies patrol the location without being spotted immediately. In case if enemy is not Blind nor Deaf, there is spot progress bar will appear on the top of enemy sprite. Player's velocity, race, some sounds, as well as crouching affects spot radius and speed of spot progress.

    See also IF conditions related to dude flags and Stealth region markers that allows to modify spot chance of the enemy.

  2. Enable or disable Damage Sectors

    Damage Sector will do the damage only when is enabled (State: 1 On). This allows you to control it via TX/RX system and commands.

Jan 14 2020

  1. .MAP Sometimes it may be useful to send command on player's sprite. For instance, you could make Effect Generator to spawn any of effects directly on player's location. This way you could achieve bleeding, if you select "Red blood Trail" effect. For that special Player RX Channels was created.

    • TX ID: 30 - Player 1
    • TX ID: 31 - Player 2
    • TX ID: 32 - Player 3
    • TX ID: 33 - Player 4
    • TX ID: 34 - Player 5
    • TX ID: 35 - Player 6
    • TX ID: 36 - Player 7
    • TX ID: 37 - Player 8
    • TX ID: 38 - All players

    Player channels supported by all types, include vanilla ones. So, you probably want to experiment with those a lot to get interesting results.

Sep 09 2019

  1. .MAP Teleport target (Type 8) can be triggered via RX ID channel and teleport any TX ID sprite or player from any to it's sprite location! It may be useful to teleport path markers to change path sector's way or player without need to enter the sector. It can also teleport other teleport targets, so it's possible to create complex combinations! There is also few options to control how exactly sprite should be teleported available:

    • data1 = number of player to teleport (if TX ID is not specified)
      • 0: [ player that caused the event ]
      • 1: player #1
      • 2: player #2
      • 3: player #3
      • 4: player #4
      • 5: player #5
      • 6: player #6
      • 7: player #7
      • 8: player #8
    • data2 = set destination object angle according to teleport target angle
      • 0: destination object stay with same angle after teleportation
      • 1: destination object take angle of teleport target after teleportation
    • data3 = destination object velocity control
      • 0: does nothing
      • value 1: set velocity to zero (blood-like)
      • flag  2: change X and Y velocity according to source sprite angle (quake-like)
      • flag  4: set Z velocity to zero
    • data4 = sound id to play
      • 0: do not play any sound
    • hi-tag = enable telefrag
      • 0: do not enable (default)
      • 1: enable
  2. .MAP There is few cool updates for trigger flags available. Previously, DudeLockout flag has no effect when used in conjunction with Proximity or Touch flags, but now it does. If sprite is not a dude, you can define proximity radius through sprite's clipdist property. Aside from this, "Touch" flag is working for almost every type of sprite and for walls. Sprite or wall with this flag checked gets triggered when player or enemy touching it.

    Sight flag was renamed to Sees Player. Sprite with this flag checked gets triggered once it can see one of players from it's location.

    Screen flag means that sprite will trigger when it drawn on the screen of one of players. Note that it works only in single player.

    Aim triggers sprite when one of players aims in it

    If sprite have "Impact" flag enabled, it means that it will be triggered once get hit with projectile, affected by explosion or touch another object (like wall, sprite or sector). Note that not all projectiles can make sprite to trigger.

    Just set Interruptable flag if you need object to set command immediately. To get advantage of waitTime property, you will need to setup objects the right way.

    First of all, make sure the restState is equals to State of the sprite, however in case of types 400 - 432, there is required to set restState to On. Then pay attention to going on and going off properties:

    • Example 1: [x]going on, [x]going off, waitTime = 0 - will send cmd only once, because waiTime is zero.

    • Example 2: [x]going on, [x]going off, waitTime = N - will send cmd always, with period specifid in waitTime.

    • Example 3: [x]going on, []going off, waitTime = N - will send cmd when going to Off state, skip sending when coming from Off, with period specifid in waitTime.

    • Example 4: []going on, [x]going off, waitTime = N - will skip sending cmd when going to On state, send cmd when coming from Off, with period specifid in waitTime.

    To conclude, if you want a Toggle Switch to send command when player fire a flare in it, or Blood Drip Gen spawn drips only when player can see or at close distance, these flags help you save much of your time.

  3. .MAP Grow (Type 129) and Shrink (Type 130) shroom items is working! When player is grown, it receives less damage, jumps higher and become heavier, which means it can easily damage by stomp and push back enemies that have less mass than player. Be carefully when pickup this powerup as you may lose your invisibility or can even die if place is too tight to grow ;)

    When player is shrink, the enemies can do same thing to player as it becomes very small and receives way more damage than it usually does. However, player can go to really tight place.

  4. .MAP You can set custom value for the following types of items using it's data1 field:

    • Health (life essence, red potion etc.)
    • Weapons (sawed-off, tesla gun etc.)
    • Ammo(box of shotgun shells, casoline can etc.)

    The value should be greater than 0. If value is greater than max value of the pickup, max value will be used.

    • Example #1: data1: 1 - will give 1 ammo for sawed-off instead of 8.

    • Example #2: data1: 0 - will give 8 ammo for sawed-off.

    • Example #3: data1: 200 - will give 100 ammo for sawed-off.

  5. .MAP You can specify number of INI message that will be displayed instead of "Picked Up ..." message when item was actually picked up. Just specify it in Lock msg field.

Mar 07 2019

Feb 03 2019


Aug 18 2022

Jun 20 2021

May 09 2020

Jan 14 2020

Sep 09 2019

Mar 02 2019

Feb 03 2019