Matthew!) and fix BR 1974056 (wrong colouring of tutorial skills information).
git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@5293 c06c8d41-db1a-0410-9941-cceddc491573
QXD3HX6QQ37PW6HVKIIKGFLO2ACROLUGKK66KFX7ED6SO4FDXB2AC
LHX6VLEJ2NQ242ECIWTGZTAGRWG7WLQ3DGMHGIMQAGYYKJJMWRBQC
YDDLIMYVR5YEORQ6YXEG3M4O26M3XIZ6OCXQTHEVLKTAAJP3FI5AC
UYSKY5I3VBV2H55V74GHKDCAHWSYWSFVRDTMSO7JZ5MYV5E3YQ6AC
4CK7LBQIQYKOEZ6B4YGRYDXV2ICEA3OHQHCXXVPNSMEKGPCHR52QC
5HF63O5IRRERI2V3SZEDHUNFHUF2B4RSVWQR6C6DR5JF5UYSROWAC
U6Q43EFKHJIDBBWN6RUTOYRHHX4IT73OPBR4CWIOKUDGTCYQE5PAC
77H4BWWPPGLM3PLZH4QTAJRXIZTSDVNCOKZE223I437FN2UJ34RQC
IHIJSWVOONSTA2WCHKW3YKBLETUQECFVBVLMET5SGQZ4C6U3GCUQC
2N5AKUYV6EUUT254C47WSHZKD7FGN65JKJ3RCKSDP74XJIHIFMDQC
Z6XF4AIERIW4U4AR3HU2ILYFZ54IK4K4ORQ6JKCEWRO5LZODWDDAC
7NDXS36TE7QVXTXJWMYSVG5UHCCLPIO4VL6NXFGTDK3ZNKE3A2IAC
W54GZBNFKPOF6DTOVK73PVASTQI5DXG42WQ6CXFDPXHFZOHUVVSQC
7HA2754QW3SBCAJ5K6KUXNXXXIZB5BIBCFPLXADCXHH6EREKXHSAC
XRZPPYWPWUOM4SFNI6BHKH2UKJQNLKOV6Y7XIEPEZXE5QYRT26PAC
LS5XCCGKQHSJQGWLWLGTP2F5OYWK4ND5AQQAGRN6H2HVBSXNCCZAC
Q4YYTFXYZUDBYWT37U354CJOAQMAAIWM5W72TAEGMEUKZIUZBMGAC
GL6SGPBZQPJBVGPOASYVCTAFXS7RNARR6Y5WZMIO5YCTB7ZJY4KAC
HMC247EGUJ3Q25DQ3VKUCIGLIO4SZORFQQWAPAF6S2WLQY3WU5TQC
BNJDMDVY4YX5OQJ3AYBGHOEJPKO724XWPSK5XLVT4V5F54NK34YAC
BFCFMN2BXNLXJCYYCL2V2XTDQQNM3PJPSRB6CU76FM3332NC7GMAC
ACDPN464TK2LKLHSDN3YVRHAPF7WLSLLU3UHIYEXKFDEZPEU3XSQC
TRNEOO3YKZSUGYTJZDDXZTJFQJXY6PWKBDJXAOLY3FZAD6WHTUTQC
XIXBLWIVUPWM3P6XQIB7CS45JOOIYE6OBYYYERCFAYYO4VOWOYUQC
ESWIM76FGJL4QFLSHU6AC4D74PT7OPLQ7ZCJYWLZS5UCBAJDXYHAC
MCBXXIV6GICTZB56APSXMJEI63FVQWVZR3H2DRNMMFDH2XCGK4JAC
U3KGUJJQWQORJIIFH3ADVNIEEX5HOX6KEOXO7DJSL7L3Z6GG3PAQC
6HQB2N6N75R2RGKJFWRUN7WAC2PNGWQFXTII5DTRLTHZ2BOTMTVAC
TOOHYAX73C5KPSWGHPCBWCUN62WMMO3BI5CWEEMGV3WBFZ5RIH5AC
XCEZ7OA2INNPSYNAB5U6JB7XNDAD5BKU26YLFPPZ3SEESFZKADQAC
SJP5BHX6MFWF3OSQPEF4WUWZWPUGMOVURTT2CUVT6H3A66LETXUAC
5Z6ZTK37C3X2YBHO2HX3ULMCHKQXDUDMX4TUIRCBTTP2IQ57BVQAC
ZDHRCGDMMY34ZW2PVEBZJ657YULM3UYRQXFQ3QYDKSGS2PDQW5WQC
TI2HASZUN3QBTNWRCXLXJHOZBOUHFEOQUCPK5EYLATL7BP32H6LQC
TZ2SH2SPO5TFSFL2OCV5A32P2X4CRHEKEK7ENUFCBVF3RKUWAD4AC
L4UCVNVRFTHENDKDOY6X75LXIE2B7XIMSKGVKHBOXNID7RDTBQRAC
SVY2PTCLXR3KNPQAWXVXTTGCC5DR334HOAKHYO3VDDRWM2BWMALAC
K2CS6TCX2NDVL2ASEHGP4J4K4IJ6FP3ANNKTSIWVG43HPYSBX6ZQC
RPOZZWKG5GLPHVZZ7ZKMKS64ZMV2LDCQSARBJFJ6FZOTOKCQO7FAC
NXVPOFYKJFWQWKVPQUMWH2Y2KJEZX44BUOBFJ4JD4KFGPEGYHG4QC
IIN7AVA6JYRBXH6ZYRR7BY7TV6PW7ANAQ2A3PD55FKBKKQFEEF2AC
IHOKNI4O7EEW4UBMKHP6XOZNEIQSW4AYOT4O3JXUIXNNR553IQAQC
IMC2HA2YWCU7SLGGVQQVUEUIST4ILSOEAUYXNZAW2PJZ475GXLDAC
P3BAFR6LTI7HANQCRLZWJ7LRJYFPFYIG7OVZV4RZM5EAMODRJKZAC
53VTPOTV7TI7QYFYS2ZKDXUJGYGFITOHJ7AO7CGRSFK2SOKXKWRAC
UET576SVCGS2TXEDRTO7BUTOTLJ77MYHIVZJCDWGH2BAXYMKG6DAC
WXSNNK2RXP3DQFAEQGQUZJHFWXJC7ZKG2WURZGL566UDM4YXFSWQC
6PYFSVZZOCQMKUKT3DBGX5OYMWDTXTR5ETQHM5EGZFXOV75NWCYAC
RVST2QHYJ757ZHK4AUJ5NGPDZ44AD6RVFVXYPKQIBJXZBDNUCHXQC
NLXVJSK53M3GCGGVJWYPHYZJ2A7JAF2FEYQPIGLRUYJ3FTWYONLQC
"<w>q</w> to quaff it.";
break;
"<w>q</w> to quaff it.";
break;
"<w>r</w> to read it.";
break;
"<w>r</w> to read it.";
break;
"<w>Z</w> to zap it.";
break;
"<w>Z</w> to zap it.";
break;
get_item_symbol(DNGN_ITEM_BOOK, &ch, &colour);
text << static_cast<char>(ch)
<< "'</w>) "
<< "that you can read by typing <w>r</w>. "
"If it's a spellbook you'll then be able to memorise spells "
"via <w>M</w> and cast a memorised spell with <w>z</w>.";
get_item_symbol(DNGN_ITEM_BOOK, &ch, &colour);
text << static_cast<char>(ch)
<< "'</w>) "
<< "that you can read by typing <w>r</w>. "
"If it's a spellbook you'll then be able to memorise spells "
"via <w>M</w> and cast a memorised spell with <w>z</w>.";
if (you.religion == GOD_TROG)
{
text << "\nAs a worshipper of "
<< god_name(GOD_TROG)
<< ", though, you might instead wish to burn those tomes "
"of hated magic by using the corresponding "
"<w>a</w>bility.";
}
else if (!you.skills[SK_SPELLCASTING])
{
text << "\nHowever, first you will have to get accustomed to "
"spellcasting by reading lots of scrolls.";
}
text << "\nDuring the tutorial you can reread this information at "
"any time by "
if (you.religion == GOD_TROG)
{
text << "\nAs a worshipper of "
<< god_name(GOD_TROG)
<< ", though, you might instead wish to burn those tomes "
"of hated magic by using the corresponding "
"<w>a</w>bility.";
}
else if (!you.skills[SK_SPELLCASTING])
{
text << "\nHowever, first you will have to get accustomed to "
"spellcasting by reading lots of scrolls.";
}
text << "\nDuring the tutorial you can reread this information at "
"any time by "
"to wield it, but be aware that this weapon "
"might train a different skill from your current one. You can "
"view the weapon's properties from your <w>i</w>nventory.";
"to wield it, but be aware that this weapon "
"might train a different skill from your current one. You can "
"view the weapon's properties from your <w>i</w>nventory.";
if (Options.tutorial_type == TUT_BERSERK_CHAR)
{
text << "\nAs you're already trained in Axes you should stick "
"with these. Checking other axes can be worthwhile.";
}
break;
if (Options.tutorial_type == TUT_BERSERK_CHAR)
{
text << "\nAs you're already trained in Axes you should stick "
"with these. Checking other axes can be worthwhile.";
}
break;
"you've picked up. Darts can be thrown by hand, but other "
"missile types like arrows and needles require a launcher "
"and training in using it to be really effective. "
"you've picked up. Darts can be thrown by hand, but other "
"missile types like arrows and needles require a launcher "
"and training in using it to be really effective. "
if (Options.tutorial_type == TUT_RANGER_CHAR)
{
text << "\nAs you're already trained in Bows you should stick"
" with arrows and collect more of them in the dungeon.";
}
else if (Options.tutorial_type == TUT_MAGIC_CHAR)
{
text << "\nHowever, as a spellslinger you don't really need "
"another type of ranged attack, unless there's another "
"effect in addition to damage.";
}
else
{
text << "\nFor now you might be best off with sticking to darts "
"or stones for ranged attacks.";
}
break;
if (Options.tutorial_type == TUT_RANGER_CHAR)
{
text << "\nAs you're already trained in Bows you should stick"
" with arrows and collect more of them in the dungeon.";
}
else if (Options.tutorial_type == TUT_MAGIC_CHAR)
{
text << "\nHowever, as a spellslinger you don't really need "
"another type of ranged attack, unless there's another "
"effect in addition to damage.";
}
else
{
text << "\nFor now you might be best off with sticking to darts "
"or stones for ranged attacks.";
}
break;
"You can click on it to wear it, and click a second time to "
"take it off again. Doing a <w>right mouse click</w> will "
"show you its properties.";
"You can click on it to wear it, and click a second time to "
"take it off again. Doing a <w>right mouse click</w> will "
"show you its properties.";
if (you.species == SP_CENTAUR || you.species == SP_MINOTAUR)
{
text << "\nNote that as a " << species_name(you.species, 1)
<< " you will be unable to wear "
<< (you.species == SP_CENTAUR ? "boots" : "helmets");
}
break;
if (you.species == SP_CENTAUR || you.species == SP_MINOTAUR)
{
text << "\nNote that as a " << species_name(you.species, 1)
<< " you will be unable to wear "
<< (you.species == SP_CENTAUR ? "boots" : "helmets");
}
break;
case TUT_SEEN_RANDART:
text << "Weapons and armour that have unusual descriptions like this "
"are much more likely to be of higher enchantment or have "
"special properties, good or bad. The rarer the description, "
"the greater the potential value of an item.";
break;
case TUT_SEEN_RANDART:
text << "Weapons and armour that have unusual descriptions like this "
"are much more likely to be of higher enchantment or have "
"special properties, good or bad. The rarer the description, "
"the greater the potential value of an item.";
break;
case TUT_SEEN_CARRION:
// NOTE: This is called when a corpse is first seen, rather than
// first picked up, since a new player might not think to pick
// up a corpse.
case TUT_SEEN_CARRION:
// NOTE: This is called when a corpse is first seen, rather than
// first picked up, since a new player might not think to pick
// up a corpse.
if (x <= 0 || y <= 0)
text << "Ah, a corpse!";
else
{
int i = igrd[x][y];
while (i != NON_ITEM)
{
if (mitm[i].base_type == OBJ_CORPSES)
break;
i = mitm[i].link;
}
if (i == NON_ITEM)
text << "Ah, a corpse!";
else
{
const item_def& item(mitm[i]);
if (x <= 0 || y <= 0)
text << "Ah, a corpse!";
else
{
int i = igrd[x][y];
while (i != NON_ITEM)
{
if (mitm[i].base_type == OBJ_CORPSES)
break;
text << "is a corpse.";
}
}
text << " When a corpse is lying on the ground, you "
"can <w>c</w>hop it up with a sharp implement. Once "
"hungry you can then <w>e</w>at the resulting chunks "
"(though they may not be healthy).";
text << "is a corpse.";
}
}
text << " When a corpse is lying on the ground, you "
"can <w>c</w>hop it up with a sharp implement. Once "
"hungry you can then <w>e</w>at the resulting chunks "
"(though they may not be healthy).";
text << " With tiles, you can also chop up any corpse that shows in "
"the floor part of your inventory region, simply by doing a "
"<w>left mouse click</w> while pressing <w>Shift</w>, and "
"then eat the resulting chunks with <w>Shift + right mouse "
"click</w>.";
text << " With tiles, you can also chop up any corpse that shows in "
"the floor part of your inventory region, simply by doing a "
"<w>left mouse click</w> while pressing <w>Shift</w>, and "
"then eat the resulting chunks with <w>Shift + right mouse "
"click</w>.";
if (god_likes_butchery(you.religion))
{
text << " During prayer you can offer corpses to "
<< god_name(you.religion)
<< " by chopping them up, as well. Note that the gods will "
<< "not accept rotting flesh.";
}
text << "\nDuring the tutorial you can reread this information at "
"any time by selecting the item in question in your "
"<w>i</w>nventory.";
break;
if (god_likes_butchery(you.religion))
{
text << " During prayer you can offer corpses to "
<< god_name(you.religion)
<< " by chopping them up, as well. Note that the gods will "
<< "not accept rotting flesh.";
}
text << "\nDuring the tutorial you can reread this information at "
"any time by selecting the item in question in your "
"<w>i</w>nventory.";
break;
case TUT_SEEN_JEWELLERY:
text << "You have picked up a a piece of jewellery, either a ring"
case TUT_SEEN_JEWELLERY:
text << "You have picked up a a piece of jewellery, either a ring"
<< " ('<w>\"</w>')"
<< ". Type <w>P</w> to put it on and <w>R</w> to remove "
"it. You can view its properties from your <w>i</w>nventory"
<< " ('<w>\"</w>')"
<< ". Type <w>P</w> to put it on and <w>R</w> to remove "
"it. You can view its properties from your <w>i</w>nventory"
<< ". You can click on it to put it on, and click a second time "
"remove it off again. By clicking on it with your <w>right "
"mouse button</w> you can view its properties"
<< ". You can click on it to put it on, and click a second time "
"remove it off again. By clicking on it with your <w>right "
"mouse button</w> you can view its properties"
case TUT_SEEN_MISC:
text << "This is a curious object indeed. You can play around with "
"it to find out what it does by "
case TUT_SEEN_MISC:
text << "This is a curious object indeed. You can play around with "
"it to find out what it does by "
"it. As usually, selecting it from your <w>i</w>nventory "
"might give you more information.";
break;
"it. As usually, selecting it from your <w>i</w>nventory "
"might give you more information.";
break;
", both of which are represented by '<w>";
get_item_symbol(DNGN_ITEM_STAVE, &ch, &colour);
text << static_cast<char>(ch)
<< "</w>'"
", both of which are represented by '<w>";
get_item_symbol(DNGN_ITEM_STAVE, &ch, &colour);
text << static_cast<char>(ch)
<< "</w>'"
". Both must be <w>w</w>ielded to be of use. "
"Magicians use staves to increase their power in certain "
"spell schools. By contrast, a rod allows the casting of "
"certain spells even without magic knowledge simply by "
"e<w>v</w>oking it. For the latter the power depends on "
"your Evocations skill.";
". Both must be <w>w</w>ielded to be of use. "
"Magicians use staves to increase their power in certain "
"spell schools. By contrast, a rod allows the casting of "
"certain spells even without magic knowledge simply by "
"e<w>v</w>oking it. For the latter the power depends on "
"your Evocations skill.";
text << "Both wielding, and evoking a wielded item can be achieved "
"by clicking on it with your <w>left mouse button</w>.";
text << "Both wielding, and evoking a wielded item can be achieved "
"by clicking on it with your <w>left mouse button</w>.";
text << "\nDuring the tutorial you can reread this information at "
"any time by selecting the item in question in your "
"<w>i</w>nventory.";
break;
text << "\nDuring the tutorial you can reread this information at "
"any time by selecting the item in question in your "
"<w>i</w>nventory.";
break;
case TUT_SEEN_STAIRS:
// don't give this information during the first turn
if (you.num_turns < 1)
return;
case TUT_SEEN_STAIRS:
// Don't give this information during the first turn, to give
// the player time to have a look around.
if (you.num_turns < 1)
return;
object = env.show[ex][ey];
colour = env.show_col[ex][ey];
{ unsigned short dummy; get_item_symbol( object, &ch, &dummy ); }
object = env.show[ex][ey];
colour = env.show_col[ex][ey];
{ unsigned short dummy; get_item_symbol( object, &ch, &dummy ); }
text << "are some downstairs. You can enter the next (deeper) "
"level by following them down (<w>></w>). To get back to "
"this level again, press <w><<</w> while standing on the "
"upstairs.";
text << "are some downstairs. You can enter the next (deeper) "
"level by following them down (<w>></w>). To get back to "
"this level again, press <w><<</w> while standing on the "
"upstairs.";
text << "\nAlternatively, clicking on your <w>left mouse button</w> "
"while pressing the <w>Shift key</w> will let you follow any "
"stairs you're standing on.";
text << "\nAlternatively, clicking on your <w>left mouse button</w> "
"while pressing the <w>Shift key</w> will let you follow any "
"stairs you're standing on.";
object = env.show[ex][ey];
colour = env.show_col[ex][ey];
get_item_symbol( object, &ch, &colour );
object = env.show[ex][ey];
colour = env.show_col[ex][ey];
get_item_symbol( object, &ch, &colour );
text << "are some kind of escape hatch. You can use them to "
"quickly leave a level with <w><<</w> and <w>></w>, "
"respectively "
text << "are some kind of escape hatch. You can use them to "
"quickly leave a level with <w><<</w> and <w>></w>, "
"respectively "
case TUT_SEEN_TRAP:
text << "Oops... you just triggered a trap. An unwary adventurer "
"will occasionally stumble into one of these nasty "
"constructions";
case TUT_SEEN_TRAP:
text << "Oops... you just triggered a trap. An unwary adventurer "
"will occasionally stumble into one of these nasty "
"constructions";
object = env.show[ex][ey];
colour = env.show_col[ex][ey];
get_item_symbol( object, &ch, &colour );
if (ch == ' ' || colour == BLACK)
colour = LIGHTCYAN;
object = env.show[ex][ey];
colour = env.show_col[ex][ey];
get_item_symbol( object, &ch, &colour );
if (ch == ' ' || colour == BLACK)
colour = LIGHTCYAN;
text << ". They can do physical damage (with darts or needles, for "
"example) or have other, more magical effects, like "
"teleportation.";
break;
text << ". They can do physical damage (with darts or needles, for "
"example) or have other, more magical effects, like "
"teleportation.";
break;
object = env.show[ex][ey];
colour = env.show_col[ex][ey];
get_item_symbol( object, &ch, &colour );
text << _colourize_glyph(colour, ch) << " ";
object = env.show[ex][ey];
colour = env.show_col[ex][ey];
get_item_symbol( object, &ch, &colour );
text << _colourize_glyph(colour, ch) << " ";
text << "is an altar. You can get information about it by pressing "
"<w>p</w> while standing on the square. Before taking up "
"the responding faith you'll be asked for confirmation.";
if (you.religion == GOD_NO_GOD &&
Options.tutorial_type == TUT_MAGIC_CHAR)
text << "\n\nThe best god for an unexperienced conjurer is "
"Vehumet, though Sif Muna is a good second choice. You "
"shouldn't take the other gods while playing a conjurer "
"until you get some more experinece.";
break;
text << "is an altar. You can get information about it by pressing "
"<w>p</w> while standing on the square. Before taking up "
"the responding faith you'll be asked for confirmation.";
if (you.religion == GOD_NO_GOD
&& Options.tutorial_type == TUT_MAGIC_CHAR)
{
text << "\n\nThe best god for an unexperienced conjurer is "
"probably Vehumet, though Sif Muna is a good second "
"choice.";
}
break;
"while standing on the square.";
break;
"while standing on the square.";
break;
"is a closed door. You can open it by walking into it. "
"Sometimes it is useful to close a door. Do so by pressing "
"<w>C</w>, followed by the direction, or simply "
"<w>Ctrl-Direction</w>.";
"is a closed door. You can open it by walking into it. "
"Sometimes it is useful to close a door. Do so by pressing "
"<w>C</w>, followed by the direction, or simply "
"<w>Ctrl-Direction</w>.";
case TUT_KILLED_MONSTER:
text << "Congratulations, your character just gained some experience "
"by killing this monster! Every action will use up some of "
"it to train certain skills. For example, fighting monsters ";
case TUT_KILLED_MONSTER:
text << "Congratulations, your character just gained some experience "
"by killing this monster! Every action will use up some of "
"it to train certain skills. For example, fighting monsters ";
if (Options.tutorial_type == TUT_BERSERK_CHAR)
{
text << "in melee battle will raise your Axes and Fighting "
"skills.";
}
else if (Options.tutorial_type == TUT_RANGER_CHAR)
{
text << "using bow and arrows will raise your Bows skill.";
}
else // if (Options.tutorial_type == TUT_MAGIC_CHAR)
{
text << "with offensive magic will raise your Conjurations and "
"Spellcasting skills.";
}
if (Options.tutorial_type == TUT_BERSERK_CHAR)
{
text << "in melee battle will raise your Axes and Fighting "
"skills.";
}
else if (Options.tutorial_type == TUT_RANGER_CHAR)
{
text << "using bow and arrows will raise your Bows skill.";
}
else // if (Options.tutorial_type == TUT_MAGIC_CHAR)
{
text << "with offensive magic will raise your Conjurations and "
"Spellcasting skills.";
}
if (you.religion == GOD_TROG)
{
text << " Also, kills of living creatures are automatically "
"dedicated to "
<< god_name(you.religion)
<< ".";
}
break;
if (you.religion == GOD_TROG)
{
text << " Also, kills of living creatures are automatically "
"dedicated to "
<< god_name(you.religion)
<< ".";
}
break;
case TUT_NEW_LEVEL:
text << "Well done! Reaching a new experience level is always a nice "
"event: you get more health and magic points, and "
"occasionally increases to your attributes (strength, "
"dexterity, intelligence).";
case TUT_NEW_LEVEL:
text << "Well done! Reaching a new experience level is always a nice "
"event: you get more health and magic points, and "
"occasionally increases to your attributes (strength, "
"dexterity, intelligence).";
if (Options.tutorial_type == TUT_MAGIC_CHAR)
{
text << "\nAlso, new experience levels let you learn more spells "
"(the Spellcasting skill also does this). For now, you "
"should try to memorise the second spell of your "
"starting book with <w>Mcb</w>, which can then be zapped "
"zapped with <w>zb</w>.";
if (Options.tutorial_type == TUT_MAGIC_CHAR)
{
text << "\nAlso, new experience levels let you learn more spells "
"(the Spellcasting skill also does this). For now, you "
"should try to memorise the second spell of your "
"starting book with <w>Mcb</w>, which can then be zapped "
"zapped with <w>zb</w>.";
case TUT_SKILL_RAISE:
text << "One of your skills just got raised. To view or manage your "
"skill set, type <w>m</w>.";
break;
case TUT_SKILL_RAISE:
text << "One of your skills just got raised. To view or manage your "
"skill set, type <w>m</w>.";
break;
case TUT_YOU_ENCHANTED:
text << "Enchantments of all types can befall you temporarily. "
"Brief descriptions of these appear at the lower end of the "
"stats area. Press <w>@</w> for more details. A list of all "
"possible enchantments is in the manual (<w>?5</w>).";
break;
case TUT_YOU_ENCHANTED:
text << "Enchantments of all types can befall you temporarily. "
"Brief descriptions of these appear at the lower end of the "
"stats area. Press <w>@</w> for more details. A list of all "
"possible enchantments is in the manual (<w>?5</w>).";
break;
case TUT_YOU_SICK:
Options.tut_just_triggered = false;
learned_something_new(TUT_YOU_ENCHANTED);
Options.tut_just_triggered = true;
text << "Corpses can be spoiled or inedible, making you sick. "
"Also, some monsters' flesh is less palatable than others'. "
"While sick, your hitpoints won't regenerate and sometimes "
"an attribute may decrease. It wears off with time (";
case TUT_YOU_SICK:
// Hack: reset tut_just_triggered, to force recursive calling of
// learned_something_new().
Options.tut_just_triggered = false;
learned_something_new(TUT_YOU_ENCHANTED);
Options.tut_just_triggered = true;
text << "Corpses can be spoiled or inedible, making you sick. "
"Also, some monsters' flesh is less palatable than others'. "
"While sick, your hitpoints won't regenerate and sometimes "
"an attribute may decrease. It wears off with time (";
"), or you could quaff a potion of healing. ";
break;
"), or you could quaff a potion of healing. ";
break;
case TUT_YOU_POISON:
learned_something_new(TUT_YOU_ENCHANTED);
text << "Poison will slowly reduce your hp. It wears off with time (";
case TUT_YOU_POISON:
learned_something_new(TUT_YOU_ENCHANTED);
text << "Poison will slowly reduce your hp. It wears off with time (";
case TUT_YOU_CURSED:
text << "Curses are comparatively harmless, but they do mean that "
"you cannot remove cursed equipment and will have to suffer "
"the (possibly) bad effects until you find and read a scroll "
"of remove curse. Weapons and armour can also be uncursed "
"using the appropriate enchantment scrolls.";
break;
case TUT_YOU_CURSED:
text << "Curses are comparatively harmless, but they do mean that "
"you cannot remove cursed equipment and will have to suffer "
"the (possibly) bad effects until you find and read a scroll "
"of remove curse. Weapons and armour can also be uncursed "
"using the appropriate enchantment scrolls.";
break;
case TUT_YOU_HUNGRY:
text << "There are two ways to overcome hunger: food you started "
"with or found, and selfmade chunks from corpses. To get the "
"latter, all you need to do is <w>c</w>hop up a corpse "
"with a sharp implement. Your starting weapon will do "
"nicely. Try to dine on chunks in order to save permanent "
"food.";
case TUT_YOU_HUNGRY:
text << "There are two ways to overcome hunger: food you started "
"with or found, and selfmade chunks from corpses. To get the "
"latter, all you need to do is <w>c</w>hop up a corpse "
"with a sharp implement. Your starting weapon will do "
"nicely. Try to dine on chunks in order to save permanent "
"food.";
if (Options.tutorial_type == TUT_BERSERK_CHAR)
text << "\nNote that you cannot Berserk while hungry.";
break;
if (Options.tutorial_type == TUT_BERSERK_CHAR)
text << "\nNote that you cannot Berserk while hungry.";
break;
case TUT_YOU_STARVING:
text << "You are now suffering from terrible hunger. You'll need to "
"<w>e</w>at something quickly, or you'll die. The safest "
"way to deal with this is to simply eat something from your "
"inventory rather than wait for a monster to leave a corpse.";
case TUT_YOU_STARVING:
text << "You are now suffering from terrible hunger. You'll need to "
"<w>e</w>at something quickly, or you'll die. The safest "
"way to deal with this is to simply eat something from your "
"inventory rather than wait for a monster to leave a corpse.";
if (Options.tutorial_type == TUT_MAGIC_CHAR)
text << "\nNote that you cannot cast spells while starving.";
break;
if (Options.tutorial_type == TUT_MAGIC_CHAR)
text << "\nNote that you cannot cast spells while starving.";
break;
case TUT_MULTI_PICKUP:
text << "There's a more comfortable way to pick up several items at "
"the same time. If you press <w>,</w> or <w>g</w> "
case TUT_MULTI_PICKUP:
text << "There's a more comfortable way to pick up several items at "
"the same time. If you press <w>,</w> or <w>g</w> "
".\nThis takes fewer keystrokes but has no influence on the "
"number of turns needed. Multi-pickup will be interrupted by "
"monsters or other dangerous events.";
break;
".\nThis takes fewer keystrokes but has no influence on the "
"number of turns needed. Multi-pickup will be interrupted by "
"monsters or other dangerous events.";
break;
case TUT_HEAVY_LOAD:
if (you.burden_state != BS_UNENCUMBERED)
text << "It is not usually a good idea to run around encumbered; "
"it slows you down and increases your hunger.";
else
text << "Sadly, your inventory is limited to 52 items, and it "
"appears your knapsack is full.";
case TUT_HEAVY_LOAD:
if (you.burden_state != BS_UNENCUMBERED)
{
text << "It is not usually a good idea to run around encumbered; "
"it slows you down and increases your hunger.";
}
else
{
text << "Sadly, your inventory is limited to 52 items, and it "
"appears your knapsack is full.";
}
text << " However, this is easy enough to rectify: simply "
"<w>d</w>rop some of the stuff you don't need or that's too "
"heavy to lug around permanently.";
text << " However, this is easy enough to rectify: simply "
"<w>d</w>rop some of the stuff you don't need or that's too "
"heavy to lug around permanently.";
text << " In the drop menu you can then comfortably select which "
"items to drop by pressing their inventory letter, or by "
"clicking on their tiles.";
text << " In the drop menu you can then comfortably select which "
"items to drop by pressing their inventory letter, or by "
"clicking on their tiles.";
case TUT_ROTTEN_FOOD:
text << "One or more of the chunks or corpses you carry has started "
"to rot. Few races can digest these safely, so you might "
"just as well <w>d</w>rop them now.";
break;
case TUT_ROTTEN_FOOD:
text << "One or more of the chunks or corpses you carry has started "
"to rot. Few races can digest these safely, so you might "
"just as well <w>d</w>rop them now.";
break;
case TUT_MAKE_CHUNKS:
text << "How lucky! That monster left a corpse which you can now "
"<w>c</w>hop up. One or more chunks will appear that you "
"can then <w>e</w>at. Beware that some chunks may be, "
"sometimes or always, hazardous. Only experience can help "
"you here.";
case TUT_MAKE_CHUNKS:
text << "How lucky! That monster left a corpse which you can now "
"<w>c</w>hop up. One or more chunks will appear that you "
"can then <w>e</w>at. Beware that some chunks may be, "
"sometimes or always, hazardous. Only experience can help "
"you here.";
if (you.duration[DUR_PRAYER]
&& (god_likes_butchery(you.religion)
|| god_hates_butchery(you.religion)))
{
text << "\nRemember, though, to wait until your prayer is over, "
"or the corpse will instead be sacrificed to "
<< god_name(you.religion)
<< ".";
}
break;
if (you.duration[DUR_PRAYER]
&& (god_likes_butchery(you.religion)
|| god_hates_butchery(you.religion)))
{
text << "\nRemember, though, to wait until your prayer is over, "
"or the corpse will instead be sacrificed to "
<< god_name(you.religion)
<< ".";
}
break;
case TUT_OFFER_CORPSE:
if (!god_likes_butchery(you.religion)
|| you.hunger_state < HS_SATIATED)
{
return;
}
case TUT_OFFER_CORPSE:
if (!god_likes_butchery(you.religion)
|| you.hunger_state < HS_SATIATED)
{
return;
}
text << "Hey, that monster left a corpse! If you don't need it for "
"food or other purposes, you can sacrifice it to "
<< god_name(you.religion)
<< " by <w>c</w>hopping it while <w>p</w>raying.";
break;
text << "Hey, that monster left a corpse! If you don't need it for "
"food or other purposes, you can sacrifice it to "
<< god_name(you.religion)
<< " by <w>c</w>hopping it while <w>p</w>raying.";
break;
case TUT_SHIFT_RUN:
text << "Walking around takes fewer keystrokes if you press "
"<w>Shift-direction</w> or <w>/ <w>direction</w>. "
"That will let you run until a monster comes into sight or "
"your character sees something interesting.";
break;
case TUT_SHIFT_RUN:
text << "Walking around takes fewer keystrokes if you press "
"<w>Shift-direction</w> or <w>/ <w>direction</w>. "
"That will let you run until a monster comes into sight or "
"your character sees something interesting.";
break;
case TUT_MAP_VIEW:
text << "As you explore a level, orientation can become difficult. "
"Press <w>X</w> to bring up the level map. Typing <w>?</w> "
"shows the list of level map commands. "
"Most importantly, moving the cursor to a spot and pressing "
"<w>.</w> or <w>Enter</w> lets your character move there on "
"its own.";
case TUT_MAP_VIEW:
text << "As you explore a level, orientation can become difficult. "
"Press <w>X</w> to bring up the level map. Typing <w>?</w> "
"shows the list of level map commands. "
"Most importantly, moving the cursor to a spot and pressing "
"<w>.</w> or <w>Enter</w> lets your character move there on "
"its own.";
text << "\nAlso, clicking on the right-side minimap with your "
"<w>right mouse button</w> will zoom into that dungeon area. "
"Clicking with the <w>left mouse button</w> instead will let "
"you move there.";
text << "\nAlso, clicking on the right-side minimap with your "
"<w>right mouse button</w> will zoom into that dungeon area. "
"Clicking with the <w>left mouse button</w> instead will let "
"you move there.";
case TUT_DONE_EXPLORE:
text << "Hey, you've finished exploring the dungeon on this level! "
"You can search for stairs from the level map (<w>X</w>) "
"by pressing <w>></w>. The cursor will jump to the nearest "
"staircase, and by pressing <w>.</w> or <w>Enter</w> your "
"character can move there, too. ";
case TUT_DONE_EXPLORE:
text << "Hey, you've finished exploring the dungeon on this level! "
"You can search for stairs from the level map (<w>X</w>) "
"by pressing <w>></w>. The cursor will jump to the nearest "
"staircase, and by pressing <w>.</w> or <w>Enter</w> your "
"character can move there, too. ";
if (Options.tutorial_events[TUT_SEEN_STAIRS])
{
text << "In rare cases, you may have found no downstairs at all. "
"Try searching for secret doors in suspicious looking "
"spots; use <w>s</w>, <w>.</w> or for 100 turns with "
"<w>5</w> "
if (Options.tutorial_events[TUT_SEEN_STAIRS])
{
text << "In rare cases, you may have found no downstairs at all. "
"Try searching for secret doors in suspicious looking "
"spots; use <w>s</w>, <w>.</w> or for 100 turns with "
"<w>5</w> "
"to do so.";
}
else
{
text << "Each level of Crawl has three "
"to do so.";
}
else
{
text << "Each level of Crawl has three "
"down stairs. Unexplored parts can often be accessed via "
"another level or through secret doors. To find the "
"latter, search the adjacent squares of walls for one "
"turn with <w>s</w> or <w>.</w>, or for 100 turns with "
"<w>5</w> or <w>Shift-numpad 5"
"down stairs. Unexplored parts can often be accessed via "
"another level or through secret doors. To find the "
"latter, search the adjacent squares of walls for one "
"turn with <w>s</w> or <w>.</w>, or for 100 turns with "
"<w>5</w> or <w>Shift-numpad 5"
case TUT_NEED_HEALING:
text << "If you're low on hitpoints or magic and there's no urgent "
"need to move, you can rest for a bit. Ideally you should "
"retreat to an area you've already explored and cleared "
"of monsters before resting, since resting on the edge of "
"the explored terrain increases the risk of rest being "
"interrupted by a wandering monster. Press <w>5</w> or "
"<w>shift-numpad-5</w>"
case TUT_NEED_HEALING:
text << "If you're low on hitpoints or magic and there's no urgent "
"need to move, you can rest for a bit. Ideally you should "
"retreat to an area you've already explored and cleared "
"of monsters before resting, since resting on the edge of "
"the explored terrain increases the risk of rest being "
"interrupted by a wandering monster. Press <w>5</w> or "
"<w>shift-numpad-5</w>"
case TUT_NEED_POISON_HEALING:
text << "Your poisoning could easily kill you, so now would be a "
"good time to <w>q</w>uaff a potion of heal wounds or, "
"better yet, a potion of healing. If you have seen neither "
"of these so far, try unknown ones in your inventory. Good "
"luck!";
break;
case TUT_NEED_POISON_HEALING:
text << "Your poisoning could easily kill you, so now would be a "
"good time to <w>q</w>uaff a potion of heal wounds or, "
"better yet, a potion of healing. If you have seen neither "
"of these so far, try unknown ones in your inventory. Good "
"luck!";
break;
case TUT_INVISIBLE_DANGER:
text << "Fighting against a monster you cannot see is difficult. "
"Your best bet is probably a strategic retreat, be it via "
"teleportation or by getting off the level. "
"Or else, luring the monster into a corridor should at least "
"make it easier for you to hit it.";
case TUT_INVISIBLE_DANGER:
text << "Fighting against a monster you cannot see is difficult. "
"Your best bet is probably a strategic retreat, be it via "
"teleportation or by getting off the level. "
"Or else, luring the monster into a corridor should at least "
"make it easier for you to hit it.";
case TUT_NEED_HEALING_INVIS:
text << "You recently noticed an invisible monster, so resting might "
"not be safe. If you still need to replenish your hitpoints "
"or magic, you'll have to quaff an appropriate potion. For "
"normal resting you will first have to get away from the "
"danger.";
case TUT_NEED_HEALING_INVIS:
text << "You recently noticed an invisible monster, so resting might "
"not be safe. If you still need to replenish your hitpoints "
"or magic, you'll have to quaff an appropriate potion. For "
"normal resting you will first have to get away from the "
"danger.";
case TUT_POSTBERSERK:
text << "Berserking is extremely exhausting! It burns a lot of "
"nutrition, and afterwards you are slowed down and "
"occasionally even pass out. Press <w>@</w> to see your "
"current exhaustion status.";
break;
case TUT_POSTBERSERK:
text << "Berserking is extremely exhausting! It burns a lot of "
"nutrition, and afterwards you are slowed down and "
"occasionally even pass out. Press <w>@</w> to see your "
"current exhaustion status.";
break;
case TUT_RUN_AWAY:
text << "Whenever you've got only a few hitpoints left and you're in "
"danger of dying, check your options carefully. Often, "
"retreat or use of some item might be a viable alternative "
"to fighting on.";
case TUT_RUN_AWAY:
text << "Whenever you've got only a few hitpoints left and you're in "
"danger of dying, check your options carefully. Often, "
"retreat or use of some item might be a viable alternative "
"to fighting on.";
if (you.species == SP_CENTAUR)
text << " As a four-legged centaur you are particularly quick - "
"running is an option!";
if (you.species == SP_CENTAUR)
{
text << " As a four-legged centaur you are particularly quick - "
"running is an option!";
}
if (you.religion == GOD_TROG && !you.duration[DUR_BERSERKER]
&& !you.duration[DUR_EXHAUSTED]
&& you.hunger_state >= HS_SATIATED)
{
text << "\nAlso, with "
<< god_name(you.religion)
<< "'s support you can use your Berserk ability (<w>a</w>) "
"to temporarily gain more hitpoints and greater "
"strength. ";
}
break;
if (you.religion == GOD_TROG && !you.duration[DUR_BERSERKER]
&& !you.duration[DUR_EXHAUSTED]
&& you.hunger_state >= HS_SATIATED)
{
text << "\nAlso, with "
<< god_name(you.religion)
<< "'s support you can use your Berserk ability (<w>a</w>) "
"to temporarily gain more hitpoints and greater "
"strength. ";
}
break;
case TUT_RETREAT_CASTER:
text << "Without magical power you're unable to cast spells. While "
"melee is a possibility, that's not where your strengths "
"lie, so retreat (if possible) might be the better option.";
case TUT_RETREAT_CASTER:
text << "Without magical power you're unable to cast spells. While "
"melee is a possibility, that's not where your strengths "
"lie, so retreat (if possible) might be the better option.";
if (_advise_use_wand())
text << "\n\nOr you could <w>Z</w>ap a wand to deal damage.";
break;
if (_advise_use_wand())
text << "\n\nOr you could <w>Z</w>ap a wand to deal damage.";
break;
case TUT_YOU_MUTATED:
text << "Mutations can be obtained from several sources, among them "
"potions, spell miscasts, and overuse of strong enchantments "
"like Invisibility. The only reliable way to get rid of "
"mutations is with potions of cure mutation. There are about "
"as many harmful as beneficial mutations, and most of them "
"have three levels. Check your mutations with <w>A</w>.";
break;
case TUT_YOU_MUTATED:
text << "Mutations can be obtained from several sources, among them "
"potions, spell miscasts, and overuse of strong enchantments "
"like Invisibility. The only reliable way to get rid of "
"mutations is with potions of cure mutation. There are about "
"as many harmful as beneficial mutations, and most of them "
"have three levels. Check your mutations with <w>A</w>.";
break;
case TUT_NEW_ABILITY:
switch(you.religion)
{
// Gods where first granted ability is active.
case GOD_ZIN:
case GOD_KIKUBAAQUDGHA:
case GOD_YREDELEMNUL:
case GOD_OKAWARU:
case GOD_SIF_MUNA:
case GOD_TROG:
case GOD_NEMELEX_XOBEH:
case GOD_ELYVILON:
case GOD_LUGONU:
text << "You just gained a new ability. Press <w>a</w> to "
"take a look at your abilities or to use one of them.";
break;
case TUT_NEW_ABILITY:
switch(you.religion)
{
// Gods where first granted ability is active.
case GOD_ZIN:
case GOD_KIKUBAAQUDGHA:
case GOD_YREDELEMNUL:
case GOD_OKAWARU:
case GOD_SIF_MUNA:
case GOD_TROG:
case GOD_NEMELEX_XOBEH:
case GOD_ELYVILON:
case GOD_LUGONU:
text << "You just gained a new ability. Press <w>a</w> to "
"take a look at your abilities or to use one of them.";
break;
// Gods where first granted ability is passive.
default:
text << "You just gained a new ability. Press <w>^</w> to "
"take a look at your ability.";
}
break;
// Gods where first granted ability is passive.
default:
text << "You just gained a new ability. Press <w>^</w> to "
"take a look at your ability.";
}
break;
case TUT_WIELD_WEAPON:
if (Options.tutorial_type == TUT_RANGER_CHAR
&& you.inv[ you.equip[EQ_WEAPON] ].sub_type == WPN_BOW)
{
text << "You can easily switch between weapons in slots a and "
"b by pressing <w>'</w>.";
}
break;
case TUT_WIELD_WEAPON:
if (Options.tutorial_type == TUT_RANGER_CHAR
&& you.inv[ you.equip[EQ_WEAPON] ].sub_type == WPN_BOW)
{
text << "You can easily switch between weapons in slots a and "
"b by pressing <w>'</w>.";
}
break;
case TUT_FLEEING_MONSTER:
if (Options.tutorial_type != TUT_BERSERK_CHAR)
return;
case TUT_FLEEING_MONSTER:
if (Options.tutorial_type != TUT_BERSERK_CHAR)
return;
text << "While unsporting, it is sometimes useful to attack a "
"fleeing monster by throwing something after it. To do this, "
text << "While unsporting, it is sometimes useful to attack a "
"fleeing monster by throwing something after it. To do this, "
"in tiles, you can choose your firing "
"ammunition by <w>left-clicking</w> on it with your mouse. "
"In the case of weapons (rather than missiles) you need to "
"be pressing <w>Ctrl</w> at the same time, to distinguish "
"the action from wielding. Then target the monster by "
"clicking on it."
"in tiles, you can choose your firing "
"ammunition by <w>left-clicking</w> on it with your mouse. "
"In the case of weapons (rather than missiles) you need to "
"be pressing <w>Ctrl</w> at the same time, to distinguish "
"the action from wielding. Then target the monster by "
"clicking on it."
"press <w>f</w>, choose a throwing weapon, e.g. one of your "
"spears, use <w>+</w> to select a monster and press "
"<w>.</w>, <w>f</w> or <w>Enter</w>. The closest monster "
"will be autoselected. If you've got the fire_order option "
"set you can directly use <w>ff</w> or <w>f+.</w> instead; "
"the game will pick the first weapon that fits the option."
"press <w>f</w>, choose a throwing weapon, e.g. one of your "
"spears, use <w>+</w> to select a monster and press "
"<w>.</w>, <w>f</w> or <w>Enter</w>. The closest monster "
"will be autoselected. If you've got the fire_order option "
"set you can directly use <w>ff</w> or <w>f+.</w> instead; "
"the game will pick the first weapon that fits the option."
text << "That monster looks a bit unusual. You might wish to examine "
"it a bit more closely by pressing "
text << "That monster looks a bit unusual. You might wish to examine "
"it a bit more closely by pressing "
// a short explanation of Crawl's target mode
// and the most important commands
// Explains the basics of the skill screen. Don't bother the player with the
// aptitude information.
void print_tut_skills_info()
{
textcolor(channel_to_colour(MSGCH_TUTORIAL));
std::ostringstream text;
text << "<" << colour_to_str(channel_to_colour(MSGCH_TUTORIAL)) << ">";
text <<
"This screen shows the skill set of your character. You can pick up new" EOL
"skills by performing the corresponding actions. The number next to the" EOL
"skill is your current level, the higher the better. The <cyan>cyan percent " EOL
"value</cyan> shows your progress towards the next skill level. You can toggle" EOL
"which skills to train by pressing their slot letters. A <darkgrey>greyish</darkgrey> skill " EOL
"will increase at a decidedly slower rate and ease training of others. ";
text << "</" << colour_to_str(channel_to_colour(MSGCH_TUTORIAL)) << ">";
formatted_string::parse_string(text.str(), false).display();
}
// A short explanation of Crawl's target mode
// and the most important commands.
formatted_string::parse_block(
"This screen shows the skill set of your character. You can pick up new" EOL
"skills by performing the corresponding actions. The number next to the" EOL
"skill is your current level, the higher the better. The blue percent " EOL
"value shows your progress towards the next skill level. You can toggle" EOL
"which skills to train by pressing their slot letters. A <darkgrey>greyish</darkgrey> skill " EOL
"will increase at a decidedly slower rate and ease training of others. ",
false).display();
// Doesn't mention the toggle between progress/aptitudes.
print_tut_skills_info();