/** * This inherit adds some support for shopkeeper NPCs for shops. * It has a built in 'shopkeeper' variable, that you should * assign your NPC to, and which will be used to execute the * commands or messages you have set for browsing, buying or * listing the goods. * @author Sandoz, June 2002. * @example * void setup() { * <general room code> * ... * set_use_shopkeeper(); * set_shopkeeper_buy_cmd( ({"'Thank you for your custom.", "beam"}) ); * set_shopkeeper_browse_cmd("'That is one hell of a good item, " * "dontchathink?"); * set_shopkeeper_list_cmd("'That's all I've got today."); * } */ nosave object shopkeeper; nosave mixed shopkeeper_browse_cmd, shopkeeper_buy_cmd, shopkeeper_list_cmd; nosave int use_shopkeeper, busy; private void do_unbusy(); /** * This method queries whether or not the shop is open, * doing all the checks for the existence of the shopkeeper. * It will automatically return 1 if we are not using * a shopkeeper at all. If we are using a shopkeeper * and we fail the checks, an appropriate fail message * will be added to the player. * @return 1 if the shop is open, 0 if not */ int check_shopkeeper_open() { if( !use_shopkeeper ) return 1; if( shopkeeper && ENV(shopkeeper) == TO ) return 1; if( PO == TP ) add_failed_mess("There is no-one here to serve you.\n"); return 0; } /* check_shopkeeper_open() */ /** * This method switches us into shopkeeper mode. * This means the shopkeeper will try to say the set * list/browse/buy messages when appropriate. */ void set_use_shopkeeper() { use_shopkeeper = 1; } /** * This method queries whether or not we are using a shopkeeper. * @return 1 if we are using a shopkeeper NPC, 0 if not */ int query_use_shopkeeper() { return use_shopkeeper; } /** * This method sets the command the shopkeeper should execute * when someone browses our wares. It can be either a string, * an array of strings, or a function pointer. The array of * strings will be executed in the order they are set. * @param cmd the command to set as our browse command * @example * set_shopkeeper_browse_cmd("'A nice piece of armour this."); * @example * void do_thank_player() { * shopkeeper->init_command("thank "+TP->query_name() ); * } * set_shopkeeper_browse_cmd( (: do_thank_player :) ); * @example * set_shopkeeper_browse_cmd( ({"'A nice piece of armour this.", * "beam"}) ); */ void set_shopkeeper_browse_cmd( mixed cmd ) { shopkeeper_browse_cmd = cmd; } /* set_shopkeeper_browse_cmd() */ /** * This method returns the shopkeeper browse command. * @return the command the shopkeeper will execute when * someone browses something from the shop */ mixed query_shopkeeper_browse_cmd() { return shopkeeper_browse_cmd; } /** * This method sets the message the shopkeeper should say * when someone buys our wares. It can be either a string, * an array of strings, or a function pointer. The array of * strings will be executed in the order they are set. * @param cmd the command to set as our buy command * @example * set_shopkeeper_buy_cmd("'Thank you for your custom."); * @example * void do_thank_player() { * shopkeeper->init_command("thank "+TP->query_name() ); * } * set_shopkeeper_buy_cmd( (: do_thank_player :) ); * @example * set_shopkeeper_buy_cmd( ({"'Thank you for your custom.", "beam"}) ); */ void set_shopkeeper_buy_cmd( string cmd ) { shopkeeper_buy_cmd = cmd; } /* set_shopkeeper_buy_cmd() */ /** * This method returns the shopkeeper buy command. * @return the command the shopkeeper will execute when * someone buys something from the shop */ mixed query_shopkeeper_buy_cmd() { return shopkeeper_buy_cmd; } /** * This method sets the message the shopkeeper should say * when someone lists our wares. It can be either a string, * an array of strings, or a function pointer. The array of * strings will be executed in the order they are set. * @param cmd the command to set as our list command * @example * set_shopkeeper_list_cmd("'Everything I have got is in mint " * "condition, I assure you."); * @example * void do_thank_player() { * shopkeeper->init_command("thank "+TP->query_name() ); * } * set_shopkeeper_buy_cmd( (: do_thank_player :) ); * @example * set_shopkeeper_buy_cmd( ({"'Everything I have got is in mint " * "condition, I assure you.", "beam"}) ); */ void set_shopkeeper_list_cmd( string cmd ) { shopkeeper_list_cmd = cmd; } /* set_shopkeeper_list_cmd() */ /** * This method returns the shopkeeper list command. * @return the command the shopkeeper will execute when * someone lists the inventory of the shop */ mixed query_shopkeeper_list_cmd() { return shopkeeper_list_cmd; } /** @ignore yes */ private void do_unbusy() { if( shopkeeper ) shopkeeper->set_chats_off( 0 ); busy = 0; } /* do_unbusy() */ /** @ignore yes */ private void exec_shopkeeper_cmd( mixed cmd ) { if( use_shopkeeper && !busy && shopkeeper && ENV(shopkeeper) == TO ) { if( stringp( cmd ) ) { shopkeeper->init_command( cmd ); } else if( pointerp( cmd ) ) { string str; int i; foreach( str in cmd ) { shopkeeper->init_command( str, i ); i += 2; } shopkeeper->set_chats_off( busy = 1 ); call_out( (: do_unbusy :), 2 * sizeof(cmd) ); } else if( functionp( cmd ) ) { evaluate( cmd ); } } } /* exec_shopkeeper_cmd() */ /** @ignore yes */ protected void do_shopkeeper_browse() { return exec_shopkeeper_cmd( shopkeeper_browse_cmd ); } /* do_shopkeeper_browse() */ /** @ignore yes */ protected void do_shopkeeper_buy() { return exec_shopkeeper_cmd( shopkeeper_buy_cmd ); } /* do_shopkeeper_buy() */ /** @ignore yes */ protected void do_shopkeeper_list() { return exec_shopkeeper_cmd( shopkeeper_list_cmd ); } /* do_shopkeeper_list() */ /** @ignore yes */ mixed stats() { return ({ ({"using shopkeeper", use_shopkeeper }), ({"shopkeeper", shopkeeper }), ({"shopkeeper busy", busy }), }); } /* stats() */