Stage 5: Add Prisma integration and enhance mission management
- Introduced Prisma as a dependency in package.json and updated pnpm-lock.yaml. - Created Prisma module and service for database interactions. - Added initial Prisma schema and migration for user, survivor, mission, and related entities. - Implemented throttling in the API using @nestjs/throttler for rate limiting. - Enhanced mission management logic to utilize Prisma for database transactions. - Updated missions controller and service to handle mission state and participant management. - Added Twitch PubSub service for real-time updates on mission states.
This commit is contained in:
@@ -9,12 +9,26 @@
|
||||
"flavorSuccess": [
|
||||
"The generator sputters to life. Light floods the area.",
|
||||
"Sparks fly, then hum — the generator catches.",
|
||||
"Wires connected. The machine breathes again."
|
||||
"Wires connected. The machine breathes again.",
|
||||
"A deep mechanical thrum. Progress.",
|
||||
"The gauge climbs. Another generator done.",
|
||||
"Hands steady, heart racing. The engine turns over.",
|
||||
"The generator shudders, then roars. One less in the dark.",
|
||||
"Circuit reconnected. The hum is its own small victory.",
|
||||
"It takes longer than expected, but the light comes.",
|
||||
"The generator protests, then yields."
|
||||
],
|
||||
"flavorFailure": [
|
||||
"The generator kicks back. Too many watchers in the dark.",
|
||||
"The mechanism jams. Footsteps echo nearby.",
|
||||
"A noise betrays the position. The generator goes cold."
|
||||
"A noise betrays the position. The generator goes cold.",
|
||||
"Something shifts in the fog. The work abandoned.",
|
||||
"The wiring resists every attempt. No progress tonight.",
|
||||
"A shadow crosses the generator. Not now.",
|
||||
"The tool slips. The noise is too loud.",
|
||||
"The generator sparks wrong. An alarm of sorts.",
|
||||
"Patience runs out before the generator does.",
|
||||
"A nearby sound. The repair will have to wait."
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -25,12 +39,26 @@
|
||||
"flavorSuccess": [
|
||||
"The totem crumbles. Its curse lifts from the fog.",
|
||||
"Bones scatter. The hex dissolves into smoke.",
|
||||
"The ritual unravels. Something distant screams."
|
||||
"The ritual unravels. Something distant screams.",
|
||||
"The totem falls apart like it was never solid.",
|
||||
"Ash and splinter. The hex breaks.",
|
||||
"A soft crack — the bones give way. Something changes.",
|
||||
"The skull shatters. Whatever watched through it is gone.",
|
||||
"The cleansing takes. The fog feels thinner.",
|
||||
"The totem offers no resistance. It was waiting to fall.",
|
||||
"One less curse in the trial."
|
||||
],
|
||||
"flavorFailure": [
|
||||
"The totem resists. Its pull is stronger than expected.",
|
||||
"A presence drives the survivor back before the cleanse completes.",
|
||||
"The hex holds. Dread thickens the air."
|
||||
"The hex holds. Dread thickens the air.",
|
||||
"Fingers close on the totem — then something warns away.",
|
||||
"The totem hums with malice. Not today.",
|
||||
"The ritual is interrupted. The hex burns brighter.",
|
||||
"The bones refuse to break. Wrong approach.",
|
||||
"The totem feels wrong. Leave it for now.",
|
||||
"Whatever keeps the totem standing isn't done yet.",
|
||||
"The cleanse stalls halfway. The hex endures."
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -41,12 +69,26 @@
|
||||
"flavorSuccess": [
|
||||
"The chest yields a worn medkit. Small mercies.",
|
||||
"A flashlight, still charged. The fog recedes slightly.",
|
||||
"A useful tool among the debris."
|
||||
"A useful tool among the debris.",
|
||||
"Something worth having. The chest wasn't empty after all.",
|
||||
"Buried under detritus — a working toolbox.",
|
||||
"A medkit, half-depleted but still viable.",
|
||||
"The chest creaks open. Something useful inside.",
|
||||
"Luck, this time.",
|
||||
"Not everything in the fog is hostile. The chest provides.",
|
||||
"A find. The supplies won't last, but they'll help."
|
||||
],
|
||||
"flavorFailure": [
|
||||
"The chest is empty. Only rust and regret.",
|
||||
"The lid splinters — nothing useful inside.",
|
||||
"A noise nearby cuts the search short."
|
||||
"A noise nearby cuts the search short.",
|
||||
"Someone got here first.",
|
||||
"The chest is locked. No time to force it.",
|
||||
"Debris, nothing more.",
|
||||
"Whatever was here is long gone.",
|
||||
"The chest yields nothing. Time wasted.",
|
||||
"Empty. The trial takes without giving.",
|
||||
"Nothing. Move on."
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -57,12 +99,26 @@
|
||||
"flavorSuccess": [
|
||||
"With grim determination, the survivor slips free.",
|
||||
"Arms aching, the hook releases. Freedom, for now.",
|
||||
"A desperate push — the chains give way."
|
||||
"A desperate push — the chains give way.",
|
||||
"The hook yields to persistence.",
|
||||
"Blood and effort. The barb comes free.",
|
||||
"The survivor drops to the ground, gasping.",
|
||||
"Will wins where strength falls short. Free.",
|
||||
"The hook's grip loosens. A precious second of clarity.",
|
||||
"Every instinct says stop. The survivor doesn't.",
|
||||
"The chains snap. Unlikely. Necessary."
|
||||
],
|
||||
"flavorFailure": [
|
||||
"The struggle exhausts. The hook holds.",
|
||||
"Every movement drives the barb deeper. Stay still.",
|
||||
"The fog presses in. The hook remains."
|
||||
"The fog presses in. The hook remains.",
|
||||
"The attempt fails. The chains don't care.",
|
||||
"No leverage. No escape. Not yet.",
|
||||
"The energy spent is wasted. Still trapped.",
|
||||
"The hook was designed for this. It holds.",
|
||||
"Patience isn't a luxury here — but neither is panic.",
|
||||
"The barb shifts but doesn't release.",
|
||||
"The struggle ends. The hook wins this round."
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -73,12 +129,26 @@
|
||||
"flavorSuccess": [
|
||||
"The gate grinds open. Cold air rushes in.",
|
||||
"Generators humming, the lock gives. Almost there.",
|
||||
"The exit yields. Light from outside cuts the fog."
|
||||
"The exit yields. Light from outside cuts the fog.",
|
||||
"The switch holds down. The gate obeys.",
|
||||
"A long, agonising second — then the gate opens.",
|
||||
"The exit panel responds. The way out is clear.",
|
||||
"The gate was always going to open. Tonight it does.",
|
||||
"The outside world, briefly visible through iron.",
|
||||
"The switch trips. The gate moves.",
|
||||
"One last obstacle overcome."
|
||||
],
|
||||
"flavorFailure": [
|
||||
"The gate mechanism is jammed. Precious seconds lost.",
|
||||
"A shadow falls across the panel. The attempt abandoned.",
|
||||
"The switch is stuck. The gate stays shut."
|
||||
"The switch is stuck. The gate stays shut.",
|
||||
"The gate won't cooperate. Not now.",
|
||||
"The panel sparks and resets. Try again.",
|
||||
"Something holds the gate. Not mechanical — worse.",
|
||||
"The generator noise covers the gate's resistance.",
|
||||
"The lock mechanism fails. The gate holds.",
|
||||
"Too slow. The gate doesn't open in time.",
|
||||
"Pressure on the switch, nothing. Wrong timing."
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -89,12 +159,26 @@
|
||||
"flavorSuccess": [
|
||||
"Still as stone. The threat passes without noticing.",
|
||||
"A breath held long — then silence. Safe.",
|
||||
"The fog swallows the survivor whole. Unseen."
|
||||
"The fog swallows the survivor whole. Unseen.",
|
||||
"The patrol route is predictable. Predictable is avoidable.",
|
||||
"Close. Too close. But not close enough to matter.",
|
||||
"The survivor becomes scenery. The patrol sees nothing.",
|
||||
"A narrow gap in the patrol. Taken.",
|
||||
"The killer's attention is elsewhere. Move.",
|
||||
"Footsteps near, then receding. Safe.",
|
||||
"The locker is cold and cramped and perfect."
|
||||
],
|
||||
"flavorFailure": [
|
||||
"A twig snaps. Eye contact — then the chase begins.",
|
||||
"The survivor misjudges the angle. Spotted.",
|
||||
"Heartbeat too loud. Presence too close."
|
||||
"Heartbeat too loud. Presence too close.",
|
||||
"The patrol's route changed. A fatal assumption.",
|
||||
"No cover. The survivor is seen.",
|
||||
"A shadow where there should be none. Detected.",
|
||||
"The instinct to run is wrong. It happens anyway.",
|
||||
"The fog offers no protection here.",
|
||||
"Spotted. The trial shifts.",
|
||||
"The killer turns at the wrong moment."
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -105,12 +189,26 @@
|
||||
"flavorSuccess": [
|
||||
"Bandages tight, the wound closes. Pain recedes.",
|
||||
"The medkit does its job. The survivor steadies.",
|
||||
"A few tense minutes — injuries tended."
|
||||
"A few tense minutes — injuries tended.",
|
||||
"Not good as new, but functional. Good enough.",
|
||||
"The bleeding stops. The fog feels slightly less hostile.",
|
||||
"Clinical precision in a place with no clinics.",
|
||||
"The medkit is emptied wisely. The injury yields.",
|
||||
"Hands that shake still heal.",
|
||||
"The wound is dressed. One less liability.",
|
||||
"Recovery, however temporary, is still recovery."
|
||||
],
|
||||
"flavorFailure": [
|
||||
"Supplies exhausted before the job is done.",
|
||||
"Shaking hands fumble the medkit. Time runs out.",
|
||||
"The wound is worse than it looked. Supplies fall short."
|
||||
"The wound is worse than it looked. Supplies fall short.",
|
||||
"The medkit can't do what it wasn't built for.",
|
||||
"Partial healing is still an open wound.",
|
||||
"The medkit empties wrong. Wasted.",
|
||||
"Not enough supplies. Not enough time.",
|
||||
"A noise ends the attempt prematurely.",
|
||||
"The injury resists treatment.",
|
||||
"The medkit fails the survivor. Move anyway."
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -121,12 +219,26 @@
|
||||
"flavorSuccess": [
|
||||
"The pallet crashes down. A moment bought.",
|
||||
"Timber splinters between them. Distance gained.",
|
||||
"The drop lands true. The chase falters."
|
||||
"The drop lands true. The chase falters.",
|
||||
"A calculated throw. The pallet does its job.",
|
||||
"The killer staggers. A few precious seconds.",
|
||||
"The pallet drops at the right instant.",
|
||||
"An obstacle placed. The chase interrupted.",
|
||||
"The wood holds. That's all it needs to do.",
|
||||
"A roar of frustration behind the pallet. Run.",
|
||||
"The drop lands. The gap widens."
|
||||
],
|
||||
"flavorFailure": [
|
||||
"The pallet drops wide. No gap created.",
|
||||
"Too slow — the obstacle proves useless.",
|
||||
"The throw miscalculated. The pursuit continues."
|
||||
"The throw miscalculated. The pursuit continues.",
|
||||
"The pallet falls too early. Used for nothing.",
|
||||
"The killer vaults before the drop lands.",
|
||||
"The angle was wrong. The pallet wasted.",
|
||||
"The swing comes before the pallet hits.",
|
||||
"Not enough distance to matter.",
|
||||
"The throw panics. The pallet means nothing.",
|
||||
"A wasted pallet. The chase doesn't stop."
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -137,12 +249,26 @@
|
||||
"flavorSuccess": [
|
||||
"The basement yields rare supplies. Worth the risk.",
|
||||
"A pristine toolbox — almost worth dying for.",
|
||||
"The gamble paid off. The survivor emerges with something valuable."
|
||||
"The gamble paid off. The survivor emerges with something valuable.",
|
||||
"The basement gives up its best. A full medkit.",
|
||||
"Down there and back. The best supplies in the trial.",
|
||||
"The risk calculates out. Everything needed, found.",
|
||||
"The stairs back up feel like a victory.",
|
||||
"The basement held back something good tonight.",
|
||||
"A rare find. The fog occasionally provides.",
|
||||
"Against instinct, into the basement. Worth it."
|
||||
],
|
||||
"flavorFailure": [
|
||||
"The basement was a trap. Retreat costs dearly.",
|
||||
"The stairwell offers no escape. A mistake made clear.",
|
||||
"The risk was not worth the reward found — nothing."
|
||||
"The risk was not worth the reward found — nothing.",
|
||||
"The basement is empty. And now time is lost.",
|
||||
"Going down is easy. Coming back is not.",
|
||||
"The killer knows about the basement.",
|
||||
"Nothing down here but dread.",
|
||||
"The search finds nothing. The stairs up feel longer.",
|
||||
"An empty chest in a dangerous room.",
|
||||
"The basement takes more than it gives tonight."
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -153,12 +279,326 @@
|
||||
"flavorSuccess": [
|
||||
"The hatch sighs open. One last mercy from the fog.",
|
||||
"A sound — familiar, haunting. The hatch, just ahead.",
|
||||
"Against all odds, the escape route reveals itself."
|
||||
"Against all odds, the escape route reveals itself.",
|
||||
"The hatch was always here. It waited.",
|
||||
"The fog breaks once. That's enough.",
|
||||
"The survivor finds it before the killer does.",
|
||||
"One last door. It opens.",
|
||||
"The hatch glows faintly. Run.",
|
||||
"The sound of it — an invitation.",
|
||||
"Found. The trial ends here."
|
||||
],
|
||||
"flavorFailure": [
|
||||
"The hatch is nowhere. Only fog and silence.",
|
||||
"Close — so close. Then it closes.",
|
||||
"The sound was something else entirely."
|
||||
"The sound was something else entirely.",
|
||||
"The hatch stays hidden.",
|
||||
"Searching costs time that isn't there.",
|
||||
"The killer finds the hatch first.",
|
||||
"The fog gives nothing freely.",
|
||||
"The sound led nowhere. A trick of the trial.",
|
||||
"No hatch. No escape. Not this way.",
|
||||
"The trial isn't done with the survivor yet."
|
||||
]
|
||||
},
|
||||
{
|
||||
"key": "window_vault",
|
||||
"baseProbability": 0.60,
|
||||
"tags": ["escape", "survival"],
|
||||
"tier": 1,
|
||||
"flavorSuccess": [
|
||||
"The window frame holds. Through and clear.",
|
||||
"A clean vault. Momentum kept.",
|
||||
"The opening is tight but usable.",
|
||||
"Through the gap before the killer closes.",
|
||||
"The vault buys distance. Use it.",
|
||||
"A practiced move. The window yields.",
|
||||
"Landing clean on the other side.",
|
||||
"The window is a door when you need it.",
|
||||
"Fast enough. The gap widens.",
|
||||
"Through. The chase resets."
|
||||
],
|
||||
"flavorFailure": [
|
||||
"The window is boarded shut.",
|
||||
"The vault is too slow. Caught.",
|
||||
"The frame splinters. Not a clean exit.",
|
||||
"Misjudged the height. A costly stumble.",
|
||||
"The window closes the gap but not the killer.",
|
||||
"Too narrow. No good.",
|
||||
"The vault fails at the worst moment.",
|
||||
"The opening was an illusion. Dead end.",
|
||||
"A bad angle kills the attempt.",
|
||||
"The window doesn't help tonight."
|
||||
]
|
||||
},
|
||||
{
|
||||
"key": "locker_hide",
|
||||
"baseProbability": 0.65,
|
||||
"tags": ["stealth", "survival"],
|
||||
"tier": 1,
|
||||
"flavorSuccess": [
|
||||
"The locker closes. Footsteps pass. Breathe.",
|
||||
"Darkness and rust — perfect cover.",
|
||||
"The killer walks past the locker without a glance.",
|
||||
"Still. Quiet. Safe.",
|
||||
"The locker is old and cold and hiding works.",
|
||||
"In and out before the threat turns around.",
|
||||
"The locker holds its occupant safe.",
|
||||
"A long minute of nothing. Then clear.",
|
||||
"The hiding spot works. The patrol moves on.",
|
||||
"The locker door stays closed. The killer moves on."
|
||||
],
|
||||
"flavorFailure": [
|
||||
"The locker door rattles. Discovered.",
|
||||
"The killer yanks it open. No hiding here.",
|
||||
"The locker was already checked.",
|
||||
"The sound of breathing gives the position away.",
|
||||
"The killer knows these lockers too well.",
|
||||
"A squeak of the hinge. Fatal.",
|
||||
"The hiding spot chosen is the wrong one.",
|
||||
"The killer's instinct is correct tonight.",
|
||||
"Spotted entering. No time.",
|
||||
"The locker offers nothing. Pulled out."
|
||||
]
|
||||
},
|
||||
{
|
||||
"key": "trap_disarm",
|
||||
"baseProbability": 0.50,
|
||||
"tags": ["objectives", "altruistic"],
|
||||
"tier": 2,
|
||||
"flavorSuccess": [
|
||||
"The trap clicks disarmed. One less hazard.",
|
||||
"Patient work. The mechanism yields.",
|
||||
"The snap of metal, controlled this time.",
|
||||
"Disarmed without triggering. Clean.",
|
||||
"The trap comes apart safely.",
|
||||
"A moment of focus. The trap poses no more threat.",
|
||||
"The floor is safer now.",
|
||||
"The mechanism was elegant. Now it's inert.",
|
||||
"One trap gone. Onwards.",
|
||||
"The disarm holds. The path is clear."
|
||||
],
|
||||
"flavorFailure": [
|
||||
"The trap snaps. A brutal reminder.",
|
||||
"One wrong move. The trap wins.",
|
||||
"The mechanism was subtler than expected.",
|
||||
"The disarm attempt triggers it.",
|
||||
"Fingers too slow. The trap bites.",
|
||||
"The trap was set with someone capable in mind.",
|
||||
"Miscalculation. The mechanism triggers.",
|
||||
"The trap holds and catches.",
|
||||
"The attempt fails. Pain follows.",
|
||||
"The trap wasn't meant to be disarmed easily."
|
||||
]
|
||||
},
|
||||
{
|
||||
"key": "survivor_rescue",
|
||||
"baseProbability": 0.45,
|
||||
"tags": ["altruistic", "hook"],
|
||||
"tier": 2,
|
||||
"flavorSuccess": [
|
||||
"Off the hook. Both survivors run.",
|
||||
"The unhook is clean. No one watching.",
|
||||
"A teammate freed. The trial continues.",
|
||||
"Quick hands, lucky timing. The rescue holds.",
|
||||
"The hook releases. Time to move.",
|
||||
"Pulled free before the killer returns.",
|
||||
"The rescue works. Move fast.",
|
||||
"A window of opportunity, taken.",
|
||||
"The teammate drops free. The trial has two again.",
|
||||
"Freed. Both running now."
|
||||
],
|
||||
"flavorFailure": [
|
||||
"The killer turns back too soon. Retreat.",
|
||||
"The rescue fails. Both caught.",
|
||||
"The timing was wrong.",
|
||||
"The unhook attempted — the killer was watching.",
|
||||
"No safe window. The rescue abandoned.",
|
||||
"The hook held on.",
|
||||
"The approach was spotted.",
|
||||
"The teammate is hooked again. Worse now.",
|
||||
"The rescue was a trap.",
|
||||
"The killer was closer than it looked."
|
||||
]
|
||||
},
|
||||
{
|
||||
"key": "ruin_destroy",
|
||||
"baseProbability": 0.45,
|
||||
"tags": ["totem", "objectives", "altruistic"],
|
||||
"tier": 2,
|
||||
"flavorSuccess": [
|
||||
"The ruin totem falls. Generator speed returns to normal.",
|
||||
"The hex breaks. The pressure lifts.",
|
||||
"Ruin destroyed. The generators are finally cooperating.",
|
||||
"The totem crumbles. Something screams.",
|
||||
"The ruin is gone. Work can continue properly.",
|
||||
"The corrupting influence ends here.",
|
||||
"Ruin undone. A meaningful contribution.",
|
||||
"The hex shattered. Every generator benefits.",
|
||||
"Ruin falls. The trial shifts.",
|
||||
"The cleansing removes one of the fog's advantages."
|
||||
],
|
||||
"flavorFailure": [
|
||||
"Ruin holds. The generators resist every effort.",
|
||||
"The totem is guarded.",
|
||||
"Ruin endures. Progress is a trickle.",
|
||||
"The hex is stronger than expected.",
|
||||
"The cleanse fails. Ruin stays.",
|
||||
"Guarded or cursed — the totem won't fall.",
|
||||
"The approach to ruin is cut off.",
|
||||
"Ruin watches everything. No safe approach.",
|
||||
"The hex survives the attempt.",
|
||||
"Ruin stands. The generators punish every mistake."
|
||||
]
|
||||
},
|
||||
{
|
||||
"key": "noise_check",
|
||||
"baseProbability": 0.70,
|
||||
"tags": ["stealth", "survival", "objectives"],
|
||||
"tier": 1,
|
||||
"flavorSuccess": [
|
||||
"The area is clear. Work continues.",
|
||||
"A careful sweep — nothing here.",
|
||||
"All quiet. Safe to proceed.",
|
||||
"The check takes seconds. Worth every one.",
|
||||
"Nothing threatening nearby. Focus returned.",
|
||||
"The perimeter is clean. Move on.",
|
||||
"A slow look around — all clear.",
|
||||
"The survivor's instincts were right. Safe.",
|
||||
"No danger. The noise was nothing.",
|
||||
"The area is empty. Continue."
|
||||
],
|
||||
"flavorFailure": [
|
||||
"The check reveals what was feared.",
|
||||
"Not clear. Danger is close.",
|
||||
"The area isn't empty.",
|
||||
"The sound was not nothing.",
|
||||
"A presence, sensed too late.",
|
||||
"The check confirms the worst.",
|
||||
"Not safe. Move now.",
|
||||
"The area is watched.",
|
||||
"The noise was a warning.",
|
||||
"Something is here."
|
||||
]
|
||||
},
|
||||
{
|
||||
"key": "map_find",
|
||||
"baseProbability": 0.40,
|
||||
"tags": ["item", "objectives"],
|
||||
"tier": 1,
|
||||
"flavorSuccess": [
|
||||
"A map of the trial grounds. The generators are marked.",
|
||||
"Routes, exits — everything useful on one piece of paper.",
|
||||
"The map provides context. Decisions improve.",
|
||||
"A schematic of the realm. Useful.",
|
||||
"The map shows what couldn't be known otherwise.",
|
||||
"A rare find. The trial becomes navigable.",
|
||||
"Totem locations, hooks — the map tells all.",
|
||||
"The map is accurate. That's not guaranteed here.",
|
||||
"A clearer picture of the trial grounds.",
|
||||
"The map is old but correct. It will help."
|
||||
],
|
||||
"flavorFailure": [
|
||||
"Nothing useful found.",
|
||||
"The map, if it existed, is gone.",
|
||||
"The search yields no information.",
|
||||
"Fog and confusion. No map here.",
|
||||
"The grounds give nothing away.",
|
||||
"The trial keeps its layout to itself.",
|
||||
"No orientation gained.",
|
||||
"Blind as before.",
|
||||
"The realm offers no guide tonight.",
|
||||
"No map. Trust instinct."
|
||||
]
|
||||
},
|
||||
{
|
||||
"key": "scratch_marks",
|
||||
"baseProbability": 0.55,
|
||||
"tags": ["stealth", "altruistic"],
|
||||
"tier": 1,
|
||||
"flavorSuccess": [
|
||||
"The trail read correctly. The survivor is found.",
|
||||
"Scratch marks, followed. Another survivor located.",
|
||||
"The signs in the fog tell a story.",
|
||||
"The trail is fresh. Someone was here recently.",
|
||||
"The marks lead somewhere useful.",
|
||||
"Reading the ground pays off.",
|
||||
"The scratch marks don't lie.",
|
||||
"A teammate's path, followed to its source.",
|
||||
"The signs are legible. The survivor is found.",
|
||||
"The trail ends at something worth finding."
|
||||
],
|
||||
"flavorFailure": [
|
||||
"The trail goes cold.",
|
||||
"The marks lead nowhere useful.",
|
||||
"Misread. The path was wrong.",
|
||||
"The trail circles back. Disorienting.",
|
||||
"The signs in the fog are misleading.",
|
||||
"Too old. The trail is gone.",
|
||||
"The scratch marks weren't recent.",
|
||||
"The trail led somewhere dangerous.",
|
||||
"The signs can't be read clearly.",
|
||||
"The trail ends without resolution."
|
||||
]
|
||||
},
|
||||
{
|
||||
"key": "bone_chill",
|
||||
"baseProbability": 0.35,
|
||||
"tags": ["high-risk", "survival"],
|
||||
"tier": 3,
|
||||
"flavorSuccess": [
|
||||
"The presence recedes. The survivor is not chosen.",
|
||||
"Whatever stalks the fog passes over.",
|
||||
"The terror subsides. Not tonight.",
|
||||
"The entity considers — then moves on.",
|
||||
"The survivor is overlooked. Lucky.",
|
||||
"The cold lifts. The entity chose elsewhere.",
|
||||
"The fog's attention moves away.",
|
||||
"Stillness. The presence is gone.",
|
||||
"Not taken. Not yet.",
|
||||
"The chill passes. The trial continues."
|
||||
],
|
||||
"flavorFailure": [
|
||||
"The fog thickens. Something approaches.",
|
||||
"The presence locks on. There is no outrunning this.",
|
||||
"The entity's attention does not waver.",
|
||||
"Noticed. The trial changes.",
|
||||
"The chill deepens. The entity is here.",
|
||||
"No escape from something this deliberate.",
|
||||
"The fog moves with purpose.",
|
||||
"The survivor is seen by something that doesn't forget.",
|
||||
"The presence descends.",
|
||||
"Chosen. The hardest part begins."
|
||||
]
|
||||
},
|
||||
{
|
||||
"key": "killer_instinct",
|
||||
"baseProbability": 0.30,
|
||||
"tags": ["high-risk", "stealth"],
|
||||
"tier": 3,
|
||||
"flavorSuccess": [
|
||||
"The instinct passes harmlessly. Not found.",
|
||||
"The killer's sense of where to look is wrong tonight.",
|
||||
"The prediction fails. Safe.",
|
||||
"The killer checks elsewhere.",
|
||||
"Instinct misfires. The survivor is still hidden.",
|
||||
"Wrong corner checked. The survivor breathes.",
|
||||
"The killer's certainty was misplaced.",
|
||||
"Not there. Not tonight.",
|
||||
"The instinct was wrong. Move quickly.",
|
||||
"The killer's focus breaks elsewhere."
|
||||
],
|
||||
"flavorFailure": [
|
||||
"The killer knows exactly where to look.",
|
||||
"Instinct and experience. The survivor is found.",
|
||||
"No hiding from something this certain.",
|
||||
"The killer's read was correct.",
|
||||
"The position is given away before the search begins.",
|
||||
"Exactly where expected. No luck tonight.",
|
||||
"The killer's certainty was earned.",
|
||||
"Found before the search starts.",
|
||||
"The instinct is right.",
|
||||
"The killer walks directly to the survivor."
|
||||
]
|
||||
}
|
||||
]
|
||||
|
||||
Reference in New Issue
Block a user