/** * This is the peddler object, it acts as a walking talking item * shop. */ #define MAX_PROP "max per reset" #define TYPE "item shop type" #define NUM_SOLD "number sold this reset" inherit NPC_OBJ; object cont; object query_cont() { return cont; } void create() { do_setup++; ::create(); cont = clone_object("/std/container"); cont->set_name("peddler_store"); do_setup--; if( !do_setup ) TO->setup(); if( base_name(TO) != __FILE__[0..<3] || clonep(TO) ) call_out("reset_me", 1800 ); } /* create() */ /** @ignore yes */ void init() { ::init(); TP->add_command("browse", TO, "<indirect:object:"+ file_name(cont)+"> {from|of} <direct:living:here>"); TP->add_command("buy", TO, "<indirect:object:"+ file_name(cont)+"> from <direct:living:here>"); TP->add_command("list", TO, "goods {from|of} <direct:living:here>"); } /* init() */ /** @ignore yes */ void dest_me() { if( cont ) cont->dest_me(); ::dest_me(); } /* dest_me() */ /** @ignore yes */ private void check_cont() { if( !cont ) { cont = clone_object("/std/container"); cont->set_name("peddler_store"); } } /* check_cont() */ /** * @ignore yes */ void reset_me() { object item; check_cont(); foreach( item in INV(cont) ) item->add_property( NUM_SOLD, 0 ); call_out("reset_me", 1800 ); } /* reset_me() */ /** * This method adds an armour in as something to be able to be bought * from the peddles. * @param word the name of the armoud * @param number the number of the items that can be sold * @return 1 on success, 0 on failure */ int add_armour( string word, int number ) { object thing; check_cont(); thing = (object)TO->create_object( word ); if( !thing ) thing = (object)ARMOURY_H->request_item( word, 100 ); if( !thing ) return 0; thing->move( cont ); thing->add_property("item name", word ); thing->add_property( MAX_PROP, number ); thing->add_property( TYPE, "armour"); return 1; } /* add_armour() */ /** * This method adds an weapon in as something to be able to be bought * from the peddles. * @param word the name of the armoud * @param number the number of the items that can be sold * @return 1 on success, 0 on failure */ int add_weapon( string word, int number ) { object thing; check_cont(); thing = (object)TO->create_object( word ); if( !thing ) thing = (object)ARMOURY_H->request_item( word, 100 ); if( !thing ) return 0; thing->move( cont ); thing->add_property("item name", word ); thing->add_property( MAX_PROP, number ); thing->add_property( TYPE, "weapon"); return 1; } /* add_weapon() */ /** * This method adds an object in as something to be able to be bought * from the peddles. * @param word the name of the armoud * @param number the number of the items that can be sold * @return 1 on success, 0 on failure */ int add_object( string word, int number ) { object thing; check_cont(); thing = (object)TO->create_object( word ); if( !thing ) thing = clone_object( word ); if( !thing ) return 0; thing->move( cont ); thing->add_property("item name", word ); thing->add_property( MAX_PROP, number ); thing->add_property( TYPE, "object"); return 1; } /* add_object() */ /** * This method returns the cost of the specified item to the buyer. * @param thing the thing to cost * @param buyer who is buying it * @return the cost of the item */ int query_cost( object thing, object buyer ) { return (int)thing->query_value_at(TO); } /* query_cost() */ /** * This method returns the costs of the item as a string. * @param thing the thing to buy * @param place the money area it is being bought in * @param buyer the person who is buying the object * @return the string money value */ string cost_string( object thing, string place, object buyer ) { return (string)MONEY_H->money_value_string( query_cost( thing, buyer ), place ); } /* cost_string() */ /** * The main entrace to the browse for things command. * @return 1 on success, 0 on failure */ int do_browse( mixed indirect_obs, string dir_match, string indir_match, string *words ) { int i; string place; object *things; place = query_property("place"); if( !place || place == "") place = "default"; check_cont(); things = indirect_obs; if( !sizeof( things ) ) { init_command("say I'm afraid I don't have any of those.", 2 ); } else { for( i = 0; i < sizeof( things ); i++ ) { init_command("say $C$"+things[ i ]->the_short()+" is priced at "+ cost_string( things[ i ], place, TP )+". Let me show it " "to you.", 4 * i + 2 ); write( one_short()+" shows you "+things[i]->one_short()+":\n"+ things[i]->long() ); } } TP->add_succeeded_mess( TO, "$N ask$s $D about "+words[ 0 ]+".\n"); return 1; } /* do_browse() */ /** * The main entrace to the buy things command. * @return 1 on success, 0 on failure */ int do_buy( mixed indirect_obs, string dir_match, string indir_match, string *words ) { int i, num_left; object *things; check_cont(); things = indirect_obs; if( !sizeof( things ) ) { init_command("say I'm afraid I don't have any of those.", 2 ); } else { for( i = 0; i < sizeof( things ); i++ ) { num_left = (int)things[ i ]->query_property( MAX_PROP ) - (int)things[ i ]->query_property( NUM_SOLD ); if( num_left < 1 ) { init_command("say I'm afraid I have no "+ things[ i ]->query_plural()+" left.", 2 * i + 2 ); continue; } call_out("sell_thing", 2 * i, TP, things[ i ] ); } } TP->add_succeeded_mess( TO, "$N ask$s $D about buying "+add_a(words[ 0 ])+".\n"); return 1; } /* do_buy() */ /** * The main entrace to the list stuff command. * @return 1 on success, 0 on failure */ int do_list() { int num_left; string place, *list; object thing; list = ({ }); place = query_property("place"); if( !place || place == "") place = "default"; check_cont(); if( find_call_out("reset_me") == -1 ) reset_me(); thing = first_inventory( cont ); while ( thing ) { num_left = (int)thing->query_property( MAX_PROP ) - (int)thing->query_property( NUM_SOLD ); if( num_left < 1 ) { thing = next_inventory( thing ); continue; } list += ({ (string)thing->a_short()+" for "+cost_string( thing, place, TP )+" ("+query_num( num_left, 0 )+" left)" }); thing = next_inventory( thing ); } if( sizeof( list ) ) { init_command("say I have the following items for sale:", 2 ); init_command("say $C$"+query_multiple_short( list )+".", 4 ); } else { init_command("say I'm afraid I have nothing for sale.", 2 ); } TP->add_succeeded_mess( TO, "$N ask$s $D what goods "+ HE+" has in stock.\n"); return 1; } /* do_list() */ /** * The main entrace to the sell stuff command. * @return 1 on success, 0 on failure */ void sell_thing( object player, object thing ) { int value; string item_name, place; object copy; if( !player ) return; if( ENV(player) != ENV(TO) ) return; if( !thing ) return; item_name = (string)thing->query_property("item name"); copy = (object)TO->create_object( item_name ); if( !copy ) switch ( (string)thing->query_property( TYPE ) ) { case "armour" : case "weapon" : copy = ARMOURY_H->request_item( item_name, 80 + random( 20 ) ); break; case "object" : copy = clone_object( item_name ); break; } if( !copy ) copy = clone_object( explode( file_name( thing ), "#" )[ 0 ] ); if( !copy ) return; place = query_property("place"); if( !place || place == "") place = "default"; value = (int)player->query_value_in( place ); if( place != "default" ) value += (int)player->query_value_in("default"); if( TO->query_cost( copy, player ) > value ) { do_command("say I'm afraid you can't afford to buy "+ copy->the_short()+"."); copy->move( "/room/rubbish" ); return; } thing->add_property( NUM_SOLD, thing->query_property( NUM_SOLD ) + 1 ); player->pay_money( MONEY_H->create_money_array( TO->query_cost( copy, player ), place ), place ); tell_object( player, "You pay "+the_short()+" "+cost_string( copy, place, player )+".\n"); tell_room( ENV(TO), player->the_short()+" gives "+the_short()+" some " "money.\n", player ); if( copy->move( player ) ) { do_command("'Well, here's "+copy->the_short()+", but you can't carry " "it at the moment. I'll put it on the ground."); copy->move( environment() ); do_command(":puts "+copy->a_short()+" on the ground."); } else { tell_room( environment(), the_short()+" gives "+ player->the_short()+" "+copy->a_short() +".\n"); } } /* sell_thing() */