git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@2683 c06c8d41-db1a-0410-9941-cceddc491573
EWFP6RFDHTEGD6SX36LYRLQB3APIKGAHNBKWPD56RGYBUE4FWJUQC
XW6GWT2M3ZEQSX4C6HCS3SJDQKAUTQMU5HWDZJWX7N3NPIGWKNJAC
Z6QGDJGSRPZAC4O5PA7MPWPRQLJAFBQBQXHUAO5QUAXQD2JGPDLQC
SHQUW7EH2E2SGQ5ONR63MAKN2VGLKQDQ3HIC2Q6D4DFGPGIJXXJQC
5UJT6L52SB6FYWEXZMFSKKBX32J2RWF7LXMFXDQDRZHPPIXQVAKAC
FBK5ECMQ6HJSQSN7C3DICKJIRJ3CSO3CHCQ3ONPBKLLSHDGPBQ7QC
KFULGQQOHWUTXOM3BXCCYPGGVGGY4Z6265XUFRCBPNLTZAEHJZSQC
CMNLYUECIMEZSOYG4KOSINOPER5OM7PPCGIHCM7LQVWEO77XFUYQC
AQ36MO7VNGSGQ5KK7JCQA2WEHUELAFLSU2QBUWROVJFOTPMGFGMQC
K2CS6TCX2NDVL2ASEHGP4J4K4IJ6FP3ANNKTSIWVG43HPYSBX6ZQC
7CMQLE4XIFMWDEUZAOKIKDW7BHAJCK5S26APMEZ6TEFEH63TEZ6AC
ZCRK2DJ5VKECRQXZTWT4NUDL2VT5ZHUK7NT6NQPLRJ56TDX5PJSAC
6WA4OTA6JU7CZHYOYLSSXJLGWKVFD6GMTN6OL4LLFYAV2UTQYWYQC
3UDBQWJX7TIIV3WJWCOIETL7NYQ4GPEU5SUXA247SUZXNEAQQMBQC
RPOZZWKG5GLPHVZZ7ZKMKS64ZMV2LDCQSARBJFJ6FZOTOKCQO7FAC
677XWEUOX2NO2ANPHIRM72UOZVX4ZNHSOYALWL6MUCF65QEAPUBAC
RVST2QHYJ757ZHK4AUJ5NGPDZ44AD6RVFVXYPKQIBJXZBDNUCHXQC
HXOYKQF6JLOELDE27O66U3Q7J6CP2YPRF42VSJD4LPTV7PZNT6PQC
PL6I2CMSTHY5ZHWVMIQE5YTM5S5VPKBNZM6QJVHZSSKOJGIJ5W4AC
W2D7G5ARFVO2HKUPFITKCGFC6UKB6ZCZFIT6223QLQ7PU7UO7L5AC
BLGPVQN4B4IZ7O56BQGPSOPDKVHJXYNMWQ5QRNC564XRBL3DP2KQC
5UYUTXYWSIP5DCQOSPW2AVNZO6RHJ2BE7JZ2WLISST22UY2LLMCQC
MWHMD65QP6UKXO6Q4ZVEAMXY563AJ6KH7J6UEZOB5CRPPSRB762QC
QGK4S2PZQRJRO7ZRIL3LB52ZKMGZOZOI7IZGZGOWL4RTBRPPBDAQC
static const mutation_def mutation_defs[] = {
{ MUT_TOUGH_SKIN, 10, 3 },
{ MUT_STRONG, 8, 14 },
{ MUT_CLEVER, 8, 14 },
{ MUT_AGILE, 8, 14 },
{ MUT_GREEN_SCALES, 2, 3 },
{ MUT_BLACK_SCALES, 1, 3 },
{ MUT_GREY_SCALES, 2, 3 },
{ MUT_BONEY_PLATES, 1, 3 },
{ MUT_REPULSION_FIELD, 1, 3 },
{ MUT_POISON_RESISTANCE, 4, 1 },
static mutation_def mutation_defs[] = {
{ MUT_TOUGH_SKIN, 10, 3, false },
{ MUT_STRONG, 8, 14, false },
{ MUT_CLEVER, 8, 14, false },
{ MUT_AGILE, 8, 14, false },
{ MUT_GREEN_SCALES, 2, 3, false },
{ MUT_BLACK_SCALES, 1, 3, false },
{ MUT_GREY_SCALES, 2, 3, false },
{ MUT_BONEY_PLATES, 1, 3, false },
{ MUT_REPULSION_FIELD, 1, 3, false },
{ MUT_POISON_RESISTANCE, 4, 1, false },
{ MUT_CARNIVOROUS, 5, 3 },
{ MUT_HERBIVOROUS, 5, 3 },
{ MUT_HEAT_RESISTANCE, 4, 3 },
{ MUT_COLD_RESISTANCE, 4, 3 },
{ MUT_SHOCK_RESISTANCE, 2, 1 },
{ MUT_REGENERATION, 3, 3 },
{ MUT_FAST_METABOLISM, 10, 3 },
{ MUT_SLOW_METABOLISM, 7, 3 },
{ MUT_WEAK, 10, 14 },
{ MUT_DOPEY, 10, 14 },
{ MUT_CARNIVOROUS, 5, 3, false },
{ MUT_HERBIVOROUS, 5, 3, true },
{ MUT_HEAT_RESISTANCE, 4, 3, false },
{ MUT_COLD_RESISTANCE, 4, 3, false },
{ MUT_SHOCK_RESISTANCE, 2, 1, false },
{ MUT_REGENERATION, 3, 3, false },
{ MUT_FAST_METABOLISM, 10, 3, true },
{ MUT_SLOW_METABOLISM, 7, 3, false },
{ MUT_WEAK, 10, 14, true },
{ MUT_DOPEY, 10, 14, true },
{ MUT_CLUMSY, 10, 14 },
{ MUT_TELEPORT_CONTROL, 2, 1 },
{ MUT_TELEPORT, 3, 3 },
{ MUT_MAGIC_RESISTANCE, 5, 3 },
{ MUT_FAST, 1, 3 },
{ MUT_ACUTE_VISION, 2, 1 },
{ MUT_DEFORMED, 8, 3 },
{ MUT_TELEPORT_AT_WILL, 2, 3 },
{ MUT_SPIT_POISON, 8, 3 },
{ MUT_MAPPING, 3, 3 },
{ MUT_CLUMSY, 10, 14, true },
{ MUT_TELEPORT_CONTROL, 2, 1, false },
{ MUT_TELEPORT, 3, 3, true },
{ MUT_MAGIC_RESISTANCE, 5, 3, false },
{ MUT_FAST, 1, 3, false },
{ MUT_ACUTE_VISION, 2, 1, false },
{ MUT_DEFORMED, 8, 3, true },
{ MUT_TELEPORT_AT_WILL, 2, 3, false },
{ MUT_SPIT_POISON, 8, 3, false },
{ MUT_MAPPING, 3, 3, false },
{ MUT_BREATHE_FLAMES, 4, 3 },
{ MUT_BLINK, 3, 3 },
{ MUT_HORNS, 7, 3 },
{ MUT_STRONG_STIFF, 10, 3 },
{ MUT_FLEXIBLE_WEAK, 10, 3 },
{ MUT_SCREAM, 6, 3 },
{ MUT_CLARITY, 6, 1 },
{ MUT_BERSERK, 7, 3 },
{ MUT_DETERIORATION, 10, 3 },
{ MUT_BLURRY_VISION, 10, 3 },
{ MUT_BREATHE_FLAMES, 4, 3, false },
{ MUT_BLINK, 3, 3, false },
{ MUT_HORNS, 7, 3, false },
{ MUT_STRONG_STIFF, 10, 3, false },
{ MUT_FLEXIBLE_WEAK, 10, 3, false },
{ MUT_SCREAM, 6, 3, true },
{ MUT_CLARITY, 6, 1, false },
{ MUT_BERSERK, 7, 3, true },
{ MUT_DETERIORATION, 10, 3, true },
{ MUT_BLURRY_VISION, 10, 3, true },
{ MUT_TORMENT_RESISTANCE, 0, 1 },
{ MUT_NEGATIVE_ENERGY_RESISTANCE, 0, 3 },
{ MUT_SUMMON_MINOR_DEMONS, 0, 1 },
{ MUT_SUMMON_DEMONS, 0, 1 },
{ MUT_HURL_HELLFIRE, 0, 1 },
{ MUT_CALL_TORMENT, 0, 1 },
{ MUT_RAISE_DEAD, 0, 1 },
{ MUT_TORMENT_RESISTANCE, 0, 1, false },
{ MUT_NEGATIVE_ENERGY_RESISTANCE, 0, 3, false },
{ MUT_SUMMON_MINOR_DEMONS, 0, 1, false },
{ MUT_SUMMON_DEMONS, 0, 1, false },
{ MUT_HURL_HELLFIRE, 0, 1, false },
{ MUT_CALL_TORMENT, 0, 1, false },
{ MUT_RAISE_DEAD, 0, 1, false },
{ MUT_CONTROL_DEMONS, 0, 1 },
{ MUT_PANDEMONIUM, 0, 1 },
{ MUT_DEATH_STRENGTH, 0, 1 },
{ MUT_CHANNEL_HELL, 0, 1 },
{ MUT_DRAIN_LIFE, 0, 1 },
{ MUT_THROW_FLAMES, 0, 1 },
{ MUT_THROW_FROST, 0, 1 },
{ MUT_SMITE, 0, 1 },
{ MUT_CONTROL_DEMONS, 0, 1, false },
{ MUT_PANDEMONIUM, 0, 1, false },
{ MUT_DEATH_STRENGTH, 0, 1, false },
{ MUT_CHANNEL_HELL, 0, 1, false },
{ MUT_DRAIN_LIFE, 0, 1, false },
{ MUT_THROW_FLAMES, 0, 1, false },
{ MUT_THROW_FROST, 0, 1, false },
{ MUT_SMITE, 0, 1, false },
{ MUT_BIG_WINGS, 0, 3 }, // Draconian only
{ MUT_BLUE_MARKS, 0, 3 }, // used by evil gods to mark followers
{ MUT_GREEN_MARKS, 0, 3 },
{ MUT_BIG_WINGS, 0, 3, false }, // Draconian only
{ MUT_BLUE_MARKS, 0, 3, false }, // used by evil gods to mark followers
{ MUT_GREEN_MARKS, 0, 3, false },
{ MUT_SHAGGY_FUR, 2, 3 },
{ MUT_HIGH_MAGIC, 1, 3 },
{ MUT_LOW_MAGIC, 9, 3 },
{ MUT_SLEEPINESS, 3, 3 },
{ RANDOM_MUTATION, 0, 3 },
{ MUT_SHAGGY_FUR, 2, 3, false },
{ MUT_HIGH_MAGIC, 1, 3, false },
{ MUT_LOW_MAGIC, 9, 3, true },
{ MUT_SLEEPINESS, 3, 3, true },
{ RANDOM_MUTATION, 0, 3, false },
{ MUT_RED_SCALES, 2, 3 },
{ MUT_NACREOUS_SCALES, 1, 3 },
{ MUT_GREY2_SCALES, 2, 3 },
{ MUT_METALLIC_SCALES, 1, 3 },
{ MUT_BLACK2_SCALES, 2, 3 },
{ MUT_WHITE_SCALES, 2, 3 },
{ MUT_YELLOW_SCALES, 2, 3 },
{ MUT_BROWN_SCALES, 2, 3 },
{ MUT_BLUE_SCALES, 2, 3 },
{ MUT_PURPLE_SCALES, 2, 3 },
{ MUT_RED_SCALES, 2, 3, false },
{ MUT_NACREOUS_SCALES, 1, 3, false },
{ MUT_GREY2_SCALES, 2, 3, false },
{ MUT_METALLIC_SCALES, 1, 3, false },
{ MUT_BLACK2_SCALES, 2, 3, false },
{ MUT_WHITE_SCALES, 2, 3, false },
{ MUT_YELLOW_SCALES, 2, 3, false },
{ MUT_BROWN_SCALES, 2, 3, false },
{ MUT_BLUE_SCALES, 2, 3, false },
{ MUT_PURPLE_SCALES, 2, 3, false },
{ MUT_SPECKLED_SCALES, 2, 3 },
{ MUT_ORANGE_SCALES, 2, 3 },
{ MUT_INDIGO_SCALES, 2, 3 },
{ MUT_RED2_SCALES, 1, 3 },
{ MUT_IRIDESCENT_SCALES, 1, 3 },
{ MUT_PATTERNED_SCALES, 1, 3 }
{ MUT_SPECKLED_SCALES, 2, 3, false },
{ MUT_ORANGE_SCALES, 2, 3, false },
{ MUT_INDIGO_SCALES, 2, 3, false },
{ MUT_RED2_SCALES, 1, 3, false },
{ MUT_IRIDESCENT_SCALES, 1, 3, false },
{ MUT_PATTERNED_SCALES, 1, 3, false }
}
static mutation_type get_random_xom_mutation()
{
mutation_type mutat = NUM_MUTATIONS;
do
{
mutat = static_cast<mutation_type>(random2(NUM_MUTATIONS));
if (one_chance_in(1000))
return (NUM_MUTATIONS);
if (one_chance_in(5))
{
switch (random2(8))
{
case 0: mutat = MUT_WEAK; break;
case 1: mutat = MUT_DOPEY; break;
case 2: mutat = MUT_CLUMSY; break;
case 3: mutat = MUT_DEFORMED; break;
case 4: mutat = MUT_SCREAM; break;
case 5: mutat = MUT_DETERIORATION; break;
case 6: mutat = MUT_BLURRY_VISION; break;
case 7: mutat = MUT_FRAIL; break;
}
}
}
while ( !accept_mutation(mutat) );
return (mutat);
static mutation_type get_random_mutation(bool prefer_good,
int preferred_multiplier)
{
int cweight = 0;
mutation_type chosen = NUM_MUTATIONS;
for (int i = 0; i < NUM_MUTATIONS; ++i)
{
if (!mutation_defs[i].rarity)
continue;
const mutation_type curr = static_cast<mutation_type>(i);
if (!accept_mutation(curr, true))
continue;
const bool weighted = mutation_defs[i].bad != prefer_good;
int weight = mutation_defs[i].rarity;
if (weighted)
weight = weight * preferred_multiplier / 100;
cweight += weight;
do
{
mutat = static_cast<mutation_type>(random2(NUM_MUTATIONS));
if (one_chance_in(1000))
return false;
if (one_chance_in(5))
{
switch (random2(8))
{
case 0: mutat = MUT_WEAK; break;
case 1: mutat = MUT_DOPEY; break;
case 2: mutat = MUT_CLUMSY; break;
case 3: mutat = MUT_DEFORMED; break;
case 4: mutat = MUT_SCREAM; break;
case 5: mutat = MUT_DETERIORATION; break;
case 6: mutat = MUT_BLURRY_VISION; break;
case 7: mutat = MUT_FRAIL; break;
}
}
}
while ( !accept_mutation(mutat) );
if ((mutat = get_random_xom_mutation()) == NUM_MUTATIONS)
return (false);
}
else if (which_mutation == RANDOM_GOOD_MUTATION)
{
if ((mutat = get_random_mutation(true, 500)) == NUM_MUTATIONS)
return (false);
platform it's building for. Your first step in building Crawl should
be to edit source/makefile and point it at the correct platform
makefile. For instance, if you're building for Windows, you'd use
platform it's building for. Your first step in building Crawl should be
to edit source/makefile and point it at the correct platform makefile.
For instance, if you're building for Windows, you'd use
If you have untrusted users, the correct way to install a multiplayer
Crawl is using a chrooted game launcher such as dgamelaunch.
To install or not to install:
If only one user on the system (you) is going to be playing Crawl, you
do not need to use "make install". A simple "make" will build Crawl in
the source directory, where you can run it as "./crawl".
If you have ncursesw and the development headers (usually in the
/usr/include/ncursesw directory) you can build Crawl with support for
Unicode display characters in the map by setting UNICODE_GLYPHS = y
in makefile.unix.
If you want to use Unicode, you need to link with a curses library that
understands Unicode characters, usually named libncursesw (the
development headers for libncursesw are usually in
/usr/include/ncursesw.) You also need to have a UTF-8 locale installed.
You can then build Crawl with support for Unicode by setting
UNICODE_GLYPHS = y in makefile.unix.
* If you'd like users to be able to script Crawl with Lua, you can
edit AppHdr.h, uncomment
// #define CLUA_BINDINGS
clean, and rebuild to compile with user Lua support. See the section
on Lua (below) for more information.
* If you do not want players to be able to script Crawl with Lua,
edit makefile.unix and remove -DCLUA_BINDINGS from the CFOTHERS line.
* Install MinGW from http://www.mingw.org. The MinGW 5.0.2 installer
is best so you don't have to fiddle with individual packages (you
can mess with the individual packages if you like to, of course). If
you want to edit the level compiler, also get the flex and bison
packages (available from the GnuWin32 project on Sourceforge:
* Install MinGW from http://www.mingw.org. The MinGW installer
is best so you don't have to fiddle with individual packages (you can
mess with the individual packages if you like to, of course). If you
want to edit the level compiler, also get the flex and bison packages
(available from the GnuWin32 project on Sourceforge:
If you're playing Crawl on a remote machine, the remote Crawl should
be built with Unicode support, *and* your local terminal (where you're
running telnet/ssh) needs to be able to decode UTF-8.
If you're playing Crawl on a remote machine, the remote Crawl should be
built with Unicode support, it needs to have a UTF-8 locale installed,
*and* your local terminal (where you're running telnet/ssh) needs to be
able to decode UTF-8.
Mike Drinen Icy Lich Edgar Simo
Kieron Dunbar Arien Malec Solf
Elethiomel Shawn M Moore Johan Strandell
Christopher Evenstar Eva Myers Marc H. Thoben
Ben Goetter Onia Ninara Matt Titus
Ciaran Hamilton Erkki Nurmi Steven Wheeler
Chris Hamons nyra Jeremey Wilson
R. Dan Henry Yuuma Oohara Zooko