X-Git-Url: https://git.jsancho.org/?a=blobdiff_plain;f=Source%2FAccount.cpp;h=d132c2123d602945454e79d7f87e7d96c3315e9e;hb=3de67c0db8c3c74f5fb487579936a07770d253a1;hp=7eba58815332e28c4edda56ca0be8fd99c7a7c87;hpb=663badee5c884c9aebcd745e70891831ac658878;p=lugaru.git diff --git a/Source/Account.cpp b/Source/Account.cpp index 7eba588..d132c21 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" @@ -25,242 +23,239 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include #include "MacCompatibility.h" #include "string.h" +#include using namespace std; -extern bool debugmode; +extern bool devtools; vector Account::accounts = vector(); +Account* Account::active = nullptr; + +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)); -Account::Account(string n) : campaignProgress() { - name = string(n); - difficulty = 0; - progress = 0; - points = 0; - memset(highscore, 0, sizeof(highscore)); - memset(fasttime, 0, sizeof(fasttime)); - memset(unlocked, 0, sizeof(unlocked)); - - setCurrentCampaign("main"); + setCurrentCampaign("main"); } -void Account::setCurrentCampaign(string name) { - currentCampaign = name; +void Account::setCurrentCampaign(const string& name) +{ + currentCampaign = name; } -Account* Account::add(string name) { - accounts.push_back(new Account(name)); - return accounts.back(); +Account* Account::add(const string& name) +{ + accounts.push_back(new Account(name)); + return accounts.back(); } -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()); - 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().c_str()); + return accounts.front(); } -int Account::getDifficulty() { - return difficulty; +int Account::getDifficulty() +{ + return difficulty; } -void Account::endGame() { - campaignProgress[currentCampaign].choices.clear(); - campaignProgress[currentCampaign].score=0; - campaignProgress[currentCampaign].time=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) { - campaignProgress[currentCampaign].choices.push_back(choice); - setCampaignScore(campaignProgress[currentCampaign].score+score); - campaignProgress[currentCampaign].time = 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; - - 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;idifficulty)); - funpackf(tfile, "Bi", &(acc->progress)); - int nbCampaigns; - funpackf(tfile, "Bi", &nbCampaigns); - printf("loading %d campaign progress info\n",nbCampaigns); - - for(int k=0;kcampaignProgress[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= 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;icurrentCampaign.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;iname.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 iactive; + errno = 0; + + tfile = fopen(filename.c_str(), "rb" ); + + if (tfile) { + funpackf(tfile, "Bi", &numaccounts); + funpackf(tfile, "Bi", &iactive); + 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); + + 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); + } + 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(iactive); + } else { + perror(("Couldn't load users from " + filename).c_str()); + return NULL; + } } -void Account::saveFile(string filename, Account* accountactive) { - FILE *tfile; - 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, "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(j=0;jfirst.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(j=0;jsecond.choices.size();j++) - { - fpackf(tfile, "Bi", it->second.choices[j]); - } - } - - fpackf(tfile, "Bi", a->getCurrentCampaign().size()); - for(j=0;jgetCurrentCampaign().size();j++) - { - fpackf(tfile, "Bb", a->getCurrentCampaign()[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) +{ + FILE *tfile; + errno = 0; + + tfile = fopen(filename.c_str(), "wb" ); + if (tfile) { + fpackf(tfile, "Bi", getNbAccounts()); + fpackf(tfile, "Bi", indice(Account::active)); + + for (int i = 0; i < getNbAccounts(); i++) { + Account* a = Account::get(i); + printf("writing account %d/%d (%s)\n", i + 1, getNbAccounts(), a->getName().c_str()); + 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); + } else { + perror(("Couldn't save users in " + filename).c_str()); + } } -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; }