==============
=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 .mapcfg file, but there's much more available.

Table of Contents
-----------------
I		Map Lists & Scripts
		(get your map listed and working)
  i.		mapcfg
  ii.		mapname.cfg

II		Map Descriptions
		(get the picture and info to show)

III		Domination

IV		CTF

V		Rune Match

Appendix A	Advanced mapcfgs
  i.		mapcfg revisited
  ii.		exit cfgs

Appendix B	Helpful extras
  i.		Team Colors
  ii.		Text Colors


========================
=I. Map Lists & Scripts=
========================


There are actually 3 script/cfg options available to you, each serving a different purpose and being executed at a different time during the map's life cycle:
1. The mapcfg
2. mapname.cfg
3. exit cfg (explained in Appendix A)

Of these, the mapcfg is the only one that's truely required.

-----------------
-The mapcfg file-
-----------------

*cue scary music*

The mapcfg file is basically what gets your map listed in the menu, and sets up the options needed to change to it.  This file is basically required in order for your map to work, though in a pinch you could say "map mymap" in the console.
The simplest mapcfg is simply a changelevel command, but you should usually add a timelimit and/or fraglimit to make sure your map will eventually change to the next map in the list.

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.  Let's start with domination.  I should make a file called "dom_wazat1.mapcfg" (and put it inside of the maps directory) and write the following inside of it:

	set g_domination 1		// turn on domination
	set fraglimit 100		// 100 points to win
	set timelimit 15		// 15 minute max round time
	changelevel wazat1	// now change level

Likewise, runematch is easy:
filename: "rune_wazat1.mapcfg"

	set g_runematch 1		// turn on rune match
	set fraglimit 1000		// points to win
	set timelimit 25		// round time
	changelevel wazat1	// now change level


