diff options
author | dshaligram <dshaligram@c06c8d41-db1a-0410-9941-cceddc491573> | 2007-06-26 17:43:23 +0000 |
---|---|---|
committer | dshaligram <dshaligram@c06c8d41-db1a-0410-9941-cceddc491573> | 2007-06-26 17:43:23 +0000 |
commit | ab091d9b7fca62f5bd9082624132f30a43fb49db (patch) | |
tree | 7069fd89116b7d39e9d3f4e34df06719c2a30088 /crawl-ref/source/mtransit.cc | |
parent | b596b1006e93994e7f3992c48908b8b841aac9c0 (diff) | |
download | crawl-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.cc | 37 |
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); |