Attached Files |
0001-Mark-unique-subvaults-temporarily-used-6328.patch [^] (5,722 bytes) 2012-12-28 05:13 [Show Content] [Hide Content]From c357d157b87d83bc5cd240a668eaa8a4eb4e9d91 Mon Sep 17 00:00:00 2001
From: Zannick <jokeserver@gmail.com>
Date: Thu, 27 Dec 2012 19:35:52 -0800
Subject: [PATCH] Mark unique subvaults temporarily used (#6328).
---
crawl-ref/source/dungeon.cc | 5 ++++-
crawl-ref/source/env.h | 3 +++
crawl-ref/source/mapdef.cc | 31 +++++++++++++++++++++++++++----
crawl-ref/source/maps.cc | 1 +
4 files changed, 35 insertions(+), 5 deletions(-)
diff --git a/crawl-ref/source/dungeon.cc b/crawl-ref/source/dungeon.cc
index e18a787..12a2514 100644
--- a/crawl-ref/source/dungeon.cc
+++ b/crawl-ref/source/dungeon.cc
@@ -632,7 +632,8 @@ static void _set_grd(const coord_def &c, dungeon_feature_type feat)
}
static void _dgn_register_vault(const string name, const string spaced_tags)
-{ if (spaced_tags.find(" allow_dup ") == string::npos)
+{
+ if (spaced_tags.find(" allow_dup ") == string::npos)
you.uniq_map_names.insert(name);
if (spaced_tags.find(" luniq ") != string::npos)
@@ -999,6 +1000,7 @@ void dgn_register_place(const vault_placement &place, bool register_vault)
}
env.new_subvault_names.clear();
env.new_subvault_tags.clear();
+ env.new_used_subvault_names.clear();
// Identify each square in the map with its map_index.
if (!overwritable && !transparent)
@@ -1174,6 +1176,7 @@ void dgn_reset_level(bool enable_random_maps)
dgn_colour_grid.reset(NULL);
env.new_subvault_names.clear();
env.new_subvault_tags.clear();
+ env.new_used_subvault_names.clear();
use_random_maps = enable_random_maps;
dgn_check_connectivity = false;
diff --git a/crawl-ref/source/env.h b/crawl-ref/source/env.h
index a096b8c..981766a 100644
--- a/crawl-ref/source/env.h
+++ b/crawl-ref/source/env.h
@@ -124,6 +124,9 @@ struct crawl_environment
// A stack that accumulates subvaults being placed. A failure may pop a
// part of the stack before retrying.
vector<string> new_subvault_names, new_subvault_tags;
+ // A set of the unique subvaults being placed. These are considered used
+ // for the purposes of placing additional subvaults.
+ string_set new_used_subvault_names;
// Vault currently being placed, for crash dump purposes.
string placing_vault;
diff --git a/crawl-ref/source/mapdef.cc b/crawl-ref/source/mapdef.cc
index f1d9519..ddd175f 100644
--- a/crawl-ref/source/mapdef.cc
+++ b/crawl-ref/source/mapdef.cc
@@ -2184,6 +2184,8 @@ bool map_def::map_already_used() const
return (you.uniq_map_names.find(name) != you.uniq_map_names.end()
|| (env.level_uniq_maps.find(name) !=
env.level_uniq_maps.end())
+ || (env.new_used_subvault_names.find(name) !=
+ env.new_used_subvault_names.end())
|| has_any_tag(you.uniq_map_tags.begin(),
you.uniq_map_tags.end())
|| has_any_tag(env.level_uniq_map_tags.begin(),
@@ -3145,6 +3147,22 @@ string map_def::subvault_from_tagstring(const string &sub)
return "";
}
+static void _reset_subvault_stack(const int reg_stack)
+{
+ env.new_subvault_names.resize(reg_stack);
+ env.new_subvault_tags.resize(reg_stack);
+
+ env.new_used_subvault_names.clear();
+ for (int i = 0; i < reg_stack; i++)
+ {
+ if (env.new_subvault_tags[i].find(" allow_dup ") == string::npos
+ || env.new_subvault_tags[i].find(" luniq ") != string::npos)
+ {
+ env.new_used_subvault_names.insert(env.new_subvault_names[i]);
+ }
+ }
+}
+
string map_def::apply_subvault(string_spec &spec)
{
// Find bounding box for key glyphs
@@ -3163,6 +3181,7 @@ string map_def::apply_subvault(string_spec &spec)
// Remember the subvault registration pointer, so we can clear it.
const int reg_stack = env.new_subvault_names.size();
ASSERT(reg_stack == (int)env.new_subvault_tags.size());
+ ASSERT(reg_stack >= (int)env.new_used_subvault_names.size());
const int max_tries = 100;
int ntries = 0;
@@ -3173,8 +3192,7 @@ string map_def::apply_subvault(string_spec &spec)
// Each iteration, restore tags and names. This is because this vault
// may successfully load a subvault (registering its tag and name), but
// then itself fail.
- env.new_subvault_names.resize(reg_stack);
- env.new_subvault_tags.resize(reg_stack);
+ _reset_subvault_stack(reg_stack);
const map_def *orig = random_map_for_tag(tag, true);
if (!orig)
@@ -3199,12 +3217,17 @@ string map_def::apply_subvault(string_spec &spec)
env.new_subvault_names.push_back(vault.name);
env.new_subvault_tags.push_back(vault.tags);
+ if (vault.tags.find(" allow_dup ") == string::npos
+ || vault.tags.find(" luniq ") != string::npos)
+ {
+ env.new_used_subvault_names.insert(vault.name);
+ }
+
return "";
}
// Failure, drop subvault registrations.
- env.new_subvault_names.resize(reg_stack);
- env.new_subvault_tags.resize(reg_stack);
+ _reset_subvault_stack(reg_stack);
return (make_stringf("Could not fit '%s' in (%d,%d) to (%d, %d).",
tag.c_str(), tl.x, tl.y, br.x, br.y));
diff --git a/crawl-ref/source/maps.cc b/crawl-ref/source/maps.cc
index 3e26fd0..49e73ef 100644
--- a/crawl-ref/source/maps.cc
+++ b/crawl-ref/source/maps.cc
@@ -109,6 +109,7 @@ static map_section_type _write_vault(map_def &mdef,
// We're a regular vault, so clear the subvault stack.
env.new_subvault_names.clear();
env.new_subvault_tags.clear();
+ env.new_used_subvault_names.clear();
mdef.load();
--
1.7.4.4
0002-Track-unique-tags-while-placing-subvaults-6328.patch [^] (6,394 bytes) 2012-12-31 03:36 [Show Content] [Hide Content]From 2e4f1f83ff0f7ad897030f93167b85e58c9466e2 Mon Sep 17 00:00:00 2001
From: Zannick <jokeserver@gmail.com>
Date: Sun, 30 Dec 2012 18:27:30 -0800
Subject: [PATCH] Track unique tags while placing subvaults (#6328).
---
crawl-ref/source/dungeon.cc | 9 +++------
crawl-ref/source/env.h | 2 ++
crawl-ref/source/mapdef.cc | 43 ++++++++++++++++++++++++++++++++-----------
crawl-ref/source/mapdef.h | 2 ++
crawl-ref/source/maps.cc | 4 +---
5 files changed, 40 insertions(+), 20 deletions(-)
diff --git a/crawl-ref/source/dungeon.cc b/crawl-ref/source/dungeon.cc
index 12a2514..90875fd 100644
--- a/crawl-ref/source/dungeon.cc
+++ b/crawl-ref/source/dungeon.cc
@@ -48,6 +48,7 @@
#include "lev-pand.h"
#include "libutil.h"
#include "makeitem.h"
+#include "mapdef.h"
#include "mapmark.h"
#include "maps.h"
#include "message.h"
@@ -998,9 +999,7 @@ void dgn_register_place(const vault_placement &place, bool register_vault)
_dgn_register_vault(env.new_subvault_names[i],
env.new_subvault_tags[i]);
}
- env.new_subvault_names.clear();
- env.new_subvault_tags.clear();
- env.new_used_subvault_names.clear();
+ clear_subvault_stack();
// Identify each square in the map with its map_index.
if (!overwritable && !transparent)
@@ -1165,6 +1164,7 @@ void dgn_reset_level(bool enable_random_maps)
env.level_uniq_maps.clear();
env.level_uniq_map_tags.clear();
env.level_vault_list.clear();
+ clear_subvault_stack();
you.unique_creatures = temp_unique_creatures;
you.unique_items = temp_unique_items;
@@ -1174,9 +1174,6 @@ void dgn_reset_level(bool enable_random_maps)
env.level_layout_types.clear();
level_clear_vault_memory();
dgn_colour_grid.reset(NULL);
- env.new_subvault_names.clear();
- env.new_subvault_tags.clear();
- env.new_used_subvault_names.clear();
use_random_maps = enable_random_maps;
dgn_check_connectivity = false;
diff --git a/crawl-ref/source/env.h b/crawl-ref/source/env.h
index 981766a..027be74 100644
--- a/crawl-ref/source/env.h
+++ b/crawl-ref/source/env.h
@@ -127,6 +127,8 @@ struct crawl_environment
// A set of the unique subvaults being placed. These are considered used
// for the purposes of placing additional subvaults.
string_set new_used_subvault_names;
+ // A set of uniq_ or luniq_ map tags being placed.
+ string_set new_used_subvault_tags;
// Vault currently being placed, for crash dump purposes.
string placing_vault;
diff --git a/crawl-ref/source/mapdef.cc b/crawl-ref/source/mapdef.cc
index ddd175f..fbdbce0 100644
--- a/crawl-ref/source/mapdef.cc
+++ b/crawl-ref/source/mapdef.cc
@@ -96,6 +96,14 @@ static int find_weight(string &s, int defweight = TAG_UNFOUND)
return (weight == TAG_UNFOUND? defweight : weight);
}
+void clear_subvault_stack(void)
+{
+ env.new_subvault_names.clear();
+ env.new_subvault_tags.clear();
+ env.new_used_subvault_names.clear();
+ env.new_used_subvault_tags.clear();
+}
+
void map_register_flag(const string &flag)
{
Map_Flag_Names.insert(flag);
@@ -2189,7 +2197,9 @@ bool map_def::map_already_used() const
|| has_any_tag(you.uniq_map_tags.begin(),
you.uniq_map_tags.end())
|| has_any_tag(env.level_uniq_map_tags.begin(),
- env.level_uniq_map_tags.end()));
+ env.level_uniq_map_tags.end())
+ || has_any_tag(env.new_used_subvault_tags.begin(),
+ env.new_used_subvault_tags.end()));
}
bool map_def::valid_item_array_glyph(int gly)
@@ -3147,19 +3157,34 @@ string map_def::subvault_from_tagstring(const string &sub)
return "";
}
+static void _register_subvault(const string name, const string spaced_tags)
+{
+ if (spaced_tags.find(" allow_dup ") == string::npos
+ || spaced_tags.find(" luniq ") != string::npos)
+ {
+ env.new_used_subvault_names.insert(name);
+ }
+
+ vector<string> tags = split_string(" ", spaced_tags);
+ for (int t = 0, ntags = tags.size(); t < ntags; t++)
+ {
+ const string &tag = tags[t];
+ if (tag.find("uniq_") == 0 || tag.find("luniq_") == 0)
+ env.new_used_subvault_tags.insert(tag);
+ }
+}
+
static void _reset_subvault_stack(const int reg_stack)
{
env.new_subvault_names.resize(reg_stack);
env.new_subvault_tags.resize(reg_stack);
env.new_used_subvault_names.clear();
+ env.new_used_subvault_tags.clear();
for (int i = 0; i < reg_stack; i++)
{
- if (env.new_subvault_tags[i].find(" allow_dup ") == string::npos
- || env.new_subvault_tags[i].find(" luniq ") != string::npos)
- {
- env.new_used_subvault_names.insert(env.new_subvault_names[i]);
- }
+ _register_subvault(env.new_subvault_names[i],
+ env.new_subvault_tags[i]);
}
}
@@ -3217,11 +3242,7 @@ string map_def::apply_subvault(string_spec &spec)
env.new_subvault_names.push_back(vault.name);
env.new_subvault_tags.push_back(vault.tags);
- if (vault.tags.find(" allow_dup ") == string::npos
- || vault.tags.find(" luniq ") != string::npos)
- {
- env.new_used_subvault_names.insert(vault.name);
- }
+ _register_subvault(vault.name, vault.tags);
return "";
}
diff --git a/crawl-ref/source/mapdef.h b/crawl-ref/source/mapdef.h
index c5d3d40..9a7a7cb 100644
--- a/crawl-ref/source/mapdef.h
+++ b/crawl-ref/source/mapdef.h
@@ -1281,6 +1281,8 @@ private:
const int CHANCE_ROLL = 10000;
+void clear_subvault_stack(void);
+
void map_register_flag(const string &flag);
string escape_string(string in, const string &toesc, const string &escapewith);
diff --git a/crawl-ref/source/maps.cc b/crawl-ref/source/maps.cc
index 49e73ef..0b06ba0 100644
--- a/crawl-ref/source/maps.cc
+++ b/crawl-ref/source/maps.cc
@@ -107,9 +107,7 @@ static map_section_type _write_vault(map_def &mdef,
bool check_place)
{
// We're a regular vault, so clear the subvault stack.
- env.new_subvault_names.clear();
- env.new_subvault_tags.clear();
- env.new_used_subvault_names.clear();
+ clear_subvault_stack();
mdef.load();
--
1.7.4.4
|