Compare commits

..

2 Commits

Author SHA1 Message Date
AI Agent
98967ebe59 Add world content: warden class, druids guild, sylvan race, town expansion, whispering_woods region
Made-with: Cursor
2026-03-14 17:24:09 -06:00
AI Agent
5d290a8396 Add PLANNED.md with features grouped by difficulty
Made-with: Cursor
2026-03-14 17:23:14 -06:00
42 changed files with 447 additions and 0 deletions

32
PLANNED.md Normal file
View File

@@ -0,0 +1,32 @@
# Planned Features
Tracking document for features and content planned for the MUD server. No implementation order implied unless noted. Grouped by difficulty (effort / scope).
## Easy
Content-only or minimal code; add TOML/data and existing systems already support it.
- **More classes** — Additional character classes beyond current set; add via `world/classes/*.toml`.
- **More areas** — Additional regions/areas; add via new `world/<region>/` directories and content.
- **More races** — Additional playable or NPC races; add via `world/races/*.toml`.
- **More guilds** — Additional spell progressions and roles; add via `world/guilds/*.toml`.
- **More spells** — Additional spells for combat and utility; add via `world/spells/*.toml`.
## Medium
New state, commands, or mechanics with bounded scope.
- **Weather** — Weather system (e.g., rain, snow, fog) affecting areas or atmosphere; scope TBD.
- **Day/night or time of day** — Time cycle affecting room descriptions, spawns, or NPC behavior; lighter than full weather.
- **Shops / economy** — NPCs that buy and sell; currency and pricing (new fields/tables, trade commands).
- **Quests or objectives** — Simple “kill X” / “bring Y” goals; quest state in DB and hooks in combat/loot/NPCs.
- **Player parties** — Group formation, shared objectives, party-only chat or visibility; new state and commands.
- **PvP** — Player-vs-player combat; consent/flagging, safe zones, and balance TBD.
## Hard
Larger or open-ended systems; more design and implementation.
- **Crafting** — Recipes and combining items; new item kinds and possibly tables.
- **Pets / followers** — Combat or utility companions; new state and AI.
- **Player mail / messaging** — Offline messages between characters; DB table and commands.

13
world/classes/warden.toml Normal file
View File

@@ -0,0 +1,13 @@
name = "Warden"
description = "Vigilant defenders of the forest, wardens balance physical prowess with nature's magic."
guild = "guild:druids_guild"
[base_stats]
max_hp = 110
attack = 10
defense = 12
[growth]
hp_per_level = 12
attack_per_level = 2
defense_per_level = 3

View File

@@ -0,0 +1,16 @@
name = "Druids Guild"
description = "Guardians of the forest and masters of nature's magic. Members focus on defense, healing, and manipulating the natural world."
max_level = 50
resource = "mana"
base_mana = 50
base_endurance = 20
spells = ["spell:entangle", "spell:barkskin", "spell:thorns", "spell:heal"]
min_player_level = 0
race_restricted = []
[growth]
hp_per_level = 5
mana_per_level = 5
endurance_per_level = 2
attack_per_level = 2
defense_per_level = 3

46
world/races/sylvan.toml Normal file
View File

@@ -0,0 +1,46 @@
name = "Sylvan"
description = "Graceful and elegant, the Sylvan are children of the forest, deeply connected to the natural world. They possess a natural affinity for magic and a deep understanding of nature's secrets."
metarace = "fey"
[stats]
strength = -1
dexterity = 2
constitution = -1
intelligence = 2
wisdom = 3
perception = 2
charisma = 1
[body]
size = "medium"
weight = 120
slots = ["head", "neck", "torso", "arms", "hands", "waist", "legs", "feet", "finger_left", "finger_right", "main_hand", "off_hand"]
[natural]
armor = 1
traits = ["nature_affinity", "low_light_vision", "fey_ancestry", "speak_with_animals"]
disadvantages = ["vulnerable_to_cold_iron", "conspicuous_in_non-forest_areas"]
[resistances]
magical = 0.5
physical = 1.0
poison = 0.5
[regen]
hp = 1.2
mana = 1.5
endurance = 1.0
[guild_compatibility]
good = ["druid", "ranger", "mage"]
average = ["cleric", "thief"]
poor = ["warrior", "berserker"]
restricted = ["monk"]
[misc]
lifespan = 1000
diet = "omnivore"
xp_rate = 1.0
natural_terrain = ["forests", "glades"]
vision = ["normal", "low_light_vision"]

