git repos / blockattack-game

blame: source/code/replay.cpp

normal view · raw

89c4a3a6 sago007 2008-08-29 14:32 1
/*
89c4a3a6 sago007 2008-08-29 14:32 2
replay.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
/*
89c4a3a6 sago007 2008-08-29 14:32 27
Handles replay
89c4a3a6 sago007 2008-08-29 14:32 28
*/
89c4a3a6 sago007 2008-08-29 14:32 29
89c4a3a6 sago007 2008-08-29 14:32 30
#include "replay.h"
89c4a3a6 sago007 2008-08-29 14:32 31
89c4a3a6 sago007 2008-08-29 14:32 32
Replay::Replay()
89c4a3a6 sago007 2008-08-29 14:32 33
{
89c4a3a6 sago007 2008-08-29 14:32 34
    nrOfFrames=0;
89c4a3a6 sago007 2008-08-29 14:32 35
    isLoaded = false;
89c4a3a6 sago007 2008-08-29 14:32 36
}
89c4a3a6 sago007 2008-08-29 14:32 37
89c4a3a6 sago007 2008-08-29 14:32 38
Replay::Replay(const Replay& r)
89c4a3a6 sago007 2008-08-29 14:32 39
{
89c4a3a6 sago007 2008-08-29 14:32 40
    bps = r.bps;
89c4a3a6 sago007 2008-08-29 14:32 41
    finalPack = r.finalPack;
89c4a3a6 sago007 2008-08-29 14:32 42
    nrOfFrames = r.nrOfFrames;
89c4a3a6 sago007 2008-08-29 14:32 43
    isLoaded = r.isLoaded;
89c4a3a6 sago007 2008-08-29 14:32 44
    theResult = r.theResult;
89c4a3a6 sago007 2008-08-29 14:32 45
}
89c4a3a6 sago007 2008-08-29 14:32 46
89c4a3a6 sago007 2008-08-29 14:32 47
Uint32 Replay::getNumberOfFrames()
89c4a3a6 sago007 2008-08-29 14:32 48
{
89c4a3a6 sago007 2008-08-29 14:32 49
    return nrOfFrames;
89c4a3a6 sago007 2008-08-29 14:32 50
}
89c4a3a6 sago007 2008-08-29 14:32 51
89c4a3a6 sago007 2008-08-29 14:32 52
void Replay::setFrameSecTo(Uint32 miliseconds, boardPackage bp)
89c4a3a6 sago007 2008-08-29 14:32 53
{
89c4a3a6 sago007 2008-08-29 14:32 54
    if (isLoaded)
89c4a3a6 sago007 2008-08-29 14:32 55
        return;
89c4a3a6 sago007 2008-08-29 14:32 56
    int framesToSet = (miliseconds*FRAMESPERSEC)/1000;
89c4a3a6 sago007 2008-08-29 14:32 57
    for (int i=nrOfFrames;i<framesToSet;i++)
89c4a3a6 sago007 2008-08-29 14:32 58
    {
89c4a3a6 sago007 2008-08-29 14:32 59
        bps.push_back(bp);
89c4a3a6 sago007 2008-08-29 14:32 60
    }
89c4a3a6 sago007 2008-08-29 14:32 61
    nrOfFrames=framesToSet;
89c4a3a6 sago007 2008-08-29 14:32 62
}
89c4a3a6 sago007 2008-08-29 14:32 63
89c4a3a6 sago007 2008-08-29 14:32 64
void Replay::setFinalFrame(boardPackage bp,int theStatus)
89c4a3a6 sago007 2008-08-29 14:32 65
{
89c4a3a6 sago007 2008-08-29 14:32 66
    if (isLoaded)
89c4a3a6 sago007 2008-08-29 14:32 67
        return;
89c4a3a6 sago007 2008-08-29 14:32 68
    finalPack = bp;
89c4a3a6 sago007 2008-08-29 14:32 69
    switch (theStatus)
89c4a3a6 sago007 2008-08-29 14:32 70
    {
89c4a3a6 sago007 2008-08-29 14:32 71
    case 1:
89c4a3a6 sago007 2008-08-29 14:32 72
        theResult = winner;
89c4a3a6 sago007 2008-08-29 14:32 73
        break;
89c4a3a6 sago007 2008-08-29 14:32 74
    case 2:
89c4a3a6 sago007 2008-08-29 14:32 75
        theResult = looser;
89c4a3a6 sago007 2008-08-29 14:32 76
        break;
89c4a3a6 sago007 2008-08-29 14:32 77
    case 3:
89c4a3a6 sago007 2008-08-29 14:32 78
        theResult = draw;
89c4a3a6 sago007 2008-08-29 14:32 79
        break;
89c4a3a6 sago007 2008-08-29 14:32 80
    default:
89c4a3a6 sago007 2008-08-29 14:32 81
        theResult = gameOver;
89c4a3a6 sago007 2008-08-29 14:32 82
    };
89c4a3a6 sago007 2008-08-29 14:32 83
89c4a3a6 sago007 2008-08-29 14:32 84
}
89c4a3a6 sago007 2008-08-29 14:32 85
89c4a3a6 sago007 2008-08-29 14:32 86
//Returns the frame to the current time, if time too high the final frame is returned
89c4a3a6 sago007 2008-08-29 14:32 87
boardPackage Replay::getFrameSec(Uint32 miliseconds)
89c4a3a6 sago007 2008-08-29 14:32 88
{
89c4a3a6 sago007 2008-08-29 14:32 89
    int frameToGet = (miliseconds*FRAMESPERSEC)/1000;
89c4a3a6 sago007 2008-08-29 14:32 90
    if (!(frameToGet<nrOfFrames))
89c4a3a6 sago007 2008-08-29 14:32 91
        return getFinalFrame();
89c4a3a6 sago007 2008-08-29 14:32 92
    return bps.at(frameToGet);
89c4a3a6 sago007 2008-08-29 14:32 93
}
89c4a3a6 sago007 2008-08-29 14:32 94
89c4a3a6 sago007 2008-08-29 14:32 95
bool Replay::isFinnished(Uint32 miliseconds)
89c4a3a6 sago007 2008-08-29 14:32 96
{
89c4a3a6 sago007 2008-08-29 14:32 97
    int frameToGet = (miliseconds*FRAMESPERSEC)/1000;
89c4a3a6 sago007 2008-08-29 14:32 98
    if (!(frameToGet<nrOfFrames))
89c4a3a6 sago007 2008-08-29 14:32 99
        return true;
89c4a3a6 sago007 2008-08-29 14:32 100
    return false;
89c4a3a6 sago007 2008-08-29 14:32 101
}
89c4a3a6 sago007 2008-08-29 14:32 102
89c4a3a6 sago007 2008-08-29 14:32 103
boardPackage Replay::getFinalFrame()
89c4a3a6 sago007 2008-08-29 14:32 104
{
89c4a3a6 sago007 2008-08-29 14:32 105
    return finalPack;
89c4a3a6 sago007 2008-08-29 14:32 106
}
89c4a3a6 sago007 2008-08-29 14:32 107
89c4a3a6 sago007 2008-08-29 14:32 108
int Replay::getFinalStatus()
89c4a3a6 sago007 2008-08-29 14:32 109
{
89c4a3a6 sago007 2008-08-29 14:32 110
    return theResult;
89c4a3a6 sago007 2008-08-29 14:32 111
}
89c4a3a6 sago007 2008-08-29 14:32 112
89c4a3a6 sago007 2008-08-29 14:32 113
89c4a3a6 sago007 2008-08-29 14:32 114
89c4a3a6 sago007 2008-08-29 14:32 115
bool Replay::saveReplay(string filename)
89c4a3a6 sago007 2008-08-29 14:32 116
{
e03ae476 sago007 2009-03-06 22:49 117
    //Saving as fileversion 3
e03ae476 sago007 2009-03-06 22:49 118
    cout << "Saving as version 3 save file" << endl;
89c4a3a6 sago007 2008-08-29 14:32 119
    ofstream saveFile;
89c4a3a6 sago007 2008-08-29 14:32 120
    saveFile.open(filename.c_str(),ios::binary|ios::trunc);
89c4a3a6 sago007 2008-08-29 14:32 121
    if (saveFile)
89c4a3a6 sago007 2008-08-29 14:32 122
    {
e03ae476 sago007 2009-03-06 22:49 123
        Uint32 version = 3;
89c4a3a6 sago007 2008-08-29 14:32 124
        boardPackage bp;
89c4a3a6 sago007 2008-08-29 14:32 125
        saveFile.write(reinterpret_cast<char*>(&version),sizeof(Uint32)); //Fileversion
89c4a3a6 sago007 2008-08-29 14:32 126
        Uint8 nrOfReplays = 1;
89c4a3a6 sago007 2008-08-29 14:32 127
        saveFile.write(reinterpret_cast<char*>(&nrOfReplays),sizeof(Uint8)); //nrOfReplaysIn File
89c4a3a6 sago007 2008-08-29 14:32 128
        saveFile.write(reinterpret_cast<char*>(&nrOfFrames),sizeof(Uint32)); //Nr of frames in file
89c4a3a6 sago007 2008-08-29 14:32 129
        for (int i=0; i<nrOfFrames && i<bps.size();i++)
89c4a3a6 sago007 2008-08-29 14:32 130
        { //Writing frames
89c4a3a6 sago007 2008-08-29 14:32 131
            bp = bps.at(i);
e03ae476 sago007 2009-03-06 22:49 132
            saveFile.write(reinterpret_cast<char*>(&bp),sizeof(bp));
89c4a3a6 sago007 2008-08-29 14:32 133
            
89c4a3a6 sago007 2008-08-29 14:32 134
        }
89c4a3a6 sago007 2008-08-29 14:32 135
        saveFile.write(reinterpret_cast<char*>(&finalPack),sizeof(finalPack));
89c4a3a6 sago007 2008-08-29 14:32 136
        saveFile.close();
89c4a3a6 sago007 2008-08-29 14:32 137
        return true;
89c4a3a6 sago007 2008-08-29 14:32 138
    }
89c4a3a6 sago007 2008-08-29 14:32 139
    else
89c4a3a6 sago007 2008-08-29 14:32 140
    {
89c4a3a6 sago007 2008-08-29 14:32 141
        return false;
89c4a3a6 sago007 2008-08-29 14:32 142
    }
89c4a3a6 sago007 2008-08-29 14:32 143
}
89c4a3a6 sago007 2008-08-29 14:32 144
89c4a3a6 sago007 2008-08-29 14:32 145
bool Replay::saveReplay(string filename,Replay p2)
89c4a3a6 sago007 2008-08-29 14:32 146
{
e03ae476 sago007 2009-03-06 22:49 147
    //Saving as fileversion 3
e03ae476 sago007 2009-03-06 22:49 148
    cout << "Saving as version 3 save file (2 players)" << endl;
89c4a3a6 sago007 2008-08-29 14:32 149
    ofstream saveFile;
89c4a3a6 sago007 2008-08-29 14:32 150
    saveFile.open(filename.c_str(),ios::binary|ios::trunc);
89c4a3a6 sago007 2008-08-29 14:32 151
    if (saveFile)
89c4a3a6 sago007 2008-08-29 14:32 152
    {
e03ae476 sago007 2009-03-06 22:49 153
        Uint32 version = 3;
89c4a3a6 sago007 2008-08-29 14:32 154
        boardPackage bp;
89c4a3a6 sago007 2008-08-29 14:32 155
        saveFile.write(reinterpret_cast<char*>(&version),sizeof(Uint32)); //Fileversion
89c4a3a6 sago007 2008-08-29 14:32 156
        Uint8 nrOfReplays = 2;
89c4a3a6 sago007 2008-08-29 14:32 157
        saveFile.write(reinterpret_cast<char*>(&nrOfReplays),sizeof(Uint8)); //nrOfReplaysIn File
89c4a3a6 sago007 2008-08-29 14:32 158
        saveFile.write(reinterpret_cast<char*>(&nrOfFrames),sizeof(Uint32)); //Nr of frames in file
89c4a3a6 sago007 2008-08-29 14:32 159
        for (int i=0; i<nrOfFrames && i<bps.size();i++)
89c4a3a6 sago007 2008-08-29 14:32 160
        { //Writing frames
89c4a3a6 sago007 2008-08-29 14:32 161
            bp = bps.at(i);
e03ae476 sago007 2009-03-06 22:49 162
            saveFile.write(reinterpret_cast<char*>(&bp),sizeof(bp));
89c4a3a6 sago007 2008-08-29 14:32 163
        }
89c4a3a6 sago007 2008-08-29 14:32 164
        saveFile.write(reinterpret_cast<char*>(&finalPack),sizeof(finalPack));
89c4a3a6 sago007 2008-08-29 14:32 165
        ///Player 2 starts here!!!!!!!!!!!!!!!!!!!!!!
89c4a3a6 sago007 2008-08-29 14:32 166
        saveFile.write(reinterpret_cast<char*>(&p2.nrOfFrames),sizeof(Uint32)); //Nr of frames in file
89c4a3a6 sago007 2008-08-29 14:32 167
        for (int i=0; (i<p2.nrOfFrames)&& i<p2.bps.size();i++)
89c4a3a6 sago007 2008-08-29 14:32 168
        { //Writing frames
89c4a3a6 sago007 2008-08-29 14:32 169
            bp = p2.bps.at(i);
e03ae476 sago007 2009-03-06 22:49 170
            saveFile.write(reinterpret_cast<char*>(&bp),sizeof(bp));
89c4a3a6 sago007 2008-08-29 14:32 171
        }
89c4a3a6 sago007 2008-08-29 14:32 172
        saveFile.write(reinterpret_cast<char*>(&p2.finalPack),sizeof(finalPack));
89c4a3a6 sago007 2008-08-29 14:32 173
        saveFile.close();
89c4a3a6 sago007 2008-08-29 14:32 174
        return true;
89c4a3a6 sago007 2008-08-29 14:32 175
    }
89c4a3a6 sago007 2008-08-29 14:32 176
    else
89c4a3a6 sago007 2008-08-29 14:32 177
    {
89c4a3a6 sago007 2008-08-29 14:32 178
        return false;
89c4a3a6 sago007 2008-08-29 14:32 179
    }
89c4a3a6 sago007 2008-08-29 14:32 180
}
89c4a3a6 sago007 2008-08-29 14:32 181
89c4a3a6 sago007 2008-08-29 14:32 182
bool Replay::loadReplay(string filename)
89c4a3a6 sago007 2008-08-29 14:32 183
{
89c4a3a6 sago007 2008-08-29 14:32 184
    isLoaded = true;
89c4a3a6 sago007 2008-08-29 14:32 185
    ifstream loadFile;
89c4a3a6 sago007 2008-08-29 14:32 186
    loadFile.open(filename.c_str(),ios::binary);
89c4a3a6 sago007 2008-08-29 14:32 187
    if (loadFile)
89c4a3a6 sago007 2008-08-29 14:32 188
    {
89c4a3a6 sago007 2008-08-29 14:32 189
        Uint32 version;
89c4a3a6 sago007 2008-08-29 14:32 190
        loadFile.read(reinterpret_cast<char*>(&version),sizeof(Uint32));
89c4a3a6 sago007 2008-08-29 14:32 191
        switch (version)
89c4a3a6 sago007 2008-08-29 14:32 192
        {
e03ae476 sago007 2009-03-06 22:49 193
        case 3:
e03ae476 sago007 2009-03-06 22:49 194
            cout << "Loading a version 3 save game" << endl;
89c4a3a6 sago007 2008-08-29 14:32 195
            Uint8 nrOfPlayers;
89c4a3a6 sago007 2008-08-29 14:32 196
            boardPackage bp;
89c4a3a6 sago007 2008-08-29 14:32 197
            loadFile.read(reinterpret_cast<char*>(&nrOfPlayers),sizeof(Uint8));
89c4a3a6 sago007 2008-08-29 14:32 198
            loadFile.read(reinterpret_cast<char*>(&nrOfFrames),sizeof(Uint32));
89c4a3a6 sago007 2008-08-29 14:32 199
            bps.clear();
89c4a3a6 sago007 2008-08-29 14:32 200
            for (int i=0; (i<nrOfFrames);i++)
89c4a3a6 sago007 2008-08-29 14:32 201
            {
e03ae476 sago007 2009-03-06 22:49 202
                loadFile.read(reinterpret_cast<char*>(&bp),sizeof(bp));
89c4a3a6 sago007 2008-08-29 14:32 203
                bps.push_back(bp);
89c4a3a6 sago007 2008-08-29 14:32 204
            }
89c4a3a6 sago007 2008-08-29 14:32 205
            loadFile.read(reinterpret_cast<char*>(&finalPack),sizeof(finalPack));
89c4a3a6 sago007 2008-08-29 14:32 206
            break;
89c4a3a6 sago007 2008-08-29 14:32 207
        default:
89c4a3a6 sago007 2008-08-29 14:32 208
            cout << "Unknown version" << endl;
89c4a3a6 sago007 2008-08-29 14:32 209
            return false;
89c4a3a6 sago007 2008-08-29 14:32 210
        };
89c4a3a6 sago007 2008-08-29 14:32 211
        loadFile.close();
89c4a3a6 sago007 2008-08-29 14:32 212
        cout << "Loaded 1 player" << endl;
89c4a3a6 sago007 2008-08-29 14:32 213
    }
89c4a3a6 sago007 2008-08-29 14:32 214
    else
89c4a3a6 sago007 2008-08-29 14:32 215
    {
89c4a3a6 sago007 2008-08-29 14:32 216
        cout << "File not found or couldn't open: " << filename << endl;
89c4a3a6 sago007 2008-08-29 14:32 217
        return false;
89c4a3a6 sago007 2008-08-29 14:32 218
    }
89c4a3a6 sago007 2008-08-29 14:32 219
89c4a3a6 sago007 2008-08-29 14:32 220
}
89c4a3a6 sago007 2008-08-29 14:32 221
89c4a3a6 sago007 2008-08-29 14:32 222
bool Replay::loadReplay2(string filename)
89c4a3a6 sago007 2008-08-29 14:32 223
{
89c4a3a6 sago007 2008-08-29 14:32 224
    isLoaded = true;
89c4a3a6 sago007 2008-08-29 14:32 225
    ifstream loadFile;
89c4a3a6 sago007 2008-08-29 14:32 226
    loadFile.open(filename.c_str(),ios::binary);
89c4a3a6 sago007 2008-08-29 14:32 227
    if (loadFile)
89c4a3a6 sago007 2008-08-29 14:32 228
    {
89c4a3a6 sago007 2008-08-29 14:32 229
        Uint32 version;
89c4a3a6 sago007 2008-08-29 14:32 230
        loadFile.read(reinterpret_cast<char*>(&version),sizeof(Uint32));
89c4a3a6 sago007 2008-08-29 14:32 231
        switch (version)
89c4a3a6 sago007 2008-08-29 14:32 232
        {
e03ae476 sago007 2009-03-06 22:49 233
        case 3:
89c4a3a6 sago007 2008-08-29 14:32 234
            Uint8 nrOfPlayers;
89c4a3a6 sago007 2008-08-29 14:32 235
            boardPackage bp;
89c4a3a6 sago007 2008-08-29 14:32 236
            loadFile.read(reinterpret_cast<char*>(&nrOfPlayers),sizeof(Uint8));
89c4a3a6 sago007 2008-08-29 14:32 237
            if (nrOfPlayers<2)
89c4a3a6 sago007 2008-08-29 14:32 238
            {
89c4a3a6 sago007 2008-08-29 14:32 239
                loadFile.close();
89c4a3a6 sago007 2008-08-29 14:32 240
                cout << "Only one player in replay" << endl;
89c4a3a6 sago007 2008-08-29 14:32 241
                return false;
89c4a3a6 sago007 2008-08-29 14:32 242
            }
e03ae476 sago007 2009-03-06 22:49 243
            cout << "loading player 3" << endl;
89c4a3a6 sago007 2008-08-29 14:32 244
            loadFile.read(reinterpret_cast<char*>(&nrOfFrames),sizeof(Uint32));
89c4a3a6 sago007 2008-08-29 14:32 245
            for (int i=0; (i<nrOfFrames);i++)
89c4a3a6 sago007 2008-08-29 14:32 246
            {
e03ae476 sago007 2009-03-06 22:49 247
                loadFile.read(reinterpret_cast<char*>(&bp),sizeof(bp));
e03ae476 sago007 2009-03-06 22:49 248
                //bps.push_back(bp); We have already read player 1 with another function
89c4a3a6 sago007 2008-08-29 14:32 249
            }
89c4a3a6 sago007 2008-08-29 14:32 250
            loadFile.read(reinterpret_cast<char*>(&finalPack),sizeof(finalPack));
89c4a3a6 sago007 2008-08-29 14:32 251
            loadFile.read(reinterpret_cast<char*>(&nrOfFrames),sizeof(Uint32));
89c4a3a6 sago007 2008-08-29 14:32 252
            bps.reserve(nrOfFrames);
89c4a3a6 sago007 2008-08-29 14:32 253
            for (int i=0; (i<nrOfFrames);i++)
89c4a3a6 sago007 2008-08-29 14:32 254
            {
e03ae476 sago007 2009-03-06 22:49 255
                loadFile.read(reinterpret_cast<char*>(&bp),sizeof(bp));
89c4a3a6 sago007 2008-08-29 14:32 256
                bps.push_back(bp);
89c4a3a6 sago007 2008-08-29 14:32 257
            }
89c4a3a6 sago007 2008-08-29 14:32 258
            loadFile.read(reinterpret_cast<char*>(&finalPack),sizeof(finalPack));
89c4a3a6 sago007 2008-08-29 14:32 259
            break;
89c4a3a6 sago007 2008-08-29 14:32 260
        default:
89c4a3a6 sago007 2008-08-29 14:32 261
            cout << "Unknown version: " << version << endl;
89c4a3a6 sago007 2008-08-29 14:32 262
            return false;
89c4a3a6 sago007 2008-08-29 14:32 263
        };
89c4a3a6 sago007 2008-08-29 14:32 264
        loadFile.close();
89c4a3a6 sago007 2008-08-29 14:32 265
    }
89c4a3a6 sago007 2008-08-29 14:32 266
    else
89c4a3a6 sago007 2008-08-29 14:32 267
    {
89c4a3a6 sago007 2008-08-29 14:32 268
        cout << "File not found or couldn't open: " << filename << endl;
89c4a3a6 sago007 2008-08-29 14:32 269
        return false;
89c4a3a6 sago007 2008-08-29 14:32 270
    }
89c4a3a6 sago007 2008-08-29 14:32 271
89c4a3a6 sago007 2008-08-29 14:32 272
}
1970-01-01 00:00 273