to immediately move out of view, by introducing the notion of the currently acting monster to crawl_state, and only flushing out the "comes into view" message in mpr() for the currently acting monster. Not sure if it's worth it just for the sake of avoiding doing a "has this monster just now come into view" check in every place that a monster might issue a message, but at least this way we won't miss any places such a check should be placed.
git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@8623 c06c8d41-db1a-0410-9941-cceddc491573
IH5TVAZGKN7IQOTSOJ56WG5C3CMTG3AI63XT3XVNHC7DI4N2TSUAC
2J3TK3NYTO5XO6IHLTV5O6B3HYN2NHXD5ST3WLL5KPTUOVS5F3RQC
KOMZPTDEZP3P6EWBUECWDY7OWELOUTMAUKNEOJ7PWX5LJBTMRVQAC
5FHHUWTO4RQF244PHWV237WRNIXCZX5Q2KRX7VKDDUQWEXAL24NAC
DGPZZUWTMWADFTFLZ37DHWXXDXMBZHROCFTYL472HI6ETGEK6CBAC
RPOZZWKG5GLPHVZZ7ZKMKS64ZMV2LDCQSARBJFJ6FZOTOKCQO7FAC
K2CS6TCX2NDVL2ASEHGP4J4K4IJ6FP3ANNKTSIWVG43HPYSBX6ZQC
PFEJ4LMDNEKLMGRCMWQ7EIRVU4JMYGICI4G7X4WVWOROVXQCBZ7QC
JESCEQPAFC23D6BUZMBOB4M54XT3GQZJYT7NCJ556LEUCHRER3SQC
J6APXOT4QOGQFONWB7G546VTVF6QG42HVOROMHF7YBDJPR4K26OAC
R2DQBWKIW7YUJB5SOQ7J274JIYRVX4H3ISFRPAL5RG2RVVP4G2KAC
IQGGFC563RBS7GDOACKCLXK752EE5RC3T6G5L6H446SXTMSA7T2AC
SVY2PTCLXR3KNPQAWXVXTTGCC5DR334HOAKHYO3VDDRWM2BWMALAC
JM7UAK777RAVDAVLQLEOBRTGNW2B47S5G55XITJXO243IUNZHVYQC
V633AMMPMHJB5ZLP5IHFXCT6FCENVTPX25TY7T5MF2QZLDDN24HAC
MSMWAL6JZAWNGZXCNXPATUMAU6TVXBWWFY666P7UBSZ5LPYJYUCQC
KAOE5HB3THUKVGFZRO5EZESHEB3Q34WUO5DFMLWIKOBF47LZTIYAC
DHNUPA6HR4UKT2RDHOPPVMKCAGQNRWF4NYJIKIJEHK5AZFAX3HQAC
22MF6OUN62WDBJR5QFNJTKU7Q5TIQ76XWCEIRBFWAZDMZUSKJGCAC
ANOEQTM6IGCBTESKKQ5PCBSDTZ7VGRCMDIOAFEH4R7DJHKWKDFAAC
L6RNMJ4AGWWA5FRQW5QRCFY5OD5NUB5QF7H36TNIKQYRTR2KPYPAC
RYT42Z6CED4KV5CCJ45CHZ3DQGLFMDCVH6CSQZNXOILULDG4MXVQC
IYMUEJG2VI3TV7HVAZIU2L4DVQY7VNSIFVV4I3QIVP7H66EVJISAC
Q3B3UVMYEVC4YJUPYVSNTR4DJH4E6J4JJDHZNT5LNOCHCPPMEMXAC
void flush_comes_into_view()
{
if (!you.turn_is_over
|| (!you_are_delayed() && !crawl_state.is_repeating_cmd()))
{
return;
}
monsters* mon = crawl_state.which_mon_acting();
if (!mon || !mon->alive() || (mon->flags & MF_WAS_IN_VIEW)
|| !you.can_see(mon))
{
return;
}
_handle_seen_interrupt(mon);
}
mon_act = NULL;
if (mon_act_stack.size() > 0)
{
mon_act = *(mon_act_stack.end());
ASSERT(!invalid_monster(mon_act));
mon_act_stack.pop_back();
}
}
void game_state::clear_mon_acting()
{
mon_act = NULL;
mon_act_stack.clear();
}
void game_state::mon_gone(monsters* mon)
{
for (unsigned int i = 0, size = mon_act_stack.size(); i < size; i++)
{
if (mon_act_stack[i] == mon)
{
mon_act_stack.erase(mon_act_stack.begin() + i);
i--;
}
}
if (mon_act == mon)
dec_mon_acting(mon);
}