fteqw/quakec/menusys/menu/newgame.qc
2020-07-01 05:06:13 +00:00

227 lines
9.8 KiB
C++

//FIXME: maxclients is a QW thing. NQ engines use maxplayers (which requires a disconnect to apply)
static string newgameinfo;
class mitem_newgame : mitem_exmenu
{
virtual string(string key) get =
{
return infoget(newgameinfo, key);
};
virtual void(string key, string newval) set =
{
string old = newgameinfo;
newgameinfo = strzone(infoadd(newgameinfo, key, newval));
if (old)
strunzone(old);
};
};
nonstatic void(mitem_desktop desktop) M_NewGame =
{
mitem_pic banner;
string gametype = argv(1);
local float pos;
mitem_exmenu m;
if (gametype == "sp")
{
//single player has no options. the start map itself gives skill+episode options.
localcmd("\ndisconnect; deathmatch 0; coop 0; maxplayers 0; timelimit 0; fraglimit 0; teamplay 0; samelevel 0; startmap_sp\n");
return;
}
if (gametype == "begin")
{
cvar_set("hostname", infoget(newgameinfo, "hostname"));
cvar_set("deathmatch", infoget(newgameinfo, "deathmatch"));
cvar_set("coop", infoget(newgameinfo, "coop"));
cvar_set("teamplay", infoget(newgameinfo, "teamplay"));
cvar_set("sv_public", infoget(newgameinfo, "sv_public"));
cvar_set("maxclients", infoget(newgameinfo, "maxclients"));
cvar_set("timelimit", infoget(newgameinfo, "timelimit"));
cvar_set("fraglimit", infoget(newgameinfo, "fraglimit"));
string map = infoget(newgameinfo, "map");
if (map == "")
map = sprintf("dm%g", floor(random(1, 6)));
localcmd(sprintf("\nmap \"%s\"\n", map));
return;
}
if (newgameinfo)
strunzone(newgameinfo);
newgameinfo = "";
newgameinfo = infoadd(newgameinfo, "hostname", cvar_string("hostname"));
newgameinfo = infoadd(newgameinfo, "deathmatch", cvar_string("deathmatch"));
newgameinfo = infoadd(newgameinfo, "teamplay", cvar_string("teamplay"));
newgameinfo = infoadd(newgameinfo, "sv_public", cvar_string("sv_public"));
newgameinfo = infoadd(newgameinfo, "maxclients", cvar_string("maxclients"));
newgameinfo = infoadd(newgameinfo, "timelimit", cvar_string("timelimit"));
newgameinfo = infoadd(newgameinfo, "fraglimit", cvar_string("fraglimit"));
newgameinfo = strzone(newgameinfo);
m = spawn(mitem_newgame, item_text:_("New Game"), item_flags:IF_SELECTABLE, item_command:"m_main");
desktop.add(m, RS_X_MIN_PARENT_MIN|RS_Y_MIN_PARENT_MIN | RS_X_MAX_PARENT_MAX|RS_Y_MAX_PARENT_MAX, '0 0', '0 0');
desktop.item_focuschange(m, IF_KFOCUSED);
m.totop();
switch(gametype)
{
case "tdm":
case "dm":
case "coop":
case "sp":
break;
default:
//show game type selection
pos = (16/-2)*(4);
banner = spawn(mitem_pic, item_text:"gfx/p_option.lmp", item_size_y:24, item_flags:IF_CENTERALIGN);
m.addm(banner, [(160-banner.item_size_x)*0.5, pos-32], [(160+banner.item_size_x)*0.5, pos-8]);
m.addm(spawn(mitem_text, item_text:"Single Player", item_command:"m_pop;m_newgame sp", item_scale:16, item_flags:IF_CENTERALIGN), [0, pos], [160, pos+16]); pos += 16;
m.addm(spawn(mitem_text, item_text:"Cooperative", item_command:"m_pop;m_newgame coop", item_scale:16, item_flags:IF_CENTERALIGN), [0, pos], [160, pos+16]); pos += 16;
m.addm(spawn(mitem_text, item_text:"Deathmatch", item_command:"m_pop;m_newgame dm", item_scale:16, item_flags:IF_CENTERALIGN), [0, pos], [160, pos+16]); pos += 16;
m.addm(spawn(mitem_text, item_text:"Team Deathmatch", item_command:"m_pop;m_newgame tdm", item_scale:16, item_flags:IF_CENTERALIGN), [0, pos], [160, pos+16]); pos += 16;
m.add(spawn (mitem_spinnymodel, item_text: "progs/soldier.mdl",firstframe:73, framecount:8, shootframe:81, shootframes:9), RS_X_MIN_PARENT_MID|RS_Y_MIN_PARENT_MID | RS_X_MAX_PARENT_MID|RS_Y_MAX_PARENT_MID, [-160, 12*-16/2], [0, 12*16/2]);
return;
}
pos = (16/-2)*(4);
banner = spawn(mitem_pic, item_text:"gfx/p_multi.lmp", item_size_y:24, item_flags:IF_CENTERALIGN);
m.addm(banner, [(160-banner.item_size_x)*0.5, pos-32], [(160+banner.item_size_x)*0.5, pos-8]);
m.addm(menuitemeditt_spawn(_("Hostname"), "hostname", '280 8'), [-160, pos], [160, pos+8]); pos += 8;
m.addm(menuitemcombo_spawn(_("Public"), "sv_public", '280 8', _(
"-1 \"Reject All (Splitscreen)\" "
"0 \"Private (Manual IP Sharing)\" "
"1 \"Public (Manual Config)\" "
"2 \"Public (Holepunch)\" "
)), [-160, pos], [160, pos+8]); pos += 8;
m.addm(menuitemcombo_spawn(_("Max Clients"), "maxclients", '280 8', _(
"2 \"Two\" "
"3 \"Three\" "
"4 \"Four\" "
"8 \"Eight\" "
"16 \"Sixteen\" "
"32 \"Thirty Two\" "
)), [-160, pos], [160, pos+8]); pos += 8;
if (gametype == "dm" || gametype == "tdm")
{
if (m.get("deathmatch") == "0")
{
m.set("deathmatch", "1");
m.set("coop", "0");
}
m.addm(menuitemcombo_spawn(_("Deathmatch Mode"), "deathmatch", '280 8', _(
"1 \"Weapons Respawn\" "
"2 \"Weapons Stay\" "
"3 \"Powerups Respawn\" "
"4 \"Start With Weapons\" "
)), [-160, pos], [160, pos+8]); pos += 8;
}
else
{
if (m.get("coop") == "0")
{
m.set("deathmatch", "0");
m.set("coop", "1");
}
}
if (gametype == "tdm")
{
if (m.get("teamplay") == "0")
m.set("teamplay", "1");
}
if (gametype == "dm")
{
if (m.get("teamplay") != "0")
m.set("teamplay", "0");
}
if (gametype == "coop")
m.addm(menuitemcheck_spawn(_("No Friendly Fire"), "teamplay", '280 8'), [-160, pos], [160, pos+8]); pos += 8;
// if (gametype == "dm" || gametype == "tdm")
if (gametype == "coop")
m.set("map", "start");
else
{
m.addm(menuitemcombo_spawn(_("Time Limit"), "timelimit", '280 8', _(
"0 \"No Limit\" "
"5 \"5 minutes\" "
"10 \"10 minutes\" "
"15 \"15 minutes\" "
"20 \"20 minutes\" "
"25 \"25 minutes\" "
"30 \"30 minutes\" "
"35 \"35 minutes\" "
"40 \"40 minutes\" "
"45 \"45 minutes\" "
"50 \"50 minutes\" "
"55 \"55 minutes\" "
"60 \"1 hour\" "
)), [-160, pos], [160, pos+8]); pos += 8;
m.addm(menuitemcombo_spawn(_("Frag Limit"), "fraglimit", '280 8', _(
"0 \"No Limit\" "
"10 \"10 frags\" "
"20 \"20 frags\" "
"30 \"30 frags\" "
"40 \"40 frags\" "
"50 \"50 frags\" "
"60 \"60 frags\" "
"70 \"70 frags\" "
"80 \"80 frags\" "
"90 \"90 frags\" "
"100 \"100 frags\" "
)), [-160, pos], [160, pos+8]); pos += 8;
m.set("map", "");
m.addm(menuitemcombo_spawn(_("Initial Map"), "map", '280 8', _(
"dm1 \"DM1 (dm1)\" "
"dm2 \"DM2 (dm2)\" "
"dm3 \"DM3 (dm3)\" "
"dm4 \"DM4 (dm4)\" "
"dm5 \"DM5 (dm5)\" "
"dm6 \"DM6 (dm6)\" "
"start \"Start (Introduction)\" "
"e1m1 \"E1M1 (The Slipgate Complex)\" "
"e1m2 \"E1M2 (Castle Of The Damned)\" "
"e1m3 \"E1M3 (The Necropolis)\" "
"e1m4 \"E1M4 (The Grisly Grotto)\" "
"e1m5 \"E1M5 (Gloom Keep)\" "
"e1m6 \"E1M6 (The Door To Chthon)\" "
"e1m7 \"E1M7 (The House Of Chthon)\" "
"e1m8 \"E1M8 (Ziggarat Vertigo)\" "
"e2m1 \"E2M1 (The Installation)\" "
"e2m2 \"E2M2 (The Ogre Citadel)\" "
"e2m3 \"E2M3 (The Crypt Of Decay)\" "
"e2m4 \"E2M4 (The Ebon Fortress)\" "
"e2m5 \"E2M5 (The Wizard's Manse)\" "
"e2m6 \"E2M6 (The Dismal Oubliette\" "
"e2m7 \"E2M7 (The Underearth)\" "
"e3m1 \"E3M1 (Termination Central)\" "
"e3m2 \"E3M2 (The Vaults Of Zin)\" "
"e3m3 \"E3M3 (The Tomb Of Terror)\" "
"e3m4 \"E3M4 (Satan's Dark Delight)\" "
"e3m5 \"E3M5 (The Wind Tunnels)\" "
"e3m6 \"E3M6 (Chambers Of Torment)\" "
"e3m7 \"E3M7 (Tha Haunted Halls)\" "
"e4m1 \"E4M1 (The Sewage System)\" "
"e4m2 \"E4M2 (The Tower Of Despair)\" "
"e4m3 \"E4M3 (The Elder God Shrine)\" "
"e4m4 \"E4M4 (The Palace Of Hate)\" "
"e4m5 \"E4M5 (Hell's Atrium)\" "
"e4m6 \"E4M6 (The Pain Maze)\" "
"e4m7 \"E4M7 (Azure Agony)\" "
"e4m8 \"E4M8 (The Nameless City)\" "
"end \"End (Shub-Niggurath's Pit)\" "
)), [-160, pos], [160, pos+8]); pos += 8;
}
m.addm(spawn(mitem_text, item_text:"BEGIN!", item_command:"m_pop;m_newgame begin", item_scale:16, item_flags:IF_CENTERALIGN), [-160, pos], [160, pos+16]);
//random art for style
if (gametype == "coop")
m.add(spawn (mitem_spinnymodel, item_text: "progs/soldier.mdl", firstframe:73, framecount:8, shootframe:81, shootframes:9), RS_X_MIN_PARENT_MID|RS_Y_MIN_PARENT_MID | RS_X_MAX_PARENT_MID|RS_Y_MAX_PARENT_MID, [-160, -240/2], [0, 240/2]);
else
m.add(spawn (mitem_spinnymodel, item_text: "progs/player.mdl", firstframe:0, framecount:6, shootframe:119, shootframes:6), RS_X_MIN_PARENT_MID|RS_Y_MIN_PARENT_MID | RS_X_MAX_PARENT_MID|RS_Y_MAX_PARENT_MID, [-160, 12*-16/2], [0, 12*16/2]);
addmenuback(m);
};