git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@7550 c06c8d41-db1a-0410-9941-cceddc491573
ZBFNQZV6XCH4NUTHJU4K7RN4KLUMWNCWWO6UP7TIRASCWD5J5OMQC
SQDS2YBPOYDDDCW3GGARBZ2HQIUHCQKL7SSHKFQWDENOL5YNNVNQC
EH4VJW3I5Y4V6DT3YMLNDA3NW2DEAV4LRE4T5IEXAVB4WB3JJMGAC
RPOZZWKG5GLPHVZZ7ZKMKS64ZMV2LDCQSARBJFJ6FZOTOKCQO7FAC
WW6THKR7JN447YC23YYHYYNH7ABMCFFSECNUFTIJBZX6JHX6W7TAC
GPEJOT73KMACP33IPAKFR5ROGHCOIP22VXZMQNYTGLEA2OSZUM2AC
3UKFCWWS5BLFQWZRB5FUA46CE2XGX5VRCEWC3K3XH5RCGQK64N2AC
GRH4XPIYHDOXXF3R3QPMZTFHGLO2OJAZS4FLNBBXG3DHTQQM7RDQC
7YSKYUNV34XIWRTJUHJV4QMQRTXXYDIXM5AZSPSDPAYDW4B4PU6QC
APGCKU4AFOV7Z7XIEO5A27H4IFUGDU227I3Z7OIRROYSLOFFBJ5AC
OAPAH3WEFTT2T7NVSSENRR5JCIZYA6UZSQQ6LQEHAAXCX6FIM7HQC
R2DQBWKIW7YUJB5SOQ7J274JIYRVX4H3ISFRPAL5RG2RVVP4G2KAC
P5TRGRH7XMQSPCZKM5IEEO34TY6WMLGHHX7BU6Y453JFRXLUR2VQC
K2CS6TCX2NDVL2ASEHGP4J4K4IJ6FP3ANNKTSIWVG43HPYSBX6ZQC
MXOCLQAUGWLOS7AOTYZ46JZDMRL4EVRK5YN4JJUQ76GLKBOBHEVAC
R6XS2HO5QX2FJUGL5UQQRNETKCMYWTUFPHPPS5SYWK3OQA4UDUQQC
: mid(id), monbase(base), number(num), genweight(gw), mlevel(ml),
fix_mons(_fixmons), generate_awake(awaken), patrolling(false),
colour(BLACK), items()
: mid(id), place(), monbase(base), number(num), genweight(gw),
mlevel(ml), fix_mons(_fixmons), generate_awake(awaken),
patrolling(false), colour(BLACK), items()
// place:Elf:7 to choose monsters appropriate for that level,
// for example.
const std::string place = strip_tag_prefix(mon_str, "place:");
if (!place.empty())
{
try
{
mspec.place = level_id::parse_level_id(place);
}
catch (const std::string &err)
{
error = err;
return (slot);
}
}
mspec.mlevel = strip_number_tag(mon_str, "lev:");
if (mspec.mlevel == TAG_UNFOUND)
mspec.mlevel = 0;
else if (mspec.place.is_valid())
{
// For monster specs such as place:Orc:4 zombie, we may
// have a monster modifier, in which case we set the
// modifier in monbase.
const mons_spec nspec = mons_by_name("orc " + mon_str);
if (nspec.mid != MONS_PROGRAM_BUG)
{
// Is this a modified monster?
if (nspec.monbase != MONS_PROGRAM_BUG
&& mons_class_is_zombified(nspec.mid))
{
mspec.monbase = static_cast<monster_type>(nspec.mid);
}
}
}
if (mg.cls == RANDOM_MONSTER && mspec.place.is_valid())
{
int lev = monster_level;
if (mspec.place.level_type == LEVEL_DUNGEON)
lev = absdungeon_depth(mspec.place.branch, mspec.place.depth);
if (mlev == -8)
lev = 4 + lev * 2;
else if (mlev == -9)
lev += 5;
int tries = 100;
do
{
mg.cls = pick_random_monster(mspec.place, lev, lev);
} while (mg.cls != MONS_PROGRAM_BUG
&& mons_class_is_zombified(mspec.monbase)
&& !mons_zombie_size(mg.cls)
&& tries-- > 0);
if (mg.cls == MONS_PROGRAM_BUG
|| (mons_class_is_zombified(mspec.monbase)
&& !mons_zombie_size(mg.cls)))
{
mg.cls = RANDOM_MONSTER;
}
}
If you want to place a random monster suitable for the level
the map is generated on, you can use
MONS: random
If you want to place a random monster suitable for some other
place, you can use a place: tag in the monster spec:
MONS: place:Abyss
or
MONS: place:Slime:6
Using place: with MONS implies that you want a random monster.
You can also request zombies from random monsters suitable
for some other depth as:
MONS: place:Elf:7 zombie
or
MONS: place:Zot:5 simulacrum
or
MONS: place:Vault:8 spectre