Bloodthief Mapping Guide
(Note: This wiki page is a direct copy and modified styling from this Google Doc.)
This guide is meant to be used like a wiki for you to reference for all your mapping needs. Trenchbroom is the software that is used to make Bloodthief maps. It is free, open source, and used to make maps for many games, such as Quake, Dusk, Wrath: Aeon of Ruin, and many more. Trenchbroom is great because it’s specifically designed for making interactive maps, which makes getting started making a real level easy, but the possibilities are still limitless!
Where to start?
Watch the video getting started tutorial: https://youtu.be/09mth4fUaH0
Important Resources
- You will need this resource folder to get started mapping: bloodthief_mapping_resources.zip
- Example Map: Time Tomb map from the main game time_tomb.map
- Dumptruck_ds Trenchbroom Tutorial Series (note: This tutorial series has a few sections specific to mapping for the game, Quake. You can ignore these parts).
Common Issues
Pro Tips
Entity Reference
This will be quite overwhelming to read end-to-end. I recommend using this like a wiki or a reference manual and revisit it when you have a specific need or idea. Also use the section links on the far left to quickly jump to the documentation for a specific entity.
Point Entities
Point entities are what they sound like: Entities that are placed at a single point in the map.
Enemies
All enemies pretty much share the same properties, so they will be lumped together in this section. Here are all the different enemies
- === vt_generic_knight ===
- === vt_bow_knight ===
- === vt_armored_bow_knight ===
- === vt_green_knight ===
- Note this is the generic armored knight. It’s called the green knight for legacy reasons.
- === vt_black_knight ===
- special properties
should_move- 0: Will not move. Will stand in place, even after becoming aggroed.
- 1: Will move toward player once aggroed
- === vt_spider ===
- === vt_cherub ===
- Must be triggered to function (see targetname below)
- special properties
should_launch- 0: Should not launch when triggered
- 1: Should launch when triggered (ie. fly upward briefly before firing)
- === vt_marble_golem ===
- === vt_cyclops ===
- === vt_vampire ===
- Must be triggered to function (see targetname below)
- special properties
should_launch- 0: Should not launch when triggered
- 1: Should launch when triggered (ie. fly upward briefly before firing)
- === vt_god_blood_vessel ===
- === vt_skull ===
- Must be triggered to function (see targetname below)
- special properties
should_launch- 0: Should not launch when triggered
- 1: Should launch when triggered (ie. fly upward briefly before firing)
- === vt_mage ===
- special properties
target- For the mage, the target property specifies the entity group that this mage should be tethered to with a magical shield link. Note the enemy it attaches to also needs a
bubble_shield_id
death_target- This is the entity that should be triggered when this mage dies.
All enemies have these key properties
hidden- 0: The enemy will not be hidden when the game starts.
- 1: The enemy will be hidden and out of play when the game starts. Triggering the enemy will cause them to “unhide”
has_spawn_effect- 0: When the enemy “unhides”, there will be no spawn effect
- 1: There will be a spawn effect when the enemy unhides
target- This property designates the entity that should be triggered when this enemy dies. So for example, if you want door1 to open when this enemy dies, you would specify door1 for the target.
target_func- The function on the target that should be called when this entity dies. For example, if our target is a door, this can be set to
reverse_motionto close a door when this entity dies
targetname:- Use this to make the entity triggerable. This enemy will unhide when triggered. For example you can make an enemy hidden, and then give it targetname of e1. Then when e1 is triggered, the enemy will unhide
bubble_shield_id- Give this any value to give this enemy a bubble shield. In Bloodthief shields are typically tethered to a
vt_mageand are disabled when the mage dies. If the tethered mage is shielding two different enemies, both enemies should have the samebubble_shield_id.
shield_type- Only specify this property if
bubble_shield_idis set. NO_AIR_DASH- Applies a purple shield. Air dashes will be blocked while this enemy is shielded
DAMAGE_ON_TOUCH- Applies a red shield. The player can’t touch this shield or they will be damaged
vt_arrow_pickup
- A pickup that gives you arrows. If you haven’t picked up a bow yet, you’ll pick it up automatically when arrows are picked up
- Key Properties
arrow_counttype- The type of the arrow that should be picked up
- 1: Explosive arrows
- 2: Blood tether arrows
vt_artifact_pickup
- Picks up an artifact part
- Key properties
artifact_part_nameNO_ARTIFACT_NAMRUSTY_BLADE_POMMEDRAGON_TOOTH_SCABBARBATTERED_SOUL_OF_PRISONERUSTY_IRON_ROBENJIS_STICORNATE_BLADE_PART_ORNATE_BLADE_PART_STONE_SWORD_PART_STONE_SWORD_PART_STONE_SWORD_PART_3GLURMS_WALKING_STICKGLURMS_NOTESKINGS_BEATING_HEARTKINGS_BLADE_PART_2ANCIENT_BOOKGOD_KILLER_BLADE_PART_2STONE_HEARTWIDGETHOURGLASSTRESSTROWELFLAGELLUMTHREADGODSTEELSIN_BOOKTALKING_SPIDERBROTHERHOOD_COINLENSSCREAMING_CRUCIBLEVOW_OF_RETRIBUTIONMASKBLESSED_OILBLOOD_CHALICEFINETOOTH_GEAREXQUISITE_TOURBILLONCALLUSCAT_TAILWEDDING_RINGSEEDFINE_WINEGROTESQUELOADED_DICETRIXIAN_MANTLEVASYLGLASS_BANGLEWIND_ESSENCEBLAST_POWDERTHIEF_SHIVTHEOLMORIN_SHACKLEOLD_VARU_KEYPERMAFROST_CHUNKFIRE_SLUGCALMNESS_SUPPRESSANTTREESAPRAGE_MUSHROOMTRIXIAN_STEEL
vt_barrel
- An explosive barrel
vt_bat_spinner
- A bat that flies in a circle.
vt_bell
- Ringing the bell creates a trigger event
- key properties
target- The entity that should be triggered when the bell is rung
vt_blood_fountain
- A triggerable blood fountain. Shoots blood in the air when triggered
- key properties
targetname- When this targetname is triggered, blood will be shot into the air
vt_bow_pickup
- A pickup that gives you either an explosive crossbow (
arrow_type=1) or a Blood Tether (arrow_type= 2) - key properties
arrow_type- 1: Grants Explosive crossbow
- 2: Grants Blood Tether
targetname- When this targetname is triggered, this pickup will be picked up.
vt_color_torch
- A torch that typically is used as a wall decoration. Can be any color
- key properties
light_color- The color of the light emitted from this torch in RGB (0-1) format. Use the Trenchbroom Color Picker to set this value
color- The color of the particles of the torch in RGB (0-1) format. Use the Trenchbroom Color Picker to set this value.
scalevisibility_range- How far away the pixel fire is visible. Useful if scale is very high.
vt_crack
- Creates a crack decal. Typically used to indicate that a wall is breakable. Point it away from the wall for best results
vt_decor_candle
- a candle purely for decoration
vt_decor_smoke
- a smoke particle effect for decoration
vt_enemy_shoot_point
- Deprecated, not really useful. There was a point in time where enemies could shoot barrels but this proved to be frustrating so it was removed.
vt_environment
- Used to change the environment and skybox. Only use one per map
- key properties
environment: Use the dropdown to specify which level’s environment you want to use for your map.
vt_eyeball_pickup
- An eye of Ogamahn.
- key properties
target- The entity that should be triggered when picked up
eyeball_name- Each eyeball must have a unique name in your map for saving
vt_eyeball_shrine
- A shrine of Ogamahn.
vt_fish_spinner
- A fish that spins in a circle
vt_floating_candle
- a floating candle for decoration
vt_fmod_sound
- A sound that plays on a loop in a particular spot
- key properties
guid- The GUID of the sound to play. Possible values are
ENEMY_SKULL_SKULL_NESTING_SOUNDAMBIENT_CRICKETSPLAYER_HEART_BEAT_SPATIALEFFECTS_WATERFALL_LOOPAMBIENT_BIRDSAMBIENT_DEFAULT_AMBIENT_SPATIAL
vt_generic_pickup
- A powerup pickup
- key properties
powerup_typeBOUNCY_DASHEXPLOSIVE_AIR_DASHSUPER_SPEEDSLIDE_TO_KILLUNLIMITED_BLOOD
target- The target to trigger when this powerup is picked up
target_func- The function on the target to call when this is picked up
vt_health_pickup
- A blood vial
- key properties
target- The entity that should be triggered when picked up
vt_huddled_god
vt_key_pickup
- A key that can be used to lock doors or parts of the map. See
vt_trigger_areafor usage. - key properties
key_name- The unique name of this key (not shown to the player)
pick_up_message- A message that appears when this key is picked up
color- The RGB (0-1) color of the key. Use the Trenchbroom color picker to set this
display_name- The name of the key that is shown to the player when this key is picked up or when an area requiring this key is reached.
vt_lantern
- Deprecated, lanterns are not used in isolation. See
vt_mage
vt_lever
- A triggerable lever
- key properties
scale- Levers are pretty small by default. Set this to 4 for example to multiply the size by 4
targetname- Set this to make the lever triggerable. When the lever is triggered, the rod will pivot downward and the specified target will be triggered
target- The entity that should be triggered when this lever is triggered
vt_music
- Used to change the music of the map. Only use one per map
- Note: all songs are “programmed” in a unique way, where the game transitions to a different part of the song depending on the “Intensity” of the game, controlled by
vt_intensity_change_area. - key properties
song- use the dropdown to select the song you desire. Songs match the names of the songs in the Bloodthief OST
vt_pain_vessel
- A vessel of pain. Hidden by default, must be triggered to appear
- key properties
targetname- will appear when this targetname is triggered
explosion_force- The force of the explosion when this vessel is killed
should_flash- 0: Will not flash
- 1: Will flash
vt_player_start
- The starting point of the player. The forward of this point entity matches the starting forward of the player
- key properties
targetname- If this property is specified, instead of being the “start level” position for the player, this point will be the “checkpoint spawn” position for the checkpoint with a matching “target” property set. So for example if checkpoint 1 has a target of “foo”, and this
vt_player_starthas a targetname of “foo”, when the player spawns at checkpoint 1, they will spawn at the location of this entity.
vt_portcullis
- deprecated
vt_robed_statue
- Can only be killed by players level 130 or higher
- When killed, will trigger entities specified as the target
- key properties
target- The entity that should be triggered when this statue dies
vt_sentient_heart
- the sentient heart of theolmorin
vt_soul_spinner
- A spinning soul
vt_stone_god
- Theolmorin
vt_sup_light
- The main light entity in bloodthief
- Key Properties
light_energy: The strength of the lightlight_color: The color of the light, represented in RGB (0-1) format- Note you can use Trenchbroom’s color picker in “float” mode to set the value of this property
omni_range: The Omnidirectional range of the lightomni_attenuation: The attenuation of the light
vt_swinging_ax
- A swinging ax that can be used as an obstacle
- key properties
scale
vt_torch
- A decorative torch
- key properties
show_mesh- 0: Don’t show the little stick of the torch. Useful if you’re making a fireplace or a brazier or something
scalelight_indirect_energyvisibility_range- How far away the pixel fire is visible. Useful if scale is very high.
vt_triggerable_toast
- A dialogue that will appear when triggered
- key properties
targetname- When this is triggered, the text will appear
toast_text- the text that should appear
should_pause- If the game should pause when the toast appears
vt_tutorial_pickup
- A book that will show a tutorial when picked up
- key properties
tutorial_titletutorial_desctutorial_data_path: Ignore this, not useful for custom maps
vt_util_counter
- A triggerable entity that counts the amount of times it has been triggered and will emit a new trigger when the desired count is achieved
- key properties
trigger_count- how many times this entity should be triggered before emitting a new trigger
targetname- When this targetname is triggered, the counter increments the count
target- When
trigger_countis reached, this target is triggered
target_func- The function on the target that should be called when the target is triggered
vt_util_delayed_trigger
- A triggerable entity that will emit a new trigger after a delay
- key properties
targetname- When this targetname is triggered,
targetwill be triggered aftertrigger_delayseconds
target- the entity that should be triggered
trigger_delayseconds after this entity has been triggered
target_func- The function that should be called on
targetwhen it is triggered
trigger_delay- The delay in seconds that should be waited after this entity is triggered before
targetis in-turn triggered.
vt_waypoint
- Not useful in custom maps right now
Brush Entities
Brush entities are entities that are based on a brush, ie. some volume of space drawn in Trenchbroom.
func_geo
- For the most part functions the same as worldspawn / default geometry, but with a few extra features
- key properties
surface_type- Impacts the sound your feet make when you walk on it. Use the dropdown
window_color- If using one of the window textures, you can set this to color the window. use RGB (0-1)
friction_multiplier- The friction of the surface
chain_speed- If using the chain texture, this determines how fast the chains will move
navigable- COMING SOON: Use this to designate a piece of geo as navigable by enemies. Right now all geo is navigable in custom maps which is not very optimized. If you are running into optimization issues let me know and I’ll prioritize this.
func_detail
- Similar to
func_geobut with less properties. The main difference is thatfunc_detaildo not have an occlusion shape built for them. You can use this entity as an optimization if your map has a bunch of little details that do not need occlusion shapes. - key properties
window_colornavigable
func_detail_illusionary
- Similar to
func_geo, but has no collision. Use this for pieces of geometry that are purely visual and the player and enemies should not collide with it - key properties
window_color
vt_blood_area
- When the player is in this area, they rapidly increase the Blood bar and they move faster
vt_breakable
- A breakable object
- key properties
breakable_type- Use the dropdown to specify the type of the breakable
gi_mode- Not relevant for mapping as there is only 1
gi_modein custom maps
jib_count_multiplier- Multiplies how many jibs that should emit when broken
target- The entity that should be triggered when broken
target_func- The function on the entity that should be called when broken
use_fake_rigidbodies- 0: Don’t use fake rigidbodies
- 1: Use fake rigidbodies (more optimized but looks worse)
bubble_shield_id- When this is broken all entities with this bubble shield ID will have their shields removed
has_painting_blend_effect- Does something interesting to
sir_brian_tuketexture
jib_lifetime- The lifetime of jibs once broken
translation- If set, this breakable also will function as a mover. See
vt_moverfor additional properties to use
reverb_level- The reverb amount when broken (0-1 value)
should_jib- 0: Jibs will not be emitted when broken
- 1: Jibs will be emitted when broken
has_collision:- 0: No collision
- 1: Collision
navigable:- If this is navigable
- 0: No
- 1: Yes
jib_scale- The scale of jibs
jib_typeGORE,NON_GORE,GLASS,GOD
hide_after_checkpoint- The checkpoint index at which this breakable becomes hidden
friction_multiplier- The amount of friction the player’s movement has when standing on top of this breakable
vt_checkpoint_area
- A checkpoint. When the player respawns at checkpoint if the current checkpoint matches this area’s checkpoint index, the player will spawn here at the bottom center of this area facing in the direction specified by the angle property.
- key properties
checkpoint_index- When a level starts, the player starts at checkpoint 0. When the player enters this area, the current checkpoint will be set to at least this index. So if this is set to 1, the player checkpoint will be set to checkpoint 1. When the player respawns at checkpoint, they will spawn at the bottom center of this checkpoint by default. Alternatively, a specific point in space can be specified, see
targetproperty.
checkpoint_region- An optional property that can be set to give your checkpoint a region. Regions can be used for “non-linear” maps that can be progressed in different orders. Perhaps the left path has a checkpoint with region “left” and
checkpoint_index1 and the right path has region “right” withcheckpoint_index1. This allows the checkpoints to be reached in any order and still work as expected.
angle- This is the direction the player should be facing when spawning at checkpoint if
targetproperty is not set. In trenchbroom the direction the player will face is shown by a little arrow in the center of the checkpoint area.
target- optional property. Can be set to a
vt_player_startwith the same targetname to specify the exact point where the player should spawn when respawning at this checkpoint
checkpoint_active_trigger_count- Zero by default. This is the amount of times this checkpoint must be triggered before it is reachable
targetname- When this targetname is triggered, the count corresponding to
checkpoint_active_trigger_countis incremented.
vt_damage_area
- If the player enters this area, they will die. Note enemies will not be impacted by damage movers.
- key_properties
has_piranhas- If piranhas should emerge from the area when the player dies
- 0: no
- 1: yes
vt_damage_mover
- Exactly the same as a
vt_moverexcept it does damage when the player touches it. - key_properties (Only showing the ones unique to this entity, see
vt_moverfor the other key properties)has_spikes- Whether spikes should be generated within the volume of this entity.
- Note: Spike generation looks for a nearby surface normal to determine the direction of the spikes. A proper
vt_damage_moverplacement with spikes would be a shallow (16-32 in depth) brush that is touching avt_moveror a piece of solid geometry. - 0: No spikes
- 1: Spikes
damage_typeLAVA,NORMAL,DAMAGE_AREA
hardcoded_normal- See
has_spikes. This will be the direction of the spikes if this value is set.
vt_end_level_area
- When this area is reached, the level ends
vt_intensity_change_area
- When this area is reached, the intensity of the level is set to at least
intensity_level. Seevt_music. - key properties
intensity_level(0-1): The intensity that the level should be set to when reached
vt_launchpad
- A launchpad that bounces the player
- key properties
bounce_forcebounce_force_maxoverwrite_velocity- 0: no
- 1: yes
launch_dir- optional, use this if the launch dir is different from the nearby surface normal of the launch pad
translation- optional. Use this for the launchpad to also function as a
vt_mover
vt_lava
- lava
vt_magnet_area
- a region that will very slightly magnetize the player toward the center
vt_mover
- An entity that moves when triggered
- key properties
targetname- when this targetname is triggered, the mover moves
translation- The translation that should occur when triggered, in Godot Units / coordinate system. Do not specify this if
tb_translationis already set
tb_translation- The translation that should occur when triggered, in Trenchbroom Units / coordinatesystem. Do not specify this if
translationis already set
duration- How long in seconds the mover should take to perform the translation when triggered
auto_move_after_checkpoint- When the player respawns at checkpoint index >= this value, the mover will automatically teleport to its terminal position
auto_move_after_checkpoint_region- When the player respawns at checkpoint index >=
auto_move_after_checkpointand region == this value, the mover will automatically teleport to its terminal position
move_delay- The delay that should be waited after
targetnameis triggered before this mover will start moving
trigger_count- How many times this mover should be triggered before moving. Default is 1
gt_mode- Not needed for custom maps
end_position_ratio_in_editor- not used in custom maps
play_sound- 0: Don’t play sound when moving
- 1: Do play sound
start_motion_target- The target that should be triggered when motion of this mover begins
end_motion_target- The target that should be triggered when motion of this mover ends
end_motion_message- A message that should display when motion ends
start_motion_message- A message that should display when motion begins
move_on_start- If this mover should start moving right away
- 1: yes
- 0: no
oscillate- 1: Immediately reverse motion when motion is finished
- 0: Stop when motion ends
delay_between_oscillation- Value in seconds that should be waited before reversing motion
match_speed_with_player- 0: Dont match speed with player. Simply move at speed corresponding to
duration - 1: Move faster if player is moving faster
start_motion_shake- 0 to 1 value. The amount of shake that should happen when motion is started
end_motion_shake- 0 to 1 value. The amount of shake that should happen when motion is ended
constant_motion_shake- 0 to 1 value. The amount of shake that should happen when motion is playing
reverb_level- The amount of reverb that should play when moving. See
play_sound
reverse_motion_duration- If reverse duration is different than
duration, set this value
dont_play_stop_sound_for_reverse_motion- 1: Don’t play sound reverse motion
- 0: Do play sound for reverse motion
end_motion_target_func- The function to be called on
end_motion_targetwhen motion is ended
should_knock- the mover will play a door knocking sound while untriggered, as if there is someone behind it
- 1: play the sound
one_more_message- When
trigger_count> 2 and the entity has been triggeredtrigger_count- 1 times, this message will be shown
disable_collider_on_move- Whether the collider should be disabled on move
should_loop- Similar to
oscillateexcept it teleports back to the beginning and immediately starts again when it reaches its terminal position
ease_type- valid types are
EASE_IN_OUT,EASE_OUT_IN,EASE_IN,EASE_OUT
trans_type- valid types are
TRANS_BACK,TRANS_BOUNCE,TRANS_QUAD,TRANS_QUINT,TRANS_QUART,TRANS_ELASTIC
is_wet- Determines if a wet sound is played for this mover
- 1: yes
player_only_world_collision- If the player is the only thing that should collide with this
- 1: yes
- 0: no
vt_oob_area
- deprecated
vt_secret_area
- Will notify the player that they found a secret when this area is entered
- key properties
secret_name- Required. Make sure to give it a unique name for the map.
vt_spinner_solid
- A piece of geometry that will spin. Use the origin texture to set the origin of the geometry which determines the pivot of the spin. Otherwise it will just spin around the center of the geometry in the direction of the
rotation_axis - key properties
speedradiusrotation_axis
vt_toast_area
- An area that displays dialogue on the screen when the player enters the area
- key properties
toast_textshould_pausetime_scaletoast_type- use the dropdown
display_condition- Only displays if this condition has been met, possible options are
has_not_yet_been_triggeredhas_not_yet_been_triggered_and_is_godly
is_tutorialtargetnamefull_speed_actionshould_squash
vt_trigger_area
- an area that will trigger the specified target when entered
- key properties
target- The entity that should be triggered when this area is entered
target_func- the function on the target that should be called
trigger_dependency_count- The amount of times this area must be triggered before it will emit a trigger when entered
targetname- use this to trigger the area corresponding to
trigger_dependency_count
required_keys_comma_sep- The keys that are required for this trigger area to trigger the target when entered. See
key_nameproperty onvt_key
required_artifacts_comma_sep- The artifact parts that must be collected for this trigger area to trigger the target when entered.
trigger_delayshow_locked_message- 0: Will not show any message when the player doesn’t have the required keys
trigger_once- 1: When this area is entered consecutive times, it will not trigger the target again
- 0: When this area is entered consecutive times, it triggers the target each time
exit_target- The target to trigger when this area is exited
exit_target_func- The target function to call
is_enemy_trigger- 1: This trigger area triggers when enemies enter it, instead of when the player enters it.
vt_water
- Creates water that the player can swim in
Pro Tips
Clip Textures and water
Water and lava are prone to weird visual artifacts, like this
You can prevent this by clipping the top / exposed parts of the water or lava
You can do this by making the whole brush a clip brush, then shift-clicking the faces you want to make the water texture, and selecting the water texture
Use a hotkey for clip texture
You will use the clip texture a lot. I assigned a hotkey so I don’t have to find the clip texture every time I need to apply it to something. Go to view → preferences → keyboard and find “Tags/turn selection into Clip” and assign that to your key of choice. I used backtick (`).
Common Issues
Random parts of my map stopped working for no reason
This issue is usually caused by empty properties in various entities. For example, if one of your entities has “property 1” in it, you should remove that. Sometimes this can happen if you hit the plus sign to add a property and forget to remove it later. If you suspect this could be the issue you can hit ctrl + A to select all entities and look at the properties panel to see if you see any strange / bad looking properties in your entire map.

