%%%------------------------------------------------
%%% @author huangyongxing@yeah.net
%%% @doc 战斗相关公共定义
%%%------------------------------------------------
-ifndef(BATTLE_HRL).
-define(BATTLE_HRL, ok).

-define(BATTLE_ATT_TYPE_SRD, 0).            % 近程攻击
-define(BATTLE_ATT_TYPE_RD,  1).            % 远程攻击

-define(HURT_TYPE_NORMAL,    0).            % 普通
-define(HURT_TYPE_MISS,      1).            % 闪避
-define(HURT_TYPE_CRIT,      2).            % 暴击
-define(HURT_TYPE_IMMUE,     3).            % 免疫伤害(无敌)
-define(HURT_TYPE_HEART,     4).            % 会心
-define(HURT_TYPE_PARRY,     5).            % 格挡
-define(HURT_TYPE_SHIELD,    6).            % 护盾免伤

%% 战斗对象定义
-define(BATTLE_SIGN_MON,        1). %% 怪
-define(BATTLE_SIGN_PLAYER,     2). %% 人
-define(BATTLE_SIGN_DUMMY,      5). %% 假人
-define(BATTLE_SIGN_PARTNER,    7). %% 伙伴AI娘
-define(BATTLE_SIGN_CHILD,     15). %% 宝宝
-define(BATTLE_SIGN_WEAPON,    16). %% 宝具/圣物
-define(BATTLE_SIGN_PET,       25). %% 宠物
-define(BATTLE_SIGN_FAKE,     100). %% 100: 伪造的攻击对象(只在战斗使用)

%% 战斗时机定义
-define(BATTLE_MOMENT_ATTACK,   1).     %% 攻击时
-define(BATTLE_MOMENT_DEFENCE,  2).     %% 防守时

%% -------------------------------------------------------------------
%% 战斗中的特殊效果 BUFF
%% XXX 特别注意：
%% 由于项目中经常采用技能系统来投放属性，意味着属性这边的id，
%% 与战斗中的特殊效果id必须是无冲突的。
%% 其他情况可参见attr.hrl中的说明
%% -------------------------------------------------------------------
-define(SPBUFF_DIZZY,               301).   % 眩晕
-define(SPBUFF_SILENCE,             302).   % 沉默
-define(SPBUFF_IMMOBILIZE,          303).   % 定身:skill
-define(SPBUFF_SHIELD,              304).   % 护盾(时间)
-define(SPBUFF_SHIELD_COUNT,        305).   % 护盾(次数)
-define(SPBUFF_IMMUNE,              306).   % 无敌
-define(SPBUFF_UNHURT,              307).   % 免伤
-define(SPBUFF_SUPERARMOR,          308).   % 霸体
-define(SPBUFF_UNSPEED,             309).   % 减速免疫
-define(SPBUFF_UNDIZZY,             310).   % 眩晕免疫
-define(SPBUFF_UNBLEED,             311).   % 流血免疫
-define(SPBUFF_SUCK_BLOOD,          314).   % 吸血
-define(SPBUFF_REBOUND,             315).   % 反弹
-define(SPBUFF_RESUME,              316).   % 回血
-define(SPBUFF_BLEED,               317).   % 流血
-define(SPBUFF_CLEAN_BUFF,          318).   % 清除负面控制buff
-define(SPBUFF_KILL,                319).   % 斩杀
-define(SPBUFF_RATIO_UNHURT,        320).   % 概率免伤
-define(SPBUFF_SLOW,                321).   % 减速
-define(SPBUFF_FIRING,              322).   % 灼烧
-define(SPBUFF_MINUS_CD,            323).   % 减CD
-define(SPBUFF_BASE_ATTR_ADD_RATIO, 326).   % 全属性提升
-define(SPBUFF_RESUME_ADD_RATIO,    327).   % 回血效果提升
-define(SPBUFF_BERESUME_ADD_RATIO,  328).   % 被回血效果提升
-define(SPBUFF_UNRESUME,            329).   % 回血免疫-禁疗
-define(SPBUFF_FEAR,                330).   % 恐惧
-define(SPBUFF_NO_BATTLE,           331).   % 远离战斗：既不能攻击别人，也不能攻击别人
-define(SPBUFF_COMBO,               332).   % 连击buff
-define(SPBUFF_SKILL_HURT,          333).   % 技能伤害
-define(SPBUFF_PROHIBED_JUMP,       399).   % 禁跳（被禁止执行跳跃）

