Tutorial redesign

Summary Redesign the tutorial as a separate minigame.
Further information See Hints Mode Feedback, The Usability Project report.

This is an old page, the redesign has been implemented in 0.8

The tutorial added in 0.7 is a huge improvement to the old hints mode (which is badly in need of an overhaul) because it …

  • offers the player a safe environment for learning
  • reduces the amount of text
  • guarantees information that was previously randomly triggered

However, I think we can take things a step further… (For the old concept see the bottom of the page.)

“Problems” with the current concept:

  • A lot of commands in a very short time.
  • No intuitive breaks between lessons, no re-caps.
  • The player gets no time to experiment with e.g. a new combat system before learning about the next one.
  • If you want to go back to re-read a specific part of the tutorial, you have to re-play through the entire movement section which gets annoying even with autoexplore.
  • Also, the levels could be made to look more interesting. (Should be a bit of a teaser for the real game.)

New concept

The idea is to offer the player several distinct lessons picked from a sub-menu similar to the Sprint maps.

  1. Movement + exploration
  2. Monsters + combat
  3. Items + inventory
  4. Magic + spellcasting
  5. Gods + divine abilities
  6. minigame applying the lessons

Each lesson would comprise a fixed map with messages triggered by defined squares, as currently. At the beginning of each lesson, a message summarizing the goal of the lesson is displayed, e.g. “In this lesson, you're going to learn how to move around and explore a level.” along with the command to access the message history. At the end of each lesson the player is congratulated and is presented with a screen displaying all commands learned over the course of the lesson. Ideally, finishing a lesson (or leaving early) would land you back at the submenu (and the last lesson on the main menu).

Lesson 1: Movement + exploration


  • arrows (cardinal directions)
  • numpad/vi-keys (diagonals)
  • closed door
  • downstairs
  • shift-move
  • upstairs
  • secret glass door (obvious non-dead end) → searching
  • autoexplore
  • dead end → secret door → searching again
  • steam generatory (“geyser”) → autoexclusion
    • This might seem odd at first, but a common question for new Tiles players is, “What do these red X's mean?”
  • return to start/exit (X>, minimap)

