m_menu.h 15.4 KB
Newer Older
Alam Ed Arias committed
1 2 3 4
// SONIC ROBO BLAST 2
//-----------------------------------------------------------------------------
// Copyright (C) 1993-1996 by id Software, Inc.
// Copyright (C) 1998-2000 by DooM Legacy Team.
5
// Copyright (C) 2011-2016 by Matthew "Kaito Sinclaire" Walsh.
James R. committed
6
// Copyright (C) 1999-2020 by Sonic Team Junior.
Alam Ed Arias committed
7 8 9 10 11 12 13 14 15 16 17
//
// This program is free software distributed under the
// terms of the GNU General Public License, version 2.
// See the 'LICENSE' file for more details.
//-----------------------------------------------------------------------------
/// \file  m_menu.h
/// \brief Menu widget stuff, selection and such

#ifndef __X_MENU__
#define __X_MENU__

18
#include "doomstat.h" // for NUMGAMETYPES
Alam Ed Arias committed
19 20
#include "d_event.h"
#include "command.h"
21
#include "f_finale.h" // for ttmode_enum
22 23 24
#include "i_threads.h"
#include "mserv.h"
#include "r_things.h" // for SKINNAMESIZE
Alam Ed Arias committed
25

26 27 28
// Compatibility with old-style named NiGHTS replay files.
#define OLDNREPLAYNAME

Alam Ed Arias committed
29 30 31
//
// MENUS
//
32

Marco Z committed
33 34 35 36 37
// If menu hierarchies go deeper, change this up to 5.
// Zero-based, inclusive.
#define NUMMENULEVELS 3
#define MENUBITS 6

38
// Menu IDs sectioned by numeric places to signify hierarchy
colette committed
39 40 41
/**
 * IF YOU MODIFY THIS, MODIFY MENUTYPES_LIST[] IN dehacked.c TO MATCH.
 */
42 43
typedef enum
{
Marco Z committed
44
	MN_NONE,
45

Marco Z committed
46
	MN_MAIN,
47 48

	// Single Player
Marco Z committed
49
	MN_SP_MAIN,
50

Marco Z committed
51 52
	MN_SP_LOAD,
	MN_SP_PLAYER,
53

Marco Z committed
54 55
	MN_SP_LEVELSELECT,
	MN_SP_LEVELSTATS,
56

Marco Z committed
57 58 59 60 61
	MN_SP_TIMEATTACK,
	MN_SP_TIMEATTACK_LEVELSELECT,
	MN_SP_GUESTREPLAY,
	MN_SP_REPLAY,
	MN_SP_GHOST,
62

Marco Z committed
63 64 65 66 67
	MN_SP_NIGHTSATTACK,
	MN_SP_NIGHTS_LEVELSELECT,
	MN_SP_NIGHTS_GUESTREPLAY,
	MN_SP_NIGHTS_REPLAY,
	MN_SP_NIGHTS_GHOST,
68

69 70
	MN_SP_MARATHON,

71
	// Multiplayer
Marco Z committed
72 73 74 75 76 77
	MN_MP_MAIN,
	MN_MP_SPLITSCREEN, // SplitServer
	MN_MP_SERVER,
	MN_MP_CONNECT,
	MN_MP_ROOM,
	MN_MP_PLAYERSETUP, // MP_PlayerSetupDef shared with SPLITSCREEN if #defined NONET
James R. committed
78
	MN_MP_SERVER_OPTIONS,
79

80
	// Options
Marco Z committed
81
	MN_OP_MAIN,
Marco Z committed
82

Marco Z committed
83 84 85 86 87
	MN_OP_P1CONTROLS,
	MN_OP_CHANGECONTROLS, // OP_ChangeControlsDef shared with P2
	MN_OP_P1MOUSE,
	MN_OP_P1JOYSTICK,
	MN_OP_JOYSTICKSET, // OP_JoystickSetDef shared with P2
88
	MN_OP_P1CAMERA,
89

Marco Z committed
90 91 92
	MN_OP_P2CONTROLS,
	MN_OP_P2MOUSE,
	MN_OP_P2JOYSTICK,
93
	MN_OP_P2CAMERA,
94

95 96
	MN_OP_PLAYSTYLE,

Marco Z committed
97 98 99 100 101
	MN_OP_VIDEO,
	MN_OP_VIDEOMODE,
	MN_OP_COLOR,
	MN_OP_OPENGL,
	MN_OP_OPENGL_LIGHTING,
102

Marco Z committed
103
	MN_OP_SOUND,
Marco Z committed
104

Marco Z committed
105 106
	MN_OP_SERVER,
	MN_OP_MONITORTOGGLE,
Marco Z committed
107

Marco Z committed
108 109 110 111
	MN_OP_DATA,
	MN_OP_ADDONS,
	MN_OP_SCREENSHOTS,
	MN_OP_ERASEDATA,
Marco Z committed
112

sphere committed
113
	// Extras
Marco Z committed
114 115 116 117 118
	MN_SR_MAIN,
	MN_SR_PANDORA,
	MN_SR_LEVELSELECT,
	MN_SR_UNLOCKCHECKLIST,
	MN_SR_EMBLEMHINT,
119
	MN_SR_PLAYER,
toaster committed
120
	MN_SR_SOUNDTEST,
Marco Z committed
121

122
	// Addons (Part of MISC, but let's make it our own)
Marco Z committed
123
	MN_AD_MAIN,
Marco Z committed
124

125
	// MISC
Marco Z committed
126 127
	// MN_MESSAGE,
	// MN_SPAUSE,
Marco Z committed
128

Marco Z committed
129 130 131 132
	// MN_MPAUSE,
	// MN_SCRAMBLETEAM,
	// MN_CHANGETEAM,
	// MN_CHANGELEVEL,
Marco Z committed
133

Marco Z committed
134 135
	// MN_MAPAUSE,
	// MN_HELP,
Marco Z committed
136

Marco Z committed
137
	MN_SPECIAL,
Marco Z committed
138
	NUMMENUTYPES,
Marco Z committed
139
} menutype_t; // up to 63; MN_SPECIAL = 53
140 141 142
#define MTREE2(a,b) (a | (b<<MENUBITS))
#define MTREE3(a,b,c) MTREE2(a, MTREE2(b,c))
#define MTREE4(a,b,c,d) MTREE2(a, MTREE3(b,c,d))
143

