]> icculus.org git repositories - divverent/nexuiz.git/blob - data/qcsrc/server/campaign.qc
campaign
[divverent/nexuiz.git] / data / qcsrc / server / campaign.qc
1 // campaign cvars:
2 //   _campaign_index: index of CURRENT map
3 //   _campaign_name: name of the current campaign
4 //   g_campaign(name)_index: index of current LAST map (saved)
5 //   g_campaign_skill: bot skill offset
6
7 float campaign_level;
8 float campaign_won;
9 string campaign_index_var;
10 float checkrules_equality;
11
12 void(string s) CampaignBailout =
13 {
14         cvar_set("g_campaign", "0");
15         ServerConsoleEcho(strcat("campaign initialization failed: ", s), TRUE);
16         return;
17 }
18
19 void() CampaignPreInit =
20 {
21         float baseskill;
22         string title;
23         campaign_level = cvar("_campaign_index");
24         campaign_name = strzone(cvar_string("_campaign_name"));
25         campaign_index_var = strzone(strcat("g_campaign", campaign_name, "_index"));
26         CampaignFile_Load(campaign_level, 2);
27         if(campaign_entries < 1)
28                 return CampaignBailout("unknown map");
29         cvar_set("bot_number", ftos(campaign_bots[0]));
30
31         baseskill = cvar("g_campaign_skill");
32         baseskill = baseskill + campaign_botskill[0];
33         if(baseskill < 0)
34                 baseskill = 0;
35         cvar_set("skill", ftos(baseskill));
36
37         cvar_set("sv_public", "0");
38         cvar_set("pausable", "1");
39
40         title = campaign_shortdesc[0];
41         title = strzone(strcat("Level ", ftos(campaign_level + 1), ": ", title));
42         campaign_message = strzone(strcat("\n\n\n\n\n\n\n\n\n\n^1\n", title, "\n^3\n", wordwrap(campaign_longdesc[0], 50), "\n\n^1press jump to enter the game"));
43         strunzone(title);
44 }
45
46 string GetMapname();
47 void() CampaignPostInit =
48 {
49         // now some sanity checks
50         string thismapname, wantedmapname;
51         thismapname = GetMapname();
52 #ifdef MAPINFO
53         wantedmapname = campaign_mapname[0];
54 #else
55         wantedmapname = campaign_gametype[0];
56         wantedmapname = strcat(wantedmapname, "_", campaign_mapname[0]);
57 #endif
58         if(wantedmapname != thismapname)
59                 return CampaignBailout(strcat("wrong map: ", wantedmapname, " != ", thismapname));
60         cvar_set("fraglimit", ftos(campaign_fraglimit[0]));
61         cvar_set("timelimit", "0");
62 }
63
64 void CampaignSaveCvar(string cvarname, float value)
65 {
66         float fh;
67         float len;
68         string contents;
69         string l;
70
71         registercvar(cvarname, ftos(value));
72         cvar_set(cvarname, ftos(value));
73         // note: cvarname must be remembered
74
75         fh = fopen("campaign.cfg", FILE_READ);
76         contents = "";
77         if(fh >= 0)
78         {
79                 while((l = fgets(fh)))
80                 {
81                         cvarname = strcat1(cvarname);
82                         contents = strcat1(contents);
83                         len = tokenize(l);
84                         if(len != 3)
85                                 continue;
86                         if(argv(0) != "set")
87                                 continue;
88                         if(argv(1) == cvarname)
89                                 continue;
90                         contents = strcat(contents, "set ", argv(1), " ", argv(2), "\n");
91                 }
92                 fclose(fh);
93         }
94         contents = strcat(contents, "set ", cvarname,  " ", ftos(value), "\n");
95         fh = fopen("campaign.cfg", FILE_WRITE);
96         if(fh >= 0)
97         {
98                 fputs(fh, contents);
99         }
100         else
101         {
102                 error("Cannot write to campaign file");
103         }
104 }
105
106 void() CampaignPreIntermission =
107 {
108         entity head;
109         float won;
110         float lost;
111         local string savevar;
112
113         won = 0;
114
115         head = findchain(classname, "player");
116         while(head)
117         {
118                 if(clienttype(head) == CLIENTTYPE_REAL)
119                 {
120                         if(head.winning)
121                                 won = won + 1;
122                         else
123                                 lost = lost + 1;
124                 }
125                 head = head.chain;
126         }
127
128         if(won == 1 && lost == 0 && checkrules_equality == 0)
129         {
130                 campaign_won = 1;
131                 bprint("The current level has been WON.\n");
132                 // sound!
133         }
134         else
135         {
136                 campaign_won = 0;
137                 bprint("The current level has been LOST.\n");
138                 // sound!
139         }
140
141         if(campaign_won)
142         {
143                 if(campaign_entries < 2)
144                 {
145                         // I have won
146                         savevar = strcat("g_campaign", campaign_name, "_won");
147                         CampaignSaveCvar(savevar, 1);
148                         // advance level (for menu to show it right)
149                         CampaignSaveCvar(campaign_index_var, campaign_level + 1);
150                 }
151                 else if(campaign_level == cvar(campaign_index_var))
152                 {
153                         // advance level
154                         CampaignSaveCvar(campaign_index_var, campaign_level + 1);
155                 }
156         }
157 }
158
159 void() CampaignPostIntermission =
160 {
161         // NOTE: campaign_won is 0 or 1, that is, points to the next level
162
163         if(campaign_won && campaign_entries < 2)
164         {
165                 // last map won!
166                 localcmd("togglemenu\n");
167                 CampaignFile_Unload();
168                 return;
169         }
170
171         CampaignSetup(campaign_won);
172         CampaignFile_Unload();
173         strunzone(campaign_message);
174         strunzone(campaign_index_var);
175         strunzone(campaign_name);
176         campaign_name = "";
177 }
178
179
180
181 void(float n) CampaignLevelWarp =
182 {
183         if(!sv_cheats)
184                 return;
185         CampaignFile_Unload();
186         CampaignFile_Load(n, 1);
187         if(campaign_entries)
188                 CampaignSetup(0);
189         else
190                 error("Sorry, cheater. You are NOT WELCOME.");
191         CampaignFile_Unload();
192 }