#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. */
void init() {
add_action("press", "press");
add_action("press", "push");
add_action("open_door", "open");
add_action("close_door", "close");
add_action("go_east", "east");
}
string short() {
return "elevator";
}
void reset(int arg) {
door_is_open = 0;
if (arg)
return;
set_light(1);
level = 2;
dest = 2;
moving_time = 0;
}
/*
* Return true if closed door.
*/
int query_door() { return !door_is_open; }
void 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");
}
int press(string 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;
}
void 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)
"room/church"->elevator_arrives();
if (level == 1)
"room/wiz_hall"->elevator_arrives();
}
int open_door(string 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(this_player()->query_name() + " opened the door.\n");
return 1;
}
int close_door(string 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(this_player()->query_name() + " closed the door.\n");
return 1;
}
int 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)
this_player()->move_player("east#room/church");
if (level == 1)
this_player()->move_player("east#room/wiz_hall");
if (level == 3)
this_player()->move_player("east#room/attic");
return 1;
}
int query_level() { return level; }
/*
* This routine is called from various rooms that the elevator connects to.
*/
int call_elevator(int 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;
}
int id(string str) {
return str == "door" || str == "button" || str == "buttons";
}
/*
* Only list inventory if not looking at anything special.
*/
int can_put_and_get()
{
return 0;
}
/*
* Called by others to see if the elevator is moving
*/
int is_moving() {
if (level == dest )
/* Still */
return 0;
if(level > dest)
/* down */
return 1;
/* up */
return 2;
}
int query_drop_castle() {
return 1;
}