Marco Z committed
144 145 146
typedef struct
{
	char bgname[8]; // name for background gfx lump; lays over titlemap if this is set
147 148
	SINT8 fadestrength;  // darken background when displaying this menu, strength 0-31 or -1 for undefined
	INT32 bgcolor; // fill color, overrides bg name. -1 means follow bg name rules.
Marco Z committed
149
	INT32 titlescrollxspeed; // background gfx scroll per menu; inherits global setting
Marco Z committed
150
	INT32 titlescrollyspeed; // y scroll
Marco Z committed
151
	boolean bghide; // for titlemaps, hide the background.
Marco Z committed
152

153 154 155 156 157 158 159 160
	SINT8 hidetitlepics; // hide title gfx per menu; -1 means undefined, inherits global setting
	ttmode_enum ttmode; // title wing animation mode; default TTMODE_OLD
	UINT8 ttscale; // scale of title wing gfx (FRACUNIT / ttscale); -1 means undefined, inherits global setting
	char ttname[9]; // lump name of title wing gfx. If name length is <= 6, engine will attempt to load numbered frames (TTNAMExx)
	INT16 ttx; // X position of title wing
	INT16 tty; // Y position of title wing
	INT16 ttloop; // # frame to loop; -1 means dont loop
	UINT16 tttics; // # of tics per frame
James R. committed
161

Marco Z committed
162 163 164
	char musname[7]; ///< Music track to play. "" for no music.
	UINT16 mustrack; ///< Subsong to play. Only really relevant for music modules and specific formats supported by GME. 0 to ignore.
	boolean muslooping; ///< Loop the music
165 166
	boolean musstop; ///< Don't play any music
	boolean musignore; ///< Let the current music keep playing
Marco Z committed
167

168 169
	boolean enterbubble; // run all entrance line execs after common ancestor and up to child. If false, only run the child's exec
	boolean exitbubble; // run all exit line execs from child and up to before common ancestor. If false, only run the child's exec
Marco Z committed
170 171
	INT32 entertag; // line exec to run on menu enter, if titlemap
	INT32 exittag; // line exec to run on menu exit, if titlemap
172 173
	INT16 enterwipe; // wipe type to run on menu enter, -1 means default
	INT16 exitwipe; // wipe type to run on menu exit, -1 means default
174 175 176 177 178 179 180
} menupres_t;

