@opencharacter/wwn-srd 0.0.0-stage → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +144 -0
- package/README.md +109 -2
- package/content/armor/buff-coat.yaml +7 -0
- package/content/armor/cuirass-and-greaves.yaml +7 -0
- package/content/armor/grand-plate.yaml +7 -0
- package/content/armor/great-armor.yaml +7 -0
- package/content/armor/large-shield.yaml +6 -0
- package/content/armor/linothorax.yaml +6 -0
- package/content/armor/mail-hauberk.yaml +7 -0
- package/content/armor/mail-shirt.yaml +6 -0
- package/content/armor/pieced-armor.yaml +7 -0
- package/content/armor/plate-armor.yaml +7 -0
- package/content/armor/scaled-armor.yaml +7 -0
- package/content/armor/small-shield.yaml +6 -0
- package/content/armor/war-robe.yaml +7 -0
- package/content/armor/war-shirt.yaml +7 -0
- package/content/arts/accursed/accursed-blade.yaml +5 -0
- package/content/arts/accursed/accursed-bolt.yaml +5 -0
- package/content/arts/accursed/bewitching-distraction.yaml +5 -0
- package/content/arts/accursed/compelling-shriek.yaml +5 -0
- package/content/arts/accursed/devils-bargain.yaml +4 -0
- package/content/arts/accursed/dire-pact.yaml +4 -0
- package/content/arts/accursed/lying-face.yaml +5 -0
- package/content/arts/accursed/night-black-eyes.yaml +4 -0
- package/content/arts/accursed/pacted-protection.yaml +4 -0
- package/content/arts/accursed/rob-vitality.yaml +5 -0
- package/content/arts/accursed/scourging-curse.yaml +5 -0
- package/content/arts/accursed/shadowed-steps.yaml +5 -0
- package/content/arts/accursed/snaring-speech.yaml +5 -0
- package/content/arts/accursed/sorcerous-battery.yaml +5 -0
- package/content/arts/accursed/soul-consumption.yaml +5 -0
- package/content/arts/accursed/tendrils-of-night.yaml +5 -0
- package/content/arts/accursed/unseen-steps.yaml +5 -0
- package/content/arts/accursed/weeping-wounds.yaml +5 -0
- package/content/arts/accursed/weight-of-sin.yaml +5 -0
- package/content/arts/bard/a-thousand-tongues.yaml +5 -0
- package/content/arts/bard/battle-cry.yaml +5 -0
- package/content/arts/bard/cursed-tune.yaml +5 -0
- package/content/arts/bard/deft-fingers.yaml +6 -0
- package/content/arts/bard/entangle-incantation.yaml +5 -0
- package/content/arts/bard/evoke-emotion.yaml +5 -0
- package/content/arts/bard/inspire-dread.yaml +5 -0
- package/content/arts/bard/keen-senses.yaml +4 -0
- package/content/arts/bard/liberating-song.yaml +5 -0
- package/content/arts/bard/rally.yaml +5 -0
- package/content/arts/bard/soothe-the-savage.yaml +5 -0
- package/content/arts/bard/soothing-graces.yaml +4 -0
- package/content/arts/bard/swift-misdirection.yaml +5 -0
- package/content/arts/beastmaster/beast-ward.yaml +5 -0
- package/content/arts/beastmaster/bind-companion.yaml +5 -0
- package/content/arts/beastmaster/eyes-of-the-beast.yaml +5 -0
- package/content/arts/beastmaster/feral-toughness.yaml +8 -0
- package/content/arts/beastmaster/howl-of-distant-summons.yaml +5 -0
- package/content/arts/beastmaster/know-the-weak-spot.yaml +5 -0
- package/content/arts/beastmaster/mind-call.yaml +5 -0
- package/content/arts/beastmaster/natural-weaponry.yaml +10 -0
- package/content/arts/beastmaster/savage-senses.yaml +5 -0
- package/content/arts/beastmaster/shared-vitality.yaml +5 -0
- package/content/arts/beastmaster/swift-healing.yaml +5 -0
- package/content/arts/beastmaster/tongue-of-the-beasts.yaml +5 -0
- package/content/arts/blood-priest/a-thousand-tongues.yaml +5 -0
- package/content/arts/blood-priest/armor-of-god.yaml +11 -0
- package/content/arts/blood-priest/divine-guidance.yaml +5 -0
- package/content/arts/blood-priest/fear-no-flame.yaml +5 -0
- package/content/arts/blood-priest/god-wills-it.yaml +5 -0
- package/content/arts/blood-priest/light-of-faith.yaml +5 -0
- package/content/arts/blood-priest/merciful-healing.yaml +5 -0
- package/content/arts/blood-priest/sanctified-ward.yaml +5 -0
- package/content/arts/blood-priest/smite-the-wicked.yaml +5 -0
- package/content/arts/blood-priest/transubstantiation.yaml +5 -0
- package/content/arts/blood-priest/turn-false-life.yaml +5 -0
- package/content/arts/blood-priest/words-of-mercy.yaml +5 -0
- package/content/arts/blood-priest/wrath-of-the-most-high.yaml +5 -0
- package/content/arts/duelist/blood-for-blood.yaml +5 -0
- package/content/arts/duelist/burst-of-speed.yaml +5 -0
- package/content/arts/duelist/code-duello.yaml +5 -0
- package/content/arts/duelist/crushing-superiority.yaml +5 -0
- package/content/arts/duelist/dauntless-step.yaml +5 -0
- package/content/arts/duelist/dodge-doom.yaml +5 -0
- package/content/arts/duelist/favored-weapon.yaml +13 -0
- package/content/arts/duelist/forced-engagement.yaml +5 -0
- package/content/arts/duelist/gentlemans-withdrawal.yaml +5 -0
- package/content/arts/duelist/graceful-leap.yaml +5 -0
- package/content/arts/duelist/lightning-draw.yaml +5 -0
- package/content/arts/duelist/piercing-strike.yaml +5 -0
- package/content/arts/duelist/spiritual-weapon.yaml +5 -0
- package/content/arts/duelist/unbindable.yaml +5 -0
- package/content/arts/duelist/unworthy-rabble.yaml +5 -0
- package/content/arts/duelist/whirling-evasion.yaml +10 -0
- package/content/arts/elementalist/beckoned-deluge.yaml +5 -0
- package/content/arts/elementalist/earthsight.yaml +5 -0
- package/content/arts/elementalist/elemental-blast.yaml +5 -0
- package/content/arts/elementalist/elemental-resilience.yaml +5 -0
- package/content/arts/elementalist/elemental-sparks.yaml +5 -0
- package/content/arts/elementalist/flamesight.yaml +5 -0
- package/content/arts/elementalist/pavis-of-elements.yaml +8 -0
- package/content/arts/elementalist/petrifying-stare.yaml +5 -0
- package/content/arts/elementalist/rune-of-destruction.yaml +5 -0
- package/content/arts/elementalist/steps-of-air.yaml +5 -0
- package/content/arts/elementalist/stunning-shock.yaml +5 -0
- package/content/arts/elementalist/thermal-shield.yaml +5 -0
- package/content/arts/healer/empowered-healer.yaml +4 -0
- package/content/arts/healer/facile-healer.yaml +4 -0
- package/content/arts/healer/far-healer.yaml +4 -0
- package/content/arts/healer/final-repose.yaml +5 -0
- package/content/arts/healer/healers-eye.yaml +5 -0
- package/content/arts/healer/healers-knife.yaml +4 -0
- package/content/arts/healer/healing-touch.yaml +6 -0
- package/content/arts/healer/limb-restoration.yaml +8 -0
- package/content/arts/healer/purge-ailment.yaml +5 -0
- package/content/arts/healer/refined-restoration.yaml +4 -0
- package/content/arts/healer/revive-the-fallen.yaml +8 -0
- package/content/arts/healer/swift-healer.yaml +4 -0
- package/content/arts/healer/tireless-vigor.yaml +5 -0
- package/content/arts/healer/vital-furnace.yaml +5 -0
- package/content/arts/high-mage/arcane-lexicon.yaml +5 -0
- package/content/arts/high-mage/counter-magic.yaml +5 -0
- package/content/arts/high-mage/empowered-sorcery.yaml +5 -0
- package/content/arts/high-mage/hang-sorcery.yaml +5 -0
- package/content/arts/high-mage/inexorable-effect.yaml +5 -0
- package/content/arts/high-mage/iron-resolution.yaml +5 -0
- package/content/arts/high-mage/preparatory-countermagic.yaml +5 -0
- package/content/arts/high-mage/psychic-conversion.yaml +4 -0
- package/content/arts/high-mage/restrained-casting.yaml +5 -0
- package/content/arts/high-mage/retain-sorcery.yaml +5 -0
- package/content/arts/high-mage/sense-magic.yaml +5 -0
- package/content/arts/high-mage/suppress-magic.yaml +5 -0
- package/content/arts/high-mage/swift-casting.yaml +5 -0
- package/content/arts/high-mage/ward-allies.yaml +5 -0
- package/content/arts/high-mage/wizards-grandeur.yaml +5 -0
- package/content/arts/mageslayer/absolute-negation.yaml +6 -0
- package/content/arts/mageslayer/antimage.yaml +8 -0
- package/content/arts/mageslayer/dispel-enchantment.yaml +6 -0
- package/content/arts/mageslayer/disrupt-sorcery.yaml +6 -0
- package/content/arts/mageslayer/immaculate-body.yaml +5 -0
- package/content/arts/mageslayer/immaculate-mind.yaml +5 -0
- package/content/arts/mageslayer/know-your-prey.yaml +7 -0
- package/content/arts/mageslayer/magebane.yaml +5 -0
- package/content/arts/mageslayer/share-the-pain.yaml +6 -0
- package/content/arts/mageslayer/spellshield.yaml +5 -0
- package/content/arts/mageslayer/ward-ally.yaml +6 -0
- package/content/arts/mageslayer/witchfinder.yaml +6 -0
- package/content/arts/necromancer/bonetalker.yaml +5 -0
- package/content/arts/necromancer/cold-flesh.yaml +6 -0
- package/content/arts/necromancer/consume-life-energy.yaml +4 -0
- package/content/arts/necromancer/false-death.yaml +5 -0
- package/content/arts/necromancer/gravesight.yaml +5 -0
- package/content/arts/necromancer/keeper-of-the-gate.yaml +5 -0
- package/content/arts/necromancer/life-bridge.yaml +5 -0
- package/content/arts/necromancer/master-of-bones.yaml +5 -0
- package/content/arts/necromancer/red-harvest.yaml +5 -0
- package/content/arts/necromancer/unaging.yaml +4 -0
- package/content/arts/necromancer/uncanny-ichor.yaml +4 -0
- package/content/arts/necromancer/unliving-persistence.yaml +5 -0
- package/content/arts/skinshifter/change-form.yaml +6 -0
- package/content/arts/skinshifter/eyes-of-the-hawk.yaml +4 -0
- package/content/arts/skinshifter/feline-leap.yaml +4 -0
- package/content/arts/skinshifter/feral-prowess.yaml +4 -0
- package/content/arts/skinshifter/intrinsic-armor.yaml +4 -0
- package/content/arts/skinshifter/manifest-wings.yaml +4 -0
- package/content/arts/skinshifter/monkeys-road.yaml +4 -0
- package/content/arts/skinshifter/octopus-embrace.yaml +4 -0
- package/content/arts/skinshifter/perfect-mimicry.yaml +4 -0
- package/content/arts/skinshifter/pliant-flesh.yaml +4 -0
- package/content/arts/skinshifter/savage-talons.yaml +4 -0
- package/content/arts/skinshifter/sculptors-beauty.yaml +4 -0
- package/content/arts/skinshifter/serpents-kiss.yaml +5 -0
- package/content/arts/skinshifter/warform.yaml +4 -0
- package/content/arts/skinshifter/wisdom-of-fin-and-scale.yaml +4 -0
- package/content/arts/thought-noble/block-memory.yaml +5 -0
- package/content/arts/thought-noble/elicitation-of-truth.yaml +8 -0
- package/content/arts/thought-noble/facile-speech.yaml +7 -0
- package/content/arts/thought-noble/far-speech.yaml +5 -0
- package/content/arts/thought-noble/hypercognition.yaml +5 -0
- package/content/arts/thought-noble/iconograph.yaml +5 -0
- package/content/arts/thought-noble/impress-imperative.yaml +5 -0
- package/content/arts/thought-noble/mind-light.yaml +4 -0
- package/content/arts/thought-noble/mind-over-matter.yaml +5 -0
- package/content/arts/thought-noble/mirror-mask.yaml +5 -0
- package/content/arts/thought-noble/open-mind.yaml +6 -0
- package/content/arts/thought-noble/positive-association.yaml +5 -0
- package/content/arts/thought-noble/read-intent.yaml +5 -0
- package/content/arts/thought-noble/surface-apprehension.yaml +5 -0
- package/content/arts/thought-noble/thoughts-like-razors.yaml +5 -0
- package/content/arts/thought-noble/unthinkable-thought.yaml +5 -0
- package/content/arts/vowed/brutal-counter.yaml +5 -0
- package/content/arts/vowed/faultless-awareness.yaml +4 -0
- package/content/arts/vowed/hurling-throw.yaml +5 -0
- package/content/arts/vowed/inward-eye.yaml +5 -0
- package/content/arts/vowed/leap-of-the-heavens.yaml +5 -0
- package/content/arts/vowed/martial-style.yaml +9 -0
- package/content/arts/vowed/masters-vigor.yaml +4 -0
- package/content/arts/vowed/mob-justice.yaml +5 -0
- package/content/arts/vowed/nimble-ascent.yaml +5 -0
- package/content/arts/vowed/purified-body.yaml +5 -0
- package/content/arts/vowed/revivifying-breath.yaml +5 -0
- package/content/arts/vowed/shattering-strike.yaml +5 -0
- package/content/arts/vowed/style-weaponry.yaml +4 -0
- package/content/arts/vowed/unarmed-might.yaml +10 -0
- package/content/arts/vowed/unarmored-defense.yaml +11 -0
- package/content/arts/vowed/unobtrusive-step.yaml +5 -0
- package/content/arts/wise/auspicious-undertaking.yaml +5 -0
- package/content/arts/wise/compel-truth.yaml +5 -0
- package/content/arts/wise/deliver-oracle.yaml +5 -0
- package/content/arts/wise/dread-awe.yaml +5 -0
- package/content/arts/wise/elite-ties.yaml +5 -0
- package/content/arts/wise/erudite.yaml +5 -0
- package/content/arts/wise/evil-eye.yaml +5 -0
- package/content/arts/wise/find-object.yaml +5 -0
- package/content/arts/wise/folk-friend.yaml +5 -0
- package/content/arts/wise/healer.yaml +7 -0
- package/content/arts/wise/holy-sanctity.yaml +5 -0
- package/content/arts/wise/ill-fate.yaml +5 -0
- package/content/arts/wise/luck-blessing.yaml +5 -0
- package/content/arts/wise/personal-impunity.yaml +5 -0
- package/content/arts/wise/read-omens.yaml +5 -0
- package/content/arts/wise/skilled.yaml +5 -0
- package/content/arts/wise/war-curse.yaml +5 -0
- package/content/backgrounds/artisan.yaml +18 -0
- package/content/backgrounds/barbarian.yaml +18 -0
- package/content/classes/adventurer.yaml +16 -0
- package/content/classes/expert.yaml +6 -0
- package/content/classes/mage.yaml +20 -0
- package/content/classes/warrior.yaml +8 -0
- package/content/foci/alert.yaml +10 -0
- package/content/foci/armored-magic.yaml +9 -0
- package/content/foci/armsmaster.yaml +20 -0
- package/content/foci/artisan.yaml +5 -0
- package/content/foci/assassin.yaml +5 -0
- package/content/foci/authority.yaml +5 -0
- package/content/foci/close-combatant.yaml +8 -0
- package/content/foci/connected.yaml +5 -0
- package/content/foci/cultured.yaml +5 -0
- package/content/foci/deadeye.yaml +11 -0
- package/content/foci/dealmaker.yaml +5 -0
- package/content/foci/developed-attribute.yaml +23 -0
- package/content/foci/die-hard.yaml +5 -0
- package/content/foci/diplomatic-grace.yaml +5 -0
- package/content/foci/gifted-chirurgeon.yaml +11 -0
- package/content/foci/henchkeeper.yaml +5 -0
- package/content/foci/impervious-defense.yaml +5 -0
- package/content/foci/impostor.yaml +5 -0
- package/content/foci/lucky.yaml +10 -0
- package/content/foci/nullifier.yaml +7 -0
- package/content/foci/poisoner.yaml +5 -0
- package/content/foci/polymath.yaml +10 -0
- package/content/foci/rider.yaml +5 -0
- package/content/foci/shocking-assault.yaml +9 -0
- package/content/foci/snipers-eye.yaml +5 -0
- package/content/foci/special-origin.yaml +5 -0
- package/content/foci/specialist.yaml +38 -0
- package/content/foci/spirit-familiar.yaml +5 -0
- package/content/foci/traditional-education.yaml +15 -0
- package/content/foci/trapmaster.yaml +5 -0
- package/content/foci/unarmed-combatant.yaml +16 -0
- package/content/foci/unique-gift.yaml +5 -0
- package/content/foci/valiant-defender.yaml +5 -0
- package/content/foci/well-met.yaml +3 -0
- package/content/foci/whirlwind-assault.yaml +5 -0
- package/content/foci/xenoblooded.yaml +22 -0
- package/content/gear/arrows.yaml +5 -0
- package/content/gear/artisans-equipment.yaml +6 -0
- package/content/gear/backpack.yaml +6 -0
- package/content/gear/battle-horse.yaml +5 -0
- package/content/gear/boots.yaml +6 -0
- package/content/gear/candle.yaml +5 -0
- package/content/gear/cart.yaml +4 -0
- package/content/gear/common-clothes.yaml +6 -0
- package/content/gear/cooking-utensils.yaml +5 -0
- package/content/gear/criminal-tools.yaml +6 -0
- package/content/gear/crowbar.yaml +5 -0
- package/content/gear/draft-horse.yaml +5 -0
- package/content/gear/dungeoneering-kit.yaml +6 -0
- package/content/gear/fine-clothes.yaml +6 -0
- package/content/gear/firewood.yaml +6 -0
- package/content/gear/flask.yaml +5 -0
- package/content/gear/grappling-hook.yaml +5 -0
- package/content/gear/healers-pouch.yaml +5 -0
- package/content/gear/hurlant-bolts.yaml +5 -0
- package/content/gear/iron-spikes.yaml +5 -0
- package/content/gear/lantern.yaml +5 -0
- package/content/gear/mirror.yaml +4 -0
- package/content/gear/mule.yaml +5 -0
- package/content/gear/noble-clothes.yaml +6 -0
- package/content/gear/noble-courtier-outfit.yaml +6 -0
- package/content/gear/oil.yaml +6 -0
- package/content/gear/paper.yaml +4 -0
- package/content/gear/performers-implements.yaml +6 -0
- package/content/gear/rations.yaml +5 -0
- package/content/gear/riding-horse.yaml +5 -0
- package/content/gear/rope.yaml +5 -0
- package/content/gear/sack.yaml +5 -0
- package/content/gear/shovel.yaml +5 -0
- package/content/gear/small-tool.yaml +5 -0
- package/content/gear/tinder-box.yaml +4 -0
- package/content/gear/torch.yaml +7 -0
- package/content/gear/waterskin.yaml +5 -0
- package/content/gear/wilderness-travel-gear.yaml +6 -0
- package/content/gear/working-dog.yaml +5 -0
- package/content/gear/writing-kit.yaml +5 -0
- package/content/partials/accursed.yaml +17 -0
- package/content/partials/bard.yaml +8 -0
- package/content/partials/beastmaster.yaml +8 -0
- package/content/partials/blood-priest.yaml +6 -0
- package/content/partials/duelist.yaml +9 -0
- package/content/partials/expert.yaml +6 -0
- package/content/partials/healer.yaml +8 -0
- package/content/partials/mage.yaml +33 -0
- package/content/partials/mageslayer.yaml +20 -0
- package/content/partials/skinshifter.yaml +8 -0
- package/content/partials/thought-noble.yaml +8 -0
- package/content/partials/vowed.yaml +40 -0
- package/content/partials/warrior.yaml +6 -0
- package/content/partials/wise.yaml +44 -0
- package/content/spells/elementalist/aqueous-harmony.yaml +5 -0
- package/content/spells/elementalist/boreal-wings.yaml +5 -0
- package/content/spells/elementalist/burrower-below.yaml +5 -0
- package/content/spells/elementalist/calcifying-scourge.yaml +5 -0
- package/content/spells/elementalist/elemental-favor.yaml +5 -0
- package/content/spells/elementalist/elemental-guardian.yaml +5 -0
- package/content/spells/elementalist/elemental-spy.yaml +5 -0
- package/content/spells/elementalist/elemental-vallation.yaml +5 -0
- package/content/spells/elementalist/flame-scrying.yaml +5 -0
- package/content/spells/elementalist/flame-without-end.yaml +5 -0
- package/content/spells/elementalist/fury-of-the-elements.yaml +5 -0
- package/content/spells/elementalist/like-the-stones.yaml +5 -0
- package/content/spells/elementalist/pact-of-stone-and-sea.yaml +5 -0
- package/content/spells/elementalist/tremors-of-the-depths.yaml +5 -0
- package/content/spells/elementalist/wind-walking.yaml +5 -0
- package/content/spells/high/abdication-of-temporal-presence.yaml +5 -0
- package/content/spells/high/adopt-the-simulacular-visage.yaml +5 -0
- package/content/spells/high/apprehending-the-arcane-form.yaml +5 -0
- package/content/spells/high/banishment-to-the-black-glass-labyrinth.yaml +5 -0
- package/content/spells/high/calculation-of-the-evoked-servitor.yaml +5 -0
- package/content/spells/high/calculation-of-the-phantasmal-eidolon.yaml +5 -0
- package/content/spells/high/casting-forth-the-inner-eye.yaml +5 -0
- package/content/spells/high/cognitive-supersession-of-the-inferior-orders.yaml +5 -0
- package/content/spells/high/conjunct-the-vital-viscera.yaml +5 -0
- package/content/spells/high/conjunction-of-the-inexorable-step.yaml +5 -0
- package/content/spells/high/contingent-excision-of-arcana.yaml +5 -0
- package/content/spells/high/coruscating-coffin.yaml +5 -0
- package/content/spells/high/damnation-of-the-sense.yaml +5 -0
- package/content/spells/high/dazzling-prismatic-hemicycle.yaml +5 -0
- package/content/spells/high/decree-of-ligneous-dissolution.yaml +5 -0
- package/content/spells/high/decree-of-lithic-dissolution.yaml +5 -0
- package/content/spells/high/deluge-of-hell.yaml +5 -0
- package/content/spells/high/disjunctive-temporal-reversion.yaml +5 -0
- package/content/spells/high/earth-as-clay.yaml +5 -0
- package/content/spells/high/evert-the-inwardness.yaml +5 -0
- package/content/spells/high/excellent-transpicuous-transformation.yaml +5 -0
- package/content/spells/high/exhalation-of-congelating-cold.yaml +5 -0
- package/content/spells/high/extirpate-arcana.yaml +5 -0
- package/content/spells/high/foresightful-apprehension.yaml +5 -0
- package/content/spells/high/glass-chimes-of-the-bamboo-terrace.yaml +5 -0
- package/content/spells/high/grinding-geas.yaml +5 -0
- package/content/spells/high/howl-of-light.yaml +5 -0
- package/content/spells/high/imperceptible-cerebral-divulgence.yaml +5 -0
- package/content/spells/high/ineluctable-shackles-of-volition.yaml +5 -0
- package/content/spells/high/inexorable-imputation.yaml +5 -0
- package/content/spells/high/invocation-of-the-invincible-citadel.yaml +5 -0
- package/content/spells/high/jade-palanquin-of-the-faceless-god.yaml +5 -0
- package/content/spells/high/long-amber-moment.yaml +5 -0
- package/content/spells/high/mantle-of-disjecting-dissection.yaml +5 -0
- package/content/spells/high/obnubilation-of-the-will.yaml +5 -0
- package/content/spells/high/ochre-sigil-of-juxtaposition.yaml +5 -0
- package/content/spells/high/open-the-high-road.yaml +5 -0
- package/content/spells/high/phantasmal-mimesis.yaml +5 -0
- package/content/spells/high/phobic-storm.yaml +5 -0
- package/content/spells/high/pierce-the-pallid-gate.yaml +5 -0
- package/content/spells/high/prudentially-transient-abnegation-of-life.yaml +5 -0
- package/content/spells/high/resounding-temporal-echo.yaml +5 -0
- package/content/spells/high/scorn-the-fetters-of-earth.yaml +5 -0
- package/content/spells/high/sigil-of-aeolian-auctoritas.yaml +5 -0
- package/content/spells/high/torment-of-tumefaction.yaml +5 -0
- package/content/spells/high/touch-of-elucidating-intangibility.yaml +5 -0
- package/content/spells/high/vallation-of-specified-exclusion.yaml +5 -0
- package/content/spells/high/velocitous-imbuement.yaml +5 -0
- package/content/spells/high/verdant-vallation.yaml +5 -0
- package/content/spells/high/visitation-of-the-clement-clime.yaml +5 -0
- package/content/spells/high/wardpact-invocation.yaml +5 -0
- package/content/spells/high/wind-of-the-final-repose.yaml +5 -0
- package/content/spells/necromancer/augment-mortal-vitality.yaml +5 -0
- package/content/spells/necromancer/boneshaper.yaml +5 -0
- package/content/spells/necromancer/call-of-the-tomb.yaml +5 -0
- package/content/spells/necromancer/command-the-dead.yaml +5 -0
- package/content/spells/necromancer/compel-flesh.yaml +5 -0
- package/content/spells/necromancer/enfeebling-wave.yaml +5 -0
- package/content/spells/necromancer/everlasting.yaml +5 -0
- package/content/spells/necromancer/festering-curse.yaml +5 -0
- package/content/spells/necromancer/final-death.yaml +5 -0
- package/content/spells/necromancer/forgetting-the-grave.yaml +5 -0
- package/content/spells/necromancer/merge-souls.yaml +5 -0
- package/content/spells/necromancer/query-the-skull.yaml +5 -0
- package/content/spells/necromancer/raise-corpse.yaml +5 -0
- package/content/spells/necromancer/raise-grave-knight.yaml +5 -0
- package/content/spells/necromancer/smite-the-dead.yaml +5 -0
- package/content/spells/necromancer/terrible-liveliness.yaml +5 -0
- package/content/weapons/blackjack.yaml +8 -0
- package/content/weapons/claw-blades.yaml +10 -0
- package/content/weapons/club.yaml +10 -0
- package/content/weapons/crossbow.yaml +10 -0
- package/content/weapons/dagger.yaml +12 -0
- package/content/weapons/great-club.yaml +11 -0
- package/content/weapons/great-hammer.yaml +11 -0
- package/content/weapons/great-hurlant.yaml +11 -0
- package/content/weapons/great-sword.yaml +11 -0
- package/content/weapons/halberd.yaml +11 -0
- package/content/weapons/hand-axe.yaml +12 -0
- package/content/weapons/hand-hurlant.yaml +10 -0
- package/content/weapons/heavy-spear.yaml +11 -0
- package/content/weapons/large-bow.yaml +11 -0
- package/content/weapons/large-shield-bash.yaml +11 -0
- package/content/weapons/light-spear.yaml +12 -0
- package/content/weapons/long-hurlant.yaml +11 -0
- package/content/weapons/long-sword.yaml +9 -0
- package/content/weapons/mace.yaml +10 -0
- package/content/weapons/pike.yaml +11 -0
- package/content/weapons/short-sword.yaml +9 -0
- package/content/weapons/small-bow.yaml +10 -0
- package/content/weapons/small-shield-bash.yaml +9 -0
- package/content/weapons/staff.yaml +10 -0
- package/content/weapons/stiletto.yaml +10 -0
- package/content/weapons/throwing-blade.yaml +11 -0
- package/content/weapons/unarmed.yaml +9 -0
- package/content/weapons/war-axe.yaml +11 -0
- package/content/weapons/war-hammer.yaml +9 -0
- package/dist/i18n/en.d.ts +3 -0
- package/dist/i18n/en.js +2 -0
- package/dist/i18n/en.json +1171 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.js +2 -0
- package/dist/release.json +35216 -0
- package/i18n/en/content.yaml +474 -0
- package/i18n/en.yaml +696 -0
- package/pack.yaml +12 -0
- package/package.json +58 -3
- package/rules/advancement.yaml +188 -0
- package/rules/attributes.yaml +30 -0
- package/rules/backgrounds.yaml +59 -0
- package/rules/classes.yaml +76 -0
- package/rules/combat.yaml +241 -0
- package/rules/creation-steps.yaml +258 -0
- package/rules/creation.yaml +448 -0
- package/rules/display.yaml +597 -0
- package/rules/equipment.yaml +45 -0
- package/rules/foci.yaml +57 -0
- package/rules/health.yaml +176 -0
- package/rules/magic.yaml +484 -0
- package/rules/saves.yaml +62 -0
- package/rules/skills.yaml +93 -0
- package/rules/tags.yaml +86 -0
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
fields:
|
|
2
|
+
# The rolled maximum: each level's hit dice plus the per-die bonus and Constitution modifier.
|
|
3
|
+
hp.rolled: { type: integer, input: true, default: 1, min: 1 }
|
|
4
|
+
# Die Hard adds 2 a level on top.
|
|
5
|
+
hp.max: { type: integer, formula: hp.rolled, min: 1 }
|
|
6
|
+
hp.current: { type: integer, input: true, default: 1, min: 0, max: hp.max }
|
|
7
|
+
|
|
8
|
+
strain.max: { type: integer, formula: attributes.con.score }
|
|
9
|
+
strain.current: { type: integer, input: true, default: 0, min: 0, max: strain.max }
|
|
10
|
+
|
|
11
|
+
conditions.frail: { type: boolean, input: true, default: false }
|
|
12
|
+
conditions.mortallyWounded: { type: boolean, input: true, default: false }
|
|
13
|
+
|
|
14
|
+
followUps:
|
|
15
|
+
# At zero hit points a hero is mortally wounded (or dies, if Frail).
|
|
16
|
+
- id: downed
|
|
17
|
+
becomes: hp.current == 0 && !conditions.mortallyWounded
|
|
18
|
+
required: true
|
|
19
|
+
action: fall
|
|
20
|
+
|
|
21
|
+
actions:
|
|
22
|
+
- id: fall
|
|
23
|
+
tags: [health]
|
|
24
|
+
available: hp.current == 0 && !conditions.mortallyWounded
|
|
25
|
+
results: [mortally-wounded, dead]
|
|
26
|
+
steps:
|
|
27
|
+
- id: down
|
|
28
|
+
kind: changes
|
|
29
|
+
when: '!conditions.frail'
|
|
30
|
+
changes:
|
|
31
|
+
- { type: set, field: conditions.mortallyWounded, value: true }
|
|
32
|
+
- id: result
|
|
33
|
+
kind: outcome
|
|
34
|
+
result: "conditions.frail ? 'dead' : 'mortally-wounded'"
|
|
35
|
+
|
|
36
|
+
# Stabilized: back with 1 hit point after ten minutes, and Frail.
|
|
37
|
+
- id: stabilize
|
|
38
|
+
tags: [health]
|
|
39
|
+
available: conditions.mortallyWounded
|
|
40
|
+
results: [stabilized]
|
|
41
|
+
steps:
|
|
42
|
+
- id: stable
|
|
43
|
+
kind: changes
|
|
44
|
+
changes:
|
|
45
|
+
- { type: set, field: conditions.mortallyWounded, value: false }
|
|
46
|
+
- { type: set, field: conditions.frail, value: true }
|
|
47
|
+
- { type: set, field: hp.current, value: 1 }
|
|
48
|
+
- id: result
|
|
49
|
+
kind: outcome
|
|
50
|
+
result: "'stabilized'"
|
|
51
|
+
|
|
52
|
+
- id: take-damage
|
|
53
|
+
tags: [health]
|
|
54
|
+
params:
|
|
55
|
+
amount: { type: integer, min: 0 }
|
|
56
|
+
results: [taken]
|
|
57
|
+
steps:
|
|
58
|
+
- id: deal
|
|
59
|
+
kind: changes
|
|
60
|
+
changes:
|
|
61
|
+
- {
|
|
62
|
+
type: adjust,
|
|
63
|
+
when: params.amount > 0,
|
|
64
|
+
field: hp.current,
|
|
65
|
+
by: -params.amount,
|
|
66
|
+
tags: [damage],
|
|
67
|
+
}
|
|
68
|
+
- id: result
|
|
69
|
+
kind: outcome
|
|
70
|
+
result: "'taken'"
|
|
71
|
+
|
|
72
|
+
# Magical healing also ends Mortally Wounded and Frail; strain is the healer's to add.
|
|
73
|
+
- id: heal
|
|
74
|
+
tags: [health]
|
|
75
|
+
params:
|
|
76
|
+
amount: { type: integer, min: 0 }
|
|
77
|
+
magical: { type: boolean, default: false }
|
|
78
|
+
strain: { type: integer, default: 0, min: 0 }
|
|
79
|
+
results: [healed, too-strained]
|
|
80
|
+
steps:
|
|
81
|
+
- id: strained
|
|
82
|
+
kind: outcome
|
|
83
|
+
when: params.strain > 0 && strain.current + params.strain > strain.max
|
|
84
|
+
result: "'too-strained'"
|
|
85
|
+
- id: restore
|
|
86
|
+
kind: changes
|
|
87
|
+
changes:
|
|
88
|
+
- {
|
|
89
|
+
type: adjust,
|
|
90
|
+
when: params.amount > 0,
|
|
91
|
+
field: hp.current,
|
|
92
|
+
by: params.amount,
|
|
93
|
+
tags: [healing],
|
|
94
|
+
}
|
|
95
|
+
- { type: adjust, when: params.strain > 0, field: strain.current, by: params.strain }
|
|
96
|
+
- { type: set, when: params.magical, field: conditions.mortallyWounded, value: false }
|
|
97
|
+
- { type: set, when: params.magical, field: conditions.frail, value: false }
|
|
98
|
+
- id: result
|
|
99
|
+
kind: outcome
|
|
100
|
+
result: "'healed'"
|
|
101
|
+
|
|
102
|
+
# First aid: 1d6 plus the healer's Heal skill (-1 without it), 1 System Strain each time.
|
|
103
|
+
- id: first-aid
|
|
104
|
+
tags: [health]
|
|
105
|
+
available: strain.current < strain.max && hp.current < hp.max
|
|
106
|
+
params:
|
|
107
|
+
healerSkill: { type: integer, default: -1, min: -1, max: 4 }
|
|
108
|
+
results: [healed]
|
|
109
|
+
steps:
|
|
110
|
+
- id: roll
|
|
111
|
+
kind: roll
|
|
112
|
+
tags: [healing]
|
|
113
|
+
parts:
|
|
114
|
+
- dice: 1d6
|
|
115
|
+
- value: params.healerSkill
|
|
116
|
+
- id: restore
|
|
117
|
+
kind: changes
|
|
118
|
+
changes:
|
|
119
|
+
- { type: adjust, field: hp.current, by: 'max(0, steps.roll.total)', tags: [healing] }
|
|
120
|
+
- { type: adjust, field: strain.current, by: 1 }
|
|
121
|
+
- id: result
|
|
122
|
+
kind: outcome
|
|
123
|
+
result: "'healed'"
|
|
124
|
+
data:
|
|
125
|
+
healed: max(0, steps.roll.total)
|
|
126
|
+
|
|
127
|
+
# A good night's rest: level in hit points and one System Strain back unless Frail; spells
|
|
128
|
+
# and Effort committed for the day or the scene return.
|
|
129
|
+
- id: rest
|
|
130
|
+
tags: [rest]
|
|
131
|
+
results: [rested]
|
|
132
|
+
steps:
|
|
133
|
+
- id: recover
|
|
134
|
+
kind: changes
|
|
135
|
+
changes:
|
|
136
|
+
- {
|
|
137
|
+
type: adjust,
|
|
138
|
+
when: '!conditions.frail',
|
|
139
|
+
field: hp.current,
|
|
140
|
+
by: level,
|
|
141
|
+
tags: [healing],
|
|
142
|
+
}
|
|
143
|
+
- {
|
|
144
|
+
type: adjust,
|
|
145
|
+
when: '!conditions.frail && strain.current > 0',
|
|
146
|
+
field: strain.current,
|
|
147
|
+
by: -1,
|
|
148
|
+
}
|
|
149
|
+
- { type: set, field: spells.castsUsed, value: 0 }
|
|
150
|
+
- { type: set, field: spells.pointsUsed, value: 0 }
|
|
151
|
+
- type: set
|
|
152
|
+
forEach: keysOf('effortTrad')
|
|
153
|
+
field: { formula: "'effort.' + x + '.day'" }
|
|
154
|
+
value: 0
|
|
155
|
+
- type: set
|
|
156
|
+
forEach: keysOf('effortTrad')
|
|
157
|
+
field: { formula: "'effort.' + x + '.scene'" }
|
|
158
|
+
value: 0
|
|
159
|
+
- id: result
|
|
160
|
+
kind: outcome
|
|
161
|
+
result: "'rested'"
|
|
162
|
+
|
|
163
|
+
- id: end-scene
|
|
164
|
+
tags: [rest]
|
|
165
|
+
results: [ended]
|
|
166
|
+
steps:
|
|
167
|
+
- id: reclaim
|
|
168
|
+
kind: changes
|
|
169
|
+
changes:
|
|
170
|
+
- type: set
|
|
171
|
+
forEach: keysOf('effortTrad')
|
|
172
|
+
field: { formula: "'effort.' + x + '.scene'" }
|
|
173
|
+
value: 0
|
|
174
|
+
- id: result
|
|
175
|
+
kind: outcome
|
|
176
|
+
result: "'ended'"
|
package/rules/magic.yaml
ADDED
|
@@ -0,0 +1,484 @@
|
|
|
1
|
+
families:
|
|
2
|
+
trad:
|
|
3
|
+
[
|
|
4
|
+
highmage,
|
|
5
|
+
elementalist,
|
|
6
|
+
necromancer,
|
|
7
|
+
healer,
|
|
8
|
+
vowed,
|
|
9
|
+
accursed,
|
|
10
|
+
bard,
|
|
11
|
+
beastmaster,
|
|
12
|
+
bloodpriest,
|
|
13
|
+
duelist,
|
|
14
|
+
mageslayer,
|
|
15
|
+
skinshifter,
|
|
16
|
+
thoughtnoble,
|
|
17
|
+
invoker,
|
|
18
|
+
wise,
|
|
19
|
+
]
|
|
20
|
+
effortTrad:
|
|
21
|
+
[
|
|
22
|
+
highmage,
|
|
23
|
+
elementalist,
|
|
24
|
+
necromancer,
|
|
25
|
+
healer,
|
|
26
|
+
vowed,
|
|
27
|
+
accursed,
|
|
28
|
+
bard,
|
|
29
|
+
beastmaster,
|
|
30
|
+
bloodpriest,
|
|
31
|
+
duelist,
|
|
32
|
+
mageslayer,
|
|
33
|
+
skinshifter,
|
|
34
|
+
thoughtnoble,
|
|
35
|
+
]
|
|
36
|
+
artTrad:
|
|
37
|
+
[
|
|
38
|
+
highmage,
|
|
39
|
+
elementalist,
|
|
40
|
+
necromancer,
|
|
41
|
+
healer,
|
|
42
|
+
vowed,
|
|
43
|
+
accursed,
|
|
44
|
+
bard,
|
|
45
|
+
beastmaster,
|
|
46
|
+
bloodpriest,
|
|
47
|
+
duelist,
|
|
48
|
+
mageslayer,
|
|
49
|
+
skinshifter,
|
|
50
|
+
thoughtnoble,
|
|
51
|
+
wise,
|
|
52
|
+
]
|
|
53
|
+
effortSpan: [scene, day, ongoing]
|
|
54
|
+
|
|
55
|
+
fields:
|
|
56
|
+
# 2 for a full Mage of the tradition, 1 for a partial one, 0 otherwise.
|
|
57
|
+
'tradition.{trad}.tier': { type: integer, formula: 0, tags: [tradition-tier] }
|
|
58
|
+
|
|
59
|
+
# How the character casts: a full caster, one partial caster, two partial casters, an
|
|
60
|
+
# Invoker (full or partial), or none.
|
|
61
|
+
spells.mode:
|
|
62
|
+
type: enum
|
|
63
|
+
values: [none, full, partial, dual, invoker, partial-invoker]
|
|
64
|
+
formula: >-
|
|
65
|
+
tradition.invoker.tier == 2 ? 'invoker'
|
|
66
|
+
: tradition.invoker.tier == 1 ? 'partial-invoker'
|
|
67
|
+
: tradition.highmage.tier == 2 || tradition.elementalist.tier == 2
|
|
68
|
+
|| tradition.necromancer.tier == 2 ? 'full'
|
|
69
|
+
: (tradition.highmage.tier == 1 ? 1 : 0) + (tradition.elementalist.tier == 1 ? 1 : 0)
|
|
70
|
+
+ (tradition.necromancer.tier == 1 ? 1 : 0) >= 2 ? 'dual'
|
|
71
|
+
: tradition.highmage.tier == 1 || tradition.elementalist.tier == 1
|
|
72
|
+
|| tradition.necromancer.tier == 1 ? 'partial'
|
|
73
|
+
: 'none'
|
|
74
|
+
spells.maxLevel:
|
|
75
|
+
type: integer
|
|
76
|
+
formula: >-
|
|
77
|
+
spells.mode == 'full' || spells.mode == 'invoker' ? [1, 1, 2, 2, 3, 3, 4, 4, 5, 5][level - 1]
|
|
78
|
+
: spells.mode == 'partial' || spells.mode == 'partial-invoker'
|
|
79
|
+
? [1, 1, 1, 1, 2, 2, 2, 2, 3, 3][level - 1]
|
|
80
|
+
: spells.mode == 'dual' ? [1, 1, 1, 2, 2, 2, 3, 3, 3, 4][level - 1]
|
|
81
|
+
: 0
|
|
82
|
+
# Spells cast a day (an Invoker spends spell points instead).
|
|
83
|
+
spells.castsPerDay:
|
|
84
|
+
type: integer
|
|
85
|
+
formula: >-
|
|
86
|
+
spells.mode == 'full' ? [1, 1, 2, 2, 3, 3, 4, 4, 5, 6][level - 1]
|
|
87
|
+
: spells.mode == 'partial' ? [1, 1, 1, 2, 2, 3, 3, 3, 4, 4][level - 1]
|
|
88
|
+
: spells.mode == 'dual' ? [1, 1, 2, 2, 2, 3, 3, 4, 4, 5][level - 1]
|
|
89
|
+
: 0
|
|
90
|
+
spells.preparedMax:
|
|
91
|
+
type: integer
|
|
92
|
+
formula: >-
|
|
93
|
+
spells.mode == 'full' ? [3, 3, 4, 5, 6, 7, 8, 9, 10, 12][level - 1]
|
|
94
|
+
: spells.mode == 'partial' ? [2, 3, 3, 4, 5, 6, 7, 7, 8, 9][level - 1]
|
|
95
|
+
: spells.mode == 'dual' ? [3, 4, 5, 6, 8, 9, 10, 12, 13, 15][level - 1]
|
|
96
|
+
: spells.mode == 'invoker'
|
|
97
|
+
? max(0, [2, 3, 4, 4, 5, 6, 7, 7, 8, 9][level - 1] + attributes.int.mod)
|
|
98
|
+
: spells.mode == 'partial-invoker'
|
|
99
|
+
? max(0, [1, 3, 3, 4, 4, 5, 5, 6, 6, 7][level - 1] + attributes.int.mod)
|
|
100
|
+
: 0
|
|
101
|
+
spells.castsUsed: { type: integer, input: true, default: 0, min: 0 }
|
|
102
|
+
spells.castsLeft: { type: integer, formula: 'max(0, spells.castsPerDay - spells.castsUsed)' }
|
|
103
|
+
# An Invoker's spell points: a cast spends the spell's level.
|
|
104
|
+
spells.points:
|
|
105
|
+
type: integer
|
|
106
|
+
formula: >-
|
|
107
|
+
spells.mode == 'invoker' ? max(0, [1, 3, 4, 5, 6, 7, 8, 9, 10, 11][level - 1] + attributes.int.mod)
|
|
108
|
+
: spells.mode == 'partial-invoker'
|
|
109
|
+
? max(0, [1, 1, 2, 2, 3, 3, 4, 4, 5, 6][level - 1] + attributes.int.mod)
|
|
110
|
+
: 0
|
|
111
|
+
spells.pointsUsed: { type: integer, input: true, default: 0, min: 0 }
|
|
112
|
+
spells.pointsLeft: { type: integer, formula: 'max(0, spells.points - spells.pointsUsed)' }
|
|
113
|
+
spells.prepared:
|
|
114
|
+
type: integer
|
|
115
|
+
formula: "countCopies(copy.type == 'spell' && copy.state.prepared)"
|
|
116
|
+
# Spells a new character knows: four for a full caster or two partial casters, two for one.
|
|
117
|
+
spells.starting:
|
|
118
|
+
type: integer
|
|
119
|
+
formula: >-
|
|
120
|
+
spells.mode == 'full' || spells.mode == 'dual' || spells.mode == 'invoker' ? 4
|
|
121
|
+
: spells.mode == 'partial' || spells.mode == 'partial-invoker' ? 2 : 0
|
|
122
|
+
# An Invoker's Traditional Education: the tradition whose spells and first-level arts they
|
|
123
|
+
# gain, or ''.
|
|
124
|
+
invoker.education: { type: string, formula: "''" }
|
|
125
|
+
|
|
126
|
+
# Effort: each tradition has its own pool. A full class's is 1 plus a skill and an attribute
|
|
127
|
+
# modifier; a partial one has 1 less; the partial-only classes give theirs whole. At least 1.
|
|
128
|
+
effort.highmage.max:
|
|
129
|
+
type: integer
|
|
130
|
+
formula: >-
|
|
131
|
+
tradition.highmage.tier == 0 ? (invoker.education == 'highmage' ? max(1, max(0, skills.magic)) : 0)
|
|
132
|
+
: max(1, 1 + max(0, skills.magic) + max(attributes.int.mod, attributes.cha.mod) - (tradition.highmage.tier == 1 ? 1 : 0))
|
|
133
|
+
effort.elementalist.max:
|
|
134
|
+
type: integer
|
|
135
|
+
formula: >-
|
|
136
|
+
tradition.elementalist.tier == 0 ? (invoker.education == 'elementalist' ? max(1, max(0, skills.magic)) : 0)
|
|
137
|
+
: max(1, 1 + max(0, skills.magic) + max(attributes.int.mod, attributes.cha.mod) - (tradition.elementalist.tier == 1 ? 1 : 0))
|
|
138
|
+
effort.necromancer.max:
|
|
139
|
+
type: integer
|
|
140
|
+
formula: >-
|
|
141
|
+
tradition.necromancer.tier == 0 ? (invoker.education == 'necromancer' ? max(1, max(0, skills.magic)) : 0)
|
|
142
|
+
: max(1, 1 + max(0, skills.magic) + max(attributes.int.mod, attributes.cha.mod) - (tradition.necromancer.tier == 1 ? 1 : 0))
|
|
143
|
+
effort.healer.max:
|
|
144
|
+
type: integer
|
|
145
|
+
formula: >-
|
|
146
|
+
tradition.healer.tier == 0 ? 0
|
|
147
|
+
: max(1, max(0, skills.heal) + max(attributes.int.mod, attributes.cha.mod))
|
|
148
|
+
effort.vowed.max:
|
|
149
|
+
type: integer
|
|
150
|
+
formula: >-
|
|
151
|
+
tradition.vowed.tier == 0 ? 0
|
|
152
|
+
: max(1, (vowed.skill == '' ? 0 : max(0, fieldOf('skills.{skill}', vowed.skill))) + attributes.bestMod)
|
|
153
|
+
effort.accursed.max:
|
|
154
|
+
type: integer
|
|
155
|
+
formula: >-
|
|
156
|
+
tradition.accursed.tier == 0 ? 0
|
|
157
|
+
: max(1, max(0, skills.magic) + max(attributes.int.mod, attributes.cha.mod))
|
|
158
|
+
effort.bard.max:
|
|
159
|
+
type: integer
|
|
160
|
+
formula: >-
|
|
161
|
+
tradition.bard.tier == 0 ? 0
|
|
162
|
+
: max(1, max(0, skills.perform) + attributes.cha.mod)
|
|
163
|
+
effort.beastmaster.max:
|
|
164
|
+
type: integer
|
|
165
|
+
formula: >-
|
|
166
|
+
tradition.beastmaster.tier == 0 ? 0
|
|
167
|
+
: max(1, max(0, skills.survive) + max(attributes.wis.mod, attributes.cha.mod))
|
|
168
|
+
effort.bloodpriest.max:
|
|
169
|
+
type: integer
|
|
170
|
+
formula: >-
|
|
171
|
+
tradition.bloodpriest.tier == 0 ? 0
|
|
172
|
+
: max(1, max(0, skills.pray) + max(attributes.wis.mod, attributes.cha.mod))
|
|
173
|
+
effort.duelist.max:
|
|
174
|
+
type: integer
|
|
175
|
+
formula: >-
|
|
176
|
+
tradition.duelist.tier == 0 ? 0
|
|
177
|
+
: max(1, max(0, skills.stab) + max(attributes.dex.mod, attributes.int.mod))
|
|
178
|
+
effort.mageslayer.max:
|
|
179
|
+
type: integer
|
|
180
|
+
formula: >-
|
|
181
|
+
tradition.mageslayer.tier == 0 ? 0
|
|
182
|
+
: max(1, max(0, skills.magic) + max(attributes.int.mod, attributes.con.mod))
|
|
183
|
+
effort.skinshifter.max:
|
|
184
|
+
type: integer
|
|
185
|
+
formula: >-
|
|
186
|
+
tradition.skinshifter.tier == 0 ? 0
|
|
187
|
+
: max(1, max(0, skills.survive) + max(attributes.con.mod, attributes.cha.mod))
|
|
188
|
+
effort.thoughtnoble.max:
|
|
189
|
+
type: integer
|
|
190
|
+
formula: >-
|
|
191
|
+
tradition.thoughtnoble.tier == 0 ? 0
|
|
192
|
+
: max(1, max(0, skills.notice) + max(attributes.int.mod, attributes.wis.mod))
|
|
193
|
+
# Effort committed for the scene, for the day, and for as long as a power lasts.
|
|
194
|
+
'effort.{effortTrad}.{effortSpan}': { type: integer, input: true, default: 0, min: 0 }
|
|
195
|
+
'effort.{effortTrad}.free':
|
|
196
|
+
type: integer
|
|
197
|
+
formula: >-
|
|
198
|
+
max(0, effort.{effortTrad}.max - effort.{effortTrad}.scene - effort.{effortTrad}.day
|
|
199
|
+
- effort.{effortTrad}.ongoing)
|
|
200
|
+
|
|
201
|
+
# The skill a Vowed's order teaches, and a Wise's, as a family key of `skill`.
|
|
202
|
+
vowed.skill: { type: string, formula: "''" }
|
|
203
|
+
wise.skill: { type: string, formula: "''" }
|
|
204
|
+
# A Wise's art progression: four arts by level 4 for a priest, witch or seer, fewer for an
|
|
205
|
+
# esoteric one.
|
|
206
|
+
wise.path: { type: enum, values: [none, priest, witch, seer, esoteric], formula: "'none'" }
|
|
207
|
+
|
|
208
|
+
# Arts picked from each tradition's list; the ones a tradition grants don't count.
|
|
209
|
+
arts.highmage.allowed:
|
|
210
|
+
type: integer
|
|
211
|
+
formula: >-
|
|
212
|
+
tradition.highmage.tier == 2 ? [2, 3, 3, 4, 4, 5, 5, 6, 6, 7][level - 1]
|
|
213
|
+
: tradition.highmage.tier == 1 ? [1, 2, 3, 3, 3, 4, 4, 4, 5, 5][level - 1]
|
|
214
|
+
: invoker.education == 'highmage' ? (tradition.invoker.tier == 2 ? 2 : 1) : 0
|
|
215
|
+
arts.elementalist.allowed:
|
|
216
|
+
type: integer
|
|
217
|
+
formula: >-
|
|
218
|
+
tradition.elementalist.tier == 2 ? [1, 2, 2, 3, 3, 4, 4, 5, 5, 6][level - 1]
|
|
219
|
+
: tradition.elementalist.tier == 1 ? [1, 1, 2, 2, 2, 3, 3, 3, 4, 4][level - 1]
|
|
220
|
+
: invoker.education == 'elementalist' ? (tradition.invoker.tier == 2 ? 1 : 1) : 0
|
|
221
|
+
arts.necromancer.allowed:
|
|
222
|
+
type: integer
|
|
223
|
+
formula: >-
|
|
224
|
+
tradition.necromancer.tier == 2 ? [2, 3, 3, 4, 4, 5, 5, 6, 6, 7][level - 1]
|
|
225
|
+
: tradition.necromancer.tier == 1 ? [1, 2, 3, 3, 3, 4, 4, 4, 5, 5][level - 1]
|
|
226
|
+
: invoker.education == 'necromancer' ? (tradition.invoker.tier == 2 ? 2 : 1) : 0
|
|
227
|
+
arts.healer.allowed:
|
|
228
|
+
type: integer
|
|
229
|
+
formula: >-
|
|
230
|
+
tradition.healer.tier > 0 ? [1, 2, 2, 3, 4, 5, 5, 6, 6, 7][level - 1] : 0
|
|
231
|
+
arts.vowed.allowed:
|
|
232
|
+
type: integer
|
|
233
|
+
formula: >-
|
|
234
|
+
tradition.vowed.tier > 0 ? [1, 2, 2, 3, 4, 5, 5, 6, 6, 7][level - 1] : 0
|
|
235
|
+
arts.accursed.allowed:
|
|
236
|
+
type: integer
|
|
237
|
+
formula: >-
|
|
238
|
+
tradition.accursed.tier > 0 ? [1, 1, 1, 1, 1, 1, 1, 1, 1, 1][level - 1] : 0
|
|
239
|
+
arts.bard.allowed:
|
|
240
|
+
type: integer
|
|
241
|
+
formula: >-
|
|
242
|
+
tradition.bard.tier > 0 ? [1, 2, 2, 3, 3, 4, 4, 5, 5, 6][level - 1] : 0
|
|
243
|
+
arts.beastmaster.allowed:
|
|
244
|
+
type: integer
|
|
245
|
+
formula: >-
|
|
246
|
+
tradition.beastmaster.tier > 0 ? [1, 2, 2, 3, 4, 5, 5, 6, 6, 7][level - 1] : 0
|
|
247
|
+
arts.bloodpriest.allowed:
|
|
248
|
+
type: integer
|
|
249
|
+
formula: >-
|
|
250
|
+
tradition.bloodpriest.tier > 0 ? [2, 3, 3, 4, 5, 6, 6, 7, 7, 8][level - 1] : 0
|
|
251
|
+
arts.duelist.allowed:
|
|
252
|
+
type: integer
|
|
253
|
+
formula: >-
|
|
254
|
+
tradition.duelist.tier > 0 ? [1, 2, 2, 3, 4, 5, 5, 6, 6, 7][level - 1] : 0
|
|
255
|
+
arts.mageslayer.allowed:
|
|
256
|
+
type: integer
|
|
257
|
+
formula: >-
|
|
258
|
+
tradition.mageslayer.tier > 0 ? [0, 0, 0, 0, 0, 0, 0, 0, 0, 0][level - 1] : 0
|
|
259
|
+
arts.skinshifter.allowed:
|
|
260
|
+
type: integer
|
|
261
|
+
formula: >-
|
|
262
|
+
tradition.skinshifter.tier > 0 ? [1, 2, 2, 3, 4, 5, 5, 6, 6, 7][level - 1] : 0
|
|
263
|
+
arts.thoughtnoble.allowed:
|
|
264
|
+
type: integer
|
|
265
|
+
formula: >-
|
|
266
|
+
tradition.thoughtnoble.tier > 0 ? [1, 2, 3, 4, 5, 6, 7, 8, 9, 10][level - 1] : 0
|
|
267
|
+
arts.wise.allowed:
|
|
268
|
+
type: integer
|
|
269
|
+
formula: >-
|
|
270
|
+
tradition.wise.tier == 0 ? 0
|
|
271
|
+
: wise.path == 'esoteric' ? [1, 1, 2, 2, 3, 3, 4, 4, 5, 5][level - 1]
|
|
272
|
+
: [1, 2, 2, 3, 4, 5, 5, 6, 6, 7][level - 1]
|
|
273
|
+
'arts.{artTrad}.taken':
|
|
274
|
+
type: integer
|
|
275
|
+
formula: "countCopies(copy.type == 'art' && copy.fields.tradition == '{artTrad}')"
|
|
276
|
+
'arts.{artTrad}.owed':
|
|
277
|
+
{ type: integer, formula: 'max(0, arts.{artTrad}.allowed - arts.{artTrad}.taken)' }
|
|
278
|
+
arts.owed:
|
|
279
|
+
type: integer
|
|
280
|
+
formula: >-
|
|
281
|
+
arts.highmage.owed
|
|
282
|
+
+ arts.elementalist.owed
|
|
283
|
+
+ arts.necromancer.owed
|
|
284
|
+
+ arts.healer.owed
|
|
285
|
+
+ arts.vowed.owed
|
|
286
|
+
+ arts.accursed.owed
|
|
287
|
+
+ arts.bard.owed
|
|
288
|
+
+ arts.beastmaster.owed
|
|
289
|
+
+ arts.bloodpriest.owed
|
|
290
|
+
+ arts.duelist.owed
|
|
291
|
+
+ arts.mageslayer.owed
|
|
292
|
+
+ arts.skinshifter.owed
|
|
293
|
+
+ arts.thoughtnoble.owed
|
|
294
|
+
+ arts.wise.owed
|
|
295
|
+
|
|
296
|
+
# Armored Magic's level, and whether worn armor or a shield stops spells and arts.
|
|
297
|
+
magic.armoredLevel: { type: integer, formula: 0 }
|
|
298
|
+
magic.hindered:
|
|
299
|
+
type: boolean
|
|
300
|
+
formula: >-
|
|
301
|
+
(armor.wornEnc >= 0 && magic.armoredLevel < 2
|
|
302
|
+
&& !(magic.armoredLevel == 1 && armor.wornEnc <= 2))
|
|
303
|
+
|| (armor.shield && magic.armoredLevel < 1)
|
|
304
|
+
# Duelist arts: not in medium or heavy armor or with a large shield.
|
|
305
|
+
duelist.hindered:
|
|
306
|
+
type: boolean
|
|
307
|
+
formula: armor.wornHeavy || (armor.shield && armor.shieldAc >= 14)
|
|
308
|
+
|
|
309
|
+
contentTypes:
|
|
310
|
+
spell:
|
|
311
|
+
fields:
|
|
312
|
+
level: { type: integer, required: true, min: 1, max: 5 }
|
|
313
|
+
list: { type: enum, values: [high, elementalist, necromancer], required: true }
|
|
314
|
+
state:
|
|
315
|
+
prepared: { type: boolean, default: false }
|
|
316
|
+
actions:
|
|
317
|
+
- use: cast-spell
|
|
318
|
+
|
|
319
|
+
art:
|
|
320
|
+
fields:
|
|
321
|
+
tradition:
|
|
322
|
+
type: enum
|
|
323
|
+
values:
|
|
324
|
+
[
|
|
325
|
+
highmage,
|
|
326
|
+
elementalist,
|
|
327
|
+
necromancer,
|
|
328
|
+
healer,
|
|
329
|
+
vowed,
|
|
330
|
+
accursed,
|
|
331
|
+
bard,
|
|
332
|
+
beastmaster,
|
|
333
|
+
bloodpriest,
|
|
334
|
+
duelist,
|
|
335
|
+
mageslayer,
|
|
336
|
+
skinshifter,
|
|
337
|
+
thoughtnoble,
|
|
338
|
+
wise,
|
|
339
|
+
]
|
|
340
|
+
required: true
|
|
341
|
+
# How long using it commits a point of Effort, if it does.
|
|
342
|
+
effort: { type: enum, values: [none, scene, day, ongoing], default: none }
|
|
343
|
+
minLevel: { type: integer, default: 1, min: 1, max: 10 }
|
|
344
|
+
# An art that must be held first.
|
|
345
|
+
requiresArt: { type: id, of: art }
|
|
346
|
+
state:
|
|
347
|
+
# An art whose Effort stays committed while it lasts.
|
|
348
|
+
active: { type: boolean, default: false }
|
|
349
|
+
actions:
|
|
350
|
+
- use: commit-effort
|
|
351
|
+
- use: release-effort
|
|
352
|
+
|
|
353
|
+
constraints:
|
|
354
|
+
- id: spells-prepared
|
|
355
|
+
check: spells.prepared <= spells.preparedMax
|
|
356
|
+
data: { limit: spells.preparedMax }
|
|
357
|
+
# A mage can learn only spells they can cast, from lists their traditions teach.
|
|
358
|
+
- id: spell-known
|
|
359
|
+
copies: { type: spell }
|
|
360
|
+
check: >-
|
|
361
|
+
item.level <= spells.maxLevel
|
|
362
|
+
&& (item.list == 'high' ? spells.mode != 'none'
|
|
363
|
+
: item.list == 'elementalist'
|
|
364
|
+
? tradition.elementalist.tier > 0 || invoker.education == 'elementalist'
|
|
365
|
+
: tradition.necromancer.tier > 0 || invoker.education == 'necromancer')
|
|
366
|
+
- id: art-tradition
|
|
367
|
+
copies: { type: art }
|
|
368
|
+
check: >-
|
|
369
|
+
fieldOf('tradition.{trad}.tier', item.tradition) > 0 || invoker.education == item.tradition
|
|
370
|
+
- id: arts-allowed
|
|
371
|
+
check: >-
|
|
372
|
+
arts.highmage.taken <= arts.highmage.allowed
|
|
373
|
+
&& arts.elementalist.taken <= arts.elementalist.allowed
|
|
374
|
+
&& arts.necromancer.taken <= arts.necromancer.allowed
|
|
375
|
+
&& arts.healer.taken <= arts.healer.allowed
|
|
376
|
+
&& arts.vowed.taken <= arts.vowed.allowed
|
|
377
|
+
&& arts.accursed.taken <= arts.accursed.allowed
|
|
378
|
+
&& arts.bard.taken <= arts.bard.allowed
|
|
379
|
+
&& arts.beastmaster.taken <= arts.beastmaster.allowed
|
|
380
|
+
&& arts.bloodpriest.taken <= arts.bloodpriest.allowed
|
|
381
|
+
&& arts.duelist.taken <= arts.duelist.allowed
|
|
382
|
+
&& arts.mageslayer.taken <= arts.mageslayer.allowed
|
|
383
|
+
&& arts.skinshifter.taken <= arts.skinshifter.allowed
|
|
384
|
+
&& arts.thoughtnoble.taken <= arts.thoughtnoble.allowed
|
|
385
|
+
&& arts.wise.taken <= arts.wise.allowed
|
|
386
|
+
- id: effort-committed
|
|
387
|
+
check: >-
|
|
388
|
+
effort.highmage.scene + effort.highmage.day + effort.highmage.ongoing <= effort.highmage.max
|
|
389
|
+
&& effort.elementalist.scene + effort.elementalist.day + effort.elementalist.ongoing <= effort.elementalist.max
|
|
390
|
+
&& effort.necromancer.scene + effort.necromancer.day + effort.necromancer.ongoing <= effort.necromancer.max
|
|
391
|
+
&& effort.healer.scene + effort.healer.day + effort.healer.ongoing <= effort.healer.max
|
|
392
|
+
&& effort.vowed.scene + effort.vowed.day + effort.vowed.ongoing <= effort.vowed.max
|
|
393
|
+
&& effort.accursed.scene + effort.accursed.day + effort.accursed.ongoing <= effort.accursed.max
|
|
394
|
+
&& effort.bard.scene + effort.bard.day + effort.bard.ongoing <= effort.bard.max
|
|
395
|
+
&& effort.beastmaster.scene + effort.beastmaster.day + effort.beastmaster.ongoing <= effort.beastmaster.max
|
|
396
|
+
&& effort.bloodpriest.scene + effort.bloodpriest.day + effort.bloodpriest.ongoing <= effort.bloodpriest.max
|
|
397
|
+
&& effort.duelist.scene + effort.duelist.day + effort.duelist.ongoing <= effort.duelist.max
|
|
398
|
+
&& effort.mageslayer.scene + effort.mageslayer.day + effort.mageslayer.ongoing <= effort.mageslayer.max
|
|
399
|
+
&& effort.skinshifter.scene + effort.skinshifter.day + effort.skinshifter.ongoing <= effort.skinshifter.max
|
|
400
|
+
&& effort.thoughtnoble.scene + effort.thoughtnoble.day + effort.thoughtnoble.ongoing <= effort.thoughtnoble.max
|
|
401
|
+
|
|
402
|
+
actions:
|
|
403
|
+
# Casting a prepared spell spends a casting, or an Invoker's spell points.
|
|
404
|
+
- id: cast-spell
|
|
405
|
+
tags: [spell]
|
|
406
|
+
available: >-
|
|
407
|
+
self.prepared && item.level <= spells.maxLevel && !magic.hindered
|
|
408
|
+
&& (spells.mode == 'invoker' || spells.mode == 'partial-invoker'
|
|
409
|
+
? spells.pointsLeft >= item.level : spells.castsLeft > 0)
|
|
410
|
+
results: [cast]
|
|
411
|
+
steps:
|
|
412
|
+
- id: spend
|
|
413
|
+
kind: changes
|
|
414
|
+
changes:
|
|
415
|
+
- type: adjust
|
|
416
|
+
when: "spells.mode == 'invoker' || spells.mode == 'partial-invoker'"
|
|
417
|
+
field: spells.pointsUsed
|
|
418
|
+
by: item.level
|
|
419
|
+
- type: adjust
|
|
420
|
+
when: "spells.mode != 'invoker' && spells.mode != 'partial-invoker'"
|
|
421
|
+
field: spells.castsUsed
|
|
422
|
+
by: 1
|
|
423
|
+
- id: result
|
|
424
|
+
kind: outcome
|
|
425
|
+
result: "'cast'"
|
|
426
|
+
data:
|
|
427
|
+
level: item.level
|
|
428
|
+
|
|
429
|
+
- id: commit-effort
|
|
430
|
+
tags: [art]
|
|
431
|
+
available: >-
|
|
432
|
+
item.effort != 'none' && level >= item.minLevel && !(item.effort == 'ongoing' && self.active)
|
|
433
|
+
&& item.tradition != 'wise' && fieldOf('effort.{effortTrad}.free', item.tradition) > 0
|
|
434
|
+
&& (item.tradition in ['highmage', 'elementalist', 'necromancer', 'vowed'] ? !magic.hindered
|
|
435
|
+
: item.tradition == 'duelist' ? !duelist.hindered : true)
|
|
436
|
+
results: [committed]
|
|
437
|
+
steps:
|
|
438
|
+
- id: commit
|
|
439
|
+
kind: changes
|
|
440
|
+
changes:
|
|
441
|
+
- type: adjust
|
|
442
|
+
field: { formula: "'effort.' + item.tradition + '.' + item.effort" }
|
|
443
|
+
by: 1
|
|
444
|
+
# A copy keeps its state; an art a class grants, its grant's saved state.
|
|
445
|
+
- type: setState
|
|
446
|
+
when: "item.effort == 'ongoing' && !('granted' in item.tags)"
|
|
447
|
+
entry: self
|
|
448
|
+
key: active
|
|
449
|
+
value: true
|
|
450
|
+
- type: setState
|
|
451
|
+
when: "item.effort == 'ongoing' && 'granted' in item.tags"
|
|
452
|
+
grant: self
|
|
453
|
+
key: active
|
|
454
|
+
value: true
|
|
455
|
+
- id: result
|
|
456
|
+
kind: outcome
|
|
457
|
+
result: "'committed'"
|
|
458
|
+
|
|
459
|
+
# Reclaim the Effort an art keeps committed, ending it.
|
|
460
|
+
- id: release-effort
|
|
461
|
+
tags: [art]
|
|
462
|
+
available: "item.effort == 'ongoing' && self.active"
|
|
463
|
+
results: [released]
|
|
464
|
+
steps:
|
|
465
|
+
- id: release
|
|
466
|
+
kind: changes
|
|
467
|
+
changes:
|
|
468
|
+
- type: adjust
|
|
469
|
+
when: "fieldOf('effort.{effortTrad}.ongoing', item.tradition) > 0"
|
|
470
|
+
field: { formula: "'effort.' + item.tradition + '.ongoing'" }
|
|
471
|
+
by: -1
|
|
472
|
+
- type: setState
|
|
473
|
+
when: "!('granted' in item.tags)"
|
|
474
|
+
entry: self
|
|
475
|
+
key: active
|
|
476
|
+
value: false
|
|
477
|
+
- type: setState
|
|
478
|
+
when: "'granted' in item.tags"
|
|
479
|
+
grant: self
|
|
480
|
+
key: active
|
|
481
|
+
value: false
|
|
482
|
+
- id: result
|
|
483
|
+
kind: outcome
|
|
484
|
+
result: "'released'"
|