]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blob - qcsrc/common/minigames/cl_minigames_hud.qc
50fd2bab58660bb0139d594523c6df20631ad87d
[xonotic/xonotic-data.pk3dir.git] / qcsrc / common / minigames / cl_minigames_hud.qc
1 #include "cl_minigames_hud.qh"
2 #include "minigames.qh"
3
4 // whether the mouse is over the given panel
5 bool HUD_mouse_over(entity somepanel)
6 {
7         vector pos = stov(cvar_string(strcat("hud_panel_", somepanel.panel_name, "_pos")));
8         vector sz = stov(cvar_string(strcat("hud_panel_", somepanel.panel_name, "_size")));
9         return mousepos_x >= pos_x*vid_conwidth  && mousepos_x <= (pos_x+sz_x)*vid_conwidth &&
10                mousepos_y >= pos_y*vid_conheight && mousepos_y <= (pos_y+sz_y)*vid_conheight ;
11 }
12
13 // ====================================================================
14 // Minigame Board
15 // ====================================================================
16
17 // Draws the minigame game board
18 void HUD_MinigameBoard ()
19 {
20         entity hud_minigame = world;
21
22         if(!autocvar__hud_configure)
23                 hud_minigame = active_minigame.descriptor;
24         else
25                 hud_minigame = minigame_get_descriptor("nmm");
26
27         if ( !hud_minigame )
28                 return;
29
30         HUD_Panel_UpdateCvars();
31
32
33         vector pos, mySize;
34         pos = panel_pos;
35         mySize = panel_size;
36
37         hud_minigame.minigame_hud_board(pos,mySize);
38 }
39
40 // ====================================================================
41 // Minigame Status
42 // ====================================================================
43 // Draws the minigame status panel
44 void HUD_MinigameStatus ()
45 {
46         entity hud_minigame = world;
47
48         if(!autocvar__hud_configure)
49                 hud_minigame = active_minigame.descriptor;
50         else
51                 hud_minigame = minigame_get_descriptor("nmm");
52
53         if ( !hud_minigame )
54                 return;
55
56         HUD_Panel_UpdateCvars();
57
58
59         vector pos, mySize;
60         pos = panel_pos;
61         mySize = panel_size;
62
63         if(panel_bg_padding)
64         {
65                 pos += '1 1 0' * panel_bg_padding;
66                 mySize -= '2 2 0' * panel_bg_padding;
67         }
68
69         hud_minigame.minigame_hud_status(pos,mySize);
70 }
71
72 // ====================================================================
73 // Minigame Menu
74 // ====================================================================
75
76 // Minigame menu options: list head
77 entity HUD_MinigameMenu_entries;
78 // Minigame menu options: list tail
79 entity HUD_MinigameMenu_last_entry;
80
81 // Minigame menu options: insert entry after the given location
82 void HUD_MinigameMenu_InsertEntry(entity newentry, entity prev)
83 {
84         if ( !HUD_MinigameMenu_entries )
85         {
86                 HUD_MinigameMenu_entries = newentry;
87                 HUD_MinigameMenu_last_entry = newentry;
88                 return;
89         }
90
91         newentry.list_prev = prev;
92         newentry.list_next = prev.list_next;
93         if ( prev.list_next )
94                 prev.list_next.list_prev = newentry;
95         else
96                 HUD_MinigameMenu_last_entry = newentry;
97         prev.list_next = newentry;
98
99 }
100
101
102 // minigame menu item uder the mouse
103 entity HUD_MinigameMenu_activeitem;
104
105 // Click the given item
106 void HUD_MinigameMenu_Click(entity menuitem)
107 {SELFPARAM();
108         if ( menuitem )
109         {
110                 WITH(entity, self, menuitem, menuitem.use());
111         }
112 }
113
114 // Minigame menu options: Remove the given entry
115 // Precondition: the given entry is actually in the list
116 void HUD_MinigameMenu_EraseEntry ( entity e )
117 {
118         // remove child items (if any)
119         if ( e.flags & 2 )
120         {
121                 HUD_MinigameMenu_Click(e);
122         }
123
124         if ( e.list_prev )
125                 e.list_prev.list_next = e.list_next;
126         else
127                 HUD_MinigameMenu_entries = e.list_next;
128
129         if ( e.list_next )
130                 e.list_next.list_prev = e.list_prev;
131         else
132                 HUD_MinigameMenu_last_entry = e.list_prev;
133
134         if ( HUD_MinigameMenu_activeitem == e )
135                 HUD_MinigameMenu_activeitem = world;
136
137         remove(e);
138 }
139
140 // Minigame menu options: create entry
141 entity HUD_MinigameMenu_SpawnEntry(string s, vector offset, vector fontsize, vector color,void() click)
142 {
143         entity entry = spawn();
144         entry.message = s;
145         entry.origin = offset;
146         entry.size = fontsize;
147         entry.colormod = color;
148         entry.flags = 0;
149         entry.use = click;
150         panel_pos_y += fontsize_y;
151         return entry;
152 }
153
154 // Spawn a child entry of a collapsable entry
155 entity HUD_MinigameMenu_SpawnSubEntry(string s, void() click, entity parent)
156 {
157         vector item_fontsize = hud_fontsize*1.25;
158         vector item_offset = '1 0 0' * item_fontsize_x;
159         entity item = HUD_MinigameMenu_SpawnEntry(
160                                 s,item_offset,item_fontsize,'0.8 0.8 0.8', click );
161         item.owner = parent;
162         return item;
163 }
164
165 // Click action for Create sub-entries
166 void HUD_MinigameMenu_ClickCreate_Entry()
167 {SELFPARAM();
168         minigame_cmd("create ",self.netname);
169 }
170
171 // Helper click action for collapsible entries
172 // returns true when you have to create the sub-entries
173 bool HUD_MinigameMenu_Click_ExpandCollapse()
174 {SELFPARAM();
175         entity e;
176         if ( self.flags & 2 )
177         {
178                 if ( HUD_MinigameMenu_activeitem &&
179                                 HUD_MinigameMenu_activeitem.owner == self )
180                         HUD_MinigameMenu_activeitem = world;
181                 self.flags &= ~2;
182                 for ( e = self.list_next; e != world && e.owner == self; e = self.list_next )
183                 {
184                         if ( e.flags & 2 )
185                                 HUD_MinigameMenu_Click(e);
186                         self.list_next = e.list_next;
187                         remove(e);
188                 }
189                 if ( self.list_next )
190                         self.list_next.list_prev = self;
191                 else
192                         HUD_MinigameMenu_last_entry = self;
193         }
194         else
195         {
196                 for ( e = HUD_MinigameMenu_entries; e != world; e = e.list_next )
197                 {
198                         if ( e.flags & 2 && e.origin_x == self.origin_x)
199                                 HUD_MinigameMenu_Click(e);
200                 }
201
202                 self.flags |= 2;
203
204                 return true;
205         }
206         return false;
207 }
208
209 // Click action for the Create menu
210 void HUD_MinigameMenu_ClickCreate()
211 {SELFPARAM();
212         if ( HUD_MinigameMenu_Click_ExpandCollapse() )
213         {
214                 entity curr;
215                 entity prev = self;
216                 FOREACH(Minigames, true, {
217                         curr = HUD_MinigameMenu_SpawnSubEntry(it.message, HUD_MinigameMenu_ClickCreate_Entry, self);
218                         curr.netname = it.netname;
219                         curr.model = strzone(minigame_texture(strcat(it.netname,"/icon")));
220                         HUD_MinigameMenu_InsertEntry( curr, prev );
221                         prev = curr;
222                 });
223         }
224 }
225
226 // Click action for Join sub-entries
227 void HUD_MinigameMenu_ClickJoin_Entry()
228 {SELFPARAM();
229         minigame_cmd("join ",self.netname);
230         HUD_MinigameMenu_EraseEntry(self);
231 }
232
233 // Click action for the Join menu
234 void HUD_MinigameMenu_ClickJoin()
235 {SELFPARAM();
236         if ( HUD_MinigameMenu_Click_ExpandCollapse() )
237         {
238                 entity e = world;
239                 entity curr;
240                 entity prev = self;
241                 while( (e = find(e,classname,"minigame")) )
242                 {
243                         if ( e != active_minigame )
244                         {
245                                 curr = HUD_MinigameMenu_SpawnSubEntry(
246                                         e.netname, HUD_MinigameMenu_ClickJoin_Entry, self );
247                                 curr.netname = e.netname;
248                                 curr.model = strzone(minigame_texture(strcat(e.descriptor.netname,"/icon")));
249                                 HUD_MinigameMenu_InsertEntry( curr, prev );
250                                 prev = curr;
251                         }
252                 }
253         }
254 }
255
256 /*// Temporary placeholder for un-implemented Click actions
257 void HUD_MinigameMenu_ClickNoop()
258 {
259         dprint("Placeholder for ",self.message,"\n");
260 }*/
261
262 // Click action for Quit
263 void HUD_MinigameMenu_ClickQuit()
264 {
265         deactivate_minigame();
266         minigame_cmd("end");
267 }
268
269 // Click action for Invite sub-entries
270 void HUD_MinigameMenu_ClickInvite_Entry()
271 {SELFPARAM();
272         minigame_cmd("invite #",self.netname);
273 }
274
275 // Click action for the Invite menu
276 void HUD_MinigameMenu_ClickInvite()
277 {SELFPARAM();
278         if ( HUD_MinigameMenu_Click_ExpandCollapse() )
279         {
280                 entity e;
281                 entity prev = self;
282                 for(int i = 0; i < maxclients; ++i)
283                 {
284                         if ( player_localnum != i && playerslots[i] && entcs_GetName(i) != "" &&
285                                 !findfloat(world,minigame_playerslot,i+1) && playerslots[i].ping )
286                         {
287                                 e = HUD_MinigameMenu_SpawnSubEntry(
288                                         strzone(entcs_GetName(i)), HUD_MinigameMenu_ClickInvite_Entry,
289                                         self );
290                                 e.flags |= 1;
291                                 e.netname = strzone(ftos(i+1));
292                                 e.origin_x *= 2;
293                                 HUD_MinigameMenu_InsertEntry(e,prev);
294                                 prev = e;
295                         }
296                 }
297         }
298 }
299
300 void HUD_MinigameMenu_ClickCustomEntry()
301 {SELFPARAM();
302         if ( active_minigame )
303                 active_minigame.minigame_event(active_minigame,"menu_click",self.netname);
304 }
305
306 // Adds a game-specific entry to the menu
307 void HUD_MinigameMenu_CustomEntry(entity parent, string menumessage, string event_arg)
308 {
309         entity e = HUD_MinigameMenu_SpawnSubEntry(
310                 menumessage, HUD_MinigameMenu_ClickCustomEntry, parent );
311         e.netname = event_arg;
312         HUD_MinigameMenu_InsertEntry(e, parent);
313         //dprint("CustomEntry ",ftos(num_for_edict(parent))," ",menumessage," ",event_arg,"\n");
314 }
315
316 // Click action for the Current Game menu
317 void HUD_MinigameMenu_ClickCurrentGame()
318 {SELFPARAM();
319         if ( HUD_MinigameMenu_Click_ExpandCollapse() )
320         {
321                 HUD_MinigameMenu_InsertEntry( HUD_MinigameMenu_SpawnSubEntry(
322                         _("Quit"), HUD_MinigameMenu_ClickQuit, self ), self);
323
324                 active_minigame.minigame_event(active_minigame,"menu_show",self);
325
326                 HUD_MinigameMenu_InsertEntry( HUD_MinigameMenu_SpawnSubEntry(
327                         _("Invite"), HUD_MinigameMenu_ClickInvite, self), self);
328         }
329 }
330 // Whether the minigame menu panel is open
331 bool HUD_MinigameMenu_IsOpened()
332 {
333         return HUD_MinigameMenu_entries != NULL;
334 }
335
336 // Close the minigame menu panel
337 void HUD_MinigameMenu_Close()
338 {
339         if ( HUD_MinigameMenu_IsOpened() )
340         {
341                 entity e, p;
342                 for ( e = HUD_MinigameMenu_entries; e != world; e = p )
343                 {
344                         p = e.list_next;
345                         remove(e);
346                 }
347                 HUD_MinigameMenu_entries = world;
348                 HUD_MinigameMenu_last_entry = world;
349                 HUD_MinigameMenu_activeitem = world;
350                 if(autocvar_hud_cursormode)
351                 if ( !autocvar__hud_configure )
352                         setcursormode(0);
353         }
354 }
355
356 // toggle a button to manage the current game
357 void HUD_MinigameMenu_CurrentButton()
358 {
359         entity e;
360         if ( active_minigame )
361         {
362                 for ( e = HUD_MinigameMenu_last_entry; e != world; e = e.list_prev )
363                         if ( e.classname == "hud_minigamemenu_exit" )
364                         {
365                                 HUD_MinigameMenu_EraseEntry(e);
366                                 break;
367                         }
368                 entity currb = HUD_MinigameMenu_SpawnEntry(
369                         _("Current Game"), '0 0 0', hud_fontsize*1.5,'0.7 0.84 1', HUD_MinigameMenu_ClickCurrentGame );
370                 currb.classname = "hud_minigamemenu_current";
371                 currb.model = strzone(minigame_texture(strcat(active_minigame.descriptor.netname,"/icon")));
372                 HUD_MinigameMenu_InsertEntry(currb,HUD_MinigameMenu_last_entry);
373                 HUD_MinigameMenu_Click(currb);
374         }
375         else
376         {
377                 entity p;
378                 for ( e = HUD_MinigameMenu_last_entry; e != world; e = p.list_prev )
379                 {
380                         p = e;
381                         if ( e.classname == "hud_minigamemenu_current" )
382                         {
383                                 p = e.list_next;
384                                 if ( !p )
385                                         p = HUD_MinigameMenu_last_entry;
386                                 HUD_MinigameMenu_EraseEntry(e);
387                                 break;
388                         }
389                 }
390                 for ( e = HUD_MinigameMenu_last_entry; e != world; e = e.list_prev )
391                         if ( e.classname == "hud_minigamemenu_exit" )
392                                 return;
393                 entity exit = HUD_MinigameMenu_SpawnEntry(
394                         _("Exit Menu"),'0 0 0',hud_fontsize*1.5,'0.7 0.84 1', HUD_MinigameMenu_Close);
395                 exit.classname = "hud_minigamemenu_exit";
396                 HUD_MinigameMenu_InsertEntry ( exit, HUD_MinigameMenu_last_entry );
397         }
398 }
399
400 // Open the minigame menu panel
401 void HUD_MinigameMenu_Open()
402 {
403         if ( !HUD_MinigameMenu_IsOpened() )
404         {
405                 HUD_MinigameMenu_InsertEntry( HUD_MinigameMenu_SpawnEntry(
406                         _("Create"), '0 0 0', hud_fontsize*1.5,'0.7 0.84 1', HUD_MinigameMenu_ClickCreate),
407                         HUD_MinigameMenu_last_entry );
408                 HUD_MinigameMenu_InsertEntry ( HUD_MinigameMenu_SpawnEntry(
409                         _("Join"),'0 0 0',hud_fontsize*1.5,'0.7 0.84 1', HUD_MinigameMenu_ClickJoin),
410                         HUD_MinigameMenu_last_entry );
411                 HUD_MinigameMenu_CurrentButton();
412                 HUD_MinigameMenu_activeitem = world;
413                 if(autocvar_hud_cursormode)
414                         setcursormode(1);
415         }
416 }
417
418 // Handles mouse input on to minigame menu panel
419 void HUD_MinigameMenu_MouseInput()
420 {
421         panel = HUD_PANEL(MINIGAME_MENU);
422
423         HUD_Panel_UpdateCvars();
424
425         if(panel_bg_padding)
426         {
427                 panel_pos += '1 1 0' * panel_bg_padding;
428                 panel_size -= '2 2 0' * panel_bg_padding;
429         }
430
431         entity e;
432
433         panel_pos_y += hud_fontsize_y*2;
434
435         HUD_MinigameMenu_activeitem = world;
436         vector sz;
437         for ( e = HUD_MinigameMenu_entries; e != world; e = e.list_next )
438         {
439                 sz = eX*panel_size_x + eY*e.size_y;
440                 if ( e.model )
441                         sz_y = 22;
442                 if ( !HUD_MinigameMenu_activeitem && mousepos_y >= panel_pos_y && mousepos_y <= panel_pos_y + sz_y )
443                 {
444                         HUD_MinigameMenu_activeitem = e;
445                 }
446                 panel_pos_y += sz_y;
447         }
448 }
449
450 // Draw a menu entry
451 void HUD_MinigameMenu_DrawEntry(vector pos, string s, vector fontsize, vector color)
452 {
453         minigame_drawstring_trunc(panel_size_x-pos_x+panel_pos_x, pos, s,
454                                                           fontsize, color, panel_fg_alpha, DRAWFLAG_NORMAL);
455 }
456 // Draw a color-coded menu
457 void HUD_MinigameMenu_DrawColoredEntry(vector pos, string s, vector fontsize)
458 {
459         minigame_drawcolorcodedstring_trunc(panel_size_x-pos_x+panel_pos_x, pos, s,
460                                                           fontsize, panel_fg_alpha, DRAWFLAG_NORMAL);
461 }
462
463 // Minigame menu panel UI
464 void HUD_MinigameMenu ()
465 {
466         if ( !HUD_MinigameMenu_IsOpened() )
467                 return;
468
469         HUD_Panel_UpdateCvars();
470
471         HUD_Panel_DrawBg(1);
472
473         if(panel_bg_padding)
474         {
475                 panel_pos += '1 1 0' * panel_bg_padding;
476                 panel_size -= '2 2 0' * panel_bg_padding;
477         }
478
479         HUD_MinigameMenu_DrawEntry(panel_pos,_("Minigames"),hud_fontsize*2,'0.25 0.47 0.72');
480         panel_pos_y += hud_fontsize_y*2;
481
482         vector color;
483         vector offset;
484         float itemh;
485         vector imgsz = '22 22 0'; // NOTE: if changed, edit where HUD_MinigameMenu_activeitem is selected
486         for ( entity e = HUD_MinigameMenu_entries; e != world; e = e.list_next )
487         {
488                 color = e.colormod;
489
490                 offset = e.origin;
491                 itemh = e.size_y;
492
493                 if ( e.model )
494                         itemh = imgsz_y;
495
496                 if ( e.flags & 2 )
497                 {
498                         drawfill(panel_pos, eX*panel_size_x + eY*itemh, e.colormod,
499                                         panel_fg_alpha, DRAWFLAG_NORMAL);
500                         color = '0 0 0';
501                 }
502
503                 if ( e.model )
504                 {
505                         drawpic( panel_pos+offset, e.model, imgsz, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL );
506                         offset_x += imgsz_x;
507                         offset_y = (imgsz_y-e.size_y) / 2;
508                 }
509
510                 if ( e.flags & 1 )
511                         HUD_MinigameMenu_DrawColoredEntry(panel_pos+offset,e.message,e.size);
512                 else
513                         HUD_MinigameMenu_DrawEntry(panel_pos+offset,e.message,e.size,color);
514
515                 if ( e == HUD_MinigameMenu_activeitem )
516                         drawfill(panel_pos, eX*panel_size_x + eY*itemh,'1 1 1', 0.25, DRAWFLAG_ADDITIVE);
517
518                 panel_pos_y += itemh;
519         }
520 }
521
522 // ====================================================================
523 // Minigame Help Panel
524 // ====================================================================
525
526 void HUD_MinigameHelp()
527 {
528         string help_message;
529
530         if(!autocvar__hud_configure)
531                 help_message = active_minigame.message;
532         else
533                 help_message = "Minigame message";
534
535         if ( !help_message )
536                 return;
537
538         HUD_Panel_UpdateCvars();
539
540
541         vector pos, mySize;
542         pos = panel_pos;
543         mySize = panel_size;
544
545         if(panel_bg_padding)
546         {
547                 pos += '1 1 0' * panel_bg_padding;
548                 mySize -= '2 2 0' * panel_bg_padding;
549         }
550
551         minigame_drawcolorcodedstring_wrapped( mySize_x, pos, help_message,
552                 hud_fontsize, panel_fg_alpha, DRAWFLAG_NORMAL, 0.5 );
553 }
554
555 // ====================================================================
556 // Minigame Panel Input
557 // ====================================================================
558 float HUD_Minigame_InputEvent(float bInputType, float nPrimary, float nSecondary)
559 {
560
561         if( !HUD_MinigameMenu_IsOpened() || autocvar__hud_configure )
562                 return false;
563
564         if(bInputType == 3)
565         {
566                 mousepos_x = nPrimary;
567                 mousepos_y = nSecondary;
568                 if ( minigame_isactive() && HUD_mouse_over(HUD_PANEL(MINIGAME_BOARD)) )
569                         active_minigame.minigame_event(active_minigame,"mouse_moved",mousepos);
570                 return true;
571
572         }
573         else
574         {
575                 if(bInputType == 0) {
576                         if(nPrimary == K_ALT) hudShiftState |= S_ALT;
577                         if(nPrimary == K_CTRL) hudShiftState |= S_CTRL;
578                         if(nPrimary == K_SHIFT) hudShiftState |= S_SHIFT;
579                         if(nPrimary == K_MOUSE1) mouseClicked |= S_MOUSE1;
580                         if(nPrimary == K_MOUSE2) mouseClicked |= S_MOUSE2;
581                 }
582                 else if(bInputType == 1) {
583                         if(nPrimary == K_ALT) hudShiftState -= (hudShiftState & S_ALT);
584                         if(nPrimary == K_CTRL) hudShiftState -= (hudShiftState & S_CTRL);
585                         if(nPrimary == K_SHIFT) hudShiftState -= (hudShiftState & S_SHIFT);
586                         if(nPrimary == K_MOUSE1) mouseClicked -= (mouseClicked & S_MOUSE1);
587                         if(nPrimary == K_MOUSE2) mouseClicked -= (mouseClicked & S_MOUSE2);
588                 }
589
590                 // allow some binds
591                 string con_keys;
592                 con_keys = findkeysforcommand("toggleconsole", 0);
593                 int keys = tokenize(con_keys); // findkeysforcommand returns data for this
594                 for (int i = 0; i < keys; ++i)
595                 {
596                         if(nPrimary == stof(argv(i)))
597                                 return false;
598                 }
599
600                 if ( minigame_isactive() && ( bInputType == 0 || bInputType == 1 ) )
601                 {
602                         string device = "";
603                         string action = bInputType == 0 ? "pressed" : "released";
604                         if ( nPrimary >= K_MOUSE1 && nPrimary <= K_MOUSE16 )
605                         {
606                                 if ( HUD_mouse_over(HUD_PANEL(MINIGAME_BOARD)) )
607                                         device = "mouse";
608                         }
609                         else
610                                 device = "key";
611
612                         if ( device && active_minigame.minigame_event(
613                                         active_minigame,strcat(device,"_",action),nPrimary) )
614                                 return true;
615
616                         /// TODO: bInputType == 2?
617                 }
618
619                 if ( bInputType == 0 )
620                 {
621                         if ( nPrimary == K_MOUSE1 && HUD_MinigameMenu_activeitem &&
622                                 HUD_mouse_over(HUD_PANEL(MINIGAME_MENU)) )
623                         {
624                                 HUD_MinigameMenu_Click(HUD_MinigameMenu_activeitem);
625                                 return true;
626                         }
627                         if ( nPrimary == K_UPARROW || nPrimary == K_KP_UPARROW )
628                         {
629                                 if ( HUD_MinigameMenu_activeitem && HUD_MinigameMenu_activeitem.list_prev )
630                                         HUD_MinigameMenu_activeitem = HUD_MinigameMenu_activeitem.list_prev;
631                                 else
632                                         HUD_MinigameMenu_activeitem = HUD_MinigameMenu_last_entry;
633                                 return true;
634                         }
635                         else if ( nPrimary == K_DOWNARROW || nPrimary == K_KP_DOWNARROW )
636                         {
637                                 if ( HUD_MinigameMenu_activeitem && HUD_MinigameMenu_activeitem.list_next )
638                                         HUD_MinigameMenu_activeitem = HUD_MinigameMenu_activeitem.list_next;
639                                 else
640                                         HUD_MinigameMenu_activeitem = HUD_MinigameMenu_entries;
641                                 return true;
642                         }
643                         else if ( nPrimary == K_HOME || nPrimary == K_KP_HOME )
644                         {
645                                 HUD_MinigameMenu_activeitem = HUD_MinigameMenu_entries;
646                                 return true;
647                         }
648                         else if ( nPrimary == K_END || nPrimary == K_KP_END )
649                         {
650                                 HUD_MinigameMenu_activeitem = HUD_MinigameMenu_entries;
651                                 return true;
652                         }
653                         else if ( nPrimary == K_KP_ENTER || nPrimary == K_ENTER || nPrimary == K_SPACE )
654                         {
655                                 HUD_MinigameMenu_Click(HUD_MinigameMenu_activeitem);
656                                 return true;
657                         }
658                         else if ( nPrimary == K_ESCAPE )
659                         {
660                                 HUD_MinigameMenu_Close();
661                                 return true;
662                         }
663                 }
664         }
665
666         return false;
667
668 }
669
670 void HUD_Minigame_Mouse()
671 {
672         if( !HUD_MinigameMenu_IsOpened() || autocvar__hud_configure || mv_active )
673                 return;
674
675         if(!autocvar_hud_cursormode)
676         {
677                 mousepos = mousepos + getmousepos() * autocvar_menu_mouse_speed;
678
679                 mousepos_x = bound(0, mousepos_x, vid_conwidth);
680                 mousepos_y = bound(0, mousepos_y, vid_conheight);
681         }
682
683         if ( HUD_MinigameMenu_IsOpened() && HUD_mouse_over(HUD_PANEL(MINIGAME_MENU)) )
684                 HUD_MinigameMenu_MouseInput();
685
686         draw_cursor_normal(mousepos, '1 1 1', panel_fg_alpha);
687 }
688
689 bool HUD_Minigame_Showpanels()
690 {
691         return (HUD_MinigameMenu_IsOpened() && minigame_isactive());
692 }