]> de.git.xonotic.org Git - voretournament/voretournament.git/blob - data/qcsrc/menu/voret/maplist.c
Include gmqcc binaries for Windows and Linux
[voretournament/voretournament.git] / data / qcsrc / menu / voret / maplist.c
1 #ifdef INTERFACE\r
2 CLASS(VoretMapList) EXTENDS(VoretListBox)\r
3         METHOD(VoretMapList, configureVoretMapList, void(entity))\r
4         ATTRIB(VoretMapList, rowsPerItem, float, 4)\r
5         METHOD(VoretMapList, draw, void(entity))\r
6         METHOD(VoretMapList, drawListBoxItem, void(entity, float, vector, float))\r
7         METHOD(VoretMapList, clickListBoxItem, void(entity, float, vector))\r
8         METHOD(VoretMapList, resizeNotify, void(entity, vector, vector, vector, vector))\r
9         METHOD(VoretMapList, refilter, void(entity))\r
10         METHOD(VoretMapList, refilterCallback, void(entity, entity))\r
11         METHOD(VoretMapList, keyDown, float(entity, float, float, float))\r
12 \r
13         ATTRIB(VoretMapList, realFontSize, vector, '0 0 0')\r
14         ATTRIB(VoretMapList, columnPreviewOrigin, float, 0)\r
15         ATTRIB(VoretMapList, columnPreviewSize, float, 0)\r
16         ATTRIB(VoretMapList, columnNameOrigin, float, 0)\r
17         ATTRIB(VoretMapList, columnNameSize, float, 0)\r
18         ATTRIB(VoretMapList, checkMarkOrigin, vector, '0 0 0')\r
19         ATTRIB(VoretMapList, checkMarkSize, vector, '0 0 0')\r
20         ATTRIB(VoretMapList, realUpperMargin1, float, 0)\r
21         ATTRIB(VoretMapList, realUpperMargin2, float, 0)\r
22 \r
23         ATTRIB(VoretMapList, lastClickedMap, float, -1)\r
24         ATTRIB(VoretMapList, lastClickedTime, float, 0)\r
25 \r
26         ATTRIB(VoretMapList, lastGametype, float, 0)\r
27         ATTRIB(VoretMapList, lastFeatures, float, 0)\r
28 \r
29         ATTRIB(VoretMapList, origin, vector, '0 0 0')\r
30         ATTRIB(VoretMapList, itemAbsSize, vector, '0 0 0')\r
31 \r
32         ATTRIB(VoretMapList, g_maplistCache, string, string_null)\r
33         METHOD(VoretMapList, g_maplistCacheToggle, void(entity, float))\r
34         METHOD(VoretMapList, g_maplistCacheQuery, float(entity, float))\r
35 \r
36         ATTRIB(VoretMapList, startButton, entity, NULL)\r
37 \r
38         METHOD(VoretMapList, loadCvars, void(entity))\r
39 \r
40         ATTRIB(VoretMapList, typeToSearchString, string, string_null)\r
41         ATTRIB(VoretMapList, typeToSearchTime, float, 0)\r
42 \r
43         METHOD(VoretMapList, destroy, void(entity))\r
44 \r
45         ATTRIB(VoretListBox, alphaBG, float, 0)\r
46 ENDCLASS(VoretMapList)\r
47 entity makeVoretMapList();\r
48 void MapList_All(entity btn, entity me);\r
49 void MapList_None(entity btn, entity me);\r
50 void MapList_LoadMap(entity btn, entity me);\r
51 #endif\r
52 \r
53 #ifdef IMPLEMENTATION\r
54 void destroyVoretMapList(entity me)\r
55 {\r
56         MapInfo_Shutdown();\r
57 }\r
58 \r
59 entity makeVoretMapList()\r
60 {\r
61         entity me;\r
62         me = spawnVoretMapList();\r
63         me.configureVoretMapList(me);\r
64         return me;\r
65 }\r
66 \r
67 void configureVoretMapListVoretMapList(entity me)\r
68 {\r
69         me.configureVoretListBox(me);\r
70         me.refilter(me);\r
71 }\r
72 \r
73 void loadCvarsVoretMapList(entity me)\r
74 {\r
75         me.refilter(me);\r
76 }\r
77 \r
78 float g_maplistCacheQueryVoretMapList(entity me, float i)\r
79 {\r
80         return stof(substring(me.g_maplistCache, i, 1));\r
81 }\r
82 void g_maplistCacheToggleVoretMapList(entity me, float i)\r
83 {\r
84         string a, b, c, s, bspname;\r
85         float n;\r
86         s = me.g_maplistCache;\r
87         if not(s)\r
88                 return;\r
89         b = substring(s, i, 1);\r
90         if(b == "0")\r
91                 b = "1";\r
92         else if(b == "1")\r
93                 b = "0";\r
94         else\r
95                 return; // nothing happens\r
96         a = substring(s, 0, i);\r
97         c = substring(s, i+1, strlen(s) - (i+1));\r
98         strunzone(s);\r
99         me.g_maplistCache = strzone(strcat(a, b, c));\r
100         // TODO also update the actual cvar\r
101         if not((bspname = MapInfo_BSPName_ByID(i)))\r
102                 return;\r
103         if(b == "1")\r
104                 cvar_set("g_maplist", strcat(bspname, " ", cvar_string("g_maplist")));\r
105         else\r
106         {\r
107                 s = "";\r
108                 n = tokenize_console(cvar_string("g_maplist"));\r
109                 for(i = 0; i < n; ++i)\r
110                         if(argv(i) != bspname)\r
111                                 s = strcat(s, " ", argv(i));\r
112                 cvar_set("g_maplist", substring(s, 1, strlen(s) - 1));\r
113         }\r
114 }\r
115 \r
116 void drawVoretMapList(entity me)\r
117 {\r
118         if(me.startButton)\r
119                 me.startButton.disabled = ((me.selectedItem < 0) || (me.selectedItem >= me.nItems));\r
120         drawListBox(me);\r
121 }\r
122 \r
123 void resizeNotifyVoretMapList(entity me, vector relOrigin, vector relSize, vector absOrigin, vector absSize)\r
124 {\r
125         me.itemAbsSize = '0 0 0';\r
126         resizeNotifyVoretListBox(me, relOrigin, relSize, absOrigin, absSize);\r
127 \r
128         me.realFontSize_y = me.fontSize / (me.itemAbsSize_y = (absSize_y * me.itemHeight));\r
129         me.realFontSize_x = me.fontSize / (me.itemAbsSize_x = (absSize_x * (1 - me.controlWidth)));\r
130         me.realUpperMargin1 = 0.5 * (1 - 2.5 * me.realFontSize_y);\r
131         me.realUpperMargin2 = me.realUpperMargin1 + 1.5 * me.realFontSize_y;\r
132 \r
133         me.columnPreviewOrigin = 0;\r
134         me.columnPreviewSize = me.itemAbsSize_y / me.itemAbsSize_x * 4 / 3;\r
135         me.columnNameOrigin = me.columnPreviewOrigin + me.columnPreviewSize + me.realFontSize_x;\r
136         me.columnNameSize = 1 - me.columnPreviewSize - 2 * me.realFontSize_x;\r
137 \r
138         me.checkMarkSize = (eX * (me.itemAbsSize_y / me.itemAbsSize_x) + eY) * 0.5;\r
139         me.checkMarkOrigin = eY + eX * (me.columnPreviewOrigin + me.columnPreviewSize) - me.checkMarkSize;\r
140 }\r
141 \r
142 void clickListBoxItemVoretMapList(entity me, float i, vector where)\r
143 {\r
144         if(where_x <= me.columnPreviewOrigin + me.columnPreviewSize)\r
145         {\r
146                 if(where_x >= 0)\r
147                         me.g_maplistCacheToggle(me, i);\r
148         }\r
149         if(where_x >= me.columnNameOrigin)\r
150                 if(where_x <= 1)\r
151                         {\r
152                                 if(i == me.lastClickedMap)\r
153                                         if(time < me.lastClickedTime + 0.3)\r
154                                         {\r
155                                                 // DOUBLE CLICK!\r
156                                                 // pop up map info screen\r
157                                                 main.mapInfoDialog.loadMapInfo(main.mapInfoDialog, i, me);\r
158                                                 DialogOpenButton_Click_withCoords(NULL, main.mapInfoDialog, me.origin + eX * (me.columnNameOrigin * me.size_x) + eY * ((me.itemHeight * i - me.scrollPos) * me.size_y), eY * me.itemAbsSize_y + eX * (me.itemAbsSize_x * me.columnNameSize));\r
159                                                 return;\r
160                                         }\r
161                                 me.lastClickedMap = i;\r
162                                 me.lastClickedTime = time;\r
163                         }\r
164 }\r
165 \r
166 void drawListBoxItemVoretMapList(entity me, float i, vector absSize, float isSelected)\r
167 {\r
168         // layout: Ping, Map name, Map name, NP, TP, MP\r
169         string s;\r
170         float p;\r
171         float theAlpha;\r
172         float included;\r
173 \r
174         if(!MapInfo_Get_ByID(i))\r
175                 return;\r
176 \r
177         included = me.g_maplistCacheQuery(me, i);\r
178         if(included || isSelected)\r
179                 theAlpha = SKINALPHA_MAPLIST_INCLUDEDFG;\r
180         else\r
181                 theAlpha = SKINALPHA_MAPLIST_NOTINCLUDEDFG;\r
182 \r
183         if(isSelected)\r
184                 draw_Fill('0 0 0', '1 1 0', SKINCOLOR_LISTBOX_SELECTED, SKINALPHA_LISTBOX_SELECTED);\r
185         else if(included)\r
186                 draw_Fill('0 0 0', '1 1 0', SKINCOLOR_MAPLIST_INCLUDEDBG, SKINALPHA_MAPLIST_INCLUDEDBG);\r
187 \r
188         s = ftos(p);\r
189         if(draw_PictureSize(strcat("/maps/", MapInfo_Map_bspname)) == '0 0 0')\r
190                 draw_Picture(me.columnPreviewOrigin * eX, "nopreview_map", me.columnPreviewSize * eX + eY, '1 1 1', theAlpha);\r
191         else\r
192                 draw_Picture(me.columnPreviewOrigin * eX, strcat("/maps/", MapInfo_Map_bspname), me.columnPreviewSize * eX + eY, '1 1 1', theAlpha);\r
193 \r
194         if(included)\r
195                 draw_Picture(me.checkMarkOrigin, "checkmark", me.checkMarkSize, '1 1 1', 1);\r
196         s = draw_TextShortenToWidth(strcat(MapInfo_Map_bspname, ": ", MapInfo_Map_title), me.columnNameSize, 0, me.realFontSize);\r
197         draw_Text(me.realUpperMargin1 * eY + (me.columnNameOrigin + 0.00 * (me.columnNameSize - draw_TextWidth(s, 0, me.realFontSize))) * eX, s, me.realFontSize, SKINCOLOR_MAPLIST_TITLE, theAlpha, 0);\r
198         s = draw_TextShortenToWidth(MapInfo_Map_author, me.columnNameSize, 0,  me.realFontSize);\r
199         draw_Text(me.realUpperMargin2 * eY + (me.columnNameOrigin + 1.00 * (me.columnNameSize - draw_TextWidth(s, 0, me.realFontSize))) * eX, s, me.realFontSize, SKINCOLOR_MAPLIST_AUTHOR, theAlpha, 0);\r
200 \r
201         MapInfo_ClearTemps();\r
202 }\r
203 \r
204 void refilterVoretMapList(entity me)\r
205 {\r
206         float i, j, n;\r
207         string s;\r
208         float gt, f;\r
209         gt = MapInfo_CurrentGametype();\r
210         f = MapInfo_CurrentFeatures();\r
211         MapInfo_FilterGametype(gt, f, MapInfo_RequiredFlags(), MapInfo_ForbiddenFlags(), 0);\r
212         me.nItems = MapInfo_count;\r
213         for(i = 0; i < MapInfo_count; ++i)\r
214                 draw_PreloadPicture(strcat("/maps/", MapInfo_BSPName_ByID(i)));\r
215         if(me.g_maplistCache)\r
216                 strunzone(me.g_maplistCache);\r
217         s = "0";\r
218         for(i = 1; i < MapInfo_count; i *= 2)\r
219                 s = strcat(s, s);\r
220         n = tokenize_console(cvar_string("g_maplist"));\r
221         for(i = 0; i < n; ++i)\r
222         {\r
223                 j = MapInfo_FindName(argv(i));\r
224                 if(j >= 0)\r
225                         s = strcat(\r
226                                 substring(s, 0, j),\r
227                                 "1",\r
228                                 substring(s, j+1, MapInfo_count - (j+1))\r
229                         );\r
230         }\r
231         me.g_maplistCache = strzone(s);\r
232         if(gt != me.lastGametype || f != me.lastFeatures)\r
233         {\r
234                 me.lastGametype = gt;\r
235                 me.lastFeatures = f;\r
236                 me.setSelected(me, 0);\r
237         }\r
238 }\r
239 \r
240 void refilterCallbackVoretMapList(entity me, entity cb)\r
241 {\r
242         me.refilter(me);\r
243 }\r
244 \r
245 void MapList_All(entity btn, entity me)\r
246 {\r
247         float i;\r
248         string s;\r
249         MapInfo_FilterGametype(MAPINFO_TYPE_ALL, 0, 0, MAPINFO_FLAG_FORBIDDEN, 0); // all\r
250         s = "";\r
251         for(i = 0; i < MapInfo_count; ++i)\r
252                 s = strcat(s, " ", MapInfo_BSPName_ByID(i));\r
253         cvar_set("g_maplist", substring(s, 1, strlen(s) - 1));\r
254         me.refilter(me);\r
255 }\r
256 \r
257 void MapList_None(entity btn, entity me)\r
258 {\r
259         cvar_set("g_maplist", "");\r
260         me.refilter(me);\r
261 }\r
262 \r
263 void MapList_LoadMap(entity btn, entity me)\r
264 {\r
265         string m;\r
266         float i;\r
267 \r
268         i = me.selectedItem;\r
269 \r
270         if(btn.parent.instanceOfVoretMapInfoDialog)\r
271         {\r
272                 i = btn.parent.currentMapIndex;\r
273                 Dialog_Close(btn, btn.parent);\r
274         }\r
275 \r
276         if(i >= me.nItems || i < 0)\r
277                 return;\r
278 \r
279         m = MapInfo_BSPName_ByID(i);\r
280         if not(m)\r
281         {\r
282                 print("Huh? Can't play this (m is NULL). Refiltering so this won't happen again.\n");\r
283                 return;\r
284         }\r
285         if(MapInfo_CheckMap(m))\r
286         {\r
287                 localcmd("\nmenu_loadmap_prepare\n");\r
288                 if(cvar("menu_use_default_hostname"))\r
289                         localcmd("hostname \"", strdecolorize(cvar_string("_cl_name")), "'s Voret server\"\n");\r
290                 MapInfo_LoadMap(m);\r
291         }\r
292         else\r
293         {\r
294                 print("Huh? Can't play this (invalid game type). Refiltering so this won't happen again.\n");\r
295                 me.refilter(me);\r
296         }\r
297 }\r
298 \r
299 float keyDownVoretMapList(entity me, float scan, float ascii, float shift)\r
300 {\r
301         string ch, save;\r
302         if(scan == K_ENTER)\r
303         {\r
304                 // pop up map info screen\r
305                 main.mapInfoDialog.loadMapInfo(main.mapInfoDialog, me.selectedItem, me);\r
306                 DialogOpenButton_Click_withCoords(NULL, main.mapInfoDialog, me.origin + eX * (me.columnNameOrigin * me.size_x) + eY * ((me.itemHeight * me.selectedItem - me.scrollPos) * me.size_y), eY * me.itemAbsSize_y + eX * (me.itemAbsSize_x * me.columnNameSize));\r
307         }\r
308         else if(scan == K_SPACE)\r
309         {\r
310                 me.g_maplistCacheToggle(me, me.selectedItem);\r
311         }\r
312         else if(ascii == 43) // +\r
313         {\r
314                 if not(me.g_maplistCacheQuery(me, me.selectedItem))\r
315                         me.g_maplistCacheToggle(me, me.selectedItem);\r
316         }\r
317         else if(ascii == 45) // -\r
318         {\r
319                 if(me.g_maplistCacheQuery(me, me.selectedItem))\r
320                         me.g_maplistCacheToggle(me, me.selectedItem);\r
321         }\r
322         else if(scan == K_BACKSPACE)\r
323         {\r
324                 if(time < me.typeToSearchTime)\r
325                 {\r
326                         save = substring(me.typeToSearchString, 0, strlen(me.typeToSearchString) - 1);\r
327                         if(me.typeToSearchString)\r
328                                 strunzone(me.typeToSearchString);\r
329                         me.typeToSearchString = strzone(save);\r
330                         me.typeToSearchTime = time + 0.5;\r
331                         if(strlen(me.typeToSearchString))\r
332                         {\r
333                                 MapInfo_FindName(me.typeToSearchString);\r
334                                 if(MapInfo_FindName_firstResult >= 0)\r
335                                         me.setSelected(me, MapInfo_FindName_firstResult);\r
336                         }\r
337                 }\r
338         }\r
339         else if(ascii >= 32 && ascii != 127)\r
340         {\r
341                 ch = chr(ascii);\r
342                 if(time > me.typeToSearchTime)\r
343                         save = ch;\r
344                 else\r
345                         save = strcat(me.typeToSearchString, ch);\r
346                 if(me.typeToSearchString)\r
347                         strunzone(me.typeToSearchString);\r
348                 me.typeToSearchString = strzone(save);\r
349                 me.typeToSearchTime = time + 0.5;\r
350                 MapInfo_FindName(me.typeToSearchString);\r
351                 if(MapInfo_FindName_firstResult >= 0)\r
352                         me.setSelected(me, MapInfo_FindName_firstResult);\r
353         }\r
354         else\r
355                 return keyDownListBox(me, scan, ascii, shift);\r
356         return 1;\r
357 }\r
358 \r
359 #endif\r