X-Git-Url: https://de.git.xonotic.org/?p=xonotic%2Fxonotic-data.pk3dir.git;a=blobdiff_plain;f=qcsrc%2Fserver%2Fcampaign.qc;h=5c26da9ed4c7e558c865a93d61368be3c3689723;hp=825b9bfc179d71a4787f6f2a89fb22756c28b8be;hb=c8534e0bb85fe93b76ad32415bb0581d4771dd9b;hpb=c89dfaa4d0342b98c320621557973a65114fbdf4 diff --git a/qcsrc/server/campaign.qc b/qcsrc/server/campaign.qc index 825b9bfc1..5c26da9ed 100644 --- a/qcsrc/server/campaign.qc +++ b/qcsrc/server/campaign.qc @@ -1,4 +1,7 @@ #include "campaign.qh" + +#include "defs.qh" + #include "cheats.qh" #include "miscfunctions.qh" #include "g_world.qh" @@ -18,16 +21,19 @@ string campaign_index_var; float CampaignBailout(string s) { +#if 0 cvar = cvar_normal; cvar_string = cvar_string_normal; cvar_set = cvar_set_normal; +#endif 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; } +#if 0 string cvar_campaignwrapper_list; // string of format ; var value; var value; var value; string cvar_string_campaignwrapper(string theCvar) { @@ -49,12 +55,12 @@ void cvar_set_campaignwrapper(string theCvar, string theValue) { if(cvar_string_campaignwrapper(theCvar) == theValue) return; - string s; - s = cvar_campaignwrapper_list; + string s = cvar_campaignwrapper_list; cvar_campaignwrapper_list = strzone(strcat("; ", theCvar, " ", theValue, s)); strunzone(s); //print(cvar_campaignwrapper_list, "\n"); } +#endif float Campaign_Invalid() { @@ -73,39 +79,64 @@ void CampaignPreInit() { float baseskill; string title; - if(autocvar_sv_cheats) - { - CampaignBailout("JOLLY CHEATS AHAHAHAHAHAHAH))"); - return; - } campaign_level = autocvar__campaign_index; campaign_name = strzone(autocvar__campaign_name); campaign_index_var = strzone(strcat("g_campaign", campaign_name, "_index")); CampaignFile_Load(campaign_level, 2); + if(campaign_entries < 1) { CampaignBailout("unknown map"); return; } - baseskill = autocvar_g_campaign_skill; - baseskill = baseskill + campaign_botskill[0]; - if(baseskill < 0) - baseskill = 0; + if(autocvar_sv_cheats) + { + MapInfo_SwitchGameType(MapInfo_Type_FromString(campaign_gametype[0])); + CampaignFile_Unload(); + CampaignBailout("JOLLY CHEATS AHAHAHAHAHAHAH))"); + return; + } + + baseskill = max(0, autocvar_g_campaign_skill + campaign_botskill[0]); + campaign_forcewin = false; cvar_set("sv_public", "0"); cvar_set("pausable", "1"); +#if 0 cvar_campaignwrapper_list = strzone(strcat("; ", campaign_mutators[0], "; ")); +#else + 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, 0); // no recursion! + } + } +#endif +#if 0 cvar = cvar_campaignwrapper; cvar_string = cvar_string_campaignwrapper; cvar_set = cvar_set_campaignwrapper; - cvar_set("g_campaign", "1"); cvar_set("g_dm", "0"); cvar_set("skill", ftos(baseskill)); cvar_set("bot_number", ftos(campaign_bots[0])); +#else + // since g_campaign is already set to 1 by the menu when starting a campaign level, we first need + // to set it back to 0 before settemping it to 1 so it'll be correctly restored to 0 on disconnection + cvar_set("g_campaign", "0"); + cvar_settemp("g_campaign", "1"); + cvar_settemp("g_dm", "0"); + cvar_settemp("skill", ftos(baseskill)); + cvar_settemp("bot_number", ftos(campaign_bots[0])); +#endif MapInfo_SwitchGameType(MapInfo_Type_FromString(campaign_gametype[0])); // copy sv_gravity cvar, as the engine needs it too (sorry, this will mess @@ -184,31 +215,27 @@ void CampaignSaveCvar(string cvarname, float value) void CampaignPreIntermission() { - entity head; - float won; - float lost; + int won = 0; + int lost = 0; string savevar; - won = lost = 0; - - head = findchain(classname, "player"); - while(head) - { - if(IS_REAL_CLIENT(head)) - { - if(head.winning) - won = won + 1; - else - lost = lost + 1; - } - head = head.chain; - } + FOREACH_CLIENT(IS_PLAYER(it) && IS_REAL_CLIENT(it), { + if(it.winning) + won += 1; + else + lost += 1; + }); if(autocvar__campaign_testrun) { 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. @@ -265,7 +292,7 @@ void CampaignPostIntermission() if(campaign_won && campaign_entries < 2) { // last map won! - LOG_INFO("^2test run: campaign looks GOOD\n"); + LOG_DEBUG("^2test run: campaign looks GOOD"); localcmd("togglemenu 1\n"); CampaignFile_Unload(); return;