At this point I should say "okay, now it gets hard", but deathmatch and team deathmatch are easy (I skipped the comments in this one since they're fairly self-explanatory):

filename: "dm_wazat1.mapcfg"

	set fraglimit 40
	set timelimit 15
	changelevel wazat1

Team Deathmatch is turned on automatically if the server sets the "Force Teamplay" option and plays a deathmatch map, but you can add TDM as an option for your map too:

	set g_tdm 1			// play team deathmatch
	set fraglimit 50		// how many kills to win
	//set timelimit 25		// disabled: don't bother setting a time limit
	changelevel wazat1	// now change level


There's much more power in a mapcfg file.  See Appendix A for more details.

-------------
-mapname.cfg-
-------------

Unlike the mapcfg, which happens before the map loads (and is responsible for loading it), the mapname.cfg file doesn't exec until the map has mostly loaded.  This file is *usually* used to set values such as what music to play.

Another difference from the mapcfg file is that mapname.cfg is global, meaning it doesn't matter if you're playing domination, deathmatch, or capture the flag, and it doesn't care what mapcfg was loaded.  It does the same thing every time this bsp file is loaded.  For that reason, this file should usually be used sparingly.

To make the mapname.cfg, make a file with the same name as your map's .bsp file, except with a .cfg extension instead of .bsp.  For example, my "wazat1.bsp" map would use "wazat1.cfg".  It uses the same name as your map, thus the term mapname.cfg.


======================
=II. Map Descriptions=
======================


So, you've got your map listed in the menu and it plays properly, but the menu isn't showing your description and picture!  What manner of man would create such an accursed abomination?!

Well... That sounds like something I'd do.  :D

Luckily getting this to work is easy.  Just like you can have different mapcfgs for each map, you can have different descriptions.  In fact, those descriptions now match up with the mapcfgs, instead of the bsp files.
So, all you need to do is make a description for each mapcfg file.  Simple copy-pasting will fulfil this need, though a bit of modification between versions is prefered.

There is one crucial difference in this map's format.  Like the old style, the first like is what appears in the title bar.  However, the second line is the map's image file.  This means you can have a separate image for each game mode your map supports, if you want: one for domination, one for ctf, one for regular dm, and so on.  Or you can use the same image for all of them.

So how to do this?  Easy, just create a .txt file with the same name as the .mapcfg file.  For example, my wazat1.bsp has 4 mapcfgs:
dm_wazat1.mapcfg
tdm_wazat1.mapcfg
dom_wazat1.mapcfg
rune_wazat1.mapcfg

I would then make 4 .txt files:
dm_wazat1.txt
tdm_wazat1.txt
dom_wazat1.txt
rune_wazat1.txt

Each of these files can have the same content, but I recommend you change at least a little bit of it (such as the title bar).
Here is an example of what rune_wazat1.txt would look like (note that when you make your real file, you shouldn't tab it in):

	Wibble (rune_wazat1)
	maps/rune_wazat1
	
	The only map I've ever
	done right!
	
	Players: 3-8
	
	Weapons: Machinegun, Mortar,
	Crylink, Nex, Rocket Launcher,
	Hagar
	
	Powerups: None
	
	Gametype:
	Rune Match
	
	Author:
	Wazat


Notice the first line has the map's title (Wibble... what was I thinking?), and the filename of the mapcfg for the user to see (which from the player's point of view is essentially the map's filename).

The second line defines where the image is that should be displayed.  This can be different for each game mode, but it doesn't have to be.  Note that you need to provide the right path (maps/), but you don't need to give an extension.

The rest of the file is just plain text to print out as-is.



=================
=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).

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"
}
{
"classname" "dom_team"
"netname" "^6Pink Team"
"cnt" "9"
"noise" ""
"noise1" "domination/claim.wav"
"model" "models/domination/dom_pink.md3"
}
{
"classname" "dom_team"
"netname" "^3Yellow Team"
"cnt" "12"
"noise" ""
"noise1" "domination/claim.wav"
"model" "models/domination/dom_yellow.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, Pink and Yellow.  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.



==========
=III. 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.



================
=III. 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



=================================
=Appendix A - Advanced Mapcfgs  =
=================================

---------------------
-i. mapcfg revisited-
---------------------

You now know how to make a basic, bare-bones mapcfg to set up a couple options and load your map.  However, there's much more you can do!  Consider these senarios:

1. I want to play different music in ctf and domination
2. The laser has too high of a force for laser jumps and ruins CTF
3. I want to create fog in my map

Each of these situations can be resolved with ease with a little work in the mapcfg file.

You're already creating different settings between game modes with your gamecfgs, since you can choose different fraglimits.  You can also play different music.  The mapname.cfg file is global to all uses of your map, so instead of using it, we'll use the mapinfos.  You'll need to remove the music entry from the mapname.cfg file, and paste it into each of your mapname.cfg files *after* the changelevel command.
So, dom_wazat1.mapcfg would look like this:

	set g_domination 1		// turn on domination
	set fraglimit 100		// 100 points to win
	set timelimit 15		// 15 minute max round time
	set changelevel wazat1	// now change level
	cd loop "8"		// play music

You can choose different music for each of your game modes by changing that last line.  Just make sure your map.cfg file doesn't have a cd loop command in it, or it'll overwrite what you've done.

---------------
-ii. exit cfgs-
---------------

In order to solve our laser jumping problem, we need to call upon another feature of mapcfgs -- map exit scripts or "exit cfgs".  These are called when the map is changing, before the next map's mapcfg is run.  You can use them to clean up any special changes you've made so they won't affect the next map.

For our laser jumping example, we could do something like this:

	 // set up the exit cfg so we can reset values to what they were before
	set exit_cfg "maps/dom_wazat1_exit.cfg"
	 // make a backup
	set BACKUP_g_balance_laser_force $g_balance_laser_force
	 // map-customized values here
	set g_balance_laser_force 100
	 // and on with the rest of the config
	set g_domination 1		// turn on domination
	set fraglimit 100		// 100 points to win
	set timelimit 15		// 15 minute max round time
	set changelevel wazat1	// now change level
	cd loop "8"		// play music

Then we would make the exit cfg, named "dom_wazat1_exit.cfg":

	 // reset laser damage
	set g_balance_laser_force $BACKUP_g_balance_laser_force


When my wazat1 map is run in domination, the laser's force will only be 100.  However, before the map changes, it gets set back to what it was before.  This is because the original value was stored in BACKUP_g_balance_laser_force, then BACKUP_g_balance_laser_force was copied back into g_balance_laser_force when the exit cfg ran.


You can set all kinds of values like this, including fog and gameplay options.




===============================
=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

Pink
-----
Team:	10
Color:	9

Yellow
------
Team:	13
Color:	12



----------------
-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
9  Grey
0  Black
