]> icculus.org git repositories - divverent/nexuiz.git/blob - data/qcsrc/menu-div0test/nexuiz/campaign.c
oops
[divverent/nexuiz.git] / data / qcsrc / menu-div0test / nexuiz / campaign.c
1 #ifdef INTERFACE
2 CLASS(NexuizCampaignList) EXTENDS(NexuizListBox)
3         METHOD(NexuizCampaignList, configureNexuizCampaignList, void(entity))
4         ATTRIB(NexuizCampaignList, rowsPerItem, float, 10)
5         METHOD(NexuizCampaignList, draw, void(entity))
6         METHOD(NexuizCampaignList, drawListBoxItem, void(entity, float, vector, float))
7         METHOD(NexuizCampaignList, clickListBoxItem, void(entity, float, vector))
8         METHOD(NexuizCampaignList, resizeNotify, void(entity, vector, vector, vector, vector))
9         METHOD(NexuizCampaignList, setSelected, void(entity, float))
10
11         ATTRIB(NexuizCampaignList, realFontSize, vector, '0 0 0')
12         ATTRIB(NexuizCampaignList, columnPreviewOrigin, float, 0)
13         ATTRIB(NexuizCampaignList, columnPreviewSize, float, 0)
14         ATTRIB(NexuizCampaignList, columnNameOrigin, float, 0)
15         ATTRIB(NexuizCampaignList, columnNameSize, float, 0)
16         ATTRIB(NexuizCampaignList, columnCheckMarkOrigin, float, 0)
17         ATTRIB(NexuizCampaignList, columnCheckMarkSize, float, 0)
18         ATTRIB(NexuizCampaignList, checkMarkOrigin, vector, '0 0 0')
19         ATTRIB(NexuizCampaignList, checkMarkSize, vector, '0 0 0')
20         ATTRIB(NexuizCampaignList, realUpperMargin1, float, 0)
21         ATTRIB(NexuizCampaignList, realUpperMargin2, float, 0)
22
23         ATTRIB(NexuizCampaignList, lastClickedMap, float, -1)
24         ATTRIB(NexuizCampaignList, lastClickedTime, float, 0)
25
26         ATTRIB(NexuizCampaignList, origin, vector, '0 0 0')
27         ATTRIB(NexuizCampaignList, itemAbsSize, vector, '0 0 0')
28         ATTRIB(NexuizCampaignList, emptyLineHeight, float, 0.5)
29
30         ATTRIB(NexuizCampaignList, campaignIndex, float, 0)
31         ATTRIB(NexuizCampaignList, cvarName, string, string_null)
32         METHOD(NexuizCampaignList, loadCvars, void(entity))
33         METHOD(NexuizCampaignList, saveCvars, void(entity))
34 ENDCLASS(NexuizCampaignList)
35 entity makeNexuizCampaignList();
36 void CampaignList_LoadMap(entity btn, entity me);
37 #endif
38
39 #ifdef IMPLEMENTATION
40 string campaign_longdesc_wrapped[CAMPAIGN_MAX_ENTRIES];
41
42 void rewrapCampaign(float w, float l0, float emptyheight)
43 {
44         float i, j;
45         float n, take, cantake, l;
46         string r, s;
47         for(i = 0; i < campaign_entries; ++i)
48         {
49                 l = l0;
50                 if(campaign_longdesc_wrapped[i])
51                         strunzone(campaign_longdesc_wrapped[i]);
52                 n = tokenizebyseparator(campaign_longdesc[i], "\n");
53                 r = "";
54                 for(j = 0; j < n; ++j)
55                 {
56                         s = argv(j);
57                         if(s == "")
58                         {
59                                 l -= emptyheight;
60                                 r = strcat(r, "\n");
61                                 continue;
62                         }
63                         for(;;)
64                         {
65                                 cantake = draw_TextLengthUpToWidth(s, w, 0);
66                                 if(cantake > 0 && cantake < strlen(s))
67                                 {
68                                         take = cantake - 1;
69                                         while(take > 0 && substring(s, take, 1) != " ")
70                                                 --take;
71                                         if(take == 0)
72                                         {
73                                                 if(--l < 0) goto toolong;
74                                                 r = strcat(r, substring(s, 0, cantake), "\n");
75                                                 s = substring(s, cantake, strlen(s) - cantake);
76                                         }
77                                         else
78                                         {
79                                                 if(--l < 0) goto toolong;
80                                                 r = strcat(r, substring(s, 0, take), "\n");
81                                                 s = substring(s, take + 1, strlen(s) - take);
82                                         }
83                                 }
84                                 else
85                                 {
86                                         if(--l < 0) goto toolong;
87                                         r = strcat(r, s, "\n");
88                                         break;
89                                 }
90                         }
91                 }
92                 goto nottoolong;
93 :toolong
94                 while(substring(r, strlen(r) - 1, 1) == "\n")
95                         r = substring(r, 0, strlen(r) - 1);
96                 r = strcat(r, "...\n");
97 :nottoolong
98                 campaign_longdesc_wrapped[i] = strzone(substring(r, 0, strlen(r) - 1));
99         }
100 }
101
102 entity makeNexuizCampaignList()
103 {
104         entity me;
105         me = spawnNexuizCampaignList();
106         me.configureNexuizCampaignList(me);
107         return me;
108 }
109 void configureNexuizCampaignListNexuizCampaignList(entity me)
110 {
111         me.configureNexuizListBox(me);
112         me.loadCvars(me);
113 }
114
115 void loadCvarsNexuizCampaignList(entity me)
116 {
117         // read campaign cvars
118         if(campaign_name)
119                 strunzone(campaign_name);
120         if(me.cvarName)
121                 strunzone(me.cvarName);
122         campaign_name = strzone(cvar_string("g_campaign_name"));
123         me.cvarName = strzone(strcat("g_campaign", campaign_name, "_index"));
124         CampaignFile_Load(0, CAMPAIGN_MAX_ENTRIES);
125         me.campaignIndex = bound(0, cvar(me.cvarName), campaign_entries);
126         cvar_set(me.cvarName, ftos(me.campaignIndex));
127         if(me.columnNameSize)
128                 rewrapCampaign(me.columnNameSize / me.realFontSize_x, me.rowsPerItem - 3, me.emptyLineHeight);
129         me.nItems = min(me.campaignIndex + 2, campaign_entries);
130         me.selectedItem = min(me.campaignIndex, me.nItems - 1);
131         me.scrollPos = me.nItems * me.itemHeight - 1;
132 }
133
134 void saveCvarsNexuizCampaignList(entity me)
135 {
136         // write campaign cvars
137         cvar_set("g_campaign_name", campaign_name);
138         // cvar_set(me.cvarName, ftos(me.campaignIndex)); // NOTE: only server QC does that!
139 }
140
141 void drawNexuizCampaignList(entity me)
142 {
143         if(cvar(me.cvarName) != me.campaignIndex || cvar_string("g_campaign_name") != campaign_name)
144                 me.loadCvars(me);
145         drawListBox(me);
146 }
147
148 void resizeNotifyNexuizCampaignList(entity me, vector relOrigin, vector relSize, vector absOrigin, vector absSize)
149 {
150         me.origin = absOrigin;
151         me.itemAbsSize = '0 0 0';
152         resizeNotifyNexuizListBox(me, relOrigin, relSize, absOrigin, absSize);
153
154         me.realFontSize_y = me.fontSize / (me.itemAbsSize_y = (absSize_y * me.itemHeight));
155         me.realFontSize_x = me.fontSize / (me.itemAbsSize_x = (absSize_x * (1 - me.controlWidth)));
156         me.realUpperMargin1 = 0.5 * me.realFontSize_y;
157         me.realUpperMargin2 = me.realUpperMargin1 + 2 * me.realFontSize_y;
158
159         me.checkMarkSize = (eX * (me.itemAbsSize_y / me.itemAbsSize_x) + eY) * 0.5;
160
161         me.columnPreviewOrigin = 0;
162         me.columnPreviewSize = me.itemAbsSize_y / me.itemAbsSize_x * 4 / 3;
163         me.columnCheckMarkSize = me.checkMarkSize_x;
164         me.columnNameSize = 1 - me.columnPreviewSize - me.columnCheckMarkSize - 4 * me.realFontSize_x;
165         me.columnNameOrigin = me.columnPreviewOrigin + me.columnPreviewSize + me.realFontSize_x;
166         me.columnCheckMarkOrigin = me.columnNameOrigin + me.columnNameSize + me.realFontSize_x * 2;
167
168         me.checkMarkOrigin = eY + eX * (me.columnCheckMarkOrigin + me.columnCheckMarkSize) - me.checkMarkSize;
169
170         rewrapCampaign(me.columnNameSize / me.realFontSize_x, me.rowsPerItem - 3, me.emptyLineHeight);
171 }
172 void clickListBoxItemNexuizCampaignList(entity me, float i, vector where)
173 {
174         if(i == me.lastClickedMap)
175                 if(time < me.lastClickedTime + 0.3)
176                 {
177                         // DOUBLE CLICK!
178                         // start game
179                         CampaignList_LoadMap(me, me);
180                         return;
181                 }
182         me.lastClickedMap = i;
183         me.lastClickedTime = time;
184 }
185 void drawListBoxItemNexuizCampaignList(entity me, float i, vector absSize, float isSelected)
186 {
187         string s;
188         float p;
189         vector theColor;
190         float theAlpha;
191         float done;
192         float j, n;
193         vector o;
194
195         if(i < me.campaignIndex)
196         {
197                 theAlpha = 1;
198                 theColor = '1 1 1';
199         }
200         else if(i == me.campaignIndex)
201         {
202                 theAlpha = 1;
203                 theColor = '1 1 0';
204         }
205         else
206         {
207                 theAlpha = 0.2;
208                 theColor = '1 1 1';
209         }
210
211         if(isSelected)
212                 draw_Fill('0 0 0', '1 1 0', '0 0 1', 0.5);
213
214         s = ftos(p);
215         draw_Picture(me.columnPreviewOrigin * eX, strcat("/maps/", campaign_mapname[i]), me.columnPreviewSize * eX + eY, '1 1 1', theAlpha);
216         if(i < me.campaignIndex)
217                 draw_Picture(me.checkMarkOrigin, "checkmark", me.checkMarkSize, '1 1 1', 1);
218         if(i <= me.campaignIndex)
219                 s = campaign_shortdesc[i]; // fteqcc sucks
220         else
221                 s = "???";
222         s = draw_TextShortenToWidth(strcat("Level ", ftos(i + 1), ": ", s), me.columnNameSize / me.realFontSize_x, 0);
223         draw_Text(me.realUpperMargin1 * eY + (me.columnNameOrigin + 0.00 * (me.columnNameSize - draw_TextWidth(s, 0) * me.realFontSize_x)) * eX, s, me.realFontSize, theColor, theAlpha, 0);
224
225         if(i <= me.campaignIndex)
226         {
227                 s = campaign_longdesc_wrapped[i];
228                 n = tokenizebyseparator(s, "\n");
229                 o = me.realUpperMargin2 * eY + me.columnNameOrigin * eX;
230                 for(j = 0; j < n; ++j)
231                         if(argv(j) != "")
232                         {
233                                 draw_Text(o, argv(j), me.realFontSize, theColor, theAlpha * 0.7, 0);
234                                 o_y += me.realFontSize_y;
235                         }
236                         else
237                                 o_y += me.realFontSize_y * me.emptyLineHeight;
238         }
239 }
240 void CampaignList_LoadMap(entity btn, entity me)
241 {
242         if(me.selectedItem >= me.nItems || me.selectedItem < 0)
243                 return;
244         CampaignSetup(me.selectedItem);
245 }
246
247 void setSelectedNexuizCampaignList(entity me, float i)
248 {
249         // prevent too late items from being played
250         setSelectedListBox(me, min(i, me.campaignIndex));
251 }
252 #endif