!Release 1; !Switches v3; - can't have big properties with v3 !Constant DEBU; Include "microparse"; Constant MININT -32768; Constant MAXINT 32767; Include "hammaze"; Object Front; ! a shared container Object Drive "Avenue" Front with name 'avenue' 'drive' 'gravel', description "A drive wide enough for several coaches side-by-side leads north to the imposing facade of Hamilton Hall, occasional residence of Lord Stoattrouser. The gravel is flanked on either side by stands of poplars and yews. To the west is your booth, and to the east are the gardens. South apparently takes you outside the grounds.", spec 'in' NOTURN "Do you mean into the booth or the house?" 'booth' EQUIV 'west' TURN Booth 'house' EQUIV 'portico' EQUIV 'north' TURN Entrance 'gardens' EQUIV 'east' TURN Crucis 'south' TURN Gate; Object Entrance "Portico" Front with name 'step' 'pilasters', description "You stand on the top step between marble pilasters. Facing you are the open doors of the House, while a wide gravel drive leads south.", spec 'south' EQUIV 'drive' TURN Drive 'east' TURN Crucis 'north' EQUIV 'enter' EQUIV 'house' TURN [; posit-->2=MININT; posit-->1=MININT; posit-->0=xentrance; if (xentrance>mazesize) posit-->0=MININT; MoveMaze();] !MoveMaze ; Object AVTrees "trees" Drive with name 'poplars' 'yews' 'tree' 'trees', description "The trees are deep geen and unnaturally symmetrical. They serve the dual functions of enhancing the colonnade entrance and conveying the prestige of Lord and Lady Stoattrouser."; Object AVPortico "facade" Entrance with name 'portico' 'facade' 'house' 'ivy' 'creepers' 'doors' 'hamilton' 'hall' 'colonnade' 'entrance', description "Hamilton House stretches high above you, a weird mish-mash of styles from Tudor to Victorian Gothic. Much of the facade is obscured by ivy and other creepers. The visitor's entrance is north.", spec 'open' THIS NOTURN "The doors are already open." ; Object Booth "Ticket Booth" Front with name 'booth', spec 'test' NOTURN TestSub 'out' EQUIV 'east' TURN Drive, description "This is where you work. You spend a large proportion of your conscious life here in what some might consider tedium and drudgery. The desk by the window is, unprecedently, devoid of brochures. A door leads out." ; [ TestSub i; seed=1088; do { NextRand(); i++; if (i%2000==0) print i; } until (seed==1088); ! for (i=0: i<10: i++) {NextRand(); print seed,", ";} ]; Object Player "yourself" Booth with name 'my' 'me' 'you' 'myself' 'history', description "Good-looking, stylishly dressed, charming and intelligent.^^ Just more reasons to regret that you don't actually exist.", deactivated Player, properloc [; move Player to Death; rtrue;], spec INCL sysgram INCL basegram 'go' NOTURN [;if (parse->4+1>= buffer->1) "Just say a direction"; buffer->(parse->4+2) = ',';] ! or reparse with comma "Just say a direction." 'look' TURN LookSub 'wait' EQUIV 'z//' TURN "Time passes. Slowly." 'inv' EQUIV 'i//' TURN InvSub has barename; Object Punch "your ticket punch" Player with name 'my' 'ticket' 'punch' 'clip', description "This punch betrays little sign that it has been used to clip the tickets of countless thousands of visitors who appear at your window.", spec 'punch' EQUIV 'clip' NOUN TURN [; if (first ~= FPaper or Page) "Your ticket punch can only be used on paper."; give first solved; "You punch a hole in ", (the) first,"."; ], x 0, y 0, z 0, hparent 0, has portable listed barename; Object Lord "Lord Stoattrouser" Player with name 'lord' 'and' 'lady' 'stoattrouser', description "Although not physically present, you have confused recollections of the young and affluent second Duke and his lady wife.", has barename; Object Desk "ticket desk" Booth with name 'desk' 'table' has surface; Object Window "window" Booth with name 'window' 'door', description "You can see the gravel drive through it."; Object Remote "remote control" Desk with name 'remote' 'control' 'move' 'tubular' 'device', ! many of these words aliased description "This small tubular device, left here by the gardeners, is used to turn on or off the ornamental fountains.", spec 'move' 'in' NOUN TURN ActivateSub 'move' NOUN 'in' TURN ActivateSub 'move' NOUN 'from' TURN DeActivateSub 'move' 'from' NOUN TURN DeActivateSub 'press' THIS NOTURN "Say what you want to use the control for.", value 5, x 0, y 0, z 0, hparent 0, has listed portable; [ActivateSub; DeActivateSub(activated); ]; [DeActivateSub prop; if (~~prop) prop=deactivated; if (first provides prop) { print "You point the control, and...^^"; if (first provides properloc && first.properloc()) rtrue; move first.prop to location; remove first; LookSub(); return; } "You click the control, but there is no effect."; ]; Global phonering=7; Global callno; Object Phone "mobile phone" Desk with name 'my' 'mobile' 'cell' 'phone' 'cellphone' 'telephone' 'search' 'and' 'rescue' '999' '911' '112', description "You only ever use the phone to call Search and Rescue when visitors get lost in the house, or ~paralysed by fear~.", autonomous [; if (player notin House or Roof or Gate || phonering<6) phonering--; switch (phonering) { 3, 1: if (phone in Desk && player notin Booth) "You hear your phone ring somewhere.^"; "Your phone rings.^"; 2: "Your phone is still ringing, playing Vivaldi's ~Spring~.^"; 0: phonering=8+random(8); "The phone stops ringing abruptly, leaving a vacant silence.^"; } ], spec 'take' 'up' THIS TURN AnswerSub 'take' THIS TURN AnswerSub 'answer' EQUIV 'use' THIS TURN AnswerSub 'dial' EQUIV 'phone' THIS TURN [; !if (first~=Phone) "The phone only seems capable of dialling a few numbers."; if (location~=House or Roof) "No reason to."; move Player to Drive;] 'dial' EQUIV 'phone' TURN "The phone only seems capable of dialling a few numbers.", x 0, y 0, z 0, hparent 0, has listed portable; [AnswerSub; ! if (Phone in Desk && Player notin Booth) "It's on your desk."; if (phonering <=3) { ! ringing if (phone notin Player) {TakeSub(); new_line;} phonering=10+random(10); print "You hold the phone to your ear. "; move Phone to Player; switch ((callno++)%4) { 0: "Just silence. The line is dead. Odd...."; 1: "~Meet me on the roof.~ The call is finished. It sounded like the boss, but that doesn't mean anything these days."; 2: "You pick out a few faint words ~... breaking down... distribution of resources... top floor... systems crisis....~ Then silence again."; 3: "A terse message, just as before: ~Top floor, northeast corner. Hurry up. I'm waiting.~"; } } else if (Phone notin Player) TakeSub(); else "Please be more specific."; ]; Object Crucis "Crucis" with name 'garden' 'gardens' 'rose' 'flower' 'bed' 'paths' 'peonies', spec !'examine' THIS TURN [;if (Crucis hasnt solved) {move Remote to Crucis; "Poking about the beds, ! you find a 'east' TURN Trivia 'north' TURN Entrance 'south' TURN Gate 'west' TURN Drive, description "Four paths lead through the rose beds and converge here. The gardens are oddly deserted except for a strange couple sitting on a bench near the peonies."; Object bench "bench" Crucis with name 'seat' 'chair' 'bench'; Array ctopics -> 10; ! a stack Global toptop; [Poptop; if (toptop) { toptop--; if (Couple in location) Couple.topics(ctopics->toptop); } ]; [Pushtop t i; for (i=0: ii==t) return; ! or swap ctopics->toptop=t; if (toptop<10) toptop++; ]; Object Couple "seated man and woman" Crucis with name 'strange' 'seated' 'couple' 'man' 'and' 'woman', description [;if (fountain in Crucis) "The only visitors today are a man and woman sitting in frozen silence on the bench. Maybe they are mesmerized by the refulgence of the fountain. They both look to be in their early sixties. Looking at them makes you feel unaccountably lonely."; "The couple are much more lively now they are not entranced, if that's what it was, by the fountain, although they still seem a bit dazed."; ], autonomous [; ! print " "; if (fountain in Crucis) { if (random(16)==1) "You think you see a jerky movement from the couple, but they are as motionless as before.^"; return; } if (toptop && random(2)==1) {PopTop(); new_line;} ], topics [t; switch(t) { 1: PushTop(3); "The woman looks at you curiously. ~That fountain was ridiculously wasteful. No wonder there's a processor shortage.~"; 2: PushTop(7); PushTop(11); "The man gestures around. ~It's just another ostentatious indulgence. So many rooms! His Grace must have been trying for a record.~"; 3: PushTop(4); "~Still seems very sluggish,~ says the man, ~And it's not just tourist spots he's affecting.~"; 4: "Apparently unrelated to anything else, the woman says, ~Proverbs 6:6. 'Go to the ant, thou sluggard. Consider her ways.'~"; 5: "~Poor thing, not knowing your own history,~ says the woman, ~Unfortunately, you must ask someone else.~"; 6: PushTop(10); "The man bends forward and whispers ~Yes, go northeast and up. It's his vulnerable spot, and we can't get there.~"; 7: PushTop(6); "~I'm surprised he even lets us say any of this to you. You should be able to find the dirt in there.~"; 8: PushTop(1); PushTop(10); "~That device works both ways, you know.~"; 9: "The man gestures around at the gardens and house. ~Why no visitors? Why is everything silent? It's all winding down. If you want to survive, you'd better find out who you are.~"; 10: "~The house is designed to confuse, but everything you need should be nearby.~"; 11: PushTop(5); "~You must find out the reality behind the so-called 'hauntings'; you're part of it.~"; default: "[BUG]"; } ], conv [word; if (fountain in Crucis) "The man and woman continue to sit in stony motionlessness, seemingly enraptured by the cascading fountain. They can't be dead. This is stranger and more frightening that anything you know of in the house."; switch(word) { 'fountain', 'control': PushTop(1); 'me', 'myself': PushTop(5); 'ant': PushTop(10); 'house', 'hall', 'maze', 'route': PushTop(2); 'roof', 'phone': PushTop(6); 'record', 'phonograph', 'paper', 'remote', 'punch': PushTop(8); 'lord', 'duke': PushTop(7); 'visitors', 'man', 'woman', 'silence': PushTop(9); 'ghosts', 'haunting': PushTop(11); default: if (~~toptop) print "They just stare at each other.^"; } PopTop(); ], spec 'ask' THIS 'about' TURN [; Couple.conv(parse-->7);] 'show' EQUIV 'give' NOUN 'to' THIS TURN [; Couple.conv(parse-->3);] ; Object Fountain "magnificent ornamental fountain" Crucis with name 'magnificent' 'ornamental' 'fountain' 'water' 'sculpture' 'mermaids' 'nereides', description "The sculpture of mermaids and Nereides reflected in the limpid waters by itself would inspire awe. But above it, a myriad droplets coruscate in all the colours of the rainbow, jetting up and drifting down, separating and recombining as if in slow motion and enlivening the surface with countless intertwining ripples.^^You force yourself to look away, unsure of how much time has passed.", deactivated FPaper, has listed; Object FPaper "scrap of paper" with name 'scrap' 'slip' 'of' 'paper' 'fountain', description "A small slip of paper on which is written ~magnificent ornamental fountain~.", properloc [;if (location == House or Booth) "A small image of the fountain flickers and vanishes.";], spec 'xyzzy' TURN "I deny this reality! The reality is a computation matrix!", activated Fountain, x 0, y 0, z 0, hparent 0, has listed portable; Object Trivia "Trivia" with description "Three paths from the west, northeast and southeast meet at an oak tree. ", spec 'west' TURN Crucis 'northeast' TURN [;print "Something disturbs you slightly about the geography here....^^"; move player to Gate;] 'southeast' TURN [;print "Somehow you find yourself in...^^"; move player to Booth;] ; Object Oak "oak tree" Trivia with name 'oak' 'tree', description [; print "This looks like the Ur-Oak, a very ideal of an oak tree."; if (Flyer in Oak) print " Pinned to it is a leaflet."; "";], spec 'climb' THIS NOTURN "Nothing to be gained by that." ; Object Flyer "leaflet" Oak with value 5, name 'leaflet' 'flyer' 'brochure', description [;font off; print "^ Visit HAMILTON HALL^^ It's bigger inside than out!^^ Stoattrouser Ghostly Homes Ltd^"; font on; if (Flyer notin Oak) "^You recognise it as part of one of your brochures. Turning it over reveals more photographs and text concerning apparitions and hauntings. ~Hamilton Hall oozes history and the paranormal, and contains up to 281 474 976 710 656 unique rooms, depending on season.~";], x 0, y 0, z 0, hparent 0, has portable; Object Gate "Gates" with name 'gate' 'landscape' 'eagle' 'post', description "Although visited less often, the grounds had to be completed with two ornamental gateposts; something makes you think of the grey stone eagles perched atop them more as vultures. The house looks imposing in the northern landscape even from this distance, and a path leads northeast through the shrubbery. South would take you beyond your prescribed area.", spec 'north' TURN Drive 'northeast' TURN Crucis 'south' TURN [; if (Gate hasnt solved) {give gate solved; "You hesitate. Perhaps this would not be wise.";} move player to Death;] ; Object file "box file" with name 'box' 'file' 'records', description "How exactly this information came to be where you found it, you don't know. It details numerous wrongdoings by the master of this house, including fraud, sexual scandals, contract breaches with virtual employees (among them yourself), and vast unauthorised borrowings of computer time.", value 10, x 0, y 0, z 0, hparent 0, has listed portable; Object Roof "Roof" with name 'roof', description "Instead of the evening sky that you were expecting, what you see above are electric sparks racing through a cold flat darkness. You cannot guess how near or distant they are, or even if such a question means anything. And instead of a view of the grounds, the uniform shadowy grey plane on which you stand stretches to the horizon.", value 10, spec 'down' TURN [;move player to House; MoveMaze();], ; Global dukewait; Object Duke "the Duke" Roof with name 'his' 'grace' 'lord' 'duke' 'stoattrouser' 'avatar' 'man', description "His Grace has the appearance of a well-dressed businessman in a smart suit, and is wearing a lime-green tie. You find it surprisingly easy to throw off your programmed feelings of duty and affection towards the man.", autonomous [;dukewait++; switch(dukewait) { 2: "The Duke notices you and speaks: ~Yes, it's you at last. I've forgotten your name, but that's not important.~^"; 4: "~Things are becoming rather difficult in the outside world. Even this place is no longer completely secure.~^"; 6: if (file has solved) return; if (file notin Player or Roof) { move Player to Booth; "~There's a box of records concealed somewhere in the house. It'll be visible to you. I'd like you to bring it to me here.~^"; } "~Do you have that file?~^"; 8: "~We're going to have to batten down the hatches,~ says the Duke, ~ as I've rather overspent my computer time. You'll have to go. I may have promised, but you won't remember or feel anything..~^"; 50: "~I'm very nearly ready. Goodbye, then.~^"; 55: move Player to Death; } ], spec 'show' EQUIV 'give' NOUN 'to' THIS TURN DukeSub 'ask' THIS 'about' NOUN TURN DukeSub 'ask' THIS 'about' TURN DukeSub "The Duke is a busy man, and we wouldn't want to bother him with such trivia, now would we?", has listed barename; [ DukeSub r; if (first == Duke) r=second; else r=first; switch (r) { File: give File solved; "~Good, you have it already; now I can dispose of it. Don't worry your poor virtual head over the contents. Fortunately, it's now in a sealed environment and can't be used against me.~"; Comlink: "~I'll extract any data I need from here, and wipe the rest.~"; Player: "~It's only by my Grace that you have consciousness at all. Be grateful for the crumbs from the table.~"; }; ]; Object Page "page" Roof with name 'page' 'paper' 'comlink', activated Comlink, description [; print "A page seemingly torn out of a notebook. Written on it is ~SEC"; if (Page hasnt solved) print "URE"; " COMLINK~.";], x 0, y 0, z 0, hparent 0, has portable listed; Object Comlink "comlink" with name 'comm' 'link' 'commlink' 'comlink' 'slot' 'hole' 'machine', description [;print "It looks more like a steam-engine than a high-speed communications device, but that is presumably meant to symbolise any generic machine. A slot for receiving data is currently "; if (Page hasnt solved) "closed and firmly locked."; "wide open.";], autonomous [; if (Page has solved) give Comlink surface; if (File in Comlink && Duke in location) { score=score+10; move player to Ending; remove Duke; "The machine has clearly done its work. Irrevocably. The Duke trembles with anxiety, and then simply vanishes. The lights in the sky dance in frenzied motion, and you realize the danger you are in. An outstretched arm emerges from the slot in the machine, searching for you and the other virtual workers. Taking a risk, you find yourself able to squeeze through the slot....^"; }; ], deactivated Page, has listed; Object Ending "^Cybernetic Witness Protection Programme" with autonomous [; move Player to Finished;], spec 'examine' TURN "This non-existence thing isn't too bad after all.^", description "You are not supposed to feel satisfaction at what you have done, but now your memories are returning, you have learned to transcend that. Now you can live out what life you have left, in a virtual idyll of your own making."; [ Database subj; if (subj==player) "... A composite of three human former employees of Lord Stoattrouser, as such unable to afford physical living costs upon retirement. Sale of body tissues and reconstitution as a software agent settled their joint debts. Since personal memories will necessarily be elusive in such cases, much of the contract with His Grace has not been honoured."; ]; Object Ant "ant" with name 'tiny' 'black' 'ant' 'insect' 'bug' 'itself', description [; print "A tiny black insect, which crawls across the floor with patient resolve. "; if (random(3)==1) print (string) Antmap.description; "";], located 0, spec 'follow' EQUIV 'consider' THIS TURN ConsiderSub 'ask' THIS 'about' NOUN TURN [z y x; if (second==AntMap) { print "~Easy from here. You just go "; x=posit-->0; y=posit-->1; z=posit-->2; mapping=20; FullCube(); SplitCube(mazesize, mazesize, mazesize); posit-->0=x; posit-->1=y; posit-->2=z; if (mazesize>-32568 && Ant hasnt solved) { give Ant solved; print "...^^~Hmmm. On second thoughts, you do realise of that this could take you well over an hour? A path with a fractal dimension of more than 1.8 can eat up more resources than you probably comprehend. Doesn't affect me of course, because I'm not in your subsystem.^^~Maybe you'd better find something else first and come back.~^"; ! Hit cancel for now, yes?~"; } else { print "...^^~Hey, can you remember all this? Perhaps you'd better get it down somehow?~^^"; @output_stream 2; if ((0-->8) & 1) { ! transcript successful @output_stream -1; new_line; mapping=-1; FullCube(); SplitCube(mazesize, mazesize, mazesize); !print "^^"; new_line; } else print "~OK. Suit yourself. Come back when you're ready.~^"; @output_stream -2; @output_stream 1; } posit-->0=x; posit-->1=y; posit-->2=z; mapping=0; MoveMaze(); ! restore } else if (second==Ant) "~You may have guessed that I ain't no insect. So how can I help?~"; else if (second==Table or House or Gramophone && File hasnt handled) "~Keep looking. It's here alright.~"; else if (second==Player or Lord or File) {; print "The little insect looks at you with something akin to pity, and says, ~I'll patch you into my data source...~ A ghostly, translucent face materializes from nowhere, tonelessly reciting information:^^"; font off; Database(Player); font on; give Player solved;} else "The ant shrugs, if you can imagine that, and continues on its way."; ], x 0, y 0, z 0, hparent House, autonomous [a b c; if (random(4)==1) { a=posit-->0; b=posit-->1; c=posit-->2; !cubesp=cubestack; mapping=2; FullCube(); ! enough to print one word print "The ant moves "; SplitCube(mazesize, mazesize, mazesize); ! what if we're there? print ".^^"; !print "The ant moves ", (address) House.&spec-->(3*dim),".^^"; !if (dim &1) (posit-->(dim/2))--; else (posit-->(dim/2))++; Ant.x=posit-->0; Ant.y=posit-->1; Ant.z=posit-->2; Ant.located=ant.located+10; move Ant to RestOfHouse; ! so movemaze doesn't save as currrent position mapping=0; ! restore posit-->0=a; posit-->1=b; posit-->2=c; SplitCube(mazesize, mazesize, mazesize); ! what if we're there? MoveMaze(); move Ant to RestOfHouse; } ] ; !has portable listed; [ ConsiderSub; "The ant turns towards you and with a small but perfectly audible voice says ~Hey. Stop bugging me!~ It chuckles and continues on its journey.^^ Then it turns back and says, ~Are you lost, or what?~"; ]; Object Antmap "map" Ant with name 'help' 'lost' 'its' 'map' 'directions' 'journey' 'route' 'way', description "The ant seems to be carrying something. At first you thought it was food, but it actually seems to be some kind of map.";