refactor the skill system to adhere to the lore handbook

This commit is contained in:
2026-08-15 11:13:15 +02:00
parent 063e94f6eb
commit 9e5c3277bf
70 changed files with 2271 additions and 445 deletions
@@ -14,7 +14,7 @@ Bouncer: Evening. Name on the list?
You: Depends who's asking.
-> I'm on the list.
<<set $claimed_to_be_on_list = true>>
<<check persuasion standard>>
<<check placement routine>>
<<if $check_result>>
Bouncer: ...you're not on the list.
Bouncer: But it's slow tonight. Go on.
@@ -23,8 +23,8 @@ You: Depends who's asking.
Bouncer: Nobody's on the list tonight. Especially not you.
<<set $went_inside = false>>
<<endif>>
-> Let me through. <<if skill_rank("intimidation") >= 2>>
<<check intimidation hard -1>>
-> Let me through. <<if skill_rank("undisclosed") >= 2>>
<<check undisclosed hard -1>>
<<if $check_degree == "critical_success">>
Bouncer: ...yeah. Yeah, okay.
<<set $reputation += 2>>
@@ -1,18 +1,22 @@
// Passive skill commentary. Fired by CommentarySystem, never <<jump>>ed to.
// One node per (context, skill) pair; if a skill has nothing to say about a
// context, simply omit the node and it won't be considered.
//
// Writing rules (code does not enforce these):
// - Wrong Truth failures: no failure signal in the prose; the UI banner is the only tell.
// - Documentary routes are gated on Act and errand state, never on a voice.
title: Commentary_Entrance_Queue_paranoia
title: Commentary_Entrance_Queue_facework
---
Paranoia: The man three back hasn't looked at his phone once. Nobody waits like that.
FACEWORK: His hands are too still for someone this far back in a queue. What's he practising not to reach for?
===
title: Commentary_Entrance_Queue_read_room
title: Commentary_Entrance_Queue_long_shift
---
Read the Room: Everyone here is pretending they're not cold.
THE LONG SHIFT: Forty minutes. Nobody's shifted their weight the way cold people do. They're paying for this wait in something else.
===
title: Commentary_Entrance_Queue_streetwise
title: Commentary_Entrance_Queue_the_float
---
Streetwise: Door's been "slow tonight" for forty minutes. That's a price, not a queue.
THE FLOAT: Door's been "slow tonight" for forty minutes. Convert that: it's a price, not a queue. Who's eating that?
===
@@ -3,6 +3,15 @@
// This node is never played. Declaring every variable in one place means the
// compiler catches typos ("$reputaton") instead of silently creating a second
// variable at runtime.
//
// Writing rules the code deliberately does not enforce (Skill Bible §7 / refactor plan §2.1):
// - Wrong Truth failures carry no failure signal in the prose — the UI banner is the only tell.
// - Documentary routes are gated on Act and errand state, never on a voice.
//
// Modifier Yarn commands (see YarnSkillCommands):
// <<skill_mod scene facework 2>> — source key "scene" = situational; clear on scene exit
// <<clear_skill_mods scene>>
// Other source keys (drunk, injured, …) are state buckets.
title: Declarations
---
@@ -5,7 +5,7 @@
title: Debug_SkillCheck
---
Narrator: Skill check harness.
<<check persuasion standard>>
<<check placement routine>>
<<if $check_result>>
Narrator: Passed. Rolled {$check_roll}, total {$check_total} against DC {$check_dc}.
<<else>>
@@ -13,10 +13,10 @@ Narrator: Skill check harness.
<<endif>>
// Explicit numeric DC plus a situational modifier.
<<check deduction 16 2>>
Narrator: Deduction came out {$check_degree}.
<<check confluence 16 2>>
Narrator: Confluence came out {$check_degree}.
// Deliberate typo: should log an error and continue, not deadlock.
<<check nosuchskill standard>>
<<check nosuchskill routine>>
Narrator: Survived the bad skill id.
===