]> icculus.org git repositories - divverent/nexuiz.git/blob - data/qcsrc/server/campaign.qc
git-svn-id: svn://svn.icculus.org/nexuiz/trunk@1912 f962a42d-fe04-0410-a3ab-8c8b0445ebaa
[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
11 void(string s) CampaignBailout =
12 {
13         cvar_set("g_campaign", "0");
14         ServerConsoleEcho(strcat("campaign initialization failed: ", s), TRUE);
15         return;
16 }
17
18 void() CampaignPreInit =
19 {
20         float baseskill;
21         string title;
22         campaign_level = cvar("_campaign_index");
23         campaign_name = strzone(cvar_string("_campaign_name"));
24         campaign_index_var = strzone(strcat("g_campaign", campaign_name, "_index"));
25         CampaignFile_Load(campaign_level, 2);
26         if(campaign_entries < 1)
27                 return CampaignBailout("unknown map");
28         cvar_set("bot_number", ftos(campaign_bots[0]));
29
30         baseskill = cvar("g_campaign_skill");
31         baseskill = baseskill + campaign_botskill[0];
32         if(baseskill < 0)
33                 baseskill = 0;
34         cvar_set("skill", ftos(baseskill));
35
36         cvar_set("sv_public", "0");
37         cvar_set("pausable", "1");
38
39         title = campaign_shortdesc[0];
40         title = strzone(strcat("Level ", ftos(campaign_level + 1), ": ", title));
41         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"));
42         strunzone(title);
43 }
44
45 string GetMapname();
46 void() CampaignPostInit =
47 {
48         // now some sanity checks
49         string thismapname, wantedmapname;
50         thismapname = GetMapname();
51         wantedmapname = campaign_gametype[0];
52         wantedmapname = strcat(wantedmapname, "_", campaign_mapname[0]);
53         if(wantedmapname != thismapname)
54                 return CampaignBailout(strcat("wrong map: ", wantedmapname, " != ", thismapname));
55         cvar_set("fraglimit", ftos(campaign_fraglimit[0]));
56         cvar_set("timelimit", "0");
57 }
58
59 void() CampaignPreIntermission =
60 {
61         entity head;
62         float won;
63         float lost;
64
65         won = 0;
66
67         head = findchain(classname, "player");
68         while(head)
69         {
70                 if(clienttype(head) == CLIENTTYPE_REAL)
71                 {
72                         if(head.winning)
73                                 won = won + 1;
74                         else
75                                 lost = lost + 1;
76                 }
77                 head = head.chain;
78         }
79
80         if(won == 1 && lost == 0)
81         {
82                 campaign_won = 1;
83                 bprint("The current level has been WON.\n");
84                 // sound!
85         }
86         else
87         {
88                 campaign_won = 0;
89                 bprint("The current level has been LOST.\n");
90                 // sound!
91         }
92
93         if(campaign_won)
94         {
95                 if(campaign_entries < 2)
96                 {
97                         //localcmd("set g_campaign_index 0\n");
98                         // don't reset...
99                         localcmd("set g_campaign");
100                         localcmd(campaign_name);
101                         localcmd("_won 1\n");
102                 }
103                 else if(campaign_level == cvar(campaign_index_var))
104                 {
105                         // advance level
106                         localcmd("set ");
107                         localcmd(campaign_index_var);
108                         localcmd(" ");
109                         localcmd(ftos(campaign_level + 1));
110                         localcmd("\n");
111                 }
112         }
113 }
114
115 void() CampaignPostIntermission =
116 {
117         // NOTE: campaign_won is 0 or 1, that is, points to the next level
118
119         if(campaign_won && campaign_entries < 2)
120         {
121                 // last map won!
122                 localcmd("togglemenu\n");
123                 CampaignFile_Unload();
124                 return;
125         }
126
127         CampaignSetup(campaign_won);
128         CampaignFile_Unload();
129         strunzone(campaign_message);
130         strunzone(campaign_index_var);
131         strunzone(campaign_name);
132         campaign_name = "";
133 }
134
135
136
137 void(float n) CampaignLevelWarp =
138 {
139         if(!cvar("sv_cheats"))
140                 return;
141         CampaignFile_Unload();
142         CampaignFile_Load(n, 1);
143         if(campaign_entries)
144                 CampaignSetup(0);
145         else
146                 error("Sorry, cheater. You are NOT WELCOME.");
147         CampaignFile_Unload();
148 }