git repos / blockattack-game

blame: source/code/highscore.cpp

normal view · raw

89c4a3a6 sago007 2008-08-29 14:32 1
/*
89c4a3a6 sago007 2008-08-29 14:32 2
highscore.cpp
89c4a3a6 sago007 2008-08-29 14:32 3
Copyright (C) 2005 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ævehøjvej 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
*/
89c4a3a6 sago007 2008-08-29 14:32 25
89c4a3a6 sago007 2008-08-29 14:32 26
#include "highscore.h"
89c4a3a6 sago007 2008-08-29 14:32 27
89c4a3a6 sago007 2008-08-29 14:32 28
#ifdef WIN32
89c4a3a6 sago007 2008-08-29 14:32 29
89c4a3a6 sago007 2008-08-29 14:32 30
//Returns path to "my Documents" in windows:
89c4a3a6 sago007 2008-08-29 14:32 31
string getMyDocumentsPath1()
89c4a3a6 sago007 2008-08-29 14:32 32
{
89c4a3a6 sago007 2008-08-29 14:32 33
    TCHAR pszPath[MAX_PATH];
89c4a3a6 sago007 2008-08-29 14:32 34
    //if (SUCCEEDED(SHGetSpecialFolderPath(NULL, pszPath, CSIDL_PERSONAL, FALSE))) {
89c4a3a6 sago007 2008-08-29 14:32 35
    if (SUCCEEDED(SHGetSpecialFolderPath(NULL, pszPath, CSIDL_PERSONAL, FALSE))) {
89c4a3a6 sago007 2008-08-29 14:32 36
        // pszPath is now the path that you want
89c4a3a6 sago007 2008-08-29 14:32 37
        cout << "MyDocuments Located: " << pszPath << endl;
89c4a3a6 sago007 2008-08-29 14:32 38
        string theResult= pszPath;
89c4a3a6 sago007 2008-08-29 14:32 39
        return theResult;
89c4a3a6 sago007 2008-08-29 14:32 40
    }
89c4a3a6 sago007 2008-08-29 14:32 41
    else
89c4a3a6 sago007 2008-08-29 14:32 42
    {
89c4a3a6 sago007 2008-08-29 14:32 43
        cout << "Warning: My Documents not found!" << endl;
89c4a3a6 sago007 2008-08-29 14:32 44
        string theResult ="";
89c4a3a6 sago007 2008-08-29 14:32 45
        return theResult;
89c4a3a6 sago007 2008-08-29 14:32 46
    }
89c4a3a6 sago007 2008-08-29 14:32 47
}
89c4a3a6 sago007 2008-08-29 14:32 48
89c4a3a6 sago007 2008-08-29 14:32 49
#endif
89c4a3a6 sago007 2008-08-29 14:32 50
89c4a3a6 sago007 2008-08-29 14:32 51
Highscore::Highscore(int type)
89c4a3a6 sago007 2008-08-29 14:32 52
{
89c4a3a6 sago007 2008-08-29 14:32 53
#if defined(__unix__)
89c4a3a6 sago007 2008-08-29 14:32 54
    string home = getenv("HOME");
89c4a3a6 sago007 2008-08-29 14:32 55
    string filename1 = home+"/.gamesaves/blockattack/endless.dat";
89c4a3a6 sago007 2008-08-29 14:32 56
    string filename2 = home+"/.gamesaves/blockattack/timetrial.dat";
89c4a3a6 sago007 2008-08-29 14:32 57
#elif defined(_WIN32)
89c4a3a6 sago007 2008-08-29 14:32 58
    string home = getMyDocumentsPath1();
89c4a3a6 sago007 2008-08-29 14:32 59
    string filename1, filename2;
89c4a3a6 sago007 2008-08-29 14:32 60
    if (&home!=NULL)
89c4a3a6 sago007 2008-08-29 14:32 61
    {
89c4a3a6 sago007 2008-08-29 14:32 62
        filename1 = home+"/My Games/blockattack/endless.dat";
89c4a3a6 sago007 2008-08-29 14:32 63
        filename2 = home+"/My Games/blockattack/timetrial.dat";
89c4a3a6 sago007 2008-08-29 14:32 64
    }
89c4a3a6 sago007 2008-08-29 14:32 65
    else
89c4a3a6 sago007 2008-08-29 14:32 66
    {
89c4a3a6 sago007 2008-08-29 14:32 67
        filename1 = "endless.dat";
89c4a3a6 sago007 2008-08-29 14:32 68
        filename2 = "timetrial.dat";
89c4a3a6 sago007 2008-08-29 14:32 69
    }
89c4a3a6 sago007 2008-08-29 14:32 70
#else
89c4a3a6 sago007 2008-08-29 14:32 71
    string filename1 = "endless.dat";
89c4a3a6 sago007 2008-08-29 14:32 72
    string filename2 = "timetrial.dat";
89c4a3a6 sago007 2008-08-29 14:32 73
#endif
89c4a3a6 sago007 2008-08-29 14:32 74
    ourType = type;
89c4a3a6 sago007 2008-08-29 14:32 75
    if (type == 1) filename = (char*)malloc(filename1.length()+1);
89c4a3a6 sago007 2008-08-29 14:32 76
    if (type == 2) filename = (char*)malloc(filename2.length()+1);
89c4a3a6 sago007 2008-08-29 14:32 77
    if (filename == NULL){
89c4a3a6 sago007 2008-08-29 14:32 78
        cout << "Out of memory" << endl;
89c4a3a6 sago007 2008-08-29 14:32 79
        exit(1);
89c4a3a6 sago007 2008-08-29 14:32 80
    }
89c4a3a6 sago007 2008-08-29 14:32 81
    if (type == 1) memcpy(filename,filename1.c_str(),filename1.length()+1);
89c4a3a6 sago007 2008-08-29 14:32 82
    if (type == 2) memcpy(filename,filename2.c_str(),filename2.length()+1);
89c4a3a6 sago007 2008-08-29 14:32 83
    ifstream scorefile(filename, ios::binary);
89c4a3a6 sago007 2008-08-29 14:32 84
    if (scorefile)
89c4a3a6 sago007 2008-08-29 14:32 85
    {
89c4a3a6 sago007 2008-08-29 14:32 86
        for (int i = 0; i<top; i++)
89c4a3a6 sago007 2008-08-29 14:32 87
        {
89c4a3a6 sago007 2008-08-29 14:32 88
            scorefile.read(tabel[i].name,30*sizeof(char));
89c4a3a6 sago007 2008-08-29 14:32 89
            scorefile.read(reinterpret_cast<char*>(&tabel[i].score), sizeof(int));
89c4a3a6 sago007 2008-08-29 14:32 90
        }
89c4a3a6 sago007 2008-08-29 14:32 91
    }
89c4a3a6 sago007 2008-08-29 14:32 92
    else
89c4a3a6 sago007 2008-08-29 14:32 93
    {
89c4a3a6 sago007 2008-08-29 14:32 94
        for (int i = 0; i<top; i++)
89c4a3a6 sago007 2008-08-29 14:32 95
        {
89c4a3a6 sago007 2008-08-29 14:32 96
            strcpy(tabel[i].name,"Poul Sander                  \0");
89c4a3a6 sago007 2008-08-29 14:32 97
            tabel[i].score = 2000 - i*100;
89c4a3a6 sago007 2008-08-29 14:32 98
        }
89c4a3a6 sago007 2008-08-29 14:32 99
    }
89c4a3a6 sago007 2008-08-29 14:32 100
    scorefile.close();
89c4a3a6 sago007 2008-08-29 14:32 101
    free(filename);
89c4a3a6 sago007 2008-08-29 14:32 102
    writeFile();
89c4a3a6 sago007 2008-08-29 14:32 103
}
89c4a3a6 sago007 2008-08-29 14:32 104
89c4a3a6 sago007 2008-08-29 14:32 105
void Highscore::writeFile()
89c4a3a6 sago007 2008-08-29 14:32 106
{
89c4a3a6 sago007 2008-08-29 14:32 107
#if defined(__unix__)
89c4a3a6 sago007 2008-08-29 14:32 108
    string home = getenv("HOME");
89c4a3a6 sago007 2008-08-29 14:32 109
    string filename1 = home+"/.gamesaves/blockattack/endless.dat";
89c4a3a6 sago007 2008-08-29 14:32 110
    string filename2 = home+"/.gamesaves/blockattack/timetrial.dat";
89c4a3a6 sago007 2008-08-29 14:32 111
#elif defined(_WIN32)
89c4a3a6 sago007 2008-08-29 14:32 112
    string home = getMyDocumentsPath1();
89c4a3a6 sago007 2008-08-29 14:32 113
    string filename1, filename2;
89c4a3a6 sago007 2008-08-29 14:32 114
    if (&home!=NULL)
89c4a3a6 sago007 2008-08-29 14:32 115
    {
89c4a3a6 sago007 2008-08-29 14:32 116
        filename1 = home+"/My Games/blockattack/endless.dat";
89c4a3a6 sago007 2008-08-29 14:32 117
        filename2 = home+"/My Games/blockattack/timetrial.dat";
89c4a3a6 sago007 2008-08-29 14:32 118
    }
89c4a3a6 sago007 2008-08-29 14:32 119
    else
89c4a3a6 sago007 2008-08-29 14:32 120
    {
89c4a3a6 sago007 2008-08-29 14:32 121
        filename1 = "endless.dat";
89c4a3a6 sago007 2008-08-29 14:32 122
        filename2 = "timetrial.dat";
89c4a3a6 sago007 2008-08-29 14:32 123
    }
89c4a3a6 sago007 2008-08-29 14:32 124
#else
89c4a3a6 sago007 2008-08-29 14:32 125
    string filename1 = "endless.dat";
89c4a3a6 sago007 2008-08-29 14:32 126
    string filename2 = "timetrial.dat";
89c4a3a6 sago007 2008-08-29 14:32 127
#endif
89c4a3a6 sago007 2008-08-29 14:32 128
    if (ourType == 1) filename = (char*)malloc(filename1.length()+1);
89c4a3a6 sago007 2008-08-29 14:32 129
    if (ourType == 2) filename = (char*)malloc(filename2.length()+1);
89c4a3a6 sago007 2008-08-29 14:32 130
    if (filename == NULL){
89c4a3a6 sago007 2008-08-29 14:32 131
        cout << "Out of memory" << endl;
89c4a3a6 sago007 2008-08-29 14:32 132
        exit(1);
89c4a3a6 sago007 2008-08-29 14:32 133
    }
89c4a3a6 sago007 2008-08-29 14:32 134
    if (ourType == 1) memcpy(filename,filename1.c_str(),filename1.length()+1);
89c4a3a6 sago007 2008-08-29 14:32 135
    if (ourType == 2) memcpy(filename,filename2.c_str(),filename2.length()+1);
89c4a3a6 sago007 2008-08-29 14:32 136
89c4a3a6 sago007 2008-08-29 14:32 137
    ofstream outfile;
89c4a3a6 sago007 2008-08-29 14:32 138
    outfile.open(Highscore::filename, ios::binary |ios::trunc);
89c4a3a6 sago007 2008-08-29 14:32 139
    if (!outfile)
89c4a3a6 sago007 2008-08-29 14:32 140
    {
89c4a3a6 sago007 2008-08-29 14:32 141
        cout << "Error writing to file: " << filename << endl;
89c4a3a6 sago007 2008-08-29 14:32 142
        exit(1);
89c4a3a6 sago007 2008-08-29 14:32 143
    }
89c4a3a6 sago007 2008-08-29 14:32 144
    for (int i = 0;i<top;i++)
89c4a3a6 sago007 2008-08-29 14:32 145
    {
89c4a3a6 sago007 2008-08-29 14:32 146
        outfile.write(tabel[i].name,30*sizeof(char));
89c4a3a6 sago007 2008-08-29 14:32 147
        outfile.write(reinterpret_cast<char*>(&tabel[i].score),sizeof(int));
89c4a3a6 sago007 2008-08-29 14:32 148
    }
89c4a3a6 sago007 2008-08-29 14:32 149
    outfile.close();
89c4a3a6 sago007 2008-08-29 14:32 150
    free(filename);
89c4a3a6 sago007 2008-08-29 14:32 151
}
89c4a3a6 sago007 2008-08-29 14:32 152
89c4a3a6 sago007 2008-08-29 14:32 153
bool Highscore::isHighScore(int newScore)
89c4a3a6 sago007 2008-08-29 14:32 154
{
89c4a3a6 sago007 2008-08-29 14:32 155
    if (newScore>tabel[top-1].score)
89c4a3a6 sago007 2008-08-29 14:32 156
        return true;
89c4a3a6 sago007 2008-08-29 14:32 157
    else
89c4a3a6 sago007 2008-08-29 14:32 158
        return false;
89c4a3a6 sago007 2008-08-29 14:32 159
}
89c4a3a6 sago007 2008-08-29 14:32 160
89c4a3a6 sago007 2008-08-29 14:32 161
void Highscore::addScore(char newName[], int newScore)
89c4a3a6 sago007 2008-08-29 14:32 162
{
89c4a3a6 sago007 2008-08-29 14:32 163
    int ranking = top-1;
89c4a3a6 sago007 2008-08-29 14:32 164
    while ((tabel[ranking-1].score<newScore) && (ranking != 0))
89c4a3a6 sago007 2008-08-29 14:32 165
        ranking--;
89c4a3a6 sago007 2008-08-29 14:32 166
    for (int i=top-1; i>ranking; i--)
89c4a3a6 sago007 2008-08-29 14:32 167
    {
89c4a3a6 sago007 2008-08-29 14:32 168
        tabel[i].score = tabel[i-1].score;
89c4a3a6 sago007 2008-08-29 14:32 169
        strcpy(tabel[i].name,"                            \0");
89c4a3a6 sago007 2008-08-29 14:32 170
        strcpy(tabel[i].name,tabel[i-1].name);
89c4a3a6 sago007 2008-08-29 14:32 171
    }
89c4a3a6 sago007 2008-08-29 14:32 172
    tabel[ranking].score = newScore;
89c4a3a6 sago007 2008-08-29 14:32 173
    strcpy(tabel[ranking].name,"                            \0");
89c4a3a6 sago007 2008-08-29 14:32 174
    strcpy(tabel[ranking].name,newName);
89c4a3a6 sago007 2008-08-29 14:32 175
    Highscore::writeFile();
89c4a3a6 sago007 2008-08-29 14:32 176
}
89c4a3a6 sago007 2008-08-29 14:32 177
89c4a3a6 sago007 2008-08-29 14:32 178
int Highscore::getScoreNumber(int room)
89c4a3a6 sago007 2008-08-29 14:32 179
{
89c4a3a6 sago007 2008-08-29 14:32 180
    return tabel[room].score;
89c4a3a6 sago007 2008-08-29 14:32 181
}
89c4a3a6 sago007 2008-08-29 14:32 182
89c4a3a6 sago007 2008-08-29 14:32 183
char* Highscore::getScoreName(int room)
89c4a3a6 sago007 2008-08-29 14:32 184
{
89c4a3a6 sago007 2008-08-29 14:32 185
    return &tabel[room].name[0];
89c4a3a6 sago007 2008-08-29 14:32 186
}
1970-01-01 00:00 187