/** * This is a small inheritable to allow places to do engraving. POut a * piece of code inthe init function which calls the engrave_init() * function. * @example * inherit "/std/room/basic_room"; * inherit "/std/shops/engrave"; * * void init() { * basic_room::init(); * engrave_init(); * } /\* init() *\/ * @author Macchirton * @change 17th of May 1998 Pinkfish * Turned into an inheritable mbase and reworked to make work with add_command * correctly. * * Added set_engrave_language(string str) to solve the problem with * "common" engravings * - Danbala, Sept 2002 */ #include <money.h> #include <shops/engrave.h> void set_engrave_language(string str); protected int do_engrave( object *things, string message); mixed query_property(string name); private string _lingo = "general"; //private object shop_keeper; //private int check_shop_keeper; void create() { this_object()->add_help_file("engrave"); } /* create() */ /** * Sets the shop keeper for the engraving shop. If the shop keeper is * not set then it will not be checked for. If it is checked it will be * checked for the existance of. * @param ob the shop keeper to test for * @see query_engrave_shopkeeper() */ //void set_engrave_shopkeeper(object ob) { // check_shop_keeper = 1; // shop_keeper = ob; //} /* set_engrave_shopkeeper() */ /** * This method returns the currently ste shop keeper for the engraving shop. * @return the shop keeper * @see set_engrave_shopkeeper() */ //object query_engrave_shopkeeper() { // return shop_keeper; //} /* query_engrave_shopkeeper() */ /** * This method should be called in the inheriting room's init function. IUt * will setup the commands to allow the object to be engraved. * @see do_engrave() */ void engrave_init() { add_command( "engrave", "<string> on <indirect:object>", (: do_engrave($1, $4[0]) :)); } /* init() */ /** * This method is called when a living object is attempted to be engraved. * This should be overridden in the inheritable to print out the * message you wish to say. If this function returns 1 then the * default failed message is not used. * @param liv the living objects * @return 0 use default fail mesasage, 1 override default fail message * @see do_engrave() */ protected int engrave_living(object *obs) { return 0; } /* engrave_living() */ /** * This method is called if the objects in question are unable to be * engraved. * This should be overridden in the inheritable to print out the * message you wish to say. If this function returns 1 then the * default failed message is not used. * @param obs the objects which could not be engraved. * @return 0 use default fail mesasage, 1 override default fail message * @see do_engrave() */ protected int engrave_wrong_items(object *obs) { return 0; } /* engrave_wrong_items() */ /** * This method is called if the player does not have enough money to * complete the engraving. * This should be overridden in the inheritable to print out the * message you wish to say. If this function returns 1 then the * default failed message is not used. * @param obs the objects which were unable to be engraved * @param cost the cost of the objects to be engraved * @return 0 use default fail mesasage, 1 override default fail message * @see do_engrave() */ protected int engrave_no_money(object *obs, int cost) { return 0; } /* engrave_no_money() */ /** * This method is called when the engrave is successful. * This should be overridden in the inheritable to print out the * message you wish to say. If this function returns 1 then the * default failed message is not used. * @see do_engrave() */ int engrave_objects(object *obs, int cost) { return 0; } /* engrave_objects() */ /** * This method does the actual engraving. * @param things the things to get engraved. * @param message the message to engarve on the objects * @see engrave_init() */ protected int do_engrave( object *things, string message) { int cost; string coststring; string place; object *liv; object *engravable; // if ( check_shop_keeper && !shop_keeper){ // add_failed_mess("There is noone here to engrave $I for you.\n", things); // return 0; // } liv = filter(things, (: living($1) :)); if (sizeof(liv) && !engrave_living(liv)) { add_failed_mess("Cannot engrave messages on $I, they are living things.\n", liv); } things -= liv; if (!sizeof(things)) { return 0; } // Holy blade of soyin does weird things. engravable = filter(things, (: ($1->query_property( "shop type" ) == "jewellers" || $1->query_property( ENGRAVE_PROP ) == 1 || $1->query_property( "shop type" ) == "armoury") && $1->query_short() != "holy blade of Soyin" :) ); if (!sizeof(engravable)) { if (!engrave_wrong_items(things - engravable)) { add_failed_mess("Cannot engrave messages on $I.\n", things - engravable); } return 0; } place = query_property("place"); if (!place) { place = "default"; } coststring = replace_string(message, " ", ""); cost = (strlen(coststring) * 80) * sizeof(engravable); /*a dollar for 5 letters */ if ( (int) this_player()->query_value_in( place ) < cost ) { if (!engrave_no_money(engravable, cost)) { add_failed_mess("Not enough money to engrave $I, you need " + MONEY_HAND->money_value_string(cost, place) + ".\n", engravable); } return 0; } if ( engrave_objects( engravable, cost ) ) { this_player()->pay_money( ( mixed *)MONEY_HAND->create_money_array( cost, place ), place ); add_succeeded_mess( ({ "You have the message \"" + message + "\" engraved into $I for " + MONEY_HAND->money_value_string(cost, place) + ".\n", "$N gets $I engraved with a message.\n" }), engravable); engravable->add_read_mess( message, "neatly engraved letters", _lingo, 1); return 1; } else return 0; } /* do_engrave() */ /** * Init * Made compatable with the axiom Arghrgh is Arghrgh. * Also made OO complient. * Terano. */ void init() { engrave_init(); } /** * This method sets which language (for example, "agatean", or * "morporkian") to be used when engraving. It defaults to "general", * which is not to be recommended. * @see do_engrave() */ void set_engrave_language(string lang) { _lingo = lang; } /* set_language() */