/**
* This is a specialisation of the craft shop inheritable. It adds in the
* ability to read specified pages from books.
* @author Pinkfish
* @started Thu Sep 10 23:51:01 PDT 1998
*/
#include <shops/craft_shop.h>
inherit CRAFT_SHOP_INHERIT;
#define READ_PAGE_PROPERTY "browse page"
int browse_pages(object *obs);
protected int choose_which_page(function end_func, int value,
string name, object *sellables);
private void finish_choose(string page_num, function end_func, int value,
string name, object *sellables);
/** @ignore yes */
void init() {
string storeroom;
::init();
storeroom = file_name(query_controller()->query_sell_list());
add_command("browse", "page of <indirect:object:" + storeroom + ">",
(: browse_pages($1) :) );
set_extra_sell_check((: choose_which_page :));
} /* init() */
/**
* This is like a normal browse, but it allows us to look at specific pages
* in the book.
* @param number the page number to browse
* @param obs the objects whose pages to browse
* @return 0 on failure, 1 on success
*/
int browse_pages(object *obs) {
object *real_obs;
object ob;
int number;
string mess;
string read;
object *no_pages;
object *ok;
int i;
// Check to make sure the shop is open.
if (!check_open(this_player(), "browse")) {
return 0;
}
real_obs = query_controller()->create_all_real_objects(this_player(), obs);
mess = "$P$Browse page$P$";
no_pages = ({ });
ok = ({ });
for (i = 0; i < sizeof(obs); i++) {
ob = real_obs[i];
number = ob->query_property(READ_PAGE_PROPERTY);
if (undefinedp(number)) {
number = random(ob->query_num_pages() - 1) + 1;
ob->add_property(READ_PAGE_PROPERTY, number);
query_controller()->update_craft_object(obs[i], real_obs[i]);
}
if (number > ob->query_num_pages()) {
no_pages += ({ ob });
} else {
ob->set_open_page(number);
mess += ob->the_short() + ":\n" + ob->long();
read = ob->query_readable_message();
if (read) {
mess += "You read " +
replace(ob->query_read_short(this_player()), "$name$",
ob->a_short()) + ":\n" +
ob->query_readable_message();
}
ok += ({ ob });
}
}
if (sizeof(ok)) {
add_succeeded_mess(({ mess, "$N browses a page of $I.\n" }), ok);
return 1;
} else {
add_failed_mess("There are not enough pages in $I to open to " +
" page " + number + ".\n", no_pages);
return 0;
}
} /* browse_pages() */
/**
* This method gets the player to choose a page to allow to browse
* @param end_func the function to evaluate when finished
* @param value the value of the sellables
* @param name the name to sell the object for
* @param sellables the objects to sell
*/
protected int choose_which_page(function end_func, int value,
string name, object *sellables) {
write("Which page of " + query_multiple_short(sellables) +
" would you like to let people browse (0 for the cover only)? ");
input_to((: finish_choose :), 0, end_func, value, name, sellables);
} /* choose_which_page() */
/**
* This finishes the choose page thingy.
*/
private void finish_choose(string page_num, function end_func, int value,
string name, object *sellables) {
int page;
object *invalid;
if (page_num == "quit" ||
page_num == "q") {
write("Aborting sale.\n");
return ;
}
if (sscanf(page_num, "%d", page) != 1) {
write("Need to actually enter a number.\n");
write("Which page of " + query_multiple_short(sellables) +
" would you like to let people browse? ");
input_to((: finish_choose :), 0, end_func, value, name, sellables);
return ;
}
if (page < 0) {
write("Need to specify a page number greator than zero.\n");
write("Which page of " + query_multiple_short(sellables) +
" would you like to let people browse? ");
input_to((: finish_choose :), 0, end_func, value, name, sellables);
return ;
}
invalid = filter(sellables, (: $1->query_num_pages() < $(page) :) );
if (sizeof(invalid)) {
write("Page Number " + page + " is larger the number of pages in " +
query_multiple_short(invalid) + ".\n");
write("Which page of " + query_multiple_short(sellables) +
" would you like to let people browse? ");
input_to((: finish_choose :), 0, end_func, value, name, sellables);
return ;
}
sellables->add_property(READ_PAGE_PROPERTY, page);
sellables->set_open_page(0);
evaluate(end_func, value, name, sellables);
} /* finish_choose() */