Résout par uuid avant l'id d'acteur : pour un token non lié (PNJ mineur), token.actor.id expose encore l'id de l'acteur monde dont il est issu, et résoudre par id blessait alors tous les tokens de la fiche. Le uuid d'un acteur synthétique est résolu en extrayant directement la scène et le token, car fromUuid échoue sur les documents non indexés quand la résolution est asynchrone.
4.1 KiB
4.1 KiB
AGENTS.md — Vermine2047 FoundryVTT system
Project
FoundryVTT v14 game system for the French post-apocalyptic TTRPG "Vermine 2047". Bilingual FR/EN.
- Entrypoint:
module/vermine2047.mjs(declared insystem.jsonesmodules) - CSS:
css/vermine2047.min.css(compiled from LESS, not SCSS) - System ID:
vermine2047
Architecture
| Layer | Location | Notes |
|---|---|---|
| Entry/init | module/vermine2047.mjs |
Hooks.once('init',...) — register DataModels before Document classes |
| DataModels | module/models/*.mjs |
FoundryV2 TypeDataModel — 4 Actor types, 12 Item types |
| Documents | module/documents/*.mjs |
VermineActor, VermineItem (thin wrappers) |
| Sheets (AppV2) | module/applications/sheets/*.mjs |
ApplicationV2 sheets per type |
| System | module/system/*.mjs |
config, roll, fight, dialogs, hooks, settings, dice3d, group-link |
| Templates (HBS) | templates/actor/appv2/*.hbs |
ApplicationV2 templates |
| Legacy templates | templates/actor/*.hbs, templates/actor/{character,group,npc,creature}/*.hbs |
Coexisting legacy templates |
Actor types: character, npc, group, creature
Item types: item, weapon, defense, vehicle, ability, specialty, background, trauma, evolution, rumor, target, rite
Key objects at runtime:
game.vermine2047→{ VermineUtils, VermineCombat, GroupLink }CONFIG.VERMINE→ game configuration (totems, traits, skills, etc.)CONFIG.ui.combat→ customVermineCombatTracker
Dice system: d10-based, success-counting (Xd10cs>=N). Totems give domain bonuses. Initiative formula:
(@abilities.reflexes.value + @skills.alertness.value)d10cs>=@combatStatus.difficulty
Commands
npm run build:less # LESS → vermine2047.min.css
npm run build:less:dev # LESS → vermine2047.dev.css (unminified)
npm run build:all-css # both
npm run watch # gulp watch + browser-sync proxy to localhost:30000
npm run lint:less # lesshint
npm run pushLDBtoYAML # extract Foundry packs → src/packs/*.yml
npm run pullYAMLtoLDB # compile src/packs/*.yml → packs/ LevelDB
make build / watch / lint # Makefile wrappers for above
- Node version required:
v16.15.1(per.nvmrc)
Gotchas
- DataModels before Document classes: In
inithook, registerCONFIG.Actor.dataModels.*andCONFIG.Item.dataModels.*before settingCONFIG.Actor.documentClass/CONFIG.Item.documentClass. no-console: 'error': ESLint blocksconsole.log/warn/info. Useconsole.errorsparingly or disable the rule inline.- ESLint is very verbose: ~350 rules. Common failures: missing semicolons, trailing commas, single quotes, 2-space indent,
max-len: 120. Runnpx eslint module/before committing. - Two template systems: Both legacy (
templates/actor/*.hbs) and ApplicationV2 (templates/actor/appv2/*.hbs) are preloaded. Don't confuse them. - Packs in two places:
src/packs/*.yml(YAML source, tracked) ↔packs/*(LevelDB binary, gitignored). Edit YAML source, then runpullYAMLtoLDBto compile. - CSS auto-loaded:
system.jsondeclares styles; do not inject<link>manually (causes MIME type errors). game-modesetting: Default in code is'e'(likely a typo for'1'). Values:1=Survie,2=Cauchemar,3=Apocalypse.- editMode flag disabled: No auto-set on actor creation (causes ActiveEffect errors). Enable manually via sheet checkbox.
- GroupLink auto-syncs:
GroupLink.registerHooks()runs on init. Actor updates propagate to groups and vice versa. - Custom dice: Dice So Nice integration uses user color (regular/human/adapted color sets) with custom d10 face images.
- No tests:
npm testis a stub (exits 1). No test framework installed. - No CI:
.github/is gitignored; no workflows configured. - HotReload:
system.jsonflags hotReload for css, scss, hbs, json extensions.
Constraints and remarks
Foundryv14 only : foundryvtt.com/api/
Tests
With chrome-devtools on port 9222
World is called "Vermine", thru https://localhost:31000, with Gamemaster user logged in (no password needed)
Always try to re-use existing chrome-devtools session.