Flexible race system with slot-based equipment and dragon race

- Expand race TOML schema: 7 stats, body shape (size/weight/custom slots),
  natural armor and attacks with damage types, resistances, traits/disadvantages,
  regen multipliers, vision types, XP rate, guild compatibility
- Replace equipped_weapon/equipped_armor with slot-based HashMap<String, Object>
- Each race defines available equipment slots; default humanoid slots as fallback
- Combat uses natural weapons/armor from race when no gear equipped
- DB migration from old weapon/armor columns to equipped_json
- Add Dragon race: huge body, custom slots (forelegs/wings/tail), fire breath,
  natural armor 8, fire immune, slow XP rate for balance
- Update all existing races with expanded fields (traits, resistances, vision, regen)
- Objects gain optional slot field; kind=weapon/armor still works as fallback
- Update chargen to display race traits, size, natural attacks, vision
- Update stats display to show equipment and natural bonuses separately
- Update TESTING.md and AGENTS.md with race/slot system documentation

Made-with: Cursor
This commit is contained in:
AI Agent
2026-03-14 15:37:20 -06:00
parent 3f164e4697
commit 005c4faf08
18 changed files with 586 additions and 139 deletions

View File

@@ -15,7 +15,10 @@ Run through these checks before every commit to ensure consistent feature covera
## Character Creation
- [ ] New player SSH → gets chargen flow (race + class selection)
- [ ] Chargen accepts both number and name input
- [ ] All races display with expanded info (size, traits, natural attacks, vision)
- [ ] Dragon race shows custom body slots, natural armor, fire breath, vision types
- [ ] After chargen, player appears in spawn room with correct stats
- [ ] Stats reflect race modifiers (STR, DEX, CON, INT, WIS, PER, CHA)
- [ ] Player saved to DB after creation
## Player Persistence
@@ -68,13 +71,18 @@ Run through these checks before every commit to ensure consistent feature covera
- [ ] Damage varies between hits (not identical each time)
- [ ] Multiple rapid attacks produce different damage values
## Items
## Items & Equipment Slots
- [ ] `take <item>` picks up takeable objects
- [ ] `drop <item>` places item in room
- [ ] `equip <weapon/armor>` works, old gear returns to inventory
- [ ] `equip <weapon>` equips to `main_hand` slot (backwards-compat via kind)
- [ ] `equip <armor>` equips to appropriate slot (obj `slot` field or fallback)
- [ ] Equipping to an occupied slot returns old item to inventory
- [ ] `equip` fails if race doesn't have the required slot
- [ ] Objects with explicit `slot` field use that slot
- [ ] `use <consumable>` heals and removes item (immediate out of combat)
- [ ] `use <consumable>` in combat queues for next tick
- [ ] `inventory` shows equipped + bag items
- [ ] `inventory` shows equipped items by slot name + bag items
- [ ] `stats` shows equipment bonuses and natural bonuses separately
## Status Effects
- [ ] Poison deals damage each tick, shows message to player
@@ -97,6 +105,19 @@ Run through these checks before every commit to ensure consistent feature covera
- [ ] Server remains responsive to immediate commands between ticks
- [ ] Multiple players in separate combats are processed independently per tick
## Race System
- [ ] Existing races (Human, Elf, Dwarf, Orc, Halfling) load with expanded fields
- [ ] Dragon race loads with custom body, natural attacks, resistances, traits
- [ ] Dragon gets custom equipment slots (forelegs, hindlegs, wings, tail)
- [ ] Dragon's natural armor (8) shows in stats and affects defense
- [ ] Dragon's natural attacks (fire breath 15dmg) affect effective attack
- [ ] Items magically resize — no size restrictions on gear (dragon can use swords)
- [ ] Races without explicit [body.slots] get default humanoid slots
- [ ] Stat modifiers include PER (perception) and CHA (charisma)
- [ ] Race traits and disadvantages display during chargen
- [ ] XP rate modifier stored per race (dragon = 0.7x)
- [ ] Regen modifiers stored per race (dragon HP regen = 1.5x)
## Attitude System
- [ ] Per-player NPC attitudes stored in DB
- [ ] `examine` shows attitude label per-player