#include <sys.h>
#include <flags.h>
string long_desc,short_desc;
object owner,dropto,shopkeeper,storeroom;
int special,flags;
self_destruct() { destruct(this_object()); return 1; }
get_flags() { return flags; }
get_special() { return special; }
set_flags(f) { flags=f; return 1; }
set_special(s) { special=s; return 1; }
get_dropto() { return dropto; }
set_dropto(o) { dropto=o; return 1; }
get_shopkeeper() { return shopkeeper; }
get_storeroom() { return storeroom; }
set_shopkeeper(x) { shopkeeper=x; return 1; }
set_storeroom(x) { storeroom=x; return 1; }
get_type() { return TYPE_SHOP; }
set_long(arg) {
long_desc=arg;
return 1;
}
set_short(arg) { short_desc=arg; return 1; }
get_long() { return (long_desc?long_desc:
"You are nowhere."); }
get_short() { return short_desc ? short_desc:"Gray Mist"; }
stat() {
tell_player(this_player(),"Object Type: SHOP\n");
if (flags) tell_player(this_player(),"Flags: "+make_flags(flags)+"\n");
if (special) tell_player(this_player(),"Special: "+itoa(special)+"\n");
if (short_desc)
tell_player(this_player(),"Short: "+short_desc+"\n");
if (long_desc)
tell_player(this_player(),"Long: "+long_desc+"\n");
if (dropto)
tell_player(this_player(),"Dropto: "+make_num(dropto)+"\n");
if (storeroom)
tell_player(this_player(),"StoreRoom: "+make_num(storeroom)+"\n");
if (shopkeeper)
tell_player(this_player(),"ShopKeeper: "+make_num(shopkeeper)+"\n");
if (owner)
tell_player(this_player(),"Owner: "+make_num(owner)+"\n");
return 1;
}
static init() {
if (!prototype(this_object())) return;
add_verb("buy","do_buy");
add_verb("sell","do_sell");
add_verb("list","do_list");
}
make_space(arg,len) {
int count;
count=len-strlen(arg);
if (count<0) count=0;
while (count--) arg+=" ";
return arg;
}
do_list(arg) {
object curr;
int count,cost;
if (!shopkeeper) {
tell_player(this_player(),"The shopkeeper isn't here.\n");
return 1;
}
if (location(shopkeeper)!=this_object()) {
tell_player(this_player(),"The shopkeeper isn't here.\n");
return 1;
}
if (storeroom) curr=contents(storeroom);
tell_player(this_player(),"Cost Item\n");
tell_player(this_player(),"---- ----\n");
while (curr) {
cost=call_other(curr,"get_value");
if (cost) {
count++;
tell_player(this_player(),make_space(itoa(cost),9)+
call_other(curr,"get_short")+"\n");
}
curr=next_object(curr);
}
tell_player(this_player(),itoa(count)+" object"+((count==1) ? "":"s")+
" listed.\n");
return 1;
}
static do_sell(arg) {
int cost;
object curr;
if (!shopkeeper) {
tell_player(this_player(),"The shopkeeper isn't here.\n");
return 1;
}
if (location(shopkeeper)!=this_object()) {
tell_player(this_player(),"The shopkeeper isn't here.\n");
return 1;
}
if (!storeroom) {
tell_player(this_player(),"The shopkeeper is uninterested in purchasing "+
"anything at the moment.\n");
return 1;
}
curr=present(arg,this_player());
if (!curr) {
tell_player(this_player(),"You're not carrying that.\n");
return 1;
}
cost=call_other(curr,"get_value");
cost=(cost*3)/4;
if (cost>1000) cost=1000;
if (!cost) {
tell_player(this_player(),"The shopkeeper is uninterested in purchasing "+
"that.\n");
return 1;
}
if (call_other(curr,"drop")) {
tell_player(this_player(),"You can't drop that object.\n");
return 1;
}
tell_player(this_player(),"The shopkeeper pays you "+itoa(cost)+" gold "+
"coins for it.\n");
tell_room_except(this_object(),this_player(),call_other(this_player(),
"get_short")+" sells "+call_other(curr,"get_short")+".\n");
call_other(this_player(),"add_gold",cost);
move_object(curr,storeroom);
if ((!(call_other(curr,"get_flags") & F_PERMANENT)) ||
(call_other(curr,"get_flags") & F_FORSALE))
call_other(curr,"self_destruct");
return 1;
}
static do_buy(arg) {
int cost;
object curr;
if (!shopkeeper) {
tell_player(this_player(),"The shopkeeper isn't here.\n");
return 1;
}
if (location(shopkeeper)!=this_object()) {
tell_player(this_player(),"The shopkeeper isn't here.\n");
return 1;
}
if (!storeroom) {
tell_player(this_player(),"There is no such object for sale here.\n");
return 1;
}
curr=present(arg,storeroom);
if (curr) cost=call_other(curr,"get_value");
if (!cost) {
tell_player(this_player(),"There is no such object for sale here.\n");
return 1;
}
if (cost>call_other(this_player(),"get_gold")) {
tell_player(this_player(),"You can't afford it.\n");
return 1;
}
if (call_other(curr,"get_flags") & F_FORSALE)
if (!(curr=call_other(curr,"replicate"))) {
tell_player(this_player(),"That object cannot be bought.\n");
return 1;
}
tell_room_except(this_object(),this_player(),call_other(this_player(),
"get_short")+" purchases "+call_other(curr,"get_short")+
".\n");
tell_player(this_player(),"You purchase "+call_other(curr,"get_short")+
".\n");
move_object(curr,this_player());
call_other(this_player(),"add_gold",-cost);
return 1;
}