extern menupres_t menupres[NUMMENUTYPES];
extern UINT32 prevMenuId;
extern UINT32 activeMenuId;

void M_InitMenuPresTables(void);
Marco Z committed
181
UINT8 M_GetYoungestChildMenu(void);
182 183 184
void M_ChangeMenuMusic(const char *defaultmusname, boolean defaultmuslooping);
void M_SetMenuCurBackground(const char *defaultname);
void M_SetMenuCurFadeValue(UINT8 defaultvalue);
185
void M_SetMenuCurTitlePics(void);
186

Alam Ed Arias committed
187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202
// Called by main loop,
// saves config file and calls I_Quit when user exits.
// Even when the menu is not displayed,
// this can resize the view and change game parameters.
// Does all the real work of the menu interaction.
boolean M_Responder(event_t *ev);

// Called by main loop, only used for menu (skull cursor) animation.
void M_Ticker(void);

// Called by main loop, draws the menus directly into the screen buffer.
void M_Drawer(void);

// Called by D_SRB2Main, loads the config file.
void M_Init(void);

SteelT committed
203 204 205
// Called by D_SRB2Main also, sets up the playermenu and description tables.
void M_InitCharacterTables(void);

Alam Ed Arias committed
206 207 208 209 210 211 212
// Called by intro code to force menu up upon a keypress,
// does nothing if menu is already up.
void M_StartControlPanel(void);

// Called upon end of a mode attack run
void M_EndModeAttackRun(void);

Alam Ed Arias committed
213 214 215
// Called on new server add, or other reasons
void M_SortServerList(void);

Alam Ed Arias committed
216 217 218 219 220 221 222 223 224 225 226 227 228 229 230
// Draws a box with a texture inside as background for messages
void M_DrawTextBox(INT32 x, INT32 y, INT32 width, INT32 boxlines);

// the function to show a message box typing with the string inside
// string must be static (not in the stack)
// routine is a function taking a INT32 in parameter
typedef enum
{
	MM_NOTHING = 0, // is just displayed until the user do someting
	MM_YESNO,       // routine is called with only 'y' or 'n' in param
	MM_EVENTHANDLER // the same of above but without 'y' or 'n' restriction
	                // and routine is void routine(event_t *) (ex: set control)
} menumessagetype_t;
void M_StartMessage(const char *string, void *routine, menumessagetype_t itemtype);

231 232 233 234 235 236 237 238 239 240 241 242
typedef enum
{
	M_NOT_WAITING,

	M_WAITING_VERSION,
	M_WAITING_ROOMS,
	M_WAITING_SERVERS,
}
M_waiting_mode_t;

extern M_waiting_mode_t m_waiting_mode;

Alam Ed Arias committed
243 244 245
// Called by linux_x/i_video_xshm.c
void M_QuitResponse(INT32 ch);

toaster committed
246
// Determines whether to show a level in the list (platter version does not need to be exposed)
Alam Ed Arias committed
247 248 249 250
boolean M_CanShowLevelInList(INT32 mapnum, INT32 gt);

// flags for items in the menu
// menu handle (what we do when key is pressed
251
#define IT_TYPE             15     // (1+2+4+8)
Alam Ed Arias committed
252
#define IT_CALL              0     // call the function
253
#define IT_SPACE             1     // no handling
Alam Ed Arias committed
254 255 256 257
#define IT_ARROWS            2     // call function with 0 for left arrow and 1 for right arrow in param
#define IT_KEYHANDLER        4     // call with the key in param
#define IT_SUBMENU           6     // go to sub menu
#define IT_CVAR              8     // handle as a cvar
258
#define IT_PAIR             11     // no handling, define both sides of text
259
#define IT_MSGHANDLER       12     // same as key but with event and sometime can handle y/n key (special for message)
Alam Ed Arias committed
260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284

