]> git.jsancho.org Git - lugaru.git/blob - Source/Account.cpp
Some cleans, fullscreen is back if "--windowed" isn't passed as option.
[lugaru.git] / Source / Account.cpp
1 /*
2 Copyright (C) 2003, 2010 - Wolfire Games
3 Copyright (C) 2010 - Côme <MCMic> BERNIGAUD
4
5 This file is part of Lugaru.
6
7 Lugaru is free software; you can redistribute it and/or
8 modify it under the terms of the GNU General Public License
9 as published by the Free Software Foundation; either version 2
10 of the License, or (at your option) any later version.
11
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  
15
16 See the GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
21 */
22
23 #include "Account.h"
24 #include "binio.h"
25 #include <fstream>
26 #include "MacCompatibility.h"
27 #include "string.h"
28
29 using namespace std;
30
31 extern bool debugmode;
32
33 vector<Account*> Account::accounts = vector<Account*>();
34
35 Account::Account(string n) : campaignProgress() {
36         name = string(n);
37         difficulty = 0;
38         progress = 0;
39         points = 0;
40         memset(highscore, 0, sizeof(highscore));
41         memset(fasttime, 0, sizeof(fasttime));
42         memset(unlocked, 0, sizeof(unlocked));
43         
44         setCurrentCampaign("main");
45 }
46
47 void Account::setCurrentCampaign(string name) {
48         currentCampaign = name;
49 }
50
51 Account* Account::add(string name) {
52         accounts.push_back(new Account(name));
53         return accounts.back();
54 }
55
56 Account* Account::get(int i) {
57         
58         if((i>=0)&&(i<accounts.size())) {
59                 return accounts[i];
60         } else
61                 return NULL;
62 }
63
64 void Account::destroy(int i) {
65         accounts.erase(accounts.begin()+i);
66 }
67 Account* Account::destroy(Account* a) {
68         for(int i=0; i<accounts.size(); i++) {
69                 if(accounts[i]==a) {
70                         accounts.erase(accounts.begin()+i);
71                         return NULL;
72                 }
73         }
74         printf("Unexpected error : User %s not found\n",a->getName());
75         return accounts.front();
76 }
77
78 int Account::getDifficulty() {
79         return difficulty;
80 }
81
82 void Account::endGame() {
83         campaignProgress[currentCampaign].choices.clear();
84         campaignProgress[currentCampaign].score=0;
85         campaignProgress[currentCampaign].time=0;
86 }
87
88 void Account::winCampaignLevel(int choice, float score, float time) {
89         campaignProgress[currentCampaign].choices.push_back(choice);
90         setCampaignScore(campaignProgress[currentCampaign].score+score);
91         campaignProgress[currentCampaign].time = time;
92 }
93
94 void Account::winLevel(int level, float score, float time) {
95         if(!debugmode) {
96                 if(score>highscore[level])
97                         highscore[level]=score;
98                 if(time<fasttime[level]||fasttime[level]==0)
99                         fasttime[level]=time;
100         }
101         if(progress<level+1)
102                 progress=level+1;
103 }
104
105 Account* Account::loadFile(string filename) {
106         FILE *tfile;
107         int numaccounts;
108         int accountactive;
109         
110         tfile=fopen(ConvertFileName(filename.c_str()), "rb" );
111         
112         if(tfile)
113         {
114                 funpackf(tfile, "Bi", &numaccounts);
115                 funpackf(tfile, "Bi", &accountactive);
116                 printf("number of accounts %d\n",numaccounts);
117                 for(int i=0;i<numaccounts;i++)
118                 {
119                         printf("loading account %d/%d\n",i,numaccounts);
120                         Account* acc = new Account();
121                         funpackf(tfile, "Bi", &(acc->difficulty));
122                         funpackf(tfile, "Bi", &(acc->progress));
123                         int nbCampaigns;
124                         funpackf(tfile, "Bi", &nbCampaigns);
125                         printf("loading %d campaign progress info\n",nbCampaigns);
126                         
127                         for(int k=0;k<nbCampaigns;++k) {
128                                 string campaignName = "";
129                                 int t;
130                                 char c;
131                                 funpackf(tfile, "Bi",  &t);
132                                 for(int j=0;j<t;j++)
133                                 {
134                                         funpackf(tfile, "Bb",  &c);
135                                         campaignName.append(1,c);
136                                 }
137                                 printf("loading %s campaign progress info\n",campaignName.c_str());
138                                 funpackf(tfile, "Bf", &(acc->campaignProgress[campaignName].time));
139                                 funpackf(tfile, "Bf", &(acc->campaignProgress[campaignName].score));
140                                 funpackf(tfile, "Bf", &(acc->campaignProgress[campaignName].fasttime));
141                                 funpackf(tfile, "Bf", &(acc->campaignProgress[campaignName].highscore));
142                                 int campaignchoicesmade,campaignchoice;
143                                 funpackf(tfile, "Bi", &campaignchoicesmade);
144                                 for(int j=0;j<campaignchoicesmade;j++)
145                                 {
146                                         funpackf(tfile, "Bi", &campaignchoice);
147                                         if (campaignchoice >= 10) // what is that for?
148                                         {
149                                                 campaignchoice = 0;
150                                         }
151                                         acc->campaignProgress[campaignName].choices.push_back(campaignchoice);
152                                 }
153                         }
154                         
155                         acc->currentCampaign = "";
156                         int t;
157                         char c;
158                         funpackf(tfile, "Bi",  &t);
159                         for(int i=0;i<t;i++)
160                         {
161                                 funpackf(tfile, "Bb",  &c);
162                                 acc->currentCampaign.append(1,c);
163                         }
164                         
165                         funpackf(tfile, "Bf", &(acc->points));
166                         for(int i=0;i<50;i++)
167                         {
168                                 funpackf(tfile, "Bf", &(acc->highscore[i]));
169                                 funpackf(tfile, "Bf", &(acc->fasttime[i]));
170                         }
171                         for(int i=0;i<60;i++)
172                         {
173                                 funpackf(tfile, "Bb",  &(acc->unlocked[i]));
174                         }
175                         int temp;
176                         char ctemp;
177                         funpackf(tfile, "Bi",  &temp);
178                         for(int i=0;i<temp;i++)
179                         {
180                                 funpackf(tfile, "Bb",  &ctemp);
181                                 acc->name.append(1,ctemp);
182                         }
183                         if(!strcmp(acc->name.c_str(),""))
184                                 acc->name="Lugaru Player"; // no empty player name security.
185                         accounts.push_back(acc);
186                 }
187
188                 fclose(tfile);
189                 return get(accountactive);
190         } else {
191                 printf("filenotfound\n");
192                 return NULL;
193         }
194 }
195
196 void Account::saveFile(string filename, Account* accountactive) {
197         FILE *tfile;
198         int j;
199         
200         tfile=fopen(ConvertFileName(filename.c_str(), "wb"), "wb" );
201         if(tfile)
202         {
203                 printf("writing %d accounts :\n",getNbAccounts());
204                 fpackf(tfile, "Bi", getNbAccounts());
205                 fpackf(tfile, "Bi", indice(accountactive));
206                 
207                 for(int i=0;i<getNbAccounts();i++)
208                 {
209                         Account* a = Account::get(i);
210                         printf("writing account %d/%d (%s)\n",i+1,getNbAccounts(),a->getName());
211                         fpackf(tfile, "Bi", a->difficulty);
212                         fpackf(tfile, "Bi", a->progress);
213                         fpackf(tfile, "Bi", a->campaignProgress.size());
214                         
215                         map<string,CampaignProgress>::const_iterator it;
216                         for( it=a->campaignProgress.begin(); it!= a->campaignProgress.end(); ++it) {
217                                 fpackf(tfile, "Bi",  it->first.size());
218                                 for(j=0;j<it->first.size();j++)
219                                 {
220                                         fpackf(tfile, "Bb",  it->first[j]);
221                                 }
222                                 fpackf(tfile, "Bf", it->second.time);
223                                 fpackf(tfile, "Bf", it->second.score);
224                                 fpackf(tfile, "Bf", it->second.fasttime);
225                                 fpackf(tfile, "Bf", it->second.highscore);
226                                 fpackf(tfile, "Bi", it->second.choices.size());
227                                 for(j=0;j<it->second.choices.size();j++)
228                                 {
229                                         fpackf(tfile, "Bi", it->second.choices[j]);
230                                 }
231                         }
232                         
233                         fpackf(tfile, "Bi", a->getCurrentCampaign().size());
234                         for(j=0;j<a->getCurrentCampaign().size();j++)
235                         {
236                                 fpackf(tfile, "Bb", a->getCurrentCampaign()[j]);
237                         }
238                         
239                         fpackf(tfile, "Bf", a->points);
240                         for(j=0;j<50;j++)
241                         {
242                                 fpackf(tfile, "Bf", a->highscore[j]);
243                                 fpackf(tfile, "Bf", a->fasttime[j]);
244                         }
245                         for(j=0;j<60;j++)
246                         {
247                                 fpackf(tfile, "Bb",  a->unlocked[j]);
248                         }
249                         fpackf(tfile, "Bi",  a->name.size());
250                         for(j=0;j<a->name.size();j++)
251                         {
252                                 fpackf(tfile, "Bb",  a->name[j]);
253                         }
254                 }
255
256                 fclose(tfile);
257         }
258 }
259
260 int Account::indice(Account* a) {
261         for(int i=0; i < accounts.size(); i++) {
262                 if(accounts[i]==a)
263                         return i;
264         }
265         return -1;
266 }