// exchange.c
// A facility for changing money from one kind of coin to another.
// Written by Mobydick@TMI-2, 8-25-92
// For now the service is free, later we should probably attach a fee to it.
#include <money.h>
#include <move.h>
#include <mudlib.h>
#define SIGN "/obj/coinval_sign"
inherit ROOM ;
inherit COINVALUE ;
void create() {
object sign ;
seteuid(getuid()) ;
::create() ;
sign = clone_object(SIGN) ;
sign->set_location(file_name(this_object())) ;
}
void init() {
add_action ("change", "convert") ;
add_action ("change", "change") ;
}
int help() ;
int change (string str) {
int number, i, j, k ;
string oldtype, newtype ;
int oldval, newval ;
object ob ;
if (!str) return help() ;
if (sscanf(str,"%d %s to %s",number,oldtype,newtype)!=3)
if (sscanf(str,"%s to %s",oldtype,newtype)!=2) {
return help() ;
}
oldval = coinvalue(oldtype) ;
if (!oldval) {
notify_fail (capitalize(oldtype)+" coins are not legal tender in this realm.\n") ;
return 0 ;
}
if (number < 0) {
notify_fail ("You can only change positive numbers of coins.\n") ;
return 0 ;
} else if (number == 0)
number=(int)this_player()->query("wealth/"+oldtype) ;
newval = coinvalue(newtype) ;
if (!newval) {
notify_fail (capitalize(newtype)+" coins are not legal tender in this realm.\n") ;
return 0 ;
}
if (this_player()->query("wealth/"+oldtype)<number) {
notify_fail ("You haven't got that many "+oldtype+" coins!\n");
return 0 ;
}
i = number*oldval ; /* Value of old coins, in cheapest coin */
j = i/newval ; /* Value of old coins, in new coins */
k = (i-j*newval)/oldval ; /* Change to be returned. */
// If we have 0 new coins, then he is just getting back what he started with.
if (j==0) {
write (number+" "+oldtype+" coins are not worth one "+newtype+" coin.\n") ;
return 1 ;
}
// We need to check to see if he can carry the new number of coins.
if ((int)this_player()->query("capacity")>j+k-number) {
this_player()->set("capacity",(int)this_player()->query("capacity")-j-k+number) ;
i = this_player()->query("wealth/"+oldtype) + k - number ;
this_player()->set("wealth/"+oldtype,i) ;
i = this_player()->query("wealth/"+newtype) + j ;
this_player()->set("wealth/"+newtype,i) ;
write ("Done.\n") ;
say (this_player()->query("cap_name")+" changes some "+oldtype+" coins into "+newtype+".\n") ;
return 1 ;
}
notify_fail ("You can't carry that many coins!\n") ;
return 0 ;
}
int help() {
write("Usage: " + query_verb() + " [num] [oldtype] to " +
"[newtype]\n " + query_verb() + " [oldtype] " +
"to [newtype]\n");
return 1 ;
}