float CampaignBailout(string s)
{
- cvar = cvar_normal;
- cvar_string = cvar_string_normal;
- cvar_set = cvar_set_normal;
cvar_set("g_campaign", "0");
- LOG_INFO("^4campaign initialization failed: ", s, "\n");
+ LOG_INFO("^4campaign initialization failed: ", s);
if(autocvar__campaign_testrun)
error("CAMPAIGN FAIL AHAHAHAHAHAHAHAHAH))");
return 1;
}
-string cvar_campaignwrapper_list; // string of format ; var value; var value; var value;
-string cvar_string_campaignwrapper(string theCvar)
-{
- float p, q;
- p = strstrofs(cvar_campaignwrapper_list, strcat("; ", theCvar, " "), 0);
- if(p < 0)
- return cvar_defstring(theCvar);
- p += strlen(theCvar) + 3;
- q = strstrofs(cvar_campaignwrapper_list, ";", p);
- if(q < 0)
- return cvar_defstring(theCvar);
- return substring(cvar_campaignwrapper_list, p, q - p);
-}
-float cvar_campaignwrapper(string theCvar)
-{
- return stof(cvar_string_campaignwrapper(theCvar));
-}
-void cvar_set_campaignwrapper(string theCvar, string theValue)
-{
- if(cvar_string_campaignwrapper(theCvar) == theValue)
- return;
- string s;
- s = cvar_campaignwrapper_list;
- cvar_campaignwrapper_list = strzone(strcat("; ", theCvar, " ", theValue, s));
- strunzone(s);
- //print(cvar_campaignwrapper_list, "\n");
-}
-
float Campaign_Invalid()
{
string thismapname, wantedmapname;
thismapname = GetMapname();
wantedmapname = campaign_gametype[0];
- if(MapInfo_CurrentGametype() != MapInfo_Type_FromString(wantedmapname))
+ if(MapInfo_CurrentGametype() != MapInfo_Type_FromString(wantedmapname, false))
return CampaignBailout("wrong game type!");
wantedmapname = campaign_mapname[0];
if(wantedmapname != thismapname)
return 0;
}
+int Campaign_GetLevelNum()
+{
+ return campaign_level + 1;
+}
+
+string Campaign_GetMessage()
+{
+ return strcat(campaign_shortdesc[0], "\n^3\n", campaign_longdesc[0]);
+}
+
void CampaignPreInit()
{
float baseskill;
- string title;
campaign_level = autocvar__campaign_index;
campaign_name = strzone(autocvar__campaign_name);
campaign_index_var = strzone(strcat("g_campaign", campaign_name, "_index"));
if(autocvar_sv_cheats)
{
- MapInfo_SwitchGameType(MapInfo_Type_FromString(campaign_gametype[0]));
+ MapInfo_SwitchGameType(MapInfo_Type_FromString(campaign_gametype[0], false));
CampaignFile_Unload();
CampaignBailout("JOLLY CHEATS AHAHAHAHAHAHAH))");
return;
}
- baseskill = autocvar_g_campaign_skill;
- baseskill = baseskill + campaign_botskill[0];
- if(baseskill < 0)
- baseskill = 0;
+ baseskill = max(0, autocvar_g_campaign_skill + campaign_botskill[0]);
+ campaign_forcewin = false;
cvar_set("sv_public", "0");
cvar_set("pausable", "1");
- cvar_campaignwrapper_list = strzone(strcat("; ", campaign_mutators[0], "; "));
-
- cvar = cvar_campaignwrapper;
- cvar_string = cvar_string_campaignwrapper;
- cvar_set = cvar_set_campaignwrapper;
+ string cvar_campaignwrapper_list = strcat("; ", campaign_mutators[0], "; ");
+ int argc = tokenizebyseparator(cvar_campaignwrapper_list, "; ");
+ if(argc > 0)
+ {
+ for(int j = 0; j < argc; ++j)
+ {
+ string arg = argv(j);
+ if(arg == "") continue;
+ _MapInfo_Parse_Settemp(mapname, MAPINFO_SETTEMP_ACL_USER, 0, arg, 1);
+ }
+ }
- cvar_set("g_campaign", "1");
- cvar_set("g_dm", "0");
- cvar_set("skill", ftos(baseskill));
- cvar_set("bot_number", ftos(campaign_bots[0]));
- MapInfo_SwitchGameType(MapInfo_Type_FromString(campaign_gametype[0]));
+ cvar_settemp("g_campaign", "1");
+ cvar_settemp("g_dm", "0");
+ cvar_settemp("skill", ftos(baseskill));
+ cvar_settemp("bot_number", ftos(campaign_bots[0]));
- // copy sv_gravity cvar, as the engine needs it too (sorry, this will mess
- // with the menu a little still...)
- cvar_set_normal("sv_gravity", ftos(autocvar_sv_gravity));
+ MapInfo_SwitchGameType(MapInfo_Type_FromString(campaign_gametype[0], false));
if(Campaign_Invalid())
return;
-
- title = campaign_shortdesc[0];
- title = strzone(strcat("Level ", ftos(campaign_level + 1), ": ", title));
- campaign_message = strzone(strcat(title, "\n^3\n", campaign_longdesc[0], "\n\n^1press jump to enter the game"));
- strunzone(title);
}
void CampaignPostInit()
if(autocvar__campaign_testrun)
{
cvar_set("fraglimit", "0");
+ cvar_set("leadlimit", "0");
cvar_set("timelimit", "0.01");
- cvar_set_normal("fraglimit", "0");
- cvar_set_normal("timelimit", "0.01");
}
else
{
- cvar_set("fraglimit", ftos(campaign_fraglimit[0]));
- cvar_set("timelimit", ftos(campaign_timelimit[0]));
- cvar_set_normal("fraglimit", ftos(campaign_fraglimit[0]));
- cvar_set_normal("timelimit", ftos(campaign_timelimit[0]));
+ // "default" uses implicit values, "" or "0" means no limit
+ tokenizebyseparator(campaign_fraglimit[0], "+");
+ if(argv(0) != "default") {
+ cvar_set("fraglimit", argv(0));
+ }
+ if(argv(1) != "default") {
+ cvar_set("leadlimit", argv(1));
+ }
+ if(campaign_timelimit[0] != "default") {
+ cvar_set("timelimit", campaign_timelimit[0]);
+ }
}
}
string l;
registercvar(cvarname, ftos(value));
- cvar_set_normal(cvarname, ftos(value));
+ cvar_set(cvarname, ftos(value));
// note: cvarname must be remembered
fh = fopen("campaign.cfg", FILE_READ);
campaign_won = 1;
bprint("Campaign test run, advancing level.\n");
}
+ else if(campaign_forcewin)
+ {
+ campaign_won = 1;
+ bprint("The current level has been WON.\n");
+ }
else if(won == 1 && lost == 0 && checkrules_equality == 0)
{
if(autocvar_timelimit != 0 && autocvar_fraglimit != 0 && time > autocvar_timelimit * 60) // checks if the timelimit has expired.
if(campaign_won && cheatcount_total == 0 && !autocvar__campaign_testrun)
{
- if(campaign_level == cvar_normal(campaign_index_var))
+ if(campaign_level == cvar(campaign_index_var))
{
if(campaign_entries < 2)
{
CampaignSetup(campaign_won);
CampaignFile_Unload();
- strunzone(campaign_message);
strunzone(campaign_index_var);
strunzone(campaign_name);
campaign_name = "";