]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/menu/xonotic/dialog_multiplayer_create.c
Merge branch 'master' into terencehill/music_player
[xonotic/xonotic-data.pk3dir.git] / qcsrc / menu / xonotic / dialog_multiplayer_create.c
index f3811f5b94c3e52e83cd0b7b352bc1c5690142e8..8ae9107a9af0d53c4c02968e5fe599099890b281 100644 (file)
@@ -2,22 +2,57 @@
 CLASS(XonoticServerCreateTab) EXTENDS(XonoticTab)
        METHOD(XonoticServerCreateTab, fill, void(entity))
        METHOD(XonoticServerCreateTab, gameTypeChangeNotify, void(entity))
+       METHOD(XonoticServerCreateTab, gameTypeSelectNotify, void(entity))
        ATTRIB(XonoticServerCreateTab, title, string, _("Create"))
        ATTRIB(XonoticServerCreateTab, intendedWidth, float, 0.9)
-       ATTRIB(XonoticServerCreateTab, rows, float, 22)
+       ATTRIB(XonoticServerCreateTab, rows, float, 23)
        ATTRIB(XonoticServerCreateTab, columns, float, 6.2) // added extra .2 for center space
 
        ATTRIB(XonoticServerCreateTab, mapListBox, entity, NULL)
        ATTRIB(XonoticServerCreateTab, sliderFraglimit, entity, NULL)
+       ATTRIB(XonoticServerCreateTab, sliderTeams, entity, NULL)
        ATTRIB(XonoticServerCreateTab, sliderTimelimit, entity, NULL)
-       ATTRIB(XonoticServerCreateTab, checkboxFraglimit, entity, NULL)
-       ATTRIB(XonoticServerCreateTab, checkboxFraglimitMapinfo, entity, NULL)
+       ATTRIB(XonoticServerCreateTab, labelFraglimit, entity, NULL)
+       ATTRIB(XonoticServerCreateTab, labelTeams, entity, NULL)
 ENDCLASS(XonoticServerCreateTab)
 entity makeXonoticServerCreateTab();
 #endif
 
 #ifdef IMPLEMENTATION
 
