CI: add rust/ build+test workflow
All checks were successful
build / build-test (push) Successful in 39s

This commit is contained in:
Jan-Peter von Hunnius 2026-09-01 06:25:01 +02:00
parent 1da6aa35a0
commit 9cd8e2f717
27 changed files with 5774 additions and 8 deletions

View file

@ -0,0 +1,19 @@
name: build
on: [push, workflow_dispatch]
jobs:
build-test:
runs-on: docker
container: rust:1-bookworm
timeout-minutes: 15
steps:
- name: Checkout
run: git clone --depth 1 ${{ github.server_url }}/${{ github.repository }}.git .
- name: Build (rust/)
run: cargo build --quiet
working-directory: rust
- name: Test (rust/)
run: cargo test --quiet
working-directory: rust

134
data/adventures/zones.json Normal file
View file

@ -0,0 +1,134 @@
[
{
"id": "skara_brae_streets",
"name": "Skara Brae Streets",
"min_level": 1,
"max_level": 2,
"nerve_cost": 3,
"description": "The darkened streets of Skara Brae are dangerous. Thugs and vermin lurk in every shadow.",
"encounters": [
{ "enemy_id": "thief", "weight": 4 },
{ "enemy_id": "kobold", "weight": 3 },
{ "enemy_id": "orc", "weight": 3 },
{ "enemy_id": "mad_dog", "weight": 2 },
{ "enemy_id": "wolf", "weight": 2 },
{ "enemy_id": "skeleton", "weight": 2 },
{ "enemy_id": "spider", "weight": 3 }
]
},
{
"id": "cellar",
"name": "The Cellar",
"min_level": 1,
"max_level": 2,
"nerve_cost": 5,
"description": "Beneath the Scarlet Bard tavern, a cellar teems with rats and creeping things.",
"encounters": [
{ "enemy_id": "kobold", "weight": 4 },
{ "enemy_id": "skeleton", "weight": 3 },
{ "enemy_id": "zombie", "weight": 2 },
{ "enemy_id": "spider", "weight": 3 },
{ "enemy_id": "gnome", "weight": 2 },
{ "enemy_id": "barbarian", "weight": 1 }
]
},
{
"id": "sewers_1",
"name": "Sewers — Upper",
"min_level": 2,
"max_level": 3,
"nerve_cost": 7,
"description": "The upper sewers wind beneath Skara Brae. Kobolds and half-orcs have claimed these tunnels.",
"encounters": [
{ "enemy_id": "half_orc", "weight": 4 },
{ "enemy_id": "hobgoblin", "weight": 3 },
{ "enemy_id": "mercenary", "weight": 3 },
{ "enemy_id": "swordsman", "weight": 3 },
{ "enemy_id": "zombie", "weight": 2 },
{ "enemy_id": "kobold", "weight": 2 }
]
},
{
"id": "sewers_2",
"name": "Sewers — Deep",
"min_level": 3,
"max_level": 4,
"nerve_cost": 10,
"description": "Deeper in the sewers, the water runs black and dangerous creatures gather.",
"encounters": [
{ "enemy_id": "conjurer_lv1", "weight": 2 },
{ "enemy_id": "magician_lv1", "weight": 2 },
{ "enemy_id": "werewolf", "weight": 3 },
{ "enemy_id": "ogre", "weight": 3 },
{ "enemy_id": "wight", "weight": 2 },
{ "enemy_id": "assassin", "weight": 2 },
{ "enemy_id": "jade_monk", "weight": 1 }
]
},
{
"id": "catacombs",
"name": "The Catacombs",
"min_level": 4,
"max_level": 5,
"nerve_cost": 12,
"description": "Ancient burial chambers where the dead stir and dark magic lingers.",
"encounters": [
{ "enemy_id": "wraith", "weight": 3 },
{ "enemy_id": "shadow", "weight": 3 },
{ "enemy_id": "berserker", "weight": 3 },
{ "enemy_id": "ogre_magician", "weight": 2 },
{ "enemy_id": "hydra", "weight": 1 },
{ "enemy_id": "stone_giant", "weight": 1 },
{ "enemy_id": "blue_dragon", "weight": 1 }
]
},
{
"id": "harkyns_castle",
"name": "Harkyn's Castle",
"min_level": 5,
"max_level": 7,
"nerve_cost": 15,
"description": "The dread Lord Harkyn's fortress. Powerful undead and elite guards patrol these halls.",
"encounters": [
{ "enemy_id": "vampire", "weight": 3 },
{ "enemy_id": "spectre", "weight": 3 },
{ "enemy_id": "lesser_demon", "weight": 2 },
{ "enemy_id": "red_dragon", "weight": 1 },
{ "enemy_id": "demon", "weight": 2 },
{ "enemy_id": "beholder", "weight": 1 },
{ "enemy_id": "titan", "weight": 1 }
]
},
{
"id": "kylearans_tower",
"name": "Kylearan's Tower",
"min_level": 7,
"max_level": 8,
"nerve_cost": 18,
"description": "The mad archmage Kylearan guards the final approach to Mangar. His tower is a gauntlet of summoned horrors.",
"encounters": [
{ "enemy_id": "master_wizard", "weight": 3 },
{ "enemy_id": "greater_demon", "weight": 2 },
{ "enemy_id": "vampire_lord", "weight": 2 },
{ "enemy_id": "jabberwock", "weight": 1 },
{ "enemy_id": "storm_giant", "weight": 2 },
{ "enemy_id": "soul_sucker", "weight": 2 }
]
},
{
"id": "mangars_tower",
"name": "Mangar's Tower",
"min_level": 9,
"max_level": 10,
"nerve_cost": 25,
"description": "The seat of Mangar the Dark's power. The most terrifying creatures in all of Skara Brae await within.",
"encounters": [
{ "enemy_id": "balrog", "weight": 3 },
{ "enemy_id": "black_dragon", "weight": 2 },
{ "enemy_id": "lich", "weight": 2 },
{ "enemy_id": "archmage", "weight": 3 },
{ "enemy_id": "demon_lord", "weight": 2 },
{ "enemy_id": "mangar", "weight": 1 }
]
}
]

View file

@ -0,0 +1,104 @@
{
"slash": {
"A": {
"name": "Minor Slash",
"damage_multiplier": 1.5,
"stun_rounds": 0,
"bleed_per_round": 1,
"bleed_rounds": 1,
"effects": []
},
"B": {
"name": "Deep Slash",
"damage_multiplier": 2.0,
"stun_rounds": 1,
"bleed_per_round": 2,
"bleed_rounds": 2,
"effects": ["bruised"]
},
"C": {
"name": "Severing Slash",
"damage_multiplier": 3.0,
"stun_rounds": 2,
"bleed_per_round": 3,
"bleed_rounds": 3,
"effects": ["crippled_arm"]
},
"D": {
"name": "Lethal Slash",
"damage_multiplier": 5.0,
"stun_rounds": 3,
"bleed_per_round": 5,
"bleed_rounds": 5,
"effects": ["severed_limb", "instant_kill"]
}
},
"crush": {
"A": {
"name": "Light Crush",
"damage_multiplier": 1.5,
"stun_rounds": 1,
"bleed_per_round": 0,
"bleed_rounds": 0,
"effects": ["bruised"]
},
"B": {
"name": "Heavy Crush",
"damage_multiplier": 2.0,
"stun_rounds": 2,
"bleed_per_round": 0,
"bleed_rounds": 0,
"effects": ["bruised", "cracked_rib"]
},
"C": {
"name": "Crushing Blow",
"damage_multiplier": 3.5,
"stun_rounds": 3,
"bleed_per_round": 1,
"bleed_rounds": 2,
"effects": ["broken_bone"]
},
"D": {
"name": "Devastating Crush",
"damage_multiplier": 5.0,
"stun_rounds": 4,
"bleed_per_round": 2,
"bleed_rounds": 3,
"effects": ["crushed_skull", "instant_kill"]
}
},
"puncture": {
"A": {
"name": "Light Pierce",
"damage_multiplier": 1.5,
"stun_rounds": 0,
"bleed_per_round": 1,
"bleed_rounds": 2,
"effects": []
},
"B": {
"name": "Deep Pierce",
"damage_multiplier": 2.0,
"stun_rounds": 0,
"bleed_per_round": 2,
"bleed_rounds": 3,
"effects": ["punctured_lung"]
},
"C": {
"name": "Impale",
"damage_multiplier": 3.5,
"stun_rounds": 1,
"bleed_per_round": 4,
"bleed_rounds": 4,
"effects": ["organ_damage"]
},
"D": {
"name": "Lethal Pierce",
"damage_multiplier": 5.0,
"stun_rounds": 1,
"bleed_per_round": 6,
"bleed_rounds": 5,
"effects": ["heart_pierced", "instant_kill"]
}
}
}

View file

@ -0,0 +1,32 @@
{
"id": "catacombs_1",
"name": "Catacombs - Level 1",
"dungeon": "catacombs",
"level": 1,
"width": 22,
"height": 22,
"description": "The upper catacombs beneath the Temple of the Mad God. Ancient burial chambers where the dead stir restlessly.",
"encounter_level": 3,
"special_squares": [
{ "x": 0, "y": 0, "type": "stairs_up", "destination": "skara_brae", "label": "Return to Temple of Mad God" },
{ "x": 1, "y": 0, "type": "stairs_up", "destination": "sewers_3", "label": "Return to Sewers Level 3" },
{ "x": 21, "y": 21, "type": "stairs_down", "destination": "catacombs_2", "label": "Descend to Catacombs Level 2" },
{ "x": 5, "y": 4, "type": "message", "text": "Ancient burial alcoves line the walls. Most have been broken open." },
{ "x": 10, "y": 3, "type": "darkness", "text": "The torches on the walls have long since burned out. Only darkness here." },
{ "x": 3, "y": 8, "type": "special_encounter", "text": "A skeleton rises from its resting place!", "encounter": "skeleton_guardian" },
{ "x": 16, "y": 6, "type": "trap", "text": "A tomb lid shifts! A mummified hand grabs your ankle!", "damage": "1d6" },
{ "x": 8, "y": 12, "type": "anti_magic", "text": "A cursed sarcophagus radiates anti-magic energy." },
{ "x": 14, "y": 10, "type": "spinner", "text": "The catacomb corridors twist and turn. You lose your sense of direction." },
{ "x": 6, "y": 16, "type": "silence", "text": "The whispers of the dead fall silent. Even bard songs cannot pierce this quiet." },
{ "x": 18, "y": 14, "type": "message", "text": "Faded inscriptions on the walls tell of an ancient civilization." },
{ "x": 11, "y": 17, "type": "trap", "text": "Poison gas seeps from cracks in a burial vault!", "damage": "2d4" },
{ "x": 20, "y": 18, "type": "special_encounter", "text": "A wight emerges from the shadows, hungry for life force!", "encounter": "catacomb_wight" },
{ "x": 4, "y": 19, "type": "message", "text": "A small shrine to unknown gods. The offerings are still fresh." },
{ "x": 15, "y": 2, "type": "darkness", "text": "This section was sealed off. Something scratched its way out from inside." }
],
"connections": [
{ "from_x": 21, "from_y": 21, "to": "catacombs_2", "type": "stairs_down" },
{ "from_x": 0, "from_y": 0, "to": "skara_brae", "type": "stairs_up" },
{ "from_x": 1, "from_y": 0, "to": "sewers_3", "type": "stairs_up" }
]
}

View file

