X-Git-Url: https://git.jsancho.org/?a=blobdiff_plain;f=Source%2FAccount.cpp;h=1d7bbd1d4951c94692b4e5fe7771aabf47ad955e;hb=5509b55dbc13227bdc7b97f2934fa71dad02cc66;hp=b17d8e5596a72a48f664fc173718af7cb7d8c9da;hpb=7a084f44a89054024b83299709c19a2f67fcaea9;p=lugaru.git diff --git a/Source/Account.cpp b/Source/Account.cpp index b17d8e5..1d7bbd1 100644 --- a/Source/Account.cpp +++ b/Source/Account.cpp @@ -1,23 +1,21 @@ /* Copyright (C) 2003, 2010 - Wolfire Games -Copyright (C) 2010 - Côme BERNIGAUD +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 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. -This program is distributed in the hope that it will be useful, +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. +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 this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +along with Lugaru. If not, see . */ #include "Account.h" @@ -32,191 +30,229 @@ extern bool debugmode; vector Account::accounts = vector(); -Account::Account(string n) { - name = string(n); - difficulty = 0; - progress = 0; - points = 0; - memset(highscore, 0, sizeof(highscore)); - memset(fasttime, 0, sizeof(fasttime)); - memset(unlocked, 0, sizeof(unlocked)); - campaignhighscore = 0; - campaignfasttime = 0; - campaignscore = 0; - campaigntime = 0; - campaignchoicesmade = 0; - memset(campaignchoices, 0, sizeof(campaignchoices)); +Account::Account(const string& name) : name(name), campaignProgress() +{ + difficulty = 0; + progress = 0; + points = 0; + memset(highscore, 0, sizeof(highscore)); + memset(fasttime, 0, sizeof(fasttime)); + memset(unlocked, 0, sizeof(unlocked)); + + setCurrentCampaign("main"); } -Account* Account::add(string name) { - accounts.push_back(new Account(name)); - return accounts.back(); +void Account::setCurrentCampaign(const string& name) +{ + currentCampaign = name; } -Account* Account::get(int i) { - - if((i>=0)&&(i= 0) && (i < int(accounts.size()))) { + return accounts[i]; + } else + return NULL; } -void Account::destroy(int i) { - accounts.erase(accounts.begin()+i); +void Account::destroy(int i) +{ + accounts.erase(accounts.begin() + i); } -Account* Account::destroy(Account* a) { - for(int i=0; igetName(),a); - return accounts.front(); +Account* Account::destroy(Account* a) +{ + for (unsigned i = 0; i < accounts.size(); i++) { + if (accounts[i] == a) { + accounts.erase(accounts.begin() + i); + return NULL; + } + } + printf("Unexpected error : User %s not found\n", a->getName()); + return accounts.front(); } -int Account::getDifficulty() { - return difficulty; +int Account::getDifficulty() +{ + return difficulty; } -void Account::endGame() { - campaignchoicesmade=0; - campaignscore=0; - campaigntime=0; +void Account::endGame() +{ + campaignProgress[currentCampaign].choices.clear(); + campaignProgress[currentCampaign].score = 0; + campaignProgress[currentCampaign].time = 0; } -void Account::winCampaignLevel(int choice, float score, float time) { - campaignchoices[campaignchoicesmade++] = choice; - setCampaignScore(campaignscore+score); - campaigntime = time; +void Account::winCampaignLevel(int choice, float score, float time) +{ + campaignProgress[currentCampaign].choices.push_back(choice); + setCampaignScore(campaignProgress[currentCampaign].score + score); + campaignProgress[currentCampaign].time = time; } -void Account::winLevel(int level, float score, float time) { - if(!debugmode) { - if(score>highscore[level]) - highscore[level]=score; - if(time highscore[level]) + highscore[level] = score; + if (time < fasttime[level] || fasttime[level] == 0) + fasttime[level] = time; + } + if (progress < level + 1) + progress = level + 1; } -Account* Account::loadFile(string filename) { - FILE *tfile; - int numaccounts; - int accountactive; - int j; - - tfile=fopen(ConvertFileName(filename.c_str()), "rb" ); - - if(tfile) - { - funpackf(tfile, "Bi", &numaccounts); - funpackf(tfile, "Bi", &accountactive); - printf("number of accounts %d\n",numaccounts); - for(int i=0;icampaigntime)); - funpackf(tfile, "Bf", &(acc->campaignscore)); - funpackf(tfile, "Bf", &(acc->campaignfasttime)); - funpackf(tfile, "Bf", &(acc->campaignhighscore)); - funpackf(tfile, "Bi", &(acc->difficulty)); - funpackf(tfile, "Bi", &(acc->progress)); - funpackf(tfile, "Bi", &(acc->campaignchoicesmade)); - for(j=0;jcampaignchoicesmade;j++) - { - funpackf(tfile, "Bi", &(acc->campaignchoices[j])); - if (acc->campaignchoices[j] >= 10) - { - acc->campaignchoices[j] = 0; - } - } - funpackf(tfile, "Bf", &(acc->points)); - for(j=0;j<50;j++) - { - funpackf(tfile, "Bf", &(acc->highscore[j])); - funpackf(tfile, "Bf", &(acc->fasttime[j])); - } - for(j=0;j<60;j++) - { - funpackf(tfile, "Bb", &(acc->unlocked[j])); - } - int temp; - char ctemp; - funpackf(tfile, "Bi", &temp); - for(j=0;jname.append(1,ctemp); - } - if(!strcmp(acc->name.c_str(),"")) - acc->name="Lugaru Player"; // no empty player name security. - accounts.push_back(acc); - } - - fclose(tfile); - return get(accountactive); - } else { - printf("filenotfound\n"); - return NULL; - } +Account* Account::loadFile(string filename) +{ + FILE *tfile; + int numaccounts; + int accountactive; + + tfile = fopen(ConvertFileName(filename.c_str()), "rb" ); + + if (tfile) { + funpackf(tfile, "Bi", &numaccounts); + funpackf(tfile, "Bi", &accountactive); + printf("number of accounts %d\n", numaccounts); + for (int i = 0; i < numaccounts; i++) { + printf("loading account %d/%d\n", i, numaccounts); + Account* acc = new Account(); + funpackf(tfile, "Bi", &(acc->difficulty)); + funpackf(tfile, "Bi", &(acc->progress)); + int nbCampaigns; + funpackf(tfile, "Bi", &nbCampaigns); + //~ printf("loading %d campaign progress info\n",nbCampaigns); + + for (int k = 0; k < nbCampaigns; ++k) { + string campaignName = ""; + int t; + char c; + funpackf(tfile, "Bi", &t); + for (int j = 0; j < t; j++) { + funpackf(tfile, "Bb", &c); + campaignName.append(1, c); + } + //~ printf("loading %s campaign progress info\n",campaignName.c_str()); + funpackf(tfile, "Bf", &(acc->campaignProgress[campaignName].time)); + funpackf(tfile, "Bf", &(acc->campaignProgress[campaignName].score)); + funpackf(tfile, "Bf", &(acc->campaignProgress[campaignName].fasttime)); + funpackf(tfile, "Bf", &(acc->campaignProgress[campaignName].highscore)); + int campaignchoicesmade, campaignchoice; + funpackf(tfile, "Bi", &campaignchoicesmade); + for (int j = 0; j < campaignchoicesmade; j++) { + funpackf(tfile, "Bi", &campaignchoice); + if (campaignchoice >= 10) { // what is that for? + campaignchoice = 0; + } + acc->campaignProgress[campaignName].choices.push_back(campaignchoice); + } + } + + acc->currentCampaign = ""; + int t; + char c; + funpackf(tfile, "Bi", &t); + for (int i = 0; i < t; i++) { + funpackf(tfile, "Bb", &c); + acc->currentCampaign.append(1, c); + } + + funpackf(tfile, "Bf", &(acc->points)); + for (int i = 0; i < 50; i++) { + funpackf(tfile, "Bf", &(acc->highscore[i])); + funpackf(tfile, "Bf", &(acc->fasttime[i])); + } + for (int i = 0; i < 60; i++) { + funpackf(tfile, "Bb", &(acc->unlocked[i])); + } + int temp; + char ctemp; + funpackf(tfile, "Bi", &temp); + for (int i = 0; i < temp; i++) { + funpackf(tfile, "Bb", &ctemp); + acc->name.append(1, ctemp); + } + if (!strcmp(acc->name.c_str(), "")) + acc->name = "Lugaru Player"; // no empty player name security. + accounts.push_back(acc); + } + + fclose(tfile); + return get(accountactive); + } else { + printf("filenotfound\n"); + return NULL; + } } -void Account::saveFile(string filename, Account* accountactive) { - FILE *tfile; - int numaccounts; - int j; - - tfile=fopen(ConvertFileName(filename.c_str(), "wb"), "wb" ); - if(tfile) - { - printf("writing %d accounts :\n",getNbAccounts()); - fpackf(tfile, "Bi", getNbAccounts()); - fpackf(tfile, "Bi", indice(accountactive)); - - for(int i=0;igetName()); - fpackf(tfile, "Bf", a->campaigntime); - fpackf(tfile, "Bf", a->campaignscore); - fpackf(tfile, "Bf", a->campaignfasttime); - fpackf(tfile, "Bf", a->campaignhighscore); - fpackf(tfile, "Bi", a->difficulty); - fpackf(tfile, "Bi", a->progress); - fpackf(tfile, "Bi", a->campaignchoicesmade); - for(j=0;jcampaignchoicesmade;j++) - { - fpackf(tfile, "Bi", a->campaignchoices[j]); - } - fpackf(tfile, "Bf", a->points); - for(j=0;j<50;j++) - { - fpackf(tfile, "Bf", a->highscore[j]); - fpackf(tfile, "Bf", a->fasttime[j]); - } - for(j=0;j<60;j++) - { - fpackf(tfile, "Bb", a->unlocked[j]); - } - fpackf(tfile, "Bi", a->name.size()); - for(j=0;jname.size();j++) - { - fpackf(tfile, "Bb", a->name[j]); - } - } - - fclose(tfile); - } +void Account::saveFile(string filename, Account* accountactive) +{ + FILE *tfile; + + tfile = fopen(ConvertFileName(filename.c_str(), "wb"), "wb" ); + if (tfile) { + printf("writing %d accounts :\n", getNbAccounts()); + fpackf(tfile, "Bi", getNbAccounts()); + fpackf(tfile, "Bi", indice(accountactive)); + + for (int i = 0; i < getNbAccounts(); i++) { + Account* a = Account::get(i); + printf("writing account %d/%d (%s)\n", i + 1, getNbAccounts(), a->getName()); + fpackf(tfile, "Bi", a->difficulty); + fpackf(tfile, "Bi", a->progress); + fpackf(tfile, "Bi", a->campaignProgress.size()); + + map::const_iterator it; + for (it = a->campaignProgress.begin(); it != a->campaignProgress.end(); ++it) { + fpackf(tfile, "Bi", it->first.size()); + for (unsigned j = 0; j < it->first.size(); j++) { + fpackf(tfile, "Bb", it->first[j]); + } + fpackf(tfile, "Bf", it->second.time); + fpackf(tfile, "Bf", it->second.score); + fpackf(tfile, "Bf", it->second.fasttime); + fpackf(tfile, "Bf", it->second.highscore); + fpackf(tfile, "Bi", it->second.choices.size()); + for (unsigned j = 0; j < it->second.choices.size(); j++) { + fpackf(tfile, "Bi", it->second.choices[j]); + } + } + + fpackf(tfile, "Bi", a->getCurrentCampaign().size()); + for (unsigned j = 0; j < a->getCurrentCampaign().size(); j++) { + fpackf(tfile, "Bb", a->getCurrentCampaign()[j]); + } + + fpackf(tfile, "Bf", a->points); + for (unsigned j = 0; j < 50; j++) { + fpackf(tfile, "Bf", a->highscore[j]); + fpackf(tfile, "Bf", a->fasttime[j]); + } + for (unsigned j = 0; j < 60; j++) { + fpackf(tfile, "Bb", a->unlocked[j]); + } + fpackf(tfile, "Bi", a->name.size()); + for (unsigned j = 0; j < a->name.size(); j++) { + fpackf(tfile, "Bb", a->name[j]); + } + } + + fclose(tfile); + } } -int Account::indice(Account* a) { - for(int i=0; i < accounts.size(); i++) { - if(accounts[i]==a) - return i; - } - return -1; +int Account::indice(Account* a) +{ + for (unsigned i = 0; i < accounts.size(); i++) { + if (accounts[i] == a) + return i; + } + return -1; }