to cause a non-standard context to be passed to interrupt_activity( AI_SEE_MONSTER ) if it is called before the current turn is over.
If a submerged monster surfaces in order to shout, it has to wait one turn before being able to submerge again.
Added back in a scroll named "forgetfullness", but rather than giving amnesia about the map it gives amnesia about non-equipped inventory items. I tried to make the effects annoying rather than serious.
git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@2481 c06c8d41-db1a-0410-9941-cceddc491573
OONYLF4DAPLIYLBNNRW74IVT5BBTWI4XHQBXSNSPVRX3FTKJBTRAC
PHK4J7Z42F72MFDTU7QL472BQZUWHQBZ4DIHYXWKQZBJMESQ3YDQC
LJK4ZQATLSB4MKZG3ARZX5V6RFGTN3NLCN6GTCUGJQKU26SOXMUAC
ZCRK2DJ5VKECRQXZTWT4NUDL2VT5ZHUK7NT6NQPLRJ56TDX5PJSAC
QNIQ2NBBIERVCA2YTD3O3P6QPJ5M6VDVGGX7V2BWXTW5553T4PVAC
PFEJ4LMDNEKLMGRCMWQ7EIRVU4JMYGICI4G7X4WVWOROVXQCBZ7QC
K2CS6TCX2NDVL2ASEHGP4J4K4IJ6FP3ANNKTSIWVG43HPYSBX6ZQC
6BO27PEAAOYJEOL5F5RWDMSLU7WUYSKC4LCANVIDMRZRMZWCEYUAC
UWMN4HLG6YA2YFQEVIVMDISD6APKEPIZXMMPMNUYCBQDSAUYSXPQC
ANOEQTM6IGCBTESKKQ5PCBSDTZ7VGRCMDIOAFEH4R7DJHKWKDFAAC
LLKV4OYGEDB4GVJS5JVBZP5JQFW7VMPZ2CBRSITJ5XCFS3QNWIBQC
QDWDUURSNLMT6AXNNJ3DEQCWAKCAIHV6MP5F7QGIBGXOG2BI2NPQC
L254F6ZIU2HWGLFFGPIORTN4C3TDQ3E5JZ7Z7GQA5AEDIKL6PKDAC
5BJPWUPLJFS34FUTFJVKA4A52YMIGV6EWDXLNSDCWBJWBGVSQFGQC
4JJ6TWOZOPXBIOEQA2CXASS2TO5AMNXNY7LG67NXIVLDVJTJW6KAC
7AMQN7MITMXBNVDAK5VOXTQ4TZIAOD6ZLOFJG7GQMBTY23Y2BKSAC
GTXKQTORYHZ7XB2VIH6372UM5GMWAN7IVRXWY5FGBCHFGBV6D6NAC
DTO3EUKWHZ5RJNGNCFYXSOVTIPVXPP637F2W7WFGYKJ7JK7VNKNQC
SVY2PTCLXR3KNPQAWXVXTTGCC5DR334HOAKHYO3VDDRWM2BWMALAC
RPOZZWKG5GLPHVZZ7ZKMKS64ZMV2LDCQSARBJFJ6FZOTOKCQO7FAC
VNHFP63ZLLZU3A3PLXP4BITX57DUIYDHFOHQYK3BOBHV3S64G26QC
R22TTMI6WXWULC7ODKFF3QCB7MOTETQQ6IR4BUCUPOCQKQNCTT5AC
}
}
static void handle_seen_interrupt(monsters* monster)
{
activity_interrupt_data aid(monster);
if (monster->seen_context != "")
aid.context = monster->seen_context;
else if (testbits(monster->flags, MF_WAS_IN_VIEW))
aid.context = "already seen";
else
aid.context = "newly seen";
if (!mons_is_safe( static_cast<const monsters*>(monster) )
&& !mons_class_flag( monster->type, M_NO_EXP_GAIN )
&& !mons_is_mimic( monster->type ))
{
interrupt_activity( AI_SEE_MONSTER, aid );
activity_interrupt_data aid(monster);
if (testbits(monster->flags, MF_WAS_IN_VIEW))
aid.context = "already seen";
else
aid.context = "newly seen";
if (!mons_is_safe( static_cast<const monsters*>(monster) )
&& !mons_class_flag( monster->type, M_NO_EXP_GAIN )
&& !mons_is_mimic( monster->type ))
{
interrupt_activity( AI_SEE_MONSTER, aid );
}
seen_monster( monster );
// Monster was viewed this turn
monster->flags |= MF_WAS_IN_VIEW;
handle_seen_interrupt(monster);
// FIXME This is better expressed as a
// function such as
// monster_has_ranged_attack:
&& monster->type != MONS_ELECTRICAL_EEL
&& monster->type != MONS_LAVA_SNAKE
&& (monster->type != MONS_MERMAID
|| you.species == SP_MERFOLK)
&& !one_chance_in(20)) )
// FIXME This is better expressed as a
// function such as
// monster_has_ranged_attack:
&& monster->type != MONS_ELECTRICAL_EEL
&& monster->type != MONS_LAVA_SNAKE
&& (monster->type != MONS_MERMAID
|| you.species == SP_MERFOLK)
// Don't submerge if we just unsubmerged for
// the sake of shouting.
&& monster->seen_context != "bursts forth shouting"
&& !one_chance_in(20)) ))
bool forget_inventory(bool quiet)
{
int items_forgotten = 0;
for (int i = 0; i < ENDOFPACK; i++)
{
item_def& item(you.inv[i]);
if (!is_valid_item(item) || item_is_equipped(item))
continue;
unsigned long orig_flags = item.flags;
unset_ident_flags(item, ISFLAG_KNOW_CURSE);
// Don't forget times used or uses left for wands or decks.
if (item.base_type != OBJ_WANDS && item.base_type != OBJ_MISCELLANY)
unset_ident_flags(item, ISFLAG_KNOW_PLUSES);
if (!is_artefact(item))
{
switch (item.base_type)
{
case OBJ_WEAPONS:
case OBJ_ARMOUR:
case OBJ_BOOKS:
case OBJ_STAVES:
case OBJ_MISCELLANY:
// Don't forget identity of decks if it the player has
// used any of its cards, or knows how many are left.
if (!is_deck(item) || item.plus2 == 0)
unset_ident_flags(item, ISFLAG_KNOW_TYPE);
break;
default:
break;
}
}
// Non-jewellery artifacts can easily be re-identified by
// equipping them.
else if (item.base_type != OBJ_JEWELLERY)
unset_ident_flags(item, ISFLAG_KNOW_TYPE | ISFLAG_KNOW_PROPERTIES);
if (item.flags != orig_flags)
items_forgotten++;
}
if (items_forgotten > 0)
mpr("Wait, did you forget something?");
return (items_forgotten > 0);
}