View File

@@ -0,0 +1,11 @@
name = "Barkskin"
description = "Your skin becomes as hard as bark, increasing your defense for a short period."
spell_type = "heal"
heal = 0
damage_type = "magical"
cost_mana = 20
cooldown_ticks = 10
effect = "barkskin"
effect_duration = 10
effect_magnitude = 10
min_guild_level = 5

View File

@@ -0,0 +1,11 @@
name = "Entangle"
description = "Vines and branches reach out to restrain your target, reducing their ability to attack or defend."
spell_type = "offensive"
damage = 5
damage_type = "physical"
cost_mana = 15
cooldown_ticks = 3
effect = "entangled"
effect_duration = 5
effect_magnitude = 5
min_guild_level = 1

11
world/spells/thorns.toml Normal file
View File

@@ -0,0 +1,11 @@
name = "Thorns"
description = "Vicious thorns grow from your body, damaging anyone who attacks you."
spell_type = "offensive"
damage = 5
damage_type = "physical"
cost_mana = 10
cooldown_ticks = 5
effect = "thorns"
effect_duration = 10
effect_magnitude = 5
min_guild_level = 10

View File

@@ -0,0 +1,14 @@
name = "Wealthy Aristocrat"
description = "A noble dressed in fine silks and velvet, turning their nose up at commoners."
room = "town:wealthy_district"
base_attitude = "neutral"
class = "class:peasant"
[stats]
hp = 30
attack = 2
defense = 5
xp = 15
[dialogue]
greeting = "Do you mind? I am expecting someone important."

View File

@@ -0,0 +1,14 @@
name = "Quartermaster Kael"
description = "A grizzled veteran with a missing eye, currently meticulously sharpening a broadsword."
room = "town:armory"
base_attitude = "neutral"
class = "class:warrior"
[stats]
hp = 200
attack = 18
defense = 25
xp = 300
[dialogue]
greeting = "Keep your hands off the merchandise unless you're buying."

View File

@@ -0,0 +1,14 @@
name = "High Priestess Elara"
description = "An elderly woman radiating a calm, authoritative aura. Her white robes are immaculate."
room = "town:inner_sanctum"
base_attitude = "friendly"
class = "class:cleric"
[stats]
hp = 120
attack = 8
defense = 20
xp = 250
[dialogue]
greeting = "The Light welcomes all who seek its warmth."

View File

@@ -0,0 +1,14 @@
name = "Zarok the Enchanter"
description = "An eccentric old man with a wild beard, smelling of sulfur and ozone."
room = "town:magic_shop"
base_attitude = "neutral"
class = "class:mage"
[stats]
hp = 60
attack = 15
defense = 5
xp = 150
[dialogue]
greeting = "Ah! Browsing the arcane, are we? Don't touch the glowing jars."

View File

@@ -0,0 +1,14 @@
name = "Mayor Thorne"
description = "A portly man with a boisterous laugh and a shrewd gaze. He wears a heavy chain of office."
room = "town:mayors_estate"
base_attitude = "friendly"
class = "class:peasant"
[stats]
hp = 80
attack = 5
defense = 10
xp = 100
[dialogue]
greeting = "Welcome to Thornwall! Mind the laws, and we'll get along famously."

View File

@@ -0,0 +1,12 @@
name = "Sewer Mutant"
description = "A horrific amalgamation of rat and something far worse. It drools a caustic green slime."
room = "town:sewers_west"
base_attitude = "hostile"
class = "class:creature"
race = "race:beast"
[stats]
hp = 90
attack = 12
defense = 8
xp = 120

View File

@@ -0,0 +1,14 @@
name = "Silas the Shadow"
description = "A lean, scarred man twirling a dagger. He moves with deadly, practiced grace."
room = "town:thieves_hideout"
base_attitude = "hostile"
class = "class:rogue"
[stats]
hp = 150
attack = 20
defense = 15
xp = 400
[dialogue]
greeting = "You shouldn't have come down here, friend."

View File

@@ -0,0 +1,7 @@
name = "Minor Health Potion"
description = "A small glass vial filled with a bubbling red liquid."
room = "town:magic_shop"
kind = "consumable"
[stats]
hp_restore = 50

