// Do not remove the headers from this file! see /USAGE for more info.
#include <hooks.h>
inherit MOVING_ROOM;
/* The destinations with their lamps lit */
array queue = ({});
void hook_elevator_door_closed();
void setup()
{
set_brief("Elevator");
set_long("You are in the elevator. There are four buttons, labeled 'church', 'attic', 'wiz hall' and 'lima'.$elevator_door");
set_state_description("elevator_door_on", "\nThere is an open door to the east.\n");
set_state_description("elevator_door_off", "\nThere is a closed door to the east.\n");
set_destinations(([
"lima" : "/domains/std/Wizroom",
"attic" : __DIR__ "attic.scr",
"church" : __DIR__ "church.scr",
"wiz hall" : __DIR__ "wiz_hall.scr",
]));
move_to("church");
set_distance("church", "wiz hall", 26);
set_distance("attic", "wiz hall", 32);
set_distance("lima", "church", 16);
set_distance("lima", "attic", 10);
set_distance("lima", "wiz hall", 42);
set_in_progress((: tell_from_inside, this_object(), "The elevator continues ...\n" :), 5);
new(__DIR__ "obj/elevator_button.scr", "church")->move(this_object());
new(__DIR__ "obj/elevator_button.scr", "attic")->move(this_object());
new(__DIR__ "obj/elevator_button.scr", "wiz hall")->move(this_object());
new(__DIR__ "obj/elevator_button.scr", "lima")->move(this_object());
set_objects( ([
__DIR__ "obj/elevator_door" : ({ "east", "church" }),
]) );
add_hook("elevator_door_closed", (: hook_elevator_door_closed :));
}
void move_to(string dest) {
if (dest == "lima" || (dest == "attic" && query_where() != "lima") || (dest == "church" && query_where() == "wiz hall")) {
tell_from_inside(this_object(), "The elevator jerks upward.\n");
} else {
tell_from_inside(this_object(), "The elevator starts moving downward.\n");
}
::move_to(dest);
}
void handle_queue() {
if (query_in_motion()|| !sizeof(queue))
return;
call_hooks("elevator_will_move", HOOK_IGNORE, 0);
}
void hook_elevator_door_closed() {
if (!sizeof(queue))
return;
move_to(queue[0]);
}
/* add a destination to the queue. */
void add_to_queue(string where) {
if (member_array(where, queue) != -1)
return;
queue += ({ where });
handle_queue();
}
void handle_press(string dest) {
this_body()->simple_action("$N $vpress the '" + dest + "' button.\n");
if (query_where() == dest)
call_hooks("elevator_arrived", HOOK_IGNORE, 0, query_location());
else
add_to_queue(dest);
}
void arrive() {
tell_from_inside(this_object(), "The elevator slows down and stops\n");
::arrive();
queue -= ({ query_where() });
call_hooks("elevator_arrived", HOOK_IGNORE, 0, query_location());
}
int call_elevator(string where) {
if (query_where() == where) {
call_hooks("elevator_arrived", HOOK_IGNORE, 0, query_location());
return 0;
}
if (member_array(where, queue) != -1) {
write("Nothing happens.\n");
return 0;
}
add_to_queue(where);
return 1;
}