This project is read-only.

技能数据结构与实现流程

结构(一个X或Y是4bit

属性 XX
技能种类 XX
技能判定类型 XX
技能威力 XX
技能命中 XX
技能pp XX
技能优先度 XX
连续攻击次数 YX 从X到Y次
技能附加状态代码 XX XX
技能附加几率 XX
技能附加分类 XX
技能特效持续回合 XX YY 从XX到YY回合
CT等级 XX
害怕几率 XX
技能效果代码 XX XX
伤害反弹/吸收比例 XX
自身HP恢复比例 XX
技能作用对象 XX
能力1 XX 能力2 XX 能力3 XX
变化等级1 XX 变化等级2 XX 变化等级3 XX
几率1 XX 几率2 XX 几率3 XX
?? 53 ?? 53
被动特效 XX XX flag模式,展开后结果略
00 00

备注
追加状态10诅咒、11挑拨,原表有出入,没有10、11、16号状态,个人怀疑13号状态没什么用
特效代码相同的技能种类代码必相同
技能种类为0的变化技能只有先取,因为先取如果成功会造成伤害,事实上是一种即时攻击技能。

 

特效分类

种类代码与技能特效,可以理解为为了方便,将常用效果(技能运作方式)总结为“种类”和其他字段,对细节部分用特效实现,特效包含技能使用前、使用后的特效。

但对于种类代码5和9,也有可能是为了移植前世代的技能特效而使用此字段。第五世代共引入了26种全新特效,其余技能特效前四代均有雷同技能。

  1. 特效代码0,种类代码必为0,为最一般的攻击技能,追加分类害怕几率能力变化字段均为0,除304高级噪音可攻击对方全体其他均为对方单体;
    27个技能,1个特效代码
  2. 种类代码0,特效代码不为0,带有特殊效果的攻击技能;
    205个技能,112个特效代码
  3. 种类代码1,给目标pm追加一种状态,追加分类为1或2(即一般追加或回合限定追加),追加的状态不包含3冰冻、8束缚、10诅咒、11挑拨、13残废;
    31个技能,19个特效代码
  4. 种类代码2,均为变化技能,变化对手单体、全体或自己的能力,追加分类害怕几率均为0,能力变化几率为0,即必定变化(可能不消耗随机数种子);
    49个技能,34个特效代码
  5. 种类代码3,立刻回复Hp的技能,从355羽栖等技能考虑,单个技能特效需另做;
    11个技能,5个特效代码
  6. 种类代码4,攻击成功后给目标加异常状态或混乱、束缚,目标为对手单体、全体或自身以外;
    66个技能,26个特效代码
  7. 种类代码5,仅有虚张声势和煽动,也是仅有的两个同时有追加状态和能力变化的技能;
    2个技能,2个特效代码
  8. 种类代码6,攻击成功后对手能力变化;
    37个技能,10个特效代码
  9. 种类代码7,攻击成功后自己能力变化,注意466妖风的状态追加几率为10 <-- 忽略吧
    17个技能,10个特效代码
  10. 种类代码8,攻击吸收类技能,只有138食梦的特效代码与众不同,因为它需要对手睡眠;
    7个技能,2个特效代码
  11. 种类代码9,一击必杀,注意对命中的处理细节一致;
    4个技能,1个特效代码
  12. 种类代码A,全地图增加(或修改)状态,全场必中,修改的状态由特效处理,没有其他字段作为参数;
    11个技能,11个特效代码
  13. 种类代码B,队伍场地增加(或修改)状态;
    11个技能,11个特效代码
  14. 种类代码C,吹飞/吼叫,强制对方交换,即使修改参数字段也不会产生伤害;
    2个技能,1个特小代码
  15. 种类代码D,除预见未来和破灭之愿外均为变化类技能,均不会产生即时伤害,具体效果由特效代码实现,注意393电磁浮游的持续时间字段和50残废
    79个技能,72个特效代码

技能实现流程

可以肯定的是技能实现总流程不止一个,这由技能种类代码控制。

行动排序,交换一般最优先,但要考虑228追击

1. 攻击类技能(0/4/6/7/8

生成所有目标
{
计算是否命中,0x65直接产生必中,道具特性影响
计算命中次数n
{
判断能否进行攻击
计算是否会心,计算后通知道具特性(或者硬编)
计算技能威力(因为计算了n次要注意深绿特性)
计算攻击力
计算防御力
计算修正1
计算修正2
产生伤害,记录伤害,通知相关道具特性(注意FaintHurt是完全不同的处理)
判断是否附加状态(4)
判断是否害怕/如果击中对方有能力变化进行能力变化(6)
如果有精灵Hp==0,倒下(原作不是用Hp=0判断,可能是比较的Damage与Hp)
}*n
读取伤害记录,计算伤害反伤/吸收(8)
}
Hp百分比变化(在更统一的地方计算)
如果命中(只需判断上一次有没有命中,目标都是0)
    自己有能力变化进行能力变化(7)

以上计算如果采用http://www.pokemon.name/wiki/%E4%BC%A4%E5%AE%B3要注意相关特性避免重复。

 

 2. 一击必杀(9

 3. 变化/吹吼(1/2/3/5/A/B/C/D/先取)

 

状态实现

除了识破添加状态只需要3个参数,因为谁而添加(着迷、同步率、红线等)by,要添加的状态(如下)state,添加回合turn

  1. 麻痹
    判断能否行动时,以25%概率返回false
    获取精灵速度时,注意早足特性
  2. 睡眠
    判断能否行动时,首先减去睡眠计数
    睡眠计数为0,通知xxx醒过来了,清除睡眠状态,返回true
    通知xxx睡得很香,返回false
  3. 冰冻
    判断能否行动时,如果是AvailableEvenFrozen,则解冻返回true
    否则25%概率解冻返回true,75%概率返回false  //解冻率没有统一说法,一般认为是1/4左右..0791里应该是1/4
  4. 烧伤
    EndTurn扣血,注意特性
  5. 中毒/剧毒
    如果特性允许扣血
    如果回合计数为0,扣血1/8
    否则扣血回合计数*1/16
    如果回合计数>1,计数-1
  6. 混乱
    判断能否行动时,首先减去计数
    计数为0,通知pm的混乱解除了,清除混乱状态,返回true
    通知xxx混乱了
    50%攻击自己后返回false,50%返回true
    由于冰冻、害怕、硬直等效果而无法使用技能的回合不计入次数 <-- 注意判断能否行动的顺序
  7. 着迷
    判断能否行动时,通知pm1迷上了pm2
    50%通知pm1因为着迷无法行动,返回false
    如施加方下场,清除状态
  8. 束缚
    如果by持有束缚头巾或强韧之爪,添加相应效果
    EndTurn扣血,通知pm受到move的伤害
    CanSwitch保持false <-- 注意CanSwitch只是玩家主动交换
    如施加方下场,清除状态
  9. 噩梦
    EndTurn检查开关后扣血
  10. 挑衅
    使用Move后将该技能.IsAvailable置为false
    但这样做,在设置为true的时候会有麻烦(比如专爱),小心为妙
    另一种方法是设置一个挑衅状态戳,每使用一个技能就把这个状态戳设为不是,IsAvailable判断检查
  11. 残废
    总是残废最后使用的技能,通过AtkContext.MoveProxy找到最后使用的技能吧
  12. 哈欠(哈欠状态orz
    EndTurn计数
  13. 回复封印
    在里面判断?
  14. 识破
    根据by的上次使用技能(正在使用的技能)决定BattleType?通过AtkContext.Move决定BattleType
  15. 寄生种子
  16. 扣押
  17. 灭亡歌
  18. 扎根
  19. 特殊(但为什么要归为一类呢..)

Last edited Aug 18, 2012 at 3:53 PM by Snowy, version 5

Comments

No comments yet.