]> git.jsancho.org Git - lugaru.git/blobdiff - Source/Level/Campaign.cpp
Sorted all source files in folders
[lugaru.git] / Source / Level / Campaign.cpp
diff --git a/Source/Level/Campaign.cpp b/Source/Level/Campaign.cpp
new file mode 100644 (file)
index 0000000..2aa5f17
--- /dev/null
@@ -0,0 +1,156 @@
+/*
+Copyright (C) 2003, 2010 - Wolfire Games
+Copyright (C) 2010-2016 - Lugaru contributors (see AUTHORS file)
+
+This file is part of Lugaru.
+
+Lugaru is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+Lugaru is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with Lugaru.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include "Game.h"
+#include "Level/Campaign.h"
+#include "Utils/Folders.h"
+
+#include <dirent.h>
+
+using namespace Game;
+
+std::vector<CampaignLevel> campaignlevels;
+
+bool campaign = false;
+
+int actuallevel = 0;
+
+std::vector<std::string> ListCampaigns()
+{
+    errno = 0;
+    DIR *campaigns = opendir(Folders::getResourcePath("Campaigns").c_str());
+    struct dirent *campaign = NULL;
+    if (!campaigns) {
+        perror(("Problem while loading campaigns from " + Folders::getResourcePath("Campaigns")).c_str());
+        exit(EXIT_FAILURE);
+    }
+    std::vector<std::string> campaignNames;
+    while ((campaign = readdir(campaigns)) != NULL) {
+        std::string name(campaign->d_name);
+        if (name.length() < 5)
+            continue;
+        if (!name.compare(name.length() - 4, 4, ".txt")) {
+            campaignNames.push_back(name.substr(0, name.length() - 4));
+        }
+    }
+    closedir(campaigns);
+    return campaignNames;
+}
+
+void LoadCampaign()
+{
+    if (!Account::hasActive()) {
+        return;
+    }
+    std::ifstream ipstream(Folders::getResourcePath("Campaigns/" + Account::active().getCurrentCampaign() + ".txt"));
+    if (!ipstream.good()) {
+        if (Account::active().getCurrentCampaign() == "main") {
+            cerr << "Could not found main campaign!" << endl;
+            return;
+        }
+        cerr << "Could not found campaign \"" << Account::active().getCurrentCampaign() << "\", falling back to main." << endl;
+        Account::active().setCurrentCampaign("main");
+        return LoadCampaign();
+    }
+    ipstream.ignore(256, ':');
+    int numlevels;
+    ipstream >> numlevels;
+    campaignlevels.clear();
+    for (int i = 0; i < numlevels; i++) {
+        CampaignLevel cl;
+        ipstream >> cl;
+        campaignlevels.push_back(cl);
+    }
+    ipstream.close();
+
+    std::ifstream test(Folders::getResourcePath("Textures/" + Account::active().getCurrentCampaign() + "/World.png"));
+    if (test.good()) {
+        Mainmenuitems[7].load("Textures/" + Account::active().getCurrentCampaign() + "/World.png", 0);
+    } else {
+        Mainmenuitems[7].load("Textures/World.png", 0);
+    }
+
+    if (Account::active().getCampaignChoicesMade() == 0) {
+        Account::active().setCampaignScore(0);
+        Account::active().resetFasttime();
+    }
+}
+
+CampaignLevel::CampaignLevel() :
+    width(10),
+    choosenext(1)
+{
+    location.x = 0;
+    location.y = 0;
+}
+
+int CampaignLevel::getStartX() {
+    return 30 + 120 + location.x * 400 / 512;
+}
+
+int CampaignLevel::getStartY() {
+    return 30 + 30 + (512 - location.y) * 400 / 512;
+}
+
+int CampaignLevel::getEndX() {
+    return getStartX() + width;
+}
+
+int CampaignLevel::getEndY() {
+    return getStartY() + width;
+}
+
+XYZ CampaignLevel::getCenter() {
+    XYZ center;
+    center.x = getStartX() + width / 2;
+    center.y = getStartY() + width / 2;
+    return center;
+}
+
+int CampaignLevel::getWidth() {
+    return width;
+}
+
+istream& CampaignLevel::operator<< (istream& is) {
+    is.ignore(256, ':');
+    is.ignore(256, ':');
+    is.ignore(256, ' ');
+    is >> mapname;
+    is.ignore(256, ':');
+    is >> description;
+    for (size_t pos = description.find('_'); pos != string::npos; pos = description.find('_', pos)) {
+        description.replace(pos, 1, 1, ' ');
+    }
+    is.ignore(256, ':');
+    is >> choosenext;
+    is.ignore(256, ':');
+    int numnext, next;
+    is >> numnext;
+    for (int j = 0; j < numnext; j++) {
+        is.ignore(256, ':');
+        is >> next;
+        nextlevel.push_back(next - 1);
+    }
+    is.ignore(256, ':');
+    is >> location.x;
+    is.ignore(256, ':');
+    is >> location.y;
+    return is;
+}