X-Git-Url: https://de.git.xonotic.org/?p=xonotic%2Fxonotic-data.pk3dir.git;a=blobdiff_plain;f=qcsrc%2Fmenu%2Fxonotic%2Fdialog_singleplayer.qc;h=a223f5807b318dd645f8441628a1b1e30bd50721;hp=dc39346aa61f962f323964e81b05eccec083dc4f;hb=HEAD;hpb=0d0a2025de767dbfae0519941294f5947fe38c1f diff --git a/qcsrc/menu/xonotic/dialog_singleplayer.qc b/qcsrc/menu/xonotic/dialog_singleplayer.qc index dc39346aa..ded656605 100644 --- a/qcsrc/menu/xonotic/dialog_singleplayer.qc +++ b/qcsrc/menu/xonotic/dialog_singleplayer.qc @@ -1,7 +1,9 @@ #include "dialog_singleplayer.qh" -#include +#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 } } @@ -87,6 +116,14 @@ void InstantAction_LoadMap(entity btn, entity dummy) s = MapInfo_BSPName_ByID(m); } while(!fexists(sprintf("maps/%s.waypoints", s))); + + // these commands are also executed when starting a map from Multiplayer / Create + // in the menu_loadmap_prepare alias + localcmd("disconnect\n"); + localcmd("g_campaign 0\n"); + + makeServerSingleplayer(); + MapInfo_LoadMap(s, 1); // configure bots @@ -94,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"); @@ -113,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()); @@ -128,10 +168,13 @@ void XonoticSingleplayerDialog_fill(entity me) me.gotoRC(me, me.rows - 2, 0); me.TD(me, 1, 2, e = makeXonoticTextLabel(0.5, _("Campaign Difficulty:"))); 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", "-1", ZCTX(_("CSKL^Medium")))); - me.TD(me, 1, 1, e = makeXonoticRadioButton(1, "g_campaign_skill", "0", ZCTX(_("CSKL^Hard")))); - me.TR(me); - me.TD(me, 1, me.columns, e = makeXonoticButton(_("Start Singleplayer!"), '0 0 0')); + 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.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; }