diff options
author | j-p-e-g <j-p-e-g@c06c8d41-db1a-0410-9941-cceddc491573> | 2009-05-25 09:07:41 +0000 |
---|---|---|
committer | j-p-e-g <j-p-e-g@c06c8d41-db1a-0410-9941-cceddc491573> | 2009-05-25 09:07:41 +0000 |
commit | 0e88d35a455c4c56b0edc0fc6729b0d1b8014731 (patch) | |
tree | 535b85c7c4e4ab869c195dc16bf0b77df9733007 /crawl-ref/source/tutorial.cc | |
parent | 57bdaabbe48d32989e7c69b8d66041e683fe1d49 (diff) | |
download | crawl-ref-0e88d35a455c4c56b0edc0fc6729b0d1b8014731.tar.gz crawl-ref-0e88d35a455c4c56b0edc0fc6729b0d1b8014731.zip |
* More tutorial tweaks (tiles, mostly).
* Allow (r)eplacing an existing inscription as a shortcut to (c)learing
+ (i)nscribing.
git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@9827 c06c8d41-db1a-0410-9941-cceddc491573
Diffstat (limited to 'crawl-ref/source/tutorial.cc')
-rw-r--r-- | crawl-ref/source/tutorial.cc | 276 |
1 files changed, 162 insertions, 114 deletions
diff --git a/crawl-ref/source/tutorial.cc b/crawl-ref/source/tutorial.cc index fa48b35fa9..36feb925b2 100644 --- a/crawl-ref/source/tutorial.cc +++ b/crawl-ref/source/tutorial.cc @@ -1340,7 +1340,8 @@ void tutorial_first_item(const item_def &item) || Options.tut_just_triggered) { // NOTE: Since a new player might not think to pick up a - // corpse, TUT_SEEN_CARRION is done when a corpse is first seen. + // corpse (and why should they?), TUT_SEEN_CARRION is done when a + // corpse is first seen. if (!Options.tut_just_triggered && item.base_type == OBJ_CORPSES && monster_at(item.pos) == NULL) @@ -1523,14 +1524,14 @@ static std::string _describe_portal(const coord_def &gc) "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> " + "another <w>\\</w> (though NOT the ancient stone arch you'll start " + "out on) " #endif - "(though NOT the ancient stone arch you'll start out on) " "and press <w><<</w>."; #ifdef USE_TILE @@ -1758,7 +1759,7 @@ void learned_something_new(tutorial_event_type seen_what, coord_def gc) case TUT_SEEN_CARRION: // NOTE: This is called when a corpse is first seen as well as when // first picked up, since a new player might not think to pick - // up a corpse. + // up a corpse. if (gc.x <= 0 || gc.y <= 0) text << "Ah, a corpse!"; @@ -1796,25 +1797,28 @@ void learned_something_new(tutorial_event_type seen_what, coord_def gc) "can <w>c</w>hop it up with a sharp implement"; if (_cant_butcher()) + { text << " (though unfortunately you can't do that right now, " "since the cursed weapon you're wielding can't slice up " "meat, and you can't let go of it to wield one that " "can)"; + } else if (_num_butchery_tools() == 0) + { text << " (but you currently possess nothing which can do this, " "so you should pick up the first knife, dagger, sword " "or axe you find)"; - + } text << ". Once hungry you can then <w>e</w>at the resulting chunks " "(though they may not be healthful)."; #ifdef USE_TILE - text << " With tiles, you can also chop up any corpse that shows in " + text << " With tiles, you can also chop up any corpse that shows up 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>."; - #endif + if (god_likes_butchery(you.religion)) { text << " During prayer you can offer corpses to " @@ -1836,7 +1840,7 @@ void learned_something_new(tutorial_event_type seen_what, coord_def gc) #ifndef USE_TILE << " ('<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" + "it. You can view its properties from your <w>i</w>nventory" #else << ". 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 " @@ -1852,7 +1856,7 @@ void learned_something_new(tutorial_event_type seen_what, coord_def gc) #ifdef USE_TILE "clicking on it to e<w>V</w>oke " #else - "e<w>v</w>oking " + "e<w>V</w>oking " #endif "it. Some items need to be wielded first before you can " "e<w>v</w>oke them. As usual, selecting it from your " @@ -2022,11 +2026,12 @@ void learned_something_new(tutorial_event_type seen_what, coord_def gc) case TUT_STAIR_BRAND: #ifdef USE_TILE - // XXX: How does stair branding work with tiles? - return; + text << "A small question mark on a stair tile signifies that there " + "are items in that position that you may want to check out."; + break; #else // Monster or player standing on stairs. - if (monster_at(gc) || (you.pos() == gc)) + if (monster_at(gc) || you.pos() == gc) DELAY_EVENT; text << "If any items are covering stairs or an escape hatch, then " @@ -2037,14 +2042,16 @@ void learned_something_new(tutorial_event_type seen_what, coord_def gc) 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)) + if (monster_at(gc) || you.pos() == gc) DELAY_EVENT; +#ifdef USE_TILE + text << "A small question mark on an item tile signifies that there " + "is at least one other item in the same heap that you may want " + "to check out."; + break; +#else 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."; @@ -2053,7 +2060,7 @@ void learned_something_new(tutorial_event_type seen_what, coord_def gc) case TUT_TRAP_BRAND: #ifdef USE_TILE - // XXX: How does trap branding work with tiles? + // Tiles show both the trap and the item heap. return; #else // Monster or player standing on trap. @@ -2155,6 +2162,17 @@ void learned_something_new(tutorial_event_type seen_what, coord_def gc) text << "\nIn Tiles, the same can be achieved by clicking on an " "adjacent door square."; #endif + if (Options.tut_explored) + { + text << "\nTo avoid accidentally opening a door you'd rather " + "remain closed during travel or autoexplore, you can mark " + "it with an exclusion from the map view (<w>X</w>) with " + "<w>ee</w> while you cursor is on the grid in question. " + "Such an exclusion will prevent autotravel to ever enter " + "that grid until you remove the exclusion with another " + "press of <w>Xe</w>."; + } + break; case TUT_SEEN_SECRET_DOOR: @@ -2180,9 +2198,9 @@ void learned_something_new(tutorial_event_type seen_what, coord_def gc) "If you can't find all three (or any) of the down stairs " "on a level, you should try searching for secret doors, since " "the missing stairs might be in sections of the level blocked " - "off by them. If you can't find any secret doors, then the " - "missing stairs are probably in sections of the level totally " - "disconnected from the section you're searching."; + "off by them. If you really can't find any secret doors, then " + "the missing stairs are probably in sections of the level " + "totally disconnected from the section you're searching."; break; case TUT_KILLED_MONSTER: @@ -2322,7 +2340,7 @@ void learned_something_new(tutorial_event_type seen_what, coord_def gc) #ifdef USE_TILE "or by clicking onto the stats area" #endif - "), or you could quaff a potion of healing."; + "), or you could quaff a potion of healing. "; break; case TUT_YOU_ROTTING: @@ -2339,7 +2357,7 @@ void learned_something_new(tutorial_event_type seen_what, coord_def gc) "While you can wait it out, you'll probably want to stop " "rotting as soon as possible by drinking a potion of healing, " "since the longer you wait the more your maximum HP will be " - "reduced. Once you've stopped rotting, you can restore your " + "reduced. Once you've stopped rotting you can restore your " "maximum HP to normal by drinking potions of healing and heal " "wounds while fully healed."; break; @@ -2361,24 +2379,30 @@ void learned_something_new(tutorial_event_type seen_what, coord_def gc) "with a sharp implement. "; if (_cant_butcher()) + { text << "Unfortunately you can't butcher corpses right now, " "since the cursed weapon you're wielding can't slice up " "meat, and you can't let go of it to wield one that " "can."; + } else { const int num = _num_butchery_tools(); if (num == 0) + { text << "However, you currently possess no sharp implements, " "so you should pick up the first knife, dagger, sword " "or axe you find. "; + } else if (Options.tutorial_type != TUT_MAGIC_CHAR) text << "Your starting weapon will do nicely. "; else if (num == 1) text << "The slicing weapon you picked up will do nicely. "; else + { text << "One of the slicing weapons you picked up will do " "nicely. "; + } } text << "Try to dine on chunks in order to save permanent food."; @@ -2391,7 +2415,9 @@ void learned_something_new(tutorial_event_type seen_what, coord_def gc) 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."; + "inventory, rather than wait for a monster to leave a corpse. " + "In a pinch potions and fountains also can provide some " + "nutrition, though not as much as food."; if (Options.tutorial_type == TUT_MAGIC_CHAR) text << "\nNote that you cannot cast spells while starving."; @@ -2405,8 +2431,8 @@ void learned_something_new(tutorial_event_type seen_what, coord_def gc) #endif "twice you can choose items from a menu" #ifdef USE_TILE - ", either by pressing their letter, or by clicking on their " - "tiles presented at the bottom of the screen" + ", either by pressing their letter, or by clicking the " + "corresponding lines in the menu" #endif ".\nThis takes fewer keystrokes but has no influence on the " "number of turns needed. Multi-pickup will be interrupted by " @@ -2431,7 +2457,7 @@ void learned_something_new(tutorial_event_type seen_what, coord_def gc) #ifdef USE_TILE 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."; + "clicking on them."; #endif if (Options.tut_stashes) @@ -2446,13 +2472,14 @@ void learned_something_new(tutorial_event_type seen_what, coord_def gc) text << "\n\nBe warned that items that you leave on the floor can " "be picked up and used by monsters."; - break; case TUT_ROTTEN_FOOD: text << "One or more of the chunks or corpses you carry has started " "to rot. Few species can digest these safely, so you might " - "just as well <w>d</w>rop them now."; + "just as well <w>d</w>rop them now. When selecting items from " + "a menu, there's a shortcut (<w>&</w>) to select all skeletons " + "and rotten chunks or corpses in the stash at once."; break; case TUT_ROTTEN_GONE: @@ -2463,22 +2490,25 @@ void learned_something_new(tutorial_event_type seen_what, coord_def gc) case TUT_MAKE_CHUNKS: text << "How lucky! That monster left a corpse which you can now " - "<w>c</w>hop up"; + "<w>c</w>hop up"; if (_cant_butcher()) + { text << "(or which you <w>could</w> chop up if it weren't for " - "the fact that you can't let go of you cursed " + "the fact that you can't let go of your cursed " "non-chopping weapon)"; + } else if (_num_butchery_tools() == 0) + { text << "(or which you <w>could</w> chop up if you had a " "chopping weapon; you should pick up the first knife, " "dagger, sword or axe you find if you want to be able " "to chop up corpses)"; - - text << ". One or more chunks will appear that you " - "can then <w>e</w>at. Beware that some chunks may be, " - "sometimes or always, hazardous. You can find out whether " - "that might be the case by " + } + text << ". One or more chunks will appear that you can then " + "<w>e</w>at. Beware that some chunks may be, sometimes or " + "always, hazardous. You can find out whether that might be the " + "case by " #ifdef USE_TILE "clicking with your <w>right mouse button</w> onto the corpse " "or chunk."; @@ -2511,14 +2541,18 @@ void learned_something_new(tutorial_event_type seen_what, coord_def gc) << " by <w>c</w>hopping it while <w>p</w>raying. "; if (_cant_butcher()) + { text << "(Or you <w>could</w> sacrifice it if it weren't for " - "the fact that you can't let go of your cursed " + "the fact that you can't let go of you cursed " "non-chopping weapon)"; + } else if (_num_butchery_tools() == 0) + { text << "(Or you <w>could</w> sacrifice it if you had a " "chopping weapon; you should pick up the first knife, " "dagger, sword or axe you find if you want to be able " "to chop up corpses)"; + } break; case TUT_SHIFT_RUN: @@ -2545,7 +2579,7 @@ void learned_something_new(tutorial_event_type seen_what, coord_def gc) case TUT_AUTO_EXPLORE: if (!Options.tut_explored) - DELAY_EVENT; + return; text << "Fully exploring a level and picking up all the interesting " "looking items can be tedious. To save on this tedium you " @@ -2631,23 +2665,23 @@ void learned_something_new(tutorial_event_type seen_what, coord_def gc) break; 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."; + text << "You recently noticed an invisible monster, so unless you " + "killed it or left the scene 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."; Options.tut_last_healed = you.num_turns; break; case TUT_CAN_BERSERK: // Don't print this information if the player already knows it. - if (!Options.tut_berserk_counter) - { - text << "Against particularly difficult foes, you should use your " - "Berserk <w>a</w>bility. Berserk will last longer if you " - "kill a lot of monsters."; - } + if (Options.tut_berserk_counter) + return; + + text << "Against particularly difficult foes, you should use your " + "Berserk <w>a</w>bility. Berserk will last longer if you " + "kill a lot of monsters."; break; case TUT_POSTBERSERK: @@ -2673,7 +2707,7 @@ void learned_something_new(tutorial_event_type seen_what, coord_def gc) "may follow you if they're standing right next to you when " "you start climbing or descending the stairs. And even if " "you've managed to shake them off, they'll still be there when " - "you come back, so you'll want to use a different set of " + "you come back, so you might want to use a different set of " "stairs when you return."; if (you.religion == GOD_TROG && !you.duration[DUR_BERSERKER] @@ -2694,7 +2728,7 @@ void learned_something_new(tutorial_event_type seen_what, coord_def gc) "lie, so retreat (if possible) might be the better option."; if (_advise_use_wand()) - text << "\n\nOr you could evoke (<w>V</w>) a wand to deal damage."; + text << "\n\nOr you could e<w>V</w>oke a wand to deal damage."; break; case TUT_YOU_MUTATED: @@ -2904,7 +2938,7 @@ void learned_something_new(tutorial_event_type seen_what, coord_def gc) } case TUT_FLEEING_MONSTER: if (Options.tutorial_type != TUT_BERSERK_CHAR) - break; + return; text << "Now that monster is scared of you! Note that you do not " "absolutely have to follow it. Rather, you can let it run " @@ -2948,9 +2982,11 @@ void learned_something_new(tutorial_event_type seen_what, coord_def gc) "to talk to them."; if (!mons_att_wont_attack(m->attitude)) - text << "\n\nHowever, it is only <w>temporarily</w> friendly, " - "and will become dangerous again when this friendliness " + { + text << "\nHowever, it is only <w>temporarily</w> friendly, and " + "will become dangerous again when this friendliness " "wears off."; + } break; } @@ -3004,9 +3040,9 @@ void learned_something_new(tutorial_event_type seen_what, coord_def gc) 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."; + "moved onto a square which you can't currently see. It's still " + "nearby, unless something happens to it in the short amount of " + "time it's out of sight."; break; } @@ -3051,8 +3087,9 @@ void learned_something_new(tutorial_event_type seen_what, coord_def gc) } text << "If the spellcasting success chance is high (which can be " - "checked by entering <w>z\?</w>) then a miscast merely means " - "the spell is not working, along with a harmless side effect. " + "checked by entering <w>z\?</w> or <w>I</w>) then a miscast " + "merely means the spell is not working, along with a harmless " + "side effect. " "However, for spells with a low success rate, there's a chance " "of contaminating yourself with magical energy, plus a chance " "of an additional harmful side effect. Normally this isn't a " @@ -3066,11 +3103,11 @@ void learned_something_new(tutorial_event_type seen_what, coord_def gc) } case TUT_SPELL_HUNGER: text << "The spell you just cast made you hungrier; you can see how " - "hungry spells make you by entering <w>z\?!</w>. The amount of " - "nutrition consumed increases with the level of the spell and " - "decreases depending on your intelligence stat and your " - "Spellcasting skill. If both of these are high enough, a spell " - "might even not cost you any nutrition at all."; + "hungry spells make you by entering <w>z\?!</w> or <w>II</w>. " + "The amount of nutrition consumed increases with the level of " + "the spell and decreases depending on your intelligence stat " + "and your Spellcasting skill. If both of these are high " + "enough a spell might even not cost you any nutrition at all."; break; case TUT_GLOWING: @@ -3117,11 +3154,15 @@ void learned_something_new(tutorial_event_type seen_what, coord_def gc) "it a bit, so as to then <w>f</w>ire it at a monster."; if (Options.tutorial_type == TUT_MAGIC_CHAR) + { text << " Note that casting spells is still very much possible, " "as is using wands, scrolls and potions."; + } else + { text << " Note that using wands, scrolls and potions is still " "very much possible."; + } break; case TUT_LOAD_SAVED_GAME: @@ -3245,25 +3286,26 @@ static std::string _tut_target_mode(bool spells = false) static std::string _tut_abilities(const item_def& item) { - std::string str = "To do this, "; + std::string str = "To do this, "; - if (!item_is_equipped(item)) - { - switch(item.base_type) - { - case OBJ_WEAPONS: str += "first <w>w</w>ield it"; break; - case OBJ_ARMOUR: str += "first <w>W</w>ear it"; break; - case OBJ_JEWELLERY: str += "first <w>P</w>ut it on"; break; - default: - str += "<r>(BUG! this item shouldn't give an ability)</r>"; - break; - } - str += ", then "; - } - str += "enter the ability menu with <w>a</w>, and then " + if (!item_is_equipped(item)) + { + switch(item.base_type) + { + case OBJ_WEAPONS: str += "first <w>w</w>ield it"; break; + case OBJ_ARMOUR: str += "first <w>W</w>ear it"; break; + case OBJ_JEWELLERY: str += "first <w>P</w>ut it on"; break; + default: + str += "<r>(BUG! this item shouldn't give an ability)</r>"; + break; + } + str += ", then "; + } + str += "enter the ability menu with <w>a</w>, and then " "choose the corresponding ability. Note that such an attempt of " "activation, especially by the untrained, is likely to fail."; - return (str); + + return (str); } static std::string _tut_throw_stuff(const item_def &item) @@ -3333,32 +3375,32 @@ void tutorial_describe_item(const item_def &item) if (!wielded) { - ostr << "You can wield this weapon with <w>w</w>, or use " - "<w>'</w> to switch between the weapons in slot " - "a and b. (Use <w>=</w> to adjust item slots.)"; - - // Weapon skill used by this weapon and the best weapon skill. - int curr_wpskill, best_wpskill; - - // Maybe this is a launching weapon? - if (is_range_weapon(item)) - { - // Then only compare with other launcher skills. - curr_wpskill = range_skill(item); - best_wpskill = best_skill(SK_SLINGS, SK_DARTS, 99); - } - else - { - // Compare with other melee weapons. - curr_wpskill = weapon_skill(item); - best_wpskill = best_skill(SK_SHORT_BLADES, SK_STAVES, 99); - // Maybe unarmed is better. - if (you.skills[SK_UNARMED_COMBAT] > you.skills[best_wpskill]) - best_wpskill = SK_UNARMED_COMBAT; - } - - if (you.skills[curr_wpskill] + 2 < you.skills[best_wpskill]) - { + ostr << "You can wield this weapon with <w>w</w>, or use " + "<w>'</w> to switch between the weapons in slot " + "a and b. (Use <w>=i</w> to adjust item slots.)"; + + // Weapon skill used by this weapon and the best weapon skill. + int curr_wpskill, best_wpskill; + + // Maybe this is a launching weapon? + if (is_range_weapon(item)) + { + // Then only compare with other launcher skills. + curr_wpskill = range_skill(item); + best_wpskill = best_skill(SK_SLINGS, SK_DARTS, 99); + } + else + { + // Compare with other melee weapons. + curr_wpskill = weapon_skill(item); + best_wpskill = best_skill(SK_SHORT_BLADES, SK_STAVES, 99); + // Maybe unarmed is better. + if (you.skills[SK_UNARMED_COMBAT] > you.skills[best_wpskill]) + best_wpskill = SK_UNARMED_COMBAT; + } + + if (you.skills[curr_wpskill] + 2 < you.skills[best_wpskill]) + { ostr << "\nOn second look, you've been training in <w>" << skill_name(best_wpskill) << "</w> for a while, so maybe you should " @@ -3368,7 +3410,7 @@ void tutorial_describe_item(const item_def &item) "management screen for the actual numbers.)"; long_text = true; - } + } } else // wielded weapon { @@ -3464,8 +3506,7 @@ void tutorial_describe_item(const item_def &item) "innate abilities.)"; wearable = false; } - else if (item.sub_type == ARM_CENTAUR_BARDING - && you.species != SP_CENTAUR) + else if (item.sub_type == ARM_CENTAUR_BARDING) { ostr << "Only centaurs can wear centaur barding."; wearable = false; @@ -3645,7 +3686,7 @@ void tutorial_describe_item(const item_def &item) { ostr << "A manual can greatly help you in training a skill. " "To use it, <w>r</w>ead it while your experience " - "pool (the number in brackets) is full. Note that " + "pool (the number in brackets) is large. Note that " "this will drain said pool, so only use this manual " "if you think you need the skill in question."; } @@ -3738,8 +3779,10 @@ void tutorial_describe_item(const item_def &item) if (food_is_rotten(item)) { ostr << "Rotten corpses won't be of any use to you, though, so " - "you might just as well <w>d</w>rop this. No god will " - "accept such rotten sacrifice, either."; + "you might just as well <w>d</w>rop this. Use " + "<w>d&</w> to select all skeletons and rotten chunks " + "or corpses in your inventory. No god will accept such " + "rotten sacrifice, either."; } else { @@ -4007,8 +4050,10 @@ static void _tutorial_describe_feature(int x, int y) #endif if (is_travelable_stair(feat) && !travel_cache.know_stair(where)) + { ostr << "\n\nYou have not yet passed through this particular " "set of stairs. "; + } Options.tutorial_events[TUT_SEEN_STAIRS] = false; break; @@ -4300,10 +4345,13 @@ void tutorial_describe_monster(const monsters *mons) ostr << "Friendly monsters will follow you around and attempt to aid " "you in battle. You can order your allies by <w>t</w>alking " "to them."; + if (!mons_att_wont_attack(mons->attitude)) + { ostr << "\n\nHowever, it is only <w>temporarily</w> friendly, " "and will become dangerous again when this friendliness " "wears off."; + } } else if (dangerous) { @@ -4312,7 +4360,7 @@ void tutorial_describe_monster(const monsters *mons) ostr << "You can easily mark its square as dangerous to avoid " "accidentally entering into its field of view when using " "auto-explore or auto-travel. To do so, enter the level " - "map with <w>X</w> and then press <w>Ctrl-X</w> when your " + "map with <w>X</w> and then press <w>e</w> when your " "cursor is hovering over the monster's grid. Doing so will " "mark this grid and all surrounding ones within a radius " "of 8 as \"excluded\" ones that explore or travel modus " |