]> de.git.xonotic.org Git - voretournament/voretournament.git/blob - data/qcsrc/server/campaign.qc
Enable falling sounds
[voretournament/voretournament.git] / data / qcsrc / server / campaign.qc
1 // campaign cvars:\r
2 //   _campaign_index: index of CURRENT map\r
3 //   _campaign_name: name of the current campaign\r
4 //   g_campaign(name)_index: index of current LAST map (saved)\r
5 //   g_campaign_skill: bot skill offset\r
6 \r
7 float campaign_level;\r
8 float campaign_won;\r
9 string campaign_index_var;\r
10 float checkrules_equality;\r
11 \r
12 float CampaignBailout(string s)\r
13 {\r
14         cvar = cvar_normal;\r
15         cvar_string = cvar_string_normal;\r
16         cvar_set = cvar_set_normal;\r
17         cvar_set("g_campaign", "0");\r
18         print("campaign initialization failed: ", s, "\n");\r
19         return 1;\r
20 }\r
21 \r
22 string cvar_campaignwrapper_list; // string of format ; var value; var value; var value; \r
23 string cvar_string_campaignwrapper(string theCvar)\r
24 {\r
25         float p, q;\r
26         p = strstrofs(cvar_campaignwrapper_list, strcat("; ", theCvar, " "), 0);\r
27         if(p < 0)\r
28                 return cvar_defstring(theCvar);\r
29         p += strlen(theCvar) + 3;\r
30         q = strstrofs(cvar_campaignwrapper_list, ";", p);\r
31         if(q < 0)\r
32                 return cvar_defstring(theCvar);\r
33         return substring(cvar_campaignwrapper_list, p, q - p);\r
34 }\r
35 float cvar_campaignwrapper(string theCvar)\r
36 {\r
37         return stof(cvar_string_campaignwrapper(theCvar));\r
38 }\r
39 void cvar_set_campaignwrapper(string theCvar, string theValue)\r
40 {\r
41         if(cvar_string_campaignwrapper(theCvar) == theValue)\r
42                 return;\r
43         string s;\r
44         s = cvar_campaignwrapper_list;\r
45         cvar_campaignwrapper_list = strzone(strcat("; ", theCvar, " ", theValue, s));\r
46         strunzone(s);\r
47         //print(cvar_campaignwrapper_list, "\n");\r
48 }\r
49 \r
50 float Campaign_Invalid()\r
51 {\r
52         string thismapname, wantedmapname;\r
53         thismapname = GetMapname();\r
54         wantedmapname = campaign_gametype[0];\r
55         if(MapInfo_CurrentGametype() != MapInfo_Type_FromString(wantedmapname))\r
56                 return CampaignBailout("wrong game type!");\r
57         wantedmapname = campaign_mapname[0];\r
58         if(wantedmapname != thismapname)\r
59                 return CampaignBailout(strcat("wrong map: ", wantedmapname, " != ", thismapname));\r
60         return 0;\r
61 }\r
62 \r
63 void CampaignPreInit()\r
64 {\r
65         float baseskill;\r
66         string title;\r
67         if(cvar("sv_cheats"))\r
68         {\r
69                 CampaignBailout("JOLLY CHEATS AHAHAHAHAHAHAH))");\r
70                 return;\r
71         }\r
72         campaign_level = cvar("_campaign_index");\r
73         campaign_name = strzone(cvar_string("_campaign_name"));\r
74         campaign_index_var = strzone(strcat("g_campaign", campaign_name, "_index"));\r
75         CampaignFile_Load(campaign_level, 2);\r
76         if(campaign_entries < 1)\r
77         {\r
78                 CampaignBailout("unknown map");\r
79                 return;\r
80         }\r
81 \r
82         baseskill = cvar("g_campaign_skill");\r
83         baseskill = baseskill + campaign_botskill[0];\r
84         if(baseskill < 0)\r
85                 baseskill = 0;\r
86 \r
87         cvar_set("sv_public", "0");\r
88         cvar_set("pausable", "1");\r
89 \r
90         cvar_campaignwrapper_list = strzone(strcat("; ", campaign_mutators[0], "; "));\r
91 \r
92         cvar = cvar_campaignwrapper;\r
93         cvar_string = cvar_string_campaignwrapper;\r
94         cvar_set = cvar_set_campaignwrapper;\r
95 \r
96         cvar_set("g_campaign", "1");\r
97         cvar_set("g_dm", "0");\r
98         cvar_set("skill", ftos(baseskill));\r
99         cvar_set("bot_number", ftos(campaign_bots[0]));\r
100         MapInfo_SwitchGameType(MapInfo_Type_FromString(campaign_gametype[0]));\r
101 \r
102         // copy sv_gravity cvar, as the engine needs it too (sorry, this will mess\r
103         // with the menu a little still...)\r
104         cvar_set_normal("sv_gravity", cvar_string("sv_gravity"));\r
105 \r
106         // attempt to exec per-campaign-level cfg files\r
107         localcmd(strcat("exec maps/campaign", campaign_name, "_", ftos(campaign_level + 1), ".cfg\n"));\r
108 \r
109         if(Campaign_Invalid())\r
110                 return;\r
111 \r
112         title = campaign_shortdesc[0];\r
113         title = strzone(strcat("Level ", ftos(campaign_level + 1), ": ", title));\r
114         campaign_message = strzone(strcat("\n\n\n\n\n\n\n\n\n\n^1\n", title, "\n^3\n", campaign_longdesc[0], "\n\n^1press jump to enter the game"));\r
115         strunzone(title);\r
116 }\r
117 \r
118 string GetMapname();\r
119 void CampaignPostInit()\r
120 {\r
121         // now some sanity checks\r
122         if(Campaign_Invalid())\r
123                 return;\r
124         cvar_set("fraglimit", ftos(campaign_fraglimit[0]));\r
125         cvar_set("timelimit", "0");\r
126         cvar_set_normal("fraglimit", ftos(campaign_fraglimit[0]));\r
127         cvar_set_normal("timelimit", "0");\r
128 }\r
129 \r
130 void CampaignSaveCvar(string cvarname, float value)\r
131 {\r
132         float fh;\r
133         float len;\r
134         string contents;\r
135         string l;\r
136 \r
137         registercvar(cvarname, ftos(value));\r
138         cvar_set_normal(cvarname, ftos(value));\r
139         // note: cvarname must be remembered\r
140 \r
141         fh = fopen("campaign.cfg", FILE_READ);\r
142         contents = "";\r
143         if(fh >= 0)\r
144         {\r
145                 while((l = fgets(fh)))\r
146                 {\r
147                         len = tokenize_console(l);\r
148                         if(len != 3)\r
149                                 continue;\r
150                         if(argv(0) != "set")\r
151                                 continue;\r
152                         if(argv(1) == cvarname)\r
153                                 continue;\r
154                         contents = strcat(contents, "set ", argv(1), " ", argv(2), "\n");\r
155                 }\r
156                 fclose(fh);\r
157         }\r
158         contents = strcat(contents, "set ", cvarname,  " ", ftos(value), "\n");\r
159         fh = fopen("campaign.cfg", FILE_WRITE);\r
160         if(fh >= 0)\r
161         {\r
162                 fputs(fh, contents);\r
163         }\r
164         else\r
165         {\r
166                 error("Cannot write to campaign file");\r
167         }\r
168 }\r
169 \r
170 void CampaignPreIntermission()\r
171 {\r
172         entity head;\r
173         float won;\r
174         float lost;\r
175         local string savevar;\r
176 \r
177         won = 0;\r
178 \r
179         head = findchain(classname, "player");\r
180         while(head)\r
181         {\r
182                 if(clienttype(head) == CLIENTTYPE_REAL)\r
183                 {\r
184                         if(head.winning)\r
185                                 won = won + 1;\r
186                         else\r
187                                 lost = lost + 1;\r
188                 }\r
189                 head = head.chain;\r
190         }\r
191 \r
192         if(won == 1 && lost == 0 && checkrules_equality == 0 && cheatcount_total == 0)\r
193         {\r
194                 campaign_won = 1;\r
195                 bprint("The current level has been WON.\n");\r
196                 // sound!\r
197         }\r
198         else\r
199         {\r
200                 campaign_won = 0;\r
201                 bprint("The current level has been LOST.\n");\r
202                 // sound!\r
203         }\r
204 \r
205         if(campaign_won)\r
206         {\r
207                 if(campaign_entries < 2)\r
208                 {\r
209                         // I have won\r
210                         savevar = strcat("g_campaign", campaign_name, "_won");\r
211                         CampaignSaveCvar(savevar, 1);\r
212                         // advance level (for menu to show it right)\r
213                         CampaignSaveCvar(campaign_index_var, campaign_level + 1);\r
214                 }\r
215                 else if(campaign_level == cvar_normal(campaign_index_var))\r
216                 {\r
217                         // advance level\r
218                         CampaignSaveCvar(campaign_index_var, campaign_level + 1);\r
219                 }\r
220         }\r
221 }\r
222 \r
223 void CampaignPostIntermission()\r
224 {\r
225         // NOTE: campaign_won is 0 or 1, that is, points to the next level\r
226 \r
227         if(campaign_won && campaign_entries < 2)\r
228         {\r
229                 // last map won!\r
230                 localcmd("togglemenu 1\n");\r
231                 CampaignFile_Unload();\r
232                 return;\r
233         }\r
234 \r
235         CampaignSetup(campaign_won);\r
236         CampaignFile_Unload();\r
237         strunzone(campaign_message);\r
238         strunzone(campaign_index_var);\r
239         strunzone(campaign_name);\r
240         campaign_name = "";\r
241 }\r
242 \r
243 \r
244 \r
245 void CampaignLevelWarp(float n)\r
246 {\r
247         CampaignFile_Unload();\r
248         CampaignFile_Load(n, 1);\r
249         if(campaign_entries)\r
250                 CampaignSetup(0);\r
251         else\r
252                 error("Sorry, cheater. You are NOT WELCOME.");\r
253         CampaignFile_Unload();\r
254 }\r