!%

Constant Story "Margaret Morrison Carnegie Hall";
Constant Headline "^A less-than-honest building simulator
		^By Vincent Zeng^
		^(for more info, type 'about')^^";
	
Release 0;
Include "Parser";

Object  LibraryMessages
	with  before [;
		Miscellany:
			if (lm_n == 44 && action_to_be == ##Take)
				"You don't have enough hands to take everything at once.";
];

[ ChooseObjects obj code
        retval;
	obj = obj;          ! Avoid a compiler warning
	switch (code) {
		0:              ! Parser is excluding obj from ALL
			;           ! ... accept parser's decision
		1:              ! Parser is including obj in ALL
			if (action_to_be == ##Take) retval = 2; ! ... force exclusion if TAKE; accept otherwise
		2:              ! Parser is asking for 'appropriateness' hint
			;           ! ... but we don't provide one
	    }
        return retval;
];


Include "VerbLib";
Include "Menus";
Include "Grammar";

Constant ShowRooms;
Include "dirs_2";

Global HANDS_FULL;
Global HEAVY_LOAD;
Constant BUTTON_ON = "X";
Constant BUTTON_OFF = " ";

!====CLASSES

Class Room
	with 	cant_go [;
			"There's no way out in that direction.";
		],
		before [;
			Examine:
				if (noun == self) {
					<<Look>>;
				} else {}
			Listen:
				if (noun == false) {
					"Just a distant clicking of machinery that has not yet shut down.";
				}
			Smell:
				if (noun == false) {
					"It smells dank.";
				}
			Take, Open, Unlock, Push, Lock, Close, Rub, Attack, Climb, Wave:
				if (HANDS_FULL) {
					"Your hands are full with carrying that ", (name) HEAVY_LOAD, "!";
				}
		],
		after [;
			Take:
				if (noun.encumberance > 9) {
					HANDS_FULL = 1;
					HEAVY_LOAD = noun;
				}

			Drop:
				if (noun.encumberance > 9) {
					HANDS_FULL = 0;
				}
		],
	has	light;

Class Passageway
	with 	cant_go [;
			"The hallway doesn't go that direction.";
		],
		name 'hallway' 'passageway' 'hall',
		before [;
			Examine:
				if (noun == self) {
					<<Look>>;
				} else {}
			Enter:
				if (noun == false ) {
					"Be more specific about what you want to enter.";
				} else {}
			Listen:
				if (noun == false) {
					"Just a distant clicking of machinery that has not yet shut down.";
				}
			Smell:
				if (noun == false) {
					"It smells dank.";
				}
			Take, Open, Unlock, Push, Lock, Close, Rub, Attack, Climb, Wave:
				if (HANDS_FULL) {
					"Your hands are full with carrying that ", (name) HEAVY_LOAD, "!";
				}
		],
		after [;
			Take:
				if (noun.encumberance > 9) {
					HANDS_FULL = 1;
					HEAVY_LOAD = noun;
				}
			Drop:
				if (noun.encumberance > 9) {
					HANDS_FULL = 0;
				}
		],
	has	light;

Class Structure 
	with	describe [; rtrue; ],
	has	static transparent;

Class Alarm
	with	description [;
			font off;
			style reverse;
			print " ______________________________ ^";
			print "|                              |^";
			print "|  ALARM STATUS:     ";
			if (self.armed) {
				print "  ";
			} else {
				print "UN";
			}
			print "ARMED   |^";
			print "|  INTRUDER STATUS:   ";
			if (self has on) {
				print "!ALARM!";
			} else {
				print " SAFE  ";
			}
			print "  |^";
			print "|                              |^";
			print "|    1  2  3                   |^";
			print "|   (";
			print (string) self.b1;
			print ")(";
			print (string) self.b2;
			print ")(";
			print (string) self.b3;
			print ")                  |^";
			print "|    4  5  6                   |^";
			print "|   (";
			print (string) self.b4;
			print ")(";
			print (string) self.b5;
			print ")(";
			print (string) self.b6;
			print ")                  |^";
			print "|    7  8  9                   |^";
			print "|   (";
			print (string) self.b7;
			print ")(";
			print (string) self.b8;
			print ")(";
			print (string) self.b9;
			print ")                  |^";
			print "|    *  0  #                   |^";
			print "|   (";
			print (string) self.ba;
			print ")(";
			print (string) self.b0;
			print ")(";
			print (string) self.bp;
			print ")                  |^";
			print "|______________________________|^";
			print "                                ^";
			style roman;
			font on;
			new_line;
			rtrue;
		],
		name 'alarm' 'security' 'panel' 'buttons' 'keypad' 'pad',
		armed, 
		b0 BUTTON_OFF, 
		b1 BUTTON_OFF, 
		b2 BUTTON_OFF, 
		b3 BUTTON_OFF, 
		b4 BUTTON_OFF, 
		b5 BUTTON_OFF, 
		b6 BUTTON_OFF, 
		b7 BUTTON_OFF, 
		b8 BUTTON_OFF, 
		b9 BUTTON_OFF, 
		ba BUTTON_OFF, 
		bp BUTTON_OFF, 
		describe [;
			rtrue;
		],
		before [;
			Listen:
				if (self has on) {
					"IT'S MAKING A HORRIBLE BLARING NOISE."; }
			SwitchOff:
				!"You can't just turn it off! You need the code!";
		],
		disarm [;
			give self ~on;
			self.armed = 0;
		],
		arm [;
			give self ~on;
			self.armed = 1;
		],
		buttonpress [ buttonkey buttonstatus;
			self.buttonkey = buttonstatus;
		],
		each_turn [;
			if (self has on) {
				box "!!ALARM ALARM ALARM!!";
				style underline;
				print "^The security alarm is making an awful racket!";
				style roman;
				new_line;
				rtrue;
			}
		],
	has	static transparent switchable;

Class AlarmButton
	with	when_on "It's lit up.",
		key,
		pushbutton [;
			if (self has on) {
				parent(self).buttonpress(self.key, BUTTON_OFF);
				give self ~on;
				"The button clicks under your finger and goes dark."; 
			} else {	
				parent(self).buttonpress(self.key, BUTTON_ON);
				give self on;
				"The button clicks down under your finger and lights up.";
			}
			
			new_line;
			rtrue;
		],
		before [;
			Push, SwitchOn, SwitchOff:
				return self.AlarmButton::pushbutton();
		],
	has	static switchable;

Class Takeable
	with 	encumberance 0,
	has	;

Class Furniture
	with	describe [; rtrue; ],
		before [;
			Take: "Don't bother.";
			Push: "It doesn't budge.";
			PutOn: 
				if (noun.encumberance < 5) {
					move noun to self;
					"You put ", (the) noun, " on ", (the) self, ".";
				} else {
					"It's too big for that.";
				}
		],
	has	supporter;

Class Prop
	with 	before[ ;
			Take, Push, PushDir:
				"Don't bother.";
		],
	has	scenery;

Class BarricadeDoor
	with 	before [;
			Open, Unlock, Attack, Push: "It's not happening. That door is well-sealed against intruders.";
		],
		describe [; rtrue; ],
	has	static;

Class OfficeDoorGreen
	with	describe [; rtrue;],
		with_key greenkey,
	has	door lockable openable static locked transparent;

Class OfficeDoorBlue
	with	describe [; rtrue;],
		with_key bluekey,
	has	door lockable openable static locked transparent;

Class Drain 
	with	 after [;
			Receive:
				if (noun.encumberance < 5) {
					remove noun;
					print_ret (The) noun, " slips past the grate and falls down the drain. You'll never see it again.";
				} else {
					move noun to location;
					"It gets caught on the grate, too big to fit through.";
				}
		],
		react_after [;
			Drop:
				if (noun.encumberance < 5 ) "It almost went into the drain. Close call.";
		],
		describe [; rtrue; ],
	has	open container static;


!====== ROOMS

Room c_lockroom "C-Level: Under the Stairs"
	with	description
		"A dim, dusty crawlspace formed by the bottom of painted metal stairs. It opens into the stairwell to the north.",
		!initial	
		!"^^This part of the building has existed for as long as the rest of the building, but people tend to forget it's here. Over the years, it's changed hands through various departments, clubs, and contractors, none of whom had much regard for its history.",
		name 'crawlspace' 'space' 'dim' 'dusty' 'dust',
		n_to c_stairs, 
	has	;

Structure cbstairs "stairs"
	with	description
		"Old steel girders and thick, grey paint that is beginning to flake off.",
		name 'stairs' 'stair' 'step' 'painted' 'metal' 'girder' 'paint' 'girders' 'stairwell',
		before [;
			Climb:
				if (location == c_lockroom) {
					"You scramble along the underside of the stairs for a moment, then fall heavily to the ground. You'd do better starting from the stairwell."; 
				} else {
					if (location == b_cstairs) { 
						print "Your feet pound heavily down the stairs.^";
						<<Go d_obj>>; 
					} else { 
						print "Your feet pound heavily up the stairs.^";
						<<Go u_obj>>;
					}
				}
			default: ;
		],
		found_in c_stairs c_lockroom b_cstairs,
	has	pluralname;

Room c_stairs "C-Level: Bottom of the Stairwell"
	with	description
		"A northern door leads towards the Digital Fabrication lab. The stairs curl around to form a dark crawlspace to the south. B-level is upstairs.",
		s_to c_lockroom, u_to b_cstairs,
		before [;
			Go: if (noun == n_obj) { "The door is shut."; }
		],
	has	;

BarricadeDoor -> dfabdoor "dFAB door"
	with	description [;
			print "A heavy metal door, painted white, with a narrow glass window";
			if (dfabletters in self) {
				print " and a peeling vinyl sticker.";
			} else {
				print ".";
			}

			new_line;
			rtrue;
		],
		name 'door' 'dfab' 'south' 's//',
	has	transparent;

Structure -> -> dfabwindow "dFAB window"
	with	description
		"A narrow glass window with safety wire, smudged with grime. It's dark on the other side.",
		name 'window' 'glass',
	has	;

Takeable -> -> dfabletters "vinyl door sticker"
	with	description
		"A light green vinyl sticker with laser-cut lettering that reads 'digital fabrication lab'.",
		name 'stickers' 'letters' 'dfab' 'vinyl' 'peeling' 'green' 'digital' 'fabrication' 'lab' 'sticker' 'label',
		peeled 0,
		before [;
			Take:
				if (self in player ) {
					"You already have that.";
				} else {
					move self to player;
					if (self.peeled == 0) {
						self.peeled++;
						"You carefully peel the sticker from the door. It probably won't stick to anything else now.";
					} else {
						"Taken.";
					}
				}
			Taste: "Still somehow has that new plastic taste.";
		],
	has	;

Room b_cstairs "B-Level: Top of the Stairwell"
	with	description
		"The landing overlooks the entrance to C-level down below. A northern door leads to the former Scotch'n'Soda storeroom. B-Level continues south.",
		d_to c_stairs, s_to b_hall1,
		before [;
			Go: if (noun == n_obj) { "The door is shut."; }
		],
	has	;

BarricadeDoor -> snsdoor "Scotch'n'Soda door"
	with	description
		"A heavy metal door, painted white.",
		name 'door' 'heavy' 'scotch' 'soda' 'scotch^n^soda' 'storeroom' 'white',
	has	;

Passageway b_hall1 "B-Level: Hallway"
	with	description [;
			print "A north-south hallway with a wide metal grate that stretches across the hallway before the stairwell.^^A door west leads to the faculty office.";
			if (greenkey in grate1) {
				if (greenkey.seen == 1) {
					print "^^A key glints from under the grate.";
				} else {
					print "^^Something glints from under the grate.";
				}
			}
			if (door_fac has open) {
				style underline;
				print "^^Someone left the door open.";
				style roman;
			}
			new_line;
			rtrue;
		],
		n_to b_cstairs, w_to door_fac, s_to b_hall2,
	has	;

Drain -> grate1 "grate"
	with	description [;
			print "A heavy metal grate, painted safety yellow, with holes so wide that a foot could easily slip into it. It covers a wide drain in the floor.";
			if (greenkey in self) {
				print " ^^A small brass key rests just short of tumbling down the drain.";
			}
			new_line;
			rtrue;
		],
		name 'grate' 'metal' 'yellow' 'wide',
		before [;
			LookUnder: <<Search self>>;
		],
		after [;
			Examine, Search:
				greenkey.seen = 1;
		],
	has	;

Prop -> -> glint "glint"
	with	description [;
			print "A bit of light reflecting off ";
			if (greenkey.seen == 1) {
				print "a key ";
			} else {
				print "something ";
			}
			print "under the grate.";

			new_line;
			rtrue;
		],
		name 'glint' 'shiny' 'light' 'reflecting' 'something' 'reflection',
		before [;
			Take: "It's just a glint of light.";
			Search: <<Examine self>>;
		],
	has	;

Drain -> -> drain1 "drain"
	with	description[;
			print "A wide drain that tapers into a 6~ pipe.";
			if (greenkey in grate1) {
				print " A small brass key rests just short of tumbling down the hole.";
			}
			new_line;
			rtrue;
		],
		after [;
			Examine, Search:
				greenkey.seen = 1;
		],
		name 'drain' 'hole',
	has	;

Takeable -> -> greenkey "worn brass key"
	with	description
		"A small, well-worn brass key numbered 6007-M and labeled 'DO NOT DUPLICATE'.",
		name 'key' 'brass' 'worn' 'small' '6007' '6007-m',
		seen, used,
		before [;
			Examine:
				if (self.seen == 1 ) {
					self.description();
				} else { 
					print "What key?"; 
					new_line;
				}
					rtrue;
			Take:
				if (self in player ) {
					"You already have that.";
				} else { 
					if (self in grate1) {
						if (self.seen == 1) {
							move self to player;
							remove glint;
							"You carefully reach past the grate and pluck the key from its resting spot.";
						} else {
							"What key?";
						}
					} else {
						move self to player;
						"Taken.";
					}
				}	
		],
		encumberance 1,
	has	;

OfficeDoorGreen door_fac "faculty office door"
	with	description
		"A green metal door with a large window.",
		name 'door' 'green' 'metal' 'office' 'faculty' 'west' 'w//',
		found_in b_fac b_hall1,
		door_to [;
			if (self in b_hall1) return b_fac;
			else return b_hall1;
		],
		door_dir [;
			if (self in b_hall1) return w_obj;
			else return e_obj;
		],
	has	;

Structure -> facwindow "faculty office window"
	with	description
		"A large glass window with safety wire.",
		name 'window' 'glass' 'faculty' 'office',
	has	;

Room b_fac "B-Level: Faculty Office"
	with	description [item i;
			print "Former photography faculty used this office to hold student meetings; it didn't take long for the room to turn into a place to stash leftover photography student work, which is still piled on the desk.";
			if (children(facdesk) > 1){

				print "^^There is also ";
				objectloop (item in facdesk) {
					i++;	
					if (i < children(facdesk)) {
						print (a) item, " ";

						if (i < children(facdesk)-1) {
							print "and ";
						}
					}
				}
				print "on the desk.";
			}
			print "^^A door east leads back to the hallway.";
			new_line;
			rtrue;
		],
		e_to door_fac,
	has	;

Furniture -> facdesk "desk"
	with	description
		"A metal-sided desk with a hutch.",
		name 'desk' 'metal' 'table' 'shelf' 'hutch',
	has	;

Prop -> -> studwork "student work"
	with	description
		"A pile of abandoned photographs, left behind by students past. None of it is particularly interesting.",
		name 'work' 'student' 'leftover' 'abandoned' 'prints' 'photographs' 'pictures',
	has	;

Passageway b_hall2 "B-Level: Hallway"
	with	description [;
			print "A north-south hallway that's a little uncomfortably narrow.^^A door east leads to the quartermaster depot, and a door west leads to the equipment office.";
			if (door_qmd has open) {
				style underline;
				if (door_equ has open ) {
					print "^^Someone left both doors open.";
				} else { 
					print "^^Someone left the door to the quartermaster depot open.";
				}
				style roman;
			} else if (door_equ has open ) {
				style underline;
				print "^^Someone left the door to the equipment office open.";
				style roman;
			}
			new_line;
			rtrue;
		],
		n_to b_hall1, e_to door_qmd, w_to door_equ, s_to b_hall3,
	has	;

OfficeDoorGreen door_qmd "quartermaster depot door"
	with	description [;
			print "A green metal door";
			if (qmd_signs in self ) {
				print " covered in a ripped sign.";
			} else {
				print ".";
			}

			new_line;
			rtrue;
		],
		name 'door' 'green' 'qmd' 'quartermaster' 'depot' 'east' 'e//',
		found_in b_qmd b_hall2,
		door_to [;
			if (self in b_hall2) return b_qmd;
			else return b_hall2;
		],
		door_dir [;
			if (self in b_hall2) return e_obj;
			else return w_obj;
		],
	has	;

Takeable -> qmd_signs "ripped sign"
	with	description 
		"A paper sign that used to read 'Quartermaster Depot'.",
		name 'sign' 'ripped' 'paper',
		peeled 0,
		before [;
			Take:
				if (self in player ) {
					"You already have that.";
				} else {
					move self to player;
					if (self.peeled == 0) {
						self.peeled++;
						"You rip the sign from the door.";
					} else {
						"Taken.";
					}
				}
		],
	has	;

OfficeDoorGreen door_equ "equipment office door"
	with	description
		"A green metal door with a large window.",
		name 'door' 'green' 'metal' 'equipment' 'office' 'west' 'w//',
		found_in b_equ b_hall2,
		door_to [;
			if (self in b_hall2) return b_equ;
			else return b_hall2;
		],
		door_dir [;
			if (self in b_hall2) return w_obj;
			else return e_obj;
		],
	has	;

Structure -> equwindow "equipment office window"
	with	description
		"A large glass window with safety wire.",
		name 'window' 'glass' 'equipment' 'office',
	has	;

Room b_qmd "B-Level: Quartermaster Depot"
	with	description [item i;
			print "The former quartermaster had an excess of broken bullshit and tools, and not enough space to keep it organized. It's a wonder that anything can be found in this mess. The door to the closet has been removed to give quicker access to the shelf and mini-fridge.";
			print "^^The table in the center of the room";
			if (children(qmd_table) > 0){
				print " has a remarkably low amount of clutter, other than ";
				objectloop (item in qmd_table) {
					i++;
					print (a) item;
					
					if (i < children(qmd_table)) {
						print " and ";
					}
				}
			} else {
				print " is completely devoid of clutter, as if in defiance to the rest of the room.";
			}
			print ".";
			print "^^A door west leads back to the hallway.";

			new_line;
			rtrue;
		],
		before[;
			Drop:
				if (noun.encumberance < 5) {
					move noun to bs;
					"As soon as you let it go, it becomes a part of the mess.";
				} else {}

			Take:
				if (noun in player) {
					"You already have that.";
				} else {
					move noun to player;
					if (noun.encumberance < 5) {
						"You dig through the mess to rescue it.";
					} else {"Taken.";}
				}
		],
		w_to door_qmd,
	has	;

Furniture -> qmd_table "table"
	with	description
		"A rickety table with a layered MDF top and black iron pipe legs.",
		name 'table' 'rickety' 'mdf' 'pipe' 'black' 'iron' 'legs' 'desk',
		before [;
			Push:
				"It wobbles, but refuses to tip over.";
		],
	has	;

Prop -> bs "broken bullshit"
	with	description
		"Stuff is just scattered all over the place.",
		name 'tools' 'jumble' 'bullshit' 'broken' 'busted' 'bs' 'camera' 'equipment' 'mess' 'tool' 'stuff',
		before [item i;
			Search:
				print "There's more crap than anyone can reasonably deal with";
				if (children(self) > 0) {
					print ", but some of it is has potential. ^^You manage to spot ";
					objectloop (item in self) {
						i++;
						print (a) item;

						if (i < children(self)) {
							print " and ";
						}
					}
				}
				print ".";

				new_line;
				rtrue;
		],
	has	transparent container open;

Takeable -> -> flashlight "flashlight"
	with	description
		"A small black maglight.",
		name 'flashlight' 'maglight' 'light' 'torch',
		encumberance 1,
		after [;
			SwitchOn: give self light;
			SwitchOff: give self ~light;
		],
		before [;
			Open:
				"Don't do that.";
		],
	has	switchable;

Structure -> qmd_closet "closet"
	with	description
		"A closet that's missing its doors. It has a shelf about waist-high.",
		name 'closet' 'cabinet',
		before [;
			Enter:
				"It's too small for you.";
			Take:
				"You can't take a whole closet.";
		],
	has	container open transparent;

Furniture -> -> qmd_shelf "shelf"
	with	description
		"A white wooden board that stretches the width of the closet at about waist height.",
		name 'shelf' 'board' 'white' 'wooden',
	has	static;

Furniture -> -> qmd_fridge "mini-fridge"
	with	description
		"A black mini-fridge wedged under the shelf.",
		name 'fridge' 'refridgerator' 'mini-fridge' 'cooler' 'icebox' 'black',
		before [;
			PutOn:
				"There isn't enough room between the fridge and the shelf for you to put anything there.";	
		],
	has	container openable ~supporter;

Room b_equ "B-Level: Equipment Office"
	with	description [item i;
			print "A cozy little office that would certainly be too small for two people to share. A window on the western wall lets in a little bit of light. Wooden cubbies line the rest of the walls, in order to keep equipment and tools neatly organized.";
			if (children(equ_desk) > 0) {
				print "^^The former photography administrator kept the desk immaculate, except for ";
				objectloop (item in equ_desk) {
					i++;
					print (a) item;
					
					if (i < children(equ_desk)) {
						print " and ";
					}
				}

				print ".";
			} else {
				print "^^The former photography administrator kept the desk immaculate.";
			}
			print "^^A door east leads back to the hallway.";

			new_line;
			rtrue;
		],
		e_to door_equ,
	has	;

Structure -> equ_window "equipment office window"
	with	description
		"Thick glass cubes give a distorted view of the outside world. All you can tell is that there's still daylight out.",
		name 'window' 'glass' 'cubes' 'outside' 'out',
	has	;

Furniture -> equ_desk "equipment office desk"
	with	description
		"A metal-sided desk about four feet wide and two feet deep.",
		name 'desk' 'table' 'metal',
	has	;

Takeable -> -> green_cup "green coffee cup"
	with	description
		"A little green ceramic cup, perfect for holding the exact amount of coffee you'd like.",
		name 'cup' 'coffee' 'green' 'ceramic' 'mug',
		encumberance 1,
		before [;
			Receive:
				"It's not worth putting anything in the cup.";
		],
	has	container open;

Takeable -> -> yellow_cup "yellow coffee cup"
	with	description
		"A little yellow ceramic cup with a bright and colorful design.",
		name 'cup' 'coffee' 'mug' 'ceramic' 'yellow',
		before [;
			Receive:
				"It's not worth putting anything in the cup.";
		],
		encumberance 1,
	has	container open;

Structure -> equ_cubbies "cubbies"
	with	description
		"Wooden cubbies line the walls. Each one contains an assortment of cameras, tools, and spare parts.",
		name 'cameras' 'camera' 'cubbies' 'wooden' 'assortment' 'tools' 'tool' 'spare' 'parts' 'part' 'shelves' 'shelf' 'cubby',
		before [;
			Search:
				"It's not worth looking there.";
			Receive:
				"The photography administrator would be annoyed at you if you put random crap into his cubbies.";
			Take,Push:
				"The photography administrator would be annoyed at you for messing with his organization.";
		],
	has	container open transparent pluralname;
	

Passageway b_hall3 "B-Level: Hallway"
	with	description [;
			print "A north-south hallway that could be a little roomier.^^A door east leads to the classroom.";
			if (door_class has open ) {
				style underline;
				print "^^Someone left the door open.";
				style roman;
			}
			new_line;
			rtrue;
		],
		n_to b_hall2, e_to door_class, s_to b_hall4,
	has	;

OfficeDoorGreen door_class "classroom door"
	with	description
		"A green metal door with a large window.",
		name 'door' 'green' 'metal' 'class' 'classroom' 'east' 'e//',
		found_in b_class b_hall3,
		door_to [;
			if (self in b_hall3) return b_class;
			else return b_hall3;
		],
		door_dir [;
			if (self in b_hall3) return e_obj;
			else return w_obj;
		],
	has	;

Room b_class "B-Level: Classroom"
	with	description
		"This room feels way too small to be a classroom, but it's labeled as such. It's startlingly empty, as if people refused to use it out of spite.^^A door west leads back to the hallway.",
		with w_to door_class,
	has	;

Passageway b_hall4 "B-Level: Hallway"
	with	description
		"The hallway turns here, continuing both east and north. The floor slopes gently upwards towards the east, so OSHA-compliance required a handrail installed on one wall. A bulletin board on the opposite wall is covered in out of date flyers.",
		n_to b_hall3, e_to b_hall5,
	has	;

Structure -> hall4_handrail "handrail"
	with	description
		"A long metal handrail, painted red, securely fixed to the wall.",
		name 'handrail' 'rail' 'railing' 'metal' 'red',
	has	;

Prop -> hall4_bb "bulletin board"
	with	description
		"A bulletin board that seems to be part of the wall. The flyers advertise photography shows and artist talks that happened months ago.",
		name 'board' 'bulletin' 'bb' 'flyers' 'posters' 'flyer' 'poster' 'ads' 'ad' 'advertisement' 'paper' 'papers' 'sign' 'signs',
	has	;

Passageway b_hall5 "B-Level: Hallway"
	with	description [;
			print "The hallway turns at the top of a long, gentle slope, and continues both southeast and west. It opens directly south to an elevator area.^^A door north leads to the darkroom.";
			if (door_dr has open) {
				style underline;
				print "^^Someone left the door open.";
				style roman;
			}
			new_line;
			rtrue;
		],
		w_to b_hall4, n_to door_dr, s_to b_hall6, se_to b_hall7,
	has	;

OfficeDoorGreen door_dr "darkroom door"
	with	description
		"A green metal door.",
		name 'green' 'metal' 'door' 'north' 'darkroom' 'dr' 'n//',
		found_in b_hall5 b_dr,
		door_to [;
			if (self in b_hall5) return b_dr;
			else return b_hall5;
		],
		door_dir [;
			if (self in b_hall5) return n_obj;
			else return s_obj;
		],
	has	;


Room b_dr "B-Level: Main Darkroom"
	with	description[;
			print "An area full of abandoned prints and spilled photo chemistry. The two film changing rooms had their doors ripped off the hinges.^^Openings in the wall to the northeast and northwest lead to darker spaces.";
			print "^^A door south leads back to the hallway.";

			new_line;
			rtrue;
		],
		s_to door_dr, ne_to b_bdr, nw_to b_adr,
	has	;

Structure -> dr_filmroom "film changing rooms"
	with	description
		"Rooms that once could have been light-tight, except the doors are gone.",
		name 'film' 'changing' 'rooms' 'room' 'dark',
	has	pluralname;

Prop dr_prints "abandoned prints"
	with	description
		"Student photography work thrown everywhere.",
		name 'prints' 'print' 'photo' 'photos' 'work' 'student' 'pictures' 'picture' 'photograph' 'photographs',
		found_in b_dr b_bdr,
	has	pluralname;

Prop dr_chemistry "spilled chemistry"
	with	description
		"Stains and crusty sediment.",
		name 'chemistry' 'spilled' 'mess' 'chemicals' 'stains' 'stain' 'crust' 'crusty',
		found_in b_dr b_adr b_bdr,
	has	pluralname;

Room b_bdr "B-Level: Beginning Darkroom"
	with	description [;
			print "A large sink takes up the center of the room, an island of black fiberboard and dark grey plastic. The exhaust hood over the sink remains silent, blocking one's view across the sink. Printing stations ring the four walls of the room, with enlargers looming in each stall like a cabalistic meeting of archaic practices. Contrast filters and curled up bits of photo paper litter the floor.^^The main darkroom is through an opening to the south.";

			new_line;
			rtrue;
		],
		s_to b_dr, sw_to b_dr, w_to b_dr,
	has	~light;

Takeable -> filters "contrast filters"
	with	description
		"Sheets of pinkish-orange plastic, about 4~x4~, used in some photographic printing proccesses.",
		name 'filter' 'filters' 'contrast' 'plastic',
		encumberance 1,
		describe [; rtrue; ],
		after [;
			"You collect a few of them, but there's more scattered around than you can ever hope to collect.";
		],
	has	pluralname;

Structure -> bdr_sink "sink"
	with	description
		"A large sink, six feet across and tent feet wide, made of dark grey plastic that sits on top of black fiberboard shelving.",
		name 'sink' 'faucet' 'plastic',
	has	supporter open;

Structure -> bdr_shelf "shelf under the sink"
	with	description
		"A shelf built into the space leftover under the sink.",
		name 'shelf' 'shelves' 'shelving' 'fiberboard',
	has	container open;

Structure -> bdr_hood "exhaust hood"
	with	description
		"A massive metal hood, ten feet wide and a foot thick, that once drew an impressive amount of air out of the space above the sink.",
		name 'hood' 'exhaust' 'vent' 'ventilation',
	has	;

Structure enlargers "enlargers"
	with	description
		"Old machinery, black brackets and cables, creaking bellows, and cracked lenses. Once, they churned out the hopes and dreams of photography students.",
		name 'enlarger' 'enlargers' 'machine' 'machines' 'machinery' 'brackets' 'bracket' 'cable' 'cables' 'bellows' 'lenses' 'lens' 'stall' 'stations' 'station' 'printing',
		found_in b_adr b_bdr,
	has	pluralname;

Room b_adr "B-Level: Advanced Darkroom"
	with	description
		"A large sink juts out from one wall, filled with mysterious chemical stains. Printing stations form a horseshoe around it, with enlargers covered by plastic tarps and trash bags sitting ghostlike in each stall. Cyanotypes are scattered all over the floor.^^The main darkroom is south.",
		s_to b_dr, se_to b_dr, e_to b_dr,
	has	~light;

Structure -> adr_sink "sink"
	with	description
		"A large sink, six feet across and tent feet wide, made of dark grey plastic that sits on top of black fiberboard shelving.",
		name 'sink' 'faucet' 'plastic',
	has	supporter open;

Structure -> adr_shelf "shelf under the sink"
	with	description
		"A shelf built into the space leftover under the sink.",
		name 'shelf' 'shelves' 'shelving' 'fiberboard',
	has	container open;

Structure -> adr_hood "exhaust pipe"
	with	description
		"There's just an open pipe about a foot wide, hanging from the ceiling. Something must have happened to the rest of the hood.",
		name 'hood' 'exhaust' 'vent' 'ventilation' 'pipe',
	has	;

Takeable -> cyanotypes "cyanotypes"
	with	description
		"The earliest known photographic process still has some modern practitioners. Small sheets of white paper with mysterious blue marks all over them, like remnants of specimens.",
		name 'cyanotype' 'cyanotypes' 'blue' 'white' 'paper' 'cyan',
		after [;
			"You grab a handful off the floor, but there are more than you can ever hope to gather.";
		],
	has	pluralname;

Passageway b_hall6 "B-Level: Elevator Area"
	with	description [;
			print "A dead-end at a wide metal grate that stretches across the hallway, which continues north.^^An elevator is to the east, its doors stuck open. A door to the west leads to the shooting studio.";
			if (door_ss has open ) {
				style underline;
				print "^^Someone left the door open.";
				style roman;
			}
			new_line;
			rtrue;
		],
		n_to b_hall5, w_to door_ss, e_to elevator,
	has	;

Structure -> callbutton "call button"
	with	description
		"A round button with an up arrow. It's unlit.",
		name 'button' 'call' 'up' 'arrow' 'buttons',
		before [;
			Touch, Push, Attack:
				"It flashes weakly when you touch it, but nothing else happens.^^The elevator is already here.";
		],
	has	;

Structure ele_doors "elevator doors"
	with	description
		"The elevator doors are retracted into the wall, and refuse to close.",
		name 'door' 'doors' 'elevator' 'stuck' 'open',
		found_in b_hall6 elevator,
		before [;
			Open, Close:
				"They're firmly stuck open. At least you're not trapped inside.";
			Enter:
				if (location == b_hall6) <<Go e_obj>>;
			Exit: 
				if (location == elevator) <<Go w_obj>>;
		],
	has	openable open;

Room elevator "Elevator"
	with	description [;
			print "A cramped elevator covered in rude graffiti. None of the buttons on the main panel are lit up, and the button next to the emergency help phone ";
			if (ele_help.jammed ==1 ) {
				print "appears jammed.";
			} else {
				print "looks promising.";
			}
			
			"^^The doors are stuck open, and lead west back to the hallway.";
		],
		before [;
			Exit: 
				<<Go w_obj>>;
		],
		w_to b_hall6,
	has	;

Structure -> ele_help "help phone"
	with	description [;
			print "A red button labeled 'HELP' next to a speaker set into the wall.";
			if (self.jammed) {
				" It's currently jammed.";
			} 

			new_line;
			rtrue;
		],
		name 'help' 'emergency' 'red' 'speaker' 'button' 'jammed' 'phone',
		jammed 1,
		before [;
			Attack:
				self.jammed = 0;
				"You give the button a good smack, and it pops right back up.";
			Touch, Push:
				if (self.jammed == 0) {
					"A brief pause, then static on the other end. Bummer.";
				} else {
					"The button is jammed too tightly. It probably needs a good punch.";
				}
		],
	has	;

Prop -> ele_graffiti "graffiti"
	with	description
		"Someone peeled the paint off the elevator walls in precise shapes that resemble genitalia and wild animals.",
		name 'graffiti' 'rude' 'paint' 'walls' 'wall' 'shape' 'dong' 'penis' 'butt' 'boobs' 'boob' 'dick' 'dicks' 'wang' 'animal' 'animals' 'butts' 'dongs',
	has	;

Structure -> ele_buttons "floor buttons"
	with	description	
		"The main elevator panel has buttons for the following floors: 2B, 1B, 1, 2, 3, 4. It also has a 'door open' button.",
		name 'panel' 'button' 'buttons' 'open' '2b' '1b' '1//' '2//' '3//' '4//' 'one' 'two' 'three' 'four' 'open' 'floor',
		before [;
			Touch, Push, Attack:
				"The button clicks, but nothing happens.";
		],
	has	;

Drain -> grate2 "grate"
	with	description
		"A heavy metal grate, painted safety yellow, with holes so wide that a foot could easily slip into it. It covers a wide drain in the floor.",
		name 'grate' 'metal' 'yellow' 'wide',
	has	;

Drain -> -> drain2 "drain"
	with	description
		"A wide drain that tapes into a 6~ pipe.",
		name 'drain' 'hole',
	has	;

OfficeDoorGreen door_ss "shooting studio door"
	with	description
		"A green metal door.",
		name 'door' 'green' 'metal' 'studio' 'shooting' 'ss' 'hall' 'hallway' 'west' 'w//',
		found_in b_hall6 b_ss,
		door_to [;
			if (self in b_hall6) return b_ss;
			else return b_hall6;
		],
		door_dir [;
			if (self in b_hall6) return w_obj;
			else return e_obj;
		],
	has	;

Room b_ss "B-Level: Shooting Studio"
	with	description[;
			print "This lighting studio has seen more than any room should ever have to deal with. There was once a joke that a CCTV camera monitored the space to catch studio policy infractions, which was quickly met with backlash from art students who thought it was a safe place to hold naked photoshoots. ^^Now, the room is startlingly empty, except for a whiteboard on the wall near the door";

			if (ladder in self) {
				print ", and a ladder standing in the middle of the floor";
			}

			print ".^^The shadowy southern corner leads to a storage closet";
			if (door_ssc has open ) {
				print ", and the door is wide open";
			}
			". A door east leads back to the hallway.";
		],
		e_to door_ss, s_to door_ssc,
	has	;

Prop -> ss_whiteboard "whiteboard"
	with	description [;
			if (self.cleaned == 0) {
				"Someone drew a map of the floor on the whiteboard, with big Xs over both stairwells and the emergency exit.";
			} else {
				"It's blank.";
			}
		],
		cleaned,
		before [;
			Rub:	
				if (self.cleaned > 0) {
					"There's nothing on the whiteboard to clean.";
				}	
				self.cleaned++;
				"You run your hands all over the board until nothing remains.";
		],
		name 'whiteboard' 'board' 'white' 'dry-erase',
	has	;

Prop -> ss_camera "camera"
	with	description 
		"It was just a joke.",
		name 'camera' 'cctv' 'monitor' 'security',
		before [;
			default:
				"Really. Just a joke. There's no security camera here.";
		],
	has	;

Takeable -> ladder "ladder"
	with	description
		"A rickety wooden ladder.",
		name 'ladder' 'rickety' 'wooden',
		encumberance 10,
		describe [;
			if (location == b_ss) {
				rtrue;
			}
		],
		before [;
			Climb, Enter:
				move player to self;
				"You scramble up the ladder. It wobbles under you, but you manage to keep your balance.";
		],
	has	supporter enterable;

OfficeDoorGreen door_ssc "storage closet door"
	with	description
		"A green metal door.",
		name 'door' 'green' 'metal' 'storage' 'closet' 'south' 's//',
		found_in b_ssc b_ss,
		door_to [;
			if (self in b_ss) return b_ssc;
			else return b_ss;
		],
		door_dir [;
			if (self in b_ss) return s_obj;
			else return n_obj;
		],
	has	;

Room b_ssc "B-Level: Shooting Studio Closet"
	with	description
		"You really don't want to know what's in here.^^A door north leads back to the shooting studio.",
		n_to door_ssc,
		before [;
			Smell: "A heavy fragrance, like someone left a can of peaches open for a month and promptly forgot about it.";
			Listen: "Ominous dripping, though nothing looks wet.";
		],
	has	~light;

Takeable -> bluekey "shiny brass key"
	with 	description
		"A small, shiny brass key numbered 6002-M and labeled 'DO NOT DUPLICATE'.",
		name 'key' 'brass' 'shiny' '6002' '6002-m',
		encumberance 1,
	has	;

Passageway b_hall7 "B-Level: Gallery Hall"
	with	description [;
			print "This long, curving hallway has stark white walls full of pinholes and track lighting that makes the space way brighter than it needs to be.";
			"^^Stairs up to A-level are to the east. The hallway continues northeast and northwest.";
		],
		nw_to b_hall5, e_to b_astairs, ne_to b_hall8, u_to b_astairs,
	has	;

Prop -> gallerywall "gallery wall"
	with	description
		"The gallery walls are painted the purest of whites, pockmarked with small holes from years of student work being nailed up for display.",
		name 'holes' 'pinholes' 'white' 'gallery' 'wall' 'walls' 'hole' 'pin',
	has	;

Class BlueChair (9)
	with	description
		"A blue plastic chair, made out of one smoothly rounded shape. It's not very comfortable for sitting on, and it looks like it belongs on the set of a children's television show.",
		name 'blue' 'chair' 'unstacked' 'unstack',
		short_name [;
			if (self.location == b_hall7 ) { "unstacked chair"; }
			"blue chair";
		],
		plural [;
			if (self.location == b_hall7) { "unstacked chairs"; }
			"blue chairs";
		],
		article "a",
		before [;
			PutOn:
				if ((second ofclass BlueChair) || (second == chairstack)) {
					"The thing with these chairs is that once unstacked, they are impossible to stack together again. Try as you might, you can't get the weirdly curved legs to fit together.";
				}
			Enter:
				move player to self;
				"You make an attempt to recline luxuriously on the chair, but it's really uncomfortable.";
		],
		describe [;
			if (player in self) {
				"You're sitting on an uncomfortable blue chair.";
			}
		],
		encumberance 10,
	has	supporter enterable;

Object -> chairstack "stack of blue chairs"
	with	description [;
			if (BlueChair.remaining() > 0 ) {
				print "A stack of ";
				print BlueChair.remaining();
				" chairs.";
			} else {
				"A single chair that once supported a whole stack.";
			}
		],
		describe [;
			if (BlueChair.remaining() > 1) {
				"^A single column of blue chairs has been stacked neatly against the wall.";
			} else {
				"The chairs for the gallery area used to be stacked neatly against the wall, but only one of them is where it's supposed to be.";
			}
		],
		name 'stack' 'chair' 'chairs' 'blue' 'plastic',
		before [ new_chair;
			Take:	
				if (HANDS_FULL == 0) {
					if (BlueChair.remaining() > 0) {
						new_chair = BlueChair.create();
						move new_chair to player;
						HANDS_FULL = 1;
						HEAVY_LOAD = new_chair;
						if (BlueChair.remaining() > 0) {
							"You separate a chair from the stack.";
						} else {
							remove self;
							"You take the last chair from where the stack once was.";
						}
					}
				} 
		],
	has	static;



Room b_astairs "B-Level: Stairwell"
	with	description
		"The top of the stairs has been heavily barricaded, and you have no hope of getting through.^^The hallway leads back to B-level to the west.",
		w_to b_hall7, d_to b_hall7,
	has	;

Passageway b_hall8 "B-Level: Hallway"
	with	description [;
			print "A weirdly narrow hallway, which continues east and southwest.^^A door to the north leads to the letterpress lab. A door to the south leads to the letterpress office.";
			if (door_lpl has open) {
				style underline;
				if (door_lpo has open) {
					print "^^Someone left both doors open.";
				} else {
					print "^^Someone left the door to the letterpress lab open.";
				}
				style roman;
			} else if (door_lpo has open ) {
				style underline;
				print "^^Someone left the door to the letterpress office open.";
				style roman;
			}
			new_line;
			rtrue;
		],
		sw_to b_hall7, n_to door_lpl, s_to door_lpo, e_to b_hall9,
	has	;

OfficeDoorBlue door_lpl "letterpress lab door"
	with	description
		"A blue metal door",
		name 'letterpress' 'lab' 'door' 'north' 'n//' 'blue',
		found_in b_hall8 b_lpl,
		door_to [;
			if (self in b_hall8) return b_lpl;
			else return b_hall8;
		],
		door_dir [;
			if (self in b_hall8) return n_obj;
			else return s_obj;
		],
	has	;

OfficeDoorBlue door_lpo "letterpress office door"
	with	description
		"A blue metal door.",
		name 'letterpress' 'office' 'door' 'south' 'blue' 'metal' 's//',
		found_in b_hall8 b_lpo,
		door_to [;
			if (self in b_hall8) return b_lpo;
			else return b_hall8;
		],
		door_dir [;
			if (self in b_hall8) return s_obj;
			else return n_obj;
		],
	has	;

Room b_lpl "B-Level: Letterpress Lab"
	with	description
		"A room full of smashed presses and scattered type pieces. A door to the south leads back to the hallway.",
		s_to b_hall8,
	has	;

Room b_lpo "B-Level: Letterpress Office"
	with	description
		"A room full of scattered unbound books. A door to the east leads to a small closet. A door to the north leads back to the hallway.",
		n_to b_hall8, e_to door_lpoc,
	has	;

OfficeDoorBlue door_lpoc "letterpress closet"
	with	description
		"A blue metal door.",
		name 'closet' 'door' 'lettepress',
		found_in b_lpo b_lpoc,
		door_to [;
			if (self in b_lpo) return b_lpoc;
			else return b_lpo;
		],
		door_dir [;
			if (self in b_lpo) return e_obj;
			else return w_obj;
		],
	has	;

Room b_lpoc "B-Level: Letterpress Office Closet"
	with	description
		"A cramped, dark space full of empty boxes. A door to the south doesn't seem like it should lead anywhere. A door to the west leads back to the letterpress office.",
		w_to door_lpoc, s_to door_hole,
	has	;

OfficeDoorBlue door_hole "mystery door"
	with	description
		"A blue metal door.",
		name 'blue' 'door' 'mystery',
		found_in b_lpoc b_hole,
		door_to [;
			if (self in b_lpoc) return b_hole;
			else return b_lpoc;
		],
		door_dir [;
			if (self in b_lpoc) return s_obj;
			else return n_obj;
		],
	has	~locked;

Room b_hole "B-Level: ?????????"
	with	description
		"A wall of rock that was dumped here some time ago. A door to the north leads back to the letterpress closet.",
		n_to door_hole,
	has	;

Passageway b_hall9 "B-Level: Hallway"
	with	description [;
			print "The hallway turns here, continuing west and north. A door to the south leads to the Reese Office. A door to the east leads to the Reese Lab.";
			if (door_ro has open) {
				style underline;
				if (door_reese has open) {
					print "^^Someone left both doors open.";
				} else {
					print "^^Someone left the door to the Reese Office open.";
				}
				style roman;
			} else if (door_reese has open ) {
				style underline;
				print "^^Someone left the door to the Reese Lab open.";
				style roman;
			}
			new_line;
			rtrue;
		],
		each_turn [;
			if (dlab_alarm has on) {
				box "!!ALARM ALARM ALARM!!";
				style underline;
				print "^The security alarm is making an awful racket!";
				style roman;
			}
		],
		w_to b_hall8, s_to door_ro, e_to door_reese, n_to b_hall10,
	has	;

OfficeDoorBlue door_ro "Reese office door"
	with	description
		"A blue metal door.",
		name 'blue' 'door' 'metal' 'reese' 'office' 'south' 's//',
		found_in b_hall9 b_ro,
		door_to [;
			if (self in b_hall9) return b_ro;
			else return b_hall9;
		],
		door_dir [;
			if (self in b_hall9) return s_obj;
			else return n_obj;
		],
	has	;

Room b_ro "B-Level: Reese Office"
	with	description
		"A room full of potted plants that are somehow thriving. A door to the north leads back to the hallway.",
		n_to door_ro,
	has	;

OfficeDoorBlue door_reese "Reese Lab door"
	with	description
		"A blue metal door with a wide window.",
		name 'blue' 'metal' 'door' 'reese' 'lab' 'east' 'e//',
		found_in b_hall9 b_reese,
		door_to [;
			if (self in b_hall9) return b_reese;
			else return b_hall9;
		],
		door_dir [;
			if (self in b_hall9) return e_obj;
			else return w_obj;
		],
	has	;

Room b_reese "B-Level: Reese Lab"
	with	description
		"A room full of abandoned printouts and smashed iMacs. A door to the west leads back to the hallway.",
		w_to door_reese,
	has	;

Passageway b_hall10 "B-Level: Hallway"
	with	description [;
			print "The hallway dead-ends at an emergency exit to the east. A door to the north leads to the digital lab. The hallway continues south.";
			if (door_dlab has open ) {
				style underline;
				print "^^Someone left the door open.";
				style roman;
			}
			new_line;
			rtrue;
		],
		each_turn [;
			if (dlab_alarm has on) {
				box "!!ALARM ALARM ALARM!!";
				style underline;
				print "^The security alarm is making an awful racket!";
				style roman;
			}
		],
		s_to b_hall9, n_to door_dlab,
	has	;

Prop fake_dlabalarm "security alarm"
	with	description
		"The alarm is in the digital lab.",
		name 'alarm' 'security',
		found_in [;
			if (dlab_alarm has on){
				if (door_dlab has open) {
					if ((location == b_hall10) || (location == b_hall9) || (location == b_hall8) || (location == b_hall7)){
						rtrue;
					} else { rfalse; }
				} else {
					return "b_hall10 b_hall9";
				}
			} else {
				return false;
			}
		],
		each_turn [;
			if ((dlab_alarm has on) && (self in location)) {
				box "!!ALARM ALARM ALARM!!";
				style underline;
				print "^The security alarm is making an awful racket!";
				style roman;
				new_line;
				rtrue;
			}
		],
	has	;

BarricadeDoor -> exitdoor "emergency exit door"
	with	description
		"A heavy metal door, painted green, and labeled 'EMERGENCY EXIT.",
		name 'heavy' 'metal' 'green' 'emergency' 'exit' 'barricade' 'east' 'e//' 'door',
	has	transparent;

OfficeDoorGreen door_dlab "Digital Lab door"
	with	description
		"A blue metal door with a wide window.",
		name 'digital' 'lab' 'dlab' 'door' 'blue' 'metal' 'north' 'n//',
		found_in b_hall10 b_dlab,
		door_to [;
			if (self in b_hall10) return b_dlab;
			else return b_hall10;
		],
		door_dir [;
			if (self in b_hall10) return n_obj;
			else return s_obj;
		],
		after [;
			Open:
				if ((location == b_hall10) && (dlab_alarm.armed) && (dlab_alarm hasnt on)) {
					give dlab_alarm on;
					box "!!ALARM ALARM ALARM!!";
					style underline;
					print "^You set off the security alarm!";
					style roman;
					new_line;
					rtrue;
				}
		],
		before [;
			Push:
				"(if you meant to push the button on the keypad, type 'push button 1'!)";
		],
	has	;

Room b_dlab "B-Level: Digital Lab"
	with	description
		"A room full of computers under plastic tarps. A door to the south leads back to the hallway.",
		s_to door_dlab,
	has	;

Alarm -> dlab_alarm "digital lab alarm"
	with 	armed 1,
	has	;

AlarmButton -> -> dlab_1 "1 button"
	with	description "A rubbery button with the number 1 printed on it.",
		name '1//' 'button' 'one',
		key b1,
	has	;

AlarmButton -> -> dlab_2 "2 button"
	with	description "A rubbery button with the number 2 printed on it.",
		name '2//' 'button',
		key b2,
	has	;

AlarmButton -> -> dlab_3 "3 button"
	with	description "A rubbery button with the number 3 printed on it.",
		name '3//' 'button',
		key b3,
	has	;

AlarmButton -> -> dlab_4 "4 button"
	with	description "A rubbery button with the number 4 printed on it.",
		name '4//' 'button',
		key b4,
	has	;

AlarmButton -> -> dlab_5 "5 button"
	with	description "A rubbery button with the number 5 printed on it.",
		name '5//' 'button',
		key b5,
	has	;

AlarmButton -> -> dlab_6 "6 button"
	with	description "A rubbery button with the number 6 printed on it.",
		name '6//' 'button',
		key b6,
	has	;

AlarmButton -> -> dlab_7 "7 button"
	with	description "A rubbery button with the number 7 printed on it.",
		name '7//' 'button',
		key b7,
	has	;

AlarmButton -> -> dlab_8 "8 button"
	with	description "A rubbery button with the number 8 printed on it.",
		name '8//' 'button',
		key b8,
	has	;

AlarmButton -> -> dlab_9 "9 button"
	with	description "A rubbery button with the number 9 printed on it.",
		name '9//' 'button',
		key b9,
	has	;

AlarmButton -> -> dlab_0 "0 button"
	with	description "A rubbery button with the number 0 printed on it.",
		name '0//' 'button',
		key b0,
	has	;

AlarmButton -> -> dlab_pound "# button"
	with	description "A rubbery button with a # printed on it.",
		name '#//' 'button',
		key bp,
	has	;

AlarmButton -> -> dlab_star "* button"
	with	description "A rubbery button with a * printed on it.",
		name '*//' 'button',
		key ba,
	has	;

!=======other bs=============

!=======menus================

Menu about_menu "Underground";
Option -> "Info"
	with description "This is a map of Margaret Morrison Carnegie Hall, an actual building that exists in the world. Some details are omitted or modified in this representation.^
		^To nagivate, type cardinal directions (n, s, e, w, ne, se, nw, se).^
		^If you get lost, I'm sorry.^
		^Pretty standard IF controls apply.^
		^If you are new to IF, type commands like 'examine' (abbreviated to 'x') for any noun you see in your environment to get a closer look, 'take' to attempt to move something to your inventory, 'inv' or 'i' to check your inventory, 'drop' to get rid of something.^
		^You can also 'switch on' some things, 'drop (noun) into (noun)', 'look in/on (noun)', 'open/close', 'lock/unlock', 'smell', 'listen', 'taste', 'climb', and plenty more commands.";
Option -> "Credits"
	with description "By Vincent Zeng [hvincent@@64modgethanc.com], residing quartermaster (yes, that's my office you're messing with).^
		^Beta-tested by various patient friends and faculty, including Jamie, Leo, and gwillen.";

Verb 'help' 'about' 'menu' 'hints' 'info' 'credits' 'author'
	* -> Help;

[ HelpSub;
	about_menu.select();
];

!=======initializing==========

[ Initialise ;
	location = b_hall10;
	lookmode = 2;

	player.description = "You are awesome.";
	move greenkey to player;
	];
