BR 1935715.
The latter uses a heavily modified i_feel_safe() that now draws on get_playervisible_monsters(), which got numerous new parameters to cover all possibilities. :p
git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@4314 c06c8d41-db1a-0410-9941-cceddc491573
JN4GPMQCXOY5ICTLPLWP6DXBFULN4GMAEK7T4GXTZVIJAUUKBBYAC
IZ5CQJ7RWQP5LSZCDAZSKKAE7UWHARW6DQ24DRSACX7FSS5LQ6PQC
IHLGRQOXBGZE3COMNKBKMIDQPJ7HRY4PT74ZUN7HD4ADDPDOX2NQC
3HCT6H5EILQTB4GBY536FJDLJG4ZLN2TQA6UQJNK7P22ECBBLYMQC
NO2HRD7RZS42S55UG4FQ5EFQDY6WYWKGIXHUKYLWF36HHE3VZ7WAC
VXSORUQOM2VZA4CAZDC6KPAY373NQIN3UT7CXQXTRCYXO2WM62DAC
OXHOOJE4XEQKGI3JKURNSITG6CRQFAOFQ2EKKG6M5DCLN7LS4GUAC
ASLW3Z5PAVZSWJEMMMVZT226P44EKSAD47QS72JIFJESAI3RPN3AC
K2CS6TCX2NDVL2ASEHGP4J4K4IJ6FP3ANNKTSIWVG43HPYSBX6ZQC
7K5P2GRF6QUXTMERG2R3BB6DZFQYJQ6V2KNPMBPFDLOP36NQILPAC
IIN7AVA6JYRBXH6ZYRR7BY7TV6PW7ANAQ2A3PD55FKBKKQFEEF2AC
NXVPOFYKJFWQWKVPQUMWH2Y2KJEZX44BUOBFJ4JD4KFGPEGYHG4QC
DKRSOHZXL6EPSLKOKHF7GJXSZEJVY7CXGACSHWLM5B5FTRETWWCAC
UWMN4HLG6YA2YFQEVIVMDISD6APKEPIZXMMPMNUYCBQDSAUYSXPQC
ZP2KE7A2LE7Z2S7AC45WE4CXDSEVDTWIMV2EM4IBUKXYJIDU6R7QC
JJHOTW7LDUJ6DLUG2DTFWASCAFPGD2WBW7MHBSECJZU7PTJYWQDQC
IQFLSXLOKMSMM65BL7XOEI5ZP55WKZ7BFBOIA44AMTPNJ7DAQXBQC
RPOZZWKG5GLPHVZZ7ZKMKS64ZMV2LDCQSARBJFJ6FZOTOKCQO7FAC
KFULGQQOHWUTXOM3BXCCYPGGVGGY4Z6265XUFRCBPNLTZAEHJZSQC
UDYVF65OZSNPANLHDI3ODBEGUAKAVZ4KH4OZFAKR2CQJPO4AXU6QC
R325RPUV26YH65VIJKYEFZ2XCVXQHO5N3ELPX6RNQ5TSI3JJNQGQC
QKGDOYIYKE6B36ION5O2DRW65DWWPZMYNWJVH7LJJ7FPGGM2MYAQC
OEISFRW2B7E4YRJSWXNXBH2IAJO4O3LHNYFPFD3MBY57LYVRHMZQC
6KJRTSXHM3MQVU5CLIMN5XDMCWXAHCYR4A5QKS6MGWWEI3TCXLAQC
CGYTZT5QWIEGYKUOLOK7MFXSLJKLYRZONER5ZCDZO5XYWSLG475QC
RCLZVH5IZLUUJU3XDIW4GUDJ5G73DOI3EEMRKNMCNPSSEDBU5YFAC
45CWQUPQHKUFUJ4MVL5K3KCVCCKLY2Z7RZWZ53UT723RV5STPSRAC
MRM4SLSXJTRYJPH2YYTAFTO2CAOXLP2OCMRNYRTIRRYOMWM7NMFAC
74LQ7JXVLAFSHLI7LCBKFX47CNTYSKGUQSXNX5FCIUIGCC2JTR3QC
77H4BWWPPGLM3PLZH4QTAJRXIZTSDVNCOKZE223I437FN2UJ34RQC
E5DMZFW6WCFAKTKKOQPYTQXZ2CGLWMVH64LRXDUI2UIG4VYUHIVQC
V2OQTNDCAEYXJRGSU7BG4TMLIQLT7X32ILOXW7KEWVL2R33B6XJQC
RSIUBEQUGNU4LO6KH4PKVROWQS33DAKSY4XFVGN7T3CEKSXABCSAC
BWAQ3FHBBM6G3K3KYP75CRTR343RDQZJRYX5ZGYUEXYBAC3APDLAC
R22TTMI6WXWULC7ODKFF3QCB7MOTETQQ6IR4BUCUPOCQKQNCTT5AC
QDTVLBRGHDTRUVT7I3O72K6TMOYAUSAJBZUHGOEFU2RKJNUPWZSQC
OSRZEPPGBIMSZBWIVBTZTTIMV6TEUGVZRZ5AI2ZJW7CVZZQBUIMQC
25CH7HH4LKXFIZ75YNMXS3TSXO6O27DYSOPLOD45K4OCNFWLS4LQC
NQMXQ6OQVUSC7Y7F7IL252QW4A5JED224EECNHWAM4ZZYVNY745AC
EAQJ2VSSFA3MKDR7ELP7M5VHTHGN2DCBPPZHXRAXDRKKAX2R6SHQC
TJRYL3NXPW5IUGEV3YOC7JYWEXCZDBFPLT4AUG4P227WVKVB72ZAC
YHSVOROKPYS33Y4RYZRVZTE3G5LXOFX52HEDNLV6HIXOJYNOKH3QC
RBAGQ2PB7V5YAM5KSHSZR2E3MLKDSRVM5XYGI2TIXP5QMVBOQHDQC
VD4KDTGHVKCN35AWREYB4TEOUMCTW7SAUPAMTMF5ABC7VBHVKP4AC
TZ643KHSE5CUPXFSQ7VYVOCM5MTQ7F4SENEYQX2RNFHGHLQVS3RQC
ECUYJLVGW6ADRLLF2WOMRG464VHOVDPP5OK5SAX2PHBUUC5FD4TQC
TPPJRQ2NTCV3GI2VRHEXQJREDERPJODCJWUG5WCOQGN4REPPPAMAC
bool i_feel_safe(bool announce = false, bool want_move = false);
void get_playervisible_monsters(std::vector<monsters*>& mons,
bool just_check = false, bool want_move = false,
bool dangerous = false, int range = -1);
bool i_feel_safe(bool announce = false, bool want_move = false,
bool just_monsters = false, int range = -1);
bool moving = ((!you.delay_queue.empty() &&
is_run_delay(you.delay_queue.front().type) &&
you.delay_queue.front().type != DELAY_REST) ||
you.running < RMODE_NOT_RUNNING || want_move);
bool moving = ((!you.delay_queue.empty()
&& is_run_delay(you.delay_queue.front().type)
&& you.delay_queue.front().type != DELAY_REST)
|| you.running < RMODE_NOT_RUNNING || want_move);
const int ystart = MAX(0, you.y_pos - LOS_RADIUS);
const int yend = MIN(GYM, you.y_pos + LOS_RADIUS);
const int xstart = MAX(0, you.x_pos - LOS_RADIUS);
const int xend = MIN(GXM, you.x_pos + LOS_RADIUS);
if (range == -1)
range = LOS_RADIUS;
const int ystart = MAX(0, you.y_pos - range);
const int yend = MIN(GYM, you.y_pos + range);
const int xstart = MAX(0, you.x_pos - range);
const int xend = MIN(GXM, you.x_pos + range);
mons.push_back(mon);
monsters *mon = &env.mons[targ_monst];
if ( player_monster_visible(mon)
&& !mons_is_submerged(mon)
&& (!mons_is_mimic(mon->type)
|| mons_is_known_mimic(mon))
&& (!dangerous || !mons_is_safe(mon, want_move)))
{
mons.push_back(mon);
if (just_check)
{
// one monster found, that's enough
return;
}
}
int ystart = you.y_pos - 9, xstart = you.x_pos - 9;
int yend = you.y_pos + 9, xend = you.x_pos + 9;
if ( xstart < 0 ) xstart = 0;
if ( ystart < 0 ) ystart = 0;
if ( xend >= GXM ) xend = GXM;
if ( yend >= GYM ) yend = GYM;
if (in_bounds(you.x_pos, you.y_pos)
&& env.cgrid[you.x_pos][you.y_pos] != EMPTY_CLOUD)
{
const cloud_type type =
env.cloud[ env.cgrid[you.x_pos][you.y_pos] ].type;
if (is_damaging_cloud(type, false))
{
if (announce)
mprf(MSGCH_WARN, "You're standing in a cloud of %s!",
cloud_name(type).c_str());
return (false);
}
}
// no monster will attack you inside a sanctuary,
// so presence of monsters won't matter
if (is_sanctuary(you.x_pos, you.y_pos))
return (true);
std::vector<const monsters *> mons;
// monster check
// XXX: refactor this to make use of get_playervisible_monsters()
for ( int y = ystart; y < yend; ++y )
if (!just_monsters)
// if you can see an unfriendly monster, then you feel unsafe
if ( see_grid(x,y) )
const cloud_type type =
env.cloud[ env.cgrid[you.x_pos][you.y_pos] ].type;
if (is_damaging_cloud(type, false))
const monsters *mon = &menv[targ_monst];
if ( player_monster_visible(mon) &&
!mons_is_submerged(mon) &&
!mons_is_mimic(mon->type) &&
!mons_is_safe(mon, want_move))
{
if (announce)
mons.push_back(mon);
else
{
tutorial_first_monster(*mon);
return false;
}
}
mprf(MSGCH_WARN, "You're standing in a cloud of %s!",
cloud_name(type).c_str());
if (announce)
// monster check
std::vector<monsters*> visible;
get_playervisible_monsters(visible, !announce, want_move, true, range);
// No monsters found.
if (visible.empty())
return true;
// Announce the presence of monsters (Eidolos).
if (visible.size() == 1)
m.name(DESC_NOCAP_A).c_str());
}
else if (mons.size() > 1)
{
mprf(MSGCH_WARN, "Not with these monsters around!");
m.name(DESC_NOCAP_A).c_str());
}
// Unseen monsters in shallow water show a "strange disturbance".
// (Unless flying!)
static bool _mon_submerged_in_water(const monsters *mon)
{
if (!mon)
return false;
return (grd[mon->x][mon->y] == DNGN_SHALLOW_WATER
&& see_grid(mon->x, mon->y)
&& !player_monster_visible(mon)
&& !mons_flies(mon));
if (target_unshifted &&
(key_command == CMD_TARGET_CYCLE_FORWARD
|| key_command == CMD_TARGET_CYCLE_BACK
|| key_command == CMD_TARGET_OBJ_CYCLE_FORWARD
|| key_command == CMD_TARGET_OBJ_CYCLE_BACK))
if (target_unshifted
&& (key_command == CMD_TARGET_CYCLE_FORWARD
|| key_command == CMD_TARGET_CYCLE_BACK
|| key_command == CMD_TARGET_OBJ_CYCLE_FORWARD
|| key_command == CMD_TARGET_OBJ_CYCLE_BACK))
if ( show_beam &&
in_vlos(grid2viewX(moves.tx), grid2viewY(moves.ty)) &&
moves.target() != you.pos() )
if ( show_beam
&& in_vlos(grid2viewX(moves.tx), grid2viewY(moves.ty))
&& moves.target() != you.pos() )
// Unseen monsters in shallow water show a "strange disturbance"
// (unless flying!)
if (!player_monster_visible(&menv[targ_mon]))
monsters *mon = &menv[targ_mon];
// Unknown mimics don't count as monsters, either.
if (mons_is_mimic(mon->type)
&& !(mon->flags & MF_KNOWN_MIMIC))
// since you can't see the monster, assume it's not a friend
return (mode != TARG_FRIEND
&& grd[x][y] == DNGN_SHALLOW_WATER
&& !mons_flies(&menv[targ_mon]));
return (false);
return (false);
// ... unless it creates a "disturbance in the water".
// Since you can't see the monster, assume it's not a friend.
// Also don't target submerged monsters if there are other targets
// in sight. (This might be too restrictive.)
return (mode != TARG_FRIEND
&& _mon_submerged_in_water(mon)
&& i_feel_safe(false, false, true, range));