1 ///////////////////////////////////////////////
3 ///////////////////////
4 // This file belongs to dpmod/darkplaces
5 // AK contains all menu functions (especially the required ones)
6 ///////////////////////////////////////////////
8 float mouseButtonsPressed;
15 float menuLoadedMaplist;
16 float menuNotTheFirstFrame;
25 void() m_init_delayed =
29 menuLoadedMaplist = 0;
31 if(!MapInfo_FilterGametype(MAPINFO_TYPE_ALL, 0, 1))
33 menuLoadedMaplist = 1;
37 if(cvar("developer") == 42)
38 draw_currentSkin = "qcsrc/menu-div0test/xawskin";
40 draw_currentSkin = "qcsrc/menu-div0test/defaultskin";
41 // TODO load SKIN constants from file later
43 draw_setMousePointer("cursor");
45 main = spawnMainWindow(); main.configureMainWindow(main);
47 main.resizeNotify(main, draw_shift, draw_scale, draw_shift, draw_scale);
52 m_display(); // delayed menu display
55 void(float key, float ascii) m_keyup =
57 if(!menuLoadedMaplist)
62 main.keyUp(main, key, ascii, menuShiftState);
63 if(key >= K_MOUSE1 && key <= K_MOUSE3)
65 --mouseButtonsPressed;
66 if(!mouseButtonsPressed)
67 main.mouseRelease(main, menuMousePos);
68 if(mouseButtonsPressed < 0)
70 mouseButtonsPressed = 0;
71 print("Warning: released an already released button\n");
74 if(key == K_ALT) menuShiftState -= (menuShiftState & S_ALT);
75 if(key == K_CTRL) menuShiftState -= (menuShiftState & S_CTRL);
76 if(key == K_SHIFT) menuShiftState -= (menuShiftState & S_SHIFT);
79 void(float key, float ascii) m_keydown =
81 if(!menuLoadedMaplist)
90 e.keyGrabbed(e, key, ascii);
95 if(!main.keyDown(main, key, ascii, menuShiftState))
97 if(gamestatus & (GAME_ISSERVER | GAME_CONNECTED)) // don't back out to console only
98 m_hide(); // disable menu on unhandled ESC
99 if(key >= K_MOUSE1 && key <= K_MOUSE3)
100 if(!mouseButtonsPressed)
101 main.mousePress(main, menuMousePos);
103 if(key >= K_MOUSE1 && key <= K_MOUSE3)
105 ++mouseButtonsPressed;
106 if(mouseButtonsPressed > 10)
108 mouseButtonsPressed = 10;
109 print("Warning: pressed an already pressed button\n");
112 if(key == K_ALT) menuShiftState |= S_ALT;
113 if(key == K_CTRL) menuShiftState |= S_CTRL;
114 if(key == K_SHIFT) menuShiftState |= S_SHIFT;
122 if(!menuNotTheFirstFrame)
124 menuNotTheFirstFrame = 1;
126 if(!cvar("menu_video_played"))
128 localcmd("set menu_video_played 1; cd loop 1; play sound/announcer/male/welcome.ogg\n");
129 menuLogoAlpha = -2; // no idea why, but when I start this at zero, it jumps instead of fading
132 if(!menuLoadedMaplist)
134 // TODO draw an info image about this situation
139 realFrametime = frametime = min(0.2, t - menuPrevTime);
143 if(getkeydest() == KEY_MENU || getkeydest() == KEY_MENU_GRABBED)
145 setkeydest(keyGrabber ? KEY_MENU_GRABBED : KEY_MENU);
150 if(getmousetarget() != MT_MENU)
154 if(cvar("cl_capturevideo"))
155 frametime = 1 / cvar("cl_capturevideo_fps"); // make capturevideo work smoothly
157 prevMenuAlpha = menuAlpha;
160 if(menuAlpha == 0 && menuLogoAlpha < 3)
162 menuLogoAlpha = menuLogoAlpha + frametime * 5;
166 menuAlpha = min(1, menuAlpha + frametime * 5);
171 menuAlpha = max(0, menuAlpha - frametime * 5);
175 if(!(gamestatus & (GAME_CONNECTED | GAME_ISSERVER)))
179 sz = draw_PictureSize(SKINGFX_BACKGROUND);
180 // keep aspect of image
181 if(sz_x * draw_scale_y >= sz_y * draw_scale_x)
183 // that is, sz_x/sz_y >= draw_scale_x/draw_scale_y
184 // match up the height
186 isz_x = isz_y * (sz_x / sz_y) * (draw_scale_y / draw_scale_x);
190 // that is, sz_x/sz_y <= draw_scale_x/draw_scale_y
191 // match up the width
193 isz_y = isz_x * (sz_y / sz_x) * (draw_scale_x / draw_scale_y);
195 draw_Picture('0.5 0.5 0' - 0.5 * isz, SKINGFX_BACKGROUND, isz, '1 1 1', bound(0, menuLogoAlpha, 1));
200 if(prevMenuAlpha > 0)
201 main.initializeDialog(main, main.firstChild);
208 gamestatus = gamestatus | GAME_ISSERVER;
209 if(clientstate() == CS_CONNECTED)
210 gamestatus = gamestatus | GAME_CONNECTED;
211 if(cvar("developer"))
212 gamestatus = gamestatus | GAME_DEVELOPER;
214 draw_alpha *= menuAlpha;
219 dMouse = getmousepos();
220 dMouse *= frametime / realFrametime; // for capturevideo
221 if(dMouse != '0 0 0')
223 dMouse = globalToBoxSize(dMouse, draw_scale);
224 menuMousePos += dMouse * 1; // TODO use a cvar here
225 menuMousePos_x = bound(0, menuMousePos_x, 1);
226 menuMousePos_y = bound(0, menuMousePos_y, 1);
227 if(mouseButtonsPressed)
228 main.mouseDrag(main, menuMousePos);
230 main.mouseMove(main, menuMousePos);
234 draw_drawMousePointer(menuMousePos);
242 setkeydest(KEY_MENU);
243 setmousetarget(MT_MENU);
245 if(!menuLoadedMaplist)
248 if(mouseButtonsPressed)
249 main.mouseRelease(main, menuMousePos);
250 mouseButtonsPressed = 0;
252 main.focusEnter(main);
253 main.showNotify(main);
259 setkeydest(KEY_GAME);
260 setmousetarget(MT_CLIENT);
262 if(!menuLoadedMaplist)
265 main.focusLeave(main);
266 main.hideNotify(main);
282 void(string itemname) m_goto =
285 if(!menuLoadedMaplist)
287 if(itemname == "") // this can be called by GameCommand
289 if(gamestatus & (GAME_ISSERVER | GAME_CONNECTED))
293 main.initializeDialog(main, main.firstChild);
299 e = findstring(NULL, name, itemname);
300 if(e && e.parent == main)
303 main.initializeDialog(main, e);