* added DebugType debugPathFinder

This commit is contained in:
James McCulloch 2010-07-24 11:43:03 +00:00
parent 1ef403c7b6
commit e73324d317
5 changed files with 156 additions and 24 deletions

View File

@ -20,6 +20,15 @@
#include "unit_type.h" #include "unit_type.h"
#include "leak_dumper.h" #include "leak_dumper.h"
#include <iostream>
#define PF_DEBUG(x) { \
stringstream _ss; \
_ss << x << endl; \
SystemFlags::OutputDebug(SystemFlags::debugPathFinder, _ss.str().c_str()); \
}
//#define PF_DEBUG(x) std::cout << x << endl
#if _GAE_DEBUG_EDITION_ #if _GAE_DEBUG_EDITION_
# include "debug_renderer.h" # include "debug_renderer.h"
@ -169,11 +178,36 @@ bool RoutePlanner::isLegalMove(Unit *unit, const Vec2i &pos2) const {
return true; return true;
} }
string log_prelude(World *w, Unit *u) {
stringstream ss;
ss << "Frame: " << w->getFrameCount() << ", Unit: " << u->getId() << ", ";
return ss.str();
}
ostream& operator<<(ostream &stream, const list<Vec2i> &posList) {
list<Vec2i>::const_iterator itBegin = posList.begin();
list<Vec2i>::const_iterator itEnd = posList.end();
list<Vec2i>::const_iterator it = itBegin;
stream << " [ ";
for ( ; it != itEnd; ++it) {
if (it != itBegin) {
stream << ", ";
}
stream << *it;
}
stream << " ] ";
return stream;
}
TravelState RoutePlanner::findPathToResource(Unit *unit, const Vec2i &targetPos, const ResourceType *rt) { TravelState RoutePlanner::findPathToResource(Unit *unit, const Vec2i &targetPos, const ResourceType *rt) {
PF_TRACE(); PF_TRACE();
assert(rt && (rt->getClass() == rcTech || rt->getClass() == rcTileset)); assert(rt && (rt->getClass() == rcTech || rt->getClass() == rcTileset));
ResourceMapKey mapKey(rt, unit->getCurrField(), unit->getType()->getSize()); ResourceMapKey mapKey(rt, unit->getCurrField(), unit->getType()->getSize());
PMap1Goal goal(world->getCartographer()->getResourceMap(mapKey)); PMap1Goal goal(world->getCartographer()->getResourceMap(mapKey));
PF_DEBUG(log_prelude(world, unit) << "findPathToResource() targetPos: " << targetPos
<< ", resource type: " << rt->getName());
return findPathToGoal(unit, goal, targetPos); return findPathToGoal(unit, goal, targetPos);
} }
@ -181,6 +215,9 @@ TravelState RoutePlanner::findPathToStore(Unit *unit, const Unit *store) {
PF_TRACE(); PF_TRACE();
Vec2i target = store->getCenteredPos(); Vec2i target = store->getCenteredPos();
PMap1Goal goal(world->getCartographer()->getStoreMap(store, unit)); PMap1Goal goal(world->getCartographer()->getStoreMap(store, unit));
PF_DEBUG(log_prelude(world, unit) << "findPathToStore() store: " << store->getId());
return findPathToGoal(unit, goal, target); return findPathToGoal(unit, goal, target);
} }
@ -189,6 +226,10 @@ TravelState RoutePlanner::findPathToBuildSite(Unit *unit, const UnitType *bType,
PF_TRACE(); PF_TRACE();
PatchMap<1> *pMap = world->getCartographer()->getSiteMap(bType, bPos, bFacing, unit); PatchMap<1> *pMap = world->getCartographer()->getSiteMap(bType, bPos, bFacing, unit);
PMap1Goal goal(pMap); PMap1Goal goal(pMap);
PF_DEBUG(log_prelude(world, unit) << "findPathToBuildSite() " << "building type: " << bType->getName()
<< ", building pos: " << bPos << ", building facing = " << bFacing);
return findPathToGoal(unit, goal, bPos + Vec2i(bType->getSize() / 2)); return findPathToGoal(unit, goal, bPos + Vec2i(bType->getSize() / 2));
} }
@ -328,7 +369,7 @@ public:
return false; return false;
} }
/** returns the 'potential goal' transition closest to target, or null if no potential goals */ /** returns the best 'potential goal' transition found, or null if no potential goals */
const Transition* getBestSeen(const Vec2i &currPos, const Vec2i &target) { const Transition* getBestSeen(const Vec2i &currPos, const Vec2i &target) {
const Transition *best = 0; const Transition *best = 0;
float distToBest = Shared::Graphics::infinity;//1e6f//numeric_limits<float>::infinity(); float distToBest = Shared::Graphics::infinity;//1e6f//numeric_limits<float>::infinity();
@ -344,7 +385,7 @@ public:
} }
}; };
/** cost function for searching cluster map with a unexplored target */ /** cost function for searching cluster map with an unexplored target */
class UnexploredCost { class UnexploredCost {
Field field; Field field;
int size; int size;
@ -538,19 +579,40 @@ TravelState RoutePlanner::doRouteCache(Unit *unit) {
// refine path to at least 24 steps (or end of path) // refine path to at least 24 steps (or end of path)
if (!refinePath(unit)) { if (!refinePath(unit)) {
CONSOLE_LOG( "refinePath() failed. [route cache]" ) CONSOLE_LOG( "refinePath() failed. [route cache]" )
wpPath.clear(); wpPath.clear(); // path has become invalid
break; break;
} }
} }
smoothPath(unit); smoothPath(unit);
PF_DEBUG(log_prelude(world, unit) << " MOVING [route cahce hit] from " << unit->getPos()
<< " to " << unit->getTargetPos());
PF_DEBUG(log_prelude(world, unit) << "[low-level path further refined]");
if (!wpPath.empty()) {
PF_DEBUG("Waypoint Path: " << wpPath);
}
if (!path.empty()) {
PF_DEBUG("LowLevel Path: " << path);
}
// IF_DEBUG_EDITION( collectPath(unit); ) // IF_DEBUG_EDITION( collectPath(unit); )
} else {
PF_DEBUG(log_prelude(world, unit) << " MOVING [route cahce hit] from " << unit->getPos()
<< " to " << unit->getTargetPos());
} }
return tsMoving; return tsMoving;
} }
// path blocked, quickSearch to next waypoint... // path blocked, quickSearch to next waypoint...
// IF_DEBUG_EDITION( clearOpenClosed(unit->getPos(), wpPath.empty() ? path.back() : wpPath.front()); ) // IF_DEBUG_EDITION( clearOpenClosed(unit->getPos(), wpPath.empty() ? path.back() : wpPath.front()); )
if (repairPath(unit) && attemptMove(unit)) { if (repairPath(unit) && attemptMove(unit)) {
// IF_DEBUG_EDITION( collectPath(unit); ) // IF_DEBUG_EDITION( collectPath(unit); )
PF_DEBUG(log_prelude(world, unit) << " MOVING [cached path repaired] from " << unit->getPos()
<< " to " << unit->getTargetPos());
if (!wpPath.empty()) {
PF_DEBUG("Waypoint Path: " << wpPath);
}
if (!path.empty()) {
PF_DEBUG("LowLevel Path: " << path);
}
return tsMoving; return tsMoving;
} }
unit->setCurrSkill(scStop); unit->setCurrSkill(scStop);
@ -583,11 +645,17 @@ TravelState RoutePlanner::doQuickPathSearch(Unit *unit, const Vec2i &target) {
path.pop(); path.pop();
if (attemptMove(unit)) { if (attemptMove(unit)) {
// IF_DEBUG_EDITION( collectPath(unit); ) // IF_DEBUG_EDITION( collectPath(unit); )
PF_DEBUG(log_prelude(world, unit) << " MOVING [doQuickPathSearch() Ok.] from " << unit->getPos()
<< " to " << unit->getTargetPos());
if (!path.empty()) {
PF_DEBUG("LowLevel Path: " << path);
}
return tsMoving; return tsMoving;
} }
} }
path.clear(); path.clear();
} }
PF_DEBUG(log_prelude(world, unit) << "doQuickPathSearch() : Failed.");
return tsBlocked; return tsBlocked;
} }
@ -620,12 +688,18 @@ TravelState RoutePlanner::findAerialPath(Unit *unit, const Vec2i &targetPos) {
if (path.size() > 1) { if (path.size() > 1) {
path.pop(); path.pop();
if (attemptMove(unit)) { if (attemptMove(unit)) {
PF_DEBUG(log_prelude(world, unit) << " MOVING [aerial path search Ok.] from " << unit->getPos()
<< " to " << unit->getTargetPos());
if (!path.empty()) {
PF_DEBUG("LowLevel Path: " << path);
}
return tsMoving; return tsMoving;
} }
} else { } else {
path.clear(); path.clear();
} }
} }
PF_DEBUG(log_prelude(world, unit) << " BLOCKED [aerial path search failed.]");
path.incBlockCount(); path.incBlockCount();
unit->setCurrSkill(scStop); unit->setCurrSkill(scStop);
return tsBlocked; return tsBlocked;
@ -650,6 +724,7 @@ TravelState RoutePlanner::findPathToLocation(Unit *unit, const Vec2i &finalPos)
// if arrived (where we wanted to go) // if arrived (where we wanted to go)
if(finalPos == unit->getPos()) { if(finalPos == unit->getPos()) {
unit->setCurrSkill(scStop); unit->setCurrSkill(scStop);
PF_DEBUG(log_prelude(world, unit) << "findPathToLocation() : ARRIVED [1]");
return tsArrived; return tsArrived;
} }
// route cache // route cache
@ -664,6 +739,7 @@ TravelState RoutePlanner::findPathToLocation(Unit *unit, const Vec2i &finalPos)
// if arrived (as close as we can get to it) // if arrived (as close as we can get to it)
if (target == unit->getPos()) { if (target == unit->getPos()) {
unit->setCurrSkill(scStop); unit->setCurrSkill(scStop);
PF_DEBUG(log_prelude(world, unit) << "findPathToLocation() : ARRIVED [2]");
return tsArrived; return tsArrived;
} }
path.clear(); path.clear();
@ -672,6 +748,7 @@ TravelState RoutePlanner::findPathToLocation(Unit *unit, const Vec2i &finalPos)
if (unit->getCurrField() == fAir) { if (unit->getCurrField() == fAir) {
return findAerialPath(unit, target); return findAerialPath(unit, target);
} }
PF_DEBUG(log_prelude(world, unit) << "findPathToLocation() " << "target pos: " << finalPos);
// QuickSearch if close to target // QuickSearch if close to target
Vec2i startCluster = ClusterMap::cellToCluster(unit->getPos()); Vec2i startCluster = ClusterMap::cellToCluster(unit->getPos());
@ -681,7 +758,6 @@ TravelState RoutePlanner::findPathToLocation(Unit *unit, const Vec2i &finalPos)
return tsMoving; return tsMoving;
} }
} }
PF_TRACE(); PF_TRACE();
// Hierarchical Search // Hierarchical Search
@ -694,28 +770,26 @@ TravelState RoutePlanner::findPathToLocation(Unit *unit, const Vec2i &finalPos)
res = findWaypointPathUnExplored(unit, target, wpPath); res = findWaypointPathUnExplored(unit, target, wpPath);
} }
if (res == hsrFailed) { if (res == hsrFailed) {
PF_DEBUG(log_prelude(world, unit) << "findPathToLocation() IMPOSSIBLE");
if (unit->getFaction()->getThisFaction()) { if (unit->getFaction()->getThisFaction()) {
world->getGame()->getConsole()->addLine(Lang::getInstance().get("InvalidPosition")); world->getGame()->getConsole()->addLine(Lang::getInstance().get("InvalidPosition"));
//g_console.addLine("Can not reach destination.");
} }
return tsImpossible; return tsImpossible;
} else if (res == hsrStartTrap) { } else if (res == hsrStartTrap) {
if (wpPath.size() < 2) { if (wpPath.size() < 2) {
CONSOLE_LOG( "START_TRAP" );
unit->setCurrSkill(scStop); unit->setCurrSkill(scStop);
PF_DEBUG(log_prelude(world, unit) << "findPathToLocation() BLOCKED [START_TRAP]");
return tsBlocked; return tsBlocked;
} }
} }
PF_TRACE(); PF_TRACE();
// IF_DEBUG_EDITION( collectWaypointPath(unit); ) // IF_DEBUG_EDITION( collectWaypointPath(unit); )
//CONSOLE_LOG( "WaypointPath size : " + intToStr(wpPath.size()) )
if (wpPath.size() > 1) { if (wpPath.size() > 1) {
wpPath.pop(); wpPath.pop();
} }
assert(!wpPath.empty()); assert(!wpPath.empty());
// IF_DEBUG_EDITION( clearOpenClosed(unit->getPos(), target); ) // IF_DEBUG_EDITION( clearOpenClosed(unit->getPos(), target); )
// refine path, to at least 20 steps (or end of path) // refine path, to at least 20 steps (or end of path)
AnnotatedMap *aMap = world->getCartographer()->getMasterMap(); AnnotatedMap *aMap = world->getCartographer()->getMasterMap();
@ -723,15 +797,10 @@ TravelState RoutePlanner::findPathToLocation(Unit *unit, const Vec2i &finalPos)
wpPath.condense(); wpPath.condense();
while (!wpPath.empty() && path.size() < 20) { while (!wpPath.empty() && path.size() < 20) {
if (!refinePath(unit)) { if (!refinePath(unit)) {
// if (res == hsrStartTrap) {
// CONSOLE_LOG( "refinePath failed. [START_TRAP]" )
// } else {
// CONSOLE_LOG( "refinePath failed. [fresh path]" )
// }
aMap->clearLocalAnnotations(unit); aMap->clearLocalAnnotations(unit);
path.incBlockCount(); path.incBlockCount();
//CONSOLE_LOG( " blockCount = " + intToStr(path.getBlockCount()) )
unit->setCurrSkill(scStop); unit->setCurrSkill(scStop);
PF_DEBUG(log_prelude(world, unit) << "findPathToLocation() BLOCKED [refinePath() failed]");
return tsBlocked; return tsBlocked;
} }
} }
@ -739,14 +808,28 @@ TravelState RoutePlanner::findPathToLocation(Unit *unit, const Vec2i &finalPos)
aMap->clearLocalAnnotations(unit); aMap->clearLocalAnnotations(unit);
// IF_DEBUG_EDITION( collectPath(unit); ) // IF_DEBUG_EDITION( collectPath(unit); )
if (path.empty()) { if (path.empty()) {
CONSOLE_LOG( "post hierarchical search failure, path empty." ); PF_DEBUG(log_prelude(world, unit) << "findPathToLocation() : BLOCKED ... [post hierarchical search failure, path empty.]" );
unit->setCurrSkill(scStop); unit->setCurrSkill(scStop);
return tsBlocked; return tsBlocked;
} }
if (attemptMove(unit)) { if (attemptMove(unit)) {
PF_DEBUG(log_prelude(world, unit) << " MOVING [Hierarchical Search Ok.] from " << unit->getPos()
<< " to " << unit->getTargetPos());
if (!wpPath.empty()) {
PF_DEBUG("Waypoint Path: " << wpPath);
}
if (!path.empty()) {
PF_DEBUG("LowLevel Path: " << path);
}
return tsMoving; return tsMoving;
} }
CONSOLE_LOG( "Hierarchical refined path blocked ? valid ?!?" ) PF_DEBUG(log_prelude(world, unit) << "findPathToLocation() : BLOCKED ... [possible invalid path?]");
if (!wpPath.empty()) {
PF_DEBUG("Waypoint Path: " << wpPath);
}
if (!path.empty()) {
PF_DEBUG("LowLevel Path: " << path);
}
unit->setCurrSkill(scStop); unit->setCurrSkill(scStop);
path.incBlockCount(); path.incBlockCount();
return tsBlocked; return tsBlocked;
@ -809,6 +892,7 @@ TravelState RoutePlanner::findPathToGoal(Unit *unit, PMap1Goal &goal, const Vec2
// if at goal // if at goal
if (goal(unit->getPos(), 0.f)) { if (goal(unit->getPos(), 0.f)) {
unit->setCurrSkill(scStop); unit->setCurrSkill(scStop);
PF_DEBUG(log_prelude(world, unit) << "ARRIVED.");
return tsArrived; return tsArrived;
} }
// route chache // route chache
@ -822,8 +906,17 @@ TravelState RoutePlanner::findPathToGoal(Unit *unit, PMap1Goal &goal, const Vec2
// try customGoalSearch if close to target // try customGoalSearch if close to target
if (unit->getPos().dist(target) < 50.f) { if (unit->getPos().dist(target) < 50.f) {
if (customGoalSearch(goal, unit, target) == tsMoving) { if (customGoalSearch(goal, unit, target) == tsMoving) {
PF_DEBUG(log_prelude(world, unit) << " MOVING [customGoalSearch() Ok.] from " << unit->getPos()
<< " to " << unit->getTargetPos());
if (!wpPath.empty()) {
PF_DEBUG("Waypoint Path: " << wpPath);
}
if (!path.empty()) {
PF_DEBUG("LowLevel Path: " << path);
}
return tsMoving; return tsMoving;
} else { } else {
PF_DEBUG(log_prelude(world, unit) << "BLOCKED. [customGoalSearch() Failed.]");
unit->setCurrSkill(scStop); unit->setCurrSkill(scStop);
return tsBlocked; return tsBlocked;
} }
@ -833,8 +926,9 @@ TravelState RoutePlanner::findPathToGoal(Unit *unit, PMap1Goal &goal, const Vec2
// Hierarchical Search // Hierarchical Search
tSearchEngine->reset(); tSearchEngine->reset();
if (!findWaypointPath(unit, target, wpPath)) { if (!findWaypointPath(unit, target, wpPath)) {
PF_DEBUG(log_prelude(world, unit) << "IMPOSSIBLE.");
if (unit->getFaction()->getThisFaction()) { if (unit->getFaction()->getThisFaction()) {
CONSOLE_LOG( "Destination unreachable? [Custom Goal Search]" ) //console.add(lang.get("Unreachable"));
} }
return tsImpossible; return tsImpossible;
} }
@ -852,9 +946,9 @@ TravelState RoutePlanner::findPathToGoal(Unit *unit, PMap1Goal &goal, const Vec2
aMap->annotateLocal(unit); aMap->annotateLocal(unit);
while (!wpPath.empty() && path.size() < 20) { while (!wpPath.empty() && path.size() < 20) {
if (!refinePath(unit)) { if (!refinePath(unit)) {
CONSOLE_LOG( "refinePath failed! [Custom Goal Search]" )
aMap->clearLocalAnnotations(unit); aMap->clearLocalAnnotations(unit);
unit->setCurrSkill(scStop); unit->setCurrSkill(scStop);
PF_DEBUG(log_prelude(world, unit) << "BLOCKED [refinePath() failed].");
return tsBlocked; return tsBlocked;
} }
} }
@ -862,9 +956,24 @@ TravelState RoutePlanner::findPathToGoal(Unit *unit, PMap1Goal &goal, const Vec2
aMap->clearLocalAnnotations(unit); aMap->clearLocalAnnotations(unit);
// IF_DEBUG_EDITION( collectPath(unit); ) // IF_DEBUG_EDITION( collectPath(unit); )
if (attemptMove(unit)) { if (attemptMove(unit)) {
PF_DEBUG(log_prelude(world, unit) << " MOVING [Hierarchical Search Ok.] from " << unit->getPos()
<< " to " << unit->getTargetPos());
if (!wpPath.empty()) {
PF_DEBUG("Waypoint Path: " << wpPath);
}
if (!path.empty()) {
PF_DEBUG("LowLevel Path: " << path);
}
return tsMoving; return tsMoving;
} }
PF_DEBUG(log_prelude(world, unit) << "BLOCKED [hierarchical search, possible invalid path].");
CONSOLE_LOG( "Hierarchical refined path blocked ? valid ?!? [Custom Goal Search]" ) CONSOLE_LOG( "Hierarchical refined path blocked ? valid ?!? [Custom Goal Search]" )
if (!wpPath.empty()) {
PF_DEBUG("Waypoint Path: " << wpPath);
}
if (!path.empty()) {
PF_DEBUG("LowLevel Path: " << path);
}
unit->setCurrSkill(scStop); unit->setCurrSkill(scStop);
return tsBlocked; return tsBlocked;
} }

View File

@ -419,6 +419,7 @@ int glestMain(int argc, char** argv){
SystemFlags::getSystemSettingType(SystemFlags::debugPerformance).enabled = config.getBool("DebugPerformance","false"); SystemFlags::getSystemSettingType(SystemFlags::debugPerformance).enabled = config.getBool("DebugPerformance","false");
SystemFlags::getSystemSettingType(SystemFlags::debugWorldSynch).enabled = config.getBool("DebugWorldSynch","false"); SystemFlags::getSystemSettingType(SystemFlags::debugWorldSynch).enabled = config.getBool("DebugWorldSynch","false");
SystemFlags::getSystemSettingType(SystemFlags::debugUnitCommands).enabled = config.getBool("DebugUnitCommands","false"); SystemFlags::getSystemSettingType(SystemFlags::debugUnitCommands).enabled = config.getBool("DebugUnitCommands","false");
SystemFlags::getSystemSettingType(SystemFlags::debugPathFinder).enabled = config.getBool("DebugPathFinder","false");
string debugLogFile = config.getString("DebugLogFile",""); string debugLogFile = config.getString("DebugLogFile","");
if(getGameReadWritePath() != "") { if(getGameReadWritePath() != "") {
@ -440,20 +441,26 @@ int glestMain(int argc, char** argv){
if(debugUnitCommandsLogFile == "") { if(debugUnitCommandsLogFile == "") {
debugUnitCommandsLogFile = debugLogFile; debugUnitCommandsLogFile = debugLogFile;
} }
string debugPathFinderLogFile = config.getString("DebugLogFilePathFinder","");
if(debugUnitCommandsLogFile == "") {
debugUnitCommandsLogFile = debugLogFile;
}
SystemFlags::getSystemSettingType(SystemFlags::debugSystem).debugLogFileName = debugLogFile; SystemFlags::getSystemSettingType(SystemFlags::debugSystem).debugLogFileName = debugLogFile;
SystemFlags::getSystemSettingType(SystemFlags::debugNetwork).debugLogFileName = debugNetworkLogFile; SystemFlags::getSystemSettingType(SystemFlags::debugNetwork).debugLogFileName = debugNetworkLogFile;
SystemFlags::getSystemSettingType(SystemFlags::debugPerformance).debugLogFileName = debugPerformanceLogFile; SystemFlags::getSystemSettingType(SystemFlags::debugPerformance).debugLogFileName = debugPerformanceLogFile;
SystemFlags::getSystemSettingType(SystemFlags::debugWorldSynch).debugLogFileName = debugWorldSynchLogFile; SystemFlags::getSystemSettingType(SystemFlags::debugWorldSynch).debugLogFileName = debugWorldSynchLogFile;
SystemFlags::getSystemSettingType(SystemFlags::debugUnitCommands).debugLogFileName = debugUnitCommandsLogFile; SystemFlags::getSystemSettingType(SystemFlags::debugUnitCommands).debugLogFileName = debugUnitCommandsLogFile;
SystemFlags::getSystemSettingType(SystemFlags::debugPathFinder).debugLogFileName = debugPathFinderLogFile;
if(haveSpecialOutputCommandLineOption == false) { if(haveSpecialOutputCommandLineOption == false) {
printf("Startup settings are: debugSystem [%d], debugNetwork [%d], debugPerformance [%d], debugWorldSynch [%d], debugUnitCommands[%d]\n", printf("Startup settings are: debugSystem [%d], debugNetwork [%d], debugPerformance [%d], debugWorldSynch [%d], debugUnitCommands[%d], debugPathFinder[%d]\n",
SystemFlags::getSystemSettingType(SystemFlags::debugSystem).enabled, SystemFlags::getSystemSettingType(SystemFlags::debugSystem).enabled,
SystemFlags::getSystemSettingType(SystemFlags::debugNetwork).enabled, SystemFlags::getSystemSettingType(SystemFlags::debugNetwork).enabled,
SystemFlags::getSystemSettingType(SystemFlags::debugPerformance).enabled, SystemFlags::getSystemSettingType(SystemFlags::debugPerformance).enabled,
SystemFlags::getSystemSettingType(SystemFlags::debugWorldSynch).enabled, SystemFlags::getSystemSettingType(SystemFlags::debugWorldSynch).enabled,
SystemFlags::getSystemSettingType(SystemFlags::debugUnitCommands).enabled); SystemFlags::getSystemSettingType(SystemFlags::debugUnitCommands).enabled,
SystemFlags::getSystemSettingType(SystemFlags::debugPathFinder).enabled);
} }
NetworkInterface::setDisplayMessageFunction(ExceptionHandler::DisplayMessage); NetworkInterface::setDisplayMessageFunction(ExceptionHandler::DisplayMessage);
@ -468,6 +475,7 @@ int glestMain(int argc, char** argv){
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__);
SystemFlags::OutputDebug(SystemFlags::debugUnitCommands,"START\n"); SystemFlags::OutputDebug(SystemFlags::debugUnitCommands,"START\n");
SystemFlags::OutputDebug(SystemFlags::debugPathFinder,"START\n");
// 256 for English // 256 for English
// 30000 for Chinese // 30000 for Chinese

View File

@ -151,6 +151,12 @@ public:
} }
}; };
template <typename T>
std::ostream& operator<<(std::ostream &stream, const Vec2<T> &vec) {
return stream << "(" << vec.x << ", " << vec.y << ")";
}
typedef Vec2<int> Vec2i; typedef Vec2<int> Vec2i;
typedef Vec2<bool> Vec2b; typedef Vec2<bool> Vec2b;
typedef Vec2<char> Vec2c; typedef Vec2<char> Vec2c;

View File

@ -40,7 +40,8 @@ public:
debugNetwork, debugNetwork,
debugPerformance, debugPerformance,
debugWorldSynch, debugWorldSynch,
debugUnitCommands debugUnitCommands,
debugPathFinder
}; };
class SystemFlagsType class SystemFlagsType

View File

@ -359,14 +359,22 @@ void SystemFlags::handleDebug(DebugType type, const char *fmt, ...) {
MutexSafeWrapper safeMutex(currentDebugLog.mutex); MutexSafeWrapper safeMutex(currentDebugLog.mutex);
(*currentDebugLog.fileStream) << "[" << szBuf2 << "] " << szBuf; if (type != debugPathFinder) {
(*currentDebugLog.fileStream) << "[" << szBuf2 << "] " << szBuf;
} else {
(*currentDebugLog.fileStream) << szBuf;
}
(*currentDebugLog.fileStream).flush(); (*currentDebugLog.fileStream).flush();
safeMutex.ReleaseLock(); safeMutex.ReleaseLock();
} }
// output to console // output to console
else { else {
printf("[%s] %s", szBuf2, szBuf); if (type != debugPathFinder) {
printf("[%s] %s", szBuf2, szBuf);
} else {
printf("%s", szBuf);
}
} }
va_end(argList); va_end(argList);