]> git.xonotic.org Git - xonotic/xonotic.git/blobdiff - Docs/mapping.txt
add an autoscreenshot method
[xonotic/xonotic.git] / Docs / mapping.txt
index 027452551db7a18262cd7e46afe7909ea2f377a8..c46d6996d78efbcb3942bb878b53161a4e03a709 100644 (file)
-==============\r
-=Mapping Help=\r
-==============\r
-\r
-While I can't help you make a map, I can help you get it listed in the menu and\r
-working in the maplist. :p  The central object is the .mapinfo file, but\r
-there's much more available.\r
-\r
-Table of Contents\r
------------------\r
-I        Map Lists & Scripts\r
-         (get your map listed and working)\r
-  i.     mapinfo\r
-  ii.    mapname.cfg\r
-\r
-II       Map Image\r
-\r
-III      Domination\r
-\r
-IV       CTF\r
-\r
-V        Rune Match\r
-\r
-VI       Race/CTS\r
-\r
-VII      Nexball\r
-\r
-Appendix A - Advanced mapinfo\r
-\r
-Appendix B - Helpful extras\r
-  i.     Team Colors\r
-  ii.    Text Colors\r
-\r
-Appendix C - Advanced Darkplaces shaders\r
-\r
-========================\r
-=I. Map Lists & Scripts=\r
-========================\r
-\r
-There now is just a single script/cfg file available to you, containing all map\r
-specific settings:\r
-\r
-mapname.mapinfo\r
-\r
-The mapinfo is actually required - however, the game is so nice that it\r
-automatically generates a draft of it for you.\r
-\r
-------------------\r
--The mapinfo file-\r
-------------------\r
-\r
-*cue even more scary music*\r
-\r
-The mapinfo file is basically what gets your map listed in the menu, and sets\r
-up the options needed to change to it. If no mapinfo file exists, the menu\r
-will automatically generate a rough draft for you on game startup. It will get\r
-stored into data/data/mapname.mapinfo.\r
-\r
-As an example, let's say I make a map called "wazat1.bsp". As long as I'm\r
-fantasizing, I might as well say this map is so well done I'm actually willing\r
-to release it for friends, neighbors, fellow forum visitors and other people\r
-who like me to judge me by. Let's also assume that I want domination,\r
-deathmatch/team deathmatch and runematch to all be playable on my map.\r
-\r
-This is very easy. First, I start the game and exit it again so the game writes\r
-data/data/wazat1.mapinfo for me. The file may look like:\r
-\r
-    title Wazat's Great Map\r
-    description Bleh.\r
-    author Unknown\r
-    _diameter 1966.839355\r
-    _spawnpoints 5\r
-    has weapons\r
-       cdtrack 5\r
-    type dm 30 20\r
-    type dom 200 20\r
-    type rune 200 20\r
-    type lms 9 20\r
-    type arena 10 20\r
-\r
-As I see, the menu autodetected that my map may be suitable for deathmatch,\r
-domination, runematch, last man standing and arena. But I want the map to be\r
-played in domination, deathmatch, team deathmatch, runematch only, and I also\r
-want different timelimits/fraglimits, so I will change the "type" lines to:\r
-\r
-    type dom 100 15\r
-    type rune 1000 25\r
-    type dm 40 15\r
-    type tdm 50 0 2\r
-\r
-Also, while I am at it, I should fix the placeholders in the map description lines:\r
-\r
-    title Wibble\r
-    description A large multi level arena map\r
-    author Wazat\r
-\r
-Although not entirely necessary, I will now move the .mapinfo file from\r
-data/data/maps/wazat1.mapinfo to data/maps/wazat1.mapinfo, so it is at the same\r
-place as my map. Next time I start the game, my map will be shown supporting\r
-the right game modes and with the right description in the menu.\r
-\r
-Also, note the "has weapons" line. If this line is not there (which happens if\r
-the map contains no weapon entities other than the Nex), the map will run in\r
-MinstaGib only and not be shown in the menu normally. So if you look for your\r
-map and don't find it, add "has weapons" to the mapinfo file, and make sure you\r
-have weapon entities placed.\r
-\r
-There's much more power in a mapinfo file. See Appendix A for more details.\r
-\r
-Gametype        | Syntax                                                                              | Notes\r
-----------------+-------------------------------------------------------------------------------------+-------------------------------------------------------\r
-Deathmatch      | type dm    <fraglimit>  <timelimit>                                                 |\r
-Team Deathmatch | type tdm   <fraglimit>  <timelimit> <teams>                                         | 2, 3, or 4 teams\r
-Domination      | type dom   <pointlimit> <timelimit>                                                 | teams are set by the map's entities\r
-CTF             | type ctf   <pointlimit> <timelimit> <caplimit>                                      | pointlimit if g_ctf_win_mode is 2, otherwise caplimit\r
-Runematch       | type rune  <pointlimit> <timelimit>                                                 |\r
-LMS             | type lms   <lives>      <timelimit>                                                 |\r
-Arena           | type arena <fraglimit>  <timelimit>                                                 |\r
-Key Hunt        | type kh    <pointlimit> <timelimit> <teams>                                         | 2, 3, or 4 teams\r
-Assault         | type as                 <timelimit>                                                 | never uses points\r
-Onslaught       | type ons                <timelimit>                                                 | never uses points\r
-Race            | type rc                 <timelimit> <qualifyingtimelimit> <laplimit> <teamlaplimit> | g_race_teams: teamlaplimit is used instead of laplimit\r
-CTS             | type cts                <timelimit> <skill>                                         | never uses points\r
-\r
-\r
-===============\r
-=II. Map Image=\r
-===============\r
-\r
-So, you've got your map listed in the menu and it plays properly, but the menu\r
-isn't showing your picture! Or the picture is scaled badly! What manner of man\r
-would create such an accursed abomination?!\r
-\r
-Well... That sounds like something I'd do. :D\r
-\r
-And it is really easy: just make a screenshot of the map in action (preferably\r
-with crosshair and HUD switched off), and place it next to the map as\r
-mapname.jpg. For best rendering and file size, make the image in 4:3 aspect\r
-ratio, but scale it to the resolution 256x256 or possibly 512x512. It will look\r
-skewed in your image editing app, but the menu will show it right, and your\r
-graphics card LOVES images of such dimension.\r
-\r
-\r
-=================\r
-=III. Domination=\r
-=================\r
-\r
-In order to get Domination working well in your map, you need to place dom_team\r
-and dom_controlpoint entites. You *must* have at least 3 dom_team entities - 2\r
-minimum teams and one blank one (empty netname and no team). You can have up to\r
-4 teams (5 dom_team entities), and remember: if you set 3 teams, the third team\r
-must be the yellow one, according to the team order.\r
-\r
-Dom Team\r
---------\r
-classname  dom_team\r
-netname    name of team (Red Team). Set to "" or don't define for the required\r
-           blank team.\r
-cnt        color of the team. See the "Helpful Extras" section for info.\r
-model      When this team captures control points, the points turn to this\r
-           model. If this is the neutral team, points start out as this model.\r
-noise      Sound to be played on the control point when it's captured. Only\r
-           players nearby will hear it.\r
-noise1     Sound to be played to all players when the control point is\r
-           captured. Also good for an annoncer voice ("Red Team has captured a\r
-           control point")\r
-\r
-Control Points\r
---------------\r
-classname  dom_controlpoint\r
-message    message to be displayed to all players when this point is captured,\r
-           preceded by the team's name. This defaults to " has captured a control point".\r
-           You can specify different names for each point, for example " has captured the\r
-           Lava Room".\r
-origin     where in the map this point is\r
-wait       How often this point gives its controlling team frags.\r
-frags      How many frags this point gives each wait cycle.\r
-\r
-Here is an example entry in a .ent file that includes colored text and 3 teams:\r
-\r
-{\r
-"classname" "dom_team"\r
-"netname" ""\r
-"model" "models/domination/dom_unclaimed.md3"\r
-}\r
-{\r
-"classname" "dom_team"\r
-"netname" "^4Blue Team"\r
-"cnt" "13"\r
-"noise" ""\r
-"noise1" "domination/claim.wav"\r
-"model" "models/domination/dom_blue.md3"\r
-}\r
-{\r
-"classname" "dom_team"\r
-"netname" "^1Red Team"\r
-"cnt" "4"\r
-"noise" ""\r
-"noise1" "domination/claim.wav"\r
-"model" "models/domination/dom_red.md3"\r
-}\r
-{\r
-"netname" "^3Yellow Team"\r
-"cnt" "12"\r
-"noise" ""\r
-"noise1" "domination/claim.wav"\r
-"model" "models/domination/dom_yellow.md3"\r
-}\r
-{\r
-"netname" "^6Pink Team"\r
-"cnt" "9"\r
-"noise" ""\r
-"noise1" "domination/claim.wav"\r
-"model" "models/domination/dom_pink.md3"\r
-}\r
-{\r
-"classname" "dom_controlpoint"\r
-"message" " ^3has captured the ^1Hallways"\r
-"origin" "-206.0 -488.8 -150.0"\r
-"frags" "3"\r
-"wait" "5"\r
-"scale" "1.3"\r
-}\r
-{\r
-"classname" "dom_controlpoint"\r
-"message" " ^3has captured the ^1Lavaroom"\r
-"origin" "1457.1  19.9 -110.0"\r
-"frags" "1"\r
-"wait" "5"\r
-}\r
-{\r
-"classname" "dom_controlpoint"\r
-"message" " ^3controls the ^1Nex & Strength"\r
-"origin" "-259.8 299.3  5"\r
-"frags" "1"\r
-"wait" "5"\r
-}\r
-{\r
-"classname" "dom_controlpoint"\r
-"message" " ^3has captured the ^1Upper Platform"\r
-"origin" "539.7 1206.0 182.0"\r
-"frags" "1"\r
-"wait" "5"\r
-}\r
-{\r
-"classname" "dom_controlpoint"\r
-"message" " ^3has captured the ^1Teleport Room"\r
-"origin" "-1000.0 636.2 -16.0"\r
-"frags" "1"\r
-"wait" "5"\r
-}\r
-\r
-\r
-As you can see in the example, there are 5 dom_team ents: one blank, Red, Blue,\r
-Yellow and Pink. Each control point has a different message (giving it a\r
-special name), and the one in the hallways gives 3 frags every 5 seconds\r
-instead of just one, making it more valuable.\r
-\r
-If your map contains the required entities for Domination, the menu will\r
-automatically detect it for supporting Domination. To force the map to get\r
-re-detected after you add such entities, delete the data/data/mapname.mapinfo\r
-file - or simply edit it to add the "type dom" line.\r
-\r
-\r
-=========\r
-=IV. CTF=\r
-=========\r
-\r
-Capture the flag needs at least 1 CTF flag per team, and can also make use of\r
-team spawnpoints.\r
-\r
-CTF Flags\r
----------\r
-classname  item_flag_team1 or item_flag_team2\r
-angle      direction the flag will point\r
-model      model of the flag (default: models/ctf/flag_red.md3 or\r
-           models/ctf/flag_blue.md3)\r
-noise      sound played when flag is stolen (default: "ctf/take.wav")\r
-noise1     sound played when flag is returned by a teammate (default:\r
-           "ctf/return.wav")\r
-noise2     sound played when flag is captured (default: "ctf/capture.wav")\r
-noise3     sound played when flag returns itself (default: "ctf/respawn.wav")\r
-\r
-Team Spawnpoints\r
-----------------\r
-classname  info_player_team1 or info_player_team2\r
-*note: These function just like info_player_deathmatch, but for one team only.\r
-If you don't make team spawnpoints, info_player_deathmatch is used instead.\r
-\r
-If your map contains the required entities for CTF, the menu will automatically\r
-detect it for supporting CTF. To force the map to get re-detected after you add\r
-such entities, delete the data/data/mapname.mapinfo file - or simply edit it to\r
-add the "type ctf" line.\r
-\r
-==============\r
-=V. Runematch=\r
-==============\r
-\r
-Runematch needs only one type of entity to work: rune spawn points. You will\r
-need at least one for each rune (5 minimum at the time of this writing), though\r
-you should probably have more than that in the map. Just give the points a\r
-classname and origin.\r
-\r
-Rune Spawnpoints\r
-----------------\r
-classname  runematch_spawn_point\r
-\r
-If your map contains the required entities for Runematch, the menu will automatically\r
-detect it for supporting Runematch. To force the map to get re-detected after you add\r
-such entities, delete the data/data/mapname.mapinfo file - or simply edit it to\r
-add the "type rune" line.\r
-\r
-==============\r
-=VI. Race/CTS=\r
-==============\r
-\r
-Making a race map is not hard: you need some special spawnpoints, and some checkpoints.\r
-\r
-Spawnpoints\r
------------\r
-classname  info_player_race\r
-target     targetname of the checkpoint\r
-race_place for finish line checkpoints, the place of the point, or -1 to make it qualifying/CTS-only, or unset to let all the other players spawn\r
-\r
-Checkpoints\r
------------\r
-classname  trigger_race_checkpoint\r
-targetname some name to target the checkpoint with\r
-cnt        number of the checkpoint (or 0 for finish line)\r
-\r
-Note that checkpoints are brush entities, and they should be somewhat thick and\r
-cover the full volume the player could use to get past them.\r
-\r
-Example of entity placement:\r
-\r
-                         ###\r
-    ---------------------###---\r
-   /    9999  7  5  3  1>###   \\r
-  /     9999 8  6  4  2 >###    \\r
- |     ------------------###     |\r
-%%%%%%%%                 ###|    |\r
-%%%%%%%%                 $$$|    |\r
- | ^ ^ ------------------$$$     |\r
- \                       $$$ <  /\r
-  \                      $$$ < /\r
-   ----------------------$$$---\r
-                         $$$\r
-\r
-###:  classname = trigger_race_checkpoint, cnt = 0, targetname = finish\r
-$$$:  classname = trigger_race_checkpoint, cnt = 1, targetname = cp1\r
-%%%:  classname = trigger_race_checkpoint, cnt = 2, targetname = cp2\r
->:    classname = info_player_race,                 target = finish, angle = 0\r
-1:    classname = info_player_race,                 target = finish, angle = 0, race_place = 1\r
-2:    classname = info_player_race,                 target = finish, angle = 0, race_place = 2\r
-....\r
-8:    classname = info_player_race,                 target = finish, angle = 0, race_place = 8\r
-9:    classname = info_player_race,                 target = finish, angle = 0, race_place = 9\r
-<:    classname = info_player_race,                 target = cp1,    angle = 180\r
-^:    classname = info_player_race,                 target = cp2,    angle = 90\r
-\r
-If your map contains the required entities for Race, the menu will automatically\r
-detect it for supporting Race. To force the map to get re-detected after you add\r
-such entities, delete the data/data/mapname.mapinfo file - or simply edit it to\r
-add the "type rc" line.\r
-\r
-CTS maps do not use checkpoints with race_place set, so you can leave them out\r
-for CTS maps.\r
-\r
-The skill parameter in the mapinfo entry for CTS shall be in the range from 0 (easy) to 10 (impossible).\r
-\r
-=============\r
-=VI. Nexball=\r
-=============\r
-\r
-There are three required entities: nexball_redgoal, nexball_bluegoal, and one of nexball_basketball\r
-or nexball_football. There are also optional nexball_yellowgoal and nexball_pinkgoal entities (don't\r
-add a pink goal when there is no yellow goal on the map, it will crash)\r
-\r
-Goals are made just like any other regular triggers. You can use multiple brushes for one trigger,\r
-but avoid this if possible.\r
-\r
-There are also two other goal-like entities, nexball_fault and nexball_bound, the first taking a point\r
-from the team that hits the trigger with the ball, the second simply returning it. You can spawn the\r
-ball inside a goal-like trigger, this can be useful for basketball maps with separate teams and a\r
-common ball spawn.\r
-The different keys for the entities are documented in entities.def.\r
-\r
-The ball is affected by trigger_impulse, but not by trigger_push or teleporters.\r
-\r
-You should better avoid patches on the field, as collisions can sometimes get buggy on these.\r
-\r
-\r
-===============================\r
-=Appendix A - Advanced mapinfo=\r
-===============================\r
-\r
-You now know how to make a basic, bare-bones mapinfo to set up a couple options\r
-and load your map. However, there's much more you can do!  Consider these\r
-senarios:\r
-\r
-1. The laser has too high of a force for laser jumps and ruins CTF\r
-2. I don't want players to start out with the shotgun, but with the machinegun\r
-   instead\r
-3. The map takes so much server CPU performance that the anti-wallhack can't be\r
-   made active\r
-\r
-Each of these situations can be resolved with ease with a little work in the\r
-mapinfo file.\r
-\r
-To do this, I can add the following lines to my mapinfo file:\r
-\r
-    settemp_for_type ctf g_balance_laser_primary_force 200\r
-    settemp_for_type all g_start_weapon_shotgun 0\r
-    settemp_for_type all g_start_weapon_uzi 1\r
-    settemp_for_type all sv_cullentities_trace 0\r
-\r
-These "settemp" settings are automatically removed when the map is left and\r
-another is loaded. As you can see, it is possible to make per-mode temporary\r
-settings, and global ones.\r
-\r
-Similar settings are also possible for the client:\r
-\r
-    clientsettemp_for_type all r_shadow_glossexponent 96\r
-\r
-Another possibility is to specify fog settings in the mapinfo, for convenience\r
-in case you set sv_foginterval by it too (to force the fog on the clients):\r
-\r
-    fog 0.2 0.25 0.3 0.3 1 1500\r
-    settemp_for_type all sv_foginterval 5\r
-\r
-\r
-=============================\r
-=Appendix B - Helpful Extras=\r
-=============================\r
-\r
-----------------\r
--i. Team Colors-\r
-----------------\r
-When you need to set an entity's color or team, use these values:\r
-\r
-Red\r
----\r
-Team:      5\r
-Color:     4\r
-\r
-Blue\r
-----\r
-Team:      14\r
-Color:     13\r
-\r
-Yellow\r
-------\r
-Team:      13\r
-Color:     12\r
-\r
-Pink\r
------\r
-Team:      10\r
-Color:     9\r
-\r
-\r
-----------------\r
--i. Text Colors-\r
-----------------\r
-Occasionally you may want to print text in color, such as team names. Here are your options:\r
-\r
-1  Red\r
-2  Green\r
-3  Yellow\r
-4  Blue\r
-5  Cyan\r
-6  Magenta\r
-7  White\r
-8  Grey (transparent)\r
-9  Grey (solid)\r
-0  Black\r
-\r
-==========================================\r
-=Appendix C - Advanced Darkplaces shaders=\r
-==========================================\r
-\r
-Shader parameters for DP's own features:\r
-- dp_reflect <distort> <r> <g> <b> <a>\r
-  Makes surfaces of this shader reflective with r_water. The reflection is\r
-  alpha blended on the texture with the given alpha, and modulated by the given\r
-  color. distort is used in conjunction with the normalmap to simulate a\r
-  nonplanar water surface.\r
-- dp_refract <distort> <r> <g> <b>\r
-  Makes surfaces of this shader refractive with r_water. The refraction\r
-  replaces the transparency of the texture. distort is used in conjunction with\r
-  the normalmap to simulate a nonplanar water surface.\r
-- dp_water <reflectmin> <reflectmax> <refractdistort> <reflectdistort> <refractr> <refractg> <refractb> <reflectr> <reflectg> <reflectb> <alpha>\r
-  This combines the effects of dp_reflect and dp_refract to simulate a water\r
-  surface. However, the refraction and the reflection are mixed using a Fresnel\r
-  equation that makes the amount of reflection slide from reflectmin when\r
-  looking parallel to the water to reflectmax when looking directly into the\r
-  water. The result of this reflection/refraction mix is then layered BELOW the\r
-  texture of the shader, so basically, it "fills up" the alpha values of the\r
-  water. The alpha value is a multiplicator for the alpha value on the texture\r
-  - set this to a small value like 0.1 to emphasize the reflection and make\r
-  the water transparent; but if r_water is 0, alpha isn't used, so the water can\r
-  be very visible then too.\r
-\r
+==============
+=Mapping Help=
+==============
+
+While I can't help you make a map, I can help you get it listed in the menu and
+working in the maplist. :p  The central object is the .mapinfo file, but
+there's much more available.
+
+Table of Contents
+-----------------
+I        Map Lists & Scripts
+         (get your map listed and working)
+  i.     mapinfo
+  ii.    mapname.cfg
+
+II       Map Image
+
+III      Domination
+
+IV       CTF
+
+V        Rune Match
+
+VI       Race/CTS
+
+VII      Nexball
+
+Appendix A - Advanced mapinfo
+
+Appendix B - Helpful extras
+  i.     Team Colors
+  ii.    Text Colors
+
+Appendix C - Advanced Darkplaces shaders
+
+========================
+=I. Map Lists & Scripts=
+========================
+
+There now is just a single script/cfg file available to you, containing all map
+specific settings:
+
+mapname.mapinfo
+
+The mapinfo is actually required - however, the game is so nice that it
+automatically generates a draft of it for you.
+
+------------------
+-The mapinfo file-
+------------------
+
+*cue even more scary music*
+
+The mapinfo file is basically what gets your map listed in the menu, and sets
+up the options needed to change to it. If no mapinfo file exists, the menu
+will automatically generate a rough draft for you on game startup. It will get
+stored into data/data/mapname.mapinfo.
+
+As an example, let's say I make a map called "wazat1.bsp". As long as I'm
+fantasizing, I might as well say this map is so well done I'm actually willing
+to release it for friends, neighbors, fellow forum visitors and other people
+who like me to judge me by. Let's also assume that I want domination,
+deathmatch/team deathmatch and runematch to all be playable on my map.
+
+This is very easy. First, I start the game and exit it again so the game writes
+data/data/wazat1.mapinfo for me. The file may look like:
+
+    title Wazat's Great Map
+    description Bleh.
+    author Unknown
+    _diameter 1966.839355
+    _spawnpoints 5
+    has weapons
+       cdtrack 5
+    type dm 30 20
+    type dom 200 20
+    type rune 200 20
+    type lms 9 20
+    type arena 10 20
+
+As I see, the menu autodetected that my map may be suitable for deathmatch,
+domination, runematch, last man standing and arena. But I want the map to be
+played in domination, deathmatch, team deathmatch, runematch only, and I also
+want different timelimits/fraglimits, so I will change the "type" lines to:
+
+    type dom 100 15
+    type rune 1000 25
+    type dm 40 15
+    type tdm 50 0 2
+
+Also, while I am at it, I should fix the placeholders in the map description lines:
+
+    title Wibble
+    description A large multi level arena map
+    author Wazat
+
+Although not entirely necessary, I will now move the .mapinfo file from
+data/data/maps/wazat1.mapinfo to data/maps/wazat1.mapinfo, so it is at the same
+place as my map. Next time I start the game, my map will be shown supporting
+the right game modes and with the right description in the menu.
+
+Also, note the "has weapons" line. If this line is not there (which happens if
+the map contains no weapon entities other than the Nex), the map will run in
+MinstaGib only and not be shown in the menu normally. So if you look for your
+map and don't find it, add "has weapons" to the mapinfo file, and make sure you
+have weapon entities placed.
+
+There's much more power in a mapinfo file. See Appendix A for more details.
+
+Gametype        | Syntax                                                                                            | Notes
+----------------+---------------------------------------------------------------------------------------------------+-------------------------------------------------------
+Deathmatch      | type dm      <fraglimit>  <timelimit>                                                 <leadlimit> |
+Team Deathmatch | type tdm     <fraglimit>  <timelimit> <teams>                                         <leadlimit> | 2, 3, or 4 teams
+Domination      | type dom     <pointlimit> <timelimit>                                                 <leadlimit> | teams are set by the map's entities
+CTF             | type ctf     <pointlimit> <timelimit> <caplimit>                                      <leadlimit> | pointlimit if g_ctf_win_mode is 2, otherwise caplimit
+Runematch       | type rune    <pointlimit> <timelimit>                                                 <leadlimit> |
+LMS             | type lms     <lives>      <timelimit>                                                 <leadlimit> |
+Arena           | type arena   <fraglimit>  <timelimit>                                                 <leadlimit> |
+Key Hunt        | type kh      <pointlimit> <timelimit> <teams>                                         <leadlimit> | 2, 3, or 4 teams
+Assault         | type as                   <timelimit>                                                             | never uses points
+Onslaught       | type ons                  <timelimit>                                                             | never uses points
+Race            | type rc                   <timelimit> <qualifyingtimelimit> <laplimit> <teamlaplimit> <leadlimit> | g_race_teams: teamlaplimit is used instead of laplimit
+CTS             | type cts                  <timelimit> <skill>                                                     | never uses points
+CA              | type dm      <fraglimit>  <timelimit>                                                 <leadlimit> |
+Nexball         | type dm      <fraglimit>  <timelimit>                                                 <leadlimit> |
+
+
+===============
+=II. Map Image=
+===============
+
+So, you've got your map listed in the menu and it plays properly, but the menu
+isn't showing your picture! Or the picture is scaled badly! What manner of man
+would create such an accursed abomination?!
+
+Well... That sounds like something I'd do. :D
+
+And it is really easy: just make a screenshot of the map in action (preferably
+with crosshair and HUD switched off), and place it next to the map as
+mapname.jpg. For best rendering and file size, make the image in 4:3 aspect
+ratio, but scale it to the resolution 256x256 or possibly 512x512. It will look
+skewed in your image editing app, but the menu will show it right, and your
+graphics card LOVES images of such dimension.
+
+
+=================
+=III. Domination=
+=================
+
+In order to get Domination working well in your map, you need to place dom_team
+and dom_controlpoint entites. You *must* have at least 3 dom_team entities - 2
+minimum teams and one blank one (empty netname and no team). You can have up to
+4 teams (5 dom_team entities), and remember: if you set 3 teams, the third team
+must be the yellow one, according to the team order.
+
+Dom Team
+--------
+classname  dom_team
+netname    name of team (Red Team). Set to "" or don't define for the required
+           blank team.
+cnt        color of the team. See the "Helpful Extras" section for info.
+model      When this team captures control points, the points turn to this
+           model. If this is the neutral team, points start out as this model.
+noise      Sound to be played on the control point when it's captured. Only
+           players nearby will hear it.
+noise1     Sound to be played to all players when the control point is
+           captured. Also good for an annoncer voice ("Red Team has captured a
+           control point")
+
+Control Points
+--------------
+classname  dom_controlpoint
+message    message to be displayed to all players when this point is captured,
+           preceded by the team's name. This defaults to " has captured a control point".
+           You can specify different names for each point, for example " has captured the
+           Lava Room".
+origin     where in the map this point is
+wait       How often this point gives its controlling team frags.
+frags      How many frags this point gives each wait cycle.
+
+Here is an example entry in a .ent file that includes colored text and 3 teams:
+
+{
+"classname" "dom_team"
+"netname" ""
+"model" "models/domination/dom_unclaimed.md3"
+}
+{
+"classname" "dom_team"
+"netname" "^4Blue Team"
+"cnt" "13"
+"noise" ""
+"noise1" "domination/claim.wav"
+"model" "models/domination/dom_blue.md3"
+}
+{
+"classname" "dom_team"
+"netname" "^1Red Team"
+"cnt" "4"
+"noise" ""
+"noise1" "domination/claim.wav"
+"model" "models/domination/dom_red.md3"
+}
+{
+"netname" "^3Yellow Team"
+"cnt" "12"
+"noise" ""
+"noise1" "domination/claim.wav"
+"model" "models/domination/dom_yellow.md3"
+}
+{
+"netname" "^6Pink Team"
+"cnt" "9"
+"noise" ""
+"noise1" "domination/claim.wav"
+"model" "models/domination/dom_pink.md3"
+}
+{
+"classname" "dom_controlpoint"
+"message" " ^3has captured the ^1Hallways"
+"origin" "-206.0 -488.8 -150.0"
+"frags" "3"
+"wait" "5"
+"scale" "1.3"
+}
+{
+"classname" "dom_controlpoint"
+"message" " ^3has captured the ^1Lavaroom"
+"origin" "1457.1  19.9 -110.0"
+"frags" "1"
+"wait" "5"
+}
+{
+"classname" "dom_controlpoint"
+"message" " ^3controls the ^1Nex & Strength"
+"origin" "-259.8 299.3  5"
+"frags" "1"
+"wait" "5"
+}
+{
+"classname" "dom_controlpoint"
+"message" " ^3has captured the ^1Upper Platform"
+"origin" "539.7 1206.0 182.0"
+"frags" "1"
+"wait" "5"
+}
+{
+"classname" "dom_controlpoint"
+"message" " ^3has captured the ^1Teleport Room"
+"origin" "-1000.0 636.2 -16.0"
+"frags" "1"
+"wait" "5"
+}
+
+
+As you can see in the example, there are 5 dom_team ents: one blank, Red, Blue,
+Yellow and Pink. Each control point has a different message (giving it a
+special name), and the one in the hallways gives 3 frags every 5 seconds
+instead of just one, making it more valuable.
+
+If your map contains the required entities for Domination, the menu will
+automatically detect it for supporting Domination. To force the map to get
+re-detected after you add such entities, delete the data/data/mapname.mapinfo
+file - or simply edit it to add the "type dom" line.
+
+
+=========
+=IV. CTF=
+=========
+
+Capture the flag needs at least 1 CTF flag per team, and can also make use of
+team spawnpoints.
+
+CTF Flags
+---------
+classname  item_flag_team1 or item_flag_team2
+angle      direction the flag will point
+model      model of the flag (default: models/ctf/flag_red.md3 or
+           models/ctf/flag_blue.md3)
+noise      sound played when flag is stolen (default: "ctf/take.wav")
+noise1     sound played when flag is returned by a teammate (default:
+           "ctf/return.wav")
+noise2     sound played when flag is captured (default: "ctf/capture.wav")
+noise3     sound played when flag returns itself (default: "ctf/respawn.wav")
+
+Team Spawnpoints
+----------------
+classname  info_player_team1 or info_player_team2
+*note: These function just like info_player_deathmatch, but for one team only.
+If you don't make team spawnpoints, info_player_deathmatch is used instead.
+
+If your map contains the required entities for CTF, the menu will automatically
+detect it for supporting CTF. To force the map to get re-detected after you add
+such entities, delete the data/data/mapname.mapinfo file - or simply edit it to
+add the "type ctf" line.
+
+==============
+=V. Runematch=
+==============
+
+Runematch needs only one type of entity to work: rune spawn points. You will
+need at least one for each rune (5 minimum at the time of this writing), though
+you should probably have more than that in the map. Just give the points a
+classname and origin.
+
+Rune Spawnpoints
+----------------
+classname  runematch_spawn_point
+
+If your map contains the required entities for Runematch, the menu will automatically
+detect it for supporting Runematch. To force the map to get re-detected after you add
+such entities, delete the data/data/mapname.mapinfo file - or simply edit it to
+add the "type rune" line.
+
+==============
+=VI. Race/CTS=
+==============
+
+Making a race map is not hard: you need some special spawnpoints, and some checkpoints.
+
+Spawnpoints
+-----------
+classname  info_player_race
+target     targetname of the checkpoint
+race_place for finish line checkpoints, the place of the point, or -1 to make it qualifying/CTS-only, or unset to let all the other players spawn
+
+Checkpoints
+-----------
+classname  trigger_race_checkpoint
+targetname some name to target the checkpoint with
+cnt        number of the checkpoint (or 0 for finish line)
+
+Note that checkpoints are brush entities, and they should be somewhat thick and
+cover the full volume the player could use to get past them.
+
+Example of entity placement:
+
+                         ###
+    ---------------------###---
+   /    9999  7  5  3  1>###   \
+  /     9999 8  6  4  2 >###    \
+ |     ------------------###     |
+%%%%%%%%                 ###|    |
+%%%%%%%%                 $$$|    |
+ | ^ ^ ------------------$$$     |
+ \                       $$$ <  /
+  \                      $$$ < /
+   ----------------------$$$---
+                         $$$
+
+###:  classname = trigger_race_checkpoint, cnt = 0, targetname = finish
+$$$:  classname = trigger_race_checkpoint, cnt = 1, targetname = cp1
+%%%:  classname = trigger_race_checkpoint, cnt = 2, targetname = cp2
+>:    classname = info_player_race,                 target = finish, angle = 0
+1:    classname = info_player_race,                 target = finish, angle = 0, race_place = 1
+2:    classname = info_player_race,                 target = finish, angle = 0, race_place = 2
+....
+8:    classname = info_player_race,                 target = finish, angle = 0, race_place = 8
+9:    classname = info_player_race,                 target = finish, angle = 0, race_place = 9
+<:    classname = info_player_race,                 target = cp1,    angle = 180
+^:    classname = info_player_race,                 target = cp2,    angle = 90
+
+If your map contains the required entities for Race, the menu will automatically
+detect it for supporting Race. To force the map to get re-detected after you add
+such entities, delete the data/data/mapname.mapinfo file - or simply edit it to
+add the "type rc" line.
+
+CTS maps do not use checkpoints with race_place set, so you can leave them out
+for CTS maps.
+
+The skill parameter in the mapinfo entry for CTS shall be in the range from 0 (easy) to 10 (impossible).
+
+=============
+=VI. Nexball=
+=============
+
+There are three required entities: nexball_redgoal, nexball_bluegoal, and one of nexball_basketball
+or nexball_football. There are also optional nexball_yellowgoal and nexball_pinkgoal entities (don't
+add a pink goal when there is no yellow goal on the map, it will crash)
+
+Goals are made just like any other regular triggers. You can use multiple brushes for one trigger,
+but avoid this if possible.
+
+There are also two other goal-like entities, nexball_fault and nexball_bound, the first taking a point
+from the team that hits the trigger with the ball, the second simply returning it. You can spawn the
+ball inside a goal-like trigger, this can be useful for basketball maps with separate teams and a
+common ball spawn.
+The different keys for the entities are documented in entities.def.
+
+The ball is affected by trigger_impulse, but not by trigger_push or teleporters.
+
+You should better avoid patches on the field, as collisions can sometimes get buggy on these.
+
+
+===============================
+=Appendix A - Advanced mapinfo=
+===============================
+
+You now know how to make a basic, bare-bones mapinfo to set up a couple options
+and load your map. However, there's much more you can do!  Consider these
+senarios:
+
+1. The laser has too high of a force for laser jumps and ruins CTF
+2. I don't want players to start out with the shotgun, but with the machinegun
+   instead
+3. The map takes so much server CPU performance that the anti-wallhack can't be
+   made active
+
+Each of these situations can be resolved with ease with a little work in the
+mapinfo file.
+
+To do this, I can add the following lines to my mapinfo file:
+
+    settemp_for_type ctf g_balance_laser_primary_force 200
+    settemp_for_type all g_start_weapon_shotgun 0
+    settemp_for_type all g_start_weapon_uzi 1
+    settemp_for_type all sv_cullentities_trace 0
+
+These "settemp" settings are automatically removed when the map is left and
+another is loaded. As you can see, it is possible to make per-mode temporary
+settings, and global ones.
+
+Similar settings are also possible for the client:
+
+    clientsettemp_for_type all r_shadow_glossexponent 96
+
+Another possibility is to specify fog settings in the mapinfo, for convenience
+in case you set sv_foginterval by it too (to force the fog on the clients):
+
+    fog 0.2 0.25 0.3 0.3 1 1500
+    settemp_for_type all sv_foginterval 5
+
+
+=============================
+=Appendix B - Helpful Extras=
+=============================
+
+----------------
+-i. Team Colors-
+----------------
+When you need to set an entity's color or team, use these values:
+
+Red
+---
+Team:      5
+Color:     4
+
+Blue
+----
+Team:      14
+Color:     13
+
+Yellow
+------
+Team:      13
+Color:     12
+
+Pink
+-----
+Team:      10
+Color:     9
+
+
+----------------
+-i. Text Colors-
+----------------
+Occasionally you may want to print text in color, such as team names. Here are your options:
+
+1  Red
+2  Green
+3  Yellow
+4  Blue
+5  Cyan
+6  Magenta
+7  White
+8  Grey (transparent)
+9  Grey (solid)
+0  Black
+
+==========================================
+=Appendix C - Advanced Darkplaces shaders=
+==========================================
+
+Shader parameters for DP's own features:
+- dp_reflect <distort> <r> <g> <b> <a>
+  Makes surfaces of this shader reflective with r_water. The reflection is
+  alpha blended on the texture with the given alpha, and modulated by the given
+  color. distort is used in conjunction with the normalmap to simulate a
+  nonplanar water surface.
+- dp_refract <distort> <r> <g> <b>
+  Makes surfaces of this shader refractive with r_water. The refraction
+  replaces the transparency of the texture. distort is used in conjunction with
+  the normalmap to simulate a nonplanar water surface.
+- dp_water <reflectmin> <reflectmax> <refractdistort> <reflectdistort> <refractr> <refractg> <refractb> <reflectr> <reflectg> <reflectb> <alpha>
+  This combines the effects of dp_reflect and dp_refract to simulate a water
+  surface. However, the refraction and the reflection are mixed using a Fresnel
+  equation that makes the amount of reflection slide from reflectmin when
+  looking parallel to the water to reflectmax when looking directly into the
+  water. The result of this reflection/refraction mix is then layered BELOW the
+  texture of the shader, so basically, it "fills up" the alpha values of the
+  water. The alpha value is a multiplicator for the alpha value on the texture
+  - set this to a small value like 0.1 to emphasize the reflection and make
+  the water transparent; but if r_water is 0, alpha isn't used, so the water can
+  be very visible then too.
+