# Do not remove the headers from this file! see /USAGE for more info. is=moving room brief=elevator light=1 destinations= church:/domains/std/2.4.5/church.scr attic:/domains/std/2.4.5/attic.scr wiz hall:/domains/std/2.4.5/wiz_hall.scr lima:/domains/std/Wizroom end objects= obj/elevator_internal_door.scr end long=You are in the elevator. There are four buttons, labeled 'church', 'attic', 'wiz hall', and 'lima'.$door state[door_on]=\nThere is an open door to the east.\n state[door_off]=\nThere is an closed door to the east.\n setup: lpc 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" :), 1); clear_room_state("door"); 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()); end --- /* The destinations with their lamps lit */ array queue = ({}); int door_closing = 0; int query_door_open() { return query_state("door"); } 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(); void close_the_door() { if (door_closing) { remove_call_out(door_closing); door_closing = 0; } clear_room_state("door"); tell_from_inside(query_location(), "The west door closes.\n"); handle_queue(); } void open_the_door() { set_room_state("door"); tell_from_inside(query_location(), "The west door opens.\n"); } void automatic_close() { door_closing = 0; tell_from_inside(this_object(), "The door closes.\n"); close_the_door(); } void handle_queue() { if (query_in_motion() || !sizeof(queue) || door_closing) return; if (query_door_open()) { door_closing = call_out((: automatic_close :), 15); 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) { write("You are already there.\n"); return; } add_to_queue(dest); } void arrive() { tell_from_inside(this_object(), "The elevator slows down and stops\n"); ::arrive(); add_exit("east", query_location()); queue -= ({ query_where() }); tell_from_inside(this_object(), "The door opens.\n"); open_the_door(); handle_queue(); } mixed can_go_east() { if (!query_state("door")) return "The door is closed.\n"; return 1; } int query_open_at(string where) { return query_door_open() && query_where() == where; } int call_elevator(string where) { string cur = query_where(); if (where == cur || member_array(where, queue) != -1) { write("Nothing happens.\n"); return 0; } this_body()->simple_action("$N $vpress the button, and a little light lamp beside it lights up.\n"); add_to_queue(where); return 1; }