mostly lifted from BEH_SEEK.
git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@6036 c06c8d41-db1a-0410-9941-cceddc491573
FWLLPRIZDBJVQ336TPOLYAFT6WYGAFC52OFIOTRN2YQPFZ3PQVRQC
6ZIZHBWWQC7HGUKAL5T2ADE3UXGFOEA7XNIIZOJO3DFPEW3TP7LAC
HDFQR3WVDBL62P3RTJ4LBIOTHHL2ZN4FHKUIBCERHLQYDRLHRTKQC
EHP6PYCIPYQ3KF4JFGBTZXEUQHN3FVAH4NUWEOWDDNKGPYVOTOJQC
K2CS6TCX2NDVL2ASEHGP4J4K4IJ6FP3ANNKTSIWVG43HPYSBX6ZQC
SXUKGEXMGRRN6UO2GJW4HSVU5TSUNUHIHBMMF7CAG7QMLKZYWTKQC
P5TRGRH7XMQSPCZKM5IEEO34TY6WMLGHHX7BU6Y453JFRXLUR2VQC
EMOBSWJHHB4V6WVMZL7JCF2V3KZN454Z6NS346OKFPMBNO24EJDQC
LH4OYDEWEON5QNUCM74R7MNBJDP7O4XRETY74ZMYSXUXYQV427PAC
VEVPRVWGRHRKBBUTO64ELK3NPZANUQI3ZZ7F23YXJQLKIORUW3HQC
F4FAPEZ5P5CPHZIHUSRYULB3LY4LOJCUC7DZAYVL77LFFBUBCUNAC
VNB7OLRPCC7ITTUKYLQ4SDV25QD2XZHXOYXDCIRJ2OTF2U4VZFWAC
FT2JKKQAUESFIMB2G5YGBI4FX7V7ARLOHWEKLP3M5MGV5ZCAAZMAC
S6NJIL6VIKUYD4VVXOT7V237J5WCKOIEBTNIMIF54CABA46KUETQC
KVRDLMIRHKEMFKZ22JK5SZEDLDEXPEVOYWW535DN7EJVHL32IOMQC
Q5YUZONIIPGRWOIQNL6DHRGLKF4V3K5XSZCBH2SL7DP4WPLDNOSQC
}
}
else
{
// Use pathfinding to find a (new) path to the level exit.
const int dist = grid_distance(mon->x, mon->y,
e.target.x, e.target.y);
#ifdef DEBUG_PATHFIND
mprf("Need to calculate a path... (dist = %d)", dist);
#endif
const bool native = mons_is_native_in_branch(mon);
int range = 0;
switch (mons_intel(mon->type))
{
case I_PLANT:
range = 2;
break;
case I_INSECT:
range = 3;
break;
case I_ANIMAL:
range = 4;
break;
case I_NORMAL:
range = 8;
break;
default:
// Highly intelligent monsters can find their way
// anywhere. (range == 0 means no restriction.)
break;
}
if (range && native)
range += 3;
if (range > 0 && dist > range)
{
mon->travel_target = MTRAV_UNREACHABLE;
#ifdef DEBUG_PATHFIND
mprf("Distance too great, don't attempt pathfinding! (%s)",
mon->name(DESC_PLAIN).c_str());
#endif
}
else
{
#ifdef DEBUG_PATHFIND
mprf("Need a path for %s from (%d, %d) to (%d, %d), "
"max. dist = %d",
mon->name(DESC_PLAIN).c_str(), mon->x, mon->y,
e.target.x, e.target.y, range);
#endif
monster_pathfind mp;
if (range > 0)
mp.set_range(range);
if (mp.start_pathfind(mon, e.target))
{
mon->travel_path = mp.calc_waypoints();
if (!mon->travel_path.empty())
{
// Okay then, we found a path. Let's use it!
mon->target_x = mon->travel_path[0].x;
mon->target_y = mon->travel_path[0].y;
break;
}
else
{
#ifdef DEBUG_PATHFIND
mpr("No path found!");
#endif
mon->travel_target = MTRAV_UNREACHABLE;
// Pass information on to nearby monsters.
_mark_neighbours_target_unreachable(mon);
}
}
else
{
#ifdef DEBUG_PATHFIND
mpr("No path found!");
#endif
mon->travel_target = MTRAV_UNREACHABLE;
_mark_neighbours_target_unreachable(mon);
}
MTRAV_PLAYER, // Travelling to reach the player.
MTRAV_PATROL, // Travelling to reach the patrol point.
MTRAV_UNREACHABLE, // Not travelling because player is unreachable.
MTRAV_STAIR, // Travelling to reach a stair.
MTRAV_TRAP, // Travelling to reach a trap.
MTRAV_SUBMERSIBLE // Travelling to reach a submersible place.
MTRAV_PLAYER, // Travelling to reach the player.
MTRAV_PATROL, // Travelling to reach the patrol point.
MTRAV_UNREACHABLE, // Not travelling because target is unreachable.
MTRAV_STAIR, // Travelling to reach a stair.
MTRAV_TRAP, // Travelling to reach a trap.
MTRAV_SUBMERSIBLE // Travelling to reach a submersible place.