diff --git a/source/glest_game/type_instances/unit.cpp b/source/glest_game/type_instances/unit.cpp index 36f7cf78..617504cf 100644 --- a/source/glest_game/type_instances/unit.cpp +++ b/source/glest_game/type_instances/unit.cpp @@ -155,9 +155,13 @@ Vec2i UnitPathBasic::pop(bool removeFrontPos) { return p; } std::string UnitPathBasic::toString() const { - std::string result = "unit path blockCount = " + intToStr(blockCount) + " pathQueue size = " + intToStr(pathQueue.size()); + std::string result = "unit path blockCount = " + intToStr(blockCount) + "\npathQueue size = " + intToStr(pathQueue.size()); for(int idx = 0; idx < pathQueue.size(); ++idx) { - result += " index = " + intToStr(idx) + " " + pathQueue[idx].getString(); + result += " index = " + intToStr(idx) + " value = " + pathQueue[idx].getString(); + } + result += "\nlastPathCacheQueue size = " + intToStr(lastPathCacheQueue.size()); + for(int idx = 0; idx < lastPathCacheQueue.size(); ++idx) { + result += " index = " + intToStr(idx) + " value = " + lastPathCacheQueue[idx].getString(); } return result; @@ -209,6 +213,16 @@ void UnitPathBasic::loadGame(const XmlNode *rootNode) { } } +Checksum UnitPathBasic::getCRC() { + Checksum crcForPath; + + crcForPath.addInt(blockCount); + crcForPath.addInt(pathQueue.size()); + crcForPath.addInt(lastPathCacheQueue.size()); + + return crcForPath; +} + // ===================================================== // class UnitPath // ===================================================== @@ -3858,11 +3872,14 @@ bool Unit::isMeetingPointSettable() const { return (type != NULL ? type->getMeetingPoint() : false); } -int Unit::getFrameCount() const { - int frameCount = 0; - const Game *game = Renderer::getInstance().getGame(); +uint32 Unit::getFrameCount() const { + uint32 frameCount = 0; + //const Game *game = Renderer::getInstance().getGame(); if(game != NULL && game->getWorld() != NULL) { - frameCount = game->getWorld()->getFrameCount(); + int frameCountAsInt = game->getWorld()->getFrameCount(); + if(frameCountAsInt >= 0) { + frameCount = frameCountAsInt; + } } return frameCount; @@ -4522,7 +4539,7 @@ void Unit::saveGame(XmlNode *rootNode) { // bool ignoreCheckCommand; unitNode->addAttribute("ignoreCheckCommand",intToStr(ignoreCheckCommand), mapTagReplacements); // uint32 lastStuckFrame; - unitNode->addAttribute("lastStuckFrame",intToStr(lastStuckFrame), mapTagReplacements); + unitNode->addAttribute("lastStuckFrame",uIntToStr(lastStuckFrame), mapTagReplacements); // Vec2i lastStuckPos; unitNode->addAttribute("lastStuckPos",lastStuckPos.getString(), mapTagReplacements); // uint32 lastPathfindFailedFrame; @@ -5136,6 +5153,10 @@ Checksum Unit::getCRC() { //Map *map; //UnitPathInterface *unitPath; + if(unitPath != NULL) { + uint32 crc = unitPath->getCRC().getSum(); + crcForUnit.addBytes(&crc,sizeof(uint32)); + } //WaypointPath waypointPath; if(consoleDebug) printf("#11 Unit: %d CRC: %u commands.size(): %ld\n",id,crcForUnit.getSum(),commands.size()); @@ -5196,7 +5217,7 @@ Checksum Unit::getCRC() { //bool ignoreCheckCommand; //uint32 lastStuckFrame; - crcForUnit.addInt(lastStuckFrame); + crcForUnit.addUInt(lastStuckFrame); //Vec2i lastStuckPos; crcForUnit.addInt(lastStuckPos.x); crcForUnit.addInt(lastStuckPos.y); diff --git a/source/glest_game/type_instances/unit.h b/source/glest_game/type_instances/unit.h index 334e7327..ede21d13 100644 --- a/source/glest_game/type_instances/unit.h +++ b/source/glest_game/type_instances/unit.h @@ -164,6 +164,8 @@ public: virtual void loadGame(const XmlNode *rootNode) = 0; virtual void clearCaches() = 0; + + virtual Checksum getCRC() = 0; }; class UnitPathBasic : public UnitPathInterface { @@ -214,6 +216,8 @@ public: virtual void saveGame(XmlNode *rootNode); virtual void loadGame(const XmlNode *rootNode); virtual void clearCaches(); + + virtual Checksum getCRC(); }; // ===================================================== @@ -275,6 +279,8 @@ public: virtual void saveGame(XmlNode *rootNode) {}; virtual void loadGame(const XmlNode *rootNode) {}; virtual void clearCaches() {}; + + virtual Checksum getCRC() { return Checksum(); }; }; class WaypointPath : public list { @@ -751,7 +757,7 @@ public: bool isLastStuckFrameWithinCurrentFrameTolerance(bool evalMode); inline uint32 getLastStuckFrame() const { return lastStuckFrame; } - inline void setLastStuckFrame(uint32 value) { lastStuckFrame = value; } + //inline void setLastStuckFrame(uint32 value) { lastStuckFrame = value; } void setLastStuckFrameToCurrentFrame(); inline Vec2i getLastStuckPos() const { return lastStuckPos; } @@ -805,7 +811,7 @@ private: void stopDamageParticles(bool force); void startDamageParticles(); - int getFrameCount() const; + uint32 getFrameCount() const; void checkCustomizedParticleTriggers(bool force); bool checkModelStateInfoForNewHpValue(); void checkUnitLevel(); diff --git a/source/glest_game/world/world.cpp b/source/glest_game/world/world.cpp index 7b6305d9..f54d67cb 100644 --- a/source/glest_game/world/world.cpp +++ b/source/glest_game/world/world.cpp @@ -701,8 +701,8 @@ void World::updateAllFactionUnits() { int unitBlockCount = unit->getPath()->getBlockCount(); bool isStuck = unit->getPath()->isStuck(); - bool isStuckWithinTolerance = unit->isLastStuckFrameWithinCurrentFrameTolerance(false); - uint32 lastStuckFrame = unit->getLastStuckFrame(); + //bool isStuckWithinTolerance = unit->isLastStuckFrameWithinCurrentFrameTolerance(false); + //uint32 lastStuckFrame = unit->getLastStuckFrame(); if(unitUpdater.updateUnit(unit) == true) { unitCountUpdated++; @@ -716,7 +716,8 @@ void World::updateAllFactionUnits() { totalUnitsChecked++; if(showPerfStats && chronoPerfUnit.getMillis() >= 10) { - sprintf(perfBuf,"In [%s::%s] Line: %d took msecs: " MG_I64_SPECIFIER " stuck: %d [%d] for unit:\n%sBEFORE unitBlockCount = %d, AFTER = %d, BEFORE lastStuckFrame = %u, AFTER: %u\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,chronoPerfUnit.getMillis(),isStuck,isStuckWithinTolerance,unit->toString().c_str(),unitBlockCount,unit->getPath()->getBlockCount(),lastStuckFrame,unit->getLastStuckFrame()); + //sprintf(perfBuf,"In [%s::%s] Line: %d took msecs: " MG_I64_SPECIFIER " stuck: %d [%d] for unit:\n%sBEFORE unitBlockCount = %d, AFTER = %d, BEFORE lastStuckFrame = %u, AFTER: %u\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,chronoPerfUnit.getMillis(),isStuck,isStuckWithinTolerance,unit->toString().c_str(),unitBlockCount,unit->getPath()->getBlockCount(),lastStuckFrame,unit->getLastStuckFrame()); + sprintf(perfBuf,"In [%s::%s] Line: %d took msecs: " MG_I64_SPECIFIER " stuck: %d for unit:\n%sBEFORE unitBlockCount = %d, AFTER = %d, BEFORE , AFTER: %u\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,chronoPerfUnit.getMillis(),isStuck,unit->toString().c_str(),unitBlockCount,unit->getPath()->getBlockCount(),unit->getLastStuckFrame()); perfList.push_back(perfBuf); } diff --git a/source/shared_lib/include/util/checksum.h b/source/shared_lib/include/util/checksum.h index 3032fdda..e3d1ef9e 100644 --- a/source/shared_lib/include/util/checksum.h +++ b/source/shared_lib/include/util/checksum.h @@ -53,6 +53,7 @@ public: uint32 addBytes(const void *_data, size_t _size); void addString(const string &value); uint32 addInt(const int32 &value); + uint32 addUInt(const uint32 &value); uint32 addInt64(const int64 &value); void addFile(const string &path); diff --git a/source/shared_lib/sources/util/checksum.cpp b/source/shared_lib/sources/util/checksum.cpp index c87445df..fdf62342 100644 --- a/source/shared_lib/sources/util/checksum.cpp +++ b/source/shared_lib/sources/util/checksum.cpp @@ -128,6 +128,19 @@ uint32 Checksum::addInt(const int32 &value) { return sum; } +uint32 Checksum::addUInt(const uint32 &value) { + int8 byte = (value >> 0) & 0xFF; + addByte(byte); + byte = (value >> 8) & 0xFF; + addByte(byte); + byte = (value >> 16) & 0xFF; + addByte(byte); + byte = (value >> 24) & 0xFF; + addByte(byte); + + return sum; +} + uint32 Checksum::addInt64(const int64 &value) { int8 byte = (value >> 0) & 0xFF; addByte(byte);