literwave game.

游戏开发

Word count: 620Reading time: 2 min
2023/04/30

战斗分析

  • 战斗需要的数据(怪物)
  • 首先需要怪物组id列表,决定玩家打几组怪物
  • 打的回合数
  • 攻击者的战斗列表
  • 怪物的等级列表
  • 客户端的其他数据(地图,是否负伤, 阵法id)
  • 法则数据列表
  • 初始血量列表

需知前提

  • 怪物同样需要构造战斗列表,战力一般都是通过属性计算的
  • 注意站位信息,3人的队伍,可能前排一个,也有可能前排两个,有啥不同呢,因为打前排和打后排伤害是不同的。
  • 战斗最好在里面有动态测试标志。

得到攻击者和防御者的列表

  • 数据结构为

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    figh_list = {
    baseList = {},

    }
    baseList = {
    modelInfo = {},
    propData = {},
    skillList = {},
    passiveSkillList = {},
    gemInfo = {},
    assistantInfo = {},
    assistantPropData = {},
    assistantSkillList = {},
    assistantPassive = {},

    }
  • 首先遍历怪物列表,得到怪物的战斗属性,怪物超过五个的话,还有个defex结构

战斗计算所需要的一些数据

  • 攻击者的战斗列表,防御者的战斗列表,attackex, defex,回合数,测试标志,地图id,攻击者的队伍类型站位,防御者的队伍站位,法则数据,多少回合结束算赢。

做在agent里面的战斗

  • 使用_G.fightData = {},这里为啥可以这样做呢,因为agent服务是一个单线程的lua虚拟机,使用一定会按顺序计算战斗。

战斗计算流程

  • 清除被动技能数据列表

  • 拷贝一份战斗数据,数据结构如下

    1
    2
    3
    propFight = table.deepcopy(propData)
    baseList.propData = table.deepcopy(propData)
    figh_list.baseList.propFight.baseList = figh_list.baseList
  • 写入战报站位信息以及地图信息

    1
    2
    --写入站位信息及地图id {攻方站位类型(0: 5人站位, 1: 3人站位 2: 1人站位), 守方站位类型, 地图id, 回合上限数, 攻方阵法id, 守方阵法id},
    table_insert(fightLog, {attackTeamType or 0, defTeamType or 0, mapId or 0, cycNum, (attack.zhenFa and attack.zhenFa[1] or 0), (def.zhenFa and def.zhenFa[1] or 0)})
  • 写入战报战斗初始信息,比如弟子血量和弟子法宝能量

  • 写入战报后援数量,就是attackExdefEx

  • 大于一回合的时候才判断下重生和复活的技能,不可能第一回合就重生的,第一回合的时候,激活一下第一回的被动技能,其他回合判断一下循环的被动技能

CATALOG
  1. 1. 战斗分析
  2. 2. 需知前提
  3. 3. 得到攻击者和防御者的列表
  4. 4. 战斗计算所需要的一些数据
  5. 5. 做在agent里面的战斗
  6. 6. 战斗计算流程