A 30-45 minute turn-based RPG built overnight as an engine showcase: six recruitable characters (party of three), four recurring NPCs, choice-driven dialogue with visible-but-locked skill checks, shops, loot, levels, two bosses with in-battle Talk options, the reverted grey-town beat, and an epilogue assembled from the player's actual choices. 33 dialogue scenes / 171 nodes. Terrain is ColorLayers only; kenney_tinydungeon supplies characters, items, and props. Creative direction, story, dialogue, maps, and systems design by Fable; implementation by four Opus subagents (framework, battle, overworld, integration). Verified by tests/playthrough.py: a scripted headless run of all three acts, 20/20 beats passing, plus per-system unit tests (script integrity, UI kit, 225-battle balance sim, overworld). Run: cd build && ./mcrogueface --exec ../games/unwritten/main.py Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014vxWJ6GY384SmZiMVXgrF4
51 lines
2.1 KiB
Python
51 lines
2.1 KiB
Python
"""UNWRITTEN - battle barks. Authored by Fable. One-liners shown in the
|
|
battle log. Keys: char id -> {event: [lines]}. Pick randomly, never twice in
|
|
a row. Events: skill_a, skill_b, hurt_low (under 30% HP), victory, ko."""
|
|
|
|
BARKS = {
|
|
"PIP": {
|
|
"skill_a": ["Two for flinching.", "Quick hands, quicker feet."],
|
|
"skill_b": ["Yoink.", "Finders keepers is a LAW now. I decided."],
|
|
"hurt_low": ["Ow. Noted. OW."],
|
|
"victory": ["Put it in the Book."],
|
|
"ko": ["...page... torn..."],
|
|
},
|
|
"BRAMBLE": {
|
|
"skill_a": ["The post has legs. STAND BEHIND THE POST.",
|
|
"Shieldwall! As rehearsed! I rehearsed alone!"],
|
|
"skill_b": ["Forty years of standing still, arriving all at once!"],
|
|
"hurt_low": ["Merely denting the paperwork."],
|
|
"victory": ["Watch concluded. Nothing got past me."],
|
|
"ko": ["...post... unmanned..."],
|
|
},
|
|
"MOTH": {
|
|
"skill_a": ["Light does mending too.", "Steady. The wick knows."],
|
|
"skill_b": ["This one's named. DUCK."],
|
|
"hurt_low": ["Guttering... not out."],
|
|
"victory": ["All lamps accounted for."],
|
|
"ko": ["...keep it... lit..."],
|
|
},
|
|
"VERA": {
|
|
"skill_a": ["Artisanal!", "Shake well before throwing!"],
|
|
"skill_b": ["Possibility, resolving NOW."],
|
|
"hurt_low": ["I'm marking THIS down as a cost of business."],
|
|
"victory": ["Invoice to follow."],
|
|
"ko": ["...inventory... early again..."],
|
|
},
|
|
"CANTOR": {
|
|
"skill_a": ["A note, held long enough, is a wall.",
|
|
"Tuning... found you."],
|
|
"skill_b": ["THE FANFARE ARRIVES IN THE MIDDLE."],
|
|
"hurt_low": ["Reeds cracked. Song intact."],
|
|
"victory": ["Rest, everyone. That is also part of the music."],
|
|
"ko": ["...the note... someone hold... the note..."],
|
|
},
|
|
"NYX": {
|
|
"skill_a": ["Cold spot. You're standing in it.",
|
|
"The margin bites back."],
|
|
"skill_b": ["Watch the empty spot. WATCH IT."],
|
|
"hurt_low": ["Still here. STILL here."],
|
|
"victory": ["Sketch that."],
|
|
"ko": ["...later... always later..."],
|
|
},
|
|
}
|