summaryrefslogtreecommitdiffstats
path: root/crawl-ref
diff options
context:
space:
mode:
authorzelgadis <zelgadis@c06c8d41-db1a-0410-9941-cceddc491573>2009-01-20 07:39:59 +0000
committerzelgadis <zelgadis@c06c8d41-db1a-0410-9941-cceddc491573>2009-01-20 07:39:59 +0000
commite3a40721bf278235aa56dc0c39b8f3cb4e6cd179 (patch)
treee4320afa308a474229574182d7ff34a61c6b334c /crawl-ref
parent9e60cc1e813f6575d09d8daad12a893b69145091 (diff)
downloadcrawl-ref-e3a40721bf278235aa56dc0c39b8f3cb4e6cd179.tar.gz
crawl-ref-e3a40721bf278235aa56dc0c39b8f3cb4e6cd179.zip
Yet another attempt to fix problems with the monster "comes into view"
messsages. Such messages are not not flushed immediately upon the monster coming into view, but: 1) After world_reacts() is done. 2) When mpr() is called and the player is either delayed or repeating a command. This should make sure that the "comes into view" message comes before any other messages the monster might give, and also fix the problem of the player moving into a monster's LOS, getting a "comes into view" message, and the monster then moving back out of LOS during the immediately following world_reacts(), which would leave the player puzzled as to why there's no monster in view. As part of the change you.turn_is_over is set to true as soon as world_reacts() starts, which might cause bugs in other places, yet some play testing indicates that it's okay. git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@8621 c06c8d41-db1a-0410-9941-cceddc491573
Diffstat (limited to 'crawl-ref')
-rw-r--r--crawl-ref/source/acr.cc6
-rw-r--r--crawl-ref/source/message.cc12
-rw-r--r--crawl-ref/source/mon-util.cc3
-rw-r--r--crawl-ref/source/monstuff.cc17
-rw-r--r--crawl-ref/source/view.cc20
5 files changed, 40 insertions, 18 deletions
diff --git a/crawl-ref/source/acr.cc b/crawl-ref/source/acr.cc
index ebe09fae0e..88cec101ae 100644
--- a/crawl-ref/source/acr.cc
+++ b/crawl-ref/source/acr.cc
@@ -1517,11 +1517,11 @@ static void _input()
return;
}
+ update_monsters_in_view();
+
you.turn_is_over = false;
_prep_input();
- update_monsters_in_view();
-
const bool player_feels_safe = i_feel_safe();
if (Options.tutorial_left)
@@ -3113,6 +3113,8 @@ static void _check_sanctuary()
void world_reacts()
{
+ you.turn_is_over = true;
+
if (!crawl_state.arena)
religion_turn_end();
diff --git a/crawl-ref/source/message.cc b/crawl-ref/source/message.cc
index 0fd2787973..467b899600 100644
--- a/crawl-ref/source/message.cc
+++ b/crawl-ref/source/message.cc
@@ -417,6 +417,8 @@ void mprf( const char *format, ... )
va_end( argp );
}
+static bool _updating_view = false;
+
void mpr(const char *inf, msg_channel_type channel, int param)
{
if (_msg_dump_file != NULL)
@@ -459,6 +461,16 @@ void mpr(const char *inf, msg_channel_type channel, int param)
return;
}
+ // Flush out any "comes into view" monster announcements before the
+ // monster has a chance to give any other messages.
+ if (!_updating_view && you.turn_is_over
+ && (you_are_delayed() || crawl_state.is_repeating_cmd()))
+ {
+ _updating_view = true;
+ update_monsters_in_view();
+ _updating_view = false;
+ }
+
if (channel == MSGCH_GOD && param == 0)
param = you.religion;
diff --git a/crawl-ref/source/mon-util.cc b/crawl-ref/source/mon-util.cc
index d6e6a619f2..8298020cad 100644
--- a/crawl-ref/source/mon-util.cc
+++ b/crawl-ref/source/mon-util.cc
@@ -7583,9 +7583,6 @@ void monsters::check_redraw(const coord_def &old) const
view_update_at(pos());
if (see_old)
view_update_at(old);
- // Force "comes into view" message to be given.
- if (see_new && !see_old)
- viewwindow(false, false);
update_screen();
}
}
diff --git a/crawl-ref/source/monstuff.cc b/crawl-ref/source/monstuff.cc
index 9199d78f98..f59f53f4ce 100644
--- a/crawl-ref/source/monstuff.cc
+++ b/crawl-ref/source/monstuff.cc
@@ -4912,10 +4912,19 @@ static void _handle_nearby_ability(monsters *monster)
#define MON_SPEAK_CHANCE 21
- if ((mons_class_flag(monster->type, M_SPEAKS)
- || !monster->mname.empty())
- && (!mons_is_wandering(monster) || monster->attitude == ATT_NEUTRAL)
- && one_chance_in(MON_SPEAK_CHANCE))
+ if (monster->is_patrolling() || mons_is_wandering(monster)
+ || monster->attitude == ATT_NEUTRAL)
+ {
+ // Very fast wandering/patrolling monsters might, in one monster turn,
+ // move into the player's LOS and then back out (or the player
+ // might move into their LOS and the monster move back out before
+ // the player's view has a chance to update) so prevent them
+ // from speaking.
+ ;
+ }
+ else if ((mons_class_flag(monster->type, M_SPEAKS)
+ || !monster->mname.empty())
+ && one_chance_in(MON_SPEAK_CHANCE))
{
mons_speaks(monster);
}
diff --git a/crawl-ref/source/view.cc b/crawl-ref/source/view.cc
index 9066ba744c..f7a62bc8a7 100644
--- a/crawl-ref/source/view.cc
+++ b/crawl-ref/source/view.cc
@@ -1224,9 +1224,6 @@ void monster_grid(bool do_updates)
if (monster->alive() && mons_near(monster))
{
- if (player_monster_visible(monster))
- _handle_seen_interrupt(monster);
-
if (do_updates && (mons_is_sleeping(monster)
|| mons_is_wandering(monster))
&& check_awaken(monster))
@@ -1277,12 +1274,6 @@ void update_monsters_in_view()
if (!monster->alive())
continue;
- monster->flags &= ~MF_WAS_IN_VIEW;
-
- // If the monster hasn't been seen by the time that the player
- // gets control back then seen_context is out of date.
- monster->seen_context.clear();
-
if (mons_near(monster))
{
if (monster->attitude == ATT_HOSTILE)
@@ -1292,9 +1283,20 @@ void update_monsters_in_view()
&& (!mons_is_mimic(monster->type)
|| mons_is_known_mimic(monster)))
{
+ if (!(monster->flags & MF_WAS_IN_VIEW) && you.turn_is_over)
+ _handle_seen_interrupt(monster);
+
seen_monster(monster);
}
+ else
+ monster->flags &= ~MF_WAS_IN_VIEW;
}
+ else
+ monster->flags &= ~MF_WAS_IN_VIEW;
+
+ // If the monster hasn't been seen by the time that the player
+ // gets control back then seen_context is out of date.
+ monster->seen_context.clear();
}
// Xom thinks it's hilarious the way the player picks up an ever