下面是一个 perform 的具体实例
// Copyright (C) 2003, by Lonely. All rights reserved.
// This software can not be used, copied, or modified
// in any form without the written permission from authors.
#include <ansi.h>
#include <combat.h>
#include <perform.h>
#define YI "「" HIY "剑意" NOR "」"
inherit F_SSERVER;
int perform(object me, object target)
{
object weapon;
string msg;
int ap, dp, skill;
int damage;
skill = me->query_skill("dugu-jiujian", 1);
if (skill < 90)
return notify_fail("你所使用的外功中没有这种功能。\n");
if (userp(me) && ! me->query("can_perform/dugu/yi"))
return notify_fail("你还没有受过高人指点,无法施展" YI "。\n");
if (! target)
{
me->clean_up_enemy();
target = me->select_opponent();
}
if (! me->is_fighting(target))
return notify_fail(YI "只能对战斗中的对手使用。\n");
if (! objectp(weapon = me->query_temp("weapon"))
|| weapon->query("skill_type") != "sword")
return notify_fail("你所使用的武器不对,难以施展" YI "。\n");
if (me->query_skill_mapped("sword") != "dugu-jiujian")
return notify_fail("你没有激发独孤九剑,难以施展" YI "。\n");
if (! living(target))
return notify_fail("对方都已经这样了,用不着这么费力吧?\n");
switch (random(3))
{
case 0:
msg = HIY "$N" HIY "随手一剑指向$n" HIY ",落点正是$n"
HIY "破绽所在,神剑之威,当真人所难测。\n" NOR;
break;
case 1:
msg = HIY "$N" HIY "剑招大开大阖,看似杂乱无章,但招"
"招皆击$n" HIY "攻势中破绽,有如神助。\n" NOR;
break;
default:
msg = HIY "$N" HIY "反手横剑刺向$n" HIY ",这似有招似"
"无招的一剑竟然威力奇大,令人匪夷所思。\n" NOR;
break;
}
// 从 perform.h 中计算攻击值大小,传入的攻击类型为剑法和特殊剑法
ap = ap_power(me, "sword");
// 从 perform.h 中计算防御值大小,传入的防御类型为招架和特殊招架
// dp 中加入 dugu-jiujian 的等级一半,主要是因为判断对手是否会独
// 孤,如果会,那么攻击成功率要降低。
dp = dp_power(target, "parry") +
target->query_skill("dugu-jiujian");
// 把攻击值和防御值做对比,计算是否命中
if (ap / 2 + random(ap) > dp)
{
// 从 perform.h 中计算伤害大小,传入的是剑法的伤害
damage = da_power(me, "sword");
msg += COMBAT_D->do_damage(me, target, WEAPON_ATTACK, damage, 50,
HIR "$n" HIR "全然无法领会$N" HIR "剑"
"招中的奥妙,一个疏神,登遭重创!\n" NOR);
me->start_busy(2);
} else
{
msg += CYN "可$n" CYN "淡然处之,并没将$N"
CYN "此招放在心上,随手架开,不漏半点破绽。\n" NOR;
me->start_busy(3);
}
message_combatd(msg, me, target);
return 1;
} |