@ -0,0 +1,30 @@
{
"id": "catacombs_2",
"name": "Catacombs - Level 2",
"dungeon": "catacombs",
"level": 2,
"width": 22,
"height": 22,
"description": "The middle catacombs. The dead here are more powerful and the architecture grows more ancient. Strange rituals were performed in these halls.",
"encounter_level": 3,
"special_squares": [
{ "x": 0, "y": 0, "type": "stairs_up", "destination": "catacombs_1", "label": "Return to Catacombs Level 1" },
{ "x": 21, "y": 21, "type": "stairs_down", "destination": "catacombs_3", "label": "Descend to Catacombs Level 3" },
{ "x": 7, "y": 3, "type": "special_encounter", "text": "A zombie lord commands a shambling horde!", "encounter": "zombie_lord" },
{ "x": 14, "y": 5, "type": "trap", "text": "A curse tablet crumbles under your boot. Dark magic latches onto you!", "damage": "1d8" },
{ "x": 4, "y": 7, "type": "darkness", "text": "The darkness here seems to have weight. It presses against you." },
{ "x": 10, "y": 9, "type": "anti_magic", "text": "Runes carved into the floor form a magic-suppression circle." },
{ "x": 17, "y": 11, "type": "spinner", "text": "The catacomb maze disorients you completely." },
{ "x": 3, "y": 13, "type": "silence", "text": "An enchanted silence zone. The dead sleep silently here." },
{ "x": 19, "y": 15, "type": "message", "text": "A ritual chamber. Dark stains on the altar suggest blood sacrifice." },
{ "x": 8, "y": 17, "type": "trap", "text": "A ceiling collapse! Dust and rubble rain down!", "damage": "2d6" },
{ "x": 13, "y": 19, "type": "special_encounter", "text": "Wraiths drift through the walls, surrounding you!", "encounter": "wraith_circle" },
{ "x": 20, "y": 3, "type": "message", "text": "A sealed vault. The lock requires a special key to open." },
{ "x": 6, "y": 10, "type": "spinner", "text": "You enter a circular chamber with six identical exits." },
{ "x": 16, "y": 18, "type": "darkness", "text": "Even magical light fizzles in this area." }
],
"connections": [
{ "from_x": 21, "from_y": 21, "to": "catacombs_3", "type": "stairs_down" },
{ "from_x": 0, "from_y": 0, "to": "catacombs_1", "type": "stairs_up" }
]
}

View file

@ -0,0 +1,30 @@
{
"id": "catacombs_3",
"name": "Catacombs - Level 3",
"dungeon": "catacombs",
"level": 3,
"width": 22,
"height": 22,
"description": "The deepest catacombs. This level connects to Harkyn's Castle. Powerful undead and dark magic pervade every corner.",
"encounter_level": 3,
"special_squares": [
{ "x": 0, "y": 0, "type": "stairs_up", "destination": "catacombs_2", "label": "Return to Catacombs Level 2" },
{ "x": 21, "y": 21, "type": "stairs_down", "destination": "harkyn_1", "label": "Descend to Harkyn's Castle" },
{ "x": 11, "y": 11, "type": "special_encounter", "text": "A powerful lich guards the bridge to Harkyn's domain!", "encounter": "catacomb_lich" },
{ "x": 5, "y": 3, "type": "trap", "text": "A necromantic trap drains your life force!", "damage": "2d8" },
{ "x": 16, "y": 5, "type": "anti_magic", "text": "The lich's phylactery nearby suppresses all magic in this area." },
{ "x": 3, "y": 8, "type": "darkness", "text": "Total darkness. You hear chanting in a language you don't recognize." },
{ "x": 18, "y": 10, "type": "spinner", "text": "The magical maze shifts around you. Walls move when you're not looking." },
{ "x": 8, "y": 14, "type": "silence", "text": "A zone of absolute silence enforced by dark runes." },
{ "x": 14, "y": 16, "type": "trap", "text": "Spectral hands reach from the walls and drain your vitality!", "damage": "1d10" },
{ "x": 6, "y": 18, "type": "message", "text": "Ancient prophecy carved in stone: 'When the seven sleep, Skara Brae shall be free.'" },
{ "x": 19, "y": 7, "type": "special_encounter", "text": "A ghost appears and points toward Harkyn's Castle!", "encounter": "benevolent_ghost" },
{ "x": 10, "y": 19, "type": "message", "text": "The passage to Harkyn's Castle is behind a massive stone door." },
{ "x": 2, "y": 12, "type": "darkness", "text": "Shadow creatures dart at the edge of your vision." },
{ "x": 15, "y": 3, "type": "trap", "text": "A pressure plate triggers a cascade of bones!", "damage": "1d6" }
],
"connections": [
{ "from_x": 21, "from_y": 21, "to": "harkyn_1", "type": "stairs_down" },
{ "from_x": 0, "from_y": 0, "to": "catacombs_2", "type": "stairs_up" }
]
}

View file

@ -0,0 +1,32 @@
{
"id": "cellar_1",
"name": "Wine Cellar - Level 1",
"dungeon": "cellar",
"level": 1,
"width": 22,
"height": 22,
"description": "The wine cellar of the Scarlet Bard. The air is musty with the scent of old wine and something else.",
"encounter_level": 1,
"special_squares": [
{ "x": 0, "y": 0, "type": "stairs_up", "destination": "skara_brae", "label": "Return to Scarlet Bard" },
{ "x": 0, "y": 1, "type": "stairs_down", "destination": "sewers_1", "label": "Descend to Sewers" },
{ "x": 2, "y": 2, "type": "message", "text": "Fine wines - 10 years or older. The bottles are covered in dust." },
{ "x": 4, "y": 2, "type": "message", "text": "Rare wines - 50 years and older. These bottles have unusual labels." },
{ "x": 6, "y": 4, "type": "message", "text": "This is the wine cellar of the Scarlet Bard." },
{ "x": 10, "y": 3, "type": "trap", "text": "A broken bottle crunches underfoot. Glass cuts your feet!", "damage": "1d4" },
{ "x": 14, "y": 6, "type": "message", "text": "The wine racks here have been smashed. Something large passed through." },
{ "x": 18, "y": 8, "type": "darkness", "text": "The torches have burned out here. It is pitch black." },
{ "x": 3, "y": 10, "type": "trap", "text": "A loose barrel rolls into you from the shadows!", "damage": "1d6" },
{ "x": 8, "y": 12, "type": "message", "text": "Rat droppings everywhere. The rats here are unusually large." },
{ "x": 15, "y": 14, "type": "special_encounter", "text": "A giant rat scurries out from behind the barrels!", "encounter": "giant_rat" },
{ "x": 5, "y": 16, "type": "message", "text": "Empty bottles line the walls. This section has been picked clean." },
{ "x": 12, "y": 18, "type": "trap", "text": "The floor gives way slightly! You catch yourself on a wine rack.", "damage": "1d3" },
{ "x": 19, "y": 10, "type": "darkness", "text": "No light reaches this corner of the cellar." },
{ "x": 7, "y": 7, "type": "spinner", "text": "You stumble in the dark. Which way were you facing?" },
{ "x": 16, "y": 16, "type": "message", "text": "A heavy oak door bars further passage. Beyond it, you hear running water." }
],
"connections": [
{ "from_x": 0, "from_y": 1, "to": "sewers_1", "type": "stairs_down" },
{ "from_x": 0, "from_y": 0, "to": "skara_brae", "type": "stairs_up" }
]
}

View file

@ -0,0 +1,34 @@
{
"id": "harkyn_1",
"name": "Harkyn's Castle - Level 1",
"dungeon": "harkyn",
"level": 1,
"width": 22,
"height": 22,
"description": "The upper halls of Harkyn's ruined castle. Once a noble fortress, now home to the Jabberwock and other beasts.",
"encounter_level": 4,
"special_squares": [
{ "x": 0, "y": 0, "type": "stairs_up", "destination": "skara_brae", "label": "Return to Skara Brae" },
{ "x": 1, "y": 0, "type": "stairs_up", "destination": "sewers_3", "label": "Return to Sewers Level 3" },
{ "x": 2, "y": 0, "type": "stairs_up", "destination": "catacombs_3", "label": "Return to Catacombs Level 3" },
{ "x": 21, "y": 21, "type": "stairs_down", "destination": "harkyn_2", "label": "Descend to Harkyn's Level 2" },
{ "x": 11, "y": 5, "type": "special_encounter", "text": "The Jabberwock! With eyes of flame and jaws that bite!", "encounter": "jabberwock" },
{ "x": 6, "y": 3, "type": "trap", "text": "A portcullis slams down! You barely dodge it.", "damage": "1d8" },
{ "x": 16, "y": 4, "type": "message", "text": "Faded tapestries depict the history of Harkyn's Castle in its glory days." },
{ "x": 4, "y": 9, "type": "darkness", "text": "The great hall is lit only by embers. Shadows dance on crumbling walls." },
{ "x": 13, "y": 8, "type": "spinner", "text": "The castle's corridors twist deceptively. You lose your bearing." },
{ "x": 18, "y": 12, "type": "anti_magic", "text": "The castle's ancient wards suppress magical energy." },
{ "x": 7, "y": 15, "type": "silence", "text": "An enchanted silence blankets the throne room antechamber." },
{ "x": 14, "y": 17, "type": "trap", "text": "A suit of armor animates and swings a rusty blade!", "damage": "2d6" },
{ "x": 9, "y": 19, "type": "message", "text": "A library - most books destroyed. One readable volume describes the Mad God." },
{ "x": 20, "y": 15, "type": "special_encounter", "text": "Skeleton warriors guard the stairway down!", "encounter": "skeleton_knights" },
{ "x": 3, "y": 18, "type": "trap", "text": "Loose stones underfoot send you tumbling down a short slope!", "damage": "1d6" },
{ "x": 17, "y": 19, "type": "darkness", "text": "The dungeons beneath are pitch black. You hear heavy footsteps." }
],
"connections": [
{ "from_x": 21, "from_y": 21, "to": "harkyn_2", "type": "stairs_down" },
{ "from_x": 0, "from_y": 0, "to": "skara_brae", "type": "stairs_up" },
{ "from_x": 1, "from_y": 0, "to": "sewers_3", "type": "stairs_up" },
{ "from_x": 2, "from_y": 0, "to": "catacombs_3", "type": "stairs_up" }
]
}

View file

@ -0,0 +1,30 @@
{
"id": "harkyn_2",
"name": "Harkyn's Castle - Level 2",
"dungeon": "harkyn",
"level": 2,
"width": 22,
"height": 22,
"description": "The middle levels of Harkyn's Castle. The architecture grows more twisted and nightmarish. Harkyn's dark experiments are evident.",
"encounter_level": 4,
"special_squares": [
{ "x": 0, "y": 0, "type": "stairs_up", "destination": "harkyn_1", "label": "Return to Harkyn's Level 1" },
{ "x": 21, "y": 21, "type": "stairs_down", "destination": "harkyn_3", "label": "Descend to Harkyn's Level 3" },
{ "x": 10, "y": 4, "type": "special_encounter", "text": "One of Harkyn's failed experiments lurches toward you!", "encounter": "harkyn_experiment" },
{ "x": 5, "y": 7, "type": "trap", "text": "Alchemical reagents on a shelf explode when disturbed!", "damage": "2d6" },
{ "x": 15, "y": 6, "type": "anti_magic", "text": "Harkyn's laboratory equipment creates an anti-magic field." },
{ "x": 3, "y": 11, "type": "darkness", "text": "No light penetrates the dungeon cells. You hear moaning from within." },
{ "x": 17, "y": 9, "type": "spinner", "text": "A rotating wall segment confuses your sense of direction." },
{ "x": 8, "y": 14, "type": "silence", "text": "Soundproofed torture chambers. A profound, unnatural silence." },
{ "x": 13, "y": 16, "type": "message", "text": "Notes in Harkyn's hand: 'The Mad God must be freed to reach Mangar.'" },
{ "x": 19, "y": 13, "type": "trap", "text": "A magical trap! Lightning arcs from the walls!", "damage": "2d8" },
{ "x": 6, "y": 18, "type": "special_encounter", "text": "A bone golem guards Harkyn's inner sanctum!", "encounter": "bone_golem" },
{ "x": 20, "y": 18, "type": "message", "text": "A teleportation circle - inactive but humming with residual energy." },
{ "x": 11, "y": 10, "type": "trap", "text": "A pit trap lined with spikes!", "damage": "2d6" },
{ "x": 4, "y": 4, "type": "darkness", "text": "The walls are covered in scratch marks - made by human fingernails." }
],
"connections": [
{ "from_x": 21, "from_y": 21, "to": "harkyn_3", "type": "stairs_down" },
{ "from_x": 0, "from_y": 0, "to": "harkyn_1", "type": "stairs_up" }
]
}

View file

@ -0,0 +1,31 @@
{
"id": "harkyn_3",
"name": "Harkyn's Castle - Level 3",
"dungeon": "harkyn",
"level": 3,
"width": 22,
"height": 22,
"description": "The deepest level of Harkyn's Castle. The Mad God is imprisoned here. The Old Man waits to guide those who prove worthy.",
"encounter_level": 5,
"special_squares": [
{ "x": 0, "y": 0, "type": "stairs_up", "destination": "harkyn_2", "label": "Return to Harkyn's Level 2" },
{ "x": 21, "y": 0, "type": "stairs_up", "destination": "skara_brae", "label": "Secret exit to Skara Brae" },
{ "x": 11, "y": 11, "type": "special_encounter", "text": "The Mad God! A being of chaotic energy imprisoned by Harkyn long ago!", "encounter": "mad_god" },
{ "x": 5, "y": 5, "type": "special_encounter", "text": "A mysterious Old Man sits by a magical fire. He offers guidance.", "encounter": "old_man" },
{ "x": 10, "y": 3, "type": "anti_magic", "text": "The Mad God's prison radiates anti-magic energy. Spells are nullified." },
{ "x": 15, "y": 7, "type": "trap", "text": "The Mad God's rage manifests! Psychic energy tears at your mind!", "damage": "3d6" },
{ "x": 4, "y": 10, "type": "darkness", "text": "Only the Mad God's eerie glow illuminates this chamber." },
{ "x": 17, "y": 14, "type": "silence", "text": "The Mad God's presence creates a bubble of unnatural silence." },
{ "x": 8, "y": 16, "type": "spinner", "text": "Reality warps near the Mad God's prison. Directions become meaningless." },
{ "x": 14, "y": 18, "type": "message", "text": "Inscriptions: 'The Mad God holds the key. Free him, and gain an ally against Mangar.'" },
{ "x": 20, "y": 10, "type": "trap", "text": "Magical chains lash out from the walls!", "damage": "2d8" },
{ "x": 3, "y": 17, "type": "special_encounter", "text": "A demon guardian summoned by Harkyn blocks your path!", "encounter": "harkyn_demon" },
{ "x": 18, "y": 3, "type": "message", "text": "Harkyn's final journal: 'Mangar grows stronger. The Mad God is our last hope.'" },
{ "x": 7, "y": 8, "type": "trap", "text": "The floor erupts with spectral energy!", "damage": "2d6" },
{ "x": 19, "y": 19, "type": "message", "text": "A magical portal shimmers - it leads to Kylearan's Tower." }
],
"connections": [
{ "from_x": 0, "from_y": 0, "to": "harkyn_2", "type": "stairs_up" },
{ "from_x": 21, "from_y": 0, "to": "skara_brae", "type": "stairs_up" }
]
}

View file

@ -0,0 +1,31 @@
{
"id": "kylearan_1",
"name": "Kylearan's Tower - Level 1",
"dungeon": "kylearan",
"level": 1,
"width": 22,
"height": 22,
"description": "The tower of Kylearan the Archmage. A single level filled with magical defenses and the Crystal Golem that guards Kylearan's secrets.",
"encounter_level": 5,
"special_squares": [
{ "x": 0, "y": 0, "type": "stairs_up", "destination": "skara_brae", "label": "Return to Skara Brae" },
{ "x": 10, "y": 10, "type": "special_encounter", "text": "The Crystal Golem! A construct of pure magical crystal!", "encounter": "crystal_golem" },
{ "x": 5, "y": 3, "type": "anti_magic", "text": "Kylearan's wards suppress all magic near the tower entrance." },
{ "x": 16, "y": 5, "type": "spinner", "text": "The tower's magical architecture shifts. You lose your orientation." },
{ "x": 8, "y": 8, "type": "trap", "text": "A magical trap! Arcane energy discharges!", "damage": "3d6" },
{ "x": 14, "y": 12, "type": "message", "text": "Kylearan's notes: 'Mangar's weakness lies in his own tower. The key is within.'" },
{ "x": 4, "y": 15, "type": "darkness", "text": "Magical darkness fills this chamber. Even light spells fail." },
{ "x": 18, "y": 14, "type": "silence", "text": "Kylearan's silence spells still active after all these years." },
{ "x": 11, "y": 16, "type": "message", "text": "A magical workbench. Kylearan crafted the Crystal Golem here." },
{ "x": 3, "y": 10, "type": "trap", "text": "Summoned elementals attack!", "damage": "2d8" },
{ "x": 20, "y": 8, "type": "special_encounter", "text": "Kylearan's magical guardians - animated crystal statues!", "encounter": "crystal_guardians" },
{ "x": 7, "y": 18, "type": "message", "text": "A teleportation circle activates! It can take you to Mangar's Tower." },
{ "x": 17, "y": 18, "type": "anti_magic", "text": "The tower's core generates a powerful anti-magic field." },
{ "x": 13, "y": 3, "type": "spinner", "text": "The spiral staircase plays tricks on your sense of up and down." },
{ "x": 9, "y": 14, "type": "message", "text": "Kylearan appears in a vision: 'Defeat the Crystal Golem to reach Mangar's Tower.'" }
],
"connections": [
{ "from_x": 0, "from_y": 0, "to": "skara_brae", "type": "stairs_up" },
{ "from_x": 7, "from_y": 18, "to": "mangar_1", "type": "teleport" }
]
}

View file

@ -0,0 +1,31 @@
{
"id": "mangar_1",
"name": "Mangar's Tower - Level 1",
"dungeon": "mangar",
"level": 1,
"width": 22,
"height": 22,
"description": "The ground floor of Mangar's Tower. The evil archmage's fortress is defended by magical constructs and traps at every turn.",
"encounter_level": 5,
"special_squares": [
{ "x": 0, "y": 0, "type": "stairs_up", "destination": "skara_brae", "label": "Return to Skara Brae" },
{ "x": 1, "y": 0, "type": "teleport_in", "destination": "kylearan_1", "label": "Arrived from Kylearan's Tower" },
{ "x": 21, "y": 21, "type": "stairs_down", "destination": "mangar_2", "label": "Descend to Mangar's Tower Level 2" },
{ "x": 11, "y": 5, "type": "special_encounter", "text": "The Maze Master! A cunning creature that warps the dungeon layout!", "encounter": "maze_master" },
{ "x": 7, "y": 3, "type": "trap", "text": "Mangar's magical traps! Arcane flames engulf the corridor!", "damage": "3d6" },
{ "x": 15, "y": 4, "type": "anti_magic", "text": "Mangar's anti-magic wards are potent here. No spells can be cast." },
{ "x": 4, "y": 8, "type": "darkness", "text": "Magical darkness. Mangar does not want visitors to see his defenses." },
{ "x": 17, "y": 9, "type": "spinner", "text": "Mangar's maze spell twists the corridors. You are thoroughly lost." },
{ "x": 9, "y": 12, "type": "silence", "text": "Mangar's silence spell. Even the air feels dead." },
{ "x": 14, "y": 14, "type": "special_encounter", "text": "A Soul Sucker! It feeds on your life force!", "encounter": "soul_sucker" },
{ "x": 6, "y": 16, "type": "trap", "text": "A teleportation trap sends you hurtling through space! You arrive disoriented.", "damage": "1d8" },
{ "x": 19, "y": 15, "type": "message", "text": "Mangar's propaganda: 'All who enter my tower shall serve me in death.'" },
{ "x": 3, "y": 19, "type": "darkness", "text": "The walls pulse with a sickly green light that hurts your eyes." },
{ "x": 12, "y": 18, "type": "spinner", "text": "A revolving room. The exits keep changing position." },
{ "x": 20, "y": 8, "type": "message", "text": "A barracks for Mangar's summoned creatures. Currently empty." }
],
"connections": [
{ "from_x": 21, "from_y": 21, "to": "mangar_2", "type": "stairs_down" },
{ "from_x": 0, "from_y": 0, "to": "skara_brae", "type": "stairs_up" }
]
}

View file

@ -0,0 +1,31 @@
{
"id": "mangar_2",
"name": "Mangar's Tower - Level 2",
"dungeon": "mangar",
"level": 2,
"width": 22,
"height": 22,
"description": "The second level of Mangar's Tower. More powerful guardians and deadlier traps protect the approach to Mangar's inner sanctum.",
"encounter_level": 6,
"special_squares": [
{ "x": 0, "y": 0, "type": "stairs_up", "destination": "mangar_1", "label": "Return to Mangar's Tower Level 1" },
{ "x": 21, "y": 21, "type": "stairs_down", "destination": "mangar_3", "label": "Descend to Mangar's Tower Level 3" },
{ "x": 10, "y": 4, "type": "special_encounter", "text": "Another Soul Sucker lurks in the shadows, drawn to your life force!", "encounter": "soul_sucker" },
{ "x": 6, "y": 7, "type": "special_encounter", "text": "A mysterious Old Man appears. 'Mangar fears the light of truth.'", "encounter": "old_man" },
{ "x": 15, "y": 5, "type": "trap", "text": "Mangar's lightning trap! Bolts of energy arc between the walls!", "damage": "3d8" },
{ "x": 3, "y": 10, "type": "anti_magic", "text": "A powerful anti-magic zone. Mangar's wards grow stronger the deeper you go." },
{ "x": 18, "y": 8, "type": "darkness", "text": "Supernatural darkness. Your torches sputter and die." },
{ "x": 8, "y": 13, "type": "spinner", "text": "Mangar's maze spell is stronger here. The walls seem to breathe." },
{ "x": 14, "y": 15, "type": "silence", "text": "Mangar's master silence spell. Even thoughts feel muffled." },
{ "x": 5, "y": 17, "type": "trap", "text": "A magical compulsion forces you to walk into a wall!", "damage": "2d6" },
{ "x": 20, "y": 12, "type": "message", "text": "Runes on the wall: 'The seven shall be freed when Mangar falls.'" },
{ "x": 11, "y": 19, "type": "special_encounter", "text": "Demon servants of Mangar attack! They fight with hellish fury!", "encounter": "mangar_demons" },
{ "x": 17, "y": 18, "type": "trap", "text": "The floor tiles rearrange themselves! Some are trapped!", "damage": "2d8" },
{ "x": 2, "y": 5, "type": "darkness", "text": "The air here smells of brimstone and decay." },
{ "x": 16, "y": 2, "type": "message", "text": "A summoning circle glows faintly. Mangar uses this to call reinforcements." }
],
"connections": [
{ "from_x": 21, "from_y": 21, "to": "mangar_3", "type": "stairs_down" },
{ "from_x": 0, "from_y": 0, "to": "mangar_1", "type": "stairs_up" }
]
}

View file

@ -0,0 +1,31 @@
{
"id": "mangar_3",
"name": "Mangar's Tower - Level 3",
"dungeon": "mangar",
"level": 3,
"width": 22,
"height": 22,
"description": "The third level of Mangar's Tower. The most dangerous summoned creatures roam these halls. Only the strongest parties survive.",
"encounter_level": 7,
"special_squares": [
{ "x": 0, "y": 0, "type": "stairs_up", "destination": "mangar_2", "label": "Return to Mangar's Tower Level 2" },
{ "x": 21, "y": 21, "type": "stairs_down", "destination": "mangar_4", "label": "Descend to Mangar's Tower Level 4" },
{ "x": 11, "y": 5, "type": "special_encounter", "text": "A Black Dragon! Its breath weapon could annihilate the party!", "encounter": "black_dragon" },
{ "x": 5, "y": 3, "type": "special_encounter", "text": "A Demon Lord of Mangar's court stands before you!", "encounter": "demon_lord" },
{ "x": 16, "y": 4, "type": "anti_magic", "text": "Mangar's inner wards. Magic is almost completely suppressed." },
{ "x": 7, "y": 8, "type": "trap", "text": "Mangar's death trap! Poison, fire, and acid spray simultaneously!", "damage": "4d8" },
{ "x": 14, "y": 9, "type": "darkness", "text": "Living darkness that actively resists light sources." },
{ "x": 3, "y": 12, "type": "spinner", "text": "The maze spell here is permanent. Even mapping doesn't help." },
{ "x": 18, "y": 13, "type": "silence", "text": "Mangar's supreme silence. The absence of sound is suffocating." },
{ "x": 9, "y": 16, "type": "special_encounter", "text": "The Ancient Enemy! A being from beyond this world!", "encounter": "ancient_enemy" },
{ "x": 20, "y": 17, "type": "trap", "text": "A dimensional rift opens! Chaotic energy tears at reality!", "damage": "3d10" },
{ "x": 6, "y": 19, "type": "message", "text": "Mangar's throne room is close. The air crackles with power." },
{ "x": 15, "y": 18, "type": "special_encounter", "text": "A Balrog! Whip of fire and shadow!", "encounter": "balrog" },
{ "x": 2, "y": 15, "type": "trap", "text": " summoned elementals burst from the walls!", "damage": "3d6" },
{ "x": 17, "y": 6, "type": "message", "text": "A treasury room - piles of gold and gems. A distraction or a reward?" }
],
"connections": [
{ "from_x": 21, "from_y": 21, "to": "mangar_4", "type": "stairs_down" },
{ "from_x": 0, "from_y": 0, "to": "mangar_2", "type": "stairs_up" }
]
}

View file

@ -0,0 +1,32 @@
{
"id": "mangar_4",
"name": "Mangar's Tower - Level 4",
"dungeon": "mangar",
"level": 4,
"width": 22,
"height": 22,
"description": "The fourth level of Mangar's Tower. Mangar's most powerful lieutenants stand guard. The final approach to Mangar's sanctum.",
"encounter_level": 8,
"special_squares": [
{ "x": 0, "y": 0, "type": "stairs_up", "destination": "mangar_3", "label": "Return to Mangar's Tower Level 3" },
{ "x": 21, "y": 21, "type": "stairs_down", "destination": "mangar_5", "label": "Descend to Mangar's Throne Room" },
{ "x": 10, "y": 4, "type": "special_encounter", "text": "An Archmage serves Mangar! A powerful spellcaster!", "encounter": "archmage" },
{ "x": 5, "y": 6, "type": "special_encounter", "text": "A Lich! Undead master of necromancy serves Mangar!", "encounter": "lich" },
{ "x": 16, "y": 3, "type": "anti_magic", "text": "Mangar's personal wards. Even the strongest spells are negated." },
{ "x": 8, "y": 9, "type": "trap", "text": "Mangar's ultimate trap! Every element attacks at once!", "damage": "5d8" },
{ "x": 14, "y": 8, "type": "darkness", "text": "Absolute magical darkness. Not even true seeing penetrates it." },
{ "x": 3, "y": 12, "type": "spinner", "text": "The tower itself seems to rotate. You have no idea which way is forward." },
{ "x": 18, "y": 11, "type": "silence", "text": "Mangar's god-tier silence spell. Reality itself goes quiet." },
{ "x": 11, "y": 14, "type": "special_encounter", "text": "A Storm Giant loyal to Mangar hurls lightning bolts!", "encounter": "storm_giant" },
{ "x": 6, "y": 17, "type": "trap", "text": "Mangar's personal curse afflicts you! Strength drains away.", "damage": "2d10" },
{ "x": 19, "y": 16, "type": "special_encounter", "text": "A Death Denizen! An avatar of death itself!", "encounter": "death_denizen" },
{ "x": 15, "y": 19, "type": "message", "text": "You feel Mangar's presence growing stronger with every step." },
{ "x": 2, "y": 8, "type": "special_encounter", "text": "Mangar's elite guard - a formation of powerful undead knights!", "encounter": "death_knights" },
{ "x": 20, "y": 5, "type": "trap", "text": "Temporal trap! You age 10 years in an instant!", "damage": "3d6" },
{ "x": 13, "y": 18, "type": "message", "text": "The door to Mangar's throne room gleams with dark enchantments." }
],
"connections": [
{ "from_x": 21, "from_y": 21, "to": "mangar_5", "type": "stairs_down" },
{ "from_x": 0, "from_y": 0, "to": "mangar_3", "type": "stairs_up" }
]
}

View file

@ -0,0 +1,31 @@
{
"id": "mangar_5",
"name": "Mangar's Tower - Level 5 (Throne Room)",
"dungeon": "mangar",
"level": 5,
"width": 22,
"height": 22,
"description": "Mangar's Throne Room. The final battle. Defeat Mangar the Dark to break the curse on Skara Brae and free the city from eternal winter.",
"encounter_level": 8,
"special_squares": [
{ "x": 0, "y": 0, "type": "stairs_up", "destination": "mangar_4", "label": "Return to Mangar's Tower Level 4" },
{ "x": 11, "y": 11, "type": "special_encounter", "text": "MANGAR THE DARK! The archmage who cursed Skara Brae sits upon his throne of bone and shadow!", "encounter": "mangar" },
{ "x": 5, "y": 3, "type": "special_encounter", "text": "Mangar summons his Black Dragon to defend the throne!", "encounter": "mangar_black_dragon" },
{ "x": 16, "y": 3, "type": "special_encounter", "text": "Mangar's Demon Lord bodyguard attacks!", "encounter": "mangar_demon_lord" },
{ "x": 3, "y": 8, "type": "anti_magic", "text": "Mangar's absolute anti-magic field. Only the strongest magic can penetrate." },
{ "x": 18, "y": 8, "type": "trap", "text": "Mangar casts Meteor Shower! Explosions rock the throne room!", "damage": "6d8" },
{ "x": 9, "y": 6, "type": "darkness", "text": "Mangar plunges the room into supernatural darkness." },
{ "x": 14, "y": 6, "type": "silence", "text": "Mangar's Word of Power silences all sound and song." },
{ "x": 7, "y": 14, "type": "special_encounter", "text": "Mangar summons undead reinforcements!", "encounter": "mangar_undead" },
{ "x": 16, "y": 14, "type": "trap", "text": "Mangar's Disintegrate spell targets the party!", "damage": "4d10" },
{ "x": 11, "y": 3, "type": "message", "text": "Mangar's voice echoes: 'Fools! You dare challenge ME? I am eternal!'" },
{ "x": 11, "y": 19, "type": "message", "text": "Victory! Mangar falls! The curse on Skara Brae begins to break. The snow melts..." },
{ "x": 4, "y": 18, "type": "trap", "text": "Mangar's final spite - a death curse as he falls!", "damage": "5d8" },
{ "x": 18, "y": 18, "type": "special_encounter", "text": "Mangar's Lich advisor makes a last stand!", "encounter": "mangar_lich" },
{ "x": 8, "y": 11, "type": "message", "text": "Mangar's throne radiates power. Destroying it will break the curse forever." },
{ "x": 14, "y": 11, "type": "message", "text": "The walls of the throne room are inscribed with the spell of eternal winter." }
],
"connections": [
{ "from_x": 0, "from_y": 0, "to": "mangar_4", "type": "stairs_up" }
]
}

View file

@ -0,0 +1,32 @@
{
"id": "sewers_1",
"name": "Sewers - Level 1",
"dungeon": "sewers",
"level": 1,
"width": 22,
"height": 22,
"description": "The upper sewers of Skara Brae. Foul water flows through channels cut into the stone. Goblins have made these tunnels their home.",
"encounter_level": 2,
"special_squares": [
{ "x": 0, "y": 0, "type": "stairs_up", "destination": "skara_brae", "label": "Return to Skara Brae" },
{ "x": 1, "y": 0, "type": "stairs_up", "destination": "cellar_1", "label": "Return to Wine Cellar" },
{ "x": 0, "y": 21, "type": "stairs_down", "destination": "sewers_2", "label": "Descend to Sewers Level 2" },
{ "x": 10, "y": 10, "type": "spinner", "text": "The current spins you around in the knee-deep water." },
{ "x": 5, "y": 5, "type": "trap", "text": "You step into a drainage pit! The foul water is freezing.", "damage": "2d4" },
{ "x": 15, "y": 5, "type": "trap", "text": "A jet of sewage sprays from a cracked pipe!", "damage": "1d6" },
{ "x": 8, "y": 3, "type": "message", "text": "Goblin markings on the walls. 'MINE! GO AWAY!' written in Common." },
{ "x": 18, "y": 8, "type": "darkness", "text": "The sewer tunnels here are unlit. You hear skittering in the dark." },
{ "x": 3, "y": 12, "type": "special_encounter", "text": "A goblin patrol spots you and raises the alarm!", "encounter": "goblin_patrol" },
{ "x": 12, "y": 15, "type": "anti_magic", "text": "A strange fungus grows on the walls. Your spells fizzle and fail." },
{ "x": 7, "y": 18, "type": "message", "text": "The water here is deeper and flows faster. You hear a rumbling ahead." },
{ "x": 20, "y": 12, "type": "trap", "text": "Rusty grating gives way beneath your feet!", "damage": "1d8" },
{ "x": 16, "y": 17, "type": "silence", "text": "A dampening silence falls over this section. Bard songs are quenched." },
{ "x": 4, "y": 8, "type": "message", "text": "Crude goblin traps line the corridor - spiked pits covered with leaves." },
{ "x": 13, "y": 6, "type": "spinner", "text": "Three tunnels branch off. The acoustics make it impossible to tell direction." }
],
"connections": [
{ "from_x": 0, "from_y": 21, "to": "sewers_2", "type": "stairs_down" },
{ "from_x": 0, "from_y": 0, "to": "skara_brae", "type": "stairs_up" },
{ "from_x": 1, "from_y": 0, "to": "cellar_1", "type": "stairs_up" }
]
}

View file

@ -0,0 +1,31 @@
{
"id": "sewers_2",
"name": "Sewers - Level 2",
"dungeon": "sewers",
"level": 2,
"width": 22,
"height": 22,
"description": "The middle sewers. The water is deeper here and the goblins are better organized. Their chieftain lurks somewhere below.",
"encounter_level": 2,
"special_squares": [
{ "x": 0, "y": 0, "type": "stairs_up", "destination": "sewers_1", "label": "Return to Sewers Level 1" },
{ "x": 21, "y": 21, "type": "stairs_down", "destination": "sewers_3", "label": "Descend to Sewers Level 3" },
{ "x": 10, "y": 2, "type": "trap", "text": "A goblin tripwire! You fall face-first into the muck.", "damage": "1d4" },
{ "x": 6, "y": 6, "type": "spinner", "text": "The tunnels curve sharply. You lose your bearings." },
{ "x": 15, "y": 4, "type": "darkness", "text": "No torches here. The darkness is absolute." },
{ "x": 3, "y": 10, "type": "special_encounter", "text": "A goblin shaman chants in a side chamber!", "encounter": "goblin_shaman" },
{ "x": 18, "y": 9, "type": "anti_magic", "text": "Glowing crystals embedded in the walls absorb magical energy." },
{ "x": 8, "y": 14, "type": "trap", "text": "A poison gas trap! Green vapors fill the corridor.", "damage": "2d6" },
{ "x": 14, "y": 16, "type": "message", "text": "A goblin lookout post. Empty now, but recently abandoned." },
{ "x": 5, "y": 18, "type": "silence", "text": "The echoing water sounds suddenly cut off. Unnatural silence." },
{ "x": 20, "y": 14, "type": "message", "text": "Graffiti: 'Wraith Lord Below - Turn Back' written in blood." },
{ "x": 11, "y": 11, "type": "spinner", "text": "The water current swirls around your legs, disorienting you." },
{ "x": 17, "y": 19, "type": "special_encounter", "text": "A goblin chieftain's bodyguard challenges you!", "encounter": "goblin_elite" },
{ "x": 2, "y": 15, "type": "trap", "text": "Crossbow bolt fires from a hidden slot in the wall!", "damage": "1d8" },
{ "x": 9, "y": 8, "type": "message", "text": "The stench is unbearable here. You retch but press on." }
],
"connections": [
{ "from_x": 21, "from_y": 21, "to": "sewers_3", "type": "stairs_down" },
{ "from_x": 0, "from_y": 0, "to": "sewers_1", "type": "stairs_up" }
]
}

View file

@ -0,0 +1,34 @@
{
"id": "sewers_3",
"name": "Sewers - Level 3",
"dungeon": "sewers",
"level": 3,
"width": 22,
"height": 22,
"description": "The deepest sewers. The goblin chieftain rules from here, and passages branch to the Catacombs and Harkyn's Castle.",
"encounter_level": 3,
"special_squares": [
{ "x": 0, "y": 0, "type": "stairs_up", "destination": "sewers_2", "label": "Return to Sewers Level 2" },
{ "x": 21, "y": 0, "type": "stairs_down", "destination": "catacombs_1", "label": "Descend to Catacombs" },
{ "x": 0, "y": 21, "type": "stairs_down", "destination": "harkyn_1", "label": "Secret passage to Harkyn's Castle" },
{ "x": 11, "y": 11, "type": "special_encounter", "text": "The Goblin Chieftain rises from his throne of bones!", "encounter": "goblin_chieftain" },
{ "x": 7, "y": 5, "type": "darkness", "text": "The only light comes from glowing fungal patches on the ceiling." },
{ "x": 16, "y": 3, "type": "anti_magic", "text": "Dark energy radiates from a cracked altar. Magic is suppressed." },
{ "x": 4, "y": 9, "type": "trap", "text": "A spiked pit opens beneath you!", "damage": "2d8" },
{ "x": 14, "y": 8, "type": "spinner", "text": "The passages here form a confusing maze of identical corridors." },
{ "x": 9, "y": 15, "type": "silence", "text": "Even the water runs silent here. An eerie, oppressive quiet." },
{ "x": 19, "y": 14, "type": "trap", "text": "Poison darts shoot from the walls!", "damage": "2d4" },
{ "x": 6, "y": 17, "type": "message", "text": "The goblin chieftain's treasure hoard - mostly worthless trinkets and a few gems." },
{ "x": 12, "y": 18, "type": "special_encounter", "text": "Wraiths materialize from the shadows!", "encounter": "sewer_wraiths" },
{ "x": 2, "y": 3, "type": "message", "text": "The walls here are older than the rest - smooth stone from the original construction." },
{ "x": 17, "y": 6, "type": "darkness", "text": "A section of tunnel has collapsed. You must squeeze through the rubble." },
{ "x": 20, "y": 19, "type": "message", "text": "A crude sign reads 'HARKYN'S PASSAGE' with an arrow pointing left." },
{ "x": 15, "y": 20, "type": "trap", "text": "Swarm of sewer rats bites at your ankles!", "damage": "1d6" },
{ "x": 8, "y": 11, "type": "spinner", "text": "Three-way intersection with identical corridors. You choose at random." }
],
"connections": [
{ "from_x": 21, "from_y": 0, "to": "catacombs_1", "type": "stairs_down" },
{ "from_x": 0, "from_y": 21, "to": "harkyn_1", "type": "stairs_down" },
{ "from_x": 0, "from_y": 0, "to": "sewers_2", "type": "stairs_up" }
]
}

View file

@ -0,0 +1,297 @@
{
"id": "skara_brae",
"name": "Skara Brae",
"width": 30,
"height": 30,
"type": "overworld",
"description": "The frozen city of Skara Brae, sealed by Mangar's curse. Once a thriving port, now buried under unnatural winter.",
"locations": [
{
"id": "adventurers_guild",
"name": "Adventurer's Guild",
"code": "A",
"x": 10,
"y": 10,
"type": "guild",
"description": "Review Board - level up characters, review party status."
},
{
"id": "roscoes_energy_emporium",
"name": "Roscoe's Energy Emporium",
"code": "R",
"x": 14,
"y": 8,
"type": "spell_shop",
"description": "Buy spell levels for 1000-20000 gold. Required to unlock higher tier spells."
},
{
"id": "garths_equipment_shoppe",
"name": "Garth's Equipment Shoppe",
"code": "G",
"x": 8,
"y": 6,
"type": "equipment_shop",
"description": "Buy and sell weapons, armor, and accessories."
},
{
"id": "scarlet_bard",
"name": "Scarlet Bard",
"code": "I",
"x": 16,
"y": 14,
"type": "tavern",
"description": "A tavern with a hidden wine cellar leading to the dungeons below."
},
{
"id": "kylearans_tower",
"name": "Kylearan's Amber Tower",
"code": "K",
"x": 18,
"y": 18,
"type": "dungeon_entrance",
"description": "Entry to Kylearan's Tower dungeon. Blocked by guardians until late game."
},
{
"id": "harkyn_castle",
"name": "Harkyn's Castle",
"code": "H",
"x": 6,
"y": 18,
"type": "dungeon_entrance",
"description": "Entry to Harkyn's Castle dungeon. A ruined castle on the edge of town."
},
{
"id": "mangars_tower",
"name": "Mangar's Tower",
"code": "M",
"x": 22,
"y": 22,
"type": "dungeon_entrance",
"description": "Entry to Mangar's Tower dungeon. The source of the curse."
},
{
"id": "sewers_entrance",
"name": "Sewers Entrance",
"code": "S",
"x": 14,
"y": 14,
"type": "dungeon_entrance",
"description": "Entry to the Sewers dungeon beneath the city streets."
},
{
"id": "gran_plaza",
"name": "Gran Plaza",
"code": "GP",
"x": 12,
"y": 10,
"type": "plaza",
"description": "Central city plaza. A gathering place amid the desolation."
},
{
"id": "temple_mad_god",
"name": "Temple of Mad God",
"code": "T-M",
"x": 10,
"y": 16,
"type": "temple",
"description": "Entry to the Catacombs dungeon. A dark temple to forgotten powers."
},
{
"id": "temple_great_gods",
"name": "Temple of Great Gods",
"code": "T-1",
"x": 4,
"y": 12,
"type": "temple",
"description": "Temple offering basic healing services."
},
{
"id": "temple_greater_gods",
"name": "Temple of Greater Gods",
"code": "T-2",
"x": 4,
"y": 14,
"type": "temple",
"description": "Temple offering healing services."
},
{
"id": "temple_greatest_gods",
"name": "Temple of Greatest Gods",
"code": "T-3",
"x": 4,
"y": 16,
"type": "temple",
"description": "Temple offering more powerful healing services."
},
{
"id": "temple_kiosk",
"name": "Temple of Kiosk",
"code": "T-4",
"x": 20,
"y": 20,
"type": "temple",
"description": "A small temple offering services."
},
{
"id": "temple_thief",
"name": "Thief Temple",
"code": "T-5",
"x": 20,
"y": 22,
"type": "temple",
"description": "Temple offering rogue services - lock picking training and thief tools."
},
{
"id": "temple_100_blessings",
"name": "Temple of 100 Blessings",
"code": "T-6",
"x": 20,
"y": 24,
"type": "temple",
"description": "Temple offering various blessing services."
},
{
"id": "sinister_inn",
"name": "Sinister Inn",
"code": "I-1",
"x": 2,
"y": 22,
"type": "inn",
"description": "A rundown inn. Save your game and rest here."
},
{
"id": "dragons_breath_inn",
"name": "Dragon's Breath Inn",
"code": "I-2",
"x": 4,
"y": 22,
"type": "inn",
"description": "An inn with a dragon motif. Save and rest."
},
{
"id": "drawn_blade_inn",
"name": "Drawn Blade Inn",
"code": "I-3",
"x": 6,
"y": 22,
"type": "inn",
"description": "An inn favored by warriors. Save and rest."
},
{
"id": "ask_y_mother",
"name": "Ask Y-Mother",
"code": "I-4",
"x": 8,
"y": 22,
"type": "inn",
"description": "A peculiar inn. Save and rest."
},
{
"id": "archmage_inn",
"name": "Archmage Inn",
"code": "I-5",
"x": 10,
"y": 22,
"type": "inn",
"description": "An inn catering to magic users. Save and rest."
},
{
"id": "skull_tavern",
"name": "Skull Tavern",
"code": "I-6",
"x": 12,
"y": 22,
"type": "tavern",
"description": "A tavern and drinking establishment."
},
{
"id": "guardian_samurai",
"name": "Guardian Samurai",
"code": "S1",
"x": 24,
"y": 8,
"type": "guardian",
"description": "A fierce samurai guards this passage. Must be defeated to proceed."
},
{
"id": "guardian_stone_giant",
"name": "Guardian Stone Giant",
"code": "S2",
"x": 24,
"y": 10,
"type": "guardian",
"description": "A massive stone giant blocks the way."
},
{
"id": "guardian_stone_golem",
"name": "Guardian Stone Golem",
"code": "S3",
"x": 24,
"y": 12,
"type": "guardian",
"description": "A stone golem stands motionless until approached."
},
{
"id": "guardian_grey_dragon",
"name": "Guardian Grey Dragon",
"code": "S4",
"x": 24,
"y": 14,
"type": "guardian",
"description": "A grey dragon perches atop a mound of treasure."
},
{
"id": "guardian_ogre_lord",
"name": "Guardian Ogre Lord",
"code": "S5",
"x": 24,
"y": 16,
"type": "guardian",
"description": "An ogre lord commands lesser creatures at this checkpoint."
},
{
"id": "guardian_golem",
"name": "Guardian Golem",
"code": "S6",
"x": 24,
"y": 18,
"type": "guardian",
"description": "A powerful golem guards the final approach to Mangar's domain."
},
{
"id": "credits",
"name": "Credits",
"code": "creds",
"x": 28,
"y": 2,
"type": "easter_egg",
"description": "Fun credits easter egg."
},
{
"id": "city_gate",
"name": "City Gate",
"code": "gate",
"x": 0,
"y": 14,
"type": "exit",
"description": "The main gate to Skara Brae, blocked by Mangar's snow drift."
},
{
"id": "stable",
"name": "Stable",
"code": "stable",
"x": 2,
"y": 14,
"type": "landmark",
"description": "The city stable. The horses were eaten by creatures long ago."
}
],
"connections": [
{ "from": "scarlet_bard", "to": "cellar_1", "type": "stairs_down" },
{ "from": "sewers_entrance", "to": "sewers_1", "type": "stairs_down" },
{ "from": "temple_mad_god", "to": "catacombs_1", "type": "stairs_down" },
{ "from": "harkyn_castle", "to": "harkyn_1", "type": "stairs_down" },
{ "from": "kylearans_tower", "to": "kylearan_1", "type": "stairs_down" },
{ "from": "mangars_tower", "to": "mangar_1", "type": "stairs_down" }
]
}

