summaryrefslogtreecommitdiffstats
path: root/crawl-ref/source/mtransit.cc
diff options
context:
space:
mode:
authordshaligram <dshaligram@c06c8d41-db1a-0410-9941-cceddc491573>2007-06-26 17:43:23 +0000
committerdshaligram <dshaligram@c06c8d41-db1a-0410-9941-cceddc491573>2007-06-26 17:43:23 +0000
commitab091d9b7fca62f5bd9082624132f30a43fb49db (patch)
tree7069fd89116b7d39e9d3f4e34df06719c2a30088 /crawl-ref/source/mtransit.cc
parentb596b1006e93994e7f3992c48908b8b841aac9c0 (diff)
downloadcrawl-ref-ab091d9b7fca62f5bd9082624132f30a43fb49db.tar.gz
crawl-ref-ab091d9b7fca62f5bd9082624132f30a43fb49db.zip
Followers are now placed on the transit list so that crashes or saves between
levels don't lose following monsters. git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@1661 c06c8d41-db1a-0410-9941-cceddc491573
Diffstat (limited to 'crawl-ref/source/mtransit.cc')
-rw-r--r--crawl-ref/source/mtransit.cc37
1 files changed, 31 insertions, 6 deletions
diff --git a/crawl-ref/source/mtransit.cc b/crawl-ref/source/mtransit.cc
index 05f43bc543..01a57917dd 100644
--- a/crawl-ref/source/mtransit.cc
+++ b/crawl-ref/source/mtransit.cc
@@ -17,7 +17,8 @@
monsters_in_transit the_lost_ones;
-static void place_lost_monsters(m_transit_list &m);
+static void level_place_lost_monsters(m_transit_list &m);
+static void level_place_followers(m_transit_list &m);
static void cull_lost(m_transit_list &mlist, int how_many)
{
@@ -61,25 +62,34 @@ void add_monster_to_transit(const level_id &lid, const monsters &m)
cull_lost(mlist, how_many);
}
-void place_transiting_monsters()
+void place_lost_ones(void (*placefn)(m_transit_list &ml))
{
level_id c = level_id::current();
monsters_in_transit::iterator i = the_lost_ones.find(c);
if (i == the_lost_ones.end())
return;
-
- place_lost_monsters(i->second);
+ placefn(i->second);
if (i->second.empty())
the_lost_ones.erase(i);
}
+void place_transiting_monsters()
+{
+ place_lost_ones(level_place_lost_monsters);
+}
+
+void place_followers()
+{
+ place_lost_ones(level_place_followers);
+}
+
static bool place_lost_monster(follower &f)
{
return (f.place(false));
}
-static void place_lost_monsters(m_transit_list &m)
+static void level_place_lost_monsters(m_transit_list &m)
{
for (m_transit_list::iterator i = m.begin();
i != m.end(); )
@@ -95,6 +105,17 @@ static void place_lost_monsters(m_transit_list &m)
}
}
+static void level_place_followers(m_transit_list &m)
+{
+ for (m_transit_list::iterator i = m.begin();
+ i != m.end(); )
+ {
+ m_transit_list::iterator mon = i++;
+ if ((mon->mons.flags & MF_TAKING_STAIRS) && mon->place(true))
+ m.erase(mon);
+ }
+}
+
//////////////////////////////////////////////////////////////////////////
// follower
@@ -128,7 +149,11 @@ bool follower::place(bool near_player)
m.name(DESC_PLAIN).c_str());
#endif
m.target_x = m.target_y = 0;
- m.flags |= MF_JUST_SUMMONED;
+
+ if (m.flags & MF_TAKING_STAIRS)
+ m.flags &= ~MF_TAKING_STAIRS;
+ else
+ m.flags |= MF_JUST_SUMMONED;
restore_mons_items(m);
return (true);