The Mogaminator
The Mogaminator is a rules-based system for automatic object handling,
which you can activate or modify with the _ command. With this system,
you can decide which objects to pick up, which to destroy, which to
automatically identify, and which to display as wanted in the object
list. You can automatically inscribe objects to suit your tastes, and
even enter conditional statements to handle the preferences of
different races and classes. Or you can just keep the default
Mogaminator rules, which already do all of the above!
This document describes this system in tutorial fashion, assuming you
know nothing about it. Detailed reference material will appear towards
the bottom of this document (see [a] if you really cannot wait!).
The system is named after its original author, Hengband developer
Mogami.
Review of Object Knowledge
There is no doubt about it: the game generates lots and lots of
objects. Some are valuable, some are not, and some are only valuable in
specific situations... The Mogaminator will help you untangle that
mountain of loot.
First, a really quick review of what is explained in detail at [b].
When you find an object, it will generally be unidentified, but you
might have (or soon receive) a rough sense of the object's quality,
called object feeling or pseudo-ID. If the object looks promising, you
probably want to identify it to reveal the basics and maybe *Identify*
it to reveal special properties.
So your knowledge of an object is in one of the following states:
[1] Unsensed
[2] Sensed (pseudo-identified)
[3] Identified
[4] *Identified*
For mushrooms, potions and scrolls, things are a little different;
these objects come in flavors, and once you have learned the flavor,
you will immediately recognize all future instances of that object.
Indeed, all instances of the object are exactly alike, so the
identification game is simply to discover and know the first instance
of the object, and then decide, via your pick-up and destroy
preferences, what to do with future instances of this type of object.
Managing Objects
There are three ways to manage objects: manually, by using the Easy
Destroyer ([c] below), and by using the Mogaminator. The Mogaminator is
much more powerful than the Easy Destroyer, which simply destroys
items, usually junk. The Mogaminator and the Easy Destroyer should only
be used side-by-side if you have turned the always_pickup option on.
What is the Mogaminator? Basically, it is a rules-based system for
taking a given action each time you encounter a certain type of object.
The default action is pick up, and this action is used whenever you
fail to specify an alternative action; but the Mogaminator can also
destroy junk for you and identify and inscribe objects automatically.
Let's discuss the basics.
Basic Usage
The Mogaminator is activated by pressing _, which also brings up an
in-game editor where you can manage your preferences. It might look
like this:
(^Q:Quit, ^W:Save&Quit, ESC:Menu, Other:Input text) (0,0)
#########################################
# Consumables
#########################################
mushroom of restoring#!E
~mushroom of hallucination
?:[EQU $RACE Snotling Doppelganger]
~mushroom
?:1
?:[LEQ $LEVEL 35]
potions:resist heat and cold#!kq
?:1
potions:resistance#!kq
potions:stone skin#!k
potions:heroism
potions:speed#!kq
potions:giant strength#!k
potions:enlightenment
potions:of strength#!k
-------------------------------------------------------------------------------
This line is a comment.
If you are new, you probably want to run from this complexity as fast
as you can. Notice the top line of the screen where it tells you how to
get out: ^Q (and you can also exit through the ESC menu). The desire to
exit immediately is understandable, and in fact not a problem: simply
pressing _ turned the Mogaminator on and initialized it with default
preferences, so it should do a good job without any further messing.
(If you are very lazy, you can stop reading here and just happily play
away with the default preferences for the rest of the game!)
So What Happened?
With the Mogaminator now on, you will find much of the junk you
encounter being destroyed. For example, all those corpses and skeletons
you leave behind as you hack and slash your way through the dungeon...
except for wanted corpses, which are getting automatically picked up!
That's a good start; but you might still run into objects you consider
useless. For example, suppose you bought a lantern at the General
Store; now you don't really care about torches anymore. Use the k
command (or ^D for the Roguelike keyset) and you get a prompt like:
Really destroy Wooden Torches {unidentified}? [y/n/Auto]
Notice the Auto option. Choose that, and you get a message that the
object is destroyed, but the fact that you don't like torches is
remembered by the system. The next time your character moves on top of
one, it will be destroyed automatically.
That's one simple way to use the Mogaminator: keep registering stuff
for automatic destruction as you encounter it, and the loot mountain
becomes easier to manage; but as we'll see later, auto-pickup is even
better than auto-destruction.
Oops, I'm Auto-Destroying Rings of Speed
Ouch! Well, don't panic. You can fix the problem easily; but doing so
will require you to go back to the preference file editor. Press _ and
then press END to move to the end of the document. This is where the
game keeps track of any objects that you automatically registered for
destruction. Your screen might look something like:
(^Q:Quit, ^W:Save&Quit, ESC:Menu, Other:Input text) * (0,268)
?:[EQU $CLASS Tourist]
~photograph
?:1
~special items
!worthless items
#!unusable items
?:$AUTOREGISTER
# *Warning!* The lines below will be deleted later.
# Keep them by cut & paste if you need them for future characters.
(!nameless lights:^wooden torch$
-------------------------------------------------------------------------------
Destroy all light sources whose name begins with "wooden torch$", and which ar
neither ego-item nor artifact. Do not display as wanted. This line will be
deleted later.
You cannot tell from the picture above, but I placed the cursor on the
very last line of the file; in my case, the line from when I registered
torches for destruction. Notice that at the very bottom of the screen,
the game tells you exactly what the given rule means; if you are
curious, you can move the cursor around the default preference file and
actually learn quite a bit about how the system works. If you wish to
simply remove this (or any other) rule, just delete the corresponding
line and then exit with ^W to save and apply your changes.
What About Stuff I Want?
What you don't want is only half the story; some objects you really
like. The two work nicely together, since interesting objects will
appear at the top of the ] object list. This allows you to easily track
the interesting stuff even if the junk has not been destroyed!
Suppose you want potions of Cure Critical Wounds (this is a random but
reasonable example of an item not set to be picked up by default).
Wouldn't it be nice if these potions were automatically picked up, as
well as displayed near the top of the object list? This is accomplished
by adding the following line to the top of the preferences file:
(^Q:Quit, ^W:Save&Quit, ESC:Menu, Other:Input text) * (0,0)
cure critical wounds
#########################################
# Consumables
#########################################
mushroom of restoring#!E
~mushroom of hallucination
?:[EQU $RACE Snotling Doppelganger]
~mushroom
?:1
-------------------------------------------------------------------------------
Pick up all items which have "cure critical wounds" as part of their name.
Display these items as wanted in object list.
I colored the new line yellow in the screenshot to make it stand out.
Pay attention to the bottom of the screen: does it sound like it will
work? The reason I had to put the new line at the top is that rules are
processed in order of priority from top to bottom; so if I placed the
new rule at the bottom, it might have been overridden by an earlier
rule.
Now, let's press ] to activate the Object List - is there anything on
this level that I want?
There are 4 wanted objects: LEVEL 1
! 4 Potions of Cure Critical Wounds S 4 E 16 EXP 3
AU 747
There are 4 other objects: | !(
~ 4 Wooden Torches {unidentified} N 3 E 17 STR : 16
[Press ESC to exit. Press ? for help] INT : 18
>.....#+#.%% WIS : 9
%%%%.%%.#.% ##.. DEX : 18/40
%'%....# #%.... CON : 17
%%......% %%.~..% CHR : 12
#%......+% %%% %#....%%.. AC 6
%#........%%%%%%%%%#%.%% ##.......... HP 37/ 37
%.........'.'.......@..#% #%..........# SP 14/ 14
%%%......%%%%%%%%%%%#*'.###%% #%....##....*
..'.......# %.......%..#%....%%....#%
%%##......% %........%%%....##....##
%.....%# %.......'......#%.!..%%
%.#...% #.......#%%###########
%%%%#%% #.......#
Bingo! You can even automatically travel to those delicious potions by
pressing J inside the Object List. What could be easier?
To recap, adding the line "cure critical wounds" tells the Mogaminator
to pick up any object that has "cure critical wounds" as part of its
name. You don't have to type so much - "crit" might work just as well -
but the less you type, the more likely it is that your new rule will
also match other objects. For example, "cure" would match potions of
Cure Light Wounds, Cure Serious Wounds and Cure Critical Wounds, and
even Staves of Cure Wounds. Sometimes this is OK, but at other times,
it is better to type more.
Introduction to Rules and Events
So how does all this work? Basically, the preference file is an ordered
list of rules. Whenever a certain event happens (such as moving on top
of an object), the rules are scanned from top to bottom, and the first
one that matches (if any) is applied. Every rule has an action
associated with it that determines what to do if the rule applies.
Each rule is a single line in the file; but not every line is a rule.
Some lines are blank, some are comments, and some are conditionals that
tell the game when to ignore rules.
Objects are tested against rules whenever a specific event happens;
generally when the player (1) moves on top of an object, (2) gets a new
object feeling (see [d]) or (3) identifies an object (see [e]).
Rules
A rule is a single line that consists of an action to perform, a
predicate to test matches, and an optional inscription to add. Let's
discuss each of these in turn.
Actions
First of all, picking something up is the default action and is
inferred whenever you fail to specify an alternative. What are the
alternatives?
! Destroy
; Prompt to pick up
~ Leave on the floor
These are the primary actions. Pick-up is assumed if the rule does
not begin with !, ; or ~. Note that if the always_pickup option is
on, then ; and ~ will be overridden by it; and even ! is overridden
unless the leave_mogaminator option is also on.
In addition, there are the following action letters that augment the
primary action:
( Don't display this item on the M map
? Automatically identify this item
The first of these is not commonly used, since the M map item display
has been completely obsoleted by improvements to the object list. The
second option (?) is very useful, though, since it automatically
identifies the matching object. This is a great time-saver, but
requires you to carry Scrolls or Staves of Identify.
All of the action letters must be specified first in the line for the
rule, with one exception. The # letter indicates that you wish to
automatically inscribe matching objects, and it must occur at the end
of the rule, followed only by the inscription text itself. For
example, #@ad!sdk at the end of a rule will automatically inscribe
@ad!sdk to any object matching the rule. (See [f] for an explanation
of this inscription!)
Matching
We saw above that matching is by string comparison with the object
name, but you can be more specific than that if you want. To do so,
use the following keywords to construct a predicate used to test
objects. The keyword portion of the match consists of zero or more
adjectives modifying a noun that indicates the broad class of objects
which should be considered. In addition, you can specify a free form
text comparison string by adjoining : followed by text to search for.
We'll put all of this together in the examples section below.
Let's do nouns first. A complete list is presented at the end of this
document, but some common nouns to get us started include:
Items Applies to everything. This is useful for very general
rules, such as ~?unidentified items to automatically
identify, but leave on the ground, everything not yet
identified; or even items to pick everything up!
Weapons Applies to all melee weapons, but not to ranged weapons.
Shooters Applies to all missile weapons, including bows, slings and
crossbows.
Armors Applies to all forms of armor, including shields, helms and
cloaks as well as body armor.
Wands Applies to magical devices that are wands
Staves Applies to magical devices that are staves
Rods Applies to magical devices that are rods
Potions Applies to potions
Scrolls Applies to scrolls
If you are using keywords to build a match predicate, then you must
specify exactly one noun, but may use as many adjectives as you like.
The complete list of adjectives is given below at [g], but here are
some of the more common ones:
Unaware Applies to objects whose flavor has not yet been
identified.
Unidentified Applies to any objects that have not yet been
identified.
Unsensed Applies to objects that have not been identified or
pseudo-identified.
Ego Applies to all excellent objects.
Nameless Applies to all non-ego, non-artifact objects.
Wanted Applies to corpses and skeletons of wanted monsters.
These may be turned in at the Hunter's Office for a
prize.
As an example of using multiple adjectives, the phrase ?unidentified
ego weapons applies to, well, all melee weapons that are both
excellent and not yet identified. Of course this means you must have
pseudo-identified the object to know that it is an ego.
Finally, use a search string to further refine the match. If you
don't use any adjective or noun keywords, then the entire text of
your rule (starting after any action letters, and including all text
up to the # inscription character) is used as the search string. If
you are using keywords, mark the end of the keyword section with the
: separator. Examples are discussed below.
Examples
!potions:apple juice
Destroy potions of apple juice (as refreshing as they might be!).
It uses the ! action letter for destruction, the potions keyword to
apply to an entire class of objects, the : separator key, and a
text field for string matching against the object name.
?unaware items
Pick up and automatically identify unidentified flavored items
(e.g. a potion you've never seen before). Note that the pickup
action is implied since none of the other primary actions are
indicated, and even though there is a secondary action (to
auto-id). This command uses the adjective unaware to modify the
noun items. You could narrow down the applicability of this rule by
using a more specific noun, such as scrolls or potions.
wanted corpses#Wanted!kkk
Pick up wanted corpses, and automatically inscribe them with
Wanted!kkk. This inscription may make it sound like the monster was
wanted for racism, but it simply means you get prompted repeatedly
if you accidentally try to destroy the corpse. (See [h] for more on
how inscriptions work.)
?staves:destruction#@ud!sdk
Pick up and automatically identify all staves whose name contains
the string "destruction". Inscribe these objects with @ud!sdk.
Example Scenarios
After that last section, you should have complete mastery over
individual rules. Now, it is time to step up one level and apply
multiple rules to accomplish common tasks. Ready?
Scenario #1: Handling Objects
In this scenario, you would like to handle the stream of objects in
the most efficient way possible. Let's begin with the following
rules:
unsensed armors
unsensed weapons
These rules say to pick up all armor and weapons not yet sensed or
identified. That leaves out many types of objects, like potions and
scrolls, but at least weapons and armors are objects that can be
sensed. Since objects need to be in your pack to be sensed (we know
immediate floor-pseudo-ID didn't kick in because the objects matched
the unsensed adjective!), it is convenient to pick them up.
Now, let's add the following rules:
!average common weapons
!average common armors
You might not actually want this; but for now, assume your character
is advanced enough to view average common equipment as junk. These
rules will fire once pseudo-ID kicks in, destroying weapons and armor
that pseudo-ID as average. The common adjective prevents these rules
from applying to rare average items, like dragon scale mail or blades
of chaos.
So, now our character is merrily picking up all equipment and then
auto-destroying the average stuff once pseudo-id kicks in. Can we do
more? Well, try adding:
?unidentified ego items
Now, the egos are automatically being identified on pseudo-ID as
well. Pretty sweet! But maybe you get tired of some ego types after a
while, and want them registered for destruction:
!common ego cloaks:of protection
!common ego weapons:of sharpness
Now even boring excellent items are being toasted for you,
automatically, with nary a keystroke on your part; but, sometimes
swords of sharpness become dice-boosted, and might not be so boring
after all. You can protect them with
dice boosted weapons
or perhaps even
weapons more dice than 30
though that last one is an advanced maneuver.
In summary, the complete order of your rules might be:
weapons more dice than 30
?unidentified ego items
!average common weapons
!average common armors
unidentified armors
unidentified weapons
!common ego cloaks:of protection
!common ego weapons:of sharpness
New armors and weapons come down and hit rule 5 or 6 when your
character steps on them, so they get placed into your pack
automatically. Eventually pseudo-ID will kick in, revealing the
object as average, in which case it is destroyed by rule 3 or rule 4,
or as excellent, in which case it is processed by rule 2 which
auto-identifies the ego item and rescans the rules. If it is a cloak
of protection, it is destroyed by rule 7, while if it is a weapon of
sharpness, it is destroyed by rule 8 - unless it happened to be
hugely dice boosted, in which case it is protected by top-priority
rule 1. Easy, right? Now you only have {bad} and {good} and {special}
equipment to worry about...
Scenario #2: Flavored Objects
This one is easier, and I'll give the full set of rules first:
potions:healing#!kq
potions:of strength#!k
potions:of intelligence#!k
potions:of wisdom#!k
potions:of dexterity#!k
potions:of constitution#!k
potions:of charisma#!k
potions:augmentation#!k
scrolls:artifact creation#!*
...
?unaware items
collecting potions
collecting scrolls
?:$AUTOREGISTER
...
(!potions:^potion of restore charisma$
(!scrolls:^scroll of treasure detection$
... <many more junk flavors auto-registered for destruction> ...
Now, the pattern is wanted flavors on top for autopickup (and
inscription), unwanted flavors on bottom for autodestruction (these
are placed in your file automatically each time you press A while
destroying an object) and rules for collecting and unaware items in
the middle. Unaware items get automatically identified, at which
point one of the pick-up or destroy rules might get a chance to act.
As for the collecting rules, those fire if you have another object of
the same flavor in your pack. Perhaps you are carrying potions of
Cure Critical Wounds, but don't have a rule specifically for this
flavor; in this case, the collecting rule will pick up other potions
of Cure Critical Wounds for you.
Scenario #3: Spellbooks
OK, this is the last one. See if you can figure this one out first:
first realm's fourth spellbooks#@md!sdk
first realm's third spellbooks#@mc!sdk
~first realm's second spellbooks#@mb!k
~first realm's first spellbooks#@ma!k
second realm's fourth spellbooks#@mh!sdk
second realm's third spellbooks#@mg!sdk
~second realm's second spellbooks#@mf!k
~second realm's first spellbooks#@me!k
!first spellbooks
!second spellbooks
!third spellbooks:major arcana
!fourth spellbooks:manual of mastery
third spellbooks
fourth spellbooks
Did you figure it out? This scenario picks up high level spellbooks
from your character's magic realms, leaves low level spellbooks from
your realms, destroys all other low level spellbooks, destroys all
arcane magic spellbooks, but picks up high level spellbooks from
other realms (presumably to sell for gold). Spellbooks from your
realms are auto-inscribed to keep book labels consistent. Here, as
elsewhere, order is very important: rules for the character's spell
realms must come before the general rules to destroy low level
spellbooks. (There is an unreadable adjective that would have made
processing safer and less order-dependent here.)
Which Rule is Being Used?
If you are ever unsure about which rule is being applied in a given
situation, turn on the destroy_debug option (see [i]). With this option
you can use the Inspect command for more information. For example:
a Thieves' Guide [Burglar's Handbook]
Autopick: (!unreadable first spellbooks
I may or may not like this behavior, and if I don't, now I know which
line to change!
In addition, with debugging turned on, the rules used are printed in
the message log as actions are taken, so you can see exactly why
objects are being destroyed, picked up, left on the ground or
auto-identified. For example:
You have 26 charges remaining. (AutoID:~?unidentified rods) You see a
Rod: Frost Ball (1/3 charges). (Destroy:(!rods:frost ball$)
Auto-destroying.
Since this is message spam, you probably don't want to leave the
destroy_debug option permanently on.
Conditionals
This is an advanced topic, but the underlying principles are simple.
What you consider useful or junk may depend on your race, class,
character level or other similar details; and conditionals help you
apply rules only when they are appropriate. Each conditional statement
evaluates as either TRUE (1) or FALSE (0); if a conditional that
evaluates as FALSE is encountered, all rules that follow it are ignored
until the next TRUE conditional is reached.
Conditional lines always begin with the characters ?:, followed by a
(rather cryptic looking) expression that the game will evaluate.
Let's look at an example. Remember Scenario #1 above when we added
lines to destroy average equipment? I said you might not actually want
them, unless your character was advanced enough. Suppose you consider
level 20 advanced enough?
?:[GEQ $LEVEL 20]
!average common weapons
!average common armors
?:1
Notice there are two lines colored in violet, each beginning with ?:.
These are the conditionals; the first includes a funny-looking
expression while the second one is much simpler, just ?:1.
The first conditional might or might not evaluate as TRUE; it depends
on the value of $LEVEL (which you probably guessed is your current
character level) and whether or not it is >= 20. GEQ stands for greater
than or equal to, and 20 is just a number. The order ([GEQ $LEVEL 20]
instead of, say, $LEVEL GEQ 20 or even $LEVEL >= 20) is because GEQ is
this expression's function, and $LEVEL and 20 are arguments for it.
In contrast, ?:1 is easy. It evaluates as... well, 1! And as we already
noted, 1 means TRUE; so ?:1 flips the "ignore rules" switch back off,
and effectively marks the end of the area to which the previous
conditional applies.
Here's another example:
?:[OR [EQU $CLASS Mage High-Mage Sorcerer] [EQU $RACE Beholder Lich] ]
wizardstaff
?:1
That's a more complicated expression, but you can probably figure it
out: it's TRUE if your class is either a Mage, High-Mage or a Sorcerer;
or if your race is either a Beholder or a Lich.
So, we have expressions composed of functions (like GEQ and OR),
variables (like $RACE and $LEVEL), literals (like Mage and Sorcerer)
and brackets. What are the functions and variables we can use?
Function Explanation
IOR Inclusive Or: [IOR a b c ...] is TRUE if the value of any
subexpression a, b, c, ... is TRUE.
OR Same as IOR. (If you are a programmer or a mathematician
you might expect there to be a XOR function, but there
isn't!)
AND Logical And: [AND a b c ...] is TRUE if the values of all
subexpressions a, b, c, ... are TRUE.
NOT [NOT a] is TRUE if a is FALSE, and vice versa. Use this
when you want to take an action when something is not true.
EQU [EQU v a b c ...] is TRUE when the value of v is one of the
values a, b, c, ... Comparison is by string. Typically, you
use this with v being a built-in variable expression like
$CLASS (see below), and the remaining arguments being
strings to test like Mage or Sorcerer. Note that string
literals are not quoted and therefore may not contain
spaces. Hyphenate names with spaces (Filthy-Rag instead of
Filthy Rag) if necessary.
LEQ [LEQ v a] is TRUE when the integer value of v is less than
or equal to the integer value of a. Note that while EQU
treats its arguments as strings, LEQ treats them as
numbers.
GEQ [GEQ v a] is TRUE when the integer value of v is greater
than or equal to the integer value of a. Note that while
EQU treats its arguments as strings, GEQ treats them as
numbers.
Variable Explanation
$RACE Returns the name of your race; for example, Snotling or
High-Elf.
$CLASS Returns the name of your class; for example, Warrior-Mage
or Mindcrafter. Note that if you are playing in Monster
mode, then this variable always returns Monster, while
$RACE returns the actual monster race you are playing, such
as Lich or Dragon.
$SUBCLASS Returns the name of your subclass, if any. This could be,
say, Yeqrezh on a Disciple or Evil Bias on a Gray-Mage.
$SPECIALITY Returns the name of your speciality, for example Axes on a
Weaponmaster or Potions on a Devicemaster. Returns none for
all classes except those two.
$REALM1 Returns the name of your first realm, if any; for example,
Chaos or Sorcery. If the player does not have a first
realm, then this variable returns none.
$REALM2 Returns the name of your second realm, if any; for example,
Life or Death. If the player does not have a second realm,
then this variable returns none.
$LEVEL Returns your current level. Typically, you combine this
with GEQ or LEQ to test the level against a threshold, such
as [LEQ $LEVEL 34].
$SELLING Returns Off if you have turned the no_selling option on,
and On otherwise.
$MONEY Returns the amount of gold the player has. Like $LEVEL, use
this with GEQ or LEQ to test whether your player is rich or
poor.
All variables begin with a $ character to distinguish them from string
literals.
Literal Explanation
Number Numbers are written like 105 or 32.
String Strings are written like High-Mage or Beholder, and may not
contain spaces.
Using the Editor
The editor should not be too hard to use, and you can probably figure
things out on your own. Like any text editor, you move the cursor about
with the arrow keys and then type when you have located the correct
position. Advanced things (and easy things that slip your mind) can be
done through the ESC menu:
(a-j) Command:
#####+---------------------------+#######
# Con| a) Help |
#####| b) Quit without save ^Q |#######
mushr| c) Sa+----------------------------------+
~mush| d) Re| a) Left (Left Arrow key) ^B |
| e) Lo| b) Down (Down Arrow key) ^N |
?:[EQ| f) Ed| c) Up (Up Arrow key) ^P |
~mush| g) Se| d) Right (Right Arrow key) ^F |
?:1 | h) Mo| e) Beginning of line ^A |
| i) In| f) End of line ^E |
?:[LE| j) Ad| g) Page up (PageUp key) ^O |
potio| k) Ad| h) Page down(PageDown key) ^L |
?:1 | l) Ke| i) Top (Home key) ^T |
potio| m) Co| j) Bottom (End key) ^U |
potio+------+----------------------------------+
potions:heroism
potions:speed#!kq
potions:giant strength#!k
potions:enlightenment
potions:of strength#!k
-------------------------------------------------------------------------------
This line is a comment.
Here, you can clearly see what commands to use to move the cursor
about, as well as backup keys in case normal keys like arrows somehow
fail.
Note that the editor automatically colors each rule line according to
the syntax of the expression. Sometimes the text displayed is not
exactly the same as the rule you actually typed in (adjectives might be
shuffled, for instance); but the meaning will be the same. To avoid
confusion, the line your cursor is on is never syntax-colored and
always displays exactly what you typed.
The Easy Destroyer
If, after reading all of the above, you decide that the Mogaminator is
too much for you to handle, you may instead use a simpler system to
manage objects: the Easy Destroyer. This system is configured via
options (see [j]); the option destroy_items turns the Easy Destroyer on
and off. Using the Mogaminator and the Easy Destroyer side-by-side is
recommended if and only if you have the always_pickup option on.
If you have turned on the Mogaminator but don't like what it's doing,
you can use the no_mogaminator option to turn it off, or the
leave_mogaminator option to limit object destruction to complete junk
only. Using always_pickup also disables item destruction by the
Mogaminator while still allowing the Easy Destroyer.
Reference Tables
This section will give all the nitty-gritty syntax details for the
Mogaminator. But first, where are those preference files located
anyway? The default preferences are initialized from
lib/pref/pickpref.prf; so if you want to edit the default preferences
for all characters, this is the file to edit. You can also create your
own personal default preferences at /lib/user/pickpref-UserDefault.prf;
this has the advantage that you don't need to overwrite the original
defaults, and can go back to them easily if you start disliking your
changes. (Another advantage of the user defaults is that you can set
and edit them in-game, which you cannot do with the global defaults.)
Once you activate the Mogaminator, your preferences are stored in a
separate file in a system-dependent location. On Windows, they will be
stored at lib/user/pickpref-NAME.prf, while on Linux they might be
moved to ~/.angband/FrogComposband/pickpref-NAME.prf (outside the
game's directory structure). Here, NAME is replaced with your player's
current name. So if you want to edit your character's preferences using
an outside text editor, this is the file you need to change. It's
usually simpler to just use the in-game editor; but if you do edit
preferences outside the game while you are playing, be sure to use the
$ command to force the game to reload the preference file.
The promised reference tables follow below... enjoy!
Table I: Line Types in the Editor
Type Explanation
Comment These lines begin with a # and are ignored by the system.
Conditional These lines flip the global processing switch ON and OFF.
If the expression evaluates to TRUE, then the switch is
turned ON and any subsequent rules will be included. If
the expression evaluates to FALSE, the switch is turned
OFF and any subsequent rules will be ignored until the
next TRUE conditional is reached. See [k] above for
details.
Rule Every other line, unless it is blank, is a rule. The
syntax of a rule is described in the following 5 tables.
Table II: Rules: Syntax
Rules have one of the following two syntactic forms:
[Actions] Adjectives* Noun Special-Clauses* [:Search-String]
[#Inscription-String]
[Actions] Search-String [#Inscription-String]
Square brackets denote optional syntactic elements. * is the
Kleene-Star and indicates that 0 or more of the preceding syntactic
elements may be specified. All rules must be specified on a single
line in your preference file.
Syntactic Element Explanation
Actions The "what to do if this rule matches" part. Uses
one or more of the action letters described in the
next table. If this element is omitted, the action
defaults to pick up.
Adjectives These modify nouns, further narrowing down the set
of objects that will match the rule.
Noun A single noun is always specified for the first
syntactic form and indicates the broad class of
objects to which this rule shall apply.
Special Clauses Further refinements, discussed below ([l]). They
resemble adjectives in that they modify nouns, but
unlike adjectives they involve numerical
comparison of object attributes. They also always
follow the noun, while adjectives precede the
noun.
Search String This is a free-form text value to compare against
the object's name. Comparison is by string and is
case-insensitive. Two special characters, ^ and $,
indicate the matching string must be at the
beginning or end (respectively) of the object's
name; for example, ^foo will only match objects
whose names begin with foo, so foobar matches it
but barfoo does not. Similarly, bar$ only matches
objects whose name ends with bar. Finally, note
that object names are always in the singular; so,
for example, Seeker Bolt would work for a string
match, but Seeker Bolts would always fail.
Inscription String This is a free-form text value that will be
automatically inscribed on any object matching
this rule.
If this seems complicated, study the default preferences and you will
soon figure things out.
Table III: Rules: Action Letters
Letter Type Explanation
! Primary Destroy
; Primary Prompt to pick up
~ Primary Leave on the floor
Primary Pick up - assumed if you fail to provide an
alternative primary action letter. There is no
specific action letter for this action, it is
simply assumed unless overridden.
( Secondary Hide in M map
? Secondary Automatically identify this item, provided you
have scrolls or staves of Identify.
# Terminal Auto-inscribe matching objects with whatever text
follows this key. Note that Primary and Secondary
action letters must be placed at the beginning of
a rule line, while Terminal action letters must be
placed at the end of a rule line.
Every rule must have one Primary action (which is assumed to be Pick
Up if nothing else is specified). It can have 0 or more secondary
actions, and the sole Terminal action is also optional.
Table IV: Rules: Nouns
Noun Explanation
Items Applies to everything. This is useful for very general
rules, such as ~?unidentified items to automatically
identify, but leave on the ground, everything not yet
identified; or even items to pick everything up! The noun
items is implicitly assumed if no other noun is specified.
Weapons Applies to all melee weapons (including diggers), but not
to missile weapons.
Favorite Weapons
Applies to all weapons, including shooters, that your
class likes. For example, Weaponmasters specialize in a
given type of weapons, such as Axes or Crossbows; whatever
their speciality is, this "noun" will apply to these
preferred items. Note that the game considers favorite
weapons a noun, not an adjective followed by a noun.
Hafted Weapons
Applies to all hafted weapons like Maces, Flails and War
Hammers; these weapons are preferred by Priests. Like the
Favorite Weapons "noun" above, the Mogaminator views this
as a single noun, not an adjective followed by a noun.
Diggers Applies to all digging implements, such as shovels,
mattocks and picks.
Shooters Applies to anything that goes in the shooter shot,
including slings, bows, crossbows, harps and guns.
Ammo Applies to all ammunition for missile weapons: arrows,
pebbles, shots and bolts.
Armors Applies to all forms of armor (for more specific nouns,
see below):
Suits Applies to body armor.
Shields Applies to shields.
Cloaks Applies to cloaks.
Helms Applies to helmets and crowns.
Gloves Applies to gloves.
Boots Applies to boots.
Wands Applies to wands.
Staves Applies to staves (the magical device kind, not the
quarterstaff kind!). For example, try staves:healing or
staves:speed.
Rods Applies to rods.
Potions Applies to potions. (Watch out - many potion names, like
Potion of Strength and Potion of Restore Strength,
partially match each other.)
Scrolls Applies to scrolls.
Rings Applies to rings.
Amulets Applies to amulets.
Lights Applies to anything that goes in the light source slot.
Spellbooks Applies to all spellbooks. If you are a non-caster (and
non-seller) you can specify !spellbooks with impunity, but
as a book caster you probably want to combine this with
adjectives.
Junk Applies to complete junk like broken sticks. Also covers
statues (which are potentially sellable); use !worthless
junk to exclude them.
Corpses Applies to corpses, which are potentially useful;
Possessors can possess them, Igors cut them apart, some
demons eat humanoid corpses, and wanted corpses can be
turned in at the Bounty Office.
Skeletons Like corpses, you may turn in wanted skeletons at the
Bounty Office. Archers may also use skeletons to make
arrows and bolts.
If you are using keywords to build a match predicate, then you must
specify exactly one noun, but may use as many adjectives as you like.
Table V: Rules: Adjectives
Because there are so many adjectives, they are grouped here by kind.
Object Knowledge
Unsensed Applies to objects that have not yet been identified or
pseudo-identified.
Unidentified Applies to objects that have not yet been identified (e.g.
?unidentified items to auto-identify everything).
Unaware Applies to objects whose flavor has not yet been
identified.
Identified Applies all objects that have been identified.
*Identified* Applies to fully identified objects, and is rarely needed.
Object Quality
Average Applies to all average items. Some players like to combine
this with the ! action letter quite early; but that can be
inconvenient if you are looking for a reforge base item.
Good Applies to all good items.
Ego Applies to all excellent objects. See [m] for more
information.
Artifact Applies to all artifacts. See [n] for more information.
Cursed Applies to all cursed items. Use sparingly; cursed items
can be good, and !worthless items catches the real junk.
Nameless Applies to all objects that are neither artifacts nor ego
items.
Rare Applies to all objects in a specific, hardcoded list of
object types; for example, Blades of Chaos and Maces of
Disruption are rare, as are all dragon armor pieces
including dragon scale mail.
Common Applies to all objects that are not rare; so a Long Sword
is common, but a Blade of Chaos is not.
Worthless Any object whose value is 0 is considered worthless. Watch
out a bit, though: for example, corpses are "worthless",
but you still want to keep some of them. The default
preferences have !worthless items at the very bottom,
below rules that protect useful worthless things.
Icky Icky items are items unsuitable for your class; they may
be an Icky Wield or cause other class-specific penalties.
Object Attributes
Dice Boosted When used with weapons or shooters, this adjective
indicates that the object's damage dice or damage
multiplier are higher than usual for the object kind.
See the Special Clauses below for more information about matching on an
object's attributes.
Spellbook Adjectives
Unreadable This will match spellbooks that you cannot use, either
because you are playing a class that does not have
realms or because the book does not belong to a realm
you selected.
First Realm's Applies to books from your primary magic realm, if any.
Second Realm's Applies to books from your secondary magic realm, if
any.
First
Second
Third
Fourth Each realm of magic has four spellbooks; these
adjectives refer to each of these books by number.
Usually, the first and second books are cheap, while the
third and fourth are valuable.
Corpse Adjectives
Wanted Combine with corpses or skeletons to indicate the remains
of a wanted monster.
Unique Combine with corpses or skeletons to indicate the remains
of a unique monster. (Maybe you're a collector?)
Human Some characters use humanoid corpses either as food, or as
part of a ritual to summon a powerful demonic ally. For
these situations, add a rule like ~human corpses to your
preferences, though ~special items will also work.
Miscellaneous
Collecting Collecting items matches stackable objects identical with
objects already in your pack.
Special Special items are objects your race or class needs;
objects that are usually considered junk by default. For
example, some characters receive scant sustenance from
normal food and must consume humanoid corpses (yum!).
Daemon casters use corpses for various spells. Archers use
skeletons to make their own ammo. Beastmasters and Cavalry
actually enjoy wands of Haste Monster. Such special
scenarios are handled with this adjective. Note that this
is a meaning completely distinct from the object feeling
{special}, which refers to artifacts.
Unusable Applies to wearable items you currently have no equipment
slots for. Especially handy in Monster Mode - still, use
with some care in case you acquire new slots over time...
Table VI: Rules: Special Clauses
In the following clauses, N refers to a digit (0-9); the sequence NN
means you may type one or two digits, and can therefore enter any
number between 0 and 99. Analogously, NNNNNN allows numbers between 0
and 999999. If you enter too many digits, the parser will not
recognize your special clause, and you will get unsatisfactory
results from your rule.
Special Clause Explanation
More Dice Than NN This clause applies to weapons only, and is
true whenever the maximum possible damage
exceeds the number you enter. For example a
(2d5) weapon will match more dice than 9 but
will fail to match more dice than 10.
More Bonus Than NN An object's bonus is here the largest of its
pval, to-hit, to-dam and to-AC. For example,
rings more bonus than 9:speed will pick up
rings of speed (+10) or better, but will not
match other rings of speed; and suits more
bonus than 19:power dragon says that you
would quite like a Power Dragon Scale Mail,
but only if its to-AC bonus is +20 or better!
More Level Than NN This clause is intended to be used on corpses
so that Possessors can manage the mountains
of dead bodies they create. You can also use
it with other objects, in which case it
corresponds to the level of the object, or
its ego type. For devices, it matches the
power level of the device.
More Charges Than NN Intended for magical devices; maybe you
already have a Staff of Cure Wounds with 20
charges and consider anything smaller than
that to be junk.
More Weight Than NN Some classes have weight restrictions on
armor, like Monks, Scouts and Ninjas. Other
classes, like Maulers, prefer very heavy
weapons. This clause matches against the
weight of the object, in pounds; so weapons
more weight than 39 will match weapons
weighing at least 39.1 lbs.
More Value Than NNNNNN This clause matches against the known value
of the object. Use with care, since unknown
or even un-*identified* objects may have
"known" values lower than the actual value.
Table VII: Conditionals: Syntax
Conditional statements have the following syntactic form:
?:Expression
Conditional expressions use the following (partial) grammar:
Expression := Literal | Variable | [Function Expression*]
Function := IOR | OR | AND | NOT | EQU | LEQ | GEQ
Variable := $RACE | $CLASS | $REALM1 | $LEVEL | $MONEY | ...
Literal := 23 | 52 | Rage-Mage | High-Elf | ...
Note that unlike above, square brackets are part of the syntax of
expressions and do not indicate optional elements in the grammar.
Rather, function application expressions are always surrounded with
square brackets.
When the expression on a conditional line evaluates to FALSE or 0,
then any subsequent rules will be ignored. When the expression
evaluates to TRUE or non-zero, then any subsequent rules will be
applied. See [o] above for details.
Table VIII: Conditionals: Functions
Function Explanation
IOR Inclusive Or: [IOR a b c ...] is TRUE if the value of any
subexpression a, b, c, ... is TRUE.
OR Same as IOR.
AND Logical And: [AND a b c ...] is TRUE if the values of all
subexpressions a, b, c, ... are TRUE.
NOT [NOT a] is TRUE if a is FALSE, and vice versa. Use this
when you want to take an action when something is not
true.
EQU [EQU v a b c ...] is TRUE when the value of v is one of
the values a, b, c, ... Comparison is by string.
Typically, you use this with v being a built-in variable
expression like $CLASS (see below), and the remaining
arguments being strings to test like Mage or Sorcerer.
Note that string literals are not quoted and therefore
may not contain spaces.
LEQ [LEQ v a] is TRUE when the integer value of v is less
than or equal to the integer value of a. Note that while
EQU treats its arguments as strings, LEQ treats them as
numbers.
GEQ [GEQ v a] is TRUE when the integer value of v is greater
than or equal to the integer value of a. Note that while
EQU treats its arguments as strings, GEQ treats them as
numbers.
Table IX: Conditionals: Variables
Variable Explanation
$RACE Returns the name of your race; for example, Snotling or
High-Elf.
$CLASS Returns the name of your class; for example, Warrior-Mage
or Mindcrafter. Note that if you are playing in Monster
mode, then this variable always returns Monster, while
$RACE returns the actual monster race you are playing,
such as Lich or Dragon.
$SUBCLASS Returns the name of your subclass, if any. This could be,
say, Yeqrezh on a Disciple or Evil Bias on a Gray-Mage.
$SPECIALITY Returns the name of your speciality, for example Axes on
a Weaponmaster or Potions on a Devicemaster. Returns none
for all classes except those two.
$REALM1 Returns the name of your first realm, if any; for
example, Chaos or Sorcery. If the player does not have a
first realm, then this variable returns none.
$REALM2 Returns the name of your second realm, if any; for
example, Life or Death. If the player does not have a
second realm, then this variable returns none.
$LEVEL Returns your current level. Typically, you combine this
with GEQ or LEQ to test the level against a threshold,
such as [LEQ $LEVEL 34].
$SELLING Returns Off if you have turned the no_selling option on,
and On otherwise.
$MONEY Returns the amount of gold the player has. Like $LEVEL,
use this with GEQ or LEQ to test whether your player is
rich or poor.
All variables begin with a $ character to distinguish them from
string literals. Note that some variables allowed by edit files are
not allowed here, and some variables that are allowed here (like $SYS
and $KEYBOARD) are unlikely to apply and so not documented.
Table X: Conditionals: Literals
Literal Explanation
Number Numbers are written like 105 or 32.
String Strings are written like High-Mage or Beholder. Note that
string literals are not quoted and therefore may not
contain spaces; hyphenate if necessary (Filthy-Rag for
the Filthy Rag race).
--
Original : PosChengband 4.0.0
Updated : FrogComposband 7.1.liquorice