View File

@@ -0,0 +1,9 @@
name = "Sunburst Pendant"
description = "A heavy gold pendant depicting a rising sun, warm to the touch."
room = "town:inner_sanctum"
slot = "neck"
kind = "armor"
[stats]
mana_bonus = 15
defense = 2

View File

@@ -0,0 +1,8 @@
name = "Standard Iron Sword"
description = "A well-balanced, albeit unadorned, iron longsword. Standard issue for the town guard."
room = "town:armory"
slot = "main_hand"
kind = "weapon"
[stats]
attack = 10

View File

@@ -0,0 +1,8 @@
name = "Guard's Leather Armor"
description = "Sturdy boiled leather armor stamped with the crest of Thornwall."
room = "town:armory"
slot = "torso"
kind = "armor"
[stats]
defense = 8

View File

@@ -0,0 +1,4 @@
name = "Crate of Smuggled Silk"
description = "A wooden crate pried open to reveal rolls of incredibly fine, illicit silk."
room = "town:thieves_hideout"
kind = "misc"

View File

@@ -0,0 +1,4 @@
name = "Skeleton Key"
description = "An intricately carved iron key that looks like it could open almost any lock."
room = "town:thieves_hideout"
kind = "misc"

View File

@@ -0,0 +1,6 @@
name = "City Armory"
description = """\
Racks of spears, halberds, and swords fill this well-fortified room. The smell of leather, oil, and cold iron is overpowering. Several guards are busy polishing equipment."""
[exits]
south = "town:forge"

View File

@@ -0,0 +1,6 @@
name = "Eastern Wall Walk"
description = """\
A stone walkway atop the city's eastern wall. From here, you can see the dense treeline of the Whispering Woods to the south and the sprawling farmlands to the east."""
[exits]
west = "town:gate"

View File

@@ -0,0 +1,6 @@
name = "Western Wall Walk"
description = """\
A high vantage point on the western fortifications. The wind howls across the crenellations. To the west, jagged hills rise against the horizon."""
[exits]
east = "town:gate"

View File

@@ -0,0 +1,6 @@
name = "Inn Upstairs"
description = """\
A narrow hallway lined with heavy wooden doors. The floorboards creak underfoot, and the muffled sounds of the tavern below seep through the floor. Several doors are shut tight, but one stands slightly ajar."""
[exits]
down = "town:tavern"

View File

@@ -0,0 +1,6 @@
name = "Inner Sanctum"
description = """\
A place of profound silence and peace. A marble statue of an angelic figure stands at the back, illuminated by a shaft of natural light from a high skylight. The air smells of rich incense."""
[exits]
east = "town:temple"

View File

@@ -0,0 +1,6 @@
name = "The Mystic Eye"
description = """\
The air here crackles with residual magic. Books overflow from sagging shelves, and jars of unidentifiable floating objects line the counter. A strange, multi-colored flame burns steadily in an iron brazier."""
[exits]
north = "town:market"

View File

@@ -0,0 +1,6 @@
name = "Mayor's Estate"
description = """\
A grand mansion set behind wrought-iron gates. The courtyard is immaculate, featuring a decorative fountain and manicured hedges. The front doors are heavy oak, bound in brass."""
[exits]
south = "town:wealthy_district"

View File

@@ -0,0 +1,7 @@
name = "Residential Street"
description = """\
Modest wooden homes line this quiet street. Children play tag around the rain barrels, and laundry hangs from lines strung between windows. It is a peaceful contrast to the bustling market."""
[exits]
south = "town:market"
east = "town:wealthy_district"

View File

@@ -0,0 +1,7 @@
name = "Sewer Entrance"
description = """\
The smell here is atrocious. A rusty iron grate has been pried open, revealing a slippery stone tunnel that descends into the city's underbelly. The sound of rushing water echoes from the darkness."""
[exits]
up = "town:cellar"
north = "town:sewers_west"

View File

@@ -0,0 +1,7 @@
name = "Eastern Sewers"
description = """\
The tunnel widens here where several smaller pipes converge. The walkway is crumbling, and an unnerving scratching sound echoes from deeper in the tunnels."""
[exits]
west = "town:sewers_west"
north = "town:thieves_hideout"

