#include <combat.h> inherit SSERVER; private string *order = ({ "一", "二", "三", "四", "五", "六", "七", "八", }); int perform(object me, object target) { int max, my_score, pollyforce, target_score, tenderzhi; string target_skill_type; // 確認攻擊對象 if (!target) { target = offensive_target(me); } if (!target || !me->is_fighting(target)) { return notify_fail("「飛瀑連環指」只能對戰鬥中的對手使用。\n"); } // 計算攻擊次數 tenderzhi = me->query_skill("unarmed"); if (tenderzhi < 100) { return notify_fail("你的柔虹指法不夠熟練,沒辦法使用「飛瀑連環指」。\n"); } max = (tenderzhi / 50) + 1; if (me->query_skill_mapped("force") == "pollyforce") { pollyforce = me->query_skill("force"); max += pollyforce / 150; } if (max > 8) { max = 8; } // 檢查內力值 if (100 + (me->force_factor() * max) > me->query("force")) { return notify_fail("你的內力不夠。\n"); } // 狀態 target_skill_type = target->query_skill_type(); if (living(target)) { int my_gift, my_weapon_exp, target_gift, target_weapon_exp; // 自身狀態 my_gift = (me->query_attr("con") + me->query_attr("per") + 130) >> 1; my_weapon_exp = me->query_weapon_exp("unarmed"); if (!my_weapon_exp && !userp(me)) { my_weapon_exp = me->query("combat_exp") >> 2; } my_score = (me->query("combat_exp") + (my_weapon_exp << 1)) * my_gift; // 攻擊對象的狀態 target_gift = (target->query_attr("str") + target->query_attr("per") + 130) >> 3; target_weapon_exp = target->query_weapon_exp(target_skill_type); if (!target_weapon_exp && !userp(target)) { target_weapon_exp = target->query("combat_exp") >> 2; } target_score = (target->query("combat_exp") + target_weapon_exp) * target_gift; } // 連擊 message_vision(HIR"\n$N使出柔虹指法的「"HIC"飛瀑連環指"HIR"」,連遞數個招式企圖突擊$n"HIR"。\n"NOR, me, target); me->add("force", -100); if (random(my_score) >= target_score) { int damage, extra_damage, extra_rate, num, total_damage; object weapon = me->query_temp("weapon"); if (userp(me)) { extra_rate = max * -2; me->start_cooldown("attack", 2000); me->start_cooldown("perform", me->query_career() == "unarmed" ? 2000 : 3000); } for (num = 0; num < max; ++num) { message_vision(HIC"\n飛瀑連環指 第" + order[num] + "式"NOR, me, target); damage = COMBAT_D->do_attack(me, target, weapon, TYPE_QUICK, extra_rate); if (damage > 0) { total_damage += damage; } if (target->query("kee") < 0) { damage = 0; break; } else if (extra_rate) { extra_rate += 2; } } if (damage > 0) { damage = COMBAT_D->process_eq_power(me, target, damage); if (damage > 0) { target->receive_damage("kee", damage); } else if (damage < 0) { target->receive_heal("kee", -damage); } extra_damage += damage; } message_vision(HIW"\n$P收回對$p的飛瀑連環指,共造成 " + (total_damage + extra_damage) + " 點傷害!\n"NOR, me, target); COMBAT_D->report_status(target, 0); // 統計 if (userp(me) && num >= 8) { log_file("statistic/tenderzhi", sprintf("%s %d %d vs %d %d %s : %d + %d = %d\n", me->query_id(), me->query("combat_exp") / 1000, me->query_temp("apply/damage"), target->query("combat_exp") / 1000, target->query_temp("apply/armor"), target->query_busy() ? "x" : "-", total_damage, extra_damage, total_damage + extra_damage)); } } else { message_vision(HIW"可是$p看破了$P的企圖,並沒有上當。\n"NOR, me, target); me->start_busy(2); } return 1; }