# Copilot Instructions for foundryvtt-mgt2

## Project Overview

This is a [Foundry VTT](https://foundryvtt.com) game system implementing Mongoose Publishing Traveller 2nd Edition (MGT2). It runs entirely in the browser within the FoundryVTT platform — there is no Node.js runtime or backend server to develop against.

The distributed entry point is `mgt2.bundle.js` (pre-bundled from `src/`). CSS is compiled from `src/sass/` to `styles/mgt2.min.css`. No build tooling (package.json, webpack, etc.) is committed to the repo, so bundling is done externally.

## Architecture

### Entry Point & Initialization

`src/module/core.js` is the main module. It runs in the FoundryVTT `init` hook and:
- Registers all Actor/Item document classes
- Registers all TypeDataModel schemas (`datamodels.js`)
- Registers sheets (actor and item)
- Preloads Handlebars templates

### Document Classes

| Class | File | Purpose |
|---|---|---|
| `TravellerActor` | `actors/actor.js` | Extends `Actor`; delegates character logic to `ActorCharacter` |
| `ActorCharacter` | `actors/character.js` | Static methods for character-specific actor logic |
| `TravellerItem` | `item.js` | Extends `Item` |
| `MGT2Combatant` | `actors/actor.js` | Extends `Combatant` |

### Sheets

- **`TravellerActorSheet`** (`actors/character-sheet.js`) — character sheet. Uses `templates/actors/actor-sheet.html`. `getData()` returns `context.data` (not the full context).
- **`TravellerItemSheet`** (`item-sheet.js`) — item sheet. Template is dynamically resolved as `templates/items/{item.type}-sheet.html`.
- **`VehiculeSheet`** (`actors/vehicule-sheet.js`) — vehicle actor sheet.

### Data Models

All schemas are TypeDataModels defined in `src/module/datamodels.js`. Actor types: `character`, `vehicule`. Item types: `contact`, `career`, `disease`, `item`, `equipment`, `talent`, `armor`, `weapon`, `computer`, `container`, `species`.

The `CharacterData` model uses a helper `createCharacteristicField()` for the 12 characteristics (strength, dexterity, endurance, intellect, education, social, morale, luck, sanity, charm, psionic, other). Each characteristic has `.value`, `.max`, and `.dm` fields.

### Config Constants

`src/module/config.js` exports `MGT2` — a set of frozen objects mapping internal keys to i18n strings (e.g., `MGT2.Difficulty.Average`). Accessible at runtime via `CONFIG.MGT2`.

### Templates

Handlebars templates live in `templates/`. Paths always use the FoundryVTT-relative prefix `systems/mgt2/templates/...`. Partial templates (used across sheets) live in `templates/items/parts/`.

### Styles & Theming

SASS source is in `src/sass/`. The active theme is a CSS class applied to every sheet element — e.g. `["mgt2", game.settings.get("mgt2", "theme"), "sheet", ...]`. Available themes: `black-and-red`, `mwamba`, `blue`.

### Localization

All user-facing strings go through `game.i18n.localize()`. Keys follow the pattern `MGT2.Section.Key`. String definitions are in `lang/en.json` and `lang/fr.json`.

### Chat Cards

`ChatHelper` (`chatHelper.js`) hooks into `renderChatMessage` to attach button listeners. Chat card templates are in `templates/chat/`.

## Key Conventions

- **`getData()` returns `context.data`** — the character sheet's `getData()` calls `super.getData()` then returns `context.data`, not `context` itself. Keep this pattern for character sheet overrides.
- **Actor logic delegation** — `TravellerActor` is thin; type-specific logic lives in static methods on `ActorCharacter`. Follow this pattern for new actor types.
- **Settings keys** — always namespaced as `game.settings.get("mgt2", "settingName")`. Settings are registered in `settings.js`.
- **`vehicule` spelling** — the actor type and related files use the French spelling `vehicule` (not `vehicle`). Do not rename.
- **Template paths** — always use the full FoundryVTT path `systems/mgt2/templates/...` in JS; never relative paths.
- **i18n keys in config** — `config.js` stores i18n key strings (not translated text). Actual translation happens at render time via `game.i18n.localize()`.
- **`life` is the primary token attribute** — configured in `system.json` as `primaryTokenAttribute: "life"`.
