summaryrefslogtreecommitdiffstats
path: root/crawl-ref/docs/develop/monster_speech.txt
diff options
context:
space:
mode:
Diffstat (limited to 'crawl-ref/docs/develop/monster_speech.txt')
-rw-r--r--crawl-ref/docs/develop/monster_speech.txt900
1 files changed, 900 insertions, 0 deletions
diff --git a/crawl-ref/docs/develop/monster_speech.txt b/crawl-ref/docs/develop/monster_speech.txt
new file mode 100644
index 0000000000..d497fd2bbf
--- /dev/null
+++ b/crawl-ref/docs/develop/monster_speech.txt
@@ -0,0 +1,900 @@
+Overview
+========
+
+As of Dungeon Crawl Stone Soup 0.3 the previously hard-coded monster
+speech has been outsourced. This makes changing existing messages,
+or adding new ones really easy. This file will hopefully help you in
+this endeavour.
+
+The outsourced messages are used to create two databases out of which
+Crawl randomly draws the necessary speech text.
+
+* shout.db (handling speech when monsters first notice you), and
+* speak.db (for all other cases).
+
+Because of the amount of definitions necessary, they have been divided
+over a number of different files.
+
+The shout database is constructed from the following two files:
+
+* shout.txt handles message output for monsters noticing you
+* insult.txt handles insults thrown at you by imps and demons
+
+The speak database contains messages defined in these files:
+
+* monspeak.txt handles messages for monsters communicating with you
+* wpnnoise.txt handles randart weapons with the noises property
+* godspeak.txt handles randomized speech by the gods, as well as
+ speech used for some divine abilities
+* insult.txt Same file as above.
+
+The messages defined in insult.txt form a part of both databases.
+Apart from that, keywords and statements defined for one database
+cannot be automatically accessed from the other. Rather, they have to
+be defined a second time.
+
+Whenever Dungeon Crawl is started, the game checks whether any of the
+databases needs to be updated. If one of the underlying files has been
+changed since the last check, the database is automatically rerolled.
+That means that if you'd like to change one of the descriptions or add
+some new monster speech all you have to do is modify the file, save,
+and restart the game to test your changes.
+
+
+Contents:
+ A. Monster speech probabilities
+ B. A simple example
+ C. Key lookup in detail
+ D. Values in detail
+ E. Testing your changes
+ F. Publishing your changes
+ APPENDIX: List of monster glyphs
+
+
+A. Monster speech probabilities
+================================
+
+Not all monsters are equally likely to speak. Rather there are
+different chances involved, depending on several attributes, and most
+of the time the database lookup stage isn't even reached.
+
+First, the player will only ever hear monsters speak if they are in
+line of sight, and monsters will only ever speak if they are not
+asleep, not submerged in water, air or lava, and not wandering around
+aimlessly (unless neutral).
+
+Berserk monsters are too busy killing and maiming to speak. Also,
+invisible monsters the player can't see (for lack of see invisible)
+will always stay silent, unless confused.
+
+Monsters capable of speech (i.e. all intelligent humanoid monsters, as
+well as all uniques and some non-unique demons) have a base chance of
+1/21 of speaking, while humanoid monsters incapable of speech will
+never communicate with the player in any form.
+
+Non-humanoid monsters get a 1/84 probability of "speaking" per turn
+(non-verbal actions, more like). This chance is divided by another 10,
+if the monster in question was generated as a member of a group.
+Chances are again doubled if this non-humanoid monster is fleeing, and
+doubled again if confused.
+
+Neutral monsters only speak half as often, and for charmed monsters
+the probability is divided by 3. The same applies to silenced
+monsters, i.e. monsters that are not naturally silent will only get to
+even attempt to speak in one out of three tries where the above
+chances hold.
+
+Note that the definition of which monsters are capable of speech is
+entirely hardcoded. We think we made this apply to all sensible
+monsters, i.e. all intelligent humanoid monsters, but of course it is
+possible we've overlooked something, so if you find that your
+carefully constructed monster speech never gets printed, and this
+documentation also doesn't help you solve the problem, you might want
+to post a bug report on Dungeon Crawl's SourceForge site [1].
+
+The exception to the above is when the monster goes away due to dying, being
+banished, or a summoned monster being abjured or having it's time run out. In
+that case the monster always speaks if the player can see the grid the monster
+is on (assuming that there's a speech entry defined for that occasion, of
+course).
+
+B. A simple example
+====================
+
+If you have a look at some of the speech files, you'll see that all
+entries have basically the same structure: a key, followed by one or
+more values.
+Here is an example.
+
+ %%%%
+ # Friendly imps are very common so they speak very rarely
+ friendly '5'
+
+ w:1
+ @The_monster@ laughs.
+
+ w:1
+ @_friendly_imp_@
+
+ __NONE
+ %%%%
+
+Let's look at this entry's components in more detail.
+
+ %%%%
+
+Four percentage signs mark beginning and end of a database entry. If
+you forget to place these, you will get buggy monster speech.
+
+ # Friendly imps are very common so they speak very rarely
+
+A '#' sign at the beginning of a line causes it to be ignored; these
+are comment lines.
+
+ friendly '5'
+
+The first non-comment, non-blank line is interpreted as the key of an
+entry. Many keys are hardcoded, but there's place for user defined
+ones as well. More on that later, though.
+In this case, the key is "friendly '5'".
+
+'5' refers to the monster glyph, so the speech will not be entirely
+restricted to imps, though they are by far the most common type of
+minor demons.
+
+ w:1
+ @The_monster@ laughs.
+
+The rest of the entry consists of messages, separated by blank
+lines. This is one of them. Each may be prefixed with an optional
+weight ("w:1"). A message will be chosen with a probability of its
+weight out of the sum of weights for its entry. Weight defaults to 10
+if not specified. In this example, this particular message will be
+selected 1 time out of 12.
+
+ @The_monster@ laughs.
+
+This is the message that will be printed. The '@' markers indicate
+variables that will be substituted before printing. This particular
+variable "@The_monster@" is treated specially by the game; the
+substitution will change based on the monster giving the speech. See
+below for more details.
+
+ w:1
+ @_friendly_imp_@
+
+This is another case of a substitution. Here, "_friendly_imp_" is an
+entry in speak.txt. A random line from that entry will be substituted.
+
+ __NONE
+
+This is a special command; it prints no message. See below for more
+details on special commands.
+
+
+C. Key lookup in detail
+========================
+
+Key lookup is always case-insensitive. The game will make many
+different attempts when trying to find monster speech, all of which
+are explained in detail below. You'll find some examples at the end of
+this section.
+
+First, a monster may have one or more of a list of attributes that
+might influence its speech. We will henceforth refer to these
+attributes as prefixes.
+
+"friendly" is one of a couple of allowed prefixes, distinguishing the
+speech from "hostile" or "neutral". All prefixes are optional and
+tested in the following order:
+
+ default <attitude> fleeing silenced confused [related] <player god>
+
+where <attitude> can be any of friendly, neutral or hostile. Note that
+the game generally treats neutral monsters like hostiles since they
+still pose a danger to players.
+
+The prefix "related" is added if the player and the monster share the
+same genus, e.g. if you're playing a Sludge Elf, and the monster in
+question is a deep elf blademaster, you both are elves and the monster
+speech may reflect that. It's currently only used for friendly
+humanoids who will now sometimes mention that you're family, if you
+are. Stupid monsters, i.e. animals, will judge your relatedness status
+according to your transformed looks while smart monsters will see
+through that magic, so that e.g. vampires will recognise a vampire in
+bat form as one of their own but a giant bat would think the player
+really is a bat.
+
+The <player god> prefix is constructed according to the religious
+belief of the character. If the monster in question is a member of the
+orc species and the character worships Beogh, the prefix "beogh" gets
+added to the list, though not for charmed orcs who will simply use the
+generic friendly statements instead of the orcish followers' cheers.
+If you worship one of the good gods instead (Zin, the Shining One, or
+Elyvilon), the prefix "good god" is used. Conversely, worshippers of
+one of the evil gods (Yredelemnul, Makhleb, Kikubaaqudgha, Lugonu, or
+Beogh) will use the prefix "evil god".
+
+This allows fine-grained handling of monsters depending on your
+character's religion status, e.g. orcs will use special speech for
+Beogh worshippers, and neutral holy beings (Angel and Daeva) may
+shout messages of encouragement to followers of the good gods, while
+demons will attempt to slander the good gods.
+
+Once the entire set of prefixes has been determined, we only need
+to add the monster name and start the database search.
+
+First we search for the complete prefix string in combination with the
+monster name. Then we try omitting some very specific prefixes that
+might not be so important, first skipping on "hostile", then also
+ignoring religion status, then hostile and "related", then all three
+of them, and then finally adding "silenced" to the list of ignored
+prefixes, where applicable.
+
+If all of that didn't yield any results, next we'll take the complete
+prefix list again, then, reading from left to right, combinations are
+tested, beginning at three prefixes and ending at none. At this stage
+the list of prefixes is always prepended with "default". This ensures
+that, for example, fleeing uniques won't output their normal menacing
+speech but rather the default speech defined for fleeing humanoids in
+general.
+
+In practice this means that database keys starting with "default" are
+the fallback solution if the exact look-up has failed. As such, the
+messages should be generic enough to allow for all the possibly
+skipped prefixes, or else those cases should be caught earlier, e.g.
+if you have "default friendly humanoid", you should also define
+"default friendly fleeing humanoid" and "default friendly confused
+humanoid" (and possibly both combined) even if only with "__NONE"
+(stay silent), as the general friendly messages may look odd for a
+monster such afflicted.
+
+Only keys that match a search string perfectly (ignoring case) will
+be used. Once all prefixes have been exhausted and still no match has
+been found, the database lookup will try for a more general monster
+description. There are several possible ways this is attempted, in the
+following order:
+
+1. The actual monster name.
+ Examples: "crystal golem", "default confused moth of wrath"
+2. The monster genus.
+ Examples: If "friendly ogre-mage" wasn't found, try "friendly ogre"
+ instead. Same for "dragon" if "swamp drake" was
+ unsuccessful.
+3. Then the monster glyph, with prefix "cap-" for capital letters.
+ Examples: "default 'cap-J'", "default confused 'k'"
+4. A group description (such as 'insect' or 'humanoid') defined by the
+ monster's body shape (winged, tailed etc). The definition of the
+ latter is entirely hardcoded, though.
+ Examples: "default winged insect", "default confused humanoid"
+
+If you are playing with tiles, you may not know the monster glyphs,
+but internally the monsters are still treated the same, and even under
+tiles, the glyph keys used for step 3 are entirely valid. In case you
+need to know the monster glyphs for your speech definitions you'll
+find a list of monster glyphs at the end of this file. Also, for many
+monsters you can find out their glyph in-game by searching the
+database ('?/') and entering a vague enough monster name. For example,
+entering "drac" will tell you that all draconians use the symbol 'd'.
+
+Note that changing monster glyphs using the mon_glyph option may also
+affect speech of this kind.
+
+For the last round (shape comparison, e.g. "winged humanoid")
+occasionally an additional intelligence estimate ("stupid", "smart")
+is prefixed to the search string, depending on the monster type, e.g.
+a "stupid humanoid" may still be smarter than a "smart arachnid".
+
+Here's a list of allowed monster shapes that should hopefully be
+self-explanatory:
+
+ humanoid, winged humanoid (angels), tailed humanoid (draconians),
+ winged tailed humanoid (gargoyles), centaur, naga, quadruped,
+ tailless quadruped (frogs), winged quadruped (hippogriff), bat,
+ snake (also eels and worms), fish, insect, winged insect, arachnid,
+ centipede, snail, plant, fungus, orb (eyes), and blob (jellies).
+
+If no matching keys are found after all of these rounds, the monster
+definitely stays silent.
+
+
+Examples
+--------
+
+Example 1:
+ The monster we want to make "speak" is a "confused killer bee".
+
+ However, such an entry cannot be found in the database, so the game
+ tries first for "default confused killer bee", then "default killer
+ bee", neither of which yields any results.
+ The monster genus is also plain "killer bee", so that doesn't help
+ us any. For the next round we try again with "confused 'k'", which,
+ by itself, also can't be found in the database, but once the prefix
+ comparison tries it together with "default", we have a match:
+
+%%%%
+default confused 'k'
+
+SOUND:@The_monster@ buzzes around in tight circles.
+%%%%
+
+Example 2:
+ This time, we're interested in "friendly fleeing related beogh orc
+ wizard".
+
+ This obviously made up example also has no direct equivalent in the
+ database, so first we try to remove the less important prefixes, in
+ this case "related" and "beogh". Unfortunately, none of "friendly
+ fleeing related orc wizard", "friendly fleeing beogh orc wizard", or
+ "friendly fleeing orc wizard" has any corresponding entry in the
+ database, so that we now check for "default" in combination with,
+ one after another, all combinations of three or less prefixes.
+
+ Three prefixes: "default friendly fleeing related orc wizard",
+ "default friendly fleeing beogh orc wizard", "default friendly
+ related beogh orc wizard", "default fleeing related beogh orc
+ wizard".
+
+ Two prefixes: "default friendly fleeing orc wizard", "default
+ friendly related orc wizard", "default friendly beogh orc wizard",
+ "default fleeing related orc wizard", "default fleeing beogh orc
+ wizard", "default related beogh orc wizard".
+
+ One prefix: "default friendly orc wizard", "default fleeing orc
+ wizard", "default related orc wizard", "default beogh orc wizard".
+
+ No prefix: "default orc wizard".
+
+ Sadly, none of these is successful. The genus of orc wizards is
+ "orc", so we retry the above using "orc" instead of "orc wizard".
+ The same is repeated for "friendly fleeing beogh 'o'", and we still
+ haven't found anything.
+
+ This is starting to get ridiculous, so it's time for desperate
+ measures:
+
+ With the help of some rather complicated functions the game works
+ out that orcs can be described as humanoids of average intelligence.
+ Thus, in a final attempt of making this orc wizard speak, we search
+ the database for "friendly fleeing related beogh humanoid",
+ something that, not surprisingly (since Beogh and humanoid don't go
+ well together), doesn't exist. Annoyingly enough, neither do the
+ variants "friendly fleeing related humanoid", "friendly fleeing
+ beogh humanoid" or even "friendly fleeing humanoid".
+
+ Still, we haven't yet tried the prefix combinations: "default
+ friendly fleeing related humanoid" is still unsuccessful, as
+ are "default friendly fleeing beogh humanoid", "default friendly
+ related beogh humanoid", and "default fleeing related beogh
+ humanoid", but with "default friendly fleeing humanoid" we finally
+ strike gold:
+
+%%%%
+default friendly fleeing humanoid
+
+w:30
+VISUAL:@The_monster@ tries to hide somewhere.
+
+@The_monster@ @shouts@, "WAIT FOR ME, @player_name@! Could you help me?"
+
+...
+
+ We'll leave it at that, even though the database code still has work
+ to do, namely add up the weights of all the entries (and there are
+ several more), and randomly choose one of them.
+
+
+Weapon speech
+-------------
+For obvious reasons, weapon noises get by without any such prefixes,
+and the only hardcoded keywords are "noisy weapon" for weapons with
+the noises property, and "singing sword" for (who'd have guessed?) the
+Singing Sword.
+
+Death speech
+------------
+You can define messages for the monster to give for when it goes away in three
+different manners:
+
+* If it really died, then the game will look up a speech entry with the
+ same keys as usual, but with " killed" appended to all the keys.
+
+* If it was banished, then the game will append " banished" to all the
+ lookup keys.
+
+* If the monster was summoned and rather than being killed was abjured or
+ ran out of time, then the game will append " unsummoned" to all of the
+ lookup keys.
+
+The game will always do a lookup in these circumstances if the player can see
+the square the monster is on, so if you only want a death message to be given
+occasionally then make one of the messages "__NONE" and give it a high weight.
+
+Of course, if no keys with the given suffix are in the database then the
+monster will say nothing in that circumstance.
+
+Special monster speech
+----------------------
+Rarely, monster speech will also rely on hard-coded keys. If such a hard-coded
+key is changed or removed, the speech in question will simply not be printed.
+This may look odd in the game, but will have no other effect. Sometimes,
+default messages will be output instead.
+
+God speech
+----------
+The keys used to search for god speech are entirely hard-coded, though
+some local synonyms have been defined as well. Hopefully, the comments
+will explain what the different speech messages are used for.
+
+
+D. Values in detail
+====================
+
+Spacing
+-------
+
+There have to be blank lines between the different messages. If
+messages are placed directly one after another they will be printed as
+a block. This can be useful, e.g. for outputting first a "spell" and
+then its (fake) result.
+
+Note that this does not work for weapon noises. Here only the first
+part of a paragraph before a carriage return is parsed.
+
+The message entries themselves can be longer than a line, though Crawl
+will simply truncate it should it exceed the screen width (assuming 80
+columns or less). The actual message length will usually differ from
+the one defining an entry as parameters can be stripped from the entry
+or replaced by other values, as explained in the following section.
+
+Variables
+---------
+
+Values can contain variable references, which look like text
+surrounded by @@. These variables may be defined by entries in
+shout.txt for the shouting database, or monspeak.txt or one of the
+other files for the speech database, in which case they are replaced
+with a random value from the entry in question; or they may have
+hardcoded expansions defined by the game.
+
+Note that variable replacement is recursive, so be careful to avoid
+infinite loops. Though the game will abort after a number of
+replacement attempts, it will still look ugly in the monster speech.
+
+The following variables are hardcoded:
+
+@monster@ : Plain monster name, e.g. "rat" or "Sigmund"
+@a_monster@ : Indefinite article plus monster name,
+ or only the name if it is unique ("Sigmund").
+@the_monster@ : Definite article plus monster name ("the rat"),
+ or a possessive if it is friendly ("your rat"),
+ or only the name if it is unique ("Sigmund").
+@something@ : Like @monster@, with monster name replaced by
+ "something" if the monster is invisible and the
+ player cannot see invisible.
+@a_something@ : similar
+@the_something@ : similar
+@player_name@ : Player name.
+@player_species@: Player base species, with Draconian rather than the
+ actual subtype.
+@player_genus@ : Player genus, i.e. "Elf" rather than the exact type,
+ or "Ogre" instead of "Ogre-Mage".
+@player_genus_plural@ : pluralised genus form.
+@player_god@ : Player's god name, or "you" if non-religious.
+@Player_god@ : Player's god name, or "You" if non-religious.
+@god_is@ : replaced with "<god name> is" or "you are", if
+ non-religious.
+@God_is@ : replaced with "<god name> is" or "You are", if
+ non-religious.
+@surface@ : Whatever the monster is standing on.
+@feature@ : The monster's square's feature description.
+@pronoun@ : it, she, he, as appropriate
+@possessive@ : its, her, his, as appropriate
+@imp_taunt@ : imp type insults (see insult.txt)
+@demon_taunt@ : demon type insults (see insult.txt)
+@says@ : synonym of "say" that fits monsters' (hardcoded)
+ speech pattern and noise level.
+
+Capitalized forms (@Monster@, @A_something@, @Possessive@, @Pronoun@)
+are expanded with capitalized text.
+
+Also, in insult.txt you'll find the hardcoded variables
+@species_insult_adj1@, @species_insult_adj2@, and
+@species_insult_noun@. These are sometimes used in the construction of
+imps' or demons' generic insults, and allow for species-dependent
+handling. If the parser encounters such a variable, it will search the
+database for the corresponding specific entry, i.e. "insult <genus>
+adj1/adj2/noun" where <genus> is replaced with the actual genus name,
+that is "draconian", "elf" or "dwarf" instead of the more specific
+species name, "ogre" for "ogre-mage", or the actual species name in all
+other cases.
+
+If this specific search doesn't yield any results, i.e., such an
+entry hasn't been defined for the species in question, the general
+replacements are used instead.
+
+Weapon noises are handled differently in that most of the above
+replacements don't hold. Instead you can use @The_weapon@,
+@the_weapon@, @Your_weapon@, @your_weapon@ and @weapon@ which will get
+replaced by "The (weapon name)", "the (weapon name)", "Your (weapon
+name)", "your (weapon name)", and the plain weapon name,
+respectively.
+@player_name@ is expanded as above, as is @player_god@, though for
+atheists it returns "atheism".
+
+Note that the Singing Sword, being unique, cannot be referred to by
+the possessive variants, so they will be replaced with the appropriate
+definite article ones.
+
+Examples of pre-defined variables in the database include
+_high_priest_, _mercenary_guard_, _wizard_, _hostile_adventurer_,
+_friendly_imp_, _hostile_imp_, and _tormentor_, but more get added all
+the time. There are also a few synonyms defined at the beginning of
+monspeak.txt such as for @ATTACK@, @pointless@, @shouts@, @wails@, and
+others.
+
+Weapon noises also use a number of synonyms which are defined at the
+end of wpnnoise.txt.
+
+The best way to learn about how variables and other concepts can be
+used is probably to see how it has been done for existing messages.
+
+Speaking to the player vs to another monster
+--------------------------------------------
+
+If a message contains a variable starting with "@player", then that message
+will only be used by friendly/good-neutral monsters, or by hostile/neutral
+monsters which have the player as their foe (and it will never be used in the
+arena). Additionally, any message containing a line starting with "You" or
+ending in a bare "you." (but not a quoted "you.") will also be considered
+player centric. You can also make a message player-centric by appending
+"@player_only@" to the end of any of the lines in the message, which will be
+removed before displaying it to the player.
+
+If you want a message to be able to apply to a foe which is another monster in
+*addition* to the player, you can replace "@player" with "@foe" to have the
+variable filled out with a string appropriate for the foe being either the
+player or another monster. If "@foe_name@" is present then the message will
+only be used on monster foes which are named, and if "@foe_god@" or "@god_is@"
+is present then it will only be used on priestly monsters or god gift monsters.
+"@Foe@" or "@foe@" will be replaced with "You" or "you" if directed at the
+player, or if directed at another monster be the same as "@The_monster@" or
+"@the_monster@", but with the foe monster's name rather than the speaking
+monster's name. "@foe_possessive@" will be replaced with "your" if directed
+at the player, or expanded like "@foe@'s" if directed at a monster.
+
+If you want to indicate which monster a message is directed at, you can put in
+"@to_foe@" or "@at_foe@" to fill in the foe name when the message is directed
+at a monster; when directed at the player the variable will be removed. For
+example, with the message:
+
+ @The_monster@ says @to_foe@, "Defend yourself!"
+
+If directed at an orc will expand to:
+
+ @The_monster@ says to the orc, "Defend yourself!"
+
+but if directed at the player will expand to:
+
+ @The_monster@ says, "Defend yourself!"
+
+You can do something similar with "@foe,@" for asking questions and the like.
+For example:
+
+ @The_monster@ asks @foe,@ "Who are you?"
+
+when directed at an orc will expand to:
+
+ @The_monster@ asks the orc, "Who are you?"
+
+and when directed at the player will expand to:
+
+ @The_monster@ asks, "Who are you?"
+
+Channels
+--------
+
+An optional channel name at the beginning of a string causes messages
+to be sent to that channel. For example:
+
+ SPELL:@The_monster@ casts a spell.
+ WARN:Your equipment suddenly seems to weigh more.
+
+Spacing after the channel parameter won't get stripped, so it's a good
+idea to double check that the speech message directly follows the
+colon.
+
+Here are the defined channels:
+
+ TALK : MSGCH_TALK (Default value.)
+ DANGER : MSGCH_DANGER
+ ENCHANT : MSGCH_MONSTER_ENCHANT
+ PLAIN : MSGCH_PLAIN
+ SOUND : MSGCH_SOUND
+ SPELL : MSGCH_MONSTER_SPELL
+ VISUAL : MSGCH_TALK_VISUAL
+ WARN : MSGCH_WARN
+
+The channels have been assigned different colours and are sometimes
+treated differently, e.g. any of MSGCH_TALK, MSGCH_SOUND and
+MSGCH_TALK_VISUAL will never interrupt resting or travel unless
+specifically added in the options file.
+
+Note that MSGCH_SOUND and MSGCH_TALK get filtered out when you are
+silenced. For similar reasons monster speech of channel SPELL is muted
+under silence, along with ENCHANT and WARN, both of which currently
+only occur in combination with SPELL. To allow for silent spells along
+with fake warnings and enchantments, you can combine these with VISUAL
+and enforce output even when silenced.
+
+ VISUAL ENCHANT : MSGCH_MONSTER_ENCHANT
+ VISUAL SPELL : MSGCH_MONSTER_SPELL
+ VISUAL WARN : MSGCH_WARN
+
+Note, though, that these only will take effect if a VISUAL message
+just happens to be chosen. As stated above, the database search
+doesn't really care whether a monster is supposed to be silent, so it
+may pick any noisy monster speech, but the message output will care
+and refuse to print such nonsense, so that in this case the monster
+will actually stay silent after all.
+
+To summarize, chances of silent "speech" are overall lower (as is
+intended) but only VISUAL messages even have a chance to be printed
+under these circumstances.
+
+As explained earlier, "silenced" is one of the prefixes that are
+regarded as "less important" and can be ignored in the exact string
+search. So that both specially defined silenced messages for a
+particular monster and its normal VISUAL messages can sometimes take
+effect, chances for actually skipping on silenced in the direct string
+matching are 50:50.
+
+Example 3:
+ The player has just cast Silence when a Killer Klown wanders into
+ view. (Uh oh!) This "silenced Killer Klown" is now attempting to say
+ something. The exact look-up is unsuccessful, but now there's a 50%
+ chance of skipping on the "silenced" prefix. If this route is chosen
+ we may get results such as
+
+%%%%
+Killer Klown
+
+@The_monster@ giggles crazily.
+
+@The_monster@ laughs merrily.
+
+...
+
+ none of which, if chosen, would actually be printed, but luckily the
+ "Killer Klown" entry also contains VISUAL statements like the
+ following:
+
+...
+
+VISUAL:@The_monster@ beckons to you.
+
+VISUAL:@The_monster@ does a flip.
+
+...
+
+ If one of these is chosen, we get a non-verbal "speech" statement of
+ this silenced monster.
+
+ However, what happens if the other 50% take effect and we will *not*
+ ignore the "silenced" prefix? In this case, we'll simply continue
+ like in the earlier examples above, get no results for either of
+ "default silenced Killer Klown" or "default Killer Klown", and try
+ the genus next: human, which cannot be found in the database,
+ silenced or no. Neither will we find anything for the monster glyph
+ '@'. Now all that remains is to check the monster shape, which is
+ "humanoid" again. "silenced humanoid" won't get us any results, nor
+ will simply "humanoid", but "default silenced humanoid" has some
+ statements defined.
+
+%%%%
+default silenced humanoid
+
+w:30
+VISUAL:@The_monster@ says something but you don't hear anything.
+
+w:30
+VISUAL:@The_monster@ gestures.
+
+...
+
+ All of the statements in these predefined "silenced" entries have to
+ be of the type VISUAL; otherwise they'll never get printed.
+
+
+For shouts the default channel is also MSGCH_TALK, which is
+automatically changed to MSGCH_TALK_VISUAL for monsters that can't
+speak (animals, usually), and manually set to MSGCH_SOUND for all
+those variants of "You hear a shout!"
+
+Monster spells and enchantments will only interrupt resting/running
+if done by a non-friendly creature, and, as stated above, messages
+passed through the TALK or SOUND channels never will.
+
+For weapon noises only a subset of the above is relevant, as anything
+including VISUAL and the channel keys SPELL and ENCHANT is considered
+invalid and will trigger a default message instead. Again, the default
+channel is MSGCH_TALK.
+
+Special commands and variables
+------------------------------
+
+Message entries may also be one of several special commands. These
+aren't variables, so they aren't surrounded by @@. Accordingly, they
+are not expanded, but rather they produce special game behaviour.
+
+ __NONE : no message
+ __NEXT : try a more general monster description
+ __MORE : enforce a "--more--" prompt
+ __YOU_RESIST : print "You resist."
+ __NOTHING_HAPPENS : print "Nothing appears to happen."
+
+Some special keys are defined in monspeak.txt and shout.txt, such as
+__RESIST_OR_NOTHING and __SHOUT. These are normal variable expansions,
+and may be used as such. They are given special-looking names because
+Crawl looks up the noises a given monster can produce and looks for
+keys that match the string, i.e. __SHOUT, __BARK and so on.
+
+
+E. Testing your changes
+========================
+
+Get a version of Stone Soup that contains WIZARD mode. You can check
+whether this is the case by reading the in-game version information
+('?v'). If Wizard mode is not listed among the included features
+(likely, since WIZARD builds are generally not distributed), you will
+have to compile the game for yourself.
+
+To build Crawl yourself, download the source code from the Crawl
+homepage [1] and read the "INSTALL" file in the main directory for
+instructions. Should you still have any questions after reading the
+documentation and checking the archives of the Crawl newsgroup [2],
+ask away!
+
+If you have WIZARD mode compiled in, you can access special wizard
+commands by pressing '&'. First answer "yes" to the safety question
+and then you can test to your heart's content. Pressing '&' followed
+by a number of other keys will execute wizard mode commands that are
+all listed in the wizard help menu (press '&?').
+
+In particular, you can create a monster with '&M', and enforce
+behaviour on a monster by examining it (with 'x', as usual). In wizard
+mode, examining monsters offers several new sub-commands such as 'F'
+(make monster friendly/neutral/hostile) and 's' (make monster shout).
+These last two are of particular interest to monster speech designers.
+
+Also, the Singing Sword and other hardcoded artefacts can be created
+with '&o'. To create all artefacts at the same time, use '&|'. The
+Elemental Staff and the spear of Voo-Doo are examples of noisy weapons.
+
+You can also temporarily increase the likelihood of a given message by
+adding a high weight value before it, e.g. w:5000, or equally
+temporarily push it into another channel (e.g. MSGCH_WARN) to make it
+more noticeable.
+
+If you successfully got Crawl compiled, you can easily enable more
+detailed debug information. All you need to do is add
+
+ #define DEBUG_MONSPEAK
+
+somewhere in AppHdr.h, for example at the beginning of the section
+entitled "Debugging Defines", and then compile the game anew, first
+using "make clean", then "make wizard".
+If you play with DEBUG_MONSPEAK compiled in, whenever the game is
+searching the monspeak database you'll get extensive information on
+all keys and prefixes tried. Once you're done testing don't forget to
+remove (or comment out) the DEBUG_MONSPEAK setting as trying to
+actually play that way would sure be annoying.
+
+
+F. Publishing your changes
+===========================
+
+If you feel that your additions really add something to the game and
+would like to make them available to the general public, you can post
+them (in the form of a diff file, or in plain text) as a feature
+request on sourceforge.net [1] or in the newsgroup [2].
+
+
+.. [1] http://crawl-ref.sourceforge.net
+ http://sourceforge.net/projects/crawl-ref
+
+.. [2] rec.games.roguelike.misc
+ Since this newsgroup is being shared with a number of other
+ roguelike games, it is generally considered polite to flag
+ subjects of posts pertaining only to Crawl with "-crawl-" or
+ a similar marker.
+
+
+APPENDIX: List of monster glyphs
+================================
+
+Lowercase letters:
+------------------
+a giant cockroach, giant ant, soldier ant
+b giant bat, butterfly
+c centaur (warrior), yaktaur (captain)
+d all draconians
+e all elves
+f fungus, wandering mushroom
+g goblin, hobgoblin, gnoll, boggart
+h all hounds (jackal, hound, wolf, warg, war dog, hell hound)
+ and hogs (hog, hell-hog)
+j snails: elephant slug, giant slug, giant snail
+k winged insects: killer bee, bumblebee
+l lizards (giant newt/gecko/iguana/lizard, gila monster, komodo
+ dragon),
+ and drakes (swamp drake, firedrake, death drake, lindwurm)
+n ghouls: necrophage, ghoul, rotting hulk
+o all orcs
+p all ghosts, phantom, and insubstantial wisp
+r all rodents (rats of all colours, and quokka)
+s arachnides (giant mite, giant centipede, scorpion, wolf spider,
+ redback)
+t minotaur
+u (very) ugly thing
+v all vortices, and air elemental
+w all worms and larvae
+x unseen horror, small abomination
+y wasps, giant mosquito, giant blowfly, moth of wrath
+z small zombie/skeleton/simulacrum, skeletal warrior, flying skull,
+ curse skull, and curse toe
+
+Uppercase letters:
+------------------
+A Angel, Daeva
+B all beetles
+C all giants, ettin, cyclops, and titan
+D all dragons, wyvern, and hydra
+E efreet
+F all frogs
+G all eyes, giant spore, and giant orange brain
+H hippogriff, manticore, griffon, and sphinx
+I ice beast
+J all jellies, oozes, and slime creature, pulsating lump,
+ giant amoeba, jellyfish, and acid blob
+K all kobolds
+L all liches
+M all mummies
+N all naga
+O all ogres
+P all plants
+Q queen bee, and queen ant
+R (fake) rakshasa
+S all snakes, and salamander
+T all trolls
+U all bears
+V all vampires
+W all wraiths, wight, and spectral warrior/thing
+X abomination, tentacled monstrosity, and Orb Guardian
+Y all yaks, and sheep
+Z large zombie/skeleton/simulacrum
+
+Numbers:
+--------
+1 all Fiends, Executioner, Blue/Green Death, Balrug, Cacodemon
+2 sun demon, reaper, soul eater, ice devil, and Lorocyproca
+3 hellion, tormentor, blue/iron devil, neqoxec, orange/shadow demon,
+ hellwing, ynoxinul, and demonic crawler
+4 red/rotting/hairy devil, beast, and smoke demon
+5 all imps, and other minor demons (quasit, lemure, ufetubus, manes,
+ midge)
+8 all golems, and living statues
+9 all gargoyles
+
+Other symbols:
+--------------
+# earth elemental, fire elemental, and vapour
+{ water elemental
+; all fish, and electric eel
+@ all humans, (glowing) shapeshifter, and Killer Klown
+& all pandemonium lords
+* ball lightning, and orb of fire
+% death cob
+ shadow
+
+For uniques, see their monster description for their subtype.