[Hide Content]From 8876efb7670759774a461a5529bbc1698d8c8f09 Mon Sep 17 00:00:00 2001
From: Neil Moore <neil@s-z.org>
Date: Tue, 24 Feb 2015 13:06:14 -0500
Subject: [PATCH] Reset offlevel companions after linking items (#9350)
---
crawl-ref/source/tags.cc | 26 ++++++++++++++++++--------
1 file changed, 18 insertions(+), 8 deletions(-)
diff --git a/crawl-ref/source/tags.cc b/crawl-ref/source/tags.cc
index 28b3198..a0c3f3d 100644
--- a/crawl-ref/source/tags.cc
+++ b/crawl-ref/source/tags.cc
@@ -303,7 +303,8 @@ static void tag_construct_level_monsters(writer &th);
static void tag_construct_level_tiles(writer &th);
static void tag_read_level(reader &th);
static void tag_read_level_items(reader &th);
-static void tag_read_level_monsters(reader &th);
+// Next one returns a list of monsters that need to be reset.
+static vector<monster *> tag_read_level_monsters(reader &th);
static void tag_read_level_tiles(reader &th);
static void _regenerate_tile_flavour();
static void _draw_tiles();
@@ -1228,15 +1229,24 @@ void tag_read(reader &inf, tag_type tag_id)
check_selected_skills();
break;
case TAG_LEVEL:
+ {
tag_read_level(th);
EAT_CANARY;
tag_read_level_items(th);
EAT_CANARY;
- tag_read_level_monsters(th);
+ vector<monster *> to_reset = tag_read_level_monsters(th);
EAT_CANARY;
// We have to do this here because tag_read_level_tiles() can
- // call into Lua, which can look at the items ...
+ // call into Lua, which can look at the items. Likewise before
+ // resetting elsewhere companions.
link_items();
+ for (auto mons : to_reset)
+ {
+ dprf("Killed elsewhere companion %s(%d) on %s",
+ mons->name(DESC_PLAIN, true).c_str(), mons->mid,
+ level_id::current().describe(false, true).c_str());
+ monster_die(mons, KILL_RESET, -1, true, false);
+ }
#if TAG_MAJOR_VERSION == 34
_add_missing_branches();
#endif
@@ -1266,6 +1276,7 @@ void tag_read(reader &inf, tag_type tag_id)
}
#endif
break;
+ }
case TAG_GHOST:
tag_read_ghost(th);
break;
@@ -5620,11 +5631,12 @@ void unmarshallMonster(reader &th, monster& m)
m.check_speed();
}
-static void tag_read_level_monsters(reader &th)
+static vector<monster *> tag_read_level_monsters(reader &th)
{
int i;
int count;
+ vector<monster *> needs_reset;
reset_all_monsters();
// how many mons_alloc?
@@ -5654,10 +5666,7 @@ static void tag_read_level_monsters(reader &th)
env.mid_cache[m.mid] = i;
if (m.is_divine_companion() && companion_is_elsewhere(m.mid))
{
- dprf("Killed elsewhere companion %s(%d) on %s",
- m.name(DESC_PLAIN, true).c_str(), m.mid,
- level_id::current().describe(false, true).c_str());
- monster_die(&m, KILL_RESET, -1, true, false);
+ needs_reset.push_back(&m);
continue;
}
@@ -5718,6 +5727,7 @@ static void tag_read_level_monsters(reader &th)
}
}
#endif
+ return needs_reset;
}
static void _debug_count_tiles()
--
2.1.3