git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@2653 c06c8d41-db1a-0410-9941-cceddc491573
W52PTX4I7TUG2LS36FJHLZ72DWCVXGUCTUIKPI3IGEYO5KWL6OVAC
AJD2Y3VP6VETRNNNSVVZ6JTN7LZUET6EEX6UDR3WLFLB7CB5SMQAC
GQL5SIGBHLU3FMCE54XVGLRY5AZHRM6DUEB722REA2DPLGJSN6EQC
RPOZZWKG5GLPHVZZ7ZKMKS64ZMV2LDCQSARBJFJ6FZOTOKCQO7FAC
K2CS6TCX2NDVL2ASEHGP4J4K4IJ6FP3ANNKTSIWVG43HPYSBX6ZQC
BW3XFNOS6LDAQLHOZ6RXARCMKCY5JVLVDSXDSSAX4DSYM3FANQBAC
ZVK4J5HTKFNOOIVCI62ZWEYGXEE5TYJ65DLYYZAZWTADFSXE62ZAC
2YSMM7QMFZOPD5NXAD2OAMDJEY5LOZO4NCYBC7UCQVANKINJRNBAC
WLX2RQMMOMP2PYPAGJRM4VFD2WTLJTOAZZPPY3MV76FU2EGEJ54QC
TLO257LZSB6ZO36STDUEWJBO2LETXFKTFGXELA6Y4BZBVAEIIINAC
ECJNCUSSE63BKED3EAYIXQCI62I76QGNHCSFO3CDWPRZF3JQP44QC
H3552BCIAVBLKAYKE4DHFLBLFW5RGRMYBMRRYHYEB5IPIJRUVU5QC
#endif
///////////////////////////////////////////////////////////////////////////
// Debugging code
#ifdef DEBUG_DIAGNOSTICS
typedef std::pair<std::string, int> weighted_map_name;
typedef std::vector<weighted_map_name> weighted_map_names;
static weighted_map_names mg_find_random_vaults(
const level_id &place, bool wantmini)
{
weighted_map_names wms;
if (!place.is_valid())
return (wms);
for (unsigned i = 0, size = vdefs.size(); i < size; ++i)
{
if (vdefs[i].is_minivault() == wantmini
&& !vdefs[i].place.is_valid()
&& vdefs[i].is_usable_in(place)
// Some tagged levels cannot be selected by depth. This is
// the only thing preventing Pandemonium demon vaults from
// showing up in the main dungeon.
&& !vdefs[i].has_tag_suffix("entry")
&& !vdefs[i].has_tag("pan")
&& !vdefs[i].has_tag("unrand")
&& !vdefs[i].has_tag("bazaar"))
{
wms.push_back(
weighted_map_name( vdefs[i].name, vdefs[i].chance ) );
}
}
return (wms);
}
static void mg_report_random_vaults(
FILE *outf, const level_id &place, bool wantmini)
{
weighted_map_names wms = mg_find_random_vaults(place, wantmini);
int weightsum = 0;
for (int i = 0, size = wms.size(); i < size; ++i)
weightsum += wms[i].second;
std::string line;
for (int i = 0, size = wms.size(); i < size; ++i)
{
std::string curr =
make_stringf("%s (%.2f%%)",
wms[i].first.c_str(),
100.0 * wms[i].second / weightsum);
if (i < size - 1)
curr += ", ";
if (line.length() + curr.length() > 80u)
{
fprintf(outf, "%s\n", line.c_str());
line.clear();
}
line += curr;
}
if (!line.empty())
fprintf(outf, "%s\n", line.c_str());
}
void mg_report_random_maps(FILE *outf, const level_id &place)
{
fprintf(outf, "---------------- Mini\n");
mg_report_random_vaults(outf, place, true);
fprintf(outf, "------------- Regular\n");
mg_report_random_vaults(outf, place, false);
}
#endif
mesclr();
mprf("On %s (%d); %d g, %d fail, %d err%s, %d uniq, "
"%d try, %d (%.2lf%%) vetos",
level_id::current().describe().c_str(), niters,
mg_levels_tried, mg_levels_failed, mapgen_errors.size(),
mapgen_last_error.empty()? ""
: (" (" + mapgen_last_error + ")").c_str(),
mapgen_use_count.size(),
mg_build_attempts, mg_vetoes,
mg_build_attempts? mg_vetoes * 100.0 / mg_build_attempts : 0.0);
if (niters > 1)
{
mesclr();
mprf("On %s (%d); %d g, %d fail, %d err%s, %d uniq, "
"%d try, %d (%.2lf%%) vetos",
level_id::current().describe().c_str(), niters,
mg_levels_tried, mg_levels_failed, mapgen_errors.size(),
mapgen_last_error.empty()? ""
: (" (" + mapgen_last_error + ")").c_str(),
mapgen_use_count.size(),
mg_build_attempts, mg_vetoes,
mg_build_attempts? mg_vetoes * 100.0 / mg_build_attempts : 0.0);
}
int iters = niters;
if (branch == BRANCH_MAIN_DUNGEON && depth == 1)
iters *= 10;
if (!mg_do_build_level(iters))
return;
}
places.push_back(LEVEL_ABYSS);
places.push_back(LEVEL_LABYRINTH);
places.push_back(LEVEL_PANDEMONIUM);
places.push_back(LEVEL_PORTAL_VAULT);
return (places);
}
static void mg_build_dungeon()
{
const std::vector<level_id> places = mg_dungeon_places();
for (int i = 0, size = places.size(); i < size; ++i)
{
const level_id &lid = places[i];
you.your_level = absdungeon_depth(lid.branch, lid.depth);
you.where_are_you = lid.branch;
you.level_type = lid.level_type;
if (you.level_type == LEVEL_PORTAL_VAULT)
you.level_type_name = "bazaar";
if (!mg_do_build_level(1))
return;
you.level_type = LEVEL_ABYSS;
if (!mg_do_build_level(niters))
return;
you.level_type = LEVEL_LABYRINTH;
if (!mg_do_build_level(niters))
return;
you.level_type = LEVEL_PANDEMONIUM;
if (!mg_do_build_level(niters))
return;
you.level_type = LEVEL_PORTAL_VAULT;
you.level_type_name = "bazaar";
if (!mg_do_build_level(niters))
return;
static void mg_build_levels(int niters)
{
mesclr();
mprf("Generating dungeon map stats");
for (int i = 0; i < niters; ++i)
{
mesclr();
mprf("On %d of %d; %d g, %d fail, %d err%s, %d uniq, "
"%d try, %d (%.2lf%%) vetos",
i, niters,
mg_levels_tried, mg_levels_failed, mapgen_errors.size(),
mapgen_last_error.empty()? ""
: (" (" + mapgen_last_error + ")").c_str(),
mapgen_use_count.size(),
mg_build_attempts, mg_vetoes,
mg_build_attempts? mg_vetoes * 100.0 / mg_build_attempts : 0.0);
you.uniq_map_tags.clear();
you.uniq_map_names.clear();
mg_build_dungeon();
}
}
static void mapgen_report_avaiable_random_vaults(FILE *outf)
{
you.uniq_map_tags.clear();
you.uniq_map_names.clear();
const std::vector<level_id> places = mg_dungeon_places();
fprintf(outf, "\n\nRandom vaults available by dungeon level:\n");
for (std::vector<level_id>::const_iterator i = places.begin();
i != places.end(); ++i)
{
fprintf(outf, "\n%s -------------\n", i->describe().c_str());
mg_report_random_maps(outf, *i);
fprintf(outf, "---------------------------------\n");
}
MAP
x
ENDMAP
##############################################################################
# Dummy probability balancer vault for non-dungeon branches.
#
NAME: dummy_balancer_other
DEPTH: 1-, !D
# Vaults tagged "dummy" are no-ops when the dungeon builder is looking for maps
# by depth.
TAGS: dummy
ORIENT: float
CHANCE: 60