nav: tweaked reachability timers

nav: ignore pickup item if stuck
fix: bad loading for graphs since last commit
This commit is contained in:
jeefo 2023-04-13 14:07:56 +03:00
commit 5b7e58d360
No known key found for this signature in database
GPG key ID: 927BCA0779BEA8ED
6 changed files with 33 additions and 32 deletions

View file

@ -345,7 +345,7 @@ public:
template <typename U> bool saveStorage (StringRef name, StorageOption options, StorageVersion version, const SmallArray <U> &data, ExtenHeader *exten); template <typename U> bool saveStorage (StringRef name, StorageOption options, StorageVersion version, const SmallArray <U> &data, ExtenHeader *exten);
template <typename U> bool loadStorage (StringRef name, StorageOption options, StorageVersion version, SmallArray <U> &data, ExtenHeader *exten, int32_t *outOptions); template <typename U> bool loadStorage (StringRef name, StorageOption options, StorageVersion version, SmallArray <U> &data, ExtenHeader *exten, int32_t *outOptions);
template <typename ...Args> bool raiseLoadingError (bool isGraph, MemFile &file, const char *fmt, Args &&...args); template <typename ...Args> bool raiseLoadingError (bool isGraph, bool isDebug, MemFile &file, const char *fmt, Args &&...args);
void saveOldFormat (); void saveOldFormat ();
void reset (); void reset ();
@ -485,11 +485,11 @@ public:
#include <manager.h> #include <manager.h>
// helper for reporting load errors // helper for reporting load errors
template <typename ...Args> bool BotGraph::raiseLoadingError (bool isGraph, MemFile &file, const char *fmt, Args &&...args) { template <typename ...Args> bool BotGraph::raiseLoadingError (bool isGraph, bool isDebug, MemFile &file, const char *fmt, Args &&...args) {
auto result = strings.format (fmt, cr::forward <Args> (args)...); auto result = strings.format (fmt, cr::forward <Args> (args)...);
// display error only for graph file // display error only for graph file
if (isGraph) { if (isGraph || isDebug) {
logger.error (result); logger.error (result);
} }

View file

@ -689,6 +689,9 @@ void Bot::updatePickups () {
} }
void Bot::ensureEntitiesClear () { void Bot::ensureEntitiesClear () {
if ((!m_isStuck || m_navTimeset + getEstimatedNodeReachTime () + m_frameInterval * 2.0f > game.time ()) && !(m_states & Sense::SeeingEnemy)) {
return;
}
const auto currentTask = getCurrentTaskId (); const auto currentTask = getCurrentTaskId ();
if (currentTask == Task::PickupItem || (m_states & Sense::PickupItem)) { if (currentTask == Task::PickupItem || (m_states & Sense::PickupItem)) {
@ -4795,10 +4798,8 @@ void Bot::logic () {
m_strafeSpeed = pev->maxspeed * static_cast <float> (m_needAvoidGrenade); m_strafeSpeed = pev->maxspeed * static_cast <float> (m_needAvoidGrenade);
} }
// ensure we're not stuck destroying/picking something
if (m_navTimeset + getEstimatedNodeReachTime () + 2.0f < game.time () && !(m_states & Sense::SeeingEnemy)) {
ensureEntitiesClear (); ensureEntitiesClear ();
}
translateInput (); translateInput ();
// check if need to use parachute // check if need to use parachute

View file

@ -555,11 +555,11 @@ Vector Bot::getCustomHeight (float distance) {
static constexpr float offsetRanges[9][3] = { static constexpr float offsetRanges[9][3] = {
{ 0.0f, 0.0f, 0.0f }, // none { 0.0f, 0.0f, 0.0f }, // none
{ 0.0f, 0.0f, 0.0f }, // melee { 0.0f, 0.0f, 0.0f }, // melee
{ 1.5f, -3.0f, -4.5f }, // pistol { 0.5f, -3.0f, -4.5f }, // pistol
{ 6.5f, 6.0f, -2.0f }, // shotgun { 6.5f, 6.0f, -2.0f }, // shotgun
{ 2.5f -7.5f, -9.5f }, // zoomrifle { 0.5f -7.5f, -9.5f }, // zoomrifle
{ 2.5f, -7.5f, -9.5f }, // rifle { 0.5f, -7.5f, -9.5f }, // rifle
{ 2.5f, -7.5f, -9.5f }, // smg { 0.5f, -7.5f, -9.5f }, // smg
{ 0.0f, -2.5f, -6.0f }, // sniper { 0.0f, -2.5f, -6.0f }, // sniper
{ 1.5f, -4.0f, -9.0f } // heavy { 1.5f, -4.0f, -9.0f } // heavy
}; };

View file

@ -1683,7 +1683,7 @@ template <typename U> bool BotGraph::loadStorage (StringRef name, StorageOption
// graphs can be downloaded... // graphs can be downloaded...
bool isGraph = !!(options & StorageOption::Graph); bool isGraph = !!(options & StorageOption::Graph);
bool isGraphOrDebug = isGraph || cv_debug.bool_ (); bool isDebug = cv_debug.bool_ ();
MemFile file (filename); // open the file MemFile file (filename); // open the file
@ -1707,7 +1707,7 @@ template <typename U> bool BotGraph::loadStorage (StringRef name, StorageOption
// if graph & attempted to load multiple times, bail out, we're failed // if graph & attempted to load multiple times, bail out, we're failed
if (isGraph && ++m_loadAttempts > 2) { if (isGraph && ++m_loadAttempts > 2) {
m_loadAttempts = 0; m_loadAttempts = 0;
return raiseLoadingError (isGraphOrDebug, file, "Unable to load %s (filename: '%s'). Download process has failed as well. No nodes has been found.", name, filename); return raiseLoadingError (isGraph, isDebug, file, "Unable to load %s (filename: '%s'). Download process has failed as well. No nodes has been found.", name, filename);
} }
// downloader for graph // downloader for graph
@ -1754,7 +1754,7 @@ template <typename U> bool BotGraph::loadStorage (StringRef name, StorageOption
if (tryReload ()) { if (tryReload ()) {
return true; return true;
} }
return raiseLoadingError (isGraphOrDebug, file, "Unable to open %s file for reading (filename: '%s').", name, filename); return raiseLoadingError (isGraph, isDebug, file, "Unable to open %s file for reading (filename: '%s').", name, filename);
} }
// read the header // read the header
@ -1766,12 +1766,12 @@ template <typename U> bool BotGraph::loadStorage (StringRef name, StorageOption
if (tryReload ()) { if (tryReload ()) {
return true; return true;
} }
return raiseLoadingError (isGraphOrDebug, file, "Unable to read magic of %s (filename: '%s').", name, filename); return raiseLoadingError (isGraph, isDebug, file, "Unable to read magic of %s (filename: '%s').", name, filename);
} }
// check the path-numbers // check the path-numbers
if (!isGraph && hdr.length != length ()) { if (!isGraph && hdr.length != length ()) {
return raiseLoadingError (isGraphOrDebug, file, "Damaged %s (filename: '%s'). Mismatch number of nodes (got: '%d', need: '%d').", name, filename, hdr.length, m_paths.length ()); return raiseLoadingError (isGraph, isDebug, file, "Damaged %s (filename: '%s'). Mismatch number of nodes (got: '%d', need: '%d').", name, filename, hdr.length, m_paths.length ());
} }
// check the count // check the count
@ -1779,7 +1779,7 @@ template <typename U> bool BotGraph::loadStorage (StringRef name, StorageOption
if (tryReload ()) { if (tryReload ()) {
return true; return true;
} }
return raiseLoadingError (isGraphOrDebug, file, "Damaged %s (filename: '%s'). Paths length is overflowed (got: '%d').", name, filename, hdr.length); return raiseLoadingError (isGraph, isDebug, file, "Damaged %s (filename: '%s'). Paths length is overflowed (got: '%d').", name, filename, hdr.length);
} }
// check the version // check the version
@ -1787,7 +1787,7 @@ template <typename U> bool BotGraph::loadStorage (StringRef name, StorageOption
ctrl.msg ("Graph version mismatch %s (filename: '%s'). Version number differs (got: '%d', need: '%d') Please, upgrade %s.", name, filename, hdr.version, version, product.name); ctrl.msg ("Graph version mismatch %s (filename: '%s'). Version number differs (got: '%d', need: '%d') Please, upgrade %s.", name, filename, hdr.version, version, product.name);
} }
else if (hdr.version > version && !isGraph) { else if (hdr.version > version && !isGraph) {
return raiseLoadingError (isGraphOrDebug, file, "Damaged %s (filename: '%s'). Version number differs (got: '%d', need: '%d').", name, filename, hdr.version, version); return raiseLoadingError (isGraph, isDebug, file, "Damaged %s (filename: '%s'). Version number differs (got: '%d', need: '%d').", name, filename, hdr.version, version);
} }
// temporary solution to kill version 1 vistables, which has a bugs // temporary solution to kill version 1 vistables, which has a bugs
@ -1797,7 +1797,7 @@ template <typename U> bool BotGraph::loadStorage (StringRef name, StorageOption
if (File::exists (vistablePath)) { if (File::exists (vistablePath)) {
plat.removeFile (vistablePath.chars ()); plat.removeFile (vistablePath.chars ());
} }
return raiseLoadingError (isGraphOrDebug, file, "Bugged vistable %s (filename: '%s'). Version 1 has a bugs, vistable will be recreated.", name, filename); return raiseLoadingError (isGraph, isDebug, file, "Bugged vistable %s (filename: '%s'). Version 1 has a bugs, vistable will be recreated.", name, filename);
} }
// save graph version // save graph version
@ -1807,7 +1807,7 @@ template <typename U> bool BotGraph::loadStorage (StringRef name, StorageOption
// check the storage type // check the storage type
if ((hdr.options & options) != options) { if ((hdr.options & options) != options) {
return raiseLoadingError (isGraphOrDebug, file, "Incorrect storage format for %s (filename: '%s').", name, filename); return raiseLoadingError (isGraph, isDebug, file, "Incorrect storage format for %s (filename: '%s').", name, filename);
} }
auto compressedSize = static_cast <size_t> (hdr.compressed); auto compressedSize = static_cast <size_t> (hdr.compressed);
auto numberNodes = static_cast <size_t> (hdr.length); auto numberNodes = static_cast <size_t> (hdr.length);
@ -1824,7 +1824,7 @@ template <typename U> bool BotGraph::loadStorage (StringRef name, StorageOption
// try to uncompress // try to uncompress
if (ulz.uncompress (compressed.data (), hdr.compressed, reinterpret_cast <uint8_t *> (data.data ()), hdr.uncompressed) == ULZ::UncompressFailure) { if (ulz.uncompress (compressed.data (), hdr.compressed, reinterpret_cast <uint8_t *> (data.data ()), hdr.uncompressed) == ULZ::UncompressFailure) {
return raiseLoadingError (isGraphOrDebug, file, "Unable to decompress ULZ data for %s (filename: '%s').", name, filename); return raiseLoadingError (isGraph, isDebug, file, "Unable to decompress ULZ data for %s (filename: '%s').", name, filename);
} }
else { else {
@ -1859,7 +1859,7 @@ template <typename U> bool BotGraph::loadStorage (StringRef name, StorageOption
} }
} }
else { else {
return raiseLoadingError (isGraphOrDebug, file, "Unable to read ULZ data for %s (filename: '%s').", name, filename); return raiseLoadingError (isGraph, isDebug, file, "Unable to read ULZ data for %s (filename: '%s').", name, filename);
} }
return false; return false;
} }

View file

@ -1837,17 +1837,17 @@ bool Bot::findNextBestNode () {
continue; continue;
} }
// ignore non-reacheable nodes...
if (!isReachableNode (path.number)) {
continue;
}
// check if node is already used by another bot... // check if node is already used by another bot...
if (bots.getRoundStartTime () + 5.0f < game.time () && isOccupiedNode (path.number)) { if (bots.getRoundStartTime () + 5.0f < game.time () && isOccupiedNode (path.number)) {
busyIndex = path.number; busyIndex = path.number;
continue; continue;
} }
// ignore non-reacheable nodes...
if (!isReachableNode (path.number)) {
continue;
}
// if we're still here, find some close nodes // if we're still here, find some close nodes
float distance = pev->origin.distanceSq (path.origin); float distance = pev->origin.distanceSq (path.origin);
@ -1906,7 +1906,7 @@ bool Bot::findNextBestNode () {
} }
float Bot::getEstimatedNodeReachTime () { float Bot::getEstimatedNodeReachTime () {
float estimatedTime = 4.2f; float estimatedTime = 3.5f;
// if just fired at enemy, increase reachability // if just fired at enemy, increase reachability
if (m_shootTime + 0.15f < game.time ()) { if (m_shootTime + 0.15f < game.time ()) {
@ -1926,9 +1926,9 @@ float Bot::getEstimatedNodeReachTime () {
if (longTermReachability) { if (longTermReachability) {
estimatedTime *= 2.0f; estimatedTime *= 2.0f;
} }
estimatedTime = cr::clamp (estimatedTime, 3.0f, longTermReachability ? 8.0f : 4.2f); estimatedTime = cr::clamp (estimatedTime, 3.0f, longTermReachability ? 8.0f : 3.5f);
} }
return estimatedTime + m_frameInterval; return estimatedTime;
} }
void Bot::findValidNode () { void Bot::findValidNode () {
@ -3388,7 +3388,7 @@ bool Bot::isReachableNode (int index) {
// some one seems to camp at this node // some one seems to camp at this node
if (isOccupiedNode (index, true)) { if (isOccupiedNode (index, true)) {
return true; return false;
} }
float ladderDist = dst.distance2d (src); float ladderDist = dst.distance2d (src);