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

/cmds/std/drop.c

HOME :: cmds :: std :: drop.c
// drop.c

#include 
inherit F_CLEAN_UP;

int do_drop(object me, object obj);

void create() { seteuid(getuid()); }

int main(object me, string arg)
{
    object obj, *inv, obj2;
    int i, amount;
    string item;

    if( me->is_busy() )
        return notify_fail("你正忙著其他事﹗\n");

    if(!arg) return notify_fail("你要丟棄什麼東西﹖\n");
    if( !environment(me) ) return 0;

    if(sscanf(arg, "%d %s", amount, item)==2) {
        if( !objectp(obj = present(item, me)) )
            return notify_fail("你身上沒有這樣東西。\n");
        if( stringp(obj->query("no_drop")) )
            return notify_fail( (string)obj->query("no_drop") );
        if( !obj->query_amount() )
            return notify_fail( obj->name() + "不能被分開丟棄。\n");
        if( amount < 1 )
            return notify_fail("東西的數量至少是一個。\n");
        if( amount > obj->query_amount() )
            return notify_fail("你沒有那麼多的" + obj->name() + "。\n");
        else if( amount == (int)obj->query_amount() )
            return do_drop(me, obj);
        else {
            obj->set_amount( (int)obj->query_amount() - amount );
            seteuid(MUDLIB_UID);
            obj2 = new(base_name(obj));
            seteuid(getuid());
            obj2->set_amount(amount);
            return do_drop(me, obj2);
        }
    }

    if(arg=="all") {
        inv = all_inventory(me);
        for(i=0; i             if( inv[i]->query("keep_this") ) continue;
            do_drop(me, inv[i]);
        }
        write("Ok.\n");
        return 1;
    }

    if(!objectp(obj = present(arg, me)))
        return notify_fail("你身上沒有這樣東西。\n");
    return do_drop(me, obj);
}

int do_drop(object me, object obj)
{
    mixed no_drop;

    if( no_drop = obj->query("no_drop") )
        return notify_fail( stringp(no_drop) ? no_drop : "這樣東西不能隨意丟棄。\n");

    if (obj->move(environment(me))) {
        if( obj->is_character() )
            message_vision("$N將$n從背上放了下來﹐躺在地上。\n", me, obj);
        else {
            if ( wizardp(me) ) {
write("一隻綠色的小鬼很快的跑出來,接住你丟下的東西,然後消失不見了。\n");
destruct(obj); 
return 1;
    } // 巫師不能丟東西 add by tears
    message_vision( sprintf("$N丟下一%s$n。\n", obj->query("unit")),
me, obj );
    if( !obj->query("value") && !obj->value() ) {
write("因為這樣東西並不值錢﹐所以人們並不會注意到它的存在。\n");
destruct(obj);
return 1;
    }
}
// 不值錢的東西早就被 dest 掉了... 這裡沒有 obj.... -elon 12/2/96
if(obj) obj->delete("keep_this");
#ifdef SAVE_USER
//    me->save();
#endif 
return 1;
    }
    return 0;
}

int help(object me)
{
    write(@HELP
指令格式 : drop <物品名稱>
 
這個指令可以讓你丟下你所攜帶的物品.
例如:
drop all 丟下所有未 keep 的物品.
drop sword 2 丟下你所攜帶的第二把 sword.
drop 200 gold 丟下二百兩黃金. 
HELP
    );
    return 1;
}
HOME :: cmds :: std :: drop.c