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

/cmds/std/steal.bak

HOME :: cmds :: std :: steal.bak
// steal.c

#include 
#include 

inherit F_CLEAN_UP;

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

int main(object me, string arg)
{
        string what, who;
        object ob, victim;
        int sp, dp, skill, forcesk;
        string stealer_class, stealer_race;

        stealer_class = me->query_class();
        stealer_race = me->query_race();
        forcesk = (me->query_skill("force", 1)/15) + 1;

        if( me->is_busy() ) return notify_fail("你現在沒有空﹗\n");

if( me->query("life_form") == "ghost" )
return notify_fail("人死了就一了百了, 快去找城隍復活吧!!\n");

        if( environment(me)->query("no_fight") 
|| environment(me)->query("no_steal") )
                return notify_fail("這裡禁止行竊。\n");

        if( me->skill_mapped("stealing")==0 )
                return notify_fail("你必須使用 (enable) 妙手空空之技!\n");
                
        if( me->query_temp("stealing") )
                return notify_fail("你已經在找機會下手了﹗\n");

        if( !arg || sscanf(arg, "%s from %s", what, who)!=2 ) return
                notify_fail("指令格式﹕steal <物品> from <人物>\n");

        victim = present(who, environment(me));
        if( !victim || victim==me || !victim->is_character())
                return notify_fail("你想行竊的對象不在這裡。\n");
        if( !wizardp(me) && wizardp(victim) )
                return notify_fail("玩家不能偷巫師身上的東西。\n");

// add by dragoon
if( userp(victim) && !interactive(victim) ) 
return notify_fail("這人現在不在線上。\n");

        // Don't let NPC steal NPC.
        if( !userp(me) && !userp(victim) )
                return 0;

/*
        if( userp(victim))
           { if(victim->query("level") < 5)
                return notify_fail("他等級太低, 不要偷他吧。\n"); }

        if( me->query("level") < 5)
           { if(userp(victim))
                return notify_fail("你等級太低, 長大點再出來偷竊吧。\n"); }     
*/
        if( !ob = present(what, victim) ) {
                object *inv;
                inv = all_inventory(victim);
                if( !sizeof(inv) )
                        return notify_fail( victim->name() + "身上看起來沒有什麼值錢的東西好偷。\n");
                ob = inv[random(sizeof(inv))];
        }

        skill = me->query_skill("stealing");
        // change while to if -Dragoon
        if( me->query_stat("gin") < skill/3 )
                skill /= 2;
        me->consume_stat("gin", skill/3);

        // add for thief ...if class is thief... sp will be more powerful

        switch( stealer_class) {
                case "thief" :
                        sp = skill * 50 + (int)me->query("dex") * 10;
                        break;
                default :
                        sp = skill * 8 + (int)me->query("dex") * 3;
        }
        if( sp < 1 ) sp = 1;
        if( stealer_race == "jiaojao" ) sp *= forcesk;
        if( me->is_fighting() && stealer_race != "jiaojao" ) {
                sp /= 2;
                me->start_busy(3);
        }
        if( me->is_fighting() && stealer_race == "jiaojao" ) {
                me->start_busy(1);
        }

        switch(victim->query_class()) {
                case "thief" :
                        dp = (int)victim->query_stat("sen") * 20 + (int)ob->weight() / 10;
                        break;
                default :
                        dp = (int)victim->query_stat("sen") * 2 + (int)ob->weight() / 40;
        }

        if( victim->query_race() == "jiaojao" ) dp *= 3;
        if( victim->is_fighting() ) dp *= 10;
        if( ob->query("equipped") ) dp *= 50;
        if ( victim->query("race") == "rainnar" ) {
                if ( present("black viper", victim) ) dp += 4000;
                if ( present("red viper", victim) ) dp += 4000;
                if ( present("green viper", victim) ) dp += 2000;
                if ( present("white viper", victim) ) dp += 2000;
                if ( present("yellow viper", victim) ) dp += 1000;
        }

        write("你不動聲色地慢慢靠近" + victim->name() + "﹐等待機會下手 ...\n\n");

me->set_temp("stealing", 1);
me->delete_temp("pending/hidden");
call_out( "compelete_steal", 3, me, victim, ob, sp, dp);

return 1;
}

