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 enoughreturn;}}
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 matterif (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 unsafeif ( 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 checkstd::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 friendreturn (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));