]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/menu/xonotic/dialog_singleplayer.c
Merge remote-tracking branch 'origin/divVerent/allow-override-item-model'
[xonotic/xonotic-data.pk3dir.git] / qcsrc / menu / xonotic / dialog_singleplayer.c
index 165a84c7671bdeda9171840d47fec99bfe4c57a7..6e1be0067a075606c74b13fba4aafabe8d63788b 100644 (file)
@@ -1,7 +1,7 @@
 #ifdef INTERFACE
 CLASS(XonoticSingleplayerDialog) EXTENDS(XonoticDialog)
        METHOD(XonoticSingleplayerDialog, fill, void(entity))
-       ATTRIB(XonoticSingleplayerDialog, title, string, "Singleplayer")
+       ATTRIB(XonoticSingleplayerDialog, title, string, _("Singleplayer"))
        ATTRIB(XonoticSingleplayerDialog, color, vector, SKINCOLOR_DIALOG_SINGLEPLAYER)
        ATTRIB(XonoticSingleplayerDialog, intendedWidth, float, 0.80)
        ATTRIB(XonoticSingleplayerDialog, rows, float, 24)
@@ -14,56 +14,113 @@ ENDCLASS(XonoticSingleplayerDialog)
 
 void InstantAction_LoadMap(entity btn, entity dummy)
 {
-       float glob, i, n, fh;
-       string s;
-       glob = search_begin("maps/*.instantaction", TRUE, TRUE);
-       if(glob < 0)
-               return;
-       i = ceil(random() * search_getsize(glob)) - 1;
-       fh = fopen(search_getfilename(glob, i), FILE_READ);
-       search_end(glob);
-       if(fh < 0)
-               return;
-       while((s = fgets(fh)))
+       float pmin, pmax, pstep;
+
+       cvar_set("timelimit_override", "10");
+       cvar_set("g_lms_lives_override", "9");
+
+       if(random() < 0.4) // 40% are DM
+       {
+               MapInfo_SwitchGameType(MAPINFO_TYPE_DEATHMATCH);
+               pmin = 2;
+               pmax = 8;
+               pstep = 1;
+       }
+       else if(random() < 0.5) // half of the remaining 60%, i.e. 30%, are CTF
+       {
+               MapInfo_SwitchGameType(MAPINFO_TYPE_CTF);
+               pmin = 4;
+               pmax = 12;
+               pstep = 2;
+       }
+       else if(random() < 0.5) // half of the remaining 30%, i.e. 15%, are TDM
+       {
+               MapInfo_SwitchGameType(MAPINFO_TYPE_TEAM_DEATHMATCH);
+               pmin = 4;
+               pmax = 8;
+               pstep = 2;
+       }
+       else if(random() < 0.666) // 2/3 of the remaining 15%, i.e. 10%, are KH
        {
-               if(substring(s, 0, 4) == "set ")
-                       s = substring(s, 4, strlen(s) - 4);
-               n = tokenize_console(s);
-               if(argv(0) == "bot_number")
-                       cvar_set("bot_number", argv(1));
-               else if(argv(0) == "skill")
-                       cvar_set("skill", argv(1));
-               else if(argv(0) == "timelimit")
-                       cvar_set("timelimit_override", argv(1));
-               else if(argv(0) == "fraglimit")
-                       cvar_set("fraglimit_override", argv(1));
-               else if(argv(0) == "changelevel")
+               MapInfo_SwitchGameType(MAPINFO_TYPE_KEYHUNT);
+               pmin = 6;
+               pmax = 6;
+               pstep = 6; // works both for 2 and 3 teams
+               // TODO find team count of map, set pstep=2 or 3, and use 2v2(v2) games at least
+       }
+       else // somehow distribute the remaining 5%
+       {
+               float r;
+               r = floor(random() * 4);
+               switch(r)
                {
-                       fclose(fh);
-                       localcmd("\nmenu_loadmap_prepare\n");
-                       MapInfo_SwitchGameType(MAPINFO_TYPE_DEATHMATCH);
-                       MapInfo_LoadMap(argv(1));
-                       cvar_set("lastlevel", "1");
-                       return;
+                       default:
+                       case 0:
+                               MapInfo_SwitchGameType(MAPINFO_TYPE_LMS);
+                               pmin = 2;
+                               pmax = 6;
+                               pstep = 1;
+                               cvar_set("timelimit_override", "-1");
+                               break;
+                       case 1:
+                               MapInfo_SwitchGameType(MAPINFO_TYPE_DOMINATION);
+                               pmin = 2;
+                               pmax = 8;
+                               pstep = 2;
+                               break;
+                       case 2:
+                               MapInfo_SwitchGameType(MAPINFO_TYPE_ONSLAUGHT);
+                               pmin = 6;
+                               pmax = 16;
+                               pstep = 2;
+                               break;
+                       case 3:
+                               MapInfo_SwitchGameType(MAPINFO_TYPE_ASSAULT);
+                               pmin = 4;
+                               pmax = 16;
+                               pstep = 2;
+                               break;
+                       // CA, Freezetag: bot AI does not work, add them once it does
                }
        }
-       fclose(fh);
+
+       // find random map
+       MapInfo_FilterGametype(MapInfo_CurrentGametype(), MapInfo_CurrentFeatures(), MapInfo_RequiredFlags(), MapInfo_ForbiddenFlags(), 0);
+       string s;
+       do
+       {
+               float m;
+               m = floor(random() * MapInfo_count);
+               s = MapInfo_BSPName_ByID(m);
+       }
+       while(!fexists(sprintf("maps/%s.waypoints", s)));
+       MapInfo_LoadMap(s, 1);
+
+       // configure bots
+       float p;
+       pmin = pstep * ceil(pmin / pstep);
+       pmax = pstep * floor(pmax / pstep);
+       p = pmin + pstep * floor(random() * ((pmax - pmin) / pstep + 1));
+       cvar_set("bot_number", ftos(p - 1));
+
+       // make sure we go back to menu
+       cvar_set("lastlevel", "1");
 }
 
