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:
20
AGENTS.md
20
AGENTS.md
@@ -12,6 +12,9 @@ This is a Rust MUD server that accepts SSH connections. The architecture separat
|
||||
- Status effects persist in the database and continue ticking while players are offline.
|
||||
- The `GameDb` trait abstracts the database backend (currently SQLite).
|
||||
- World data is loaded from TOML at startup. Content changes don't require recompilation.
|
||||
- **Races are deeply data-driven**: body shape, equipment slots, natural weapons/armor, resistances, traits, regen rates — all defined in TOML. A dragon has different slots than a human.
|
||||
- **Equipment is slot-based**: each race defines available body slots. Items declare their slot. The engine validates compatibility at equip time.
|
||||
- **Items magically resize** — no size restrictions. A dragon can wield a human sword.
|
||||
|
||||
## Architecture
|
||||
|
||||
@@ -76,6 +79,23 @@ src/
|
||||
2. Currently: hostile NPCs auto-engage players in their room
|
||||
3. Add new behaviors there (e.g. NPC movement, dialogue triggers)
|
||||
|
||||
### New race
|
||||
1. Create `world/races/<name>.toml` — see `dragon.toml` for a complex example
|
||||
2. Required: `name`, `description`
|
||||
3. All other fields have sensible defaults via `#[serde(default)]`
|
||||
4. Key sections: `[stats]` (7 stats), `[body]` (size, weight, slots), `[natural]` (armor, attacks), `[resistances]`, `[regen]`, `[misc]`, `[guild_compatibility]`
|
||||
5. `traits` and `disadvantages` are free-form string arrays
|
||||
6. If `[body] slots` is empty, defaults to humanoid slots
|
||||
7. Natural attacks: use `[natural.attacks.<name>]` with `damage`, `type`, optional `cooldown_ticks`
|
||||
8. Resistances: damage_type → multiplier (0.0 = immune, 1.0 = normal, 1.5 = vulnerable)
|
||||
9. `xp_rate` modifies XP gain (< 1.0 = slower leveling, for powerful races)
|
||||
|
||||
### New equipment slot
|
||||
1. Add the slot name to a race's `[body] slots` array
|
||||
2. Create objects with `slot = "<slot_name>"` in their TOML
|
||||
3. The `kind` field (`weapon`/`armor`) still works as fallback for `main_hand`/`torso`
|
||||
4. Items can also have an explicit `slot` field to target any slot
|
||||
|
||||
### New world content
|
||||
1. Add TOML files under `world/<region>/` — no code changes needed
|
||||
2. NPCs without a `[combat]` section get default stats (20hp/4atk/2def/5xp)
|
||||
|
||||
Reference in New Issue
Block a user