MapInfo_Map_maxs = '0 0 0';
}
-void _MapInfo_Map_ApplyGametype(string s, float pWantedType, float pThisType)
+string _MapInfo_GetDefault(float t)
+{
+ switch(t)
+ {
+ case MAPINFO_TYPE_DEATHMATCH: return "30 20 0";
+ case MAPINFO_TYPE_TEAM_DEATHMATCH: return "50 20 2 0";
+ case MAPINFO_TYPE_DOMINATION: return "200 20 0";
+ case MAPINFO_TYPE_CTF: return "300 20 10 0";
+ case MAPINFO_TYPE_RUNEMATCH: return "200 20 0";
+ case MAPINFO_TYPE_LMS: return "9 20 0";
+ case MAPINFO_TYPE_ARENA: return "10 20 0";
+ case MAPINFO_TYPE_CA: return "10 20 0";
+ case MAPINFO_TYPE_KEYHUNT: return "1000 20 3 0";
+ case MAPINFO_TYPE_ASSAULT: return "20 0";
+ case MAPINFO_TYPE_RACE: return "20 5 7 15 0";
+ case MAPINFO_TYPE_ONSLAUGHT: return "20 0";
+ case MAPINFO_TYPE_NEXBALL: return "5 20 0";
+ case MAPINFO_TYPE_CTS: return "20 0 0";
+ default: return "";
+ }
+}
+
+void _MapInfo_Map_ApplyGametype(string s, float pWantedType, float pThisType, float load_default)
{
string sa;
MapInfo_Map_supportedGametypes |= pThisType;
if(!(pThisType & pWantedType))
return;
+
+ if(load_default)
+ _MapInfo_Map_ApplyGametype(_MapInfo_GetDefault(pThisType), pWantedType, pThisType, FALSE);
if(pWantedType == MAPINFO_TYPE_ASSAULT || pWantedType == MAPINFO_TYPE_ONSLAUGHT || pWantedType == MAPINFO_TYPE_RACE || pWantedType == MAPINFO_TYPE_CTS) // these modes don't use fraglimit
{
}
else
{
- cvar_set("fraglimit", car(s));
+ sa = car(s);
+ if(sa != "")
+ cvar_set("fraglimit", sa);
s = cdr(s);
}
- cvar_set("timelimit", car(s));
+ sa = car(s);
+ if(sa != "")
+ cvar_set("timelimit", sa);
s = cdr(s);
if(pWantedType == MAPINFO_TYPE_TEAM_DEATHMATCH)
{
- sa = car(s); if(sa == "") sa = "2";
- cvar_set("g_tdm_teams", sa);
+ sa = car(s);
+ if(sa != "")
+ cvar_set("g_tdm_teams", sa);
s = cdr(s);
}
if(pWantedType == MAPINFO_TYPE_KEYHUNT)
{
- sa = car(s); if(sa == "") sa = "3";
- cvar_set("g_keyhunt_teams", sa);
+ sa = car(s);
+ if(sa != "")
+ cvar_set("g_keyhunt_teams", sa);
s = cdr(s);
}
if(pWantedType == MAPINFO_TYPE_CTF)
{
- sa = car(s); if(sa == "") sa = "10";
- if(cvar("g_ctf_win_mode") < 2)
- cvar_set("fraglimit", sa);
+ sa = car(s);
+ if(sa != "")
+ if(cvar("g_ctf_win_mode") < 2)
+ cvar_set("fraglimit", sa);
s = cdr(s);
}
cvar_set("g_race_qualifying_timelimit", sa);
s = cdr(s);
- sa = car(s); if(sa == "") sa = "10";
- if(cvar("g_race_teams") < 2)
- cvar_set("fraglimit", sa);
+ sa = car(s);
+ if(sa != "")
+ if(cvar("g_race_teams") < 2)
+ cvar_set("fraglimit", sa);
s = cdr(s);
- sa = car(s); if(sa == "") sa = "20";
- if(cvar("g_race_teams") >= 2)
- cvar_set("fraglimit", sa);
+ sa = car(s);
+ if(sa != "")
+ if(cvar("g_race_teams") >= 2)
+ cvar_set("fraglimit", sa);
s = cdr(s);
}
if(pWantedType == MAPINFO_TYPE_CTS)
{
- sa = car(s); if(sa == "") sa = cvar_string("fraglimit");
- if(cvar("g_race_teams"))
- cvar_set("fraglimit", sa);
+ sa = car(s);
+
+ // this is the skill of the map
+ // not parsed by anything yet
+ // for map databases
+ //if(sa != "")
+ // cvar_set("fraglimit", sa);
+
s = cdr(s);
}
- sa = car(s); if(sa == "") sa = "0";
- cvar_set("leadlimit", sa);
- s = cdr(s);
+ if(pWantedType == MAPINFO_TYPE_ASSAULT || pWantedType == MAPINFO_TYPE_ONSLAUGHT || pWantedType == MAPINFO_TYPE_CTS) // these modes don't use fraglimit
+ {
+ cvar_set("leadlimit", "0");
+ }
+ else
+ {
+ sa = car(s);
+ if(sa != "")
+ cvar_set("leadlimit", sa);
+ s = cdr(s);
+ }
+}
+
+string _MapInfo_GetDefaultEx(float t)
+{
+ switch(t)
+ {
+ case MAPINFO_TYPE_DEATHMATCH: return "timelimit=20 pointlimit=30 leadlimit=0";
+ case MAPINFO_TYPE_TEAM_DEATHMATCH: return "timelimit=20 pointlimit=50 teams=2 leadlimit=0";
+ case MAPINFO_TYPE_DOMINATION: return "timelimit=20 pointlimit=200 teams=2 leadlimit=0";
+ case MAPINFO_TYPE_CTF: return "timelimit=20 pointlimit=300 caplimit=10 leadlimit=0";
+ case MAPINFO_TYPE_RUNEMATCH: return "timelimit=20 pointlimit=200 leadlimit=0";
+ case MAPINFO_TYPE_LMS: return "timelimit=20 lives=9 leadlimit=0";
+ case MAPINFO_TYPE_ARENA: return "timelimit=20 pointlimit=10 leadlimit=0";
+ case MAPINFO_TYPE_CA: return "timelimit=20 pointlimit=10 leadlimit=0";
+ case MAPINFO_TYPE_KEYHUNT: return "timelimit=20 pointlimit=1000 teams=3 leadlimit=0";
+ case MAPINFO_TYPE_ASSAULT: return "timelimit=20";
+ case MAPINFO_TYPE_RACE: return "timelimit=20 qualifying_timelimit=5 laplimit=7 teamlaplimit=15 leadlimit=0";
+ case MAPINFO_TYPE_ONSLAUGHT: return "timelimit=20";
+ case MAPINFO_TYPE_NEXBALL: return "timelimit=20 pointlimit=5 leadlimit=0";
+ case MAPINFO_TYPE_CTS: return "timelimit=20 skill=-1";
+ default: return "";
+ }
+}
+
+void _MapInfo_Map_ApplyGametypeEx(string s, float pWantedType, float pThisType)
+{
+ string sa, k, v;
+ float p;
+ string fraglimit_normal;
+ string fraglimit_caps;
+ string fraglimit_teams;
+
+ MapInfo_Map_supportedGametypes |= pThisType;
+ if(!(pThisType & pWantedType))
+ return;
+
+ // reset all the cvars to their defaults
+
+ cvar_set("timelimit", cvar_defstring("timelimit"));
+ cvar_set("leadlimit", cvar_defstring("leadlimit"));
+ cvar_set("fraglimit", cvar_defstring("fraglimit"));
+ cvar_set("g_tdm_teams", cvar_defstring("g_tdm_teams"));
+ cvar_set("g_keyhunt_teams", cvar_defstring("g_keyhunt_teams"));
+ cvar_set("g_domination_default_teams", cvar_defstring("g_domination_default_teams"));
+ cvar_set("g_race_qualifying_timelimit", cvar_defstring("g_race_qualifying_timelimit"));
+
+ fraglimit_normal = string_null;
+ fraglimit_caps = string_null;
+ fraglimit_teams = string_null;
+
+ s = strcat(_MapInfo_GetDefaultEx(pWantedType), " ", s);
+ while(s != "")
+ {
+ sa = car(s);
+ s = cdr(s);
+
+ if(sa == "")
+ continue;
+
+ p = strstrofs(sa, "=", 0);
+ if(p < 0)
+ {
+ k = "timelimit";
+ v = s;
+ }
+ else
+ {
+ k = substring(sa, 0, p);
+ v = substring(sa, p+1, -1);
+ }
+
+ if(k == "timelimit")
+ {
+ cvar_set("timelimit", v);
+ }
+ else if(k == "leadlimit")
+ {
+ cvar_set("leadlimit", v);
+ }
+ else if(k == "pointlimit" || k == "fraglimit" || k == "lives" || k == "laplimit")
+ {
+ fraglimit_normal = v;
+ }
+ else if(k == "caplimit")
+ {
+ fraglimit_caps = v;
+ }
+ else if(k == "teampointlimit" || k == "teamlaplimit")
+ {
+ fraglimit_teams = v;
+ }
+ else if(k == "teams")
+ {
+ cvar_set("g_tdm_teams", v);
+ cvar_set("g_keyhunt_teams", v);
+ cvar_set("g_domination_default_teams", v);
+ }
+ else if(k == "qualifying_timelimit")
+ {
+ cvar_set("g_race_qualifying_timelimit", v);
+ }
+ else if(k == "skill")
+ {
+ // ignore
+ }
+ else
+ {
+ print("Invalid gametype key in mapinfo: ", k, "\n");
+ }
+ }
+
+ if(pWantedType == MAPINFO_TYPE_CTF && cvar("g_ctf_win_mode") < 2)
+ {
+ if(fraglimit_caps)
+ cvar_set("fraglimit", fraglimit_caps);
+ }
+ else if(pWantedType == MAPINFO_TYPE_RACE && cvar("g_race_teams") >= 2)
+ {
+ if(fraglimit_teams)
+ cvar_set("fraglimit", fraglimit_teams);
+ }
+ else
+ {
+ if(fraglimit_normal)
+ cvar_set("fraglimit", fraglimit_normal);
+ }
}
float MapInfo_Type_FromString(string t)
else return 0;
}
+string MapInfo_Type_ToString(float t)
+{
+ if (t == MAPINFO_TYPE_DEATHMATCH) return "dm";
+ else if(t == MAPINFO_TYPE_TEAM_DEATHMATCH) return "tdm";
+ else if(t == MAPINFO_TYPE_DOMINATION) return "dom";
+ else if(t == MAPINFO_TYPE_CTF) return "ctf";
+ else if(t == MAPINFO_TYPE_RUNEMATCH) return "rune";
+ else if(t == MAPINFO_TYPE_LMS) return "lms";
+ else if(t == MAPINFO_TYPE_ARENA) return "arena";
+ else if(t == MAPINFO_TYPE_CA) return "ca";
+ else if(t == MAPINFO_TYPE_KEYHUNT) return "kh";
+ else if(t == MAPINFO_TYPE_ASSAULT) return "as";
+ else if(t == MAPINFO_TYPE_ONSLAUGHT) return "ons";
+ else if(t == MAPINFO_TYPE_RACE) return "rc";
+ else if(t == MAPINFO_TYPE_NEXBALL) return "nexball";
+ else if(t == MAPINFO_TYPE_CTS) return "cts";
+ else if(t == MAPINFO_TYPE_ALL) return "all";
+ else return "";
+}
+
void _MapInfo_Parse_Settemp(string pFilename, string acl, float type, string s, float recurse)
{
string t;
string fn;
string s, t;
float fh, fh2;
- float r, f, n, i;
+ float r, f, n, i, p;
string acl;
acl = MAPINFO_SETTEMP_ACL_USER;
else
fputs(fh, strcat("cdtrack ", _MapInfo_Map_worldspawn_music, "\n"));
}
- else if(_MapInfo_Map_worldspawn_music)
+ else
{
n = tokenize_console(cvar_string("g_cdtracks_remaplist"));
s = strcat(" ", cvar_string("g_cdtracks_dontusebydefault"), " ");
fputs(fh, "// uncomment this if you added weapon pickups: has weapons\n");
if(MapInfo_Map_flags & MAPINFO_FLAG_FRUSTRATING)
fputs(fh, "frustrating\n");
- if(MapInfo_Map_supportedGametypes & MAPINFO_TYPE_DEATHMATCH) fputs(fh, "type dm 30 20\n");
- if(MapInfo_Map_supportedGametypes & MAPINFO_TYPE_TEAM_DEATHMATCH) fputs(fh, "type tdm 50 20 2\n");
- if(MapInfo_Map_supportedGametypes & MAPINFO_TYPE_DOMINATION) fputs(fh, "type dom 200 20\n");
- if(MapInfo_Map_supportedGametypes & MAPINFO_TYPE_CTF) fputs(fh, "type ctf 300 20 10\n");
- if(MapInfo_Map_supportedGametypes & MAPINFO_TYPE_RUNEMATCH) fputs(fh, "type rune 200 20\n");
- if(MapInfo_Map_supportedGametypes & MAPINFO_TYPE_LMS) fputs(fh, "type lms 9 20\n");
- if(MapInfo_Map_supportedGametypes & MAPINFO_TYPE_ARENA) fputs(fh, "type arena 10 20\n");
- if(MapInfo_Map_supportedGametypes & MAPINFO_TYPE_CA) fputs(fh, "type ca 10 20\n");
- if(MapInfo_Map_supportedGametypes & MAPINFO_TYPE_KEYHUNT) fputs(fh, "type kh 1000 20 3\n");
- if(MapInfo_Map_supportedGametypes & MAPINFO_TYPE_ASSAULT) fputs(fh, "type as 20\n");
- if(MapInfo_Map_supportedGametypes & MAPINFO_TYPE_RACE) fputs(fh, "type rc 20 5 7 15\n");
- if(MapInfo_Map_supportedGametypes & MAPINFO_TYPE_ONSLAUGHT) fputs(fh, "type ons 20\n");
- if(MapInfo_Map_supportedGametypes & MAPINFO_TYPE_NEXBALL) fputs(fh, "type nexball 5 20\n");
- if(MapInfo_Map_supportedGametypes & MAPINFO_TYPE_CTS) fputs(fh, "type cts 20 -1\n");
+
+ for(i = 1; i <= MapInfo_Map_supportedGametypes; i *= 2)
+ if(MapInfo_Map_supportedGametypes & i)
+ fputs(fh, sprintf("gametype %s // defaults: %s\n", MapInfo_Type_ToString(i), _MapInfo_GetDefaultEx(i)));
fh2 = fopen(strcat("scripts/", pFilename, ".arena"), FILE_READ);
if(fh2 >= 0)
if(substring(s, 0, 1) == "_") // q3map style
continue;
+ p = strstrofs(s, "//", 0);
+ if(p >= 0)
+ s = substring(s, 0, p);
+
t = car(s); s = cdr(s);
if(t == "title")
MapInfo_Map_title = s;
t = car(s); s = cdr(s);
f = MapInfo_Type_FromString(t);
if(f)
- _MapInfo_Map_ApplyGametype (s, pGametypeToSet, f);
+ _MapInfo_Map_ApplyGametype (s, pGametypeToSet, f, TRUE);
+ else
+ dprint("Map ", pFilename, " supports unknown game type ", t, ", ignored\n");
+ }
+ else if(t == "gametype")
+ {
+ t = car(s); s = cdr(s);
+ f = MapInfo_Type_FromString(t);
+ if(f)
+ _MapInfo_Map_ApplyGametypeEx (s, pGametypeToSet, f);
else
dprint("Map ", pFilename, " supports unknown game type ", t, ", ignored\n");
}
if(!(MapInfo_Map_supportedGametypes & pGametypeToSet))
{
print("Can't select the requested game type. Trying anyway with stupid settings.\n");
- _MapInfo_Map_ApplyGametype("0 0 0", pGametypeToSet, MAPINFO_TYPE_DEATHMATCH);
+ _MapInfo_Map_ApplyGametypeEx("", pGametypeToSet, MAPINFO_TYPE_DEATHMATCH);
}
}