/** * A printing workshop so that players can create their own books runs. * <P> * This can be divided up into two rooms, an office (where you pay for * the printing to be done) and a collection room (where you do the collection). * To enable this behaviour the collection room needs to know about the * office. The office stores all the information, so you call * set_office_room(room_path); on the collection room and * set_no_collection() on the office. * * @author Pinkfish * @started Thu Jan 29 17:55:47 CST 1998 * @see set_office_room() * @see set_no_collection(); */ #include <language.h> #include <money.h> #include <book_handler.h> inherit "/std/room/basic_room"; #define COPYRIGHT_NUMBER 3 nosave mixed *discount_schedule; mapping collectables; int current_save_number; nosave int letter_cost; nosave int time_to_collect; nosave int time_per_copy; nosave string save_dir; nosave string office_room; nosave int no_collection; nosave function open_func; nosave string default_language; nosave mapping translation_costs; nosave string print_shop_name; #define SCHEDULE_NUM 1 #define SCHEDULE_PERCENTAGE 0 #define COLLECT_TIME 0 #define COLLECT_NUM 1 #define COLLECT_OB_NAME 2 #define COLLECT_LANGUAGE 3 #define COLLECT_AUTO_LOAD_NUM 4 #define COLLECT_ARR_SIZE 5 #define BINDING_COST 600 // This is the cost for every 10 letters. #define DEFAULT_LETTER_COST 1 #define DEFAULT_TIME_TO_COLLECT (8*60*60) #define DEFAULT_TIME_PER_COPY (20*60) /* 100 copies. Wheee... */ #define MAX_NUMBER 30 int price_object(object ob, int num, string language); protected int do_print_copies(object *obs, int num, string language); protected int do_print(object *obs, string language); protected int do_claim(object *obs); protected int do_collect(); void do_print_run(object ob, int number, int cost, string language); void print_pricing(object ob, string language); void remove_print_run(string name, mixed *info); mixed *query_print_run(string name); void add_print_run(string name, object ob, int number, string language); void load_it(); void save_it(); string query_print_shop_name(); string query_static_auto_load_info(int num); mapping query_dynamic_auto_load_info(int num); protected int add_auto_load_info(string static, string dynamic); private object create_fly_leaf(object book, string language); private void remove_auto_load_info(int num); void create() { letter_cost = DEFAULT_LETTER_COST; time_to_collect = DEFAULT_TIME_TO_COLLECT; time_per_copy = DEFAULT_TIME_PER_COPY; collectables = ([ ]); discount_schedule = ({ ({ 100, 5 }), ({ 95, 10 }), ({ 90, 20 }), ({ 80, 101 }) }); default_language = "common"; translation_costs = ([ ]); print_shop_name = "Rabbits happy little printing press"; ::create(); load_it(); add_help_file("print_shop"); } /* setup() */ /** @ignore yes */ void init() { string languages; if (!office_room) { add_command("print", "<indirect:object>", (: do_print($1, default_language) :)); add_command("print", "<number> [copies] of <indirect:object>", (: do_print_copies($1, $4[0], default_language) :) ); add_command("claim", "copyright on <indirect:object>", (: do_claim :)); if (sizeof(translation_costs)) { /* If there are some languages we can translate to. */ languages = implode(keys(translation_costs) + ({ default_language }), "|"); add_command("print", "<indirect:object> in {" + languages + "}", (: do_print($1, $4[1]) :)); add_command("print", "<number> [copies] of <indirect:object> in " "{" + languages + "}", (: do_print_copies($1, $4[0], $4[2]) :) ); } } if (!no_collection) { add_command("collect", "", (: do_collect :)); } } /* init() */ /** * This method checks to make sure that the player is the correct holder * of the copyright and that the book is still copyright. * @param book the book to check * @return 1 if it is copyright */ protected int is_copyright(object book) { if (BOOK_HANDLER->check_book_same(book, book->query_book_num())) { return 1; } return 0; } /* is_copyright() */ /** * This method returns the current copyright holder of the object. * @param book the book to get the copyright of * @return the name of the copyright holder, 0 if none */ protected string copyright_holder(object book) { return BOOK_HANDLER->query_book_owner(book->query_book_num()); } /* copyright_holder() */ /** * This method sets up the copyright for the objects. This will check for * existing copyright status and then check with the book handler to see * if it still fits the criteria. If it does not then it will add itself * as a new book. * @param obs the objects to claim copyright on */ protected int do_claim(object *obs) { object ob; object *already_copyright; object *new_copyright; object *cannot_copyright; string name; string place; int value; int player_money; already_copyright = ({ }); new_copyright = ({ }); cannot_copyright = ({ }); name = this_player()->query_name(); foreach (ob in obs) { if (!ob->query_book()) { cannot_copyright += ({ ob }); } else if (is_copyright(ob)) { already_copyright += ({ ob }); } else { new_copyright += ({ ob }); } } if (!sizeof(new_copyright)) { if (sizeof(cannot_copyright)) { add_failed_mess("You cannot copyright $I.\n", cannot_copyright); } if (sizeof(already_copyright) == 1) { add_failed_mess("$I is copyrighted.\n", already_copyright); } else { add_failed_mess("$I are copyrighted.\n", already_copyright); } return 0; } place = query_property( "place" ); if ( !place || ( place == "" ) ) { place = "default"; } /* Otherwise we will try for the new copyright value on these guys. */ value = 0; foreach (ob in new_copyright) { value += price_object(ob, COPYRIGHT_NUMBER, default_language); } player_money = (int)this_player()->query_value_in( place ); if ( place != "default" ) { player_money += (int)this_player()->query_value_in( "default" ); } write("It will cost you " + MONEY_HAND->money_value_string( value, place ) + " to make " + query_multiple_short(new_copyright) + " copyright.\n"); if (player_money > value) { write("Do you wish to continue? "); input_to("check_copyright", 0, new_copyright, value); } else { write("Although you do not currently have enough money.\n"); } add_succeeded_mess( ({ "", "$N enquires about copyrighting $I.\n" }), new_copyright); return 1; } /* do_claim() */ /** @ignore yes */ protected void check_copyright(string str, object *new_copyright, int value) { int new_num; object ob; string place; if (!strlen(str) || (str[0] != 'y' && str[0] != 'Y')) { write("Ok, never mind. See you again soon.\n"); return ; } /* Make them pay for it. */ place = query_property( "place" ); if ( !place || ( place == "" ) ) { place = "default"; } this_player()->pay_money( (mixed *)MONEY_HAND->create_money_array( value, place ), place ); /* Add the books to the book handler. */ foreach (ob in new_copyright) { new_num = BOOK_HANDLER->add_book(ob, 0, this_player()->query_name()); ob->set_book_num(new_num); ob->add_property(BH_COPYRIGHT, this_player()->query_name()); } write("Ok, added " + query_multiple_short(new_copyright) + " as a copyright book.\n"); } /* check_copyright() */ /** * This is when the player comes back to collect the book they have * printed. * @return 1 on success, 0 on failure */ protected int do_collect() { object new_ob; object page; object fly_leaf; int i; int j; int number; int no_printed; string ob_name; mixed static_arg; mixed dynamic_arg; string language; mixed *info; mixed *stuff; mixed *collectables; mixed room; int auto_load_num; if (open_func) { if (!evaluate(open_func)) { return 0; } } if (office_room) { room = office_room; } else { room = this_object(); } collectables = room->query_print_run(this_player()->query_name()); if (!collectables) { add_failed_mess("No books available for collection.\n"); return 0; } /* Ok, now see if they have waited long enough. */ no_printed = 0; foreach (info in collectables) { if (time() < info[COLLECT_TIME]) { add_failed_mess("You need to wait until " + amtime(info[COLLECT_TIME]) + " to collect your book.\n"); continue; } /* Ok, they are here. Whoo. Lets do it. */ auto_load_num = info[COLLECT_AUTO_LOAD_NUM]; static_arg = room->query_static_auto_load_info(auto_load_num); dynamic_arg = room->query_dynamic_auto_load_info(auto_load_num); ob_name = info[COLLECT_OB_NAME]; number = info[COLLECT_NUM]; language = info[COLLECT_LANGUAGE]; /* Remove the run now... */ if (office_room) { office_room->remove_print_run(this_player()->query_name(), info); } else { remove_print_run(this_player()->query_name(), info); } /* First create ourselves a book. */ new_ob = clone_object(ob_name); if (static_arg) { new_ob->init_static_arg(static_arg); } if (dynamic_arg) { new_ob->init_dynamic_arg(dynamic_arg); } /* Close the book first. */ new_ob->set_open_page(0); /* Add in the fly leaf and fix the languages. */ for (j = 0; j < new_ob->query_num_pages(); j++) { if (j > 0) { page = new_ob->query_selected_page(j); } else { new_ob->set_open_page(0); page = new_ob; } /* See if we have a fly leaf... */ if (j == 1) { fly_leaf = create_fly_leaf(new_ob, language); if (page->query_property(BH_IGNORE_PAGE)) { /* Replace it with our one... */ new_ob->replace_page_with(fly_leaf, j); } else { /* Add a new page. */ new_ob->add_page_after(fly_leaf, j - 1); } page = new_ob->query_selected_page(j + 1); } /* Fix up the language for all the messages. */ stuff = page->query_read_mess(); foreach (info in stuff) { if (info[READ_LANG] != language) { /* * Hopefully this allows the evil array changing stuff * to occur... */ info[READ_LANG] = language; } } page->set_read_mess(stuff); } static_arg = new_ob->query_static_auto_load(); dynamic_arg = new_ob->query_dynamic_auto_load(); /* Kill the sample one. */ new_ob->dest_me(); for (i = 0; i < number; i++) { new_ob = clone_object(ob_name); new_ob->set_player(this_player()); if (static_arg) { new_ob->init_static_arg(static_arg, this_player()); } if (dynamic_arg) { new_ob->init_dynamic_arg(dynamic_arg, this_player()); } new_ob->move(this_object()); } if (number > 1) { write("Ok, your " + query_num(number, 1000) + " copies of " + new_ob->the_short() + " have been placed on the floor here.\n"); } else { write("Ok, your copy of " + new_ob->the_short() + " has been placed on the floor here.\n"); } no_printed++; } return no_printed; } /* do_collect() */ private object create_fly_leaf(object book, string language) { object page; page = book->create_default_page_object(); if (is_copyright(book)) { page->add_read_mess("\n\nPrinted " + amtime(time()) + " by " + query_print_shop_name() + "\n\nCopyright " + this_player()->query_name(), 0, language); } else { page->add_read_mess("\n\nPrinted " + amtime(time()) + " by " + query_print_shop_name() + "\n", 0, language); } page->add_property(BH_IGNORE_PAGE, 1); return page; } /* create_fly_leaf() */ /** * Checks to see if the object has any magic writing on it. * @return 1 if there is magic writing, 0 if not. * @see find_book_or_paper() * @see /obj/handlers/language->query_language_magic() */ int check_for_magic_writing(object ob) { mixed *stuff; int i; stuff = ob->query_read_mess(); for (i = 0; i < sizeof(stuff); i++) { if (LANGUAGE_HAND->query_language_magic(stuff[i][READ_LANG])) { return 1; } } return 0; } /* check_for_magic_writing() */ /** * Checks to see if the book contains a language we cannot translate. * @param ob the book to check for languages * @return 1 if there is a language we cannot deal with * @see check_magic_writing() * @see find_book_or_paper() * @see set_default_language() * @see add_translation_cost() */ int check_for_untranslatable_language(object ob) { mixed *stuff; int i; string lang; stuff = ob->query_read_mess(); for (i = 0; i < sizeof(stuff); i++) { lang = stuff[i][READ_LANG]; if (lang != default_language && !translation_costs[lang]) { return 1; } } return 0; } /* check_for_untranslatable_language() */ /** * This method finds a single book or piece of paper to work on. It will * return 0 if multiple objects are found, or none are found. It will * set the error message appropriately. * @param obs the objects to check for a book or paper * @return the book or paper found * @see check_magic_writing() */ object find_book_or_paper(object *obs) { object *paper; object *books; object *magic; object *torn_out; object *nothing; object ob; int page; int old_page; string owner; paper = ({ }); books = ({ }); magic = ({ }); torn_out = ({ }); nothing = ({ }); foreach (ob in obs) { owner = copyright_holder(ob); if (is_copyright(ob) && owner != this_player()->query_name()) { add_failed_mess("$I has been copyrighted by " + owner + " and cannot be copied.\n", ({ ob })); } else if (ob->query_book()) { if (ob->query_spell_book()) { magic += ({ ob }); } else { /* Check to see if it has any magic writting... */ old_page = ob->query_open_page(); for (page = 0; page <= ob->query_num_pages(); page++) { ob->set_open_page(page); if (ob->is_current_page_torn_out()) { torn_out += ({ ob }); break; } if (check_for_magic_writing(ob)) { magic += ({ ob }); break; } } ob->set_open_page(old_page); if (page == ob->query_num_pages() + 1) { books += ({ ob }); } } } else if (ob->query_paper()) { if (check_for_magic_writing(ob)) { magic += ({ ob }); } else { paper += ({ ob }); } } else { nothing += ({ ob }); } } if (sizeof(magic)) { add_failed_mess("$I have magic writing in them and cannot be copied.\n", magic); } if (sizeof(torn_out)) { add_failed_mess("$I have pages torn out and cannot be copied.\n", torn_out); } if (!sizeof(books) && !sizeof(paper)) { if (sizeof(nothing)) { add_failed_mess("Unable to print $I as they are not a book or paper.\n", nothing); } return 0; } if (sizeof(books + paper) > 1) { add_failed_mess("Can only do print one book or piece of paper at a time. " "Please be more specific and choose from " + query_multiple_short(books + paper) + ".\n"); return 0; } if (sizeof(books) > 0) { return books[0]; } return paper[0]; } /* find_book_or_paper() */ /** * This method will be called by the print add_command. It will print out * the pricing schedule and how long the item will take to make. * @param obs the objects which have been matched * @param language the language to print the book in * @return 1 on success, 0 on failure * @see do_print_copies() */ int do_print(object *obs, string language) { object ob; if (open_func) { if (!evaluate(open_func, obs)) { return 0; } } /* Ok, now we have our book or bit of paper... */ ob = find_book_or_paper(obs); if (!ob) { return 0; } print_pricing(ob, language); write("Use: print <number> of <book>\n"); add_succeeded_mess(({ "", "$N enquires about the cost of printing a book.\n" })); return 1; } /* do_print() */ /** * This method will be called when the player tries to print a certain * number of copies of a book. * @param obs the objects which have been matched * @param number the number of prints to do * @param language the language to print the book in * @return 1 on success, 0 on failure * @see do_print() */ int do_print_copies(object *obs, int number, string language) { object ob; int cost; int player_money; string place; if (open_func) { if (!evaluate(open_func, obs)) { return 0; } } if (number < 1) { add_failed_mess("Must print at least one copy.\n", obs); return 0; } if (number > MAX_NUMBER) { add_failed_mess("Cannot print more than " + MAX_NUMBER + " copies.\n", obs); return 0; } place = query_property( "place" ); if ( !place || ( place == "" ) ) { place = "default"; } ob = find_book_or_paper(obs); if (!ob) { return 0; } cost = price_object(ob, number, language); /* Check to see if they can afford it. */ player_money = (int)this_player()->query_value_in( place ); if ( place != "default" ) { player_money += (int)this_player()->query_value_in( "default" ); } if (player_money < cost) { add_failed_mess("This will cost you " + (string)MONEY_HAND->money_value_string( cost, place ) + " and you do not have enough " "money to afford it.\n", ({ ob })); return 0; } if (is_copyright(ob)) { write("NOTE: You are printing a copyright document.\n"); } else { write("NOTE: Please use 'claim copyright' to claim copyright " "on a document.\n"); } add_succeeded_mess(({ "This will cost you " + (string)MONEY_HAND->money_value_string( cost, place ) + " to do, do you wish to continue? ", "$N starts to do some printing.\n" })); input_to("check_cost", 0, ob, number, cost, language); return 1; } /* do_print_copies() */ /** @ignore yes */ void check_cost(string str, object ob, int number, int cost, string language) { if (strlen(str) < 1 || (str[0] != 'y' && str[0] != 'Y')) { write("Ok, don't worry. See you again.\n"); return ; } do_print_run(ob, number, cost, language); } /* check_cost() */ /** * This method does the actual print run. It creates all the objects * and makes the player pay for them all. * @param ob the object to print * @param number the number to print * @param cost the cost of the object * @param the language to translate things to * @see do_print_copies() */ void do_print_run(object ob, int number, int cost, string language) { string place; int player_money; mixed *stuff; /* Does the print run... First we make the players pay! */ place = query_property( "place" ); if ( !place || ( place == "" ) ) { place = "default"; } /* Check to see if they can afford it. */ player_money = (int)this_player()->query_value_in( place ); if ( place != "default" ) { player_money += (int)this_player()->query_value_in( "default" ); } if (player_money < cost) { write("You do not seem to have enough money any more.\n"); return ; } /* Get them to give us the money first :) */ this_player()->pay_money( (mixed *)MONEY_HAND->create_money_array( cost, place ), place ); add_print_run(this_player()->query_name(), ob, number, language); stuff = query_print_run(this_player()->query_name()); if (no_collection) { write("The copies will be ready at " + amtime(stuff[<1][COLLECT_TIME]) + " for 'collect'ion at the " "collection office.\n"); } else { write("The copies will be ready at " + amtime(stuff[<1][COLLECT_TIME]) + " for 'collect'ion.\n"); } } /* do_print_run() */ /** * Figure out how much this object will cost to make. * @param ob the object to price * @param num the number of them to print * @return the cost of the item */ int price_object(object ob, int num, string to_language) { int i; int num_letters; int multiplier; int cost; mixed *stuff; if (num <= 0 || !ob) { return 0; } /* If it is a book, make sure we count the title... */ ob->set_open_page(0); stuff = ob->query_read_mess(); for (i = 0; i < sizeof(stuff); i++) { /* Figure out how many letters we have. */ num_letters += strlen(stuff[i][READ_MESS]); if (stuff[i][READ_LANG] != default_language) { cost = translation_costs[stuff[i][READ_LANG]]; if (!cost) { cost = 1000; } num_letters = (num_letters * cost) / 100; } if (to_language != default_language) { cost = translation_costs[to_language]; if (!cost) { cost = 1000; } num_letters = (num_letters * cost) / 100; } } cost = ob->query_value() + (num_letters / 10) * letter_cost; if (ob->query_book()) { for (i = 1; i < ob->query_num_pages(); i++) { ob->set_open_page(i + 1); if (ob != ob->query_current_page()) { cost += price_object(ob->query_current_page(), 1, to_language); } } /* Plus cost for binding and stuff... */ cost += BINDING_COST; } /* Ok, find the costing stuff... */ multiplier = 200; for (i = 0; i < sizeof(discount_schedule); i++) { if (num < discount_schedule[i][SCHEDULE_NUM]) { multiplier = discount_schedule[i][SCHEDULE_PERCENTAGE]; } } return (cost * num * multiplier) / 100; } /* price_object() */ /** * This method will print out the pricing schedule for the object. * @param ob the object to get a pricing schedule of. */ void print_pricing(object ob, string language) { int i; int num; string place; int cost; place = query_property( "place" ); if ( !place || ( place == "" ) ) { place = "default"; } /* * This is the cost for one of them... We do discounts if they * print a bunch. */ write("The cost for the different numbers of " + ob->the_short() + " is:\n"); write(" 1 for " + (string)MONEY_HAND->money_value_string( price_object(ob, 1, language), place ) + " and will be ready at " + amtime(time_to_collect + time_per_copy + time()) + ".\n");; for (i = 0; i < sizeof(discount_schedule); i++) { num = discount_schedule[i][SCHEDULE_NUM]; if (num < MAX_NUMBER) { write(sprintf("%3d for %s and will be ready at %s.\n", num, (string)MONEY_HAND->money_value_string( price_object(ob, num, language), place ), amtime(time_to_collect + time_per_copy * num + time()) )); } } if (sizeof(translation_costs)) { write("You can translate a book to or from " + query_multiple_short(keys(translation_costs) + ({ default_language })) + ", the cost of doing the translation is defined in the " "following table."); if (sizeof(translation_costs) > 2) { write(" Translating between two of these languages " "is also possible, but it will cost the amount to translate " "from the language to " + default_language + " and back again."); } write("\n"); foreach (language, cost in translation_costs) { write(sprintf(" %3d%% %s", cost, language)); } write("\n"); } } /* print_pricing() */ /** * This method returns the discount schedule. There is a default discount * schedule setup for printing shops. The discount schedule tells how much * of a discount you get for certain numbers of a run. It returns * an array of the form: * <pre> * ({ ({ numn1, dis1 }), ({ num2, dis2}), ... }) * </pre> * Where each number is the discount amount for printing less than that * number of items. The array must be sorted from the lowest number to * the highest number. * @return the discount schedule * @see set_discount_schedule() */ mixed *query_discount_schedule() { return discount_schedule; } /* query_discount_schedule() */ /** * Sets the discount schedule for this object. See the query_discount_schedule * help for the format of the array. * @param value the new discount schedule. * @see query_discount_schedule() */ void set_discount_schedule(mixed *value) { discount_schedule = value; } /* set_discount_schedule() */ /** * This queries the cost per letter. * @return the cost per letter * @see set_letter_cost() * @see print_cost() */ int query_letter_cost() { return letter_cost; } /* query_letter_cost() */ /** * This queries the cost per letter. * @param value the new cost per letter * @see query_letter_cost() * @see print_cost() */ void set_letter_cost(int value) { letter_cost = value; } /* query_letter_cost() */ /** * This adds an object into the current set to be collected. This handles * figuring out the nice number to use for the static and dynamic save * numbers. * @param name the name of the person adding the run * @param ob the object being added * @param cost the cost of the object * @param number the number to be printer * @see do_collect() * @see query_print_run() */ void add_print_run(string name, object ob, int number, string language) { mixed *arr; int num; if (!collectables[name]) { collectables[name] = ({ }); } arr = allocate(COLLECT_ARR_SIZE); arr[COLLECT_TIME] = time() + time_to_collect + time_per_copy * number; arr[COLLECT_NUM] = number; arr[COLLECT_LANGUAGE] = language; arr[COLLECT_OB_NAME] = base_name(ob); num = add_auto_load_info(ob->query_static_auto_load(), ob->query_dynamic_auto_load()); arr[COLLECT_AUTO_LOAD_NUM] = num; collectables[name] += ({ arr }); save_it(); } /* add_print_run() */ /** * This method returns the array of documents awaiting collection. If there * are not documents this returns 0. * @param name the player to query * @return an array containing the player information, or 0 if none * @see add_print_run() * @see /include/print_shop.h */ mixed *query_print_run(string name) { return collectables[name]; } /* query_print_run() */ /** * This method will remove a players print run. * @param name the player whose print run is to be removed. * @see query_print_run() * @see add_print_run() */ void remove_print_run(string name, mixed *info) { int index; if (collectables[name]) { index = member_array(info, collectables[name]); if (index != -1) { /* Remove the save files... */ remove_auto_load_info(info[COLLECT_AUTO_LOAD_NUM]); collectables[name] = collectables[name][0.. index - 1] + collectables[name][index + 1..]; if (!sizeof(collectables[name])) { map_delete(collectables, name); } save_it(); } } } /* remove_print_run() */ /** * This method saves the autoload information out to a file and returns * the number associated with the file. * @param static_arg the static auto load information * @param dynamic_arg the dynamic auto load information * @return the number associated with the save files */ protected int add_auto_load_info(string static, string dynamic) { int num; num = current_save_number; while (unguarded( (: file_size(save_dir + "/" + $(num)) :) ) > 0) { num++; } current_save_number = num + 1; unguarded( (: write_file(save_dir + "/" + $(num), save_variable( ({ $(static), $(dynamic) }) ) + "\n") :) ); return num; } /* add_auto_load_info() */ /** * This method removes the files associated with the auto load information. * @param num the auto load number */ private void remove_auto_load_info(int num) { unguarded( (: rm(save_dir + "/" + $(num) ) :) ); } /* remove_auto_load_info() */ /** * This method returns static the autoload information associated with the * file. * @param num the number associated with the information * @return the static auto load string, 0 if none */ string query_static_auto_load_info(int num) { string *arr; string tmp; if (unguarded( (: file_size(save_dir + "/" + $(num)) :) ) > 0) { tmp = unguarded( (: read_file(save_dir + "/" + $(num)) :) ); if (tmp) { arr = restore_variable(tmp); return arr[0]; } } return 0; } /* query_static_auto_load_info() */ /** * This method returns dynamic the autoload information associated with the * file. * @param num the number associated with the information * @return the dynamic auto load string, 0 if none */ mapping query_dynamic_auto_load_info(int num) { mixed arr; string tmp; if (unguarded( (: file_size(save_dir + "/" + $(num)) :) ) > 0) { tmp = unguarded( (: read_file(save_dir + "/" + $(num)) :) ); if (tmp) { arr = restore_variable(tmp); return arr[1]; } } return 0; } /* query_static_auto_load_info() */ /** * Sets the save file name. * @param name the name of the save file * @see query_save_dir() * @see load_it() * @see save_it() */ void set_save_dir(string name) { save_dir = name; } /* set_save_dir() */ /** * Returns the save file name * @return save file name * @see set_save_dir() * @see load_it() * @see save_it() */ string query_save_dir() { return save_dir; } /* query_save_dir() */ /** * Loads the saved information off the disc. * @see set_save_dir() * @see save_it() */ void load_it() { if (save_dir) { unguarded((: restore_object(save_dir + "/main") :)); if (!collectables) { collectables = ([ ]); } } } /* load_it() */ /** * Saves the information to the disc. * @see set_save_dir() * @see load_it() */ void save_it() { if (save_dir) { unguarded((: save_object(save_dir + "/main") :)); } } /* save_it() */ /** * Sets the office room to which this collection room is associated. If * this is set on a room, you cannot setup print jobs in the room and this * room specified here is queried for the information about the jobs to * collect. * @param room the new office room * @see query_office_room() * @see set_no_collection() */ void set_office_room(string room) { office_room = room; } /* set_office_room() */ /** * Returns the current office room associated with this room. * @return the current office room * @see set_office_room() * @see query_no_collection() */ string query_office_room() { return office_room; } /* query_office_room() */ /** * This sets the no collection flag. It makes it so this room cannot be * used for collections. If this is set then there should be an associated * collection room used to pick up the books from. This room should * use the set_office_room() function to set the office room to use * for the collections. * @param collect the new value of no_collections flag * @see query_no_collection() * @see set_office_room() */ void set_no_collection(int collect) { no_collection = collect; } /* set_no_collection() */ /** * This returns the no collection flag used by the room. * @return the no collection flag * @see set_no_collection() * @see query_office_room() */ int query_no_collection() { return no_collection; } /* query_no_collection() */ /** * This method sets the function to evaluate to check to see if the shop * is open or not. This should set any error messages which are needed. * The objects are passed in as an argument in the do_print functions * and nothing is passed in for the collection check. * @param func the open function * @see query_open_func() * @see do_print() * @see do_print_copies() * @see do_collect() */ void set_open_func(function func) { open_func = func; } /* set_open_func() */ /** * This method returns the current function which is used to check for * the openness of the shop. * @see set_open_func() * @return the current open function */ function query_open_func() { return open_func; } /* query_open_func() */ /** * This method sets the default language to use in the print shop. * Anything written in this language will cost nothing extra to * duplicate. * @param lang the new default language * @see query_default_language() * @see add_translation_cost() * @see check_for_untranslatable_language() */ void set_default_language(string lang) { default_language = lang; } /* set_default_language() */ /** * This method will return the current default language for the * print shop. * @return the current default language * @see set_default_language() * @see add_translation_cost() * @see check_for_untranslatable_language() */ string query_default_language() { return default_language; } /* query_default_language() */ /** * This method will add the cost to translate from one language to * another. The default is translating to the common language and * this cost will be used in both directions. ie: the cost of translating * from djelian to common is the same as translating from common to * djelian. If translating between two languages that are not the * default language, say the default is common and we want to translate * from djelian to wombat, then the cost from djelian->common and then * common->wombat will be used. * @param lang the language to set the translation cost of * @param cost the cost is in percentage, 200 means twice the price * @see set_default_language() * @see remove_translation_cost() * @see query_all_translation_costs() */ void add_translation_cost(string lang, int cost) { translation_costs[lang] = cost; } /* add_translation_cost() */ /** * This method will remove the translation cost for a specific language. * @param lang the language to remove the translation cost of * @see set_default_language() * @see add_translation_cost() * @see query_all_translation_costs() */ void remove_translation_cost(string lang) { map_delete(translation_costs, lang); } /* remove_translation_cost() */ /** * This method will return a mapping of all the translation costs. * The keys are the languages and the values are the costs in terms * of percentages. * @return the current translation cost mapping * @see add_translation_cost() * @see remove_translation_cost() */ mapping query_all_translantion_costs() { return translation_costs; } /* query_all_translation_costs() */ /** * This method sets the name of the print shop which will be used on * books when they are printed. This is only needed in the collection * room, this is the name that is placed on the fly leaf. * @param name the name of the print shop */ void set_print_shop_name(string name) { print_shop_name = name; } /* set_print_shop_name() */ /** * This method will return the current name of the print shop. * @return the name of the print shop */ string query_print_shop_name() { return print_shop_name; } /* query_print_shop_name() */