include "Parser";
constant Story "CASTLE ADVENTURE^";
constant Headline "";
constant NO_SCORE;
replace PushSub;
replace WearSub;
replace DisrobeSub;
replace TakeSub;
replace DropSub;
include "VerbLib";
attribute oiled;
attribute indoors;
attribute seen_player_masked;
attribute seen_player_unmasked;
object AtGate "At Gate"
with description
"You are at the front of the castle. The door to the north is shut. A button is next to the door.",
e_to AtWindow, w_to Garden,
n_to "The door is locked from the inside.";
object -> Button "button"
with name "button",
has scenery;
object DoorF "door"
with name "door",
found_in AtGate Foyer,
has scenery;
object Garden "Garden"
with description
"There is a shed in the garden's west corner.",
w_to ToolShed, e_to AtGate;
object ToolShed "Tool Shed"
with description
"The shed is dark and cramped.",
e_to Garden;
object -> Oilcan "oilcan"
with name "oil",
describe "There is an oilcan here.";
object AtWindow "At Window"
with description
"A window in the castle wall. Paths lead north and west.",
n_to SideDoor, w_to AtGate;
object Window "window"
with name "window",
found_in AtWindow Armory,
has scenery;
object SideDoor "Side Door"
with description [;
if (Guard in SideDoor) {
"You are at the side entrance, a door to the west.^A guard blocks the door.";
} else {
"You are at the side entrance, a door to the west.";
}
],
s_to AtWindow,
w_to [;
if (Guard in SideDoor) {
"He won't let you near the door!";
} else if (DoorS has oiled) {
print "You enter the castle.";
Guard.timer = 1;
return Corridor;
} else {
"The door is rusted shut!";
}
];
object -> Guard "guard"
with name "guard",
timer,
has scenery;
object -> DoorS "door"
with name "door",
has scenery;
object Corridor "Corridor"
with description
"Halls lead in all directions.",
e_to [; "The guard is back. You can't exit that way now."; ],
n_to Treasury, s_to Armory, w_to Foyer,
has indoors;
object Treasury "Treasury"
with description
"The King's treasure -- what a magnificent sight!",
s_to Corridor,
has indoors;
object -> TreasureChest "treasure chest"
with name "chest",
describe "A heavy treasure chest is here!";
object Armory "Armory"
with description
"The door leads north. A window to the south is closed.",
n_to Corridor, s_to [;
if (Window hasnt oiled) "The window is rusted shut!";
if (TreasureChest in player) "The chest won't fit out the window!";
Guard.timer = 0; ! You successfully evaded the guards.
return AtWindow;
],
has indoors;
object -> Gloves "pair of gloves"
with name "gloves",
describe "A pair of gloves is here.",
has clothing;
object Foyer "Foyer"
with description
"Festive streamers adorn the front door to the south.",
s_to [;
if (TreasureChest notin player) "You forgot the treasure!";
if (DoorF hasnt oiled) "The door is rusted shut!";
! Actually leaving by the front door wins you the game.
if (Mask has moved) {
deadflag = 4;
"Congratulations! You have recovered the treasure!^
...But can you win without the mask?^";
} else {
deadflag = 5;
"Congratulations!";
}
], e_to Corridor,
has indoors;
object -> Mask "mask"
with name "mask",
describe "A mask is discarded nearby.",
has clothing;
[TalkToSub;
if (noun == Guard) "The guard grumbles.";
"Don't be silly!";
];
[OilSub;
if (Oilcan notin player) return L__M(##Miscellany, 38);
if (noun == Button) "Don't be silly!";
if (noun == Window && player in AtWindow) "It's too high to reach.";
if (noun == DoorF && player in AtGate) "It doesn't need oiling. It's locked.";
if (noun == DoorF && player in Foyer) {
if (Gloves hasnt worn) {
move Oilcan to location;
"The can slips from your oily hands!";
}
give DoorF oiled;
"Done.";
}
if (noun == DoorS && player in SideDoor) {
if (Guard in location) "He won't let you near the door!";
if (Gloves hasnt worn && DoorS has oiled) {
move Oilcan to location;
"The can slips from your oily hands!";
}
give DoorS oiled;
"Done.";
}
if (noun == Window && player in Armory) {
if (Gloves hasnt worn)
"The can slips from your oily hands!";
give Window oiled;
"Done.";
}
"Don't be silly!";
];
[PushSub;
if (noun == Guard) {
deadflag = 3; ! You lose.
"You picked your last fight!";
} else if (noun == DoorS && Guard in SideDoor) {
"He won't let you near it!";
} else if (noun == DoorF) {
"It doesn't budge.";
} else if (noun == Button) {
if (Guard.timer == 0) {
remove Guard; ! move Guard to nowhere until timer expires
Guard.timer = 1;
"You hear someone approaching.";
} else {
"Done.";
}
} else {
"Don't be silly!";
}
];
[WearSub;
if (noun ~= Gloves && noun ~= Mask) "Don't be silly!";
if (noun == Gloves) {
if (noun has worn) "You're already wearing them.";
if (noun notin player) "You're not carrying them.";
give noun worn;
"You put on the gloves.";
} else {
if (noun has worn) "You're already wearing it.";
if (noun notin player) "You're not carrying it.";
give noun worn;
"No one will recognize you.";
}
];
[DisrobeSub j k;
if (noun == Gloves && Gloves hasnt worn) "You aren't wearing them.";
if (noun == Mask && Mask hasnt worn) "You aren't wearing it.";
if (noun hasnt worn) "Don't be silly!";
k = 0; objectloop (j in player) if (j hasnt worn) k++;
give noun ~worn;
if (k ~= 0) {
! The player is already carrying something.
move noun to location;
"Dropped.";
}
"Okay.";
];
[TakeSub j k;
if (noun in player) {
if (noun == Gloves && Gloves has worn) "You're already wearing them.";
if (noun == Gloves) "You're already carrying them.";
if (noun has worn) "You're already wearing it.";
"You're already carrying it.";
}
if (noun ~= Oilcan && noun ~= Gloves && noun ~= Mask && noun ~= TreasureChest) {
"Don't be silly!";
}
k = 0; objectloop (j in player) if (j hasnt worn) k++;
if (k ~= 0) "Drop something first.";
move noun to player;
"Taken.";
];
[DropSub;
if (noun ~= Oilcan && noun ~= Gloves && noun ~= Mask && noun ~= TreasureChest) {
"Don't be silly!";
}
if (noun notin player) {
if (noun == Gloves) "You aren't carrying them.";
"You aren't carrying it.";
}
give noun ~worn;
move noun to location;
"Dropped.";
];
[TimePasses;
if (Guard.timer ~= 0) {
++Guard.timer;
}
if (Guard.timer == 5) {
move Guard to SideDoor;
if (location has indoors) "Uh-oh! Someone is coming!";
Guard.timer = 0;
if (player in AtGate) "The guard tells you to go away.";
if (player in SideDoor) "The guard returns.";
} else {
if (Guard.timer == 6) "You'd better get out of here!";
if (Guard.timer == 4 && player in AtGate) "You hear grumbling.";
if (Guard.timer == 7) {
print "A guard rushes into the room. You have been captured!^";
if (TreasureChest in player || TreasureChest in location) {
deadflag = 3; ! You lose.
"You thief... I hope you like dungeons!";
} else if (Mask has worn && Guard has seen_player_masked) {
deadflag = 3; ! You lose.
"You again... I hope you like dungeons!";
} else if (Mask hasnt worn && Guard has seen_player_unmasked) {
deadflag = 3; ! You lose.
"You again... I hope you like dungeons!";
} else {
if (Mask has worn) give Guard seen_player_masked;
else give Guard seen_player_unmasked;
Guard.timer = 0;
print "The guards kick you out.^";
PlayerTo(AtGate, 2); ! describe the room upon landing there
rtrue;
}
}
}
];
[DeathMessage;
if (deadflag == 3) print "You lose";
if (deadflag == 4) print "You win";
if (deadflag == 5) print "You beat the game";
];
[Initialise;
give player light; ! so we don't have to give each room light
lookmode = 2; ! verbose
remove nw_obj; remove ne_obj; remove u_obj; ! disable these direction-verbs
remove sw_obj; remove se_obj; remove d_obj; ! disable these direction-verbs
location = AtGate;
"^^^^^Welcome to...^";
];
Verb meta 'quit' 'q//'
* -> Quit;
Verb meta 'restart'
* -> Restart;
Verb meta 'restore'
* -> Restore;
Verb meta 'save'
* -> Save;
Verb 'drop'
* noun -> Drop;
Verb 'get'
* noun -> Take;
Verb 'inventory' 'i//'
* -> Inv;
Verb 'look' 'l//'
* -> Look;
Verb 'oil'
* noun -> Oil;
Verb 'push'
* noun -> Push;
Verb 'put'
* 'oil' 'on' noun -> Oil
* 'on' noun -> Wear;
Verb 'take'
* noun -> Take
* 'off' noun -> Disrobe;
Verb 'talk'
* 'to' noun -> TalkTo;
Verb 'wear'
* noun -> Wear;
Verb 'wait' 'z//'
* -> Wait;
#Stub AfterLife 0;
#Stub AfterPrompt 0;
#Stub Amusing 0;
#Stub BeforeParsing 0;
#Stub ChooseObjects 2;
#Stub DarkToDark 0;
#Stub GamePostRoutine 0;
#Stub GamePreRoutine 0;
#Stub InScope 1;
#Stub LookRoutine 0;
#Stub NewRoom 0;
#Stub ParseNumber 2;
#Stub ParserError 1;
#Stub PrintTaskName 1;
#Stub PrintVerb 1;
#Stub UnknownVerb 1;
[ ParseNoun; return -1; ];