/* LIBRARY. v1.02 Angel, January 1994 * Make sure the configs for this room remain the same as * the book which is cloned to the player, otherwise they * may not be able to read the files properly * All library files go in an 'open' dir as below * * */ #include <mudlib.h> #include "/room/city/library/library.cfg" /* fn specs */ string check_borrowed(string str); string write_spaces(string str); string write_underlines(string str); mixed *write_catalogue(string str, int silently); status borrow_book(string arg); string *books_borrowed; inherit ROOM; void reset(status arg) { reset_doors(arg); if(arg) return; load_door(({ "direction", "south door", "file", "room/city/knowl1", "long", "A tall door of red wood, bound with iron and bronze.\n", })); set_weather(2,1,0); set_long( "Tall book shelves tower upwards towards a high vaulted ceiling \n"+ "covered with ornate frescoes dating back to the origin of the \n"+ "great city of Tempus. A long counter of red-brown timber extends\n"+ "along the back half of the library. At one end are two piles of \n"+ "books, obviously ones that have been borrowed and are now awaiting\n"+ "return back to their places on the shelves. At the other end is \n"+ "a few large, leather bound books which contain the list of books\n"+ "within the library.\n"); set_short("the "+MUD_NAME+" library"); set_exits(({ })); set_sign_message( "\t-=[ The "+MUD_NAME+" Library ]=- \n"+ "Commands: borrow <book name> \n"+ " return <book name> \n"+ " browse <catalogue|index> \n"); set_smell("The musty scent of ancient leathers abound in the library.\n"); set_listen("All is silent in this room.\n"); set_items(({ "counter", "The counter is made from the same wood as the shelves around you, \n"+ "polished to a high sheen. The mirror like surface and ornate \n"+ "etchings around the top are unmistakably elven in design", "library", "You're standing in the main library chamber", "book#books#piles#pile", "There are two piles of books at the far end of the counter that \n"+ "the citizens of Tempus have borrowed, and now returned to the library", "shelf#shelves", "The shelves are made from a sturdy, yet ancient red wood, donated \n"+ "from the elven cities to the north when Tempus was built. They now\n"+ "serve to hold thousands of volumes of knowledge. Something the \n"+ "elves value greatly", "ceiling#vaulted ceiling", "High above you, covered in shadow, is the ceiling of the library", "shadow#shadows", "It's too dark up there to see", })); books_borrowed = ({}); } void init() { ::init(); add_action("write_catalogue", "browse"); add_action("borrow_book", "borrow"); add_action("return_book", "return"); } /* turn '_' into spaces...looks better for a list of books rather than a list of files */ string write_spaces(string str) { string tmp1, tmp2; while(sscanf(str, "%s_%s", tmp1, tmp2)) str = tmp1+" "+tmp2; return str; } string write_underlines(string str) { string tmp1, tmp2; while(sscanf(str, "%s %s", tmp1, tmp2)) str = tmp1+"_"+tmp2; return str; } string check_borrowed(string str) { string tmp; tmp = write_spaces(str); tmp = tmp +"....................................................."; tmp = extract(tmp,0,50); if(member_array(str, books_borrowed) != -1) tmp += "Borrowed"; else tmp += "Available"; return tmp; } mixed *write_catalogue(string str, int silently) { string *books, tmp; object ob; int i; books = get_dir(CATALOGUE); if(!str) str == "catalogue"; if(!sizeof(books)) { notify_fail("The library is empty.\n"); return 0; } tell_object(this_player(), "You browse through the catalogue...\n\n"); if(!this_player()->query_invis()) say(this_player()->query_name()+" browses through the catalogue.\n", this_player()); else say("You hear some pages turning...\n",this_player()); if(!silently) { write("\t\tThe Books of the "+MUD_NAME+" Library\n"); for(i=0; i<sizeof(books); i++) { if(i+1 < 10) tmp = (" "+(i+1)+") "+capitalize(check_borrowed(books[i]))+"\n"); else tmp = ((i+1)+") "+capitalize(check_borrowed(books[i]))+"\n"); write_file(CATALOGUE+"cat.txt", tmp); } ob = clone_object("obj/more"); move_object(ob, this_player()); ob -> more(CATALOGUE+"cat.txt"); rm(CATALOGUE+"cat.txt"); } return books; } status borrow_book(string arg) { string *books; object ob; int i; if(!arg) { notify_fail("Borrow what?\n"); return 0; } books = get_dir(CATALOGUE); arg = lower_case(arg); if(!arg) { notify_fail("Borrow what?\n"); return 0; } sscanf(arg, "%d", i); if(i) { if(i > sizeof(books)) { notify_fail("There are not that many books.\n"); return 0; } borrow_book(books[i-1]); return 1; } if(stringp(arg)) { arg = write_underlines(arg); if(member_array(arg, books_borrowed) > -1) { notify_fail("That book has already been borrowed.\n"); return 0; } if(this_player()->query_invis()) { notify_fail("But no one can see you!\n"); return 0; } if(member_array(arg, books) == -1) { notify_fail("There is no such book.\n"); return 0; } if(!this_player()->add_weight(5)) { notify_fail("You can't carry the book!\n"); return 0; } write("You borrow the book '"+capitalize(write_spaces(arg))+"'.\n"); say(this_player()->query_name()+" borrows a book.\n",this_player()); books_borrowed += ({ arg, }); ob = clone_object(BOOK); ob -> set_book(arg); move_object(ob, this_player()); return 1; } return 0; } status return_book(string str) { object ob; int i; if(!str) { notify_fail("Return what book?\n"); return 0; } ob = present(str, this_player()); if(!ob) { notify_fail("You have nothing by that name.\n"); return 0; } if(!ob->query_book()) { notify_fail("That is not a library book.\n"); return 0; } if((i = member_array(ob->query_book(), books_borrowed)) != -1) { books_borrowed = books_borrowed[0..i-1] + books_borrowed[i+1..sizeof(books_borrowed)-1]; if(present(this_player(), this_object())) { write("You return the book "+write_spaces(ob->query_book())+".\n"); say(this_player()->query_name()+" returns a book.\n"); } else { tell_object(this_player(), "The book vanishes, as if by magic.\n"); } } else { write("Error: Book not in borrowed array.\n"); } destruct(ob); return 1; } string *query_books_borrowed() { return books_borrowed; } status query_race_book(string str) { string *races; races = VALID_RACES; return (member_array(str, races) == -1) ? 0 : 1; }