]> git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blob - qcsrc/server/campaign.qc
cl_welcome_in_menu_dialog 1 "1: show the welcome message in a dedicated menu dialog...
[xonotic/xonotic-data.pk3dir.git] / qcsrc / server / campaign.qc
1 #include "campaign.qh"
2
3 #include <common/campaign_common.qh>
4 #include <common/mapinfo.qh>
5 #include <common/stats.qh>
6 #include <common/weapons/_all.qh>
7 #include <server/cheats.qh>
8 #include <server/intermission.qh>
9 #include <server/world.qh>
10
11 // campaign cvars:
12 //   _campaign_index: index of CURRENT map
13 //   _campaign_name: name of the current campaign
14 //   g_campaign(name)_index: index of current LAST map (saved)
15 //   g_campaign_skill: bot skill offset
16
17 float campaign_level;
18 float campaign_won;
19 string campaign_index_var;
20 //float checkrules_equality;
21
22 float CampaignBailout(string s)
23 {
24         cvar_set("g_campaign", "0");
25         LOG_INFO("^4campaign initialization failed: ", s);
26         if(autocvar__campaign_testrun)
27                 error("CAMPAIGN FAIL AHAHAHAHAHAHAHAHAH))");
28         return 1;
29 }
30
31 float Campaign_Invalid()
32 {
33         string thismapname, wantedmapname;
34         thismapname = GetMapname();
35         wantedmapname = campaign_gametype[0];
36         if(MapInfo_CurrentGametype() != MapInfo_Type_FromString(wantedmapname, false))
37                 return CampaignBailout("wrong game type!");
38         wantedmapname = campaign_mapname[0];
39         if(wantedmapname != thismapname)
40                 return CampaignBailout(strcat("wrong map: ", wantedmapname, " != ", thismapname));
41         return 0;
42 }
43
44 int Campaign_GetLevelNum()
45 {
46         return campaign_level + 1;
47 }
48
49 string Campaign_GetMessage()
50 {
51         return strcat(campaign_shortdesc[0], "\n^3\n", campaign_longdesc[0]);
52 }
53
54 void CampaignPreInit()
55 {
56         float baseskill;
57         campaign_level = autocvar__campaign_index;
58         campaign_name = strzone(autocvar__campaign_name);
59         campaign_index_var = strzone(strcat("g_campaign", campaign_name, "_index"));
60         CampaignFile_Load(campaign_level, 2);
61
62         if(campaign_entries < 1)
63         {
64                 CampaignBailout("unknown map");
65                 return;
66         }
67
68         if(autocvar_sv_cheats)
69         {
70                 MapInfo_SwitchGameType(MapInfo_Type_FromString(campaign_gametype[0], false));
71                 CampaignFile_Unload();
72                 CampaignBailout("JOLLY CHEATS AHAHAHAHAHAHAH))");
73                 return;
74         }
75
76         baseskill = max(0, autocvar_g_campaign_skill + campaign_botskill[0]);
77         campaign_forcewin = false;
78
79         cvar_set("sv_public", "0");
80         cvar_set("pausable", "1");
81
82         string cvar_campaignwrapper_list = strcat("; ", campaign_mutators[0], "; ");
83         int argc = tokenizebyseparator(cvar_campaignwrapper_list, "; ");
84         if(argc > 0)
85         {
86                 for(int j = 0; j < argc; ++j)
87                 {
88                         string arg = argv(j);
89                         if(arg == "") continue;
90                         _MapInfo_Parse_Settemp(mapname, MAPINFO_SETTEMP_ACL_USER, 0, arg, 1);
91                 }
92         }
93
94         cvar_settemp("g_campaign", "1");
95         cvar_settemp("g_dm", "0");
96         cvar_settemp("skill", ftos(baseskill));
97         cvar_settemp("bot_number", ftos(campaign_bots[0]));
98         cvar_settemp("cl_welcome_in_menu_dialog", "0");
99
100         MapInfo_SwitchGameType(MapInfo_Type_FromString(campaign_gametype[0], false));
101
102         if(Campaign_Invalid())
103                 return;
104 }
105
106 void CampaignPostInit()
107 {
108         // now some sanity checks
109         if(Campaign_Invalid())
110                 return;
111         if(autocvar__campaign_testrun)
112         {
113                 cvar_set("fraglimit", "0");
114                 cvar_set("leadlimit", "0");
115                 cvar_set("timelimit", "0.01");
116         }
117         else
118         {
119                 // "default" uses implicit values, "" or "0" means no limit
120                 tokenizebyseparator(campaign_fraglimit[0], "+");
121                 if(argv(0) != "default") {
122                         cvar_set("fraglimit", argv(0));
123                 }
124                 if(argv(1) != "default") {
125                         cvar_set("leadlimit", argv(1));
126                 }
127                 if(campaign_timelimit[0] != "default") {
128                         cvar_set("timelimit", campaign_timelimit[0]);
129                 }
130         }
131 }
132
133 void CampaignSaveCvar(string cvarname, float value)
134 {
135         float fh;
136         float len;
137         string contents;
138         string l;
139
140         registercvar(cvarname, ftos(value));
141         cvar_set(cvarname, ftos(value));
142         // note: cvarname must be remembered
143
144         fh = fopen("campaign.cfg", FILE_READ);
145         contents = "";
146         if(fh >= 0)
147         {
148                 while((l = fgets(fh)))
149                 {
150                         len = tokenize_console(l);
151                         if(len != 3)
152                                 continue;
153                         if(argv(0) != "set")
154                                 continue;
155                         if(argv(1) == cvarname)
156                                 continue;
157                         contents = strcat(contents, "set ", argv(1), " ", argv(2), "\n");
158                 }
159                 fclose(fh);
160         }
161         contents = strcat(contents, "set ", cvarname,  " ", ftos(value), "\n");
162         fh = fopen("campaign.cfg", FILE_WRITE);
163         if(fh >= 0)
164         {
165                 fputs(fh, contents);
166         }
167         else
168         {
169                 error("Cannot write to campaign file");
170         }
171 }
172
173 void CampaignPreIntermission()
174 {
175         int won = 0;
176         int lost = 0;
177         string savevar;
178
179         FOREACH_CLIENT(IS_PLAYER(it) && IS_REAL_CLIENT(it), {
180                 if(it.winning)
181                         won += 1;
182                 else
183                         lost += 1;
184         });
185
186         if(autocvar__campaign_testrun)
187         {
188                 campaign_won = 1;
189                 bprint("Campaign test run, advancing level.\n");
190         }
191         else if(campaign_forcewin)
192         {
193                 campaign_won = 1;
194                 bprint("The current level has been WON.\n");
195         }
196         else if(won == 1 && lost == 0 && checkrules_equality == 0)
197         {
198                 if(autocvar_timelimit != 0 && autocvar_fraglimit != 0 && time > autocvar_timelimit * 60) // checks if the timelimit has expired.
199                 {
200                         campaign_won = 0;
201                         bprint("Time's up! The current level has been LOST.\n");
202                         // sound!
203                 }
204                 else
205                 {
206                         campaign_won = 1;
207                         bprint("The current level has been WON.\n");
208                         // sound!
209                 }
210         }
211         else if(autocvar_timelimit != 0 && time > autocvar_timelimit * 60)
212         {
213                 campaign_won = 0;
214                 bprint("Time's up! The current level has been LOST.\n");
215                 // sound!
216         }
217         else
218         {
219                 campaign_won = 0;
220                 bprint("The current level has been LOST.\n");
221                 // sound!
222         }
223
224         if(campaign_won && cheatcount_total == 0 && !autocvar__campaign_testrun)
225         {
226                 if(campaign_level == cvar(campaign_index_var))
227                 {
228                         if(campaign_entries < 2)
229                         {
230                                 // I have won
231                                 savevar = strcat("g_campaign", campaign_name, "_won");
232                                 CampaignSaveCvar(savevar, 1);
233                                 // advance level (for menu to show it right)
234                                 CampaignSaveCvar(campaign_index_var, campaign_level + 1);
235                         }
236                         else
237                         {
238                                 // advance level
239                                 CampaignSaveCvar(campaign_index_var, campaign_level + 1);
240                         }
241                 }
242         }
243 }
244
245 void CampaignPostIntermission()
246 {
247         // NOTE: campaign_won is 0 or 1, that is, points to the next level
248
249         if(campaign_won && campaign_entries < 2)
250         {
251                 // last map won!
252                 LOG_DEBUG("^2test run: campaign looks GOOD");
253                 localcmd("togglemenu 1\n");
254                 CampaignFile_Unload();
255                 return;
256         }
257
258         CampaignSetup(campaign_won);
259         CampaignFile_Unload();
260         strunzone(campaign_index_var);
261         strunzone(campaign_name);
262         campaign_name = "";
263 }
264
265
266
267 void CampaignLevelWarp(float n)
268 {
269         if(n < 0)
270                 n = campaign_level + 1;
271         CampaignFile_Unload();
272         CampaignFile_Load(n, 1);
273         if(campaign_entries)
274                 CampaignSetup(0);
275         else
276                 error("Sorry, cheater. You are NOT WELCOME.");
277         CampaignFile_Unload();
278 }
279