User:SirYodaJedi/Porting Quake DM maps to Deathmatch Classic

From Valve Developer Community
Jump to navigation Jump to search
Icon-under construction-blue.png
This is a draft user page. It is a work in progress open to editing by anyone.
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

Todo: Axial Projection → Valve220 (not strictly necessary, as hlcsg supports the former, but helps with edits)
  • 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 Quake BSP29 maps can be directly converted to GoldSrc BSP30 without recompiling (such as using ericw-tools BSPUtil or newbspguy), this is discouraged, as the aforementioned hull size differences may cause issues.

Textures

Todo: porting from WAD2 to WAD3; renaming tool 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
Note.pngNote:Teleporters use the same tint as regular water in Quake. It may make sense to use a weak black fog instead.
Confirm:What color does QEX use for water tint? It uses a blue tint instead of brown.

Skies

Todo: method using two additive scrolling func_illusionary entities (via rendercolor)

Lighting

Todo: 
  • 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

Todo: simulating visleaf-based ambient sounds for water and sky

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_door
  • func_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_explobox or misc_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 deathmatch
  • func_episodegate - appears when an episode is complete, which in deathmatch is never
  • trigger_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 rendermode to 2, and multiply this KV's value by 255 and set renderamt to 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 angles KV.

Generic Keyvalues

Alpha translucency (alpha) <normal>
Set rendermode to 2, then multiply this KV's value by 255 and set renderamt to the integer-rounded result.
"Mangle" (mangle) <vector3>
Change to angles, swapping the first and second values.