Auto-explore hint (200 turns after level map hint).
Explanation of the "Your equipment suddenly weighs less" message.
Explanations of trap and heap branding (non-tile builds only).
A note that monsters that have moved out of LOS haven't just vanished.
Events for gaining an ability from a mutation and gaining one from an item which was just equipped, separate from the event for the first divinely granted ability.
An explanation that shouting monsters have just noticed you, plus that their shout is likely to attract the attention of other monsters.
A "seen portal vault entrance" event, since the entry to the sewers can appear on DL 3 through 6, and there's also a very small chance of a Zigguart entrance apearing as early as DL 3.
git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@9823 c06c8d41-db1a-0410-9941-cceddc491573
X3JAMTLR5H345ZAHGB5JYQWA6FTIGVIZPMTVVGQRWEWLL4JHAWJQC
RLWG3QYUGEXTUSIAHTNCBPUA5VJX43HJPSJR7ARLXXHKYTGD2IQQC
5US6HAZNUVFLJCSX3YLML7U4ZR7HHXU3VM7U6JJEEULNCIPD7B6QC
4LFTDJY3DK6S7C7SQLLML6UIZ42GZOWK2EIMZZSNEKBWSA3YNUZAC
ZQ55TG7UDO6QYKNZGYLETDPGZ7TEWMCCT5S4IU4XMQOLTM6DZYHQC
WXWLZ6GPVBE7EMFUDIEFBLXRB7D7TNQMCZDAB6FGACH5D7FJ2LZQC
AHDR6VAKT6NGNERU244ZBTXYK73SWZVF5Q3SH3GPRNHNTJSJY7FAC
J6APXOT4QOGQFONWB7G546VTVF6QG42HVOROMHF7YBDJPR4K26OAC
R2DQBWKIW7YUJB5SOQ7J274JIYRVX4H3ISFRPAL5RG2RVVP4G2KAC
K2CS6TCX2NDVL2ASEHGP4J4K4IJ6FP3ANNKTSIWVG43HPYSBX6ZQC
TGJZXTUIAKCFZQJ54ZQEBGFBVZSJCAX6AWDRSH3TP7UJRLGUM5SAC
RPOZZWKG5GLPHVZZ7ZKMKS64ZMV2LDCQSARBJFJ6FZOTOKCQO7FAC
7NDXS36TE7QVXTXJWMYSVG5UHCCLPIO4VL6NXFGTDK3ZNKE3A2IAC
JBZ7NU4BB5PGQWCOSZHD5OQUHQIVOD4XGJLSJQ7BUGQEGPRTVGZQC
77H4BWWPPGLM3PLZH4QTAJRXIZTSDVNCOKZE223I437FN2UJ34RQC
HQTS3VQ6PNUZKHNVEWMML7JNAAAKL4DSW3KFSRCCSLGYTDHZFCCAC
QXD3HX6QQ37PW6HVKIIKGFLO2ACROLUGKK66KFX7ED6SO4FDXB2AC
NK2TBKWOQBD2ZRGAO4Z3HMZPIN7UX3HNUS2YHEIJUUINUTRMPODQC
W54GZBNFKPOF6DTOVK73PVASTQI5DXG42WQ6CXFDPXHFZOHUVVSQC
LS5XCCGKQHSJQGWLWLGTP2F5OYWK4ND5AQQAGRN6H2HVBSXNCCZAC
ACDPN464TK2LKLHSDN3YVRHAPF7WLSLLU3UHIYEXKFDEZPEU3XSQC
Q3B3UVMYEVC4YJUPYVSNTR4DJH4E6J4JJDHZNT5LNOCHCPPMEMXAC
HB27XKFYVYIEQZGBCEZ6LKPUBMXLIPDAAS636GJ5TULIQ7KND5KQC
GTPAKUU3R5AS3LQNCCZIP3BWV473RM4EB2AIS4FXAJRXHEOVH2PAC
IYDUDWPDA7JST3MVKYBAAX7GYDSM6FXXQ2QMMIKEDQLT4VXTHOUAC
L5CVPV5IUBSO4EE3WK4O6SQGIMIEPSMQONFBWEVGJBR2HATLPZIAC
JW2KRJHES33W7UTWZ6NDO4TLMK4EFU4HKZXBWR2UJOMPCCOTR4CQC
JDZCDMUCQ7VENYVLB62KQWUIRGABID37OKATOKCBUPCDL7W75NPAC
F2X5SIIXWXXEL2FVMYDC4GL2ODZ4O7RA46U66VGJ5K2EZHHAQGUAC
S34LKQDIQJLIWVIPASOJBBZ6ZCXDHP5KPS7TRBZJSCDRVNCLK6UAC
OSGS3PH2L5CBTDVZCZS6OCFQNA4A7RMEXBYJQB7DDZBYYJW7QSSAC
P3BAFR6LTI7HANQCRLZWJ7LRJYFPFYIG7OVZV4RZM5EAMODRJKZAC
RDZUMV3A5TREQHLPPJWDWVXBNIOWC3CQJJ35TYFBQQVQNTU7SPXQC
SDLKLUNFGVKDS55DDJZCBAVIB7NL3RRYPTACAY65SCUQKV6APFSAC
QW73U22SVPKFZ367CURWGZCUJZIG73MRKWE2EBRG535N4UUYKMNAC
ESWIM76FGJL4QFLSHU6AC4D74PT7OPLQ7ZCJYWLZS5UCBAJDXYHAC
JCWJWGMQIKQGSSFJUQRKNIWW3HBOJSHYDTOPPE5BWOJTIJTDYUTAC
IHIJSWVOONSTA2WCHKW3YKBLETUQECFVBVLMET5SGQZ4C6U3GCUQC
U3KGUJJQWQORJIIFH3ADVNIEEX5HOX6KEOXO7DJSL7L3Z6GG3PAQC
WMSWIUXVDVHMW2QQFDZNWXDUYWW2UO7FGTNDAJA3Y6N2PLFXPNHQC
HMC247EGUJ3Q25DQ3VKUCIGLIO4SZORFQQWAPAF6S2WLQY3WU5TQC
FU663V7RFZNSMG5P2E7TZJZWSGXWLCCFXSVGH4Z222FIJTH4R3KAC
HIRKGUMNJPWKSVTR6TVBPD3MWNA63CEHCLCIPWEMGDFHVB3NPLDQC
CDLXSWKIUQAM6TJRTU6HUSYVQXPHXN34NILPPHT2PJ2TPTJT3I2AC
BIZDHHK5LIO57S5AKHEPJFLWV5DAFKZIKYBGOUNGICSWTX7DCXKAC
const int noise_level = get_shout_noise_level(s_type);
if (noise_level > 0)
noisy(noise_level, monster->pos());
const int noise_level = get_shout_noise_level(s_type);
const bool heard = noisy(noise_level, monster->pos());
if (Options.tutorial_left && (heard || you.can_see(monster)))
learned_something_new(TUT_MONSTER_SHOUT, monster->pos());
static std::string _describe_portal(const coord_def &gc)
{
const std::string desc = feature_description(gc);
std::ostringstream text;
// Zigguart entrances can rarely appear as early as DL 3.
if (desc.find("zig") != std::string::npos)
{
text << "is a portal to a set of special levels filled with very "
"tough monsters; you probably shouldn't even think of going "
"in here. Additionally, entering a zigguart takes a lot of "
"gold, a lot more than you'd have right now; don't bother "
"saving gold up for it, since at this point your gold is "
"better spent at shops buying items which can help you "
"survive."
"\n\nIf you <w>still</w> want to enter (and somehow have "
"gathered enough gold to do so) ";
}
// For the sake of completeness, though it's very unlikely that a
// player will find a bazaar entrance before reahing XL 7.
else if (desc.find("bazaar") != std::string::npos)
{
text << "is a portal to an inter-dimensional bazaar filled with "
"shops. It will disappear if you don't enter it soon, "
"so hurry. To enter ";
}
// The sewers can appear from DL 3 to DL 6.
else
{
text << "is a portal to a special level where you'll have to fight "
"your way back to the exit through some tougher than average "
"monsters (the monsters around the portal should give a "
"good indication as to how tough), but with the reward of "
"some good loot. There's no penalty for skipping it, but if "
"you do skip it the portal will disappear, so you have to "
"decide now if you want to risk it. To enter ";
}
text << "stand over the portal and press <w>></w>. To return find "
#ifdef USE_TILE
"a similar looking portal tile "
#else
"another <w>\\</w> "
#endif
"(though NOT the ancient stone arch you'll start out on) "
"and press <w><<</w>.";
#ifdef USE_TILE
text << "\nAlternatively, clicking on your <w>left mouse button</w> "
"while pressing the <w>Shift key</w> will let you enter any "
"portal you're standing on.";
#endif
return (text.str());
}
break;
case TUT_SEEN_PORTAL:
// Delay in the unlikely event that a player still in tutorial mode
// creates a portal with a Trowel card, since a portal vault
// entry's description doesn't seem to get set properly until
// after the vault is done being placed.
if (you.pos() == gc)
DELAY_EVENT;
text << "This ";
#ifndef USE_TILE
// Is a monster blocking the view?
if (monster_at(gc))
DELAY_EVENT;
object = env.show(e);
colour = env.show_col(e);
{ unsigned short dummy; get_item_symbol( object, &ch, &dummy ); }
text << _colourize_glyph(colour, ch) << " ";
#else
tiles.place_cursor(CURSOR_TUTORIAL, gc);
tiles.add_text_tag(TAG_TUTORIAL, "Portal", gc);
#endif
text << _describe_portal(gc);
#endif
break;
case TUT_HEAP_BRAND:
#ifdef USE_TILE
// XXX: How does heap branding work with tiles?
return;
#else
// Monster or player standing on heap.
if (monster_at(gc) || (you.pos() == gc))
DELAY_EVENT;
text << "If two or more items are on a single square then the square "
"will be highlighted, and the symbol for the item on the top "
"of the heap will be shown.";
case TUT_TRAP_BRAND:
#ifdef USE_TILE
// XXX: How does trap branding work with tiles?
return;
#else
// Monster or player standing on trap.
if (monster_at(gc) || (you.pos() == gc))
DELAY_EVENT;
text << "If any items are covering a trap then that will be "
"indicated by highlighting the <w>^</w> symbol, instead of "
"hiding the trap symbol with an item glyph.";
#endif
break;
break;
case TUT_AUTO_EXPLORE:
if (!Options.tut_explored)
DELAY_EVENT;
text << "Fully exploring a level and piciking up all the interesting "
"looking items can be tedious. To save on this tedium you "
"can press <w>o</w> to auto-explore, which will "
"automatically explore unmapped regions, automatically pick "
"up interesting items, and stop if a monster or interesting "
"dungeon feature (stairs, altar, etc) is encountered.";
Options.tut_explored = false;
break;
case TUT_NEW_ABILITY_MUT:
text << "That mutation granted you a new ability. Press <w>a</w> to "
"take a look at your abilities or to use one of them.";
break;
break;
case TUT_NEW_ABILITY_ITEM:
text << "That item you just equipped granted you a new ability "
"(un-equipping the item will remove the ability). "
"Press <w>a</w> to take a look at your abilities or to "
"use one of them.";
break;
break;
}
case TUT_MONSTER_SHOUT:
{
const monsters* m = monster_at(gc);
if (!m)
DELAY_EVENT;
const bool vis = you.can_see(m);
#ifdef USE_TILE
if (vis)
{
tiles.place_cursor(CURSOR_TUTORIAL, gc);
tiles.add_text_tag(TAG_TUTORIAL, m->name(DESC_CAP_A), gc);
}
#endif
if (!vis)
{
text << "Uh-oh, some monster noticed you, either one that's "
"around a corner or one that's invisible. Plus, the "
"noise it made will alert other monsters in the "
"vacinity, who will come to check out what the commotion "
"was about.";
}
else if (mons_shouts(m->type, false) == S_SILENT)
{
text << "Uh-oh, that monster noticed you! Forutnately, it "
"didn't make any noise, but many mosters <w>do</w> make "
"noise when they notice you, which alerts other monsters "
"in the area, who will come to check out what the "
"commotion was about.";
}
else
{
text << "Uh-oh, taht monster noticed you! Plus, the "
"noise it made will alert other monsters in the "
"vacinity, who will come to check out what the commotion "
"was about.";
}
case TUT_MONSTER_LEFT_LOS:
{
const monsters* m = monster_at(gc);
if (!m || !you.can_see(m))
DELAY_EVENT;
text << m->name(DESC_CAP_THE, true) << " didn't vanish, but merely "
"moved onto a square which isn't in your current LOS. It "
"will still be there, unless something happens to it in the "
"short amount of time it's out of sight.";
break;
}
learned_something_new(TUT_STAIR_BRAND, gc);
const item_def& item(mitm[it]);
if (Options.feature_item_brand != CHATTR_NORMAL
&& (is_feature('>', gc) || is_feature('<', gc)))
{
learned_something_new(TUT_STAIR_BRAND, gc);
}
else if (Options.trap_item_brand != CHATTR_NORMAL
&& is_feature('^', gc))
{
learned_something_new(TUT_TRAP_BRAND, gc);
}
else if (Options.heap_brand != CHATTR_NORMAL && item.link != NON_ITEM)
learned_something_new(TUT_HEAP_BRAND, gc);