User:SirYodaJedi/Porting Quake DM maps to Deathmatch Classic
Remember to check for any notes left by the tagger at this article's talk page.
This page covers some oddities about porting Quake I deathmatch maps to Deathmatch Classic. Maps can mostly ported directly with minimal edits, but there are some quirks to work out
Uncompiled map file
- Players are taller in DMC than Quake. In Quake, players are 64qu tall, whereas in DMC, players are 72 units tall. While it is possible to use a hullfile to change the player size to that of Quake's, it is preferable to instead convert chop of a portion of the overhang and convert it to a func_group or func_detail with zhlt_noclip.
- While compiled
BSP29 maps can be directly converted to
BSP30 without recompiling (such as using ericw-tools BSPUtil or newbspguy), this is discouraged, as the aforementioned hull size differences may cause issues.
Textures
Liquids
Liquids should be renamed from * to !. Additionally, the palette will need to be regenerated, because of how Half-Life handles fog color.
Fog color can be taken from the tint color, and fog density can be taken from tint percentage. See The303's tutorial on how to configure water fog.
| Liquid Type | Color | Intensity |
|---|---|---|
| Water | 130,80,50 | 128 |
| Slime | 0,25,5 | 150 |
| Lava | 255,80,0 | 150 |
Skies
Fullbrights
While fullbrights were disabled in GoldSrc, they can still be replicated by using an additive layer. The fullbright texels in the main texture should be replaced with black, and a second texture with only the fullbrights should have the non-fullbright texels replaced with black. Place the texture with the fullbrights as a separate entity with the additive rendermode, and offset the geometry by 0.125 units from the main lightmapped geometry. Note that this won't work well for non-axial geometry, but most fullbrights are on axial geometry anyway.
Lighting
- light (+ _color) to _light
- model/sprite based lights (the flame models do exist, but they need to be played back at 1/3 speed)
Sounds
Ambient sounds
The following entities (which don't exist in DMC) emit ambient sounds, which should be replicated with ambient_generic. Remember to bundle the sounds with your map and use a RES file!
| Entity | WAV file (relative to /id1/sound/) |
Volume |
|---|---|---|
| ambient_suck_wind | ambience/suck1.wav |
10 |
| ambient_drone | ambience/drone6.wav |
5 |
| ambient_fluoro_buzz | ambience/buzz1.wav |
10 |
| ambient_drip | ambience/drip1.wav |
5 |
| ambient_comp_hum | ambience/comp1.wav |
10 |
| ambient_thunder | ambience/thunder1.wav |
5 |
| ambient_light_buzz | ambience/fl_hum1.wav |
5 |
| ambient_swamp1 | ambience/swamp1.wav |
5 |
| ambient_swamp2 | ambience/swamp2.wav |
5 |
| FireAmbient | ambience/fire1.wav |
5 |
| light_fluoro | ambience/fl_hum1.wav |
5 |
| light_fluorospark | ambience/buzz1.wav |
5 |
| light_torch_small_walltorch | ambience/fire1.wav |
5 |
| light_flame_large_yellow | ambience/fire1.wav |
5 |
| light_flame_small_yellow | ambience/fire1.wav |
5 |
| light_flame_small_white | ambience/fire1.wav |
5 |
Other entities
air_bubbles- Can be mimicked with env_bubbles, but will need to be turned into a brush entity. Technically it isn't spawned in Deathmatch mode in the original game, but why not add the little extra visual flair.func_dm_only- trigger_teleport (doesn't actually exist, but this is what it allegedly would be)func_door_secret- func_doorfunc_bossgate- func_wall (disappears when all episodes are complete, which in deathmatch is never)func_illusionary- func_detail, with at least one face of each brush textured with CONTENTEMPTY (split brushes if necessary. Func_illusionary in Quake doesn't count as an edict after initially being spawned, but this behavior was removed in GoldSrc because they couldn't get it to work with the revamped save system.)info_notnull- info_target. Note that the GoldSrc counterpart is much less versatile than Quake (being just a point that entities can target), as the move away from QuakeC means "maphacks" don't work in GoldSrc.misc_exploboxormisc_explobox2- using the source MAPs for b_explob or b_exbox2 (respectively), create a func_breakable with health of 20 and an explosion magnitude of 160.misc_teleporttrain- [confirm]trigger_secret- trigger_once
Entities to remove outright
If any entities have the "not in deathmatch" spawnflag set, then they can be removed.
monster_*- monsters don't appear in deathmatchfunc_episodegate- appears when an episode is complete, which in deathmatch is nevertrigger_onlyregistered- Shows a message if pop.lmp fails to validate (unregistered). This feature doesn't exist in GoldSrc.trigger_setskill- Singleplayer thing; removed in DMC.item_key*- DMC removes support for keys. You could use an item_security targeting the door, but it's probably better to just leave the door unlocked (iirc, this is what Q1 does in DM mode anyway)item_sigil- Singleplayer thing; removed in DMC.
Worldspawn Keyvalues
- Sky name (_sky, sky, _qlsky, qlsky) <sky name>
- Change to
skyname.
- Fog (_fog, fog) <float + color1>
- First value is intensity percentage, rest is color1. This can be done using env_fog (multiply the color values by 255), although I'm not sure how to convert the intensity to distance mathematically instead of by eyeballing.
- Water alpha translucency (_wateralpha, wateralpha) <normal>
- Slime alpha translucency (_slimealpha, slimealpha) <normal>
- Lava alpha translucency (_lavaalpha, lavaalpha) <normal>
- Convert the according liquids to func_water, set contents accordingly, set
rendermodeto 2, and multiply this KV's value by 255 and setrenderamtto the integer-rounded result.
- Teleporter alpha translucency (_telealpha, telealpha) <normal>
- This is like the other liquids, but is a bit trickier due to GoldSrc only rendering the top of liquid brushes (which usually isn't a problem for other liquids). This can be hacked using a non-solid starting-off func_rotating with the
anglesKV.
Generic Keyvalues
- Alpha translucency (alpha) <normal>
- Set
rendermodeto 2, then multiply this KV's value by 255 and setrenderamtto the integer-rounded result.
- "Mangle" (mangle) <vector3>
- Change to
angles, swapping the first and second values.