668 lines
No EOL
12 KiB
C
668 lines
No EOL
12 KiB
C
/*
|
|
Copyright (C) 1996-1997 Id Software, Inc.
|
|
|
|
This program is free software; you can redistribute it and/or
|
|
modify it under the terms of the GNU General Public License
|
|
as published by the Free Software Foundation; either version 2
|
|
of the License, or (at your option) any later version.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
|
|
See the GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program; if not, write to the Free Software
|
|
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|
|
|
*/
|
|
#include "quakedef.h"
|
|
#include "winquake.h"
|
|
#include "menu.h"
|
|
|
|
#define SLIDER_RANGE 10
|
|
|
|
//Menu Music Support Brought Over From Old EW Engine
|
|
cvar_t menu_music = {"menu_music", "1", true};
|
|
|
|
//New Drawing Functions - Xsniper
|
|
void C_DrawCharacter (int cx, int line, int num)
|
|
{
|
|
Draw_Character ((cx + (vid.width / 2)),(line + (vid.height / 2)), num);
|
|
}
|
|
|
|
void C_Print (int cx, int cy, char *str)
|
|
{
|
|
Draw_Alt_String ((cx + (vid.width / 2)),(cy + (vid.height / 2)), str, 0);
|
|
}
|
|
|
|
void C_PrintWhite (int cx, int cy, char *str)
|
|
{
|
|
Draw_String ((cx + (vid.width /2)), (cy + (vid.height / 2)), str, 0);
|
|
}
|
|
|
|
void C_DrawPic (int x, int y, qpic_t *pic)
|
|
{
|
|
Draw_Pic ((x + (vid.width / 2)),(y + (vid.height / 2)), pic);
|
|
}
|
|
|
|
void C_DrawTextBox (int x, int y, int width, int lines)
|
|
{
|
|
qpic_t *p;
|
|
int cx, cy;
|
|
int n;
|
|
|
|
// draw left side
|
|
cx = x;
|
|
cy = y;
|
|
p = Draw_CachePic ("gfx/box_tl.lmp");
|
|
C_DrawPic (cx, cy, p);
|
|
p = Draw_CachePic ("gfx/box_ml.lmp");
|
|
for (n = 0; n < lines; n++)
|
|
{
|
|
cy += 8;
|
|
C_DrawPic (cx, cy, p);
|
|
}
|
|
p = Draw_CachePic ("gfx/box_bl.lmp");
|
|
C_DrawPic (cx, cy+8, p);
|
|
|
|
// draw middle
|
|
cx += 8;
|
|
while (width > 0)
|
|
{
|
|
cy = y;
|
|
p = Draw_CachePic ("gfx/box_tm.lmp");
|
|
C_DrawPic (cx, cy, p);
|
|
p = Draw_CachePic ("gfx/box_mm.lmp");
|
|
for (n = 0; n < lines; n++)
|
|
{
|
|
cy += 8;
|
|
if (n == 1)
|
|
p = Draw_CachePic ("gfx/box_mm2.lmp");
|
|
C_DrawPic (cx, cy, p);
|
|
}
|
|
p = Draw_CachePic ("gfx/box_bm.lmp");
|
|
C_DrawPic (cx, cy+8, p);
|
|
width -= 2;
|
|
cx += 16;
|
|
}
|
|
|
|
// draw right side
|
|
cy = y;
|
|
p = Draw_CachePic ("gfx/box_tr.lmp");
|
|
C_DrawPic (cx, cy, p);
|
|
p = Draw_CachePic ("gfx/box_mr.lmp");
|
|
for (n = 0; n < lines; n++)
|
|
{
|
|
cy += 8;
|
|
C_DrawPic (cx, cy, p);
|
|
}
|
|
p = Draw_CachePic ("gfx/box_br.lmp");
|
|
C_DrawPic (cx, cy+8, p);
|
|
}
|
|
|
|
void C_DrawSlider (int x, int y, float range)
|
|
{
|
|
int i;
|
|
|
|
if (range < 0)
|
|
range = 0;
|
|
if (range > 1)
|
|
range = 1;
|
|
C_DrawCharacter (x-8, y, 128);
|
|
for (i=0 ; i<SLIDER_RANGE ; i++)
|
|
C_DrawCharacter (x + i*8, y, 129);
|
|
C_DrawCharacter (x+i*8, y, 130);
|
|
C_DrawCharacter (x + (SLIDER_RANGE-1)*8 * range, y, 131);
|
|
}
|
|
|
|
void C_DrawCheckbox (int x, int y, int on)
|
|
{
|
|
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
|
|
|
|
if (on)
|
|
{
|
|
glColor3f(0,1,0);
|
|
C_Print (x, y, "on");
|
|
}
|
|
else
|
|
{
|
|
glColor3f(1,0,0);
|
|
C_Print (x, y, "off");
|
|
}
|
|
|
|
glColor3f(1,1,1);
|
|
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
|
|
}
|
|
//End - Xsniper
|
|
|
|
/*
|
|
===============
|
|
M_DrawCharacter
|
|
===============
|
|
*/
|
|
void M_DrawCharacter (int cx, int line, int num)
|
|
{
|
|
// BramBo: edit, added fourth param
|
|
Draw_Character ( cx + ((vid.width - 320)>>1), line, num);
|
|
}
|
|
|
|
void M_Print (int cx, int cy, char *str)
|
|
{
|
|
Draw_Alt_String (cx + ((vid.width - 320)>>1), cy, str, 0);
|
|
}
|
|
|
|
void M_PrintWhite (int cx, int cy, char *str)
|
|
{
|
|
Draw_String (cx + ((vid.width - 320)>>1), cy, str, 0);
|
|
}
|
|
|
|
void M_DrawPic (int x, int y, qpic_t *pic)
|
|
{
|
|
Draw_Pic (x + ((vid.width - 320)>>1), y, pic);
|
|
}
|
|
|
|
byte identityTable[256];
|
|
byte translationTable[256];
|
|
|
|
void M_BuildMenuPlayerTable(int top, int bottom)
|
|
{
|
|
int j;
|
|
byte *dest, *source;
|
|
|
|
for (j = 0; j < 256; j++)
|
|
identityTable[j] = j;
|
|
dest = translationTable;
|
|
source = identityTable;
|
|
memcpy (dest, source, 256);
|
|
|
|
if (top < 128) // the artists made some backwards ranges. sigh.
|
|
memcpy (dest + TOP_RANGE, source + top, 16);
|
|
else
|
|
for (j=0 ; j<16 ; j++)
|
|
dest[TOP_RANGE+j] = source[top+15-j];
|
|
|
|
if (bottom < 128)
|
|
memcpy (dest + BOTTOM_RANGE, source + bottom, 16);
|
|
else
|
|
for (j=0 ; j<16 ; j++)
|
|
dest[BOTTOM_RANGE+j] = source[bottom+15-j];
|
|
}
|
|
|
|
|
|
void M_DrawMenuPlayer(int x, int y, qpic_t *pic)
|
|
{
|
|
Draw_MenuPlayer (x + ((vid.width - 320)>>1), y, pic, translationTable);
|
|
}
|
|
|
|
|
|
void M_DrawTextBox (int x, int y, int width, int lines)
|
|
{
|
|
qpic_t *p;
|
|
int cx, cy;
|
|
int n;
|
|
|
|
// draw left side
|
|
cx = x;
|
|
cy = y;
|
|
p = Draw_CachePic ("gfx/box_tl.lmp");
|
|
M_DrawPic (cx, cy, p);
|
|
p = Draw_CachePic ("gfx/box_ml.lmp");
|
|
for (n = 0; n < lines; n++)
|
|
{
|
|
cy += 8;
|
|
M_DrawPic (cx, cy, p);
|
|
}
|
|
p = Draw_CachePic ("gfx/box_bl.lmp");
|
|
M_DrawPic (cx, cy+8, p);
|
|
|
|
// draw middle
|
|
cx += 8;
|
|
while (width > 0)
|
|
{
|
|
cy = y;
|
|
p = Draw_CachePic ("gfx/box_tm.lmp");
|
|
M_DrawPic (cx, cy, p);
|
|
p = Draw_CachePic ("gfx/box_mm.lmp");
|
|
for (n = 0; n < lines; n++)
|
|
{
|
|
cy += 8;
|
|
if (n == 1)
|
|
p = Draw_CachePic ("gfx/box_mm2.lmp");
|
|
M_DrawPic (cx, cy, p);
|
|
}
|
|
p = Draw_CachePic ("gfx/box_bm.lmp");
|
|
M_DrawPic (cx, cy+8, p);
|
|
width -= 2;
|
|
cx += 16;
|
|
}
|
|
|
|
// draw right side
|
|
cy = y;
|
|
p = Draw_CachePic ("gfx/box_tr.lmp");
|
|
M_DrawPic (cx, cy, p);
|
|
p = Draw_CachePic ("gfx/box_mr.lmp");
|
|
for (n = 0; n < lines; n++)
|
|
{
|
|
cy += 8;
|
|
M_DrawPic (cx, cy, p);
|
|
}
|
|
p = Draw_CachePic ("gfx/box_br.lmp");
|
|
M_DrawPic (cx, cy+8, p);
|
|
}
|
|
|
|
void M_DrawSlider (int x, int y, float range)
|
|
{
|
|
int i;
|
|
|
|
if (range < 0)
|
|
range = 0;
|
|
if (range > 1)
|
|
range = 1;
|
|
M_DrawCharacter (x-8, y, 128);
|
|
for (i=0 ; i<SLIDER_RANGE ; i++)
|
|
M_DrawCharacter (x + i*8, y, 129);
|
|
M_DrawCharacter (x+i*8, y, 130);
|
|
M_DrawCharacter (x + (SLIDER_RANGE-1)*8 * range, y, 131);
|
|
}
|
|
|
|
//Tei slider
|
|
char slider[11];
|
|
|
|
char * MakeSlider(float max, float dx)
|
|
{
|
|
|
|
int t,i;
|
|
float fx;
|
|
|
|
fx = max/10;
|
|
|
|
for (i=0;i<10;i++)
|
|
slider[i] = (char)129;
|
|
|
|
slider[0] = (char)128;
|
|
slider[9] = (char)130;
|
|
|
|
t = dx / fx;
|
|
|
|
if(t<0)
|
|
t=0;
|
|
else
|
|
if (t>9)
|
|
t=9;
|
|
|
|
slider[t] = (char)131;
|
|
|
|
slider[10] = 0;
|
|
|
|
return slider;
|
|
}
|
|
//Tei slider
|
|
|
|
void M_DrawCheckbox (int x, int y, int on)
|
|
{
|
|
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
|
|
|
|
if (on)
|
|
{
|
|
glColor3f(0,1,0);
|
|
M_Print (x, y, "on");
|
|
}
|
|
else
|
|
{
|
|
glColor3f(1,0,0);
|
|
M_Print (x, y, "off");
|
|
}
|
|
|
|
glColor3f(1,1,1);
|
|
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
|
|
}
|
|
|
|
/*
|
|
================
|
|
M_ToggleMenu_f
|
|
================
|
|
*/
|
|
|
|
void M_ToggleMenu_f (void)
|
|
{
|
|
m_entersound = true;
|
|
|
|
if (key_dest == key_menu)
|
|
{
|
|
if (m_state != m_main)
|
|
{
|
|
M_Menu_Main_f ();
|
|
return;
|
|
}
|
|
key_dest = key_game;
|
|
m_state = m_none;
|
|
return;
|
|
}
|
|
if (key_dest == key_console)
|
|
{
|
|
Con_ToggleConsole_f ();
|
|
}
|
|
else
|
|
{
|
|
M_Menu_Main_f ();
|
|
}
|
|
}
|
|
|
|
cvar_t samplerate = {"samplerate", "0", true}; // Tomaz - Samplerate
|
|
|
|
//Xsniper Added New Menu Command To Start Menu When Game Starts
|
|
/*
|
|
==================
|
|
Start_Menu
|
|
==================
|
|
*/
|
|
void Start_Menu (void)
|
|
{
|
|
if (!sv.active)
|
|
M_ToggleMenu_f ();
|
|
}
|
|
//Xsniper - End
|
|
|
|
void M_Init (void)
|
|
{
|
|
Cmd_AddCommand ("togglemenu", M_ToggleMenu_f);
|
|
|
|
Cmd_AddCommand ("menu_main", M_Menu_Main_f);
|
|
Cmd_AddCommand ("menu_singleplayer",M_Menu_SinglePlayer_f);
|
|
Cmd_AddCommand ("menu_load", M_Menu_Load_f);
|
|
Cmd_AddCommand ("menu_save", M_Menu_Save_f);
|
|
Cmd_AddCommand ("menu_multiplayer", M_Menu_MultiPlayer_f);
|
|
Cmd_AddCommand ("menu_setup", M_Menu_Setup_f);
|
|
Cmd_AddCommand ("menu_options", M_Menu_Options_f);
|
|
Cmd_AddCommand ("menu_controls", M_Menu_Controls_f);
|
|
Cmd_AddCommand ("menu_keys", M_Menu_Keys_f);
|
|
Cmd_AddCommand ("menu_sound", M_Menu_Sound_f);
|
|
Cmd_AddCommand ("menu_video", M_Menu_Video_f);
|
|
Cmd_AddCommand ("menu_misc", M_Menu_Misc_f);
|
|
Cmd_AddCommand ("help", M_Menu_Help_f);
|
|
Cmd_AddCommand ("menu_quit", M_Menu_Quit_f);
|
|
|
|
//Xsniper - Moved Menu Music Over
|
|
Cvar_RegisterVariable (&menu_music);
|
|
|
|
Cvar_RegisterVariable (&samplerate); // Tomaz - Samplerate
|
|
}
|
|
|
|
void M_Draw (void)
|
|
{
|
|
//Xsniper - Moved Menu Music Over
|
|
static qboolean menu_music_started = false;
|
|
|
|
//Xsniper - Menu Music
|
|
if (m_state == m_none || key_dest != key_menu)
|
|
{
|
|
if (menu_music_started)
|
|
{
|
|
menu_music_started = false;
|
|
S_StopAllSounds (true);
|
|
}
|
|
return;
|
|
}
|
|
//Xsniper - End
|
|
|
|
if (!m_recursiveDraw)
|
|
{
|
|
scr_copyeverything = 1;
|
|
|
|
if (scr_con_current)
|
|
{
|
|
Draw_ConsoleBackground (vid.height);
|
|
S_ExtraUpdate ();
|
|
}
|
|
else
|
|
Draw_FadeScreen ();
|
|
|
|
scr_fullupdate = 0;
|
|
}
|
|
else
|
|
{
|
|
m_recursiveDraw = false;
|
|
}
|
|
|
|
switch (m_state)
|
|
{
|
|
case m_none:
|
|
break;
|
|
|
|
case m_main:
|
|
M_Main_Draw ();
|
|
break;
|
|
|
|
case m_singleplayer:
|
|
M_SinglePlayer_Draw ();
|
|
break;
|
|
|
|
case m_load:
|
|
M_Load_Draw ();
|
|
break;
|
|
|
|
case m_save:
|
|
M_Save_Draw ();
|
|
break;
|
|
|
|
case m_multiplayer:
|
|
M_MultiPlayer_Draw ();
|
|
break;
|
|
|
|
case m_setup:
|
|
M_Setup_Draw ();
|
|
break;
|
|
|
|
case m_net:
|
|
M_Net_Draw ();
|
|
break;
|
|
|
|
case m_options:
|
|
M_Options_Draw ();
|
|
break;
|
|
|
|
case m_controls:
|
|
M_Controls_Draw ();
|
|
break;
|
|
|
|
case m_keys:
|
|
M_Keys_Draw ();
|
|
break;
|
|
|
|
case m_sound:
|
|
M_Sound_Draw ();
|
|
break;
|
|
|
|
case m_video:
|
|
M_Video_Draw ();
|
|
break;
|
|
|
|
case m_misc:
|
|
M_Misc_Draw ();
|
|
break;
|
|
|
|
case m_help:
|
|
M_Help_Draw ();
|
|
break;
|
|
|
|
case m_quit:
|
|
M_Quit_Draw ();
|
|
break;
|
|
|
|
case m_serialconfig:
|
|
M_SerialConfig_Draw ();
|
|
break;
|
|
|
|
case m_modemconfig:
|
|
M_ModemConfig_Draw ();
|
|
break;
|
|
|
|
case m_lanconfig:
|
|
M_LanConfig_Draw ();
|
|
break;
|
|
|
|
case m_gameoptions:
|
|
M_GameOptions_Draw ();
|
|
break;
|
|
|
|
case m_search:
|
|
M_Search_Draw ();
|
|
break;
|
|
|
|
case m_slist:
|
|
M_ServerList_Draw ();
|
|
break;
|
|
}
|
|
|
|
if (m_entersound)
|
|
{
|
|
S_LocalSound ("misc/menu2.wav");
|
|
m_entersound = false;
|
|
}
|
|
|
|
//Xsniper - Moved Music Over
|
|
if (!menu_music_started && menu_music.value)
|
|
{
|
|
int music;
|
|
|
|
music = rand() & 3;
|
|
|
|
if (!music)
|
|
music = 1;
|
|
|
|
switch (music)
|
|
{
|
|
case 1:
|
|
Cbuf_AddText ("play music/music1\n");
|
|
break;
|
|
case 2:
|
|
Cbuf_AddText ("play music/music2\n");
|
|
break;
|
|
case 3:
|
|
Cbuf_AddText ("play music/music3\n");
|
|
break;
|
|
}
|
|
menu_music_started = true;
|
|
}
|
|
|
|
if (menu_music_started && !menu_music.value)
|
|
{
|
|
menu_music_started = false;
|
|
S_StopAllSounds (true);
|
|
}
|
|
//Xsniper - End
|
|
|
|
S_ExtraUpdate ();
|
|
}
|
|
|
|
|
|
void M_Keydown (int key)
|
|
{
|
|
switch (m_state)
|
|
{
|
|
case m_none:
|
|
return;
|
|
|
|
case m_main:
|
|
M_Main_Key (key);
|
|
return;
|
|
|
|
case m_singleplayer:
|
|
M_SinglePlayer_Key (key);
|
|
return;
|
|
|
|
case m_load:
|
|
M_Load_Key (key);
|
|
return;
|
|
|
|
case m_save:
|
|
M_Save_Key (key);
|
|
return;
|
|
|
|
case m_multiplayer:
|
|
M_MultiPlayer_Key (key);
|
|
return;
|
|
|
|
case m_setup:
|
|
M_Setup_Key (key);
|
|
return;
|
|
|
|
case m_net:
|
|
M_Net_Key (key);
|
|
return;
|
|
|
|
case m_options:
|
|
M_Options_Key (key);
|
|
return;
|
|
|
|
case m_controls:
|
|
M_Controls_Key (key);
|
|
return;
|
|
|
|
case m_keys:
|
|
M_Keys_Key (key);
|
|
return;
|
|
|
|
case m_sound:
|
|
M_Sound_Key (key);
|
|
return;
|
|
|
|
case m_video:
|
|
M_Video_Key (key);
|
|
return;
|
|
|
|
case m_misc:
|
|
M_Misc_Key (key);
|
|
return;
|
|
|
|
case m_help:
|
|
M_Help_Key (key);
|
|
return;
|
|
|
|
case m_quit:
|
|
M_Quit_Key (key);
|
|
return;
|
|
|
|
case m_serialconfig:
|
|
M_SerialConfig_Key (key);
|
|
return;
|
|
|
|
case m_modemconfig:
|
|
M_ModemConfig_Key (key);
|
|
return;
|
|
|
|
case m_lanconfig:
|
|
M_LanConfig_Key (key);
|
|
return;
|
|
|
|
case m_gameoptions:
|
|
M_GameOptions_Key (key);
|
|
return;
|
|
|
|
case m_search:
|
|
M_Search_Key (key);
|
|
break;
|
|
|
|
case m_slist:
|
|
M_ServerList_Key (key);
|
|
return;
|
|
}
|
|
}
|
|
|
|
int IsMouseOver(MOUSEXY inm, POINT ptm)
|
|
{
|
|
if (ptm.x >= inm.mx1 && ptm.x <= inm.mx2)
|
|
if (ptm.y >= inm.my1 && ptm.y <= inm.my2)
|
|
return 1;
|
|
return 0;
|
|
}
|
|
|
|
void setmousexy(MOUSEXY *inm, int imx1, int offx, int imy1, int offy)
|
|
{
|
|
inm->mx1 = imx1;
|
|
inm->mx2 = inm->mx1 + offx;
|
|
inm->my1 = imy1;
|
|
inm->my2 = inm->my1 + offy;
|
|
} |