From 896b1c308c429952ca76be5452014905c1477a4b Mon Sep 17 00:00:00 2001 From: Mark Vejvoda Date: Sun, 2 Jan 2011 00:39:13 +0000 Subject: [PATCH] - added a backtrace for gcc compiled binary when we get a runtime error. - added more out of synch checks and better error handling --- CMakeLists.txt | 2 +- source/glest_game/ai/ai_interface.cpp | 26 +- source/glest_game/ai/ai_rule.cpp | 200 ++-- source/glest_game/game/commander.cpp | 27 +- source/glest_game/game/game.cpp | 21 +- source/glest_game/main/main.cpp | 224 ++++- source/glest_game/main/program.cpp | 4 + source/glest_game/main/program.h | 5 +- .../menu/menu_state_custom_game.cpp | 860 +++++++++--------- .../glest_game/network/client_interface.cpp | 9 +- source/glest_game/network/connection_slot.cpp | 4 +- source/glest_game/network/network_message.cpp | 28 +- source/glest_game/network/network_message.h | 5 +- source/glest_game/network/network_types.cpp | 18 +- source/glest_game/network/network_types.h | 16 +- .../glest_game/network/server_interface.cpp | 7 +- source/glest_game/sound/sound_renderer.cpp | 83 +- source/glest_game/sound/sound_renderer.h | 11 +- source/glest_game/type_instances/command.cpp | 20 +- source/glest_game/type_instances/unit.cpp | 2 +- .../sound/openal/sound_player_openal.cpp | 16 +- 21 files changed, 940 insertions(+), 648 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 09c33bdce..bbb587e21 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -32,7 +32,7 @@ IF(CMAKE_COMPILER_IS_GNUCXX OR MINGW) # Default compiler flags #SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -s") ## Strip binary - ADD_DEFINITIONS("-fno-strict-aliasing -frounding-math -fsignaling-nans -mfpmath=sse -msse") + ADD_DEFINITIONS("-fno-strict-aliasing -frounding-math -fsignaling-nans -mfpmath=sse -msse -rdynamic") #SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall") # Debug compiler flags diff --git a/source/glest_game/ai/ai_interface.cpp b/source/glest_game/ai/ai_interface.cpp index f92f449a4..d23219d26 100644 --- a/source/glest_game/ai/ai_interface.cpp +++ b/source/glest_game/ai/ai_interface.cpp @@ -3,9 +3,9 @@ // // Copyright (C) 2001-2008 Martio Figueroa // -// You can redistribute this code and/or modify it under -// the terms of the GNU General Public License as published -// by the Free Software Foundation; either version 2 of the +// You can redistribute this code and/or modify it under +// the terms of the GNU General Public License as published +// by the Free Software Foundation; either version 2 of the // License, or (at your option) any later version // ============================================================== @@ -62,14 +62,14 @@ AiInterface::AiInterface(Game &game, int factionIndex, int teamIndex, int useSta SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d]\n",__FILE__,__FUNCTION__,__LINE__); } -// ==================== main ==================== +// ==================== main ==================== void AiInterface::update() { timer++; ai.update(); } -// ==================== misc ==================== +// ==================== misc ==================== void AiInterface::printLog(int logLevel, const string &s){ if(this->logLevel>=logLevel){ @@ -82,7 +82,7 @@ void AiInterface::printLog(int logLevel, const string &s){ } fprintf(f, "%s\n", logString.c_str()); fclose(f); - + //redirect to console if(redir) { console->addLine(logString); @@ -90,7 +90,7 @@ void AiInterface::printLog(int logLevel, const string &s){ } } -// ==================== interaction ==================== +// ==================== interaction ==================== Faction *AiInterface::getMyFaction() { return world->getFaction(factionIndex); @@ -224,7 +224,7 @@ CommandResult AiInterface::giveCommand(int unitIndex, const CommandType *command } } -CommandResult AiInterface::giveCommand(int unitIndex, const CommandType *commandType, const Vec2i &pos, const UnitType *ut){ +CommandResult AiInterface::giveCommand(int unitIndex, const CommandType *commandType, const Vec2i &pos, const UnitType *ut) { assert(this->gameSettings != NULL); const Unit *unit = getMyUnit(unitIndex); @@ -328,7 +328,7 @@ CommandResult AiInterface::giveCommand(int unitIndex, const CommandType *command } } -// ==================== get data ==================== +// ==================== get data ==================== int AiInterface::getMapMaxPlayers(){ return world->getMaxPlayers(); @@ -360,10 +360,10 @@ int AiInterface::onSightUnitCount(){ for(int i=0; igetFactionCount(); ++i){ for(int j=0; jgetFaction(i)->getUnitCount(); ++j){ SurfaceCell *sc= map->getSurfaceCell(Map::toSurfCoords(world->getFaction(i)->getUnit(j)->getPos())); - if(sc->isVisible(teamIndex)){ - count++; + if(sc->isVisible(teamIndex)){ + count++; } - } + } } return count; } @@ -383,7 +383,7 @@ const Unit *AiInterface::getMyUnit(int unitIndex){ } const Unit *AiInterface::getOnSightUnit(int unitIndex){ - + int count=0; Map *map= world->getMap(); diff --git a/source/glest_game/ai/ai_rule.cpp b/source/glest_game/ai/ai_rule.cpp index b3d6be377..1155b7194 100644 --- a/source/glest_game/ai/ai_rule.cpp +++ b/source/glest_game/ai/ai_rule.cpp @@ -3,9 +3,9 @@ // // Copyright (C) 2001-2008 Martio Figueroa // -// You can redistribute this code and/or modify it under -// the terms of the GNU General Public License as published -// by the Free Software Foundation; either version 2 of the +// You can redistribute this code and/or modify it under +// the terms of the GNU General Public License as published +// by the Free Software Foundation; either version 2 of the // License, or (at your option) any later version // ============================================================== #include "ai_rule.h" @@ -26,7 +26,7 @@ namespace Glest{ namespace Game{ // class AiRule // ===================================================== -AiRule::AiRule(Ai *ai){ +AiRule::AiRule(Ai *ai){ this->ai= ai; } @@ -34,7 +34,7 @@ AiRule::AiRule(Ai *ai){ // class AiRuleWorkerHarvest // ===================================================== -AiRuleWorkerHarvest::AiRuleWorkerHarvest(Ai *ai): +AiRuleWorkerHarvest::AiRuleWorkerHarvest(Ai *ai): AiRule(ai) { stoppedWorkerIndex= -1; @@ -52,7 +52,7 @@ void AiRuleWorkerHarvest::execute(){ // class AiRuleRefreshHarvester // ===================================================== -AiRuleRefreshHarvester::AiRuleRefreshHarvester(Ai *ai): +AiRuleRefreshHarvester::AiRuleRefreshHarvester(Ai *ai): AiRule(ai) { workerIndex= -1; @@ -70,7 +70,7 @@ void AiRuleRefreshHarvester::execute(){ // class AiRuleScoutPatrol // ===================================================== -AiRuleScoutPatrol::AiRuleScoutPatrol(Ai *ai): +AiRuleScoutPatrol::AiRuleScoutPatrol(Ai *ai): AiRule(ai) { } @@ -86,7 +86,7 @@ void AiRuleScoutPatrol::execute(){ // class AiRuleRepair // ===================================================== -AiRuleRepair::AiRuleRepair(Ai *ai): +AiRuleRepair::AiRuleRepair(Ai *ai): AiRule(ai) { } @@ -108,7 +108,7 @@ bool AiRuleRepair::test(){ void AiRuleRepair::execute() { AiInterface *aiInterface= ai->getAiInterface(); const Unit *damagedUnit= aiInterface->getMyUnit(damagedUnitIndex); - + //find a repairer and issue command /* if(damagedUnit != NULL) { @@ -140,7 +140,7 @@ void AiRuleRepair::execute() { if(rct->isRepairableUnitType(damagedUnit->getType())){ SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d]\n",__FILE__,__FUNCTION__,__LINE__); - aiInterface->giveCommand(i, rct, damagedUnit->getPos()); + aiInterface->giveCommand(i, rct, damagedUnit->getPos()); aiInterface->printLog(3, "Repairing order issued"); return; } @@ -152,7 +152,7 @@ void AiRuleRepair::execute() { // class AiRuleReturnBase // ===================================================== -AiRuleReturnBase::AiRuleReturnBase(Ai *ai): +AiRuleReturnBase::AiRuleReturnBase(Ai *ai): AiRule(ai) { stoppedUnitIndex= -1; @@ -170,13 +170,13 @@ void AiRuleReturnBase::execute(){ // class AiRuleMassiveAttack // ===================================================== -AiRuleMassiveAttack::AiRuleMassiveAttack(Ai *ai): +AiRuleMassiveAttack::AiRuleMassiveAttack(Ai *ai): AiRule(ai) { } bool AiRuleMassiveAttack::test(){ - + if(ai->isStableBase()){ ultraAttack= false; return ai->beingAttacked(attackPos, field, INT_MAX); @@ -184,7 +184,7 @@ bool AiRuleMassiveAttack::test(){ else{ ultraAttack= true; return ai->beingAttacked(attackPos, field, baseRadius); - } + } } void AiRuleMassiveAttack::execute(){ @@ -228,14 +228,14 @@ void AiRuleAddTasks::execute(){ if(workerCount<10) ai->addTask(new ProduceTask(ucWorker)); if(workerRatio<0.20) ai->addTask(new ProduceTask(ucWorker)); if(workerRatio<0.30) ai->addTask(new ProduceTask(ucWorker)); - + //warriors if(warriorCount<10) ai->addTask(new ProduceTask(ucWarrior)); if(warriorRatio<0.20) ai->addTask(new ProduceTask(ucWarrior)); if(warriorRatio<0.30) ai->addTask(new ProduceTask(ucWarrior)); if(workerCount>=10) ai->addTask(new ProduceTask(ucWarrior)); - if(workerCount>=15) ai->addTask(new ProduceTask(ucWarrior)); - if(warriorCountminWarriors+2) + if(workerCount>=15) ai->addTask(new ProduceTask(ucWarrior)); + if(warriorCountminWarriors+2) { ai->addTask(new ProduceTask(ucWarrior)); if( buildingCount>9 ) @@ -249,7 +249,7 @@ void AiRuleAddTasks::execute(){ ai->addTask(new ProduceTask(ucWarrior)); } } - + //buildings if(buildingCount<6 || buildingRatio<0.20) ai->addTask(new BuildTask()); if(buildingCount<10 && workerCount>12) ai->addTask(new BuildTask()); @@ -265,18 +265,18 @@ void AiRuleAddTasks::execute(){ //workers if(workerCountaddTask(new ProduceTask(ucWorker)); if(workerCount>5 && workerRatio<0.20) ai->addTask(new ProduceTask(ucWorker)); - + //warriors if(warriorCount<10) ai->addTask(new ProduceTask(ucWarrior)); if(warriorRatio<0.20) ai->addTask(new ProduceTask(ucWarrior)); if(warriorRatio<0.30) ai->addTask(new ProduceTask(ucWarrior)); if(workerCount>=10) ai->addTask(new ProduceTask(ucWarrior)); - if(workerCount>=15) ai->addTask(new ProduceTask(ucWarrior)); - + if(workerCount>=15) ai->addTask(new ProduceTask(ucWarrior)); + //buildings if(buildingCount<6 || buildingRatio<0.20) ai->addTask(new BuildTask()); if(buildingCount<10 && ai->isStableBase()) ai->addTask(new BuildTask()); - + //upgrades if(upgradeCount==0 && workerCount>6) ai->addTask(new UpgradeTask()); if(upgradeCount==1 && workerCount>7) ai->addTask(new UpgradeTask()); @@ -290,18 +290,18 @@ void AiRuleAddTasks::execute(){ if(workerCount<10) ai->addTask(new ProduceTask(ucWorker)); if(workerRatio<0.20) ai->addTask(new ProduceTask(ucWorker)); if(workerRatio<0.30) ai->addTask(new ProduceTask(ucWorker)); - + //warriors if(warriorCount<10) ai->addTask(new ProduceTask(ucWarrior)); if(warriorRatio<0.20) ai->addTask(new ProduceTask(ucWarrior)); if(warriorRatio<0.30) ai->addTask(new ProduceTask(ucWarrior)); if(workerCount>=10) ai->addTask(new ProduceTask(ucWarrior)); - if(workerCount>=15) ai->addTask(new ProduceTask(ucWarrior)); - + if(workerCount>=15) ai->addTask(new ProduceTask(ucWarrior)); + //buildings if(buildingCount<6 || buildingRatio<0.20) ai->addTask(new BuildTask()); if(buildingCount<10 && workerCount>12) ai->addTask(new BuildTask()); - + //upgrades if(upgradeCount==0 && workerCount>5) ai->addTask(new UpgradeTask()); if(upgradeCount==1 && workerCount>10) ai->addTask(new UpgradeTask()); @@ -326,13 +326,13 @@ bool AiRuleBuildOneFarm::test(){ //for all units for(int i=0; igetMyFactionType()->getUnitTypeCount(); ++i){ const UnitType *ut= aiInterface->getMyFactionType()->getUnitType(i); - + //for all production commands for(int j=0; jgetCommandTypeCount(); ++j){ const CommandType *ct= ut->getCommandType(j); if(ct->getClass()==ccProduce){ const UnitType *producedType= static_cast(ct)->getProducedUnit(); - + //for all resources for(int k=0; kgetCostCount(); ++k){ const Resource *r= producedType->getCost(k); @@ -370,22 +370,22 @@ bool AiRuleProduceResourceProducer::test(){ //consumables first for(int i=0; igetTechTree()->getResourceTypeCount(); ++i){ rt= aiInterface->getTechTree()->getResourceType(i); - const Resource *r= aiInterface->getResource(rt); + const Resource *r= aiInterface->getResource(rt); if(rt->getClass()==rcConsumable && r->getBalance()<0){ interval= longInterval; return true; - + } } //statics second for(int i=0; igetTechTree()->getResourceTypeCount(); ++i){ rt= aiInterface->getTechTree()->getResourceType(i); - const Resource *r= aiInterface->getResource(rt); + const Resource *r= aiInterface->getResource(rt); if(rt->getClass()==rcStatic && r->getAmount()getUnitType()==NULL){ produceGeneric(produceTask); @@ -438,21 +438,21 @@ void AiRuleProduce::execute(){ } void AiRuleProduce::produceGeneric(const ProduceTask *pt){ - typedef vector UnitTypes; + typedef vector UnitTypes; UnitTypes ableUnits; AiInterface *aiInterface= ai->getAiInterface(); //for each unit, produce it if possible for(int i=0; igetMyUnitCount(); ++i){ - + //for each command const UnitType *ut= aiInterface->getMyUnit(i)->getType(); for(int j=0; jgetCommandTypeCount(); ++j){ const CommandType *ct= ut->getCommandType(j); - + //if the command is produce if(ct->getClass()==ccProduce || ct->getClass()==ccMorph){ - + const UnitType *producedUnit= static_cast(ct->getProduced()); bool produceIt= false; @@ -502,12 +502,12 @@ void AiRuleProduce::produceGeneric(const ProduceTask *pt){ } void AiRuleProduce::produceSpecific(const ProduceTask *pt){ - + AiInterface *aiInterface= ai->getAiInterface(); - + //if unit meets requirements if(aiInterface->reqsOk(pt->getUnitType())){ - + //if unit doesnt meet resources retry if(!aiInterface->checkCosts(pt->getUnitType())){ ai->retryTask(pt); @@ -523,16 +523,16 @@ void AiRuleProduce::produceSpecific(const ProduceTask *pt){ //for each unit for(int i=0; igetMyUnitCount(); ++i){ - + //for each command const UnitType *ut= aiInterface->getMyUnit(i)->getType(); for(int j=0; jgetCommandTypeCount(); ++j){ const CommandType *ct= ut->getCommandType(j); - + //if the command is produce if(ct->getClass()==ccProduce || ct->getClass()==ccMorph){ const UnitType *producedUnit= static_cast(ct->getProduced()); - + //if units match if(producedUnit == pt->getUnitType()){ if(aiInterface->reqsOk(ct)){ @@ -540,7 +540,7 @@ void AiRuleProduce::produceSpecific(const ProduceTask *pt){ producers.push_back(i); producersDefaultCommandType[i].push_back(ct); } - } + } } } } @@ -563,7 +563,7 @@ void AiRuleProduce::produceSpecific(const ProduceTask *pt){ prIndex = (i - producers.size()); } currentProducerIndex=producers[prIndex]; - + if(currentProducerIndex >= aiInterface->getMyUnitCount()) { char szBuf[1024]=""; printf("In [%s::%s Line: %d] currentProducerIndex >= aiInterface->getMyUnitCount(), currentProducerIndex = %d, aiInterface->getMyUnitCount() = %d, i = %d,producers.size() = %lu\n",__FILE__,__FUNCTION__,__LINE__,currentProducerIndex,aiInterface->getMyUnitCount(),i,(unsigned long)producers.size()); @@ -594,7 +594,7 @@ void AiRuleProduce::produceSpecific(const ProduceTask *pt){ { // maybe we need another producer of this kind if possible! if(aiInterface->reqsOk(aiInterface->getMyUnit(bestIndex)->getType())) - { + { if(ai->getCountOfClass(ucBuilding)>5) ai->addTask(new BuildTask(aiInterface->getMyUnit(bestIndex)->getType())); } @@ -610,13 +610,13 @@ void AiRuleProduce::produceSpecific(const ProduceTask *pt){ //if the command is produce if(ct->getClass()==ccProduce) { - const UnitType *unitType= static_cast(ct->getProduced()); + const UnitType *unitType= static_cast(ct->getProduced()); if(unitType->hasSkillClass(scAttack) && !unitType->hasCommandClass(ccHarvest) && aiInterface->reqsOk(ct)) {//this can produce a warrior backupProducers.push_back(i); - } + } } - } + } } if(!backupProducers.empty()) { @@ -626,7 +626,7 @@ void AiRuleProduce::produceSpecific(const ProduceTask *pt){ int bestIndex=-1; int currentCommandCount=0; for(unsigned int i=randomstart; i= backupProducers.size()) { prIndex = (i - backupProducers.size()); @@ -665,15 +665,15 @@ void AiRuleProduce::produceSpecific(const ProduceTask *pt){ const UnitType *ut=aiInterface->getMyUnit(bestIndex)->getType(); for(int j=0; jgetCommandTypeCount(); ++j){ const CommandType *ct= ut->getCommandType(j); - + //if the command is produce if(ct->getClass()==ccProduce) { - const UnitType *unitType= static_cast(ct->getProduced()); + const UnitType *unitType= static_cast(ct->getProduced()); if(unitType->hasSkillClass(scAttack) && !unitType->hasCommandClass(ccHarvest) && aiInterface->reqsOk(ct)) {//this can produce a warrior productionCommandIndexes.push_back(j); - } + } } } int commandIndex=productionCommandIndexes[ai->getRandom()->randRange(0, productionCommandIndexes.size()-1)]; @@ -696,7 +696,7 @@ void AiRuleProduce::produceSpecific(const ProduceTask *pt){ } } else - { + { if(currentCommandCount==0) { SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d]\n",__FILE__,__FUNCTION__,__LINE__); @@ -771,7 +771,7 @@ bool AiRuleBuild::test(){ void AiRuleBuild::execute(){ - + if(buildTask!=NULL){ //generic build task, build random building that can be built @@ -789,29 +789,29 @@ void AiRuleBuild::execute(){ } void AiRuleBuild::buildGeneric(const BuildTask *bt){ - + //find buildings that can be built AiInterface *aiInterface= ai->getAiInterface(); - typedef vector UnitTypes; + typedef vector UnitTypes; UnitTypes buildings; - + //for each unit for(int i=0; igetMyUnitCount(); ++i){ - + //for each command const UnitType *ut= aiInterface->getMyUnit(i)->getType(); for(int j=0; jgetCommandTypeCount(); ++j){ const CommandType *ct= ut->getCommandType(j); - + //if the command is build if(ct->getClass()==ccBuild){ const BuildCommandType *bct= static_cast(ct); - + //for each building for(int k=0; kgetBuildingCount(); ++k){ - const UnitType *building= bct->getBuilding(k); + const UnitType *building= bct->getBuilding(k); if(aiInterface->reqsOk(bct) && aiInterface->reqsOk(building)){ - + //if any building, or produces resource const ResourceType *rt= bt->getResourceType(); const Resource *cost= building->getCost(rt); @@ -829,13 +829,13 @@ void AiRuleBuild::buildGeneric(const BuildTask *bt){ } void AiRuleBuild::buildBestBuilding(const vector &buildings){ - + if(!buildings.empty()){ //build the least built building bool buildingFound= false; for(int i=0; i<10 && !buildingFound; ++i){ - + if(i>0){ //Defensive buildings have priority @@ -882,13 +882,13 @@ void AiRuleBuild::buildBestBuilding(const vector &buildings){ } } -void AiRuleBuild::buildSpecific(const BuildTask *bt){ +void AiRuleBuild::buildSpecific(const BuildTask *bt) { AiInterface *aiInterface= ai->getAiInterface(); //if reqs ok - if(aiInterface->reqsOk(bt->getUnitType())){ + if(aiInterface->reqsOk(bt->getUnitType())) { //retry if not enough resources - if(!aiInterface->checkCosts(bt->getUnitType())){ + if(aiInterface->checkCosts(bt->getUnitType()) == false) { ai->retryTask(bt); return; } @@ -898,30 +898,30 @@ void AiRuleBuild::buildSpecific(const BuildTask *bt){ // then a list of build commandtypes for each unit map > buildersDefaultCommandType; const BuildCommandType *defBct= NULL; - + //for each unit - for(int i=0; igetMyUnitCount(); ++i){ - + for(int i = 0; i < aiInterface->getMyUnitCount(); ++i) { + //if the unit is not going to build - const Unit *u= aiInterface->getMyUnit(i); - if(!u->anyCommand() || u->getCurrCommand()->getCommandType()->getClass()!=ccBuild){ + const Unit *u = aiInterface->getMyUnit(i); + if(u->anyCommand() == false || u->getCurrCommand()->getCommandType()->getClass() != ccBuild) { //for each command const UnitType *ut= aiInterface->getMyUnit(i)->getType(); - for(int j=0; jgetCommandTypeCount(); ++j){ + for(int j = 0; j < ut->getCommandTypeCount(); ++j) { const CommandType *ct= ut->getCommandType(j); - + //if the command is build - if(ct->getClass()==ccBuild){ + if(ct->getClass() == ccBuild) { const BuildCommandType *bct= static_cast(ct); - + //for each building - for(int k=0; kgetBuildingCount(); ++k){ - const UnitType *building= bct->getBuilding(k); - + for(int k = 0; k < bct->getBuildingCount(); ++k) { + const UnitType *building= bct->getBuilding(k); + //if building match - if(bt->getUnitType()==building){ - if(aiInterface->reqsOk(bct)){ + if(bt->getUnitType() == building) { + if(aiInterface->reqsOk(bct)) { builders.push_back(i); buildersDefaultCommandType[i].push_back(bct); defBct= bct; @@ -934,15 +934,14 @@ void AiRuleBuild::buildSpecific(const BuildTask *bt){ } //use random builder to build - if(!builders.empty()){ + if(builders.empty() == false) { int bIndex = ai->getRandom()->randRange(0, builders.size()-1); int builderIndex= builders[bIndex]; - Vec2i pos; + Vec2i pos; Vec2i searchPos= bt->getForcePos()? bt->getPos(): ai->getRandomHomePosition(); //if free pos give command, else retry - if(ai->findPosForBuilding(bt->getUnitType(), searchPos, pos)){ - + if(ai->findPosForBuilding(bt->getUnitType(), searchPos, pos)) { defBct = NULL; if(buildersDefaultCommandType.find(builderIndex) != buildersDefaultCommandType.end()) { //defBct = buildersDefaultCommandType[builderIndex]; @@ -952,13 +951,12 @@ void AiRuleBuild::buildSpecific(const BuildTask *bt){ SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d] bestCommandTypeIndex = %d, bestCommandTypeCount = %d\n",__FILE__,__FUNCTION__,__LINE__,bestCommandTypeIndex,bestCommandTypeCount); defBct = buildersDefaultCommandType[builderIndex][bestCommandTypeIndex]; - } SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d] builderIndex = %d, bIndex = %d, defBct = %p\n",__FILE__,__FUNCTION__,__LINE__,builderIndex,bIndex,defBct); aiInterface->giveCommand(builderIndex, defBct, pos, bt->getUnitType()); } - else{ + else { ai->retryTask(bt); return; } @@ -1030,21 +1028,21 @@ void AiRuleUpgrade::execute(){ } void AiRuleUpgrade::upgradeGeneric(const UpgradeTask *upgt){ - - typedef vector UpgradeTypes; + + typedef vector UpgradeTypes; AiInterface *aiInterface= ai->getAiInterface(); - + //find upgrades that can be upgraded UpgradeTypes upgrades; - + //for each upgrade, upgrade it if possible for(int i=0; igetMyUnitCount(); ++i){ - + //for each command const UnitType *ut= aiInterface->getMyUnit(i)->getType(); for(int j=0; jgetCommandTypeCount(); ++j){ const CommandType *ct= ut->getCommandType(j); - + //if the command is upgrade if(ct->getClass()==ccUpgrade){ const UpgradeCommandType *upgct= static_cast(ct); @@ -1063,7 +1061,7 @@ void AiRuleUpgrade::upgradeGeneric(const UpgradeTask *upgt){ } void AiRuleUpgrade::upgradeSpecific(const UpgradeTask *upgt){ - + AiInterface *aiInterface= ai->getAiInterface(); //if reqs ok @@ -1077,24 +1075,24 @@ void AiRuleUpgrade::upgradeSpecific(const UpgradeTask *upgt){ //for each unit for(int i=0; igetMyUnitCount(); ++i){ - + //for each command const UnitType *ut= aiInterface->getMyUnit(i)->getType(); for(int j=0; jgetCommandTypeCount(); ++j){ const CommandType *ct= ut->getCommandType(j); - + //if the command is upgrade if(ct->getClass()==ccUpgrade){ const UpgradeCommandType *uct= static_cast(ct); const UpgradeType *producedUpgrade= uct->getProducedUpgrade(); - + //if upgrades match if(producedUpgrade == upgt->getUpgradeType()){ if(aiInterface->reqsOk(uct)){ SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d]\n",__FILE__,__FUNCTION__,__LINE__); aiInterface->giveCommand(i, uct); } - } + } } } } @@ -1149,7 +1147,7 @@ bool AiRuleExpand::test() { } } } - + return false; } @@ -1158,4 +1156,4 @@ void AiRuleExpand::execute(){ ai->addPriorityTask(new BuildTask(storeType, expandPos)); } -}}//end namespace +}}//end namespace diff --git a/source/glest_game/game/commander.cpp b/source/glest_game/game/commander.cpp index 5303aefe1..e9e11fcf8 100644 --- a/source/glest_game/game/commander.cpp +++ b/source/glest_game/game/commander.cpp @@ -495,21 +495,38 @@ Command* Commander::buildCommand(const NetworkCommand* networkCommand) const { throw runtime_error(szBuf); } + ct= unit->getType()->findCommandTypeById(networkCommand->getCommandTypeId()); + if(unit->getFaction()->getIndex() != networkCommand->getUnitFactionIndex()) { char szBuf[4096]=""; sprintf(szBuf,"In [%s::%s Line: %d]\nUnit / Faction mismatch for network command = [%s]\n%s\nfor unit = %d\n[%s]\n[%s]\nactual local factionIndex = %d.\nGame out of synch.", __FILE__,__FUNCTION__,__LINE__,networkCommand->toString().c_str(),unit->getType()->getCommandTypeListDesc().c_str(),unit->getId(), unit->getFullName().c_str(),unit->getDesc().c_str(),unit->getFaction()->getIndex()); + SystemFlags::OutputDebug(SystemFlags::debugError,"%s\n",szBuf); SystemFlags::OutputDebug(SystemFlags::debugSystem,"%s\n",szBuf); std::string worldLog = world->DumpWorldToLog(); //std::string sError = "worldLog = " + worldLog + " " + string(szBuf); - std::string sError = "Error [#1]: Game is out of sync, please check log files for details."; + std::string sError = "Error [#1]: Game is out of sync (Unit / Faction mismatch)\nplease check log files for details."; + throw runtime_error(sError); + } + else if(networkCommand->getUnitTypeId() >= 0 && + unit->getType()->getId() != networkCommand->getUnitTypeId() && + ct->getClass() != ccBuild) { + char szBuf[4096]=""; + sprintf(szBuf,"In [%s::%s Line: %d]\nUnit / Type mismatch for network command = [%s]\n%s\nfor unit = %d\n[%s]\n[%s]\nactual local factionIndex = %d.\nactual local unitTypeId = %d.\nGame out of synch.", + __FILE__,__FUNCTION__,__LINE__,networkCommand->toString().c_str(),unit->getType()->getCommandTypeListDesc().c_str(),unit->getId(), unit->getFullName().c_str(),unit->getDesc().c_str(),unit->getFaction()->getIndex(),unit->getType()->getId()); + + SystemFlags::OutputDebug(SystemFlags::debugError,"%s\n",szBuf); + SystemFlags::OutputDebug(SystemFlags::debugSystem,"%s\n",szBuf); + + std::string worldLog = world->DumpWorldToLog(); + //std::string sError = "worldLog = " + worldLog + " " + string(szBuf); + std::string sError = "Error [#2]: Game is out of sync (unit type mismatch)\nplease check log files for details."; throw runtime_error(sError); } const UnitType* unitType= world->findUnitTypeById(unit->getFaction()->getType(), networkCommand->getUnitTypeId()); - ct= unit->getType()->findCommandTypeById(networkCommand->getCommandTypeId()); // debug test! //throw runtime_error("Test missing command type!"); @@ -544,13 +561,13 @@ Command* Commander::buildCommand(const NetworkCommand* networkCommand) const { //create command Command *command= NULL; - if(unitType!=NULL){ + if(unitType != NULL) { command= new Command(ct, networkCommand->getPosition(), unitType, facing); } - else if(target==NULL){ + else if(target == NULL) { command= new Command(ct, networkCommand->getPosition()); } - else{ + else { command= new Command(ct, target); } diff --git a/source/glest_game/game/game.cpp b/source/glest_game/game/game.cpp index 65f467f9e..1bd5723bd 100644 --- a/source/glest_game/game/game.cpp +++ b/source/glest_game/game/game.cpp @@ -140,6 +140,8 @@ Game::~Game() { Unit::setGame(NULL); SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d] ==== END GAME ==== getCurrentPixelByteCount() = %llu\n",__FILE__,__FUNCTION__,__LINE__,(long long unsigned int)renderer.getCurrentPixelByteCount()); + SystemFlags::OutputDebug(SystemFlags::debugWorldSynch,"==== END GAME ====\n"); + //this->program->reInitGl(); //renderer.reinitAll(); } @@ -649,6 +651,7 @@ void Game::init(bool initForPreviewOnly) SystemFlags::OutputDebug(SystemFlags::debugPathFinder,"PathFinderType: %s\n", (getGameSettings()->getPathFinderType() ? "RoutePlanner" : "PathFinder")); SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d] ==== START GAME ==== getCurrentPixelByteCount() = %llu\n",__FILE__,__FUNCTION__,__LINE__,(long long unsigned int)renderer.getCurrentPixelByteCount()); + SystemFlags::OutputDebug(SystemFlags::debugWorldSynch,"==== START GAME ====\n"); } // ==================== update ==================== @@ -663,6 +666,16 @@ void Game::update() { // a) Updates non dependent on speed + if(NetworkManager::getInstance().getGameNetworkInterface() != NULL && + NetworkManager::getInstance().getGameNetworkInterface()->getQuit() && + mainMessageBox.getEnabled() == false && + errorMessageBox.getEnabled() == false) { + SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d]\n",__FILE__,__FUNCTION__,__LINE__); + //quitGame(); + quitTriggeredIndicator = true; + return; + } + //misc updateFps++; mouse2d= (mouse2d+1) % Renderer::maxMouse2dAnim; @@ -783,7 +796,9 @@ void Game::update() { if(networkManager.getGameNetworkInterface() != NULL) { networkManager.getGameNetworkInterface()->quitGame(true); } - ErrorDisplayMessage(ex.what(),true); + if(errorMessageBox.getEnabled() == false) { + ErrorDisplayMessage(ex.what(),true); + } } } @@ -1407,6 +1422,10 @@ void Game::keyPress(char c){ Stats Game::quitGame() { SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d]\n",__FILE__,__FUNCTION__,__LINE__); + if(SystemFlags::getSystemSettingType(SystemFlags::debugSystem).enabled == true) { + world.DumpWorldToLog(); + } + //Stats stats = *(world.getStats()); Stats endStats; diff --git a/source/glest_game/main/main.cpp b/source/glest_game/main/main.cpp index 58e451ebd..d670c9e9e 100644 --- a/source/glest_game/main/main.cpp +++ b/source/glest_game/main/main.cpp @@ -35,6 +35,12 @@ #include "sound_renderer.h" #include "font_gl.h" #include "cache_manager.h" + +// For gcc backtrace on crash! +#ifdef __GNUC__ +#include +#include +#endif #ifdef WIN32 #if defined(__WIN32__) && !defined(__GNUC__) @@ -70,6 +76,7 @@ using namespace Shared::Graphics::Gl; namespace Glest{ namespace Game{ bool gameInitialized = false; +static char *application_binary=NULL; const char *GAME_ARGS[] = { "--help", @@ -190,19 +197,223 @@ public: message(msg.c_str()); } + +#ifdef __GNUC__ + static int getFileAndLine(void *address, char *file, size_t flen) { + int line=-1; + static char buf[256]=""; + char *p=NULL; + + // prepare command to be executed + // our program need to be passed after the -e parameter + //sprintf (buf, "/usr/bin/addr2line -C -e ./a.out -f -i %lx", addr); + sprintf (buf, "addr2line -C -e %s -f -i %p",application_binary,address); + + FILE* f = popen (buf, "r"); + + if (f == NULL) { + perror (buf); + return 0; + } + + // get function name + char *ret = fgets (buf, 256, f); + // get file and line + ret = fgets (buf, 256, f); + + if (buf[0] != '?') { + int l; + char *p = buf; + + // file name is until ':' + while (*p != ':') + { + p++; + } + + *p++ = 0; + // after file name follows line number + strcpy (file , buf); + sscanf (p,"%d", &line); + } + else { + strcpy (file,"unkown"); + line = 0; + } + pclose(f); + + return line; + } + + static void * getStackAddress(const unsigned int index) { + //printf("\nSTART index = %d\n",index); + + void *lineAddress = NULL; + if(index == 0) { + lineAddress = __builtin_return_address(0); + } + if(index == 1) { + lineAddress = __builtin_return_address(1); + } + if(index == 2) { + lineAddress = __builtin_return_address(2); + } + if(index == 3) { + lineAddress = __builtin_return_address(3); + } + if(index == 4) { + lineAddress = __builtin_return_address(4); + } + if(index == 5) { + lineAddress = __builtin_return_address(5); + } + if(index == 6) { + lineAddress = __builtin_return_address(6); + } + if(index == 7) { + lineAddress = __builtin_return_address(7); + } + if(index == 8) { + lineAddress = __builtin_return_address(8); + } + if(index == 9) { + lineAddress = __builtin_return_address(9); + } + if(index == 10) { + lineAddress = __builtin_return_address(10); + } + if(index == 11) { + lineAddress = __builtin_return_address(11); + } + if(index == 12) { + lineAddress = __builtin_return_address(12); + } + if(index == 13) { + lineAddress = __builtin_return_address(13); + } + if(index == 14) { + lineAddress = __builtin_return_address(14); + } + if(index == 15) { + lineAddress = __builtin_return_address(15); + } + //printf("\nEND index = %d lineAddress [%p]\n",index,lineAddress); + + return lineAddress; + } +#endif static void handleRuntimeError(const char *msg) { Program *program = Program::getInstance(); SystemFlags::OutputDebug(SystemFlags::debugError,"In [%s::%s Line: %d] [%s] gameInitialized = %d, program = %p\n",__FILE__,__FUNCTION__,__LINE__,msg,gameInitialized,program); SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d] [%s] gameInitialized = %d, program = %p\n",__FILE__,__FUNCTION__,__LINE__,msg,gameInitialized,program); + + string errMsg = (msg != NULL ? msg : "null"); + + #ifdef __GNUC__ + errMsg += "\nStack Trace:\n"; + //errMsg += "To find line #'s use:\n"; + //errMsg += "readelf --debug-dump=decodedline %s | egrep 0xaddress-of-stack\n"; + + const size_t max_depth = 15; + void *stack_addrs[max_depth]; + size_t stack_depth = backtrace(stack_addrs, max_depth); + char **stack_strings = backtrace_symbols(stack_addrs, stack_depth); + //for (size_t i = 1; i < stack_depth; i++) { + // errMsg += string(stack_strings[i]) + "\n"; + //} + + char szBuf[4096]=""; + for(size_t i = 1; i < stack_depth; i++) { + const unsigned int stackIndex = i-1; + void *lineAddress = getStackAddress(stackIndex); + + size_t sz = 1024; // just a guess, template names will go much wider + char *function = static_cast(malloc(sz)); + char *begin = 0; + char *end = 0; + + // find the parentheses and address offset surrounding the mangled name + for (char *j = stack_strings[i]; *j; ++j) { + if (*j == '(') { + begin = j; + } + else if (*j == '+') { + end = j; + } + } + if (begin && end) { + *begin++ = '\0'; + *end = '\0'; + // found our mangled name, now in [begin, end) + + int status; + char *ret = abi::__cxa_demangle(begin, function, &sz, &status); + if (ret) { + // return value may be a realloc() of the input + function = ret; + } + else { + // demangling failed, just pretend it's a C function with no args + strncpy(function, begin, sz); + strncat(function, "()", sz); + function[sz-1] = '\0'; + } + //fprintf(out, " %s:%s\n", stack.strings[i], function); + + sprintf(szBuf,"%s:%s address [%p]",stack_strings[i],function,lineAddress); + } + else { + // didn't find the mangled name, just print the whole line + //fprintf(out, " %s\n", stack.strings[i]); + sprintf(szBuf,"%s address [%p]",stack_strings[i],lineAddress); + } + + errMsg += string(szBuf); + char file[4096]=""; + int line = getFileAndLine(lineAddress, file, 4096); + if(line >= 0) { + errMsg += " line: " + intToStr(line); + } + errMsg += "\n"; + + free(function); + } + + free(stack_strings); // malloc()ed by backtrace_symbols + + #endif + + SystemFlags::OutputDebug(SystemFlags::debugError,"In [%s::%s Line: %d] [%s]\n",__FILE__,__FUNCTION__,__LINE__,errMsg.c_str()); + SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d] [%s]\n",__FILE__,__FUNCTION__,__LINE__,errMsg.c_str()); if(program && gameInitialized == true) { - //SystemFlags::Close(); - program->showMessage(msg); + //SystemFlags::Close(); + printf("\nprogram->getState() [%p]\n",program->getState()); + if(program->getState() != NULL) { + program->showMessage(errMsg.c_str()); + for(;program->isMessageShowing();) { + //program->getState()->render(); + Window::handleEvent(); + program->loop(); + } + } + else { + program->showMessage(errMsg.c_str()); + for(;program->isMessageShowing();) { + //program->renderProgramMsgBox(); + Window::handleEvent(); + program->loop(); + } + } } else { - string err = "#2 An error ocurred and " + string(GameConstants::application_name) + " will close.\nError msg = [" + (msg != NULL ? string(msg) : string("?")) + "]\n\nPlease report this bug to "+mailString; + string err = "#2 An error ocurred and " + + string(GameConstants::application_name) + + " will close.\nError msg = [" + + errMsg + + "]\n\nPlease report this bug to "+mailString; #ifdef WIN32 err += string(", attaching the generated ") + getCrashDumpFileName() + string(" file."); #endif @@ -213,10 +424,7 @@ public: #ifdef WIN32 - runtimeErrorMsg = ""; - if(msg != NULL) { - runtimeErrorMsg = msg; - } + runtimeErrorMsg = errMsg; throw runtimeErrorMsg; #endif //SystemFlags::Close(); @@ -1277,7 +1485,7 @@ int glestMainWrapper(int argc, char** argv) { #ifdef WIN32_STACK_TRACE __try { #endif - + application_binary=argv[0]; return glestMain(argc, argv); #ifdef WIN32_STACK_TRACE diff --git a/source/glest_game/main/program.cpp b/source/glest_game/main/program.cpp index 909b8e842..55460b9e5 100644 --- a/source/glest_game/main/program.cpp +++ b/source/glest_game/main/program.cpp @@ -601,6 +601,10 @@ void Program::restoreDisplaySettings(){ } } +bool Program::isMessageShowing() { + return msgBox.getEnabled(); +} + void Program::showMessage(const char *msg) { SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s %d] msg [%s]\n",__FILE__,__FUNCTION__,__LINE__,msg); diff --git a/source/glest_game/main/program.h b/source/glest_game/main/program.h index 8ddca3a7d..e674aa84d 100644 --- a/source/glest_game/main/program.h +++ b/source/glest_game/main/program.h @@ -144,7 +144,8 @@ public: void loop(); void loopWorker(); void resize(SizeState sizeState); - void showMessage(const char *msg); + void showMessage(const char *msg); + bool isMessageShowing(); //misc void setState(ProgramState *programState,bool cleanupOldState=true); @@ -164,7 +165,7 @@ public: void reInitGl(); private: - + void setDisplaySettings(); void restoreDisplaySettings(); }; diff --git a/source/glest_game/menu/menu_state_custom_game.cpp b/source/glest_game/menu/menu_state_custom_game.cpp index fec7e9e8c..4224265de 100644 --- a/source/glest_game/menu/menu_state_custom_game.cpp +++ b/source/glest_game/menu/menu_state_custom_game.cpp @@ -88,8 +88,8 @@ MenuStateCustomGame::MenuStateCustomGame(Program *program, MainMenu *mainMenu, b } catch(const std::exception &ex) { serverInitError = true; - char szBuf[1024]=""; - sprintf(szBuf,"In [%s::%s Line: %d] error [%s]\n",__FILE__,__FUNCTION__,__LINE__,ex.what()); + char szBuf[4096]=""; + sprintf(szBuf,"In [%s::%s %d] Error detected:\n%s\n",__FILE__,__FUNCTION__,__LINE__,ex.what()); SystemFlags::OutputDebug(SystemFlags::debugError,szBuf); SystemFlags::OutputDebug(SystemFlags::debugSystem,"%s",szBuf); //throw runtime_error(szBuf);!!! @@ -220,7 +220,7 @@ MenuStateCustomGame::MenuStateCustomGame(Program *program, MainMenu *mainMenu, b listBoxTileset.init(xoffset+460, mapPos, 150); listBoxTileset.setItems(results); srand(time(NULL)); - listBoxTileset.setSelectedItemIndex(rand() % listBoxTileset.getItemCount()); + listBoxTileset.setSelectedItemIndex(rand() % listBoxTileset.getItemCount()); labelTileset.registerGraphicComponent(containerName,"labelTileset"); labelTileset.init(xoffset+460, mapHeadPos); @@ -444,7 +444,9 @@ MenuStateCustomGame::MenuStateCustomGame(Program *program, MainMenu *mainMenu, b } if(results.size() == 0) { - throw runtime_error("(1)There are no factions for the tech tree [" + techTreeFiles[listBoxTechTree.getSelectedItemIndex()] + "]"); + //throw runtime_error("(1)There are no factions for the tech tree [" + techTreeFiles[listBoxTechTree.getSelectedItemIndex()] + "]"); + showGeneralError=true; + generalErrorToShow = "[#1] There are no factions for the tech tree [" + techTreeFiles[listBoxTechTree.getSelectedItemIndex()] + "]"; } for(int i=0; ishutdownAndWait() == true) { - delete publishToMasterserverThread; - publishToMasterserverThread = NULL; - } + MutexSafeWrapper safeMutexPtr(&publishToMasterserverThreadPtrChangeAccessor); + publishToMasterserverThreadInDeletion = true; + //BaseThread::shutdownAndWait(publishToMasterserverThread); + if(publishToMasterserverThread != NULL && + publishToMasterserverThread->shutdownAndWait() == true) { + delete publishToMasterserverThread; + publishToMasterserverThread = NULL; + } - publishToMasterserverThreadInDeletion = false; - safeMutexPtr.ReleaseLock(); + publishToMasterserverThreadInDeletion = false; + safeMutexPtr.ReleaseLock(); - SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line %d]\n",__FILE__,__FUNCTION__,__LINE__); + SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line %d]\n",__FILE__,__FUNCTION__,__LINE__); - returnToParentMenu(); + returnToParentMenu(); + } + else if(buttonPlayNow.mouseClick(x,y) && buttonPlayNow.getEnabled()) { + SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line %d]\n",__FILE__,__FUNCTION__,__LINE__); + + PlayNow(); + + SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line %d]\n",__FILE__,__FUNCTION__,__LINE__); + } + else if(buttonRestoreLastSettings.mouseClick(x,y) && buttonRestoreLastSettings.getEnabled()) { + RestoreLastGameSettings(); + } + else if(listBoxMap.mouseClick(x, y)){ + SystemFlags::OutputDebug(SystemFlags::debugSystem,"%s\n", getCurrentMapFile().c_str()); + + MutexSafeWrapper safeMutex(&masterServerThreadAccessor); + + loadMapInfo(Map::getMapPath(getCurrentMapFile(),"",false), &mapInfo, true); + labelMapInfo.setText(mapInfo.desc); + updateControlers(); + updateNetworkSlots(); + + if(listBoxPublishServer.getSelectedItemIndex() == 0) { + needToRepublishToMasterserver = true; + } + + if(hasNetworkGameSettings() == true) + { + needToSetChangedGameSettings = true; + lastSetChangedGameSettings = time(NULL); + } + } + else if (listBoxAdvanced.getSelectedItemIndex() == 1 && listBoxFogOfWar.mouseClick(x, y)) { + MutexSafeWrapper safeMutex(&masterServerThreadAccessor); + + if(listBoxPublishServer.getSelectedItemIndex() == 0) { + needToRepublishToMasterserver = true; + } + + if(hasNetworkGameSettings() == true) + { + needToSetChangedGameSettings = true; + lastSetChangedGameSettings = time(NULL); + } + } + else if (listBoxAdvanced.getSelectedItemIndex() == 1 && listBoxAllowObservers.mouseClick(x, y)) { + MutexSafeWrapper safeMutex(&masterServerThreadAccessor); + + if(listBoxPublishServer.getSelectedItemIndex() == 0) { + needToRepublishToMasterserver = true; + } + + reloadFactions(true); + + if(hasNetworkGameSettings() == true) { + needToSetChangedGameSettings = true; + lastSetChangedGameSettings = time(NULL); + } + } + else if (listBoxAdvanced.getSelectedItemIndex() == 1 && listBoxEnableObserverMode.mouseClick(x, y)) { + MutexSafeWrapper safeMutex(&masterServerThreadAccessor); + + if(listBoxPublishServer.getSelectedItemIndex() == 0) { + needToRepublishToMasterserver = true; + } + + if(hasNetworkGameSettings() == true) + { + needToSetChangedGameSettings = true; + lastSetChangedGameSettings = time(NULL); + } + } + else if (listBoxAdvanced.getSelectedItemIndex() == 1 && listBoxPathFinderType.mouseClick(x, y)) { + MutexSafeWrapper safeMutex(&masterServerThreadAccessor); + + if(listBoxPublishServer.getSelectedItemIndex() == 0) { + needToRepublishToMasterserver = true; + } + + if(hasNetworkGameSettings() == true) + { + needToSetChangedGameSettings = true; + lastSetChangedGameSettings = time(NULL); + } + } + else if (listBoxAdvanced.mouseClick(x, y)) { + //TODO + } + /* + else if (listBoxAdvanced.getSelectedItemIndex() == 1 && listBoxEnableServerControlledAI.mouseClick(x, y) && listBoxEnableServerControlledAI.getEditable()) { + MutexSafeWrapper safeMutex(&masterServerThreadAccessor); + needToRepublishToMasterserver = true; + + if(hasNetworkGameSettings() == true) + { + needToSetChangedGameSettings = true; + lastSetChangedGameSettings = time(NULL); + } + } + */ + else if(listBoxTileset.mouseClick(x, y)){ + MutexSafeWrapper safeMutex(&masterServerThreadAccessor); + + if(listBoxPublishServer.getSelectedItemIndex() == 0) { + needToRepublishToMasterserver = true; + } + if(hasNetworkGameSettings() == true) + { + needToSetChangedGameSettings = true; + lastSetChangedGameSettings = time(NULL); + } + } + else if(listBoxMapFilter.mouseClick(x, y)){ + MutexSafeWrapper safeMutex(&masterServerThreadAccessor); + switchToNextMapGroup(listBoxMapFilter.getSelectedItemIndex()-oldListBoxMapfilterIndex); + SystemFlags::OutputDebug(SystemFlags::debugSystem,"%s\n", getCurrentMapFile().c_str()); + + loadMapInfo(Map::getMapPath(getCurrentMapFile()), &mapInfo, true); + labelMapInfo.setText(mapInfo.desc); + updateControlers(); + updateNetworkSlots(); + + if(listBoxPublishServer.getSelectedItemIndex() == 0) { + needToRepublishToMasterserver = true; + } + + if(hasNetworkGameSettings() == true) + { + needToSetChangedGameSettings = true; + lastSetChangedGameSettings = time(NULL); + } + } + else if(listBoxTechTree.mouseClick(x, y)){ + reloadFactions(false); + + MutexSafeWrapper safeMutex(&masterServerThreadAccessor); + + if(listBoxPublishServer.getSelectedItemIndex() == 0) { + needToRepublishToMasterserver = true; + } + + if(hasNetworkGameSettings() == true) + { + needToSetChangedGameSettings = true; + lastSetChangedGameSettings = time(NULL); + } + } + else if(listBoxPublishServer.mouseClick(x, y) && listBoxPublishServer.getEditable()) { + MutexSafeWrapper safeMutex(&masterServerThreadAccessor); + needToRepublishToMasterserver = true; + soundRenderer.playFx(coreData.getClickSoundC()); + } + /* + else if(listBoxAdvanced.getSelectedItemIndex() == 1 && listBoxNetworkFramePeriod.mouseClick(x, y)){ + MutexSafeWrapper safeMutex(&masterServerThreadAccessor); + needToRepublishToMasterserver = true; + if(hasNetworkGameSettings() == true) + { + needToSetChangedGameSettings = true; + lastSetChangedGameSettings = time(NULL); + } + + soundRenderer.playFx(coreData.getClickSoundC()); + } + */ + else if(listBoxAdvanced.getSelectedItemIndex() == 1 && listBoxNetworkPauseGameForLaggedClients.mouseClick(x, y)){ + MutexSafeWrapper safeMutex(&masterServerThreadAccessor); + + if(listBoxPublishServer.getSelectedItemIndex() == 0) { + needToRepublishToMasterserver = true; + } + if(hasNetworkGameSettings() == true) + { + needToSetChangedGameSettings = true; + lastSetChangedGameSettings = time(NULL); + } + + soundRenderer.playFx(coreData.getClickSoundC()); + } + else { + for(int i=0; i(listBoxControls[j].getSelectedItemIndex()); + if(ct == ctHuman) { + if(humanIndex1 == -1) { + humanIndex1= j; + } + else { + humanIndex2= j; + } + } + } + + SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line %d] humanIndex1 = %d, humanIndex2 = %d\n",__FILE__,__FUNCTION__,__LINE__,humanIndex1,humanIndex2); + + //no human + if(humanIndex1 == -1 && humanIndex2 == -1) { + listBoxControls[i].setSelectedItemIndex(ctHuman); + //labelPlayerNames[i].setText(""); + //labelPlayerNames[i].setText(getHumanPlayerName()); + + SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line %d] i = %d, labelPlayerNames[i].getText() [%s]\n",__FILE__,__FUNCTION__,__LINE__,i,labelPlayerNames[i].getText().c_str()); + } + //2 humans + else if(humanIndex1 != -1 && humanIndex2 != -1) { + int closeSlotIndex = (humanIndex1 == i ? humanIndex2: humanIndex1); + int humanSlotIndex = (closeSlotIndex == humanIndex1 ? humanIndex2 : humanIndex1); + + string origPlayName = labelPlayerNames[closeSlotIndex].getText(); + + SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line %d] closeSlotIndex = %d, origPlayName [%s]\n",__FILE__,__FUNCTION__,__LINE__,closeSlotIndex,origPlayName.c_str()); + + listBoxControls[closeSlotIndex].setSelectedItemIndex(ctClosed); + //labelPlayerNames[closeSlotIndex].setText(""); + + labelPlayerNames[humanSlotIndex].setText((origPlayName != "" ? origPlayName : getHumanPlayerName())); + } + updateNetworkSlots(); + + if(listBoxPublishServer.getSelectedItemIndex() == 0) { + needToRepublishToMasterserver = true; + } + + if(hasNetworkGameSettings() == true) { + needToSetChangedGameSettings = true; + lastSetChangedGameSettings = time(NULL); + } + updateResourceMultiplier(i); + } + else if(listBoxFactions[i].mouseClick(x, y)) { + + if(listBoxPublishServer.getSelectedItemIndex() == 0) { + needToRepublishToMasterserver = true; + } + + if(hasNetworkGameSettings() == true) + { + needToSetChangedGameSettings = true; + lastSetChangedGameSettings = time(NULL); + } + } + else if(listBoxTeams[i].mouseClick(x, y)) + { + if(factionFiles[listBoxFactions[i].getSelectedItemIndex()] != formatString(GameConstants::OBSERVER_SLOTNAME)) { + //printf("i = %d factionFiles[listBoxFactions[i].getSelectedItemIndex()] [%s] listBoxTeams[i].getSelectedItemIndex() = %d, lastSelectedTeamIndex[i] = %d\n",i,factionFiles[listBoxFactions[i].getSelectedItemIndex()].c_str(),listBoxTeams[i].getSelectedItemIndex(),lastSelectedTeamIndex[i]); + if(listBoxTeams[i].getSelectedItemIndex() + 1 != (GameConstants::maxPlayers + fpt_Observer)) { + lastSelectedTeamIndex[i] = listBoxTeams[i].getSelectedItemIndex(); + } + } + else { + lastSelectedTeamIndex[i] = -1; + } + + if(listBoxPublishServer.getSelectedItemIndex() == 0) { + needToRepublishToMasterserver = true; + } + + if(hasNetworkGameSettings() == true) + { + needToSetChangedGameSettings = true; + lastSetChangedGameSettings = time(NULL);; + } + } + else if(labelPlayerNames[i].mouseClick(x, y)) { + SetActivePlayerNameEditor(); + } + } + } } - else if(buttonPlayNow.mouseClick(x,y) && buttonPlayNow.getEnabled()) { - SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line %d]\n",__FILE__,__FUNCTION__,__LINE__); - - PlayNow(); - - SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line %d]\n",__FILE__,__FUNCTION__,__LINE__); - } - else if(buttonRestoreLastSettings.mouseClick(x,y) && buttonRestoreLastSettings.getEnabled()) { - RestoreLastGameSettings(); - } - else if(listBoxMap.mouseClick(x, y)){ - SystemFlags::OutputDebug(SystemFlags::debugSystem,"%s\n", getCurrentMapFile().c_str()); - - MutexSafeWrapper safeMutex(&masterServerThreadAccessor); - - loadMapInfo(Map::getMapPath(getCurrentMapFile(),"",false), &mapInfo, true); - labelMapInfo.setText(mapInfo.desc); - updateControlers(); - updateNetworkSlots(); - - if(listBoxPublishServer.getSelectedItemIndex() == 0) { - needToRepublishToMasterserver = true; - } - - if(hasNetworkGameSettings() == true) - { - needToSetChangedGameSettings = true; - lastSetChangedGameSettings = time(NULL); - } - } - else if (listBoxAdvanced.getSelectedItemIndex() == 1 && listBoxFogOfWar.mouseClick(x, y)) { - MutexSafeWrapper safeMutex(&masterServerThreadAccessor); - - if(listBoxPublishServer.getSelectedItemIndex() == 0) { - needToRepublishToMasterserver = true; - } - - if(hasNetworkGameSettings() == true) - { - needToSetChangedGameSettings = true; - lastSetChangedGameSettings = time(NULL); - } - } - else if (listBoxAdvanced.getSelectedItemIndex() == 1 && listBoxAllowObservers.mouseClick(x, y)) { - MutexSafeWrapper safeMutex(&masterServerThreadAccessor); - - if(listBoxPublishServer.getSelectedItemIndex() == 0) { - needToRepublishToMasterserver = true; - } - - reloadFactions(true); - - if(hasNetworkGameSettings() == true) { - needToSetChangedGameSettings = true; - lastSetChangedGameSettings = time(NULL); - } - } - else if (listBoxAdvanced.getSelectedItemIndex() == 1 && listBoxEnableObserverMode.mouseClick(x, y)) { - MutexSafeWrapper safeMutex(&masterServerThreadAccessor); - - if(listBoxPublishServer.getSelectedItemIndex() == 0) { - needToRepublishToMasterserver = true; - } - - if(hasNetworkGameSettings() == true) - { - needToSetChangedGameSettings = true; - lastSetChangedGameSettings = time(NULL); - } - } - else if (listBoxAdvanced.getSelectedItemIndex() == 1 && listBoxPathFinderType.mouseClick(x, y)) { - MutexSafeWrapper safeMutex(&masterServerThreadAccessor); - - if(listBoxPublishServer.getSelectedItemIndex() == 0) { - needToRepublishToMasterserver = true; - } - - if(hasNetworkGameSettings() == true) - { - needToSetChangedGameSettings = true; - lastSetChangedGameSettings = time(NULL); - } - } - else if (listBoxAdvanced.mouseClick(x, y)) { - //TODO - } -/* - else if (listBoxAdvanced.getSelectedItemIndex() == 1 && listBoxEnableServerControlledAI.mouseClick(x, y) && listBoxEnableServerControlledAI.getEditable()) { - MutexSafeWrapper safeMutex(&masterServerThreadAccessor); - needToRepublishToMasterserver = true; - - if(hasNetworkGameSettings() == true) - { - needToSetChangedGameSettings = true; - lastSetChangedGameSettings = time(NULL); - } - } -*/ - else if(listBoxTileset.mouseClick(x, y)){ - MutexSafeWrapper safeMutex(&masterServerThreadAccessor); - - if(listBoxPublishServer.getSelectedItemIndex() == 0) { - needToRepublishToMasterserver = true; - } - if(hasNetworkGameSettings() == true) - { - needToSetChangedGameSettings = true; - lastSetChangedGameSettings = time(NULL); - } - } - else if(listBoxMapFilter.mouseClick(x, y)){ - MutexSafeWrapper safeMutex(&masterServerThreadAccessor); - switchToNextMapGroup(listBoxMapFilter.getSelectedItemIndex()-oldListBoxMapfilterIndex); - SystemFlags::OutputDebug(SystemFlags::debugSystem,"%s\n", getCurrentMapFile().c_str()); - - loadMapInfo(Map::getMapPath(getCurrentMapFile()), &mapInfo, true); - labelMapInfo.setText(mapInfo.desc); - updateControlers(); - updateNetworkSlots(); - - if(listBoxPublishServer.getSelectedItemIndex() == 0) { - needToRepublishToMasterserver = true; - } - - if(hasNetworkGameSettings() == true) - { - needToSetChangedGameSettings = true; - lastSetChangedGameSettings = time(NULL); - } - } - else if(listBoxTechTree.mouseClick(x, y)){ - reloadFactions(false); - - MutexSafeWrapper safeMutex(&masterServerThreadAccessor); - - if(listBoxPublishServer.getSelectedItemIndex() == 0) { - needToRepublishToMasterserver = true; - } - - if(hasNetworkGameSettings() == true) - { - needToSetChangedGameSettings = true; - lastSetChangedGameSettings = time(NULL); - } - } - else if(listBoxPublishServer.mouseClick(x, y) && listBoxPublishServer.getEditable()) { - MutexSafeWrapper safeMutex(&masterServerThreadAccessor); - needToRepublishToMasterserver = true; - soundRenderer.playFx(coreData.getClickSoundC()); - } -/* - else if(listBoxAdvanced.getSelectedItemIndex() == 1 && listBoxNetworkFramePeriod.mouseClick(x, y)){ - MutexSafeWrapper safeMutex(&masterServerThreadAccessor); - needToRepublishToMasterserver = true; - if(hasNetworkGameSettings() == true) - { - needToSetChangedGameSettings = true; - lastSetChangedGameSettings = time(NULL); - } - - soundRenderer.playFx(coreData.getClickSoundC()); - } -*/ - else if(listBoxAdvanced.getSelectedItemIndex() == 1 && listBoxNetworkPauseGameForLaggedClients.mouseClick(x, y)){ - MutexSafeWrapper safeMutex(&masterServerThreadAccessor); - - if(listBoxPublishServer.getSelectedItemIndex() == 0) { - needToRepublishToMasterserver = true; - } - if(hasNetworkGameSettings() == true) - { - needToSetChangedGameSettings = true; - lastSetChangedGameSettings = time(NULL); - } - - soundRenderer.playFx(coreData.getClickSoundC()); - } - else { - for(int i=0; i(listBoxControls[j].getSelectedItemIndex()); - if(ct == ctHuman) { - if(humanIndex1 == -1) { - humanIndex1= j; - } - else { - humanIndex2= j; - } - } - } - - SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line %d] humanIndex1 = %d, humanIndex2 = %d\n",__FILE__,__FUNCTION__,__LINE__,humanIndex1,humanIndex2); - - //no human - if(humanIndex1 == -1 && humanIndex2 == -1) { - listBoxControls[i].setSelectedItemIndex(ctHuman); - //labelPlayerNames[i].setText(""); - //labelPlayerNames[i].setText(getHumanPlayerName()); - - SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line %d] i = %d, labelPlayerNames[i].getText() [%s]\n",__FILE__,__FUNCTION__,__LINE__,i,labelPlayerNames[i].getText().c_str()); - } - //2 humans - else if(humanIndex1 != -1 && humanIndex2 != -1) { - int closeSlotIndex = (humanIndex1 == i ? humanIndex2: humanIndex1); - int humanSlotIndex = (closeSlotIndex == humanIndex1 ? humanIndex2 : humanIndex1); - - string origPlayName = labelPlayerNames[closeSlotIndex].getText(); - - SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line %d] closeSlotIndex = %d, origPlayName [%s]\n",__FILE__,__FUNCTION__,__LINE__,closeSlotIndex,origPlayName.c_str()); - - listBoxControls[closeSlotIndex].setSelectedItemIndex(ctClosed); - //labelPlayerNames[closeSlotIndex].setText(""); - - labelPlayerNames[humanSlotIndex].setText((origPlayName != "" ? origPlayName : getHumanPlayerName())); - } - updateNetworkSlots(); - - if(listBoxPublishServer.getSelectedItemIndex() == 0) { - needToRepublishToMasterserver = true; - } - - if(hasNetworkGameSettings() == true) { - needToSetChangedGameSettings = true; - lastSetChangedGameSettings = time(NULL); - } - updateResourceMultiplier(i); - } - else if(listBoxFactions[i].mouseClick(x, y)) { - - if(listBoxPublishServer.getSelectedItemIndex() == 0) { - needToRepublishToMasterserver = true; - } - - if(hasNetworkGameSettings() == true) - { - needToSetChangedGameSettings = true; - lastSetChangedGameSettings = time(NULL); - } - } - else if(listBoxTeams[i].mouseClick(x, y)) - { - if(factionFiles[listBoxFactions[i].getSelectedItemIndex()] != formatString(GameConstants::OBSERVER_SLOTNAME)) { - //printf("i = %d factionFiles[listBoxFactions[i].getSelectedItemIndex()] [%s] listBoxTeams[i].getSelectedItemIndex() = %d, lastSelectedTeamIndex[i] = %d\n",i,factionFiles[listBoxFactions[i].getSelectedItemIndex()].c_str(),listBoxTeams[i].getSelectedItemIndex(),lastSelectedTeamIndex[i]); - if(listBoxTeams[i].getSelectedItemIndex() + 1 != (GameConstants::maxPlayers + fpt_Observer)) { - lastSelectedTeamIndex[i] = listBoxTeams[i].getSelectedItemIndex(); - } - } - else { - lastSelectedTeamIndex[i] = -1; - } - - if(listBoxPublishServer.getSelectedItemIndex() == 0) { - needToRepublishToMasterserver = true; - } - - if(hasNetworkGameSettings() == true) - { - needToSetChangedGameSettings = true; - lastSetChangedGameSettings = time(NULL);; - } - } - else if(labelPlayerNames[i].mouseClick(x, y)) { - SetActivePlayerNameEditor(); - } - } + catch(const std::exception &ex) { + char szBuf[4096]=""; + sprintf(szBuf,"In [%s::%s %d] Error detected:\n%s\n",__FILE__,__FUNCTION__,__LINE__,ex.what()); + SystemFlags::OutputDebug(SystemFlags::debugError,szBuf); + SystemFlags::OutputDebug(SystemFlags::debugSystem,"%s",szBuf); + //throw runtime_error(szBuf); + showGeneralError=true; + generalErrorToShow = szBuf; } SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line %d]\n",__FILE__,__FUNCTION__,__LINE__); @@ -1356,8 +1369,8 @@ void MenuStateCustomGame::render() { renderer.renderConsole(&console,showFullConsole,true); } catch(const std::exception &ex) { - char szBuf[1024]=""; - sprintf(szBuf,"In [%s::%s %d] error [%s]\n",__FILE__,__FUNCTION__,__LINE__,ex.what()); + char szBuf[4096]=""; + sprintf(szBuf,"In [%s::%s %d] Error detected:\n%s\n",__FILE__,__FUNCTION__,__LINE__,ex.what()); throw runtime_error(szBuf); } } @@ -1770,8 +1783,8 @@ void MenuStateCustomGame::update() { } } catch(const std::exception &ex) { - char szBuf[1024]=""; - sprintf(szBuf,"In [%s::%s %d] error [%s]\n",__FILE__,__FUNCTION__,__LINE__,ex.what()); + char szBuf[4096]=""; + sprintf(szBuf,"In [%s::%s %d] Error detected:\n%s\n",__FILE__,__FUNCTION__,__LINE__,ex.what()); SystemFlags::OutputDebug(SystemFlags::debugError,szBuf); SystemFlags::OutputDebug(SystemFlags::debugSystem,"%s",szBuf); //throw runtime_error(szBuf); @@ -1841,120 +1854,131 @@ void MenuStateCustomGame::publishToMasterserver() void MenuStateCustomGame::simpleTask() { - if(publishToMasterserverThreadInDeletion == true) { - return; - } + try { + if(publishToMasterserverThreadInDeletion == true) { + return; + } - if( publishToMasterserverThread == NULL || - publishToMasterserverThread->getQuitStatus() == true) { - return; - } + if( publishToMasterserverThread == NULL || + publishToMasterserverThread->getQuitStatus() == true) { + return; + } - //SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line %d]\n",__FILE__,__FUNCTION__,__LINE__); - MutexSafeWrapper safeMutex(&masterServerThreadAccessor); - bool republish = (needToRepublishToMasterserver == true && publishToServerInfo.size() != 0); - needToRepublishToMasterserver = false; - std::map newPublishToServerInfo = publishToServerInfo; - publishToServerInfo.clear(); + //SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line %d]\n",__FILE__,__FUNCTION__,__LINE__); + MutexSafeWrapper safeMutex(&masterServerThreadAccessor); + bool republish = (needToRepublishToMasterserver == true && publishToServerInfo.size() != 0); + needToRepublishToMasterserver = false; + std::map newPublishToServerInfo = publishToServerInfo; + publishToServerInfo.clear(); - bool broadCastSettings = needToBroadcastServerSettings; - needToBroadcastServerSettings=false; + bool broadCastSettings = needToBroadcastServerSettings; + needToBroadcastServerSettings=false; - bool hasClientConnection = false; - if(broadCastSettings) { - ServerInterface* serverInterface= NetworkManager::getInstance().getServerInterface(); - hasClientConnection = serverInterface->hasClientConnection(); - } + bool hasClientConnection = false; + if(broadCastSettings) { + ServerInterface* serverInterface= NetworkManager::getInstance().getServerInterface(); + hasClientConnection = serverInterface->hasClientConnection(); + } - bool needPing = (difftime(time(NULL),lastNetworkPing) >= GameConstants::networkPingInterval); - safeMutex.ReleaseLock(); + bool needPing = (difftime(time(NULL),lastNetworkPing) >= GameConstants::networkPingInterval); + safeMutex.ReleaseLock(); - if( publishToMasterserverThread == NULL || - publishToMasterserverThread->getQuitStatus() == true) { - return; - } + if( publishToMasterserverThread == NULL || + publishToMasterserverThread->getQuitStatus() == true) { + return; + } - if(republish == true) { - SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line %d]\n",__FILE__,__FUNCTION__,__LINE__); + if(republish == true) { + SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line %d]\n",__FILE__,__FUNCTION__,__LINE__); - //string request = Config::getInstance().getString("Masterserver") + "addServerInfo.php?" + newPublishToServerInfo; - string request = Config::getInstance().getString("Masterserver") + "addServerInfo.php?"; + //string request = Config::getInstance().getString("Masterserver") + "addServerInfo.php?" + newPublishToServerInfo; + string request = Config::getInstance().getString("Masterserver") + "addServerInfo.php?"; - CURL *handle = SystemFlags::initHTTP(); - for(std::map::const_iterator iterMap = newPublishToServerInfo.begin(); - iterMap != newPublishToServerInfo.end(); iterMap++) { + CURL *handle = SystemFlags::initHTTP(); + for(std::map::const_iterator iterMap = newPublishToServerInfo.begin(); + iterMap != newPublishToServerInfo.end(); iterMap++) { - request += iterMap->first; - request += "="; - request += SystemFlags::escapeURL(iterMap->second,handle); - request += "&"; - } + request += iterMap->first; + request += "="; + request += SystemFlags::escapeURL(iterMap->second,handle); + request += "&"; + } - //printf("the request is:\n%s\n",request.c_str()); - SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line %d] the request is:\n%s\n",__FILE__,__FUNCTION__,__LINE__,request.c_str()); + //printf("the request is:\n%s\n",request.c_str()); + SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line %d] the request is:\n%s\n",__FILE__,__FUNCTION__,__LINE__,request.c_str()); - std::string serverInfo = SystemFlags::getHTTP(request,handle); - SystemFlags::cleanupHTTP(&handle); + std::string serverInfo = SystemFlags::getHTTP(request,handle); + SystemFlags::cleanupHTTP(&handle); - //printf("the result is:\n'%s'\n",serverInfo.c_str()); - SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line %d] the result is:\n'%s'\n",__FILE__,__FUNCTION__,__LINE__,serverInfo.c_str()); + //printf("the result is:\n'%s'\n",serverInfo.c_str()); + SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line %d] the result is:\n'%s'\n",__FILE__,__FUNCTION__,__LINE__,serverInfo.c_str()); - // uncomment to enable router setup check of this server - if(EndsWith(serverInfo, "OK") == false) { - showMasterserverError=true; - masterServererErrorToShow = (serverInfo != "" ? serverInfo : "No Reply"); - } - } + // uncomment to enable router setup check of this server + if(EndsWith(serverInfo, "OK") == false) { + showMasterserverError=true; + masterServererErrorToShow = (serverInfo != "" ? serverInfo : "No Reply"); + } + } - SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line %d]\n",__FILE__,__FUNCTION__,__LINE__); + SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line %d]\n",__FILE__,__FUNCTION__,__LINE__); - if( publishToMasterserverThread == NULL || - publishToMasterserverThread->getQuitStatus() == true) { - return; - } + if( publishToMasterserverThread == NULL || + publishToMasterserverThread->getQuitStatus() == true) { + return; + } - if(broadCastSettings) { - SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line %d]\n",__FILE__,__FUNCTION__,__LINE__); + if(broadCastSettings) { + SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line %d]\n",__FILE__,__FUNCTION__,__LINE__); - ServerInterface* serverInterface= NetworkManager::getInstance().getServerInterface(); + ServerInterface* serverInterface= NetworkManager::getInstance().getServerInterface(); - SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line %d]\n",__FILE__,__FUNCTION__,__LINE__); + SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line %d]\n",__FILE__,__FUNCTION__,__LINE__); - MutexSafeWrapper safeMutex2(&masterServerThreadAccessor); - GameSettings gameSettings; - loadGameSettings(&gameSettings); + MutexSafeWrapper safeMutex2(&masterServerThreadAccessor); + GameSettings gameSettings; + loadGameSettings(&gameSettings); - SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line %d]\n",__FILE__,__FUNCTION__,__LINE__); - serverInterface->setGameSettings(&gameSettings,false); - safeMutex2.ReleaseLock(); + SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line %d]\n",__FILE__,__FUNCTION__,__LINE__); + serverInterface->setGameSettings(&gameSettings,false); + safeMutex2.ReleaseLock(); - if(hasClientConnection == true) { - SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line %d]\n",__FILE__,__FUNCTION__,__LINE__); + if(hasClientConnection == true) { + SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line %d]\n",__FILE__,__FUNCTION__,__LINE__); - MutexSafeWrapper safeMutex3(&masterServerThreadAccessor); + MutexSafeWrapper safeMutex3(&masterServerThreadAccessor); - SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line %d]\n",__FILE__,__FUNCTION__,__LINE__); + SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line %d]\n",__FILE__,__FUNCTION__,__LINE__); - serverInterface->broadcastGameSetup(&gameSettings); - safeMutex3.ReleaseLock(); - } - } + serverInterface->broadcastGameSetup(&gameSettings); + safeMutex3.ReleaseLock(); + } + } - if( publishToMasterserverThread == NULL || - publishToMasterserverThread->getQuitStatus() == true) { - return; - } + if( publishToMasterserverThread == NULL || + publishToMasterserverThread->getQuitStatus() == true) { + return; + } - if(needPing == true) { - lastNetworkPing = time(NULL); + if(needPing == true) { + lastNetworkPing = time(NULL); - SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line %d] Sending nmtPing to clients\n",__FILE__,__FUNCTION__,__LINE__); - ServerInterface* serverInterface= NetworkManager::getInstance().getServerInterface(); - NetworkMessagePing msg(GameConstants::networkPingInterval,time(NULL)); + SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line %d] Sending nmtPing to clients\n",__FILE__,__FUNCTION__,__LINE__); + ServerInterface* serverInterface= NetworkManager::getInstance().getServerInterface(); + NetworkMessagePing msg(GameConstants::networkPingInterval,time(NULL)); - MutexSafeWrapper safeMutex2(&masterServerThreadAccessor); - serverInterface->broadcastPing(&msg); - safeMutex2.ReleaseLock(); + MutexSafeWrapper safeMutex2(&masterServerThreadAccessor); + serverInterface->broadcastPing(&msg); + safeMutex2.ReleaseLock(); + } + } + catch(const std::exception &ex) { + char szBuf[4096]=""; + sprintf(szBuf,"In [%s::%s %d] Error detected:\n%s\n",__FILE__,__FUNCTION__,__LINE__,ex.what()); + SystemFlags::OutputDebug(SystemFlags::debugError,szBuf); + SystemFlags::OutputDebug(SystemFlags::debugSystem,"%s",szBuf); + //throw runtime_error(szBuf);!!! + showGeneralError=true; + generalErrorToShow = ex.what(); } SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line %d]\n",__FILE__,__FUNCTION__,__LINE__); @@ -2361,8 +2385,8 @@ bool MenuStateCustomGame::hasNetworkGameSettings() { } } catch(const std::exception &ex) { - char szBuf[1024]=""; - sprintf(szBuf,"In [%s::%s Line: %d] error [%s]\n",__FILE__,__FUNCTION__,__LINE__,ex.what()); + char szBuf[4096]=""; + sprintf(szBuf,"In [%s::%s %d] Error detected:\n%s\n",__FILE__,__FUNCTION__,__LINE__,ex.what()); SystemFlags::OutputDebug(SystemFlags::debugError,"In [%s::%s Line: %d] Error [%s]\n",__FILE__,__FUNCTION__,__LINE__,ex.what()); SystemFlags::OutputDebug(SystemFlags::debugSystem,"%s",szBuf); showGeneralError=true; @@ -2445,7 +2469,9 @@ void MenuStateCustomGame::reloadFactions(bool keepExistingSelectedItem) { } if(results.size() == 0) { - throw runtime_error("(2)There are no factions for the tech tree [" + techTreeFiles[listBoxTechTree.getSelectedItemIndex()] + "]"); + //throw runtime_error("(2)There are no factions for the tech tree [" + techTreeFiles[listBoxTechTree.getSelectedItemIndex()] + "]"); + showGeneralError=true; + generalErrorToShow = "[#2] There are no factions for the tech tree [" + techTreeFiles[listBoxTechTree.getSelectedItemIndex()] + "]"; } results.push_back(formatString(GameConstants::RANDOMFACTION_SLOTNAME)); @@ -2512,8 +2538,8 @@ void MenuStateCustomGame::updateControlers(){ } } catch(const std::exception &ex) { - char szBuf[1024]=""; - sprintf(szBuf,"In [%s::%s Line: %d] error [%s]\n",__FILE__,__FUNCTION__,__LINE__,ex.what()); + char szBuf[4096]=""; + sprintf(szBuf,"In [%s::%s %d] Error detected:\n%s\n",__FILE__,__FUNCTION__,__LINE__,ex.what()); SystemFlags::OutputDebug(SystemFlags::debugError,szBuf); throw runtime_error(szBuf); } @@ -2533,8 +2559,8 @@ void MenuStateCustomGame::closeUnusedSlots(){ updateNetworkSlots(); } catch(const std::exception &ex) { - char szBuf[1024]=""; - sprintf(szBuf,"In [%s::%s Line: %d] error [%s]\n",__FILE__,__FUNCTION__,__LINE__,ex.what()); + char szBuf[4096]=""; + sprintf(szBuf,"In [%s::%s %d] Error detected:\n%s\n",__FILE__,__FUNCTION__,__LINE__,ex.what()); SystemFlags::OutputDebug(SystemFlags::debugError,szBuf); throw runtime_error(szBuf); } @@ -2562,8 +2588,8 @@ void MenuStateCustomGame::updateNetworkSlots() { serverInterface->addSlot(i); } catch(const std::exception &ex) { - char szBuf[1024]=""; - sprintf(szBuf,"In [%s::%s %d] error [%s]\n",__FILE__,__FUNCTION__,__LINE__,ex.what()); + char szBuf[4096]=""; + sprintf(szBuf,"In [%s::%s %d] Error detected:\n%s\n",__FILE__,__FUNCTION__,__LINE__,ex.what()); SystemFlags::OutputDebug(SystemFlags::debugError,szBuf); SystemFlags::OutputDebug(SystemFlags::debugSystem,"%s",szBuf); showGeneralError=true; @@ -2585,8 +2611,8 @@ void MenuStateCustomGame::updateNetworkSlots() { } } catch(const std::exception &ex) { - char szBuf[1024]=""; - sprintf(szBuf,"In [%s::%s Line: %d] error [%s]\n",__FILE__,__FUNCTION__,__LINE__,ex.what()); + char szBuf[4096]=""; + sprintf(szBuf,"In [%s::%s %d] Error detected:\n%s\n",__FILE__,__FUNCTION__,__LINE__,ex.what()); SystemFlags::OutputDebug(SystemFlags::debugError,szBuf); SystemFlags::OutputDebug(SystemFlags::debugSystem,"%s",szBuf); //throw runtime_error(szBuf);!!! diff --git a/source/glest_game/network/client_interface.cpp b/source/glest_game/network/client_interface.cpp index b5caa5fe8..80b9fa2c6 100755 --- a/source/glest_game/network/client_interface.cpp +++ b/source/glest_game/network/client_interface.cpp @@ -535,9 +535,7 @@ void ClientInterface::updateKeyframe(int frameCount) { NetworkMessageCommandList networkMessageCommandList; while(receiveMessage(&networkMessageCommandList) == false && isConnected() == true && - difftime(time(NULL),receiveTimeElapsed) <= (messageWaitTimeout / 1000)) { - //sleep(waitSleepTime); - //sleep(0); + difftime(time(NULL),receiveTimeElapsed) <= (messageWaitTimeout / 2000)) { waitCount++; } @@ -585,11 +583,9 @@ void ClientInterface::updateKeyframe(int frameCount) { { time_t receiveTimeElapsed = time(NULL); NetworkMessageQuit networkMessageQuit; - //if(receiveMessage(&networkMessageQuit)) { while(receiveMessage(&networkMessageQuit) == false && isConnected() == true && - difftime(time(NULL),receiveTimeElapsed) <= (messageWaitTimeout / 1000)) { - //sleep(0); + difftime(time(NULL),receiveTimeElapsed) <= (messageWaitTimeout / 2000)) { } quit= true; done= true; @@ -603,7 +599,6 @@ void ClientInterface::updateKeyframe(int frameCount) { while(receiveMessage(&networkMessageText) == false && isConnected() == true && difftime(time(NULL),receiveTimeElapsed) <= (messageWaitTimeout / 1000)) { - //sleep(0); } ChatMsgInfo msg(networkMessageText.getText().c_str(),networkMessageText.getTeamIndex(),networkMessageText.getPlayerIndex()); diff --git a/source/glest_game/network/connection_slot.cpp b/source/glest_game/network/connection_slot.cpp index c05a8489d..bf7c42fcb 100644 --- a/source/glest_game/network/connection_slot.cpp +++ b/source/glest_game/network/connection_slot.cpp @@ -344,8 +344,8 @@ void ConnectionSlot::update(bool checkForNewClients) { lastReceiveCommandListTime = time(NULL); SystemFlags::OutputDebug(SystemFlags::debugNetwork,"In [%s::%s Line: %d] currentFrameCount = %d\n",__FILE__,__FUNCTION__,__LINE__,currentFrameCount); - for(int i= 0; igetDataToRead() < totalMsgSize) { SystemFlags::OutputDebug(SystemFlags::debugNetwork,"In [%s::%s Line: %d] ERROR / WARNING!!! Insufficient data to read entire command list [need %d bytes, only %d available].\n", __FILE__,__FUNCTION__,__LINE__, totalMsgSize, socket->getDataToRead()); + SystemFlags::OutputDebug(SystemFlags::debugError,"In [%s::%s Line: %d] ERROR / WARNING!!! Insufficient data to read entire command list [need %d bytes, only %d available].\n", + __FILE__,__FUNCTION__,__LINE__, totalMsgSize, socket->getDataToRead()); + return false; } bool result = NetworkMessage::receive(socket, &data, totalMsgSize); @@ -374,7 +382,7 @@ bool NetworkMessageCommandList::receive(Socket* socket) { return result; } -void NetworkMessageCommandList::send(Socket* socket) const{ +void NetworkMessageCommandList::send(Socket* socket) const { SystemFlags::OutputDebug(SystemFlags::debugNetwork,"In [%s::%s Line: %d] nmtCommandList, frameCount = %d, data.header.commandCount = %d, data.header.messageType = %d\n",__FILE__,__FUNCTION__,__LINE__,data.header.frameCount,data.header.commandCount,data.header.messageType); assert(data.header.messageType==nmtCommandList); diff --git a/source/glest_game/network/network_message.h b/source/glest_game/network/network_message.h index dc1d4b4a8..2094b60fa 100644 --- a/source/glest_game/network/network_message.h +++ b/source/glest_game/network/network_message.h @@ -242,15 +242,12 @@ public: #pragma pack(push, 1) class NetworkMessageCommandList: public NetworkMessage{ private: - //static const int maxCommandCount= 16*4; - //static const int maxCommandCount = (16 * 4) * 2; - static const int maxCommandCount = 2048; // can be as large as 65535 + static const int maxCommandCount = 2496; // can be as large as 65535 private: struct DataHeader { int8 messageType; uint16 commandCount; - //int8 commandCount; int32 frameCount; }; diff --git a/source/glest_game/network/network_types.cpp b/source/glest_game/network/network_types.cpp index 745da2f11..859dcff52 100644 --- a/source/glest_game/network/network_types.cpp +++ b/source/glest_game/network/network_types.cpp @@ -54,7 +54,7 @@ NetworkCommand::NetworkCommand(World *world, int networkCommandType, int unitId, this->unitFactionIndex = unit->getFaction()->getIndex(); this->unitFactionUnitCount = unit->getFaction()->getUnitCount(); - const UnitType *unitType= world->findUnitTypeById(unit->getFaction()->getType(), this->unitTypeId); + //const UnitType *unitType= world->findUnitTypeById(unit->getFaction()->getType(), this->unitTypeId); const CommandType *ct = unit->getType()->findCommandTypeById(this->commandTypeId); if(ct != NULL && ct->getClass() == ccBuild) { SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d] %s\n",__FILE__,__FUNCTION__,__LINE__,toString().c_str()); @@ -63,6 +63,8 @@ NetworkCommand::NetworkCommand(World *world, int networkCommandType, int unitId, } } } + + SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d] Created NetworkCommand as follows:\n%s\n",__FILE__,__FUNCTION__,__LINE__,toString().c_str()); } void NetworkCommand::preprocessNetworkCommand(World *world) { @@ -71,7 +73,7 @@ void NetworkCommand::preprocessNetworkCommand(World *world) { //validate unit if(unit != NULL) { - const UnitType *unitType= world->findUnitTypeById(unit->getFaction()->getType(), unitTypeId); + //const UnitType *unitType= world->findUnitTypeById(unit->getFaction()->getType(), unitTypeId); const CommandType *ct = unit->getType()->findCommandTypeById(commandTypeId); if(ct != NULL && ct->getClass() == ccBuild && targetId >= 0) { CardinalDir::assertDirValid(targetId); @@ -94,16 +96,4 @@ string NetworkCommand::toString() const { return result; } -/* -NetworkCommand::NetworkCommand(int networkCommandType, NetworkCommandSubType ncstType, int unitId, int value1, int value2) { - this->networkCommandType= networkCommandType; - this->unitId= unitId; - this->commandTypeId= ncstType; - this->positionX= -1; - this->positionY= -1; - this->unitTypeId= value1; - this->targetId= value2; -} -*/ - }}//end namespace diff --git a/source/glest_game/network/network_types.h b/source/glest_game/network/network_types.h index e66c4bebf..3cc28560c 100644 --- a/source/glest_game/network/network_types.h +++ b/source/glest_game/network/network_types.h @@ -72,14 +72,14 @@ enum NetworkCommandType { //}; #pragma pack(push, 1) -class NetworkCommand{ +class NetworkCommand { private: int16 networkCommandType; int32 unitId; + int16 unitTypeId; int16 commandTypeId; int16 positionX; int16 positionY; - int16 unitTypeId; int32 targetId; int8 wantQueue; int8 fromFactionIndex; @@ -91,12 +91,12 @@ private: public: NetworkCommand(){}; NetworkCommand( - World *world, - int networkCommandType, - int unitId, - int commandTypeId= -1, - const Vec2i &pos= Vec2i(0), - int unitTypeId= -1, + World *world, + int networkCommandType, + int unitId, + int commandTypeId= -1, + const Vec2i &pos= Vec2i(0), + int unitTypeId= -1, int targetId= -1, int facing= -1, bool wantQueue = false, diff --git a/source/glest_game/network/server_interface.cpp b/source/glest_game/network/server_interface.cpp index 241c616c6..038bd2c0e 100644 --- a/source/glest_game/network/server_interface.cpp +++ b/source/glest_game/network/server_interface.cpp @@ -791,7 +791,7 @@ void ServerInterface::update() { } } -void ServerInterface::updateKeyframe(int frameCount){ +void ServerInterface::updateKeyframe(int frameCount) { Chrono chrono; chrono.start(); @@ -801,7 +801,7 @@ void ServerInterface::updateKeyframe(int frameCount){ NetworkMessageCommandList networkMessageCommandList(frameCount); //build command list, remove commands from requested and add to pending - while(!requestedCommands.empty()) { + while(requestedCommands.empty() == false) { if(networkMessageCommandList.addCommand(&requestedCommands.back())) { pendingCommands.push_back(requestedCommands.back()); requestedCommands.pop_back(); @@ -814,9 +814,10 @@ void ServerInterface::updateKeyframe(int frameCount){ try { // Possible cause of out of synch since we have more commands that need // to be sent in this frame - if(!requestedCommands.empty()) { + if(requestedCommands.empty() == false) { char szBuf[1024]=""; SystemFlags::OutputDebug(SystemFlags::debugNetwork,"In [%s::%s Line: %d] WARNING / ERROR, requestedCommands.size() = %d\n",__FILE__,__FUNCTION__,__LINE__,requestedCommands.size()); + SystemFlags::OutputDebug(SystemFlags::debugError,"In [%s::%s Line: %d] WARNING / ERROR, requestedCommands.size() = %d\n",__FILE__,__FUNCTION__,__LINE__,requestedCommands.size()); string sMsg = "may go out of synch: server requestedCommands.size() = " + intToStr(requestedCommands.size()); sendTextMessage(sMsg,-1, true); diff --git a/source/glest_game/sound/sound_renderer.cpp b/source/glest_game/sound/sound_renderer.cpp index 1354081e9..9cefb158e 100644 --- a/source/glest_game/sound/sound_renderer.cpp +++ b/source/glest_game/sound/sound_renderer.cpp @@ -31,7 +31,7 @@ const float SoundRenderer::audibleDist= 50.f; // class SoundRenderer // ===================================================== -SoundRenderer::SoundRenderer(){ +SoundRenderer::SoundRenderer() { SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s %d]\n",__FILE__,__FUNCTION__,__LINE__); soundPlayer = NULL; @@ -49,7 +49,6 @@ bool SoundRenderer::init(Window *window) { Config &config= Config::getInstance(); runThreadSafe = config.getBool("ThreadedSoundStream","false"); - //if(soundPlayer == NULL) { SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s %d]\n",__FILE__,__FUNCTION__,__LINE__); si.setFactory(fr.getSoundFactory(config.getString("FactorySound"))); @@ -62,7 +61,6 @@ bool SoundRenderer::init(Window *window) { soundPlayerParams.strBufferCount= config.getInt("SoundStreamingBuffers"); soundPlayer->init(&soundPlayerParams); } - //} SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s %d]\n",__FILE__,__FUNCTION__,__LINE__); @@ -84,7 +82,7 @@ bool SoundRenderer::wasInitOk() const { return result; } -SoundRenderer::~SoundRenderer(){ +SoundRenderer::~SoundRenderer() { SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s %d]\n",__FILE__,__FUNCTION__,__LINE__); stopAllSounds(); @@ -97,55 +95,63 @@ SoundRenderer::~SoundRenderer(){ SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s %d]\n",__FILE__,__FUNCTION__,__LINE__); } -SoundRenderer &SoundRenderer::getInstance(){ +SoundRenderer &SoundRenderer::getInstance() { static SoundRenderer soundRenderer; return soundRenderer; } -void SoundRenderer::update(){ +void SoundRenderer::update() { if(soundPlayer != NULL) { - if(runThreadSafe == true) mutex.p(); + MutexSafeWrapper safeMutex(NULL); + if(runThreadSafe == true) { + safeMutex.setMutex(&mutex); + } soundPlayer->updateStreams(); - if(runThreadSafe == true) mutex.v(); } } // ======================= Music ============================ -void SoundRenderer::playMusic(StrSound *strSound){ +void SoundRenderer::playMusic(StrSound *strSound) { if(strSound != NULL) { strSound->setVolume(musicVolume); strSound->restart(); if(soundPlayer != NULL) { - if(runThreadSafe == true) mutex.p(); + MutexSafeWrapper safeMutex(NULL); + if(runThreadSafe == true) { + safeMutex.setMutex(&mutex); + } + soundPlayer->play(strSound); - if(runThreadSafe == true) mutex.v(); } } } -void SoundRenderer::setMusicVolume(StrSound *strSound){ +void SoundRenderer::setMusicVolume(StrSound *strSound) { if(strSound != NULL) { strSound->setVolume(musicVolume); } } -void SoundRenderer::stopMusic(StrSound *strSound){ +void SoundRenderer::stopMusic(StrSound *strSound) { if(soundPlayer != NULL) { - if(runThreadSafe == true) mutex.p(); + MutexSafeWrapper safeMutex(NULL); + if(runThreadSafe == true) { + safeMutex.setMutex(&mutex); + } + soundPlayer->stop(strSound); if(strSound != NULL) { if(strSound->getNext() != NULL) { soundPlayer->stop(strSound->getNext()); } } - if(runThreadSafe == true) mutex.v(); } } // ======================= Fx ============================ -void SoundRenderer::playFx(StaticSound *staticSound, Vec3f soundPos, Vec3f camPos){ +void SoundRenderer::playFx(StaticSound *staticSound, Vec3f soundPos, Vec3f camPos) { if(staticSound!=NULL){ float d= soundPos.dist(camPos); @@ -155,57 +161,72 @@ void SoundRenderer::playFx(StaticSound *staticSound, Vec3f soundPos, Vec3f camPo staticSound->setVolume(correctedVol); if(soundPlayer != NULL) { - if(runThreadSafe == true) mutex.p(); + MutexSafeWrapper safeMutex(NULL); + if(runThreadSafe == true) { + safeMutex.setMutex(&mutex); + } + soundPlayer->play(staticSound); - if(runThreadSafe == true) mutex.v(); } } } } -void SoundRenderer::playFx(StaticSound *staticSound){ +void SoundRenderer::playFx(StaticSound *staticSound) { if(staticSound!=NULL){ staticSound->setVolume(fxVolume); if(soundPlayer != NULL) { - if(runThreadSafe == true) mutex.p(); + MutexSafeWrapper safeMutex(NULL); + if(runThreadSafe == true) { + safeMutex.setMutex(&mutex); + } + soundPlayer->play(staticSound); - if(runThreadSafe == true) mutex.v(); } } } // ======================= Ambient ============================ -void SoundRenderer::playAmbient(StrSound *strSound){ +void SoundRenderer::playAmbient(StrSound *strSound) { if(strSound != NULL) { strSound->setVolume(ambientVolume); if(soundPlayer != NULL) { - if(runThreadSafe == true) mutex.p(); + MutexSafeWrapper safeMutex(NULL); + if(runThreadSafe == true) { + safeMutex.setMutex(&mutex); + } + soundPlayer->play(strSound, ambientFade); - if(runThreadSafe == true) mutex.v(); } } } -void SoundRenderer::stopAmbient(StrSound *strSound){ +void SoundRenderer::stopAmbient(StrSound *strSound) { if(soundPlayer != NULL) { - if(runThreadSafe == true) mutex.p(); + MutexSafeWrapper safeMutex(NULL); + if(runThreadSafe == true) { + safeMutex.setMutex(&mutex); + } + soundPlayer->stop(strSound, ambientFade); - if(runThreadSafe == true) mutex.v(); } } // ======================= Misc ============================ -void SoundRenderer::stopAllSounds(){ +void SoundRenderer::stopAllSounds() { if(soundPlayer != NULL) { - mutex.p(); + MutexSafeWrapper safeMutex(NULL); + if(runThreadSafe == true) { + safeMutex.setMutex(&mutex); + } + soundPlayer->stopAllSounds(); - mutex.v(); } } -void SoundRenderer::loadConfig(){ +void SoundRenderer::loadConfig() { Config &config= Config::getInstance(); fxVolume= config.getInt("SoundVolumeFx")/100.f; diff --git a/source/glest_game/sound/sound_renderer.h b/source/glest_game/sound/sound_renderer.h index 8fa567f61..73d1bbc76 100644 --- a/source/glest_game/sound/sound_renderer.h +++ b/source/glest_game/sound/sound_renderer.h @@ -3,9 +3,9 @@ // // Copyright (C) 2001-2008 Martio Figueroa // -// You can redistribute this code and/or modify it under -// the terms of the GNU General Public License as published -// by the Free Software Foundation; either version 2 of the +// You can redistribute this code and/or modify it under +// the terms of the GNU General Public License as published +// by the Free Software Foundation; either version 2 of the // License, or (at your option) any later version // ============================================================== @@ -65,16 +65,15 @@ public: void playMusic(StrSound *strSound); void setMusicVolume(StrSound *strSound); void stopMusic(StrSound *strSound); - + //fx void playFx(StaticSound *staticSound, Vec3f soundPos, Vec3f camPos); void playFx(StaticSound *staticSound); //ambient - //void playAmbient(StaticSound *staticSound); void playAmbient(StrSound *strSound); void stopAmbient(StrSound *strSound); - + //misc void stopAllSounds(); void loadConfig(); diff --git a/source/glest_game/type_instances/command.cpp b/source/glest_game/type_instances/command.cpp index cad83bdce..fb20e5872 100644 --- a/source/glest_game/type_instances/command.cpp +++ b/source/glest_game/type_instances/command.cpp @@ -3,9 +3,9 @@ // // Copyright (C) 2001-2008 Martio Figueroa // -// You can redistribute this code and/or modify it under -// the terms of the GNU General Public License as published -// by the Free Software Foundation; either version 2 of the +// You can redistribute this code and/or modify it under +// the terms of the GNU General Public License as published +// by the Free Software Foundation; either version 2 of the // License, or (at your option) any later version // ============================================================== @@ -28,16 +28,16 @@ namespace Glest{ namespace Game{ Command::Command(const CommandType *ct, const Vec2i &pos){ SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d] ct = [%p]\n",__FILE__,__FUNCTION__,__LINE__,ct); - this->commandType= ct; + this->commandType= ct; this->pos= pos; this->unitRef= NULL; unitType= NULL; stateType = cst_None; stateValue = -1; -} +} -Command::Command(const CommandType *ct, Unit* unit){ - this->commandType= ct; +Command::Command(const CommandType *ct, Unit* unit) { + this->commandType= ct; this->pos= Vec2i(0); this->unitRef= unit; unitType= NULL; @@ -47,10 +47,10 @@ Command::Command(const CommandType *ct, Unit* unit){ } stateType = cst_None; stateValue = -1; -} +} -Command::Command(const CommandType *ct, const Vec2i &pos, const UnitType *unitType, CardinalDir facing){ - this->commandType= ct; +Command::Command(const CommandType *ct, const Vec2i &pos, const UnitType *unitType, CardinalDir facing) { + this->commandType= ct; this->pos= pos; this->unitRef= NULL; this->unitType= unitType; diff --git a/source/glest_game/type_instances/unit.cpp b/source/glest_game/type_instances/unit.cpp index 3bbe51eee..2ede25f38 100644 --- a/source/glest_game/type_instances/unit.cpp +++ b/source/glest_game/type_instances/unit.cpp @@ -1900,7 +1900,7 @@ std::string Unit::toString() const { result += "id = " + intToStr(this->id); if(this->type != NULL) { - result += " name [" + this->type->getName() + "]"; + result += " name [" + this->type->getName() + "][" + intToStr(this->type->getId()) + "]"; } if(this->faction != NULL) { diff --git a/source/shared_lib/sources/sound/openal/sound_player_openal.cpp b/source/shared_lib/sources/sound/openal/sound_player_openal.cpp index a707d4fa1..fe857a382 100644 --- a/source/shared_lib/sources/sound/openal/sound_player_openal.cpp +++ b/source/shared_lib/sources/sound/openal/sound_player_openal.cpp @@ -203,7 +203,7 @@ void StreamSoundSource::update() if(fadeState == NoFading){ alSourcef(source, AL_GAIN, sound->getVolume()); } - + ALint processed = 0; alGetSourcei(source, AL_BUFFERS_PROCESSED, &processed); while(processed > 0) { @@ -481,15 +481,23 @@ void SoundPlayerOpenAL::updateStreams() { source->update(); } catch(std::exception& e) { + SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d] Error [%s]\n",__FILE__,__FUNCTION__,__LINE__,e.what()); SystemFlags::OutputDebug(SystemFlags::debugError,"In [%s::%s Line: %d] Error [%s]\n",__FILE__,__FUNCTION__,__LINE__,e.what()); - std::cerr << "Error while updating sound stream: " - << e.what() << "\n"; + std::cerr << "Error while updating sound stream: "<< e.what() << "\n"; } } alcProcessContext(context); checkAlcError("Error while processing audio context: "); - } catch(...) { + } + catch(exception &ex) { + SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d] Error [%s]\n",__FILE__,__FUNCTION__,__LINE__,ex.what()); + SystemFlags::OutputDebug(SystemFlags::debugError,"In [%s::%s Line: %d] Error [%s]\n",__FILE__,__FUNCTION__,__LINE__,ex.what()); + printOpenALInfo(); + throw runtime_error(ex.what()); + } + catch(...) { + SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d] UNKNOWN Error\n",__FILE__,__FUNCTION__,__LINE__); SystemFlags::OutputDebug(SystemFlags::debugError,"In [%s::%s Line: %d] UNKNOWN Error\n",__FILE__,__FUNCTION__,__LINE__); printOpenALInfo(); throw;