Custom item system [MAY 17 2026]

Version: 1

by NoOne

About

The custom item descriptor (ITEMS.ITM) is a plain text file with INI format structure, which can be opened by any text editor and edited directly. It allows to create a whole new item or replace existing and fine tune it. This manual intends to help create your own items or modify already existing. It contains detailed description of each parameter and in the File example chapter you will find a file that is ready for use.

Changelog

  1. MAY 17 2026

    • New action parameter "CheckRange" has been added.
    • New action parameter "ClipToAmount" has been added.
    • New topic "Extra action parameters" has been added.
    • New item example "Life Essence" has been added.
  2. FEB 02 2025

    • Fixed incorrect max amount limit comparison for ammo with "ExtLimits" item flag enabled.
    • Added all game items file example.
    • New action "TeamScore" has been added.
    • New action "Frag" has been added.

Table of contents

  1. Changelog
  2. How to start
    1. Notes
  3. Output
  4. Global file syntax rules
  5. Supported value types
    1. Basic types and keywords
    2. Apperance
  6. Sections and parameters
    1. Basic parameters
    2. Action parameters or "Actions"
      1. Operations
      2. Action types
        1. Health
        2. Armor
        3. Ammo
        4. Weapon
        5. PowerTime
        6. Inventory
        7. Key
        8. ScreenEffect
        9. AirTime
        10. IgnoreDamage
        11. TeamScore
        12. Frag
      3. Extra action parameters
  7. File example
  8. Slots (IDs) lists
    1. Armor
    2. Powerup
    3. Inventory
    4. Weapon
    5. Key item
    6. Effect
    7. Damage type

How to start

Basically, all you need to do is to create a text file in your current mod directory and rename it to "ITEMS.ITM".

Notes

  1. To insert custom item sprites in maps is recommended to use XMAPEDIT. Latest version already have a special button called "User items" that available in the "Game Objects" menu via [ALT+S] in 3D or [SHIFT+S] in 2D edit modes.
  2. If you playing Blood in multiplayer, all players must have identical ITEMS.ITM file to avoid desync. If some of players sees "OUT OF SYNC" message once picked up an item, it usually means that something wrong with that file.

Output

The parser doesn't show any modal error messages, however it outputs messages in the console, which is available via pressing the "~" (tilde) key. Start any map or load a save, open the console and look for recent messages that prefixed with "ITEM SETUP" characters to get detailed information. Alternatively, you can open a log file to read such messages.

Global file syntax rules

Every single file must contain special section that defines it's syntax version or file will be ignored. I recommend to put it on top of the file.
[General]
Version = 1

Other rules

  1. No quotes anywhere.
  2. Max characters per line limited by 256.
  3. Lines that starts from ";" or "#" characters are comments and ignored by parser.
  4. All numeric values must be present in decimal format.
  5. There is no floating point values supported.
  6. Any letter case is fine.

Supported value types

Before making first descriptor, you must learn the value types the file is working with. Always make sure you write it properly.

Basic value types and keywords

Value type Description Syntax example
FIXED Any numeric value (positive or negative) 100, -100, 300, -300
UFIXED Any numeric value (positive only) 100, 110, 200, 300
BOOLEAN The boolean value only can be 0 (false) or 1 (true) 1, true, yes, 0, false, no
KEYWORD A special word that is required for parameter. Health, Armor
STRING Just some text. My string
COMMON ARRAY A string that starts with "(" character and ends with ")".It may contain any elements amount of any value types. If there is supposed to be more than 1 element, the values must be separated by "," character. (110%, Type, Respawn, 300, true)
ASSOCIATIVE ARRAY A string that starts with "(" character and ends with ")".It may contain any elements amount of any value types. Each element represents a key and value pair that must be separated by "=" character. If there is supposed to be more than 1 element, they must be separated by "," character. (Tile = 160, Sound = Any, Seq = 110)

Appearance

Represents associative array with dynamic length. Contains a specific key/value pairs. Allows to override default appearance of objects such as sprites. Write order doesn't matter.

Parameter Description Req Value type Default Examples
Tile A tile number to set. No Ufixed (0 - 32767) 0 Tile = 2428
Shade A shade level. No Fixed (-128 - 127) -8 Shade = -32
Pal A palette (palookup) ID to set. No UFixed (0 - 255) 0 Pal = 5
Size X and/or Y repeat values to set. No
  1. FULL SYNTAX FORM

    Expects common array with 2 values:

    1. UFIXED value (0 - 255) that defines x-repeat.
    2. UFIXED value (0 - 255) that defines y-repeat.

  2. EASY SYNTAX FORM

    Single UFIXED (0 - 255) that defines both x/y repeats.

64
  • Size = (24, 48) // set x-repeat to 24 and y-repeat to 48.
  • Size = 16 // set both x/y repeats to 16.
Sound Allows to override original pickup sound. If not defined, the default item group sound will be set. 0 means no sound. No UFIXED (0 - 65535) item group Sound = 777
Seq

Specify a custom SEQ animation ID. 0 means no custom SEQ.

Note1: Make sure the animation has no "Delete" flag enabled or item may disappear from the game world. Just imagine you removed a key!

Note2: Overrides Tile, Shade, Size and Pal properties!

No UFIXED (0 - 65535) 0 Seq = 1

Syntax example:

(Tile=10, Shade=-32, Sound = 777)	// set appearance

Sections and parameters

All sections, except [General] that described in Global file syntax rules topic treated as a start of actual item definition and in-game name. Names must be unique, however, sometimes you may want to have different types with same item name. If that is case, please add "_" character which serving as separator and enter some text just after it.

Example:

[Spray Can] // displaying item name is "Spray Can"
Type = (Weapon, 48) // type 48
.....

[Spray Can_AMMO] // displaying item name remains "Spray Can"
Type = (Ammo, 60) // type 60
.....

Each section may contain several parameters that describes item behavior. Most of them are optional, however they designed to make item to do something useful apart from being just picked up.

Basic parameters

Parameter Description Req Value type Default Examples
Type

The very first and the only required basic parameter at this moment.

Defining item group explicitly strongly recommended as it allows to use default templates for some game options such as respawn or playing correct pickup sound when is not defined.

When you want to add a new item, enter any free type (range of 160 and 200 recommended), however, if you want to replace specific game item with this one, enter it's type in a range of 40 and 200.

Certain game item types cannot be replaced to avoid incorrect behavior in multiplayer. These types are: 145, 146, 147, 148.

Yes
  1. FULL SYNTAX FORM (recommended)

    Represents common array with 2 elements that must be written in a proper order:

    1. KEYWORD that defines item group:
      1. Item (default)
      2. Weapon
      3. Ammo
      4. Armor
      5. Health
      6. Powerup
      7. Key

    2. UFIXED (40 - 200) value that defines item sprite type in the game world.

  2. EASY SYNTAX FORM

    UFIXED (40 - 200) value that defines item sprite type in the game world. Default group for item will be set, which may lead to unexpected respawn behavior.

---
  • Type = (Weapon, 180) // Set "Weapon" group and sprite type 180.
  • Type = 180 // Just set sprite type 180. Item group is "Item".
Caption XMAPEDIT shows it as caption in 2D edit mode. No String section name
Caption = My item
Appearance Defines sprite appearance in the game world.
Refer to Appearance value type description to get detailed information.
No APPEARANCE auto
Appearance = (Tile = 15, Size = 40, Sound=776)
Flags Various item flags. For example, you can allow to use larger limits, make item show no message and/or no effect on pickup etc... No COMMON ARRAY of keywords:
  1. NoEffect: show no pickup effect.
  2. NoMessage: show no message on pickup.
  3. Shared: affects each player on the map.
  4. ExtLimits: allows to use larger limits for max amount (999 health, 250 armor etc...). By setting this flag, you have to control max amount value yourself if you want item to have higher limit than game, but not so high as 999.
none
Flags = (NoEffect, NoMessage)
Message Allows to override default "Picked up" message. No String game
Message = Got fire armor  // shows "Got fire armor"
Message = You got %s item // shows "You got %NAME% item"
GameMode Select game modes at which item can be picked up.
All game modes allowed by default.
No COMMON ARRAY of keywords:
  1. S: single player.
  2. B: bloodbath.
  3. C: cooperative.
  4. T: teams.
any
GameMode = (S, T, B)
RespawnTime Item respawn time in seconds. 0 means use item group respawn time. No UFIXED (0 - 255) item group time
RespawnTime = 3
DropLiveTime Time in seconds for items that was dropped from another sprite. Defines a delay before it will be removed. 0 means infinite time. No UFIXED (0 - 255) infinity
DropLiveTime = 10

Action parameters or "Actions"

Actions are most interesting part which makes item useful. They allows to change player health or armor, give or remove weapons, set screen effects and much more. Each item supports up to 256 actions that can be combined (for example add 100 health and 50 armor) and/or duplicated. Item can be picked up when at least one action successful, when all actions that marked as required successful, or it have no actions at all. In case when item have any required actions, they must be successful for all other actions to be completed.

Each action key name consist of 2 parts: prefix that defines it's operation and name that defines action type. The value of key represents associative array with dynamic length containing a specific key/value pairs which can be written in random order. Most of them are pretty same for each action.

Operations

Add Adds amount of units to current.
Sub Substracts amount of units from current.
Set Sets amount of units as current.

Action types

Health Action

Allows to change player's health amount. Cannot be reduced when player is immortal.

Entry Description Req Value type Default Examples
Amount Amount in health units. Yes UFIXED 1
Amount = 10
MinAmount Current value must be greater for successful action.
Limited to default value.
No UFIXED 0
MinAmount = 1
MaxAmount Current value must be less for successful action.
Limited to default value.
No UFIXED
game: auto
extended: 999
MaxAmount = 50

Examples:

SetHealth = (Amount=90,  MinAmount=50, MaxAmount=100)
// set health to 90 units when >= 5 AND <= 100
SubHealth = (Amount=5,  MinAmount=50)
// substract 5 units when > 50
AddHealth = (Amount=10, MaxAmount=100)
// add 10 units when < 100
Armor Action

Allows to change player's armor amount.

Entry Description Req Value type Default Examples
Amount Amount in armor units. Yes UFIXED 1
Amount = 10
MinAmount Current value must be greater for successful action.
Limited to default value.
No UFIXED 0
MinAmount = 1
MaxAmount Current value must be less for successful action.
Limited to default value.
No UFIXED
game: auto
extended: 250
MaxAmount = 50
Slot Armor ID. Armor slots list contains possible IDs. YES UFIXED (1 - 3) ---
Slot = 1 // body armor
Compatible Simulate or not vanilla bug that makes possible to pickup armor items when current slot amount <= 100 and other slots amount < 100. No BOOLEAN no
Compatible = False

Examples:

SetArmor = (Amount=100,  MinAmount=50, MaxAmount=200, Slot=3)
// set spirit armor to 100 units when >= 5 AND <= 200
SubArmor = (Amount=5,  MinAmount=50, Slot=1)
// substract 5 units from body armor when > 50
AddArmor = (Amount=10, MaxAmount=100, Slot=2)
// add 10 units to fire armor when < 100
Ammo Action

Allows to change player's weapon ammo amount. Cannot be reduced if have infinite ammo.

Entry Description Req Value type Default Examples
Amount Amount. Yes UFIXED 1
Amount = 35
MinAmount Current value must be greater for successful action.
Limited to default value.
No UFIXED 0
MinAmount = 0
MaxAmount Current value must be less for successful action.
Limited to default value.
No UFIXED
game: auto
extended: 999
MaxAmount = 50
Slot Weapon ID. Weapon slots list contains possible IDs description. YES UFIXED (2 - 12) ---
Slot = 2 // flare pistol

Examples:

AddAmmo = (Amount=10, MaxAmount=100, Slot=3)
// add 10 ammo for sawed-off when < 100
SubAmmo = (Amount=5,  MinAmount=50, Slot=9)
// substract 5 ammo from life leech when > 50
SetAmmo = (Amount=20,  MinAmount=0, MaxAmount=100, Slot=2)
// set ammo for flare pistol to 20 when >= 0 AND <= 100
Weapon Action

Allows to give or remove player's weapons. Keep in mind that even if you give a weapon, but it has no ammo - player won't be able to select it. You have to create another action that will add some ammo for it! In multiplayer modes with permanent weapons option enabled item cannot be picked up if player already have weapon, despite item may contain another actions.

Entry Description Req Value type Default Examples
Amount Is player have a weapon? Yes UFIXED (0 or 1) 1
Amount = 1
Slot Weapon ID. Weapon slots list contains possible IDs description. YES UFIXED (2 - 12) ---
Slot = 2 // napalm launcher

Examples:

AddWeapon = (Amount=1, Slot=3)
// give sawed-off
SubWeapon = (Amount=1, Slot=9)
// take away life leech
SetWeapon = (Amount=0, Slot=2)
// take away flare pistol
PowerTime Action

Allows to change various powerups time. The powerup will toggle it's state automatically according current time amount.

Entry Description Req Value type Default Examples
Amount Amount in seconds. Yes UFIXED 1
Amount = 35
MinAmount Current value must be greater for successful action.
Limited to default value.
No UFIXED 0
MinAmount = 0
MaxAmount Current value must be less for successful action.
Limited to default value.
No UFIXED
game: auto
extended: 999
MaxAmount = 50
Slot Powerup ID. Powerup slots list contains possible IDs description. YES UFIXED (1 - 51) ---
Slot = 25 // reflective shots
Compatible Simulate game behavior when it's possible to pickup powerup item, but it's current duration won't be changed if already non-zero. No BOOLEAN false
Compatible = False

Examples:

AddPowerTime = (Amount=10, MaxAmount=35, Slot=15)
// add 10 seconds for ivulnerability when < 35
SubPowerTime = (Amount=5,  MinAmount=50, Slot=15)
// substract 5 seconds from ivulnerability when > 50
SetPowerTime = (Amount=20,  MinAmount=0, MaxAmount=100, Slot=15)
// set ivulnerability timer to 20 seconds when >= 0 AND <= 100
Inventory Action

Allows to change player's inventory item amount.

Entry Description Req Value type Default Examples
Amount Amount in percent. Yes UFIXED 1
Amount = 100
MinAmount Current value must be greater for successful action.
Limited to default value.
No UFIXED 0
MinAmount = 0
MaxAmount Current value must be less for successful action.
Limited to default value.
No UFIXED
game: auto
extended: 999
MaxAmount = 50
Slot Inventory item ID. Inventory slots list contains possible IDs description. YES UFIXED (1 - 5) ---
Slot = 1 // doctor's bag

Examples:

AddInventory = (Amount=10, MaxAmount=100, Slot=1)
// add 10% for doctor's bag when < 100
SubInventory = (Amount=20,  MinAmount=50, Slot=1)
// substract 20% from doctor's bag when > 50
SetPowerTime = (Amount=80, Slot=1)
// set doctor's bag amount to 80%
Key Action

Allows to give or erase keys of player. Keep in mind that Key 7 never shows in player HUD.

Entry Description Req Value type Default Examples
Amount Is player have a key? Yes UFIXED (0 or 1) 1
Amount = 1
Slot Key ID. Key slots list contains possible IDs description. YES UFIXED (1 - 7) ---
Slot = 2 // eye key

Examples:

AddKey = (Amount=1, Slot=1)
// give skull key
SubKey = (Amount=1, Slot=2)
// erase eye key
SetKey = (Amount=1, Slot=2)
// give eye key
ScreenEffect Action

Allows to set various player screen effects such as pain, delirium, pickup etc. The effects you define with this action replaces default pickup effect. When there is other actions of different type, the effects will play only if at least one of them is completed.

Entry Description Req Value type Default Examples
Amount Amount units depends on effect ID,
so you have to experiment.
Yes FIXED 1
Amount = 35
MinAmount Current value must be greater for successful action.
Limited to default value.
No FIXED ---
MinAmount = -128
MaxAmount Current value must be less for successful action.
Limited to default value.
No FIXED ---
MaxAmount = 3600
Slot Effect ID. See Effect slots list with IDs description. YES UFIXED (1 - 8) ---
Slot = 1 // pickup effect

Examples:

AddScreenEffect = (Amount=10, MaxAmount=35, Slot=6)
// add 10 units for earthquake effect when < 35
SubScreenEffect = (Amount=5,  MinAmount=50, Slot=1)
// substract 5 units from pickup effect when > 50
SetScreenEffect = (Amount=100, Slot=2)
// set pain effect to 100
AirTime Action

Allows to change player's underwater timer. The greater value, the longer time player can be underwater. Note that using it for items that is not underwater normally makes no sense.

