/* pawn shop to allow people to get money for possessions and get them back
within a certain period of time. */
inherit "std/room";
#include "shop.h"
#include "money.h"
#include "move_failures.h"
#define VALUE query_value() * 2 / 5
string *people;
object *objs;
int *times;
string store, shop;
int hold_time;
string *buy_mess, *sell_mess, list_mess, value_mess;
void create() {
people = ({ });
objs = ({ });
times = ({ });
store = "/room/pawnstore";
shop = "/room/storeroom";
hold_time = 1800;
set_short("Pawn Shop");
set_long(
"You are in a Pawn shop. You can value, leave and reclaim things here. "
"There is a sign describing how the shop works.\n");
set_light(60);
buy_mess = ({ "You reclaim $ob$ for $money$.\n",
"$client$ reclaims $ob$.\n" });
sell_mess = ({ "You leave $ob$ for $money$.\n",
"$client$ leaves $ob$.\n" });
list_mess = "$ob$\t\t$money$\n";
value_mess = "The $ob$ would get you $money$.\n";
::create();
}
void set_sell_message(mixed str) { sell_mess = str; }
void set_buy_message(mixed str) { buy_mess = str; }
void set_value_message(mixed str) { value_mess = str; }
void set_list_message(mixed str) { list_mess = str; }
mixed query_sell_mess() { return sell_mess; }
mixed query_list_mess() { return list_mess; }
mixed query_value_mess() { return value_mess; }
mixed query_buy_mess() { return buy_mess; }
void dest_me() {
int loop;
if(!people) people = ({ });
for(loop = 0; loop < sizeof(people); loop++) {
tell_object(find_living(people[loop]),
"A little person runs up to you and hands you a note, then vanishes again.\n"
"The note reads:\n"
"Pawnbroker has gone broke. " + objs[loop]->query_name() + " sold to shop.\n");
objs[loop]->move(shop);
}
::dest_me();
}
string pawn_parse(string str, object ob, object client, string money,
string extra) {
string s1,s2,s3,rest;
rest = "";
while(sscanf(str,"%s$%s$%s", s1, s2, s3) == 3)
switch (s2) {
case "ob" :
str = s1+ob->short()+s3;
break;
case "client" :
str = s1+client->query_name()+s3;
break;
case "extra" :
str = s1+extra+s3;
break;
case "money" :
str = s1+money+s3;
break;
default :
rest = s1+"$"+s2+"$";
str = s3;
break;
}
return rest+str;
}
void do_parse(mixed arr, object ob, object client, string money,
string extra) {
if (stringp(arr))
write(pawn_parse(arr, ob, client, money, extra));
else {
write(pawn_parse(arr[0], ob, client, money, extra));
say(pawn_parse(arr[1], ob, client, money, extra));
}
}
void init() {
::init();
add_action("read", "read");
add_action("value_item", "value");
add_action("leave_item", "leave");
add_action("reclaim_item", "reclaim");
add_action("list_items", "list");
}
int read(string str) {
if(str != "sign") {
notify_fail("The only thing here to read is a sign.\n");
return 0;
}
write("You can leave things here in exchange for cash. The value of the "
"item determines the amount of cash you can get for it. If you do "
"not return and claim your item within " +
(hold_time / 60) + " minutes, then it "
"will be sold to a shop to reclaim its worth.\n"
"You can leave <item>, reclaim <item>, list, and value <item> here.\n"
"Selling things here gets you less money than the shop, but "
"reclaiming the item does not cost as much as buying it back from the "
"shop would.\n");
return 1;
}
void set_storeroom(string str) {
store = str;
}
string query_storeroom() {
return store;
}
void set_shop(string str) {
shop = str;
}
string query_shop() {
return shop;
}
void set_hold_time(int time) {
hold_time = time;
}
int query_hold_time() {
return hold_time;
}
int value_item(string str) {
object *ob;
int loop;
if(!str) {
notify_fail("Value what?\n");
return 0;
}
ob = find_match(str, this_player());
if(!sizeof(ob)) {
notify_fail("You do not have a " + str + ".\n");
return 0;
}
for(loop = 0; loop < sizeof(ob); loop ++) {
do_parse(value_mess, ob[loop], this_player(),
(string)MONEY_HAND->money_string((mixed *)MONEY_HAND->create_money_array((int)
"/std/shop"->scaled_value((int)ob[loop]->query_value()) * 4 / 5)), "");
}
return 1;
}
int leave_item(string str) {
object *ob;
mixed *ma;
string person;
int loop, money_to_give, the_time, pos;
if(!str) {
notify_fail("Leave what?\n");
return 0;
}
ob = find_match(str, this_player());
if(!sizeof(ob)) {
notify_fail("You do not have a " + str + ".\n");
return 0;
}
person = (string)this_player()->query_name();
the_time = time();
for(loop = 0, money_to_give = 0; loop < sizeof(ob); loop++) {
int temp, loop2;
temp = (int)"/std/shop"->scaled_value((int)ob[loop]->query_value()) * 4 / 5;
if(temp > MAX_AMOUNT) {
temp = MAX_AMOUNT;
}
money_to_give += temp;
people += ({ person });
objs += ({ ob[loop] });
times += ({ the_time });
ob[loop]->move(store);
say((string)this_player()->query_cap_name() + " leaves a " +
ob[loop]->query_name() + " here.\n");
call_out("end_hold", hold_time, ob[loop]);
}
ma = (mixed *)MONEY_HAND->create_money_array(money_to_give);
this_player()->adjust_money(ma);
write("The pawnbroker gives you " +
MONEY_HAND->money_string(ma) + ".\n");
return 1;
}
void end_hold(object ob) {
int pos;
if(!ob) {
return;
}
pos = member_array(ob, objs);
ob->move(shop);
if(pos == -1) {
return 0;
}
tell_object(find_living(people[pos]), "Time limit for " + ob->query_name() + " has expired.\n");
people = delete(people, pos, 1);
objs = delete(objs, pos, 1);
times = delete(times, pos, 1);
}
int reclaim_item(string str) {
object *ob;
int loop, money_to_give;
if(!str) {
notify_fail("reclaim what?\n");
return 0;
}
ob = find_match(str, store);
if(!sizeof(ob)) {
notify_fail("There are no " + str + "'s here.\n");
return 0;
}
for(loop = 0; loop < sizeof(ob); loop++) {
int pos, amt, ob_amt;
pos = member_array(ob[loop], objs);
if(pos != -1) {
amt = (int)this_player()->query_value();
ob_amt = (int)"/std/shop"->scaled_value((int)ob[loop]->query_value());
if (ob_amt < amt) {
amt -= ob_amt;
money_to_give -= ob_amt;
do_parse(buy_mess, ob[loop], this_player(),
(string)MONEY_HAND->money_string((mixed *)MONEY_HAND->create_money_array(ob_amt)),
"");
if(ob[loop]->move(this_player()) != MOVE_OK) {
ob[loop]->move(this_object());
write("It is too heavy for you and he puts it down in front of you.\n");
}
objs = delete(objs, pos, 1);
people = delete(people, pos, 1);
times = delete(times, pos, 1);
}
else {
write("You cannot afford to reclaim "+
(string)objs[pos]->query_name()+".\n");
}
}
}
write("This is costing you " + money_to_give + "\n");
this_player()->pay_money(({ "brass", -money_to_give }) );
return 1;
}
int list_items() {
int loop, flag;
string person;
person = (string)this_player()->query_name();
for(flag = loop = 0; loop < sizeof(objs); loop++) {
if(people[loop] == person) {
flag = 1;
do_parse(list_mess, objs[loop], this_player(),
(string)MONEY_HAND->money_string((mixed *)MONEY_HAND->create_money_array(
(int)"/std/shop"->scaled_value((int)objs[loop]->query_value()))), "");
}
}
if(!flag) {
write("Nothing left here by you.\n");
}
return 1;
}