Skip to content

Save character inventory and auto-save on server shutdown #31

Description

@FirebrickRed

Priority: HIGH
Status: TODO
Related: #25 (Class Resources), #26 (Spell Slots)

Problem

Character data is not fully persisted to YAML. Currently saves basic info (name, race, class, abilities, HP, AC) but missing:

  • ❌ Equipment/inventory items
  • ❌ Equipped armor and shield
  • ❌ Class resources (Rage, Ki Points, Bardic Inspiration, etc.)
  • ❌ Known spells and cantrips
  • ❌ Current spell slot state (mentioned in code TODOs)
  • ❌ Auto-save on server shutdown not implemented

Result: Players lose resources, spells, and items on server restart!

Acceptance Criteria

Equipment Persistence

  • Save equipment list to YAML (item IDs and quantities)
  • Save equipped armor ID
  • Save equipped shield ID
  • Load equipment on character load
  • Re-equip armor/shield on load

Class Resources Persistence (Issue #25)

  • Save class resources (name, current, max, recovery type)
  • Load resources on character load

Spell Persistence

  • Save known spells (spell names list)
  • Save known cantrips (cantrip names list)
  • Save current spell slots per level (not just max)
  • Load all spell data on character load

Auto-Save System

  • Hook into server shutdown event
  • Call CharacterSheetManager.saveAllCharacters() on shutdown
  • Ensure all active characters are persisted
  • Add periodic auto-save (optional: every 5 minutes?)

YAML Format Updates

Current format:

character_name: Bjorn
race: Human
class: Barbarian
# ... basic fields

New format:

character_name: Bjorn
race: Human
class: Barbarian
# ... existing fields ...

# NEW: Class resources
class_resources:
  - name: Rage
    current: 1
    max: 2
    recovery: LONG_REST

# NEW: Spells
known_spells:
  - Cure Wounds
  - Bless
known_cantrips:
  - Sacred Flame
  - Light

# NEW: Spell slots
spell_slots_current: [2, 1, 0, 0, 0, 0, 0, 0, 0]  # Current slots per level
spell_slots_max: [3, 2, 0, 0, 0, 0, 0, 0, 0]      # Max slots per level

# NEW: Equipment
equipment:
  - greataxe
  - leather_armor
  - explorers_pack
equipped_armor: leather_armor
equipped_shield: null

Technical Notes

  • Update CharacterPersistenceLoader.saveCharacter() to save new fields
  • Update CharacterSheet.loadFromData() to load new fields
  • Use ClassResource serialization for resource data
  • Consider adding lastSaved timestamp for debugging

Related Issues

Future Enhancements

  • Periodic auto-save (every 5 minutes)
  • Character backup system

Metadata

Metadata

Assignees

No one assigned

    Labels

    equipmentItems, inventory, weapons, armor

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions