【施工中】宝可梦战斗系统研究记录

本文章基于五代到九代的战斗系统源码,对整个战斗系统框架进行研究记录,给制作跨平台同人游戏提供战斗方面的参考

前言

由于技术限制,3代和4代的战斗系统特别难以维护,于是GF在5代开始重写了一套战斗系统,并且在之后的世代里都基于该框架进行移植和修改,以下为时间线:

第五世代

黑白/黑白2

初版战斗框架,C语言版本

第六七世代

XY/红蓝宝石复刻/日月/究极日月/去皮去伊

五代战斗框架的C++版本移植,同时在ns上又稍微修改了一下制作了去皮去伊

第八九世代

剑盾/朱紫

重构C++版本,变得更加复杂

本文将会记录第九世代的战斗逻辑和第五世代的战斗流程以及原理,不涉及UI方面


战斗系统介绍

基本流程介绍

宝可梦的战斗系统主要由服务端Server用户端Client来处理,服务端负责向用户端发送各种指令以及控制运行整体的战斗流程,用户端接收到服务端的指令后运行相应的任务。

以下为基本流程简述,如果需要查看具体流程说明请点击标题

战斗简要流程

战斗系统初始化

初始化战斗系统,根据传入的所有用户的宝可梦队伍数据转换成战斗宝可梦数据,将该数据分别复制给用户端宝可梦数据数组和服务端数据数组。
创建用户端,初始化服务端,服务端开始执行入场流程

战斗开始入场流程

服务端向所有用户端发送BATTLE_START的指令,然后开始等待所有用户端处理指令完毕
用户端会根据用户类型处理战斗开始时的效果

  • 当用户端为AI时,不执行任何动作
  • 当用户端为玩家时,执行UI初始化和入场动作
  • 当用户端为战斗回放时,不执行任何动作

用户端为玩家时初始化玩家的UI、创建宝可梦图形,并且执行战斗入场的动画脚本,动画结束时BATTLE_START执行结束

BATTLE_START执行完毕

当所有BATTLE_START执行完毕后,运行战斗开始的功能函数(根据传入的野外天气、场地运行对应的天气改变、场地改变函数),然后向所有用户端发送WAIT_CMD的指令,该指令会运行在功能函数里预存的脚本指令,比如动画效果,文本显示并等待运行结束,随后开始显示玩家的选项UI,服务端进入等待命令选择任务

命令选择

所有用户端进入命令选择阶段

  • 用户端为AI:执行训练师的AI代码,获取命令参数(比如选择了什么技能)
  • 用户端为玩家:执行UI主逻辑,根据玩家交互响应后得到命令参数

结束后服务端获取所有的命令参数,根据命令生成初始的优先级数值,然后从快到慢排列所有的优先级并开始逐个执行,每次命令执行都会根据当前参数重新获取宝可梦的速度并生成新的优先级数值然后重新排序,跳过已经标记为执行完毕的命令参数直至所有的命令执行完毕
注意:该次执行所有对宝可梦数据的修改只会修改服务端宝可梦数据数组

服务端执行完命令后开始向用户端发送WAIT_CMD的指令,执行所有的功能脚本:包括技能动画运行,特性弹窗,对用户端的宝可梦数据修改等等
执行结束后循环命令选择阶段直到战斗结束