2123
data/enemies.json Normal file

File diff suppressed because it is too large Load diff

737
data/items/accessories.json Normal file
View file

@ -0,0 +1,737 @@
[
{
"id": "buckler",
"name": "Buckler",
"type": "armor",
"quality": "common",
"slot": "off_hand",
"stats": { "defense": 1 },
"description": "A small fist-held shield for parrying.",
"value": 40,
"always_in_shop": true
},
{
"id": "tower_shield",
"name": "Tower Shield",
"type": "armor",
"quality": "common",
"slot": "off_hand",
"stats": { "defense": 2 },
"description": "A large shield that covers most of the body.",
"value": 100,
"always_in_shop": true
},
{
"id": "mthr_shield",
"name": "Mythril Shield",
"type": "armor",
"quality": "uncommon",
"slot": "off_hand",
"stats": { "defense": 3 },
"description": "A shield forged from mythril, strong yet light.",
"value": 400
},
{
"id": "admt_shield",
"name": "Adamant Shield",
"type": "armor",
"quality": "uncommon",
"slot": "off_hand",
"stats": { "defense": 4 },
"description": "A shield of indestructible adamant.",
"value": 500
},
{
"id": "luckshield",
"name": "Luckshield",
"type": "armor",
"quality": "uncommon",
"slot": "off_hand",
"stats": { "defense": 2 },
"description": "A shield that boosts the wearer's luck when equipped.",
"value": 800
},
{
"id": "dmnd_shield",
"name": "Diamond Shield",
"type": "armor",
"quality": "rare",
"slot": "off_hand",
"stats": { "defense": 5 },
"description": "A shield set with diamonds. Deflects all manner of attacks.",
"value": 1000
},
{
"id": "arcshield",
"name": "Arcshield",
"type": "armor",
"quality": "uncommon",
"slot": "off_hand",
"stats": { "defense": 3 },
"description": "A shield that casts Stone Flesh on use.",
"value": 2000
},
{
"id": "pure_shield",
"name": "Pure Shield",
"type": "armor",
"quality": "rare",
"slot": "off_hand",
"stats": { "defense": 5 },
"description": "A shield of pure magical energy.",
"value": 2000
},
{
"id": "ybarrashield",
"name": "Ybarrashield",
"type": "armor",
"quality": "rare",
"slot": "off_hand",
"stats": { "defense": 3 },
"description": "A legendary shield that casts YMCA on use.",
"value": 10000
},
{
"id": "dragonshield",
"name": "Dragon Shield",
"type": "armor",
"quality": "rare",
"slot": "off_hand",
"stats": { "defense": 3 },
"description": "A shield made from dragon scales. Freezes groups for 24-96 damage in combat.",
"value": 15000
},
{
"id": "bracers_6",
"name": "Bracers [6]",
"type": "armor",
"quality": "uncommon",
"slot": "off_hand",
"stats": { "defense": 4 },
"description": "Magical bracers that provide excellent protection.",
"value": 600
},
{
"id": "bracers_4",
"name": "Bracers [4]",
"type": "armor",
"quality": "rare",
"slot": "off_hand",
"stats": { "defense": 6 },
"description": "Powerful bracers that ward off all weapons.",
"value": 1000
},
{
"id": "helm",
"name": "Helm",
"type": "armor",
"quality": "common",
"slot": "head",
"stats": { "defense": 1 },
"description": "A simple iron helmet.",
"value": 50,
"always_in_shop": true
},
{
"id": "mthr_helm",
"name": "Mythril Helm",
"type": "armor",
"quality": "uncommon",
"slot": "head",
"stats": { "defense": 2 },
"description": "A lightweight mythril helmet.",
"value": 300
},
{
"id": "admt_helm",
"name": "Adamant Helm",
"type": "armor",
"quality": "uncommon",
"slot": "head",
"stats": { "defense": 3 },
"description": "A helm forged from adamant.",
"value": 400
},
{
"id": "dmnd_helm",
"name": "Diamond Helm",
"type": "armor",
"quality": "rare",
"slot": "head",
"stats": { "defense": 4 },
"description": "A helm set with diamonds. Protects against all damage.",
"value": 1100
},
{
"id": "lorehelm",
"name": "Lorehelm",
"type": "armor",
"quality": "rare",
"slot": "head",
"stats": { "defense": 2 },
"description": "A helm that casts Locate True on use.",
"value": 8000
},
{
"id": "travelhelm",
"name": "Travelhelm",
"type": "armor",
"quality": "rare",
"slot": "head",
"stats": { "defense": 3 },
"description": "A helm that casts Apport Arcane on use.",
"value": 10000
},
{
"id": "spirithelm",
"name": "Spirithelm",
"type": "armor",
"quality": "epic",
"slot": "head",
"stats": { "defense": 3 },
"description": "A helm of pure spirit. Casts Levitate on use.",
"value": 50000
},
{
"id": "gauntlets",
"name": "Gauntlets",
"type": "armor",
"quality": "common",
"slot": "hands",
"stats": { "defense": 1 },
"description": "Heavy gloves of boiled leather.",
"value": 40,
"always_in_shop": true
},
{
"id": "leather_gloves",
"name": "Leather Gloves",
"type": "armor",
"quality": "common",
"slot": "hands",
"stats": { "defense": 1 },
"description": "Simple gloves that keep a grip on weapons.",
"value": 80,
"always_in_shop": true
},
{
"id": "mthr_gloves",
"name": "Mythril Gloves",
"type": "armor",
"quality": "uncommon",
"slot": "hands",
"stats": { "defense": 2 },
"description": "Gloves forged from mythril. Light and protective.",
"value": 400
},
{
"id": "admt_gloves",
"name": "Adamant Gloves",
"type": "armor",
"quality": "uncommon",
"slot": "hands",
"stats": { "defense": 3 },
"description": "Gauntlets of adamant. Crush bone as easily as they protect.",
"value": 500
},
{
"id": "wargloves",
"name": "Wargloves",
"type": "armor",
"quality": "rare",
"slot": "hands",
"stats": { "defense": 5 },
"description": "Magical gloves of tremendous power.",
"value": 3000
},
{
"id": "dork_ring",
"name": "Dork Ring",
"type": "accessory",
"quality": "common",
"slot": "ring",
"stats": {},
"description": "A worthless ring. Perhaps good for trading.",
"value": 100
},
{
"id": "shield_ring",
"name": "Shield Ring",
"type": "accessory",
"quality": "uncommon",
"slot": "ring",
"stats": { "defense": 2 },
"description": "A ring that projects a magical shield around the wearer.",
"value": 700
},
{
"id": "ring_of_power",
"name": "Ring of Power",
"type": "accessory",
"quality": "epic",
"slot": "ring",
"stats": {},
"description": "A ring that casts Mind Blade in combat.",
"value": 40000
},
{
"id": "deathring",
"name": "Death Ring",
"type": "accessory",
"quality": "epic",
"slot": "ring",
"stats": { "defense": 1 },
"description": "A cursed ring. Casts AND Gate on use.",
"value": 60000
},
{
"id": "troll_ring",
"name": "Troll Ring",
"type": "accessory",
"quality": "epic",
"slot": "ring",
"stats": {},
"description": "A ring that regenerates HP when equipped.",
"value": 80000
},
{
"id": "elf_cloak",
"name": "Elf Cloak",
"type": "accessory",
"quality": "uncommon",
"slot": "back",
"stats": { "defense": 2 },
"description": "A cloak woven by elves. Light and protective.",
"value": 500
},
{
"id": "alis_carpet",
"name": "Ali's Carpet",
"type": "accessory",
"quality": "uncommon",
"slot": "back",
"stats": { "defense": 2 },
"description": "A flying carpet. Casts Phase Door on use.",
"value": 800
},
{
"id": "magic_mouth",
"name": "Magic Mouth",
"type": "accessory",
"quality": "uncommon",
"slot": "trinket",
"stats": {},
"description": "A magical mouth that casts Arena on use.",
"value": 1200
},
{
"id": "speedboots",
"name": "Speed Boots",
"type": "accessory",
"quality": "uncommon",
"slot": "feet",
"stats": { "defense": 1 },
"description": "Boots that increase the wearer's chance to run from combat.",
"value": 2000
},
{
"id": "kiels_compass",
"name": "Kiel's Compass",
"type": "accessory",
"quality": "rare",
"slot": "trinket",
"stats": {},
"description": "A compass that casts Sorcerer's Sight on use.",
"value": 6000
},
{
"id": "dag_stone",
"name": "Dag Stone",
"type": "accessory",
"quality": "rare",
"slot": "trinket",
"stats": {},
"description": "A mysterious stone that casts Great Gate on use.",
"value": 10000
},
{
"id": "arcs_eye",
"name": "Arc's Eye",
"type": "accessory",
"quality": "rare",
"slot": "trinket",
"stats": {},
"description": "A gemstone eye that casts Locate True on use.",
"value": 10000
},
{
"id": "silvr_square",
"name": "Silver Square",
"type": "accessory",
"quality": "uncommon",
"slot": "trinket",
"stats": { "defense": 1 },
"description": "A silver square artifact. Use in Mangar's Tower.",
"value": 1000
},
{
"id": "silvr_circle",
"name": "Silver Circle",
"type": "accessory",
"quality": "uncommon",
"slot": "trinket",
"stats": { "defense": 1 },
"description": "A silver circle artifact. Use in Mangar's Tower.",
"value": 1000
},
{
"id": "silvr_triang",
"name": "Silver Triangle",
"type": "accessory",
"quality": "uncommon",
"slot": "trinket",
"stats": { "defense": 1 },
"description": "A silver triangle artifact. Use in Mangar's Tower.",
"value": 1000
},
{
"id": "mandolin",
"name": "Mandolin",
"type": "accessory",
"quality": "common",
"slot": "instrument",
"stats": {},
"description": "A simple mandolin for bards.",
"value": 130
},
{
"id": "harp",
"name": "Harp",
"type": "accessory",
"quality": "common",
"slot": "instrument",
"stats": {},
"description": "A simple harp for bards.",
"value": 130
},
{
"id": "flute",
"name": "Flute",
"type": "accessory",
"quality": "common",
"slot": "instrument",
"stats": {},
"description": "A simple flute for bards.",
"value": 130
},
{
"id": "laks_lyre",
"name": "Lak's Lyre",
"type": "accessory",
"quality": "uncommon",
"slot": "instrument",
"stats": {},
"description": "A legendary lyre that grants unlimited Bard songs when equipped.",
"value": 1000
},
{
"id": "fire_horn",
"name": "Fire Horn",
"type": "accessory",
"quality": "uncommon",
"slot": "instrument",
"stats": { "damage": 40 },
"description": "A horn that burns groups for 16-64 damage in combat.",
"value": 1200
},
{
"id": "fins_flute",
"name": "Fin's Flute",
"type": "accessory",
"quality": "uncommon",
"slot": "instrument",
"stats": { "defense": 2 },
"description": "An enchanted flute with protective properties.",
"value": 1300
},
{
"id": "heal_harp",
"name": "Heal Harp",
"type": "accessory",
"quality": "rare",
"slot": "instrument",
"stats": {},
"description": "A harp that casts Word of Healing on use.",
"value": 7000
},
{
"id": "galts_flute",
"name": "Galt's Flute",
"type": "accessory",
"quality": "rare",
"slot": "instrument",
"stats": {},
"description": "A flute that casts Word of Recall on use.",
"value": 10000
},
{
"id": "frost_horn",
"name": "Frost Horn",
"type": "accessory",
"quality": "rare",
"slot": "instrument",
"stats": { "damage": 60 },
"description": "A horn that freezes groups for 24-96 damage in combat.",
"value": 12000
},
{
"id": "flame_horn",
"name": "Flame Horn",
"type": "accessory",
"quality": "epic",
"slot": "instrument",
"stats": { "damage": 100 },
"description": "A horn that burns groups for 40-160 damage in combat.",
"value": 20000
},
{
"id": "truthdrum",
"name": "Truth Drum",
"type": "accessory",
"quality": "epic",
"slot": "instrument",
"stats": {},
"description": "A drum that casts Disintegrate in combat.",
"value": 20000
},
{
"id": "spiritdrum",
"name": "Spirit Drum",
"type": "accessory",
"quality": "epic",
"slot": "instrument",
"stats": {},
"description": "A drum that casts Levitate on use.",
"value": 30000
},
{
"id": "pipes_of_pan",
"name": "Pipes of Pan",
"type": "accessory",
"quality": "epic",
"slot": "instrument",
"stats": { "defense": 2 },
"description": "A set of enchanted pipes with protective magic.",
"value": 30000
},
{
"id": "lightwand",
"name": "Lightwand",
"type": "accessory",
"quality": "uncommon",
"slot": "trinket",
"stats": {},
"description": "A wand that casts Mage Flame on use.",
"value": 1000
},
{
"id": "exorwand",
"name": "Exorwand",
"type": "accessory",
"quality": "uncommon",
"slot": "trinket",
"stats": {},
"description": "A wand that casts Dispel on use.",
"value": 1000
},
{
"id": "dragonwand",
"name": "Dragon Wand",
"type": "accessory",
"quality": "rare",
"slot": "trinket",
"stats": { "defense": 1, "damage": 50 },
"description": "A wand that steams groups for 20-80 damage in combat.",
"value": 14000
},
{
"id": "ogrewand",
"name": "Ogre Wand",
"type": "accessory",
"quality": "epic",
"slot": "trinket",
"stats": { "defense": 1 },
"description": "A wand that casts Invisible Ogre on use.",
"value": 30000
},
{
"id": "wizwand",
"name": "Wizard's Wand",
"type": "accessory",
"quality": "legendary",
"slot": "trinket",
"stats": { "defense": 2 },
"description": "A wand of immense power. Casts Wizard Walk on use.",
"value": 120000
},
{
"id": "ogre_fgn",
"name": "Ogre Figurine",
"type": "accessory",
"quality": "uncommon",
"slot": "trinket",
"stats": {},
"description": "A figurine that summons an Ogre when used.",
"value": 300
},
{
"id": "golem_fgn",
"name": "Golem Figurine",
"type": "accessory",
"quality": "uncommon",
"slot": "trinket",
"stats": {},
"description": "A figurine that summons a Golem when used.",
"value": 300
},
{
"id": "giant_fgn",
"name": "Giant Figurine",
"type": "accessory",
"quality": "uncommon",
"slot": "trinket",
"stats": {},
"description": "A figurine that summons a War Giant when used.",
"value": 400
},
{
"id": "samurai_fgn",
"name": "Samurai Figurine",
"type": "accessory",
"quality": "uncommon",
"slot": "trinket",
"stats": {},
"description": "A figurine that summons a Samurai when used.",
"value": 500
},
{
"id": "titan_fgn",
"name": "Titan Figurine",
"type": "accessory",
"quality": "uncommon",
"slot": "trinket",
"stats": {},
"description": "A figurine that summons a Titan when used.",
"value": 600
},
{
"id": "dragon_fgn",
"name": "Dragon Figurine",
"type": "accessory",
"quality": "rare",
"slot": "trinket",
"stats": {},
"description": "A figurine that summons a Green Dragon when used.",
"value": 800
},
{
"id": "mage_fgn",
"name": "Mage Figurine",
"type": "accessory",
"quality": "rare",
"slot": "trinket",
"stats": {},
"description": "A figurine that summons a Master Wizard when used.",
"value": 1000
},
{
"id": "mongo_fgn",
"name": "Mongo Figurine",
"type": "accessory",
"quality": "rare",
"slot": "trinket",
"stats": {},
"description": "A figurine that summons Mongo when used.",
"value": 1000
},
{
"id": "lich_fgn",
"name": "Lich Figurine",
"type": "accessory",
"quality": "rare",
"slot": "trinket",
"stats": {},
"description": "A figurine that summons a Lich when used.",
"value": 1200
},
{
"id": "old_man_fgn",
"name": "Old Man Figurine",
"type": "accessory",
"quality": "rare",
"slot": "trinket",
"stats": {},
"description": "A figurine that summons an Old Man when used.",
"value": 1500
},
{
"id": "thor_fgn",
"name": "Thor Figurine",
"type": "accessory",
"quality": "epic",
"slot": "trinket",
"stats": {},
"description": "A figurine that summons Thor when used.",
"value": 2000
},
{
"id": "torch",
"name": "Torch",
"type": "accessory",
"quality": "common",
"slot": "trinket",
"stats": {},
"description": "A simple torch. Provides short-duration light.",
"value": 5
},
{
"id": "lamp",
"name": "Lamp",
"type": "accessory",
"quality": "common",
"slot": "trinket",
"stats": {},
"description": "An oil lamp. Provides long-duration light.",
"value": 15
},
{
"id": "master_key",
"name": "Master Key",
"type": "accessory",
"quality": "rare",
"slot": "trinket",
"stats": {},
"description": "A key that opens all gates when equipped.",
"value": 1200
},
{
"id": "onyx_key",
"name": "Onyx Key",
"type": "accessory",
"quality": "legendary",
"slot": "trinket",
"stats": {},
"description": "A legendary key that opens Mangar's Tower gate.",
"value": 100000
},
{
"id": "eye",
"name": "Eye",
"type": "accessory",
"quality": "epic",
"slot": "trinket",
"stats": {},
"description": "A mysterious eye artifact. Brings the Mad God to life.",
"value": 50000
}
]

