// skillstru.c
// Last Modified by winder on May. 15 2001

#include <ansi.h>
inherit SKILL;

/* 攻击信息 */
mapping *action = ({
([        "action"     : $N自己，$w自己兵器，$n对方，$l对方身体部位。
        "skill_name" : "",
        "lvl"        : 从0开始。
]),
});

/* 招架信息 */
string *parry_msg = ({
        $N自己，$w自己兵器，$n对方，$l对方身体部位。
});

/* 轻功信息 */
string *dodge_msg = ({
        $N自己，$n对方。
});

/* 可激发的武功类型 */
int valid_enable(string usage) { return usage=="sword" || usage=="parry"; }

/* 武功类型，分knowledge、force、dodge和skill */
string type() { return "skill"; }

/* 可与互备的武功 */
int valid_combine(string combo) { return combo=="king-of-dragon"; }

/* 招数效力的条件，目前我们没限制 */
int valid_effect(object me, object weapon, string name, int skill) { }

/* 学习的条件。practice也要检测本函数，所以，在这里限制内功和内力就够了。 */
int valid_learn(object me) { }

/* 练习的条件 */
int practice_skill(object me) { }

/* 学习的招数表现 */
string query_skill_name(int level)
{
        int i;
        for(i = sizeof(action); i > 0; i--)
                if(level >= action[i-1]["lvl"])
                        return action[i-1]["skill_name"];
}

/* 升级的信息及副作用 */
void skill_improved(object me) { }

/* 击中对方的副作用 */
mixed hit_ob(object me, object victim, int damage_bonus) { }

/* 被击中对方的副作用，目前主要用在内功上 factor= 加力 damage_bonus=臂力 */
mixed be_hit_ob(object me, object victim, int damage_bonus, int factor) { }

/* 激发成攻击武功的信息 */
mapping query_action(object me, object weapon)
{
/* d_e=dodge_effect p_e=parry_effect f_e=force_effect m_e=damage_effect */
        int d_e1 = -30;
        int d_e2 = 30;
        int p_e1 = -30;
        int p_e2 = 30;
        int f_e1 = 100;
        int f_e2 = 300;
        int m_e1 = 100;
        int m_e2 = 400;
        int i, lvl, seq, ttl = sizeof(action);

        lvl = (int) me->query_skill("changge-jian", 1);
        for(i = ttl; i > 0; i--)
                if(lvl > action[i-1]["lvl"])
                {
                        seq = i; /* 获得招数序号上限 */
                        break;
                }
        seq = random(seq);       /* 选择出手招数序号 */
        return ([
                "action"      : action[seq]["action"],
                "dodge"       : d_e1 + (d_e2 - d_e1) * seq / ttl,
                "parry"       : p_e1 + (p_e2 - p_e1) * seq / ttl,
                "force"       : f_e1 + (f_e2 - f_e1) * seq / ttl,
                "damage"      : m_e1 + (m_e2 - m_e1) * seq / ttl,
                "damage_type" : random(2) ? "内伤" : "刺伤",
        ]);
}

/* 激发成招架武功的信息 */
string query_parry_msg(string limb)
{
        return parry_msg[random(sizeof(parry_msg))];
}

/* 激发成轻功的打斗信息 */
string query_dodge_msg(string limb)
{
        return dodge_msg[random(sizeof(dodge_msg))];
}

/* 武功难度系数 = 100 / (learn_bonus+parctice_bonus+10) 在skill.c命令中体现 */
/* 每点潜能所能学到的本技能点数 = random(query_int()/2+query("int")/2+bonus) */
/* 限制范围 0 - 30 */
int learn_bonus() { return 10; }

/* 每次练习获得技能点数 = (random(基本武功*基本武功/(skill+1)))/5+bonus */
/* 限制范围 0 - 30 */
int practice_bonus() { return 15; }

/* 对师傅传授产生误解的比率。random(success()) == 0的时候误解。暂时不用。
数值越大越不容易误解。误解引起倒退或停滞，仅体现在learn & teach */
int success() { return 10; }

/* 威力参数，参照门派参数，限制范围1到1.5。严禁超标！目前仅用于轻功。 */
int power_point() { return 1.2; }

/* 绝招文件目录 */
string perform_action_file(string action)
{
        return __DIR__"changge-jian/" + action;
}

/* 内功应用文件目录 */
string exert_function_file(string func)
{
        return __DIR__"changge-jian/" + func;
}

/* 帮助信息 */
int help(object me)
{
        write(HIC"\n："NOR"\n");
        write(@HELP

HELP
        );
        return 1;
}
