Files
fvtt-lethal-fantasy/CLAUDE.md
T
uberwald 38eb1a8d3d
Release Creation / build (release) Successful in 54s
Add ranged actions for monsters
2026-05-23 19:10:10 +02:00

2.9 KiB

CLAUDE.md

This file provides guidance to Claude Code (claude.ai/code) when working with this repository.

Overview

FoundryVTT v13+ game system for the Lethal Fantasy RPG. Entry point: lethal-fantasy.mjs.

Commands

# Compile LESS styles (styles/ -> css/)
npx gulp css          # one-shot
npx gulp              # compile + watch

# Lint
npx eslint .

# Compendium pack management (LevelDB <-> YAML source)
npm run pushLDBtoYML   # export packs-system/ LevelDB -> source YAML
npm run pullYMLtoLDB   # import source YAML -> packs-system/ LevelDB

No test suite exists.

Architecture

Four layers in module/, all wired in lethal-fantasy.mjs via the init hook:

Layer Path Purpose
Config module/config/ Game constants. SYSTEM is globalThis.SYSTEM — always use SYSTEM.* for enumerations.
Models module/models/ TypeDataModel subclasses — data schemas per document type.
Documents module/documents/ Actor/Item/Roll/ChatMessage subclasses — game logic, roll processing, hooks.
Applications module/applications/ ApplicationV2 sheets + custom combat tracker.

Actor types: character, monster Item types: skill, gift, vulnerability, weapon, armor, shield, spell, miracle, equipment

Each layer has an _module.mjs barrel file that re-exports all classes from that layer.

Templates (.hbs) live in templates/. Styles are authored in LESS under styles/ and compiled to css/.

Key Patterns

  • Sheets: Extend HandlebarsApplicationMixin(foundry.applications.sheets.ActorSheetV2) — imported from foundry.applications.api. Not the legacy ActorSheet. Child sheets (e.g. character-sheet.mjs) extend base-actor-sheet.mjs and override static PARTS and DEFAULT_OPTIONS.actions. Template paths are prefixed systems/fvtt-lethal-fantasy/templates/. Actor sheets have a play/edit toggle via _sheetMode and SHEET_MODES.
  • Models: static defineSchema() using foundry.data.fields.*. Field definitions derived from SYSTEM config objects.
  • Rolls: LethalFantasyRoll extends Roll with rich metadata via this.options. D30Roll is a separate class for D30 result tables (initialized in the ready hook).
  • Socket: Events use game.socket.on(\system.${SYSTEM.id}`, ...). Multi-player attack-defense uses a global pendingDefenses` Map.
  • i18n: All user-visible strings are keys in lang/en.json as LETHALFANTASY.Category.Key. Always use game.i18n.localize(key).

Compendium Packs

Five LevelDB packs in packs-system/: skills, equipment, gifts, vulnerabilities, spells-miracles. Use the tools/ scripts to export/import editable YAML.

Code Style

  • No semicolons, double quotes, 2-space indent
  • JSDoc /** */ required on all functions/classes
  • Max line length 180 (strings/templates exempt)
  • Arrow functions: omit parens for single param
  • ESLint + Prettier config in eslint.config.mjs