X-Git-Url: https://de.git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fmenu%2Fxonotic%2Fdialog_singleplayer.qc;h=ded656605c58829cdc79be4ddc2c928e8bc3e1e4;hb=323105d51f8eb6dea47c063965be5e34ad57f987;hp=c490b699c2e0225e3b5492cf429d45cccdee9bf9;hpb=a293c700fbbf3a18f25f08c1837fa4f29e8e360b;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/menu/xonotic/dialog_singleplayer.qc b/qcsrc/menu/xonotic/dialog_singleplayer.qc index c490b699c..ded656605 100644 --- a/qcsrc/menu/xonotic/dialog_singleplayer.qc +++ b/qcsrc/menu/xonotic/dialog_singleplayer.qc @@ -2,6 +2,8 @@ #include #include "bigbutton.qh" +#include "commandbutton.qh" +#include "leavematchbutton.qh" #include "radiobutton.qh" #include "textlabel.qh" #include "campaign.qh" @@ -12,28 +14,49 @@ void InstantAction_LoadMap(entity btn, entity dummy) cvar_set("timelimit_override", "10"); - if(random() < 0.4) // 40% are DM + bool check_probability_distribution = true; + float r = 1; + + LABEL(doit); + if (!check_probability_distribution) + r = random(); + + if((r -= 0.30) < 0) { 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 + else if((r -= 0.25) < 0) { 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 + else if((r -= 0.15) < 0) { 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 + else if((r -= 0.10) < 0) + { + MapInfo_SwitchGameType(MAPINFO_TYPE_CA); + pmin = 4; + pmax = 8; + pstep = 2; + } + else if((r -= 0.10) < 0) + { + MapInfo_SwitchGameType(MAPINFO_TYPE_FREEZETAG); + pmin = 4; + pmax = 8; + pstep = 2; + } + else if((r -= 0.05) < 0) { MapInfo_SwitchGameType(MAPINFO_TYPE_KEYHUNT); pmin = 6; @@ -41,9 +64,16 @@ void InstantAction_LoadMap(entity btn, entity dummy) 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% + else { - float r; + r -= 0.05; + if (check_probability_distribution) + { + if(fabs(r) > 0.001) + error("Incorrect probability distribution."); + check_probability_distribution = false; + goto doit; + } r = floor(random() * 4); switch(r) { @@ -73,7 +103,6 @@ void InstantAction_LoadMap(entity btn, entity dummy) pmax = 16; pstep = 2; break; - // CA, Freezetag: bot AI does not work, add them once it does } } @@ -93,6 +122,8 @@ void InstantAction_LoadMap(entity btn, entity dummy) localcmd("disconnect\n"); localcmd("g_campaign 0\n"); + makeServerSingleplayer(); + MapInfo_LoadMap(s, 1); // configure bots @@ -100,7 +131,10 @@ void InstantAction_LoadMap(entity btn, entity dummy) 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)); + + // cvar_set doesn't always work starting an InstantAction game while playing the campaign + //cvar_set("bot_number", ftos(p - 1)); + localcmd(strcat("bot_number ", ftos(p - 1), "\n")); // make sure we go back to menu cvar_set("lastlevel", "1"); @@ -119,7 +153,7 @@ void XonoticSingleplayerDialog_fill(entity 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 - 6, me.columns, me.campaignBox = makeXonoticCampaignList()); @@ -136,8 +170,11 @@ void XonoticSingleplayerDialog_fill(entity me) me.TD(me, 1, 1, e = makeXonoticRadioButton(1, "g_campaign_skill", "-2", ZCTX(_("CSKL^Easy")))); me.TD(me, 1, 1, e = makeXonoticRadioButton(1, "g_campaign_skill", "0", ZCTX(_("CSKL^Medium")))); me.TD(me, 1, 1, e = makeXonoticRadioButton(1, "g_campaign_skill", "2", ZCTX(_("CSKL^Hard")))); - me.TR(me); - me.TD(me, 1, me.columns, e = makeXonoticButton(_("Start Singleplayer!"), '0 0 0')); + me.TR(me); + me.TDempty(me, me.columns * 1/13); + me.TD(me, 1, me.columns * 5/13, e = makeXonoticLeaveMatchButton('0 0 0', 0)); + me.TDempty(me, me.columns * 1/13); + me.TD(me, 1, me.columns * 5/13, e = makeXonoticButton(_("Play campaign!"), '0 0 0')); e.onClick = CampaignList_LoadMap; e.onClickEntity = me.campaignBox; }