Skip to content

pf2e 0.10.12: downtime - #84

Merged
HarryCordewener merged 46 commits into
mainfrom
claude/project-thread-n23mr8
Nov 4, 2026
Merged

HarryCordewener merged 46 commits into
mainfrom
claude/project-thread-n23mr8

Conversation

@HarryCordewener

Copy link
Copy Markdown
Member

Downtime for the pf2e package, from Player Core's rules and Foundry's Earn Income and Craft macros.

  • Staff award downtime days with +pf2e/award <players>=7 days <reason>, a ledger of its own (PF2EDAYS<n>) beside money and experience. +pf2e/ledger days lists it.
  • +downtime/income <skill>=<task level>[,<days>]: Earn Income. Task level up to the character's level, DC by level, the Income Earned table per day, a critical failure ends the job after a day, Experienced Professional for Lores.
  • +downtime/craft <item>[=<count>], /work [<days>], /finish, /drop: Craft with the item level, Crafting rank (master from 9, legendary from 17), Alchemical/Magical/Snare Crafting and rarity checks; 2 setup days or 1 with the formula; half the Price paid on a success, a tenth ruined on a critical failure; each day of work takes the crafter's Income Earned off the rest. Consumables batch up to 4, ammunition up to 10. Finished items join the gear.
  • +downtime/learn <spell>: Learn a Spell, cost and DC by rank, skill by tradition, half cost on a critical success or critical failure, a failure waits for the next level. A prepared caster's learned spell does not count against the spellbook allowance; a spontaneous caster may choose an uncommon one it learned with +build/spell.
  • +check takes a Lore by name (+check sailing lore), and check output names it as Sailing Lore.
  • Help topic pf2e downtime; version 0.10.12.

Play-tested on a local server: awards and the days ledger; Earn Income at failure (Lore, 2 cp a day) and critical success (task level 1 trained, 3 sp a day); refusals for saves, untrained skills, task level above the character's, too few days; Craft refusals for batch size, Alchemical and Magical Crafting; a failed craft salvaging materials; a longsword started (5 sp materials, 2 sp a day at expert level 1), worked and finished into gear; arrows finished by paying the rest; Learn a Spell for a sorcerer (Fireball) and a wizard (Force Barrage, Fireball at half cost on a critical success, Ignition), with the spellbook count leaving the learned spells out; a failure blocking a retry at the same level.


Generated by Claude Code

