Menu: Added fallback mode for missing btns_main.bmp and header_*.bmp files,

also support for basic Quake III Arena player model selection if you happen
to play with that (like Xylemon will!)
This commit is contained in:
Marco Cawthorne 2020-12-30 17:19:21 +01:00
parent 53ed1962eb
commit dd741c1c39
26 changed files with 262 additions and 120 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 821 KiB

View file

@ -91,6 +91,6 @@ seta "com_nogamedirnativecode" "0"
seta "con_logcenterprint" "0"
seta "con_notifylines" "0"
seta "lang" "en_us"
seta "r_imageexensions" "tga bmp pcx png jpg"
seta "r_imageextensions" "tga bmp pcx png jpg"
seta "scr_sshot_type" "tga"
seta "media_repeat "0"

View file

@ -15,82 +15,82 @@
*/
string g_bmp[76] = {
"gfx/shell/btns_main.bmp",
"gfx/shell/cb_checked.bmp",
"gfx/shell/cb_disabled.bmp",
"gfx/shell/cb_down.bmp",
"gfx/shell/cb_empty.bmp",
"gfx/shell/cb_over.bmp",
"gfx/shell/cls_d.bmp",
"gfx/shell/cls_f.bmp",
"gfx/shell/cls_n.bmp",
"gfx/shell/dedicate.bmp",
"gfx/shell/divider.bmp",
"gfx/shell/dnarrowd.bmp",
"gfx/shell/dnarrowf.bmp",
"gfx/shell/dnarrowp.bmp",
"gfx/shell/down.bmp",
"gfx/shell/favorite.bmp",
"gfx/shell/gamma.bmp",
"gfx/shell/head_advanced.bmp",
"gfx/shell/head_advoptions.bmp",
"gfx/shell/head_audio.bmp",
"gfx/shell/head_config.bmp",
"gfx/shell/head_controls.bmp",
"gfx/shell/head_creategame.bmp",
"gfx/shell/head_createroom.bmp",
"gfx/shell/head_custom.bmp",
"gfx/shell/head_customize.bmp",
"gfx/shell/head_filter.bmp",
"gfx/shell/head_gameopts.bmp",
"gfx/shell/head_gore.bmp",
"gfx/shell/head_inetgames.bmp",
"gfx/shell/head_keyboard.bmp",
"gfx/shell/head_lan.bmp",
"gfx/shell/head_load.bmp",
"gfx/shell/head_multi.bmp",
"gfx/shell/head_newgame.bmp",
"gfx/shell/head_readme.bmp",
"gfx/shell/head_room.bmp",
"gfx/shell/head_rooms.bmp",
"gfx/shell/head_save.bmp",
"gfx/shell/head_saveload.bmp",
"gfx/shell/head_single.bmp",
"gfx/shell/head_specgames.bmp",
"gfx/shell/head_video.bmp",
"gfx/shell/head_vidmodes.bmp",
"gfx/shell/head_vidoptions.bmp",
"gfx/shell/larrowdefault.bmp",
"gfx/shell/larrowflyover.bmp",
"gfx/shell/larrowpressed.bmp",
"gfx/shell/linux.bmp",
"gfx/shell/listen.bmp",
"gfx/shell/lock.bmp",
"gfx/shell/min_d.bmp",
"gfx/shell/min_f.bmp",
"gfx/shell/min_n.bmp",
"gfx/shell/nonfav.bmp",
"gfx/shell/notsecure.bmp",
"gfx/shell/pcg.bmp",
"gfx/shell/proxy.bmp",
"gfx/shell/rarrowdefault.bmp",
"gfx/shell/rarrowflyover.bmp",
"gfx/shell/rarrowpressed.bmp",
"gfx/shell/scrn.bmp",
"gfx/shell/secure.bmp",
"gfx/shell/slider.bmp",
"gfx/shell/sm_dnarf.bmp",
"gfx/shell/sm_dnarw.bmp",
"gfx/shell/splash8bit.bmp",
"gfx/shell/splash.bmp",
"gfx/shell/thumb.bmp",
"gfx/shell/unlock.bmp",
"gfx/shell/uparrowd.bmp",
"gfx/shell/uparrowf.bmp",
"gfx/shell/uparrowp.bmp",
"gfx/shell/up.bmp",
"gfx/shell/windows.bmp",
"gfx/shell/won_logo.bmp"
"gfx/shell/btns_main",
"gfx/shell/cb_checked",
"gfx/shell/cb_disabled",
"gfx/shell/cb_down",
"gfx/shell/cb_empty",
"gfx/shell/cb_over",
"gfx/shell/cls_d",
"gfx/shell/cls_f",
"gfx/shell/cls_n",
"gfx/shell/dedicate",
"gfx/shell/divider",
"gfx/shell/dnarrowd",
"gfx/shell/dnarrowf",
"gfx/shell/dnarrowp",
"gfx/shell/down",
"gfx/shell/favorite",
"gfx/shell/gamma",
"gfx/shell/head_advanced",
"gfx/shell/head_advoptions",
"gfx/shell/head_audio",
"gfx/shell/head_config",
"gfx/shell/head_controls",
"gfx/shell/head_creategame",
"gfx/shell/head_createroom",
"gfx/shell/head_custom",
"gfx/shell/head_customize",
"gfx/shell/head_filter",
"gfx/shell/head_gameopts",
"gfx/shell/head_gore",
"gfx/shell/head_inetgames",
"gfx/shell/head_keyboard",
"gfx/shell/head_lan",
"gfx/shell/head_load",
"gfx/shell/head_multi",
"gfx/shell/head_newgame",
"gfx/shell/head_readme",
"gfx/shell/head_room",
"gfx/shell/head_rooms",
"gfx/shell/head_save",
"gfx/shell/head_saveload",
"gfx/shell/head_single",
"gfx/shell/head_specgames",
"gfx/shell/head_video",
"gfx/shell/head_vidmodes",
"gfx/shell/head_vidoptions",
"gfx/shell/larrowdefault",
"gfx/shell/larrowflyover",
"gfx/shell/larrowpressed",
"gfx/shell/linux",
"gfx/shell/listen",
"gfx/shell/lock",
"gfx/shell/min_d",
"gfx/shell/min_f",
"gfx/shell/min_n",
"gfx/shell/nonfav",
"gfx/shell/notsecure",
"gfx/shell/pcg",
"gfx/shell/proxy",
"gfx/shell/rarrowdefault",
"gfx/shell/rarrowflyover",
"gfx/shell/rarrowpressed",
"gfx/shell/scrn",
"gfx/shell/secure",
"gfx/shell/slider",
"gfx/shell/sm_dnarf",
"gfx/shell/sm_dnarw",
"gfx/shell/splash8bit",
"gfx/shell/splash",
"gfx/shell/thumb",
"gfx/shell/unlock",
"gfx/shell/uparrowd",
"gfx/shell/uparrowf",
"gfx/shell/uparrowp",
"gfx/shell/up",
"gfx/shell/windows",
"gfx/shell/won_logo"
};
enum

View file

@ -201,11 +201,7 @@ void
menu_advancedcontrols_draw(void)
{
Widget_Draw(fn_advcontrols);
drawpic([g_menuofs[0]+45, g_menuofs[1]+45],
g_bmp[HEAD_ADVANCED],
[460,80],
[1,1,1],
1.0f, 1);
Header_Draw(HEAD_ADVANCED);
/* now come the checkbox / slider labels */
WLabel_Static(80, 148,

View file

@ -69,7 +69,7 @@ void
menu_advancedcustomize_draw(void)
{
Widget_Draw(fn_advcustomize);
drawpic([g_menuofs[0]+45,g_menuofs[1]+45], g_bmp[HEAD_ADVOPTIONS],[460,80], [1,1,1], 1.0f, 1);
Header_Draw(HEAD_ADVOPTIONS);
}
void

View file

@ -144,7 +144,7 @@ void
menu_audio_draw(void)
{
Widget_Draw(fn_audio);
drawpic([g_menuofs[0]+45,g_menuofs[1]+45], g_bmp[HEAD_AUDIO],[460,80], [1,1,1], 1.0f, 1);
Header_Draw(HEAD_AUDIO);
WLabel_Static(206, 143, m_reslbl[IDS_AUDIO_VOLUME], 14, 14, [1,1,1],
1.0f, 0, font_label_b);

View file

@ -132,7 +132,7 @@ void
menu_chatroomslist_draw(void)
{
Widget_Draw(fn_chatroomslist);
drawpic([g_menuofs[0]+45,g_menuofs[1]+45], g_bmp[HEAD_ROOMS],[460,80], [1,1,1], 1.0f, 1);
Header_Draw(HEAD_ROOMS);
drawpic([g_menuofs[0]+550,g_menuofs[1]+10], "gfx/shell/fragnet",[80,80], [1,1,1], 1.0f, 0);
if (crl_iLoading) {

View file

@ -152,7 +152,7 @@ void
menu_configuration_draw(void)
{
Widget_Draw(fn_configuration);
drawpic([g_menuofs[0]+45,g_menuofs[1]+45], g_bmp[HEAD_CONFIG],[460,80], [1,1,1], 1.0f, 1);
Header_Draw(HEAD_CONFIG);
WLabel_Static(215, 148, m_reslbl[IDS_CFG_CONTROLHELP], 10, 10, col_help,
1.0f, 0, font_label);

View file

@ -110,7 +110,7 @@ void
menu_contentcontrol_draw(void)
{
Widget_Draw(cc_gore);
drawpic([g_menuofs[0]+45,g_menuofs[1]+45], g_bmp[HEAD_GORE],[460,80], [1,1,1], 1.0f, 1);
Header_Draw(HEAD_GORE);
WField_Static(208, 140, g_cc_descr, 256, 64, col_help,
1.0f, 1, font_label);

View file

@ -271,7 +271,7 @@ menu_controls_draw(void)
{
Widget_Draw(fn_controls);
drawpic([g_menuofs[0]+45,g_menuofs[1]+45], g_bmp[HEAD_CONTROLS],[460,80], [1,1,1], 1.0f, 1);
Header_Draw(HEAD_CONTROLS);
WField_Static(50,236+32, m_reslbl[IDS_CONTROLS_KEYHELP], 169, 64, col_help,
1.0f, 1, font_label);

View file

@ -195,7 +195,7 @@ menu_creategame_init(void)
void
menu_creategame_draw(void)
{
drawpic([g_menuofs[0]+45,g_menuofs[1]+45], g_bmp[HEAD_CREATEGAME],[460,80], [1,1,1], 1.0f, 1);
Header_Draw(HEAD_CREATEGAME);
WLabel_Static(216, 143, m_reslbl[IDS_CREATESERVER_NAME], 14, 14, [1,1,1],
1.0f, 0, font_arial);

View file

@ -90,7 +90,7 @@ menu_creategameinet_init(void)
void
menu_creategameinet_draw(void)
{
drawpic([g_menuofs[0]+45,g_menuofs[1]+45], g_bmp[HEAD_CREATEGAME],[460,80], [1,1,1], 1.0f, 1);
Header_Draw(HEAD_CREATEGAME);
drawpic([g_menuofs[0]+550,g_menuofs[1]+10], "gfx/shell/fragnet",[80,80], [1,1,1], 1.0f, 0);
WLabel_Static(216, 143, m_reslbl[IDS_CREATESERVER_NAME], 14, 14, [1,1,1],

View file

@ -497,7 +497,7 @@ menu_customgame_init(void)
void
menu_customgame_draw(void)
{
drawpic([g_menuofs[0]+45,g_menuofs[1]+45], g_bmp[HEAD_CUSTOM],[460,80], [1,1,1], 1.0f, 1);
Header_Draw(HEAD_CUSTOM);
Widget_Draw(fn_customgame);
WLabel_Static(155, 143, m_reslbl[IDS_MODLIST_TYPE], 11, 11, [1,1,1],

View file

@ -64,6 +64,9 @@ cz_cbModelChanged(void)
tokenizebyseparator(mdl, "/");
localcmd(sprintf("seta _cl_playermodel %s\n", argv(2)));
localcmd(sprintf("setinfo model %s\n", argv(2)));
localcmd(sprintf("headmodel %s\n", argv(2)));
localcmd(sprintf("team_model %s\n", argv(2)));
localcmd(sprintf("team_headmodel %s\n", argv(2)));
}
void
@ -106,7 +109,7 @@ menu_customize_init(void)
search_end(searchy);
/* scan and cache the models */
searchy = search_begin("models/player/*/*.bmp:models/player/*/*.tga", SEARCH_MULTISEARCH | SEARCH_NAMESORT, TRUE);
searchy = search_begin("models/player/*/*.bmp:models/player/*/*.tga:models/players/*/icon_blue.tga", SEARCH_MULTISEARCH | SEARCH_NAMESORT, TRUE);
g_modelcount = search_getsize(searchy);
g_models = memalloc(sizeof(string) * g_modelcount);
@ -164,7 +167,7 @@ void
menu_customize_draw(void)
{
Widget_Draw(fn_customize);
drawpic([g_menuofs[0]+45,g_menuofs[1]+45], g_bmp[HEAD_CUSTOMIZE],[460,80], [1,1,1], 1.0f, 1);
Header_Draw(HEAD_CUSTOMIZE);
WLabel_Static(212, 140, m_reslbl[IDS_PLAYERINFO_NAME], 14, 14, [1,1,1],
1.0f, 0, font_arial);
WLabel_Static(410, 140, sprintf(m_reslbl[IDS_MODEL_NAME], cvar_string("_cl_playermodel")), 14, 14, [1,1,1],

View file

@ -285,7 +285,7 @@ menu_internetgames_draw(void)
{
Widget_Draw(fn_inet);
resorthostcache();
drawpic([g_menuofs[0]+45,g_menuofs[1]+45], g_bmp[HEAD_INETGAMES],[460,80], [1,1,1], 1.0f, 1);
Header_Draw(HEAD_INETGAMES);
drawpic([g_menuofs[0]+550,g_menuofs[1]+10], "gfx/shell/fragnet",[80,80], [1,1,1], 1.0f, 0);
/* Labels */

View file

@ -223,7 +223,7 @@ menu_langames_draw(void)
{
Widget_Draw(fn_lan);
Master_ResortCache();
drawpic([g_menuofs[0]+45,g_menuofs[1]+45], g_bmp[HEAD_LAN],[460,80], [1,1,1], 1.0f, 1);
Header_Draw(HEAD_LAN);
/* Labels */
WLabel_Static(282, 128, m_reslbl[IDS_SERVER_GAMESERVER], 10, 10, [1,1,1],

View file

@ -138,7 +138,7 @@ void
menu_loadgame_draw(void)
{
Widget_Draw(fn_loadgame);
drawpic([g_menuofs[0]+45,g_menuofs[1]+45], g_bmp[HEAD_LOAD],[460,80], [1,1,1], 1.0f, 1);
Header_Draw(HEAD_LOAD);
if (!g_savegame_count) {
return;

View file

@ -210,7 +210,7 @@ void
menu_multiplayer_draw(void)
{
Widget_Draw(fn_multiplayer);
drawpic([g_menuofs[0]+45,g_menuofs[1]+45], g_bmp[HEAD_MULTI],[460,80], [1,1,1], 1.0f, 1);
Header_Draw(HEAD_MULTI);
WLabel_Static(215, 148, m_reslbl[IDS_MAIN_QUICKHELP], 10, 10, col_help,
1.0f, 0, font_label);

View file

@ -125,7 +125,7 @@ void
menu_newgame_draw(void)
{
Widget_Draw(fn_newgame);
drawpic([g_menuofs[0]+45,g_menuofs[1]+45], g_bmp[HEAD_NEWGAME],[460,80], [1,1,1], 1.0f, 1);
Header_Draw(HEAD_NEWGAME);
WLabel_Static(215, 148, m_reslbl[IDS_NEWGAME_EASYHELP], 10, 10, col_help,
1.0f, 0, font_label);

View file

@ -265,7 +265,7 @@ menu_updates_draw(void)
}
Widget_Draw(fn_updates);
drawpic([g_menuofs[0]+45,g_menuofs[1]+45], g_bmp[HEAD_CONFIG],[460,80], [1,1,1], 1.0f, 1);
Header_Draw(HEAD_CONFIG);
WLabel_Static(50, 143, "Data files:", 11, 11, [1,1,1],
1.0f, 0, font_arial);

View file

@ -92,7 +92,7 @@ void
menu_video_draw(void)
{
Widget_Draw(fn_video);
drawpic([g_menuofs[0]+45,g_menuofs[1]+45], g_bmp[HEAD_VIDEO],[460,80], [1,1,1], 1.0f, 1);
Header_Draw(HEAD_VIDEO);
WLabel_Static(215, 148, m_reslbl[IDS_VIDSELECT_OPTIONSHELP], 10, 10, col_help,
1.0f, 0, font_label);
WLabel_Static(215, 180, m_reslbl[IDS_VIDSELECT_MODESHELP], 10, 10, col_help,

View file

@ -177,8 +177,7 @@ void
menu_videomodes_draw(void)
{
Widget_Draw(fn_vidmodes);
drawpic([g_menuofs[0] + 45, g_menuofs[1] + 45], g_bmp[HEAD_VIDMODES],
[460,80], [1,1,1], 1.0f, 1);
Header_Draw(HEAD_VIDMODES);
WLabel_Static(270, 393, m_reslbl[IDS_VIDMODE_WINDOWED], 12, 12, [0.75,0.75,0.75],
1.0f, 0, font_arial);

View file

@ -92,8 +92,7 @@ void
menu_videooptions_draw(void)
{
Widget_Draw(fn_vidoptions);
drawpic([g_menuofs[0] + 45, g_menuofs[1] + 45], g_bmp[HEAD_VIDOPTIONS],
[460,80], [1,1,1], 1.0f, 1);
Header_Draw(HEAD_VIDOPTIONS);
drawfill([g_menuofs[0] + 246, g_menuofs[1] + 140], [288, 280],
[1,0,0], 1.0f);

View file

@ -85,7 +85,7 @@ void
menu_viewreadme_draw(void)
{
Widget_Draw(vr_readme);
drawpic([g_menuofs[0]+45,g_menuofs[1]+45], g_bmp[HEAD_README],[460,80], [1,1,1], 1.0f, 1);
Header_Draw(HEAD_README);
}
void

View file

@ -14,6 +14,37 @@
* OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
string g_header_text[] = {
"ADVANCED",
"ADV. OPTIONS",
"AUDIO",
"CONFIGURATION",
"CONTROLS",
"CREATE GAME",
"CREATE ROOM",
"CUSTOM GAME",
"CUSTOMIZE",
"FILTER",
"GAME OPTIONS",
"GORE",
"INTERNET GAMES",
"KEYBOARD",
"LAN",
"LOAD GAME",
"MULTIPLAYER",
"NEW GAME",
"README",
"ROOM",
"ROOMS",
"SAVE",
"SAVE & LOAD",
"SINGLEPLAYER",
"SPECTATE GAMES",
"VIDEO",
"VIDEO MODES",
"VIDEO OPTIONS"
};
class CHeader:CWidget
{
int m_header;
@ -52,7 +83,11 @@ CHeader::Draw(void)
size[0] = lerp(m_start_w, m_end_w, m_lerp);
size[1] = lerp(m_start_h, m_end_h, m_lerp);
drawpic([pos[0],pos[1]], g_bmp[m_header],[size[0],size[1]], [1,1,1], 1.0f, 1);
if (whichpack(strcat(g_bmp[m_header],".bmp"))) {
drawpic([pos[0],pos[1]], g_bmp[m_header],[size[0],size[1]], [1,1,1], 1.0f, 1);
} else {
drawstring([pos[0],pos[1]], g_header_text[m_header-HEAD_ADVANCED], [32,32], [1,1,1], 1.0f, 1);
}
#if 0
m_lerp += frametime * 0.25;
@ -103,4 +138,15 @@ CHeader::SetStartEndSize(int x1, int y1, int x2, int y2)
m_end_h = y2;
}
void
Header_Draw(int id)
{
if (whichpack(strcat(g_bmp[id],".bmp"))) {
drawpic([g_menuofs[0]+45,g_menuofs[1]+45], g_bmp[id],[460,80], [1,1,1], 1.0f, 1);
} else {
drawfont = font_label_p;
drawstring([g_menuofs[0]+45,g_menuofs[1]+45], g_header_text[id-HEAD_ADVANCED], [32,32], [1,1,1], 1.0f, 1);
}
}
CHeader header;

View file

@ -88,6 +88,79 @@ enum
BTN_SPECTATEGAMES
};
string g_mainbtn_text[] = {
"NEW GAME",
"RESUME GAME",
"TRAINING",
"CONFIG",
"LOAD GAME",
"SAVE LOAD",
"README",
"QUIT",
"MULTIPLAYER",
"EASY",
"MEDIUM",
"DIFFICULT",
"SAVE GAME",
"LOAD GAME",
"CANCEL",
"OPTIONS",
"VIDEO",
"AUDIO",
"CONTROLS",
"DONE",
"QUICK START",
"DEFAULTS",
"OK",
"VIDEO OPTIONS",
"VIDEO MODES",
"ADV. CONTROLS",
"ORDER",
"DELETE",
"INTERNET GAME",
"IRC CHAT",
"LAN GAME",
"CUSTOMIZE",
"SKIP",
"EXIT",
"CONNECT",
"REFRESH",
"FILTER1",
"FILTER2",
"CREATE",
"CREATE GAME",
"CHAT ROOMS",
"LIST ROOMS",
"SEARCH",
"SERVERS",
"JOIN",
"FIND",
"CREATE ROOM",
"JOIN GAME",
"SEARCH GAMES",
"FIND GAME",
"START GAME",
"GAME INFO",
"UPDATE LIST",
"ADD SERVER",
"DISCONNECT",
"CONSOLE",
"CONTENT CONTROL",
"UPDATE",
"VISIT FRAG-NET",
"PREVIEWS",
"ADV. OPTIONS",
"3D INFO",
"CUSTOM GAME",
"ACTIVATE",
"INSTALL",
"VISITWEB",
"REFRESH LIST",
"DEACTIVATE",
"SPECTATE GAME",
"SPECTATE GAMES"
};
class CMainButton:CWidget
{
int m_bitmap;
@ -114,26 +187,52 @@ CMainButton::CMainButton(void)
m_length = 156;
}
static int g_btns_present;
void
CMainButton::Draw(void)
{
if (!m_execute) {
if (!g_btns_present) {
if (whichpack(strcat(g_bmp[0],".bmp"))) {
g_btns_present = 1;
} else {
g_btns_present = 2;
}
}
/* if we have btns_main */
if (g_btns_present == 1) {
if (!m_execute) {
drawsubpic([g_menuofs[0]+m_x,g_menuofs[1]+m_y], [156,26], g_bmp[0],
[0,(m_bitmap * 3) * g_btnofs], [1,g_btnofs], [1,1,1], 0.75f, 1);
return;
}
if (m_click) {
drawsubpic([g_menuofs[0]+m_x,g_menuofs[1]+m_y], [156,26], g_bmp[0],
[0,((m_bitmap * 3)+2) * g_btnofs], [1,g_btnofs],
[1,1,1], 1.0f, 1);
return;
}
drawsubpic([g_menuofs[0]+m_x,g_menuofs[1]+m_y], [156,26], g_bmp[0],
[0,(m_bitmap * 3) * g_btnofs], [1,g_btnofs], [1,1,1], 0.75f, 1);
return;
}
if (m_click) {
[0,(m_bitmap * 3) * g_btnofs], [1,g_btnofs], [1,1,1], 1.0f, 1);
drawsubpic([g_menuofs[0]+m_x,g_menuofs[1]+m_y], [156,26], g_bmp[0],
[0,((m_bitmap * 3)+2) * g_btnofs], [1,g_btnofs],
[1,1,1], 1.0f, 1);
return;
[0,((m_bitmap * 3)+1) * g_btnofs], [1,g_btnofs],
[1,1,1], 1 - m_alpha, 1);
} else {
drawfont = font_label_p;
if (!m_execute) {
drawstring([g_menuofs[0]+m_x,g_menuofs[1]+m_y], g_mainbtn_text[m_bitmap], [16,16], [0.25,0.25,0.25], 1.0, 0);
return;
}
if (m_click) {
drawstring([g_menuofs[0]+m_x,g_menuofs[1]+m_y], g_mainbtn_text[m_bitmap], [16,16], [1,1,0], 1.0, 0);
return;
}
drawstring([g_menuofs[0]+m_x,g_menuofs[1]+m_y], g_mainbtn_text[m_bitmap], [16,16], [1,1,1], 1.0, 0);
drawstring([g_menuofs[0]+m_x,g_menuofs[1]+m_y], g_mainbtn_text[m_bitmap], [16,16], [1,0,0], 1 - m_alpha, 0);
}
drawsubpic([g_menuofs[0]+m_x,g_menuofs[1]+m_y], [156,26], g_bmp[0],
[0,(m_bitmap * 3) * g_btnofs], [1,g_btnofs], [1,1,1], 1.0f, 1);
drawsubpic([g_menuofs[0]+m_x,g_menuofs[1]+m_y], [156,26], g_bmp[0],
[0,((m_bitmap * 3)+1) * g_btnofs], [1,g_btnofs],
[1,1,1], 1 - m_alpha, 1);
if (m_hover) {
m_alpha -= frametime * 16;