#define IT_DISPLAY   (48+64+128)    // 16+32+64+128
#define IT_NOTHING            0     // space
#define IT_PATCH             16     // a patch or a string with big font
#define IT_STRING            32     // little string (spaced with 10)
#define IT_WHITESTRING       48     // little string in white
#define IT_DYBIGSPACE        64     // same as noting
#define IT_DYLITLSPACE   (16+64)    // little space
#define IT_STRING2       (32+64)    // a simple string
#define IT_GRAYPATCH     (16+32+64) // grayed patch or big font string
#define IT_BIGSLIDER        128     // volume sound use this
#define IT_TRANSTEXT     (16+128)   // Transparent text
#define IT_TRANSTEXT2    (32+128)   // used for control names
#define IT_HEADERTEXT    (48+128)   // Non-selectable header option, displays in yellow offset to the left a little
#define IT_QUESTIONMARKS (64+128)   // Displays as question marks, used for secrets
#define IT_CENTER           256     // if IT_PATCH, center it on screen

//consvar specific
#define IT_CVARTYPE   (512+1024+2048)
#define IT_CV_NORMAL         0
#define IT_CV_SLIDER       512
#define IT_CV_STRING      1024
#define IT_CV_NOPRINT     1536
#define IT_CV_NOMOD       2048
#define IT_CV_INVISSLIDER 2560
285 286
#define IT_CV_INTEGERSTEP 4096      // if IT_CV_NORMAL and cvar is CV_FLOAT, modify it by 1 instead of 0.0625
#define IT_CV_FLOATSLIDER 4608      // IT_CV_SLIDER, value modified by 0.0625 instead of 1 (for CV_FLOAT cvars)
Alam Ed Arias committed
287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305

//call/submenu specific
// There used to be a lot more here but ...
// A lot of them became redundant with the advent of the Pause menu, so they were removed
#define IT_CALLTYPE   (512+1024)
#define IT_CALL_NORMAL          0
#define IT_CALL_NOTMODIFIED   512

// in INT16 for some common use
#define IT_BIGSPACE    (IT_SPACE  +IT_DYBIGSPACE)
#define IT_LITLSPACE   (IT_SPACE  +IT_DYLITLSPACE)
#define IT_CONTROL     (IT_STRING2+IT_CALL)
#define IT_CVARMAX     (IT_CVAR   +IT_CV_NOMOD)
#define IT_DISABLED    (IT_SPACE  +IT_GRAYPATCH)
#define IT_GRAYEDOUT   (IT_SPACE  +IT_TRANSTEXT)
#define IT_GRAYEDOUT2  (IT_SPACE  +IT_TRANSTEXT2)
#define IT_HEADER      (IT_SPACE  +IT_HEADERTEXT)
#define IT_SECRET      (IT_SPACE  +IT_QUESTIONMARKS)

toaster committed
306 307
#define MAXSTRINGLENGTH 32

Alam Ed Arias committed
308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329
typedef union
{
	struct menu_s *submenu;      // IT_SUBMENU
	consvar_t *cvar;             // IT_CVAR
	void (*routine)(INT32 choice); // IT_CALL, IT_KEYHANDLER, IT_ARROWS
} itemaction_t;

//
// MENU TYPEDEFS
//
typedef struct menuitem_s
{
	// show IT_xxx
	UINT16 status;

	const char *patch;
	const char *text; // used when FONTBxx lump is found

// FIXME: should be itemaction_t
	void *itemaction;

	// hotkey in menu or y of the item
330
	UINT16 alphaKey;
Alam Ed Arias committed
331 332
} menuitem_t;

333 334 335
extern menuitem_t MP_RoomMenu[];
extern UINT32     roomIds[NUM_LIST_ROOMS];

Alam Ed Arias committed
336 337
typedef struct menu_s
{
338
	UINT32         menuid;             // ID to encode menu type and hierarchy
Alam Ed Arias committed
339 340 341 342 343 344 345 346 347 348 349 350 351
	const char    *menutitlepic;
	INT16          numitems;           // # of menu items
	struct menu_s *prevMenu;           // previous menu
	menuitem_t    *menuitems;          // menu items
	void         (*drawroutine)(void); // draw routine
	INT16          x, y;               // x, y of menu
	INT16          lastOn;             // last item user was on in menu
	boolean      (*quitroutine)(void); // called before quit a menu return true if we can
} menu_t;

void M_SetupNextMenu(menu_t *menudef);
void M_ClearMenus(boolean callexitmenufunc);

