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_PATHFINDmprf("Need to calculate a path... (dist = %d)", dist);#endifconst 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_PATHFINDmprf("Distance too great, don't attempt pathfinding! (%s)",mon->name(DESC_PLAIN).c_str());#endif}else{#ifdef DEBUG_PATHFINDmprf("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);#endifmonster_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_PATHFINDmpr("No path found!");#endifmon->travel_target = MTRAV_UNREACHABLE;// Pass information on to nearby monsters._mark_neighbours_target_unreachable(mon);}}else{#ifdef DEBUG_PATHFINDmpr("No path found!");#endifmon->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.