<div style="position:fixed; top:10px; right:10px; background:black; color:white; padding:10px; border:1px solid #444;"> Sanity: $sanity<br> Clues: $clues </div>(display: "UI") (set: $clues to 0) (set: $sanity to 7) (set: $hasMask to false) (set: $entityAware to false) (set: $perfectPath to false) <div class="title">Camp Whispering Pines</div> A Twine Horror Experience [[Begin->Intro]] [[Credits->Credits]](set: $sanity to $sanity - 1) (display: "UI") The gate closes behind you. You didn’t touch it. The air feels... aware. Where do you go? [[Cabin 13->Cabin 13]] [[Mess Hall->Mess Hall]] [[The Lake->Lake]] [[The Woods->Woods]] [[Follow a narrow trail deeper into the forest->Forest Path]](set: $clues to $clues + 1) (display: "UI") Cabin 13. The door was already open. Scratches line the walls too deep to be made by hands. Something lived here. Or tried to leave. [[Read the journal->Journal]] [[Look in the mirror->Mirror]] [[Leave->Entrance]](set: $sanity to $sanity - 1) (set: $lakeSeen to true) (if: $sanity >= 6 and $clues >= 6)[ (set: $perfectPath to true) ] (display: "UI") The lake is perfectly still. No ripples. No wind. It reflects everything exactly Except you. [[Look closer->Look closer]] [[Walk to the dock->Dock]] [[Throw something into the water->Throw rock in water]] [[Leave->Entrance]](set: $sanity to $sanity - 1) (if: $sanity >= 6 and $clues >= 6)[ (set: $perfectPath to true) ] (display: "UI") The woods absorb sound. Your footsteps feel wrong. Like they don’t belong to you. Something moves between the trees. [[Follow it->Footprints]] [[Inspect a hanging mask->Tree Mask]] [[Run back->Entrance]](set: $clues to $clues + 1) (display: "UI") The mess hall is untouched. Plates still sit on tables. Rotten food. Frozen moments. Like everyone left at once. Clues: $clues You hear something behind you. Slow. Breathing. [[Turn around->Entity Encounter]] [[Ignore it and move to the kitchen->Kitchen]] [[Call out->Call Out]](set: $clues to $clues + 1) (set: $sanity to $sanity - 1) (if: $sanity >= 6 and $clues >= 6)[ (set: $perfectPath to true) ] (display: "UI") Cabin 13. The door hangs open. Not broken welcoming. Inside, the air is thick. Metallic. The walls are covered in scratch marks. Too deep. Too deliberate. Something tried to get out. Or something tried to get in. You notice: - A journal on the floor - A cracked mirror - A bed with something under it [[Read the journal->Journal]] [[Look into the mirror->Mirror]] [[Check under the bed->Bed]] [[Leave the cabin->Entrance]](set: $journalRead to true) (set: $sanity to $sanity - 1) (display: "UI") The journal is damp. The pages stick together. You peel them apart. "They said it was just a prank." "A mask." "But it started showing up in places we didn’t leave it." (set: $clues to $clues + 1) [[Keep reading->Journal 2]] [[Stop reading->Cabin 13]](set: $sanity to $sanity - 2) (display: "UI") You stare into the mirror. Your reflection stares back. Too still. Too perfect. Then It smiles first. (if: $sanity <= 0)[ (link: "You can't look away...")[(goto: "Insanity Ending")] ] [[Step back->Cabin 13]](set: $clues to $clues + 1) (display: "UI") The footprints are fresh. Too fresh. They lead deeper into the woods. Then They stop. Clues: $clues No return prints. No direction. Just… gone. (set: $sanity to $sanity - 1) (if: $entityAware)[ You already know why. ] [[Turn around slowly->Entity Encounter]] [[Run->Woods]](set: $clues to $clues + 1) (display: "UI") A mask is nailed to the tree. Its surface is cracked. But underneath It looks soft. Almost like skin. Clues: $clues (if: $hasMask)[ The mask you carry feels heavier. ] [[Touch it->Touch Mask]] [[Take it off the tree->Take Mask]] [[Step back->Woods]](display: "UI") It doesn’t step out. It becomes visible. Like reality corrected itself too late. Its face shifts rapidly. Learning. Testing. (if: $hasMask)[ It stops. Locks onto your face. Perfectly. ] (if: $entityAware)[ You understand now: Looking at it is feeding it. ] Your chest tightens. You feel observed. Not physically— But conceptually. [[Close your eyes->Final Choice]] [[Stare back->Stare Ending]] [[Run->Run Ending]](display: "UI") (if: $perfectPath is true)[ [[Do nothing->Perfect End]] ] (else-if: $clues >= 8 and $sanity > 2)[ [[Close your eyes->True Ending]] ] (else-if: $clues >= 5)[ [[Run->Escape Ending]] ] (else:)[ [[Freeze->Caught Ending]] ](set: $sanity to $sanity - 2) (display: "UI") You run blindly. Branches tear at you. You escape. But every reflective surface feels wrong now. <div class="ending">BAD ENDING: NEVER ALONE</div> [[Restart->Start]](display: "UI") You walk out of the camp. The road is normal again. The world feels... quiet. Too quiet. You pass a car window. Your reflection stares ahead. Then It turns and looks at you. <div class="ending">TRUE ENDING: IT FOLLOWED</div> [[Play Again->Start]](display: "UI") It doesn’t chase you. It’s just suddenly there. Close. Too close. You feel your face stretch Wrong. <div class="ending">BAD ENDING: REPLACED</div> [[Restart->Start]](display: "UI") Reality fractures. Your thoughts loop. You don’t know your name anymore. But something else does. <div class="ending">INSANITY ENDING: LOST</div> [[Restart->Start]](set: $sanity to $sanity - 1) (display: "UI") You kneel down. Slowly. There’s nothing under the bed. But You hear breathing. Right behind you. (if: $entityAware)[ You don’t turn around. ] (if: not $entityAware)[ [[Turn around->Entity Encounter]] ] [[Back away slowly->Cabin 13]](set: $sanity to $sanity - 1) (set: $clues to $clues + 1) (display: "UI") "It doesn’t move when you aren’t looking." "I tested it." "I swear I tested it." "But when I looked back" "It was closer." (if: $entityAware)[ You already know this is true. ] [[Final page->Journal 3]] [[Close it->Cabin 13]](set: $clues to $clues + 2) (display: "UI") "It needs attention." "That’s how it exists." "If no one sees it" "IT STOPS." The last page is torn. Clues: $clues [[Close the journal->Cabin 13]](set: $sanity to $sanity - 1) (if: (random:1,4) is 1)[ (link: "Something feels wrong...")[(goto: "Entity Encounter")] ] (display: "UI") The kitchen smells rotten. Metallic. Knives are scattered across the counters. Drawers hang open. Like something searched in a hurry. Or something didn’t know what it was looking for. Sanity: $sanity You notice: - A mask in the sink - A freezer door slightly open - A faint sound behind you - A sound comes from the bathroom [[Inspect the mask->Take Mask]] [[Open the freezer->Freezer]] [[Turn around->Entity Encounter]] [[Leave quietly->Mess Hall]] [[Check Bathroom->Bathroom]](set: $sanity to $sanity - 2) (display: "UI") "Hello?" Your voice echoes. But something answers. Not words. Just… a mimic. Your voice. From behind you. [[Don’t turn around->Kitchen]] [[Turn->Entity Encounter]](set: $sanity to $sanity - 1) (set: $clues to $clues + 1) (display: "UI") The dock creaks as you step onto it. Each board groans under your weight. Halfway down You stop. Wet footprints. Fresh. They lead past you. Toward the shore. But you didn’t see anyone. Clues: $clues Sanity: $sanity (if: $entityAware)[ You know why. It doesn’t arrive. It appears when noticed. ] [[Follow the footprints->Footprints]] [[Back away slowly->Lake]](set: $sanity to $sanity - 2) (display: "UI") You lean closer to the surface. The water reflects the sky. The trees. The dock. Everything Except you. A delay. Then Your reflection appears. Looking up at you. Smiling. Sanity: $sanity (if: $lakeSeen and $entityAware)[ You understand: It doesn’t need a body. Just a surface. ] (if: $sanity <= 0)[ [[Insanity Ending]] ] [[Step back->Lake]] [[Keep watching->Stare Ending]](set: $sanity to $sanity - 1) (display: "UI") You pick up a rock. Throw it into the lake. No splash. No sound. Just Gone. A moment later A ripple appears. Too late. [[Back away->Lake]](set: $sanity to $sanity - 2) (display: "UI") You press your hand against it. It’s warm. It pulses. Like a heartbeat. For a second You feel like you're touching your own face. [[Pull away->Woods]](set: $hasMask to true) (set: $sanity to $sanity - 2) (set: $clues to $clues + 1) (display: "UI") You pull the mask free. It resists. For a second Like it doesn’t want to leave. Then it gives. Too easily. It’s heavier than it should be. Warm. Not just warm Alive. Sanity: $sanity Clues: $clues You swear you feel it breathing against your palm. (if: $entityAware)[ This was never just an object. ] (if: $hasMask and $entityAware)[ You feel like you’ve made something worse. ] [[Put it on->Wear Mask]] [[Hold onto it->Woods]](display: "UI") You force yourself to keep looking. Your eyes burn. Your thoughts slow. Its face stops shifting. It chooses one. Yours. Perfect. Still. You try to remember what you were doing. Why you were here. But that feels… distant now. Unimportant. (if: $sanity <= 2)[ Your mind gives in faster than your body. You don’t even notice when you stop thinking. ] (if: $hasMask)[ The mask in your hand tightens. Fusing. Becoming. ] It steps forward. You step back. But your body doesn’t move. Something else does. <div class="ending">ENDING: OBSERVER BECOMES OBSERVED</div> [[Restart->Start]](set: $sanity to $sanity - 3) (display: "UI") You lift the mask. You don’t remember deciding to. It fits perfectly. Too perfectly. Your vision distorts Then corrects. Everything looks the same. Except Now you feel watched from inside. (if: $sanity <= 1)[ [[Insanity Ending]] ] [[Rip it off->Woods]](set: $sanity to $sanity - 2) (set: $clues to $clues + 1) (display: "UI") You pull the freezer open. Cold air spills out But it doesn’t feel cold. Inside Photos. Dozens of them. Frozen together. Every photo shows the same thing: Someone looking at something behind the camera. Clues: $clues Sanity: $sanity (if: $entityAware)[ You don’t need to turn around to know what they saw. ] [[Close the freezer->Kitchen]](set: $sanity to $sanity - 1) (if: $sanity >= 6 and $clues >= 6)[ (set: $perfectPath to true) ] (display: "UI") The bathroom building sits slightly apart from the others. Like it was meant to be avoided. The door is already open. Inside Dim light flickers overhead. Rows of mirrors. Rows of stalls. Too many places to look. Sanity: $sanity [[Check the mirrors->Bathroom Mirrors]] [[Check the stalls->Stalls]] [[Walk to the sinks->Sinks]] [[Leave->Entrance]](set: $sanity to $sanity - 1) (display: "UI") The stalls line the wall. Most are slightly open. One is closed. Sanity: $sanity [[Open random stall->Empty Stall]] [[Open the closed stall->Closed Stall]] [[Leave->Bathroom]](set: $sanity to $sanity - 1) (display: "UI") The sinks are cracked. Water drips slowly. Each drop echoes too loudly. The mirrors above them are stained Except one. Perfectly clean. Sanity: $sanity [[Look into the clean mirror->Look into clean mirror]] [[Turn on the water->Turn water on]] [[Leave->Bathroom]](set: $sanity to $sanity - 2) (display: "UI") You step in front of the mirrors. Your reflection appears instantly. Too instantly. Then The reflections in the OTHER mirrors lag behind. Not synced. Not consistent. Some are still turning toward you. Sanity: $sanity (if: $entityAware)[ You understand: It doesn’t need just one reflection. It can use all of them. ] [[Focus on one mirror->Focus on one mirror]] [[Look away immediately->Bathroom]](set: $sanity to $sanity - 2) (display: "UI") You pick one reflection. Focus on it. It stops lagging. Stops moving. It matches you perfectly. Until It doesn’t. It tilts its head. You didn’t. (if: $sanity <= 1)[ [[Insanity Ending]] ] [[Step back slowly->Bathroom Mirrors]] [[Keep staring->Stare Ending]](display: "UI") You push one open. Empty. Another. Empty. Another The door slams shut behind you. From the mirror outside You see something standing in the stall with you. [[Turn around->Entity Encounter]] [[Keep facing forward->Bathroom]](set: $clues to $clues + 1) (display: "UI") You push the closed stall. It resists. Then slowly opens. Inside Scratches cover the door. Words carved into the metal: "DO NOT LOOK BACK" Clues: $clues (if: $entityAware)[ Too late for that. ] [[Step inside->Inside stall]] [[Back away->Stalls]](set: $sanity to $sanity - 2) (display: "UI") You step inside. The door closes behind you. You didn’t touch it. The light flickers out. Darkness. Then Breathing. Right outside the stall. [[Stay silent->Stay Silent]] [[Open the door->Entity Encounter]](display: "UI") You stay perfectly still. No movement. No sound. No attention. The breathing continues. Then It stops. Silence. (if: $entityAware and $sanity > 2)[ You did it right. It didn’t manifest fully. [[Leave the stall->Bathroom]] ] (else:)[ You waited too long. Or not long enough. [[Entity Encounter]] ](set: $clues to $clues + 1) (display: "UI") This mirror shows you clearly. No distortion. No delay. Just you. For the first time You feel normal. Clues: $clues Then You blink. Your reflection doesn’t. [[Back away->Sinks]] [[Keep watching->Stare Ending]](set: $sanity to $sanity - 1) (display: "UI") You turn the faucet. Water rushes out. Too loud. It fills the room. Drowns everything else. Then Through the noise You hear something else. Whispering. From behind you. [[Turn it off->Sinks]] [[Turn around->Entity Encounter]](display: "UI") [ You don’t remember arriving. Only that you’re here. And something is already aware of you. ] [[Continue->Entrance]](display: "UI") Camp Whispering Pines: What Still Watches Design & Writing: Jayden Latchman System Design: Twine (Harlowe) Core Mechanics: - Perception-based horror - Sanity system - Clue progression - Non-linear exploration Inspired by psychological horror and liminal environments. [[Back->Start]](display: "UI") You never reacted. Never fed it. Never gave it form. It never learned you. The camp fades. Like it never existed. And this time Nothing follows. <div class="ending">PERFECT ENDING: UNSEEN</div> [[Return to Menu->Start]](display: "UI") You move carefully. You don’t look back. The trees thin. The road is there. You made it out. Days pass. You tell yourself it’s over. Then one night You catch your reflection in a window. It doesn’t match you. You keep walking. Because now you understand: It didn’t need the camp. It just needed you to see it. <div style="color:red;">ESCAPE ENDING: IT FOLLOWED</div> [[Restart->Start]](display: "UI") The trail is barely visible. Not overgrown Avoided. The sounds of the camp fade too quickly. (set: $sanity to $sanity - 1) You feel like you crossed something. [[Keep going->Forest Path.]] [[Turn back->Entrance]](display: "UI") The trees press closer together. Carvings mark the bark Circles. Eyes. Faces. All facing inward. (set: $clues to $clues + 1) [[Touch a carving->Tree Carving]] [[Ignore them and move forward->Deeper Forest Path]](display: "UI") You press your hand into the carving. It feels wrong. Too deep. Not cut Pressed. For a moment Something presses back. (set: $sanity to $sanity - 2) (if: $entityAware)[ You recognize the feeling. ] [[Pull away->Deeper Forest Path]](display: "UI") The forest opens slightly. Enough to breathe. Not enough to feel safe. (set: $sanity to $sanity - 1) You notice: - Footprints circling the ground - A broken lantern - Disturbed soil [[Inspect footprints->Inspect Footprints]] [[Pick up the lantern->Lantern]] [[Move forward->Go deeper]] (display: "UI") The lantern flickers when you lift it. It still works. The light feels heavy. (set: $hasLantern to true) [[Continue->Go deeper]](display: "UI") The footprints form a perfect loop. Over and over. No start. No end. (set: $clues to $clues + 2) (set: $sanity to $sanity - 1) [[Step away->Go deeper]](display: "UI") You step into a clearing And immediately regret it. The ground is blackened. Not burned. Something else. (set: $sanity to $sanity - 2) The trees form a perfect circle. At the center Something waits. [[Approach the center->Ritual Site]] [[Back away->Deeper Forest Path]](display: "UI") Symbols cover the ground. Layered. Repeated. Corrected. At the center An outline. Not a body. An impression. (set: $clues to $clues + 3) (if: $entityAware)[ This wasn’t summoning. This was containment. ] [[Step into the center->Ritual Center]] [[Observe without moving->Observe]] [[Leave->Go deeper]]:: RitualObserve (display: "UI") You don’t move. You don’t step closer. You just watch. The symbols begin to make sense. Not words. Warnings. (set: $clues to $clues + 2) (if: $sanity >= 4)[ You resist the urge to interact. (set: $perfectPath to true) ] [[Leave quietly->Deeper Forest Path]](display: "UI") You step into the outline. It fits you perfectly. Too perfectly. For a moment You feel complete. Then Something notices. (set: $sanity to $sanity - 3) (if: $sanity <= 0)[ [[Insanity Ending]] ] [[Something is behind you->Entity Encounter]]