352 353 354
// Maybe this goes here????? Who knows.
boolean M_MouseNeeded(void);

355 356 357 358
#ifdef HAVE_THREADS
extern I_mutex m_menu_mutex;
#endif

Alam Ed Arias committed
359 360 361 362 363
extern menu_t *currentMenu;

extern menu_t MainDef;
extern menu_t SP_LoadDef;

364 365 366 367
// Call upon joystick hotplug
void M_SetupJoystickMenu(INT32 choice);
extern menu_t OP_JoystickSetDef;

Alam Ed Arias committed
368 369 370
// Stuff for customizing the player select screen
typedef struct
{
371
	boolean used;
Alam Ed Arias committed
372 373 374
	char notes[441];
	char picname[8];
	char skinname[SKINNAMESIZE*2+2]; // skin&skin\0
Jaime Ita Passos committed
375
	patch_t *charpic;
376 377
	UINT8 prev;
	UINT8 next;
Jaime Ita Passos committed
378 379 380

	// new character select
	char displayname[SKINNAMESIZE+1];
381
	SINT8 skinnum[2];
382
	UINT16 oppositecolor;
Jaime Ita Passos committed
383 384
	char nametag[8];
	patch_t *namepic;
385 386
	UINT16 tagtextcolor;
	UINT16 tagoutlinecolor;
Alam Ed Arias committed
387 388
} description_t;

toaster committed
389
// level select platter
390 391 392 393
typedef struct
{
	char header[22+5]; // mapheader_t lvltttl max length + " ZONE"
	INT32 maplist[3];
394
	char mapnames[3][17+1];
395
	boolean mapavailable[4]; // mapavailable[3] == wide or not
396 397 398 399 400 401 402 403 404
} levelselectrow_t;

typedef struct
{
	UINT8 numrows;
	levelselectrow_t *rows;
} levelselect_t;
// experimental level select end

toaster committed
405 406 407
// descriptions for gametype select screen
typedef struct
{
408
	UINT8 col[2];
toaster committed
409 410
	char notes[441];
} gtdesc_t;
411
extern gtdesc_t gametypedesc[NUMGAMETYPES];
toaster committed
412

Alam Ed Arias committed
413 414 415 416 417 418 419 420 421 422 423 424 425 426 427
// mode descriptions for video mode menu
typedef struct
{
	INT32 modenum; // video mode number in the vidmodes list
	const char *desc;  // XXXxYYY
	UINT8 goodratio; // aspect correct if 1
} modedesc_t;

// savegame struct for save game menu
typedef struct
{
	char levelname[32];
	UINT8 skinnum;
	UINT8 botskin;
	UINT8 numemeralds;
428
	UINT8 numgameovers;
Alam Ed Arias committed
429
	INT32 lives;
430
	INT32 continuescore;
Alam Ed Arias committed
431 432 433
	INT32 gamemap;
} saveinfo_t;

434
extern description_t description[MAXSKINS];
Alam Ed Arias committed
435

436
extern consvar_t cv_showfocuslost;
Alam Ed Arias committed
437 438 439 440 441
extern consvar_t cv_newgametype, cv_nextmap, cv_chooseskin, cv_serversort;
extern CV_PossibleValue_t gametype_cons_t[];

extern INT16 startmap;
extern INT32 ultimate_selectable;
toaster committed
442
extern INT16 char_on, startchar;
Alam Ed Arias committed
443

444
#define MAXSAVEGAMES 31
445
#define NOSAVESLOT 0 //slot where Play Without Saving appears
446
#define MARATHONSLOT 420 // just has to be nonzero, but let's use one that'll show up as an obvious error if something goes wrong while not using our existing saves
Alam Ed Arias committed
447

448
#define BwehHehHe() S_StartSound(NULL, sfx_bewar1+M_RandomKey(4)) // Bweh heh he
Alam Ed Arias committed
449

450 451
void M_TutorialSaveControlResponse(INT32 ch);

Alam Ed Arias committed
452 453 454 455
void M_ForceSaveSlotSelected(INT32 sslot);

void M_CheatActivationResponder(INT32 ch);

456 457
void M_ModeAttackRetry(INT32 choice);

458 459 460
// Level select updating
void Nextmap_OnChange(void);

