-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcarpathian-vampire.inf
3540 lines (3351 loc) · 107 KB
/
carpathian-vampire.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
!% -~S
!% $OMIT_UNUSED_ROUTINES=1
!% $ZCODE_LESS_DICT_DATA=1
!========================================
! Carpathian Vampire
! Copyright © 2022 Garry Francis
!========================================
!Constant DEBUG;
Constant Story "Carpathian Vampire";
#Ifv5;
Zcharacter table + '@{A9}'; !Add copyright symbol
Constant Headline "^Copyright @{A9} 2022 Garry Francis^Type ABOUT for further info and credits.^^";
#Ifnot;
Constant Headline "^Copyright (c) 2022 Garry Francis^Type ABOUT for further info and credits.^^";
#Endif;
Array UUID_ARRAY string "UUID://e8fac5e8-4c9a-46e8-b520-b687867ed116//";
#Ifdef UUID_ARRAY;
#Endif;
Release 1;
Serial "220501";
! Inform 6 constants
Constant DEATH_MENTION_UNDO;
Constant MAX_CARRIED 8;
Constant MAX_SCORE 100;
Constant OBJECT_SCORE 5;
Constant ROOM_SCORE 10;
Replace LockSub;
Replace UnlockSub;
! PunyInform constants
Constant MSG_ATTACK_DEFAULT "Save your strength for the vampire.";
Constant MSG_BURN_DEFAULT "Have you taken leave of your senses?";
Constant MSG_JUMP "You jump on the spot to try and warm up. It doesn't work. You're still cold.";
Constant MSG_LISTEN_DEFAULT "All is quiet.";
Constant MSG_PARSER_NO_INPUT "You need to enter a command.";
Constant MSG_PARSER_UNKNOWN_VERB "That's not a verb I recognise.";
Constant MSG_PRAY_DEFAULT "You pray that you can get out of this predicament safely.";
Constant MSG_SING_DEFAULT "You sing a Romanian ballad about the terror of the strigoi.";
Constant MSG_SORRY_DEFAULT "Oh, don't apologise.";
Constant MSG_SWIM_DEFAULT "Swimming requires water. Take a look around. Do you see any water here?";
Constant MSG_TAKE_YOURSELF "That would be a clever trick.";
Constant MSG_THINK_DEFAULT "You can't think of anything helpful at the moment.";
Constant MSG_INVENTORY_DEFAULT 1000;
Constant MSG_TAKE_NO_CAPACITY 1001;
Constant MSG_PUSH_SCENERY 1002;
Constant MSG_PULL_SCENERY 1002;
Constant MSG_TURN_SCENERY 1002;
Constant OPTIONAL_EXTENDED_METAVERBS;
Constant OPTIONAL_EXTENDED_VERBSET;
#Ifv5;
Constant OPTIONAL_PROVIDE_UNDO;
#Endif;
Constant OPTIONAL_SCORED;
! Game-specific constants
Constant MAX_TUTORIAL 34;
Constant TUT_ENTER_START 0;
Constant TUT_AUTO1 1;
Constant TUT_AUTO2 2;
Constant TUT_AUTO3 3;
Constant TUT_AUTO4 4;
Constant TUT_INVENTORY 5;
Constant TUT_EXAMINE_SUIT 6;
Constant TUT_EXAMINE_POCKET 7;
Constant TUT_EXAMINE_NOTEBOOK_IN_POCKET 8;
Constant TUT_TAKE_NOTEBOOK_FROM_POCKET 9;
Constant TUT_EXAMINE_NOTEBOOK 10;
Constant TUT_READ_NOTEBOOK 11;
Constant TUT_DROP_NOTEBOOK 12;
Constant TUT_TAKE_NOTEBOOK 13;
Constant TUT_PUT_NOTEBOOK_IN_POCKET 14;
Constant TUT_CANT_GO 15;
Constant TUT_EXAMINE_DOOR 16;
Constant TUT_OPEN_DOOR 17;
Constant TUT_EXAMINE_WINDOW 18;
Constant TUT_EXAMINE_LOFT 19;
Constant TUT_TAKE_LADDER 20;
Constant TUT_ENTER_ROOM01 21;
Constant TUT_DROP_LADDER 22;
Constant TUT_ENTER_ROOM02 23;
Constant TUT_ENTER_ROOM04 24;
Constant TUT_OPEN_LOCKED_DOOR 25;
Constant TUT_ENTER_ROOM05 26;
Constant TUT_EXAMINE_BED 27;
Constant TUT_OPEN_LOCKED_CUPBOARD 28;
Constant TUT_OPEN_CUPBOARD 29;
Constant TUT_MATCH_EXTINGUISHED 30;
Constant TUT_CANDLE_EXTINGUISHED 31;
Constant TUT_ENTER_DARK 32;
Constant TUT_INVENTORY_FULL 33;
Include "globals.h";
Array tutorial_used -> MAX_TUTORIAL;
Global tutorial = true;
Global tutorial_shown = false;
Property size 100;
!========================================
! Entry point routines
!========================================
[ ChooseObjects obj code;
if (code == 2)
{
! Stage 1: Disambiguation
if (action_to_be == ##Take && obj notin player)
return 1; !Appropriate
if (action_to_be == ##Drop && obj in player && obj hasnt worn)
return 1; !Appropriate
return 0; !Inappropriate
}
! Stage 2: Processing an "all"
if (obj has scenery or concealed or static or animate)
return 2; !Force exclusion
if (action_to_be == ##Take && obj in location && obj ~= player)
return 1; !Force inclusion
if (action_to_be == ##Drop && obj in player && obj hasnt worn)
return 1; !Force inclusion
return 0; !Accept parser's decision
];
[ InScope person i;
if (person == player && location == thedark)
objectloop(i in parent(player))
if (i has moved)
PlaceInScope(i);
rfalse;
];
[ LibraryMessages p_msg p_arg_1 p_arg_2;
switch (p_msg)
{
MSG_INVENTORY_DEFAULT:
p_arg_1 = "You're carrying ";
if (inventory_style == 0)
{
p_arg_1 = "You're carrying:";
p_arg_2 = NEWLINE_BIT;
}
if (PrintContents(p_arg_1, player, p_arg_2))
{
if (inventory_style)
print (char) '.';
new_line;
ShowTutorial(TUT_INVENTORY);
rtrue;
}
rfalse;
MSG_TAKE_NO_CAPACITY:
print "Your hands are full.^";
ShowTutorial(TUT_INVENTORY_FULL);
rtrue;
MSG_PUSH_SCENERY, MSG_PULL_SCENERY, MSG_TURN_SCENERY:
print_ret (CTheyreOrThats) noun, " fixed in place.";
}
];
[ LookRoutine;
if (location has visited)
return;
if (location == room13)
"^Your nostrils are accosted by a foul smell.";
if (~~tutorial)
return;
if (location == room01)
ShowTutorial(TUT_ENTER_START);
else if (location == room02)
ShowTutorial(TUT_ENTER_ROOM02);
else if (location == room04)
ShowTutorial(TUT_ENTER_ROOM04);
else if (location == room05)
ShowTutorial(TUT_ENTER_ROOM05);
else if (location == thedark)
ShowTutorial(TUT_ENTER_DARK);
return;
];
Include "puny.h";
!========================================
! Initialisation
!========================================
[ Initialise;
inventory_style = 0;!Tall style
! inventory_style = 1;!Wide style
lookmode = 2;
move suit to player;
player.description = PlayerDescription;
StartDaemon(room01);
location = room01;
print "Deep in the Carpathian Mountains, the Romanian villagers tell tales of the strigoi. The strigoi are said to be troubled spirits that have risen from the grave. They are attributed with the abilities to transform into an animal, become invisible and to gain vitality from the blood of their victims.^^There have been recent reports of peasant children dying mysteriously in the local village. Their bodies had been drained of blood and they had puncture wounds in their necks. The villagers believe that a recently deceased count is responsible. They believe he's a strigoi. In Western culture, we would call him a vampire.^^The villagers have hired you to kill the vampire. After a long journey, you have arrived at the former count's castle. A cold shiver runs down your spine. Killing vampires is never easy. Why should this one be any different? But hurry. You don't want to be his next victim!^^";
print_ret (italic)"[You're about to embark on an adventure. You can move around, examine things and manipulate things by typing simple text commands of one or more words, usually starting with a verb. The tutorial will offer suggestions to get you started. Commands in the tutorial are shown in upper case, but you can enter them in lower case, if you prefer. You can turn the tutorial off by typing TUTORIAL OFF and turn it back on by typing TUTORIAL ON. Good luck.]^^[WARNING: This game contains mild horror and violence. Do not play if you would find this disturbing.]^";
];
!========================================
! Room 1: Outside Castle
!========================================
Object room01 "Outside Castle"
with
description "You're standing outside the count's castle. The imposing front door of the castle is to the north and a stable is to the east. You notice an open window above the door, but it's out of reach.",
n_to
[;
PrintMsg(MSG_ENTER_NOT_OPEN, front_door);
ShowTutorial(TUT_EXAMINE_DOOR);
rtrue;
],
s_to
[;
print "You only just got here. You can't leave until you kill the vampire.^";
ShowTutorial(TUT_CANT_GO);
rtrue;
],
e_to
[;
if (tutorial && tutorial_used->TUT_AUTO3 == 0)
{
print "Not just yet...^";
ShowTutorial(TUT_AUTO3);
rtrue;
}
else
return room02;
],
w_to
[;
<<Go FAKE_S_OBJ>>;
],
u_to
[;
if (ladder in room01)
{
print "You climb the ladder and scramble through the open window. It's a long drop to the floor below, so you won't be able to get back through the window.^^";
return room04;
}
],
in_to
[;
<<Go FAKE_E_OBJ>>;
],
before
[;
Hint:
if (ladder in location)
"Out of reach?^Don't get madder^Use your brain^Climb the ladder";
if (ladder in player)
"See the ladder^It is tall^Drop it now^Climb the wall";
"Enter castle^If you're able^If you can't^Try the stable";
Smell:
if (noun == nothing)
"There's a hint of fragrant wild orchids in the air.";
],
daemon
[;
if (action == ##Help or ##Hint)
return;
if (tutorial)
{
if (tutorial_shown == 0)
ShowTutorial(TUT_AUTO1);
if (tutorial_shown == 0)
ShowTutorial(TUT_AUTO2);
if (tutorial_shown == 0)
ShowTutorial(TUT_AUTO3);
if (tutorial_shown == 0)
ShowTutorial(TUT_AUTO4);
if (tutorial_shown)
tutorial_shown = 0;
}
if (location == room01 && random(5) == 1)
"^You hear a wolf howling in the distance.";
if (location ~= room01 or room02 or room03 && random(20) == 1)
switch (random(10))
{
1: "^You hear the rustling of a silk dress. You must be mistaken. It was probably the wind.";
2: "^You hear the soft sound of a lady's feet walking nearby.";
3: "^You feel something breathing on your neck, but when you spin around, there's nothing there.";
4: "^You hear something scuttle across the floor.";
5: "^You feel a cold gust of air.";
6: "^You thought you heard the flapping of wings nearby, but that can't be. You're indoors.";
7: "^A shadow seems to pass over you.";
8: "^You hear a faint voice whispering, ~Elga~.";
9: "^You feel like you're not alone.";
10: "^This castle gives you the creeps.";
}
],
has light;
!----------------------------------------
! Castle
!----------------------------------------
Object "castle" room01
with
name 'count^s' 'castle',
description "The count's castle is constructed of stone, but it's not as large as you expected. It has a Gothic feel, but with a distinctly Romanian influence, similar to the other castles you've seen in this part of the Carpathian Mountains.",
before
[;
Climb:
<<Go FAKE_U_OBJ>>;
Enter, Go:
<<Go FAKE_N_OBJ>>;
],
has enterable scenery;
!----------------------------------------
! Walls
!----------------------------------------
Object "walls"
with
parse_name
[ count;
count = 0;
while (NextWord() == 'wall' or 'walls//p' or 'stone' or 'block' or 'blocks//p')
count++;
return count;
],
description "The walls are made of large stone blocks and are cold to the touch.",
before
[;
Climb:
"The walls are quite smooth and slippery. It's too hard to get a foothold.";
Touch:
"The walls are cold.";
],
found_in
[;
rtrue;
],
has pluralname scenery;
!----------------------------------------
! Front door
!----------------------------------------
Object front_door "front door"
with
parse_name
[ count;
count = 0;
while (NextWord() == 'front' or 'door' or 'wood' or 'wooden' or 'band' or 'bands//p' or 'iron' or 'hinge' or 'hinges//p')
count++;
return count;
],
description
[;
print "The front door is much larger than it needs to be. It's made of heavy wood strengthened by bands of iron and mounted on heavy iron hinges. The door is currently ";
if (self has open)
"open.";
print "closed.^";
if (location == room01)
ShowTutorial(TUT_EXAMINE_DOOR);
rtrue;
],
door_dir
[;
if (self in room01)
return n_to;
else
return s_to;
],
door_to
[;
if (self in room01)
return room04;
deadflag = 2;
score = score + 5;
"As you step out of the cold castle into the cold mountain air, you thank God that this vampire is vanquished. The local villagers can now resume a normal life without the fear of having the blood sucked out of them as they sleep at night. Your mission here is complete.^^You later find out that the portrait of Countess Elga was painted by the celebrated Austrian painter Hans Makart (1840-1884) and he went mad shortly after painting it. The countess had died after a horse riding accident and the count died shortly after. The mysterious deaths of the children in the village were explained as being the result of an epidemic, but that didn't explain the puncture wounds in their necks.^^Fortunately, the deaths ceased after you killed the vampire countess. If she was a strigoi, that would certainly explain the strange events in the castle, but you may never know for sure.";
],
before
[;
Attack:
"The door withstands your blows.";
Open:
if (self in room01)
{
PrintMsg(MSG_OPEN_LOCKED, self);
ShowTutorial(TUT_OPEN_DOOR);
rtrue;
}
if (self has locked)
{
PrintMsg(MSG_OPEN_LOCKED, self);
ShowTutorial(TUT_OPEN_LOCKED_DOOR);
rtrue;
}
Pull, Push:
"Try OPEN DOOR.";
Pry:
if (self has open)
"It's already open.";
if (self hasnt locked)
"The front door is unlocked. There's no need to pry it apart with anything, you can just open it.";
if (second == small_key)
"You can't pry the front door open with the large key. You'll need to unlock it first.";
"You can't pry the front door open with ", (ThatOrThose)second, ".";
],
after
[;
Unlock:
if (self hasnt general)
{
give self general;
score = score + 5;
}
],
with_key large_key,
found_in room01 room04,
has door lockable locked openable scenery;
!----------------------------------------
! Window
!----------------------------------------
Object "window" room01
with
name 'window',
description
[;
print "It looks decorative, rather than functional, but you reckon you could climb through it if you could reach it.^";
ShowTutorial(TUT_EXAMINE_WINDOW);
rtrue;
],
before
[;
Climb, Enter, Go:
if (ladder in location)
<<Go FAKE_U_OBJ>>;
print "It's out of reach.^";
ShowTutorial(TUT_EXAMINE_WINDOW);
rtrue;
],
has enterable scenery;
!----------------------------------------
! Stable
!----------------------------------------
Object "stable" room01
with
name 'castle^s' 'stable',
description "You can only see that it's a stone building. You can enter the stable if you want to see what's inside.",
before
[;
Enter, Go:
<<Go FAKE_E_OBJ>>;
],
has scenery;
!----------------------------------------
! Cheap suit
!----------------------------------------
Object suit "cheap suit"
with
name 'cheap' 'suit',
description
[;
print "It's a cheap suit that you bought in one of the local villages. It's warm and sturdy. ";
<<Search self>>;
],
! invent
! [;
! if (inventory_stage == 2 && children(self) == 0)
! {
! print " (worn)";
! rtrue;
! }
! ],
before
[;
Disrobe:
"Don't be silly. It's freezing.";
Receive:
"You can't put anything on the coat.";
Search:
if (pocket in nothing)
move pocket to self;
PrintMsg(MSG_SEARCH_ON_IT_ISARE);
ShowTutorial(TUT_EXAMINE_SUIT);
rtrue;
],
has clothing supporter worn;
!----------------------------------------
! Pocket
!----------------------------------------
Object pocket "breast pocket"
with
name 'breast' 'pocket',
description
[;
<<Search self>>;
],
invent
[;
if (inventory_stage == 2)
{
if (action == ##Inv && inventory_style == 0)
PrintContents(0, self);
else if (PrintContents(" (which contains ", self))
print ")";
rtrue;
}
],
before
[;
Receive:
if (noun.size > self.size)
print_ret (The)noun, " won't fit in the pocket.";
Search:
if (notebook in nothing)
move notebook to self;
if (children(self) == 0)
PrintMsg(MSG_SEARCH_EMPTY);
else
PrintMsg(MSG_SEARCH_IN_IT_ISARE);
ShowTutorial(TUT_EXAMINE_POCKET);
rtrue;
Take:
"That's attached to the suit. You would need a pair of scissors to cut it off, but then you wouldn't have a pocket any more.";
],
after
[;
LetGo:
PrintMsg(MSG_TAKE_DEFAULT);
ShowTutorial(TUT_TAKE_NOTEBOOK_FROM_POCKET);
rtrue;
Receive:
PrintMsg(MSG_INSERT_DEFAULT);
ShowTutorial(TUT_PUT_NOTEBOOK_IN_POCKET);
rtrue;
],
size 5,
has container open static;
!----------------------------------------
! Notebook
!----------------------------------------
Object notebook "notebook" !pocket
with
name 'notebook',
description
[;
if (self in pocket)
{
print "It's a bit hard to see while it's in your pocket.^";
ShowTutorial(TUT_EXAMINE_NOTEBOOK_IN_POCKET);
rtrue;
}
print "It's a tattered notebook that you use to keep all your research notes regarding vampires and the occult. You've read it many times, but it never hurts to read it again to refresh your memory.^";
ShowTutorial(TUT_EXAMINE_NOTEBOOK);
rtrue;
],
before
[;
Open:
if (self in pocket)
{
print "It's a bit hard to open while it's in your pocket.^";
ShowTutorial(TUT_EXAMINE_NOTEBOOK_IN_POCKET);
rtrue;
}
<<Read self>>;
Read:
if (self in pocket)
{
print "It's a bit hard to read while it's in your pocket.^";
ShowTutorial(TUT_EXAMINE_NOTEBOOK_IN_POCKET);
rtrue;
}
print "You turn to the most relevant entry for the current situation. 'The most effective way to repel a vampire is with garlic and religious artifacts, such as a crucifix. The most effective way to kill a vampire is to drive a stake through its heart.'^";
ShowTutorial(TUT_READ_NOTEBOOK);
rtrue;
],
after
[;
Drop:
PrintMsg(MSG_DROP_DROPPED);
ShowTutorial(TUT_DROP_NOTEBOOK);
rtrue;
Take:
PrintMsg(MSG_TAKE_DEFAULT);
ShowTutorial(TUT_TAKE_NOTEBOOK);
rtrue;
],
size 3,
has;
!========================================
! Room 2: Stable
!========================================
Object room02 "Stable"
with
description
[;
print "You're in the castle's stable. The walls are made of stone, the same as the castle, but the fittings inside the stable are made of wood. There's a hay loft overhead";
if (ladder in self)
print " which you can reach by climbing the ladder.";
else
print ", but you can't reach it because the ladder is missing.";
" Sunlight filters in from the exit to the west.";
],
w_to
[;
PlayerTo(room01, 0);
ShowTutorial(TUT_ENTER_ROOM01);
rtrue;
],
u_to
[;
if (ladder in self)
return room03;
"You can't go that way because the ladder is missing.";
],
out_to
[;
<<Go FAKE_W_OBJ>>;
],
before
[;
Hint:
if (ladder hasnt moved)
"Look at all^Do a scan^Take the ladder^If you can";
if (ladder in player)
"See the ladder^It is tall^Take it now^To the wall";
Smell:
if (noun == nothing)
"There's a faint smell of horse manure, even though there's no longer any horses here.";
],
has light;
!----------------------------------------
! Stable
!----------------------------------------
Object "stable" room02
with
name 'castle^s' 'stable',
description "The only thing of significance in the stable is the carriage.",
before
[;
Exit:
<<Go FAKE_W_OBJ>>;
],
has scenery;
!----------------------------------------
! Hay loft
!----------------------------------------
Object "hay loft" room02
with
name 'hay' 'loft',
description
[;
print "You can't see what's up there from down here.^";
ShowTutorial(TUT_EXAMINE_LOFT);
rtrue;
],
has scenery;
!----------------------------------------
! Wooden fittings
!----------------------------------------
Object "wooden fittings" room02
with
name 'wood' 'wooden' 'fitting' 'fittings//p',
has scenery;
!----------------------------------------
! Sunlight
!----------------------------------------
Object "sunlight" room02
with
name 'sunlight' 'exit',
description "The sunlight streams in through the stable exit to the west.",
has scenery;
!----------------------------------------
! Carriage
!----------------------------------------
Object "carriage" room02
with
name 'carriage' 'coach' 'cart',
description "This is a stately carriage in dark bottle green livery with gold trim and a coat of arms. A carriage identical to this was recently reported driving through the streets of the local village at night. It was drawn by two ghostly black horses with no driver.",
before
[;
Enter:
"You get into the carriage and can't find anything useful, so you get out again. The carriage isn't going anywhere without any horses to draw it.";
Pull, Push, Turn:
"It won't budge without any horses.";
Take:
"You would need a couple of horses to draw the carriage, but there is no sign of any horses in the stable.";
],
has static;
!----------------------------------------
! Coat of arms
!----------------------------------------
Object "coat of arms" room02
with
parse_name
[ nw count;
nw = NextWord();
if (nw == 'coat')
if (NextWord() == 'of' && NextWord() == 'arms//p')
return 3;
else
return 1;
if (nw == 'arms//p')
return 1;
count = 0;
while (nw == 'bottle' or 'green' or 'family' or 'crest' or 'livery')
{
count++;
nw = NextWord();
}
return count;
],
description "You recognise it as the family crest of the deceased count.",
has scenery;
!----------------------------------------
! Horses
!----------------------------------------
Object "horses" room02
with
name 'horse' 'horses//p',
description "It doen't look like there have been any horses here since the count died.",
has pluralname scenery;
!----------------------------------------
! Ladder
!----------------------------------------
Object ladder "ladder" room02
with
name 'ladder',
description
[;
print "It's a portable wooden ladder about three metres long.";
if (self in room01)
" The ladder leads up to the window over the front door of the castle.";
if (self in room02)
" The ladder leads up to the hay loft.";
"";
],
before
[;
Climb, Enter, Go:
if (ladder in player)
"You can't very well climb the ladder while you're holding it.";
if (ladder in room01 or room02)
<<Go FAKE_U_OBJ>>;
],
after
[;
Drop:
if (location == room01)
{
print "You lean the ladder against the castle wall. If you climb it, you should be able to reach the open window over the front door.^";
ShowTutorial(TUT_DROP_LADDER);
rtrue;
}
if (location == room02)
"You put the ladder back against the hay loft where it belongs. If you climb it, you can reach the hay loft.";
Take:
PrintMsg(MSG_TAKE_DEFAULT);
ShowTutorial(TUT_TAKE_LADDER);
rtrue;
],
size 14,
has;
!========================================
! Room 3: Hay Loft
!========================================
Object room03 "Hay Loft"
with
description "This is the hay loft above the stable. There's no longer any hay here. The only exit is back down the ladder.",
d_to room02,
before
[;
Hint:
"Loft is clear^No more hay^Come again^Another day";
Smell:
if (noun == nothing)
"There's a musty smell of hay, even though there's no longer any hay here.";
],
has light;
!----------------------------------------
! Hay loft
!----------------------------------------
Object "hay loft" room03
with
name 'hay' 'loft',
description "This is where the hay was stored for feeding the horses. There's no longer any hay here, as there's no longer any horses in the stable.",
has scenery;
!----------------------------------------
! Stable
!----------------------------------------
Object "stable" room03
with
name 'castle^s' 'stable',
description "You can't see much of the stable from up here.",
has scenery;
!----------------------------------------
! Ladder
!----------------------------------------
Object "ladder" room03
with
name 'ladder' 'exit',
description "It leads back down to the stable.",
before
[;
Climb, Enter, Go:
<<Go FAKE_D_OBJ>>;
],
has scenery;
!----------------------------------------
! Horses
!----------------------------------------
Object "horses" room03
with
name 'horse' 'horses//p',
description "There are no horses here, as horses can't climb ladders.",
has pluralname scenery;
!========================================
! Room 4: Lobby
!========================================
Object room04 "Lobby"
with
description "You're in the lobby of the castle. It's very cold. You see a passageway extending to the north and the front door of the castle to the south. There's an open window above the door, but it's out of reach.",
n_to room05,
s_to front_door,
out_to front_door,
before
[;
Hint:
if (front_door has locked)
"Unlock door^With the key^Pull it open^To be free";
"Leave the castle^Why the wait?^Leave here now^To your fate";
],
has light scored;
!----------------------------------------
! Lobby
!----------------------------------------
Object "lobby" room04
with
name 'lobby',
description "This is where the count would have greeted his guests. There are no furnishings apart from the mirror frame mounted on the east wall.",
has scenery;
!----------------------------------------
! Window
!----------------------------------------
Object "window" room04
with
name 'window',
description "That's the window you used to enter the lobby. You would need another ladder to reach it.",
before
[;
Climb, Enter, Go:
"It's out of reach.";
],
has scenery;
!----------------------------------------
! Passageway
!----------------------------------------
Object "passageway"
with
parse_name
[ count;
count = 0;
while (NextWord() == 'passage' or 'passageway' or 'corridor' or 'hall' or 'hallway')
count++;
return count;
],
description
[;
print "This is the main corridor of the castle. It extends towards the ";
if (location == room04)
"north.";
if (location == room08)
"south.";
"north and south.";
],
found_in room04 room05 room08,
has scenery;
!----------------------------------------
! Mirror frame
!----------------------------------------
Object "mirror frame" room04
with
name 'mirror' 'frame',
initial "There's a mirror frame mounted on the wall.",
description "It's an ornately engraved oval frame that once held a mirror. Strangely, the mirror itself has been broken or removed and there's no sign of it left in the frame.",
before
[;
Pull, Push, Take, Transfer, Turn:
"It's firmly attached to the wall.";
],
has static;
!========================================
! Room 5: Passageway
!========================================
Object room05 "Passageway"
with
description "You're in the middle of a gloomy passageway. It continues to the north and south with exits to the east and west.",
n_to room08,
s_to room04,
e_to room07,
w_to room06,
before
[;
Hint:
if (portrait hasnt general)
"Examine painting^On the wall^Then try going^Down the hall";
if (lady hasnt general)
"Evil woman^Looks quite shady^Did you try^Talk to lady?";
],
has light;
!----------------------------------------
! Portrait
!----------------------------------------
Object portrait"life-sized portrait" room05
with
parse_name
[ count;
count = 0;
while (NextWord() == 'life-sized' or 'oil' or 'painting' or 'portrait' or 'picture')
count++;
return count;
],
initial "There's a life-sized portrait mounted on the wall.",
description
[;
give self general;
"It's an oil painting of a lady with a hook nose wearing a large, broad-brimmed hat and a fur coat with a high collar. You're mesmerised by her beauty and the evil expression in her eyes. After staring at the portrait for a short time, you could swear that she blinked at you. A cold shiver runs down your spine.";
],
before
[;
Pull, Push, Take, Transfer, Turn:
"It's firmly attached to the wall.";
Talk:
<<Talk lady>>;
],
has static;
!----------------------------------------
! Lady
!----------------------------------------
Object lady "lady" room05
with
parse_name
[ count;
count = 0;
while (NextWord() == 'countess' or 'contesa' or 'elga' or 'lady' or 'woman' or 'evil' or 'expression' or 'eye' or 'eyes//p')
count++;
return count;
],
description "She looks beautiful, yet evil at the same time.",
life
[;
Talk:
give self general;
"Paintings can't talk, but you could swear that the lady in the painting smiled at you.";
],
before
[;
Pull, Push, Take, Transfer, Turn:
"She's part of the portrait.";
],
has animate female scenery;
!----------------------------------------
! Nose
!----------------------------------------
Object "nose" room05
with
name 'hook' 'nose',
description "The lady in the portrait has a hooked nose, but that is common amongst the people in this part of Romania.",
before
[;
Pull, Push, Take, Transfer, Turn:
"That's part of the portrait.";
],
has scenery;
!----------------------------------------