%% 最大选择攻击对象数量
-define(MAX_ATTACK_NUM,             30).

%% 发起战斗错误码
-define(ERR_TOO_FAST, 2).                   % 技能CD问题
-define(ERR_ATTACKER, 3).                   % 攻击方异常（无血、数据丢失）
-define(ERR_CD, 5).                         % 技能CD问题
-define(ERR_CONF, 6).                       % 错误配置
-define(ERR_SKILL_INVALID, 8).              % 技能无效（非主动或转生替换后不可再使用等）
-define(ERR_ANGER_NO_ENOUGH, 10).           % 怒气不足
-define(ERR_GOD_SKILL, 13).                 % 式神技能释放错误（变身时可能多余，前端方便隐藏）
-define(ERR_SKILL_STAGE, 14).               % 多段技能施放的技能阶段错误
-define(ERR_DIZZY, 21).                     % 眩晕中
-define(ERR_SILENCE, 22).                   % 沉默
-define(ERR_FEAR, 23).
-define(ERR_COMBO, 30).
-define(ERR_ANY_MON_NOT_EXISTS, 41).        % 攻击目标部分怪物不存在
-define(ERR_OTHER_BUFF, 42).

%% -------------------------------------------------------------------

%% 战斗主体
-record(battle_status, {
        id = 0                              % 角色/怪物id
        ,server_id = 0                      % 来源服务器id
        ,node = none                        % 来源节点
        ,figure = undefined                 % 形象
        ,battle_attr=undefined              % 战斗通用属性 #battle_attr{} (attr.hrl)
        ,config_id=0                        % 场景对象配置id
        ,mid = 0                            % 怪物配置id
        ,kind = 0                           % 怪物类型
        ,boss = 0                           % boss类型
        ,att_type = 0                       % 攻击类型（0近程，1远程）
        ,online = 0                         % 在线标识：怪物为在线
        ,scene = 0                          % 所属场景
        ,copy_id = 0                        % 所属副本
        ,x = 0                              % X
        ,y = 0                              % y
        ,att_area = 0                       % 攻击范围
        ,pid = none                         % 玩家/怪物进程
        ,sid = none
        ,sign = 0                           % 标示是怪还是人 1:怪， 2：人
        ,skill = []                         % 技能
        ,skill_cd = []                      % 技能cd记录
        ,skill_minus_cd = []                % 技能减cd列表
        ,skill_combo = []                   % 技能连接（连技/多段）
        ,shaking_skill = 0                  % 正在释放前摇的技能
        ,skill_owner = undefined            % #skill_owner{}
        ,guild_id = 0                       % 帮派id
        ,protect_end_time=0                 % 保护时间
        ,team_id = 0                        % 队伍id
        ,team_leader_name=""                % 队伍队长名字
        ,team_skill = 0                     % 队伍临时技能(被动)荆棘之心
        ,team_skill_num = 0                 % 荆棘之心的叠加层数
        ,group = 0                          % 战场阵营分组
        ,is_main = 0                        % 是否主要攻击对象
        ,is_armor = 0                       % 是否霸体
        ,is_be_atted = 1                    % 是否可被攻击
        ,skill_passive = []                 % 玩家被动技能
        ,skill_pet_passive = []             % 巫女被动战斗触发技能
        ,att_list = []                      % 正在攻击我的怪物列表
        ,boss_tired = 0                     % 世界BOSS疲劳值
        ,deserted_boss_tired = []           % 废都boss疲劳值
        ,unite_buffs = #{}                   % 联合BUFF
        ,att_tired = 0                      % 攻击概率,100为上限,不能造成伤害
        ,can_att_list = []                  % 可攻击对象 [{对象类型, 对象列表}]   eg:[{?BATTLE_SIGN_MON, [怪物配置Id]}, {?BATTLE_SIGN_PLAYER, [玩家ID: 空则表示所有]}]
        ,cannot_beatt_list = []             % 不可被攻击对象 [{对象类型, 对象列表}]
        ,owner = 0                          % 怪物归属玩家，只有该玩家可以打我。如果增加队伍功能，需要增加字段表明类型
        ,owner_name = ""
        ,act_label = []                     % 活动标识列表 [{K,V}]
        ,personality = 0                    % 个性编号
        ,boss_crush_r = 0                   % boss碾压参数
        ,entity_attr = 0                    % 战斗实体的属性#attr{}。例如：伙伴/宝具的属性
        ,motion_no_injury = 0               % 运动无敌状态结束时间

        ,support_id = 0                     % 协助玩家id
        ,support_name = ""                  % 协助玩家名字
        ,support_team = 0                   % 协助玩家队伍id
        ,support_team_name = ""             % 协助玩家队长名字
        ,support_content = []               % 协助玩家简要信息

        ,badge = []                         % 持有BOSS战斗伤害影响徽章
        ,god_fighting = []                  % 召唤出来的式神[#god_fighting{}|_]
        ,origin_hp = 0                      % 式神变身时，保存玩家变身前的hp
        ,triggers_passive = []              % 当前触发的被动技能[{skill_id, cd}]
    }).

%% skill_combo 列表中的元素
-record(skill_combo, {
        main_skill_id = 0,                  % 主技能id
        main_skill_lv = 1,                  % 主技能等级
        main_skill_cd = 0,                  % 主技能cd
        is_set_cd = 0,                      % 是否设置cd
        next_time = 0,                      % 释放下个combo技能时间间隔
        combo_list = []                     % 剩余combo技能
    }).

%% 战斗信息回传
-record(battle_return, {
        hp = 0                              % 防守方hp
        ,mp = 0                             % 防守方mp
        ,anger = 0                          % 防守方怒气
        ,hurt = 0                           % 防守方受到的伤害
        ,move_x = 0                         % 防守方x位移
        ,move_y = 0                         % 防守方y位移
        ,attr_buff_list = []                % 防守方属性buff列表
        ,other_buff_list = []               % 防守方其他buff列表
        ,sign = 0                           % 攻击方类型
        ,hit_list = []                      % 助攻列表
        ,is_calc_hurt = 1                   % 是否计算伤害(0不算,1算)
        ,atter = []                         % 攻击方数据 #battle_return_player{} | #battle_return_mon{}
        ,beattack_num = 0                   % 受击次数
        ,skill_cd = []                      % 技能cd
        ,god_id = 0                         % 唤神id >0 唤神变身中
    }).

%% 攻击方信息
-record(battle_return_atter, {
        sign = 0                            % 攻击者类型 如果有所属，此为所属者类型
        ,id = 0                             % 攻击者id 如果有所属，此为所属者id
        ,real_sign = 0                      % 如果有所属，此为真实类型，没有所属和sign一致
        ,real_id = 0                        % 如果有所属，此为真实id，没有所属和id一致
        ,real_name = []                     % 如果有所属，此为真实名字，没有所属和name一致
        ,server_id = 0                      % 攻击者所在服务器id
        ,node = none                        % 攻击者所在节点
        ,group = 0                          % 攻击者分组
        ,mid  = 0                           % 怪物资源id
        ,kind = 0                           % 怪物类型：14:原型怪
        ,pid = none                         % 攻击者进程id
        ,name = []                          % 攻击者名字
        ,team_id = 0                        % 攻击者队伍id
        ,team_leader_name = ""              % 攻击者队长名字
        ,att_time = 0                       % 攻击者攻击时刻
        ,guild_id = 0                       % 帮派id
        ,guild_name = 0                     % 帮派名字
        ,flag = 0                           % 社团旗帜
        ,lv = 0                             % 攻击者等级
        ,career = 0                         % 职业
        ,power = 0                          % 战力
        ,hp = 0                             % 血量
        ,online = 0                         % 在线标识
        ,x = 0                              % 攻击者所在x坐标
        ,y = 0                              % 攻击者所在y坐标
        ,hide = 0                           % 攻击方是否隐身
        ,att_type = 0                       % 攻击类型(0近程，1远程)
        ,attr_skill_id = 0                  % 攻击方使用的技能id

        ,support_id = 0                     % 协助玩家id
        ,support_name = ""                  % 协助玩家名字
        ,support_team = 0                   % 协助玩家队伍id
        ,support_team_name = ""             % 协助玩家队长名字

        ,badge = []                         % 社团徽章

        ,anger = 0                          % 怒气
        ,anger_lim = 0                      % 怒气上限
    }).

%% 攻击额外的参数
-record(battle_args, {
        att_key =  undefined                % 攻击者key
        ,att_user = undefined               % 攻击者的数据
        ,sign = 0                           % 宠物攻击字段有效
        ,mon_list = []                      % 被攻击怪物列表：[MonId,...]第一个为锁定目标
        ,player_list = []                   % 被攻击的玩家列表：[UserKey, ...]第一个为锁定目标
        ,der_list = []                      % 所有防御对象列表（包含玩家）
        ,is_combo = 0                       % 是否连续技
        ,skill_id = 0                       % 技能id
        ,skill_lv = 1                       % 技能等级(默认1)
        ,att_x = 0                          % 攻击点x
        ,att_y = 0                          % 攻击点y
        ,att_angle = 0                      % 攻击角度
        ,att_object_id = 0                  % 攻击方对象ID
        ,now_time = 0                       % 现在的时间
        ,skill_adjust = []                  % 技能配置数据调整参数
        ,skill_stage = 1                    % 多段技能的阶段值
        ,main_type = 0                      % 主目标是人或怪（0人1怪，辅助定位主目标，对应防守方列表第一位）
        ,guard_dun_buff = false
    }).

%% 被动技能额外的参数
-record(battle_passive_args, {
        aer = undefined                     % 攻击者
        ,der = undefined                    % 受击者
        ,trigger_time = 0                   % 被动触发点
        ,hp = 0                             % 血量(攻击者或者被攻击)
        ,hurt_type = 0                      % 伤害类型
        ,hurt = 0                           % 伤害值
        ,skill_id = 0                       % 技能id
        ,is_trigger = 0                     % 是否触发（初始化时不要赋值）
    }).

%% 怪物继承父类的属性记录
-record(skill_owner, {
        id=0                                % 玩家id
        ,node=none                          % 玩家节点
        ,pid=none                           % 玩家进程id
        ,team_id=0                          % 队伍id
        ,guild_id=0                         % 公会id
        ,guild_name=""                      % 公会名
        ,sign=0                             % 类型 ?BATTLE_SIGN_MON | ?BATTLE_SIGN_PLAYER...
    }).

%% 场景对象返回必要的属性到进程
-record(assist_return, {
        skill_cd = []
        ,skill_combo = []
    }).

%% 保存在怪物进程里，使用技能信息 cast的时候使用
-record(selected_skill, {
        att_time                            % 攻击时间
        ,skill_id                           % 技能id
        ,spell_time                         % 吟唱时间
        ,is_refind_t                        % 是否重新选择目标
        ,link_info                          % 连接技能
    }).

%% 使用技能后返回
-record(skill_return, {
        used_skill                          % 使用的技能
        ,rx                                 % 使用技能前的x坐标
        ,ry                                 % 使用技能前的y坐标
        ,tx                                 % 技能作用的x坐标
        ,ty                                 % 技能作用的y坐标
        ,aer_info                           % 使用技能后攻击方的一些数据
        ,main_skill                         % 主技能
        ,radian                             % 技能角度（弧度）
    }).

%% 技能造成的中间属性
%% 应该分离出需要保存和不需要保存的状态两大类
-record(skill_effect, {
        superarmor = 0,                     % 免疫控制
        immue = 0,                          % 免疫伤害
        un_speed = 0,                       % 免疫减速
        rebound = 0,                        % 反弹
        suck_blood = 0,                     % 吸血
        shield_count = 0,                   % 次数盾
        interrupt = 0,                      % 是否打断
        un_die = 0,                         % 致死触发标记
        current_un_dizzy = 0,               % 免疫当前眩晕
        killed = 0,                         % 斩杀
        unresume = 0,                       % 回血免疫
        no_battle = 0                       % 既不能攻击别人也不能被攻击
    }).

%% 战斗battle_status中记录的战斗buff
%% 一般以 BuffId + SkillId 来确定BuffList中的唯一一条BUFF（key字段），
%% 而BuffKey则可能同时存在多个（有的Buff只能存在一个，具体看Buff类型）
-record(battle_buff, {
        key = {0, 0}                        % {BuffId, Skillid}
        ,skill_lv = 0                       % 技能等级
        ,stack = 0                          % 堆叠数
        ,param_int = 0                      % 技能相关整数或运算后参数
        ,param_float = 0                    % 技能相关浮点数或运算后参数
        ,time_end = 0                       % 结束时间
        ,effect_id = 0                      % 效果id
        ,attr_id = 0                        % 属性id（某些效果的运算需要关联到人物属性id）
    }).

-endif.
