From b512b125f91e8ce59f6c1b5b146cb8c1d3092b9d Mon Sep 17 00:00:00 2001 From: div0 Date: Fri, 31 Oct 2008 08:31:43 +0000 Subject: [PATCH] multi campaign is back git-svn-id: svn://svn.icculus.org/nexuiz/trunk@4946 f962a42d-fe04-0410-a3ab-8c8b0445ebaa --- data/qcsrc/menu/mbuiltin.qh | 1 + data/qcsrc/menu/nexuiz/campaign.c | 75 +++++++++++++++++++- data/qcsrc/menu/nexuiz/dialog_singleplayer.c | 16 ++++- 3 files changed, 89 insertions(+), 3 deletions(-) diff --git a/data/qcsrc/menu/mbuiltin.qh b/data/qcsrc/menu/mbuiltin.qh index 8a514e2ab..e9d751200 100644 --- a/data/qcsrc/menu/mbuiltin.qh +++ b/data/qcsrc/menu/mbuiltin.qh @@ -299,6 +299,7 @@ string(string in) uri_escape = #510; string(string in) uri_unescape = #511; string(string, float) netaddress_resolve = #625; +string(string search, string replace, string subject) strreplace = #484; #ifdef FIXEDFOPEN float fopen( string filename, float mode ) = diff --git a/data/qcsrc/menu/nexuiz/campaign.c b/data/qcsrc/menu/nexuiz/campaign.c index 2917dd789..d55b87b8e 100644 --- a/data/qcsrc/menu/nexuiz/campaign.c +++ b/data/qcsrc/menu/nexuiz/campaign.c @@ -8,7 +8,9 @@ CLASS(NexuizCampaignList) EXTENDS(NexuizListBox) METHOD(NexuizCampaignList, resizeNotify, void(entity, vector, vector, vector, vector)) METHOD(NexuizCampaignList, setSelected, void(entity, float)) METHOD(NexuizCampaignList, keyDown, float(entity, float, float, float)) + METHOD(NexuizCampaignList, campaignGo, void(entity, float)) + ATTRIB(NexuizCampaignList, campaignGlob, float, 0) ATTRIB(NexuizCampaignList, realFontSize, vector, '0 0 0') ATTRIB(NexuizCampaignList, columnPreviewOrigin, float, 0) ATTRIB(NexuizCampaignList, columnPreviewSize, float, 0) @@ -32,9 +34,16 @@ CLASS(NexuizCampaignList) EXTENDS(NexuizListBox) ATTRIB(NexuizCampaignList, cvarName, string, string_null) METHOD(NexuizCampaignList, loadCvars, void(entity)) METHOD(NexuizCampaignList, saveCvars, void(entity)) + + ATTRIB(NexuizCampaignList, buttonNext, entity, NULL) + ATTRIB(NexuizCampaignList, buttonPrev, entity, NULL) + ATTRIB(NexuizCampaignList, labelTitle, entity, NULL) + ATTRIB(NexuizCampaignList, campaignTitle, string, string_null) ENDCLASS(NexuizCampaignList) entity makeNexuizCampaignList(); void CampaignList_LoadMap(entity btn, entity me); +void MultiCampaign_Next(entity btn, entity me); +void MultiCampaign_Prev(entity btn, entity me); #endif #ifdef IMPLEMENTATION @@ -110,7 +119,9 @@ entity makeNexuizCampaignList() void configureNexuizCampaignListNexuizCampaignList(entity me) { me.configureNexuizListBox(me); + me.campaignGlob = search_begin("maps/campaign*.txt", TRUE, TRUE); me.loadCvars(me); + me.campaignGo(me, 0); // takes care of enabling/disabling buttons too } void loadCvarsNexuizCampaignList(entity me) @@ -122,6 +133,7 @@ void loadCvarsNexuizCampaignList(entity me) strunzone(me.cvarName); campaign_name = strzone(cvar_string("g_campaign_name")); me.cvarName = strzone(strcat("g_campaign", campaign_name, "_index")); + registercvar(me.cvarName, "", 0); // saved by server QC anyway CampaignFile_Load(0, CAMPAIGN_MAX_ENTRIES); me.campaignIndex = bound(0, cvar(me.cvarName), campaign_entries); cvar_set(me.cvarName, ftos(me.campaignIndex)); @@ -130,15 +142,76 @@ void loadCvarsNexuizCampaignList(entity me) me.nItems = min(me.campaignIndex + 2, campaign_entries); me.selectedItem = min(me.campaignIndex, me.nItems - 1); me.scrollPos = me.nItems * me.itemHeight - 1; + if(me.campaignTitle) + strunzone(me.campaignTitle); + if(campaign_name == "") + me.campaignTitle = strzone("Nexuiz Multiplayer Training Campaign"); + else + me.campaignTitle = strzone(strreplace("_", " ", campaign_name)); + if(me.labelTitle) + me.labelTitle.setText(me.labelTitle, me.campaignTitle); } void saveCvarsNexuizCampaignList(entity me) { // write campaign cvars - cvar_set("g_campaign_name", campaign_name); + // no reason to do this! + // cvar_set("g_campaign_name", campaign_name); // cvar_set(me.cvarName, ftos(me.campaignIndex)); // NOTE: only server QC does that! } +void campaignGoNexuizCampaignList(entity me, float step) +{ + float canNext, canPrev; + string s; + float i, j, n; + + canNext = canPrev = 0; + + if(me.campaignGlob >= 0) + { + n = search_getsize(me.campaignGlob); + if(n > 0) + { + j = -1; + s = strcat("maps/campaign", campaign_name, ".txt"); + for(i = 0; i < n; ++i) + { + if(search_getfilename(me.campaignGlob, i) == s) + j = i; + } + if(j < 0) + { + if(step >= 0) + j = 0; + else + j = n - 1; + } + else + j = mod(j + step, n); + s = search_getfilename(me.campaignGlob, j); + print(s, "\n"); + s = substring(s, 13, strlen(s) - 17); + cvar_set("g_campaign_name", s); + me.loadCvars(me); + } + } + + if(me.buttonNext) + me.buttonNext.disabled = !canNext; + if(me.buttonPrev) + me.buttonPrev.disabled = !canPrev; +} + +void MultiCampaign_Next(entity btn, entity me) +{ + me.campaignGo(me, +1); +} +void MultiCampaign_Prev(entity btn, entity me) +{ + me.campaignGo(me, -1); +} + void drawNexuizCampaignList(entity me) { if(cvar(me.cvarName) != me.campaignIndex || cvar_string("g_campaign_name") != campaign_name) diff --git a/data/qcsrc/menu/nexuiz/dialog_singleplayer.c b/data/qcsrc/menu/nexuiz/dialog_singleplayer.c index 33c2ad2d6..bbc956269 100644 --- a/data/qcsrc/menu/nexuiz/dialog_singleplayer.c +++ b/data/qcsrc/menu/nexuiz/dialog_singleplayer.c @@ -51,7 +51,7 @@ void InstantAction_LoadMap(entity btn, entity dummy) void fillNexuizSingleplayerDialog(entity me) { - entity e; + entity e, btnPrev, btnNext, lblTitle; me.TR(me); me.TDempty(me, (me.columns - 2) / 2); @@ -61,7 +61,19 @@ void fillNexuizSingleplayerDialog(entity me) me.TR(me); me.TR(me); me.TR(me); - me.TD(me, me.rows - 5, me.columns, me.campaignBox = makeNexuizCampaignList()); + me.TD(me, 1, 1, btnPrev = makeNexuizButton("<<", '0 0 0')); + me.TD(me, 1, me.columns - 2, lblTitle = makeNexuizTextLabel(0.5, "???")); + me.TD(me, 1, 1, btnNext = makeNexuizButton(">>", '0 0 0')); + me.TR(me); + me.TD(me, me.rows - 6, me.columns, me.campaignBox = makeNexuizCampaignList()); + btnPrev.onClick = MultiCampaign_Prev; + btnPrev.onClickEntity = me.campaignBox; + btnNext.onClick = MultiCampaign_Next; + btnNext.onClickEntity = me.campaignBox; + me.campaignBox.buttonNext = btnNext; + me.campaignBox.buttonPrev = btnPrev; + me.campaignBox.labelTitle = lblTitle; + me.campaignBox.campaignGo(me.campaignBox, 0); me.gotoRC(me, me.rows - 1, 0); me.TD(me, 1, me.columns, e = makeNexuizButton("Start!", '0 0 0')); -- 2.39.2