git repos / blockattack-game

blame: source/code/common.cc

normal view · raw

89c4a3a6 sago007 2008-08-29 14:32 1
/*
89c4a3a6 sago007 2008-08-29 14:32 2
Block Attack - Rise of the Blocks, SDL game, besed on Nintendo's Tetris Attack
89c4a3a6 sago007 2008-08-29 14:32 3
Copyright (C) 2008 Poul Sander
89c4a3a6 sago007 2008-08-29 14:32 4
89c4a3a6 sago007 2008-08-29 14:32 5
    This program is free software; you can redistribute it and/or modify
89c4a3a6 sago007 2008-08-29 14:32 6
    it under the terms of the GNU General Public License as published by
89c4a3a6 sago007 2008-08-29 14:32 7
    the Free Software Foundation; either version 2 of the License, or
89c4a3a6 sago007 2008-08-29 14:32 8
    (at your option) any later version.
89c4a3a6 sago007 2008-08-29 14:32 9
89c4a3a6 sago007 2008-08-29 14:32 10
    This program is distributed in the hope that it will be useful,
89c4a3a6 sago007 2008-08-29 14:32 11
    but WITHOUT ANY WARRANTY; without even the implied warranty of
89c4a3a6 sago007 2008-08-29 14:32 12
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
89c4a3a6 sago007 2008-08-29 14:32 13
    GNU General Public License for more details.
89c4a3a6 sago007 2008-08-29 14:32 14
89c4a3a6 sago007 2008-08-29 14:32 15
    You should have received a copy of the GNU General Public License
89c4a3a6 sago007 2008-08-29 14:32 16
    along with this program; if not, write to the Free Software
89c4a3a6 sago007 2008-08-29 14:32 17
    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
89c4a3a6 sago007 2008-08-29 14:32 18
89c4a3a6 sago007 2008-08-29 14:32 19
    Poul Sander
89c4a3a6 sago007 2008-08-29 14:32 20
    R�vehjvej 36, V. 1111
89c4a3a6 sago007 2008-08-29 14:32 21
    2800 Kgs. Lyngby
89c4a3a6 sago007 2008-08-29 14:32 22
    DENMARK
89c4a3a6 sago007 2008-08-29 14:32 23
    blockattack@poulsander.com
89c4a3a6 sago007 2008-08-29 14:32 24
    http://blockattack.sf.net
89c4a3a6 sago007 2008-08-29 14:32 25
*/
89c4a3a6 sago007 2008-08-29 14:32 26
89c4a3a6 sago007 2008-08-29 14:32 27
#include "common.h"
769a41a0 sago007 2008-09-24 12:54 28
#include <sstream>
769a41a0 sago007 2008-09-24 12:54 29
769a41a0 sago007 2008-09-24 12:54 30
//Function to convert numbers to string
769a41a0 sago007 2008-09-24 12:54 31
string itoa(int num)
769a41a0 sago007 2008-09-24 12:54 32
{
769a41a0 sago007 2008-09-24 12:54 33
    stringstream converter;
769a41a0 sago007 2008-09-24 12:54 34
    converter << num;
769a41a0 sago007 2008-09-24 12:54 35
    return converter.str();
769a41a0 sago007 2008-09-24 12:54 36
}
769a41a0 sago007 2008-09-24 12:54 37
769a41a0 sago007 2008-09-24 12:54 38
string double2str(double num)
769a41a0 sago007 2008-09-24 12:54 39
{
769a41a0 sago007 2008-09-24 12:54 40
    stringstream converter;
769a41a0 sago007 2008-09-24 12:54 41
    converter << num;
769a41a0 sago007 2008-09-24 12:54 42
    return converter.str();
769a41a0 sago007 2008-09-24 12:54 43
}        
769a41a0 sago007 2008-09-24 12:54 44
769a41a0 sago007 2008-09-24 12:54 45
double str2double(string str2parse)
769a41a0 sago007 2008-09-24 12:54 46
{
769a41a0 sago007 2008-09-24 12:54 47
    try{
769a41a0 sago007 2008-09-24 12:54 48
        stringstream converter(str2parse);
769a41a0 sago007 2008-09-24 12:54 49
        double val = 0.0;
769a41a0 sago007 2008-09-24 12:54 50
        converter >> val;
769a41a0 sago007 2008-09-24 12:54 51
        return val;
769a41a0 sago007 2008-09-24 12:54 52
    }catch(ios_base::failure f)
769a41a0 sago007 2008-09-24 12:54 53
    {
769a41a0 sago007 2008-09-24 12:54 54
        return 0.0;
769a41a0 sago007 2008-09-24 12:54 55
    }
769a41a0 sago007 2008-09-24 12:54 56
}
769a41a0 sago007 2008-09-24 12:54 57
769a41a0 sago007 2008-09-24 12:54 58
int str2int(string str2parse)
769a41a0 sago007 2008-09-24 12:54 59
{
769a41a0 sago007 2008-09-24 12:54 60
    try{
769a41a0 sago007 2008-09-24 12:54 61
        stringstream converter(str2parse);
769a41a0 sago007 2008-09-24 12:54 62
        int val = 0;
769a41a0 sago007 2008-09-24 12:54 63
        converter >> val;
769a41a0 sago007 2008-09-24 12:54 64
        return val;
769a41a0 sago007 2008-09-24 12:54 65
    }catch(ios_base::failure f)
769a41a0 sago007 2008-09-24 12:54 66
    {
769a41a0 sago007 2008-09-24 12:54 67
        return 0;
769a41a0 sago007 2008-09-24 12:54 68
    }
769a41a0 sago007 2008-09-24 12:54 69
}
89c4a3a6 sago007 2008-08-29 14:32 70
89c4a3a6 sago007 2008-08-29 14:32 71
#ifdef WIN32
89c4a3a6 sago007 2008-08-29 14:32 72
//Returns path to "my Documents" in windows:
89c4a3a6 sago007 2008-08-29 14:32 73
string getMyDocumentsPath()
89c4a3a6 sago007 2008-08-29 14:32 74
{
89c4a3a6 sago007 2008-08-29 14:32 75
    TCHAR pszPath[MAX_PATH];
89c4a3a6 sago007 2008-08-29 14:32 76
    if (SUCCEEDED(SHGetSpecialFolderPath(NULL, pszPath, CSIDL_PERSONAL, FALSE))) {
89c4a3a6 sago007 2008-08-29 14:32 77
        // pszPath is now the path that you want
724439a5 sago007 2008-09-11 15:52 78
#if DEBUG
89c4a3a6 sago007 2008-08-29 14:32 79
        cout << "MyDocuments Located: " << pszPath << endl;
89c4a3a6 sago007 2008-08-29 14:32 80
#endif
89c4a3a6 sago007 2008-08-29 14:32 81
        string theResult= pszPath;
89c4a3a6 sago007 2008-08-29 14:32 82
        return theResult;
89c4a3a6 sago007 2008-08-29 14:32 83
    }
89c4a3a6 sago007 2008-08-29 14:32 84
    else
89c4a3a6 sago007 2008-08-29 14:32 85
    {
89c4a3a6 sago007 2008-08-29 14:32 86
        cout << "Warning: My Documents not found!" << endl;
89c4a3a6 sago007 2008-08-29 14:32 87
        string theResult ="";
89c4a3a6 sago007 2008-08-29 14:32 88
        return theResult;
89c4a3a6 sago007 2008-08-29 14:32 89
    }
89c4a3a6 sago007 2008-08-29 14:32 90
}
89c4a3a6 sago007 2008-08-29 14:32 91
89c4a3a6 sago007 2008-08-29 14:32 92
#endif
89c4a3a6 sago007 2008-08-29 14:32 93
89c4a3a6 sago007 2008-08-29 14:32 94
string getPathToSaveFiles()
89c4a3a6 sago007 2008-08-29 14:32 95
{
89c4a3a6 sago007 2008-08-29 14:32 96
#ifdef __unix__
89c4a3a6 sago007 2008-08-29 14:32 97
    return (string)getenv("HOME")+(string)"/.gamesaves/"+GAMENAME;
89c4a3a6 sago007 2008-08-29 14:32 98
#elif WIN32
89c4a3a6 sago007 2008-08-29 14:32 99
    return getMyDocumentsPath()+(string)"/My Games/"+GAMENAME;
89c4a3a6 sago007 2008-08-29 14:32 100
#else
89c4a3a6 sago007 2008-08-29 14:32 101
    return ".";
89c4a3a6 sago007 2008-08-29 14:32 102
#endif
89c4a3a6 sago007 2008-08-29 14:32 103
}
89c4a3a6 sago007 2008-08-29 14:32 104
89c4a3a6 sago007 2008-08-29 14:32 105
89c4a3a6 sago007 2008-08-29 14:32 106
89c4a3a6 sago007 2008-08-29 14:32 107
commonTime getTotalTime()
89c4a3a6 sago007 2008-08-29 14:32 108
{
89c4a3a6 sago007 2008-08-29 14:32 109
    commonTime ct;
89c4a3a6 sago007 2008-08-29 14:32 110
    string filename = getPathToSaveFiles()+"/totalTime";
89c4a3a6 sago007 2008-08-29 14:32 111
    ifstream inFile(filename.c_str());
89c4a3a6 sago007 2008-08-29 14:32 112
    if(inFile)
89c4a3a6 sago007 2008-08-29 14:32 113
    {
89c4a3a6 sago007 2008-08-29 14:32 114
        inFile >> ct.days;
89c4a3a6 sago007 2008-08-29 14:32 115
        inFile >> ct.hours;
89c4a3a6 sago007 2008-08-29 14:32 116
        inFile >> ct.minutes;
89c4a3a6 sago007 2008-08-29 14:32 117
        inFile >> ct.seconds;
89c4a3a6 sago007 2008-08-29 14:32 118
        inFile.close();
89c4a3a6 sago007 2008-08-29 14:32 119
    }
89c4a3a6 sago007 2008-08-29 14:32 120
    else
89c4a3a6 sago007 2008-08-29 14:32 121
    {
89c4a3a6 sago007 2008-08-29 14:32 122
        ct.days = 0;
89c4a3a6 sago007 2008-08-29 14:32 123
        ct.hours = 0;
89c4a3a6 sago007 2008-08-29 14:32 124
        ct.minutes = 0;
89c4a3a6 sago007 2008-08-29 14:32 125
        ct.seconds = 0;
89c4a3a6 sago007 2008-08-29 14:32 126
    }
89c4a3a6 sago007 2008-08-29 14:32 127
    return ct;
89c4a3a6 sago007 2008-08-29 14:32 128
}
89c4a3a6 sago007 2008-08-29 14:32 129
89c4a3a6 sago007 2008-08-29 14:32 130
commonTime addTotalTime(commonTime toAdd)
89c4a3a6 sago007 2008-08-29 14:32 131
{
89c4a3a6 sago007 2008-08-29 14:32 132
    commonTime ct = getTotalTime();
89c4a3a6 sago007 2008-08-29 14:32 133
    
89c4a3a6 sago007 2008-08-29 14:32 134
    ct.seconds +=toAdd.seconds;
89c4a3a6 sago007 2008-08-29 14:32 135
    ct.minutes +=ct.seconds/60;
89c4a3a6 sago007 2008-08-29 14:32 136
    ct.seconds = ct.seconds%60;
89c4a3a6 sago007 2008-08-29 14:32 137
    
89c4a3a6 sago007 2008-08-29 14:32 138
    ct.minutes += toAdd.minutes;
89c4a3a6 sago007 2008-08-29 14:32 139
    ct.hours += ct.minutes/60;
89c4a3a6 sago007 2008-08-29 14:32 140
    ct.minutes = ct.minutes%60;
89c4a3a6 sago007 2008-08-29 14:32 141
    
89c4a3a6 sago007 2008-08-29 14:32 142
    ct.hours += toAdd.hours;
89c4a3a6 sago007 2008-08-29 14:32 143
    ct.days += ct.hours/24;
ddfaa92f sago007 2008-09-06 22:44 144
    ct.hours = ct.hours%24;
89c4a3a6 sago007 2008-08-29 14:32 145
    
89c4a3a6 sago007 2008-08-29 14:32 146
    ct.days += toAdd.days;
89c4a3a6 sago007 2008-08-29 14:32 147
    
89c4a3a6 sago007 2008-08-29 14:32 148
    string filename = getPathToSaveFiles()+"/totalTime";
89c4a3a6 sago007 2008-08-29 14:32 149
    ofstream outFile(filename.c_str(),ios::trunc);
89c4a3a6 sago007 2008-08-29 14:32 150
    if(outFile)
89c4a3a6 sago007 2008-08-29 14:32 151
    {
89c4a3a6 sago007 2008-08-29 14:32 152
        outFile << ct.days << endl;
89c4a3a6 sago007 2008-08-29 14:32 153
        outFile << ct.hours << endl;
89c4a3a6 sago007 2008-08-29 14:32 154
        outFile << ct.minutes << endl;
89c4a3a6 sago007 2008-08-29 14:32 155
        outFile << ct.seconds << endl;
89c4a3a6 sago007 2008-08-29 14:32 156
        outFile.close();
89c4a3a6 sago007 2008-08-29 14:32 157
    }
89c4a3a6 sago007 2008-08-29 14:32 158
    else
89c4a3a6 sago007 2008-08-29 14:32 159
        cout << "Error writing total time to: " << filename << endl;
89c4a3a6 sago007 2008-08-29 14:32 160
    return ct;
89c4a3a6 sago007 2008-08-29 14:32 161
}
769a41a0 sago007 2008-09-24 12:54 162
769a41a0 sago007 2008-09-24 12:54 163
Config* Config::instance = 0;
769a41a0 sago007 2008-09-24 12:54 164
769a41a0 sago007 2008-09-24 12:54 165
Config::Config()
769a41a0 sago007 2008-09-24 12:54 166
{
769a41a0 sago007 2008-09-24 12:54 167
    configMap.clear();
769a41a0 sago007 2008-09-24 12:54 168
    load();
769a41a0 sago007 2008-09-24 12:54 169
}
769a41a0 sago007 2008-09-24 12:54 170
769a41a0 sago007 2008-09-24 12:54 171
void Config::load()
769a41a0 sago007 2008-09-24 12:54 172
{
769a41a0 sago007 2008-09-24 12:54 173
    string filename = getPathToSaveFiles()+"/configFile";
769a41a0 sago007 2008-09-24 12:54 174
    ifstream inFile(filename.c_str());
769a41a0 sago007 2008-09-24 12:54 175
    string key;
769a41a0 sago007 2008-09-24 12:54 176
    string previuskey;
769a41a0 sago007 2008-09-24 12:54 177
    char value[MAX_VAR_LENGTH];
769a41a0 sago007 2008-09-24 12:54 178
    if(inFile)
769a41a0 sago007 2008-09-24 12:54 179
    {
769a41a0 sago007 2008-09-24 12:54 180
        while(!inFile.eof())
769a41a0 sago007 2008-09-24 12:54 181
        {
769a41a0 sago007 2008-09-24 12:54 182
            inFile >> key;
769a41a0 sago007 2008-09-24 12:54 183
            if(key==previuskey)
769a41a0 sago007 2008-09-24 12:54 184
                    continue;
769a41a0 sago007 2008-09-24 12:54 185
            previuskey = key;
769a41a0 sago007 2008-09-24 12:54 186
            inFile.get(); //Read the space between the key and the content
769a41a0 sago007 2008-09-24 12:54 187
            inFile.getline(value,MAX_VAR_LENGTH);
769a41a0 sago007 2008-09-24 12:54 188
            #if DEBUG
769a41a0 sago007 2008-09-24 12:54 189
                cout << "Config "<< "read: " << key << " with:\"" << value << "\"" << endl;
769a41a0 sago007 2008-09-24 12:54 190
            #endif
769a41a0 sago007 2008-09-24 12:54 191
            configMap[key] = (string)value;
769a41a0 sago007 2008-09-24 12:54 192
        }
769a41a0 sago007 2008-09-24 12:54 193
        inFile.close();
769a41a0 sago007 2008-09-24 12:54 194
    }
769a41a0 sago007 2008-09-24 12:54 195
}
769a41a0 sago007 2008-09-24 12:54 196
769a41a0 sago007 2008-09-24 12:54 197
Config* Config::getInstance()
769a41a0 sago007 2008-09-24 12:54 198
{
769a41a0 sago007 2008-09-24 12:54 199
    if(Config::instance==0)
769a41a0 sago007 2008-09-24 12:54 200
    {
769a41a0 sago007 2008-09-24 12:54 201
        Config::instance = new Config();
769a41a0 sago007 2008-09-24 12:54 202
        
769a41a0 sago007 2008-09-24 12:54 203
    }
769a41a0 sago007 2008-09-24 12:54 204
    return Config::instance; 
769a41a0 sago007 2008-09-24 12:54 205
}
769a41a0 sago007 2008-09-24 12:54 206
769a41a0 sago007 2008-09-24 12:54 207
void Config::save()
769a41a0 sago007 2008-09-24 12:54 208
{
769a41a0 sago007 2008-09-24 12:54 209
    string filename = getPathToSaveFiles()+"/configFile";
769a41a0 sago007 2008-09-24 12:54 210
    ofstream outFile(filename.c_str(),ios::trunc);
769a41a0 sago007 2008-09-24 12:54 211
    
769a41a0 sago007 2008-09-24 12:54 212
    if(outFile)
769a41a0 sago007 2008-09-24 12:54 213
    {
769a41a0 sago007 2008-09-24 12:54 214
        //outFile << statMap.size() << endl;
769a41a0 sago007 2008-09-24 12:54 215
        map<string,string>::iterator iter;
769a41a0 sago007 2008-09-24 12:54 216
        for(iter = configMap.begin(); iter != configMap.end(); iter++)
769a41a0 sago007 2008-09-24 12:54 217
        {
769a41a0 sago007 2008-09-24 12:54 218
            outFile << iter->first << " " << iter->second << endl;
769a41a0 sago007 2008-09-24 12:54 219
        }
769a41a0 sago007 2008-09-24 12:54 220
        outFile << "\n";
769a41a0 sago007 2008-09-24 12:54 221
    }
769a41a0 sago007 2008-09-24 12:54 222
}
769a41a0 sago007 2008-09-24 12:54 223
769a41a0 sago007 2008-09-24 12:54 224
bool Config::exists(string varName)
769a41a0 sago007 2008-09-24 12:54 225
{
769a41a0 sago007 2008-09-24 12:54 226
    //Using that find returns an iterator to the end of the map if not found
769a41a0 sago007 2008-09-24 12:54 227
    return configMap.find(varName) != configMap.end();
769a41a0 sago007 2008-09-24 12:54 228
}
769a41a0 sago007 2008-09-24 12:54 229
769a41a0 sago007 2008-09-24 12:54 230
void Config::setString(string varName, string content)
769a41a0 sago007 2008-09-24 12:54 231
{
769a41a0 sago007 2008-09-24 12:54 232
    configMap[varName] = content;
769a41a0 sago007 2008-09-24 12:54 233
}
769a41a0 sago007 2008-09-24 12:54 234
769a41a0 sago007 2008-09-24 12:54 235
void Config::setInt(string varName, int content)
769a41a0 sago007 2008-09-24 12:54 236
{
769a41a0 sago007 2008-09-24 12:54 237
    configMap[varName] = itoa(content);
769a41a0 sago007 2008-09-24 12:54 238
}
769a41a0 sago007 2008-09-24 12:54 239
769a41a0 sago007 2008-09-24 12:54 240
void Config::setValue(string varName,double content)
769a41a0 sago007 2008-09-24 12:54 241
{
769a41a0 sago007 2008-09-24 12:54 242
    configMap[varName] = double2str(content);
769a41a0 sago007 2008-09-24 12:54 243
}
769a41a0 sago007 2008-09-24 12:54 244
769a41a0 sago007 2008-09-24 12:54 245
string Config::getString(string varName)
769a41a0 sago007 2008-09-24 12:54 246
{
769a41a0 sago007 2008-09-24 12:54 247
    if(exists(varName))
769a41a0 sago007 2008-09-24 12:54 248
    {
769a41a0 sago007 2008-09-24 12:54 249
        return configMap[varName];
769a41a0 sago007 2008-09-24 12:54 250
    }
769a41a0 sago007 2008-09-24 12:54 251
    else
769a41a0 sago007 2008-09-24 12:54 252
        return "";
769a41a0 sago007 2008-09-24 12:54 253
}
769a41a0 sago007 2008-09-24 12:54 254
769a41a0 sago007 2008-09-24 12:54 255
int Config::getInt(string varName)
769a41a0 sago007 2008-09-24 12:54 256
{
769a41a0 sago007 2008-09-24 12:54 257
    if(exists(varName))
769a41a0 sago007 2008-09-24 12:54 258
    {
769a41a0 sago007 2008-09-24 12:54 259
        return str2int(configMap[varName]);
769a41a0 sago007 2008-09-24 12:54 260
    }
769a41a0 sago007 2008-09-24 12:54 261
    else
769a41a0 sago007 2008-09-24 12:54 262
        return 0;
769a41a0 sago007 2008-09-24 12:54 263
}
769a41a0 sago007 2008-09-24 12:54 264
769a41a0 sago007 2008-09-24 12:54 265
double Config::getValue(string varName)
769a41a0 sago007 2008-09-24 12:54 266
{
769a41a0 sago007 2008-09-24 12:54 267
    if(exists(varName))
769a41a0 sago007 2008-09-24 12:54 268
    {
769a41a0 sago007 2008-09-24 12:54 269
        return str2double(configMap[varName]);
769a41a0 sago007 2008-09-24 12:54 270
    }
769a41a0 sago007 2008-09-24 12:54 271
    else
769a41a0 sago007 2008-09-24 12:54 272
        return 0.0;
769a41a0 sago007 2008-09-24 12:54 273
}
1970-01-01 00:00 274