-void fillXonoticSingleplayerDialog(entity me)
+void XonoticSingleplayerDialog_fill(entity me)
 {
        entity e, btnPrev, btnNext, lblTitle;
 
        me.TR(me);
                me.TDempty(me, (me.columns - 3) / 2);
-               me.TD(me, 2, 3, e = makeXonoticBigButton("Instant action! (random map with bots)", '0 0 0'));
+               me.TD(me, 2, 3, e = makeXonoticBigButton(_("Instant action! (random map with bots)"), '0 0 0'));
                        e.onClick = InstantAction_LoadMap;
                        e.onClickEntity = NULL;
        me.TR(me);
        me.TR(me);
        me.TR(me);
                me.TD(me, 1, 1, btnPrev = makeXonoticButton("<<", '0 0 0'));
-               me.TD(me, 1, me.columns - 2, lblTitle = makeXonoticTextLabel(0.5, "???"));
+               me.TD(me, 1, me.columns - 2, lblTitle = makeXonoticTextLabel(0.5, _("???")));
                me.TD(me, 1, 1, btnNext = makeXonoticButton(">>", '0 0 0'));
        me.TR(me);
                me.TD(me, me.rows - 5, me.columns, me.campaignBox = makeXonoticCampaignList());
@@ -77,8 +134,7 @@ void fillXonoticSingleplayerDialog(entity me)
                        me.campaignBox.campaignGo(me.campaignBox, 0);
 
        me.gotoRC(me, me.rows - 1, 0);
-               me.TD(me, 1, 2, e = makeXonoticModButton("Singleplayer"));
-               me.TD(me, 1, me.columns - 2 , e = makeXonoticButton("Start Singleplayer!", '0 0 0'));
+               me.TD(me, 1, me.columns, e = makeXonoticButton(_("Start Singleplayer!"), '0 0 0'));
                        e.onClick = CampaignList_LoadMap;
                        e.onClickEntity = me.campaignBox;
 }