SpellList is a utility app which lists spells from the Pathfinder® RPG with a semi-natural language filter. This is a ground up rewrite of version 1 with significant improvements. Version 1 information is here.
An iPad version will be coming eventually.
The application has three major parts.
- Spell List filter and viewer
- Query editor
- Semi-random Spell Generator
This application assumes you are familiar with the Pathfinder RPG rules. It is not a teaching guide.
Spell List Window
You can open up to twelve of these windows via ⌘N. Each window will have a different background colour. The reason for this is so you know which window the Print Window and the Query Select window is associated with.
Left-hand list : list of spells after query filter has been applied.
Segment Control : spell colouring options.
- Abjuration : Light Blue
- Conjuration : Light Green
- Divination : Light Salmon
- Enchantment : Light Sky Blue
- Evocation : Light Coral
- Illusion : Light Pink
- Necromancy : Light Gray
- Transmutation : Light Sea Green
- Universal : Light Golden Rod Yellow
- Core : Light Blue
- APG : Light Green
- Ultimates : Light Coral
- ARG : Light Pink
- ACG : Light Gray
- The Rest : Light Sea Green
<<<, >>> : history. The history is not saved.
Print List shows the Print Window. Queries shows the Query Select Window.
How to create a query is explained in the appendix and also in the Query Editor window.
The Print Window's background will be the same as the associated Spell List window.
Each spell will have the formatter applied to it. Formatter details are below.
Preview will display the output in the right hand pane. Copy will copy all formatted spells to the clipboard in the RTF format. This application is not a word processor, use TextEdit or a dedicated word processor for decent editing and printing.
PDF will open the PDF Window (detailed below).
This window is for outputting formatted spells as a PDF file with one spell per file. Existing files will be overwritten.
Pick a destination location and press save. Hundreds or thousands of individual files will be saved to the directory. The preview view will display the first spell in the filtered list.
Query Editor Window
This is where queries are managed.
The query language is a very simple, semi-natural language.
The SpellList Window filter uses the same language. It can access the saved queries by entering
#<query name># in the text entry.
The 'sl_' prefix for query names are reserved by the application.
When editing a query, the text colour will be black, red, purple or blue.
- Black indicates legal syntax.
- Red indicates a syntax error or the query is non-sensical.
- Blue indicates there is a bracer mismatch present.
- Purple indicates there are invalid characters in the query.
Everything is converted to lowercase when saved.
Test will test the query and list all spells which pass the query.
Copy is for convenience. Copies all names to the clipboard.
Details of the language are in the appendix.
This is the semi-random (user guided) spell generator.
A completely random generator is easy to create. But it is impractical for encounters: a wizard is not going to memorise fire spells for a Red Dragon.
So what this is is a Spell Volume editor. Each volume has X number of spell slots for each spell level. Each spell slot has a spell selection method. The selection method narrows the available spells for the randomiser to select.
Spell volumes are auto saved whenever it is deselected or when SpellList quits.
Changes are not reversible, neither are deletions.
Under the hood a Volume is XML file. Do not edit it, if a Volume is corrupted, it will not be loaded.
Each spell level can have, in theory, an infinite number of slots. Practically speaking, doing so will cause performance issues and crashes. There is no enforced limit so use some common sense.
Any slot with the ￼ symbol is the current slot being edited (right-hand column).
The class popup menu, level popup menu and stat text editor are convenience setters. Pressing Set will clear all slots and set it to the standard class slot count (including high stat modifiers). The stat is ignored for classes of the sorcerer style casting. All slots will have the specified class as the default spell selector.
No Changes check box, if checked, will prevent slot count changes. It does not prevent individual slot editing.
Generate generates the random spell list. The list will open a window shown below. Duplicates checkbox indicates whether or not duplicate spells are allowed. For sorcerer style casting, this is ignored.
Sometimes during generation,
<no spell> will appear. This can occur if the slot generation method produces too few spells for selection or none at all.
For example, spell level 3 - slot 0 has the Quicken metamagic feat with 100% chance. This will always produce
<no spell> as Quicken spell has a +4 spell level modifier.
The generator makes forty attempts at filling a slot with a spell, if that fails, it will tag it as empty.
The top popup menu is the method generation. It is one of the following
- Empty: no spell is selected for the slot. Output will be
in the above window.
- Any: any spell of the applicable spell level can be selected. Important: because some spells have different levels for different classes, the spell level used is based on the spell-like ability level selection.
Order: sorcerer, wizard, cleric, druid, ranger, bard, paladin, alchemist, summoner, witch, inquisitor, oracle, antipaladin, magus, adept, bloodrager, shaman, psychic, medium, mesmerist, occultist, spiritualist, arcanist, hunter.
- Character Class: spell selected will be from the indicated class's spell list.
- Query: spell selected will be based on the indicated query. Important, the spells available will be filtered by slot's spell level.
The top button opens the Query Select window. Double-click to select the query.
- Spell: specific spell.
The middle button opens the Spell Select window. Double-click to select the spell.
Important: Slot changes are not auto-saved. You must press Apply before selecting another slot or you will lose your changes.
The slider under Use Metamagic are the odds (1-100%) of one or more metamagic feats being applied to that slot.
What metamagic feats that could be applied are in the list underneath. Do note, only sensical metamagic combinations with respect to a spell are allowed. For example a maximised Alarm spell cannot happen. The list allows multiple selection using the ⌘ key. Avoid too many selections per slot, it can stall SpellList.
Supported feats: aquatic, benthic, burning, concussive, consecrate, eclipsed, empower, enlarge, extend, familiar, flaring, maximize, merciful, piercing, quicken, reach_1*, reach_2*, reach_3*, silent, still, widen.
*The reach feat has been split into three different feats. Reach_1 increases spell range by one step, reach_2 by two steps and reach_3 by three steps.
You may notice Heighten is not present. It is a complicated feat to apply and will come in a future version.
There are sixty other metagmagic feats that I may support. They are all difficult to code for and I will roll them out gradually.
Spell Select Window
Only used by the Spell Generator.
Query Select Window
The Query Select window background colour is the same as its associated window. In this case it is associated with the Spell Generator window.
Double-click to select.
Print Window Formatter
|[u]||following character will be uppercase|
|[l]||following character will be lowercase|
|[name]||will print spell’s name|
|[sch]||will print three character shortform of school|
|[school]||will print full length form of school|
|[subs]||will print subschool if it exists.||Condition|
|[cls]||will print spell’s class level in the form of ‘class X’ with ‘/‘ as a separator. Class name will be the three character shortform.|
|[class]||will print spell’s class level in the form of ‘class X’ with ‘/‘ as a separator. Class name will be the full length form|
|[lvl-XXX]||will print 'cls N' of the spell if it exists. Class name will be the three character shortform.||Condition|
|[lvl+XXX]||will print 'cls N' of the spell if it exists. Class name will be the full length form.|
|XXX is one of sor, wiz, clr, drd, rgr, brd, pal, alc, smn, wit, inq, orc, apl, mag, adp, brg, shm, psy, med, mes, occ, spr.|
|[comp]||will print spell components using the single character form.|
|[components]||will print spell components using full length form.|
|[v]||will print spell component 'V' if it exists.||Condition|
|[verbal]||will print spell component 'verbal' if it exists|
|[s]||will print spell component 'S' if it exists.||Condition|
|[somatic]||will print spell component 'somatic' if it exists|
|[m]||will print spell component 'M' if it exists.||Condition|
|[material]||will print spell component 'material' if it exists|
|[f]||will print spell component 'F' if it exists.||Condition|
|[focus]||will print spell component 'focus' if it exists|
|[df]||will print spell component 'df' if it exists.||Condition|
|[div]||will print spell component 'divine focus' if it exists|
|[mythic]||will print 'mythic' if the spell has a mythic version.||Condition|
|[dismiss]||will print 'dismissible' if the spell is dismissible.||Condition|
|[shape]||will print 'shapeable' if it exists.||Condition|
|[save]||will print full description of spell's save entry|
|[fort-]||will print 'fort neg' if it exists.||Condition|
|[fort/]||will print 'fort half' if it exists.||Condition|
|[fort%]||will print 'fort partial' if it exists.||Condition|
|[ref-]||will print 'reflex negates' if it exists.||Condition|
|[ref/]||will print 'reflex half' if it exists.||Condition|
|[ref%]||will print 'reflex partial' if it exists.||Condition|
|[will-]||will print 'will negates' if it exists.||Condition|
|[will/]||will print 'will half' if it exists.||Condition|
|[will%]||will print 'will partial' if it exists.||Condition|
|[will!]||will print 'will disbelief' if it exists.||Condition|
|[sr]||will print full description of spell's SR entry|
|[sr-]||will print 'no' if it exists.||Condition|
|[sr+]||will print 'yes' if it exists.||Condition|
|[ct]||will print full description of spell's casting time entry|
|[ct-i]||will print 'immediate' if it exists.||Condition|
|[ct-s]||will print 'swift' if it exists.||Condition|
|[ct-a]||will print 'standard action' if it exists.||Condition|
|[ct+a]||will print 'std act' if it exists.||Condition|
|[ct-f]||will print 'full round' if it exists.||Condition|
|[ct-m]||will print 'minutes' if it exists.||Condition|
|[ct-h]||will print 'hours' if it exists.||Condition|
|[rge]||will print full description of spell's range entry|
|[rge-p]||will print 'personal' if it exists.||Condition|
|[rge-s]||will print 'self' if it exists.||Condition|
|[rge-t]||will print 'touch' if it exists.||Condition|
|[rge-c]||will print 'close' if it exists.||Condition|
|[rge-m]||will print 'medium' if it exists.||Condition|
|[rge-l]||will print 'long' if it exists.||Condition|
|[dur]||will print full description of spell's duration entry|
|[dur-i]||will print 'instantaneous' if it exists.||Condition|
|[dur-r]||will print 'rounds' if it exists.||Condition|
|[dur-m]||will print 'minutes' if it exists.||Condition|
|[dur-h]||will print 'hours' if it exists.||Condition|
|[effect]||will print full description of spell's effect entry|
|[eman]||will print 'emanation' if it exists.||Condition|
|[burst]||will print 'burst' if it exists.||Condition|
|[cone]||will print 'cone' if it exists.||Condition|
|[spread]||will print 'spread' if it exists.||Condition|
|[line]||will print 'line' if it exists.||Condition|
|[cylinder]||will print 'cylinder' if it exists.||Condition|
|[dmn-X]||will print spell's domains (if they exists) using the separator 'X'|
|[bld-X]||will print spell's bloodlines (if they exists) using the separator 'X'|
|[gold]||will print spell's gold cost if > 0|
|[gold0]||will print spell's gold cost|
|[source]||will print spell's source book|
|[desc-X]||will print all spell descriptors using separator 'X'.||Condition|
|[desc-NNNN]||will print descriptor NNNN if it exists.|
|NNNN is one of acid, air, chaotic, cold, darkness, death, earth, elec, evil, fear, fire, force, good, lang, lawful, light, mind, pain, shadow, sonic, water, curse, disease, emotion, poison|
[endif] will only be printed if
[NNN] exists or is true.
[if!] is the not version, text will be printed the condition does not exist or is false.
NNN is any of the above which has the Condition at end of its description.
[if][spread]Spell is a spread spell[endif]
Spells that have the Spread flag will output 'Spell is a spread spell'
The query parser has differences from version 1 of SpellList and copying queries from that version to version 2 may result in syntax errors.
IMPORTANT. SL v1 uses 'and' & 'or', SL v2 uses '&' and '|'.
A query consists of one or more phrases, separated by '&' or '|'.
IMPORTANT. In SL v1, '&' and '|' have the same precedence, in SL v2, '&' has greater precedence than '|'.
Phrases can be bracketed. Example: '
name contains "A" & (school is abj | school is nec)'.
A phrase is usually one of the following forms:
- is/is not FIELD/ATTR
- has/does not have FIELD/ATTR
- FIELD is/is not ATTRIBUTE
- FIELD OPERATOR "STRING"
- FIELD COMPARATOR INTEGER
Phrases can also reference named (saved) phrases using
The saved phrase '
sl_wizard' query is '
User creates a new query where they want all fire and cold wizard spells.
The query would be '
(descriptor is fire | descriptor is cold) & #sl_wizard#'.
name contains | does not contain | is equal to | is not equal to | begins with | ends with "string"
The " " are required.
school is/is not abj | cnj | div | enc | evo | ill | nec | trn | unv | abjuration | conjuration | divination | enchantment | evocation | illusion | necromancy | transmutation | universal
has/does not have calling | compulsion | creation | figment | glamour | healing | pattern | phantasm | polymorph | scry | scrying | shadow | summoning | teleporation
source is/is not core | apg | arg | acg | ultimates | the rest
is/is not verbal | somatic | material | focus | divine focus
gold cost < ≤ <= = ≠ >= ≥ > positive integer
is/is not dismissible
iis/is not shapeable
is/is not mythic
casting time contains "string"
casting time is/is not standard | immediate | swift | free | full round | minutes | hours
is/is not sorcerer | wizard | cleric | druid | ranger | bard | paladin | alchemist | summoner | witch | inquisitor | oracle | antipaladin | magus | adept | bloodrager | shaman | psychic | medium | mesmerist | occultist | spiritualist
sorcerer | wizard | cleric | druid | ranger | bard | paladin | alchemist | summoner | witch | inquisitor | oracle | antipaladin | magus | adept | bloodrager | shaman | psychic | medium | mesmerist | occultist | spiritualist
level < ≤ <= = ≠ >= ≥ > 0 - 9
Example: sorcerer level = 3
descriptor is/is not acid | air | chaotic | cold | curse | darkness | death | disease | earth | electricity | emotion | evil | fear | fire | force | good | language dependent | lawful | light | mind affecting | pain | poison | shadow | sonic | water
sr contains "string"
sr is/is not no | yes | harmless
sr affects|does not affect object
saves contains "string"
save is/is not fort half | fort negate | fort partial | reflex half | reflex negate | reflex partial | will half | will negate | will partial | will disbelief | fort | reflex | will
duration contains "string"
duration is/is not instantaneous | rounds | minutes | hours
range contains "string"
range is/is not personal | self | touch | close | medium | long
range in feet < ≤ <= = ≠ >= ≥ > positive integer
target contains "string"
is/is not single target
has targets per caster level
effect contains "string"
effect is/is not burst | cone | spread | line | emanation
domains contains "string"
has/does not have domains
bloodlines contains "string"
has/does not have bloodlines
is/is not empowered | brisk | intensified | umbral | vast | widen | yai-mimic | hp damage spell* | authorative | benthic | blissful | brackish | burning | centered | concussive | consecrate | crypt | eclipsed | elemental | enlarge | fearsome | flaring | furious | latent curse | lingering | maximize | merciful | persistent | quicken | reach | rime | scarring | scouting | silent | solar | still | steam | tenebrous | threatening illusion | threnodic | thundering | toxic | traumatic | trick
* "hp damage spell" is not a metamagic feat but it is included for those who want spells that inflict HP damage.