Entry Description Req Value type Default Examples
Amount Amount in seconds. Yes UFIXED (0 - 999) 1
Amount = 10
MinAmount Current value must be greater for successful action.
Limited to default value.
No UFIXED (0 - 999) 0
MinAmount = 5
MaxAmount Current value must be less for successful action.
Limited to default value.
No UFIXED (0 - 999) 999
MaxAmount = 100

Examples:

AddAirTime = (Amount=3)
// add 3 seconds for underwater timer
SubAirTime = (Amount=5)
// substract 5 seconds from underwater timer
SetAirTime = (Amount=120)
// set underwater timer to 120 seconds
IgnoreDamage Action

Allows to change player's permanent damage type vulnerability.

Entry Description Req Value type Default Examples
Amount Is player immune to damage type? Yes UFIXED (0 or 1) 1
Amount = 1
Slot Damage type ID. See Damage types list with IDs description. YES UFIXED (1 - 7) ---
Slot = 2 // bullet damage

Examples:

AddIgnoreDamage = (Amount=1, Slot=1)
// make player ignore falling damage
SubIgnoreDamage = (Amount=1, Slot=1)
// make player receive falling damage
TeamScore Action

For "Teams" multiplayer mode only. Allows to change player's team score.

Entry Description Req Value type Default Examples
Amount Amount. Yes FIXED 1
Amount = 10
MinAmount Current value must be greater for successful action.
Limited to default value.
No FIXED ---
MinAmount = 0
MaxAmount Current value must be less for successful action.
Limited to default value.
No FIXED ---
MaxAmount = 100

Examples:

AddTeamScore = (Amount=15)
// add 15 scores to the player's team
SubTeamScore = (Amount=15)
// substract 15 scores from the player's team
Frag Action

Allows to change player's frag amount. Doesn't work in "Cooperative" multiplayer mode.

Entry Description Req Value type Default Examples
Amount Amount. Yes FIXED 1
Amount = 10
MinAmount Current value must be greater for successful action.
Limited to default value.
No FIXED ---
MinAmount = 0
MaxAmount Current value must be less for successful action.
Limited to default value.
No FIXED ---
MaxAmount = 100

Examples:

AddFrag = (Amount=5)
// add 5 frags to the player
SubFrag = (Amount=15)
// substract 5 frags from the player

Extra global action parameters

Entry Description Req Value type Default Examples
CheckRange Always check if value in a range of min and max amount. If value is out of range, the item cannot be picked up. By default it checks only for "Set" operation. No BOOLEAN no
CheckRange = Yes
ClipToAmount Always clip final value to the min or max amount (to the game limits otherwise). No BOOLEAN yes
ClipToAmount = No
Required Action must be successful or item cannot be picked up. No BOOLEAN no
Required = Yes

File example

Below is a brief example with few new items. You may also download a larger example file which replicates all the original game items.

Slots lists

Armor slots

1 - Body armor
2 - Fire armor
3 - Spirit armor

Powerup slots

These are most interesting:

13 - Feather fall 20 - Gas mask 30 - Grow shroom (modern)
14 - Limited invisibility 22 - Crystal ball 31 - Shrink shroom (modern)
15 - Invulnerability 24 - Doppelganger 32 - Death mask
16 - Jump boots 25 - Reflective shots 40 - Asbestos armor
18 - Guns akimbo 26 - Beast vision 51 - Level map (modern)
19 - Diving suit 29 - Delirium shroom

Inventory slots

1 - Doctor's bag 4 - Beast vision
2 - Diving suit 5 - Jump boots
3 - Crystal ball

Weapon slots

2 - Flare pistol 6 - Bundle of TNT 10 - Voodoo doll
3 - Sawed-off 7 - Spray can 11 - Proximity detonator
4 - Tommy gun 8 - Tesla gun 12 - Remote detonator
5 - Napalm launcher 9 - Life leech

Key item slots

1 - Skull key 4 - Dagger key 7 - Key 7
2 - Eye key 5 - Spider key
3 - Fire key 6 - Moon key

Effect slots

1 - Pickup 4 - Blindness 7 - Brightness
2 - Pain 5 - Tilting 8 - Delirium
3 - Choke (underwater only) 6 - Earthquake

Damage type slots

1 - Falling 4 - Explode 7 - Electric
2 - Burning 5 - Choke
3 - Bullet 6 - Spirit

by NoOne