Added '@', which is to '!' as '.' is to the old '5'. Fixed 2146628: cancelling targeting was incorrectly checking range. The behaviour of allow_self_target is now slightly different (see forthcoming mail on crawl-ref-discuss.)
git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@7128 c06c8d41-db1a-0410-9941-cceddc491573
MVQRUYIXCXGGH7J7TN2GKUQL23EOBLYGPJL4TBQKCZR2D6DCL7XQC
ON7HKKWM4CRYWNI5SZKKWI5Q5MVFOPC6QVKHXX3D66G7EOZEMGWAC
SUWIERONPDATHPDMZRYO6GYIXSW6XIS5V5MK5IV23DWQH2LL7VIAC
BFYHDL4EHSPKKC6EPKDRPESHYAA2WFKC6RXQIRRTSSTF3Z2QPVCAC
IXW2IM5ITYDCXDB3ORDDVAR5XUSPVQ3BWLP3Q6TRXNTIKGMZTHXAC
K2CS6TCX2NDVL2ASEHGP4J4K4IJ6FP3ANNKTSIWVG43HPYSBX6ZQC
7MMBAVNSUSNLVE2G6Z25C3TGHYAYLCOOXQ63KHXPYUMOOSKNGDKAC
YAAJ6PTN6QUSWE52URI5AENOGD366FIHOIFUOXFUJLVZYE4OG6HQC
RPOZZWKG5GLPHVZZ7ZKMKS64ZMV2LDCQSARBJFJ6FZOTOKCQO7FAC
JM7UAK777RAVDAVLQLEOBRTGNW2B47S5G55XITJXO243IUNZHVYQC
NQMXQ6OQVUSC7Y7F7IL252QW4A5JED224EECNHWAM4ZZYVNY745AC
GVCGKTH5IJ4VSQEIN4CRC7ZFVZW26JPIYNCPTO7GY66CSZZEW3ZQC
TJRYL3NXPW5IUGEV3YOC7JYWEXCZDBFPLT4AUG4P227WVKVB72ZAC
JFWC6LBPSC4SE52KE5FCBC2ZVCGLEJ6SJH5UUN5JRJLTNENENIJQC
4PUWNQO7QMEWY3GSUHLBKMYOAI7ASYSRM32KDGTA7DLNDIGFAWFAC
PFEJ4LMDNEKLMGRCMWQ7EIRVU4JMYGICI4G7X4WVWOROVXQCBZ7QC
Y4NA3JSN63RLATF4NNBPSR5CWF5Z7UEMWCGVX4B6NOAR47CGM4GQC
SIDH2P7NBIG5KEOE27XHD3ZT2NQ2OJZFN6VZXWNWYFFY5YVXSSVQC
5XNQ3SSNBFXFNWA6DPM74W6FH65NX665P3DMH6YCWVFOPZTJSYCQC
FNY62WM76UGY6IZQYRTRLSBLLUKUHL5N4CG5HQRSWTU2MYIXNJ5QC
DVQMYOEH2UDXRU6254CIXZLCNPZD2ENZTBXXSHBDOHRIG6DZNRTQC
SXLHOSCHX4BPRYRR35DI5GWISPIDKRFUSRVCYYHUUAYLAYFHSPBQC
PI5BATR2SER3RFE76IUGHM2AGXVFOUM3PLU7WC2K2Q2BA5K2E73QC
UM5SXCMFB7WQCKCGH4GCG4MNWSVVXN2CGQ5KRFYX55YHLEU2QEWAC
OVLN3RPH65K6TZHPINT2O42WI4BHLW7OTFQFPRSYHZU4UAAMER6QC
YMLVBQ6M27MECUVMU3BQP3WSGR7GW4XJMQIHLGHHWMVXHMMIXOYAC
XLLXDEUCIHZOCZVXPNUIXAA5MIT7T7YRDMXKRMTO43UEFNVQ77FQC
DS2GZKISEP2DM2VU6EJ525Q7W3WVOKJXG5PY2OY4VNFCLBHVVOTAC
ABLV37FMURRJPEZV2VRKOUYAKEMLI7E6RA4PDAII2EJ5L7WBHKZQC
45QV77UI6QFW4234P365LD3FGJYRVWTT5455DPB324NG2NFQMKTQC
NS3KXJXQSN33UQSOBDK3WXXKA3KY5YOUJL67NBZKGQAJYDYZ2COQC
bool _dist_ok(const dist& moves, int range, targ_mode_type mode,
bool may_target_self, bool cancel_at_self)
{
if (!moves.isCancel && moves.isTarget)
{
if (!see_grid(moves.target))
{
mpr("Sorry, you can't target what you can't see.",
MSGCH_EXAMINE_FILTER);
return (false);
}
if (moves.target == you.pos())
{
// may_target_self == makes (some) sense to target yourself
// (SPFLAG_AREA)
// cancel_at_self == not allowed to target yourself
// (SPFLAG_NOT_SELF)
if (cancel_at_self)
{
mpr("Sorry, you can't target yourself.", MSGCH_EXAMINE_FILTER);
return (false);
}
if (!may_target_self && mode == TARG_ENEMY)
{
if (Options.allow_self_target == CONFIRM_CANCEL)
{
mpr("That would be overly suicidal.", MSGCH_EXAMINE_FILTER);
return (false);
}
else if (Options.allow_self_target == CONFIRM_PROMPT)
{
return yesno("Really target yourself?", false, 'n');
}
}
}
// Check range
if (range >= 0 && grid_distance(moves.target, you.pos()) > range)
{
mpr("That is beyond the maximum range.", MSGCH_EXAMINE_FILTER);
return (false);
}
}
// Some odd cases
if (!moves.isValid && !moves.isCancel)
return yesno("Are you sure you want to fizzle?", false, 'n');
return (true);
}
moves.isEndpoint = true;
case CMD_TARGET_SELECT_FORCE_ENDPOINT:
if (key_command == CMD_TARGET_SELECT_ENDPOINT
|| key_command == CMD_TARGET_SELECT_FORCE_ENDPOINT)
{
moves.isEndpoint = true;
}
if (key_command == CMD_TARGET_SELECT_FORCE
|| key_command == CMD_TARGET_SELECT_FORCE_ENDPOINT)
{
allow_out_of_range = true;
}
// A bunch of confirmation tests; if we survive them all,
// then break out.
// Confirm self-targeting on TARG_ENEMY (option-controlled.)
// Conceivably we might want to confirm on TARG_ANY too.
if (moves.isTarget
&& moves.target == you.pos()
&& mode == TARG_ENEMY
&& (cancel_at_self
|| Options.allow_self_target == CONFIRM_CANCEL
&& !may_target_self
|| (Options.allow_self_target == CONFIRM_PROMPT
|| Options.allow_self_target == CONFIRM_CANCEL
&& may_target_self)
&& !yesno("Really target yourself?", false, 'n')))
{
if (cancel_at_self)
mpr("Sorry, you can't target yourself.");
else if (Options.allow_self_target == CONFIRM_CANCEL
&& !may_target_self)
{
mpr("That would be overly suicidal.", MSGCH_EXAMINE_FILTER);
}
show_prompt = true;
}
else if (moves.isTarget && !see_grid(moves.target))
{
mpr("Sorry, you can't target what you can't see.",
MSGCH_EXAMINE_FILTER);
}
else if (range >= 0
&& grid_distance(moves.target, you.pos()) > range)
{
mpr("That is beyond the maximum range.", MSGCH_EXAMINE_FILTER);
}
// Ask for confirmation if we're quitting for some odd reason.
else if (moves.isValid || moves.isCancel
|| yesno("Are you sure you want to fizzle?", false, 'n'))
if (_dist_ok(moves, allow_out_of_range ? -1 : range,
mode, may_target_self, cancel_at_self))