(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!
Watch the video getting started tutorial: https://youtu.be/09mth4fUaH0
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 are what they sound like: Entities that are placed at a single point in the map.
All enemies pretty much share the same properties, so they will be lumped together in this section. Here are all the different enemies
should_moveshould_launchshould_launchshould_launchtargetbubble_shield_iddeath_targetAll enemies have these key properties
hiddenhas_spawn_effecttargettarget_funcreverse_motion to close a door when this entity diestargetname:bubble_shield_idvt_mage and are disabled when the mage dies. If the tethered mage is shielding two different enemies, both enemies should have the same bubble_shield_id.shield_typebubble_shield_id is set.NO_AIR_DASHDAMAGE_ON_TOUCHarrow_counttypeartifact_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_STEELtargettargetnamearrow_type=1) or a Blood Tether (arrow_type = 2)arrow_typetargetnamelight_colorcolorscalevisibility_rangeenvironment: Use the dropdown to specify which level’s environment you want to use for your map.targeteyeball_nameguidENEMY_SKULL_SKULL_NESTING_SOUNDAMBIENT_CRICKETSPLAYER_HEART_BEAT_SPATIALEFFECTS_WATERFALL_LOOPAMBIENT_BIRDSAMBIENT_DEFAULT_AMBIENT_SPATIALpowerup_typeBOUNCY_DASHEXPLOSIVE_AIR_DASHSUPER_SPEEDSLIDE_TO_KILLUNLIMITED_BLOODtargettarget_functargetvt_trigger_area for usage.key_namepick_up_messagecolordisplay_namevt_magescaletargetnametargetvt_intensity_change_area.songtargetnameexplosion_forceshould_flashtargetnamevt_player_start has a targetname of “foo”, when the player spawns at checkpoint 1, they will spawn at the location of this entity.targetlight_energy: The strength of the lightlight_color: The color of the light, represented in RGB (0-1) formatomni_range: The Omnidirectional range of the lightomni_attenuation: The attenuation of the lightscaleshow_meshscalelight_indirect_energyvisibility_rangetargetnametoast_textshould_pausetutorial_titletutorial_desctutorial_data_path: Ignore this, not useful for custom mapstrigger_counttargetnametargettrigger_count is reached, this target is triggeredtarget_functargetnametarget will be triggered after trigger_delay secondstargettrigger_delay seconds after this entity has been triggeredtarget_functarget when it is triggeredtrigger_delaytarget is in-turn triggered.Brush entities are entities that are based on a brush, ie. some volume of space drawn in Trenchbroom.
surface_typewindow_colorfriction_multiplierchain_speednavigablefunc_geo but with less properties. The main difference is that func_detail do 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.window_colornavigablefunc_geo, but has no collision. Use this for pieces of geometry that are purely visual and the player and enemies should not collide with itwindow_colorbreakable_typegi_modegi_mode in custom mapsjib_count_multipliertargettarget_funcuse_fake_rigidbodiesbubble_shield_idhas_painting_blend_effectsir_brian_tuke texturejib_lifetimetranslationvt_mover for additional properties to usereverb_levelshould_jibhas_collision:navigable:jib_scalejib_typeGORE, NON_GORE, GLASS, GODhide_after_checkpointfriction_multipliercheckpoint_indextarget property.checkpoint_regioncheckpoint_index 1 and the right path has region “right” with checkpoint_index 1. This allows the checkpoints to be reached in any order and still work as expected.angletarget property is not set. In trenchbroom the direction the player will face is shown by a little arrow in the center of the checkpoint area.targetvt_player_start with the same targetname to specify the exact point where the player should spawn when respawning at this checkpointcheckpoint_active_trigger_counttargetnamecheckpoint_active_trigger_count is incremented.has_piranhasvt_mover except it does damage when the player touches it.vt_mover for the other key properties)has_spikesvt_damage_mover placement with spikes would be a shallow (16-32 in depth) brush that is touching a vt_mover or a piece of solid geometry.damage_typeLAVA, NORMAL, DAMAGE_AREAhardcoded_normalhas_spikes. This will be the direction of the spikes if this value is set.intensity_level. See vt_music.intensity_level (0-1): The intensity that the level should be set to when reachedbounce_forcebounce_force_maxoverwrite_velocitylaunch_dirtranslationvt_movertargetnametranslationtb_translation is already settb_translationtranslation is already setdurationauto_move_after_checkpointauto_move_after_checkpoint_regionauto_move_after_checkpoint and region == this value, the mover will automatically teleport to its terminal positionmove_delaytargetname is triggered before this mover will start movingtrigger_countgt_modeend_position_ratio_in_editorplay_soundstart_motion_targetend_motion_targetend_motion_messagestart_motion_messagemove_on_startoscillatedelay_between_oscillationmatch_speed_with_playerdurationstart_motion_shakeend_motion_shakeconstant_motion_shakereverb_levelplay_soundreverse_motion_durationduration, set this valuedont_play_stop_sound_for_reverse_motionend_motion_target_funcend_motion_target when motion is endedshould_knockone_more_messagetrigger_count > 2 and the entity has been triggered trigger_count - 1 times, this message will be showndisable_collider_on_moveshould_looposcillate except it teleports back to the beginning and immediately starts again when it reaches its terminal positionease_typeEASE_IN_OUT, EASE_OUT_IN, EASE_IN, EASE_OUTtrans_typeTRANS_BACK, TRANS_BOUNCE, TRANS_QUAD, TRANS_QUINT, TRANS_QUART, TRANS_ELASTICis_wetplayer_only_world_collisionsecret_namerotation_axisspeedradiusrotation_axistoast_textshould_pausetime_scaletoast_typedisplay_conditionhas_not_yet_been_triggeredhas_not_yet_been_triggered_and_is_godlyis_tutorialtargetnamefull_speed_actionshould_squashtargettarget_functrigger_dependency_counttargetnametrigger_dependency_countrequired_keys_comma_sepkey_name property on vt_keyrequired_artifacts_comma_septrigger_delayshow_locked_messagetrigger_onceexit_targetexit_target_funcis_enemy_triggerWater 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
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 (`).
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.