### Ocean's baby Your baby too....but it's too late, you're crashing, you're crashing, you crash... =><============= # S A N D - D A N C E R (display:'inventory')\ (display:'examine')\ <!-- Logging -->\ (set: $Log to (macro: any-type _toLog,[ (if: $TheLog is 0)[(set: $TheLog to '')] (set: $TheLog to it + (_toLog) + '\n') (out-data:'') ]))\ <!-- Text utilities -->\ (set: $tab to "&nbsp;&nbsp;")\ <!-- linkPersist & linkRevealPersist -->\ <!-- Support for persistent links (once clicked, continue to show revealed content) -->\ (set: $persistCounter to (dm:))(set: $persistTotal to (dm:))(set: $visitedLinks to (ds:))\ (set: $linkPersister to (macro: str-type _linkType, str-type _title, codehook-type _content, [ <!-- Called for each 'linkPersist' in passage --> (set: _page to ((passage:)'s name)) (if: $persistCounter does not contain _page)[(set: $persistCounter to it + (dm:_page, 0))] (set: _totalLinks to _page of $persistCounter) (if: $persistTotal does not contain _page)[(set: $persistTotal to it + (dm:_page, _totalLinks))] (set: _linkCount to 1 + _page of $persistCounter) (if: visits > 1)[<!-- handle wrap-around on future visits--> (set: _linkTotal to _page of $persistTotal) (if: _linkCount > _linkTotal)[(set: _linkCount to 1)] ] (set: $persistCounter to it + (dm:_page, _linkCount)) (set: _linkID to (str: _page, "-", (str:_linkCount))) (if: $visitedLinks does not contain _linkID)[ <!-- Not yet visited, show link --> (if: _linkType is 'link-reveal')[ (out:)[(link-reveal:_title)[(set:$visitedLinks to it + (ds:_linkID))_content]] ](else:)[ (out:)[(link:_title)[(set:$visitedLinks to it + (ds:_linkID))_content]] ] ](else:)[ <!-- Has been visited, just show content --> (if: _linkType is 'link-reveal')[ (out:)[(str:_title,_content)] ](else:)[ (out:)[(str:_content)] ] ] ]))<!-- end of linkPersister -->\ (set: $linkPersist to (macro: str-type _title, codehook-type _content, [ (out:)[($linkPersister:'link', _title, _content)] ]))\ (set: $linkRevealPersist to (macro: str-type _title, codehook-type _content, [ (out:)[($linkPersister:'link-reveal', _title, _content)] ]))\ <!-- `visits` doesn't work for `display` so use this instead -->\ (set: $first to (macro: str-type _item, [ (if: $visitItems is 0)[ (set: $visitItems to (dm:)) ] (if: $visitItems contains _item)[ (set: $visitItems to it + (dm: _item, ($visitItems's _item) + 1)) ](else:)[ (set: $visitItems to it + (dm: _item, 1)) ] (out-data: $visitItems's _item is 1) ]))\ (set: $afterwards to (macro: str-type _item, [ (out-data: $visitItems's _item > 1) ])) <!-- Set up -->\ ($addToInventory: 'a lighter')\ ($addToInventory: 'a denim jacket')\ ($addToInventory: 'a wallet')\ ($addToInventory: 'a folded photo')\ ($addToInventory: 'emotional baggage')\ ($moveToLoc: 'grandma\'s stories', 'emotional baggage')\ (set: $broodedMemories to (ds:))\ (set: $talents to (ds:))\ <!-- Lighting -->\ (set: $emergencyLightsOn to false)\ (set: $flashlightOn to false)\ (set: $litBrightly to (macro: str-type _loc, [ (set: _isTowerVicinity to (passage:)'s tags contains 'Tower-Vicinity') (out-data: _isTowerVicinity and $emergencyLightsOn) ]))\ (set: $withinRangeOfHeadlights to (macro: str-type _loc, [ (out-data:(a: 'outside your truck', 'middle of nowhere', 'backtracking', 'crumbling concrete', 'staging area', 'base of tower' ) contains _loc) ]))\ (set: $litByFlashlight to (macro:[ (out-data: $flashlightOn and ($inventory:) contains 'a flashlight') ]))\ (set: $locationIsLit to (macro:[ (set: _loc to (passage:)'s name) (if: ($litBrightly: _loc))[ (out-data:'brightly') ](else-if: ($litByFlashlight:))[ (out-data:'by flashlight')] (else-if: ($withinRangeOfHeadlights: _loc))[ (out-data:'by headlights') ](else:)[ (out-data:'dark') ] ]))(set: $lizardVisits to $lizardVisits + 1)\ (if: $lizardVisits is 1)[\ ### A brown-colored lizard He looks pretty pissed that you crashed into his cactus. What did grandma used to call those little dudes? You can't remember any more.\ ](else-if: $lizardVisits is 2)[\ ### A brown-colored lizard Oh yeah, you remember, she called them sand-dancers. This little sand-dancer still looks pissed.\ ](else:)[\ ### A sand-dancer The little sand-dancer lizard stares at you with one slitted eye]### Your denim jacket Not much to say, a bit thread-bare, but all you have to protect you from the cold.($first:'metal-desk')[($moveToLoc:'a flashlight','a desk')\ ($clearItemHistory:)]\ ## Metal Desk You feel around the edge of the desk, and find that it has (link-reveal:'a drawer.')[ You slide the drawer open by feel in the darkness. (if:($itemLoc:'a flashlight') is 'a desk')[Something large and lumpy rolls around inside - ($itemLink:'a flashlight')?](else:)[It is empty.]]### Your driver's license When the highway patrol pulls you over they see your kind of crazy uncombed hair (morning), your brown name (Nakaibito Morales) and brown skin (actually more kinda tan), your D.O.B. (eighteen years ago just barely) and tribal affiliation card (expired) and assume you're either some kind of native eco-terrorist, illegal drug-running border jumper, or delinquent high school dropout (all lies except for kinda maybe the last one a little). Unless it's Jimmy Kay who pulled you over since he usually just wants to buy you a beer and talk about your dad, which is weird but better than getting a ticket.## Flashlight ($first:'a flashlight')[($addToInventory:'a flashlight')Yeah, it's a flashlight all right. You grip it in sudden relief, turning it in your hands till your finger finds the switch.] |turn-on)[(link-repeat:'Switch it on')[\ (set:$flashlightOn to true)\ (hide:?turn-on)\ (show:?turn-off)\ ($clearItemHistory:)\ (go-to: (passage:)'s name)\ ]]\ |turn-off)[(link-repeat:'Switch it off')[\ (set:$flashlightOn to false)\ (hide:?turn-off)\ (show:?turn-on)\ ]]\ (if: $flashlightOn is true)[ (hide:?turn-on)\ (show:?turn-off)\ ](else:)[ (show:?turn-on)\ (hide:?turn-off)\ ]### A folded photo (if: $broodedMemories's length < 2)[\ You just can't deal with that right now. Maybe after you've spent more time brooding. ](else:)[\ You open the photo, revealing an ultrasound of ($itemLink:"Ocean's baby"). Something about the ultrasound of Ocean's baby makes you want to brood about ($itemLink:'when you heard the news').\ ($moveToLoc: 'when you heard the news', 'emotional baggage')\ ]($first:'a glove box')[\ ($moveToLoc:'a pack of cigarettes', 'a glove box')\ ]\ ### Inside the glove box ($contentsOf:'a glove box')($first:'a hole')[($moveToLoc:'a roll of duct tape','a hole')]\ ## A hole in the floor (if: ($itemLoc:'a roll of duct tape') is 'a hole')[\ Past the many cobwebs, you make out ($itemLink:'a roll of duct tape').\ ](else:)[Just an empty hole.]### Your lighter A classic Zippo. You flick it open a few times. ($addToInventory: 'a lighter')\ ($itemLinkAlias:'Light a cigarette', 'report smoking') | \ ($itemLinkAlias:'Get a little light here', 'report lighter')($first: 'a pack of cigarettes')[(set: $cigs to 6)]\ ### A pack of cigarettes You're kind of trying to quit, but man, you could really go for one right now. (if: $cigs > 0)[It looks like you've only got (text: $cigs) left. You could (link:'light one up now')[($addToInventory:'a pack of cigarettes')($showItem:'report smoking'))].\ ](else:)[But you are totally out.](metadata: 'inventory', 'item') ### A piece of jade Grandma said it will bring you luck, which hasn't really been working out. You can't remember now how it ended up in your pickup truck. Maybe someday you'll see someone lucky and you can throw it at him.($first: "a receipt from Big Jimmy's")[\ ($moveToLoc: 'your shit job', 'emotional baggage')]\ ### A receipt from Big Jimmy's Something about the receipt from Big Jimmy's makes you want to brood about ($itemLink:'your shit job').(if: ($itemLoc:'a roll of duct tape') is 'a hole')[\ (if: $talents contains 'courage')[\ You reach down into the hole, brushing the cobwebs away impatiently, and pull out the duct tape. Taken.($addToInventory:'a roll of duct tape')($clearItemHistory:)\ ](else:)[\ ($first: 'a roll of duct tape')[You reach your hand towards the hole, then pull back with a start as you brush cobwebs. Nightmare visions of fat black spiders shudder through your brain. No way are you reaching in there.]\ ($afterwards: 'a roll of duct tape')[Yeah, sorry, but you're not putting your hand in there.]\ ]\ ](else:)[\ ## A roll of duct tape Hey, that roll of duct tape might be useful if you decide on fixing your truck and getting out of here.]($first: "a rusted key")[\ ($moveToLoc: 'meeting Ocean', 'emotional baggage')\ (set: $goToOnDone to 'foreman\'s office')]\ ### A rusted key Something about the rusted key makes you want to brood about ($itemLink:'meeting Ocean').### A rusty tin can Someone left a tin can here years ago: ridged ripples run down its rusty side($first: 'a wallet')[\ ($moveToLoc:'a driver\'s license', 'a wallet')\ ($moveToLoc:'a receipt from Big Jimmy\'s', 'a wallet')\ ]\ ### Your wallet In the wallet is: ($contentsOf:'a wallet')(set:_listOfAnimals to (macro: [ (set: _out to '') (for: each _animal, ...$foundAnimals)[ (set: _out to it + '-' + (source: ($itemLink:_animal)) + '\n') ] (out-data:_out) ])) ###Weather-worn guidebook Most of the pages are faded or worn away, but flipping through, it looks like a guide to local animal life. You could try looking up various animals in it. Most of them you flip on by but you notice: (_listOfAnimals:)(set: $goToOnDone to 'break room')\ ## Wire mesh cage Bolted to the wall, it looks like one of those 'break-in-case-of-emergency' things. You can see a (link-reveal:'blanket')[(hide: ?take-blanket)(show: ?take-blanket)] in it. |take-blanket)[\ (if: $talents contains 'strength')[You grip the mesh in one hand and pull, and realize it's so rusted you can easily peel it back. The door rips free and you drop it to the floor. The ($itemLinkAlias:'blanket', 'emergency blanket') is yours.\ ($addToInventory:'emergency blanket')\ ($removeFromGame: 'a wire mesh cage')\ ($clearItemHistory:)\ ]\ (else-if: ($inventory:) contains 'a rusted key')[The cage seems to be locked but you remember the rusted key you found. You sling the key into the lock, but as you turn it, the rusted metal snaps off inside. The crumbling fragments fall to the ground as you slam your fist against the wire mesh in frustration. This is not your day.($removeFromGame: 'a rusted key')\ ]\ (else:)[\ The cage seems to be locked.\ ]\ ]($first:'emergency-radio')[\ (set:$radioIsOn to false)\ (set:$currentFrequency to 77.2)\ ]\ (set:_updateRadio to (macro:[\ (if: $radioIsOn)[(show: ?radio-on)(hide: ?radio-off)]\ (else:)[(show: ?radio-off)(hide: ?radio-on)]\ (out-data:'') ]))\ ## Emergency Radio Vintage, man. A chrome switch on the side to turn it on and off, and a big fifties dial on the front. It looks like it's \ (link-rerun:('tuned to'))[\ (set: $currentFrequency to (prompt: [Tune to what frequency?], (str:$currentFrequency)))\ (set: $currentFrequency to ($toNum: $currentFrequency, 67.0, 109.9))\ (replace:?current-frequency)[$currentFrequency]] \ |current-frequency>[$currentFrequency]kHz right now. The emergency radio is currently switched \ |radio-on)[(link-rerun:'on')[(set: $radioIsOn to false)(_updateRadio:)]]\ |radio-off>[(link-rerun:'off')[\ (if: $emergencyLightsOn)[(set: $radioIsOn to true)\ ](else:)[(show: ?no-power)](_updateRadio:)]].\ (_updateRadio:) |no-power)[You flip the switch back and forth, but there doesn't seem to be any power. Damn.](if: visits is 1)[\ ($addToHere:'a rusty tin can')\ ]\ # Base of the tower Behind the concrete building, featureless except for a dust-covered window, a steel girder rises from the desert sand, one of three legs of the huge electrical tower looming like some gargantuan spider into blackness above you. A tumbleweed drifts lazily against the rusted metal among scrawny weeds and crumbling trash. The desert stretches in all directions except [[back south->crumbling concrete]] or [[southeast->weed strewn rust]] towards the building. ($youCanAlsoSee:)($first:'break room')[\ ($moveToLoc:'an emergency radio', 'break room')\ ($moveToLoc:'a wire mesh cage', 'break room')\ ]\ ## Break Room Shadows and grime linger in dark corners of this dismal room with just one tiny frosted window. Some rotting picnic tables strewn with layers of sand and crumbling trash are pushed against one wall, and open doorways lead [[west->staging area]] and [[north->storage room]]. ($youCanAlsoSee:)(set:_itemsToTry to (macro:[ (set:_heavyLink to (macro:str-type _item, [ (out:)[\ (link:_item)[(set:$heavyItem to _item)(show:?reportBreakingWindow)(hide: ?butWhat)]\ ] ]))\ (set:_lightLink to (macro:str-type _item, [ (out:)[\ (link-reveal:_item)[ - Like that's going to break anything.]\ ] ]))\ (set: _inv to ($inventory:)) (set: _links to (a:)) (set: _heavyItems to (a: 'a lighter', 'a piece of jade', 'a rusty tin can')) (for: each _item, ..._inv)[ (if: _heavyItems contains _item)[ (set: _links to it + (a:(_heavyLink: _item))) ](else:)[ (set: _links to it + (a:(_lightLink: _item))) ] ](set:$theLinks to _links) (out:)[\ (for: each _i, ..._links)[$tab - _i ]\ ] ]))\ Nice thought, but the last thing you need is a sliced open hand. Maybe you could (link-show:"use something less likely to bleed",?butWhat).\ |butWhat)[ You pat down your pockets. Maybe you could throw something? (_itemsToTry:)]\ |reportBreakingWindow)[ You step back and throw $heavyItem at the window, it smashes through, shattering it.($moveToLoc: $heavyItem, 'staging area')(set:$windowBroken to true)(set: $goToOnDone to 'crumbling concrete')]# Crumbling Concrete This concrete building must've been some sort of utility structure for the [[huge electrical tower to the north->base of tower]], now abandoned: a \ ($linkRevealPersist:'pane of cracked glass',[(set: $windowExamined to true)(show:?examine-window)]) \ sparkles faintly in the beam of your headlights. \ |examine-window)[\ |brokenWindow)[The empty frame of a window [[leads inside->staging area]].]\ |unbrokenWindow>[You push your face against the dusty glass window but it is too dark to see inside.(show:?suggest-break)]\ ] Tendrils of desert sand drift against a ($linkRevealPersist: 'boarded-up door to the northeast',[(set:$triedDoor to true)(hide: ?untriedDoor)(show: ?triedDoor)])(t8n:"dissolve")[ leading inside; you could also ]<untriedDoor|(t8n:"dissolve")[. You shove against the door with all your weight. The door won't budge. You slam your hands against the boards in frustration. I guess you could ](triedDoor|[[walk around to the east->weed strewn rust]] or [[head south->outside your truck]] back to your truck.[(t8n:'fade')+(transition-time:.5s)+(transition-delay:1s)[ Or, you could try to ($itemLink:'break the window').]](suggest-break| (if:$triedDoor is true)[(hide: ?untriedDoor)(show: ?triedDoor)]\ (if:$windowExamined is true)[(show: ?examine-window)]\ (if:$windowBroken is true)[(show: ?brokenWindow)(hide: ?unbrokenWindow)(hide: ?suggest-break)](else:)[(hide: ?brokenWindow)(show:?unbrokenWindow)]## Emergency blanket Hey, that emergency blanket might be useful if you decide on spending the night here.### Emotional baggage Your guidance counselor used to say you're always carrying it with you. You imagine it's kind of ugly, lumpy, and green, and definitely has a stuck zipper. (if: ($itemsIn:'emotional baggage')'s length > 1)[\ Right now, you are carrying around...](else:)[The only thing you can brood about now is ] ($contentsOf:'emotional baggage') You are pretty sure there is plenty of other stuff burried in that bag, but you can't deal with any of it right now.(set: $showItem to (macro: str-type _item, [ (if: $itemHistory is 0)[($clearItemHistory:)] (if: $itemHistory does not contain _item)[ (set: $itemHistory to it + (a:_item)) ] (show: ?examine) (replace: ?examine-content)[\ (display:_item) ==><= ($itemLinks: _item) ] (out-data:'') ]))\ (set: $clearItemHistory to (macro: [ (set: $itemHistory to (a:)) (out-data:'') ]))\ (set: $createExam to (macro: str-type _placement, dm-type _style,[ (out:)[($createOverlay: 'examine', '', _placement, _style) (hide:?examine)] ]))\ (set: $itemLinks to (macro: str-type _item, [ (set: _ok to [ (if: $itemHistory's length > 1)[ (set: $itemHistory to it - (a:$itemHistory's last)) ($showItem:$itemHistory's last) ](else:)[ ($clearItemHistory:) (hide:?examine) (if: $goToOnDone is not 0)[ (set: _temp to $goToOnDone) (set: $goToOnDone to 0) (go-to: _temp) ] ] ]) (set: _addPrompt to (either:"Snag it", "Take it", "Grab it")) (set: _add to [(link:_addPrompt)[($addToInventory:_item)(_ok)]]) (set: _dropPrompt to (either:"Drop it", "Leave it", "Set it down")) (set: _drop to [(link:_dropPrompt)[($removeFromInventory:_item)(_ok)]]) (set: _throwable to ()) (set: _throw to []) (out:)[ (if: ($itemIsDroppable: _item))[_drop | ]\ (if: ($itemIsObtainable: _item))[_add | ]\ (link-repeat: 'Done')[(_ok)] ] ]))($first:'foreman\'s office')[(set: $emergencyFreq to 102.3)]\ (set: _litBy to ($locationIsLit:))\ ## Foreman's Office (if: _litBy is 'by flashlight')[\ You sweep the beam of your flashlight around \ ](else:)[\ The stark emergency lights illume \ ] this tiny office, probably once where the boss sat under a dust-covered window. The only exit is to [[the south->staging area]]. Tacked to the wall is a peeling (link-show:'safety poster',?read-frequency), text almost faded away except for a section mentioning an emergency radio frequency. \ |read-frequency)[\ According to the poster, the emergency radio frequency is [$emergencyFreq]kHz.] A half-collapsed desk is in the middle of the room(if: ($itemLoc:'a rusted key') is 'offstage')[, on it is ($itemLink:'a rusted key')].(set: $broodedMemories to it + (ds:"grandma's stories"))\ ### Grandma's stories "There are dark spirits who roam the earth, little Knock." Grandma used to say that, holding you tight and stroking your hair. "There are dark spirits who roam the earth, but you're not alone. Oh, no. I'm here." (She'd kiss your head and you'd squeeze her back.) "But others are watching out for you too. You have three animal guardians, hmm? Spirits who are always watching over you. Oh, you can't always trust them to know what's best. Remember that, Knock. But when you need help, they'll come, and protect you from the worser things in the world." Mom would yell at Grandma a lot for filling your head with that new-age bullshit. Grandma grew up white and midwestern and Baptist, but had started wearing things with feathers and playing the pan flute by the time you were born. She seemed to really like having a son-in-law who was Native American or American Indian or Indigenous Peoples or whatever she'd decided the term was that week, and she was pretty pissed when mom left him. Anyway. Her stories were mostly BS, you guess, but some of them stuck with you. When it's dark you still wonder if your spirit animals are out there somewhere, and what the hell is taking them so long to find you.(set: _style to (dm: 'width', '25vw', 'min-width', '12em', 'background-color', 'rgba(241, 233, 210, .95)', 'border', '1px solid #211100', 'border-radius', '0 16px 16px 0', 'color', '#211100', 'box-shadow', '.1em 1em 2em .2em rgba(0,0,0,.2)' ))\ ($createInventory: "Stuff you are carrying...", "left", _style)\ (set: _examineStyle to _style + (dm: 'width', '50vw', 'height', 'auto', 'top', '15vh', 'max-height', '75vh', 'border-radius', '16px' ))\ ($createExam: 'center', _examineStyle)\ (append: ?sidebar)[(link-repeat:"Stuff...")[($showInventory:)]](display:'overlay')\ (if: $locOf is 0)[\ (set: $locOf to (dm:))\ (set: $itemsAt to (dm:))\ ]\ (set: $moveToLoc to (macro: str-type _item, str-type _loc, [ (if: $locOf contains _item)[ (set: _oldLoc to ($locOf)'s _item) (if: $itemsAt contains _oldLoc)[ (set: ($itemsAt)'s _oldLoc to it - (a:_item)) ] ] (unless: $itemsAt contains _loc)[ (set: $itemsAt to it + (dm: _loc, (a:))) ] (set: ($itemsAt)'s _loc to it + (a: _item)) (set: $locOf to it + (dm: _item, _loc)) (replace:?you-can-also-see)[($youCanAlsoSeeContents:)] ($updateInventory:) (out-data:'') ]))\ (set: $itemLoc to (macro: str-type _item, [ (if: $locOf contains _item)[(out-data: $locOf's _item)] (else:)[(out-data:'offstage')] ]))\ (set: $addToHere to (macro: str-type _item,[ (set: _loc to (passage:)'s name) ($moveToLoc: _item, _loc) (out-data:'') ]))\ (set: $addToInventory to (macro: str-type _item,[ ($moveToLoc: _item, 'inventory') (out-data:'') ]))\ (set: $removeFromInventory to (macro: str-type _item,[ (set: _loc to (passage:)'s name) ($moveToLoc: _item, _loc) (out-data:'') ]))\ (set: $removeFromGame to (macro: str-type _item,[ ($moveToLoc: _item, 'offstage') (out-data:'') ]))\ (set: $inventory to (macro: [ (out-data: ($itemsAt)'s 'inventory') ]))\ (set: $itemsIn to (macro: str-type _loc, [ (unless: $itemsAt contains _loc)[(set: $itemsAt to it + (dm: _loc, (a:)))] (out-data: ($itemsAt)'s _loc) ]))\ (set: $itemLinkAlias to (macro: str-type _title, str-type _item, [ (out:)[(link-repeat:_title)[($showItem: _item)]] ]))\ (set: $itemLink to (macro: str-type _item, [ (out:)[($itemLinkAlias: _item, _item)] ]))\ (set: $itemsAsLinks to (macro: str-type _loc, [ (set: _items to ($itemsIn: _loc)) (set: _links to (a:)) (for: each _item, ...(_items))[(set: _links to it + (a:($itemLink: _item)))] (out-data: _links) ]))\ (set: $localItemsAsLinks to (macro: [ (out-data: ($itemsAsLinks: (passage:)'s name)) ]))\ (set: $itemIsFixedInPlace to (macro: str-type _item, [ (set: _itemsTags to ((passage:_item)'s tags)) (if: _itemsTags contains 'fixed-in-place')[(out-data:true)] (if: _itemsTags contains 'memory')[(out-data:true)] (out-data:false) ]))\ (set: $itemIsDroppable to (macro: str-type _item, [ (unless: ($inventory:) contains _item)[(out-data:false)] (out-data: not ($itemIsFixedInPlace: _item)) ]))\ (set: $itemIsObtainable to (macro: str-type _item, [ (if: ($inventory:) contains _item)[(out-data:false)] (out-data: not ($itemIsFixedInPlace: _item)) ]))\ (set: $updateInventory to (macro:[ (replace: ?inventory-content)[($contentsOfList:'inventory')] (out-data:'') ]))\ (set: $showInventory to (macro: [ (show: ?inventory) ($updateInventory:) (out-data:'') ]))\ (set: $createInventory to (macro: str-type _caption, str-type _placement, dm-type _style,[ (set: _title to [\ |||||||||||||||||||= ''[_caption]'' =| (css:'text-decoration:none !important;font-size:.8em;')[(link-repeat: '&#x2715;')[(hide:?inventory)]] |=| ]) (out:)[($createOverlay: 'inventory', _title, _placement, _style) (hide:?inventory)] ]))\ (set: $youCanAlsoSeeContents to (macro:[ (set: _printLinks to (macro: array-type _links, [ (if:_links's length is 1)[ (out:)[(source:(_links's 1st))] ](else-if:_links's length is 2)[ (out:)[(source:_links's 2ndLast) and (source:_links's last)] ](else:)[ (out:)[(for: each _i, ...(_links's 1stTo3rdLast))[_i, ](source:_links's 2ndLast) and (source:_links's last)] ] ]))\ (set: _links to ($localItemsAsLinks:))\ (if: _links's length is 0)[ (out:)[] ](else:)[ (out:)[ You can see (_printLinks: _links). ] ] ]))\ (set: $youCanAlsoSee to (macro:[ (out:)[[($youCanAlsoSeeContents:)]<you-can-also-see|] ]))\ (set: $contentsOfList to (macro: str-type _container, [ (set: _links to ($itemsAsLinks:_container))\ (if: _links's length is 0)[ (out:)[nothing] ](else:)[ (out:)[\ (for: each _i, ..._links)[$tab - _i ]\ ] ] ]))\ (set: $contentsOf to (macro: str-type _container, [ (out:)[(hook:'contents-of-'+_container)[($contentsOfList:_container)]] ]))You look up the brown-colored lizard in the guidebook and quickly identify it: those eyes are a dead giveaway. The entry says it's a 'rare subspecies of the common desert lizard found only in the deep desert near Oro Oeste, and known to native peoples as a //sand-dancer//. In legends, the sand-dancer was a clever trickster and twister of words, who created night by tricking the sun into spending half the day underground.' Huh.## Meeting Ocean She was buying a Fresca at Big Jimmy's when you got off your shift, shoving work keys in your pocket, and you stood behind her waiting to get some cigs, almost too tired to notice how cute she was but still noticing, yeah, still noticing. She turned around and caught you noticing and you were pretty embarrassed and covered in sweat and grease from the garage, so you stepped up and bought some Camels and were pretty surprised she was still there when you turned around. She told you her name was Ocean Running Deer and she lived on the rez and you told her your name was Nakaibito Morales and you lived in Oro Oeste. She said isn't Nakaibito the name of a town way off west and you told her your mom had picked it off a map because it sounded like a good Indian name. You never tell anyone that story but for some reason you told her. She laughed, sweetly though, and said maybe the two of you should go there sometime and see what it was like. Somehow two weeks later you were dating although you never ended up going to Nakaibito. And now... no, you can't think about that yet.(if: visits is 1)[\ ($addToHere:'a glove box')\ ($addToHere:'a piece of jade')\ (set: $foundAnimals to (ds:'lizard, brown'))\ ]\ ## Middle of Nowhere You've smashed up against a tall Saguaro, which is all you can see out the windshield except a few feet of desert sand, then blackness. Hell, you must have driven off the road and crashed. Ocean keeps telling you this night commute on this lonely highway's gonna kill you; maybe you should start listening. Through the windshield, you see ($itemLinkAlias:'a little brown-colored lizard','a brown lizard') clinging frantically to the tall Saguaro. ($youCanAlsoSee:) [[Get out of the truck ->outside your truck]]and see how bad it is...# Looking around The tire tracks from the south stop abruptly here, but where the hell are you? The desert sand and clumps of pale sagebrush are all your dimming headlights pick out before barely reaching the concrete building to [[the north->crumbling concrete]]. Your poor ($linkRevealPersist:'old pickup truck',[(set: $truckExamined to true)(show: ?examine-truck)]) ticks and groans, smashed gracelessly against a tall Saguaro; whiffs of evaporating gasoline linger in the chill air.[ Getting down on your knees in the cold sand, you look underneath. Sure enough; you ripped up the fuel line and all your gas has drained away, sucked dry by the thirsty desert sand. You'll need to find some way to patch up the line, plus some fuel, to have any hope of fixing her.](examine-truck| A ($itemLinkAlias:'brown-colored lizard', 'a brown lizard') clings to a tall Saguaro. ($youCanAlsoSee:) [[Get back in your truck->middle of nowhere]] | [[Head north->crumbling concrete]]\ (if: $truckExamined is true)[(show: ?examine-truck)]<!-- getBrowserWidth - useful for responsive UI on mobile devices -->\ (set: $getBrowserWidth to (macro:,[ (set: _width to 0) <script>_width = window.innerWidth;</script><!-- Uses Javascript to directly query the browser window --> (out-data:_width) ]))\ <!-- isMobile - Uses getBrowserWidth above to decide if UI is on a (narrow) mobile window. -->\ (set: $isMobile to (macro:,[ (set: _width to ($getBrowserWidth:)) (out-data: _width <= 576)<!-- 576 is used by Harlowe to decide when to hide the sidebar --> ]))\ (set: $getDefaultSize to (macro: str-type _placement, [ (set: _width to '50vw') (set: _height to '50vh') (if: _placement is 'top' or _placement is 'bottom')[(set: _width to '100vw')] (if: _placement is 'left' or _placement is 'right')[(set: _height to '100vh')] (if: _placement is '' or _placement is 'center')[(set: _height to '30vh')] (out-data:(dm:'width', _width, 'height', _height)) ]))\ (set: $validateOptions to (macro: str-type _placement, dm-type _options, [ (if: _placement is 0)[set: _placement to ''] (if: _options is 0)[set: _options to (dm:)] (set: _fixedOptions to (dm: 'position', 'fixed', 'padding', '1em', 'z-index', '10000', 'overflow', 'auto', )) (set:_defaultOptions to (dm: 'background','#000', 'color', '#fff', 'border', '1px solid #fff' )) (set: _defaultMobile to (dm: 'width', '100vw', 'height', '100vh', )) (set: _options to _fixedOptions + _defaultOptions + _options) (set: _defaultSize to ($getDefaultSize: _placement)) (set: _options to _defaultSize + _options) (if: ($isMobile:))[ (if:_options contains 'mobile')[ (set: _options to _defaultMobile + _options's mobile) (move: _options's mobile into _trash) ] (else:)[ (set: _options to _options + _defaultMobile) ] ] (out-data: _options) ]))\ <!-- Utility methods to compute left and top from placement string, width and height For this css, left = (width/2) * m, where m = 1 for left, 2 for center, 3 for right and similarly right = (top/2) * m, where m = 1 for top, 2 for center and 3 for bottom. -->\ (set: $getTop to (macro: str-type _placement, num-type _height, [ (if: _placement contains 'top')[(out-data: 0)] (else-if: _placement contains 'bottom')[(out-data: 100 - _height)] (else:)[(out-data: ((100 - _height) / 2)))] ]))\ (set: $getLeft to (macro: str-type _placement, num-type _width, [ (if: _placement contains 'left')[(out-data: 0)] (else-if: _placement contains 'right')[(out-data: 100 - _width)] (else:)[(out-data: ((100 - _width) / 2)))] ]))\ <!-- $toNum returns the numeric value from a string, stripping any non-numeric data and enforcing min and max -->\ (set: $toNum to (macro: str-type _d, num-type _min, num-type _max, [ (set: _r to (num:(str-replaced:(p-not:digit,'.'),'', _d))) (if: _r < _min)[(set: _r to _min)] (if: _r > _max)[(set: _r to _max)] (out-data:_r) ]))\ <!-- $dmToCSS takes default options and returns a valid CSS string -->\ (set: $dmToCSS to (macro: dm-type _dm, [ (set: _s to '') (for: each _pair, ...(dm-entries: _dm))[(set: _s to _s + (str:_pair's name) + ': ' + (str:(_pair's value)) + '; ')] (out-data:_s) ]))\ <!-- $placeToCSS takes a placement string & existing CSS options and returns finished CSS. `placement` is one of top/left/right/bottom/center and also top-left, top-right, bottom-right and bottom-left. Pass '' to override the automatic placement options -->\ (set: $placeToCSS to (macro: str-type _placement, dm-type _cssOpts, [ (set: _width to ($toNum: _cssOpts's width, 10, 100)) (set: _height to ($toNum: _cssOpts's height, 10, 100)) (set: _cssOpts to (dm: 'top', (str:($getTop: _placement,_height), "vh")) + _cssOpts) (set: _cssOpts to (dm: 'left', (str:($getLeft: _placement,_width), "vw")) + _cssOpts) (out-data:(str:($dmToCSS: _cssOpts))) ]))\ <!-- $createOverlay, specify placement (top/left/bottom-right, etc) and any styling in options, returns a changer for the overlay -->\ (set: $createOverlay to (macro: str-type _hookName, any-type _title, str-type _placement, dm-type _options, [ (set: $options to ($validateOptions: _placement, _options)) (set: _cssString to ($placeToCSS: _placement, $options)) (out:)[(css:_cssString)+(hook:_hookName)[\ [_title]\ (hook:_hookName + '-content')[]\ ]] ]))($clearItemHistory:)(set: _litBy to ($locationIsLit:))\ (set: _loc to (passage:)'s name)\ (unless: ($inventory:) contains 'a lighter')[ You pat your pockets, but can't seem to find your lighter. ](else-if: _litBy is 'dark' or _litBy is 'by headlights')[\ You flick the lighter, but the light seems grey and tiny in the face of the dark. All you can really see is \ (if: _loc is 'staging area')[\ ($itemLink:'a desk') by your feet, and\ ]\ your shivering hand. As your thumb starts to burn you let the puny light go out.\ ](else:)[\ You flick it open and shut a few times, an old habit.]<!-- clearItemHistory so that clicking Done takes you to the passage, not back to the glove box or wherever you started -->\ ($clearItemHistory:)\ (set: _reportLight to (macro:[ (set: _litBy to ($locationIsLit:)) (if: _litBy is 'brightly')[ (out-data:"You've finally lit the place up a little.") ](else-if:_litBy is 'by headlights')[ (out-data:"It's dark outside the beam of your headlights.") ](else-if: _litBy is 'by flashlight')[ (out-data: "It's pitch black outside the beam of your flashlight.") ](else:)[ (out-data:"It's darker than you can remember it ever being.") ] ]))\ (set: _hint to (macro:[ (set: _loc to (passage:)'s name) (if: _loc is "middle of nowhere")[ (out-data:"you could start by getting out of this truck") ](else-if: (not (visited:'crumbling concrete')))[ (out-data:"you could start by looking around the area, seeing if maybe there's a phone or something") ](else-if: ($windowBroken is not true))[ (out-data:"you could break open a window to get inside that building") ](else-if:$flashlightOn is not true)[ (out-data:"you could try exploring the building by feel, even though it's so dark") ](else-if: not (visited:'storage room'))[ (out-data:"you should poke around the building more, see what else there is to find") ](else-if: not $emergencyLightsOn)[ (out-data:"you should switch on those emergency lights in the storage room so you can get a better look at things") ](else:)[ (out-data:"you could... man, I don't know...") ] ]))\ ### Smoke... (unless: ($inventory:) contains 'a lighter')[\ You pat your pockets, but can't seem to find your lighter. ](else:)[= \ (unless: ($inventory:) contains 'a pack of cigarettes')[\ You slip your hand into your pocket and remember you don't have your smokes on you. ](else:)[= \ (if: $cigs is 0)[ You're out of cigarettes. ](else:)[= (set: $cigs to it - 1)\ You pull out a cigarette and flick it into life. Thoughts tumble through your head. Well, you're still stuck here. [(_reportLight:)] Maybe [(_hint:)]. And you still haven't quit smoking. (if:$cigs is 0)[That was your last cigarette, too.](else:)[You've got (plural:$cigs, "cig", "cigs") left.](set: _litBy to ($locationIsLit:))\ (if: _litBy is 'by headlights')[\ Faint shafts of light from your dimming headlights seep through the empty window frame, but you can barely make out anything of the interior. [[Go back out ->crumbling concrete]] | \ ($itemLinkAlias:'Use your lighter to look around', 'report lighter') | (link:'Feel around in the dark')[You take a step and crack your shin against what feels like ($itemLinkAlias:'a metal desk', 'a desk'). Ouch.] ](else:)[\ ($first:'staging area')[Your surroundings spring into brightness around you. ]\ ## Staging Area It's obvious this place has been abandoned for years. Cold night air breathes through holes in the roof and everything is strewn with desert sand and patches of mold. The (link-show:'boarded-up door', ?push-it) is alongside the (link-goto: 'empty window frame', 'crumbling concrete').|push-it)[ You push against it, but the door won't budge.] Other rooms lie [[north->foreman's office]] and [[east->break room]]. In one corner is the metal desk. The floor has half-collapsed near one corner, revealing ($itemLink:'a hole') criss-crossed with cobwebs. ($youCanAlsoSee:) ]## Storage Room($addToInventory: 'a pack of cigarettes')\ ($addToInventory: 'a piece of jade')\ (set: $windowExamined to true)\ (set: $windowBroken to true)\ ($addToInventory: 'a flashlight')\ (set: $flashlightOn to true)\ [[Staging Area->staging area]] ($itemLink:'a hole') (set: $talents to it + (ds:'scent', 'courage', 'xstrength'))\ [[Foreman's Office->foreman's office]] [[break room]](set: $broodedMemories to it + (ds:"the last day of high school"))\ ### The last day of high school You didn't expect it was going to be your last day. But that morning you got called in to the principal's office and fat bald Mr. Cox and pissy old Mrs. Burke were there, and they looked kind of like strong animals stalking weak animals, and you knew something bad was up. Cox said I have here, Mr. Morales (a bad start since you hate that name) a test you took last week in Mrs. Burke's sophomore English class. Questions have been raised (he looked up at Mrs. Burke like he was trying to pass the buck) questions have been raised about the quality of your essay, and whether a student with your academic and behavioral record (he scratched his bloated nose meaningfully) could have plausibly produced such an essay, and you get the idea. They thought you cheated. No. They knew you cheated, deep in their smug empty hearts. They wanted you to admit it, say you were a cheater and a liar. But you weren't. You wrote that essay, every god damn word, because you really really liked the book for once and wanted to show Mrs. Burke that maybe if they gave people better books to read kids would actually learn something. But they wanted a confession. They wanted a thieving example they could parade in front of the school. Someone of your academic and behavioral and economic and racial background and yeah, screw this shit. So you got up and left and never came back. Drop out, hell. You walked out and you'd do it again.#Weed-strewn Rust Behind the rather small concrete building and its tiny frosted window is nothing but a scraggly patch of yellowing weeds and dirt near a leaking pipe, littered by a collection of rusted barrels and some scattered newspapers. Desert stretches in all directions; [[back west->crumbling concrete]] is the front of the building. |guide-book>[Atop one overturned barrel is (link:'a weather-worn guidebook')[($addToInventory:'a weather-worn guidebook')($showItem:'a weather-worn guidebook')(t8n:'fade')(transition-delay:1s)[(hide:?guide-book)]] ]The cold night air swirls around you, and you pull your jacket closer. (if: visits is 1)[Something about the weather-worn guidebook makes you want to brood about ($itemLink:'the last day of high school').]\ ($moveToLoc:'the last day of high school', 'emotional baggage')\ (if: ($itemLoc:'a weather-worn guidebook') is 'offstage')[(show: ?guide-book)](set: $broodedMemories to it + (ds:"when you heard the news"))\ ### When you heard the news... Four weeks ago now, a little colder and a little darker. On a night just like this one except you didn't drive off the road and crash into a cactus, you got off work and drove the state highway in the dark and crossed over the edge of the res to Ocean's dad's trailer, and she told you that night while you were dead exhausted, "Knock, I'm pregnant." And all you could think was how totally not real it seemed, after an hour of blackness and New Mexican night streaming by, bugs exploding in tiny tragedies on your windshield, you just felt like driving on, like this thing was some podunk town you could breeze by, no services, ranch exit only. And you thought of every movie they ever made you watch in school and every lecture and every living example, the drunken uncles and snaggle-toothed coworkers who knocked up their high school sweethearts and started families on minimum wage and no prospects and never went anywhere and never did anything and what did you do? How could this happen? Why were you both so stupid? Ocean's aunt is paying for the baby but it's been made clear the money stops when the baby's born. Ocean wants to keep it, she's always wanted to be a mommy. But you never thought you'd be a daddy. And when she pushed this into your hand last night she told you, "Knock, it's time to decide. If you aren't with me on this, if you don't want this as much as I do, then this can't go on anymore and you should go. Fly. Head west. Find Nakaibito." She smiled just a little and traced your ear. "But decide soon, Knock. Decide soon."(set: $broodedMemories to it + (ds:"your shit job"))\ ### Your shit job Juza straddles the 371 like a drunk at last call, smelly and without a plan for the future. Shiny cars whiz by at ninety once in a while, only stopping for gas or directions "("hint: not this way). No one ever stops for the stalls selling food and jewelry and blankets and cheap t-shirts that cluster around the dirt turn-off onto the rez. At least, no one buying anything. Big Jimmy shook his head when he heard you lived in Oro Oeste. Hell of a drive, kid, he said, popping up his Lumberjacks cap to scratch the straw pate underneath. You should get a place in Hoo-zuh. Little Jimmy'll set you up in that trailer cross the road for almost nothin'. Almost nothing. Yeah, exactly what you'd turn into on the cold day in hell you move to Juza. But on the other hand, that was before you met Ocean. Now the road back to Oro Oeste seems longer and longer every night