From b6c385f158170408c6b131f7c8a45cd6bf0011e4 Mon Sep 17 00:00:00 2001 From: beegee1 <be.gentner@googlemail.com> Date: Mon, 21 Mar 2011 19:32:48 +0000 Subject: [PATCH] Better implementation of campaign selection screen --- client/CPreGame.cpp | 188 ++++++++++++-------------------------------- client/CPreGame.h | 3 + 2 files changed, 55 insertions(+), 136 deletions(-) diff --git a/client/CPreGame.cpp b/client/CPreGame.cpp index 6d09454c3..3651a7a27 100644 --- a/client/CPreGame.cpp +++ b/client/CPreGame.cpp @@ -309,7 +309,6 @@ void CGPreGame::openSel(CMenuScreen::EState screenType, CMenuScreen::EMultiMode void CGPreGame::openCampaignScreen(CCampaignScreen::CampaignSet campaigns) { std::map<std::string, CCampaignScreen::CampaignStatus> defaultCamp; - defaultCamp["GOOD1"] = CCampaignScreen::COMPLETED; GH.pushInt(new CCampaignScreen(campaigns, defaultCamp)); } @@ -3370,157 +3369,51 @@ CCampaignScreen::CCampaignScreen(CampaignSet campaigns, std::map<std::string, Ca back->hoverable = true; // Load all campaign buttons + // 1.index: 0 => ROE, 1 => AB, 2 => WOG static const int buttonCords[7][2] = { {90, 72} , {539, 72} , {43, 245} , {313, 244}, {586, 246}, {34, 417}, {404, 414}}; + static const std::string campFiles[3][7] = { {"GOOD1", "EVIL1", "GOOD2", "NEUTRAL1", "EVIL2", "GOOD3", "SECRET"}, + { "AB", "BLOOD", "SLAYER", "FESTIVAL", "FIRE", "FOOL" }, + { "ZC1", "ZC2", "ZC3", "ZC4" } }; + + static const std::string campImages[3][7] = { { "CAMPGD1S.BMP", "CAMPEV1S.BMP", "CAMPGD2S.BMP", "CAMPNEUS.BMP", "CAMPEV2S.BMP", "CAMPGD3S.BMP", "CAMPSCTS.BMP" }, + { "CAMP1AB7.BMP", "CAMP1DB2.BMP", "CAMP1DS1.BMP", "CAMP1FL3.BMP", "CAMP1PF2.BMP", "CAMP1FW1.BMP" }, + { "CAMPZ01.BMP", "CAMPZ02.BMP", "CAMPZ03.BMP", "CAMPZ04.BMP" } }; + + static const std::string campVideos[3][7] = { { "CGOOD1.BIK", "CEVIL1.BIK", "CGOOD2.BIK", "CNEUTRAL.BIK", "CEVIL2.BIK", "CGOOD3.BIK", "CSECRET.BIK" }, + { "C1ab7.BIK", "C1db2.BIK", "C1ds1.BIK", "C1fl3.BIK", "C1pf2.BIK", "C1fw1.BIK" } }; + + static const std::string campTexts[3][7] = { { getMapText(0), getMapText(3), getMapText(1), getMapText(5), getMapText(4), getMapText(2), getMapText(6) }, + { "Armageddon's Blade", "Dragon's Blood", "Dragon Slayer", "Festival of Life", "Playing With Fire", "Foolhardy Waywardness" }, + { "In the Wake of Gods", "The Samaritan", "A Life of A-d-v-e-n-t-u-r-e", "Evil Way Home" } }; + + static const CampaignStatus campDefaults[3][7] = { { CCampaignScreen::ENABLED, CCampaignScreen::ENABLED, CCampaignScreen::DISABLED, CCampaignScreen::ENABLED, CCampaignScreen::DISABLED, + CCampaignScreen::DISABLED, CCampaignScreen::DISABLED }, + { CCampaignScreen::ENABLED, CCampaignScreen::ENABLED, CCampaignScreen::ENABLED, CCampaignScreen::ENABLED, CCampaignScreen::ENABLED, CCampaignScreen::DISABLED}, + { CCampaignScreen::ENABLED, CCampaignScreen::ENABLED, CCampaignScreen::ENABLED, CCampaignScreen::ENABLED } }; + if (campaigns == ROE) { - // Long live the Queen - static const std::string roe0Camp = "GOOD1"; - CCampaignButton *roe0 = new CCampaignButton(bg, "CAMPGD1S.BMP", buttonCords[0][0], buttonCords[0][1], camps[roe0Camp] != 0 ? camps[roe0Camp] : CCampaignScreen::ENABLED); - roe0->video = "CGOOD1.BIK"; - roe0->hoverText = CGI->generaltexth->campaignMapNames[0]; - roe0->campFile = roe0Camp; - campButtons.push_back(roe0); - - // Dungeons and Devils - static const std::string roe1Camp = "EVIL1"; - CCampaignButton *roe1 = new CCampaignButton(bg, "CAMPEV1S.BMP", buttonCords[1][0], buttonCords[1][1], camps[roe1Camp] != 0 ? camps[roe1Camp] : CCampaignScreen::ENABLED); - roe1->video = "CEVIL1.BIK"; - roe1->hoverText = CGI->generaltexth->campaignMapNames[3]; - roe1->campFile = roe1Camp; - campButtons.push_back(roe1); - - // Spoils of War - static const std::string roe2Camp = "NEUTRAL1"; - CCampaignButton *roe2 = new CCampaignButton(bg, "CAMPNEUS.BMP", buttonCords[3][0], buttonCords[3][1], camps[roe2Camp] != 0 ? camps[roe2Camp] : CCampaignScreen::ENABLED); - roe2->video = "CNEUTRAL.BIK"; - roe2->hoverText = CGI->generaltexth->campaignMapNames[5]; - roe2->campFile = roe2Camp; - campButtons.push_back(roe2); - - // Liberation - static const std::string roe3Camp = "GOOD2"; - CCampaignButton *roe3 = new CCampaignButton(bg, "CAMPGD2S.BMP", buttonCords[2][0], buttonCords[2][1], camps[roe3Camp] != 0 ? camps[roe3Camp] : CCampaignScreen::DISABLED); - roe3->video = "CGOOD2.BIK"; - roe3->hoverText = CGI->generaltexth->campaignMapNames[1]; - roe3->campFile = roe3Camp; - campButtons.push_back(roe3); - - // Long Live the King - static const std::string roe4Camp = "EVIL2"; - CCampaignButton *roe4 = new CCampaignButton(bg, "CAMPEV2S.BMP", buttonCords[4][0], buttonCords[4][1], camps[roe4Camp] != 0 ? camps[roe4Camp] : CCampaignScreen::DISABLED); - roe4->video = "CEVIL2.BIK"; - roe4->hoverText = CGI->generaltexth->campaignMapNames[4]; - roe4->campFile = roe4Camp; - campButtons.push_back(roe4); - - // Song for the Father - static const std::string roe5Camp = "GOOD3"; - CCampaignButton *roe5 = new CCampaignButton(bg, "CAMPGD3S.BMP", buttonCords[5][0], buttonCords[5][1], camps[roe5Camp] != 0 ? camps[roe5Camp] : CCampaignScreen::DISABLED); - roe5->video = "CGOOD3.BIK"; - roe5->hoverText = CGI->generaltexth->campaignMapNames[2]; - roe5->campFile = roe5Camp; - campButtons.push_back(roe5); - - // Seeds of Discontent - static const std::string roe6Camp = "SECRET"; - if (camps[roe6Camp] != 0) - { - CCampaignButton *roe6 = new CCampaignButton(bg, "CAMPSCTS.BMP", buttonCords[6][0], buttonCords[6][1], camps[roe6Camp]); - roe6->video = "CSECRET.BIK"; - roe6->hoverText = CGI->generaltexth->campaignMapNames[6]; - roe6->campFile = roe6Camp; - campButtons.push_back(roe6); - } - else + createButtons(buttonCords, campFiles[0], campImages[0], campVideos[0], campTexts[0], camps, campDefaults[0]); + + if (camps[campFiles[0][6]] == 0) drawCampaignPlaceholder(); } if (campaigns == AB) { - // Armageddon's Blade - static const std::string ab0Camp = "AB"; - CCampaignButton *ab0 = new CCampaignButton(bg, "CAMP1AB7.BMP", buttonCords[0][0], buttonCords[0][1], camps[ab0Camp] != 0 ? camps[ab0Camp] : CCampaignScreen::ENABLED); - ab0->hoverText = "Armageddon's Blade"; - ab0->campFile = ab0Camp; - ab0->video = "C1ab7.BIK"; - campButtons.push_back(ab0); - - // Dragon's Blood - static const std::string ab1Camp = "BLOOD"; - CCampaignButton *ab1 = new CCampaignButton(bg, "CAMP1DB2.BMP", buttonCords[1][0], buttonCords[1][1], camps[ab1Camp] != 0 ? camps[ab1Camp] : CCampaignScreen::ENABLED); - ab1->hoverText = "Dragon's Blood"; - ab1->campFile = ab1Camp; - ab1->video = "C1db2.BIK"; - campButtons.push_back(ab1); - - // Dragon Slayer - static const std::string ab2Camp = "SLAYER"; - CCampaignButton *ab2 = new CCampaignButton(bg, "CAMP1DS1.BMP", buttonCords[2][0], buttonCords[2][1], camps[ab2Camp] != 0 ? camps[ab2Camp] : CCampaignScreen::ENABLED); - ab2->hoverText = "Dragon Slayer"; - ab2->campFile = ab2Camp; - ab2->video = "C1ds1.BIK"; - campButtons.push_back(ab2); - - // Festival of Life - static const std::string ab3Camp = "FESTIVAL"; - CCampaignButton *ab3 = new CCampaignButton(bg, "CAMP1FL3.BMP", buttonCords[3][0], buttonCords[3][1], camps[ab3Camp] != 0 ? camps[ab3Camp] : CCampaignScreen::ENABLED); - ab3->hoverText = "Festival of Life"; - ab3->campFile = ab3Camp; - ab3->video = "C1fl3.BIK"; - campButtons.push_back(ab3); - - // Playing With Fire - static const std::string ab4Camp = "FIRE"; - CCampaignButton *ab4 = new CCampaignButton(bg, "CAMP1PF2.BMP", buttonCords[4][0], buttonCords[4][1], camps[ab4Camp] != 0 ? camps[ab4Camp] : CCampaignScreen::ENABLED); - ab4->hoverText = "Playing With Fire"; - ab4->campFile = ab4Camp; - ab4->video = "C1pf2.BIK"; - campButtons.push_back(ab4); - - // Foolhardy Waywardness + // Foolhardy Waywardness -- draw deactivated image SDL_Surface *ab5Dis = BitmapHandler::loadBitmap("CAMP1FWX"); Rect ab5DisRect(buttonCords[5][0] - 2, buttonCords[5][1] - 2, ab5Dis->w, ab5Dis->h); blitAt(ab5Dis, ab5DisRect, bg); - static const std::string ab5Camp = "FOOL"; - CCampaignButton *ab5 = new CCampaignButton(bg, "CAMP1FW1.BMP", buttonCords[5][0], buttonCords[5][1], camps[ab5Camp] != 0 ? camps[ab5Camp] : CCampaignScreen::DISABLED); - ab5->hoverText = "Foolhardy Waywardness"; - ab5->campFile = ab5Camp; - ab5->video = "C1fw1.BIK"; - campButtons.push_back(ab5); - + createButtons(buttonCords, campFiles[1], campImages[1], campVideos[1], campTexts[1], camps, campDefaults[1]); drawCampaignPlaceholder(); } if (campaigns == WOG) { - // In the Wake of Gods - static const std::string wog0Camp = "ZC1"; - CCampaignButton *wog0 = new CCampaignButton(bg, "CAMPZ01.BMP", buttonCords[0][0], buttonCords[0][1], camps[wog0Camp] != 0 ? camps[wog0Camp] : CCampaignScreen::ENABLED); - wog0->hoverText = "In the Wake of Gods"; - wog0->campFile = wog0Camp; - campButtons.push_back(wog0); - - // The Samaritan - static const std::string wog1Camp = "ZC2"; - CCampaignButton *wog1 = new CCampaignButton(bg, "CAMPZ02.BMP", buttonCords[1][0], buttonCords[1][1], camps[wog1Camp] != 0 ? camps[wog1Camp] : CCampaignScreen::ENABLED); - wog1->hoverText = "The Samaritan"; - wog1->campFile = wog1Camp; - campButtons.push_back(wog1); - - // A Life of A-d-v-e-n-t-u-r-e - static const std::string wog2Camp = "ZC3"; - CCampaignButton *wog2 = new CCampaignButton(bg, "CAMPZ03.BMP", buttonCords[2][0], buttonCords[2][1], camps[wog2Camp] != 0 ? camps[wog2Camp] : CCampaignScreen::ENABLED); - wog2->hoverText = "A Life of A-d-v-e-n-t-u-r-e"; - wog2->campFile = wog2Camp; - campButtons.push_back(wog2); - - // Evil Way Home - static const std::string wog3Camp = "ZC4"; - CCampaignButton *wog3 = new CCampaignButton(bg, "CAMPZ04.BMP", buttonCords[4][0] - 2, buttonCords[4][1] - 2, camps[wog3Camp] != 0 ? camps[wog3Camp] : CCampaignScreen::ENABLED); - wog3->hoverText = "Evil Way Home"; - wog3->campFile = wog3Camp; - campButtons.push_back(wog3); - + createButtons(buttonCords, campFiles[2], campImages[2], campVideos[2], campTexts[2], camps, campDefaults[2]); + campButtons[3]->pos.x -= 2; // special rule for the 4.th campaign + campButtons[3]->pos.y -= 2; drawCampaignPlaceholder(); } } @@ -3535,6 +3428,29 @@ CCampaignScreen::~CCampaignScreen() CCS->videoh->open("ACREDIT.SMK"); } +void CCampaignScreen::createButtons(const int buttonCords[7][2], const std::string campFiles[], + const std::string campImages[], const std::string campVideos[], const std::string campTexts[], std::map<std::string, CampaignStatus>& camps, const CampaignStatus campDefaults[]) +{ + for (int i = 0; i < 7; i++) + { + if (campFiles[i] != "") // if it's setted in the array + { + std::string file = campFiles[i]; + + CCampaignButton *button = new CCampaignButton(bg, campImages[i], buttonCords[i][0], buttonCords[i][1], camps[file] != 0 ? camps[file] : campDefaults[i]); + button->campFile = file; + button->hoverText = campTexts[i]; + button->video = campVideos[i]; + campButtons.push_back(button); + } + } +} + +std::string CCampaignScreen::getMapText(int index) +{ + return CGI->generaltexth->campaignMapNames[index]; +} + void CCampaignScreen::drawCampaignPlaceholder() { noCamp = BitmapHandler::loadBitmap("CAMPNOSC.BMP"); diff --git a/client/CPreGame.h b/client/CPreGame.h index 831324737..235673542 100644 --- a/client/CPreGame.h +++ b/client/CPreGame.h @@ -455,6 +455,9 @@ class CCampaignScreen : public CIntObject std::vector<CCampaignButton*> campButtons; // a container which holds all buttons where you can start a campaign void drawCampaignPlaceholder(); // draws the no campaign placeholder at the lower right position + std::string getMapText(int index); + void createButtons(const int buttonCords[7][2], const std::string campFiles[], + const std::string campImages[], const std::string campVideos[], const std::string campTexts[], std::map<std::string, CampaignStatus>& camps, const CampaignStatus campDefaults[]); public: enum CampaignSet {ROE, AB, SOD, WOG};