binddb = db_create();
tempdb = db_create();
ClientProgsDB = db_load("client.db");
- compressShortVector_init();
draw_endBoldFont();
registercvar("cl_spawn_near_teammate", "1");
- gametype = 0;
+ gametype = NULL;
// hud_fields uses strunzone on the titles!
for(int i = 0; i < MAX_HUD_FIELDS; ++i)
NET_HANDLE(ENT_CLIENT_SCORES_INFO, bool isnew)
{
make_pure(this);
- gametype = ReadInt24_t();
+ gametype = ReadRegistered(Gametypes);
HUD_ModIcons_SetFunc();
FOREACH(Scores, true, {
if (scores_label(it)) strunzone(scores_label(it));
// General stuff
float postinit;
-float gametype;
+entity gametype;
//float sorted_players;
//float sorted_teams;
}
else
{
- int type = MapInfo_Type_FromString(gt);
+ Gametype type = MapInfo_Type_FromString(gt);
mv_pk3[i] = strzone(MapInfo_Type_ToText(type));
mv_desc[i] = MapInfo_Type_Description(type);
}
return strcasecmp(a, b);
}
-float MapInfo_FilterGametype(int pGametype, int pFeatures, int pFlagsRequired, int pFlagsForbidden, bool pAbortOnGenerate)
+float MapInfo_FilterGametype(Gametype pGametype, int pFeatures, int pFlagsRequired, int pFlagsForbidden, bool pAbortOnGenerate)
+{
+ return _MapInfo_FilterGametype(pGametype.m_flags, pFeatures, pFlagsRequired, pFlagsForbidden, pAbortOnGenerate);
+}
+float _MapInfo_FilterGametype(int pGametype, int pFeatures, int pFlagsRequired, int pFlagsForbidden, bool pAbortOnGenerate)
{
float i, j;
if (!_MapInfo_filtered_allocated)
MapInfo_count = 0;
for(i = 0, j = -1; i < _MapInfo_globcount; ++i)
{
- if(MapInfo_Get_ByName(_MapInfo_GlobItem(i), 1, 0) == 2) // if we generated one... BAIL OUT and let the caller continue in the next frame.
+ if(MapInfo_Get_ByName(_MapInfo_GlobItem(i), 1, NULL) == 2) // if we generated one... BAIL OUT and let the caller continue in the next frame.
if(pAbortOnGenerate)
{
LOG_TRACE("Autogenerated a .mapinfo, doing the rest later.\n");
float MapInfo_Get_ByID(float i)
{
- if(MapInfo_Get_ByName(MapInfo_BSPName_ByID(i), 0, 0))
+ if(MapInfo_Get_ByName(MapInfo_BSPName_ByID(i), 0, NULL))
return 1;
return 0;
}
else if(k == "classname")
{
if(v == "dom_controlpoint")
- MapInfo_Map_supportedGametypes |= MAPINFO_TYPE_DOMINATION;
+ MapInfo_Map_supportedGametypes |= MAPINFO_TYPE_DOMINATION.m_flags;
else if(v == "item_flag_team2")
- MapInfo_Map_supportedGametypes |= MAPINFO_TYPE_CTF;
+ MapInfo_Map_supportedGametypes |= MAPINFO_TYPE_CTF.m_flags;
else if(v == "team_CTF_blueflag")
- MapInfo_Map_supportedGametypes |= MAPINFO_TYPE_CTF;
+ MapInfo_Map_supportedGametypes |= MAPINFO_TYPE_CTF.m_flags;
else if(v == "invasion_spawnpoint")
- MapInfo_Map_supportedGametypes |= MAPINFO_TYPE_INVASION;
+ MapInfo_Map_supportedGametypes |= MAPINFO_TYPE_INVASION.m_flags;
else if(v == "target_assault_roundend")
- MapInfo_Map_supportedGametypes |= MAPINFO_TYPE_ASSAULT;
+ MapInfo_Map_supportedGametypes |= MAPINFO_TYPE_ASSAULT.m_flags;
else if(v == "onslaught_generator")
- MapInfo_Map_supportedGametypes |= MAPINFO_TYPE_ONSLAUGHT;
+ MapInfo_Map_supportedGametypes |= MAPINFO_TYPE_ONSLAUGHT.m_flags;
else if(substring(v, 0, 8) == "nexball_" || substring(v, 0, 4) == "ball")
- MapInfo_Map_supportedGametypes |= MAPINFO_TYPE_NEXBALL;
+ MapInfo_Map_supportedGametypes |= MAPINFO_TYPE_NEXBALL.m_flags;
else if(v == "info_player_team1")
++spawnpoints;
else if(v == "info_player_team2")
else if(v == "info_player_deathmatch")
++spawnpoints;
else if(v == "trigger_race_checkpoint")
- MapInfo_Map_supportedGametypes |= MAPINFO_TYPE_RACE;
+ MapInfo_Map_supportedGametypes |= MAPINFO_TYPE_RACE.m_flags;
else if(v == "target_startTimer")
- MapInfo_Map_supportedGametypes |= MAPINFO_TYPE_CTS;
+ MapInfo_Map_supportedGametypes |= MAPINFO_TYPE_CTS.m_flags;
else if(v == "weapon_nex")
{ }
else if(v == "weapon_railgun")
}
diameter = vlen(mapMaxs - mapMins);
- twoBaseModes = MapInfo_Map_supportedGametypes & (MAPINFO_TYPE_CTF | MAPINFO_TYPE_ASSAULT | MAPINFO_TYPE_RACE | MAPINFO_TYPE_NEXBALL);
+ twoBaseModes = MapInfo_Map_supportedGametypes & (MAPINFO_TYPE_CTF.m_flags | MAPINFO_TYPE_ASSAULT.m_flags | MAPINFO_TYPE_RACE.m_flags | MAPINFO_TYPE_NEXBALL.m_flags);
if(twoBaseModes && (MapInfo_Map_supportedGametypes == twoBaseModes))
{
// we have a CTF-only or Assault-only map. Don't add other modes then,
}
else
{
- MapInfo_Map_supportedGametypes |= MAPINFO_TYPE_DEATHMATCH; // DM always works
- MapInfo_Map_supportedGametypes |= MAPINFO_TYPE_LMS; // LMS always works
- MapInfo_Map_supportedGametypes |= MAPINFO_TYPE_KEEPAWAY; // Keepaway always works
+ MapInfo_Map_supportedGametypes |= MAPINFO_TYPE_DEATHMATCH.m_flags; // DM always works
+ MapInfo_Map_supportedGametypes |= MAPINFO_TYPE_LMS.m_flags; // LMS always works
+ MapInfo_Map_supportedGametypes |= MAPINFO_TYPE_KEEPAWAY.m_flags; // Keepaway always works
if(spawnpoints >= 8 && diameter > 4096) {
- MapInfo_Map_supportedGametypes |= MAPINFO_TYPE_TEAM_DEATHMATCH;
- MapInfo_Map_supportedGametypes |= MAPINFO_TYPE_FREEZETAG;
- MapInfo_Map_supportedGametypes |= MAPINFO_TYPE_CA;
+ MapInfo_Map_supportedGametypes |= MAPINFO_TYPE_TEAM_DEATHMATCH.m_flags;
+ MapInfo_Map_supportedGametypes |= MAPINFO_TYPE_FREEZETAG.m_flags;
+ MapInfo_Map_supportedGametypes |= MAPINFO_TYPE_CA.m_flags;
}
if(spawnpoints >= 12 && diameter > 5120)
- MapInfo_Map_supportedGametypes |= MAPINFO_TYPE_KEYHUNT;
+ MapInfo_Map_supportedGametypes |= MAPINFO_TYPE_KEYHUNT.m_flags;
}
- if(MapInfo_Map_supportedGametypes & MAPINFO_TYPE_RACE)
+ if(MapInfo_Map_supportedGametypes & MAPINFO_TYPE_RACE.m_flags)
if(!spawnplaces)
{
- MapInfo_Map_supportedGametypes &= ~MAPINFO_TYPE_RACE;
- MapInfo_Map_supportedGametypes |= MAPINFO_TYPE_CTS;
+ MapInfo_Map_supportedGametypes &= ~MAPINFO_TYPE_RACE.m_flags;
+ MapInfo_Map_supportedGametypes |= MAPINFO_TYPE_CTS.m_flags;
}
LOG_TRACE("-> diameter ", ftos(diameter));
MapInfo_Map_maxs = '0 0 0';
}
-string _MapInfo_GetDefault(float t)
+string _MapInfo_GetDefault(Gametype t)
{
switch(t)
{
}
}
-void _MapInfo_Map_ApplyGametype(string s, int pWantedType, int pThisType, int load_default)
+void _MapInfo_Map_ApplyGametype(string s, Gametype pWantedType, Gametype pThisType, int load_default)
{
string sa;
- MapInfo_Map_supportedGametypes |= pThisType;
- if(!(pThisType & pWantedType))
+ MapInfo_Map_supportedGametypes |= pThisType.m_flags;
+ if(!(pThisType.m_flags & pWantedType.m_flags))
return;
if(load_default)
}
}
-string _MapInfo_GetDefaultEx(float t)
+string _MapInfo_GetDefaultEx(Gametype t)
{
- FOREACH(Gametypes, it.items == t, return it.model2);
- return "";
+ return t ? t.model2 : "";
}
-float _MapInfo_GetTeamPlayBool(float t)
+float _MapInfo_GetTeamPlayBool(Gametype t)
{
- FOREACH(Gametypes, it.items == t, return it.team);
- return false;
+ return t ? t.team : false;
}
-void _MapInfo_Map_ApplyGametypeEx(string s, int pWantedType, int pThisType)
+void _MapInfo_Map_ApplyGametypeEx(string s, Gametype pWantedType, Gametype pThisType)
{
- MapInfo_Map_supportedGametypes |= pThisType;
- if (!(pThisType & pWantedType))
+ MapInfo_Map_supportedGametypes |= pThisType.m_flags;
+ if (!(pThisType.m_flags & pWantedType.m_flags))
return;
// reset all the cvars to their defaults
}
}
-Gametype MapInfo_Type(int t)
-{
- FOREACH(Gametypes, it.items == t, return it);
- return NULL;
-}
-
-int MapInfo_Type_FromString(string t)
+Gametype MapInfo_Type_FromString(string t)
{
#define deprecate(from, to) MACRO_BEGIN { \
if (t == #from) { \
deprecate(invasion, inv);
deprecate(assault, as);
deprecate(race, rc);
- if (t == "all") return MAPINFO_TYPE_ALL;
- FOREACH(Gametypes, it.mdl == t, return it.items);
- return 0;
+ FOREACH(Gametypes, it.mdl == t, return it);
+ return NULL;
#undef deprecate
}
-string MapInfo_Type_Description(float t)
+string MapInfo_Type_Description(Gametype t)
{
- FOREACH(Gametypes, it.items == t, return it.gametype_description);
- return "";
+ return t ? t.gametype_description : "";
}
-string MapInfo_Type_ToString(float t)
+string MapInfo_Type_ToString(Gametype t)
{
- if(t == MAPINFO_TYPE_ALL)
- return "all";
- FOREACH(Gametypes, it.items == t, return it.mdl);
- return "";
+ return t ? t.mdl : "";
}
-string MapInfo_Type_ToText(float t)
+string MapInfo_Type_ToText(Gametype t)
{
- FOREACH(Gametypes, it.items == t, return it.message);
/* xgettext:no-c-format */
- return _("@!#%'n Tuba Throwing");
+ return t ? t.message : _("@!#%'n Tuba Throwing");
}
void _MapInfo_Parse_Settemp(string pFilename, string acl, float type, string s, float recurse)
}
// load info about a map by name into the MapInfo_Map_* globals
-float MapInfo_Get_ByName_NoFallbacks(string pFilename, int pAllowGenerate, int pGametypeToSet)
+float MapInfo_Get_ByName_NoFallbacks(string pFilename, int pAllowGenerate, Gametype pGametypeToSet)
{
string fn;
string s, t;
return 0;
}
- if(pGametypeToSet == 0)
+ if(pGametypeToSet == NULL)
if(MapInfo_Cache_Retrieve(pFilename))
return 1;
if(MapInfo_Map_flags & MAPINFO_FLAG_FRUSTRATING)
fputs(fh, "frustrating\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)));
+ FOREACH(Gametypes, MapInfo_Map_supportedGametypes & it.m_flags, {
+ fputs(fh, sprintf("gametype %s // defaults: %s\n", MapInfo_Type_ToString(it), _MapInfo_GetDefaultEx(it)));
+ });
if(fexists(strcat("scripts/", pFilename, ".arena")))
fputs(fh, "settemp_for_type all sv_q3acompat_machineshotgunswap 1\n");
else if(t == "type")
{
t = car(s); s = cdr(s);
- f = MapInfo_Type_FromString(t);
+ Gametype f = MapInfo_Type_FromString(t);
LOG_MAPWARN("Map ", pFilename, " contains the legacy 'type' keyword which is deprecated and will be removed in the future. Please migrate the mapinfo file to 'gametype'.\n");
if(f)
_MapInfo_Map_ApplyGametype (s, pGametypeToSet, f, true);
else if(t == "gametype")
{
t = car(s); s = cdr(s);
- f = MapInfo_Type_FromString(t);
+ Gametype f = MapInfo_Type_FromString(t);
if(f)
_MapInfo_Map_ApplyGametypeEx (s, pGametypeToSet, f);
else
else if(t == "settemp_for_type")
{
t = car(s); s = cdr(s);
+ Gametype f;
if((f = MapInfo_Type_FromString(t)))
{
- if(f & pGametypeToSet)
+ if(f.m_flags & pGametypeToSet.m_flags)
{
_MapInfo_Parse_Settemp(pFilename, acl, 0, s, 1);
}
else if(t == "clientsettemp_for_type")
{
t = car(s); s = cdr(s);
+ Gametype f;
if((f = MapInfo_Type_FromString(t)))
{
- if(f & pGametypeToSet)
+ if(f.m_flags & pGametypeToSet.m_flags)
{
_MapInfo_Parse_Settemp(pFilename, acl, 1, s, 1);
}
LOG_MAPWARN("Map ", pFilename, " supports no game types, ignored\n");
return 0;
}
-float MapInfo_Get_ByName(string pFilename, float pAllowGenerate, int pGametypeToSet)
+int MapInfo_Get_ByName(string pFilename, float pAllowGenerate, Gametype pGametypeToSet)
{
- float r = MapInfo_Get_ByName_NoFallbacks(pFilename, pAllowGenerate, pGametypeToSet);
+ int r = MapInfo_Get_ByName_NoFallbacks(pFilename, pAllowGenerate, pGametypeToSet);
if(cvar("g_tdm_on_dm_maps"))
{
// if this is set, all DM maps support TDM too
- if (!(MapInfo_Map_supportedGametypes & MAPINFO_TYPE_TEAM_DEATHMATCH))
- if(MapInfo_Map_supportedGametypes & MAPINFO_TYPE_DEATHMATCH)
+ if (!(MapInfo_Map_supportedGametypes & MAPINFO_TYPE_TEAM_DEATHMATCH.m_flags))
+ if(MapInfo_Map_supportedGametypes & MAPINFO_TYPE_DEATHMATCH.m_flags)
_MapInfo_Map_ApplyGametypeEx ("", pGametypeToSet, MAPINFO_TYPE_TEAM_DEATHMATCH);
}
if(pGametypeToSet)
{
- if(!(MapInfo_Map_supportedGametypes & pGametypeToSet))
+ if(!(MapInfo_Map_supportedGametypes & pGametypeToSet.m_flags))
{
error("Can't select the requested game type. This should never happen as the caller should prevent it!\n");
//_MapInfo_Map_ApplyGametypeEx("", pGametypeToSet, MAPINFO_TYPE_DEATHMATCH);
return req;
}
-int MapInfo_CurrentGametype()
+Gametype MapInfo_CurrentGametype()
{
- int prev = cvar("gamecfg");
- FOREACH(Gametypes, cvar(it.netname) && it.items != prev, return it.items);
- if (prev) return prev;
- return MAPINFO_TYPE_DEATHMATCH;
+ Gametype prev = Gametypes_from(cvar("gamecfg"));
+ FOREACH(Gametypes, cvar(it.netname) && it != prev, return it);
+ return prev ? prev : MAPINFO_TYPE_DEATHMATCH;
}
float _MapInfo_CheckMap(string s) // returns 0 if the map can't be played with the current settings, 1 otherwise
{
- if(!MapInfo_Get_ByName(s, 1, 0))
+ if(!MapInfo_Get_ByName(s, 1, NULL))
return 0;
- if((MapInfo_Map_supportedGametypes & MapInfo_CurrentGametype()) == 0)
+ if((MapInfo_Map_supportedGametypes & MapInfo_CurrentGametype().m_flags) == 0)
return 0;
if((MapInfo_Map_supportedFeatures & MapInfo_CurrentFeatures()) != MapInfo_CurrentFeatures())
return 0;
return r;
}
-void MapInfo_SwitchGameType(int t)
+void MapInfo_SwitchGameType(Gametype t)
{
- FOREACH(Gametypes, true, cvar_set(it.netname, (it.items == t) ? "1" : "0"));
+ FOREACH(Gametypes, true, cvar_set(it.netname, (it == t) ? "1" : "0"));
}
void MapInfo_LoadMap(string s, float reinit)
//if(!MapInfo_CheckMap(s))
//{
// print("EMERGENCY: can't play the selected map in the given game mode. Falling back to DM.\n");
- // MapInfo_SwitchGameType(MAPINFO_TYPE_DEATHMATCH);
+ // MapInfo_SwitchGameType(MAPINFO_TYPE_DEATHMATCH.m_flags);
//}
cvar_settemp_restore();
localcmd(strcat("\nchangelevel ", s, "\n"));
}
-string MapInfo_ListAllowedMaps(float type, float pRequiredFlags, float pForbiddenFlags)
+string MapInfo_ListAllowedMaps(Gametype type, float pRequiredFlags, float pForbiddenFlags)
{
string out;
float i;
// to make absolutely sure:
MapInfo_Enumerate();
- MapInfo_FilterGametype(MAPINFO_TYPE_ALL, 0, pRequiredFlags, pForbiddenFlags, 0);
+ _MapInfo_FilterGametype(MAPINFO_TYPE_ALL, 0, pRequiredFlags, pForbiddenFlags, 0);
out = "";
for(i = 0; i < MapInfo_count; ++i)
return substring(out, 1, strlen(out) - 1);
}
-void MapInfo_LoadMapSettings_SaveGameType(float t)
+void MapInfo_LoadMapSettings_SaveGameType(Gametype t)
{
MapInfo_SwitchGameType(t);
- cvar_set("gamecfg", ftos(t));
+ cvar_set("gamecfg", ftos(t.m_id));
MapInfo_LoadedGametype = t;
}
void MapInfo_LoadMapSettings(string s) // to be called from worldspawn
{
- float t;
-
- t = MapInfo_CurrentGametype();
+ Gametype t = MapInfo_CurrentGametype();
MapInfo_LoadMapSettings_SaveGameType(t);
if(!_MapInfo_CheckMap(s)) // with underscore, it keeps temps
if(MapInfo_Map_supportedGametypes == 0)
{
LOG_SEVERE("Mapinfo system is not functional at all. Assuming deathmatch.\n");
- MapInfo_Map_supportedGametypes = MAPINFO_TYPE_DEATHMATCH;
+ MapInfo_Map_supportedGametypes = MAPINFO_TYPE_DEATHMATCH.m_flags;
MapInfo_LoadMapSettings_SaveGameType(MAPINFO_TYPE_DEATHMATCH);
_MapInfo_Map_ApplyGametypeEx("", MAPINFO_TYPE_DEATHMATCH, MAPINFO_TYPE_DEATHMATCH);
return; // do not call Get_ByName!
}
- t = 1;
+ int _t = 1;
while(!(MapInfo_Map_supportedGametypes & 1))
{
- t *= 2;
- MapInfo_Map_supportedGametypes = floor(MapInfo_Map_supportedGametypes / 2);
+ _t <<= 1;
+ MapInfo_Map_supportedGametypes = floor(MapInfo_Map_supportedGametypes >> 1);
}
+ FOREACH(Gametypes, it.m_flags == _t, { t = it; break; });
// t is now a supported mode!
LOG_WARNING("can't play the selected map in the given game mode. Falling back to a supported mode.\n");
}
ENDCLASS(Gametype)
-REGISTRY(Gametypes, BITS(4))
+REGISTRY(Gametypes, 24)
#define Gametypes_from(i) _Gametypes_from(i, NULL)
REGISTER_REGISTRY(Gametypes)
REGISTRY_CHECK(Gametypes)
int MAPINFO_TYPE_ALL;
+.int m_flags;
#define REGISTER_GAMETYPE(hname, sname, g_name, NAME, gteamplay, mutators, defaults, gdescription) \
- int MAPINFO_TYPE_##NAME; \
bool NAME##_mapinfo(string k, string v) { return = false; } \
- REGISTER(Gametypes, MAPINFO_TYPE, g_name, m_id, \
+ REGISTER(Gametypes, MAPINFO_TYPE, NAME, m_id, \
NEW(Gametype, hname, #sname, #g_name, gteamplay, #sname " " mutators, defaults, gdescription) \
) { \
/* same as `1 << m_id` */ \
- MAPINFO_TYPE_##NAME = MAPINFO_TYPE_ALL + 1; MAPINFO_TYPE_ALL |= MAPINFO_TYPE_##NAME; \
- this.items = MAPINFO_TYPE_##NAME; \
+ int MAPINFO_TYPE_##NAME = MAPINFO_TYPE_ALL + 1; MAPINFO_TYPE_ALL |= MAPINFO_TYPE_##NAME; \
+ this.items = this.m_flags = MAPINFO_TYPE_##NAME; \
this.m_parse_mapinfo = NAME##_mapinfo; \
} \
[[accumulate]] bool NAME##_mapinfo(string k, string v)
// filter the info by game type mask (updates MapInfo_count)
float MapInfo_progress;
-float MapInfo_FilterGametype(float gametype, float features, float pFlagsRequired, float pFlagsForbidden, float pAbortOnGenerate); // 1 on success, 0 on temporary failure (call it again next frame then; use MapInfo_progress as progress indicator)
+float MapInfo_FilterGametype(Gametype gametypeFlags, float features, float pFlagsRequired, float pFlagsForbidden, float pAbortOnGenerate); // 1 on success, 0 on temporary failure (call it again next frame then; use MapInfo_progress as progress indicator)
+float _MapInfo_FilterGametype(int gametypeFlags, float features, float pFlagsRequired, float pFlagsForbidden, float pAbortOnGenerate); // 1 on success, 0 on temporary failure (call it again next frame then; use MapInfo_progress as progress indicator)
void MapInfo_FilterString(string sf); // filter _MapInfo_filtered (created by MapInfo_FilterGametype) with keyword
int MapInfo_CurrentFeatures(); // retrieves currently required features from cvars
-int MapInfo_CurrentGametype(); // retrieves current gametype from cvars
+Gametype MapInfo_CurrentGametype(); // retrieves current gametype from cvars
int MapInfo_ForbiddenFlags(); // retrieves current flags from cvars
int MapInfo_RequiredFlags(); // retrieves current flags from cvars
string MapInfo_BSPName_ByID(float i);
// load info about a map by name into the MapInfo_Map_* globals
-float MapInfo_Get_ByName(string s, float allowGenerate, float gametypeToSet); // 1 on success, 0 on failure, 2 if it autogenerated a mapinfo file
+int MapInfo_Get_ByName(string s, float allowGenerate, Gametype gametypeToSet); // 1 on success, 0 on failure, 2 if it autogenerated a mapinfo file
// look for a map by a prefix, returns the actual map name on success, string_null on failure or ambigous match
string MapInfo_FindName_match; // the name of the map that was found
void MapInfo_LoadMap(string s, float reinit);
// list all maps for the current game type
-string MapInfo_ListAllowedMaps(float type, float pFlagsRequired, float pFlagsForbidden);
+string MapInfo_ListAllowedMaps(Gametype type, float pFlagsRequired, float pFlagsForbidden);
// list all allowed maps (for any game type)
string MapInfo_ListAllAllowedMaps(float pFlagsRequired, float pFlagsForbidden);
// gets a gametype from a string
-string _MapInfo_GetDefaultEx(float t);
-float _MapInfo_GetTeamPlayBool(float t);
-Gametype MapInfo_Type(int t);
-float MapInfo_Type_FromString(string t);
-string MapInfo_Type_Description(float t);
-string MapInfo_Type_ToString(float t);
-string MapInfo_Type_ToText(float t);
-void MapInfo_SwitchGameType(int t);
+string _MapInfo_GetDefaultEx(Gametype t);
+float _MapInfo_GetTeamPlayBool(Gametype t);
+Gametype MapInfo_Type_FromString(string t);
+string MapInfo_Type_Description(Gametype t);
+string MapInfo_Type_ToString(Gametype t);
+string MapInfo_Type_ToText(Gametype t);
+void MapInfo_SwitchGameType(Gametype t);
// to be called from worldspawn to set up cvars
void MapInfo_LoadMapSettings(string s);
-float MapInfo_LoadedGametype; // game type that was active during map load
+Gametype MapInfo_LoadedGametype; // game type that was active during map load
void MapInfo_Cache_Destroy(); // disable caching
void MapInfo_Cache_Create(); // enable caching
return (p * 0x1000) + (y * 0x80) + len;
}
-void compressShortVector_init()
+STATIC_INIT(compressShortVector)
{
float l = 1;
float f = pow(2, 1/8);
mi_min = mi;
mi_max = ma;
- MapInfo_Get_ByName(mi_shortname, 0, 0);
+ MapInfo_Get_ByName(mi_shortname, 0, NULL);
if(MapInfo_Map_mins.x < MapInfo_Map_maxs.x)
{
mi_min = MapInfo_Map_mins;
return strcat(substring(theText, 0, textLengthUpToLength(theText, maxWidth - tw("..."), tw)), "...");
}
-float isGametypeInFilter(float gt, float tp, float ts, string pattern)
+float isGametypeInFilter(Gametype gt, float tp, float ts, string pattern)
{
string subpattern, subpattern2, subpattern3, subpattern4;
subpattern = strcat(",", MapInfo_Type_ToString(gt), ",");
string ScoreString(float vflags, float value);
-void compressShortVector_init();
vector decompressShortVector(float data);
float compressShortVector(vector vec);
string getWrappedLine(float w, vector size, textLengthUpToWidth_widthFunction_t tw);
string getWrappedLineLen(float w, textLengthUpToLength_lenFunction_t tw);
-float isGametypeInFilter(float gt, float tp, float ts, string pattern);
+float isGametypeInFilter(entity gt, float tp, float ts, string pattern);
string swapwords(string str, float i, float j);
string shufflewords(string str);
{
entity e;
e = me.(typeLabels[i]);
- e.disabled = !(MapInfo_Map_supportedGametypes & GameType_GetID(i));
+ e.disabled = !(MapInfo_Map_supportedGametypes & GameType_GetID(i).m_flags);
}
MapInfo_ClearTemps();
void XonoticServerInfoDialog_loadServerInfo(entity me, float i)
{
bool pure_available;
- float m, pure_violations, freeslots, j, numh, maxp, numb, sflags;
+ float m, pure_violations, freeslots, numh, maxp, numb, sflags;
string s, typestr, versionstr, k, v, modname;
// ====================================
freeslots = -1;
sflags = -1;
modname = "";
- for(j = 2; j < m; ++j)
+ for(int j = 2; j < m; ++j)
{
if(argv(j) == "")
break;
if(s != "data")
modname = sprintf("%s (%s)", modname, s);
- j = MapInfo_Type_FromString(typestr); // try and get the real name of the game type
+ Gametype j = MapInfo_Type_FromString(typestr); // try and get the real name of the game type
if(j) { typestr = MapInfo_Type_ToText(j); } // only set it if we actually found it
me.currentServerType = strzone(typestr);
}
void XonoticGametypeList_loadCvars(entity me)
{
- float t;
- t = MapInfo_CurrentGametype();
+ Gametype t = MapInfo_CurrentGametype();
float i;
for(i = 0; i < GameType_GetCount(); ++i)
if(t == GameType_GetID(i))
}
void XonoticGametypeList_saveCvars(entity me)
{
- int t = GameType_GetID(me.selectedItem);
+ Gametype t = GameType_GetID(me.selectedItem);
if (t == MapInfo_CurrentGametype()) {
return;
}
{
float i, j, n;
string s;
- float gt, f;
- gt = MapInfo_CurrentGametype();
- f = MapInfo_CurrentFeatures();
+ Gametype gt = MapInfo_CurrentGametype();
+ int f = MapInfo_CurrentFeatures();
MapInfo_FilterGametype(gt, f, MapInfo_RequiredFlags(), MapInfo_ForbiddenFlags(), 0);
if (me.stringFilter)
MapInfo_FilterString(me.stringFilter);
{
float i;
string s;
- MapInfo_FilterGametype(MAPINFO_TYPE_ALL, 0, 0, MapInfo_ForbiddenFlags(), 0); // all
+ _MapInfo_FilterGametype(MAPINFO_TYPE_ALL, 0, 0, MapInfo_ForbiddenFlags(), 0); // all
s = "";
for(i = 0; i < MapInfo_count; ++i)
s = strcat(s, " ", MapInfo_BSPName_ByID(i));
ATTRIB(XonoticMapList, realUpperMargin1, float, 0)
ATTRIB(XonoticMapList, realUpperMargin2, float, 0)
- ATTRIB(XonoticMapList, lastGametype, float, 0)
+ ATTRIB(XonoticMapList, lastGametype, entity, NULL)
ATTRIB(XonoticMapList, lastFeatures, float, 0)
ATTRIB(XonoticMapList, origin, vector, '0 0 0')
}
void ServerList_TypeSort_Click(entity btn, entity me)
{
- string s, t;
- float i, m;
- s = me.filterString;
- m = strstrofs(s, ":", 0);
+ string s = me.filterString;
+ int m = strstrofs(s, ":", 0);
if(m >= 0)
{
s = substring(s, 0, m);
else
s = "";
- for(i = 1; ; i *= 2) // 20 modes ought to be enough for anyone
- {
- t = MapInfo_Type_ToString(i);
- if(i > 1)
- if(t == "") // it repeats (default case)
- {
- // no type was found
- // choose the first one
- s = MapInfo_Type_ToString(1);
- break;
- }
- if(s == t)
- {
- // the type was found
- // choose the next one
- s = MapInfo_Type_ToString(i * 2);
- if(s == "")
- s = MapInfo_Type_ToString(1);
- break;
- }
+ Gametype first = NULL; FOREACH(Gametypes, !first, first = it; break);
+ bool flag = false;
+ FOREACH(Gametypes, s == MapInfo_Type_ToString(it), {
+ // the type was found
+ // choose the next one
+ flag = true;
+ s = MapInfo_Type_ToString(Gametypes_from(it.m_id + 1));
+ if (s == "") s = MapInfo_Type_ToString(first);
+ break;
+ });
+ if (!flag) {
+ // no type was found
+ // choose the first one
+ s = MapInfo_Type_ToString(first);
}
- if(s != "")
- s = strcat(s, ":");
+ if(s != "") s = strcat(s, ":");
s = strcat(s, substring(me.filterString, m+1, strlen(me.filterString) - m - 1));
me.controlledTextbox.setText(me.controlledTextbox, s);
MapInfo_Cache_Create();
MapInfo_Enumerate();
- if(!MapInfo_FilterGametype(MAPINFO_TYPE_ALL, 0, 0, 0, 1))
+ if(!_MapInfo_FilterGametype(MAPINFO_TYPE_ALL, 0, 0, 0, 1))
{
draw_reset_cropped();
/* GAMETYPE(MAPINFO_TYPE_INVASION) */ \
/**/
-int GameType_GetID(int cnt)
+Gametype GameType_GetID(int cnt)
{
int i = 0;
- #define GAMETYPE(id) { if (i++ == cnt) return id; }
+ #define GAMETYPE(it) { if (i++ == cnt) return it; }
GAMETYPES
#undef GAMETYPE
unused_float = i;
- return 0;
+ return NULL;
}
int GameType_GetCount()
string GameType_GetName(int cnt)
{
- int i = GameType_GetID(cnt);
-
- if(i)
- return MapInfo_Type_ToText(i);
-
- return "";
+ Gametype i = GameType_GetID(cnt);
+ return i ? MapInfo_Type_ToText(i) : "";
}
string GameType_GetIcon(int cnt)
{
- int i = GameType_GetID(cnt);
-
- if(i)
- return strcat("gametype_", MapInfo_Type_ToString(i));
-
- return "";
+ Gametype i = GameType_GetID(cnt);
+ return i ? strcat("gametype_", MapInfo_Type_ToString(i)) : "";
}
.void(entity) TR;
// game type list box stuff (does not NEED to contain all game types, other
// types stay available via console)
-int GameType_GetID(int cnt);
+entity GameType_GetID(int cnt);
string GameType_GetName(int cnt);
string GameType_GetIcon(int cnt);
//string GameType_GetTeams(float cnt);
// used by GameCommand_make_mapinfo()
void make_mapinfo_Think(entity this)
{
- if (MapInfo_FilterGametype(MAPINFO_TYPE_ALL, 0, 0, 0, 1))
+ if (_MapInfo_FilterGametype(MAPINFO_TYPE_ALL, 0, 0, 0, 1))
{
LOG_INFO("Done rebuiling mapinfos.\n");
MapInfo_FilterGametype(MapInfo_CurrentGametype(), MapInfo_CurrentFeatures(), MapInfo_RequiredFlags(), MapInfo_ForbiddenFlags(), 0);
if (argv(1) != "")
{
string s = argv(1);
- float t = MapInfo_Type_FromString(s), tsave = MapInfo_CurrentGametype();
+ Gametype t = MapInfo_Type_FromString(s), tsave = MapInfo_CurrentGametype();
if (t)
{
}
}
- float fd, l;
- string s;
-
cvar = cvar_normal;
cvar_string = cvar_string_normal;
cvar_set = cvar_set_normal;
cvar_changes_init(); // do this very early now so it REALLY matches the server config
- compressShortVector_init();
-
maxclients = 0;
for (entity head = nextent(NULL); head; head = nextent(head))
{
// character set: ASCII 33-126 without the following characters: : ; ' " \ $
if(autocvar_sv_eventlog)
{
- s = sprintf("%d.%s.%06d", itos(autocvar_sv_eventlog_files_counter), strftime(false, "%s"), floor(random() * 1000000));
+ string s = sprintf("%d.%s.%06d", itos(autocvar_sv_eventlog_files_counter), strftime(false, "%s"), floor(random() * 1000000));
matchid = strzone(s);
GameLogEcho(strcat(":gamestart:", GetGametype(), "_", GetMapname(), ":", s));
if(whichpack(strcat("maps/", mapname, ".cfg")) != "")
{
- fd = fopen(strcat("maps/", mapname, ".cfg"), FILE_READ);
+ int fd = fopen(strcat("maps/", mapname, ".cfg"), FILE_READ);
if(fd != -1)
{
+ string s;
while((s = fgets(fd)))
{
- l = tokenize_console(s);
+ int l = tokenize_console(s);
if(l < 2)
continue;
if(argv(0) == "cd")
monsterlist_reply = strzone(getmonsterlist());
for(int i = 0; i < 10; ++i)
{
- s = getrecords(i);
+ string s = getrecords(i);
if (s)
records_reply[i] = strzone(s);
}
// fill sv_curl_serverpackages from .serverpackage files
if (autocvar_sv_curl_serverpackages_auto)
{
- s = "csprogs-" WATERMARK ".txt";
+ string s = "csprogs-" WATERMARK ".txt";
// remove automatically managed files from the list to prevent duplicates
for (int i = 0, n = tokenize_console(cvar_string("sv_curl_serverpackages")); i < n; ++i)
{
}
// add automatically managed files to the list
#define X(match) MACRO_BEGIN { \
- fd = search_begin(match, true, false); \
+ int fd = search_begin(match, true, false); \
if (fd >= 0) \
{ \
for (int i = 0, j = search_getsize(fd); i < j; ++i) \
* Returns the gamtype ID from its name, if type_name isn't a real gametype it
* checks for sv_vote_gametype_(type_name)_type
*/
-float GameTypeVote_Type_FromString(string type_name)
+Gametype GameTypeVote_Type_FromString(string type_name)
{
- float type = MapInfo_Type_FromString(type_name);
- if ( type == 0 )
+ Gametype type = MapInfo_Type_FromString(type_name);
+ if (type == NULL)
type = MapInfo_Type_FromString(cvar_string(
strcat("sv_vote_gametype_",type_name,"_type")));
return type;
{
int flag = GTV_FORBIDDEN;
- float type = MapInfo_Type_FromString(type_name);
- if ( type == 0 )
+ Gametype type = MapInfo_Type_FromString(type_name);
+ if ( type == NULL )
{
type = MapInfo_Type_FromString(cvar_string(
strcat("sv_vote_gametype_",type_name,"_type")));
flag |= GTV_CUSTOM;
}
- if( type == 0 )
+ if( type == NULL )
return flag;
if ( autocvar_nextmap != "" )
{
- if ( !MapInfo_Get_ByName(autocvar_nextmap, false, 0) )
+ if ( !MapInfo_Get_ByName(autocvar_nextmap, false, NULL) )
return flag;
- if (!(MapInfo_Map_supportedGametypes & type))
+ if (!(MapInfo_Map_supportedGametypes & type.m_flags))
return flag;
}
n = min(MAPVOTE_COUNT, n);
gametype_mask = 0;
for(j = 0; j < n; ++j)
- gametype_mask |= GameTypeVote_Type_FromString(argv(j));
+ gametype_mask |= GameTypeVote_Type_FromString(argv(j)).m_flags;
return gametype_mask;
}
if ( autocvar_sv_vote_gametype )
{
MapInfo_Enumerate();
- MapInfo_FilterGametype(GameTypeVote_GetMask(), 0, MapInfo_RequiredFlags(), MapInfo_ForbiddenFlags(), 0);
+ _MapInfo_FilterGametype(GameTypeVote_GetMask(), 0, MapInfo_RequiredFlags(), MapInfo_ForbiddenFlags(), 0);
}
return MapInfo_FixName(m);
}
MapVote_Tick();
}
-float GameTypeVote_SetGametype(float type)
+float GameTypeVote_SetGametype(Gametype type)
{
if (MapInfo_CurrentGametype() == type)
return true;
- float tsave = MapInfo_CurrentGametype();
+ Gametype tsave = MapInfo_CurrentGametype();
MapInfo_SwitchGameType(type);
float GameTypeVote_AddVotable(string nextMode)
{
float j;
- if ( nextMode == "" || GameTypeVote_Type_FromString(nextMode) == 0 )
+ if ( nextMode == "" || GameTypeVote_Type_FromString(nextMode) == NULL )
return false;
for(j = 0; j < mapvote_count; ++j)
if(mapvote_maps[j] == nextMode)
#include "all.qh"
STATIC_INIT_LATE(Gametype) {
- Gametype g = MapInfo_Type(MapInfo_CurrentGametype());
+ Gametype g = MapInfo_CurrentGametype();
if (g) {
for (string _s = g.m_mutators; _s != ""; _s = cdr(_s)) {
string s = car(_s);
{
float i;
WriteHeader(MSG_ENTITY, ENT_CLIENT_SCORES_INFO);
- WriteInt24_t(MSG_ENTITY, MapInfo_LoadedGametype);
+ WriteRegistered(Gametypes, MSG_ENTITY, MapInfo_LoadedGametype);
FOREACH(Scores, true, {
WriteString(MSG_ENTITY, scores_label(it));
WriteByte(MSG_ENTITY, scores_flags(it));