]> icculus.org git repositories - divverent/nexuiz.git/blob - data/qcsrc/server/gamec/campaign.c
lossless jpegoptim run saving about 10 megabytes
[divverent/nexuiz.git] / data / qcsrc / server / gamec / campaign.c
1 // campaign cvars:
2 //   _campaign_index: index of CURRENT map
3 //   g_campaign_index: index of current LAST map (saved)
4 //   g_campaign_skill: bot skill offset
5
6 float campaign_level;
7 float campaign_won;
8
9 void(string s) CampaignBailout =
10 {
11         cvar_set("g_campaign", "0");
12         bprint(strcat("campaign initialization failed: ", s, "\n"));
13         //error(strcat("campaign initialization failed: ", s, "\n"));
14         return;
15 }
16
17 void() CampaignPreInit =
18 {
19         float baseskill;
20         string title;
21         campaign_level = cvar("_campaign_index");
22         CampaignFile_Load(campaign_level, 2);
23         if(campaign_entries < 1)
24                 return CampaignBailout("unknown map");
25         cvar_set("bot_number", ftos(campaign_bots[0]));
26
27         baseskill = cvar("g_campaign_skill");
28         baseskill = baseskill + campaign_botskill[0];
29         if(baseskill < 0)
30                 baseskill = 0;
31         cvar_set("skill", ftos(baseskill));
32
33         cvar_set("sv_public", "0");
34         cvar_set("pausable", "1");
35
36         title = campaign_shortdesc[0];
37         campaign_message = strzone(strcat("\n\n\n\n\n\n\n\n\n\n^1\n", title, "\n^3\n", Campaign_wordwrap(campaign_longdesc[0], 50), "\n\n^1press jump to enter the game"));
38 }
39
40 string GetMapname();
41 void() CampaignPostInit =
42 {
43         // now some sanity checks
44         string thismapname, wantedmapname;
45         thismapname = GetMapname();
46         wantedmapname = campaign_gametype[0];
47         wantedmapname = strcat(wantedmapname, "_", campaign_mapname[0]);
48         if(wantedmapname != thismapname)
49                 return CampaignBailout(strcat("wrong map: ", wantedmapname, " != ", thismapname));
50         cvar_set("fraglimit", ftos(campaign_fraglimit[0]));
51         cvar_set("timelimit", "0");
52 }
53
54 void() CampaignPreIntermission =
55 {
56         entity head;
57         float won;
58         float lost;
59
60         won = 0;
61         
62         head = findchain(classname, "player");
63         while(head)
64         {
65                 if(clienttype(head) == CLIENTTYPE_REAL)
66                 {
67                         if(head.winning)
68                                 won = won + 1;
69                         else
70                                 lost = lost + 1;
71                 }
72                 head = head.chain;
73         }
74
75         if(won == 1 && lost == 0)
76         {
77                 campaign_won = 1;
78                 bprint("The current level has been WON.\n");
79                 // sound!
80         }
81         else
82         {
83                 campaign_won = 0;
84                 bprint("The current level has been LOST.\n");
85                 // sound!
86         }
87
88         if(campaign_won)
89         {
90                 if(campaign_level == cvar("g_campaign_index"))
91                 {
92                         // advance level
93                         localcmd("set g_campaign_index ");
94                         localcmd(ftos(campaign_level + 1));
95                         localcmd("\n");
96                 }
97                 if(campaign_entries < 2)
98                 {
99                         localcmd("set g_campaign_index 0\n");
100                         localcmd("set g_campaign_won 1\n");
101                 }
102         }
103 }
104
105 void() CampaignPostIntermission =
106 {
107         // NOTE: campaign_won is 0 or 1, that is, points to the next level
108
109         if(campaign_won && campaign_entries < 2)
110         {
111                 // last map won!
112                 localcmd("togglemenu\n");
113                 CampaignFile_Unload();
114                 return;
115         }
116
117         CampaignSetup(campaign_won);
118         CampaignFile_Unload();
119         strunzone(campaign_message);
120 }
121
122
123
124 void(float n) CampaignLevelWarp =
125 {
126         if(!cvar("sv_cheats"))
127                 return;
128         CampaignFile_Unload();
129         CampaignFile_Load(n, 1);
130         if(campaign_entries)
131                 CampaignSetup(0);
132         else
133                 error("Sorry, cheater. You are NOT WELCOME.");
134         CampaignFile_Unload();
135 }