Alam Ed Arias committed
461 462 463 464
// Screenshot menu updating
void Moviemode_mode_Onchange(void);
void Screenshot_option_Onchange(void);

toaster committed
465 466 467
// Addons menu updating
void Addons_option_Onchange(void);

SteelT committed
468 469 470
// Moviemode menu updating
void Moviemode_option_Onchange(void);

James Hale committed
471 472 473 474
// Player Setup menu colors linked list
typedef struct menucolor_s {
	struct menucolor_s *next;
	struct menucolor_s *prev;
475
	UINT16 color;
James Hale committed
476 477
} menucolor_t;

478
extern menucolor_t *menucolorhead, *menucolortail;
James Hale committed
479

480 481 482 483 484
void M_AddMenuColor(UINT16 color);
void M_MoveColorBefore(UINT16 color, UINT16 targ);
void M_MoveColorAfter(UINT16 color, UINT16 targ);
UINT16 M_GetColorBefore(UINT16 color);
UINT16 M_GetColorAfter(UINT16 color);
James Hale committed
485 486 487
void M_InitPlayerSetupColors(void);
void M_FreePlayerSetupColors(void);

Alam Ed Arias committed
488
// These defines make it a little easier to make menus
489
#define DEFAULTMENUSTYLE(id, header, source, prev, x, y)\
Alam Ed Arias committed
490
{\
491
	id,\
Alam Ed Arias committed
492 493 494 495 496 497 498 499 500 501
	header,\
	sizeof(source)/sizeof(menuitem_t),\
	prev,\
	source,\
	M_DrawGenericMenu,\
	x, y,\
	0,\
	NULL\
}

502
#define DEFAULTSCROLLMENUSTYLE(id, header, source, prev, x, y)\
toaster committed
503
{\
504
	id,\
toaster committed
505 506 507 508 509 510 511 512 513 514
	header,\
	sizeof(source)/sizeof(menuitem_t),\
	prev,\
	source,\
	M_DrawGenericScrollMenu,\
	x, y,\
	0,\
	NULL\
}

Alam Ed Arias committed
515 516
#define PAUSEMENUSTYLE(source, x, y)\
{\
Marco Z committed
517
	MN_SPECIAL,\
Alam Ed Arias committed
518 519 520 521 522 523 524 525 526 527
	NULL,\
	sizeof(source)/sizeof(menuitem_t),\
	NULL,\
	source,\
	M_DrawPauseMenu,\
	x, y,\
	0,\
	NULL\
}

528
#define CENTERMENUSTYLE(id, header, source, prev, y)\
Alam Ed Arias committed
529
{\
530
	id,\
Alam Ed Arias committed
531 532 533 534 535 536 537 538 539 540
	header,\
	sizeof(source)/sizeof(menuitem_t),\
	prev,\
	source,\
	M_DrawCenteredMenu,\
	BASEVIDWIDTH/2, y,\
	0,\
	NULL\
}

541
#define MAPPLATTERMENUSTYLE(id, header, source)\
Alam Ed Arias committed
542
{\
543
	id,\
Alam Ed Arias committed
544 545
	header,\
	sizeof (source)/sizeof (menuitem_t),\
toaster committed
546
	&MainDef,\
Alam Ed Arias committed
547
	source,\
toaster committed
548 549
	M_DrawLevelPlatterMenu,\
	0,0,\
Alam Ed Arias committed
550 551 552 553
	0,\
	NULL\
}

554
#define CONTROLMENUSTYLE(id, source, prev)\
Alam Ed Arias committed
555
{\
556
	id,\
Alam Ed Arias committed
557 558 559 560 561 562 563 564 565 566 567 568
	"M_CONTRO",\
	sizeof (source)/sizeof (menuitem_t),\
	prev,\
	source,\
	M_DrawControl,\
	24, 40,\
	0,\
	NULL\
}

#define IMAGEDEF(source)\
{\
Marco Z committed
569
	MN_SPECIAL,\
Alam Ed Arias committed
570 571 572 573 574 575 576 577 578 579 580
	NULL,\
	sizeof (source)/sizeof (menuitem_t),\
	NULL,\
	source,\
	M_DrawImageDef,\
	0, 0,\
	0,\
	NULL\
}

#endif //__X_MENU__