View File

@@ -0,0 +1,7 @@
name = "Western Sewers"
description = """\
A narrow walkway beside a sluggish, foul-smelling stream. Slime coats the brick walls, and shadows seem to move just outside your peripheral vision."""
[exits]
south = "town:sewer_entrance"
east = "town:sewers_east"

View File

@@ -0,0 +1,6 @@
name = "Thieves' Hideout"
description = """\
A surprisingly dry and well-lit chamber hidden deep within the sewer system. Crates of stolen goods are stacked high, and a makeshift map of Thornwall is pinned to the wall. This is no ordinary smuggler's den."""
[exits]
south = "town:sewers_east"

View File

@@ -0,0 +1,7 @@
name = "Wealthy District"
description = """\
The streets here are paved with smooth, clean stone. Tall townhouses of brick and timber feature ornate ironwork and manicured window boxes. Private guards patrol the thoroughfare."""
[exits]
west = "town:residential_street"
north = "town:mayors_estate"

View File

@@ -0,0 +1,14 @@
name = "Mischievous Pixie"
description = "A tiny, winged creature with a playful expression and eyes that sparkle with magic. It seems to flit about, almost invisible to the naked eye."
room = "whispering_woods:hidden_glade"
base_attitude = "friendly"
class = "class:creature"
[stats]
hp = 50
attack = 5
defense = 10
xp = 50
[dialogue]
greeting = "Tee-hee! Have you come to play?"

View File

@@ -0,0 +1,14 @@
name = "Ancient Treant"
description = "A massive, tree-like creature with bark-like skin and branches that move like limbs. Its eyes are deep, wisdom-filled pools of light."
room = "whispering_woods:ancient_oak"
base_attitude = "neutral"
class = "class:creature"
[stats]
hp = 500
attack = 25
defense = 20
xp = 1000
[dialogue]
greeting = "The forest remembers... and it watches."

View File

@@ -0,0 +1,8 @@
name = "Magic Mushroom"
description = "A small, glowing mushroom with a sweet, earthy scent. It seems to pulse with a faint light."
room = "whispering_woods:hidden_glade"
kind = "consumable"
[stats]
hp_restore = 20
mana_restore = 10

View File

@@ -0,0 +1,10 @@
name = "Elderwood Staff"
description = "A gnarled staff made from the wood of an ancient oak tree. It's cool to the touch and seems to hum with a faint energy."
room = "whispering_woods:ancient_oak"
slot = "main_hand"
kind = "weapon"
[stats]
attack = 15
defense = 5
mana_bonus = 20

View File

@@ -0,0 +1,2 @@
name = "Whispering Woods"
description = "An ancient, misty forest where the trees seem to watch your every move."

View File

@@ -0,0 +1,12 @@
name = "The Ancient Oak"
description = """\
A massive oak tree, centuries old, dominates this clearing. Its \
thick, gnarled branches seem to reach out for the sky, and its \
trunk is covered in a layer of silvery-green moss. The air is \
still here, and the light is filtered through the dense canopy \
above."""
[exits]
north = "whispering_woods:forest_entrance"
east = "whispering_woods:hidden_glade"
west = "whispering_woods:misty_dell"

View File

@@ -0,0 +1,10 @@
name = "Forest Entrance"
description = """\
The well-maintained cobblestone of Thornwall yields to a winding dirt \
path that disappears into the dense, dark eaves of the forest. The air \
is cooler here, smelling of damp earth and pine needles. The city \
gates loom to the north."""
[exits]
north = "town:gate"
south = "whispering_woods:ancient_oak"

View File

@@ -0,0 +1,9 @@
name = "Hidden Glade"
description = """\
A small, sun-dappled glade, hidden away from the main path. A \
gentle stream flows through the center, and the air is filled \
with the sweet scent of wildflowers. It's a peaceful spot, \
ideal for resting and reflection."""
[exits]
west = "whispering_woods:ancient_oak"

View File

@@ -0,0 +1,9 @@
name = "Misty Dell"
description = """\
A low-lying dell, filled with a thick, swirling mist. The light \
is dim here, and the only sound is the dripping of water \
from the trees. It's a mysterious place, where everything seems \
distorted and surreal."""
[exits]
east = "whispering_woods:ancient_oak"