Lesson 2: Monsters + combat


  • find weapon → pick up + wield
  • see monster (training dummy) → approach and attack
  • resting for hp
  • another more interesting, single monster (e.g. cockroach) → examine for weaknesses, then kill
  • group of different monsters → x+
  • one of them carrying/throwing stones → pick up
  • inaccessible monster (training dummy) → f
  • bow and arrows → wield
  • more monsters (row of training dummies) → f+, ff
  • [trigger?] → switch quivered items → f(

Lesson 3: Items + inventory

The current tutorial is actually pretty good with providing mini-puzzles for the player:

  • poisoned needle trap → healing potion
  • cursed item → ?remove curse
  • ?identify for good/bad items
  • killing monster → corpse → chop for food
  • burdened by stack of items → quantity drop
  • wand → killing monsters

I also suggest:

  • water → =levitation (with skewed Evocations skill)
  • gold → shop → Ctrl-O?
  • ego weapon
  • artefact armour
  • Ctrl-F
  • examining items
  • multipickup (2 items on the same square)

Lesson 4: Magic + spellcasting

This is the one lesson I don't have a very clear concept for. I am anticipating the following:

  • find a spellbook containing two spells (Sting/Magic Dart, plus Blink or another utility spell)
  • memorise the first spell
  • inaccessible monster (another training dummy?) → za, zap
  • resting for mp
  • more monsters → gain a level
  • learn the second spell
  • apply the second spell
  • new spellbook containing Animate Skeleton (with a load of decay-delayed skeletons around)
  • forget an old spell (player's choice) by destroying the first book
  • learn the new spell + apply it
  • control allies (attack, wait here)
  • kill more monsters → gain another level (special explanation about the importance of Int)
  • learn Mephitic Cloud
  • cloud placement

All spells contained in either of the two books should fulfill completely different functions. The idea is that the player can learn about targeted spells, direct-effect spells and position dependent spells. No spells above level 3.

In addition, the following is possible: Start out with Spellcasting skill slightly below the first level and enough xp in the xp pool to get to the first level by reading scrolls. Explain about skills, hand the player a stack of scrolls and let them train Spellcasting. The first book could be handed out beforehand or afterwards.

We could also cover success rates: Give the player a choice of body armour types (leather armour, ring mail, plate mail), point to the I screen and let them work out how spellcasting and armour interacts.

All of this is good stuff. We should also explain that players can read spell descriptions. (If we want to, we could show how ”?/” is one way to access information in-game. Once they've seen it for spells, they can apply this to branches, gods etc. on their own.) — dpeg 2011-01-23 14:26

Lesson 5: Gods + divine abilities

Offer choice between two gods, e.g. Makhleb and Trog.

  • pray at both altars to compare the gods, then pick one
  • check ^ screen, ^!
  • kill no-corpse monsters → gain piety for killing
  • kill monster → corpse → sacrifice
  • tougher monster → “use your divine (a)bilities”
  • more killing monsters (with and without saccing)
  • (check ^ screen for improved religious standing)

Test course

Here, the idea is to give the player a chance to apply the lessons naturally *and* bring across the game's goal at the same time. The best way to do this is to design a minigame that tasks the player with collecting three different runes, get the orb behind a door that can only be opened with 3 runes, and then return back to the exit.

  • 3 distinct challenges for the runes (e.g. snakes, kobolds throwing darts, imps)
  • unique “boss” monster in the orb chamber (Sigmund, most likely)
  • Challenges absolutely must be doable for a low-level character with the items supplied and resting between encounters.
  • Dying in the minigame is okay, though there should be a special message if it happens.
  • The starting area should offer a choice of altars (Trog, Makhleb, Fedhas?).
  • The starting area should also contain a shop with fixed inventory, all viable but not everything affordable.
  • Providing (more) gold in the rune chambers for upgrades would be cool.
  • Tentative rune names: learning, training, tutorial rune
  • Picking up the rune could trigger a message for useful bonus commands (e.g. '#', '%', '?' subcommands), should also be viewable by examining the runes.

On “winning” the tutorial, there should be a congratulatory message (possibly screen).


Great stuff! Here's a tutorial idea: stat screens. There could be a short course on how to use and observe '%', '@' and even the stat area top right. There could be different equipment scattered around the tutorial to try on, and see how they change the character's statistics. (Idea comes from after reading the Immortal Warwalrus report.) — evktalo 2011-01-16 10:11

I think it's more interesting if the player learns about these naturally over the course of the tutorial (e.g. '%' in response to putting on some type of equipment that confers resistances). Personally, I don't feel the @ command is _that_ important. It's almost completely superceded by the status lights and the overview screen. However, the stat area worries me. I've no idea how to explain about AC, EV, SH or even where to broach the issue of hit points or the xp pool. The stats, at least, are mentioned in the level-up messages, though not their abbreviations. (Should they be?) — jpeg 2011-01-23 13:18

Old concept

Implementation patch: here

The aim is to improve learnability of the game. The very basic commands are taught in a terse manner, so that the player needs to read as little as possible and can effectively scan for the commands needed. Unlike the current tutorial (future “hints mode”), these maps don't have any randomness.

The following problems identified in the Usability Project report are addressed (or an attempt is made to do so):

  • 2.1: Tutorial texts have too much information
  • 2.2: Tutorial gives some information about gameplay too soon
  • 2.3: Too long tutorial texts
  • 2.4: The word “tutorial” raises different expectations than what the mode actually is in the game
  • 4.7: The difference between lower and upper case letters as commands is hard to pick up
  • 4.9: vi-keys are obscure and unintuitive
  • 7.1: It is not obvious that resting is the main way of regaining health
  • 7.2: Player doesn't realize that corpses need to be chopped before eating
  • 7.7 It is not obvious that the player can (and should) move diagonally
  • Code-wise, the tutorial gamemode needs:
    • No monster spawning
    • No random generation of any kind: (monsters, items, traps, shops can be done with tags), vaults and dungeon generation are hopefully turned off with encompass
    • Welcome message
    • Turn off ET/overflow generation
    • The player should start with Hungry, or be guaranteed to hit it by the time they get to the butchering room (there should be a triggered message)
      • (In general, this design doesn't include triggered messages for the tutorial - many would likely be useful.)
    • The character should be fixed: High Elf with some Spellcasting skill (but no spells), without a weapon
    • Experience: the character should gain an XL at some point (with appropriate trigger messages)
    • Piety hax - there should be enough piety to use Minor Destruction
    • There should be helpful texts in the inventory etc screens, like in the current tutorial.

The maps

To test these maps: replace entry.des with these maps.

Known bugs: Overflow altars break these maps spectacularly sometimes.

# TODO: Use dynamic commands instead of hard-coding them to text.

NAME:    tutorial_basic_1
TAGS:    entry no_rotate no_monster_gen no_item_gen no_hmirror no_vmirror no_trap_gen no_shop_gen
BFLAGS:  islanded
KMASK:   + = no_secret_doors
ORIENT:  encompass
ITEM:    mace, helmet
# TODO: This message should be displayed when the tutorial game starts. Do it in the code side, not the maps.
MARKER:  { = lua:message_at_spot ( "Welcome to the tutorial. We start with \
                                   basic movement. You can <white>click</white> on a square to move there. You can also \
                                   use <white>numpad</white> or vi-keys to move. (TODO: add numpad/hjklyubn diagrams \
                                   here)", "tutorial", "true" )
# TODO: Include a travel stopper to the message square.
MARKER:  A = lua:message_at_spot ( "\nYou need to move diagonally here. <white>Click</white> with \
         mouse, <white>3</white> or <white>n</white>.", "tutorial", "true" )
MARKER:  B = lua:message_at_spot ( "\nNow use <white>1</white> or <white>b</white>.", "tutorial", "true" )
MARKER:  C = lua:message_at_spot ( "\nExploring manually can be tedious, try auto-explore <white>o</white>.", "tutorial", "true" )
MARKER:  D = lua:message_at_spot ( "\nThis is a door. Open it by moving into it, you can close it with <white>C</white>. \
                                   Note that it is a capital <white>C</white> - keyboard commands are case-sensitive. \
                                   <white>Ctrl-click</white> and <white>Ctrl-direction</white> also works.", "tutorial", "true" )
MARKER:  } = lua:message_at_spot ( "\nTake stairs down with <white>shift-click</white> or <white>></white>.", "tutorial", "true" )
MARKER:  E = lua:message_at_spot ( "\nPick up the mace and the helmet with <white>g</white> or <white>clicking</white> your \
                                   character while standing on the items. You can also <white>click</white> items in the floor \
                                   section in the inventory region to pick them up.", "tutorial", "true" )
# TODO: Make the messages sensitive to if the game is tiles or console.
MARKER:  F = lua:message_at_spot ( "\nWield it by <white>clicking</white> the mace in the inventory in the lower right (or by \
                                   hitting <white>w</white>). Wear the helmet by <white>clicking</white> in the inventory (or \
                                   by hitting <white>W</white> - again, note the capital <white>W</white>.", "tutorial", "true" )
MARKER:  G = lua:message_at_spot ( "\nTo attack monsters, move into them (or <white>click</white> while adjecent).", "tutorial", "true" )
MARKER:  H = lua:message_at_spot ( "\nRest! You have probably lost health in your battle. (See upper right stat area.) You regain \
                                   health by resting. Press <white>5</white> to rest untill healed. ", "tutorial", "true" )
#TILE:    ABCDEFGH = tutorial_message_tile_name_here
MONS:    training dummy ; damaged club

NAME:    tutorial_basic_2
TAGS:    no_rotate no_monster_gen no_item_gen no_hmirror no_vmirror no_trap_gen no_shop_gen
KPROP:   l = no_cloud_gen
ORIENT:  encompass
PLACE:   D:2
KITEM:   A = dart q:25
ITEM:    randbook disc:conjuration numspells:1 slevels:1 spell:magic_dart \
MARKER:  [ = lua:message_at_spot ( "\nPress <white>shift-click</white> your character or <white><<</white> to climb these stairs.", 
                                   "tutorial", "true" )
MARKER:  A = lua:message_at_spot ( "\nHere are some darts, pick them up.", "tutorial", "true" )
# TODO: Targetting needs tutorial messages; these can't be done on the map side.
MARKER:  B = lua:message_at_spot ( "\nPress <white>f</white> to throw darts.", "tutorial", "true" )
MARKER:  C = lua:message_at_spot ( "\nRemember to rest with <white>5</white>.", "tutorial", "true" )
MARKER:  D = lua:message_at_spot ( "\nMemorize the spell from this spellbook by <white>clicking</white> on the \
                                   memorize tab on the lower right. You can also press <white>M</white> to enter \
                                   memorization screen.", "tutorial", "true" )
MARKER:  E = lua:message_at_spot ( "\n<white>Click</white> magic dart in the spell tab, or press <white>z</white>, \
                                    or <white>ctrl-click</white> on the monster.", "tutorial", "true" )
MARKER:  F = lua:message_at_spot ( "\nRest up!", "tutorial", "true" )
MONS:    training dummy ; stone q:30

NAME:    tutorial_basic_3
TAGS:    no_rotate no_monster_gen no_item_gen no_hmirror no_vmirror no_trap_gen no_shop_gen
KPROP:   l = no_cloud_gen
ORIENT:  encompass
PLACE:   D:3
KFEAT:   , = .
KPROP:   , = bloody
ITEM:    hand axe
ITEM:    bread ration
ITEM:    scroll of identify q:3, ring of slaying
ITEM:    meat ration q:50
ITEM:    cursed great sword, scroll of remove curse q:3
KITEM:   p = potion of healing q:3
KITEM:   m = potion of restore abilities q:3
KITEM:   n = potion of degeneration q:3
KFEAT:   pmn = .
KITEM:   o = wand of fireball
KFEAT:   o = .
MARKER:  A = lua:message_at_spot ( "\nYou can chop up corpses with <white>c</white> into edible meat chunks. \
                                   You need a sharp object, such as the axe here.", "tutorial", "true" )
MARKER:  d = lua:message_at_spot ( "\nThis axe was picked up automatically because you didn't have a butchering tool.", 
                                   "tutorial", "true" )
MARKER:  B = lua:message_at_spot ( "\nThis bread ration is permanent food. It will not rot, like the chunks from corpses.", 
                                   "tutorial", "true" )
MARKER:  C = lua:message_at_spot ( "\nHere is a scroll of identify and an unknown ring. Item properties are often \
                                   hidden and you need to find out what they do by experimentation or identification. \
                                   Try the scroll on the ring. (use it by <white>clicking</white> or <white>r</white>ead). \
                                   You can put on jewellery with capital <white>P</white> or <white>clicking</white> it in \
                                   the inventory.", "tutorial", "true" )
MARKER:  D = lua:message_at_spot ( "\nThese meat rations weigh too much. You can drop them with <white>d</white>. \
                                   You can also drop e.g. only 10, by typing <white>d</white>, <white>10</white> and \
                                   then selecting the meat rations.", "tutorial", "true" )
MARKER:  E = lua:message_at_spot ( "\nThis sword is cursed. If you wield it, you can uncurse it by reading this \
                                   remove curse scroll. You can use the scroll by first <white>clicking</white> it in your \
                                   inventory and then selecting item to be uncursed.", "tutorial", "true" )
MARKER:  F = lua:message_at_spot ( "\nHere are three stacks of unknown potions. Go ahead and experiment! \
                                   <white>Click</white> or <white>q</white>uaff.", "tutorial", "true" )
MARKER:  G = lua:message_at_spot ( "\nYou can evoke wands with <white>V</white>.", "tutorial", "true" )
MARKER:  H = lua:message_at_spot ( "\nHere's some gold. Shops exist in the game. Note that they don't buy items from you, \
                                   so there's no need to carry stuff around that you can't use. Gold is picked up automatically.", 
                                   "tutorial", "true" )
MONS:    rat, rat always_corpse
MONS:    training dummy ; stone q:30

NAME:    tutorial_basic_4
TAGS:    no_rotate no_monster_gen no_item_gen no_hmirror no_vmirror no_trap_gen no_shop_gen
KMASK:   + = no_secret_doors
ORIENT:  encompass
PLACE:   D:4
KFEAT:   ^ = needle trap
KFEAT:   _ = altar_makhleb
KMONS:   S = Sigmund
KFEAT:   S = .
MONS:    rat, rat always_corpse
MONS:    training dummy spells:blink;blink;blink;blink;blink;blink ; whip ego:reaching
MARKER:  A = lua:message_at_spot ( "\nYou may have got poisoned from the trap. Drink a potion of healing, or rest \
                                   with <white>5</white> to try to wait it out.", "tutorial", "true" )
MARKER:  B = lua:message_at_spot ( "\nLook for the secret door in the glass wall. Either wait a single turn with \
                                   <white>s</white> or <white>.</white>, or search longer with <white>5</white>.", 
                                   "tutorial", "true" )
# TODO: Hax some piety for the player so that minor destruction is immediately usable.
MARKER:  C = lua:message_at_spot ( "\nHere's an altar to one of the gods in the game. You can <white>p</white>ray \
                                   on an altar to start worshipping.", "tutorial", "true" )
MARKER:  D = lua:message_at_spot ( "\nMakheb accepts kills and corpse sacrifices. Kill these rats, and then \
                                   <white>p</white>ray over their corpses to sacrifice them to Makheb", "tutorial", "true" )
MARKER:  E = lua:message_at_spot ( "\nUse minor destruction <white>a</white>bility to attack this annoying dummy.", 
                                   "tutorial", "true" )
MARKER:  F = lua:message_at_spot ( "\nBehind this door is Sigmund. He is a powerful unique monster, and is likely \
                                   to kill you. In Crawl, running away is often a very important tactic. Thanks for \
                                   playing the tutorial!", "tutorial", "true" )

# TODO: The game should end after dying to Sigm.. after managing to enter D:5
# Could have a conglatulatory map as D:5 with nice scenery.
Logged in as: Anonymous (VIEWER)
graveyard/tutorial_redesign.txt · Last modified: 2011-11-29 22:47 by evktalo
Recent changes RSS feed Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki