/** * This is the basic tattoo parlour inherit. * To use the inherit, you need to assign a tattooist NPC object to * the 'keeper' variable, and deal with the cloning and checking for * his/her existance each reset, etc. * @see set_tattoo_cost() * @see set_remove_cost() * @see /std/effects/other/tattoo * @see /std/npcs/tattooist * @author Shiannar, 14/10/01, inheritized by Sandoz, 2002. */ #define TATTOO EFFECTS_DIR "/other/tattoo" #define TATTOO_COST 72000 // Default cost is 12 platinum coins. #define REMOVE_COST 144000 // Removal cost is 24 platinum coins. #define QMS(x) query_multiple_short( x, "poss", 1 ) // 1st person. inherit ROOM_OBJ; string place; object keeper; int tattoo_cost, remove_cost; void create() { remove_cost = REMOVE_COST; ::create(); add_help_file("tattoo_parlour"); } /* create() */ /** * This method sets the cost of a single tattoo. * @param cost the cost of a single tattoo */ void set_tattoo_cost( int cost ) { tattoo_cost = cost; } /** * This method returns the cost of a tattoo in this parlour. * @return the cost of a tattoo in this parlour */ int query_tattoo_cost() { return tattoo_cost || TATTOO_COST; } /** * This method sets the cost of tattoo removal in this parlour. * If set to 0, then no removal services are offered. * @param cost the tattoo removal cost, if 0, no removal is offered */ void set_remove_cost( int cost ) { remove_cost = cost; } /** * This method returns the tattoo removal cost in this parlour. * @return the tattoo removal cost */ int query_remove_cost() { return remove_cost; } /** * This method sets the monetary area of the parlour. * This is used to decide which currency to accept here. * @param str the place to set */ void set_place( string str ) { place = str; } /** * This method returns the place name to use for currency calculations. * @return the monetary area this parlour is in */ string query_place() { return place || "default"; } /** * This method returns all the tattooable bodyparts. * @return all the tattooable bodyparts */ string *query_tattooables() { return TATTOO->query_tattooables(); } int check_keeper() { return ( keeper && ENV(keeper) == TO ); } /* check_keeper() */ /** @ignore yes */ int do_request( string tattoo, string bodypart ) { object *obs; if( !check_keeper() ) { add_succeeded_mess( ({ "The tattoo artist is not here to serve you!\n", "$N look$s around and blink$s.\n"}) ); return 1; } tell_object( TP, "You enquire about getting a tattoo.\n"); tell_room( TO, TP->the_short()+" $V$0=enquires,enquire$V$ about getting " "a tattoo done.\n", TP ); if( keeper->query_busy() ) { keeper->do_command("sayto "+TP->query_name()+" I'm busy right " "now, you can go next."); return notify_fail(""); } if( !TATTOO->query_tattooable( bodypart ) ) { keeper->do_command("sayto "+TP->query_name()+" I'm sorry, but I " "cannot tattoo your \""+bodypart+"\". Please read the sign " "for the list of available bodyparts."); return notify_fail(""); } if( sizeof( obs = TATTOO->query_tattoo_covered( TP, bodypart ) ) ) { keeper->do_command("sayto "+TP->query_name()+" I'm afraid you are " "going to have to remove "+QMS(obs)+" before I can help you."); return notify_fail(""); } if( lower_case(tattoo) == "tattoo") { keeper->do_command("sayto "+TP->query_name()+" I know you want a " "tattoo, but I need to know more details."); return notify_fail(""); } if( TP->query_value_in( query_place() ) < tattoo_cost ) { keeper->do_command("sayto "+TP->query_name()+" I'm sorry, "+ TP->short()+", but you need "+MONEY_H->money_value_string( query_tattoo_cost(), query_place() )+" or the same in change to " "get a tattoo."); return notify_fail(""); } TP->pay_money( MONEY_H->create_money_array( query_tattoo_cost(), query_place() ), query_place() ); add_succeeded_mess(""); return keeper->do_tattoo( TP, tattoo, bodypart ); } /* do_request() */ /** @ignore yes */ int do_remove( string bodypart ) { object *obs; int *effs; if( !check_keeper() ) { add_succeeded_mess( ({ "The tattoo artist is not here to serve you!\n", "$N look$s around and blink$s.\n"}) ); return 1; } tell_object( TP, "You enquire about getting a tattoo removed.\n"); tell_room( TO, TP->the_short()+" $V$0=enquires,enquire$V$ about getting " "a tattoo removed.\n", TP ); if( keeper->query_busy() ) { keeper->do_command("sayto "+TP->query_name()+" I'm busy right now, " "you can go next."); return notify_fail(""); } if( !TATTOO->query_tattooable( bodypart ) ) { keeper->do_command("peer "+TP->query_name()+" carefully"); keeper->do_command("sayto "+TP->query_name()+" I'm sorry, but \""+ bodypart+"\" is a bodypart I have never heard of before."); return notify_fail(""); } if( sizeof( obs = TATTOO->query_tattoo_covered( TP, bodypart ) ) ) { keeper->do_command("sayto "+TP->query_name()+" I'm afraid you are " "going to have to remove "+QMS(obs)+" before I can help you."); return notify_fail(""); } if( !sizeof( effs = TP->effects_matching("body.tattoo") ) ) { keeper->do_command("'Hrmm. It would appear you're not tattooed."); return notify_fail(""); } if( undefinedp( TP->arg_of( effs[0] )[bodypart] ) ) { keeper->do_command("'Hrmm. It would appear you have no tattoos "+ TATTOO->expand_tattooable( bodypart, "your")+"."); return notify_fail(""); } if( TP->query_value_in( query_place() ) < query_remove_cost() ) { keeper->do_command("sayto "+TP->query_name()+" I'm sorry, "+ TP->short()+", but you need "+MONEY_H->money_value_string( query_remove_cost(), query_place() )+" or the same in change to " "get a tattoo removed."); return notify_fail(""); } TP->pay_money( MONEY_H->create_money_array( query_remove_cost(), query_place() ), query_place() ); add_succeeded_mess(""); return keeper->do_remove( TP, bodypart ); } /* do_remove() */ /** @ignore yes */ void init() { ::init(); add_command("request", "<string'tattoo'> on [my] <string'bodypart'>", (: do_request( $4[0], $4[1] ) :) ); if( remove_cost ) add_command("remove", "tattoos {on|from} [my] <string'bodypart'>", (: do_remove( $4[1] ) :) ); } /* init() */ /** @ignore yes */ mixed stats() { return ::stats() + ({ ({"tattoo cost", tattoo_cost }), ({"removal cost", remove_cost }), ({"no removal", !remove_cost }), ({"place", query_place() }), ({"keeper", keeper }), }); } /* stats() */