Extended map DEPTH: attribute to support branch specifiers and negated depth specifiers.
git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@1442 c06c8d41-db1a-0410-9941-cceddc491573
KXUQB3WNWC5IFL6VFWADEPQMMU3VV3NDI5FLA666PGOEWFYUHCLQC
AUYQDKLMOG4FGH2T3LACX4TH632DPKVXBNV5VU6PIVUEWSIO4LQQC
AYAQKTO6HOZJ44NDH5UIP6WFNB54Z5EZ4UMUISIQ67ZOIDB6OIQAC
OVDIHWR5FEPTBZCTEAXNPB4MYP5NUNPQMC6UM4F6SC4EBGWH3DSQC
6HG6JFO47Y3BZLU7Y6G3R2CX6JFGN4X5PKK6S5IGUXUYQ5GVZYFQC
RPOZZWKG5GLPHVZZ7ZKMKS64ZMV2LDCQSARBJFJ6FZOTOKCQO7FAC
34C4U6EQWERY75GZJKUCM5KVGU2OUICETS5LGZF6RMKMZT4R5SQAC
MSQI3TH6T62JAXQGLL52QZCWAMC372TGB6ZNNRDGUGMJKBNNV2VAC
K2CS6TCX2NDVL2ASEHGP4J4K4IJ6FP3ANNKTSIWVG43HPYSBX6ZQC
5UVDIVD4NSXA52U4QMQIVST3GSZJ2A2YZK3RUEXKPM43YVQ7LI5AC
MI7CWKRDXHAU7PIHLXXOSFBULRGT2OOMIMOSQLMVYOUVGABIVXGAC
NH533CNPGAQGR3QSSXRKCAJHSPVSHSPSTEJXRDIRH5YPKMGMEHVAC
A3CO4KBFTFU3ZSHWRY2OPPX3MMTFV7OUCZGL7Q4Y2FU7JO4AP7MAC
WKTZHLOJ65WSK6FR5MF7RWGSMZ22T2D6LHB66FV3IPGXIBLYHHNAC
JDM27QE4HR52AYFSQE763BFF57ANOTF5MXKMO377PP5EXMN7SAOAC
5E7K2S4F4QDZC5UH3JVMYQ5SFJIKIATZII4EJL7IOT66ZBJ5GUPQC
RIRJ746W5ESARX4HUEA4JRVAKXXF3WYVXUCFFONPJMMKWHQAGI2AC
RISMOCQM6BKK4XSIRKYLOBB2UPDYJNDAL6OGIIR5GGNZQAK5YSZAC
TAVHZJPVNJBZR7CUURAOYNDZPNVQ3AGHTXDEP5K4JGYETBLQJDRQC
QUYSD2DWCIKAAQJGI43EENAWWPA5W33UT3I5WFRSHU6FPSSXTX2AC
XAFFD52IHN6FWFR2TT5F2KCUS7HAVCBI5CWTFMKPQG77GGTGAHLAC
6QWZDCP5HGYLTJO3WWYJJGRRT7QFY6IG64TC7TUB553Z7GAA2HIQC
3XZOL3FFQZITUJIGDD6B6V6ZYMBN524JKNN6ZPJAXEC7RY433I3QC
25V4IA67QFLZRTBPZLHZ7R2VTFRBBQBE3IS4ASN5BJRBXPEHSALQC
LS3DAZVRDCXVN2BKBC6RGCKO3R43Z7HKG4GXJWLBK4AKBL2G6QDQC
JNB3PBPBJHDUHH47ZICB25QENPTMLYK7CXC5BXRVWZ3J3ZZPKCUAC
| DEPTH depth_range
| DEPTH extended_depth_ranges {}
;
default_depth_ranges :
ext_range
{
lc_default_depths.push_back($1);
}
| default_depth_ranges COMMA ext_range
{
lc_default_depths.push_back($3);
}
;
extended_depth_ranges :
ext_range
{
lc_map.add_depth($1);
}
| extended_depth_ranges COMMA ext_range
depth_range : INTEGER DASH INTEGER
ext_range : lev_range { $$ = $1; }
| NOT lev_range { $$ = $2; $$.deny = true; }
;
lev_range : IDENTIFIER
{
$$ = set_range($1, 1, 100);
}
| IDENTIFIER COLON STAR
{
$$ = set_range($1, 1, 100);
}
| IDENTIFIER COLON INTEGER DASH INTEGER
}
level_range::level_range(const raw_range &r)
: branch(r.branch), shallowest(r.shallowest), deepest(r.deepest),
deny(r.deny)
{
}
std::string level_range::str_depth_range() const
{
if (shallowest == -1)
return (":??");
if (shallowest == 1 && deepest >= branches[branch].depth)
return ("");
if (shallowest == deepest)
return make_stringf(":%d", shallowest);
return make_stringf(":%d-%d", shallowest, deepest);
}
std::string level_range::describe() const
{
return make_stringf("%s%s%s",
deny? "!" : "",
branch == NUM_BRANCHES? "Any" :
branches[branch].abbrevname,
str_depth_range().c_str());
}
level_range::operator raw_range () const
{
raw_range r;
r.branch = branch;
r.shallowest = shallowest;
r.deepest = deepest;
r.deny = deny;
return (r);
}
void level_range::set(const std::string &br, int s, int d)
throw (std::string)
{
if (br == "any" || br == "Any")
branch = NUM_BRANCHES;
else
{
if ((branch = str_to_branch(br)) == NUM_BRANCHES)
throw make_stringf("Unknown branch: '%s'", br.c_str());
}
shallowest = s;
deepest = d;
if (deepest < shallowest)
throw make_stringf("Level-range %s:%d-%d is malformed",
br.c_str(), s, d);
bool level_range::contains(int x) const
bool level_range::matches(const level_id &lid) const
{
if (branch == NUM_BRANCHES)
return (matches(absdungeon_depth(lid.branch, lid.depth)));
else
return (branch == lid.branch
&& lid.depth >= shallowest && lid.depth <= deepest);
}
bool level_range::matches(int x) const
}
static branch_type str_to_branch(const std::string &branch)
{
for (int i = 0; i < NUM_BRANCHES; ++i)
{
if (branches[i].abbrevname && branches[i].abbrevname == branch)
return (static_cast<branch_type>(i));
}
return (BRANCH_MAIN_DUNGEON);
if (one_chance_in(3))
{
int mvault = random_map_for_depth(level_number, true);
if (mvault != -1)
build_minivaults(level_number, mvault);
}
minivault_chance = 3;
if (player_in_branch( BRANCH_MAIN_DUNGEON )
&& one_chance_in(4))
{
int mvault = random_map_for_depth(level_number, true);
if (mvault != -1)
{
build_minivaults(level_number, mvault);
return BUILD_SKIP;
}
}
minivault_chance = 4;
if (player_in_branch( BRANCH_MAIN_DUNGEON )
&& one_chance_in(3))
{
int mvault = random_map_for_depth(level_number, true);
if (mvault != -1)
{
build_minivaults(level_number, mvault);
return;
}
}
xxxxxxxxx
xbbbbbbbx
xb1...1bx
xb.....bx
xb.....bx
xbb.|.bbx
xxb.d.bxx
xxb...bxx
xxb...bxx
xxb.*.bxx
xxb...bxx
xxx@I@xxx
...........
.xxxxxxxxx.
.xbbbbbbbx.
.xb1...1bx.
.xb.....bx.
.xb.....bx.
.xbb.|.bbx.
.xxb.d.bxx.
.xxb...bxx.
.xxb...bxx.
.xxb.*.bxx.
.xxb...bxx.
.xxx@I@xxx.
...........
ENDMAP
############################################################################
# Minivaults specific to particular branches
############################################################################
# Orcish mines minivaults:
default-depth: Orc:*
##################################
# Dummy Orc minivault balancer.
#
NAME: mines_dummy
TAGS: dummy
CHANCE: 100
MAP
x
ENDMAP
###################################
# minvault intended for Orc Mines
# pond with fungi
NAME: mines1_lemuel
MONS: fungus, wandering mushroom
SUBST: 1 = . 1 2:4
SUBST: ? : w..
SUBST: ! : ww.
MAP
..1...?.....
....1???1...
..1...??ww1.
....1wwwwww.
.11wwwwwwww.
..www!!wwww.
..ww!!www1..
..1ww!ww11..
1..1w!!w1...
....!!1.....
.1...1!.1...
...........1
###################################
# minvault intended for Orc Mines
# hidden treasure chamber
NAME: mines2_lemuel
SUBST: ? = x.
MAP
..........
..?x=x?...
.?xx-xx?..
?xx$$$xx?.
?xx$$$xx?.
.?xxxxx?..
...???....
ENDMAP
###################################
# minvault intended for Orc Mines
# treasure chamber with oklob pant
NAME: mines3_lemuel
SUBST: ? = +=.
SUBST: ! = x.
SUBST: $ = $:30 *
MONS: oklob plant
MAP
.....!.!......
....!x?x!.....
....!x.xx!....
...!xx..xx!...
...!xxx..xx!..
....!xxx.1x!..
....!xxxx.x!..
...!xxxxx.xx!.
..!xx$$x..xxx.
.!!xx$$?.xxxx.
.!xxx$$xxxx!..
..!xxxxxxx!...
..............
ENDMAP
###################################
# minvault intended for Orc Mines
# mage tower -- either orc with assistants, or ogre with guards
NAME: mines4_lemuel
SUBST: ? = +=
SUBST: d = $d
SUBST: I = IG
SHUFFLE: 112/334
MONS: orc sorcerer,orc/orc wizard,ogre-mage,ogre/nothing
ITEM: any book
MAP
...............
...xxxx?xxxx...
..xx2.....2xx..
.xx.2xxxxx2.xx.
.x..xxd1dxx..x.
.x.Ix$$G$$xI.x.
.x..xx222xx..x.
.xx.2xx?xx2.xx.
..xx..2.2..xx..
...xxxxxxxxx...
...............
ENDMAP
###################################
# minvault intended for Orc Mines
# warg stables, with goblin stableboy
NAME: mines5_lemuel
SUBST: ?: wx
MONS: warg/wolf,goblin
MAP
...........
.x???????x.
.xwwwwwwwx.
.xwwwwwwwx.
.x1.1.1.1x.
.x.1.1.1.x.
.x1.2...1x.
.xxxx+xxxx.
...........
ENDMAP