summaryrefslogtreecommitdiffstats
path: root/crawl-ref/source/dungeon.cc
diff options
context:
space:
mode:
authordshaligram <dshaligram@c06c8d41-db1a-0410-9941-cceddc491573>2008-11-23 22:52:53 +0000
committerdshaligram <dshaligram@c06c8d41-db1a-0410-9941-cceddc491573>2008-11-23 22:52:53 +0000
commitda1eea9b9b2fc7cefddcfa22fc990062f2de1b4e (patch)
tree6ef32a3295cdd46afd0ed37aca179b9dbd4130cf /crawl-ref/source/dungeon.cc
parent9b92f3a9ba2ca271cc15186956e4cf4e4be8efe4 (diff)
downloadcrawl-ref-da1eea9b9b2fc7cefddcfa22fc990062f2de1b4e.tar.gz
crawl-ref-da1eea9b9b2fc7cefddcfa22fc990062f2de1b4e.zip
Use map_def* instead of map indices.
git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@7562 c06c8d41-db1a-0410-9941-cceddc491573
Diffstat (limited to 'crawl-ref/source/dungeon.cc')
-rw-r--r--crawl-ref/source/dungeon.cc179
1 files changed, 89 insertions, 90 deletions
diff --git a/crawl-ref/source/dungeon.cc b/crawl-ref/source/dungeon.cc
index 9e580b2e0c..b93b8a6ef7 100644
--- a/crawl-ref/source/dungeon.cc
+++ b/crawl-ref/source/dungeon.cc
@@ -194,17 +194,19 @@ static void _beehive(spec_room &sr);
static void _jelly_pit(int level_number, spec_room &sr);
// VAULT FUNCTIONS
-static bool _build_secondary_vault(int level_number, int vault,
+static bool _build_secondary_vault(int level_number, const map_def *vault,
int rune_subst = -1,
bool clobber = false,
bool make_no_exits = false,
const coord_def &where = coord_def(-1, -1));
-static bool _build_vaults(int level_number, int vault_number,
+static bool _build_vaults(int level_number,
+ const map_def *vault,
int rune_subst = -1, bool build_only = false,
bool check_collisions = false,
bool make_no_exits = false,
const coord_def &where = coord_def(-1, -1));
-static bool _build_minivaults(int level_number, int force_vault,
+static bool _build_minivaults(int level_number,
+ const map_def *vault,
bool clobber = false,
bool make_no_exits = false,
const coord_def &where = coord_def() );
@@ -213,7 +215,7 @@ static void _vault_grid( vault_placement &,
const coord_def& where,
bool recursive = false);
-static int _dgn_random_map_for_place(bool wantmini);
+static const map_def *_dgn_random_map_for_place(bool wantmini);
static void _dgn_load_colour_grid();
static void _dgn_map_colour_fixup();
@@ -1999,9 +2001,9 @@ static void _prepare_shoals(int level_number)
grd[centres[j].x-1][centres[j].y] = DNGN_STONE_STAIRS_UP_III;
// Place the rune
- int vaultidx = random_map_for_tag("shoal_rune", true);
+ const map_def *vault = random_map_for_tag("shoal_rune", true);
- _build_minivaults( level_number, vaultidx, false, false,
+ _build_minivaults( level_number, vault, false, false,
centres[1] );
for ( int i = 2; i < num_islands; ++i )
@@ -2009,11 +2011,11 @@ static void _prepare_shoals(int level_number)
// Place (non-rune) minivaults on the other islands
do
{
- vaultidx = _dgn_random_map_for_place(true);
+ vault = _dgn_random_map_for_place(true);
}
- while ( vaultidx == -1 );
+ while ( !vault );
- _build_minivaults( level_number, vaultidx, false, false,
+ _build_minivaults( level_number, vault, false, false,
centres[i] );
}
}
@@ -2225,11 +2227,11 @@ static builder_rc_type _builder_by_type(int level_number, char level_type)
"mnoleg", "lom_lobon", "cerebov", "gloorx_vloq"
};
- const int vault =
+ const map_def *vault =
random_map_for_tag(pandemon_level_names[which_demon], false);
- ASSERT(vault != -1);
- if (vault == -1)
+ ASSERT(vault);
+ if (!vault)
end(1, false, "Failed to find Pandemonium level %s!\n",
pandemon_level_names[which_demon]);
@@ -2238,11 +2240,8 @@ static builder_rc_type _builder_by_type(int level_number, char level_type)
else
{
_plan_main(level_number, 0);
- int vault = random_map_for_tag("pan", true);
- ASSERT( vault != -1 );
- // never output because of above assert
-// if (vault == -1)
-// end(1, false, "Failed to build Pandemonium minivault!\n");
+ const map_def *vault = random_map_for_tag("pan", true);
+ ASSERT( vault );
_build_minivaults(level_number, vault);
}
@@ -2266,11 +2265,10 @@ static void _portal_vault_level(int level_number)
const char* level_name = trimmed_name.c_str();
- int vault = random_map_for_place(level_id::current(), false);
+ const map_def *vault = random_map_for_place(level_id::current(), false);
#ifdef WIZARD
- if (vault == -1 && you.wizard
- && random_map_for_tag(level_name, false) != -1)
+ if (!vault && you.wizard && random_map_for_tag(level_name, false))
{
char buf[80];
@@ -2292,18 +2290,18 @@ static void _portal_vault_level(int level_number)
vault = find_map_by_name(you.level_type_tag + "_" + name);
- if (vault == -1)
+ if (!vault)
mprf(MSGCH_DIAGNOSTICS, "No such %s, try again.",
level_name);
}
- while (vault == -1);
+ while (!vault);
}
#endif
- if (vault == -1)
+ if (!vault)
vault = random_map_for_tag(level_name, false);
- if (vault != -1)
+ if (vault)
_ensure_vault_placed( _build_vaults(level_number, vault) );
else
{
@@ -2330,27 +2328,27 @@ static void _portal_vault_level(int level_number)
dlua.callfn(i->second.c_str(), 0, 0);
}
-static int _random_portal_vault(const std::string &tag)
+static const map_def *_random_portal_vault(const std::string &tag)
{
return random_map_for_tag(tag, false, true);
}
static bool _place_portal_vault(int stair, const std::string &tag, int dlevel)
{
- const int vault = _random_portal_vault(tag);
- if (vault == -1)
+ const map_def *vault = _random_portal_vault(tag);
+ if (!vault)
return (false);
return _build_secondary_vault(dlevel, vault, stair);
}
-static int _dgn_random_map_for_place(bool wantmini)
+static const map_def *_dgn_random_map_for_place(bool wantmini)
{
const level_id lid = level_id::current();
- int vault = random_map_for_place(lid, wantmini);
+ const map_def *vault = random_map_for_place(lid, wantmini);
// Disallow entry vaults for tutorial (only complicates things).
- if (vault == -1
+ if (!vault
&& lid.branch == BRANCH_MAIN_DUNGEON
&& lid.depth == 1 && !Options.tutorial_left)
{
@@ -2365,9 +2363,9 @@ static int _dgn_random_map_for_place(bool wantmini)
// otherwise.
static builder_rc_type _builder_by_branch(int level_number)
{
- const int vault = _dgn_random_map_for_place(false);
+ const map_def *vault = _dgn_random_map_for_place(false);
- if (vault != -1)
+ if (vault)
{
_ensure_vault_placed( _build_vaults(level_number, vault) );
return BUILD_SKIP;
@@ -2413,8 +2411,8 @@ static void _place_minivaults(const std::string &tag, int lo, int hi,
{
for (int i = 0; i < nvaults; ++i)
{
- const int vault = random_map_for_tag(tag, true);
- if (vault == -1)
+ const map_def *vault = random_map_for_tag(tag, true);
+ if (!vault)
return;
_build_minivaults(you.your_level, vault);
@@ -2424,20 +2422,20 @@ static void _place_minivaults(const std::string &tag, int lo, int hi,
if (use_random_maps)
{
- int vault = -1;
+ const map_def *vault = NULL;
do
{
vault = random_map_in_depth(level_id::current(), true);
- if (vault != -1)
+ if (vault)
_build_minivaults(you.your_level, vault);
- } while (vault != -1 && map_by_index(vault)->has_tag("extra"));
+ } while (vault && vault->has_tag("extra"));
}
int chance = you.your_level == 0? 50 : 100;
while (chance && x_chance_in_y(chance, 100) || nvaults-- > 0)
{
- const int vault = _dgn_random_map_for_place(true);
- if (vault == -1)
+ const map_def *vault = _dgn_random_map_for_place(true);
+ if (!vault)
break;
_build_minivaults(you.your_level, vault);
@@ -2454,10 +2452,10 @@ static builder_rc_type _builder_normal(int level_number, char level_type,
UNUSED( level_type );
bool skipped = false;
- int vault = _dgn_random_map_for_place(false);
+ const map_def *vault = _dgn_random_map_for_place(false);
// Can't have vaults on you.where_are_you != BRANCH_MAIN_DUNGEON levels.
- if (vault == -1 && use_random_maps && can_create_vault)
+ if (!vault && use_random_maps && can_create_vault)
{
vault = random_map_in_depth(level_id::current());
@@ -2466,14 +2464,14 @@ static builder_rc_type _builder_normal(int level_number, char level_type,
// branches. Other kinds of vaults can still be placed in
// other branches as secondary vaults.
- if (vault != -1 && !player_in_branch(BRANCH_MAIN_DUNGEON)
- && map_by_index(vault)->orient != MAP_ENCOMPASS)
+ if (vault && !player_in_branch(BRANCH_MAIN_DUNGEON)
+ && vault->orient != MAP_ENCOMPASS)
{
- vault = -1;
+ vault = NULL;
}
}
- if (vault != -1)
+ if (vault)
{
_ensure_vault_placed( _build_vaults(level_number, vault) );
return BUILD_SKIP;
@@ -2831,16 +2829,15 @@ static void _place_extra_vaults()
&& use_random_maps
&& can_create_vault)
{
- int vault = random_map_in_depth(level_id::current());
+ const map_def *vault = random_map_in_depth(level_id::current());
// ORIENT: encompass maps are unsuitable as secondary vaults.
- if (vault != -1 && map_by_index(vault)->orient == MAP_ENCOMPASS)
- vault = -1;
+ if (vault && vault->orient == MAP_ENCOMPASS)
+ vault = NULL;
- if (vault != -1
- && _build_secondary_vault(you.your_level, vault, -1))
+ if (vault && _build_secondary_vault(you.your_level, vault, -1))
{
- const map_def &map(*map_by_index(vault));
+ const map_def &map(*vault);
if (map.has_tag("extra"))
continue;
can_create_vault = false;
@@ -3933,7 +3930,7 @@ static bool _find_minivault_place(const vault_placement &place,
return (false);
}
-static bool _build_minivaults(int level_number, int force_vault,
+static bool _build_minivaults(int level_number, const map_def *vault,
bool clobber, bool make_no_exits,
const coord_def &where)
{
@@ -3943,7 +3940,7 @@ static bool _build_minivaults(int level_number, int force_vault,
vault_placement place;
place.level_number = level_number;
- vault_main(place, force_vault);
+ vault_main(place, vault);
coord_def v1;
@@ -4360,6 +4357,17 @@ static dungeon_feature_type _dgn_find_rune_subst_tags(const std::string &tags)
return (DNGN_FLOOR);
}
+void _fixup_after_vault()
+{
+ link_items();
+ env.markers.activate_all();
+
+ // Force teleport to place the player somewhere sane.
+ you_teleport_now(false, false);
+
+ setup_environment_effects();
+}
+
// Places a map on the current level (minivault or regular vault).
//
// You can specify the centre of the map using "where" for floating vaults
@@ -4372,24 +4380,24 @@ static dungeon_feature_type _dgn_find_rune_subst_tags(const std::string &tags)
// clobber: If true, assumes the newly placed vault can clobber existing
// items and monsters (items may be destroyed, monsters may be
// teleported).
-bool dgn_place_map(int map, bool clobber, bool make_no_exits,
+bool dgn_place_map(const map_def *mdef, bool clobber, bool make_no_exits,
const coord_def &where)
{
const dgn_colour_override_manager colour_man;
- const map_def *mdef = map_by_index(map);
bool did_map = false;
- bool fixup = false;
-
if (mdef->orient == MAP_ENCOMPASS && !Generating_Level)
{
if (clobber)
{
// For encompass maps, clear the entire level.
unwind_bool levgen(Generating_Level, true);
- fixup = true;
_reset_level();
dungeon_events.clear();
+ const bool res = dgn_place_map(mdef, clobber, make_no_exits,
+ where);
+ _fixup_after_vault();
+ return (res);
}
else
{
@@ -4403,7 +4411,7 @@ bool dgn_place_map(int map, bool clobber, bool make_no_exits,
if (mdef->is_minivault())
{
- did_map = _build_minivaults(you.your_level, map, clobber,
+ did_map = _build_minivaults(you.your_level, mdef, clobber,
make_no_exits, where);
}
else
@@ -4411,7 +4419,7 @@ bool dgn_place_map(int map, bool clobber, bool make_no_exits,
dungeon_feature_type rune_subst = DNGN_FLOOR;
if (mdef->has_tag_suffix("_entry"))
rune_subst = _dgn_find_rune_subst_tags(mdef->tags);
- did_map = _build_secondary_vault(you.your_level, map, rune_subst,
+ did_map = _build_secondary_vault(you.your_level, mdef, rune_subst,
clobber, make_no_exits, where);
}
@@ -4430,26 +4438,16 @@ bool dgn_place_map(int map, bool clobber, bool make_no_exits,
if (!see_grid(x, y))
set_terrain_changed(x, y);
}
- }
-
- if (fixup)
- {
- link_items();
- env.markers.activate_all();
- // Force teleport to place the player somewhere sane.
- you_teleport_now(false, false);
- }
-
- if (fixup || !Generating_Level)
setup_environment_effects();
+ }
return (did_map);
}
// Places a vault somewhere in an already built level if possible.
// Returns true if the vault was successfully placed.
-static bool _build_secondary_vault(int level_number, int vault,
+static bool _build_secondary_vault(int level_number, const map_def *vault,
int rune_subst, bool clobber,
bool no_exits, const coord_def &where)
{
@@ -4465,7 +4463,8 @@ static bool _build_secondary_vault(int level_number, int vault,
return (false);
}
-static bool _build_vaults(int level_number, int force_vault, int rune_subst,
+static bool _build_vaults(int level_number, const map_def *vault,
+ int rune_subst,
bool build_only, bool check_collisions,
bool make_no_exits, const coord_def &where)
{
@@ -4481,8 +4480,7 @@ static bool _build_vaults(int level_number, int force_vault, int rune_subst,
if (map_bounds(where))
place.pos = where;
- const int gluggy = vault_main(place, force_vault,
- check_collisions);
+ const int gluggy = vault_main(place, vault, check_collisions);
if (gluggy == MAP_NONE || !gluggy)
return (false);
@@ -6142,8 +6140,8 @@ static char _plan_1(int level_number)
dgn_Build_Method = "plan_1";
dgn_Layout_Type = "open";
- const int vault = find_map_by_name("layout_forbidden_donut");
- ASSERT(vault != -1);
+ const map_def *vault = find_map_by_name("layout_forbidden_donut");
+ ASSERT(vault);
bool success = _build_vaults(level_number, vault);
_ensure_vault_placed(success);
@@ -6156,8 +6154,8 @@ static char _plan_2(int level_number)
dgn_Build_Method = "plan_2";
dgn_Layout_Type = "cross";
- const int vault = find_map_by_name("layout_cross");
- ASSERT(vault != -1);
+ const map_def *vault = find_map_by_name("layout_cross");
+ ASSERT(vault);
bool success = _build_vaults(level_number, vault);
_ensure_vault_placed(success);
@@ -6387,8 +6385,8 @@ static char _plan_6(int level_number)
dgn_Build_Method = "plan_6";
dgn_Layout_Type = "open";
- const int vault = find_map_by_name("layout_big_octagon");
- ASSERT(vault != -1);
+ const map_def *vault = find_map_by_name("layout_big_octagon");
+ ASSERT(vault);
bool success = _build_vaults(level_number, vault);
_ensure_vault_placed(success);
@@ -6564,7 +6562,8 @@ static void _labyrinth_place_exit(const coord_def &end)
grd(end) = DNGN_ESCAPE_HATCH_UP;
}
-static void _init_minivault_placement(int vault, vault_placement &place)
+static void _init_minivault_placement(const map_def *vault,
+ vault_placement &place)
{
vault_main(place, vault);
}
@@ -6687,11 +6686,11 @@ static void _change_walls_from_centre(const dgn_region &region,
static void _place_extra_lab_minivaults(int level_number)
{
- std::set<int> vaults_used;
+ std::set<const map_def*> vaults_used;
while (true)
{
- const int vault = random_map_for_tag("lab", true, false);
- if (vault == -1 || vaults_used.find(vault) != vaults_used.end())
+ const map_def *vault = random_map_for_tag("lab", true, false);
+ if (!vault || vaults_used.find(vault) != vaults_used.end())
break;
vaults_used.insert(vault);
@@ -6762,18 +6761,18 @@ static void _labyrinth_level(int level_number)
GYM - LABYRINTH_BORDER - 1 );
// First decide if we're going to use a Lab minivault.
- int vault = random_map_for_tag("minotaur", true, false);
+ const map_def *vault = random_map_for_tag("minotaur", true, false);
vault_placement place;
- if (vault != -1)
+ if (vault)
_init_minivault_placement(vault, place);
coord_def end;
_labyrinth_build_maze(end, lab);
- if (vault == -1 || !_build_minivaults(level_number, vault))
+ if (!vault || !_build_minivaults(level_number, vault))
{
- vault = -1;
+ vault = NULL;
_labyrinth_place_exit(end);
}
else
@@ -6799,7 +6798,7 @@ static void _labyrinth_level(int level_number)
place.size = rplace.size;
}
- if (vault != -1)
+ if (vault)
end = place.pos + place.size / 2;
_place_extra_lab_minivaults(level_number);