From 7af5e53da3f5aecb04ed51e96b31c68950cc3eb3 Mon Sep 17 00:00:00 2001 From: Alex Martinez Date: Wed, 25 Mar 2026 00:22:11 -0700 Subject: [PATCH 1/6] =?UTF-8?q?feat:=20add=203=20intermediate=20quests=20?= =?UTF-8?q?=E2=80=94=20Roads=20Run=20Red,=20Iron=20Will,=20Warchief's=20Fu?= =?UTF-8?q?ry?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Adds a connected quest arc bridging the 7 starter quests into mid-game combat and smithing progression. - roads_run_red: kill 15 bandits, uncover barbarian war standard (Captain Rowan) - iron_will: mine/smelt/smith iron scimitar, test on barbarian outriders (Torvin) - warchiefs_fury: storm Grundar's war camp, defeat the warchief boss (Horvik) NPCs reference each other by name across the arc. Each quest completion hands the player off to the next NPC. Adds barbarian_warchief boss NPC (level 28, health 45, aggressive, respawns every 200 ticks). --- manifests/npcs.json | 329 ++++++++++++++++++++++++++++++++++++++++-- manifests/quests.json | 177 ++++++++++++++++++++++- 2 files changed, 491 insertions(+), 15 deletions(-) diff --git a/manifests/npcs.json b/manifests/npcs.json index c49d7dff0..5173feb09 100644 --- a/manifests/npcs.json +++ b/manifests/npcs.json @@ -295,7 +295,7 @@ "services": { "enabled": true, "types": ["quest"], - "questIds": ["goblin_slayer"] + "questIds": ["goblin_slayer", "roads_run_red"] }, "dialogue": { "entryNodeId": "greeting", @@ -303,7 +303,12 @@ "goblin_slayer": { "in_progress": "progress_check", "ready_to_complete": "quest_complete", - "completed": "post_quest" + "completed": "post_quest_goblin" + }, + "roads_run_red": { + "in_progress": "rrr_progress_check", + "ready_to_complete": "rrr_quest_complete", + "completed": "rrr_post_quest" } }, "nodes": [ @@ -345,7 +350,7 @@ "text": "How goes the goblin hunt? Have you slain fifteen of them yet?", "responses": [ { - "text": "Not yet, but I'm working on it.", + "text": "Still working on it.", "nextNodeId": "encouragement" }, { @@ -368,8 +373,68 @@ "effect": "completeQuest:goblin_slayer" }, { - "id": "post_quest", - "text": "The town owes you a debt, adventurer. The goblin attacks have decreased since your efforts." + "id": "post_quest_goblin", + "text": "The goblins are quieter since your efforts — but something worse has moved in to fill the gap. I've had three merchant caravans hit this week on the north road. Bandits, but organised. Too organised for common thieves.", + "responses": [ + { + "text": "What do you need?", + "nextNodeId": "rrr_offer" + }, + { + "text": "Farewell.", + "nextNodeId": "farewell" + } + ] + }, + { + "id": "rrr_offer", + "text": "Someone is supplying them, paying them. I need you to clear them out — and keep your eyes open while you do it. If you find anything in their camp that tells us who's behind this, I need to know. Here, take this iron sword. You've earned an upgrade.", + "responses": [ + { + "text": "I'll find out who's behind it.", + "nextNodeId": "rrr_accepted", + "effect": "startQuest:roads_run_red" + }, + { + "text": "Not right now.", + "nextNodeId": "farewell" + } + ] + }, + { + "id": "rrr_accepted", + "text": "Fifteen should do it. Don't just kill them — look at what they're carrying. Evidence matters as much as the bodies." + }, + { + "id": "rrr_progress_check", + "text": "Any sign of who's organising the bandits? Have you cleared enough of them to search the camp?", + "responses": [ + { + "text": "Still working on it.", + "nextNodeId": "rrr_encouragement" + }, + { + "text": "Where is their camp?", + "nextNodeId": "rrr_location" + } + ] + }, + { + "id": "rrr_encouragement", + "text": "Every one you take down is a merchant family that gets home safely. Keep at it." + }, + { + "id": "rrr_location", + "text": "They've made camp in the rocky passes north-east of town. The leader stays near the back — watch for better-equipped fighters." + }, + { + "id": "rrr_quest_complete", + "text": "A barbarian war standard. Inside a bandit camp. That's not a coincidence — someone from the clans is funding them. This is bigger than I thought. Go see Torvin at the forge and tell him what you found. He's been worried about the clans for months.", + "effect": "completeQuest:roads_run_red" + }, + { + "id": "rrr_post_quest", + "text": "Torvin will know what to make of a war standard in a bandit camp. The north road is safer now, but I have a feeling we've only seen the beginning of this." }, { "id": "farewell", @@ -609,7 +674,7 @@ "shop", "quest" ], - "questIds": ["torvins_tools"] + "questIds": ["torvins_tools", "iron_will"] }, "dialogue": { "entryNodeId": "greeting", @@ -617,7 +682,12 @@ "torvins_tools": { "in_progress": "progress_check", "ready_to_complete": "quest_complete", - "completed": "post_quest" + "completed": "post_quest_bronze" + }, + "iron_will": { + "in_progress": "iw_progress_check", + "ready_to_complete": "iw_quest_complete", + "completed": "iw_post_quest" } }, "nodes": [ @@ -679,8 +749,78 @@ "effect": "completeQuest:torvins_tools" }, { - "id": "post_quest", - "text": "Good to see you again! Feel free to use the forge anytime." + "id": "post_quest_bronze", + "text": "Good work on the bronze. Come back when Rowan sends you — I have a feeling he will.", + "responses": [ + { + "text": "Rowan actually did send me.", + "nextNodeId": "iw_rowan_intro" + }, + { + "text": "Not yet.", + "nextNodeId": "farewell" + } + ] + }, + { + "id": "iw_rowan_intro", + "text": "A war standard in a bandit camp. Aye, that's what I feared. Someone from the clans is moving pieces. Those bandits weren't robbing merchants — they were testing our response. Scouting us.", + "responses": [ + { + "text": "What do we do?", + "nextNodeId": "iw_offer" + } + ] + }, + { + "id": "iw_offer", + "text": "Bronze won't hold against clan warriors — their armour is too thick. You need iron. Mine it yourself, smelt it, forge a scimitar. Then go find the outriders they've posted on the south road and test whether my theory about the metalwork holds. I need to know before we face more of them.", + "responses": [ + { + "text": "I'll do it.", + "nextNodeId": "iw_accepted", + "effect": "startQuest:iron_will" + }, + { + "text": "Not ready yet.", + "nextNodeId": "farewell" + } + ] + }, + { + "id": "iw_accepted", + "text": "Eight pieces of ore — iron fails the furnace half the time so you'll need extra. Three bars smelted gives you enough for a scimitar. Find the outriders on the south road and come back with news." + }, + { + "id": "iw_progress_check", + "text": "Have you forged the scimitar and found the outriders yet?", + "responses": [ + { + "text": "Still working on it.", + "nextNodeId": "iw_encouragement" + }, + { + "text": "What level do I need to smelt iron?", + "nextNodeId": "iw_tip" + } + ] + }, + { + "id": "iw_encouragement", + "text": "Iron rewards patience. Don't rush the furnace — a bad bar makes a brittle blade." + }, + { + "id": "iw_tip", + "text": "Level fifteen at the furnace, level twenty at the anvil for a scimitar. If you're not there, spend more time on bronze first." + }, + { + "id": "iw_quest_complete", + "text": "The iron held, and the outriders are down. Good. They were scouts for a warchief named Grundar — he's the one uniting the clans. I've told Horvik everything I know. He has the location of Grundar's war camp. Go find him — the armorer's shop, north end of town.", + "effect": "completeQuest:iron_will" + }, + { + "id": "iw_post_quest", + "text": "Horvik is waiting for you. Don't delay — Grundar won't." }, { "id": "trade", @@ -688,7 +828,7 @@ }, { "id": "farewell", - "text": "Come back when you're ready to work." + "text": "Don't rush the furnace." } ] }, @@ -1286,16 +1426,29 @@ "services": { "enabled": true, "types": [ - "shop" - ] + "shop", + "quest" + ], + "questIds": ["warchiefs_fury"] }, "dialogue": { "entryNodeId": "greeting", + "questOverrides": { + "warchiefs_fury": { + "in_progress": "wf_progress_check", + "ready_to_complete": "wf_quest_complete", + "completed": "wf_post_quest" + } + }, "nodes": [ { "id": "greeting", - "text": "Need some armour? I've got the best protection in town.", + "text": "Need armour? Come back later — I'm in the middle of something. Unless Torvin sent you.", "responses": [ + { + "text": "Torvin sent me.", + "nextNodeId": "wf_torvin_intro" + }, { "text": "Show me your armour.", "nextNodeId": "trade", @@ -1307,6 +1460,66 @@ } ] }, + { + "id": "wf_torvin_intro", + "text": "Then you know about Grundar. I've had scouts watching his camp for two weeks. He's united four clans — more than anyone has managed in thirty years. They're two days from the raid.", + "responses": [ + { + "text": "Tell me where he is.", + "nextNodeId": "wf_offer" + } + ] + }, + { + "id": "wf_offer", + "text": "His war camp is north of the barbarian village, past the rocky outcrops. You'll need to cut through fifteen of his warriors to reach him — he keeps his best fighters as a perimeter. Grundar himself doesn't go down easy. If Torvin armed you in iron, you've got a chance. If not, go back to him first.", + "responses": [ + { + "text": "I have the iron blade. I'll end it.", + "nextNodeId": "wf_accepted", + "effect": "startQuest:warchiefs_fury" + }, + { + "text": "I need more time to prepare.", + "nextNodeId": "farewell" + } + ] + }, + { + "id": "wf_accepted", + "text": "Fifteen warriors, then Grundar. Without him, the four clans fall back to fighting each other. That's how barbarian politics works — one warchief, one hold on power. Kill him and the raid dies with him." + }, + { + "id": "wf_progress_check", + "text": "Is Grundar dead? Every hour we wait is an hour closer to that raid.", + "responses": [ + { + "text": "Still fighting through the camp.", + "nextNodeId": "wf_encouragement" + }, + { + "text": "Remind me where the camp is.", + "nextNodeId": "wf_location" + } + ] + }, + { + "id": "wf_encouragement", + "text": "Keep pushing. The warriors are the shield — Grundar is the sword. Cut through them and you reach him." + }, + { + "id": "wf_location", + "text": "North of the barbarian village, past the rocky outcrops. Grundar camps at the centre — bigger than the rest, better armed. You'll know him when you see him." + }, + { + "id": "wf_quest_complete", + "text": "Grundar is dead. I've already had word from the scouts — the clans are arguing over who leads now. The raid is over before it started. Rowan, Torvin, this whole town — none of them know how close it came. Take these. I've been forging them since Torvin first told me about you.", + "effect": "completeQuest:warchiefs_fury" + }, + { + "id": "wf_post_quest", + "text": "The camp has broken apart. Four clans, four warlords, all pointing fingers at each other. That's the way of it without a strong hand to hold them together. You bought this town a long peace." + }, { "id": "trade", "text": "Helms, platebodies, shields - take a look!" @@ -1323,6 +1536,96 @@ "scale": 1.0 } }, + { + "id": "barbarian_warchief", + "name": "Barbarian Warchief", + "description": "Grundar, warchief of the united barbarian clans — a powerful and aggressive boss", + "category": "boss", + "faction": "monster", + "levelRange": [28, 28], + "stats": { + "level": 28, + "health": 45, + "attack": 20, + "strength": 22, + "defense": 18, + "defenseBonus": 5, + "ranged": 1, + "magic": 1 + }, + "combat": { + "attackable": true, + "aggressive": true, + "retaliates": true, + "aggroRange": 5, + "combatRange": 1, + "leashRange": 10, + "attackSpeedTicks": 5, + "respawnTicks": 200 + }, + "movement": { + "type": "wander", + "speed": 3.33, + "wanderRadius": 5 + }, + "drops": { + "defaultDrop": { + "enabled": true, + "itemId": "bones", + "quantity": 1 + }, + "always": [], + "common": [ + { + "itemId": "coins", + "minQuantity": 50, + "maxQuantity": 150, + "chance": 1.0, + "rarity": "common" + } + ], + "uncommon": [ + { + "itemId": "iron_full_helm", + "minQuantity": 1, + "maxQuantity": 1, + "chance": 0.15, + "rarity": "uncommon" + }, + { + "itemId": "iron_scimitar", + "minQuantity": 1, + "maxQuantity": 1, + "chance": 0.12, + "rarity": "uncommon" + }, + { + "itemId": "iron_kiteshield", + "minQuantity": 1, + "maxQuantity": 1, + "chance": 0.08, + "rarity": "uncommon" + } + ], + "rare": [ + { + "itemId": "steel_scimitar", + "minQuantity": 1, + "maxQuantity": 1, + "chance": 0.03, + "rarity": "rare" + } + ], + "veryRare": [] + }, + "appearance": { + "modelPath": "asset://models/mobs/barbarian/barbarian.vrm", + "iconPath": "asset://icons/npcs/shopkeeper.png", + "scale": 1.2, + "heldWeaponModel": "asset://models/swords/scimitars/scimitar-iron-aligned.glb" + }, + "spawnBiomes": ["desert"] + }, { "id": "crafting_supplier", "name": "Dommik", diff --git a/manifests/quests.json b/manifests/quests.json index b56586368..daef8d6f0 100644 --- a/manifests/quests.json +++ b/manifests/quests.json @@ -354,6 +354,179 @@ "xp": {} } }, + "roads_run_red": { + "id": "roads_run_red", + "name": "Roads Run Red", + "description": "Bandits are attacking merchant caravans on the north road — and Captain Rowan suspects someone is organising them.", + "difficulty": "intermediate", + "questPoints": 1, + "replayable": false, + "requirements": { + "quests": ["goblin_slayer"], + "skills": {}, + "items": [] + }, + "startNpc": "captain_rowan", + "stages": [ + { + "id": "start", + "type": "dialogue", + "description": "Speak to Captain Rowan", + "npcId": "captain_rowan" + }, + { + "id": "kill_bandits", + "type": "kill", + "description": "Eliminate 15 bandits on the north road and search their camp for clues", + "target": "bandit", + "count": 15 + }, + { + "id": "return", + "type": "dialogue", + "description": "Return to Captain Rowan with your findings", + "npcId": "captain_rowan" + } + ], + "onStart": { + "items": [ + { "itemId": "iron_shortsword", "quantity": 1 } + ], + "dialogue": "quest_accepted" + }, + "rewards": { + "questPoints": 1, + "items": [ + { "itemId": "iron_kiteshield", "quantity": 1 }, + { "itemId": "xp_lamp_100", "quantity": 1 } + ], + "xp": { "attack": 200, "strength": 150 } + } + }, + "iron_will": { + "id": "iron_will", + "name": "Iron Will", + "description": "Torvin believes bronze won't hold against the clan warriors. He wants you armed in iron — and he wants to see it tested on the outriders threatening the south road.", + "difficulty": "intermediate", + "questPoints": 1, + "replayable": false, + "requirements": { + "quests": ["roads_run_red"], + "skills": { "smithing": 15 }, + "items": [] + }, + "startNpc": "torvin", + "stages": [ + { + "id": "start", + "type": "dialogue", + "description": "Speak to Torvin — Rowan sent you", + "npcId": "torvin" + }, + { + "id": "mine_iron", + "type": "gather", + "description": "Mine 8 iron ore — it's the only metal worth bringing against clan warriors", + "target": "iron_ore", + "count": 8 + }, + { + "id": "smelt_iron", + "type": "interact", + "description": "Smelt 3 iron bars at the furnace", + "target": "iron_bar", + "count": 3 + }, + { + "id": "smith_scimitar", + "type": "interact", + "description": "Forge your iron scimitar at Torvin's anvil", + "target": "iron_scimitar", + "count": 1 + }, + { + "id": "kill_outriders", + "type": "kill", + "description": "Test your blade on the 8 barbarian outriders threatening the south road", + "target": "barbarian", + "count": 8 + }, + { + "id": "return", + "type": "dialogue", + "description": "Return to Torvin with news from the south road", + "npcId": "torvin" + } + ], + "onStart": { + "items": [ + { "itemId": "hammer", "quantity": 1 } + ], + "dialogue": "quest_accepted" + }, + "rewards": { + "questPoints": 1, + "items": [ + { "itemId": "iron_platelegs", "quantity": 1 }, + { "itemId": "xp_lamp_100", "quantity": 1 } + ], + "xp": { "mining": 200, "smithing": 300, "strength": 200 } + } + }, + "warchiefs_fury": { + "id": "warchiefs_fury", + "name": "Warchief's Fury", + "description": "The outriders were scouts. Grundar has united four barbarian clans and is two days from launching a full raid on the town. Horvik needs someone to end it.", + "difficulty": "experienced", + "questPoints": 2, + "replayable": false, + "requirements": { + "quests": ["iron_will"], + "skills": { "attack": 10 }, + "items": [] + }, + "startNpc": "armorer", + "stages": [ + { + "id": "start", + "type": "dialogue", + "description": "Speak to Horvik — Torvin sent you", + "npcId": "armorer" + }, + { + "id": "kill_warcamp", + "type": "kill", + "description": "Fight through Grundar's war camp — cut down 15 of his warriors to reach him", + "target": "barbarian", + "count": 15 + }, + { + "id": "kill_warchief", + "type": "kill", + "description": "Defeat Grundar the Warchief before the raid launches", + "target": "barbarian_warchief", + "count": 1 + }, + { + "id": "return", + "type": "dialogue", + "description": "Return to Horvik", + "npcId": "armorer" + } + ], + "onStart": { + "dialogue": "quest_accepted" + }, + "rewards": { + "questPoints": 2, + "items": [ + { "itemId": "steel_scimitar", "quantity": 1 }, + { "itemId": "steel_kiteshield", "quantity": 1 }, + { "itemId": "xp_lamp_100", "quantity": 1 } + ], + "xp": { "attack": 500, "strength": 300, "defense": 200 } + } + }, "fletchers_introduction": { "id": "fletchers_introduction", "name": "Fletcher's Introduction", @@ -405,8 +578,8 @@ "onStart": { "items": [ { "itemId": "knife", "quantity": 1 }, - { "itemId": "logs", "quantity": 2 }, - { "itemId": "feather", "quantity": 15 }, + { "itemId": "logs", "quantity": 3 }, + { "itemId": "feathers", "quantity": 15 }, { "itemId": "bowstring", "quantity": 1 } ], "dialogue": "quest_accepted" From c00cb8e28c2eb66ac1ba2b185905682bcad4ce70 Mon Sep 17 00:00:00 2001 From: Alex Martinez Date: Thu, 2 Apr 2026 16:46:32 -0700 Subject: [PATCH 2/6] =?UTF-8?q?feat(quests):=20The=20Ashen=20Hand=20arc=20?= =?UTF-8?q?=E2=80=94=20deep=20rewrite=20of=20Roads=20Run=20Red,=20Iron=20W?= =?UTF-8?q?ill,=20Warchief's=20Fury?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Introduces the Ashen Hand: a shadowy guild of war profiteers threading through all 3 quests - Grundar reframed as a tragic figure — forced into the raid to save his starving clan - Full NPC dialogue rewrite: Rowan (haunted military), Torvin (gruff dwarf), Horvik (old armorer who trained Grundar's father) - Grundar buffed: lvl 28→35, hp 45→80, always drops his waraxe, scaled 1.2→1.35 - 3 unique untradeable quest rewards: - Ironwatch Shield (Roads Run Red): iron kiteshield +3 across all defense stats - Torvin's Promise (Iron Will): iron scimitar atk+14/str+13, between iron and steel - Grundar's Waraxe (Warchief's Fury): atk+19/str+18, between steel and mithril - XP rewards increased across all 3 quests - Quest descriptions rewritten to feel cinematic --- manifests/items/armor.json | 24 +- manifests/items/weapons.json | 598 ++++++++++++++++++++++++++++------- manifests/npcs.json | 151 ++++++--- manifests/quests.json | 222 +++++++++---- 4 files changed, 784 insertions(+), 211 deletions(-) diff --git a/manifests/items/armor.json b/manifests/items/armor.json index 5a1838776..880b3be5c 100644 --- a/manifests/items/armor.json +++ b/manifests/items/armor.json @@ -1601,5 +1601,27 @@ "attackMagic": 6, "defenseMagic": 6 } + }, + { + "id": "ironwatch_shield", + "name": "Ironwatch Shield", + "type": "armor", + "tier": "iron", + "equipSlot": "shield", + "value": 0, + "weight": 3.62, + "description": "Made to Rowan's specification \u2014 the shield that stands between the town and what comes next.", + "examine": "Heavier than a standard iron kiteshield. Someone cared about the person carrying it.", + "tradeable": false, + "rarity": "unique", + "bonuses": { + "defenseStab": 13, + "defenseSlash": 15, + "defenseCrush": 14, + "defenseMagic": 0, + "defenseRanged": 13, + "attackMagic": -8, + "attackRanged": -3 + } } -] +] \ No newline at end of file diff --git a/manifests/items/weapons.json b/manifests/items/weapons.json index 5b6107dc4..398f57f74 100644 --- a/manifests/items/weapons.json +++ b/manifests/items/weapons.json @@ -24,7 +24,12 @@ "defense": 0, "ranged": 0 }, - "inventoryActions": ["Wield", "Use", "Drop", "Examine"] + "inventoryActions": [ + "Wield", + "Use", + "Drop", + "Examine" + ] }, { "id": "iron_shortsword", @@ -51,7 +56,12 @@ "defense": 0, "ranged": 0 }, - "inventoryActions": ["Wield", "Use", "Drop", "Examine"] + "inventoryActions": [ + "Wield", + "Use", + "Drop", + "Examine" + ] }, { "id": "steel_shortsword", @@ -78,7 +88,12 @@ "defense": 0, "ranged": 0 }, - "inventoryActions": ["Wield", "Use", "Drop", "Examine"] + "inventoryActions": [ + "Wield", + "Use", + "Drop", + "Examine" + ] }, { "id": "mithril_shortsword", @@ -105,7 +120,12 @@ "defense": 0, "ranged": 0 }, - "inventoryActions": ["Wield", "Use", "Drop", "Examine"] + "inventoryActions": [ + "Wield", + "Use", + "Drop", + "Examine" + ] }, { "id": "adamant_shortsword", @@ -132,7 +152,12 @@ "defense": 0, "ranged": 0 }, - "inventoryActions": ["Wield", "Use", "Drop", "Examine"] + "inventoryActions": [ + "Wield", + "Use", + "Drop", + "Examine" + ] }, { "id": "rune_shortsword", @@ -159,9 +184,13 @@ "defense": 0, "ranged": 0 }, - "inventoryActions": ["Wield", "Use", "Drop", "Examine"] + "inventoryActions": [ + "Wield", + "Use", + "Drop", + "Examine" + ] }, - { "_comment": "=== DAGGERS ===", "id": "bronze_dagger", @@ -188,7 +217,12 @@ "defense": 0, "ranged": 0 }, - "inventoryActions": ["Wield", "Use", "Drop", "Examine"] + "inventoryActions": [ + "Wield", + "Use", + "Drop", + "Examine" + ] }, { "id": "iron_dagger", @@ -215,7 +249,12 @@ "defense": 0, "ranged": 0 }, - "inventoryActions": ["Wield", "Use", "Drop", "Examine"] + "inventoryActions": [ + "Wield", + "Use", + "Drop", + "Examine" + ] }, { "id": "steel_dagger", @@ -242,7 +281,12 @@ "defense": 0, "ranged": 0 }, - "inventoryActions": ["Wield", "Use", "Drop", "Examine"] + "inventoryActions": [ + "Wield", + "Use", + "Drop", + "Examine" + ] }, { "id": "mithril_dagger", @@ -269,7 +313,12 @@ "defense": 0, "ranged": 0 }, - "inventoryActions": ["Wield", "Use", "Drop", "Examine"] + "inventoryActions": [ + "Wield", + "Use", + "Drop", + "Examine" + ] }, { "id": "adamant_dagger", @@ -296,7 +345,12 @@ "defense": 0, "ranged": 0 }, - "inventoryActions": ["Wield", "Use", "Drop", "Examine"] + "inventoryActions": [ + "Wield", + "Use", + "Drop", + "Examine" + ] }, { "id": "rune_dagger", @@ -323,9 +377,13 @@ "defense": 0, "ranged": 0 }, - "inventoryActions": ["Wield", "Use", "Drop", "Examine"] + "inventoryActions": [ + "Wield", + "Use", + "Drop", + "Examine" + ] }, - { "_comment": "=== LONGSWORDS ===", "id": "bronze_longsword", @@ -352,7 +410,12 @@ "defense": 0, "ranged": 0 }, - "inventoryActions": ["Wield", "Use", "Drop", "Examine"] + "inventoryActions": [ + "Wield", + "Use", + "Drop", + "Examine" + ] }, { "id": "iron_longsword", @@ -379,7 +442,12 @@ "defense": 0, "ranged": 0 }, - "inventoryActions": ["Wield", "Use", "Drop", "Examine"] + "inventoryActions": [ + "Wield", + "Use", + "Drop", + "Examine" + ] }, { "id": "steel_longsword", @@ -406,7 +474,12 @@ "defense": 0, "ranged": 0 }, - "inventoryActions": ["Wield", "Use", "Drop", "Examine"] + "inventoryActions": [ + "Wield", + "Use", + "Drop", + "Examine" + ] }, { "id": "mithril_longsword", @@ -433,7 +506,12 @@ "defense": 0, "ranged": 0 }, - "inventoryActions": ["Wield", "Use", "Drop", "Examine"] + "inventoryActions": [ + "Wield", + "Use", + "Drop", + "Examine" + ] }, { "id": "adamant_longsword", @@ -460,7 +538,12 @@ "defense": 0, "ranged": 0 }, - "inventoryActions": ["Wield", "Use", "Drop", "Examine"] + "inventoryActions": [ + "Wield", + "Use", + "Drop", + "Examine" + ] }, { "id": "rune_longsword", @@ -487,9 +570,13 @@ "defense": 0, "ranged": 0 }, - "inventoryActions": ["Wield", "Use", "Drop", "Examine"] + "inventoryActions": [ + "Wield", + "Use", + "Drop", + "Examine" + ] }, - { "_comment": "=== SCIMITARS ===", "id": "bronze_scimitar", @@ -516,7 +603,12 @@ "defense": 0, "ranged": 0 }, - "inventoryActions": ["Wield", "Use", "Drop", "Examine"] + "inventoryActions": [ + "Wield", + "Use", + "Drop", + "Examine" + ] }, { "id": "iron_scimitar", @@ -543,7 +635,12 @@ "defense": 0, "ranged": 0 }, - "inventoryActions": ["Wield", "Use", "Drop", "Examine"] + "inventoryActions": [ + "Wield", + "Use", + "Drop", + "Examine" + ] }, { "id": "steel_scimitar", @@ -570,7 +667,12 @@ "defense": 0, "ranged": 0 }, - "inventoryActions": ["Wield", "Use", "Drop", "Examine"] + "inventoryActions": [ + "Wield", + "Use", + "Drop", + "Examine" + ] }, { "id": "mithril_scimitar", @@ -597,7 +699,12 @@ "defense": 0, "ranged": 0 }, - "inventoryActions": ["Wield", "Use", "Drop", "Examine"] + "inventoryActions": [ + "Wield", + "Use", + "Drop", + "Examine" + ] }, { "id": "adamant_scimitar", @@ -624,7 +731,12 @@ "defense": 0, "ranged": 0 }, - "inventoryActions": ["Wield", "Use", "Drop", "Examine"] + "inventoryActions": [ + "Wield", + "Use", + "Drop", + "Examine" + ] }, { "id": "rune_scimitar", @@ -651,9 +763,13 @@ "defense": 0, "ranged": 0 }, - "inventoryActions": ["Wield", "Use", "Drop", "Examine"] + "inventoryActions": [ + "Wield", + "Use", + "Drop", + "Examine" + ] }, - { "_comment": "=== TWO-HANDED SWORDS ===", "id": "bronze_2h_sword", @@ -680,7 +796,12 @@ "defense": 0, "ranged": 0 }, - "inventoryActions": ["Wield", "Use", "Drop", "Examine"] + "inventoryActions": [ + "Wield", + "Use", + "Drop", + "Examine" + ] }, { "id": "iron_2h_sword", @@ -707,7 +828,12 @@ "defense": 0, "ranged": 0 }, - "inventoryActions": ["Wield", "Use", "Drop", "Examine"] + "inventoryActions": [ + "Wield", + "Use", + "Drop", + "Examine" + ] }, { "id": "steel_2h_sword", @@ -734,7 +860,12 @@ "defense": 0, "ranged": 0 }, - "inventoryActions": ["Wield", "Use", "Drop", "Examine"] + "inventoryActions": [ + "Wield", + "Use", + "Drop", + "Examine" + ] }, { "id": "mithril_2h_sword", @@ -761,7 +892,12 @@ "defense": 0, "ranged": 0 }, - "inventoryActions": ["Wield", "Use", "Drop", "Examine"] + "inventoryActions": [ + "Wield", + "Use", + "Drop", + "Examine" + ] }, { "id": "adamant_2h_sword", @@ -788,7 +924,12 @@ "defense": 0, "ranged": 0 }, - "inventoryActions": ["Wield", "Use", "Drop", "Examine"] + "inventoryActions": [ + "Wield", + "Use", + "Drop", + "Examine" + ] }, { "id": "rune_2h_sword", @@ -815,9 +956,13 @@ "defense": 0, "ranged": 0 }, - "inventoryActions": ["Wield", "Use", "Drop", "Examine"] + "inventoryActions": [ + "Wield", + "Use", + "Drop", + "Examine" + ] }, - { "_comment": "=== RANGED WEAPONS (Standard Bows) ===", "id": "shortbow", @@ -843,9 +988,16 @@ }, "requirements": { "level": 1, - "skills": { "ranged": 1 } - }, - "inventoryActions": ["Wield", "Use", "Drop", "Examine"] + "skills": { + "ranged": 1 + } + }, + "inventoryActions": [ + "Wield", + "Use", + "Drop", + "Examine" + ] }, { "id": "oak_shortbow", @@ -871,9 +1023,16 @@ }, "requirements": { "level": 5, - "skills": { "ranged": 5 } - }, - "inventoryActions": ["Wield", "Use", "Drop", "Examine"] + "skills": { + "ranged": 5 + } + }, + "inventoryActions": [ + "Wield", + "Use", + "Drop", + "Examine" + ] }, { "id": "willow_shortbow", @@ -899,9 +1058,16 @@ }, "requirements": { "level": 20, - "skills": { "ranged": 20 } - }, - "inventoryActions": ["Wield", "Use", "Drop", "Examine"] + "skills": { + "ranged": 20 + } + }, + "inventoryActions": [ + "Wield", + "Use", + "Drop", + "Examine" + ] }, { "id": "maple_shortbow", @@ -927,9 +1093,16 @@ }, "requirements": { "level": 30, - "skills": { "ranged": 30 } - }, - "inventoryActions": ["Wield", "Use", "Drop", "Examine"] + "skills": { + "ranged": 30 + } + }, + "inventoryActions": [ + "Wield", + "Use", + "Drop", + "Examine" + ] }, { "id": "yew_shortbow", @@ -955,9 +1128,16 @@ }, "requirements": { "level": 40, - "skills": { "ranged": 40 } - }, - "inventoryActions": ["Wield", "Use", "Drop", "Examine"] + "skills": { + "ranged": 40 + } + }, + "inventoryActions": [ + "Wield", + "Use", + "Drop", + "Examine" + ] }, { "id": "magic_shortbow", @@ -983,11 +1163,17 @@ }, "requirements": { "level": 50, - "skills": { "ranged": 50 } - }, - "inventoryActions": ["Wield", "Use", "Drop", "Examine"] + "skills": { + "ranged": 50 + } + }, + "inventoryActions": [ + "Wield", + "Use", + "Drop", + "Examine" + ] }, - { "_comment": "=== LONGBOWS ===", "id": "longbow", @@ -1013,9 +1199,16 @@ }, "requirements": { "level": 1, - "skills": { "ranged": 1 } - }, - "inventoryActions": ["Wield", "Use", "Drop", "Examine"] + "skills": { + "ranged": 1 + } + }, + "inventoryActions": [ + "Wield", + "Use", + "Drop", + "Examine" + ] }, { "id": "oak_longbow", @@ -1041,9 +1234,16 @@ }, "requirements": { "level": 5, - "skills": { "ranged": 5 } - }, - "inventoryActions": ["Wield", "Use", "Drop", "Examine"] + "skills": { + "ranged": 5 + } + }, + "inventoryActions": [ + "Wield", + "Use", + "Drop", + "Examine" + ] }, { "id": "willow_longbow", @@ -1069,9 +1269,16 @@ }, "requirements": { "level": 20, - "skills": { "ranged": 20 } - }, - "inventoryActions": ["Wield", "Use", "Drop", "Examine"] + "skills": { + "ranged": 20 + } + }, + "inventoryActions": [ + "Wield", + "Use", + "Drop", + "Examine" + ] }, { "id": "maple_longbow", @@ -1097,9 +1304,16 @@ }, "requirements": { "level": 30, - "skills": { "ranged": 30 } - }, - "inventoryActions": ["Wield", "Use", "Drop", "Examine"] + "skills": { + "ranged": 30 + } + }, + "inventoryActions": [ + "Wield", + "Use", + "Drop", + "Examine" + ] }, { "id": "yew_longbow", @@ -1125,9 +1339,16 @@ }, "requirements": { "level": 40, - "skills": { "ranged": 40 } - }, - "inventoryActions": ["Wield", "Use", "Drop", "Examine"] + "skills": { + "ranged": 40 + } + }, + "inventoryActions": [ + "Wield", + "Use", + "Drop", + "Examine" + ] }, { "id": "magic_longbow", @@ -1153,11 +1374,17 @@ }, "requirements": { "level": 50, - "skills": { "ranged": 50 } - }, - "inventoryActions": ["Wield", "Use", "Drop", "Examine"] + "skills": { + "ranged": 50 + } + }, + "inventoryActions": [ + "Wield", + "Use", + "Drop", + "Examine" + ] }, - { "_comment": "=== UNSTRUNG BOWS (Fletching Intermediates) ===", "id": "shortbow_u", @@ -1171,7 +1398,11 @@ "rarity": "common", "modelPath": null, "iconPath": "asset://icons/shortbow-u.png", - "inventoryActions": ["Use", "Drop", "Examine"] + "inventoryActions": [ + "Use", + "Drop", + "Examine" + ] }, { "id": "longbow_u", @@ -1185,7 +1416,11 @@ "rarity": "common", "modelPath": null, "iconPath": "asset://icons/longbow-u.png", - "inventoryActions": ["Use", "Drop", "Examine"] + "inventoryActions": [ + "Use", + "Drop", + "Examine" + ] }, { "id": "oak_shortbow_u", @@ -1199,7 +1434,11 @@ "rarity": "common", "modelPath": null, "iconPath": "asset://icons/oak-shortbow-u.png", - "inventoryActions": ["Use", "Drop", "Examine"] + "inventoryActions": [ + "Use", + "Drop", + "Examine" + ] }, { "id": "oak_longbow_u", @@ -1213,7 +1452,11 @@ "rarity": "common", "modelPath": null, "iconPath": "asset://icons/oak-longbow-u.png", - "inventoryActions": ["Use", "Drop", "Examine"] + "inventoryActions": [ + "Use", + "Drop", + "Examine" + ] }, { "id": "willow_shortbow_u", @@ -1227,7 +1470,11 @@ "rarity": "common", "modelPath": null, "iconPath": "asset://icons/willow-shortbow-u.png", - "inventoryActions": ["Use", "Drop", "Examine"] + "inventoryActions": [ + "Use", + "Drop", + "Examine" + ] }, { "id": "willow_longbow_u", @@ -1241,7 +1488,11 @@ "rarity": "common", "modelPath": null, "iconPath": "asset://icons/willow-longbow-u.png", - "inventoryActions": ["Use", "Drop", "Examine"] + "inventoryActions": [ + "Use", + "Drop", + "Examine" + ] }, { "id": "maple_shortbow_u", @@ -1255,7 +1506,11 @@ "rarity": "uncommon", "modelPath": null, "iconPath": "asset://icons/maple-shortbow-u.png", - "inventoryActions": ["Use", "Drop", "Examine"] + "inventoryActions": [ + "Use", + "Drop", + "Examine" + ] }, { "id": "maple_longbow_u", @@ -1269,7 +1524,11 @@ "rarity": "uncommon", "modelPath": null, "iconPath": "asset://icons/maple-longbow-u.png", - "inventoryActions": ["Use", "Drop", "Examine"] + "inventoryActions": [ + "Use", + "Drop", + "Examine" + ] }, { "id": "yew_shortbow_u", @@ -1283,7 +1542,11 @@ "rarity": "rare", "modelPath": null, "iconPath": "asset://icons/yew-shortbow-u.png", - "inventoryActions": ["Use", "Drop", "Examine"] + "inventoryActions": [ + "Use", + "Drop", + "Examine" + ] }, { "id": "yew_longbow_u", @@ -1297,7 +1560,11 @@ "rarity": "rare", "modelPath": null, "iconPath": "asset://icons/yew-longbow-u.png", - "inventoryActions": ["Use", "Drop", "Examine"] + "inventoryActions": [ + "Use", + "Drop", + "Examine" + ] }, { "id": "magic_shortbow_u", @@ -1311,7 +1578,11 @@ "rarity": "rare", "modelPath": null, "iconPath": "asset://icons/magic-shortbow-u.png", - "inventoryActions": ["Use", "Drop", "Examine"] + "inventoryActions": [ + "Use", + "Drop", + "Examine" + ] }, { "id": "magic_longbow_u", @@ -1325,9 +1596,12 @@ "rarity": "rare", "modelPath": null, "iconPath": "asset://icons/magic-longbow-u.png", - "inventoryActions": ["Use", "Drop", "Examine"] + "inventoryActions": [ + "Use", + "Drop", + "Examine" + ] }, - { "_comment": "=== MAGIC WEAPONS (Staves) ===", "id": "staff", @@ -1351,7 +1625,12 @@ "bonuses": { "attackMagic": 4 }, - "inventoryActions": ["Wield", "Use", "Drop", "Examine"] + "inventoryActions": [ + "Wield", + "Use", + "Drop", + "Examine" + ] }, { "id": "magic_staff", @@ -1377,9 +1656,16 @@ }, "requirements": { "level": 1, - "skills": { "magic": 1 } - }, - "inventoryActions": ["Wield", "Use", "Drop", "Examine"] + "skills": { + "magic": 1 + } + }, + "inventoryActions": [ + "Wield", + "Use", + "Drop", + "Examine" + ] }, { "id": "staff_of_air", @@ -1403,12 +1689,21 @@ "bonuses": { "attackMagic": 10 }, - "providesInfiniteRunes": ["air_rune"], + "providesInfiniteRunes": [ + "air_rune" + ], "requirements": { "level": 1, - "skills": { "magic": 1 } - }, - "inventoryActions": ["Wield", "Use", "Drop", "Examine"] + "skills": { + "magic": 1 + } + }, + "inventoryActions": [ + "Wield", + "Use", + "Drop", + "Examine" + ] }, { "id": "staff_of_water", @@ -1432,12 +1727,21 @@ "bonuses": { "attackMagic": 10 }, - "providesInfiniteRunes": ["water_rune"], + "providesInfiniteRunes": [ + "water_rune" + ], "requirements": { "level": 1, - "skills": { "magic": 1 } - }, - "inventoryActions": ["Wield", "Use", "Drop", "Examine"] + "skills": { + "magic": 1 + } + }, + "inventoryActions": [ + "Wield", + "Use", + "Drop", + "Examine" + ] }, { "id": "staff_of_earth", @@ -1461,12 +1765,21 @@ "bonuses": { "attackMagic": 10 }, - "providesInfiniteRunes": ["earth_rune"], + "providesInfiniteRunes": [ + "earth_rune" + ], "requirements": { "level": 1, - "skills": { "magic": 1 } - }, - "inventoryActions": ["Wield", "Use", "Drop", "Examine"] + "skills": { + "magic": 1 + } + }, + "inventoryActions": [ + "Wield", + "Use", + "Drop", + "Examine" + ] }, { "id": "staff_of_fire", @@ -1490,11 +1803,84 @@ "bonuses": { "attackMagic": 10 }, - "providesInfiniteRunes": ["fire_rune"], + "providesInfiniteRunes": [ + "fire_rune" + ], "requirements": { "level": 1, - "skills": { "magic": 1 } + "skills": { + "magic": 1 + } + }, + "inventoryActions": [ + "Wield", + "Use", + "Drop", + "Examine" + ] + }, + { + "id": "torvins_promise", + "name": "Torvin's Promise", + "type": "weapon", + "tier": "iron", + "value": 0, + "weight": 1.8, + "equipSlot": "weapon", + "weaponType": "SCIMITAR", + "attackType": "MELEE", + "attackSpeed": 4, + "attackRange": 1, + "description": "A dwarf doesn't make things twice. This blade is Torvin's word that you're worth arming.", + "examine": "Forged to dwarven standard. Sharper than it has any right to be for iron.", + "tradeable": false, + "rarity": "unique", + "modelPath": "asset://models/swords/scimitars/scimitar-iron.glb", + "equippedModelPath": "asset://models/swords/scimitars/scimitar-iron-aligned.glb", + "iconPath": "asset://icons/scimitar-iron.png", + "bonuses": { + "attack": 14, + "strength": 13, + "defense": 0, + "ranged": 0 + }, + "inventoryActions": [ + "Wield", + "Use", + "Drop", + "Examine" + ] + }, + { + "id": "grundars_waraxe", + "name": "Grundar's Waraxe", + "type": "weapon", + "tier": "steel", + "value": 0, + "weight": 2.4, + "equipSlot": "weapon", + "weaponType": "SWORD", + "attackType": "MELEE", + "attackSpeed": 5, + "attackRange": 1, + "description": "The weight of four clans. The Ashen Hand put it in his hands. You took it from him.", + "examine": "A warchief's weapon. Heavier than it looks, balanced for someone much larger than you.", + "tradeable": false, + "rarity": "unique", + "modelPath": "asset://models/swords/scimitars/scimitar-steel.glb", + "equippedModelPath": "asset://models/swords/scimitars/scimitar-steel-aligned.glb", + "iconPath": "asset://icons/scimitar-steel.png", + "bonuses": { + "attack": 19, + "strength": 18, + "defense": 1, + "ranged": 0 }, - "inventoryActions": ["Wield", "Use", "Drop", "Examine"] + "inventoryActions": [ + "Wield", + "Use", + "Drop", + "Examine" + ] } -] +] \ No newline at end of file diff --git a/manifests/npcs.json b/manifests/npcs.json index 5173feb09..3606e8050 100644 --- a/manifests/npcs.json +++ b/manifests/npcs.json @@ -281,7 +281,7 @@ { "id": "captain_rowan", "name": "Captain Rowan", - "description": "The captain of the town guard, concerned about the goblin threat", + "description": "Captain of the town guard. Methodical, haunted, and rarely surprised \u2014 but this has him worried.", "category": "neutral", "faction": "town", "combat": { @@ -294,8 +294,13 @@ }, "services": { "enabled": true, - "types": ["quest"], - "questIds": ["goblin_slayer", "roads_run_red"] + "types": [ + "quest" + ], + "questIds": [ + "goblin_slayer", + "roads_run_red" + ] }, "dialogue": { "entryNodeId": "greeting", @@ -374,7 +379,7 @@ }, { "id": "post_quest_goblin", - "text": "The goblins are quieter since your efforts — but something worse has moved in to fill the gap. I've had three merchant caravans hit this week on the north road. Bandits, but organised. Too organised for common thieves.", + "text": "You handled the goblins well. There's a harder problem now. Three merchant caravans hit this week \u2014 same stretch of north road, same hour of night. Bandits don't operate that precisely without someone directing them. Someone with money and a plan.", "responses": [ { "text": "What do you need?", @@ -388,7 +393,7 @@ }, { "id": "rrr_offer", - "text": "Someone is supplying them, paying them. I need you to clear them out — and keep your eyes open while you do it. If you find anything in their camp that tells us who's behind this, I need to know. Here, take this iron sword. You've earned an upgrade.", + "text": "Fifteen of them. Make it count \u2014 and while you're at it, search the camp properly. They're organised, which means there are orders somewhere. Written orders leave trails. Find them and bring them back.", "responses": [ { "text": "I'll find out who's behind it.", @@ -403,11 +408,11 @@ }, { "id": "rrr_accepted", - "text": "Fifteen should do it. Don't just kill them — look at what they're carrying. Evidence matters as much as the bodies." + "text": "Don't just kill them. Look at what they're carrying, what's in the tent at the back. Evidence matters as much as bodies." }, { "id": "rrr_progress_check", - "text": "Any sign of who's organising the bandits? Have you cleared enough of them to search the camp?", + "text": "Have you cleared the camp? I need whatever they were holding \u2014 letters, ledgers, a seal. Anything that points back to who hired them.", "responses": [ { "text": "Still working on it.", @@ -425,16 +430,16 @@ }, { "id": "rrr_location", - "text": "They've made camp in the rocky passes north-east of town. The leader stays near the back — watch for better-equipped fighters." + "text": "Rocky passes north-east of town. The leader stays near the back \u2014 better equipped than the rest. That's where the orders will be." }, { "id": "rrr_quest_complete", - "text": "A barbarian war standard. Inside a bandit camp. That's not a coincidence — someone from the clans is funding them. This is bigger than I thought. Go see Torvin at the forge and tell him what you found. He's been worried about the clans for months.", + "text": "A sealed letter. Black wax, no crest \u2014 just a hand burned into it. I've seen this mark before. Once. On a body. The man was a trade commissioner who started asking the wrong questions about disappearing caravans. This is the Ashen Hand. They don't steal coin \u2014 they destabilise regions. Create fear, cut off trade, then move in when the town is desperate enough to accept any offer. Ask yourself who profits when this place falls. That's the Hand. Go find Torvin. Show him that mark. He'll know what it means for the clans.", "effect": "completeQuest:roads_run_red" }, { "id": "rrr_post_quest", - "text": "Torvin will know what to make of a war standard in a bandit camp. The north road is safer now, but I have a feeling we've only seen the beginning of this." + "text": "The north road is clear, for now. But the Hand doesn't abandon investments \u2014 they recalibrate. Torvin needs to know what we found. Go to him." }, { "id": "farewell", @@ -464,8 +469,12 @@ }, "services": { "enabled": true, - "types": ["quest"], - "questIds": ["lumberjacks_first_lesson"] + "types": [ + "quest" + ], + "questIds": [ + "lumberjacks_first_lesson" + ] }, "dialogue": { "entryNodeId": "greeting", @@ -565,7 +574,9 @@ "shop", "quest" ], - "questIds": ["fresh_catch"] + "questIds": [ + "fresh_catch" + ] }, "dialogue": { "entryNodeId": "greeting", @@ -657,7 +668,7 @@ { "id": "torvin", "name": "Torvin", - "description": "A gruff dwarven smith who runs the local forge", + "description": "Dwarven smith. Gruff, precise, and quietly terrified by what the Ashen Hand's involvement means.", "category": "neutral", "faction": "town", "combat": { @@ -674,7 +685,10 @@ "shop", "quest" ], - "questIds": ["torvins_tools", "iron_will"] + "questIds": [ + "torvins_tools", + "iron_will" + ] }, "dialogue": { "entryNodeId": "greeting", @@ -750,7 +764,7 @@ }, { "id": "post_quest_bronze", - "text": "Good work on the bronze. Come back when Rowan sends you — I have a feeling he will.", + "text": "Good work on the bronze. Come back when Rowan sends you \u2014 I have a feeling he will.", "responses": [ { "text": "Rowan actually did send me.", @@ -764,7 +778,7 @@ }, { "id": "iw_rowan_intro", - "text": "A war standard in a bandit camp. Aye, that's what I feared. Someone from the clans is moving pieces. Those bandits weren't robbing merchants — they were testing our response. Scouting us.", + "text": "The Ashen Hand. Aye, I know that mark. Been seeing their agents in the market for months \u2014 thought they were just traders. They're not. They went to Grundar with a deal: lead the raid, we'll arm your clan through winter. He's not doing this for conquest \u2014 his people are starving and the Hand handed him a war and called it salvation. Someone made a monster out of a man who didn't have many choices. Doesn't make the raid less real.", "responses": [ { "text": "What do we do?", @@ -774,7 +788,7 @@ }, { "id": "iw_offer", - "text": "Bronze won't hold against clan warriors — their armour is too thick. You need iron. Mine it yourself, smelt it, forge a scimitar. Then go find the outriders they've posted on the south road and test whether my theory about the metalwork holds. I need to know before we face more of them.", + "text": "Bronze won't hold against what's coming. Clan warriors fight in iron. You need iron too \u2014 but you're going to earn it. Mine the ore yourself. Smelt it yourself. Forge it yourself. A blade you made with your own hands is a blade you trust when everything else is going wrong. Eight iron ore, three bars, one scimitar. I'll be here.", "responses": [ { "text": "I'll do it.", @@ -789,11 +803,11 @@ }, { "id": "iw_accepted", - "text": "Eight pieces of ore — iron fails the furnace half the time so you'll need extra. Three bars smelted gives you enough for a scimitar. Find the outriders on the south road and come back with news." + "text": "Iron fails the furnace more than bronze \u2014 bring more ore than you think you need. Three bars is what you need for the scimitar. I'll check your work at the anvil. Don't rush it." }, { "id": "iw_progress_check", - "text": "Have you forged the scimitar and found the outriders yet?", + "text": "Have you forged the scimitar? Tested it on the outriders?", "responses": [ { "text": "Still working on it.", @@ -807,7 +821,7 @@ }, { "id": "iw_encouragement", - "text": "Iron rewards patience. Don't rush the furnace — a bad bar makes a brittle blade." + "text": "Iron rewards patience. Don't rush the furnace \u2014 a bad bar makes a brittle blade. And a brittle blade gets you killed against clan steel." }, { "id": "iw_tip", @@ -815,12 +829,12 @@ }, { "id": "iw_quest_complete", - "text": "The iron held, and the outriders are down. Good. They were scouts for a warchief named Grundar — he's the one uniting the clans. I've told Horvik everything I know. He has the location of Grundar's war camp. Go find him — the armorer's shop, north end of town.", + "text": "The outriders are down. Good. Grundar will feel that \u2014 when scouts stop reporting, a warchief starts preparing for an assault. You've shortened the timeline. The blade you forged held, which means you made it right. Keep it. It has a name now \u2014 Torvin's Promise. I don't name things I made poorly. Horvik is waiting. He trained Grundar's father, watched Grundar grow up. He won't be glad to hear what needs doing \u2014 but he already knows. Go to him.", "effect": "completeQuest:iron_will" }, { "id": "iw_post_quest", - "text": "Horvik is waiting for you. Don't delay — Grundar won't." + "text": "Horvik's at the armoury. Don't delay \u2014 Grundar won't." }, { "id": "trade", @@ -857,7 +871,7 @@ "nodes": [ { "id": "greeting", - "text": "Greetings, friend. I'm a tanner — I can tan any hides you bring me.", + "text": "Greetings, friend. I'm a tanner \u2014 I can tan any hides you bring me.", "responses": [ { "text": "I'd like some leather, please.", @@ -1179,7 +1193,9 @@ "shop", "quest" ], - "questIds": ["rune_mysteries"] + "questIds": [ + "rune_mysteries" + ] }, "dialogue": { "entryNodeId": "greeting", @@ -1304,7 +1320,9 @@ "shop", "quest" ], - "questIds": ["fletchers_introduction"] + "questIds": [ + "fletchers_introduction" + ] }, "dialogue": { "entryNodeId": "greeting", @@ -1412,7 +1430,7 @@ { "id": "armorer", "name": "Horvik", - "description": "A burly armorer who sells helms, platebodies, shields, and other protective gear", + "description": "Old armorer. Has seen more wars than he'll speak of. Knows Grundar personally, and that makes this harder.", "category": "neutral", "faction": "town", "combat": { @@ -1429,7 +1447,9 @@ "shop", "quest" ], - "questIds": ["warchiefs_fury"] + "questIds": [ + "warchiefs_fury" + ] }, "dialogue": { "entryNodeId": "greeting", @@ -1443,7 +1463,7 @@ "nodes": [ { "id": "greeting", - "text": "Need armour? Come back later — I'm in the middle of something. Unless Torvin sent you.", + "text": "Need armour? Come back later \u2014 I'm in the middle of something. Unless Torvin sent you.", "responses": [ { "text": "Torvin sent me.", @@ -1462,7 +1482,7 @@ }, { "id": "wf_torvin_intro", - "text": "Then you know about Grundar. I've had scouts watching his camp for two weeks. He's united four clans — more than anyone has managed in thirty years. They're two days from the raid.", + "text": "Grundar. I trained his father. Watched the boy grow up. He was never cruel \u2014 just stubborn, proud of his clan. The Ashen Hand came to him with a choice: lead the raid, we arm your people through winter, or watch your clan starve while your rivals grow stronger. He chose the raid. I won't pretend I wouldn't have done the same with three thousand starving mouths behind me. But the raid can't happen. And Grundar won't pull back \u2014 the four clans won't follow an order to stand down. The Hand made sure of that. There's only one way to stop this now.", "responses": [ { "text": "Tell me where he is.", @@ -1472,7 +1492,7 @@ }, { "id": "wf_offer", - "text": "His war camp is north of the barbarian village, past the rocky outcrops. You'll need to cut through fifteen of his warriors to reach him — he keeps his best fighters as a perimeter. Grundar himself doesn't go down easy. If Torvin armed you in iron, you've got a chance. If not, go back to him first.", + "text": "His camp is north, past the rocky outcrops. Fifteen warriors between you and him \u2014 clan soldiers, not mercenaries. They'll die for him without hesitation. Cut through them and reach Grundar. Make it quick. He deserves that much.", "responses": [ { "text": "I have the iron blade. I'll end it.", @@ -1487,11 +1507,11 @@ }, { "id": "wf_accepted", - "text": "Fifteen warriors, then Grundar. Without him, the four clans fall back to fighting each other. That's how barbarian politics works — one warchief, one hold on power. Kill him and the raid dies with him." + "text": "Fifteen warriors, then Grundar. Without him the four clans fall back to fighting each other \u2014 that's how barbarian politics work. The raid dies with him. Just... make it count." }, { "id": "wf_progress_check", - "text": "Is Grundar dead? Every hour we wait is an hour closer to that raid.", + "text": "Is it done? Every hour is an hour closer to that raid reaching our gates.", "responses": [ { "text": "Still fighting through the camp.", @@ -1505,20 +1525,20 @@ }, { "id": "wf_encouragement", - "text": "Keep pushing. The warriors are the shield — Grundar is the sword. Cut through them and you reach him." + "text": "The warriors are the wall. Grundar is what's behind it. Get through." }, { "id": "wf_location", - "text": "North of the barbarian village, past the rocky outcrops. Grundar camps at the centre — bigger than the rest, better armed. You'll know him when you see him." + "text": "North of the barbarian village, past the rocky outcrops. Grundar camps at the centre \u2014 bigger than the rest, better armed. You'll know him when you see him." }, { "id": "wf_quest_complete", - "text": "Grundar is dead. I've already had word from the scouts — the clans are arguing over who leads now. The raid is over before it started. Rowan, Torvin, this whole town — none of them know how close it came. Take these. I've been forging them since Torvin first told me about you.", + "text": "It's done. Scouts confirm the clans are fragmenting \u2014 without Grundar to hold them, they're already arguing succession. The raid won't come. What did he say? Before the end. A man like Grundar doesn't die without saying something. ...The Ashen Hand. He named them. Of course he did \u2014 he'd have wanted that out. They'd have buried his involvement, blamed a rogue warchief, moved on to the next region. Now we know what they are and that they're still here. That makes us a threat to them. Keep that in mind.", "effect": "completeQuest:warchiefs_fury" }, { "id": "wf_post_quest", - "text": "The camp has broken apart. Four clans, four warlords, all pointing fingers at each other. That's the way of it without a strong hand to hold them together. You bought this town a long peace." + "text": "Take Grundar's axe. He carried it for his clan \u2014 it shouldn't rust in the dirt. You stopped the raid he was forced to lead. That's something. The Ashen Hand doesn't lose investments quietly. We've cost them a warchief and a region. They'll know who's responsible. Watch your back, adventurer. And tell no one who really gave Grundar his orders \u2014 not yet. We need time to understand how deep this goes." }, { "id": "trade", @@ -1539,17 +1559,20 @@ { "id": "barbarian_warchief", "name": "Barbarian Warchief", - "description": "Grundar, warchief of the united barbarian clans — a powerful and aggressive boss", + "description": "Grundar \u2014 warchief of four united clans. Not a monster by nature. Made into one by necessity and by the Ashen Hand's offer.", "category": "boss", "faction": "monster", - "levelRange": [28, 28], + "levelRange": [ + 28, + 28 + ], "stats": { - "level": 28, - "health": 45, - "attack": 20, - "strength": 22, - "defense": 18, - "defenseBonus": 5, + "level": 35, + "health": 80, + "attack": 26, + "strength": 28, + "defense": 22, + "defenseBonus": 8, "ranged": 1, "magic": 1 }, @@ -1561,7 +1584,7 @@ "combatRange": 1, "leashRange": 10, "attackSpeedTicks": 5, - "respawnTicks": 200 + "respawnTicks": 500 }, "movement": { "type": "wander", @@ -1574,7 +1597,15 @@ "itemId": "bones", "quantity": 1 }, - "always": [], + "always": [ + { + "itemId": "grundars_waraxe", + "minQuantity": 1, + "maxQuantity": 1, + "chance": 1.0, + "rarity": "unique" + } + ], "common": [ { "itemId": "coins", @@ -1605,6 +1636,13 @@ "maxQuantity": 1, "chance": 0.08, "rarity": "uncommon" + }, + { + "itemId": "coins", + "minQuantity": 200, + "maxQuantity": 400, + "chance": 1.0, + "rarity": "uncommon" } ], "rare": [ @@ -1612,7 +1650,14 @@ "itemId": "steel_scimitar", "minQuantity": 1, "maxQuantity": 1, - "chance": 0.03, + "chance": 0.05, + "rarity": "rare" + }, + { + "itemId": "steel_platelegs", + "minQuantity": 1, + "maxQuantity": 1, + "chance": 0.04, "rarity": "rare" } ], @@ -1621,10 +1666,12 @@ "appearance": { "modelPath": "asset://models/mobs/barbarian/barbarian.vrm", "iconPath": "asset://icons/npcs/shopkeeper.png", - "scale": 1.2, + "scale": 1.35, "heldWeaponModel": "asset://models/swords/scimitars/scimitar-iron-aligned.glb" }, - "spawnBiomes": ["desert"] + "spawnBiomes": [ + "desert" + ] }, { "id": "crafting_supplier", @@ -1646,7 +1693,9 @@ "shop", "quest" ], - "questIds": ["crafting_basics"] + "questIds": [ + "crafting_basics" + ] }, "dialogue": { "entryNodeId": "greeting", diff --git a/manifests/quests.json b/manifests/quests.json index daef8d6f0..4ee634eec 100644 --- a/manifests/quests.json +++ b/manifests/quests.json @@ -35,14 +35,20 @@ ], "onStart": { "items": [ - { "itemId": "bronze_shortsword", "quantity": 1 } + { + "itemId": "bronze_shortsword", + "quantity": 1 + } ], "dialogue": "quest_accepted" }, "rewards": { "questPoints": 1, "items": [ - { "itemId": "xp_lamp_100", "quantity": 1 } + { + "itemId": "xp_lamp_100", + "quantity": 1 + } ], "xp": {} } @@ -90,15 +96,24 @@ ], "onStart": { "items": [ - { "itemId": "bronze_hatchet", "quantity": 1 }, - { "itemId": "tinderbox", "quantity": 1 } + { + "itemId": "bronze_hatchet", + "quantity": 1 + }, + { + "itemId": "tinderbox", + "quantity": 1 + } ], "dialogue": "quest_accepted" }, "rewards": { "questPoints": 1, "items": [ - { "itemId": "xp_lamp_100", "quantity": 1 } + { + "itemId": "xp_lamp_100", + "quantity": 1 + } ], "xp": {} } @@ -146,14 +161,20 @@ ], "onStart": { "items": [ - { "itemId": "small_fishing_net", "quantity": 1 } + { + "itemId": "small_fishing_net", + "quantity": 1 + } ], "dialogue": "quest_accepted" }, "rewards": { "questPoints": 1, "items": [ - { "itemId": "xp_lamp_100", "quantity": 1 } + { + "itemId": "xp_lamp_100", + "quantity": 1 + } ], "xp": {} } @@ -229,15 +250,24 @@ ], "onStart": { "items": [ - { "itemId": "bronze_pickaxe", "quantity": 1 }, - { "itemId": "hammer", "quantity": 1 } + { + "itemId": "bronze_pickaxe", + "quantity": 1 + }, + { + "itemId": "hammer", + "quantity": 1 + } ], "dialogue": "quest_accepted" }, "rewards": { "questPoints": 1, "items": [ - { "itemId": "xp_lamp_100", "quantity": 1 } + { + "itemId": "xp_lamp_100", + "quantity": 1 + } ], "xp": {} } @@ -285,14 +315,20 @@ ], "onStart": { "items": [ - { "itemId": "bronze_pickaxe", "quantity": 1 } + { + "itemId": "bronze_pickaxe", + "quantity": 1 + } ], "dialogue": "quest_accepted" }, "rewards": { "questPoints": 1, "items": [ - { "itemId": "xp_lamp_100", "quantity": 1 } + { + "itemId": "xp_lamp_100", + "quantity": 1 + } ], "xp": {} } @@ -340,16 +376,28 @@ ], "onStart": { "items": [ - { "itemId": "needle", "quantity": 1 }, - { "itemId": "thread", "quantity": 5 }, - { "itemId": "leather", "quantity": 10 } + { + "itemId": "needle", + "quantity": 1 + }, + { + "itemId": "thread", + "quantity": 5 + }, + { + "itemId": "leather", + "quantity": 10 + } ], "dialogue": "quest_accepted" }, "rewards": { "questPoints": 1, "items": [ - { "itemId": "xp_lamp_100", "quantity": 1 } + { + "itemId": "xp_lamp_100", + "quantity": 1 + } ], "xp": {} } @@ -357,12 +405,14 @@ "roads_run_red": { "id": "roads_run_red", "name": "Roads Run Red", - "description": "Bandits are attacking merchant caravans on the north road — and Captain Rowan suspects someone is organising them.", + "description": "Three merchant caravans. Same stretch of north road. Same hour of night. Captain Rowan has seen organised violence before \u2014 and whoever is behind this left a mark.", "difficulty": "intermediate", "questPoints": 1, "replayable": false, "requirements": { - "quests": ["goblin_slayer"], + "quests": [ + "goblin_slayer" + ], "skills": {}, "items": [] }, @@ -377,42 +427,59 @@ { "id": "kill_bandits", "type": "kill", - "description": "Eliminate 15 bandits on the north road and search their camp for clues", + "description": "Eliminate 15 bandits on the north road \u2014 and search the camp for whoever is giving the orders", "target": "bandit", "count": 15 }, { "id": "return", "type": "dialogue", - "description": "Return to Captain Rowan with your findings", + "description": "Return to Captain Rowan with what you found in the camp", "npcId": "captain_rowan" } ], "onStart": { "items": [ - { "itemId": "iron_shortsword", "quantity": 1 } + { + "itemId": "iron_shortsword", + "quantity": 1 + } ], "dialogue": "quest_accepted" }, "rewards": { "questPoints": 1, "items": [ - { "itemId": "iron_kiteshield", "quantity": 1 }, - { "itemId": "xp_lamp_100", "quantity": 1 } + { + "itemId": "ironwatch_shield", + "quantity": 1 + }, + { + "itemId": "xp_lamp_100", + "quantity": 1 + } ], - "xp": { "attack": 200, "strength": 150 } + "xp": { + "attack": 350, + "strength": 250, + "defense": 100 + } } }, "iron_will": { "id": "iron_will", "name": "Iron Will", - "description": "Torvin believes bronze won't hold against the clan warriors. He wants you armed in iron — and he wants to see it tested on the outriders threatening the south road.", + "description": "The bandits were just the opening move. Torvin knows what's coming next, and bronze won't be enough. If you're going to face clan warriors, you'll forge the blade yourself.", "difficulty": "intermediate", "questPoints": 1, "replayable": false, "requirements": { - "quests": ["roads_run_red"], - "skills": { "smithing": 15 }, + "quests": [ + "roads_run_red" + ], + "skills": { + "smithing": 1 + }, "items": [] }, "startNpc": "torvin", @@ -420,13 +487,13 @@ { "id": "start", "type": "dialogue", - "description": "Speak to Torvin — Rowan sent you", + "description": "Speak to Torvin \u2014 Rowan sent you", "npcId": "torvin" }, { "id": "mine_iron", "type": "gather", - "description": "Mine 8 iron ore — it's the only metal worth bringing against clan warriors", + "description": "Mine 8 iron ore \u2014 Torvin won't accept anything less than what you dug yourself", "target": "iron_ore", "count": 8 }, @@ -440,49 +507,70 @@ { "id": "smith_scimitar", "type": "interact", - "description": "Forge your iron scimitar at Torvin's anvil", + "description": "Forge your iron scimitar at Torvin's anvil \u2014 this blade has a name", "target": "iron_scimitar", "count": 1 }, { "id": "kill_outriders", "type": "kill", - "description": "Test your blade on the 8 barbarian outriders threatening the south road", + "description": "Test it on the 8 barbarian outriders threatening the south road", "target": "barbarian", "count": 8 }, { "id": "return", "type": "dialogue", - "description": "Return to Torvin with news from the south road", + "description": "Return to Torvin \u2014 he'll want to know what the outriders were carrying", "npcId": "torvin" } ], "onStart": { "items": [ - { "itemId": "hammer", "quantity": 1 } + { + "itemId": "hammer", + "quantity": 1 + } ], "dialogue": "quest_accepted" }, "rewards": { "questPoints": 1, "items": [ - { "itemId": "iron_platelegs", "quantity": 1 }, - { "itemId": "xp_lamp_100", "quantity": 1 } + { + "itemId": "torvins_promise", + "quantity": 1 + }, + { + "itemId": "iron_platelegs", + "quantity": 1 + }, + { + "itemId": "xp_lamp_100", + "quantity": 1 + } ], - "xp": { "mining": 200, "smithing": 300, "strength": 200 } + "xp": { + "mining": 350, + "smithing": 500, + "strength": 300 + } } }, "warchiefs_fury": { "id": "warchiefs_fury", "name": "Warchief's Fury", - "description": "The outriders were scouts. Grundar has united four barbarian clans and is two days from launching a full raid on the town. Horvik needs someone to end it.", + "description": "Grundar united four clans under one banner \u2014 not from ambition, but from desperation. Someone handed him a war and called it salvation. The raid is two days out. Horvik has one request: end it before it starts.", "difficulty": "experienced", "questPoints": 2, "replayable": false, "requirements": { - "quests": ["iron_will"], - "skills": { "attack": 10 }, + "quests": [ + "iron_will" + ], + "skills": { + "attack": 1 + }, "items": [] }, "startNpc": "armorer", @@ -490,27 +578,27 @@ { "id": "start", "type": "dialogue", - "description": "Speak to Horvik — Torvin sent you", + "description": "Speak to Horvik \u2014 Torvin sent you", "npcId": "armorer" }, { "id": "kill_warcamp", "type": "kill", - "description": "Fight through Grundar's war camp — cut down 15 of his warriors to reach him", + "description": "Fight through Grundar's war camp \u2014 cut down 15 of his warriors to reach the centre", "target": "barbarian", "count": 15 }, { "id": "kill_warchief", "type": "kill", - "description": "Defeat Grundar the Warchief before the raid launches", + "description": "Face Grundar the Warchief. He knows what he became. He chose it anyway.", "target": "barbarian_warchief", "count": 1 }, { "id": "return", "type": "dialogue", - "description": "Return to Horvik", + "description": "Return to Horvik with what Grundar told you before the end", "npcId": "armorer" } ], @@ -520,11 +608,24 @@ "rewards": { "questPoints": 2, "items": [ - { "itemId": "steel_scimitar", "quantity": 1 }, - { "itemId": "steel_kiteshield", "quantity": 1 }, - { "itemId": "xp_lamp_100", "quantity": 1 } + { + "itemId": "grundars_waraxe", + "quantity": 1 + }, + { + "itemId": "steel_kiteshield", + "quantity": 1 + }, + { + "itemId": "xp_lamp_100", + "quantity": 1 + } ], - "xp": { "attack": 500, "strength": 300, "defense": 200 } + "xp": { + "attack": 750, + "strength": 500, + "defense": 350 + } } }, "fletchers_introduction": { @@ -577,19 +678,34 @@ ], "onStart": { "items": [ - { "itemId": "knife", "quantity": 1 }, - { "itemId": "logs", "quantity": 3 }, - { "itemId": "feathers", "quantity": 15 }, - { "itemId": "bowstring", "quantity": 1 } + { + "itemId": "knife", + "quantity": 1 + }, + { + "itemId": "logs", + "quantity": 3 + }, + { + "itemId": "feathers", + "quantity": 15 + }, + { + "itemId": "bowstring", + "quantity": 1 + } ], "dialogue": "quest_accepted" }, "rewards": { "questPoints": 1, "items": [ - { "itemId": "xp_lamp_100", "quantity": 1 } + { + "itemId": "xp_lamp_100", + "quantity": 1 + } ], "xp": {} } } -} +} \ No newline at end of file From 4d13b13468a86588004876452fdf8acc0dd7626c Mon Sep 17 00:00:00 2001 From: Alex Martinez Date: Thu, 2 Apr 2026 16:53:20 -0700 Subject: [PATCH 3/6] =?UTF-8?q?fix(quests):=20remove=20duplicate=20grundar?= =?UTF-8?q?s=5Fwaraxe=20from=20Grundar=20always-drops=20=E2=80=94=20quest?= =?UTF-8?q?=20reward=20already=20grants=20it?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- manifests/npcs.json | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/manifests/npcs.json b/manifests/npcs.json index 3606e8050..2d755fa36 100644 --- a/manifests/npcs.json +++ b/manifests/npcs.json @@ -1597,15 +1597,7 @@ "itemId": "bones", "quantity": 1 }, - "always": [ - { - "itemId": "grundars_waraxe", - "minQuantity": 1, - "maxQuantity": 1, - "chance": 1.0, - "rarity": "unique" - } - ], + "always": [], "common": [ { "itemId": "coins", From 3ff80a6ad370a98b2376a55492b9dc8d3025c3cb Mon Sep 17 00:00:00 2001 From: Alex Martinez Date: Thu, 2 Apr 2026 17:07:28 -0700 Subject: [PATCH 4/6] fix(quests): Iron Will now requires torvins_tools + rewrite all novice descriptions to match new tone --- manifests/quests.json | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/manifests/quests.json b/manifests/quests.json index 4ee634eec..47a962f0e 100644 --- a/manifests/quests.json +++ b/manifests/quests.json @@ -2,7 +2,7 @@ "goblin_slayer": { "id": "goblin_slayer", "name": "Goblin Slayer", - "description": "Captain Rowan needs help dealing with the goblin threat.", + "description": "Goblins have been hitting travelers on the east road. Captain Rowan needs someone capable enough to make them stop \u2014 and prove they can handle worse.", "difficulty": "novice", "questPoints": 1, "replayable": false, @@ -56,7 +56,7 @@ "lumberjacks_first_lesson": { "id": "lumberjacks_first_lesson", "name": "Lumberjack's First Lesson", - "description": "Forester Wilma needs help gathering and burning firewood.", + "description": "Forester Wilma has a simple test for anyone who wants to work the woods: cut the timber yourself, burn it yourself. Prove you know which end of a hatchet to hold.", "difficulty": "novice", "questPoints": 1, "replayable": false, @@ -121,7 +121,7 @@ "fresh_catch": { "id": "fresh_catch", "name": "Fresh Catch", - "description": "Fisherman Pete needs help catching and cooking fish.", + "description": "Fisherman Pete's usual hands haven't shown up and the morning market won't wait. He needs someone who can actually catch something \u2014 and knows what to do with it after.", "difficulty": "novice", "questPoints": 1, "replayable": false, @@ -182,7 +182,7 @@ "torvins_tools": { "id": "torvins_tools", "name": "Torvin's Tools", - "description": "The dwarf Torvin needs help forging a set of bronze tools.", + "description": "The dwarf Torvin is behind on orders and short on patience. Mine the ore, work the furnace, hammer the bars into shape. He'll tell you when it's good enough.", "difficulty": "novice", "questPoints": 1, "replayable": false, @@ -275,7 +275,7 @@ "rune_mysteries": { "id": "rune_mysteries", "name": "Rune Mysteries", - "description": "Wizard Zamorin needs help gathering rune essence and crafting air runes.", + "description": "Wizard Zamorin has been waiting for a capable pair of hands. The essence won't mine itself, and the altar won't walk to you. He wants air runes \u2014 and he wants you to make them.", "difficulty": "novice", "questPoints": 1, "replayable": false, @@ -336,7 +336,7 @@ "crafting_basics": { "id": "crafting_basics", "name": "Crafting Basics", - "description": "Dommik the crafting supplier wants you to prove your skill by crafting leather goods.", + "description": "Dommik the crafting supplier doesn't take apprentices who can't prove themselves first. Leather, needle, thread. Make something wearable and he'll consider you worth his time.", "difficulty": "novice", "questPoints": 1, "replayable": false, @@ -475,7 +475,8 @@ "replayable": false, "requirements": { "quests": [ - "roads_run_red" + "roads_run_red", + "torvins_tools" ], "skills": { "smithing": 1 @@ -631,7 +632,7 @@ "fletchers_introduction": { "id": "fletchers_introduction", "name": "Fletcher's Introduction", - "description": "Lowe the bowyer wants you to learn the basics of fletching.", + "description": "Lowe the bowyer has one rule: you don't sell what you haven't made. Learn to fletch properly or don't bother coming back.", "difficulty": "novice", "questPoints": 1, "replayable": false, From fcea7333bc42aef1a3a900d69c74cdb7971b2f87 Mon Sep 17 00:00:00 2001 From: Alex Martinez Date: Thu, 2 Apr 2026 17:41:40 -0700 Subject: [PATCH 5/6] fix(npcs): update Grundar levelRange to [35,35] to match buffed stats --- manifests/npcs.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/manifests/npcs.json b/manifests/npcs.json index 2d755fa36..8f83fc470 100644 --- a/manifests/npcs.json +++ b/manifests/npcs.json @@ -1563,8 +1563,8 @@ "category": "boss", "faction": "monster", "levelRange": [ - 28, - 28 + 35, + 35 ], "stats": { "level": 35, From d6a657dcaa39c75b11ddc48c346ca11eec364935 Mon Sep 17 00:00:00 2001 From: Alex Martinez Date: Thu, 2 Apr 2026 18:28:28 -0700 Subject: [PATCH 6/6] revert: restore original NPC dialogue, novice quest descriptions, and plain item rewards - Revert Rowan/Torvin/Horvik dialogue back to original war standard clue (remove Ashen Hand) - Revert all 7 novice quest descriptions to originals - Revert rewards to plain tradeable items (iron_kiteshield, iron_platelegs, steel_scimitar/kiteshield) - Remove unique untradeable items (ironwatch_shield, torvins_promise, grundars_waraxe) - Keep: Grundar stat buff, Iron Will prereq fix, improved 3-quest descriptions --- manifests/items/armor.json | 22 ------------- manifests/items/weapons.json | 64 ------------------------------------ manifests/npcs.json | 40 +++++++++++----------- manifests/quests.json | 41 ++++++++++------------- 4 files changed, 38 insertions(+), 129 deletions(-) diff --git a/manifests/items/armor.json b/manifests/items/armor.json index 880b3be5c..646f2d30d 100644 --- a/manifests/items/armor.json +++ b/manifests/items/armor.json @@ -1601,27 +1601,5 @@ "attackMagic": 6, "defenseMagic": 6 } - }, - { - "id": "ironwatch_shield", - "name": "Ironwatch Shield", - "type": "armor", - "tier": "iron", - "equipSlot": "shield", - "value": 0, - "weight": 3.62, - "description": "Made to Rowan's specification \u2014 the shield that stands between the town and what comes next.", - "examine": "Heavier than a standard iron kiteshield. Someone cared about the person carrying it.", - "tradeable": false, - "rarity": "unique", - "bonuses": { - "defenseStab": 13, - "defenseSlash": 15, - "defenseCrush": 14, - "defenseMagic": 0, - "defenseRanged": 13, - "attackMagic": -8, - "attackRanged": -3 - } } ] \ No newline at end of file diff --git a/manifests/items/weapons.json b/manifests/items/weapons.json index 398f57f74..893a9317d 100644 --- a/manifests/items/weapons.json +++ b/manifests/items/weapons.json @@ -1818,69 +1818,5 @@ "Drop", "Examine" ] - }, - { - "id": "torvins_promise", - "name": "Torvin's Promise", - "type": "weapon", - "tier": "iron", - "value": 0, - "weight": 1.8, - "equipSlot": "weapon", - "weaponType": "SCIMITAR", - "attackType": "MELEE", - "attackSpeed": 4, - "attackRange": 1, - "description": "A dwarf doesn't make things twice. This blade is Torvin's word that you're worth arming.", - "examine": "Forged to dwarven standard. Sharper than it has any right to be for iron.", - "tradeable": false, - "rarity": "unique", - "modelPath": "asset://models/swords/scimitars/scimitar-iron.glb", - "equippedModelPath": "asset://models/swords/scimitars/scimitar-iron-aligned.glb", - "iconPath": "asset://icons/scimitar-iron.png", - "bonuses": { - "attack": 14, - "strength": 13, - "defense": 0, - "ranged": 0 - }, - "inventoryActions": [ - "Wield", - "Use", - "Drop", - "Examine" - ] - }, - { - "id": "grundars_waraxe", - "name": "Grundar's Waraxe", - "type": "weapon", - "tier": "steel", - "value": 0, - "weight": 2.4, - "equipSlot": "weapon", - "weaponType": "SWORD", - "attackType": "MELEE", - "attackSpeed": 5, - "attackRange": 1, - "description": "The weight of four clans. The Ashen Hand put it in his hands. You took it from him.", - "examine": "A warchief's weapon. Heavier than it looks, balanced for someone much larger than you.", - "tradeable": false, - "rarity": "unique", - "modelPath": "asset://models/swords/scimitars/scimitar-steel.glb", - "equippedModelPath": "asset://models/swords/scimitars/scimitar-steel-aligned.glb", - "iconPath": "asset://icons/scimitar-steel.png", - "bonuses": { - "attack": 19, - "strength": 18, - "defense": 1, - "ranged": 0 - }, - "inventoryActions": [ - "Wield", - "Use", - "Drop", - "Examine" - ] } ] \ No newline at end of file diff --git a/manifests/npcs.json b/manifests/npcs.json index 8f83fc470..0cb1e31df 100644 --- a/manifests/npcs.json +++ b/manifests/npcs.json @@ -393,7 +393,7 @@ }, { "id": "rrr_offer", - "text": "Fifteen of them. Make it count \u2014 and while you're at it, search the camp properly. They're organised, which means there are orders somewhere. Written orders leave trails. Find them and bring them back.", + "text": "Someone is supplying them, paying them. I need you to clear them out \u2014 and keep your eyes open while you do it. If you find anything in their camp that tells us who's behind this, I need to know. Here, take this iron sword. You've earned an upgrade.", "responses": [ { "text": "I'll find out who's behind it.", @@ -408,11 +408,11 @@ }, { "id": "rrr_accepted", - "text": "Don't just kill them. Look at what they're carrying, what's in the tent at the back. Evidence matters as much as bodies." + "text": "Fifteen should do it. Don't just kill them \u2014 look at what they're carrying. Evidence matters as much as the bodies." }, { "id": "rrr_progress_check", - "text": "Have you cleared the camp? I need whatever they were holding \u2014 letters, ledgers, a seal. Anything that points back to who hired them.", + "text": "Any sign of who's organising the bandits? Have you cleared enough of them to search the camp?", "responses": [ { "text": "Still working on it.", @@ -430,16 +430,16 @@ }, { "id": "rrr_location", - "text": "Rocky passes north-east of town. The leader stays near the back \u2014 better equipped than the rest. That's where the orders will be." + "text": "They've made camp in the rocky passes north-east of town. The leader stays near the back \u2014 watch for better-equipped fighters." }, { "id": "rrr_quest_complete", - "text": "A sealed letter. Black wax, no crest \u2014 just a hand burned into it. I've seen this mark before. Once. On a body. The man was a trade commissioner who started asking the wrong questions about disappearing caravans. This is the Ashen Hand. They don't steal coin \u2014 they destabilise regions. Create fear, cut off trade, then move in when the town is desperate enough to accept any offer. Ask yourself who profits when this place falls. That's the Hand. Go find Torvin. Show him that mark. He'll know what it means for the clans.", + "text": "A barbarian war standard. Inside a bandit camp. That's not a coincidence \u2014 someone from the clans is funding them. This is bigger than I thought. Go see Torvin at the forge and tell him what you found. He's been worried about the clans for months.", "effect": "completeQuest:roads_run_red" }, { "id": "rrr_post_quest", - "text": "The north road is clear, for now. But the Hand doesn't abandon investments \u2014 they recalibrate. Torvin needs to know what we found. Go to him." + "text": "Torvin will know what to make of a war standard in a bandit camp. The north road is safer now, but I have a feeling we've only seen the beginning of this." }, { "id": "farewell", @@ -778,7 +778,7 @@ }, { "id": "iw_rowan_intro", - "text": "The Ashen Hand. Aye, I know that mark. Been seeing their agents in the market for months \u2014 thought they were just traders. They're not. They went to Grundar with a deal: lead the raid, we'll arm your clan through winter. He's not doing this for conquest \u2014 his people are starving and the Hand handed him a war and called it salvation. Someone made a monster out of a man who didn't have many choices. Doesn't make the raid less real.", + "text": "A war standard in a bandit camp. Aye, that's what I feared. Someone from the clans is moving pieces. Those bandits weren't robbing merchants \u2014 they were testing our response. Scouting us.", "responses": [ { "text": "What do we do?", @@ -788,7 +788,7 @@ }, { "id": "iw_offer", - "text": "Bronze won't hold against what's coming. Clan warriors fight in iron. You need iron too \u2014 but you're going to earn it. Mine the ore yourself. Smelt it yourself. Forge it yourself. A blade you made with your own hands is a blade you trust when everything else is going wrong. Eight iron ore, three bars, one scimitar. I'll be here.", + "text": "Bronze won't hold against clan warriors \u2014 their armour is too thick. You need iron. Mine it yourself, smelt it, forge a scimitar. Then go find the outriders they've posted on the south road and test whether my theory about the metalwork holds. I need to know before we face more of them.", "responses": [ { "text": "I'll do it.", @@ -803,11 +803,11 @@ }, { "id": "iw_accepted", - "text": "Iron fails the furnace more than bronze \u2014 bring more ore than you think you need. Three bars is what you need for the scimitar. I'll check your work at the anvil. Don't rush it." + "text": "Eight pieces of ore \u2014 iron fails the furnace half the time so you'll need extra. Three bars smelted gives you enough for a scimitar. Find the outriders on the south road and come back with news." }, { "id": "iw_progress_check", - "text": "Have you forged the scimitar? Tested it on the outriders?", + "text": "Have you forged the scimitar and found the outriders yet?", "responses": [ { "text": "Still working on it.", @@ -821,7 +821,7 @@ }, { "id": "iw_encouragement", - "text": "Iron rewards patience. Don't rush the furnace \u2014 a bad bar makes a brittle blade. And a brittle blade gets you killed against clan steel." + "text": "Iron rewards patience. Don't rush the furnace \u2014 a bad bar makes a brittle blade." }, { "id": "iw_tip", @@ -829,12 +829,12 @@ }, { "id": "iw_quest_complete", - "text": "The outriders are down. Good. Grundar will feel that \u2014 when scouts stop reporting, a warchief starts preparing for an assault. You've shortened the timeline. The blade you forged held, which means you made it right. Keep it. It has a name now \u2014 Torvin's Promise. I don't name things I made poorly. Horvik is waiting. He trained Grundar's father, watched Grundar grow up. He won't be glad to hear what needs doing \u2014 but he already knows. Go to him.", + "text": "The iron held, and the outriders are down. Good. They were scouts for a warchief named Grundar \u2014 he's the one uniting the clans. I've told Horvik everything I know. He has the location of Grundar's war camp. Go find him \u2014 the armorer's shop, north end of town.", "effect": "completeQuest:iron_will" }, { "id": "iw_post_quest", - "text": "Horvik's at the armoury. Don't delay \u2014 Grundar won't." + "text": "Horvik is waiting for you. Don't delay \u2014 Grundar won't." }, { "id": "trade", @@ -1482,7 +1482,7 @@ }, { "id": "wf_torvin_intro", - "text": "Grundar. I trained his father. Watched the boy grow up. He was never cruel \u2014 just stubborn, proud of his clan. The Ashen Hand came to him with a choice: lead the raid, we arm your people through winter, or watch your clan starve while your rivals grow stronger. He chose the raid. I won't pretend I wouldn't have done the same with three thousand starving mouths behind me. But the raid can't happen. And Grundar won't pull back \u2014 the four clans won't follow an order to stand down. The Hand made sure of that. There's only one way to stop this now.", + "text": "Then you know about Grundar. I've had scouts watching his camp for two weeks. He's united four clans \u2014 more than anyone has managed in thirty years. They're two days from the raid.", "responses": [ { "text": "Tell me where he is.", @@ -1492,7 +1492,7 @@ }, { "id": "wf_offer", - "text": "His camp is north, past the rocky outcrops. Fifteen warriors between you and him \u2014 clan soldiers, not mercenaries. They'll die for him without hesitation. Cut through them and reach Grundar. Make it quick. He deserves that much.", + "text": "His war camp is north of the barbarian village, past the rocky outcrops. You'll need to cut through fifteen of his warriors to reach him \u2014 he keeps his best fighters as a perimeter. Grundar himself doesn't go down easy. If Torvin armed you in iron, you've got a chance. If not, go back to him first.", "responses": [ { "text": "I have the iron blade. I'll end it.", @@ -1507,11 +1507,11 @@ }, { "id": "wf_accepted", - "text": "Fifteen warriors, then Grundar. Without him the four clans fall back to fighting each other \u2014 that's how barbarian politics work. The raid dies with him. Just... make it count." + "text": "Fifteen warriors, then Grundar. Without him, the four clans fall back to fighting each other. That's how barbarian politics works \u2014 one warchief, one hold on power. Kill him and the raid dies with him." }, { "id": "wf_progress_check", - "text": "Is it done? Every hour is an hour closer to that raid reaching our gates.", + "text": "Is Grundar dead? Every hour we wait is an hour closer to that raid.", "responses": [ { "text": "Still fighting through the camp.", @@ -1525,7 +1525,7 @@ }, { "id": "wf_encouragement", - "text": "The warriors are the wall. Grundar is what's behind it. Get through." + "text": "Keep pushing. The warriors are the shield \u2014 Grundar is the sword. Cut through them and you reach him." }, { "id": "wf_location", @@ -1533,12 +1533,12 @@ }, { "id": "wf_quest_complete", - "text": "It's done. Scouts confirm the clans are fragmenting \u2014 without Grundar to hold them, they're already arguing succession. The raid won't come. What did he say? Before the end. A man like Grundar doesn't die without saying something. ...The Ashen Hand. He named them. Of course he did \u2014 he'd have wanted that out. They'd have buried his involvement, blamed a rogue warchief, moved on to the next region. Now we know what they are and that they're still here. That makes us a threat to them. Keep that in mind.", + "text": "Grundar is dead. I've already had word from the scouts \u2014 the clans are arguing over who leads now. The raid is over before it started. Rowan, Torvin, this whole town \u2014 none of them know how close it came. Take these. I've been forging them since Torvin first told me about you.", "effect": "completeQuest:warchiefs_fury" }, { "id": "wf_post_quest", - "text": "Take Grundar's axe. He carried it for his clan \u2014 it shouldn't rust in the dirt. You stopped the raid he was forced to lead. That's something. The Ashen Hand doesn't lose investments quietly. We've cost them a warchief and a region. They'll know who's responsible. Watch your back, adventurer. And tell no one who really gave Grundar his orders \u2014 not yet. We need time to understand how deep this goes." + "text": "The camp has broken apart. Four clans, four warlords, all pointing fingers at each other. That's the way of it without a strong hand to hold them together. You bought this town a long peace." }, { "id": "trade", diff --git a/manifests/quests.json b/manifests/quests.json index 47a962f0e..7a720df2e 100644 --- a/manifests/quests.json +++ b/manifests/quests.json @@ -2,7 +2,7 @@ "goblin_slayer": { "id": "goblin_slayer", "name": "Goblin Slayer", - "description": "Goblins have been hitting travelers on the east road. Captain Rowan needs someone capable enough to make them stop \u2014 and prove they can handle worse.", + "description": "Captain Rowan needs help dealing with the goblin threat.", "difficulty": "novice", "questPoints": 1, "replayable": false, @@ -56,7 +56,7 @@ "lumberjacks_first_lesson": { "id": "lumberjacks_first_lesson", "name": "Lumberjack's First Lesson", - "description": "Forester Wilma has a simple test for anyone who wants to work the woods: cut the timber yourself, burn it yourself. Prove you know which end of a hatchet to hold.", + "description": "Forester Wilma needs help gathering and burning firewood.", "difficulty": "novice", "questPoints": 1, "replayable": false, @@ -121,7 +121,7 @@ "fresh_catch": { "id": "fresh_catch", "name": "Fresh Catch", - "description": "Fisherman Pete's usual hands haven't shown up and the morning market won't wait. He needs someone who can actually catch something \u2014 and knows what to do with it after.", + "description": "Fisherman Pete needs help catching and cooking fish.", "difficulty": "novice", "questPoints": 1, "replayable": false, @@ -182,7 +182,7 @@ "torvins_tools": { "id": "torvins_tools", "name": "Torvin's Tools", - "description": "The dwarf Torvin is behind on orders and short on patience. Mine the ore, work the furnace, hammer the bars into shape. He'll tell you when it's good enough.", + "description": "The dwarf Torvin needs help forging a set of bronze tools.", "difficulty": "novice", "questPoints": 1, "replayable": false, @@ -275,7 +275,7 @@ "rune_mysteries": { "id": "rune_mysteries", "name": "Rune Mysteries", - "description": "Wizard Zamorin has been waiting for a capable pair of hands. The essence won't mine itself, and the altar won't walk to you. He wants air runes \u2014 and he wants you to make them.", + "description": "Wizard Zamorin needs help gathering rune essence and crafting air runes.", "difficulty": "novice", "questPoints": 1, "replayable": false, @@ -336,7 +336,7 @@ "crafting_basics": { "id": "crafting_basics", "name": "Crafting Basics", - "description": "Dommik the crafting supplier doesn't take apprentices who can't prove themselves first. Leather, needle, thread. Make something wearable and he'll consider you worth his time.", + "description": "Dommik the crafting supplier wants you to prove your skill by crafting leather goods.", "difficulty": "novice", "questPoints": 1, "replayable": false, @@ -451,7 +451,7 @@ "questPoints": 1, "items": [ { - "itemId": "ironwatch_shield", + "itemId": "iron_kiteshield", "quantity": 1 }, { @@ -460,9 +460,8 @@ } ], "xp": { - "attack": 350, - "strength": 250, - "defense": 100 + "attack": 200, + "strength": 150 } } }, @@ -538,10 +537,6 @@ "rewards": { "questPoints": 1, "items": [ - { - "itemId": "torvins_promise", - "quantity": 1 - }, { "itemId": "iron_platelegs", "quantity": 1 @@ -552,16 +547,16 @@ } ], "xp": { - "mining": 350, - "smithing": 500, - "strength": 300 + "mining": 200, + "smithing": 300, + "strength": 200 } } }, "warchiefs_fury": { "id": "warchiefs_fury", "name": "Warchief's Fury", - "description": "Grundar united four clans under one banner \u2014 not from ambition, but from desperation. Someone handed him a war and called it salvation. The raid is two days out. Horvik has one request: end it before it starts.", + "description": "Grundar united four clans under one banner. The raid is two days out. Horvik needs someone to end it before it starts.", "difficulty": "experienced", "questPoints": 2, "replayable": false, @@ -610,7 +605,7 @@ "questPoints": 2, "items": [ { - "itemId": "grundars_waraxe", + "itemId": "steel_scimitar", "quantity": 1 }, { @@ -623,16 +618,16 @@ } ], "xp": { - "attack": 750, - "strength": 500, - "defense": 350 + "attack": 500, + "strength": 300, + "defense": 200 } } }, "fletchers_introduction": { "id": "fletchers_introduction", "name": "Fletcher's Introduction", - "description": "Lowe the bowyer has one rule: you don't sell what you haven't made. Learn to fletch properly or don't bother coming back.", + "description": "Lowe the bowyer wants you to learn the basics of fletching.", "difficulty": "novice", "questPoints": 1, "replayable": false,