From 4c86b86f9905ac271d4263bd8a892a176903605d Mon Sep 17 00:00:00 2001 From: div0 Date: Fri, 16 Nov 2007 11:38:36 +0000 Subject: [PATCH] game mode selection in menu... will do the listbox later. Need to think of a way to set the limits to 0 (unlimited) and -1 (default) git-svn-id: svn://svn.icculus.org/nexuiz/trunk@2968 f962a42d-fe04-0410-a3ab-8c8b0445ebaa --- data/default.cfg | 3 + data/qcsrc/common/mapinfo.qc | 3 +- data/qcsrc/menu-div0test/classes.c | 2 + .../menu-div0test/nexuiz/dialog_multiplayer.c | 10 +- .../nexuiz/dialog_multiplayer_create.c | 99 +++++++++++++++++++ .../menu-div0test/nexuiz/gametypebutton.c | 63 ++++++++++++ data/qcsrc/server/teamplay.qc | 2 + 7 files changed, 177 insertions(+), 5 deletions(-) create mode 100644 data/qcsrc/menu-div0test/nexuiz/dialog_multiplayer_create.c create mode 100644 data/qcsrc/menu-div0test/nexuiz/gametypebutton.c diff --git a/data/default.cfg b/data/default.cfg index 604346b09..b1d5e0321 100644 --- a/data/default.cfg +++ b/data/default.cfg @@ -298,6 +298,9 @@ seta g_tdm_teams 2 // how many teams are in team deathmatch set g_changeteam_banned 0 // not allowed to change team set g_changeteam_fragtransfer 0 // % of frags you get to keep when you change teams (rounded down) +// dm +set g_dm 1 // actually, this is a dummy cvar just to make the menu happy + // ctf set g_ctf 0 set g_ctf_flag_returntime 30 diff --git a/data/qcsrc/common/mapinfo.qc b/data/qcsrc/common/mapinfo.qc index e8b8a10d9..9bfcf7bc4 100644 --- a/data/qcsrc/common/mapinfo.qc +++ b/data/qcsrc/common/mapinfo.qc @@ -103,7 +103,7 @@ float MapInfo_FilterGametype(float pGametype, float pFeatures) if(_MapInfo_filtered) strunzone(_MapInfo_filtered); _MapInfo_filtered = MapInfo_FilterGametype_Recursive(pGametype, pFeatures, 0, _MapInfo_globcount); - if(!_MapInfo_filtered) + if not(_MapInfo_filtered) { dprint("Autogenerated a .mapinfo, doing the rest later.\n"); return 0; @@ -465,6 +465,7 @@ float MapInfo_CheckMap(string s) // returns 0 if the map can't be played with th void MapInfo_SwitchGameType(float t) { cvar_set("gamecfg", "0"); + cvar_set("g_dm", (t == MAPINFO_TYPE_DEATHMATCH) ? "0" : "1"); cvar_set("g_tdm", (t == MAPINFO_TYPE_TEAM_DEATHMATCH) ? "0" : "1"); cvar_set("g_domination", (t == MAPINFO_TYPE_DOMINATION) ? "0" : "1"); cvar_set("g_ctf", (t == MAPINFO_TYPE_CTF) ? "0" : "1"); diff --git a/data/qcsrc/menu-div0test/classes.c b/data/qcsrc/menu-div0test/classes.c index b41804fa8..9fc138a16 100644 --- a/data/qcsrc/menu-div0test/classes.c +++ b/data/qcsrc/menu-div0test/classes.c @@ -42,3 +42,5 @@ #include "nexuiz/serverlist.c" #include "nexuiz/inputbox.c" #include "nexuiz/dialog_quit.c" +#include "nexuiz/dialog_multiplayer_create.c" +#include "nexuiz/gametypebutton.c" diff --git a/data/qcsrc/menu-div0test/nexuiz/dialog_multiplayer.c b/data/qcsrc/menu-div0test/nexuiz/dialog_multiplayer.c index 4e0e3f32b..e06cc08f7 100644 --- a/data/qcsrc/menu-div0test/nexuiz/dialog_multiplayer.c +++ b/data/qcsrc/menu-div0test/nexuiz/dialog_multiplayer.c @@ -12,12 +12,14 @@ ENDCLASS(NexuizMultiplayerDialog) #ifdef IMPLEMENTATION void fillNexuizMultiplayerDialog(entity me) { - entity mc; + entity mc, e; mc = makeNexuizTabController(me.rows - 2); me.TR(me); - me.TD(me, 1, 1, mc.makeTabButton(mc, "Serverlist", makeNexuizServerListTab())); - me.TD(me, 1, 1, mc.makeTabButton(mc, "Player Setup", makeNexuizPlayerSettingsTab())); - me.TD(me, 1, 1, mc.makeTabButton(mc, "Server Setup", makeNexuizPlayerSettingsTab())); + me.TD(me, 1, 1, e = mc.makeTabButton(mc, "Join", makeNexuizServerListTab())); + me.TD(me, 1, 1, e = mc.makeTabButton(mc, "Player Setup", makeNexuizPlayerSettingsTab())); + if(cvar_string("_cl_name") == "Player") + e.onClick(e, e.onClickEntity); // lol animation + me.TD(me, 1, 1, e = mc.makeTabButton(mc, "Create", makeNexuizServerCreateTab())); me.TR(me); me.TR(me); me.TD(me, me.rows - 2, me.columns, mc); diff --git a/data/qcsrc/menu-div0test/nexuiz/dialog_multiplayer_create.c b/data/qcsrc/menu-div0test/nexuiz/dialog_multiplayer_create.c new file mode 100644 index 000000000..fc7604b82 --- /dev/null +++ b/data/qcsrc/menu-div0test/nexuiz/dialog_multiplayer_create.c @@ -0,0 +1,99 @@ +#ifdef INTERFACE +CLASS(NexuizServerCreateTab) EXTENDS(NexuizTab) + METHOD(NexuizServerCreateTab, fill, void(entity)) + METHOD(NexuizServerCreateTab, gameTypeChangeNotify, void(entity)) + ATTRIB(NexuizServerCreateTab, title, string, "Create") + ATTRIB(NexuizServerCreateTab, intendedWidth, float, 0.9) + ATTRIB(NexuizServerCreateTab, rows, float, 22) + ATTRIB(NexuizServerCreateTab, columns, float, 6.5) + + ATTRIB(NexuizServerCreateTab, sliderFraglimit, entity, NULL) + ATTRIB(NexuizServerCreateTab, checkboxFraglimit, entity, NULL) +ENDCLASS(NexuizServerCreateTab) +entity makeNexuizServerCreateTab(); +#endif + +#ifdef IMPLEMENTATION + +entity makeNexuizServerCreateTab() +{ + entity me; + me = spawnNexuizServerCreateTab(); + me.configureDialog(me); + return me; +} +void fillNexuizServerCreateTab(entity me) +{ + entity e, e0; + + me.TR(me); + me.TD(me, 1, me.columns / 9, e = makeNexuizGametypeButton(1, "g_dm", "DM")); + e0 = e; + me.TD(me, 1, me.columns / 9, e = makeNexuizGametypeButton(1, "g_tdm", "TDM")); + if(e.checked) e0 = NULL; + me.TD(me, 1, me.columns / 9, e = makeNexuizGametypeButton(1, "g_lms", "LMS")); + if(e.checked) e0 = NULL; + me.TD(me, 1, me.columns / 9, e = makeNexuizGametypeButton(1, "g_arena", "Arena")); + if(e.checked) e0 = NULL; + me.TD(me, 1, me.columns / 9, e = makeNexuizGametypeButton(1, "g_runematch", "Rune")); + if(e.checked) e0 = NULL; + me.TD(me, 1, me.columns / 9, e = makeNexuizGametypeButton(1, "g_keyhunt", "Key Hunt")); + if(e.checked) e0 = NULL; + me.TD(me, 1, me.columns / 9, e = makeNexuizGametypeButton(1, "g_ctf", "CTF")); + if(e.checked) e0 = NULL; + me.TD(me, 1, me.columns / 9, e = makeNexuizGametypeButton(1, "g_assault", "Assault")); + if(e.checked) e0 = NULL; + me.TD(me, 1, me.columns / 9, e = makeNexuizGametypeButton(1, "g_onslaught", "Onslaught")); + if(e.checked) e0 = NULL; + if(e0) + { + print("NO CHECK\n"); + e0.setChecked(e0, 1); + } + me.TR(me); + me.TR(me); + me.TD(me, 1, 3, e = makeNexuizTextLabel(0, "Map list:")); + + me.gotoXY(me, 2, 3.5); me.setFirstColumn(me, me.currentColumn); + me.TD(me, 1, 1, e = makeNexuizTextLabel(0, "Time limit:")); + me.TD(me, 1, 2, e = makeNexuizSlider(1.0, 60.0, 0.5, "timelimit_override")); + me.TR(me); + me.TD(me, 1, 1, e = makeNexuizTextLabel(0, "Point limit:")); + me.checkboxFraglimit = e; + me.TD(me, 1, 2, e = makeNexuizSlider(1.0, 2000.0, 5, "fraglimit_override")); + me.sliderFraglimit = e; + + me.gotoXY(me, me.rows - 1, 0); + me.TD(me, 1, me.columns, e = makeNexuizButton("Start!", '0 0 0')); + + me.gameTypeChangeNotify(me); +} + +void GameType_ConfigureSliders(entity e, entity l, string pLabel, float pMin, float pMax, float pStep, string pCvar) +{ + e.configureNexuizSlider(e, pMin, pMax, pStep, pCvar); + l.setText(l, pLabel); +} + +void gameTypeChangeNotifyNexuizServerCreateTab(entity me) +{ + // tell the map list to update + float gt; + entity e, l; + gt = MapInfo_CurrentGametype(); + e = me.sliderFraglimit; + l = me.checkboxFraglimit; + switch(gt) + { + case MAPINFO_TYPE_CTF: GameType_ConfigureSliders(e, l, "Point limit:", 50, 500, 10, "g_ctf_capture_limit"); break; + case MAPINFO_TYPE_DOMINATION: GameType_ConfigureSliders(e, l, "Point limit:", 50, 500, 10, "g_domination_point_limit"); break; + case MAPINFO_TYPE_KEYHUNT: GameType_ConfigureSliders(e, l, "Point limit:", 200, 1500, 50, "g_keyhunt_point_limit"); break; + case MAPINFO_TYPE_RUNEMATCH: GameType_ConfigureSliders(e, l, "Point limit:", 50, 500, 10, "g_runematch_point_limit"); break; + case MAPINFO_TYPE_LMS: GameType_ConfigureSliders(e, l, "Lives:", 3, 50, 1, "g_lms_lives_override"); break; + default: GameType_ConfigureSliders(e, l, "Frag limit:", 5, 100, 5, "fraglimit_override"); break; + } + MapInfo_FilterGametype(MapInfo_CurrentGametype(), MapInfo_CurrentFeatures()); + print(ftos(MapInfo_count), " maps\n"); +} + +#endif diff --git a/data/qcsrc/menu-div0test/nexuiz/gametypebutton.c b/data/qcsrc/menu-div0test/nexuiz/gametypebutton.c new file mode 100644 index 000000000..8166d3a23 --- /dev/null +++ b/data/qcsrc/menu-div0test/nexuiz/gametypebutton.c @@ -0,0 +1,63 @@ +#ifdef INTERFACE +CLASS(NexuizGametypeButton) EXTENDS(RadioButton) + METHOD(NexuizGametypeButton, configureNexuizGametypeButton, void(entity, float, string, string)) + METHOD(NexuizGametypeButton, setChecked, void(entity, float)) + ATTRIB(NexuizGametypeButton, fontSize, float, SKINFONTSIZE_NORMAL) + ATTRIB(NexuizGametypeButton, image, string, SKINGFX_BUTTON) + ATTRIB(NexuizGametypeButton, color, vector, SKINCOLOR_BUTTON_N) + ATTRIB(NexuizGametypeButton, colorC, vector, SKINCOLOR_BUTTON_C) + ATTRIB(NexuizGametypeButton, colorF, vector, SKINCOLOR_BUTTON_F) + ATTRIB(NexuizGametypeButton, colorD, vector, SKINCOLOR_BUTTON_D) + ATTRIB(NexuizGametypeButton, srcMulti, float, 1) + ATTRIB(NexuizGametypeButton, useDownAsChecked, float, 1) + + ATTRIB(NexuizGametypeButton, cvarName, string, string_null) + METHOD(NexuizGametypeButton, loadCvars, void(entity)) + METHOD(NexuizGametypeButton, saveCvars, void(entity)) +ENDCLASS(NexuizGametypeButton) +entity makeNexuizGametypeButton(float, string, string); +#endif + +#ifdef IMPLEMENTATION +void GameTypeButton_Click(entity me, entity other); +entity makeNexuizGametypeButton(float theGroup, string theCvar, string theText) +{ + entity me; + me = spawnNexuizGametypeButton(); + me.configureNexuizGametypeButton(me, theGroup, theCvar, theText); + return me; +} +void configureNexuizGametypeButtonNexuizGametypeButton(entity me, float theGroup, string theCvar, string theText) +{ + if(theCvar) + { + me.cvarName = theCvar; + me.loadCvars(me); + } + me.configureRadioButton(me, theText, me.fontSize, me.image, theGroup, 0); + me.align = 0.5; + me.onClick = GameTypeButton_Click; + me.onClickEntity = NULL; +} +void setCheckedNexuizGametypeButton(entity me, float val) +{ + if(val != me.checked) + { + me.checked = val; + me.saveCvars(me); + } +} +void loadCvarsNexuizGametypeButton(entity me) +{ + me.checked = cvar(me.cvarName); +} +void saveCvarsNexuizGametypeButton(entity me) +{ + cvar_set(me.cvarName, ftos(me.checked)); +} +void GameTypeButton_Click(entity me, entity other) +{ + RadioButton_Click(me, other); + me.parent.gameTypeChangeNotify(me.parent); +} +#endif diff --git a/data/qcsrc/server/teamplay.qc b/data/qcsrc/server/teamplay.qc index c57bcbed7..6c3d60a20 100644 --- a/data/qcsrc/server/teamplay.qc +++ b/data/qcsrc/server/teamplay.qc @@ -96,6 +96,7 @@ void(entity pl) LogTeamchange = void ResetGameCvars() { + cvar_set("g_dm", "0"); cvar_set("g_tdm", "0"); cvar_set("g_domination", "0"); cvar_set("g_ctf", "0"); @@ -263,6 +264,7 @@ void InitGameplayMode() { // we can only assume... ResetGameCvars(); + cvar_set("g_dm", "1"); gamemode_name = "Deathmatch"; teams_matter = 0; } -- 2.39.2