+void GameType_ConfigureSliders(entity e, entity l, string pLabel, float pMin, float pMax, float pStep, string pCvar)
+{
+       if(pCvar == "")
+       {
+               e.configureXonoticTextSlider(e, string_null);
+               l.setText(l, pLabel);
+               e.disabled = l.disabled = TRUE;
+       }
+       else
+       {
+               e.configureXonoticTextSlider(e, pCvar);
+               
+               // clear old values
+               float i;
+               for(i = 0; i <= e.nValues; ++i);
+               {
+                       if(e.(valueStrings[i])) { strunzone(e.(valueStrings[i])); }
+                       if(e.(valueIdentifiers[i])) { strunzone(e.(valueIdentifiers[i])); }
+               }
+               e.clearValues(e);
+
+               // set new values
+               e.addValue(e, strzone(_("Default")), strzone("-1"));
+               for(i = pMin; i <= pMax; i += pStep) { e.addValue(e, strzone(ftos(i)), strzone(ftos(i))); }
+               e.addValue(e, strzone(_("Unlimited")), strzone("0"));
+               e.configureXonoticTextSliderValues(e);
+
+               // set text field
+               l.setText(l, pLabel);
+               e.disabled = l.disabled = FALSE;
+       }
+}
+
 entity makeXonoticServerCreateTab()
 {
        entity me;
@@ -30,35 +65,47 @@ void XonoticServerCreateTab_fill(entity me)
 {
        entity e, e0;
 
+       me.gotoRC(me, 0.5, 0);
+               me.TD(me, 1, 3, makeXonoticHeaderLabel(_("Gametype")));
        me.TR(me);
-               me.TD(me, 1, 3, e = makeXonoticTextLabel(0, _("Game type:")));
-       me.TR(me);
-               me.TD(me, 8, 3, e = makeXonoticGametypeList());
-       me.TR(me);
-       me.TR(me);
-       me.TR(me);
-       me.TR(me);
-       me.TR(me);
-       me.TR(me);
-       me.TR(me);
-       me.TR(me);
-               //me.TD(me, 1, 3, e = makeXonoticTextLabel(0, _("Match settings:"))); // pointless, overcrowds the dialog imo
-       me.TR(me);
-               me.sliderTimelimit = makeXonoticSlider(1.0, 60.0, 1, "timelimit_override");
-               me.TD(me, 1, 1, e = makeXonoticSliderCheckBox(0, 1, me.sliderTimelimit, _("Time limit:")));
-               me.TD(me, 1, 2, me.sliderTimelimit);
-       me.TR(me);
-               me.TDempty(me, 0.2);
-               me.TD(me, 1, 2.8, e = makeXonoticSliderCheckBox(-1, 0, me.sliderTimelimit, _("Use map specified default")));
-       me.TR(me);
-               me.sliderFraglimit = makeXonoticSlider(1.0, 2000.0, 5, "fraglimit_override");
-               me.TD(me, 1, 1, e = makeXonoticSliderCheckBox(0, 1, me.sliderFraglimit, _("Point limit:")));
-                       me.checkboxFraglimit = e;
-               me.TD(me, 1, 2, me.sliderFraglimit);
+               me.TD(me, 10.5, 3, e = makeXonoticGametypeList());
+
+       me.gotoRC(me, 12.5, 0);
+               me.TD(me, 1, 1, e = makeXonoticTextLabel(0, _("Time limit:")));
+               me.TD(me, 1, 2, e = makeXonoticTextSlider("timelimit_override"));
+                       e.addValue(e, ZCTX(_("TIMLIM^Default")), "-1");
+                       e.addValue(e, ZCTX(_("TIMLIM^1 minute")), "1");
+                       e.addValue(e, ZCTX(_("TIMLIM^2 minutes")), "2");
+                       e.addValue(e, ZCTX(_("TIMLIM^3 minutes")), "3");
+                       e.addValue(e, ZCTX(_("TIMLIM^4 minutes")), "4");
+                       e.addValue(e, ZCTX(_("TIMLIM^5 minutes")), "5");
+                       e.addValue(e, ZCTX(_("TIMLIM^6 minutes")), "6");
+                       e.addValue(e, ZCTX(_("TIMLIM^7 minutes")), "7");
+                       e.addValue(e, ZCTX(_("TIMLIM^8 minutes")), "8");
+                       e.addValue(e, ZCTX(_("TIMLIM^9 minutes")), "9");
+                       e.addValue(e, ZCTX(_("TIMLIM^10 minutes")), "10");
+                       e.addValue(e, ZCTX(_("TIMLIM^15 minutes")), "15");
+                       e.addValue(e, ZCTX(_("TIMLIM^20 minutes")), "20");
+                       e.addValue(e, ZCTX(_("TIMLIM^25 minutes")), "25");
+                       e.addValue(e, ZCTX(_("TIMLIM^30 minutes")), "30");
+                       e.addValue(e, ZCTX(_("TIMLIM^40 minutes")), "40");
+                       e.addValue(e, ZCTX(_("TIMLIM^50 minutes")), "50");
+                       e.addValue(e, ZCTX(_("TIMLIM^60 minutes")), "60");
+                       e.addValue(e, ZCTX(_("TIMLIM^Infinite")), "0");
+                       e.configureXonoticTextSliderValues(e);
        me.TR(me);
-               me.TDempty(me, 0.2);
-               me.TD(me, 1, 2.8, e = makeXonoticSliderCheckBox(-1, 0, me.sliderFraglimit, _("Use map specified default")));
-                       me.checkboxFraglimitMapinfo = e;
+               me.TD(me, 1, 1, me.labelFraglimit = makeXonoticTextLabel(0, _("Frag limit:")));
+               me.TD(me, 1, 2, me.sliderFraglimit = makeXonoticTextSlider("fraglimit_override"));
+                       GameType_ConfigureSliders(me.sliderFraglimit, me.labelFraglimit, _("Frag limit:"), 5, 100, 5, "fraglimit_override");
+
+       me.gotoRC(me, 15, 0);
+               me.TD(me, 1, 1, me.labelTeams = makeXonoticTextLabel(0, _("Teams:")));
+               me.TD(me, 1, 2, e = me.sliderTeams = makeXonoticTextSlider(string_null));
+                       e.addValue(e, _("Default"), "0");
+                       e.addValue(e, _("2 teams"), "2");
+                       e.addValue(e, _("3 teams"), "3");
+                       e.addValue(e, _("4 teams"), "4");
+                       e.configureXonoticTextSliderValues(e);
        me.TR(me);
                me.TD(me, 1, 1, e = makeXonoticTextLabel(0, _("Player slots:")));
                me.TD(me, 1, 2, makeXonoticSlider(1, 32, 1, "menu_maxplayers"));
@@ -82,37 +129,33 @@ void XonoticServerCreateTab_fill(entity me)
                        e.addValue(e, _("Godlike"), "10");
                        e.configureXonoticTextSliderValues(e);
                        setDependent(e, "bot_number", 0, -1);
-       me.TR(me);
-       me.TR(me);
-               me.TD(me, 1, 1, e = makeXonoticButton(_("Mutators..."), '0 0 0'));
-                       e.onClick = DialogOpenButton_Click;
-                       e.onClickEntity = main.mutatorsDialog;
-                       main.mutatorsDialog.refilterEntity = me.mapListBox;
-               me.TD(me, 1, 2, e0 = makeXonoticTextLabel(0, string_null));
+
+       me.gotoRC(me, me.rows - 3.5, 0);
+               me.TD(me, 1, 3, e0 = makeXonoticTextLabel(0.5, string_null));
                        e0.textEntity = main.mutatorsDialog;
                        e0.allowCut = 1;
+                       //e0.allowWrap = 1;
        me.TR(me);
                me.TDempty(me, 0.5);
-               me.TD(me, 1, 2, e = makeXonoticButton(_("Advanced settings..."), '0 0 0'));
+               me.TD(me, 1, 2, e = makeXonoticButton(_("Mutators"), '0 0 0'));
                        e.onClick = DialogOpenButton_Click;
-                       e.onClickEntity = main.advancedDialog;
-                       main.advancedDialog.refilterEntity = me.mapListBox;
+                       e.onClickEntity = main.mutatorsDialog;
+                       main.mutatorsDialog.refilterEntity = me.mapListBox;
 
-       me.gotoRC(me, 0, 3.2); me.setFirstColumn(me, me.currentColumn);
+       me.gotoRC(me, 0.5, 3.2); me.setFirstColumn(me, me.currentColumn);
                me.mapListBox = makeXonoticMapList();
-               me.TD(me, 1, 3, e = makeXonoticTextLabel(0, _("Map list:")));
+               me.TD(me, 1, 3, e = makeXonoticHeaderLabel(_("Maplist")));
                        makeCallback(e, me.mapListBox, me.mapListBox.refilterCallback);
        me.TR(me);
                me.TD(me, me.rows - 4, 3, me.mapListBox);
-       me.gotoRC(me, me.rows - 3, 3.5);
-               me.TDempty(me, 0.25);
+       me.gotoRC(me, me.rows - 2.5, 3.2);
+               me.TDempty(me, 0.375);
                me.TD(me, 1, 1.125, e = makeXonoticButton(_("Select all"), '0 0 0'));
                        e.onClick = MapList_All;
                        e.onClickEntity = me.mapListBox;
                me.TD(me, 1, 1.125, e = makeXonoticButton(_("Select none"), '0 0 0'));
                        e.onClick = MapList_None;
                        e.onClickEntity = me.mapListBox;
-               me.TDempty(me, 0.25);
 
        me.gotoRC(me, me.rows - 1, 0);
                me.TD(me, 1, me.columns, e = makeXonoticButton(_("Start Multiplayer!"), '0 0 0'));
@@ -123,46 +166,53 @@ void XonoticServerCreateTab_fill(entity me)
        me.gameTypeChangeNotify(me);
 }
 
-void GameType_ConfigureSliders(entity e, entity l, entity l2, string pLabel, float pMin, float pMax, float pStep, string pCvar)
-{
-       if(pCvar == "")
-       {
-               e.configureXonoticSlider(e, pMin, pMax, pStep, string_null);
-               l.setText(l, pLabel);
-               e.disabled = l.disabled = l2.disabled = TRUE;
-       }
-       else
-       {
-               e.configureXonoticSlider(e, pMin, pMax, pStep, pCvar);
-               l.setText(l, pLabel);
-               e.disabled = l.disabled = l2.disabled = FALSE;
-       }
-}
-
 void XonoticServerCreateTab_gameTypeChangeNotify(entity me)
 {
        // tell the map list to update
        float gt;
-       entity e, l, l2;
+       entity e, l;
        gt = MapInfo_CurrentGametype();
        e = me.sliderFraglimit;
-       l = me.checkboxFraglimit;
-       l2 = me.checkboxFraglimitMapinfo;
+       l = me.labelFraglimit;
+
+       switch(gt)
+       {
+               case MAPINFO_TYPE_CTF:        GameType_ConfigureSliders(e, l, _("Capture limit:"),   1,   20, 1, "capturelimit_override");     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_LMS:        GameType_ConfigureSliders(e, l, _("Lives:"),           3,   50,  1, "g_lms_lives_override");     break;
+               case MAPINFO_TYPE_RACE:       GameType_ConfigureSliders(e, l, _("Laps:"),            1,   25,  1, "g_race_laps_limit");        break;
+               case MAPINFO_TYPE_NEXBALL:    GameType_ConfigureSliders(e, l, _("Goals:"),           1,   50,  1, "g_nexball_goallimit");      break;
+               case MAPINFO_TYPE_ASSAULT:    GameType_ConfigureSliders(e, l, _("Point limit:"),    50,  500, 10, "");                         break;
+               case MAPINFO_TYPE_ONSLAUGHT:  GameType_ConfigureSliders(e, l, _("Point limit:"),    50,  500, 10, "");                         break;
+               case MAPINFO_TYPE_CTS:        GameType_ConfigureSliders(e, l, _("Point limit:"),    50,  500, 10, "");                         break;
+               case MAPINFO_TYPE_INVASION:   GameType_ConfigureSliders(e, l, _("Point limit:"),     5,    0,  5, "");                         break;
+               default:                      GameType_ConfigureSliders(e, l, _("Frag limit:"),      5,  100,  5, "fraglimit_override");       break;
+       }
+
+       float x = FALSE;
+       e = me.sliderTeams;
        switch(gt)
        {
-               case MAPINFO_TYPE_CTF:        GameType_ConfigureSliders(e, l, l2, _("Capture limit:"),   1,   20, 1, "capturelimit_override");     break;
-               case MAPINFO_TYPE_DOMINATION: GameType_ConfigureSliders(e, l, l2, _("Point limit:"),    50,  500, 10, "g_domination_point_limit"); break;
-               case MAPINFO_TYPE_KEYHUNT:    GameType_ConfigureSliders(e, l, l2, _("Point limit:"),   200, 1500, 50, "g_keyhunt_point_limit");    break;
-               case MAPINFO_TYPE_LMS:        GameType_ConfigureSliders(e, l, l2, _("Lives:"),           3,   50,  1, "g_lms_lives_override");     break;
-               case MAPINFO_TYPE_RACE:       GameType_ConfigureSliders(e, l, l2, _("Laps:"),            1,   25,  1, "g_race_laps_limit");        break;
-               case MAPINFO_TYPE_NEXBALL:    GameType_ConfigureSliders(e, l, l2, _("Goals:"),           1,   50,  1, "g_nexball_goallimit");      break;
-               case MAPINFO_TYPE_ASSAULT:    GameType_ConfigureSliders(e, l, l2, _("Point limit:"),    50,  500, 10, "");                         break;
-               case MAPINFO_TYPE_ONSLAUGHT:  GameType_ConfigureSliders(e, l, l2, _("Point limit:"),    50,  500, 10, "");                         break;
-               case MAPINFO_TYPE_CTS:        GameType_ConfigureSliders(e, l, l2, _("Point limit:"),    50,  500, 10, "");                         break;
-               case MAPINFO_TYPE_INVASION:   GameType_ConfigureSliders(e, l, l2, _("Point limit:"),     5,    0,  5, "");                         break;
-               default:                      GameType_ConfigureSliders(e, l, l2, _("Frag limit:"),      5,  100,  5, "fraglimit_override");       break;
+               case MAPINFO_TYPE_CA:               x = TRUE; e.configureXonoticTextSlider(e, "g_ca_teams_override");          break;
+               case MAPINFO_TYPE_DOMINATION:       x = TRUE; e.configureXonoticTextSlider(e, "g_domination_teams_override");  break;
+               case MAPINFO_TYPE_FREEZETAG:        x = TRUE; e.configureXonoticTextSlider(e, "g_freezetag_teams_override");   break;
+               case MAPINFO_TYPE_KEEPAWAY:         x = TRUE; e.configureXonoticTextSlider(e, "g_keepaway_teams_override");    break;
+               case MAPINFO_TYPE_KEYHUNT:          x = TRUE; e.configureXonoticTextSlider(e, "g_keyhunt_teams_override");     break;
+               case MAPINFO_TYPE_TEAM_DEATHMATCH:  x = TRUE; e.configureXonoticTextSlider(e, "g_tdm_teams_override");         break;
+
+               default: x = FALSE; e.configureXonoticTextSlider(e, string_null); break;
        }
+       e.configureXonoticTextSliderValues(e);
+       e.value = 0;
+       me.sliderTeams.disabled = me.labelTeams.disabled = !x;
+
        me.mapListBox.refilter(me.mapListBox);
 }
 
+void XonoticServerCreateTab_gameTypeSelectNotify(entity me)
+{
+       me.setFocus(me, me.mapListBox);
+}
+
 #endif