源战役
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

332 lines
18 KiB

  1. %%%------------------------------------------------
  2. %%% @author huangyongxing@yeah.net
  3. %%% @doc 战斗相关公共定义
  4. %%%------------------------------------------------
  5. -ifndef(BATTLE_HRL).
  6. -define(BATTLE_HRL, ok).
  7. -define(BATTLE_ATT_TYPE_SRD, 0). % 近程攻击
  8. -define(BATTLE_ATT_TYPE_RD, 1). % 远程攻击
  9. -define(HURT_TYPE_NORMAL, 0). % 普通
  10. -define(HURT_TYPE_MISS, 1). % 闪避
  11. -define(HURT_TYPE_CRIT, 2). % 暴击
  12. -define(HURT_TYPE_IMMUE, 3). % 免疫伤害(无敌)
  13. -define(HURT_TYPE_HEART, 4). % 会心
  14. -define(HURT_TYPE_PARRY, 5). % 格挡
  15. -define(HURT_TYPE_SHIELD, 6). % 护盾免伤
  16. %% 战斗对象定义
  17. -define(BATTLE_SIGN_MON, 1). %% 怪
  18. -define(BATTLE_SIGN_PLAYER, 2). %% 人
  19. -define(BATTLE_SIGN_DUMMY, 5). %% 假人
  20. -define(BATTLE_SIGN_PARTNER, 7). %% 伙伴AI娘
  21. -define(BATTLE_SIGN_CHILD, 15). %% 宝宝
  22. -define(BATTLE_SIGN_WEAPON, 16). %% 宝具/圣物
  23. -define(BATTLE_SIGN_PET, 25). %% 宠物
  24. -define(BATTLE_SIGN_FAKE, 100). %% 100: 伪造的攻击对象(只在战斗使用)
  25. %% 战斗时机定义
  26. -define(BATTLE_MOMENT_ATTACK, 1). %% 攻击时
  27. -define(BATTLE_MOMENT_DEFENCE, 2). %% 防守时
  28. %% -------------------------------------------------------------------
  29. %% 战斗中的特殊效果 BUFF
  30. %% XXX 特别注意:
  31. %% 由于项目中经常采用技能系统来投放属性,意味着属性这边的id,
  32. %% 与战斗中的特殊效果id必须是无冲突的。
  33. %% 其他情况可参见attr.hrl中的说明
  34. %% -------------------------------------------------------------------
  35. -define(SPBUFF_DIZZY, 301). % 眩晕
  36. -define(SPBUFF_SILENCE, 302). % 沉默
  37. -define(SPBUFF_IMMOBILIZE, 303). % 定身:skill
  38. -define(SPBUFF_SHIELD, 304). % 护盾(时间)
  39. -define(SPBUFF_SHIELD_COUNT, 305). % 护盾(次数)
  40. -define(SPBUFF_IMMUNE, 306). % 无敌
  41. -define(SPBUFF_UNHURT, 307). % 免伤
  42. -define(SPBUFF_SUPERARMOR, 308). % 霸体
  43. -define(SPBUFF_UNSPEED, 309). % 减速免疫
  44. -define(SPBUFF_UNDIZZY, 310). % 眩晕免疫
  45. -define(SPBUFF_UNBLEED, 311). % 流血免疫
  46. -define(SPBUFF_SUCK_BLOOD, 314). % 吸血
  47. -define(SPBUFF_REBOUND, 315). % 反弹
  48. -define(SPBUFF_RESUME, 316). % 回血
  49. -define(SPBUFF_BLEED, 317). % 流血
  50. -define(SPBUFF_CLEAN_BUFF, 318). % 清除负面控制buff
  51. -define(SPBUFF_KILL, 319). % 斩杀
  52. -define(SPBUFF_RATIO_UNHURT, 320). % 概率免伤
  53. -define(SPBUFF_SLOW, 321). % 减速
  54. -define(SPBUFF_FIRING, 322). % 灼烧
  55. -define(SPBUFF_MINUS_CD, 323). % 减CD
  56. -define(SPBUFF_BASE_ATTR_ADD_RATIO, 326). % 全属性提升
  57. -define(SPBUFF_RESUME_ADD_RATIO, 327). % 回血效果提升
  58. -define(SPBUFF_BERESUME_ADD_RATIO, 328). % 被回血效果提升
  59. -define(SPBUFF_UNRESUME, 329). % 回血免疫-禁疗
  60. -define(SPBUFF_FEAR, 330). % 恐惧
  61. -define(SPBUFF_NO_BATTLE, 331). % 远离战斗:既不能攻击别人,也不能攻击别人
  62. -define(SPBUFF_COMBO, 332). % 连击buff
  63. -define(SPBUFF_SKILL_HURT, 333). % 技能伤害
  64. -define(SPBUFF_PROHIBED_JUMP, 399). % 禁跳(被禁止执行跳跃)
  65. %% 最大选择攻击对象数量
  66. -define(MAX_ATTACK_NUM, 30).
  67. %% 发起战斗错误码
  68. -define(ERR_TOO_FAST, 2). % 技能CD问题
  69. -define(ERR_ATTACKER, 3). % 攻击方异常(无血、数据丢失)
  70. -define(ERR_CD, 5). % 技能CD问题
  71. -define(ERR_CONF, 6). % 错误配置
  72. -define(ERR_SKILL_INVALID, 8). % 技能无效(非主动或转生替换后不可再使用等)
  73. -define(ERR_ANGER_NO_ENOUGH, 10). % 怒气不足
  74. -define(ERR_GOD_SKILL, 13). % 式神技能释放错误(变身时可能多余,前端方便隐藏)
  75. -define(ERR_SKILL_STAGE, 14). % 多段技能施放的技能阶段错误
  76. -define(ERR_DIZZY, 21). % 眩晕中
  77. -define(ERR_SILENCE, 22). % 沉默
  78. -define(ERR_FEAR, 23).
  79. -define(ERR_COMBO, 30).
  80. -define(ERR_ANY_MON_NOT_EXISTS, 41). % 攻击目标部分怪物不存在
  81. -define(ERR_OTHER_BUFF, 42).
  82. %% -------------------------------------------------------------------
  83. %% 战斗主体
  84. -record(battle_status, {
  85. id = 0 % 角色/怪物id
  86. ,server_id = 0 % 来源服务器id
  87. ,node = none % 来源节点
  88. ,figure = undefined % 形象
  89. ,battle_attr=undefined % 战斗通用属性 #battle_attr{} (attr.hrl)
  90. ,config_id=0 % 场景对象配置id
  91. ,mid = 0 % 怪物配置id
  92. ,kind = 0 % 怪物类型
  93. ,boss = 0 % boss类型
  94. ,att_type = 0 % 攻击类型(0近程,1远程)
  95. ,online = 0 % 在线标识:怪物为在线
  96. ,scene = 0 % 所属场景
  97. ,copy_id = 0 % 所属副本
  98. ,x = 0 % X
  99. ,y = 0 % y
  100. ,att_area = 0 % 攻击范围
  101. ,pid = none % 玩家/怪物进程
  102. ,sid = none
  103. ,sign = 0 % 标示是怪还是人 1:怪, 2:人
  104. ,skill = [] % 技能
  105. ,skill_cd = [] % 技能cd记录
  106. ,skill_minus_cd = [] % 技能减cd列表
  107. ,skill_combo = [] % 技能连接(连技/多段)
  108. ,shaking_skill = 0 % 正在释放前摇的技能
  109. ,skill_owner = undefined % #skill_owner{}
  110. ,guild_id = 0 % 帮派id
  111. ,protect_end_time=0 % 保护时间
  112. ,team_id = 0 % 队伍id
  113. ,team_leader_name="" % 队伍队长名字
  114. ,team_skill = 0 % 队伍临时技能(被动)荆棘之心
  115. ,team_skill_num = 0 % 荆棘之心的叠加层数
  116. ,group = 0 % 战场阵营分组
  117. ,is_main = 0 % 是否主要攻击对象
  118. ,is_armor = 0 % 是否霸体
  119. ,is_be_atted = 1 % 是否可被攻击
  120. ,skill_passive = [] % 玩家被动技能
  121. ,skill_pet_passive = [] % 巫女被动战斗触发技能
  122. ,att_list = [] % 正在攻击我的怪物列表
  123. ,boss_tired = 0 % 世界BOSS疲劳值
  124. ,deserted_boss_tired = [] % 废都boss疲劳值
  125. ,unite_buffs = #{} % 联合BUFF
  126. ,att_tired = 0 % 攻击概率,100为上限,不能造成伤害
  127. ,can_att_list = [] % 可攻击对象 [{对象类型, 对象列表}] eg:[{?BATTLE_SIGN_MON, [怪物配置Id]}, {?BATTLE_SIGN_PLAYER, [玩家ID: 空则表示所有]}]
  128. ,cannot_beatt_list = [] % 不可被攻击对象 [{对象类型, 对象列表}]
  129. ,owner = 0 % 怪物归属玩家,只有该玩家可以打我。如果增加队伍功能,需要增加字段表明类型
  130. ,owner_name = ""
  131. ,act_label = [] % 活动标识列表 [{K,V}]
  132. ,personality = 0 % 个性编号
  133. ,boss_crush_r = 0 % boss碾压参数
  134. ,entity_attr = 0 % 战斗实体的属性#attr{}。例如:伙伴/宝具的属性
  135. ,motion_no_injury = 0 % 运动无敌状态结束时间
  136. ,support_id = 0 % 协助玩家id
  137. ,support_name = "" % 协助玩家名字
  138. ,support_team = 0 % 协助玩家队伍id
  139. ,support_team_name = "" % 协助玩家队长名字
  140. ,support_content = [] % 协助玩家简要信息
  141. ,badge = [] % 持有BOSS战斗伤害影响徽章
  142. ,god_fighting = [] % 召唤出来的式神[#god_fighting{}|_]
  143. ,origin_hp = 0 % 式神变身时,保存玩家变身前的hp
  144. ,triggers_passive = [] % 当前触发的被动技能[{skill_id, cd}]
  145. }).
  146. %% skill_combo 列表中的元素
  147. -record(skill_combo, {
  148. main_skill_id = 0, % 主技能id
  149. main_skill_lv = 1, % 主技能等级
  150. main_skill_cd = 0, % 主技能cd
  151. is_set_cd = 0, % 是否设置cd
  152. next_time = 0, % 释放下个combo技能时间间隔
  153. combo_list = [] % 剩余combo技能
  154. }).
  155. %% 战斗信息回传
  156. -record(battle_return, {
  157. hp = 0 % 防守方hp
  158. ,mp = 0 % 防守方mp
  159. ,anger = 0 % 防守方怒气
  160. ,hurt = 0 % 防守方受到的伤害
  161. ,move_x = 0 % 防守方x位移
  162. ,move_y = 0 % 防守方y位移
  163. ,attr_buff_list = [] % 防守方属性buff列表
  164. ,other_buff_list = [] % 防守方其他buff列表
  165. ,sign = 0 % 攻击方类型
  166. ,hit_list = [] % 助攻列表
  167. ,is_calc_hurt = 1 % 是否计算伤害(0不算,1算)
  168. ,atter = [] % 攻击方数据 #battle_return_player{} | #battle_return_mon{}
  169. ,beattack_num = 0 % 受击次数
  170. ,skill_cd = [] % 技能cd
  171. ,god_id = 0 % 唤神id >0 唤神变身中
  172. }).
  173. %% 攻击方信息
  174. -record(battle_return_atter, {
  175. sign = 0 % 攻击者类型 如果有所属,此为所属者类型
  176. ,id = 0 % 攻击者id 如果有所属,此为所属者id
  177. ,real_sign = 0 % 如果有所属,此为真实类型,没有所属和sign一致
  178. ,real_id = 0 % 如果有所属,此为真实id,没有所属和id一致
  179. ,real_name = [] % 如果有所属,此为真实名字,没有所属和name一致
  180. ,server_id = 0 % 攻击者所在服务器id
  181. ,node = none % 攻击者所在节点
  182. ,group = 0 % 攻击者分组
  183. ,mid = 0 % 怪物资源id
  184. ,kind = 0 % 怪物类型:14:原型怪
  185. ,pid = none % 攻击者进程id
  186. ,name = [] % 攻击者名字
  187. ,team_id = 0 % 攻击者队伍id
  188. ,team_leader_name = "" % 攻击者队长名字
  189. ,att_time = 0 % 攻击者攻击时刻
  190. ,guild_id = 0 % 帮派id
  191. ,guild_name = 0 % 帮派名字
  192. ,flag = 0 % 社团旗帜
  193. ,lv = 0 % 攻击者等级
  194. ,career = 0 % 职业
  195. ,power = 0 % 战力
  196. ,hp = 0 % 血量
  197. ,online = 0 % 在线标识
  198. ,x = 0 % 攻击者所在x坐标
  199. ,y = 0 % 攻击者所在y坐标
  200. ,hide = 0 % 攻击方是否隐身
  201. ,att_type = 0 % 攻击类型(0近程,1远程)
  202. ,attr_skill_id = 0 % 攻击方使用的技能id
  203. ,support_id = 0 % 协助玩家id
  204. ,support_name = "" % 协助玩家名字
  205. ,support_team = 0 % 协助玩家队伍id
  206. ,support_team_name = "" % 协助玩家队长名字
  207. ,badge = [] % 社团徽章
  208. ,anger = 0 % 怒气
  209. ,anger_lim = 0 % 怒气上限
  210. }).
  211. %% 攻击额外的参数
  212. -record(battle_args, {
  213. att_key = undefined % 攻击者key
  214. ,att_user = undefined % 攻击者的数据
  215. ,sign = 0 % 宠物攻击字段有效
  216. ,mon_list = [] % 被攻击怪物列表:[MonId,...]第一个为锁定目标
  217. ,player_list = [] % 被攻击的玩家列表:[UserKey, ...]第一个为锁定目标
  218. ,der_list = [] % 所有防御对象列表(包含玩家)
  219. ,is_combo = 0 % 是否连续技
  220. ,skill_id = 0 % 技能id
  221. ,skill_lv = 1 % 技能等级(默认1)
  222. ,att_x = 0 % 攻击点x
  223. ,att_y = 0 % 攻击点y
  224. ,att_angle = 0 % 攻击角度
  225. ,att_object_id = 0 % 攻击方对象ID
  226. ,now_time = 0 % 现在的时间
  227. ,skill_adjust = [] % 技能配置数据调整参数
  228. ,skill_stage = 1 % 多段技能的阶段值
  229. ,main_type = 0 % 主目标是人或怪(0人1怪,辅助定位主目标,对应防守方列表第一位)
  230. ,guard_dun_buff = false
  231. }).
  232. %% 被动技能额外的参数
  233. -record(battle_passive_args, {
  234. aer = undefined % 攻击者
  235. ,der = undefined % 受击者
  236. ,trigger_time = 0 % 被动触发点
  237. ,hp = 0 % 血量(攻击者或者被攻击)
  238. ,hurt_type = 0 % 伤害类型
  239. ,hurt = 0 % 伤害值
  240. ,skill_id = 0 % 技能id
  241. ,is_trigger = 0 % 是否触发(初始化时不要赋值)
  242. }).
  243. %% 怪物继承父类的属性记录
  244. -record(skill_owner, {
  245. id=0 % 玩家id
  246. ,node=none % 玩家节点
  247. ,pid=none % 玩家进程id
  248. ,team_id=0 % 队伍id
  249. ,guild_id=0 % 公会id
  250. ,guild_name="" % 公会名
  251. ,sign=0 % 类型 ?BATTLE_SIGN_MON | ?BATTLE_SIGN_PLAYER...
  252. }).
  253. %% 场景对象返回必要的属性到进程
  254. -record(assist_return, {
  255. skill_cd = []
  256. ,skill_combo = []
  257. }).
  258. %% 保存在怪物进程里,使用技能信息 cast的时候使用
  259. -record(selected_skill, {
  260. att_time % 攻击时间
  261. ,skill_id % 技能id
  262. ,spell_time % 吟唱时间
  263. ,is_refind_t % 是否重新选择目标
  264. ,link_info % 连接技能
  265. }).
  266. %% 使用技能后返回
  267. -record(skill_return, {
  268. used_skill % 使用的技能
  269. ,rx % 使用技能前的x坐标
  270. ,ry % 使用技能前的y坐标
  271. ,tx % 技能作用的x坐标
  272. ,ty % 技能作用的y坐标
  273. ,aer_info % 使用技能后攻击方的一些数据
  274. ,main_skill % 主技能
  275. ,radian % 技能角度(弧度)
  276. }).
  277. %% 技能造成的中间属性
  278. %% 应该分离出需要保存和不需要保存的状态两大类
  279. -record(skill_effect, {
  280. superarmor = 0, % 免疫控制
  281. immue = 0, % 免疫伤害
  282. un_speed = 0, % 免疫减速
  283. rebound = 0, % 反弹
  284. suck_blood = 0, % 吸血
  285. shield_count = 0, % 次数盾
  286. interrupt = 0, % 是否打断
  287. un_die = 0, % 致死触发标记
  288. current_un_dizzy = 0, % 免疫当前眩晕
  289. killed = 0, % 斩杀
  290. unresume = 0, % 回血免疫
  291. no_battle = 0 % 既不能攻击别人也不能被攻击
  292. }).
  293. %% 战斗battle_status中记录的战斗buff
  294. %% 一般以 BuffId + SkillId 来确定BuffList中的唯一一条BUFF(key字段),
  295. %% 而BuffKey则可能同时存在多个(有的Buff只能存在一个,具体看Buff类型)
  296. -record(battle_buff, {
  297. key = {0, 0} % {BuffId, Skillid}
  298. ,skill_lv = 0 % 技能等级
  299. ,stack = 0 % 堆叠数
  300. ,param_int = 0 % 技能相关整数或运算后参数
  301. ,param_float = 0 % 技能相关浮点数或运算后参数
  302. ,time_end = 0 % 结束时间
  303. ,effect_id = 0 % 效果id
  304. ,attr_id = 0 % 属性id(某些效果的运算需要关联到人物属性id)
  305. }).
  306. -endif.