Optional enhancements module for the Forbidden Lands system in Foundry VTT.
Everything is optional and can be switched off in the module settings. No file of the base Forbidden Lands system is modified.
1. Combat automation buttons in attack chat cards
For attack rolls, the module adds action buttons directly to chat:
Apply damageDodgeParryArmor
These buttons are shown in a vertical stack and use the Forbidden Lands visual style.
2. Target-owner access control
Combat action buttons are available only to users who own the target actor/token. If the attacker does not own the target, they cannot trigger target-side defense actions. Apply damage is GM-only.
3. Attack state sync (owner-safe flow)
When a user cannot directly update the attack chat message (permission limitations), the module uses a GM relay through socket updates to keep attack state synchronized.
4. Damage type support in roll flow
The module supports and propagates these damage types:
stab, slash, blunt, fire, empathy, endurance, fear, other
Damage type is selectable in the roll dialog, shown in the attack chat card, and used when applying damage.
5. Attribute mapping for applied damage
When Apply damage is used, damage is applied to actor attributes by damage type:
stab, slash, blunt, fire, other → strengthempathy → empathyfear → witsendurance → agility
6. Trauma table trigger on break (characters)
When applied damage drops an attribute from above 0 to 0, the module attempts to roll on trauma tables:
wits break → Horror Traumastrength break:stab → Critical Injuries - Stab Woundsslash → Critical Injuries - Slash Woundsblunt → Critical Injuries - Blunt Wounds
Monster actors are excluded from trauma table rolls.
7. Armor side effects (gear damage)
If armor defense roll produces banes/failures and incoming attack is still successful, armor item bonuses are reduced:
- body armor first
- then helmet
Monsters are excluded from armor item degradation.
8. Parry restrictions
- Ranged attacks cannot be parried unless the defender has an equipped shield.
- Parry requires an equipped melee weapon with the parrying feature.
9. Built-in Forbidden Lands calendar
A calendar modelling the in-world human calendar, and the foundation for time-based automation.
- 365-day year of 8 phases (45–46 days each), each opening with a named holiday: Winterwane (Midwinter Day), Springrise (Day of Awakening), Springwane (Spring Turn), Summerrise (Day of Greening), Summerwane (Midsummer Day), Autumnrise (Harvest Day), Autumnwane (Autumn Turn), Winterrise (Day of the Dead).
- Moon phases follow the real synodic cycle. A phase containing two full moons is flagged as a strong phase, matching the lore that such phases strongly influence the year's events.
- Time of day in quarters — Morning, Daytime, Evening, Night (6h each) — each split into quarter-of-quarters (1.5h), and each hour into quarter-hours (15 min).
- GM-only time controls: a granularity selector with forward/back buttons. Players can open and view the calendar but cannot change the time.
- Configure phase lengths, the lunar cycle, the starting year, and the current date and time from Calendar Setup in the module settings.
- Opened from the calendar button in the scene controls (Token tools).
Time is stored in Foundry's core world time, so every connected client stays in sync automatically. The calendar is fully translatable — its date engine works in localisation keys rather than literal text.
10. Automatic critical-injury healing
Critical injuries no longer have to be tracked by hand. The module counts their healing time down as in-game days pass on the calendar.
- On add, the injury's free-text Healing Time (
1d6 days,2 days, …) is read once. Any dice are rolled to a concrete number and the field is rewritten to a plainN dayscounter. - Each new day, every tracked injury's remaining days drop by the number of in-game days that actually elapsed. Advancing several days at once — travel, a rest, a date correction — is handled correctly.
- At zero the injury is removed from the sheet and a public chat message announces the recovery.
- Manual adjustments are respected: editing the healing-time field (for example when an ally uses the Healing skill to halve the remaining time) re-syncs the countdown.
- Rewinding the calendar reverses the countdown, capped at the injury's original healing time. Injuries that already healed away are never resurrected.
- Injuries whose healing time contains no number (
-,Permanent, empty) are left untouched.
All changes are made by the active GM only. Injuries that existed before the feature was installed are initialised on world load.
11. Merchants
A new actor type — Merchant — whose sheet is a stock editor for the GM and a storefront for players. The same window switches mode by permission.
New merchants default to Observer permission for every player, so they can browse without per-merchant permission setup, and to a linked prototype token, so every token shares one stock pool.
Drag items — or an entire folder — onto the sheet. Each item is rolled against its rarity:
- Common: available on
1d62+, quantity2d12 - Uncommon: available on 4+, quantity
1d6 - Rare: available on 6, quantity 1
Items that come up unavailable are removed. Stock rolls are silent — nothing is posted to chat.
Dropping goods a merchant already carries re-rolls that entry instead of adding a duplicate row, so re-dropping the same folder refreshes the whole assortment. Two GM buttons do the same without dragging: Supply reroll (re-roll availability and quantity for everything in stock) and Clear all (empty the merchant, with a confirmation prompt).
A player clicks Buy and the purchase is carried out by the active GM — players never need write access to the merchant. Coins are deducted with proper denomination borrowing: paying 12 copper from a purse of 5 silver and 2 copper leaves 4 silver and 0 copper, and the rest of the purse is left untouched. The item lands in the character's carried gear, stock drops by one, and a chat message announces the sale. The buyer is the user's assigned character, or the single selected token if none is assigned.
At zero stock the row stays visible to the GM — marked Sold out, with an editable stock field — and disappears entirely for players. Purchases are serialized, so two players clicking the last unit at the same moment resolve in order: exactly one succeeds.
12. Item prices and rarity
The system stores an item's price as free text (5 copper, 8 silver) and its rarity as free text (Common / Uncommon / Rare), neither of which is machine-readable. The module parses both into structured values. The system's own Cost and Supply fields are never modified — all structured data lives in module item flags.
- Gear, weapon, armor and raw-material sheets gain a gold/silver/copper price row and a rarity dropdown, saved with the rest of the sheet.
- Prices use 1 gold = 10 silver = 100 copper, matching the character sheet's currency fields. A bare number with no denomination word is read as copper.
- The parser is tolerant: it handles compound values like
1 silver 5 copperand recognises denomination words across all five shipped languages. - Cost and Supply remain the source of record: editing either re-parses it immediately, so typing
Rareinto Supply on an existing item takes effect at once. Choosing a rarity from the dropdown overrides the text and is not overwritten by later migrations. - A migration runs once automatically on world load and can be re-run at any time from Configure Settings → Price migration.
Settings
- Combat automation in chat
- Rest confirmation dialog
- Critical injury healing countdown
- Merchant automation
- Announce purchases in chat
- Enable calendar
- Calendar visible to players
- Calendar Setup (menu)
- Price migration (menu)
Localisation
English, Russian, Spanish, German, Brazilian Portuguese.
Note
Merchant actors are a module sub-type. If the module is disabled, the world still loads, but existing merchants show as unknown-subtype placeholders until it is re-enabled. Nothing is lost.