claude added 30 commits November 2, 2026 22:17
- Note, RollTwice, AdjustDegreeOfSuccess and SubstituteRoll rules apply to +check and to every
  check, save, initiative, Strike and spell attack in an encounter: fortune and misfortune roll
  2d20 and cancel each other, a degree adjustment names the rule that made it, notes that fit the
  result follow the roll (GM-only ones go to the encounter's GM).
- `+check <statistic> with <name>` uses a roll substitution such as Assurance; AdjustModifier rules
  that suppress a modifier (Assurance's) apply, and AdjustModifier reads `selectors` too.
- RollOption rules apply in full: toggles with suboptions, alwaysActive, disabledIf, mergeable,
  predicates, domains other than all, injected options and counts. `+toggle` changes them on the
  sheet as ledger entries; `+enc/toggle` changes the encounter's copy only.
- An attack in an encounter is rolled with the attacker's rules, not the target's.
- Foundry's English strings for rule labels and notes come with the feed (lang/), read by
  +pf2e/update into a new data object, so notes and labels show in words.
- Help for +check, +toggle and +enc/toggle; pf2e-remaster 1.6.1 describes them.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01Rqqt7Vksxw4GuJpVWB78aJ
Strike damage now runs through a damage plan modelled on Foundry's
WeaponDamagePF2e: base dice, Strength, runes, trait dice (deadly,
fatal), trait modifiers (backstabber, kickback, tearing, venomous,
splash), FlatModifier damage with category and critical, DamageDice and
DamageAlteration rules with their predicates, and dice overrides. The
formula is grouped into instances by damage type and kind (main,
precision, splash, persistent); a critical hit doubles all but splash.

- Resistances and immunities apply once per damage type instance;
  precision damage inside it also meets precision immunity/resistance.
- +enc/damage/half and /double.
- +enc/strike computes only the named Strike, which keeps a strike
  under the function invocation limit.
- Creatures below level 0 now get their conditions (off-guard AC).
- +enc/strike <who>:<target> with an unknown <who> says so.
- pf2e-remaster 1.6.2: the wiki page says how Strike damage is built.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01Rqqt7Vksxw4GuJpVWB78aJ
Spell damage is built the way Foundry's SpellPF2e.getDamage builds it:
the spell's damage parts become base terms, then FlatModifier,
DamageDice and DamageAlteration rules for damage, spell-damage,
<spell id>-damage, and attack-damage and attack-spell-damage for a
spell attack, with the cast-a-spell action, the spell's traits and
tradition and its item options as roll options. A status bonus to
damage such as Courageous Anthem's now reaches spells.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01Rqqt7Vksxw4GuJpVWB78aJ
…heet

Seven more rule element kinds apply, through one helper that runs a
kind's rules whose predicates hold (FUN`CHECK`RULES`EACH):

- Weakness, Resistance and Immunity on characters and on effects; an
  encounter's damage meets a character's as it does a creature's, and
  +sheet lists them.
- DexterityModifierCap: the lowest cap counts in AC.
- MultipleAttackPenalty: a Strike's penalty step is the smallest of
  5, 4 when agile, and the rules for its attack domains, on +sheet,
  +enc/look and +enc/strike.
- BaseSpeed: other movement types on +sheet; a land BaseSpeed raises
  the ancestry's Speed.
- Sense: the ancestry's vision and Sense rules on +sheet.
- CreatureSize: size on +sheet, set or stepped by the rules.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01Rqqt7Vksxw4GuJpVWB78aJ
FUN`CHECK`PREPARE keeps the registers it works out from a ledger under
CACHE`<key> on the core, keyed on the ledger, the package version, the
books and CACHE`STAMP (bumped by the deity table and the updater). The
sheet's statistics, Strikes and Strike lines are kept under the same key.
+sheet works out the parts not cached in queue entries of their own, so a
first view stays under the function invocation limit.

Tess's +sheet: ~25,700 function calls before, ~3,100 cached, at level 5
and level 20. A cached prepare costs ~260 instead of ~5,800.

tools/check-pf2e-cache-version.py fails when DATA`CACHE`VERSION does not
follow the package version.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01Rqqt7Vksxw4GuJpVWB78aJ
A granted item's ItemAlteration rules reach a Strike (other-tags, traits,
damage-type, damage-dice-faces, damage-dice-number, runes-potency,
runes-striking), the worn armor (runes-potency, runes-resilient, ac-bonus)
and the held shield (hardness), lowest priority first, each rule's
predicate tested with the item's roll options as the rules before it left
them. Rules for other properties keep the item on the sheet's "Not
applied yet" line.

Deadly Grace gives a Dogslicer and a fist deadly-d8, Powerful Fist a d6
fist, and Forgefather's Seal leather armor +2 AC.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01Rqqt7Vksxw4GuJpVWB78aJ
…gear

FUN`ITEM`ALTER now reaches any item: traits and other tags, the name,
descriptions (added or replaced, each part with its own predicate),
frequencies, a spell's area and passive defense, bulk and the rune and
hardness numbers. A spell cast is altered with the casting's roll options
(spellcasting category and tradition, spell slot, rank, area, defense),
and a spell attack whose passive defense is a save targets that save's DC.
+build/info shows an item as the character's rules change it, with its
frequency.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01Rqqt7Vksxw4GuJpVWB78aJ
+hero shows them (0 to 3, 1 until set); +hero/award and +hero/set are for
staff and the GM of a character's encounter. +hero/reroll spends one on a
fortune reroll that keeps the new result: the last +check, or in an
encounter the character's part of the last Strike, check or save while
nothing has changed since. A Strike is made again from the state before it;
a save is rolled again for that character alone. Rolls with a fortune
effect, rerolls and substitutions are refused; against misfortune the two
cancel. +hero/recover is Heroic Recovery: all Hero Points, no longer dying,
stable at 0 HP, wounded unchanged. Points live in the day, so an encounter's
copy keeps its own until +enc/keep. The sheet shows them.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01Rqqt7Vksxw4GuJpVWB78aJ
Foundry keeps property runes in runes.ts, not in its packs; a new generator,
tools/pf2e-feed/property_runes.py, writes them onto the core as DATA`RUNE`W`
and DATA`RUNE`A` tables (80 weapon runes, 58 armor runes).

+build/upgrade <item>=<rune> etches a property rune into the slots potency
gives, checks level and rarity (staff etch uncommon and rare), replaces the
lesser rune of a family paying the difference, and takes one off with
"remove <rune>". The sheet lists each item's runes.

Strikes apply them as Foundry does: extra dice by predicate (crit-only and
persistent ones too, Shockwave's splash), ignored resistances, traits
gained (holy, unholy, trip, nonlethal), Keen's degree adjustment, and the
runes' attack and damage notes.

Also fixes the +build/upgrade "not enough money" message, which a ; split.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01Rqqt7Vksxw4GuJpVWB78aJ
… them

Each damage type's instance is tested on its own with its formal
description and the attack's roll options, as Foundry's applyIWR does:
exceptions (physical except silver), resistance doubled against
non-magical damage, weapon materials and property runes (ghost touch),
holy and unholy, spells, area and splash damage, precision, critical
hits, persistent damage, and vitality, void and bleed against undead,
constructs and the living. Weaknesses add per instance; tradition,
holy, unholy and the like add once. Immune targets take no persistent
damage of that type. Immunity rules with mode remove no longer count
as immunities. The sheet and Recall Knowledge show exceptions.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01Rqqt7Vksxw4GuJpVWB78aJ
Shield Block (+enc/block) answers the damage just dealt: Hardness takes
its share, the shield takes the rest up to its Hit Points, and the
shield breaks at its Broken Threshold and is destroyed at 0. Reactions
are tracked per round; Quick Shield Block gives a second block.
Reactive Shield raises as a reaction. Creatures raise and block with
their own shields. The Shield spell blocks through its effect, ends
when it blocks, and cannot be cast again in the encounter.

Reinforcing runes raise a shield's Hardness and Hit Points as Foundry
caps them. Effects that set system.attributes.shield apply in priority
order, and the actor's roll data carries the shield (Reflexive Shield).
+repair is the Repair activity on the held shield. Shield damage stays
in the day and +enc/keep writes it back. Roll options self:type:*,
self:shield:raised/broken/destroyed and self:effect:raise-a-shield.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01Rqqt7Vksxw4GuJpVWB78aJ
The core counts Bulk in light units the way Foundry's InventoryBulk
does: an equipped item its Bulk, a held-or-stowed one its heldOrStowed
(armor one step more), scaled to the actor's size, stack groups such as
arrows and coins counted per bundle, and 1,000 coins one Bulk (the
ledger now carries the purse as a coins entry numbered 0). Limits are
5 and 10 plus the Strength modifier, with ActiveEffectLike rules on
inventory.bulk.encumberedAfterAddend and maxAddend (Hefty Hauler, Ant
Haul, Lifting Belt). Past the first the actor has the encumbered
condition and clumsy 1, as Foundry imposes them. +sheet shows a Bulk
row.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01Rqqt7Vksxw4GuJpVWB78aJ
An effect's ChoiceSet of the bearer's own items (Runic Weapon, Precious
Metals, oils, Blessed Armament: 27 effects) picks the item named with
"on <item>" in +cast, +enc/effect, +enc/use and +enc/act, or the only
weapon, armor or shield that fits; ItemAlteration rules naming that item
by id now apply. +enc/effect takes "as <choice>" like +cast, and choices
whose values are plain strings are matched by value.

ItemAlteration material-type sets a Strike's, armor's or shield's
material, so a silvered weapon passes resistances with a silver
exception. pd-recovery-dc on the persistent-damage condition (Charhide
Goblin, Scar-Thick Skin) sets the flat check's DC at the end of a turn.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01Rqqt7Vksxw4GuJpVWB78aJ
An oil whose effect goes on an item is refused, and not used up, until
the item is named or only one fits.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01Rqqt7Vksxw4GuJpVWB78aJ
An effect in an encounter carries its badge as Foundry starts it: a
counter's value, or a formula rolled (Devise a Stratagem's 1d20, Glutton's
Jaws' level d4). The badge reaches the effect's rules as @item.badge.value
and as its roll option, so Impenetrable Scale's resistance, Glutton's
Jaws' temporary Hit Points and Bless's aura follow it. +enc/badge sets it
or moves it by +n/-n within the counter's bounds: its labels, its max, or
its own badge-max rule (Remaining Air: 5 plus Constitution). Looping
counters go round, and a counter taken below its least ends the effect.
The encounter shows each badge, by label when it has labels.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01Rqqt7Vksxw4GuJpVWB78aJ
Rule elements on effects and granted items see parent:* options the way
Foundry's do: the parent item's id, slug, type, level, traits, tags and
badge, the granter's id, slug and traits, and an effect's origin (the item
or spell that brought it and the creature that used it, with the check
outcome). A ChoiceSet whose choices test parent: options picks the one
choice that fits on its own, so Frost Vial's effect knows which vial.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01Rqqt7Vksxw4GuJpVWB78aJ
The rules core gains a variants setting, a list of GM Core variant rules
the game plays with, off by default. free-archetype adds an archetype
feat slot at every even level, taking archetype feats only, with the
same dedication rule as class feat slots, as Foundry's archetype feat
group does.

pf2e-config is a new bridge that registers the core with plus-config,
so staff change the pf2e settings with +config pf2e.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01Rqqt7Vksxw4GuJpVWB78aJ
The variants setting takes abp and abp-fundamental, Foundry's two forms
of GM Core's Automatic Bonus Progression. A character's level gives
potency bonuses to Strikes, AC, Perception and saves and extra weapon
damage dice. Weapons and armor lose their fundamental runes, and item
bonuses of 0 or more from equipment are set aside. abp-fundamental keeps
property runes up to the level's potency.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01Rqqt7Vksxw4GuJpVWB78aJ
The builder reads the runes the ledger holds and counts property rune
slots from the ABP potency of the level; fundamental runes are refused
under ABP. ABP is applied to armor and Strikes after ItemAlterations.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01Rqqt7Vksxw4GuJpVWB78aJ
The rules core, the commands and the table declare their own
function_invocation_limit of 300000 (package format 1.19), so a sheet
prepared cold from a long ledger no longer runs out of the game's
25000 calls.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01Rqqt7Vksxw4GuJpVWB78aJ
The variants setting takes proficiency-without-level, GM Core's variant
as Foundry's pwol setting has it. Proficiency bonuses leave out the level
and come from the proficiency-bonuses setting (-2 2 4 6 8 by default).
DCs by level lose the level, and creature XP uses the variant's table.
Creatures and hazards lose their level from AC, attacks, saves,
Perception and skills.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01Rqqt7Vksxw4GuJpVWB78aJ
The gradual-boosts variant gives one attribute boost at each level from
2nd to 5th, 7th to 10th, 12th to 15th and 17th to 20th instead of four
at 5th, 10th, 15th and 20th, and refuses an attribute boosted twice in
one group of levels. +build lists each level's boost.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01Rqqt7Vksxw4GuJpVWB78aJ
The stamina variant halves a class's Hit Points a level and gives the
other half plus the Constitution modifier as Stamina Points, with
Resolve Points equal to the key attribute's modifier, as Foundry
computes them. Damage in an encounter takes temporary Hit Points, then
Stamina Points, then Hit Points. +steel (Steel Your Resolve) and
+breather (Take a Breather, outside encounters) spend Resolve Points;
+rest fills both; +enc/keep writes them back to the day.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01Rqqt7Vksxw4GuJpVWB78aJ
A character at 0 HP read as full HP in +rest, +heal, +enc/join and
healing casts, because firstof() treats 0 as empty. FUN`DAILY`HP reads
the stored value with isint().

FUN`ACT`TAKE now clears check_ registers it did not hold, so the
target's options (Tess's fortune) no longer leak into its attacker's roll.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01Rqqt7Vksxw4GuJpVWB78aJ
+act [<who>:]<action> [<target>][=<option>] rolls an action from the
action table (DATA`ACTION`<SLUG> on the table) against the target's DC
and applies its degree: conditions with durations, damage, grabs and
releases. First batch: Demoralize, Feint, Trip, Grapple, Shove, Disarm,
Reposition, Escape, Tumble Through. Attack actions take and add multiple
attack penalty; Demoralize leaves the target immune to the same actor.

Actions are counted on the acting combatant's turn; a fourth action
(three plus quickened, minus slowed and stunned) shows a warning. A
duration key~N~end ticks at the end of the turn (FUN`TURN`ENDTICK).

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01Rqqt7Vksxw4GuJpVWB78aJ
Adds Stride, Step, Crawl, Leap, Interact, Point Out, Drop Prone, Stand,
Take Cover, Avert Gaze, Release, Bon Mot, Sense Motive, Lie, Hide, Sneak,
Seek, Create a Diversion, Steal, Request and Command an Animal.

An action row without a stat is not rolled. tgt many rolls once against
each target's DC (every foe still up when none are named). A secret
action tells the room it happened and sends the roll to the GM. New
outcome kinds: fx (an effect, its ChoiceSets taken from the action's
degree, as Bon Mot's), uncond and unhold. An effect's origin outcome of
0 (critical failure) is kept, and an object choice without a slug is
named by its label.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01Rqqt7Vksxw4GuJpVWB78aJ
claude added 16 commits November 3, 2026 20:06
+act aid <ally>=<skill> rolls against DC 15 as a reaction and puts the
Aid effect on the ally: +1 on a success, +2 on a critical success (+3
master, +4 legendary), -1 on a critical failure.

FlatModifier removeAfterRoll now works as Foundry's afterRoll: after a
combatant's check or attack roll, an effect whose FlatModifier says true
ends; if-enabled, when its selectors are among the roll's domains and its
predicate holds; a predicate, when the roll's options meet it. The roll
line says "(Aid used)". +enc/check stores the encounter so the end sticks.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01Rqqt7Vksxw4GuJpVWB78aJ
A creature Strike that hits brings its attack effects. An affliction (an
ability whose text has stages, such as Giant Centipede Venom) is saved
against at once; a failure starts stage 1, a critical failure stage 2,
after any onset. At the end of the afflicted one's turn, when the stage's
time is up, they save again and move up or down; each stage brings its
damage and conditions, and the maximum duration ends it. The stages are
read from the ability's text (FUN`AFF`PARSE). Creature immunity to poison
or disease is honoured.

+enc/afflict <who>=<poison or disease> exposes anyone to an affliction
from the equipment items; =-<name> ends one. +act takes Grab, Improved
Grab, Knockdown, Improved Knockdown, Push and Improved Push, and a Strike
that lists one names the command. +enc shows afflictions and their stage.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01Rqqt7Vksxw4GuJpVWB78aJ
+act <action> vs <DC> rolls against a DC the GM gives. Outside an
encounter, or for a character not in it, +act rolls against the sheet;
an action that reads a target's DC needs vs <DC> there, and the result
is its note. An action with no DC of its own (Climb) rolls alone or
against vs, with no target needed.

New actions: Climb, Swim, High Jump, Long Jump, Force Open, Balance,
Squeeze, Maneuver in Flight, Track, Sense Direction, Cover Tracks,
Decipher Writing, Gather Information, Perform, Make an Impression,
Coerce, Impersonate, Create Forgery, Subsist, Pick a Lock, Disable a
Device, Palm an Object, Conceal an Object, Administer First Aid (15 plus
dying; stabilizes, or dying +1 on a critical failure) and Stop Bleeding.

Row fields dcfix, dcfn, need and needvs; outcome kinds inc and unpers.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01Rqqt7Vksxw4GuJpVWB78aJ
…, Treat Disease

- +pf2e/time shows the world clock (WORLD`CLOCK on the core); staff move it
  with +pf2e/time/advance <n> <rounds|minutes|hours|days|weeks>.
- Treat Wounds heals the sheet, in or out of an encounter: the DC tier asked
  for, no higher than the healer's Medicine rank, with Medic Dedication and
  Magic Hands as Foundry counts them. Success and critical success end
  wounded; the patient is immune for an hour of the world clock.
- Battle Medicine: the same healing in an encounter (immune to that healer
  for a day there), or on the sheet outside one.
- Treat Poison rolls against the DC of the target's poison and gives the
  Treat Poison effect from its degree; the next save against the poison
  counts it and removes it. Afflictions now keep their kind and traits.
- Treat Disease, outside encounters, against vs <DC>.
- An encounter immunity key with a hyphen in the action's slug no longer
  breaks the encounter's JSON.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01Rqqt7Vksxw4GuJpVWB78aJ
- +enc/react [<who>:]<target>[=<strike>] makes a Reactive Strike (or
  Attack of Opportunity): the class feature or feat for a character, the
  ability for a creature. No multiple attack penalty, none added, no action
  counted; it spends the reaction, which comes back at the start of the
  combatant's turn. Without a Strike named, it takes the first melee one.
- Aid spends the reaction instead of an action, and is refused once the
  reaction is used.
- A creature's ranged Strike (range increment in Foundry's data) counts as
  ranged for ranged-strike-attack-roll selectors.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01Rqqt7Vksxw4GuJpVWB78aJ
- +enc/react takes the first melee Strike that needs no drawing, or the one
  named, and refuses a ranged or carried one, or none.
- The Fighter's Reactive Strike class feature counts as well as the feat.
- A Hero Point reroll of a Reactive Strike is made as a reaction again.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01Rqqt7Vksxw4GuJpVWB78aJ
…grant

- The effect of a sustained spell lasts until the end of the caster's next
  turn, then ends with a line saying it was not sustained. +act sustain
  (one action, concentrate) keeps each of the caster's sustained effects
  going to the end of their next turn; it is refused on the turn the spell
  was cast and a second time in a turn.
- An effect whose ChoiceSet asks for a degree of success (Leaden Steps,
  Tangle Vine) is given to each target for its own save or the spell attack
  roll against it, foe or ally, and to none where the effect lists no such
  degree. `as <degree>` still picks one by hand.
- An effect's ChoiceSet without a flag takes the flag Foundry derives from
  the effect's slug, so its predicates see the choice.
- The conditions an effect grants (GrantItem of a condition whose predicate
  holds) count for the combatant while the effect lasts: encumbered from
  Leaden Steps, clumsy from Enlarge, immobilized from a critical Tangle
  Vine.
- A creature's Speeds in +enc/look include its speed modifiers.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01Rqqt7Vksxw4GuJpVWB78aJ
A spell with a save or a spell attack roll that brings no effect gives each
target the conditions linked in its text's paragraph for that target's
degree of success: the value from the link's label (Frightened 2), and for
a condition without a value the duration the paragraph names (N rounds, a
minute, until the start or end of the caster's next turn). Fear makes a
target frightened 1, 2, or 3 and fleeing for 1 round.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01Rqqt7Vksxw4GuJpVWB78aJ
+cast <spell> on <what>=<target>, for a spell that counteracts, rolls the
counteract check (spell attack modifier, no multiple attack penalty)
against what it names on the target, and ends it when the check beats its
rank: up to 3 ranks higher on a critical success, 1 on a success, only
lower ranks on a failure.

- An effect's rank is the rank it was cast at and its DC the caster's
  spell DC, now kept with the effect; otherwise the DC for its level.
- An affliction's DC is its own, its rank half the level that DC belongs
  to, rounded up.
- A condition an effect grants counteracts that effect; any other names
  the DC of what caused it: on frightened vs 20.
- A spell that counteracts an effect imposing listed conditions (Clear
  Mind, Sure Footing, Sound Body) takes only those its rank lists, read
  from its text, and suppresses what it would have counteracted at 2 ranks
  lower.
- DATA`COUNTER`CLEANSE-AFFLICTION: Cleanse Affliction reduces the stage
  by one once a case, and counteracts poison and disease from rank 3,
  curses too from rank 4.
- A cast that could not counteract anything named is refused before any
  slot is spent.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01Rqqt7Vksxw4GuJpVWB78aJ
An effect from outside the spell-effects pack is counteracted at half
its level, rounded up, with its level's DC. A failed counteract that
suppresses now marks the effect (or moves the condition aside) until the
start of the caster's next turn, so it gives nothing meanwhile.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01Rqqt7Vksxw4GuJpVWB78aJ
- +build/innate and +build/uninnate: spells cast innately, at will or
  N times a day, with Charisma and at least trained proficiency.
- +cast <spell> from <staff>: a held staff's list, charges equal to the
  caster's highest rank each day; a spontaneous caster may add "with a
  slot" to spend one charge and a slot of the spell's rank.
- +cast spends the spell's actions in an encounter, with the same
  warning past three as other actions.
- +ritual: rituals known through +build/ritual (staff), secondary
  casters' checks feeding the primary check, a very hard DC for the
  rank unless the GM gives one, and the cost from the primary caster's
  money. +spells lists innate spells and rituals.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01Rqqt7Vksxw4GuJpVWB78aJ
+familiar shows a character's familiar from their sheet (level, AC and
saves, Perception, Acrobatics and Stealth of level plus the spellcasting
modifier, 5 HP a level). +familiar/name names it; +familiar/abilities
picks its abilities once after each +rest, with choices ("resistance as
fire and cold"). Names and choices are entries in the familiar's own
ledger on the character. The abilities' speeds, senses, traits, Hit
Points and resistances go onto its statistics. +enc/add <player>/familiar
adds it as a minion on its master's turn, with no initiative.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01Rqqt7Vksxw4GuJpVWB78aJ
An innate cantrip with a count is limited, =0 makes a spell at will, a
second +build/innate of the same spell is refused, and a spell cast over
minutes spends no actions in an encounter.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01Rqqt7Vksxw4GuJpVWB78aJ
+companion shows the animal companion a feat gives (Animal Companion,
the ranger's, Beastmaster Dedication) with Player Core's statistics for
its type, level and advancement: mature, nimble or savage, and up to
three specializations, each from its feat. Type, name, path and
specializations are entries in the companion's own ledger.

+enc/add <player>/companion adds it as a minion with its Strikes as
Foundry melee items, magical once nimble or savage. Minions no longer
count as characters or foes in the threat.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01Rqqt7Vksxw4GuJpVWB78aJ
Staff award downtime days (+pf2e/award <players>=7 days <reason>), a
ledger of their own beside money and experience, and +downtime spends
them:

- /income: Earn Income at a task level's DC, paid per day from Player
  Core's Income Earned table; Experienced Professional for Lores.
- /craft, /work, /finish, /drop: Craft with Player Core's requirements
  (level, Crafting rank, Alchemical/Magical/Snare Crafting, rarity),
  2 setup days or 1 with the formula, half the Price in materials, and
  each day of work taking Income Earned off the rest. Items join the gear.
- /learn: Learn a Spell by rank, cost and DC from Player Core; a learned
  spell does not count against a spellbook's allowance, and an uncommon
  one learned can be chosen with +build/spell.

+check and +downtime/income now take a Lore by name ("sailing lore"),
and a check names a Lore as Sailing Lore.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01Rqqt7Vksxw4GuJpVWB78aJ
@HarryCordewener
HarryCordewener marked this pull request as ready for review November 4, 2026 00:13
@coderabbitai

coderabbitai Bot commented Nov 4, 2026 •

Copy link
Copy Markdown

Warning

Review limit reached

  • Run on-demand review

This review includes 2 billable files and costs up to $0.50.

  • Ask an admin to make reviews automatic

Open in CodeRabbit

Reviews can continue after your included limit without a manual trigger. An admin must approve usage-based billing.

Or wait 5 minutes for your next included review.

Check out review usage here.

View limit details

Limit details: You’ve used the included review currently available. Your 64 included PR review attempts over the past 7 days set your current allowance at 1 review per hour.

Learn how review limits work.

Review configuration:

Run configuration
  • Source mode: Auto
  • Repository: Unavailable
  • Branch: Unavailable
  • File: No configuration file from this repository applied
  • Commit: Unavailable
  • Layers: Organization UI
  • Review profile: ASSERTIVE
  • Plan: Essentials
  • Run ID: 05a7ce50-c753-4f15-a433-752e47a02312
Commits

Reviewing files that changed from the base of the PR and between 04b8bb5 and 31b8559.

Files selected for processing: 2
  • index.yaml
  • pf2e/package.yaml
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

@HarryCordewener
HarryCordewener merged commit 478dcd8 into main Nov 4, 2026
3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants