ES2 MUD LIB :: 東方故事二(ES2) 天朝帝國 mudlib 瀏覽展示

/std/room/bank.c

HOME :: std :: room :: bank.c
// bank.c

inherit ROOM;

void init()
{
    add_action("do_convert", "convert");
    add_action("do_deposit", "deposit");
    add_action("do_withdraw", "withdraw");
    add_action("do_new_account", "open");
}

int do_new_account(string arg)
{
    int bal;
    object bankbond;

    if( !arg || arg!="account" ) return 0;
    if( present("bankbond", this_player()) )
        return notify_fail("你已經有一個戶頭了。\n");
    seteuid(geteuid(this_player()));
    bankbond = new("/obj/bankbond");
    if( !bankbond->move(this_player()) ) {
        write("你身上的東西太多了﹐帶不動錢莊金契。\n");
        destruct(bankbond);
        return 1;
    }
    bankbond->set("owner_id", geteuid(this_player()));
    bal = this_player()->query("bank_account");
    if( bal>0 ) {
        write("錢莊查對帳簿﹐扣掉一成的保證金﹐重新發給你一張新的金契。\n");
        bankbond->set_balance(bal*9/10);
    } else if( bal==0 ) {
        write("你和錢莊共同畫了個花押﹐作為以後金錢往來的憑據。\n");
        write("錢莊給你一張金契﹐上面記著你現在戶頭還餘下多少錢。\n");
        bankbond->set_balance(0);
    } else {
        write("你的帳簿出了點問題, 請找巫師反應。\n");
        destruct(bankbond);
    }
    return 1;
}

int do_convert(string arg)
{
    string from, to;
    int amount, bv1, bv2;
    object from_ob, to_ob;

    if( !arg || sscanf(arg, "%d %s to %s", amount, from, to)!=3 )
        return notify_fail("指令格式﹕convert <數量> <貨幣種類> to <貨幣種類>\n");

    seteuid(getuid());
    from_ob = present(from + "_money", this_player());
    to_ob = present(to + "_money", this_player());
    if( !to_ob && file_size("/obj/money/" + to + ".c") < 0 )
        return notify_fail("你想兌換哪一種錢﹖\n");

    if( !from_ob )        return notify_fail("你身上沒有這種貨幣。\n");
    if( amount < 1 )    return notify_fail("兌換貨幣一次至少要兌換一個。\n");
        
    if( (int)from_ob->query_amount() < amount )
        return notify_fail("你身上沒有那麼多" + from_ob->name() + "。\n");

    bv1 = from_ob->query("base_value");
    if( !bv1 ) return notify_fail("這種東西不值錢。\n");

    bv2 = to_ob ? to_ob->query("base_value") : call_other("/obj/money/" + to, "query", "base_value" );
    if( !bv2 ) return notify_fail("你要兌換哪一種貨幣﹖\n");

    if( bv1 < bv2 ) amount -= amount % (bv2 / bv1);
    if( amount==0 )    return notify_fail("這些" + from_ob->name() + "的價值太低了﹐換不起。\n");

    if( !to_ob ) {
        to_ob = new("/obj/money/" + to);
        to_ob->move(this_player());
        to_ob->set_amount(amount * bv1 / bv2);
    } else
        to_ob->add_amount(amount * bv1 / bv2);

    message_vision( sprintf("$N從身上取出%s%s%s﹐換成%s%s%s。\n",
        chinese_number(amount), from_ob->query("base_unit"), from_ob->name(),
        chinese_number(amount * bv1 / bv2), to_ob->query("base_unit"), to_ob->name()),
        this_player() );

    from_ob->add_amount(-amount);

    return 1;
}

int do_deposit(string arg)
{
    int amount;
    string money;
    object money_ob, bond;

    seteuid(getuid());
    if( !bond = present("bankbond", this_player()) )
        return notify_fail("請你先開一個戶頭。\n");

    if( geteuid(this_player()) != bond->query("owner_id") ) {
        write("錢莊發現你的花押不對﹐沒收了你的金契。\n");
        destruct(bond);
        return 1;
    }

    if( bond->query_balance() != this_player()->query("bank_account") ) {
        write("錢莊發現金契上的帳目不對﹐沒收了你的金契。\n");
        destruct(bond);
        return 1;
    }

    if( !arg || sscanf(arg, "%d %s", amount, money)!=2 )
        return notify_fail("指令格式﹕deposit <數量> <貨幣種類>。\n");

    if( amount < 0 )
        return notify_fail("你不能存入零以下的錢幣。\n");
        
    if( !money_ob = present(money + "_money", this_player()) )
        return notify_fail("你身上沒有這種錢幣。\n");

    if( money_ob->query_amount() < amount )
        return notify_fail("你身上沒有這麼多的" + money_ob->name() + "。\n");

    bond->transact(amount * money_ob->query("base_value"));
    money_ob->add_amount( - amount );
    write("你將" + chinese_number(amount) + money_ob->query("base_unit")
        + money_ob->name() + "交割給錢莊﹐錢莊重新發給你一張新的金契。\n");
    this_player()->save_autoload();
        this_player()->save();
    return 1;
}

int do_withdraw(string arg)
{
    int amount;
    string money;
    object money_ob, bond;

    seteuid(getuid());
    if( !bond = present("bankbond", this_player()) )
        return notify_fail("請你先開一個戶頭。\n");

    if( geteuid(this_player()) != bond->query("owner_id") ) {
        write("錢莊發現你的花押不對﹐沒收了你的金契。\n");
        destruct(bond);
        return 1;
    }

    if( bond->query_balance() != this_player()->query("bank_account") ) {
        write("錢莊發現金契上的帳目不對﹐沒收了你的金契。\n");
        destruct(bond);
        return 1;
    }

    if( !arg || sscanf(arg, "%d %s", amount, money)!=2 )
        return notify_fail("指令格式﹕withdraw <數量> <貨幣種類>。\n");

    if( amount < 0 )
        return notify_fail("你不能提領零以下的貨幣。\n");

    if( amount > 30000) 
        return notify_fail("你不能一次領太多。\n");    

    if( file_size("obj/money/" + money + ".c") < 0 )
return notify_fail("你要提領哪一種錢﹖\n");

    if( catch(money_ob = new("/obj/money/" + money)) ) return 0;

    money_ob->set_amount(amount);
    if( bond->query_balance() < money_ob->value() ) {
        destruct(money_ob);
        return notify_fail("你的戶頭裡沒有這麼多錢。\n");
    }

    bond->transact(- money_ob->value());
    if( !money_ob->move(this_player()) ) {
        bond->transact(money_ob->value());
        destruct(money_ob);
        return notify_fail("你身上帶不了這許多錢﹐提少一點吧。\n");
    }

    write("錢莊將" + chinese_number(amount) + money_ob->query("base_unit")
        + money_ob->name() + "交割給你﹐並重新發給你一張新的金契。\n");
        this_player()->save_autoload();
        this_player()->save();
    return 1;
}
HOME :: std :: room :: bank.c