forked from UMDLARS/one_night_in_sf
-
Notifications
You must be signed in to change notification settings - Fork 0
/
untitledHeistGame.inf
1457 lines (1213 loc) · 55.8 KB
/
untitledHeistGame.inf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
Constant Story "One Night in San Francisco^^";
Constant Headline "This is a work of ~interactive fiction~. ^^It is your first day on the job at Titor & Associates Financial Forecasting. You applied here to gain access to their offices after hours to steal their valuable information off of their computers. They have state of the art cyber security preventing any digital leaks of the information so you are here to physically take it.^^You step through the front doors of the office. It is pitch black outside. You are here after hours. As you walk through the quiet foyer, your shoes clack against the floor echoing revealing just how silent this space is after hours. You approach the elevator and press the up button. The elevator *DINGS* and the doors open. Entering the elevator, you press the button labeled ~13~, the floor of the office you are going to burgle tonight!^^The elevator hums as it brings you up to the floor requested, however upon reaching the 13th floor, the door does not open. A slot just below the floor buttons begins to light up requesting a security pass, which you were given upon your hiring.^^";
Constant OPTIONAL_SCORED;
Constant OPTIONAL_FULL_SCORE;
Constant STATUSLINE_SCORE; Statusline score;
Constant OBJECT_SCORE = 1;
Constant ROOM_SCORE = 1;
Constant TASKS_PROVIDED;
! Constant MAX_SCORE = 176; ! XXX: Calculate actual final score before release
Constant NUMBER_TASKS = 6; ! XXX: Fix before release
Array task_scores -> 20 20 20 20 20 20;
Constant GET_APRIL_COMPUTER = 0;
Constant GET_BACKUP_TAPE = 1;
Constant GET_ELLIE_HD = 2;
Constant GET_USB_BOOT_INFO = 3;
Constant GET_TITOR_PLANS = 4;
Constant GET_IBM5100 = 5;
Constant MAX_SCORE = (NUMBER_TASKS * 20) + 11; ! 12 scored objects: 2 share a point
Constant OPTIONAL_SIMPLE_DOORS;
Constant OPTIONAL_EXTENDED_VERBSET;
Constant OPTIONAL_EXTENDED_METAVERBS;
Constant OPTIONAL_PROVIDE_UNDO;
Constant INITIAL_LOCATION_VALUE = Tutorial;
Constant DEBUG;
Constant voxfail = "The tower silently listens to your voice, but then flashes red and buzzes disapprovingly. Red text appears on a screen: ~YOU ARE NOT JOHN TITOR THIS LOGIN ATTEMPT WILL BE REPORTED.~";
Constant handfail = "You place your hand on the handprint recognizer. Light scans your hand before flashing red and buzzing disapprovingly. Red text appears on a screen: ~YOU ARE NOT JOHN TITOR THIS LOGIN ATTEMPT WILL BE REPORTED.~";
Include "globals.h";
! Re-define entry points for score display.
[ PrintTaskName task_number;
switch(task_number) {
GET_APRIL_COMPUTER : "Got April's computer.";
GET_ELLIE_HD: "Took Ellie's hard drive.";
GET_BACKUP_TAPE: "Pocketed the backup tape.";
GET_USB_BOOT_INFO: "Got Len's data";
GET_TITOR_PLANS: "Printed out John Titor's schematics.";
GET_IBM5100: "Grabbed the IBM 5100.";
default: "XXX: Should not reach";
}
];
[ PrintRank;
print ", earning you the rank of ";
if (score >= 176) "Footpad.";
if (score >= 147) "Burglar.";
if (score >= 118) "Amateur Larcenist.";
if (score >= 89) "Shoplifter.";
if (score >= 60) "Chancer.";
if (score >= 31) "Armchair InfoSec Aficionado.";
if (score >= 1) "Script Kiddie."; ! Didn't complete any tasks, but found clues
"Quitter.";
];
! This is just the inverse of the Achieved function from grammar.h
[ Forfeit num;
if (task_done->num == 1) {
task_done->num = 0;
score = score - task_scores->num;
}
];
Include "ext_cheap_scenery.h";
Include "puny.h";
Include "help.h";
Attribute hint_given;
Attribute heavy;
Attribute bulky;
! Allow `climb down` and `climb up`.
! Also provides `climb east`, but that makes no nevermind.
Extend 'climb' first
* noun=ADirection -> Go;
Verb 'talk'
* 'to' noun -> TalkTo;
[TalkToSub;
"Perhaps you should try to ~talk to something (or someone)~.";
];
Verb 'type' * -> TypeErr
* special -> TypeErr
* special 'on'/'into'/'in' -> TypeErr
* special 'on'/'into'/'in' noun -> Type;
[TypeErrSub;
print "You will need to be more specific. The type command wants you to provide a number or a string and an object to type it on.^^[type 1234 or ABCD on/into object]^";
noun = false; ! I think this suppresses an error message.
];
[TypeSub;
"That's not an object on which you can type anything.";
];
[HintSub;
if(location.instructions == 0){
"It appears there are no hints to give for this room, sorry.";
}
else {
PrintOrRun(location, instructions, false);
if (location hasnt hint_given) {
score = score - 15;
give location hint_given;
}
}
];
Verb 'hint' * -> Hint;
Verb 'jimmy' 'lift'
* noun 'with' held -> Unlock
* 'apart'/'open' noun 'with' held -> Unlock
* noun 'apart'/'open' 'with' held -> Unlock;
! toilet plunger can be ambiguous to porcelain toilet,
! and held takes precedence,
! so we test for the specific toilet object before generic nouns.
[ IsToilet;
return (noun == toilet);
];
Verb 'plunge'
* noun=IsToilet -> Plunge
* noun -> Plunge
* multiexcept 'with' held -> Plunge;
Extend 'pick' first
* noun 'with' held -> Unlock
* 'apart'/'open' noun 'with' held -> Unlock
* noun 'apart'/'open' 'with' held -> Unlock;
Extend 'transfer' first
* noun 'to' noun -> transfer;
Extend 'move' replace
* noun -> transfer;
! 'screw' and 'unscrew' are defined as synonyms for 'turn',
! rather unhelpfully for a game that wishes to distinguish them.
! We keep that behaviour, and extend here.
! Page 219 of the DM4 explains this syntax.
Extend only 'unscrew' first
* noun 'with' held -> Unlock
* noun -> Unlock;
Extend only 'screw' first
* noun 'with' held -> Lock;
Extend only 'turn' first
* noun 'with' held -> Turn;
Extend only 'remove' first
* noun 'with' held -> Remove;
[Initialise;
! Start out VERBOSE instead of BRIEF
lookmode = 2;
move checklist to player; ! You start out with the task list
move securityCard to player; ! Start with security card
];
Object checklist "Task List"
with
name 'task' 'list' 'note' 'checklist' 'clipboard' 'to-do',
description [_i;
print "This is a checklist of all the target data you hope to exfiltrate during this mission. It reads as follows:^^";
for(_i=0 : _i<NUMBER_TASKS : _i++) {
font off;
if(task_done->_i == 1) {
print (bf) " [X] ";
} else {
print " [ ] ";
}
font on;
PrintTaskName(_i);
}
if(player in tutorial){
print "Great job! Now how about we get out of this elevator and into the game proper? This game holds many verbs, not all we can cover in the tutorial, however we tried to make the language as natural as possible. Try inserting the security fob into the scanner to open the door.";
}
],
instructions [;
"You can ", (ul) "look at", " or ", (ul) "read", " ", (the) checklist, " to see which tasks are finished, and which still need doing.";
],
;
!=================TUTORIAL======================
Object Tutorial "Elevator"
with
description "You are in a quiet elevator, it has stopped at floor 13. A small scanner is flashing with green lights waiting for you to present your security pass. This elevator is a tutorial to help you understand the basics of this game, and to teach you some useful commands. To start, try using the LOOK command, or L for short. If you do not specify what you are looking at, it will give you the description of the room you are in (This that you are reading right now.) however you can follow look with an item or interesting features in the room, and it will try and give a description of what you specified. Try ~look scanner~ to examine the security pass scanner.",
cheap_scenery
'security' 'scanner' [;
Examine: "The scanner's lights blink expectantly for your security fob. Good job! Now this appears to be an object that you can interact with, requesting this security fob. If you type I or INVENTORY it will display the items you are currently carrying! There is no limit on the number of items you may hold, but some items are heavy or bulky which means you can only carry one of them. Try opening your inventory and looking at the security fob.";
Receive:
if(noun==securityCard && securityCard hasnt heavy){
print "You insert the fob into the scanner. The green lights happily flash a few times, and the door opens! You have completed the tutorial. To enter the game proper type ~north~ or ~n~. If you ever need help try the commands help or intro!";
give elevatorDoor open;
give elevatorDoor ~locked;
return true;
}
if(noun==securityCard && securityCard has heavy){
print "Oops, you fumble the fob and drop it on the floor of the elevator! Use ~take [object]~ to pick up an object. Try grabbing the fob and try again!";
give securityCard ~heavy;
move securityCard to Tutorial;
return true;
}
],
before [;
Go:
if(selected_direction==n_to && elevatorDoor has open){
PlayerTo(Lobby,2);
print "^You recall from your interview that the first office on the west side requires a brass key to open. To start maybe look for that key, or tackle any office you like first!";
return 1;
}
if(selected_direction==n_to && elevatorDoor hasnt open){
print "The elevator doors are still closed! Follow the tutorial to open them!";
return 1;
}
],
instructions [;
"This room is just the tutorial. Please follow the instructions to get through it!";
],
has light;
Object -> elevatorDoor "Elevator Door"
with
name 'elevator' 'door',
description "This is a metal elevator door. It has no handle as it is exclusively operated by the elevator itself; there must be some way to open this.",
door_dir (n_to) (s_to),
found_in Lobby Tutorial,
has static door ~open locked concealed;
Object securityCard "Security Key Fob"
with
name 'security' 'fob' 'id' 'identification' 'pass',
description [;
print "This is a small plastic key fob with a fake name you gave them during the hiring process. ";
if(player in Tutorial){
print "Good job! You probably noticed in your inventory as well a Task List. You may look, or examine this to see the progress you have made. It shows you all items you need to recover, and if the item is in your inventory or not.";
}
],
has heavy;
!===================LOBBY=======================
Object Lobby "The Lobby"
with
description "The lobby is quiet; all of the workers have gone home for the day, leaving you alone in the building. There is a receptionist desk to the north.
To the west, the lobby extends into a waiting area. To the east, the lobby extends towards a restroom. To the south is the elevator you came up on.",
n_to Receptionist,
e_to LobbyEast,
w_to Waiting,
s_to Leave,
before [;
Go:
if(selected_direction==s_to) {
if(computer notin player){
print "There is still critical information that isn't on you! You can't leave yet.";
return true;
}
if(usbDrive notin player){
print "There is still critical information that isn't on you! You can't leave yet.";
return true;
}
if(IBM5100 notin player){
print "There is still critical information that isn't on you! You can't leave yet.";
return true;
}
if(harddrive notin player){
print "There is still critical information that isn't on you! You can't leave yet.";
return true;
}
if(backup notin player){
print "There is still critical information that isn't on you! You can't leave yet.";
return true;
}
deadflag = GS_WIN;
}
],
has light;
!================LEAVE============================
!this is a placeholder room for the end of the game
Object Leave "Leave"
with
description "Whoah, you're in a black room with random green characters floating by around you, you feel like you shouldn't be in here! [[[IF YOU FOUND THIS ROOM AN ERROR HAS OCCURED!!!!]]]",
has light;
!=============RECEPTIONIST=================
Object Receptionist "Receptionist's Area"
with
description "This area is a small cubicle where the receptionist works. The visitors' space in the lobby is to the south.",
s_to Lobby,
has light;
Object -> receptiondesk "Receptionist's Desk"
with
name 'reception' 'receptionist' 'desk' 'drawer',
description [;
print "This is a very modern asymmetrical desk, which was clearly designed more for appearances than function. ";
if (self has open) {
"It has a single drawer, which sits open.";
} else {
"A single closed drawer is the only thing spoiling its stylish lines.";
}
],
instructions [;
"The desk is very plain, but you might try to ", (ul) "open", " it.";
],
has static container openable;
Object -> -> o7key "loose brass key"
with
name 'key' 'brass' 'loose',
description "This is a single brass key. Stamped on the key are the words ~DUPLICATION STRICTLY PROHIBITED~.",
instructions [;
"You can ", (ul) "lock", " or ", (ul) "unlock", " something with this key.
For example:^^",
(bf) "> ", (ul) "unlock diary with ", (unm) self;
],
has scored;
!=============WAITING======================
Object Waiting "Waiting Room"
with
description "This is a small waiting area. There is an L-shaped couch with a coffee table in front of it in one corner, and a chair and floor lamp in the other. A window on the west wall looks out on the San Fancisco skyline. To the north there is a long hallway. To the east there is the lobby.",
cheap_scenery
'couch' 'l-shaped' "The L-shaped couch is tucked into the corner of this part of the lobby."
'table' 'coffee table' "A coffeeless coffee table. It looks like it has been polished recently."
'window' 'outside' "Out the window, you can see the San Francisco skyline against the pitch black sky. A waxing crecent moon watches your legally dubious actions.",
n_to Hallway7,
e_to Lobby,
has light;
Object -> chair "heavy-looking chair"
with
name 'chair' 'seat' 'stool',
description "This sturdy and heavy-looking chair matches the L-shaped couch in color.",
before [;
Take, Transfer:
if (heavyLimit(self)){
rtrue;
}
else {
give plant ~scored;
rfalse;
}
],
instructions [;
"You're too busy to sit around, but this chair sure seems heavy. If you're not careful, you could ", (ul) "break", " something with it!";
],
has heavy bulky scored;
Object -> wrlamp "lamp"
with
name 'lamp' 'torchere' ' torchiere' 'torchiere' 'light',
description "This tall lamp is a classic torchiere of late 20th century design, with a tall, cylindrical post and bowl-like glass diffuser atop a turqoise glass disk. The lamp has a small brass knob for switching it on and off.",
when_on "The lamp casts a mellow glow on the ceiling.",
when_off "The lamp is switched off.",
has static switchable;
Object -> coffee_table "coffee table"
with
name 'coffee' 'end' 'table',
description "This heavy glass table looks like something from a modern art catalog. It is completely asymmetric and has no straight lines or sharp edges.",
has static supporter;
Object -> -> brochure "brochure"
with
name 'brochure' 'flyer' 'paper',
description "This full-color tri-fold flyer is printed on sturdy paper. It talks in extravagant terms about the company, its president John Titor, and the uncanny accuracy of their predictions of future market and socio-political events.";
!=============LOBBYEAST===========
Object LobbyEast "Lobby East"
with
description "This is a small area of the main lobby. To the east there is a door with a sign next to it that reads ~RESTROOM~.
To the north a hallway extends back into the building. The lobby extends to the west. To the south is a sturdy gray door that leads to a fire escape stairwell, judging by the sign above it.",
cheap_scenery
'door' 'doorway' [;
Open:
if (score == MAX_SCORE) {
print "It's too late to hatch an escape plan now. You decide to leave the fire escape alone, and collect what you came here for.";
}
else {
print "As you are about to open the door to the fire escape, you recall that there is an elevator mere steps away. You abstain from opening the door to the fire escape.";
};
Close: "The door to the fire escape is already closed.";
Unlock: "The door to the fire escape is unlocked, but you don't see the need to walk all those steps down.";
default:
print "This doorway leads to a fire escape which runs to the streets below, judging by the sign above it. ";
if (score == MAX_SCORE) {
print "You suppose you could use the firescape to exit, but then again, it is twelve floors, and the elevator is right there.
You decide to use the elevator instead.";
} else {
print "You're better off leaving the fire escape alone until you've obtained what you came here for.";
};
],
n_to Hallway1,
w_to Lobby,
e_to Restroom,
has light;
!=============HALLWAY7(~~~~~~PLACEHOLDER~~~~~)======================
Object Hallway7 "Hallway"
with
description "This is a hallway that extends to the north. To the south there is the waiting area. To the west there is an office.",
s_to Waiting,
n_to Hallway6,
w_to Office7Door,
has light;
!============OFFICE7(~~~PLACEHOLDER~~~)============================
Object Office7 "Research Office"
with
description "This is a researcher's office, taken up almost entirely by a large desk strewn with academic papers. A terminal sits amidst the clutter, its screen glowing with amber letters against a black backdrop.",
cheap_scenery
'large' 'desk' "The desk looks out of place for this office building, and seems to be made of steel. It has a military look to it, and was a popular style in the 1950s and 60s."
'academic' 'papers' "Most of the papers are theories on time travel by Tipler. The rest are printouts of e-mails to user jtitor.",
instructions [;
"It seems the terminal needs a username and password. Maybe these are written down somewhere in this room?";
],
e_to Office7Door,
has light;
Object -> Office7Door "Brass Knobbed Door"
with
name 'brass' 'knobbed' 'door',
description "This is a large mahagony door with a brass doorknob. You can see right next to the door knob a small key hole. You're certain you could find a key to this door if you search around.",
door_dir (e_to) (w_to),
found_in Hallway7 Office7,
with_key o7key,
After [;
Unlock:
give self open;
"You unlock the Brass Knobbed door and open it!^";
Lock:
give self ~open;
"You carefully close and lock the office door with the brass key.^";
],
instructions [;
"A locked door is only useful to those trying to keep you out. Perhaps you could ", (ul) "unlock", " it with something.";
],
has static door openable ~open lockable locked;
Object -> terminal "VT242 Terminal"
with
name 'vt' 'vt242' 'terminal',
description [;
print"The screen and keyboard on this desk are actually a VT242 model ~dumb terminal~ connected via RS232 serial cables to a system in the server room.^";
if (self has locked) {
print "The system's prompt currently says:^^";
font off;
if (self has general) {
print "password: ";
} else {
print "username: ";
}
font on;
} else {
"The screen shows that the files printed successfully.";
}
],
react_before [;
Type:
if(second == self) {
if(self has locked) {
if (self has general && noun == 'tipler') {
give self ~locked;
Achieved(GET_TITOR_PLANS);
print "The system pauses ominously for a moment, and then presents you with a command prompt. Poking around briefly, you discover a directory full of technical schematics and research papers.^You start printing the data, which begins exiting out of the machine onto a spool of green bar paper. You grab the printout.";
move printout to player;
return true;
} else if (self hasnt general && noun == 'jtitor') {
give self general;
"The system accepts the username, and prompts you for a password.";
} else {
give self locked ~general;
print "The computer pauses ominously, and then responds:^";
font off;
print "LOGIN INCORRECT^";
font on;
"It prompts you once more for a username.";
}
} else {
"Your upload is still running, and will clean up after itself when it is finished. It's best to leave this terminal alone for now and get on with the rest of your checklist.";
}
}
],
instructions [;
"To log into this system, you'll need to ", (ul) "type", " a username in, and then do the same for the password. For example:^^",
(bf) "> ", (ul) "type spacehobo into ", (unm) self;
],
has static reactive lockable locked;
Object printout "Printout"
with
name 'printout' 'print' 'out' 'schematics' 'plans' 'titor^s' 'titor' 'results',
description "This is the printout from the VT242 terminal; you must escape with this.",
After [;
Take: Achieved(GET_TITOR_PLANS);
Drop: Forfeit(GET_TITOR_PLANS);
],
;
!=============HALLWAY6(~~~~~~~~~~PLACEHOLDER)=======================
Object Hallway6 "Hallway"
with
description [;
print "This is a hallway that extends to the north and to the south. To the east there is a closet. A row of uninteresting filing cabinets lines the west wall. ";
if (glass has locked){
print "The entire west wall is thick, tempered glass; it stands between you and ";
}
else{
print "The west wall used to be glass, but you shattered it. ";
if (plant in leave){
print "Amongst the shards of glass are broken bits of the terracotta pot, as well as a mound of dirt with a plant sadly laying on its side. ";
}
print "The way is now open to ";
}
print "a laboratory packed with futuristic-looking equipment. A biometric authentication system is embedded into the glass wall. It is connected to a large, sliding glass door leading west into the lab.";
],
cheap_scenery
'retina' 'scanner' "You peer into the retina scanner. A laser sweeps across your eye. Instantly, the scanner beeps disapprovingly, and the indicator on it flashes red several times. Red text appears on a screen: ~YOU ARE NOT JOHN TITOR THIS LOGIN ATTEMPT WILL BE REPORTED.~"
'eyepiece' 'eye' "You peer into the retina scanner. A laser sweeps across your eye. Instantly, the scanner beeps disapprovingly, and the indicator on it flashes red several times. Red text appears on a screen: ~YOU ARE NOT JOHN TITOR THIS LOGIN ATTEMPT WILL BE REPORTED.~"
'voiceprint' 'microphone' "This system appears to be designed to recognize certain individuals' voices when they speak into the microphone."
'handprint' 'recognizer' [;
Examine: "The handprint recognizer looks like something from a 1990s spy movie. An angled bezel sticks out from the wall with the outline of a hand illuminated by a pulsating orange grid pattern.";
Touch: print_ret (string) handfail;
],
before [;
ThrowAt:
if (noun has heavy){
if (second==glass){
if(glass has open){
print "The glass has already been shattered!";
rtrue;
}
else{
give glass open ~locked;
print "You shatter the glass wall, creating an opening to the next room!";
if(noun==plant){
print " The plant pot breaks with a shower of dirt flying into the air. The plant pot is totally destroyed!";
move plant to leave;
} else {
move noun to location;
}
rtrue;
}
}
}
],
s_to Hallway7,
n_to Hallway5,
e_to ITcloset,
w_to [;
if (glass has locked)
"The huge locked glass wall bars the way!";
else {
print "You pick your way carefully through the giant shards of glass...^";
PlayerTo(Office6);
rtrue;
}
],
instructions [;
"That glass wall looks awfully expensive. It would be a shame if something were to happen to it.";
],
has light;
Object -> glass "glass wall"
with
name 'glass' 'wall' 'door',
description "A heavy-duty, sliding glass door sits on a track recessed into the floor and ceiling. A piston connected to the biometric tower appears to control the door's movement. The door looks very sturdy.",
door_dir (w_to) (e_to),
found_in Hallway6 Office6,
before [;
Unlock,Attack:
if (second == 0) {
"What with? Your bare hands?";
} else if (second has heavy) {
give self open ~locked;
move second to location;
"You shatter the glass wall, creating an opening to the next room!";
} else {
"You can't break the glass with something that light. Why not find something heavier?";
}
],
has static door openable ~open lockable locked concealed;
Object -> biometric "Biometric Tower"
with
name 'biometric' 'tower',
description "This intimidating-looking tower of biometric scanners is securely integrated into the west wall, which is one large piece of glass. The tower is linked to the actuator, which moves the sliding glass door that separates this hallway and the office to the west. At the top of the tower is a retina scanner with an eyepiece to peer into. Below that is a voiceprint system with a microphone jutting out from it. Below the voiceprint device is a handprint recognizer.",
before [;
! FIXME -- see Issue #55 about how this should really work. This feels super hacky.
Touch: print_ret (string) handfail;
TalkTo:
print_ret (string) voxfail;
],
life [;
Answer: print_ret (string) voxfail;
],
has static animate;
!=============OFFICE6(GLASS OFFICE)===========================
Object Office6 "Laboratory"
with
description "This is a laboratory packed with futuristic and delicate-looking equipment. The east wall used to be thick glass, but you shattered it, opening it to the hallway. An expensive biometric authentication system is embedded into the glass wall, along with a mechanism to open and close the door, but you have rendered that completely pointless.",
e_to [;
if (glass has locked) {
give glass ~locked;
print "The motion sensing door opens, letting you into the hallway.";
PlayerTo(Hallway6);
print "The door closes behind you.";
give glass locked;
rtrue;
} else {
print "You carefully step around piles of broken glass and into the hallway.^";
PlayerTo(Hallway6);
rtrue;
}
],
has light;
Object -> IBM5100 "IBM 5100"
with
name 'IBM' 'IBM5100' '5100',
description [;
if(self has moved) {
"This is an IBM 5100, a strange-looking suitcase-sized computer from the 1970s. One of its short sides sprouts a panel of buttons, a tiny monochrome CRT display (showing nothing), a mechanical keyboard, and a slot for a tape cartridge. At 55 pounds and with no handle, it's extremely cumbersome to carry around. A number of strangely frayed and pulsating multicolored wires dangle from various holes drilled in the case.";
} else {
"The IBM 5100 is a strange-looking suitcase-sized computer from the 1970s. One of its short sides sprouts a panel of buttons, a tiny monochrome CRT display, a mechanical keyboard, and a slot for a tape cartridge. It is clearly designed to be a 'portable computer', but at 55 pounds and with no handle, it's unlikely anyone threw this computer in a backpack on a daily basis. You happen to know that this computer was originally able to run programs in the BASIC and APL language, and was especially useful for debugging certain kinds of systems. However, this IBM 5100 has clearly been significantly modified; strange glyphs appear and disappear on the display along with dates and headlines from news outlets. Multicolored glowing wires run from various holes drilled into this 5100's case to the esoteric and futuristic-looking equipment in this room. The wires look like they would disconnect themselves if you picked up the computer.";
}
],
before [;
Take, Transfer:
if (heavyLimit(self)){
rtrue;
}
],
After [;
Take: Achieved(GET_IBM5100);
Drop: Forfeit(GET_IBM5100);
],
has heavy;
!==================UTILITY CLOSET===================
Object Utility "The Utility Closet"
with
description "This is a small utility closet containing cleaning supplies, a mop, a mop bucket, and other things. It's damp and musty in here.",
cheap_scenery
'mop' 'mop' "This is one of those old-school mops with a head made from large, gray, cotton, yarn-like strings. It smells faintly of mildew and Pine-Sol. It's hard to imagine how this gross mop could be useful."
'bucket' 'bucket' "A rolling mop bucket with a built-in mop-squeezer. Embossed on the bucket is a unintentionally comical stick figure of a person slipping on a puddle. It stinks."
'cleaning' 'supplies' "This small plastic caddy has an assortment of things people would use to clean the office."
'other' 'things' "Oh, you know, it's just a random assortment of random rags, OSHA signs, and other useless stuff.",
e_to Hallway2,
has light;
Object -> ladder "ladder"
with
name 'sunflower' 'yellow' 'ladder',
description "This ladder is a bright sunflower yellow ladder. It must be used to replace the lights if they burn out, without this accessing the ceiling would be impossible.",
instructions [;
"Ladders are very straightforward devices.
All you need to do is type ", (ul) "climb ", (unm) self;
],
before [;
Take, Transfer:
if (heavyLimit(self)){
rtrue;
}
rfalse;
],
has bulky heavy scored;
!=============HALLWAY5(~~~~~PLACEHOLDER~~~~~)=======================
Object Hallway5 "Hallway"
with
description "This is a hallway that extends to the east and to the south. There is an office to the west. To the north there is another office, which is open. Along the east wall, there is a poster which depicts a sad kitten wearing a suit.",
cheap_scenery
'door' 'door' [;
Unlock: "You fail to unlock the door.";
default: "The door to the west office is locked. Maybe you could find a key or an alternate way in.";
]
'poster' 'kitten poster' [;
Take: "Unfortunately, simply taking down the poster will not spare the kitten. You decide to leave business-kitten to its fate.";
default: "The poster depicts an especially sad-looking kitten wearing a business suit with a tie, clinging helplessly to a branch. The poster is captioned with the words 'Hang In There!'.";
],
s_to Hallway6,
e_to Hallway4,
cant_go "This door is locked. Maybe you could find a key or an alternate way in.",
n_to Office4,
has light;
[InventoryLimit bulk_response weight_response x;
objectloop (x in player) {
if (x has bulky) {
print_ret (string) bulk_response, " while carrying ", (the) x, "!";
} else if (x has heavy) {
print_ret (string) weight_response, " while carrying ", (the) x, "!";
}
}
rfalse;
];
[UseLadder noun destination;
if(noun==ladder ||
(selected_direction==u_to && ladder in player or self)){
print "You climb up the ladder.";
if(ladder in player){
print " However you had to leave it behind.^";
<Drop ladder>;
}
if (InventoryLimit("You couldn't possibly fit up there", "The structured ceiling couldn't possibly support your weight up there")) {
"You climb back down.";
}
@new_line;
PlayerTo(destination);
rtrue;
}
];
[heavyLimit noun x;
if (noun in player) {
! Don't bother with this logic if they're already holding it.
return false;
}
objectloop (x in player){
if (x has heavy){
print (the) noun, " is too heavy to pick up while ", (the) x, " is in your inventory!";
return true;
}
}
return false;
];
!==================SPARE OFFICE====================
Object Office4 "The Unused Office"
with
description "This room is a small office; set in the middle is a wooden desk, devoid of any identifying objects. One of the ceiling panels seems to be missing in here. Along the east wall there is a tarp laying on the floor, partially laying against the wall next to two cans of paint. The east wall seems to be still unpainted.",
before [;
Climb: return UseLadder(noun, Crawl1);
],
u_to [;
if(ladder in player or self){
<<Climb ladder>>;
}
"You cannot get up there, if only you had a some sort of step stool.^";
],
instructions [;
"I bet I could get into the office to the west through the ceiling here!";
],
s_to Hallway5,
has light;
Object -> tarp "Tarp"
with
name 'tarp' 'tarpaulin' 'PET' 'polyethylene',
description "This is a blue polyethylene tarp, the craftsmanship of which is clearly of the highest quality. On it are spatterings of off-white paint.",
before[;
Take, Transfer:
! This checks to see if player has lifted the tarp at all.
! It can probably be simplified to "flatHead hasnt concealed"
if (flatHead hasnt concealed) {
print "While the tarp certainly is of the highest quality, you see no point in keeping it around.";
return 1;
}
else {
print "As you fold up and take the tarp you notice underneath it there was a flathead screwdriver!";
give flatHead ~concealed;
return 1;
}
],
instructions "Tarpaulins are generally only useful for covering other things.";
Object -> flatHead "Flathead"
with
name 'flathead' 'flat' 'head' 'screwdriver',
description "This is a flathead screwdriver with a bright red handle. Judging by the dried flecks of paint on it, it was likely once used to open cans of paint. On the handle is an inscription that reads, ''NOT TO BE REMOVED FROM FLOOD CONTROL DAM #3''",
instructions [;
print "You can use this screwdriver with the ",
(ul) "screw", " and ", (ul) "unscrew", " verbs.
Just as an example:^^",
(bf) "> ", (ul) "screw countersunk unobtanium screws with ", (unm) self;
],
has concealed scored;
!===================CRAWL SPACE ENTRANCE=====================
Object Crawl1 "Crawl Space"
with
description "You climb up into a small crawl space above the ceiling, there are electrical wires running everywhere however it appears as if the wall to the west does not extend up into this space!",
w_to Crawl2,
d_to Office4,
has scored;
!================CRAWL SPACE ABOVE BOSS'S OFFICE =====================
Object Crawl2 "Above April's Office Crawl Space"
with
description "This area seems like it would be directly above April's office.",
d_to Office5,
e_to Crawl1;
!==================OFFICE5(APRIL'S OFFICE)=========================
Object Office5 "April's Office"
with
description "April's office has a large wooden desk with a computer on it. On the desk there is a name plate that says APRIL. There is a door to the east leading back to the hallway.",
e_to Hallway5,
before [;
Climb: UseLadder(noun, Crawl2);
],
u_to [;
if(ladder in player or self){
<<Climb ladder>>;
}
"You cannot get up there, if only you had a some sort of step stool.^";
],
has light;
Object -> desk "Desk"
with
name 'wood' 'wooden' 'desk',
description "This is a desk",
has static supporter;
Object -> -> computer "April's Computer"
with
name 'April' 'April^s' 'computer',
description "This is April's computer, this is what you came to take.",
after [;
Take: Achieved(GET_APRIL_COMPUTER);
Drop: Forfeit(GET_APRIL_COMPUTER);
],
has bulky proper;
!=============HALLWAY4(~~~~~~~~~PLACEHOLDER~~~~~~)===================
Object Hallway4 "Hallway"
with
description "This is a hallway that extends to the east and to the west. To the north is an office. To the south is a kitchenette. The hallway is barren except for a lone empty water dispenser.",
cheap_scenery
'water' 'water dispenser' "The water dispenser sits there, idle, empty and useless."
'hinges' 'hinge' [;
Examine: "These hinges bind the door to the wall by four pins going through the entire assembly. Maybe you could remove the pins if you had something with a flat end to push them out.";
Remove:
if(second==flathead){
print "You remove the pins from the hinges of the door! The door falls forward with a loud *THUD* echoing through the halls...";
give Office3Door open;
give Office3Door concealed;
return true;
}
else{
print "You try that, but it doesn't seem to work. Maybe you need something like a chisel.";
return true;
};
default: "I am not sure what you want me to do.";
]
'pins' 'pin' [;
Examine: "These pins were hammered into place while someone held the door up. This is how most doors are attached to walls, it seems this door just so happens to have them on the exterior of the office.";
Take,Remove:
if(second==flathead){
print "You remove the pins from the hinges of the door! The door falls forward with a loud *THUD* echoing through the halls...";
give Office3Door open;
return true;
}
else{
print "You try that, but it doesn't seem to work. Maybe you need something like a chisel.";
return true;
};
! default: "I am not sure what you want me to do.";
],
w_to Hallway5,
e_to Hallway3,
s_to Kitchenette,
n_to Office3Door,
has light;
!============OFFICE3(LEN'S OFFICE)==============================
Object Office3 "Len's Office"
with
name 'Office',
description "This is an office. To the south there is a door leading back to the hallway.",
before [;
Look:
if(noun==Office3){
print "This is an office. To the south there is a door leading back to the hallway.";
return 0;
}
Insert:
if(noun==usbDrive && second == linuxBootComputer){
print "You insert the USB drive into the open port on the back of the computer.";
move usbDrive to linuxBootComputer;
return 1;
}
],
instructions [;
"The data on this computer is not encrypted. If I boot an OS from an external drive, I should still be able to access the data.";
],
s_to Hallway4,
has light;
Object -> linuxBootComputer "Len's Computer"
with
name 'Len' 'Len^s' 'computer' 'port',
description [;
print "This computer is bolted down to the floor. The case is entirely sealed and locked save for 3 cables coming out of the back. One running to the monitor, one for a keyboard, and one for a mouse. There is an additional USB port that is currently ";