diff --git a/source/glest_game/game/game.cpp b/source/glest_game/game/game.cpp index a5d6ddedd..b3b513c34 100644 --- a/source/glest_game/game/game.cpp +++ b/source/glest_game/game/game.cpp @@ -915,7 +915,21 @@ void Game::init(bool initForPreviewOnly) { SDL_PumpEvents(); } - world.init(this, gameSettings.getDefaultUnits()); + try { + world.init(this, gameSettings.getDefaultUnits()); + } + catch(const exception &ex) { + char szBuf[4096]=""; + sprintf(szBuf,"In [%s::%s Line: %d] Error [%s]\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,ex.what()); + + SystemFlags::OutputDebug(SystemFlags::debugError,szBuf); + if(SystemFlags::getSystemSettingType(SystemFlags::debugSystem).enabled) SystemFlags::OutputDebug(SystemFlags::debugSystem,szBuf); + + if(errorMessageBox.getEnabled() == false) { + ErrorDisplayMessage(ex.what(),true); + } + } + if(loadGameNode != NULL) { //world.getMapPtr()->loadGame(loadGameNode,&world); } @@ -1509,7 +1523,21 @@ void Game::update() { this->load(lgt_FactionPreview | lgt_TileSet | lgt_Map | lgt_Scenario); - world.init(this, gameSettings.getDefaultUnits(),false); + try { + world.init(this, gameSettings.getDefaultUnits(),false); + } + catch(const exception &ex) { + char szBuf[4096]=""; + sprintf(szBuf,"In [%s::%s Line: %d] Error [%s]\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,ex.what()); + + SystemFlags::OutputDebug(SystemFlags::debugError,szBuf); + if(SystemFlags::getSystemSettingType(SystemFlags::debugSystem).enabled) SystemFlags::OutputDebug(SystemFlags::debugSystem,szBuf); + + if(errorMessageBox.getEnabled() == false) { + ErrorDisplayMessage(ex.what(),true); + } + } + world.initUnitsForScenario(); Map *map= world.getMap(); gameCamera.init(map->getW(), map->getH()); diff --git a/source/glest_game/main/main.cpp b/source/glest_game/main/main.cpp index a367402a1..e3df8de53 100644 --- a/source/glest_game/main/main.cpp +++ b/source/glest_game/main/main.cpp @@ -1055,7 +1055,7 @@ int setupGameItemPaths(int argc, char** argv, Config *config) { printf("\nInvalid path specified on commandline [%s] value [%s]\n\n",argv[foundParamIndIndex],(paramPartTokens.size() >= 2 ? paramPartTokens[1].c_str() : NULL)); printParameterHelp(argv[0],false); - return -1; + return 1; } } else if(config != NULL) { @@ -1089,7 +1089,7 @@ int setupGameItemPaths(int argc, char** argv, Config *config) { printf("\nInvalid path specified on commandline [%s] value [%s]\n\n",argv[foundParamIndIndex],(paramPartTokens.size() >= 2 ? paramPartTokens[1].c_str() : NULL)); printParameterHelp(argv[0],false); - return -1; + return 1; } } @@ -1113,7 +1113,7 @@ int setupGameItemPaths(int argc, char** argv, Config *config) { printf("\nInvalid path specified on commandline [%s] value [%s]\n\n",argv[foundParamIndIndex],(paramPartTokens.size() >= 2 ? paramPartTokens[1].c_str() : NULL)); printParameterHelp(argv[0],false); - return -1; + return 1; } } else if(config != NULL) { @@ -3020,7 +3020,7 @@ int glestMain(int argc, char** argv) { foundInvalidArgs == true) { printParameterHelp(argv[0],foundInvalidArgs); - return -1; + return 2; } //off_t fileSize = getFileSize(argv[0]); @@ -3142,7 +3142,7 @@ int glestMain(int argc, char** argv) { hasCommandArgument(argc, argv,GAME_ARGS[GAME_ARG_LIST_SCENARIOS]) == false && hasCommandArgument(argc, argv,GAME_ARGS[GAME_ARG_LIST_TILESETS]) == false && hasCommandArgument(argc, argv,GAME_ARGS[GAME_ARG_LIST_TUTORIALS]) == false) { - return -1; + return 0; } if(hasCommandArgument(argc, argv,string(GAME_ARGS[GAME_ARG_MOD])) == true) { @@ -3168,7 +3168,7 @@ int glestMain(int argc, char** argv) { else { printf("\nInvalid mod pathname specified on commandline [%s] mod [%s]\n\n",argv[foundParamIndIndex],(paramPartTokens.size() >= 2 ? paramPartTokens[1].c_str() : NULL)); printParameterHelp(argv[0],foundInvalidArgs); - return -1; + return 1; } } @@ -3277,13 +3277,13 @@ int glestMain(int argc, char** argv) { else { printf("\nInvalid ports specified on commandline [%s] value [%s]\n\n",argv[foundParamIndIndex],(paramPartTokens.size() >= 2 ? paramPartTokens[1].c_str() : NULL)); //printParameterHelp(argv[0],false); - return -1; + return 1; } } else { printf("\nInvalid missing ports specified on commandline [%s] value [%s]\n\n",argv[foundParamIndIndex],(paramPartTokens.size() >= 2 ? paramPartTokens[1].c_str() : NULL)); //printParameterHelp(argv[0],false); - return -1; + return 1; } } @@ -3364,13 +3364,13 @@ int glestMain(int argc, char** argv) { else { printf("\nInvalid missing resolution settings specified on commandline [%s] value [%s]\n\n",argv[foundParamIndIndex],(paramPartTokens.size() >= 2 ? paramPartTokens[1].c_str() : NULL)); //printParameterHelp(argv[0],false); - return -1; + return 1; } } else { printf("\nInvalid missing resolution setting specified on commandline [%s] value [%s]\n\n",argv[foundParamIndIndex],(paramPartTokens.size() >= 2 ? paramPartTokens[1].c_str() : NULL)); //printParameterHelp(argv[0],false); - return -1; + return 1; } } @@ -3393,7 +3393,7 @@ int glestMain(int argc, char** argv) { else { printf("\nInvalid missing colorbits settings specified on commandline [%s] value [%s]\n\n",argv[foundParamIndIndex],(paramPartTokens.size() >= 2 ? paramPartTokens[1].c_str() : NULL)); //printParameterHelp(argv[0],false); - return -1; + return 1; } } @@ -3416,7 +3416,7 @@ int glestMain(int argc, char** argv) { else { printf("\nInvalid missing depthbits setting specified on commandline [%s] value [%s]\n\n",argv[foundParamIndIndex],(paramPartTokens.size() >= 2 ? paramPartTokens[1].c_str() : NULL)); //printParameterHelp(argv[0],false); - return -1; + return 1; } } @@ -3439,7 +3439,7 @@ int glestMain(int argc, char** argv) { else { printf("\nInvalid missing fullscreen setting specified on commandline [%s] value [%s]\n\n",argv[foundParamIndIndex],(paramPartTokens.size() >= 2 ? paramPartTokens[1].c_str() : NULL)); //printParameterHelp(argv[0],false); - return -1; + return 1; } } @@ -3462,7 +3462,7 @@ int glestMain(int argc, char** argv) { else { printf("\nInvalid missing gamma setting specified on commandline [%s] value [%s]\n\n",argv[foundParamIndIndex],(paramPartTokens.size() >= 2 ? paramPartTokens[1].c_str() : NULL)); //printParameterHelp(argv[0],false); - return -1; + return 1; } } @@ -3537,7 +3537,7 @@ int glestMain(int argc, char** argv) { if(hasCommandArgument(argc, argv,GAME_ARGS[GAME_ARG_SHOW_INI_SETTINGS]) == true) { ShowINISettings(argc,argv,config,configKeys); - return -1; + return 0; } //setVBOSupported(false); @@ -3574,7 +3574,7 @@ int glestMain(int argc, char** argv) { else { printf("\nInvalid missing language specified on commandline [%s] value [%s]\n\n",argv[foundParamIndIndex],(paramPartTokens.size() >= 2 ? paramPartTokens[1].c_str() : NULL)); //printParameterHelp(argv[0],false); - return -1; + return 1; } } else { @@ -3682,7 +3682,7 @@ int glestMain(int argc, char** argv) { printf("\nInvalid missing font base size specified on commandline [%s] value [%s]\n\n",argv[foundParamIndIndex],(paramPartTokens.size() >= 2 ? paramPartTokens[1].c_str() : NULL)); //printParameterHelp(argv[0],false); - return -1; + return 1; } } @@ -3714,7 +3714,7 @@ int glestMain(int argc, char** argv) { else { printf("\nInvalid missing font specified on commandline [%s] value [%s]\n\n",argv[foundParamIndIndex],(paramPartTokens.size() >= 2 ? paramPartTokens[1].c_str() : NULL)); //printParameterHelp(argv[0],false); - return -1; + return 1; } } @@ -3742,15 +3742,16 @@ int glestMain(int argc, char** argv) { } else { printf("Map [%s] was NOT FOUND\n",itemName.c_str()); + return 1; } - return -1; + return 0; } else { printf("\nInvalid missing map specified on commandline [%s] value [%s]\n\n",argv[foundParamIndIndex],(paramPartTokens.size() >= 2 ? paramPartTokens[1].c_str() : NULL)); //printParameterHelp(argv[0],false); - return -1; + return 1; } } @@ -3771,15 +3772,16 @@ int glestMain(int argc, char** argv) { } else { printf("Tileset [%s] was NOT FOUND\n",itemName.c_str()); + return 1; } - return -1; + return 0; } else { printf("\nInvalid missing tileset specified on commandline [%s] value [%s]\n\n",argv[foundParamIndIndex],(paramPartTokens.size() >= 2 ? paramPartTokens[1].c_str() : NULL)); //printParameterHelp(argv[0],false); - return -1; + return 0; } } @@ -3800,15 +3802,16 @@ int glestMain(int argc, char** argv) { } else { printf("Techtree [%s] was NOT FOUND\n",itemName.c_str()); + return 1; } - return -1; + return 0; } else { printf("\nInvalid missing techtree specified on commandline [%s] value [%s]\n\n",argv[foundParamIndIndex],(paramPartTokens.size() >= 2 ? paramPartTokens[1].c_str() : NULL)); //printParameterHelp(argv[0],false); - return -1; + return 0; } } @@ -3829,15 +3832,16 @@ int glestMain(int argc, char** argv) { } else { printf("Scenario [%s] was NOT FOUND\n",itemName.c_str()); + return 1; } - return -1; + return 0; } else { printf("\nInvalid missing scenario specified on commandline [%s] value [%s]\n\n",argv[foundParamIndIndex],(paramPartTokens.size() >= 2 ? paramPartTokens[1].c_str() : NULL)); //printParameterHelp(argv[0],false); - return -1; + return 0; } } @@ -3859,7 +3863,7 @@ int glestMain(int argc, char** argv) { printf("CRC value for path [%s] filter [%s] is [%u]\n",itemName.c_str(),itemNameFilter.c_str(),crcValue); - return -1; + return 0; } else { if(paramPartTokens.size() < 2) { @@ -3871,7 +3875,7 @@ int glestMain(int argc, char** argv) { //printParameterHelp(argv[0],false); - return -1; + return 1; } } @@ -3915,7 +3919,7 @@ int glestMain(int argc, char** argv) { } printf("===========================================\nTotal: %lu\n",maps.size()); - return -1; + return 0; } if(hasCommandArgument(argc, argv,GAME_ARGS[GAME_ARG_LIST_TECHTRESS]) == true) { @@ -3982,7 +3986,7 @@ int glestMain(int argc, char** argv) { } printf("===========================================\nTotal Techtrees: %lu\n",results.size()); - return -1; + return 0; } if(hasCommandArgument(argc, argv,GAME_ARGS[GAME_ARG_LIST_SCENARIOS]) == true) { @@ -4025,7 +4029,7 @@ int glestMain(int argc, char** argv) { } printf("===========================================\nTotal: %lu\n",results.size()); - return -1; + return 0; } if(hasCommandArgument(argc, argv,GAME_ARGS[GAME_ARG_LIST_TILESETS]) == true) { @@ -4089,7 +4093,7 @@ int glestMain(int argc, char** argv) { } printf("===========================================\nTotal: %lu\n",results.size()); - return -1; + return 0; } if(hasCommandArgument(argc, argv,GAME_ARGS[GAME_ARG_LIST_TUTORIALS]) == true) { @@ -4153,7 +4157,7 @@ int glestMain(int argc, char** argv) { } printf("===========================================\nTotal: %lu\n",results.size()); - return -1; + return 0; } //vector techPaths; @@ -4322,7 +4326,7 @@ int glestMain(int argc, char** argv) { printf("\nInvalid map name specified on commandline [%s] map [%s]\n\n",argv[foundParamIndIndex],(paramPartTokens.size() >= 2 ? paramPartTokens[1].c_str() : NULL)); printParameterHelp(argv[0],foundInvalidArgs); delete mainWindow; - return -1; + return 1; } } else if(hasCommandArgument(argc, argv,string(GAME_ARGS[GAME_ARG_CLIENT])) == true) { @@ -4345,7 +4349,7 @@ int glestMain(int argc, char** argv) { printf("\nInvalid host specified on commandline [%s] host [%s]\n\n",argv[foundParamIndIndex],(paramPartTokens.size() >= 2 ? paramPartTokens[1].c_str() : NULL)); printParameterHelp(argv[0],foundInvalidArgs); delete mainWindow; - return -1; + return 1; } } else if(hasCommandArgument(argc, argv,string(GAME_ARGS[GAME_ARG_LOADSCENARIO])) == true) { @@ -4368,7 +4372,7 @@ int glestMain(int argc, char** argv) { printf("\nInvalid scenario name specified on commandline [%s] scenario [%s]\n\n",argv[foundParamIndIndex],(paramPartTokens.size() >= 2 ? paramPartTokens[1].c_str() : NULL)); printParameterHelp(argv[0],foundInvalidArgs); delete mainWindow; - return -1; + return 1; } } else { @@ -4387,7 +4391,7 @@ int glestMain(int argc, char** argv) { printf("%s",renderer.getGlMoreInfo().c_str()); delete mainWindow; - return -1; + return 0; } if(hasCommandArgument(argc, argv,GAME_ARGS[GAME_ARG_CONVERT_MODELS]) == true) { @@ -4453,6 +4457,7 @@ int glestMain(int argc, char** argv) { Window::handleEvent(); SDL_PumpEvents(); + int result = 0; char szTextBuf[1024]=""; for(unsigned int i =0; i < models.size(); ++i) { string &file = models[i]; @@ -4490,6 +4495,7 @@ int glestMain(int argc, char** argv) { modelLoadedOk = true; } catch(const exception &ex) { + result = 1; printf("ERROR loading model [%s] message [%s]\n",file.c_str(),ex.what()); } @@ -4502,13 +4508,13 @@ int glestMain(int argc, char** argv) { } delete mainWindow; - return -1; + return result; } else { printf("\nInvalid model specified on commandline [%s] texture [%s]\n\n",argv[foundParamIndIndex],(paramPartTokens.size() >= 2 ? paramPartTokens[1].c_str() : NULL)); printParameterHelp(argv[0],foundInvalidArgs); delete mainWindow; - return -1; + return 1; } } @@ -4518,14 +4524,14 @@ int glestMain(int argc, char** argv) { runTechValidationReport(argc, argv); delete mainWindow; - return -1; + return 0; } if( hasCommandArgument(argc, argv,GAME_ARGS[GAME_ARG_VALIDATE_TILESET]) == true) { runTilesetValidationReport(argc, argv); delete mainWindow; - return -1; + return 0; } gameInitialized = true; diff --git a/source/glest_game/network/client_interface.cpp b/source/glest_game/network/client_interface.cpp index ed3e3f612..cf95f4f77 100644 --- a/source/glest_game/network/client_interface.cpp +++ b/source/glest_game/network/client_interface.cpp @@ -880,7 +880,8 @@ void ClientInterface::updateKeyframe(int frameCount) { //chrono.start(); if(quit == false) { - bool testThreaded = Config::getInstance().getBool("ThreadedNetworkClient","false"); + //bool testThreaded = Config::getInstance().getBool("ThreadedNetworkClient","false"); + bool testThreaded = false; if(testThreaded == false) { updateFrame(&frameCount); Commands &frameCmdList = cachedPendingCommands[frameCount]; diff --git a/source/glest_game/world/map.cpp b/source/glest_game/world/map.cpp index 91f3f0c69..4242a0356 100644 --- a/source/glest_game/world/map.cpp +++ b/source/glest_game/world/map.cpp @@ -469,8 +469,8 @@ Vec2i Map::getStartLocation(int locationIndex) const { char szBuf[4096]=""; sprintf(szBuf,"locationIndex >= maxPlayers [%d] [%d]",locationIndex, maxPlayers); printf("%s\n",szBuf); - //throw megaglest_runtime_error(szBuf); - assert(locationIndex < maxPlayers); + throw megaglest_runtime_error(szBuf); + //assert(locationIndex < maxPlayers); } else if(startLocations == NULL) { throw megaglest_runtime_error("startLocations == NULL"); diff --git a/source/glest_game/world/world.cpp b/source/glest_game/world/world.cpp index bff92a462..b58e5b6af 100644 --- a/source/glest_game/world/world.cpp +++ b/source/glest_game/world/world.cpp @@ -257,8 +257,19 @@ void World::init(Game *game, bool createUnits, bool initFactions){ //minimap must be init after sum computation initMinimap(); - if(createUnits){ - initUnits(); + + bool gotError = false; + char szErrBuf[8096]=""; + + try { + if(createUnits){ + initUnits(); + } + } + catch(const std::exception &ex) { + gotError = true; + sprintf(szErrBuf,"In [%s::%s %d] error [%s]\n",__FILE__,__FUNCTION__,__LINE__,ex.what()); + SystemFlags::OutputDebug(SystemFlags::debugError,szErrBuf); } if(loadWorldNode != NULL) { @@ -269,6 +280,10 @@ void World::init(Game *game, bool createUnits, bool initFactions){ //initExplorationState(); ... was only for !fog-of-war, now handled in initCells() computeFow(); + if(gotError == true) { + throw megaglest_runtime_error(szErrBuf); + } + if(SystemFlags::getSystemSettingType(SystemFlags::debugSystem).enabled) SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d]\n",__FILE__,__FUNCTION__,__LINE__); } @@ -1596,12 +1611,15 @@ void World::placeUnitAtLocation(const Vec2i &location, int radius, Unit *unit, b } else { string unitName = unit->getType()->getName(); + string unitFactionName = unit->getFaction()->getType()->getName(); + int unitFactionIndex = unit->getFactionIndex(); + delete unit; unit = NULL; char szBuf[4096]=""; sprintf(szBuf,"Unit: [%s] can't be placed, this error is caused because there\nis not enough room to put all units near their start location.\nmake a better/larger map. Faction: #%d name: [%s]", - unitName.c_str(),unit->getFactionIndex(),unit->getFaction()->getType()->getName().c_str()); + unitName.c_str(),unitFactionIndex,unitFactionName.c_str()); throw megaglest_runtime_error(szBuf); } if (unit->getType()->hasSkillClass(scBeBuilt)) { @@ -1619,59 +1637,55 @@ void World::initUnits() { if(SystemFlags::getSystemSettingType(SystemFlags::debugSystem).enabled) SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d]\n",__FILE__,__FUNCTION__,__LINE__); Logger::getInstance().add(Lang::getInstance().get("LogScreenGameLoadingGenerateGameElements","",true), true); - //put starting units - if(loadWorldNode == NULL) { - for(int i = 0; i < getFactionCount(); ++i) { - Faction *f= factions[i]; - const FactionType *ft= f->getType(); - for(int j = 0; j < ft->getStartingUnitCount(); ++j) { - const UnitType *ut= ft->getStartingUnit(j); - int initNumber= ft->getStartingUnitAmount(j); + bool gotError = false; + char szErrBuf[8096]=""; + try { + //put starting units + if(loadWorldNode == NULL) { + for(int i = 0; i < getFactionCount(); ++i) { + Faction *f= factions[i]; + const FactionType *ft= f->getType(); + for(int j = 0; j < ft->getStartingUnitCount(); ++j) { + const UnitType *ut= ft->getStartingUnit(j); + int initNumber= ft->getStartingUnitAmount(j); - for(int l = 0; l < initNumber; l++) { + for(int l = 0; l < initNumber; l++) { - UnitPathInterface *newpath = NULL; - switch(game->getGameSettings()->getPathFinderType()) { - case pfBasic: - newpath = new UnitPathBasic(); - break; - case pfRoutePlanner: - newpath = new UnitPath(); - break; - default: - throw megaglest_runtime_error("detected unsupported pathfinder type!"); + UnitPathInterface *newpath = NULL; + switch(game->getGameSettings()->getPathFinderType()) { + case pfBasic: + newpath = new UnitPathBasic(); + break; + case pfRoutePlanner: + newpath = new UnitPath(); + break; + default: + throw megaglest_runtime_error("detected unsupported pathfinder type!"); + } + + Unit *unit= new Unit(getNextUnitId(f), newpath, Vec2i(0), ut, f, &map, CardinalDir::NORTH); + int startLocationIndex= f->getStartLocationIndex(); + placeUnitAtLocation(map.getStartLocation(startLocationIndex), generationArea, unit, true); } - - Unit *unit= new Unit(getNextUnitId(f), newpath, Vec2i(0), ut, f, &map, CardinalDir::NORTH); - - int startLocationIndex= f->getStartLocationIndex(); - - // if(placeUnit(map.getStartLocation(startLocationIndex), generationArea, unit, true)) { - // unit->create(true); - // unit->born(); - // } - // else { - // string unitName = unit->getType()->getName(); - // delete unit; - // unit = NULL; - // throw megaglest_runtime_error("Unit: " + unitName + " can't be placed, this error is caused because there\nis not enough room to put all units near their start location.\nmake a better/larger map. Faction: #" + intToStr(i) + " name: " + ft->getName()); - // } - // if (unit->getType()->hasSkillClass(scBeBuilt)) { - // map.flatternTerrain(unit); - // if(cartographer != NULL) { - // cartographer->updateMapMetrics(unit->getPos(), unit->getType()->getSize()); - // } - // } - placeUnitAtLocation(map.getStartLocation(startLocationIndex), generationArea, unit, true); } - } - // Ensure Starting Resource Amount are adjusted to max store levels - f->limitResourcesToStore(); + // Ensure Starting Resource Amount are adjusted to max store levels + f->limitResourcesToStore(); + } } } + catch(const std::exception &ex) { + gotError = true; + sprintf(szErrBuf,"In [%s::%s %d] error [%s]\n",__FILE__,__FUNCTION__,__LINE__,ex.what()); + SystemFlags::OutputDebug(SystemFlags::debugError,szErrBuf); + } + map.computeNormals(); map.computeInterpolatedHeights(); + + if(gotError == true) { + throw megaglest_runtime_error(szErrBuf); + } if(SystemFlags::getSystemSettingType(SystemFlags::debugSystem).enabled) SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d]\n",__FILE__,__FUNCTION__,__LINE__); } diff --git a/source/shared_lib/include/platform/sdl/platform_main.h b/source/shared_lib/include/platform/sdl/platform_main.h index c964f2e00..eb0a53e6d 100644 --- a/source/shared_lib/include/platform/sdl/platform_main.h +++ b/source/shared_lib/include/platform/sdl/platform_main.h @@ -509,13 +509,13 @@ int mainSetup(int argc, char **argv) { // Use this for masterserver mode for timers like Chrono if(SDL_Init(SDL_INIT_TIMER) < 0) { std::cerr << "Couldn't initialize SDL: " << SDL_GetError() << "\n"; - return 1; + return 3; } } else { if(SDL_Init(SDL_INIT_EVERYTHING) < 0) { std::cerr << "Couldn't initialize SDL: " << SDL_GetError() << "\n"; - return 1; + return 3; } SDL_EnableUNICODE(1); SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL);