□ 技能系统
我们使用的技能系统是属於多元成长途径的系统，有别於传统用经验值换取等级的
方式，一个技能由两个数值来描述：「等级」与「学习点数」，平常使用时只看等
级，学习点数完全不影响技能的效力。
由於技能的性质不同，我们将技能分为两大类：基本技能跟特殊技能，基本技能又
可以称为技能种类，所有的特殊技能都必须有至少一种的基本技能为基础，举例来
说，「xx剑法」是一种特殊技能，以「基本剑术」、「拆招卸力之法」为基础，这
个意思是说，这种剑法可以被「使用」在剑术与拆招卸力的用途上，并不是说必须
先学过基本剑术与拆招卸力之法才能学这个剑术，有关技能的学习限制完全由技能
本身定义，系统不预作假设。
通常我们公式中计算技能等级的时候，使用的是一种称为「有效等级」的计算方式
，所谓的有效等级，是以「技能种类」(基本技能)为索引的，特殊技能没有有效等
级，因为有效等级的计算是合并 □ 基本技能、□ 被「致能」的特殊技能， 以及
 □ 装备、法术等其他影响，所计算出来的，其中基本技能的等级以二分之一计算
，特殊技能以原来等级计算，装备及其他法术影响以修正值计算(可正可负)。大概
的公式如下：
  有效等级 = (基本技能 / 2) + 特殊技能(enabled) + 修正值
大多数的公式中所称的「技能等级」指的便是上面的有效等级。
□ 技能定义
所有的技能包括基本技能与特殊技能，我们都用一个物件来定义，定义技能的物件
必须继承(inherit)标准技能物件 SKILL，并且定义以下几个函数：
[36m string type() [2;37;0m{ return "martial"; }          
//  技能类型 martial(武力型) knowledge(知识型)
//  传回技能的型态，目前有 "knowledge"、"martial" 两种，其中 "martial" 型态
//  的技能 learn 指令会自动限制当实战经验小於技能(不是有效技能)三次方除20的
//  时候不能学习。
[36m int valid_enable(string usage)               [2;37;0m
//  检查这个技能是否可以用在 usage 的用途上，若是，传回 1，否则传回 0。
//  例如 return ( usage == "sword" || usage == "parry" );
[36m void skill_improved(object me)[2;37;0m
//  每当一个人物的技能等级提升了，就会呼叫这个函数，你可以在这里面做一些跟等
//  级相关的改变或奖励。
//  例如 tell_object(me,HIR+"由于你勤学苦练,你的身法更灵活了!\n"+NOR);
[36m int valid_learn(object me) [2;37;0m{ return 1; }     
//  检查 me 是否有学习这项技能的条件，这里的学习包括 learn, study, practice，
//  但是不包括经由使用而进步的情形。如果合乎条件，传回 1，否则传回 0。
[36m int practice_skill(object me)[2;37;0m
//  让一个人物「练习」一个技能，这个函数是由 practice 指令呼叫，作为技能物件
//  的处理函数。
[36m int practice_level() [2;37;0m {   return 100; }        
// practice该技能自升级所需隐含级别
[36m string exert_function_file(string func)      [2;37;0m
// 返回exert功能文件的位置(内功(force)的技能类型有效)
[36m string perform_action_file(string action)[2;37;0m
// 返回使用perform的文件位置
[36m string conjure_magic_file(string spell)[2;37;0m
// 返回使用conjure的文件位置
[36m string query_skill_name(int level)[2;37;0m
// 返回招式名称
[36m mapping query_action(object me, object weapon)[2;37;0m
// 返回攻击时的描述,招式,伤害值等
// (["action": string,  执行这个动作所出现的讯息，格式是和 message_vision 
//                      这个 simul efun 要求的相同，
//                      例如 "$N挥舞$w对准$n的$l用力一敲" 
//                      其中:$l攻击的部位,$w武器名,$N攻击方,$n防御方
//   "attack" : int,    对自己攻击力的修正百分率。
//   "dodge" : int,     造成对方dodge的修正百分率。
//   "parry" : int,     造成对方parry的修正百分率。
//   "damage" : int,    造成对方伤害值的修正百分率。
//   "force" : int,     造成对方次级伤害值的影响
//   "lvl" : int,       使用本招式所需的级别
//   "skill_name" : string 招式名称
//   "damage_type" : string 伤害类型("擦伤","割伤","刺伤","瘀伤","内伤")
//   "post_action" : (: call_other, __FILE__, "bash_weapon" :),
//                      这是一个 function type 的栏位，如果这个栏位被定义，
//                      combatd 会在 action讯息印出之後呼叫这个 function，
//                      有不少战斗中的特殊效果都是利用这个方式完成，如投射
//                      武器的消耗、某些战斗用的魔法等。
// ])
// 本人建议这里的修正值与人物的该技能等级挂钩,因为即使是平淡无奇的招式
// 高手运用起来也必定威猛无比.
[36m mixed hit_ob(object me, object victim, int damage_bonus)[2;37;0m
// 打中对方时的特殊攻击,返回string型时,增加攻击之描述,返回int型,影响damage值
// 该函数也可以定义在npc和武器上
[36m mixed armor_ob(object me, object victim, int damage_bonus)[2;37;0m
// 被对方打中时的特殊防御,返回string型时,增加防御之描述,返回int型,影响damage值
// 目前此功能只支持force的护体和NPC的特殊防御,护体需要设置
// set_temp("apply/armor_vs_force",int 最大防御值)
[36m string query_parry_msg(object me,object weapon)[2;37;0m
// 返回招架之招式描述。其中:weapon是对方进攻的武器
[36m string query_dodge_msg(string limb,object me)[2;37;0m
// 返回闪躲之招式描述。其中:limb是对方进攻me的部位
[36m void do_interlink(object me, object victim)[2;37;0m
// 该技能的特殊攻击
// 例如辟邪剑法中快速奇诡的特殊攻击
[1;35m By Fan(wanxia)     8/18/1998[2;37;0m
