r2954 - in trunk/data/qcsrc: common server
DONOTREPLY at icculus.org
DONOTREPLY at icculus.org
Thu Nov 15 09:12:54 EST 2007
Author: div0
Date: 2007-11-15 09:12:53 -0500 (Thu, 15 Nov 2007)
New Revision: 2954
Modified:
trunk/data/qcsrc/common/mapinfo.qc
trunk/data/qcsrc/common/mapinfo.qh
trunk/data/qcsrc/server/gamecommand.qc
Log:
tune mapinfo generation to better reflect requirements of KH and Arena
Modified: trunk/data/qcsrc/common/mapinfo.qc
===================================================================
--- trunk/data/qcsrc/common/mapinfo.qc 2007-11-15 13:22:18 UTC (rev 2953)
+++ trunk/data/qcsrc/common/mapinfo.qc 2007-11-15 14:12:53 UTC (rev 2954)
@@ -81,11 +81,11 @@
else
return HugeSetOfIntegers_concat(l, r);
}
-float MapInfo_FilterGametype(float gametype)
+float MapInfo_FilterGametype(float pGametype)
{
if(_MapInfo_filtered)
strunzone(_MapInfo_filtered);
- _MapInfo_filtered = MapInfo_FilterGametype_Recursive(gametype, 0, _MapInfo_globcount);
+ _MapInfo_filtered = MapInfo_FilterGametype_Recursive(pGametype, 0, _MapInfo_globcount);
if(!_MapInfo_filtered)
{
dprint("Autogenerated a .mapinfo, doing the rest later.\n");
@@ -93,41 +93,53 @@
}
_MapInfo_filtered = strzone(_MapInfo_filtered);
MapInfo_count = HugeSetOfIntegers_length(_MapInfo_filtered);
- dprint("Filter ", ftos(gametype), " results in ", _MapInfo_filtered, "\n");
+ dprint("Filter ", ftos(pGametype), " results in ", _MapInfo_filtered, "\n");
+ // TODO clear cache
return 1;
}
// load info about the i-th map into the MapInfo_Map_* globals
-float MapInfo_Get_ByID(float i); // 1 on success, 0 on failure
+float MapInfo_Get_ByID(float i)
+{
+ // TODO check cache
+ if(MapInfo_Get_ByName(_MapInfo_GlobItem(HugeSetOfIntegers_get(_MapInfo_filtered, i)), 0))
+ {
+ // TODO save in cache
+ return 1;
+ }
+ return 0;
+}
-float _MapInfo_Generate(string pFilename)
+float _MapInfo_Generate(string pFilename) // 0: failure, 1: ok ent, 2: ok bsp
{
string fn;
float fh;
string s, v;
vector o;
float inWorldspawn, l;
+ float r;
+ float twoBaseModes;
- float spawns, diameter;
vector mapMins, mapMaxs;
+ r = 1;
fn = strcat("maps/", pFilename, ".ent");
fh = fopen(fn, FILE_READ);
if(fh < 0)
{
+ r = 2;
fn = strcat("maps/", pFilename, ".bsp");
fh = fopen(fn, FILE_READ);
}
if(fh < 0)
return 0;
- dprint("Analyzing ", fn, " to generate initial mapinfo\n");
+ print("Analyzing ", fn, " to generate initial mapinfo; please edit that file later\n");
- MapInfo_Map_supportedGametypes |= MAPINFO_TYPE_DEATHMATCH; // DM always works
- MapInfo_Map_supportedGametypes |= MAPINFO_TYPE_RUNEMATCH; // Rune always works
- MapInfo_Map_supportedGametypes |= MAPINFO_TYPE_LMS; // LMS always works
-
inWorldspawn = 2;
+ MapInfo_Map_supportedGametypes = 0;
+ MapInfo_Map_diameter = 0;
+ MapInfo_Map_spawnpoints = 0;
for(;;)
{
if not((s = fgets(fh)))
@@ -175,31 +187,46 @@
else if(startsWith(v, "onslaught_generator\""))
MapInfo_Map_supportedGametypes |= MAPINFO_TYPE_ONSLAUGHT;
else if(startsWith(v, "info_player_team1\""))
- ++spawns;
+ ++MapInfo_Map_spawnpoints;
else if(startsWith(v, "info_player_team2\""))
- ++spawns;
+ ++MapInfo_Map_spawnpoints;
else if(startsWith(v, "info_player_deathmatch\""))
- ++spawns;
+ ++MapInfo_Map_spawnpoints;
else if(startsWith(v, "info_player_start\""))
- ++spawns;
+ ++MapInfo_Map_spawnpoints;
}
}
}
if(inWorldspawn)
{
- print(strcat(fn, " ended still in worldspawn, BUG"));
+ print(fn, " ended still in worldspawn, BUG\n");
return 0;
}
- diameter = vlen(mapMaxs - mapMins);
- if(spawns >= 8 && diameter > 2048)
- MapInfo_Map_supportedGametypes |= MAPINFO_TYPE_TEAM_DEATHMATCH;
- if( diameter < 4096)
- MapInfo_Map_supportedGametypes |= MAPINFO_TYPE_ARENA;
- if(spawns >= 16 && diameter > 4096)
- MapInfo_Map_supportedGametypes |= MAPINFO_TYPE_KEYHUNT;
+ MapInfo_Map_diameter = vlen(mapMaxs - mapMins);
+
+ twoBaseModes = MapInfo_Map_supportedGametypes & (MAPINFO_TYPE_CTF | MAPINFO_TYPE_ASSAULT);
+ if(twoBaseModes && (MapInfo_Map_supportedGametypes == twoBaseModes))
+ {
+ // we have a CTF-only or Assault-only map. Don't add other modes then,
+ // as the map is too symmetric for them.
+ }
+ else
+ {
+ MapInfo_Map_supportedGametypes |= MAPINFO_TYPE_DEATHMATCH; // DM always works
+ MapInfo_Map_supportedGametypes |= MAPINFO_TYPE_RUNEMATCH; // Rune always works
+ MapInfo_Map_supportedGametypes |= MAPINFO_TYPE_LMS; // LMS always works
+
+ if(MapInfo_Map_spawnpoints >= 8 && MapInfo_Map_diameter > 4096)
+ MapInfo_Map_supportedGametypes |= MAPINFO_TYPE_TEAM_DEATHMATCH;
+ if( MapInfo_Map_diameter < 4096)
+ MapInfo_Map_supportedGametypes |= MAPINFO_TYPE_ARENA;
+ if(MapInfo_Map_spawnpoints >= 12 && MapInfo_Map_diameter > 5120)
+ MapInfo_Map_supportedGametypes |= MAPINFO_TYPE_KEYHUNT;
+ }
+
fclose(fh);
- dprint(fn, ": types = ", ftos(MapInfo_Map_supportedGametypes), " spawns ", ftos(spawns), " diameter ", ftos(diameter), "\n");
- return 1;
+ dprint(fn, ": types = ", ftos(MapInfo_Map_supportedGametypes), " MapInfo_Map_spawnpoints ", ftos(MapInfo_Map_spawnpoints), " MapInfo_Map_diameter ", ftos(MapInfo_Map_diameter), "\n");
+ return r;
}
// load info about a map by name into the MapInfo_Map_* globals
@@ -208,11 +235,14 @@
string fn;
string s, t;
float fh;
+ float r;
// default all generic fields so they have "good" values in case something fails
MapInfo_Map_title = "Untitled1";
MapInfo_Map_description = "Bleh.";
MapInfo_Map_supportedGametypes = 0;
+ MapInfo_Map_diameter = 0;
+ MapInfo_Map_spawnpoints = 0;
fn = strcat("maps/", pFilename, ".mapinfo");
fh = fopen(fn, FILE_READ);
@@ -220,11 +250,14 @@
{
if(!pAllowGenerate)
return 0;
- if(!_MapInfo_Generate(pFilename))
+ r = _MapInfo_Generate(pFilename);
+ if(!r)
return 0;
fh = fopen(fn, FILE_WRITE);
fputs(fh, strcat("title ", MapInfo_Map_title, "\n"));
fputs(fh, strcat("description ", MapInfo_Map_description, "\n"));
+ fputs(fh, strcat("_diameter ", ftos(MapInfo_Map_diameter), "\n"));
+ fputs(fh, strcat("_spawnpoints ", ftos(MapInfo_Map_spawnpoints), "\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"); // TODO count tdm_team entities
if(MapInfo_Map_supportedGametypes & MAPINFO_TYPE_DOMINATION) fputs(fh, "type dom 200 20 2\n"); // TODO count tdm_team entities
@@ -232,10 +265,11 @@
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_KEYHUNT) fputs(fh, "type kh 1000 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_ONSLAUGHT) fputs(fh, "type ons 20\n");
fclose(fh);
+ // return r;
return 2;
}
for(;;)
@@ -248,6 +282,10 @@
MapInfo_Map_title = substring(s, 6, strlen(s) - 6); // without "title"
else if(t == "description")
MapInfo_Map_description = substring(s, 12, strlen(s) - 12);
+ else if(t == "_diameter")
+ MapInfo_Map_diameter = stof(argv(1));
+ else if(t == "_spawnpoints")
+ MapInfo_Map_spawnpoints = stof(argv(1));
else if(t == "type")
{
t = argv(1);
Modified: trunk/data/qcsrc/common/mapinfo.qh
===================================================================
--- trunk/data/qcsrc/common/mapinfo.qh 2007-11-15 13:22:18 UTC (rev 2953)
+++ trunk/data/qcsrc/common/mapinfo.qh 2007-11-15 14:12:53 UTC (rev 2954)
@@ -16,6 +16,8 @@
string MapInfo_Map_title;
string MapInfo_Map_description;
float MapInfo_Map_supportedGametypes;
+float MapInfo_Map_diameter;
+float MapInfo_Map_spawnpoints;
// load MapInfo_count; generate mapinfo for maps that miss them, and clear the
// cache; you need to call MapInfo_FilterGametype afterwards!
Modified: trunk/data/qcsrc/server/gamecommand.qc
===================================================================
--- trunk/data/qcsrc/server/gamecommand.qc 2007-11-15 13:22:18 UTC (rev 2953)
+++ trunk/data/qcsrc/server/gamecommand.qc 2007-11-15 14:12:53 UTC (rev 2954)
@@ -50,7 +50,7 @@
return;
}
- if(argv(0) == "make-mapinfo")
+ if(argv(0) == "make_mapinfo")
{
entity e;
e = spawn();
More information about the nexuiz-commits
mailing list