Piece::Colour SetupGame(int argc, char ** argv);
void DestroyGame();
-void PrintResults(const MovementResult & result, string & buffer);
+
+
+char * video = NULL;
int main(int argc, char ** argv)
{
Game::theGame->PrintEndMessage(result);
string buffer = "";
- PrintResults(result, buffer);
+ Game::PrintResults(result, buffer);
//Message the AI's the quit message
Game::theGame->red->Message("QUIT " + buffer);
Game::theGame->blue->Message("QUIT " + buffer);
+ if (video != NULL)
+ {
+ string command = "mv "; command += video; command += " tmp; cd tmp; ffmpeg -r 10 -b 1024k -i %d.bmp "; command += video;
+ command += ";mv "; command += video; command += " ../; cd ../; rm -rf tmp;";
+ system(command.c_str());
+ }
+
//Log the message
if (Game::theGame->GetLogFile() != stdout)
Game::theGame->logMessage("%s\n", buffer.c_str());
fprintf(stdout, "%s\n", buffer.c_str());
+
+
exit(EXIT_SUCCESS);
return 0;
}
Piece::Colour SetupGame(int argc, char ** argv)
{
- char * red = NULL; char * blue = NULL; double timeout = 0.00001; bool graphics = false; bool allowIllegal = false; FILE * log = NULL;
- Piece::Colour reveal = Piece::BOTH; char * inputFile = NULL; int maxTurns = 5000; bool printBoard = false;
+ char * red = NULL; char * blue = NULL; double stallTime = 0.0; bool graphics = false; bool allowIllegal = false; FILE * log = NULL;
+ Piece::Colour reveal = Piece::BOTH; char * inputFile = NULL; int maxTurns = 5000; bool printBoard = false; double timeoutTime = 2.0;
+ char * imageOutput = (char*)"";
+
+
for (int ii=1; ii < argc; ++ii)
{
if (argv[ii][0] == '-')
case 't':
if (argc - ii <= 1)
{
- fprintf(stderr, "ARGUMENT_ERROR - Expected timeout value after -t switch!\n");
+ fprintf(stderr, "ARGUMENT_ERROR - Expected stall time value after -t switch!\n");
+ exit(EXIT_FAILURE);
+ }
+ if (strcmp(argv[ii+1], "inf") == 0)
+ stallTime = -1;
+ else
+ stallTime = atof(argv[ii+1]);
+ ++ii;
+ break;
+
+ case 'T':
+ if (argc - ii <= 1)
+ {
+ fprintf(stderr, "ARGUMENT_ERROR - Expected timeout value after -T switch!\n");
exit(EXIT_FAILURE);
}
if (strcmp(argv[ii+1], "inf") == 0)
- timeout = -1;
+ timeoutTime = -1;
else
- timeout = atof(argv[ii+1]);
+ timeoutTime = atof(argv[ii+1]);
++ii;
break;
+
case 'g':
#ifdef BUILD_GRAPHICS
- graphics = !graphics;
+ graphics = true;
#else
fprintf(stderr, "ERROR: -g switch supplied, but the program was not built with graphics.\n Please do not use the -g switch.");
exit(EXIT_FAILURE);
inputFile = argv[ii+1];
++ii;
break;
+ case 'v':
+ #ifdef BUILD_GRAPHICS
+ video = argv[ii+1];
+ #endif //BUILD_GRAPHICS
+ case 'I':
+ {
+ #ifdef BUILD_GRAPHICS
+ graphics = true;
+ if (argc - ii <= 1)
+ {
+ fprintf(stderr, "ARGUMENT_ERROR - Expected filename after -I switch!\n");
+ exit(EXIT_FAILURE);
+ }
+ imageOutput = argv[ii+1];
+ string m("mkdir -p "); m += imageOutput;
+ system(m.c_str());
+ ++ii;
+ #else
+ fprintf(stderr, "ERROR: -%c switch supplied, but the program was not built with graphics.");
+ exit(EXIT_FAILURE);
+ #endif //BUILD_GRAPHICS
+
+ break;
+
+ }
+
+
+
case 'h':
system("clear");
system("less manual.txt");
}
}
-
+ if (graphics && stallTime == 0.0)
+ stallTime = 0.00001; //Hack so that SDL events (ie SDL_QUIT) will have time to be captured when graphics are enabled
if (inputFile == NULL)
{
- if (red == NULL || blue == NULL) //Not enough arguments
+ if (red == NULL || blue == NULL) //Not enough players
{
fprintf(stderr, "ARGUMENT_ERROR - Did not recieve enough players (did you mean to use the -f switch?)\n");
exit(EXIT_FAILURE);
}
- Game::theGame = new Game(red,blue, graphics, timeout, allowIllegal,log, reveal,maxTurns, printBoard);
+
+ Game::theGame = new Game(red,blue, graphics, stallTime, allowIllegal,log, reveal,maxTurns, printBoard, timeoutTime, imageOutput);
}
else
{
- Game::theGame = new Game(inputFile, graphics, timeout, allowIllegal,log, reveal,maxTurns, printBoard);
+ Game::theGame = new Game(inputFile, graphics, stallTime, allowIllegal,log, reveal,maxTurns, printBoard, timeoutTime, imageOutput);
}
if (Game::theGame == NULL)
}
-void PrintResults(const MovementResult & result, string & buffer)
-{
- stringstream s("");
- switch (Game::theGame->Turn())
- {
- case Piece::RED:
- s << Game::theGame->red->name << " RED ";
- break;
- case Piece::BLUE:
- s << Game::theGame->blue->name << " BLUE ";
- break;
- case Piece::BOTH:
- s << "neither BOTH ";
- break;
- case Piece::NONE:
- s << "neither NONE ";
- break;
- }
-
- if (!Board::LegalResult(result) && result != MovementResult::BAD_SETUP)
- s << "ILLEGAL ";
- else if (!Board::HaltResult(result))
- s << "INTERNAL_ERROR ";
- else
- {
- switch (result.type)
- {
- case MovementResult::VICTORY:
- s << "VICTORY ";
- break;
- case MovementResult::SURRENDER:
- s << "SURRENDER ";
- break;
- case MovementResult::DRAW:
- s << "DRAW ";
- break;
- case MovementResult::DRAW_DEFAULT:
- s << "DRAW_DEFAULT ";
- break;
- case MovementResult::BAD_SETUP:
- s << "BAD_SETUP ";
- break;
- default:
- s << "INTERNAL_ERROR ";
- break;
- }
- }
-
- s << Game::theGame->TurnCount() << " " << Game::theGame->theBoard.TotalPieceValue(Piece::RED) << " " << Game::theGame->theBoard.TotalPieceValue(Piece::BLUE);
-
- buffer = s.str();
-
-
-}
void DestroyGame()
{