private void compelete_steal(object me, object victim, object ob, int sp, int dp)
{
if( !me ) return;

me->delete_temp("stealing");

        if( !victim || environment(victim) != environment(me) ) {
                tell_object(me, "太可惜了﹐你下手的目標已經走了。\n");
                return;
        }

        if( victim->detect_steal(me, ob, sp) ) return;

        if( objectp(ob) && (!living(victim) || (random(sp+dp) > dp) )) {
                if ( ob->query("id") == "black viper"
                || ob->query("id") == "green viper"
                || ob->query("id") == "white viper"
                || ob->query("id") == "red viper"
                || ob->query("id") == "yellow viper" ) {
                tell_object(me, "你摸到一條" + ob->name() +
                "﹐牠張著一口毒牙向你咬來﹐嚇的你連退好幾步。\n");
                return;
                }
                if( ob->query("no_steal") ) {
                        tell_object(me, "這東西不能偷。\n");
                        return;
                }
                if( !ob->move(me) ) {
                        tell_object(me, "你摸到一" + ob->query("unit") + ob->name()
                                + "﹐可是對你而言太重了﹐不得不放棄。\n");
                        return;
                }
                tell_object(me, HIW "得手了﹗\n\n" NOR);
                tell_object(me, "你成功地偷到一" + ob->query("unit") + ob->name() + "﹗\n");
                if( living(victim) ) {
                        int gain;
                        me->improve_skill("stealing", me->query_attr("int"));
                        gain = ob->query("value") / (me->query_skill("stealing")+50);
                        if( gain > 100 ) gain = 100;
                        me->gain_score("thievery", gain);
                        if( userp(victim) )
                                me->gain_score("mortal sin", random(me->query_skill("stealing") / 2) + 1 );
                }
                if( random(sp) < dp/2 )
                        message("vision", "你看到" + me->name() + "鬼鬼祟祟地從"
                                + victim->name() + "身上偷走了一" + ob->query("unit")
                                + ob->name() + "﹗\n", environment(me), ({ me, victim }) );
#ifdef SAVE_USER
        victim->save();
#endif
        } else {
                if( !ob || random(sp) > dp/2 ) {
                if ( present("black viper", victim)
                || present("red viper", victim)
                || present("green viper", victim)
                || present("white viper", victim)
                || present("yellow viper", victim) ) {
                 tell_object(me, "嗤﹗地一聲﹐" + victim->name() + "身上突然竄出一條昂首吐信的蛇﹐虎視眈眈著你﹗\n"
                                   "你嚇得趕緊縮手。\n");
                return;
                }
      else {
            tell_object(me, victim->name() + "不經意地一轉頭﹐你急忙將手縮了回去﹗\n"
                                             "還好﹐沒有被發現。\n");
            return;
            }
                }
                tell_object(me, HIR "糟糕﹗你失手了﹗\n\n" NOR);
                if ( present("black viper", victim)
                || present("red viper", victim)
                || present("green viper", victim)
                || present("white viper", victim)
                || present("yellow viper", victim) ) {
                message_vision("$N身上的蛇猛然咬向$n﹐讓$N驚覺$n的手正抓著$N的"
                + ob->name() + "﹗\n\n"
                +  "$N喝道﹕「幹什麼﹗」\n\n", victim, me); }
                else {
                message_vision("$N一回頭﹐正好發現$n的手正抓著$P身上的" + ob->name() + "﹗\n\n"
                        + "$N喝道﹕「幹什麼﹗」\n\n", victim, me);
                }
                me->improve_skill("stealing", random(me->query_attr("int")));
                me->gain_score("thievery", 1);
                if( userp(victim) ) victim->fight_ob(me);
                else {
                        victim->accept_kill(me);
                        victim->kill_ob(me);
                }
                me->fight_ob(victim);
                if( me->query_race() != "jiaojao" ) me->start_busy(3);
                if( me->query_race() == "jiaojao" ) me->start_busy(1);
        }
}

int help(object me)
{
write(@HELP
指令格式 : steal <某物> from <某人>

這個指令讓你有機會偷到他人身上的東西。成功了, 當然你就能獲得
該樣物品。可是, 馬有失蹄, 人總有失風的時候, 當你失敗時當然就
得付出代價, 至於是什麼代價......靠你自己去發掘囉。

當你是盜賊這個職業時,相對於其他的職業會有較高的偷盜能力,也
比較容易成功,甚至可以將目標的貼身衣物通通偷走,同樣的,對於
別人想動你身上東西的腦筋時,也比較容易察覺,當盜賊想要偷盜賊
的時候,這時就比看誰的功力高強了。

HELP
    );
    return 1;
}
HOME :: cmds :: std :: steal.bak