125
data/items/armor.json Normal file
View file

@ -0,0 +1,125 @@
[
{
"id": "robes",
"name": "Robes",
"type": "armor",
"quality": "common",
"slot": "body",
"stats": { "defense": 1 },
"description": "Simple robes worn by spellcasters.",
"value": 40,
"always_in_shop": true
},
{
"id": "leather_armor",
"name": "Leather Armor",
"type": "armor",
"quality": "common",
"slot": "body",
"stats": { "defense": 2 },
"description": "Boiled leather cuirass. Standard issue for militia.",
"value": 70,
"always_in_shop": true
},
{
"id": "chain_mail",
"name": "Chain Mail",
"type": "armor",
"quality": "common",
"slot": "body",
"stats": { "defense": 3 },
"description": "Interlocking metal rings provide solid protection.",
"value": 150,
"always_in_shop": true
},
{
"id": "scale_mail",
"name": "Scale Armor",
"type": "armor",
"quality": "uncommon",
"slot": "body",
"stats": { "defense": 4 },
"description": "Overlapping metal scales deflect slashes effectively.",
"value": 300
},
{
"id": "mthr_chain",
"name": "Mythril Chain",
"type": "armor",
"quality": "uncommon",
"slot": "body",
"stats": { "defense": 4 },
"description": "Chain mail forged from lightweight mythril.",
"value": 500
},
{
"id": "plate_armor",
"name": "Plate Armor",
"type": "armor",
"quality": "uncommon",
"slot": "body",
"stats": { "defense": 5 },
"description": "Full plate armor forged from fine steel.",
"value": 700
},
{
"id": "admt_chain",
"name": "Adamant Chain",
"type": "armor",
"quality": "rare",
"slot": "body",
"stats": { "defense": 5 },
"description": "Chain mail forged from indestructible adamant.",
"value": 800
},
{
"id": "mthr_scale",
"name": "Mythril Scale",
"type": "armor",
"quality": "uncommon",
"slot": "body",
"stats": { "defense": 5 },
"description": "Scale armor of gleaming mythril.",
"value": 900
},
{
"id": "admt_scale",
"name": "Adamant Scale",
"type": "armor",
"quality": "rare",
"slot": "body",
"stats": { "defense": 6 },
"description": "Scale armor forged from adamant. Exceptionally strong.",
"value": 1200
},
{
"id": "admt_plate",
"name": "Adamant Plate",
"type": "armor",
"quality": "rare",
"slot": "body",
"stats": { "defense": 7 },
"description": "Full plate armor of adamant. Nearly impervious.",
"value": 1600
},
{
"id": "mthr_plate",
"name": "Mythril Plate",
"type": "armor",
"quality": "uncommon",
"slot": "body",
"stats": { "defense": 6 },
"description": "Plate armor of lightweight mythril. Strong yet maneuverable.",
"value": 2000
},
{
"id": "dmnd_plate",
"name": "Diamond Plate",
"type": "armor",
"quality": "epic",
"slot": "body",
"stats": { "defense": 8 },
"description": "Armor encrusted with diamonds. The pinnacle of protection.",
"value": 4000
}
]

View file

