#include "std.h"
/*
* This is an elevator.
* floor 2: church
*/
#define STILL 0
#define DOWN 1
#define UP 2
int level;
int door_is_open;
int time_to_close_door;
int dest; /* Where we are going. */
int moving_time; /* How long we are going to move. */
int delay_to_reset; /* Move back to origin automatically after a delay. */
init() {
add_action("press", "press");
add_action("press", "push");
add_action("open_door", "open");
add_action("close_door", "close");
add_action("go_east", "east");
}
short() {
return "elevator";
}
reset(arg) {
door_is_open = 0;
if (arg)
return;
set_light(1);
level = 2;
dest = 2;
moving_time = 0;
}
/*
* Return true if closed door.
*/
query_door() { return !door_is_open; }
long() {
write("You are in the elevator. On the wall are three buttons,\n");
write("numbered 1 to 3.\n");
if (door_is_open)
write("There is an open door to the east.\n");
if (!door_is_open)
write("There is a closed door to the east.\n");
}
press(button) {
string b;
if (!button)
return 0;
if (door_is_open) {
write("Nothing happens.\n");
return 1;
}
if (sscanf(button, "button %s", b) != 1)
b = button;
if (moving_time > 0) {
write("The elevator is still moving.\n");
return 1;
}
if (b == "1" || b == "one")
dest = 1;
if (b == "2" || b == "two")
dest = 2;
if (b == "3" || b == "three")
dest = 3;
if (dest == level) {
write("You are alread at level " + dest + ".\n");
return 1;
}
if (dest > level) {
moving_time = dest - level;
write("The elevator jerks upward.\n");
say("The elevator jerks upward.\n");
}
if (level > dest) {
moving_time = level - dest;
write("The elevator starts moving downward.\n");
say("The elevator starts moving downward.\n");
}
if (dest == 1 || level == 1)
moving_time += 10;
moving_time += 1;
set_heart_beat(1);
return 1;
}
heart_beat() {
if (time_to_close_door > 0) {
time_to_close_door -= 1;
if (time_to_close_door == 0) {
say("The door swings shut.\n");
door_is_open = 0;
}
}
if (moving_time <= 0)
return;
moving_time -= 1;
if (moving_time > 0) {
say("The elevator continues...\n");
return;
}
say("The elevator slows down and stops\n");
set_heart_beat(0);
level = dest;
if (level == 2)
call_other("room/church", "elevator_arrives", 0);
if (level == 1)
call_other("room/wiz_hall", "elevator_arrives", 0);
}
open_door(str)
{
if (str != "door")
return 0;
if (door_is_open) {
write("It is already open!\n");
return 1;
}
if (moving_time > 0) {
write("The door is stuck.\n");
return 1;
}
door_is_open = 1;
time_to_close_door = 3;
write("Ok.\n");
say(call_other(this_player(), "query_name", 0) + " opened the door.\n");
return 1;
}
close_door(str)
{
if (str != "door")
return 0;
if (!door_is_open) {
write("It is closed!\n");
return 1;
}
door_is_open = 0;
time_to_close_door = 0;
write("Ok.\n");
say(call_other(this_player(), "query_name", 0) + " closed the door.\n");
return 1;
}
go_east() {
if (moving_time > 0) {
write("You can't go anywhere when the elevator is moving.\n");
return 1;
}
if (!door_is_open) {
write("The door is closed.\n");
return 1;
}
if (level == 2)
call_other(this_player(), "move_player", "east#room/church");
if (level == 1)
call_other(this_player(), "move_player", "east#room/wiz_hall");
if (level == 3)
call_other(this_player(), "move_player", "east#room/attic");
return 1;
}
query_level() { return level; }
/*
* This routine is called from various rooms that the elevator connects to.
*/
call_elevator(button) {
if (door_is_open)
return 0;
if (moving_time > 0)
return 0;
dest = button;
if (dest == level)
return 0;
write("A little white lamp beside the button lights up.\n");
say("A little white lamp beside the button lights up.\n");
if (dest > level)
moving_time = dest - level;
if (level > dest)
moving_time = level - dest;
if (dest == 1 || level == 1)
moving_time += 10;
moving_time += 1;
set_heart_beat(1);
return 1;
}
id(str) {
return str == "door" || str == "button" || str == "buttons";
}
/*
* Only list inventory if not looking at anything special.
*/
can_put_and_get()
{
return 0;
}
/*
* Called by others to see if the elevator is moving
*/
is_moving() {
if (level == dest )
/* Still */
return 0;
if(level > dest)
/* down */
return 1;
/* up */
return 2;
}
query_drop_castle() {
return 1;
}