mirror of
https://github.com/nzp-team/fteqw.git
synced 2024-11-23 20:32:43 +00:00
9ae7e2621d
Lots of changes. CSQC should be functional, but is still tied to debug builds. It WILL have some bugs still, hopefully I'll be able to clean them up better if people test it a bit. Precompiled headers are working properly now. Compile times are now much quicker in msvc. This takes most of the files this commit. Restructured how client commands work. They're buffered outside the network message, some multithreaded code is in. It needs a bit of testing before it's active. git-svn-id: https://svn.code.sf.net/p/fteqw/code/trunk@885 fc73d0e0-1445-4013-8a0c-d673dee63da5
398 lines
9.4 KiB
C
398 lines
9.4 KiB
C
//read menu.h
|
|
|
|
#include "quakedef.h"
|
|
#include "winquake.h"
|
|
|
|
extern cvar_t maxclients;
|
|
|
|
menutext_t *MC_AddWhiteText(menu_t *menu, int x, int y, const char *text, qboolean rightalign);
|
|
|
|
/* MULTIPLAYER MENU */
|
|
void M_Menu_MultiPlayer_f (void)
|
|
{
|
|
menubutton_t *b;
|
|
menu_t *menu;
|
|
mpic_t *p;
|
|
|
|
p = Draw_SafeCachePic("gfx/mp_menu.lmp");
|
|
|
|
key_dest = key_menu;
|
|
m_state = m_complex;
|
|
m_entersound = true;
|
|
|
|
menu = M_CreateMenu(0);
|
|
|
|
if (p)
|
|
{
|
|
MC_AddPicture(menu, 16, 4, "gfx/qplaque.lmp");
|
|
MC_AddCenterPicture(menu, 4, "gfx/p_multi.lmp");
|
|
MC_AddPicture(menu, 72, 32, "gfx/mp_menu.lmp");
|
|
}
|
|
|
|
b = MC_AddConsoleCommand(menu, 72, 32, "", "menu_slist\n");
|
|
menu->selecteditem = (menuoption_t*)b;
|
|
b->common.height = 20;
|
|
b->common.width = p?p->width:320;
|
|
b = MC_AddConsoleCommand(menu, 72, 52, "", "menu_newmulti\n");
|
|
b->common.height = 20;
|
|
b->common.width = p?p->width:320;
|
|
b = MC_AddConsoleCommand(menu, 72, 72, "", "menu_setup\n");
|
|
b->common.height = 20;
|
|
b->common.width = p?p->width:320;
|
|
|
|
b = MC_AddConsoleCommand(menu, 72, 92, "", "menu_demo\n");
|
|
MC_AddWhiteText(menu, 72, 92+20/2-6, "Demos", false);
|
|
b->common.height = 20/2+2;
|
|
b->common.width = p?p->width:320;
|
|
|
|
menu->cursoritem = (menuoption_t*)MC_AddCursor(menu, 54, 32);
|
|
}
|
|
|
|
extern cvar_t team, skin;
|
|
extern cvar_t topcolor;
|
|
extern cvar_t bottomcolor;
|
|
extern cvar_t skill;
|
|
typedef struct {
|
|
menuedit_t *nameedit;
|
|
menuedit_t *teamedit;
|
|
menuedit_t *skinedit;
|
|
int topcolour;
|
|
int lowercolour;
|
|
|
|
int tiwidth, tiheight;
|
|
qbyte translationimage[64*64];
|
|
} setupmenu_t;
|
|
qboolean ApplySetupMenu (union menuoption_s *option,struct menu_s *menu, int key)
|
|
{
|
|
setupmenu_t *info = menu->data;
|
|
if (key != K_ENTER)
|
|
return false;
|
|
Cvar_Set(&name, info->nameedit->text);
|
|
Cvar_Set(&team, info->teamedit->text);
|
|
Cvar_Set(&skin, info->skinedit->text);
|
|
Cbuf_AddText(va("color %i %i\n", info->lowercolour, info->topcolour), RESTRICT_LOCAL);
|
|
m_entersound=true;
|
|
M_RemoveMenu(menu);
|
|
return true;
|
|
}
|
|
qboolean SetupMenuColour (union menuoption_s *option,struct menu_s *menu, int key)
|
|
{
|
|
setupmenu_t *info = menu->data;
|
|
if (*option->button.text == 'T')
|
|
{
|
|
if (key == K_ENTER || key == K_RIGHTARROW)
|
|
{
|
|
info->topcolour ++;
|
|
if (info->topcolour>=14)
|
|
info->topcolour=0;
|
|
m_entersound=true;
|
|
return true;
|
|
}
|
|
if (key == K_LEFTARROW)
|
|
{
|
|
info->topcolour --;
|
|
if (info->topcolour<=0)
|
|
info->topcolour=13;
|
|
m_entersound=true;
|
|
return true;
|
|
}
|
|
|
|
}
|
|
else
|
|
{
|
|
if (key == K_ENTER || key == K_RIGHTARROW)
|
|
{
|
|
info->lowercolour ++;
|
|
if (info->lowercolour>=14)
|
|
info->lowercolour=0;
|
|
m_entersound=true;
|
|
return true;
|
|
}
|
|
if (key == K_LEFTARROW)
|
|
{
|
|
info->lowercolour --;
|
|
if (info->lowercolour<=0)
|
|
info->lowercolour=13;
|
|
m_entersound=true;
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
void MSetup_TransDraw (int x, int y, menucustom_t *option, menu_t *menu)
|
|
{
|
|
extern qbyte translationTable[256];
|
|
setupmenu_t *info = menu->data;
|
|
mpic_t *p;
|
|
qbyte *f;
|
|
|
|
if (info->skinedit->modified)
|
|
{
|
|
info->skinedit->modified = false;
|
|
|
|
f = COM_LoadMallocFile (va("gfx/player/%s.lmp", info->skinedit->text));
|
|
if (!f)
|
|
f = COM_LoadMallocFile("gfx/menuplyr.lmp");
|
|
|
|
if (f)
|
|
{
|
|
info->tiwidth = ((int*)f)[0];
|
|
info->tiheight = ((int*)f)[1];
|
|
memcpy(info->translationimage, f+8, info->tiwidth*info->tiheight);
|
|
BZ_Free(f);
|
|
}
|
|
}
|
|
|
|
p = Draw_CachePic ("gfx/bigbox.lmp");
|
|
Draw_TransPic (x-12, y-8, p);
|
|
|
|
M_BuildTranslationTable(info->topcolour*16, info->lowercolour*16);
|
|
Draw_TransPicTranslate (x, y, info->tiwidth, info->tiheight, info->translationimage, translationTable);
|
|
}
|
|
|
|
void M_Menu_Setup_f (void)
|
|
{
|
|
setupmenu_t *info;
|
|
menu_t *menu;
|
|
|
|
key_dest = key_menu;
|
|
m_state = m_complex;
|
|
m_entersound = true;
|
|
|
|
menu = M_CreateMenu(sizeof(setupmenu_t));
|
|
info = menu->data;
|
|
|
|
MC_AddPicture(menu, 16, 4, "gfx/qplaque.lmp");
|
|
MC_AddCenterPicture(menu, 4, "gfx/p_multi.lmp");
|
|
|
|
|
|
// MC_AddPicture(menu, 72, 32, Draw_CachePic ("gfx/mp_menu.lmp") );
|
|
|
|
menu->selecteditem = (menuoption_t*)
|
|
(info->nameedit = MC_AddEdit(menu, 64, 40, "Your name", name.string));
|
|
(info->teamedit = MC_AddEdit(menu, 64, 56, "Your team", team.string));
|
|
(info->skinedit = MC_AddEdit(menu, 64, 72, "Your skin", skin.string));
|
|
|
|
MC_AddCustom(menu, 172, 88, NULL)->draw = MSetup_TransDraw;
|
|
|
|
MC_AddCommand(menu, 64, 96, "Top colour", SetupMenuColour);
|
|
MC_AddCommand(menu, 64, 120, "Lower colour", SetupMenuColour);
|
|
|
|
MC_AddCommand(menu, 64, 152, "Accept changes", ApplySetupMenu);
|
|
|
|
menu->cursoritem = (menuoption_t*)MC_AddWhiteText(menu, 54, 32, NULL, false);
|
|
|
|
|
|
info->lowercolour = bottomcolor.value;
|
|
info->topcolour = topcolor.value;
|
|
info->skinedit->modified = true;
|
|
}
|
|
|
|
|
|
|
|
#ifdef CL_MASTER
|
|
void M_Menu_ServerList_f (void)
|
|
{
|
|
key_dest = key_menu;
|
|
m_state = m_slist;
|
|
m_entersound = true;
|
|
|
|
MasterInfo_Begin();
|
|
}
|
|
#endif
|
|
|
|
void M_ServerList_Draw (void)
|
|
{
|
|
#ifdef CL_MASTER
|
|
M_DrawServers();
|
|
#endif
|
|
}
|
|
|
|
void M_ServerList_Key (int k)
|
|
{
|
|
#ifdef CL_MASTER
|
|
M_SListKey(k);
|
|
#endif
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
#ifdef CLIENTONLY
|
|
void M_Menu_GameOptions_f (void)
|
|
{
|
|
}
|
|
#else
|
|
|
|
typedef struct {
|
|
menuedit_t *hostnameedit;
|
|
menucombo_t *deathmatch;
|
|
menucombo_t *numplayers;
|
|
menucombo_t *teamplay;
|
|
menucombo_t *skill;
|
|
menucombo_t *timelimit;
|
|
menucombo_t *fraglimit;
|
|
menuedit_t *mapnameedit;
|
|
menucheck_t *rundedicated;
|
|
|
|
int topcolour;
|
|
int lowercolour;
|
|
} newmultimenu_t;
|
|
|
|
static char *numplayeroptions[] = {
|
|
"2",
|
|
"3",
|
|
"4",
|
|
"8",
|
|
"12",
|
|
"16",
|
|
"20",
|
|
"24",
|
|
"32",
|
|
NULL
|
|
};
|
|
|
|
qboolean MultiBeginGame (union menuoption_s *option,struct menu_s *menu, int key)
|
|
{
|
|
newmultimenu_t *info = menu->data;
|
|
if (key != K_ENTER)
|
|
return false;
|
|
|
|
if (cls.state)
|
|
Cbuf_AddText("disconnect\n", RESTRICT_LOCAL);
|
|
|
|
Cbuf_AddText(va("maxclients \"%s\"\n", numplayeroptions[info->numplayers->selectedoption]), RESTRICT_LOCAL);
|
|
if (info->rundedicated->value)
|
|
Cbuf_AddText("setrenderer dedicated\n", RESTRICT_LOCAL);
|
|
Cbuf_AddText(va("hostname \"%s\"\n", info->hostnameedit->text), RESTRICT_LOCAL);
|
|
Cbuf_AddText(va("deathmatch %i\n", info->deathmatch->selectedoption), RESTRICT_LOCAL);
|
|
if (!info->deathmatch->selectedoption)
|
|
Cbuf_AddText("coop 1\n", RESTRICT_LOCAL);
|
|
else
|
|
Cbuf_AddText("coop 0\n", RESTRICT_LOCAL);
|
|
Cbuf_AddText(va("teamplay %i\n", info->teamplay->selectedoption), RESTRICT_LOCAL);
|
|
Cbuf_AddText(va("skill %i\n", info->skill->selectedoption), RESTRICT_LOCAL);
|
|
Cbuf_AddText(va("timelimit %i\n", info->timelimit->selectedoption*5), RESTRICT_LOCAL);
|
|
Cbuf_AddText(va("fraglimit %i\n", info->fraglimit->selectedoption*10), RESTRICT_LOCAL);
|
|
Cbuf_AddText(va("map \"%s\"\n", info->mapnameedit->text), RESTRICT_LOCAL);
|
|
|
|
if (info->rundedicated->value)
|
|
{
|
|
Cbuf_AddText("echo You can use the setrenderer command to return to a graphical interface at any time\n", RESTRICT_LOCAL);
|
|
}
|
|
|
|
m_entersound=true;
|
|
M_RemoveAllMenus();
|
|
|
|
return true;
|
|
}
|
|
void M_Menu_GameOptions_f (void)
|
|
{
|
|
extern cvar_t pr_maxedicts;
|
|
static char *deathmatchoptions[] = {
|
|
"Cooperative",
|
|
"Deathmatch 1",
|
|
"Deathmatch 2",
|
|
"Deathmatch 3",
|
|
"Deathmatch 4",
|
|
"Deathmatch 5",
|
|
NULL
|
|
};
|
|
static char *teamplayoptions[] = {
|
|
"off",
|
|
"friendly fire",
|
|
"no friendly fire",
|
|
NULL
|
|
};
|
|
static char *skilloptions[] = {
|
|
"Easy",
|
|
"Medium",
|
|
"Hard",
|
|
"NIGHTMARE",
|
|
NULL
|
|
};
|
|
static char *timelimitoptions[] = {
|
|
"no limit",
|
|
"5 minutes",
|
|
"10 minutes",
|
|
"15 minutes",
|
|
"20 minutes",
|
|
"25 minutes",
|
|
"30 minutes",
|
|
"35 minutes",
|
|
"40 minutes",
|
|
"45 minutes",
|
|
"50 minutes",
|
|
"55 minutes",
|
|
"1 hour",
|
|
NULL
|
|
};
|
|
static char *fraglimitoptions[] = {
|
|
"no limit",
|
|
"10 frags",
|
|
"20 frags",
|
|
"30 frags",
|
|
"40 frags",
|
|
"50 frags",
|
|
"60 frags",
|
|
"70 frags",
|
|
"80 frags",
|
|
"90 frags",
|
|
"100 frags",
|
|
NULL
|
|
};
|
|
newmultimenu_t *info;
|
|
menu_t *menu;
|
|
int y = 40;
|
|
int players;
|
|
|
|
key_dest = key_menu;
|
|
m_state = m_complex;
|
|
m_entersound = true;
|
|
|
|
menu = M_CreateMenu(sizeof(newmultimenu_t));
|
|
info = menu->data;
|
|
|
|
MC_AddPicture(menu, 16, 4, "gfx/qplaque.lmp");
|
|
MC_AddCenterPicture(menu, 4, "gfx/p_multi.lmp");
|
|
|
|
|
|
// MC_AddPicture(menu, 72, 32, ("gfx/mp_menu.lmp") );
|
|
|
|
menu->selecteditem = (menuoption_t*)
|
|
MC_AddCommand (menu, 64, y, " Start game", MultiBeginGame);y+=16;
|
|
|
|
info->hostnameedit = MC_AddEdit (menu, 64, y, " Hostname", name.string);y+=16;
|
|
|
|
for (players = 0; players < sizeof(numplayeroptions)/ sizeof(numplayeroptions[0]); players++)
|
|
{
|
|
if (atoi(numplayeroptions[players]) >= maxclients.value)
|
|
break;
|
|
}
|
|
|
|
info->numplayers = MC_AddCombo (menu, 64, y, "Max players", (const char **)numplayeroptions, players);y+=8;
|
|
|
|
info->deathmatch = MC_AddCombo (menu, 64, y, " Deathmatch", (const char **)deathmatchoptions, deathmatch.value);y+=8;
|
|
info->teamplay = MC_AddCombo (menu, 64, y, " Teamplay", (const char **)teamplayoptions, teamplay.value);y+=8;
|
|
info->skill = MC_AddCombo (menu, 64, y, " Skill", (const char **)skilloptions, skill.value);y+=8;
|
|
info->rundedicated = MC_AddCheckBox(menu, 64, y, " dedicated", NULL, 0);y+=8;
|
|
y+=8;
|
|
info->timelimit = MC_AddCombo (menu, 64, y, " Time Limit", (const char **)timelimitoptions, timelimit.value/5);y+=8;
|
|
info->fraglimit = MC_AddCombo (menu, 64, y, " Frag Limit", (const char **)fraglimitoptions, fraglimit.value/10);y+=8;
|
|
y+=8;
|
|
MC_AddSlider (menu, 64-7*8, y, "Extra edict support", &pr_maxedicts, 512, 2047);y+=8;
|
|
y+=8;
|
|
info->mapnameedit = MC_AddEdit (menu, 64, y, " map", "start");y+=16;
|
|
info->mapnameedit = MC_AddEdit (menu, 64, y, " map", "start");y+=16;
|
|
|
|
|
|
|
|
menu->cursoritem = (menuoption_t*)MC_AddWhiteText(menu, 54, 32, NULL, false);
|
|
|
|
|
|
info->lowercolour = bottomcolor.value;
|
|
info->topcolour = topcolor.value;
|
|
}
|
|
#endif
|
|
|