// doors.c // The standard door object. Any room (or other object if you like) that // contains a door needs to inherit this file. // Originally written by Rusty@TMI-2, 11-92. // He lost his access in January 1993. Mobydick@TMI-2 went back and whipped // the code into shape for the release. // Originally part of room.c. Mobydick seperated in into two files, rooms // and doors, on 2-17-93. This was done to save memory since most rooms do // not contain doors and do not need this code. // Prototypes for functions defined in room.c. varargs void set (string foo, mixed data, string perms) ; mixed query (string foo) ; void add (string foo, mixed data) ; // Homegrown prototypes. void set_desc (string dir) ; void initialize_link (string dir) ; // This function creates a door for a previously existing exit. // If all you want is a door that opens and closes, this is enough. // Ex. create_door("east", "west", "A simple wooden door"); // varargs void create_door( string dir, string linked_exit, string door_desc, string door_stat, string lock) { set("doors/"+dir+"/linked", linked_exit); set("doors/"+dir+"/lock", lock) ; if (!door_desc) door_desc = "A door"; set("doors/"+dir+"/desc", door_desc); set ("doors/"+dir+"/status", door_stat) ; set_desc(dir) ; initialize_link(dir) ; return; } // A function to set various door attributes. // For value use "open" or "closed" or "locked".. void set_status(string dir, string value) { set("doors/"+dir+"/status", value); set_desc(dir); } void set_desc( string dir ) { add( "item_desc", ([ dir + " door" : query("doors/"+dir+"/desc") + ". It is "+ query("doors/"+dir+"/status") +".\n" ]) ) ; return; } // This function initializes a doorway linkage. When you create a new // door with a link, this function queries the linked door and sets the // status of this door to match the status of that door. void initialize_link (string dir) { int i; string ob_dir, ob_status, link ; object ob; mapping doors; link = this_object()->query("doors/"+dir+"/linked") ; if (link && link!="none") { if (ob = find_object((string)query("exits/"+dir))) { ob_dir = (string)query("doors/"+dir+"/linked"); ob_status = (string)ob->query("doors/"+ob_dir+"/status") ; set_status(dir, ob_status); } } return; } // This function updates a doorway link. When called, it finds the door // linked to this door and sets that door's status to match this door. // The difference between initialize_link and update_link is that initialize // causes this room's door to match the remote door, but update causes the // remote door to match this room's door. void update_link (string dir) { int i; string link ; string ob_dir; string door_stat ; string old_stat ; object ob; link = this_object()->query("doors/"+dir+"/linked") ; if (link && link != "none") { if (ob = find_object((string)query("exits/"+dir))) { door_stat = (string)query("doors/"+dir+"/status") ; ob_dir = (string)query("doors/"+dir+"/linked"); old_stat = (string)ob->query("doors/"+ob_dir+"/status") ; ob->set_status(ob_dir, door_stat) ; switch (door_stat) { case "open" : { tell_room (ob, "The "+ob_dir+" door swings open.\n") ; break ; } case "locked" : { tell_room(ob,"You hear a clicking sound from the "+ob_dir+" door.\n") ; break ; } case "closed" : { if (old_stat=="locked") { tell_room (ob, "You hear a clicking sound from the "+ob_dir+" door.\n") ; } else { tell_room (ob, "The "+ob_dir+" door swings shut.\n") ; } break ; } } } } return; } /* EOF */