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