Add an END specifiers to gamestate and order files
Game will now wait until the last line of an order file matches "END" AI's MUST now finalise their order file with "END" fixes #1
This commit is contained in:
parent
fec9c8dad7
commit
f6f6d6fafd
3 changed files with 39 additions and 2 deletions
|
@ -510,6 +510,7 @@ std::string CTTRTSGame::GetStateAsString() const
|
|||
state += '\n';
|
||||
state += GAME_HEADER_DELIMITER;
|
||||
state += units;
|
||||
state += "END";
|
||||
|
||||
return state;
|
||||
}
|
||||
|
|
|
@ -43,13 +43,15 @@
|
|||
~~~~
|
||||
UNIT:{ID} tm:{TEAM} vs:{VIS} dr:{DIR(NESW)} ps:[{X},{Y}]
|
||||
... {continue for all units}
|
||||
END
|
||||
|
||||
## ORDER FILE FORMAT
|
||||
### Name
|
||||
Turn_{TURN_NUMBER}_Team_{TEAM_NUMBER}.txt
|
||||
### Contents
|
||||
ORDER:{ORDER_CHAR} id:{UNIT_ID}
|
||||
...
|
||||
... {continue for all orders}
|
||||
END
|
||||
|
||||
### Orders
|
||||
F - move unit [F]orward one space
|
||||
|
|
|
@ -4,6 +4,7 @@
|
|||
#include <thread>
|
||||
#include <sys/stat.h>
|
||||
#include <stdio.h>
|
||||
#include <stdbool.h>
|
||||
|
||||
#include "game.h"
|
||||
#include "version.h"
|
||||
|
@ -155,7 +156,40 @@ int main(int argc, char* argv[])
|
|||
|
||||
// Wait for the team order file to be created
|
||||
std::cout<<"Waiting for "<<teamOrderFileName<<std::endl;
|
||||
WaitForFile(teamOrderFileName,sk_waitTime); // Wait for the file
|
||||
bool hasOrderFile = false;
|
||||
while(!hasOrderFile)
|
||||
{
|
||||
WaitForFile(teamOrderFileName,sk_waitTime); // Wait for the file
|
||||
|
||||
// File must have END
|
||||
// Method taken from http://stackoverflow.com/questions/11876290/c-fastest-way-to-read-only-last-line-of-text-file
|
||||
std::ifstream turnFile(teamOrderFileName);
|
||||
turnFile.seekg(-1,std::ios_base::end);
|
||||
|
||||
// Loop back from the end of file
|
||||
bool keepLooping = true;
|
||||
while(keepLooping) {
|
||||
char ch;
|
||||
turnFile.get(ch); // Get current byte's data
|
||||
|
||||
if((int)turnFile.tellg() <= 1) { // If the data was at or before the 0th byte
|
||||
turnFile.seekg(0); // The first line is the last line
|
||||
keepLooping = false; // So stop there
|
||||
}
|
||||
else if(ch == '\n') { // If the data was a newline
|
||||
keepLooping = false; // Stop at the current position.
|
||||
}
|
||||
else { // If the data was neither a newline nor at the 0 byte
|
||||
turnFile.seekg(-2,std::ios_base::cur); // Move to the front of that data, then to the front of the data before it
|
||||
}
|
||||
}
|
||||
|
||||
// Grab this line
|
||||
std::string lastLine;
|
||||
std::getline(turnFile,lastLine);
|
||||
if(lastLine == "END")
|
||||
hasOrderFile = true;
|
||||
}
|
||||
|
||||
std::ifstream turnFile(teamOrderFileName);
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue