%%% -------------------------------------------------------
%%% @author huangyongxing@yeah.net
%%% @doc
%%% 怪物相关数据结构定义
%%% @end
%%% -------------------------------------------------------
-ifndef(MON_HRL).
-define(MON_HRL, ok).

%% 场景对象空状态驱动事件的值（state_driven的empty值）
-define(EMPTY_STATE_DRIVEN, {0, undefined}).

%% 场景对象在进程字典中存储的状态数据
-record(obj_state_data, {
        obj_data = undefined                % #ob_act{}
        ,obj_state = sleep
    }).

%% 场景怪物(用于在告诉客户端怪物在哪个场景)
-record(ets_scene_mon, {
        id = 0,                             % 怪物ID
        scene = 0,                          % 场景
        name = <<>>,                        % 场景名称
        mname = <<>>,                       % 怪物名字
        kind = 0,                           % 怪物类型
        x = 0,                              % X坐标
        y = 0,                              % Y坐标
        lv = 0,                             % 怪物等级
        out = 0                             % 是否挂机
    }).

%% 怪物配置
-record(mon, {
        id = 0,                             % 怪物配置id
        rem_flag = 0,                       % 配置拆解literal专用，它处勿用，无其他意义
        name = "",                          % 怪物名字
        kind = 0,                           % 怪物类型 0:怪物、1:采集怪、2:任务采集怪、3:护送车队、4:拾取型、5:赏金怪、6:进击怪、7:塔防怪、8:不死采集怪
        boss = 0,                           % BOSS类型: 0普通怪 1普通野外怪 2精英怪物，3本服BOSS 4跨服BOSS 5活动BOSS 6副本BOSS
        type = 0,                           % 战斗斗类型(0被动，1主动)
        career = 0,                         % 职业0,没职业
        color = 0,                          % 颜色(0白,1绿,2蓝,3紫,4橙,5红,6粉) ,
        auto = 0,                           % 0-读怪物表属性，1-服务器等级，2-队伍平均等级，3-队长等级（无组队时默认是队长），需要读怪物动态属性表
        icon = 0,                           % 资源id
        icon_effect = <<>>,                 % 怪物资源特效
        icon_texture = 0,                   % 贴图id
        weapon_id = 0,                      % 武器模型id
        % icon_scale = 0,                     % 资源缩放[1.0-]
        % foot_icon = 0,                      % 脚下资源id
        % desc = <<>>,                        % 默认对话[怪物说话的时间间隔, {怪物说的话1,概率},...]
        lv = 0,                             % 等级
        hp_lim =0,                          % 血上限
        att = 0,                            % 攻击
        def = 0,                            % 防御
        hit = 0,                            % 命中
        dodge = 0,                          % 躲闪
        crit = 0,                           % 暴击
        ten = 0,                            % 坚韧
        special_attr = [],                  % 特定属性[{AttrType, AttrValue}] = [{属性类型,属性值}]
        resum = 0,                          % 回血配置,[回血模式,回复量,时间]回血模式:0不回血;1脱离战斗状态立刻回满血;2战斗中持续回复;3脱离战斗后持续回复
        striking_distance = 0,              % 攻击距离(像素)
        tracing_distance = 0,               % 跟踪距离(像素)
        warning_range = 0,                  % 警戒范围(像素)
        hate_range = 0,                     % 仇恨范围(像素)：表示玩家离开某区域后，怪物不追踪，清空伤害列表，不填表示没有仇恨范围
        speed = 0,                          % 速度(每秒移动的像素)
        skill = [],                         % 技能列表[{技能id,技能等级},...]
        retime = 0,                         % 重生时间(毫秒)
        att_time = 0,                       % 攻击间隔(毫秒)
        att_type = 0,                       % 0近攻，1远程攻击
        drop = 0,                           % 掉落方式
        exp = 0,                            % 经验
        collect_time = 0,                   % 采集时间(秒)
        collect_count = 0,                  % 可采集次数（每次都会有掉落）
        collect_del_hp = 0,                 % 采集时玩家单位时间扣血
        collect_del_time = 0,               % 采集时玩家扣血间隔（ms）
        is_fight_back = 1,                  % 是否会反击 ，默认为1
        is_be_atted = 1,                    % 是否可被攻击 ，默认为1
        is_be_clicked = 1,                  % 是否可被点击，默认为1
        is_armor = 0,                       % 是否霸体，默认为0 ,
        del_hp_each_time = [],              % [Min,Max]:怪物受到的每次伤害值区间,整数,小数为百分比：1:默认:[];2:Min=<hurt=<Max;3怪物Hp的百分比:Hp*Min=<Hurt=<Hp*Max
        mon_state = 0,                      % 怪物出生特殊状态(特效展示),0：代表无特效，客户端使用
        is_hide_hp = 0,                     % 是否隐藏血条(0|1)
        is_hit_ac = 0,                      % 是否播放受击动作
        module = 0,                         % 怪物所属模块id
        sub_module = 0,                     % 怪物所属模块子id
        is_patrol = 0                       % 是否可巡逻 默认0:可巡逻|1:不可巡逻
    }).

%% 攻击怪物的人
-record(mon_atter, {
        id = 0                              % 玩家id
        ,name = ""                          % 名字
        ,pid = undefined                    % 玩家进程pid
        ,server_id = 0                      % 服务器id
        ,node = none                        % 玩家节点
        ,team_id = 0                        % 玩家队伍id
        ,team_leader_name = ""              % 队伍队长
        ,guild_id=0                         % 玩家公会id
        ,hurt = 0                           % 伤害值
        ,att_sign = 0                       % 攻击者类型
        ,att_lv = 0                         % 攻击者等级
        ,att_career = 0                     % 攻击者职业
        ,away = 0                           % 玩家是否离开：一般有队友在或协助者在会标识
        ,support_id = 0                     % 协助玩家id
        ,support_name = ""                  % 协助玩家名字
        ,support_team = 0                   % 协助玩家队伍id
        ,support_team_name = ""             % 协助玩家队长名字
        ,time = 0                           % 攻击时间
    }).

%% 场景对象活动进程state
-record(ob_act, {
        att = undefined,                    % 攻击对象#{Key, Pid, AttType, X, Y} AttType: 1怪物; 2玩家
        first_att = [],                     % 第一个攻击该怪物的玩家信息#mon_atter{} | []
        object = [],                        % #scene_object{}
        next_att_time = 0,                  % 下次允许攻击时间
        next_move_time = 0,                 % 下次允许移动时间
        klist = [],                         % 伤害列表[#mon_atter{}...]
        support_klist = [],                 % 协助者伤害列表[#mon_atter{}...]
        clist = [],                         % 采集列表
        bl_who = [],                        % 怪物归属[#mon_atter{}...]

        %% -------------------------------------------------------
        %% 用于替代原怪物模块中的几个定时器ref，存储的是毫秒级时间戳，而非定时器引用
        %% -------------------------------------------------------
        %% 状态驱动事件（取代旧版ref字段，用于作为状态函数的消息）
        state_driven = {0, undefined},      % 数据格式：{TimeMS, Info}，{0,undefined}表示无状态驱动消息
        %% 通用驱动事件（取代旧版各类xxx_ref字段，但是不包含ref字段，用于模仿触发info事件）
        %% 具体见mon_mgr模块说明
        general_driven = [],                % 数据格式：[{TimeMS, Info}, ...]
        %% -------------------------------------------------------
        %% 被替代删除的定时器引用字段
        % ref = [],                           % 普通定时器引用
        % eref = [],                          % 事件定时器引用
        % hurt_ref = [],                      % 伤害定时器引用:广播伤害列表
        % hurt_remove_ref = [],               % 定时移除离开boss范围的玩家的伤害列表
        % cycle_check_ref = [],               % 循环周期检查定时器引用
        % special_ai_ref = [],                % 特殊AI定时器[{AI定时器类型, Ref}]
        %% -------------------------------------------------------

        ai_event = [],                      % ai事件
        check_block = false,                % 走路是否检测障碍
        path = undefined,                   % 预定义路径, 无路径undefined
        path_ai_no = 0,                     % 路径结束的ai事件id
        back_dest_path = null,              % back状态回复到出生点
        patrol_path = null,                 % 巡逻路径
        patrol_angle = undefined,           % 巡逻角度 integer() | undefined
        continu_patrol_num = 0,             % 连续巡逻次数
        skill_link_info = [],               % 链接技能信息
        each_move_time = 0,                 % 每次移动的总时间
        o_point = {0, 0},                   % 每次移动的原点
        w_point = {0, 0},                   % 移动路径上一个点
        move_begin_time = 0,                % 移动的开始时间
        collect_del_hp_list = [],           % 各采集者扣血的时间记录
        hurt_list_broadcast = undefined     % 广播伤害列表的间隔时间 integer() | undefined

        , hp_change_handler = []            % 血量变化监听器
        , born_handler = []                 % 出生监听器
        , die_handler = []                  % 死亡监听器
        , collected_handler = []            % 被采集监听器
        , walk_end_handler = []             % 走完路径监听器
        , cycle_check_handler = []          % 循环周期检查监听器, 循环时间必须作为第一个参数传递
        , hurt_list_handler = []            % 广播伤害列表监听器
        , be_hurt_handler = []              % 受击监听器
        , change_scene_handler = []         % 切场景监听器

        , selected_skill = #{}              % 放出去的技能
        , revive_time = 0                   % 复活时间
        , stay_dead = 0                     % 死亡是否保持死亡状态
        , leave_distance = []               % 离开有效区域的玩家 [{RoleId, Time}]
        , is_patrol = 0                     % 是否巡逻:0否|1是

        , hp_ai_min = 1                     % 血量AI已执行到多少血量值(有的怪血量AI只执行一次)
        , ai_option = []                    % 自动进击怪 {type, att_list}, 1怪物优先，2玩家优先
        , hurt_stat_list = []               % 伤害统计列表 个人或协助队伍
        , find_type = 2                     % 寻找攻击目标：1怪物优先，2玩家优先，3只找怪
        , offline_hosting = undefined       % 托管怪物设置
    }).

%% 场景对象
-record(scene_object, {
        %% 公共属性
        id = 0,                             % id须由mod_scene_object_create获得
        config_id = 0,                      % 各场景对象配置id
        sign = 0,                           % 类型?BATTLE_SIGN_MON|?BATTLE_SIGN_PARTNER ...
        scene = 0,
        scene_pool_id = 0,
        copy_id = 0,
        x = 0,
        y = 0,
        d_x = 0,                            % 警戒区中心点x坐标
        d_y = 0,                            % 警戒区中心点y坐标
        angle = 0,                          % 站位角度(1-360，0表示默认-行为由前端定义)
        figure = undefined,                 % 公共形象
        color = 0,                          % 颜色
        icon_effect = "",                   % 特效
        icon_texture = 0,                   % 贴图
        weapon_id = 0,                      % 武器id
        pos = 0,                            % 阵法位置
        type = 0,                           % 怪物战斗类型（0被动，1主动）
        battle_attr = undefined,            % 战斗必要属性
        aid = undefined,                    % 活动进程id
        att_type = 0,                       % 攻击类型
        attr_type = 0,                      % 五行属性
        striking_distance = 0,              % 攻击距离(px)
        tracing_distance = 0,               % 追踪距离(px)
        warning_range = 0,                  % 警戒范围(px)
        att_time = 0,                       % 攻击间隔(毫秒)
        skill = [],                         % 技能[{skillid, skilllv}
        skill_passive = [],                 % 被动技能 [{SkillId, SkillLv}]
        temp_skill = [],                    % 临时技能列表，优先选取此技能
        skill_owner = [],                   % 表示怪物属于技能触发（召唤追踪类技能），当此怪物杀死对方时，与施法方杀死对方效果同等 #skill_owner{}
        skill_cd = [],                      % 存放怪物释放过技能的cd
        skill_combo = [],                   % 技能combo状态
        shaking_skill = 0,                  % 正在前摇的技能id
        is_fight_back = 1,                  % 是否会反击
        is_be_atted   = 1,                  % 是否可攻击
        is_be_clicked = 1,                  % 是否可被点击
        is_armor = 0,                       % 是否霸体
        is_patrol = 0,                      % 允许巡逻:0允许|1不允许
        no_battle_hp_ex = 0,                % 非战斗状态额外回复量
        hp_time = 0,                        % 血量回复时间间隔(ms)
        hp_resume_ref = undefined,          % 血量回复定时器
        mod_args = [],                      % 功能参数，用于抛出事件时，各功能可以进行判断，尽可能保持短小
        is_hit_ac = 0,                      % 是否播放受击动作
        %% 场景对象自有属性
        mon = undefined,                    % 怪物私有属性 #scene_mon{}
        personality = 0,                    % 个性编号
        dummy   = undefined,                % 假人私有属性 #scene_dummy{}
        die_info = [],                      % 死亡后传给相关处理逻辑的参数
        hurt_check = [],                    % 受击检查器
        hurt_sync_ids = [],                 % 伤害同步id列表[{pool_id, id}]: 血量同步对象会将受到的伤害同步到id列表对象
        combat_power = 0,                   % 战力
        create_time = 0,                    % 创建时间
        can_att_list = [],                  % 可攻击对象 [{对象类型, 对象列表}]   eg:[{?BATTLE_SIGN_MON, [怪物配置Id]}, {?BATTLE_SIGN_PLAYER, [玩家ID: 空则表示所有]}]
        cannot_beatt_list = [],             % 不可被攻击对象 [{对象类型, 对象列表}]
        act_label = []                      % 活动标识 [{K,V}]
        ,skill_att_xy = {0, 0}              % 释放?SKILL_CAREER_AI_POINT类型的技能时以这个坐标为基准点
        ,skill_att_xy_change = {0, 0}       % 释放?SKILL_CAREER_AI_POINT类型的技能时在基准点基础上偏移：{偏移角度,偏移距离}
        ,origin = 0                         % 怪物来源
    }).

%% create_key(功能生成的Key值)
%% {mon_event, CommonEventId, MonAutoId}
-record(scene_mon, {
        mid = 0,                            % 配置id
        kind = 0,                           % 0怪物，1采集怪，2任务采集怪，3护送车队，4拾取型怪物
        boss = 0,                           % BOSS类型: 0普通怪 1普通野外怪 2精英怪物，3本服BOSS 4跨服BOSS 5活动BOSS 6副本BOSS
        d_x = 0,                            % 默认出生X
        d_y = 0,                            % 默认出生y
        auto = 0,                           % 0读取默认属性，1根据服务器等级动态生成，2根据功能参数等级动态生成
        auto_lv = 1,                        % 生成功能怪物 动态属性等级：如玩家等级或者跨服服务器等级等
        ctime = 0,                          % 怪物创建时间
        retime=1,                           % 重生时间(s)
        % drop = 0,                           % 掉落方式(0:最大伤害;1:最后伤害;2:最先伤害;3:以组队单位计算贡献伤害)
        % drop_num = 0,                       % 掉落计算次数
        exp = 0,                            % 击杀经验
        exp_share_type = 0,                 % 经验分配方式
        out = 0,                            % 是否挂机
        collect_time = 0,                   % 采集怪物的采集时间
        collect_count = 0,                  % 采集怪物的可采集次数
        collect_times = 0,                  % 已经被采集次数
        collect_del_hp = 0,                 % 采集时玩家单位时间扣血
        collect_del_time = 0,               % 采集时玩家扣血间隔（ms）
        create_key = undefined,             % 功能生成的Key值,保证唯一,就能对怪物进行操作[防止call怪物获得的唯一键,主要用于频繁生成怪物并且需要对怪物操作的进程].如 {dungeon, Id}
        dun_r = 1,                          % 副本属性系数
        dun_crush_r = 1,                    % 副本碾压战力系数
        hp_re = 0,                          % 非战斗情况下额外的回血
        hp_re_time = 0,                     % 非战斗情况下额外回血量
        is_collecting = 0,                  % 采集怪是否正在被采集 0: 否 1: 是
        has_cltimes = 1                     % 采集怪是否还有剩余采集次数 0: 否 1: 有
        ,from_pid = undefined               % 怪物创建进程
        ,owner = 0                          % 归属玩家
        ,owner_name = ""                    % 归属玩家名字
    }).

%% 怪物动态属性配置
-record(mon_dynamic, {
        id = 0,                             % 怪物id
        min_lv  = 0,                        % 最小等级
        max_lv  = 0,                        % 最大等级
        attr_list = [],                     % 属性列表
        hp = 0,                             % 血量
        att = 0,                            % 攻击
        exp = 0                             % 经验
    }).

%% 副本怪物动态属性
-record(dungeon_mon_dynamic, {
        id = 0,                             % 怪物id
        dun_id = 0,                         % 副本id
        level = 0,                          % 层数
        ratio = 0                           % 难度系数
    }).

-record(scene_dummy, {
        team_id = 0,
        server_num = 0,
        server_id = 0,
        node = undefined,                  % 节点
        is_dance = 0                       % 是否跳舞状态(温泉 0-否 1-是)
    }).

%% 怪物类型伤害加成
-record(mon_type_lv_hurt, {
        mon_type = 0,                       % 怪物类型
        blv = 0,                            % 开始等级(带符号)(玩家-怪物的等级=加成等级)
        elv = 0,                            % 结束等级(带符号)
        role_add_hurt = 0,                  % 玩家伤害加成(带符号小数点)
        mon_add_hurt = 0                    % 怪物伤害加成(带符号小数点)
    }).

%% 怪物创建id管理器进程状态数据
-record(object_create_state, {
        auto_id = 0,
        cnt = 0
    }).

%% 场景攻击方对象
-record(scene_att_object, {
        id = 0                              % 对象id
        ,location = 0                       % 上阵位置
        ,attr = undefined                   % 属性
        ,combat = 0                         % 战力
        ,skill_cd = []                      % 存放怪物释放过技能的cd
        ,skill_combo = []                   % 技能combo状态
        ,skill=[]                           % 技能列表
        ,attr_buff_list = []                % attr buff列表
        ,other_buff_list = []               % other buff列表
    }).

%% AI创建怪参数
-record(create_mon_args, {
        rate = 0                            % 创建怪的概率(分母为10000)
        ,mid = 0                            % 怪物Id
        ,is_active = 0                      % 是否主动
        ,args = []                          % 怪物参数
    }).

-endif.
