git repos / blockattack-game

blame: source/code/replay.cpp

normal view · raw

89c4a3a6 sago007 2008-08-29 14:32 1
/*
c53e6443 sago007 2012-04-17 11:04 2
===========================================================================
c53e6443 sago007 2012-04-17 11:04 3
blockattack - Block Attack - Rise of the Blocks
c53e6443 sago007 2012-04-17 11:04 4
Copyright (C) 2005-2012 Poul Sander
89c4a3a6 sago007 2008-08-29 14:32 5
c53e6443 sago007 2012-04-17 11:04 6
This program is free software: you can redistribute it and/or modify
c53e6443 sago007 2012-04-17 11:04 7
it under the terms of the GNU General Public License as published by
c53e6443 sago007 2012-04-17 11:04 8
the Free Software Foundation, either version 2 of the License, or
c53e6443 sago007 2012-04-17 11:04 9
(at your option) any later version.
89c4a3a6 sago007 2008-08-29 14:32 10
c53e6443 sago007 2012-04-17 11:04 11
This program is distributed in the hope that it will be useful,
c53e6443 sago007 2012-04-17 11:04 12
but WITHOUT ANY WARRANTY; without even the implied warranty of
c53e6443 sago007 2012-04-17 11:04 13
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
c53e6443 sago007 2012-04-17 11:04 14
GNU General Public License for more details.
89c4a3a6 sago007 2008-08-29 14:32 15
c53e6443 sago007 2012-04-17 11:04 16
You should have received a copy of the GNU General Public License
c53e6443 sago007 2012-04-17 11:04 17
along with this program.  If not, see http://www.gnu.org/licenses/
89c4a3a6 sago007 2008-08-29 14:32 18
c53e6443 sago007 2012-04-17 11:04 19
Source information and contacts persons can be found at
c53e6443 sago007 2012-04-17 11:04 20
http://blockattack.sf.net
c53e6443 sago007 2012-04-17 11:04 21
===========================================================================
89c4a3a6 sago007 2008-08-29 14:32 22
*/
89c4a3a6 sago007 2008-08-29 14:32 23
89c4a3a6 sago007 2008-08-29 14:32 24
/*
89c4a3a6 sago007 2008-08-29 14:32 25
Handles replay
89c4a3a6 sago007 2008-08-29 14:32 26
*/
89c4a3a6 sago007 2008-08-29 14:32 27
c96f480e sago007 2009-03-28 18:59 28
#include <string.h>
c96f480e sago007 2009-03-28 18:59 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
{
c53e6443 sago007 2012-04-17 11:04 34
	nrOfFrames=0;
c53e6443 sago007 2012-04-17 11:04 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
{
c53e6443 sago007 2012-04-17 11:04 40
	bps = r.bps;
c53e6443 sago007 2012-04-17 11:04 41
	finalPack = r.finalPack;
c53e6443 sago007 2012-04-17 11:04 42
	nrOfFrames = r.nrOfFrames;
c53e6443 sago007 2012-04-17 11:04 43
	isLoaded = r.isLoaded;
c53e6443 sago007 2012-04-17 11:04 44
	theResult = r.theResult;
c53e6443 sago007 2012-04-17 11:04 45
	strncpy(name,r.name,sizeof(name));
d93dc017 sago007 2012-04-22 14:28 46
	actions = r.actions;
89c4a3a6 sago007 2008-08-29 14:32 47
}
89c4a3a6 sago007 2008-08-29 14:32 48
89c4a3a6 sago007 2008-08-29 14:32 49
Uint32 Replay::getNumberOfFrames()
89c4a3a6 sago007 2008-08-29 14:32 50
{
c53e6443 sago007 2012-04-17 11:04 51
	return nrOfFrames;
89c4a3a6 sago007 2008-08-29 14:32 52
}
89c4a3a6 sago007 2008-08-29 14:32 53
89c4a3a6 sago007 2008-08-29 14:32 54
void Replay::setFrameSecTo(Uint32 miliseconds, boardPackage bp)
89c4a3a6 sago007 2008-08-29 14:32 55
{
c53e6443 sago007 2012-04-17 11:04 56
	if (isLoaded)
c53e6443 sago007 2012-04-17 11:04 57
		return;
c53e6443 sago007 2012-04-17 11:04 58
	int framesToSet = (miliseconds*FRAMESPERSEC)/1000;
c53e6443 sago007 2012-04-17 11:04 59
	for (int i=nrOfFrames; i<framesToSet; i++)
c53e6443 sago007 2012-04-17 11:04 60
	{
c53e6443 sago007 2012-04-17 11:04 61
		bps.push_back(bp);
c53e6443 sago007 2012-04-17 11:04 62
	}
c53e6443 sago007 2012-04-17 11:04 63
	nrOfFrames=framesToSet;
89c4a3a6 sago007 2008-08-29 14:32 64
}
89c4a3a6 sago007 2008-08-29 14:32 65
89c4a3a6 sago007 2008-08-29 14:32 66
void Replay::setFinalFrame(boardPackage bp,int theStatus)
89c4a3a6 sago007 2008-08-29 14:32 67
{
c53e6443 sago007 2012-04-17 11:04 68
	if (isLoaded)
c53e6443 sago007 2012-04-17 11:04 69
		return;
c53e6443 sago007 2012-04-17 11:04 70
	finalPack = bp;
c53e6443 sago007 2012-04-17 11:04 71
	switch (theStatus)
c53e6443 sago007 2012-04-17 11:04 72
	{
c53e6443 sago007 2012-04-17 11:04 73
	case 1:
c53e6443 sago007 2012-04-17 11:04 74
		theResult = winner;
c53e6443 sago007 2012-04-17 11:04 75
		break;
c53e6443 sago007 2012-04-17 11:04 76
	case 2:
c53e6443 sago007 2012-04-17 11:04 77
		theResult = looser;
c53e6443 sago007 2012-04-17 11:04 78
		break;
c53e6443 sago007 2012-04-17 11:04 79
	case 3:
c53e6443 sago007 2012-04-17 11:04 80
		theResult = draw;
c53e6443 sago007 2012-04-17 11:04 81
		break;
c53e6443 sago007 2012-04-17 11:04 82
	default:
c53e6443 sago007 2012-04-17 11:04 83
		theResult = gameOver;
c53e6443 sago007 2012-04-17 11:04 84
	};
89c4a3a6 sago007 2008-08-29 14:32 85
89c4a3a6 sago007 2008-08-29 14:32 86
}
89c4a3a6 sago007 2008-08-29 14:32 87
89c4a3a6 sago007 2008-08-29 14:32 88
//Returns the frame to the current time, if time too high the final frame is returned
89c4a3a6 sago007 2008-08-29 14:32 89
boardPackage Replay::getFrameSec(Uint32 miliseconds)
89c4a3a6 sago007 2008-08-29 14:32 90
{
c53e6443 sago007 2012-04-17 11:04 91
	int frameToGet = (miliseconds*FRAMESPERSEC)/1000;
c53e6443 sago007 2012-04-17 11:04 92
	if (!(frameToGet<nrOfFrames))
c53e6443 sago007 2012-04-17 11:04 93
		return getFinalFrame();
c53e6443 sago007 2012-04-17 11:04 94
	return bps.at(frameToGet);
89c4a3a6 sago007 2008-08-29 14:32 95
}
89c4a3a6 sago007 2008-08-29 14:32 96
89c4a3a6 sago007 2008-08-29 14:32 97
bool Replay::isFinnished(Uint32 miliseconds)
89c4a3a6 sago007 2008-08-29 14:32 98
{
c53e6443 sago007 2012-04-17 11:04 99
	int frameToGet = (miliseconds*FRAMESPERSEC)/1000;
c53e6443 sago007 2012-04-17 11:04 100
	if (!(frameToGet<nrOfFrames))
c53e6443 sago007 2012-04-17 11:04 101
		return true;
c53e6443 sago007 2012-04-17 11:04 102
	return false;
89c4a3a6 sago007 2008-08-29 14:32 103
}
89c4a3a6 sago007 2008-08-29 14:32 104
89c4a3a6 sago007 2008-08-29 14:32 105
boardPackage Replay::getFinalFrame()
89c4a3a6 sago007 2008-08-29 14:32 106
{
c53e6443 sago007 2012-04-17 11:04 107
	return finalPack;
89c4a3a6 sago007 2008-08-29 14:32 108
}
89c4a3a6 sago007 2008-08-29 14:32 109
89c4a3a6 sago007 2008-08-29 14:32 110
int Replay::getFinalStatus()
89c4a3a6 sago007 2008-08-29 14:32 111
{
c53e6443 sago007 2012-04-17 11:04 112
	return theResult;
89c4a3a6 sago007 2008-08-29 14:32 113
}
89c4a3a6 sago007 2008-08-29 14:32 114
89c4a3a6 sago007 2008-08-29 14:32 115
89c4a3a6 sago007 2008-08-29 14:32 116
89c4a3a6 sago007 2008-08-29 14:32 117
bool Replay::saveReplay(string filename)
89c4a3a6 sago007 2008-08-29 14:32 118
{
d93dc017 sago007 2012-04-22 14:28 119
	//Saving as fileversion 4
d93dc017 sago007 2012-04-22 14:28 120
	cout << "Saving as version 4 save file" << endl;
c53e6443 sago007 2012-04-17 11:04 121
	ofstream saveFile;
c53e6443 sago007 2012-04-17 11:04 122
	saveFile.open(filename.c_str(),ios::binary|ios::trunc);
c53e6443 sago007 2012-04-17 11:04 123
	if (saveFile)
c53e6443 sago007 2012-04-17 11:04 124
	{
d93dc017 sago007 2012-04-22 14:28 125
		saveFile << "0 PLAYER 1\n";
d93dc017 sago007 2012-04-22 14:28 126
		saveFile << "0 NAME " << name << "\n";
d93dc017 sago007 2012-04-22 14:28 127
		for(int i = 0;i < actions.size(); ++i) {
d93dc017 sago007 2012-04-22 14:28 128
			saveFile << actions.at(i).time << " " << actions.at(i).action << "\n";
c53e6443 sago007 2012-04-17 11:04 129
		}
c53e6443 sago007 2012-04-17 11:04 130
		saveFile.close();
c53e6443 sago007 2012-04-17 11:04 131
		return true;
c53e6443 sago007 2012-04-17 11:04 132
	}
c53e6443 sago007 2012-04-17 11:04 133
	else
c53e6443 sago007 2012-04-17 11:04 134
	{
c53e6443 sago007 2012-04-17 11:04 135
		return false;
c53e6443 sago007 2012-04-17 11:04 136
	}
89c4a3a6 sago007 2008-08-29 14:32 137
}
89c4a3a6 sago007 2008-08-29 14:32 138
89c4a3a6 sago007 2008-08-29 14:32 139
bool Replay::saveReplay(string filename,Replay p2)
89c4a3a6 sago007 2008-08-29 14:32 140
{
c53e6443 sago007 2012-04-17 11:04 141
	//Saving as fileversion 3
c53e6443 sago007 2012-04-17 11:04 142
	cout << "Saving as version 3 save file (2 players)" << endl;
c53e6443 sago007 2012-04-17 11:04 143
	ofstream saveFile;
c53e6443 sago007 2012-04-17 11:04 144
	saveFile.open(filename.c_str(),ios::binary|ios::trunc);
c53e6443 sago007 2012-04-17 11:04 145
	if (saveFile)
c53e6443 sago007 2012-04-17 11:04 146
	{
d93dc017 sago007 2012-04-22 14:28 147
		Uint32 version = 4;
c53e6443 sago007 2012-04-17 11:04 148
		boardPackage bp;
c53e6443 sago007 2012-04-17 11:04 149
		saveFile.write(reinterpret_cast<char*>(&version),sizeof(Uint32)); //Fileversion
c53e6443 sago007 2012-04-17 11:04 150
		Uint8 nrOfReplays = 2;
c53e6443 sago007 2012-04-17 11:04 151
		saveFile.write(reinterpret_cast<char*>(&nrOfReplays),sizeof(Uint8)); //nrOfReplaysIn File
c53e6443 sago007 2012-04-17 11:04 152
		saveFile.write(reinterpret_cast<char*>(&nrOfFrames),sizeof(Uint32)); //Nr of frames in file
c53e6443 sago007 2012-04-17 11:04 153
		for (int i=0; i<nrOfFrames && i<bps.size(); i++)
c53e6443 sago007 2012-04-17 11:04 154
		{
c53e6443 sago007 2012-04-17 11:04 155
			//Writing frames
c53e6443 sago007 2012-04-17 11:04 156
			bp = bps.at(i);
c53e6443 sago007 2012-04-17 11:04 157
			saveFile.write(reinterpret_cast<char*>(&bp),sizeof(bp));
c53e6443 sago007 2012-04-17 11:04 158
		}
c53e6443 sago007 2012-04-17 11:04 159
		saveFile.write(reinterpret_cast<char*>(&finalPack),sizeof(finalPack));
c53e6443 sago007 2012-04-17 11:04 160
		saveFile.write(reinterpret_cast<char*>(&theResult),sizeof(theResult));
c53e6443 sago007 2012-04-17 11:04 161
		saveFile.write(reinterpret_cast<char*>(&name),sizeof(name));
c53e6443 sago007 2012-04-17 11:04 162
		///Player 2 starts here!!!!!!!!!!!!!!!!!!!!!!
c53e6443 sago007 2012-04-17 11:04 163
		saveFile.write(reinterpret_cast<char*>(&p2.nrOfFrames),sizeof(Uint32)); //Nr of frames in file
c53e6443 sago007 2012-04-17 11:04 164
		for (int i=0; (i<p2.nrOfFrames)&& i<p2.bps.size(); i++)
c53e6443 sago007 2012-04-17 11:04 165
		{
c53e6443 sago007 2012-04-17 11:04 166
			//Writing frames
c53e6443 sago007 2012-04-17 11:04 167
			bp = p2.bps.at(i);
c53e6443 sago007 2012-04-17 11:04 168
			saveFile.write(reinterpret_cast<char*>(&bp),sizeof(bp));
c53e6443 sago007 2012-04-17 11:04 169
		}
c53e6443 sago007 2012-04-17 11:04 170
		saveFile.write(reinterpret_cast<char*>(&p2.finalPack),sizeof(finalPack));
c53e6443 sago007 2012-04-17 11:04 171
		saveFile.write(reinterpret_cast<char*>(&p2.theResult),sizeof(theResult));
c53e6443 sago007 2012-04-17 11:04 172
		saveFile.write(reinterpret_cast<char*>(&p2.name),sizeof(name));
c53e6443 sago007 2012-04-17 11:04 173
		saveFile.close();
c53e6443 sago007 2012-04-17 11:04 174
		return true;
c53e6443 sago007 2012-04-17 11:04 175
	}
c53e6443 sago007 2012-04-17 11:04 176
	else
c53e6443 sago007 2012-04-17 11:04 177
	{
c53e6443 sago007 2012-04-17 11:04 178
		return false;
c53e6443 sago007 2012-04-17 11:04 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
{
c53e6443 sago007 2012-04-17 11:04 184
	isLoaded = true;
c53e6443 sago007 2012-04-17 11:04 185
	ifstream loadFile;
c53e6443 sago007 2012-04-17 11:04 186
	loadFile.open(filename.c_str(),ios::binary);
c53e6443 sago007 2012-04-17 11:04 187
	if (loadFile)
c53e6443 sago007 2012-04-17 11:04 188
	{
c53e6443 sago007 2012-04-17 11:04 189
		Uint32 version;
c53e6443 sago007 2012-04-17 11:04 190
		loadFile.read(reinterpret_cast<char*>(&version),sizeof(Uint32));
c53e6443 sago007 2012-04-17 11:04 191
		switch (version)
c53e6443 sago007 2012-04-17 11:04 192
		{
c53e6443 sago007 2012-04-17 11:04 193
		case 3:
c53e6443 sago007 2012-04-17 11:04 194
			cout << "Loading a version 3 save game" << endl;
c53e6443 sago007 2012-04-17 11:04 195
			Uint8 nrOfPlayers;
c53e6443 sago007 2012-04-17 11:04 196
			boardPackage bp;
c53e6443 sago007 2012-04-17 11:04 197
			loadFile.read(reinterpret_cast<char*>(&nrOfPlayers),sizeof(Uint8));
c53e6443 sago007 2012-04-17 11:04 198
			loadFile.read(reinterpret_cast<char*>(&nrOfFrames),sizeof(Uint32));
c53e6443 sago007 2012-04-17 11:04 199
			bps.clear();
c53e6443 sago007 2012-04-17 11:04 200
			for (int i=0; (i<nrOfFrames); i++)
c53e6443 sago007 2012-04-17 11:04 201
			{
c53e6443 sago007 2012-04-17 11:04 202
				loadFile.read(reinterpret_cast<char*>(&bp),sizeof(bp));
c53e6443 sago007 2012-04-17 11:04 203
				bps.push_back(bp);
c53e6443 sago007 2012-04-17 11:04 204
			}
c53e6443 sago007 2012-04-17 11:04 205
			loadFile.read(reinterpret_cast<char*>(&finalPack),sizeof(finalPack));
c53e6443 sago007 2012-04-17 11:04 206
			loadFile.read(reinterpret_cast<char*>(&theResult),sizeof(theResult));
c53e6443 sago007 2012-04-17 11:04 207
			loadFile.read(reinterpret_cast<char*>(&name),sizeof(name));
c53e6443 sago007 2012-04-17 11:04 208
			break;
c53e6443 sago007 2012-04-17 11:04 209
		default:
c53e6443 sago007 2012-04-17 11:04 210
			cout << "Unknown version" << endl;
c53e6443 sago007 2012-04-17 11:04 211
			return false;
c53e6443 sago007 2012-04-17 11:04 212
		};
c53e6443 sago007 2012-04-17 11:04 213
		loadFile.close();
c53e6443 sago007 2012-04-17 11:04 214
		cout << "Loaded 1 player" << endl;
c53e6443 sago007 2012-04-17 11:04 215
	}
c53e6443 sago007 2012-04-17 11:04 216
	else
c53e6443 sago007 2012-04-17 11:04 217
	{
c53e6443 sago007 2012-04-17 11:04 218
		cout << "File not found or couldn't open: " << filename << endl;
c53e6443 sago007 2012-04-17 11:04 219
		return false;
c53e6443 sago007 2012-04-17 11:04 220
	}
89c4a3a6 sago007 2008-08-29 14:32 221
89c4a3a6 sago007 2008-08-29 14:32 222
}
89c4a3a6 sago007 2008-08-29 14:32 223
89c4a3a6 sago007 2008-08-29 14:32 224
bool Replay::loadReplay2(string filename)
89c4a3a6 sago007 2008-08-29 14:32 225
{
c53e6443 sago007 2012-04-17 11:04 226
	isLoaded = true;
c53e6443 sago007 2012-04-17 11:04 227
	ifstream loadFile;
c53e6443 sago007 2012-04-17 11:04 228
	loadFile.open(filename.c_str(),ios::binary);
c53e6443 sago007 2012-04-17 11:04 229
	if (loadFile)
c53e6443 sago007 2012-04-17 11:04 230
	{
c53e6443 sago007 2012-04-17 11:04 231
		Uint32 version;
c53e6443 sago007 2012-04-17 11:04 232
		loadFile.read(reinterpret_cast<char*>(&version),sizeof(Uint32));
c53e6443 sago007 2012-04-17 11:04 233
		switch (version)
c53e6443 sago007 2012-04-17 11:04 234
		{
c53e6443 sago007 2012-04-17 11:04 235
		case 3:
c53e6443 sago007 2012-04-17 11:04 236
			Uint8 nrOfPlayers;
c53e6443 sago007 2012-04-17 11:04 237
			boardPackage bp;
c53e6443 sago007 2012-04-17 11:04 238
			loadFile.read(reinterpret_cast<char*>(&nrOfPlayers),sizeof(Uint8));
c53e6443 sago007 2012-04-17 11:04 239
			if (nrOfPlayers<2)
c53e6443 sago007 2012-04-17 11:04 240
			{
c53e6443 sago007 2012-04-17 11:04 241
				loadFile.close();
c53e6443 sago007 2012-04-17 11:04 242
				cout << "Only one player in replay" << endl;
c53e6443 sago007 2012-04-17 11:04 243
				return false;
c53e6443 sago007 2012-04-17 11:04 244
			}
c53e6443 sago007 2012-04-17 11:04 245
			cout << "loading player 2" << endl;
c53e6443 sago007 2012-04-17 11:04 246
			loadFile.read(reinterpret_cast<char*>(&nrOfFrames),sizeof(Uint32));
c53e6443 sago007 2012-04-17 11:04 247
			for (int i=0; (i<nrOfFrames); i++)
c53e6443 sago007 2012-04-17 11:04 248
			{
c53e6443 sago007 2012-04-17 11:04 249
				loadFile.read(reinterpret_cast<char*>(&bp),sizeof(bp));
c53e6443 sago007 2012-04-17 11:04 250
				//bps.push_back(bp); We have already read player 1 with another function
c53e6443 sago007 2012-04-17 11:04 251
			}
c53e6443 sago007 2012-04-17 11:04 252
			loadFile.read(reinterpret_cast<char*>(&finalPack),sizeof(finalPack));
c53e6443 sago007 2012-04-17 11:04 253
			loadFile.read(reinterpret_cast<char*>(&theResult),sizeof(theResult));
c53e6443 sago007 2012-04-17 11:04 254
			loadFile.read(reinterpret_cast<char*>(&name),sizeof(name));
c53e6443 sago007 2012-04-17 11:04 255
			loadFile.read(reinterpret_cast<char*>(&nrOfFrames),sizeof(Uint32));
c53e6443 sago007 2012-04-17 11:04 256
			bps.reserve(nrOfFrames);
c53e6443 sago007 2012-04-17 11:04 257
			for (int i=0; (i<nrOfFrames); i++)
c53e6443 sago007 2012-04-17 11:04 258
			{
c53e6443 sago007 2012-04-17 11:04 259
				loadFile.read(reinterpret_cast<char*>(&bp),sizeof(bp));
c53e6443 sago007 2012-04-17 11:04 260
				bps.push_back(bp);
c53e6443 sago007 2012-04-17 11:04 261
			}
c53e6443 sago007 2012-04-17 11:04 262
			loadFile.read(reinterpret_cast<char*>(&finalPack),sizeof(finalPack));
c53e6443 sago007 2012-04-17 11:04 263
			loadFile.read(reinterpret_cast<char*>(&theResult),sizeof(theResult));
c53e6443 sago007 2012-04-17 11:04 264
			loadFile.read(reinterpret_cast<char*>(&name),sizeof(name));
c53e6443 sago007 2012-04-17 11:04 265
			break;
c53e6443 sago007 2012-04-17 11:04 266
		default:
c53e6443 sago007 2012-04-17 11:04 267
			cout << "Unknown version: " << version << endl;
c53e6443 sago007 2012-04-17 11:04 268
			return false;
c53e6443 sago007 2012-04-17 11:04 269
		};
c53e6443 sago007 2012-04-17 11:04 270
		loadFile.close();
c53e6443 sago007 2012-04-17 11:04 271
	}
c53e6443 sago007 2012-04-17 11:04 272
	else
c53e6443 sago007 2012-04-17 11:04 273
	{
c53e6443 sago007 2012-04-17 11:04 274
		cout << "File not found or couldn't open: " << filename << endl;
c53e6443 sago007 2012-04-17 11:04 275
		return false;
c53e6443 sago007 2012-04-17 11:04 276
	}
89c4a3a6 sago007 2008-08-29 14:32 277
89c4a3a6 sago007 2008-08-29 14:32 278
}
d12916ab sago007 2012-04-19 23:30 279
d12916ab sago007 2012-04-19 23:30 280
void Replay::addAction(int tick, string action) {
d12916ab sago007 2012-04-19 23:30 281
	cout << tick << " " << action << endl;
d12916ab sago007 2012-04-19 23:30 282
	Action a;
d12916ab sago007 2012-04-19 23:30 283
	a.time = tick;
d12916ab sago007 2012-04-19 23:30 284
	a.action = action;
d12916ab sago007 2012-04-19 23:30 285
	actions.push_back(a);
d12916ab sago007 2012-04-19 23:30 286
}
1970-01-01 00:00 287