vagabond-rpg-foundryvtt/PROJECT_ROADMAP.json
Cal Corum 18df9e4395 Add complete spells compendium (58 spells)
- Create all 58 spell JSON files with correct data model structure
- Validate all spells against NoteDiscovery source content
- Include damage types, effects, crit effects, delivery types, duration types
- Add validation script for future compendium verification
- All spells marked as reviewed after human approval

Spells by damage type:
- Fire: Apoplex, Burn, Erupt, Light
- Cold: Fog, Freeze, Frostburn, Moon
- Shock: Disintegrate, Zap
- Acid: Enflesh, Goop, Rust
- Poison: Gas, Leech
- Blunt: Kinesis, Terraform
- None: 41 utility/buff/control spells

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-16 22:48:26 -06:00

1283 lines
53 KiB
JSON

{
"project": {
"name": "Vagabond RPG - Foundry VTT System",
"description": "Complete Foundry VTT v13 system implementation for Vagabond RPG (Pulp Fantasy TTRPG)",
"repository": "vagabond-rpg-foundryvtt",
"license": "MIT",
"foundry_version": "13",
"created": "2024-12-12",
"status": "in_progress"
},
"phases": [
{
"id": "phase-0",
"name": "Project Foundation",
"description": "Initial setup, tooling, and development environment",
"tasks": [
{
"id": "0.1",
"name": "Create system manifest (system.json)",
"description": "Define system metadata, compatibility, dependencies, and entry points for Foundry VTT",
"completed": true,
"tested": false,
"priority": "critical",
"dependencies": []
},
{
"id": "0.2",
"name": "Create project structure",
"description": "Set up directory structure: module/, templates/, styles/, lang/, packs/, assets/",
"completed": true,
"tested": false,
"priority": "critical",
"dependencies": []
},
{
"id": "0.3",
"name": "Set up local Foundry dev container",
"description": "Docker Compose for local Foundry instance with hot-reload system mounting",
"completed": true,
"tested": false,
"priority": "critical",
"dependencies": []
},
{
"id": "0.4",
"name": "Create README.md",
"description": "Project documentation with setup instructions, development guide, and contribution guidelines",
"completed": true,
"tested": false,
"priority": "high",
"dependencies": []
},
{
"id": "0.5",
"name": "Create .gitignore",
"description": "Ignore node_modules, foundry data, secrets, IDE files",
"completed": true,
"tested": false,
"priority": "high",
"dependencies": []
},
{
"id": "0.6",
"name": "Set up SCSS compilation",
"description": "Build tooling for SCSS to CSS compilation with watch mode",
"completed": true,
"tested": false,
"priority": "high",
"dependencies": ["0.2"]
},
{
"id": "0.7",
"name": "Create LICENSE file",
"description": "MIT license file",
"completed": true,
"tested": false,
"priority": "medium",
"dependencies": []
},
{
"id": "0.8",
"name": "Create CLAUDE.md",
"description": "AI context file for development assistance",
"completed": true,
"tested": false,
"priority": "medium",
"dependencies": []
}
]
},
{
"id": "phase-1",
"name": "Data Models",
"description": "Define all Actor and Item data structures using Foundry's Data Model system",
"tasks": [
{
"id": "1.1",
"name": "Create base Actor data model",
"description": "Shared fields for all actors: name, img, type, system data container",
"completed": true,
"tested": false,
"priority": "critical",
"dependencies": ["0.1", "0.2"]
},
{
"id": "1.2",
"name": "Create Character (PC) data model",
"description": "Stats (MIT/DEX/AWR/RSN/PRS/LUK), derived values (HP, Speed, Saves, Skill difficulties), level, XP, ancestry, class reference",
"completed": true,
"tested": false,
"priority": "critical",
"dependencies": ["1.1"]
},
{
"id": "1.3",
"name": "Create NPC/Monster data model",
"description": "HD, HP, TL, Zone, Morale, Appearing, Armor, Immune, Weak, Actions array, Abilities array",
"completed": true,
"tested": false,
"priority": "critical",
"dependencies": ["1.1"]
},
{
"id": "1.4",
"name": "Create dynamic resources system",
"description": "Extensible resource tracker: HP, Mana, Luck, Fatigue, Studied Dice, custom resources with current/max/bonus fields",
"completed": true,
"tested": false,
"priority": "critical",
"dependencies": ["1.2"]
},
{
"id": "1.5",
"name": "Create Skills data structure",
"description": "12 skills with associated stat, trained boolean, difficulty calculation, custom crit threshold",
"completed": true,
"tested": false,
"priority": "critical",
"dependencies": ["1.2"]
},
{
"id": "1.6",
"name": "Create base Item data model",
"description": "Shared fields for all items: name, img, type, system data container, description",
"completed": true,
"tested": false,
"priority": "critical",
"dependencies": ["0.1", "0.2"]
},
{
"id": "1.7",
"name": "Create Ancestry item data model",
"description": "Being type, size, traits array with name/description pairs",
"completed": true,
"tested": false,
"priority": "high",
"dependencies": ["1.6"]
},
{
"id": "1.8",
"name": "Create Class item data model",
"description": "Key stat, action style, zone, training grants, starting pack, progression table (level -> features/mana/spells), feature definitions",
"completed": true,
"tested": false,
"priority": "high",
"dependencies": ["1.6"]
},
{
"id": "1.9",
"name": "Create Spell item data model",
"description": "Damage type, base effect, crit effect, valid delivery types, duration options, mana cost formula components",
"completed": true,
"tested": false,
"priority": "high",
"dependencies": ["1.6"]
},
{
"id": "1.10",
"name": "Create Perk item data model",
"description": "Prerequisites (stat requirements, training requirements, spell requirements), full description, mechanical effects",
"completed": true,
"tested": false,
"priority": "high",
"dependencies": ["1.6"]
},
{
"id": "1.11",
"name": "Create Weapon item data model",
"description": "Damage dice, grip type (1H/2H/Versatile), properties (Finesse, Thrown, Cleave, etc.), attack skill, slot cost, value",
"completed": true,
"tested": false,
"priority": "high",
"dependencies": ["1.6"]
},
{
"id": "1.12",
"name": "Create Armor item data model",
"description": "Armor value, type (Light/Heavy/Shield), slot cost, value, dodge penalty flag",
"completed": true,
"tested": false,
"priority": "high",
"dependencies": ["1.6"]
},
{
"id": "1.13",
"name": "Create Equipment item data model",
"description": "Generic items: slot cost, value, description, quantity, consumable flag",
"completed": true,
"tested": false,
"priority": "high",
"dependencies": ["1.6"]
},
{
"id": "1.14",
"name": "Create Feature item data model",
"description": "Class features as separate items: source class, level gained, description, mechanical effects, passive vs active",
"completed": true,
"tested": false,
"priority": "high",
"dependencies": ["1.6"]
},
{
"id": "1.15",
"name": "Create Active Effects integration",
"description": "System for items (classes, perks, features) to modify actor stats, crit thresholds, resources",
"completed": true,
"tested": false,
"priority": "high",
"dependencies": ["1.2", "1.8", "1.10", "1.14"]
}
]
},
{
"id": "phase-2",
"name": "Core System Logic",
"description": "JavaScript modules for game mechanics, rolls, and calculations",
"tasks": [
{
"id": "2.1",
"name": "Create main system entry point (vagabond.mjs)",
"description": "System initialization, hook registration, CONFIG setup, document class registration",
"completed": true,
"tested": false,
"priority": "critical",
"dependencies": ["1.1", "1.6"]
},
{
"id": "2.2",
"name": "Implement VagabondActor class",
"description": "Extended Actor with prepareData for derived values calculation (HP, Speed, Saves, Skill difficulties)",
"completed": true,
"tested": false,
"priority": "critical",
"dependencies": ["2.1", "1.2", "1.3"]
},
{
"id": "2.3",
"name": "Implement VagabondItem class",
"description": "Extended Item with type-specific preparation and chat card generation",
"completed": true,
"tested": false,
"priority": "critical",
"dependencies": ["2.1", "1.6"]
},
{
"id": "2.4",
"name": "Create dice rolling module",
"description": "Core roll functions: d20 checks, damage rolls, exploding dice (d6!), countdown dice, favor/hinder modifiers",
"completed": true,
"tested": false,
"priority": "critical",
"dependencies": ["2.1"]
},
{
"id": "2.5",
"name": "Implement skill check system",
"description": "Roll dialog with skill selection, favor/hinder toggles, automatic difficulty calculation, crit threshold display",
"completed": true,
"tested": false,
"priority": "critical",
"dependencies": ["2.2", "2.4"],
"notes": "Implemented with ApplicationV2, favor/hinder via Active Effects flags, FavorHinderDebug panel for testing"
},
{
"id": "2.6",
"name": "Implement attack roll system",
"description": "Weapon attack rolls with stat selection, damage calculation, crit bonus damage, Block/Dodge prompts for targets",
"completed": true,
"tested": false,
"priority": "critical",
"dependencies": ["2.4", "2.5", "1.11"],
"notes": "AttackRollDialog with weapon selection, damage roll on hit, crit doubles dice. Block/Dodge prompts deferred to Task 7.8"
},
{
"id": "2.7",
"name": "Implement save roll system",
"description": "Reflex/Endure/Will saves with correct stat combinations, favor/hinder, crit detection",
"completed": true,
"tested": false,
"priority": "critical",
"dependencies": ["2.4", "2.5"],
"notes": "SaveRollDialog with save type selection, Block/Dodge defense options. Uses {{this.variable}} pattern for Handlebars context."
},
{
"id": "2.8",
"name": "Implement spell casting system",
"description": "Dynamic spell dialog: select damage dice, delivery type, duration; auto-calculate mana cost; track focus state",
"completed": true,
"tested": false,
"priority": "critical",
"dependencies": ["2.4", "1.9"],
"notes": "SpellCastDialog with damage/effect toggle, delivery/duration selectors, live mana cost using rulebook formula. Focus tracking on successful cast."
},
{
"id": "2.9",
"name": "Implement crit threshold modifier system",
"description": "Per-skill and per-action crit thresholds that can be modified by Active Effects from classes/perks/features",
"completed": true,
"tested": true,
"priority": "high",
"dependencies": ["2.5", "1.15"]
},
{
"id": "2.10",
"name": "Implement resource management",
"description": "HP damage/healing, Mana spending/recovery, Luck pool, Fatigue accumulation with death trigger at 5",
"completed": true,
"tested": true,
"priority": "high",
"dependencies": ["2.2", "1.4"]
},
{
"id": "2.11",
"name": "Implement inventory slot tracking",
"description": "Calculate slots used from equipped items, max slots from Might, over-capacity warnings",
"completed": true,
"tested": true,
"priority": "high",
"dependencies": ["2.2", "1.11", "1.12", "1.13"]
},
{
"id": "2.12",
"name": "Implement class feature automation",
"description": "When class item added to character, apply appropriate Active Effects for current level; update on level change",
"completed": true,
"tested": true,
"priority": "high",
"dependencies": ["2.2", "2.3", "1.8", "1.15"],
"notes": "Implemented via _onCreate lifecycle method and LevelUpDialog. Features with changes[] arrays auto-create ActiveEffects. applyClassFeatures() is idempotent, updateClassFeatures() handles level-up incrementally. Fixed duplicate item creation bug (dragDrop config). Design doc: NoteDiscovery gaming/vagabond-rpg/class-level-system-design.md. Prototype branch: prototype/class-level-system commit a7862be."
},
{
"id": "2.13",
"name": "Implement morale check system (NPC)",
"description": "2d6 vs Morale roll, triggered manually or via hooks on death/half HP",
"completed": true,
"tested": true,
"priority": "medium",
"dependencies": ["2.4", "1.3"],
"notes": "rollMorale() for individual, rollGroupMorale() for lowest in selection, auto-prompt at half HP, chat button handler, macro created. Commit f6948dc."
},
{
"id": "2.14",
"name": "Implement zone AI hints (NPC)",
"description": "Display suggested behavior based on Zone (Frontline/Midline/Backline) and HP status",
"completed": false,
"tested": false,
"priority": "low",
"dependencies": ["1.3"]
},
{
"id": "2.15",
"name": "Implement castingMax formula calculation",
"description": "Calculate maximum mana per spell from class formula. Currently stored as 0 in progression table with formula documented in feature text. Formula varies by class: Magus=(Reason + half Magus Level, round up), Luminary=(Awareness + half Luminary Level, round up), etc. Should calculate dynamically based on actor's stats and class level.",
"completed": false,
"tested": false,
"priority": "medium",
"dependencies": ["1.8", "2.2", "2.12"],
"notes": "Current pattern: progression.castingMax stores 0, formula described in class feature text (e.g., Spellstriker, Theurgy). Enhancement would calculate this automatically using actor stats + class level."
}
]
},
{
"id": "phase-3",
"name": "Actor Sheets (UI)",
"description": "Handlebars templates and sheet classes for Actor display and interaction",
"tasks": [
{
"id": "3.1",
"name": "Create base VagabondActorSheet class",
"description": "Extended ActorSheet with common methods, tab handling, drag-drop, context menus",
"completed": true,
"tested": false,
"priority": "critical",
"dependencies": ["2.2"],
"notes": "Uses Foundry v13 ApplicationV2 with HandlebarsApplicationMixin. Includes action handlers, drag-drop, item management. Added _cleanupInactiveTabs() to fix ApplicationV2 part stacking issue with tabs."
},
{
"id": "3.2",
"name": "Design Character sheet layout (HTML/Handlebars)",
"description": "Match official Hero Record: Stats column, HP/Armor/Fatigue, Speed section, Saves, Skills grid, Attacks, Inventory, Abilities, Magic",
"completed": true,
"tested": false,
"priority": "critical",
"dependencies": ["3.1"],
"notes": "Tabbed layout with Main, Inventory, Abilities, Magic, Biography tabs. Templates in templates/actor/."
},
{
"id": "3.3",
"name": "Implement Character sheet - Header section",
"description": "Name, Ancestry, Level, Class, XP, Size, Being Type fields",
"completed": true,
"tested": false,
"priority": "critical",
"dependencies": ["3.2"],
"notes": "Header includes portrait, name, ancestry/class display, level/XP inputs, HP/Mana bars, secondary resources."
},
{
"id": "3.4",
"name": "Implement Character sheet - Stats section",
"description": "Six stats display with large numbers matching official sheet aesthetic",
"completed": true,
"tested": false,
"priority": "critical",
"dependencies": ["3.2"],
"notes": "Stats grid on Main tab with editable values and stat abbreviations."
},
{
"id": "3.5",
"name": "Implement Character sheet - Combat section",
"description": "HP (current/max), Armor, Fatigue, Speed (base/bonus/crawl/travel), Current Luck",
"completed": true,
"tested": false,
"priority": "critical",
"dependencies": ["3.2"],
"notes": "Resource bars in header, secondary resources (Luck, Fatigue, Armor, Speed) displayed."
},
{
"id": "3.6",
"name": "Implement Character sheet - Saves section",
"description": "Reflex, Endure, Will with calculated difficulties, clickable for rolls",
"completed": true,
"tested": false,
"priority": "critical",
"dependencies": ["3.2", "2.7"],
"notes": "Saves grid on Main tab with stat formulas and clickable roll action."
},
{
"id": "3.7",
"name": "Implement Character sheet - Skills section",
"description": "12 skills grid with trained checkboxes, stat associations, difficulty numbers, clickable for rolls",
"completed": true,
"tested": false,
"priority": "critical",
"dependencies": ["3.2", "2.5"],
"notes": "Skills grid with trained toggle, stat abbreviation, difficulty, crit threshold display."
},
{
"id": "3.8",
"name": "Implement Character sheet - Attacks section",
"description": "Weapon attack skills (Melee/Brawl/Ranged/Finesse) with difficulties, equipped weapons list with roll buttons",
"completed": true,
"tested": false,
"priority": "critical",
"dependencies": ["3.2", "2.6"],
"notes": "Attack skills and equipped weapons on Main tab with roll buttons."
},
{
"id": "3.9",
"name": "Implement Character sheet - Inventory tab",
"description": "Item list with slots display, wealth tracking (G/S/C), occupied/max/bonus slots, drag-drop support",
"completed": true,
"tested": false,
"priority": "high",
"dependencies": ["3.2", "2.11"],
"notes": "Inventory tab with weapons, armor, equipment sections, slot tracking, wealth inputs."
},
{
"id": "3.10",
"name": "Implement Character sheet - Abilities tab",
"description": "List of Features, Perks, Ancestry traits; expandable descriptions; usage tracking for limited abilities",
"completed": true,
"tested": false,
"priority": "high",
"dependencies": ["3.2"],
"notes": "Abilities tab with ancestry, features, perks, and active effects display. Perk prerequisites use getPrerequisiteString() from data model for proper formatting."
},
{
"id": "3.11",
"name": "Implement Character sheet - Magic tab",
"description": "Mana (current/max/casting max), known spells list with cast buttons, focus indicator",
"completed": true,
"tested": false,
"priority": "high",
"dependencies": ["3.2", "2.8"],
"notes": "Magic tab with mana display (matching inventory header format), focus panel, spell list with damage/effect badges and cast buttons, spellcasting reference guide with delivery/duration costs."
},
{
"id": "3.12",
"name": "Implement Character sheet - Biography tab",
"description": "Rich text editor for character background, notes, bonds",
"completed": true,
"tested": false,
"priority": "medium",
"dependencies": ["3.2"],
"notes": "Biography tab with character details (Size, Being Type), senses (6 boolean toggles in 3-column grid), movement capabilities (5 boolean toggles: Climb/Cling/Fly/Phase/Swim matching NPC sheet), biography and notes textareas. Languages section hidden until implemented."
},
{
"id": "3.13",
"name": "Create NPC/Monster sheet layout",
"description": "Compact stat block format: HD, HP, TL, Zone, Morale, Armor, Immunities, Weaknesses, Actions, Abilities",
"completed": true,
"tested": false,
"priority": "high",
"dependencies": ["3.1", "1.3"],
"notes": "NPC sheet with header, stats, actions, abilities, and notes sections (no tabs)."
},
{
"id": "3.14",
"name": "Implement NPC sheet - Stat block section",
"description": "Display all combat-relevant stats in traditional TTRPG stat block format",
"completed": true,
"tested": false,
"priority": "high",
"dependencies": ["3.13"],
"notes": "Stats section with zone (with behavior hint), speed (single value), movement capabilities (5 boolean toggles: Climb/Cling/Fly/Phase/Swim per RAW), size, being type, appearing (rollable label), senses (6 boolean toggles), damage modifiers (immunities/resistances/weaknesses)."
},
{
"id": "3.15",
"name": "Implement NPC sheet - Actions section",
"description": "List of attack actions with clickable roll buttons, damage dice display",
"completed": true,
"tested": false,
"priority": "high",
"dependencies": ["3.13", "2.4"],
"notes": "Dynamic actions list with add/delete, editable fields, roll buttons."
},
{
"id": "3.16",
"name": "Implement NPC sheet - Morale button",
"description": "Clickable morale check with result interpretation",
"completed": true,
"tested": false,
"priority": "medium",
"dependencies": ["3.13", "2.13"],
"notes": "Morale roll button in header, disabled when morale broken."
}
]
},
{
"id": "phase-4",
"name": "Item Sheets (UI)",
"description": "Handlebars templates and sheet classes for Item display and editing",
"tasks": [
{
"id": "4.1",
"name": "Create base VagabondItemSheet class",
"description": "Extended ItemSheet with common methods, type-specific tab handling",
"completed": true,
"tested": false,
"priority": "critical",
"dependencies": ["2.3"]
},
{
"id": "4.2",
"name": "Implement Ancestry item sheet",
"description": "Being type dropdown, size dropdown, traits editor (add/remove trait entries)",
"completed": true,
"tested": false,
"priority": "high",
"dependencies": ["4.1", "1.7"]
},
{
"id": "4.3",
"name": "Implement Class item sheet",
"description": "Key stat, training grants, progression table editor, feature definitions",
"completed": true,
"tested": false,
"priority": "high",
"dependencies": ["4.1", "1.8"]
},
{
"id": "4.4",
"name": "Implement Spell item sheet",
"description": "Damage type, effect text, crit effect, delivery options checkboxes, cost formula display",
"completed": true,
"tested": false,
"priority": "high",
"dependencies": ["4.1", "1.9"]
},
{
"id": "4.5",
"name": "Implement Perk item sheet",
"description": "Prerequisites editor (stat/training/spell requirements), description, effects",
"completed": true,
"tested": false,
"priority": "high",
"dependencies": ["4.1", "1.10"]
},
{
"id": "4.6",
"name": "Implement Weapon item sheet",
"description": "Damage dice selector, grip type, properties checkboxes, attack skill dropdown, value/slots",
"completed": true,
"tested": false,
"priority": "high",
"dependencies": ["4.1", "1.11"]
},
{
"id": "4.7",
"name": "Implement Armor item sheet",
"description": "Armor value, type dropdown, dodge penalty checkbox, value/slots",
"completed": true,
"tested": false,
"priority": "high",
"dependencies": ["4.1", "1.12"]
},
{
"id": "4.8",
"name": "Implement Equipment item sheet",
"description": "Generic item fields: description, quantity, slots, value, consumable flag",
"completed": true,
"tested": false,
"priority": "high",
"dependencies": ["4.1", "1.13"]
},
{
"id": "4.9",
"name": "Implement Feature item sheet",
"description": "Source class, level requirement, description, passive/active toggle, effects editor",
"completed": true,
"tested": false,
"priority": "high",
"dependencies": ["4.1", "1.14"]
}
]
},
{
"id": "phase-5",
"name": "Styling & Theming",
"description": "SCSS styles for parchment theme with accessibility considerations",
"tasks": [
{
"id": "5.1",
"name": "Create SCSS architecture",
"description": "Variables file, mixins, partials structure for maintainable styles",
"completed": true,
"tested": false,
"priority": "high",
"dependencies": ["0.6"]
},
{
"id": "5.2",
"name": "Define color palette",
"description": "Parchment background tones, high-contrast text colors, accent colors; WCAG AA compliant",
"completed": true,
"tested": false,
"priority": "high",
"dependencies": ["5.1"]
},
{
"id": "5.3",
"name": "Create typography system",
"description": "Font selections for headers (stylized) and body (readable), size scale, line heights",
"completed": true,
"tested": false,
"priority": "high",
"dependencies": ["5.1"]
},
{
"id": "5.4",
"name": "Style Character sheet",
"description": "Match official Hero Record aesthetic: stat column layout, bordered sections, parchment background",
"completed": true,
"tested": false,
"priority": "high",
"dependencies": ["5.1", "5.2", "5.3", "3.2"],
"notes": "All tabs styled: Header (portrait, name, resources), Main tab (stats, combat, saves, skills, attacks), Inventory tab (inline header with item slots/currencies, item lists), Abilities tab (ancestry, features, perks, active effects), Magic tab (mana display, focus panel, spell list, casting reference), Biography tab (details, senses grid, textareas). Uses container queries for responsive layout."
},
{
"id": "5.5",
"name": "Style NPC sheet",
"description": "Clean stat block format, readable at small sizes, collapsible sections",
"completed": true,
"tested": false,
"priority": "high",
"dependencies": ["5.1", "5.2", "5.3", "3.13"],
"notes": "NPC sheet styled with: header (portrait, name, HD/TL/Armor boxes, HP bar, morale), stats section (zone with behavior hint, speed, size/type, appearing with rollable label), movement grid (Climb/Cling/Fly/Phase/Swim booleans matching senses pattern), senses row, damage modifiers, actions list with add/delete/roll, abilities list, notes section (loot, GM notes). Scrollbar fix for overflow. Movement uses boolean toggles per RAW (all use base speed)."
},
{
"id": "5.6",
"name": "Style Item sheets",
"description": "Consistent look across all item types, clear form layouts",
"completed": true,
"tested": false,
"priority": "medium",
"dependencies": ["5.1", "5.2", "5.3", "4.1"],
"notes": "Styled all 8 item types with: header (image with hover effect, styled name input, color-coded type badges), tab navigation, form inputs (transitions, focus states, disabled states), fieldsets, properties grids, type-specific sections (traits, prerequisites, progression tables, features, relic sections, spell effects). Added .hidden utility for tab switching, custom scrollbar, flexbox layout for proper scrolling. ALSO IMPLEMENTED: Light/Dark theme system with CSS custom properties - registered themes in system.json, created _theme-variables.scss with light (parchment) and dark color palettes, converted all SCSS color variables to CSS custom properties across base, mixins, components, and sheet styles."
},
{
"id": "5.7",
"name": "Style roll dialogs",
"description": "Favor/Hinder toggles, modifier inputs, clear roll button",
"completed": true,
"tested": false,
"priority": "medium",
"dependencies": ["5.1", "5.2"],
"notes": "Comprehensive styling in _roll-dialog.scss (950 lines): ApplicationV2 dialogs with themed backgrounds, skill/weapon/save/spell selections, info panels with difficulty/crit display, favor/hinder toggles with active states, damage preview, mana display for spells, focus warnings, legacy dialog support, Favor/Hinder Debug Panel."
},
{
"id": "5.8",
"name": "Style chat cards",
"description": "Roll results, spell casts, attack outcomes in themed chat messages",
"completed": true,
"tested": false,
"priority": "medium",
"dependencies": ["5.1", "5.2"],
"notes": "Comprehensive styling in _chat-cards.scss (577 lines): Card headers with icons and badges, roll results with success/failure/critical/fumble states, roll breakdown display, damage sections with critical highlighting, weapon properties, spell cards with mana cost and focus indicator, animations for crits and fumbles."
},
{
"id": "5.9",
"name": "Accessibility audit",
"description": "Verify color contrast ratios, focus indicators, screen reader compatibility",
"completed": true,
"tested": false,
"priority": "high",
"dependencies": ["5.4", "5.5", "5.6"],
"notes": "Fixed WCAG AA compliance: accent-highlight (#7a4f1d, 5.23:1), warning (#705308, 5.29:1), dark theme muted text (#9a8e7e, 5.39:1). Added .sr-only utility, .interactive-row with focus-visible, prefers-reduced-motion support. Interactive rows (saves, attacks) have role=button, tabindex=0, aria-labels. Stat inputs have proper label for= associations. Keyboard accessibility via _setupKeyboardAccessibility() for Enter/Space activation."
},
{
"id": "5.10",
"name": "Investigate per-sheet theming in Foundry v13",
"description": "Per-sheet theme selection via Configure Sheet dialog doesn't work - Foundry v13 shows theme options but doesn't store selection in document flags or apply theme classes to ApplicationV2 sheets. Infrastructure exists (CSS variables, _applyThemeClass JS), need to find correct Foundry API for per-sheet theme storage. Global theme switching works via Settings > Color Scheme.",
"completed": false,
"tested": false,
"priority": "low",
"dependencies": ["5.6"],
"notes": "CSS infrastructure complete in _theme-variables.scss. JS _applyThemeClass() in base-actor-sheet.mjs and base-item-sheet.mjs applies theme class based on settings. Current workaround: use global Foundry color scheme (Settings > Configure Settings > Color Scheme > Applications). Per-sheet theme dropdown in Configure Sheet appears but selection not persisted to document.flags.core.sheetTheme."
},
{
"id": "5.11",
"name": "Add resizable editor containers",
"description": "Allow users to drag-resize ProseMirror editor text boxes on item sheets for viewing/editing longer content. CSS resize:vertical not working with Foundry's prose-mirror element structure.",
"completed": false,
"tested": false,
"priority": "low",
"dependencies": ["5.6"],
"notes": "Editors functional with prose-mirror element in v13 ApplicationV2. Resize handle not appearing despite CSS - may need JavaScript-based resize or different approach. Foundry's internal .editor-container conflicts with custom wrapper naming."
}
]
},
{
"id": "phase-6",
"name": "Compendium Content",
"description": "Pre-populated compendium packs with all Vagabond RPG content",
"tasks": [
{
"id": "6.1",
"name": "Create compendium pack definitions",
"description": "Define packs in system.json: ancestries, classes, spells, perks, weapons, armor, equipment, monsters",
"completed": true,
"tested": false,
"priority": "high",
"dependencies": ["0.1"]
},
{
"id": "6.2",
"name": "Populate Ancestries compendium",
"description": "Human, Dwarf, Elf, Halfling, Draken, Goblin, Orc with full traits",
"completed": true,
"tested": false,
"priority": "high",
"dependencies": ["6.1", "1.7"]
},
{
"id": "6.3",
"name": "Populate Classes compendium",
"description": "All 18 classes with complete progression tables and features",
"completed": true,
"tested": false,
"priority": "high",
"dependencies": ["6.1", "1.8"]
},
{
"id": "6.4",
"name": "Populate Spells compendium",
"description": "All 55+ spells with damage types, effects, crit bonuses, delivery/duration options",
"completed": false,
"tested": false,
"priority": "high",
"dependencies": ["6.1", "1.9"]
},
{
"id": "6.5",
"name": "Populate Perks compendium",
"description": "All 90+ perks with prerequisites and full descriptions",
"completed": false,
"tested": false,
"priority": "high",
"dependencies": ["6.1", "1.10"]
},
{
"id": "6.6",
"name": "Populate Weapons compendium",
"description": "Standard weapons from equipment tables with stats and properties",
"completed": false,
"tested": false,
"priority": "medium",
"dependencies": ["6.1", "1.11"]
},
{
"id": "6.7",
"name": "Populate Armor compendium",
"description": "Standard armor options from equipment tables",
"completed": false,
"tested": false,
"priority": "medium",
"dependencies": ["6.1", "1.12"]
},
{
"id": "6.8",
"name": "Populate Equipment compendium",
"description": "Adventuring gear, alchemical items, tools from equipment tables",
"completed": false,
"tested": false,
"priority": "medium",
"dependencies": ["6.1", "1.13"]
},
{
"id": "6.9",
"name": "Populate Bestiary compendium",
"description": "Monsters from bestiary with full stat blocks (prioritize common encounters)",
"completed": false,
"tested": false,
"priority": "medium",
"dependencies": ["6.1", "1.3"]
}
]
},
{
"id": "phase-7",
"name": "Roll Dialogs & Chat",
"description": "Interactive roll configuration dialogs and rich chat message output",
"tasks": [
{
"id": "7.1",
"name": "Create Skill Check dialog",
"description": "Select skill, show difficulty/crit threshold, favor/hinder toggles, situational modifier input",
"completed": true,
"tested": false,
"priority": "critical",
"dependencies": ["2.5"],
"notes": "skill-check-dialog.mjs and templates/chat/skill-roll.hbs exist"
},
{
"id": "7.2",
"name": "Create Attack Roll dialog",
"description": "Weapon selection, attack skill, favor/hinder, show crit threshold, target selection",
"completed": true,
"tested": false,
"priority": "critical",
"dependencies": ["2.6"],
"notes": "attack-roll-dialog.mjs and templates/chat/attack-roll.hbs exist"
},
{
"id": "7.3",
"name": "Create Save Roll dialog",
"description": "Save type selection (or auto from context), Block/Dodge choice for defense, favor/hinder",
"completed": true,
"tested": false,
"priority": "critical",
"dependencies": ["2.7"],
"notes": "save-roll-dialog.mjs and templates/chat/save-roll.hbs exist"
},
{
"id": "7.4",
"name": "Create Spell Cast dialog",
"description": "Damage dice selector (+Mana), delivery type dropdown with cost display, duration selector, total mana cost, cast skill",
"completed": true,
"tested": false,
"priority": "critical",
"dependencies": ["2.8"],
"notes": "spell-cast-dialog.mjs and templates/chat/spell-cast.hbs exist"
},
{
"id": "7.5",
"name": "Create Damage Roll dialog",
"description": "Dice pool display, exploding toggle, crit bonus indicator, target HP context",
"completed": false,
"tested": false,
"priority": "high",
"dependencies": ["2.4"]
},
{
"id": "7.6",
"name": "Create roll result chat cards",
"description": "Rich chat output: roll formula, result, success/fail/crit indicator, damage if applicable",
"completed": true,
"tested": false,
"priority": "high",
"dependencies": ["2.4"],
"notes": "Chat card templates exist for all roll types"
},
{
"id": "7.7",
"name": "Create spell cast chat cards",
"description": "Spell name, effect description, mana spent, damage if applicable, duration/focus indicator",
"completed": true,
"tested": false,
"priority": "high",
"dependencies": ["2.8", "7.6"],
"notes": "templates/chat/spell-cast.hbs exists"
},
{
"id": "7.8",
"name": "Create defense prompt system",
"description": "When attack targets a token, prompt defender with Block/Dodge buttons in chat",
"completed": false,
"tested": false,
"priority": "medium",
"dependencies": ["7.2", "7.3"]
}
]
},
{
"id": "phase-8",
"name": "Localization",
"description": "Internationalization support with English as base language",
"tasks": [
{
"id": "8.1",
"name": "Create English language file",
"description": "All UI strings, stat names, skill names, item type names in en.json",
"completed": false,
"tested": false,
"priority": "high",
"dependencies": ["3.2", "4.1"]
},
{
"id": "8.2",
"name": "Implement localization in templates",
"description": "Replace hardcoded strings with {{localize}} calls throughout all Handlebars templates",
"completed": false,
"tested": false,
"priority": "high",
"dependencies": ["8.1"]
}
]
},
{
"id": "phase-9",
"name": "Testing & Polish",
"description": "Quality assurance, bug fixes, and user experience refinements",
"tasks": [
{
"id": "9.1",
"name": "Test character creation workflow",
"description": "Create character from scratch: set stats, add ancestry, add class, verify derived values",
"completed": false,
"tested": false,
"priority": "critical",
"dependencies": ["3.2", "6.2", "6.3"]
},
{
"id": "9.2",
"name": "Test skill check workflow",
"description": "Roll all 12 skills with various favor/hinder combinations, verify difficulties",
"completed": false,
"tested": false,
"priority": "critical",
"dependencies": ["7.1"]
},
{
"id": "9.3",
"name": "Test combat workflow",
"description": "Full combat round: attacks, saves, damage, HP tracking, death at 0 HP",
"completed": false,
"tested": false,
"priority": "critical",
"dependencies": ["7.2", "7.3", "7.5"]
},
{
"id": "9.4",
"name": "Test spell casting workflow",
"description": "Cast spells with various delivery/duration/damage combinations, verify mana costs",
"completed": false,
"tested": false,
"priority": "critical",
"dependencies": ["7.4"]
},
{
"id": "9.5",
"name": "Test leveling workflow",
"description": "Level up character: HP increase, feature gains, perk at odd levels, stat at even levels",
"completed": false,
"tested": false,
"priority": "high",
"dependencies": ["2.12"]
},
{
"id": "9.6",
"name": "Test compendium import",
"description": "Drag items from all compendiums to character, verify data integrity",
"completed": false,
"tested": false,
"priority": "high",
"dependencies": ["6.2", "6.3", "6.4", "6.5"]
},
{
"id": "9.7",
"name": "Test NPC/Monster workflow",
"description": "Create monster, run attacks, trigger morale check",
"completed": false,
"tested": false,
"priority": "high",
"dependencies": ["3.13", "6.9"]
},
{
"id": "9.8",
"name": "Cross-browser testing",
"description": "Verify functionality in Chrome, Firefox, Safari",
"completed": false,
"tested": false,
"priority": "medium",
"dependencies": ["9.1", "9.2", "9.3", "9.4"]
},
{
"id": "9.9",
"name": "Performance optimization",
"description": "Profile sheet rendering, optimize slow operations",
"completed": false,
"tested": false,
"priority": "medium",
"dependencies": ["9.1"]
}
]
},
{
"id": "phase-10",
"name": "Documentation & Release",
"description": "User documentation and package preparation for distribution",
"tasks": [
{
"id": "10.1",
"name": "Write user guide",
"description": "How to create characters, use sheets, cast spells, run combat",
"completed": false,
"tested": false,
"priority": "medium",
"dependencies": ["9.1", "9.2", "9.3", "9.4"]
},
{
"id": "10.2",
"name": "Write GM guide",
"description": "How to create NPCs/monsters, use compendiums, run encounters",
"completed": false,
"tested": false,
"priority": "medium",
"dependencies": ["9.7"]
},
{
"id": "10.3",
"name": "Create changelog",
"description": "Version history with features and fixes",
"completed": false,
"tested": false,
"priority": "low",
"dependencies": []
},
{
"id": "10.4",
"name": "Prepare package for Foundry repository",
"description": "Verify manifest, create release bundle, test fresh installation",
"completed": false,
"tested": false,
"priority": "low",
"dependencies": ["10.1", "10.2"]
}
]
},
{
"id": "phase-11",
"name": "Active Effects Automation",
"description": "Automate mechanical effects from ancestries, perks, and class features via Active Effects changes arrays",
"tasks": [
{
"id": "11.1",
"name": "Extend EFFECT_KEYS mapping",
"description": "Add missing keys to module/helpers/effects.mjs: senses (6), movement capabilities (5), skill training (12), focus tracking",
"completed": true,
"tested": false,
"priority": "critical",
"dependencies": ["1.15"]
},
{
"id": "11.2",
"name": "Create Active Effects reference documentation",
"description": "Create docs/ACTIVE_EFFECTS_REFERENCE.md documenting all available effect keys, modes, JSON format, and formula support",
"completed": true,
"tested": false,
"priority": "high",
"dependencies": ["11.1"]
},
{
"id": "11.3",
"name": "Automate Dwarf ancestry traits",
"description": "Add changes arrays: Darksight (system.senses.darkvision=true), Tough (system.resources.hp.bonus=@level)",
"completed": true,
"tested": false,
"priority": "high",
"dependencies": ["11.1"],
"notes": "Sturdy trait deferred - requires conditional Favor flag system"
},
{
"id": "11.4",
"name": "Automate Goblin ancestry traits",
"description": "Add changes arrays: Darksight (system.senses.darkvision=true), Nimble (system.speed.bonus=5)",
"completed": true,
"tested": false,
"priority": "high",
"dependencies": ["11.1"],
"notes": "Scavenger trait deferred - requires conditional Favor flag system"
},
{
"id": "11.5",
"name": "Automate Orc ancestry traits",
"description": "Add changes arrays: Darksight (system.senses.darkvision=true), Hulking (system.itemSlots.bonus=2)",
"completed": true,
"tested": false,
"priority": "high",
"dependencies": ["11.1"],
"notes": "Beefy trait deferred - requires conditional Favor flag system"
},
{
"id": "11.6",
"name": "Automate Halfling ancestry traits",
"description": "Add changes array: Nimble (system.speed.bonus=5)",
"completed": true,
"tested": false,
"priority": "high",
"dependencies": ["11.1"],
"notes": "Squat (movement rule) and Tricksy (rest bonus) deferred"
},
{
"id": "11.7",
"name": "Automate Draken ancestry traits",
"description": "Add changes array: Scale (system.armor=+1)",
"completed": true,
"tested": false,
"priority": "high",
"dependencies": ["11.1"],
"notes": "Breath Attack (complex ability) and Draconic Resilience (damage type choice) deferred"
},
{
"id": "11.8",
"name": "Automate Tough perk",
"description": "Verify changes array: system.resources.hp.bonus=@level (stackable)",
"completed": true,
"tested": false,
"priority": "high",
"dependencies": ["11.1"],
"notes": "Already had correct implementation from earlier work"
},
{
"id": "11.9",
"name": "Automate Fighter class features",
"description": "Valor I/II/III crit reductions for melee and ranged attacks",
"completed": true,
"tested": false,
"priority": "high",
"dependencies": ["11.1"],
"notes": "Fighter is the proof of concept. Valor reduces melee+ranged crit thresholds by -1/-2/-3."
},
{
"id": "11.10",
"name": "Automate Wizard class features",
"description": "Manifold Mind I/II: system.focus.maxConcurrent += 1 each (cumulative to 2, then 3)",
"completed": true,
"tested": false,
"priority": "high",
"dependencies": ["11.1"]
},
{
"id": "11.11",
"name": "Implement Favor/Hinder flag system for traits",
"description": "Create flag-based system for conditional Favor/Hinder: Elven Eyes (Favor on sight-based Detect), Beefy (Favor on Grapple/Shove), Scavenger (Favor on Sickened saves), Sturdy (Favor on Fear/Sickened/Shove)",
"completed": false,
"tested": false,
"priority": "medium",
"dependencies": ["11.3", "11.4", "11.5"],
"notes": "Deferred - requires extending existing Favor/Hinder Active Effects flag system to handle conditional triggers"
},
{
"id": "11.12",
"name": "Implement skill selection UI for ancestry traits",
"description": "Create dialog for traits that grant skill training choice: Elf Ascendancy (1 skill), Human Knack (1 skill + 1 perk)",
"completed": false,
"tested": false,
"priority": "medium",
"dependencies": ["11.3"],
"notes": "Deferred - requires UI similar to class level-up dialog"
},
{
"id": "11.13",
"name": "Implement spell selection UI for ancestry traits",
"description": "Create dialog for traits that grant spells: Elf Naturally Attuned (1 spell of choice)",
"completed": false,
"tested": false,
"priority": "medium",
"dependencies": ["11.12"],
"notes": "Deferred - requires spell compendium browser integration"
},
{
"id": "11.14",
"name": "Implement damage type selection for Draken",
"description": "Create dialog at ancestry add for Breath Attack damage type choice (fire/cold/shock/acid), applies to Draconic Resilience resistance",
"completed": false,
"tested": false,
"priority": "medium",
"dependencies": ["11.7"],
"notes": "Deferred - requires damage resistance system"
},
{
"id": "11.15",
"name": "Implement rest bonus hooks",
"description": "Hook into rest system for: Halfling Tricksy (+1 Luck on rest)",
"completed": false,
"tested": false,
"priority": "low",
"dependencies": ["11.6"],
"notes": "Deferred - requires rest system implementation"
},
{
"id": "11.16",
"name": "Implement Sharpshooter action tracking",
"description": "Track 'skip Move' action to enable crit reduction for Sharpshooter perk",
"completed": false,
"tested": false,
"priority": "low",
"dependencies": ["11.8"],
"notes": "Deferred - requires action economy tracking system"
},
{
"id": "11.17",
"name": "Implement Situational Awareness automation",
"description": "Automate: Favor on surprise checks, flanking doesn't Hinder saves",
"completed": false,
"tested": false,
"priority": "low",
"dependencies": ["11.11"],
"notes": "Deferred - requires conditional Favor/Hinder flag system and flanking tracking"
},
{
"id": "11.18",
"name": "Implement Gunslinger Deadeye tracking",
"description": "Track consecutive ranged hits to dynamically reduce crit threshold (resets each turn)",
"completed": false,
"tested": false,
"priority": "low",
"dependencies": ["11.1"],
"notes": "Deferred - requires combat turn state tracking, not a simple static bonus"
}
]
}
],
"summary": {
"total_tasks": 124,
"phases": 12,
"critical_path": [
"0.1 -> 1.1 -> 2.1 -> 2.2 -> 3.1 -> 3.2 -> 7.1 -> 9.2",
"0.1 -> 1.6 -> 1.9 -> 2.8 -> 7.4 -> 9.4"
],
"estimated_complexity": "large",
"notes": [
"Phase 0-2 must complete before meaningful UI work",
"Phases 3-4 can proceed in parallel once data models exist",
"Phase 5 styling can be iterated throughout",
"Phase 6 content population can happen incrementally",
"Phase 7 dialogs depend on core mechanics but can be refined iteratively",
"Testing should happen continuously, not just in Phase 9"
]
}
}