so that * and / work for unknown ones, and + and - for known
ones. Also, mimics become known if you hit them since the
resulting message ("moderately damaged" or "looks slightly
unstable") will give that away anyway.
Implement the first part of FR 1903048: Added a range parameter to direction(), so that when targeting for weapons of reaching we can check whether a monster is within the range of 2 squares (grid_distance). Does not handle submerged monsters. Eventually, this could be used to also limit max range for certain spells (Freeze, I'm looking at you!)
git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@3995 c06c8d41-db1a-0410-9941-cceddc491573
TPPJRQ2NTCV3GI2VRHEXQJREDERPJODCJWUG5WCOQGN4REPPPAMAC
WXJLQMSTJV5ZVB5DQVEYEJJEG3CXGNPHJZYFBFV36BCFEVWYW3HAC
22YVHM74WBJNJE4PA5CBEUTDWM6FAGGGILI26A4LXAURX55TNRKAC
45EMD3KLQPMERNMIKU5G76H6556XOMIW352TSBP7VLWJX2YYGS7AC
K2CS6TCX2NDVL2ASEHGP4J4K4IJ6FP3ANNKTSIWVG43HPYSBX6ZQC
EAAACIJUVSBDOB6S73O4NFSMRDLFLQTFO7SXWWALGMVDZTQTHQBQC
CE6FLTWU5PYFBSGVTIJXQXRMHOIHQ3VJCKHQVIMUUAIFHQ73X7NAC
TJRYL3NXPW5IUGEV3YOC7JYWEXCZDBFPLT4AUG4P227WVKVB72ZAC
FU7EQZLXD7YNGUUDHXCBI3VUKL6M2G3EPDY6FB5UA6B6RD4S5UOQC
PFEJ4LMDNEKLMGRCMWQ7EIRVU4JMYGICI4G7X4WVWOROVXQCBZ7QC
SDLKLUNFGVKDS55DDJZCBAVIB7NL3RRYPTACAY65SCUQKV6APFSAC
EOMCPVNQLX3IMLC46EAO67DPBH5KEG2FQTPBLGU62HIRWA3UQ7XQC
HSRRNAU5UAYC6B6IQWGJPFROMZBTJICPCH6DJVZDHDTAGOQ6IOYAC
JM7UAK777RAVDAVLQLEOBRTGNW2B47S5G55XITJXO243IUNZHVYQC
GVCGKTH5IJ4VSQEIN4CRC7ZFVZW26JPIYNCPTO7GY66CSZZEW3ZQC
45QV77UI6QFW4234P365LD3FGJYRVWTT5455DPB324NG2NFQMKTQC
YAAJ6PTN6QUSWE52URI5AENOGD366FIHOIFUOXFUJLVZYE4OG6HQC
XCEZ7OA2INNPSYNAB5U6JB7XNDAD5BKU26YLFPPZ3SEESFZKADQAC
RPOZZWKG5GLPHVZZ7ZKMKS64ZMV2LDCQSARBJFJ6FZOTOKCQO7FAC
547JREUJXTZNYVGHNNAET5F5O5JYYGNTDQB6ABZNT7YX5EY64OHAC
PL6I2CMSTHY5ZHWVMIQE5YTM5S5VPKBNZM6QJVHZSSKOJGIJ5W4AC
4PBRMB7TK2TXL7VSDKMUQMT4QFK3SGRU4TUVMEM7V2VS7KKKILAQC
FEGNPOJI2SALUA2PVIXIQ2CIXFLSXD7UB7CNUSAAKV4L3POXCRFQC
X5WLJCJVW55SXZVP7IKP7ADCJIGNKN4PKAXFECVR6TNK7XSMZR7QC
targ_mode_type mode = TARG_ANY, bool just_looking = false,
bool needs_path = true, const char *prompt = NULL,
targeting_behaviour *mod = NULL );
targ_mode_type mode = TARG_ANY, int range = -1,
bool just_looking = false, bool needs_path = true,
const char *prompt = NULL, targeting_behaviour *mod = NULL );
static bool find_object( int x, int y, int mode );
static bool find_monster( int x, int y, int mode );
static bool find_feature( int x, int y, int mode );
static bool find_object( int x, int y, int mode, int range );
static bool find_monster( int x, int y, int mode, int range );
static bool find_feature( int x, int y, int mode, int range );
return (targ_mon != NON_MONSTER
&& in_los(x, y)
&& player_monster_visible( &(menv[targ_mon]) )
&& !mons_is_mimic( menv[targ_mon].type )
&& (mode == TARG_ANY
|| (mode == TARG_FRIEND && mons_friendly( &menv[targ_mon] ))
|| (mode == TARG_ENEMY
&& !mons_friendly( &menv[targ_mon] )
&&
(Options.target_zero_exp ||
!mons_class_flag( menv[targ_mon].type, M_NO_EXP_GAIN )) )));
// don't target out of range
if (!_is_target_in_range(x, y, range))
return (false);
const int targ_mon = mgrd[ x ][ y ];
// Is target a (known) monster?
if (targ_mon == NON_MONSTER || !in_los(x,y)
|| !player_monster_visible( &(menv[targ_mon]) )
|| mons_is_mimic(menv[targ_mon].type)
&& !(menv[targ_mon].flags & MF_KNOWN_MIMIC))
{
return (false);
}
// Now compare target modes.
if (mode == TARG_ANY)
return true;
if (mode == TARG_FRIEND)
return (mons_friendly(&menv[targ_mon] ));
if (mode != TARG_ENEMY)
return false;
return ( !mons_friendly( &menv[targ_mon] )
&& (Options.target_zero_exp
|| !mons_class_flag( menv[targ_mon].type, M_NO_EXP_GAIN )) );
// The square need not be in LOS if the stash tracker knows this item.
return (item != NON_ITEM
&& (in_los(x, y)
|| (Options.target_oos && is_terrain_seen(x, y)
&& is_stash(x, y))));
if (item == NON_ITEM && !is_mimic)
return false;
return (in_los(x, y) || Options.target_oos && is_terrain_seen(x, y)
&& (is_stash(x, y) || is_mimic));
monster_teleport( mimic, !one_chance_in(3) );
}
const bool instant_tele = !one_chance_in(3);
monster_teleport( mimic, instant_tele );
// at least for this short while, we know it's a mimic
if (!instant_tele && should_id)
mimic->flags |= MF_KNOWN_MIMIC;