From ttrpg-tables
Generate d100 (or d20–d1000) random encounter tables for dark fantasy cities, one theme per table. Themes include combat, social, horror, mystery, erotic, ethical, environmental, weird, religious-occult, event, and economic. Outputs either compact Markdown d100 tables or expanded seven-field blocks. Also orchestrates multi-table product assembly for publication (DriveThruRPG, PDF). Use when the user asks for "d100 encounters", "random encounter table", "100 encounters for [theme]", "encounter book", "urban encounter generator", "city encounters dark fantasy", or references existing encounter files. Also triggers on: "batch encounters", "generate encounters", "encounter table for [district/theme]", "expand this encounter", "assemble encounter book". Do NOT use for wilderness/dungeon encounter tables, single encounter write-ups (use scenario-writer), or NPC-only generation (use npc-creator).
How this skill is triggered — by the user, by Claude, or both
Slash command
/ttrpg-tables:urban-d100-encountersThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Generate themed random encounter tables for dark fantasy cities — from single d20 subtables to full multi-theme publication books.
Generate themed random encounter tables for dark fantasy cities — from single d20 subtables to full multi-theme publication books.
| Scope | What the user wants | Workflow |
|---|---|---|
| Single table | One d100 for one theme | §2–7 |
| Subtable | A d20 or d50 slice | §2–7 (adjust count) |
| Book assembly | Multiple themed d100s packaged as a product | §2–8 |
| Expansion | Upgrade existing Tier 1 entries to Tier 2–3 | §9 |
Default to single table, compact format unless the user specifies otherwise.
Each theme has a primary job — the encounter's main beat must belong to that lane.
| Theme | Primary job | Core tension |
|---|---|---|
| Combat | Violence now or imminent; clear sides; environment complicates | Survival, tactical choice |
| Social | Human interaction — commerce, status, favors, grudges | Relationships, reputation |
| Horror | Dread, corruption, wrongness; the city is sick | Fear, revulsion, helplessness |
| Mystery | Clues, secrets, loose threads; something doesn't add up | Curiosity, paranoia |
| Erotic / Mature | Desire, scandal, intimacy, power through seduction | Temptation, vulnerability, taboo |
| Ethical | Choice over dice; conflicting goods; no clean answer | Conscience, consequence |
| Environmental | Place, weather, architecture, sensory pressure — city as actor | Atmosphere, navigation, endurance |
| Weird | Structured wrongness; wonder tinged with unease | Disorientation, awe |
| Religious / Occult | Believers, doctrine, rituals, institutional faith, prices | Devotion, hypocrisy, cosmic debt |
| Event | Public spectacle, civic ritual, crowd dynamics | Participation, crowd danger, timing |
| Economic | Black markets, debt, scarcity, desperate transactions | Greed, desperation, opportunity |
Cross one secondary theme into ~10–15% of entries for city texture. Use this matrix:
| Primary ↓ / Secondary → | Combat | Social | Horror | Mystery | Erotic | Ethical | Env. | Weird | Relig. | Event | Econ. |
|---|---|---|---|---|---|---|---|---|---|---|---|
| Combat | — | ✓ | ✓✓ | ✓ | · | ✓ | ✓✓ | ✓ | ✓ | ✓ | ✓ |
| Social | ✓ | — | · | ✓✓ | ✓✓ | ✓ | · | · | ✓ | ✓ | ✓✓ |
| Horror | ✓ | · | — | ✓✓ | ✓ | ✓ | ✓✓ | ✓✓ | ✓✓ | · | · |
| Mystery | · | ✓✓ | ✓✓ | — | ✓ | ✓ | ✓ | ✓✓ | ✓ | ✓ | ✓ |
| Erotic | · | ✓✓ | ✓ | ✓✓ | — | ✓✓ | · | ✓ | ✓ | · | ✓ |
| Ethical | ✓✓ | ✓✓ | ✓ | ✓ | ✓ | — | · | · | ✓✓ | ✓ | ✓✓ |
| Environmental | ✓ | · | ✓✓ | ✓ | · | · | — | ✓✓ | ✓ | ✓ | · |
| Weird | ✓ | · | ✓✓ | ✓✓ | ✓ | · | ✓✓ | — | ✓✓ | ✓ | ✓ |
| Religious | ✓ | ✓ | ✓✓ | ✓ | ✓ | ✓✓ | ✓ | ✓✓ | — | ✓✓ | ✓ |
| Event | ✓ | ✓✓ | · | ✓ | · | ✓ | ✓ | ✓ | ✓✓ | — | ✓✓ |
| Economic | ✓ | ✓✓ | · | ✓ | ✓ | ✓✓ | · | ✓ | · | ✓ | — |
✓✓ = strong pairing · ✓ = works if done well · · = avoid unless deliberately subverting
Each theme supports three intensity levels. Declare in YAML frontmatter.
| Level | Label | What it means |
|---|---|---|
| 1 | Atmospheric | Suggestive, implied, background texture |
| 2 | Confrontational | Direct, visceral, demands player reaction |
| 3 | Graphic | Explicit detail, potentially disturbing, requires content warning |
Theme-specific calibration:
| Format | Best for | Structure |
|---|---|---|
| Compact | Fast rolls, stacking tables, smaller products | Single Markdown table, 1–3 sentences per row |
| Expanded | Session centerpieces, rich NPCs, premium products | Seven-field blocks per entry, district sections |
Default to compact unless the user says "expanded", "Velnaris blocks", "seven-field", or "premium format".
| Tier | Share | Length | Purpose |
|---|---|---|---|
| Tier 1 — Vignette | 60% | 1–2 sentences | Atmospheric flavor, background color, no mechanics |
| Tier 2 — Developed | 30% | 3–5 sentences | NPC with motivation, minor hook, optional consequence |
| Tier 3 — Mini-scene | 10% | 2–3 paragraphs | Named NPC, clear stakes, multiple resolutions, stat hooks |
---
title: "[Theme] Encounters — d100"
type: encounter-table
game_system: D&D 5e (2024) | system-agnostic
setting: generic dark city | Velnaris | Zarathar
theme: [primary theme]
intensity: [1|2|3]
status: draft | review | final
language: en | fr
tags: [dark-fantasy, urban, encounters, theme-tag]
content_note: "Required for intensity 2–3 erotic/horror/ethical."
---
| d100 | Tags | Encounter |
|------|------|-----------|
| 1 | market, guild | Full sentence encounter text. |
Tags (2–4 per row):
market, docks, temple, slums, noble, artisan, necropolis, gate, sewer, rooftop, tavern, brothel, genericambush, ritual, scandal, dilemma, fog, auction, corpse, omen)day, night, dawn, dusknone, low, medium, highCombat, Tier 1:
| 14 | docks, ambush, night | Two figures drag a third into a warehouse — the victim's heels leave wet streaks on the cobblestones, and a muffled scream cuts short. |
Ethical, Tier 2:
| 42 | slums, dilemma, day | A landlord's enforcers are bricking shut the doors of a tenement for unpaid rent — with families still inside. The Guard watches from across the street but hasn't moved. A child's face appears at a second-floor window. Intervening means assaulting the landlord's legal agents; doing nothing means watching eviction turn into entombment. The landlord holds contracts signed by the city magistrate. |
Weird, Tier 1:
| 71 | market, omen | Every fishmonger's stall displays the same species today — a deep-water eel no one in the market can name — and none of them remembers placing an order. |
Erotic (L2), Tier 2:
| 56 | noble, scandal, dusk | A noblewoman's sedan chair sits abandoned in an alley, curtains torn, perfume still thick in the air. Her signet ring lies on the cushion beside a love letter addressed to someone who is decidedly not her husband. A servant arrives moments later, panicked, offering gold for silence and the letter's return. |
Per entry: number, title, tagline, optional tier/level band.
| Symbol | Field | Purpose |
|---|---|---|
| ► | Situation | What the PCs walk into — immediate, active, present tense |
| ◈ | Sensory | What they see/hear/smell/feel before they understand |
| ● | NPC | Name — role; want; stake (flash method) |
| → | Hooks | How PCs get pulled in; 2–3 intervention vectors |
| ◆ | City fact | One true detail about law, custom, geography, or faction |
| ◇ | Gossip | What NPCs say about this — rumor, opinion, misinformation |
| ∞ | Recurrence | What happens if PCs ignore it; faction memory; revenge or gratitude |
Combat: ► A Syndicate enforcer pins a debtor against a fountain rim, blade at throat. Two lookouts block the side streets. The debtor sees the PCs and screams for help. ◈ Copper-scented water splashing onto stone. The enforcer's leather coat creaks. A dog barks somewhere above. ● Maren Koss — Syndicate collector; wants the debt paid, not blood; will lose standing if she lets the debtor go publicly. → Fight the enforcers (3 thugs, AC 12, HP 11). Negotiate — Maren accepts alternative payment. The debtor offers a secret worth more than his debt. ◆ In this district, the Guard does not enter Syndicate disputes. It's considered a private contract matter. ◇ "Koss is reasonable unless you shame her. The last person who did that turned up in the canal." ∞ If PCs help the debtor: Maren remembers faces. If PCs stay out: the debtor vanishes; his shop is boarded up by morning.
Ethical: ► A temple orphanage burns. The children are out safe — but a bound prisoner in the cellar is screaming, and the priests aren't moving to help. ◈ Smoke, the crack of timber, the smell of incense burning wrong. The prisoner's voice is raw, barely human. ● Sister Vael — orphanage matron; believes the prisoner is possessed; refuses to risk the children by opening the cellar. → Enter the cellar (DC 12 Athletics, fire damage). Convince Sister Vael (DC 15 Persuasion). Break through from the alley side (DC 14 Investigation to find the entrance). ◆ The Temple has legal custody of anyone declared "afflicted" — the prisoner may not legally be a prisoner at all. ◇ "They brought someone in last week, chained and hooded. The children weren't told why." ∞ If the prisoner dies: nothing changes publicly, but a noble family begins asking questions two days later. If rescued: the prisoner knows something about the Temple's exorcism practices that the clergy would kill to keep hidden.
Weird: ► Every merchant on Candlers' Row is selling the same object today: a brass key with no teeth. None of them remember stocking it. ◈ The keys are warm to the touch. They hum faintly when held near each other. The air smells of ozone and tallow. ● No single NPC — the merchants are confused, slightly dazed, cooperative but useless. → Buy a key and investigate (Arcana DC 13 reveals residual conjuration). Follow the supply chain (Investigation DC 14: the keys arrived in unmarked crates from the harbor, no manifest). Bring two keys together (they point like compass needles toward the Necropolis). ◆ Candlers' Row normally sells wax, wicks, and lamp oil. No metalwork stall has ever operated here. ◇ "I dreamed of a door last night. Didn't think anything of it until I opened my shop." ∞ If ignored: by nightfall, every key is gone — and every lock on Candlers' Row opens to nothing behind the doors.
Erotic (L2): ► A courtesan from the Red Vow stands barefoot on the bridge at dusk, holding an unsigned contract. She has been weeping. She asks the nearest PC to witness her signature — binding her to a patron she clearly fears. ◈ Bare feet on wet stone, kohl-streaked cheeks, the rustle of a silk robe that cost more than most people earn in a year. The contract smells of expensive ink and something sharper — alchemical binding agent. ● Lysenne — courtesan; wants a way out she cannot see; will sign if no one gives her a reason not to. → Refuse to witness (she signs anyway, alone). Witness and say nothing (complicity). Offer an alternative — money, protection, a name (she'll need proof). Read the contract (DC 14 Investigation reveals a non-compete clause that functionally makes her property). ◆ In this city, witnessed contracts are magically binding. A false witness is punishable by branding. ◇ "The Red Vow sells beauty and obedience. Lysenne was too much of one and not enough of the other." ∞ If PCs help: Lysenne becomes a valuable, fiercely loyal contact with access to the city's most private conversations. If they don't: she vanishes from public life within a week.
Adjust proportionally for other table sizes.
By tier:
By district (default spread):
By time:
By danger (combat theme shifts upward):
Use these references so GMs can rename for their world:
| Anchor | Represents |
|---|---|
| the Guard | City watch, militia, law enforcement |
| the Temple | Dominant religious institution |
| the Guild | Relevant trade or craft guild |
| the Court | Noble authority, aristocratic power |
| the Syndicate | Organized crime network |
| the Order | Religious or military order |
| the Academy | Arcane institution |
| the Council | City government, ruling body |
Velnaris anchors (when setting: Velnaris): House of Red Vows, the Ashen Court, the Pallid Council, plus district names from published canon.
Zarathar anchors (when setting: Zarathar): Council of 9 Masks, Artificiers Guild, Eight Forms of Memory, Draconides. Important: do not systematically weave memory/souvenir themes into every encounter — vary the cultural texture broadly.
Verify after generation — manually for ≤50 entries, via script for 100+:
Distribution checks:
Anti-tic checks (see §7.6 for full rules):
Rotate through these to force variety during generation:
NPC archetypes: merchant, guard, priest, beggar, noble, artisan, sailor, courtesan, child, scholar, foreigner, veteran, thief, entertainer, servant, pilgrim, undertaker, midwife, smuggler, herbalist, alchemist, gravedigger, debt collector, street performer, wet nurse, tax assessor
Sensory anchors: smell (spice, rot, incense, blood, rain, brine, tallow), sound (bells, screams, music, hammering, silence, chanting, dripping), texture (wet stone, warm metal, cold silk, rough hemp, greasy leather), light (torchflicker, moonlight, none, colored lanterns, phosphorescence, hearthglow)
Weather/atmosphere: fog, drizzle, heat shimmer, ash fall, unnatural stillness, wrong-direction wind, sudden cold, oily rain, low thunderless lightning, dry electric air
Resolution vectors: flee, negotiate, fight, legal appeal, bribe, invoke custom, pray, hide, investigate, sacrifice something, call the Guard, blackmail, seduce, wait it out
These rules prevent the seven defect patterns (P1–P7) observed across six revision cycles of a 100-entry erotic encounters book. They apply to any d100 generation — combat, horror, mystery, etc.
Each ◇, ◆, →, ●, ◈, and ∞ must be written for its specific entry. Do not create a pool of N variants and assign them round-robin. If a phrase appeared in entry #12, it cannot appear in entry #47 — not paraphrased, not restructured, not with a word swapped. The test: if a reader sees two entries side by side, would they notice a shared phrase? If yes, rewrite.
Hard limits per 100-entry table:
The ► situation text is read-only context for the other fields. No field (◇ ◆ → ● ◈ ∞ or Resolutions) may:
Each support field must be a standalone sentence that a GM could read without having seen the ►.
Do NOT append a "closer" phrase to any field. Specifically:
If a field feels incomplete without a closer, the field itself needs rewriting — not a decorative tail.
Test: Grep the finished table for any sentence that appears more than 3 times. If found, delete it.
Do not assign variant A to entries 1–10, variant B to 11–20, etc. A reader who opens to any decile should not see the same pattern repeated within that page. Mix variants across deciles, not within them.
If every ◈ ends with "[Abstract noun] [physical verb] [location]", the variation is cosmetic, not real. Vary:
When revising a repeated element, the fix is deletion or per-entry rewriting, never 1:1 substitution with a new phrase that will itself be recycled.
If the ► takes place at the docks, the ◈ must smell of brine, not incense. If the ► takes place in a temple, the ◈ should not mention sawdust and forge-heat. Before finalizing, verify every ◈ against the scene's physical location.
After generating a full d100, run these automated checks (manually or via script):
# 1. Find any sentence appearing 4+ times (P1, P3)
grep -oP '(?<=◈ |◇ |◆ |∞ |→ ).+' entries.md | sort | uniq -c | sort -rn | head -20
# 2. Find ► text fragments leaked into other fields (P2)
# Extract each ►, check if any 6+ word substring appears in ◇/◆/∞/→
python check_injection.py entries.md
# 3. Find syntactically identical closers (P5)
# Regex for [Noun] [verb] [preposition] patterns at end of lines
grep -P '[A-Z][a-z]+ [a-z]+s? (for|in|at|under|behind|like|until|before|when|without) ' entries.md | sort | uniq -c | sort -rn
# 4. Check ◈ vs location match (P7)
python check_sensory_match.py entries.md
If any check flags >3 violations, fix before publication.
When the goal is a published encounter book (PDF, DriveThruRPG, print):
[Book Title]
├── Cover + back cover blurb
├── Credits / legal / OGL-ORC
├── Table of Contents
├── Introduction (1–2 pages)
│ ├── What this book is
│ ├── How to use these tables
│ ├── Stacking tables (roll on 2+ simultaneously)
│ └── Safety tools reference (Lines & Veils, X-Card)
├── Theme Chapter 1: [Theme] — d100 table + intro paragraph
├── Theme Chapter 2: [Theme]
├── ...
├── Appendix A: District Quick-Reference
├── Appendix B: NPC Name Generator (by culture)
├── Appendix C: Encounter Chains (linked entries across tables)
└── Back matter / brand page
Flag entries across different theme tables that connect into mini-arcs:
<!-- CHAIN: burning-debt -->
Combat #23 → Economic #47 → Ethical #81
A GM rolling on separate tables may hit chain links organically or follow them deliberately. List chains in Appendix C with suggested reading order and a one-line arc summary.
\newpage between district sectionsTake an existing entry and upgrade its tier:
| Upgrade | What to add |
|---|---|
| Tier 1 → 2 | NPC motivation, a complication, a possible consequence (3–5 sentences total) |
| Tier 1 → 3 | All seven fields (►◈●→◆◇∞), named NPC with flash stats, 2–3 resolution branches, faction consequences |
| Tier 2 → 3 | Missing seven fields, deeper NPC, mechanical hooks, recurrence |
Rule: preserve the original entry's core concept — expand it, don't replace it.
For tables of 100+ entries, use generate_encounters.py:
python generate_encounters.py \
--theme horror \
--size 100 \
--format compact \
--intensity 2 \
--setting generic \
--output encounters/horror-encounters-d100.md
The script:
Critical for batch scripts: The system prompt for each API call MUST include:
For manual generation (d20–d50), follow §7.3 directly without the script.
content_note required in YAML frontmatter listing specific themes (e.g. "body horror, coercion, explicit sexuality, child endangerment").| Companion skill | When to invoke |
|---|---|
npc-creator | Tier 3 entries needing full NPC stat block and backstory |
scenario-writer | Tier 3 entries with strong hook potential → expand into full scenarios |
faction-creator | Entries referencing faction dynamics — ensure consistency |
erotica-fantasy-en / erotica-fantasy-feminine | Tier 3 erotic entries needing developed prose (intensity 2–3) |
read-aloud-crafter | Converting Tier 2–3 entries into table-ready narration |
editorial-tic-auditor | Mandatory post-generation pass on tables of 50+ entries. Run in AUDIT mode to produce a tic inventory; flag any pattern matching P1–P7 from §7.6. If tics found, run field-level rewrites with the tic blacklist in the system prompt. |
ttrpg-cliche-buster | Pre-generation or review pass to identify and replace generic tropes |
encounters/[theme]-encounters-d100.md (kebab-case)encounters/[theme]-encounters/[theme]-encounters.mdencounters/[book-name]/ with one file per chapterencounters/generate_encounters.pySkill version 3.0 — 2026. Fused from urban-d100-encounters + random-encounter-creator. Anti-tic rules (§7.6–7.7) derived from six editorial revision cycles on a 100-entry erotic encounters book.
npx claudepluginhub camauger/ludomancien-skills --plugin ttrpg-tablesCreates, edits, and optimizes skills for Claude Code, including drafting, evaluating with test prompts, iterating on performance, and improving skill descriptions for better triggering accuracy.