b451f83174
Captures the pre-Godot-port state of the codebase. This is the rollback anchor for the Godot port (M0 of theriapolis-rpg-implementation-plan-godot-port.md). All Phase 0 through Phase 6.5 work is included; Phase 7 is in flight. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
110 lines
3.9 KiB
JSON
110 lines
3.9 KiB
JSON
{
|
|
"id": "generic_merchant",
|
|
"root": "intro",
|
|
"nodes": [
|
|
{
|
|
"id": "intro",
|
|
"speaker": "npc",
|
|
"text": "{disposition_label} face today. What brings you to my counter, friend?",
|
|
"options": [
|
|
{
|
|
"text": "Show me what you have for sale.",
|
|
"next": "shop_open",
|
|
"effects": [{ "kind": "open_shop" }]
|
|
},
|
|
{
|
|
"text": "What's the news?",
|
|
"next": "lore"
|
|
},
|
|
{
|
|
"text": "[Persuasion DC 12] Surely a regular customer earns better prices?",
|
|
"skill_check": { "skill": "persuasion", "dc": 12 },
|
|
"next_on_success": "shopkeeper_warmed",
|
|
"next_on_failure": "shopkeeper_unmoved",
|
|
"effects_on_success": [
|
|
{ "kind": "rep_event", "event": { "kind": "Dialogue", "magnitude": 2, "note": "polite haggle" } }
|
|
],
|
|
"effects_on_failure": [
|
|
{ "kind": "rep_event", "event": { "kind": "Dialogue", "magnitude": -1, "note": "weak pitch" } }
|
|
]
|
|
},
|
|
{
|
|
"text": "[Intimidate DC 14] Discount, or I tell people about the rats in your stockroom.",
|
|
"skill_check": { "skill": "intimidation", "dc": 14 },
|
|
"next_on_success": "shopkeeper_caves",
|
|
"next_on_failure": "shopkeeper_dismisses",
|
|
"conditions": [
|
|
{ "kind": "not_has_flag", "flag": "intimidation_used_at_npc" }
|
|
],
|
|
"effects_on_success": [
|
|
{ "kind": "set_flag", "flag": "shopkeeper_intimidated" },
|
|
{ "kind": "set_flag", "flag": "intimidation_used_at_npc" }
|
|
],
|
|
"effects_on_failure": [
|
|
{ "kind": "rep_event", "event": { "kind": "Dialogue", "magnitude": -3, "note": "tried to bully" } },
|
|
{ "kind": "set_flag", "flag": "intimidation_used_at_npc" }
|
|
]
|
|
},
|
|
{
|
|
"text": "Goodbye.",
|
|
"next": "<end>"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"id": "shop_open",
|
|
"speaker": "npc",
|
|
"text": "Take a look. Quality goods, fair prices.",
|
|
"options": [
|
|
{ "text": "[Browse]", "next": "intro", "effects": [{ "kind": "open_shop" }] },
|
|
{ "text": "Actually, never mind.", "next": "intro" }
|
|
]
|
|
},
|
|
{
|
|
"id": "lore",
|
|
"speaker": "npc",
|
|
"text": "Times are uneasy. Rumours of strange scents on the wind. Travellers come through asking after old names. Don't ask me which. I trade in goods, not gossip. (Well — mostly.)",
|
|
"options": [
|
|
{ "text": "Back to business.", "next": "intro" },
|
|
{ "text": "Goodbye.", "next": "<end>" }
|
|
]
|
|
},
|
|
{
|
|
"id": "shopkeeper_warmed",
|
|
"speaker": "npc",
|
|
"text": "Hah. You've a tongue, that's certain. Tell you what — pick something out, I'll knock a bit off.",
|
|
"options": [
|
|
{ "text": "Show me what you have.", "next": "shop_open", "effects": [{ "kind": "open_shop" }] },
|
|
{ "text": "Goodbye.", "next": "<end>" }
|
|
]
|
|
},
|
|
{
|
|
"id": "shopkeeper_unmoved",
|
|
"speaker": "npc",
|
|
"text": "Heard better lines from the rats in my stockroom. Prices are prices.",
|
|
"options": [
|
|
{ "text": "Show me what you have anyway.", "next": "shop_open", "effects": [{ "kind": "open_shop" }] },
|
|
{ "text": "Goodbye.", "next": "<end>" }
|
|
]
|
|
},
|
|
{
|
|
"id": "shopkeeper_caves",
|
|
"speaker": "npc",
|
|
"text": "Easy. Easy. There's no need for that. Tell you what — take a look, I'll be reasonable.",
|
|
"options": [
|
|
{ "text": "Show me what you have.", "next": "shop_open", "effects": [{ "kind": "open_shop" }] },
|
|
{ "text": "Goodbye.", "next": "<end>" }
|
|
]
|
|
},
|
|
{
|
|
"id": "shopkeeper_dismisses",
|
|
"speaker": "npc",
|
|
"text": "I've heard better threats from a wet matchstick. Buy something or get out.",
|
|
"options": [
|
|
{ "text": "Show me what you have.", "next": "shop_open", "effects": [{ "kind": "open_shop" }] },
|
|
{ "text": "Goodbye.", "next": "<end>" }
|
|
]
|
|
}
|
|
]
|
|
}
|