@ -1,13 +1,471 @@
[ [
{ {
"id": "wooden_sword", "id": "dagger",
"name": "Wooden Sword", "name": "Dagger",
"type": "weapon", "type": "weapon",
"quality": "common", "quality": "common",
"slot": "main_hand", "slot": "main_hand",
"stats": { "attack_type": "puncture",
"damage": 5 "stats": { "damage": 3 },
"description": "A short-bladed knife. Basic but reliable.",
"value": 20,
"always_in_shop": true
}, },
"description": "A simple wooden training sword." {
"id": "staff",
"name": "Staff",
"type": "weapon",
"quality": "common",
"slot": "main_hand",
"attack_type": "crush",
"stats": { "damage": 5 },
"description": "A simple wooden staff, serviceable but humble.",
"value": 20,
"always_in_shop": true
},
{
"id": "short_sword",
"name": "Short Sword",
"type": "weapon",
"quality": "common",
"slot": "main_hand",
"attack_type": "slash",
"stats": { "damage": 5 },
"description": "A standard-issue blade for city guards.",
"value": 30,
"always_in_shop": true
},
{
"id": "mace",
"name": "Mace",
"type": "weapon",
"quality": "common",
"slot": "main_hand",
"attack_type": "crush",
"stats": { "damage": 5 },
"description": "A simple bludgeoning weapon favored by clerics.",
"value": 60,
"always_in_shop": true
},
{
"id": "war_axe",
"name": "War Axe",
"type": "weapon",
"quality": "common",
"slot": "main_hand",
"attack_type": "slash",
"stats": { "damage": 5 },
"description": "A single-bladed axe swung with brutal force.",
"value": 70,
"always_in_shop": true
},
{
"id": "broadsword",
"name": "Broadsword",
"type": "weapon",
"quality": "common",
"slot": "main_hand",
"attack_type": "slash",
"stats": { "damage": 5 },
"description": "A wide blade that delivers heavy cuts.",
"value": 80,
"always_in_shop": true
},
{
"id": "halbard",
"name": "Halbard",
"type": "weapon",
"quality": "common",
"slot": "main_hand",
"attack_type": "slash",
"stats": { "damage": 9 },
"description": "A poleaxe with a broad cutting head.",
"value": 200,
"always_in_shop": true
},
{
"id": "mthr_dagger",
"name": "Mythril Dagger",
"type": "weapon",
"quality": "uncommon",
"slot": "main_hand",
"attack_type": "puncture",
"stats": { "damage": 3 },
"description": "A lightweight dagger forged from mythril. Enchanted +1.",
"value": 200
},
{
"id": "mthr_sword",
"name": "Mythril Sword",
"type": "weapon",
"quality": "uncommon",
"slot": "main_hand",
"attack_type": "slash",
"stats": { "damage": 5 },
"description": "A mythril blade of fine craftsmanship. Enchanted +1.",
"value": 300
},
{
"id": "mthr_axe",
"name": "Mythril Axe",
"type": "weapon",
"quality": "uncommon",
"slot": "main_hand",
"attack_type": "slash",
"stats": { "damage": 5 },
"description": "A mythril axe with a razor edge. Enchanted +1.",
"value": 300
},
{
"id": "mthr_mace",
"name": "Mythril Mace",
"type": "weapon",
"quality": "uncommon",
"slot": "main_hand",
"attack_type": "crush",
"stats": { "damage": 5 },
"description": "A mythril mace that crushes armor with ease.",
"value": 300
},
{
"id": "admt_dagger",
"name": "Adamant Dagger",
"type": "weapon",
"quality": "uncommon",
"slot": "main_hand",
"attack_type": "puncture",
"stats": { "damage": 4 },
"description": "An adamant dagger of deadly precision. Enchanted +2.",
"value": 300
},
{
"id": "dayblade",
"name": "Dayblade",
"type": "weapon",
"quality": "uncommon",
"slot": "main_hand",
"attack_type": "slash",
"stats": { "damage": 13 },
"description": "A sword that blazes with light. Casts Mage Flame on use. Enchanted +1.",
"value": 400
},
{
"id": "admt_mace",
"name": "Adamant Mace",
"type": "weapon",
"quality": "uncommon",
"slot": "main_hand",
"attack_type": "crush",
"stats": { "damage": 6 },
"description": "An adamant mace of tremendous crushing power. Enchanted +2.",
"value": 400
},
{
"id": "admt_sword",
"name": "Adamant Sword",
"type": "weapon",
"quality": "uncommon",
"slot": "main_hand",
"attack_type": "slash",
"stats": { "damage": 6 },
"description": "An adamant blade that cleaves through armor. Enchanted +2.",
"value": 500
},
{
"id": "crystal_sword",
"name": "Crystal Sword",
"type": "weapon",
"quality": "uncommon",
"slot": "main_hand",
"attack_type": "slash",
"stats": { "damage": 17 },
"description": "A crystalline sword that permanently destroys Crystal Golems. Enchanted +1.",
"value": 500
},
{
"id": "kaels_axe",
"name": "Kael's Axe",
"type": "weapon",
"quality": "uncommon",
"slot": "main_hand",
"attack_type": "slash",
"stats": { "damage": 12 },
"description": "A cursed axe that poisons those it strikes. Enchanted +2.",
"value": 600
},
{
"id": "hawkblade",
"name": "Hawkblade",
"type": "weapon",
"quality": "uncommon",
"slot": "main_hand",
"attack_type": "slash",
"stats": { "damage": 14 },
"description": "A swift blade that strikes with hawk-like precision.",
"value": 600
},
{
"id": "broom",
"name": "Broom",
"type": "weapon",
"quality": "uncommon",
"slot": "main_hand",
"attack_type": "crush",
"stats": { "damage": 4 },
"description": "A magically animated broom. Casts Phase Door on use. Enchanted +2.",
"value": 600
},
{
"id": "pureblade",
"name": "Pureblade",
"type": "weapon",
"quality": "uncommon",
"slot": "main_hand",
"attack_type": "slash",
"stats": { "damage": 17 },
"description": "A blade of pure energy. Casts Flame Flask on use.",
"value": 600
},
{
"id": "bardsword",
"name": "Bardsword",
"type": "weapon",
"quality": "uncommon",
"slot": "main_hand",
"attack_type": "slash",
"stats": { "damage": 9 },
"description": "A sword that grants unlimited Bard songs when equipped. Enchanted +1.",
"value": 700
},
{
"id": "blood_axe",
"name": "Blood Axe",
"type": "weapon",
"quality": "uncommon",
"slot": "main_hand",
"attack_type": "slash",
"stats": { "damage": 15 },
"description": "An axe that thirsts for blood. Enchanted +2.",
"value": 700
},
{
"id": "dmnd_dagger",
"name": "Diamond Dagger",
"type": "weapon",
"quality": "rare",
"slot": "main_hand",
"attack_type": "puncture",
"stats": { "damage": 5 },
"description": "A dagger with a diamond edge. Enchanted +3.",
"value": 800
},
{
"id": "shield_staff",
"name": "Shield Staff",
"type": "weapon",
"quality": "uncommon",
"slot": "main_hand",
"attack_type": "crush",
"stats": { "damage": 9, "defense": 2 },
"description": "A staff that also provides protection. Enchanted +1.",
"value": 1000
},
{
"id": "thief_dagger",
"name": "Thief Dagger",
"type": "weapon",
"quality": "uncommon",
"slot": "main_hand",
"attack_type": "puncture",
"stats": { "damage": 13 },
"description": "A dagger that improves the wearer's chance to hide in combat.",
"value": 1100
},
{
"id": "dmnd_sword",
"name": "Diamond Sword",
"type": "weapon",
"quality": "rare",
"slot": "main_hand",
"attack_type": "slash",
"stats": { "damage": 7 },
"description": "A sword with a diamond blade of incredible sharpness. Enchanted +3.",
"value": 1200
},
{
"id": "soul_mace",
"name": "Soul Mace",
"type": "weapon",
"quality": "uncommon",
"slot": "main_hand",
"attack_type": "crush",
"stats": { "damage": 9 },
"description": "A mace that can possess the souls of those it strikes. Enchanted +1.",
"value": 1500
},
{
"id": "sword_of_pak",
"name": "Sword of Pak",
"type": "weapon",
"quality": "rare",
"slot": "main_hand",
"attack_type": "slash",
"stats": { "damage": 14 },
"description": "A legendary sword that casts Levitate on use. Enchanted +2.",
"value": 3000
},
{
"id": "wither_staff",
"name": "Wither Staff",
"type": "weapon",
"quality": "rare",
"slot": "main_hand",
"attack_type": "crush",
"stats": { "damage": 8 },
"description": "A staff that ages those it strikes. Enchanted +2.",
"value": 4000
},
{
"id": "arcs_hammer",
"name": "Arc's Hammer",
"type": "weapon",
"quality": "rare",
"slot": "main_hand",
"attack_type": "crush",
"stats": { "damage": 18 },
"description": "A warhammer that casts Recharge Item on use. Enchanted +1.",
"value": 4000
},
{
"id": "mournblade",
"name": "Mournblade",
"type": "weapon",
"quality": "rare",
"slot": "main_hand",
"attack_type": "slash",
"stats": { "damage": 17 },
"description": "A dark sword that drains levels from its victims. Enchanted +1.",
"value": 4000
},
{
"id": "mage_staff",
"name": "Mage Staff",
"type": "weapon",
"quality": "rare",
"slot": "main_hand",
"attack_type": "crush",
"stats": { "damage": 14, "defense": 2 },
"description": "A staff that regenerates spell points when equipped.",
"value": 5000
},
{
"id": "war_staff",
"name": "War Staff",
"type": "weapon",
"quality": "rare",
"slot": "main_hand",
"attack_type": "crush",
"stats": { "damage": 18 },
"description": "A heavy staff of great destructive power.",
"value": 6000
},
{
"id": "sorcerstaff",
"name": "Sorcerstaff",
"type": "weapon",
"quality": "rare",
"slot": "main_hand",
"attack_type": "crush",
"stats": { "damage": 8, "defense": 2 },
"description": "A staff that casts Disintegrate in combat. Enchanted +3.",
"value": 8000
},
{
"id": "conjurstaff",
"name": "Conjurstaff",
"type": "weapon",
"quality": "rare",
"slot": "main_hand",
"attack_type": "crush",
"stats": { "damage": 8 },
"description": "A staff that halves spell costs when equipped. Enchanted +2.",
"value": 8000
},
{
"id": "staff_of_lor",
"name": "Staff of Lor",
"type": "weapon",
"quality": "rare",
"slot": "main_hand",
"attack_type": "crush",
"stats": { "damage": 12 },
"description": "A staff that drives enemies insane and casts Restore on use. Enchanted +1.",
"value": 9000
},
{
"id": "powerstaff",
"name": "Powerstaff",
"type": "weapon",
"quality": "rare",
"slot": "main_hand",
"attack_type": "crush",
"stats": { "damage": 14 },
"description": "A staff that burns groups for 4-16 damage in combat. Enchanted +1.",
"value": 12000
},
{
"id": "spectre_mace",
"name": "Spectre Mace",
"type": "weapon",
"quality": "epic",
"slot": "main_hand",
"attack_type": "crush",
"stats": { "damage": 16 },
"description": "A ghostly mace that drains levels from its victims. Enchanted +5.",
"value": 20000
},
{
"id": "death_dagger",
"name": "Death Dagger",
"type": "weapon",
"quality": "epic",
"slot": "main_hand",
"attack_type": "puncture",
"stats": { "damage": 9 },
"description": "A dagger that delivers critical strikes. Enchanted +3.",
"value": 60000
},
{
"id": "stoneblade",
"name": "Stone Blade",
"type": "weapon",
"quality": "epic",
"slot": "main_hand",
"attack_type": "crush",
"stats": { "damage": 14 },
"description": "A blade that turns those it strikes to stone.",
"value": 70000
},
{
"id": "troll_staff",
"name": "Troll Staff",
"type": "weapon",
"quality": "epic",
"slot": "main_hand",
"attack_type": "crush",
"stats": { "damage": 12 },
"description": "A staff that regenerates HP when equipped. Enchanted +4.",
"value": 100000
},
{
"id": "spectre_snare",
"name": "Spectre Snare",
"type": "weapon",
"quality": "legendary",
"slot": "main_hand",
"attack_type": "puncture",
"stats": { "damage": 33, "defense": 8 },
"description": "The ultimate weapon. Critical strikes, devastating damage, and casts Spark in combat. Enchanted +1.",
"value": 200000
} }
] ]

1266
data/spells/spells.json Normal file

File diff suppressed because it is too large Load diff

View file

@ -1 +1 @@
pub const PROJECT_NAME: &str = "skara-brae"; pub const PROJECT_NAME: &str = "Skara Brae";

View file

@ -1 +1 @@
export const PROJECT_NAME = "skara-brae" as const; export const PROJECT_NAME = "Skara Brae" as const;