- added option to specify which game to load when loading a saved game.

- added a hotkey to save games any time during game play (F11). This saves files with a timestamp
- we now keep track of the last game the user saved and if commandline does not specify a game to load it uses the last saved game
This commit is contained in:
Mark Vejvoda 2012-03-15 15:57:21 +00:00
parent fc125bec37
commit 3eeb1ddea4
8 changed files with 76 additions and 19 deletions

View File

@ -2490,6 +2490,17 @@ void Game::keyDown(SDL_KeyboardEvent key) {
gameCamera.setMoveY(-1); gameCamera.setMoveY(-1);
} }
} }
if(isKeyPressed(configKeys.getSDLKey("SaveGame"),key) == true) {
string file = this->saveGame(GameConstants::saveGameFilePattern);
char szBuf[8096]="";
sprintf(szBuf,lang.get("GameSaved","",true).c_str(),file.c_str());
console.addLine(szBuf);
Config &config= Config::getInstance();
config.setString("LastSavedGame",file);
config.save();
}
} }
//throw runtime_error("Test Error!"); //throw runtime_error("Test Error!");
@ -2635,9 +2646,12 @@ void Game::keyPress(SDL_KeyboardEvent c) {
Stats Game::quitGame() { Stats Game::quitGame() {
if(SystemFlags::getSystemSettingType(SystemFlags::debugSystem).enabled) SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d]\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__); if(SystemFlags::getSystemSettingType(SystemFlags::debugSystem).enabled) SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d]\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__);
//if(SystemFlags::getSystemSettingType(SystemFlags::debugSystem).enabled == true) { if(SystemFlags::getSystemSettingType(SystemFlags::debugSystem).enabled == true) {
world.DumpWorldToLog(); world.DumpWorldToLog();
//} }
//printf("Check savegame\n");
//printf("Saving...\n");
this->saveGame(GameConstants::saveGameFileDefault);
//Stats stats = *(world.getStats()); //Stats stats = *(world.getStats());
Stats endStats; Stats endStats;
@ -3438,7 +3452,18 @@ void Game::toggleTeamColorMarker() {
renderExtraTeamColor=renderExtraTeamColor%4; renderExtraTeamColor=renderExtraTeamColor%4;
} }
void Game::saveGame(string name) { string Game::saveGame(string name) {
// auto name file if using saved file pattern string
if(name == GameConstants::saveGameFilePattern) {
time_t curTime = time(NULL);
struct tm *loctime = localtime (&curTime);
char szBuf2[100]="";
strftime(szBuf2,100,"%Y%m%d_%H%M%S",loctime);
char szBuf[8096]="";
sprintf(szBuf,name.c_str(),szBuf2);
name = szBuf;
}
//XmlTree xmlTree(XML_XERCES_ENGINE); //XmlTree xmlTree(XML_XERCES_ENGINE);
XmlTree xmlTree; XmlTree xmlTree;
xmlTree.init("megaglest-saved-game"); xmlTree.init("megaglest-saved-game");
@ -3595,6 +3620,8 @@ void Game::saveGame(string name) {
if(SystemFlags::VERBOSE_MODE_ENABLED) printf("Saving game to [%s]\n",saveGameFile.c_str()); if(SystemFlags::VERBOSE_MODE_ENABLED) printf("Saving game to [%s]\n",saveGameFile.c_str());
xmlTree.save(saveGameFile); xmlTree.save(saveGameFile);
return saveGameFile;
} }
void Game::loadGame(string name,Program *programPtr,bool isMasterserverMode) { void Game::loadGame(string name,Program *programPtr,bool isMasterserverMode) {

View File

@ -229,7 +229,7 @@ public:
void endGame(); void endGame();
void saveGame(string name); string saveGame(string name);
static void loadGame(string name,Program *programPtr,bool isMasterserverMode); static void loadGame(string name,Program *programPtr,bool isMasterserverMode);
private: private:

View File

@ -126,6 +126,7 @@ public:
static const char *application_name; static const char *application_name;
static const char *saveGameFileDefault; static const char *saveGameFileDefault;
static const char *saveGameFilePattern;
// VC++ Chokes on init of non integral static types // VC++ Chokes on init of non integral static types
static const float normalMultiplier; static const float normalMultiplier;

View File

@ -62,6 +62,7 @@ const char *GameConstants::path_ini_CacheLookupKey = "ini";
const char *GameConstants::path_logs_CacheLookupKey = "logs"; const char *GameConstants::path_logs_CacheLookupKey = "logs";
const char *GameConstants::saveGameFileDefault = "megaglest-saved.xml"; const char *GameConstants::saveGameFileDefault = "megaglest-saved.xml";
const char *GameConstants::saveGameFilePattern = "megaglest-saved_%s.xml";
const char *Config::glest_ini_filename = "glest.ini"; const char *Config::glest_ini_filename = "glest.ini";
const char *Config::glestuser_ini_filename = "glestuser.ini"; const char *Config::glestuser_ini_filename = "glestuser.ini";

View File

@ -3313,7 +3313,26 @@ int glestMain(int argc, char** argv) {
program->initServer(mainWindow,true,false); program->initServer(mainWindow,true,false);
} }
else if(hasCommandArgument(argc, argv,string(GAME_ARGS[GAME_ARG_AUTOSTART_LAST_SAVED_GAME])) == true) { else if(hasCommandArgument(argc, argv,string(GAME_ARGS[GAME_ARG_AUTOSTART_LAST_SAVED_GAME])) == true) {
program->initSavedGame(mainWindow,false); string fileName = "";
int foundParamIndIndex = -1;
hasCommandArgument(argc, argv,string(GAME_ARGS[GAME_ARG_AUTOSTART_LAST_SAVED_GAME]) + string("="),&foundParamIndIndex);
if(foundParamIndIndex >= 0) {
string loadfileName = argv[foundParamIndIndex];
vector<string> paramPartTokens;
Tokenize(loadfileName,paramPartTokens,"=");
if(paramPartTokens.size() >= 2 && paramPartTokens[1].length() > 0) {
fileName = paramPartTokens[1];
if(fileExists(fileName) == false) {
char szBuf[8096]="";
sprintf(szBuf,"File specified for loading a saved game cannot be found: [%s]",fileName.c_str());
printf("\n\n======================================================================================\n%s\n======================================================================================\n\n\n",szBuf);
throw runtime_error(szBuf);
}
}
}
program->initSavedGame(mainWindow,false,fileName);
} }
else if(hasCommandArgument(argc, argv,string(GAME_ARGS[GAME_ARG_PREVIEW_MAP])) == true) { else if(hasCommandArgument(argc, argv,string(GAME_ARGS[GAME_ARG_PREVIEW_MAP])) == true) {
int foundParamIndIndex = -1; int foundParamIndIndex = -1;

View File

@ -200,26 +200,33 @@ void Program::initNormal(WindowGl *window){
if(SystemFlags::getSystemSettingType(SystemFlags::debugSystem).enabled) SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d]\n",__FILE__,__FUNCTION__,__LINE__); if(SystemFlags::getSystemSettingType(SystemFlags::debugSystem).enabled) SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d]\n",__FILE__,__FUNCTION__,__LINE__);
} }
void Program::initSavedGame(WindowGl *window,bool masterserverMode) { void Program::initSavedGame(WindowGl *window,bool masterserverMode, string saveGameFile) {
MainMenu* mainMenu= NULL; MainMenu* mainMenu= NULL;
init(window); init(window);
mainMenu= new MainMenu(this); mainMenu= new MainMenu(this);
setState(mainMenu); setState(mainMenu);
string saveGameFile = GameConstants::saveGameFileDefault; if(saveGameFile == "") {
if(getGameReadWritePath(GameConstants::path_logs_CacheLookupKey) != "") { Config &config = Config::getInstance();
saveGameFile = getGameReadWritePath(GameConstants::path_logs_CacheLookupKey) + saveGameFile; saveGameFile = config.getString("LastSavedGame","");
} if(saveGameFile == "") {
else { saveGameFile = GameConstants::saveGameFileDefault;
string userData = Config::getInstance().getString("UserData_Root",""); if(getGameReadWritePath(GameConstants::path_logs_CacheLookupKey) != "") {
if(userData != "") { saveGameFile = getGameReadWritePath(GameConstants::path_logs_CacheLookupKey) + saveGameFile;
endPathWithSlash(userData); }
} else {
saveGameFile = userData + saveGameFile; string userData = Config::getInstance().getString("UserData_Root","");
if(userData != "") {
endPathWithSlash(userData);
}
saveGameFile = userData + saveGameFile;
}
}
} }
if(SystemFlags::VERBOSE_MODE_ENABLED) printf("Loading game from [%s]\n",saveGameFile.c_str()); //if(SystemFlags::VERBOSE_MODE_ENABLED) printf("Loading game from [%s]\n",saveGameFile.c_str());
printf("Loading saved game from [%s]\n",saveGameFile.c_str());
Game::loadGame(saveGameFile,this,masterserverMode); Game::loadGame(saveGameFile,this,masterserverMode);
} }

View File

@ -168,7 +168,7 @@ public:
void initNormal(WindowGl *window); void initNormal(WindowGl *window);
void initServer(WindowGl *window,bool autostart=false,bool openNetworkSlots=false,bool masterserverMode=false); void initServer(WindowGl *window,bool autostart=false,bool openNetworkSlots=false,bool masterserverMode=false);
void initServer(WindowGl *window, GameSettings *settings); void initServer(WindowGl *window, GameSettings *settings);
void initSavedGame(WindowGl *window,bool masterserverMode=false); void initSavedGame(WindowGl *window,bool masterserverMode=false,string saveGameFile="");
void initClient(WindowGl *window, const Ip &serverIp); void initClient(WindowGl *window, const Ip &serverIp);
void initScenario(WindowGl *window, string autoloadScenarioName); void initScenario(WindowGl *window, string autoloadScenarioName);

View File

@ -143,7 +143,9 @@ void printParameterHelp(const char *argv0, bool foundInvalidArgs) {
printf("\n%s\t\tAutomatically starts a game with the last game",GAME_ARGS[GAME_ARG_AUTOSTART_LASTGAME]); printf("\n%s\t\tAutomatically starts a game with the last game",GAME_ARGS[GAME_ARG_AUTOSTART_LASTGAME]);
printf("\n\t\t\t\tsettings you played."); printf("\n\t\t\t\tsettings you played.");
printf("\n%s\t\tLoads the last saved game.",GAME_ARGS[GAME_ARG_AUTOSTART_LAST_SAVED_GAME]); printf("\n%s=x\t\tLoads the last saved game.",GAME_ARGS[GAME_ARG_AUTOSTART_LAST_SAVED_GAME]);
printf("\n \t\tWhere x is an optional name of the saved game file to load.");
printf("\n \t\tIf x is not specified we load the last game that was saved.");
printf("\n%s=x\t\t\tAuto connect to host server at IP or hostname x",GAME_ARGS[GAME_ARG_CLIENT]); printf("\n%s=x\t\t\tAuto connect to host server at IP or hostname x",GAME_ARGS[GAME_ARG_CLIENT]);
printf("\n%s\t\t\tAuto create a host server.",GAME_ARGS[GAME_ARG_SERVER]); printf("\n%s\t\t\tAuto create a host server.",GAME_ARGS[GAME_ARG_SERVER]);