%% ---------------------------------------------------------
%% Author:  HHL
%% Created: 2014-6-7
%% Description: 副本纪录
%% --------------------------------------------------------

%% ----------------------- 副本类型 -----------------------
%% 新增类型注意可否设置助战状态
%% 0:普通副本、1:材料副本、2:经验副本、3:vip副本、4:爬塔副本、5:个人boss、6:讨伐副本、7:幻光副本、8:宠物副本、9:塔防副本、10:唤神副本、11:宝宝副本、12:星辰副本、13:主线任务副本、15:跨服沙盘、17:社团跑环协助副本、18:唤神体验副本、19古神系列-清剿血魔副本
-define(DUNGEON_TYPE_NORMAL,   0).          % 普通副本
-define(DUNGEON_TYPE_MATERIAL, 1).          % 材料副本
-define(DUNGEON_TYPE_EXP,      2).          % 经验副本
-define(DUNGEON_TYPE_VIP,      3).          % VIP副本
-define(DUNGEON_TYPE_TOWER,    4).          % 爬塔副本
-define(DUNGEON_TYPE_PER_BOSS, 5).          % 个人boss
-define(DUNGEON_TYPE_CRUSADE,  6).          % 多人副本-讨伐副本
-define(DUNGEON_TYPE_VISUS,    7).          % 幻光副本
-define(DUNGEON_TYPE_PET,      8).          % 宠物副本
-define(DUNGEON_TYPE_GUARD,    9).          % 守卫信标
-define(DUNGEON_TYPE_GOD,     10).          % 唤神副本
-define(DUNGEON_TYPE_CHILD,   11).          % 宝宝副本
-define(DUNGEON_TYPE_GALAXY,  12).          % 星辰副本
-define(DUNGEON_TYPE_TASK,    13).          % 主线任务副本
-define(DUNGEON_TYPE_ASSESS,  14).          % 考核副本
-define(DUNGEON_TYPE_POINT,   15).          % 跨服沙盘副本
-define(DUNGEON_TYPE_CONVOY,  16).          % 护送副本
-define(DUNGEON_TYPE_HELP,    17).          % 协助副本
-define(DUNGEON_TYPE_EXGOD,   18).          % 唤神体验副本
-define(DUNGEON_TYPE_ANNIHILATE,   19).     % 古神系列-清剿血魔副本
-define(DUNGEON_TYPE_MAIN_LINE, 20).        % 新主线副本
-define(DUNGEON_TYPE_GUIDE_BOSS, 99).       % 新手引导boss
%% ----------------------- 待定 ------------------------
-define(DUNGEON_TYPE_COUPLE, 13).           % 情缘副本

%% 可助战副本类型d
-define (HELP_DUNGEON_TYPES, [
    ]).

%% 组队副本
-define (TEAM_DUNGEON, [
        ?DUNGEON_TYPE_CRUSADE
        ,?DUNGEON_TYPE_GUARD
    ]).

%% 需要匹配假人副本
-define (MATCH_DUNGEON, [
        ?DUNGEON_TYPE_CRUSADE
        ,?DUNGEON_TYPE_GUARD
    ]).

%% 特殊经验本id
-define(DUNGEON_ID_NOVICE_EXP, 3002).          % 新手引导经验副本

%% 嗨点活动计分规则，副本完成后才触发的副本类型列表，其他类型均进入副本触发
-define(HI_POINT_DUNGEON_SCORE_TRIGGER , [
    ?DUNGEON_TYPE_MATERIAL
    ,?DUNGEON_TYPE_VIP
    ,?DUNGEON_TYPE_CRUSADE      %% 注意小队讨伐有自己的处理逻辑,这里只是将其排除在外
    ,?DUNGEON_TYPE_GUARD
    ]).

%% 七日目标，副本完成后才触发的副本类型列表，其他类型均进入副本触发
-define(SEVEN_DAY_GOAL_DUNGEON_TRIGGER , [
    ?DUNGEON_TYPE_MATERIAL
    ,?DUNGEON_TYPE_EXP
    ,?DUNGEON_TYPE_CHILD
]).

%% 统计怪物伤害输出
-define(DUNGEON_MON_HURT_TYPE, [
    ?DUNGEON_TYPE_CRUSADE
    ,?DUNGEON_TYPE_GUARD
    ,?DUNGEON_TYPE_GUIDE_BOSS
    ]).

%% 副本结束推送结算信息例外
%% 默认副本内结束就推送
-define(DUN_RESULT_PUSH_EXCLUSIVE, [
    ?DUNGEON_TYPE_CRUSADE
    ,?DUNGEON_TYPE_GUARD
    ]).

%% 需自己手动处理掉落的副本类型
-define(HANDLE_DROP_DUN_TYPE, [
    ?DUNGEON_TYPE_CRUSADE
    ]).

%% 是否可自动复活
-define(DUN_AUTO_REVIVE, [
    ?DUNGEON_TYPE_GUARD
    ]).

%% ----------------------- 副本大类型 -----------------------
-define(SINGLE_DUNGEON_TYPE, 1).              % 单人副本
-define(TEAM_DUNGEON_TYPE,   2).              % 组队副本

%% ----------------------- 次数扣除方式 -----------------------
%% 1进入扣除|2通关扣除|3失败扣除|4结束扣除|5发奖扣除|6打通第一波扣除
-define(DUN_COUNT_DEDUCT_ENTER,     1).     % 进入扣除
-define(DUN_COUNT_DEDUCT_SUCCESS,   2).     % 通关扣除
-define(DUN_COUNT_DEDUCT_FAIL,      3).     % 失败扣除
-define(DUN_COUNT_DEDUCT_END,       4).     % 结束扣除
-define(DUN_COUNT_DEDUCT_REWARD,    5).     % 发奖扣除
-define(DUN_COUNT_DEDUCT_WAVE,      6).     % 打通第一波扣除

%% ----------------------- 副本次数类型(对应副本配置) -----------------------
%% [{类型(1:日次数;2:周次数;3:终身次数;4:每日助战次数;5日常次数,领奖的时候加), 次数上限}]
-define(DUN_COUNT_COND_DAILY,       1).         % 日常次数
-define(DUN_COUNT_COND_WEEK,        2).         % 周次数
-define(DUN_COUNT_COND_PERMANENT,   3).         % 永久次数
-define(DUN_COUNT_COND_DAILY_HELP,  4).         % 日常助战次数(与日常次数是与或的关系)
-define(DUN_COUNT_COND_DAILY_REWARD,5).         % 日常次数 领奖的时候加

%% 61003自定义数据主键
-define(DUN_PASS_TIME,  1). %% 通关时间

%% 副本记录键定义
%% 对应数据库表dungeon_best_record
%% 及内存结构 #dungeon_info.data
-define (DUNGEON_REC_PASSTIME,          1).         %% 通关时间
-define (DUNGEON_REC_SCORE,             2).         %% 评价等级
-define (DUNGEON_REC_MAX_SCORE,         3).         %% 历史最佳
-define (DUNGEON_REC_DAILY_MAX_SCORE,   4).         %% 每日最佳(暂废弃,建议使用日计数器)
-define (DUNGEON_REC_UPDATE_TIME,       5).         %% 更新时间
-define (DUNGEON_REC_DATA,              6).         %% 其它数据1 如:三星奖励是否领取等
-define (DUNGEON_REC_DATA_1,            7).         %% 其他数据2 如:达到新记录评分时玩家等级等
-define (DUNGEON_REC_MAX_STARS,         8).         %% 通用副本三星星级历史记录列表
-define (DUNGEON_REC_RATING,            9).         %% 通用副本评级记录


%% 副本state类型特殊数据key定义
-define (DUN_STATE_EXP_DUN_AUTO,                exp_auto).              %% 经验副本-是否自动通关
-define (DUN_STATE_SPECIAL_KEY_HANDLE_MFA,      init_mfa).              %% 初始化回调处理，{M, F, A}
-define (DUN_STATE_SPECIAL_KEY_DUMMY,           dungeon_dummys).        %% 假人 => [#dungeon_dummy{},...]
-define (DUN_STATE_SPECIAL_KEY_DUMMY_KILLED,    dummy_killed).          %% 假人被杀数量统计 => integer()
-define (DUN_STATE_SPECIAL_KEY_MON_KILL_CALC,   mon_calc).              %% 怪物击杀统计 => [{MonId, Num}]
-define (DUN_STATE_SPECIL_KEY_TOWER_STATUS,     dun_guard_tower_status).%% 守卫信标塔怪状态
-define (DUN_STATE_SPECIAL_KEY_TOWER_HP,        dun_guard_tower_hp).    %% 守卫信标塔怪血量状态
-define (DUN_STATE_SPECIAL_KEY_DUN_QUICK_CD,    dun_guard_cd).          %% 守卫信标快速通关召唤CD
-define (DUN_STATE_SPECIAL_KEY_GUARD_WAVES,     dun_guard_waves).       %% 守卫信标同时存在的波数
-define (DUN_STATE_SPECIAL_KEY_BOSS_HP,         dun_galaxy_boss_hp).    %% 星辰副本boss血上限
-define (DUN_STATE_SPECIAL_KEY_MAX_SCORE,       dun_galaxy_max_score).  %% 星辰副本历史最高星数
-define (DUN_STATE_SPECIAL_KEY_PET_ASSIST,      dun_pet_assist).        %% 宠物副本上阵宠物数据(已废弃)
-define (DUN_STATE_SPECIAL_KEY_PET_FORCE_REF,   dun_pet_force_ref).     %% 宠物副本强制定时(已废弃)
-define (DUN_STATE_SPECIAL_KEY_GOD_KILL,        dun_god_mon_kill).      %% 唤神副本怪物击杀

%% 玩家dungeon_role的特殊数据key定义
-define (DUN_ROLE_DUN_ENTER_NEXT,           dun_enter_next).            %% 是否继续通关
-define (DUN_ROLE_DUN_COUNT_COST,           dun_count_cost).            %% 副本次数是否已扣除
-define (DUN_ROLE_COUNT_COST_TYPE,         count_cost_type).           %% 副本次数消耗类型
-define (DUN_ROLE_COST_LIST,                dun_cost).                  %% 本次副本消耗
-define (DUN_ROLE_CRUSADE_DUN_MON_HURT,     dun_mon_hurt).              %% 怪物伤害输出
-define (DUN_ROLE_MAT_REWARD_BUFF,          dun_mat_reward_buff).       %% 材料副本-材料提交活动buff标志
-define (DUN_ROLE_EXP_DUN_INIT_WAVE,        exp_init_wave).             %% 经验副本-初始波数
-define (DUN_ROLE_EXP_DUN_INIT_MAX_WAVE,    init_max_wave).             %% 经验副本-初始最大波数
-define (DUN_ROLE_EXP_DUN_DOING_TASK,       exp_task_doing).            %% 经验副本-是否任务在身
-define (DUN_ROLE_TOW_DUN_FIRST_PASS,       tow_dun_first_pass).        %% 爬塔副本-是否首通
-define (DUN_ROLE_TOW_DUN_MAX_DUN,          tow_dun_max_pass_dun).      %% 爬塔副本-普通难度副本通关历史最大副本
-define (DUN_ROLE_VISUS_INIT_WAVE,          visus_init_wave).           %% 幻光副本-初始波数
-define (DUN_ROLE_VISUS_INIT_MAX_WAVE,      visus_init_max_wave).       %% 幻光副本-初始最大波数
-define (DUN_ROLE_VISUS_REWARD_WAVE,        visus_reward_wave).         %% 幻光副本-已领取奖励波数
-define (DUN_ROLE_PET_MON_BUFF,             pet_mon_buff).              %% 宠物副本-进击怪死亡产生buff球
-define (DUN_ROLE_PET_TRIGGER_BUFF,         pet_dun_trigger_buff).      %% 宠物副本-玩家触发的buff球
-define (DUN_ROLE_PET_DUN_SCORE,            pet_dun_score).             %% 宠物副本-获得的积分
-define (DUN_ROLE_PET_DUN_HISTORY_SCORE,    pet_dun_history_score).     %% 宠物副本-单个副本历史积分
-define (DUN_ROLE_PET_DUN_OLD_RANK,         pet_dun_old_rank).          %% 宠物副本-旧排行
-define (DUN_ROLE_PET_DUN_CHOOSE_REWARD,    pet_dun_choose_reward).     %% 宠物副本-自选奖励
-define (DUN_ROLE_PET_DUN_PET_ID,           pet_dun_pet_id).            %% 宠物副本-宠物唯一Id
-define (DUN_ROLE_GUARD_INIT_MAX_WAVE,      guard_init_max_wave).       %% 塔防副本-初始最大波数
-define (DUN_ROLE_GOD_START_TIME,           god_start_time).            %% 唤神副本-唤神开始时间(ms)
-define (DUN_ROLE_GOD_SCORE,                god_wave_score).            %% 唤神副本-唤神波数积分
-define (DUN_ROLE_GOD_DOUBLE_REWARD_WAVE,   double_reward_wave).        %% 唤神副本-双倍奖励波数
-define (DUN_ROLE_CHILD_LEFT_MON,           child_left_mon).            %% 孩子副本-波数剩余怪物数
-define (DUN_ROLE_CHILD_INIT_WAVE,          child_init_wave).           %% 孩子副本-初始波数
-define (DUN_ROLE_CHILD_MAX_WAVE,           child_max_wave).            %% 孩子副本-历史最大波数(副本开始时记录)
-define (DUN_ROLE_CHILD_RUN_AWAY_NUM,       child_run_away_num).        %% 孩子副本-逃跑怪物数量
-define (DUN_ROLE_CHILD_WALK_MON,           child_walk_mons).           %% 孩子副本-自由寻路怪
-define (DUN_ROLE_CHILD_WALK_MON_TIME,      child_walk_mons_time).      %% 孩子副本-自由寻路怪创建时间
-define (DUN_ROLE_CHILD_BOX_MON,            child_box_mon).             %% 孩子副本-宝箱怪
-define (DUN_ROLE_CHILD_ENERGY,             child_energy).              %% 孩子副本-能量
-define (DUN_ROLE_GALAXY_DUN_MAX_DUN,       galaxy_dun_max_pass_dun).   %% 星辰副本-副本通关历史最大副本
-define (DUN_ROLE_COUNT_MERGE,              dun_role_count_merge).      %% 次数合并
-define (DUN_ROLE_DAILY_ENTER_COUNT,        dun_role_daily_enter_count).%% 日常总合并次数
-define (DUN_ROLE_DAILY_COUNTS,             dun_role_daily_counts).     %% {正常合并次数,购买合并次数}

%% 假人自定义数据
-define (DUN_DUMMY_GUARD_REVIVE_REF,        dummy_guard_revive_ref).    %% 塔防副本-假人复活定时
-define (DUN_DUMMY_GUARD_REVIVE_TIME,       dummy_guard_revive_count).  %% 塔防副本-假人复活次数

%% 任务触发
-define(DUN_TASK_ENTER_TRIGGER, 0).
-define(DUN_TASK_PASS_TRIGGER,  1).

%% 结算界面推送key定义
-define (DUN_RESULT_DUN_PET_OLD_RANK,         1).   %% 宠物副本-旧排名

%% 护送副本id
-define (DUN_CONVOY_ID, 50001).

-define (PET_DUN_BOX_MON, 2300051).


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

% %% 副本基本配置
-record(dun_cfg, {
        id = 0                          % 副本id
        , name = <<"">>                 % 副本名称
        , type = 0                      % 副本类型
        , sub_type = 0                  % 副本子类(前端使用,默认配0)
        , scene_id = 0                  % 场景id
        , time = 0                      % 副本时间

        , condition = []                % 进入条件 见 lib_dungeon:check_dungeon_condition
        , cost = []                     % 进入消耗(门票)
        , count_cond = []               % 次数条件 [{类型(1:日次数;2:周次数;3:终身次数), 次数上限}]
        , count_deduct = 0              % 次数扣除 1进入扣除|....
        , buy_count_cost = []           % 次数购买消耗 没有表示不能购买 [{次数,vip,{物品类型,物品id,物品数量}}]

        , wave_num = 0                  % 副本波数
        , fail_event = []               % 失败事件 通用通关条件默认完成全部波数
        , is_use_power_crush = 0        % 是否使用战力碾压(0:无,1:是)
        , is_use_attr_crush = 0         % 是否使用属性碾压(0:无,1:是)
        , recommend_power = 0           % 推荐战力
        , recommend_attr = []           % 推荐属性

        , revive_count = 0              % 复活次数(复活次数为0,则表示不能复活, 非0极大值表示不限复活次数)
        , revive_time = 0               % 复活秒数

        , reward_show = []              % 奖励展示
        , rand_reward_show = []         % 随机奖励展示

        , flop_cost = []                % 翻牌消耗
        , flop_pools = []               % 翻牌奖池&权重
        , flop_rewards = []             % 翻牌普通奖池
        , flop_times = []               % 翻牌倍率
        , base_reward = []              % 基础奖励
        , first_reward = []             % 首通奖励
        , rand_reward = []              % 随机奖励
        , trigger = 0                   % 0任务进入触发|1通关触发
        , quit_time = 0                 % 副本退出时间
        , born_type = 0                 % 0场景出生点|1原坐标出生点
    }).

% 副本怪物波数配置
-record(base_dun_wave_cfg, {
    dun_id = 0,                         % 副本id
    wave = 0,                           % 副本波数
    scene = 0,                          % 场景id
    create_time = 0,                    % 波数创建时间
    limit_time = 0,                     % 波数限制时间
    mon_list = [],                      % 波数怪物列表
    next_wave = 0,                      % 下一波数 若当前波数和下一波相等,则为循环波数,否则默认是叠加波数;若当前波数不为0且下一波数为0则此波为最后一波
    first_reward = [],                  % 首通奖励
    normal_reward = [],                 % 普通奖励
    recommend_power = 0,                % 波数推荐战力
    recommend_attr = [],                % 推荐属性
    born_xy = []                        % 初始出生坐标
    }).


%% 副本评分配置
-record(dungeon_grade, {
        dun_id = 0              % 副本id
        , grade_min = 0         %
        , grade_max = 0
        , condition = []        % 评分条件
        , reward = []           % 奖励列表
    }).

%% 经验本线路(关卡)配置
-record(base_exp_dun_level, {
        level = 0,              %
        min_wave = 0,           % 最小波数
        max_wave = 0            % 最大波数
    }).

-record (dungeon_dynamic_grade, {
        dun_id = 0
        , grade = 0
        , min_lv = 0
        , max_lv = 0
        , reward = []
        , reward2 = []
    }).


%% 副本共享稀有奖池
-record(share_flop_treasure_cfg, {
    id = 0,                 %% 奖池id
    flop_cost = 0,          %% 翻牌消耗
    treasure = []           %% 稀有奖池奖励
    }).


%% 爬塔普通副本每日奖励
-record(base_tower_dun_daily_reward, {
    id = 0,                 %% 副本id
    next_id = 0,            %% 下一副本目标
    rewards = []            %% 每日奖励
    }).

%% 爬塔困难难度副本配置
-record(base_tower_dun_diffcult, {
    id = 0,                 %% 副本id
    next_id = 0,            %% 下一困难难度副本目标
    need_unlock = 0,        %% 需解锁的普通难度副本id
    suggest = ""            %% 通关建议-前端使用 
    }).

%% 讨伐副本每日次数奖励
-record(base_crusade_dun_count_reward, {
    id = 0,                 %% 副本id
    count = 0,              %% 次数节点
    rewards = []            %% 奖励
    }).

%% 副本通用评级配置
%% 和星级评分里的时间评分类似，但两者互相独立，不会同时配置
-record(base_dun_grade_rating, {
    dun_id = 0,             %% 副本id
    grade = 0,              %% 评级
    last_time = 0,          %% 持续时间
    effiency = 0,           %% 奖励效率
    rewards = []            %% 奖励道具
    }).

%% -------------------- 副本评分 ----------------------------
-define(DUN_SCORE_DIE_COUNT,    1).     %% 死亡次数
-define(DUN_SCORE_PASS_TIME,    2).     %% 通关时间
-define(DUN_SCORE_DIE,          3).     %% 击杀怪物数量
-define(DUN_SCORE_DIE_ALL,      4).     %% 击杀所有怪物
-define(DUN_SCORE_WAVE,         5).     %% 通关波数
-define(DUN_SCORE_HP,           6).     %% 剩余血量

%% 副本评分&评级完成状态
-define(DUN_SCORE_UNFIN,     0).
-define(DUN_SCORE_FINISH,    1).

%% DUN_GRADE_EVENT
%% 副本星级评分条件关键字
-define(DUN_GRADE_EVENT_DIE_COUNT, die).        %% 人物死亡次数
-define(DUN_GRADE_EVENT_KILL_NUM,  kill_num).   %% 击杀怪物数量
-define(DUN_GRADE_EVENT_KILL_ALL,  kill_all).   %% 击杀所有怪物
-define(DUN_GRADE_EVENT_TIME,      time).       %% 限制时间内通关
-define(DUN_GRADE_EVENT_WAVE,      wave).       %% 通关波数
-define(DUN_GRADE_EVENT_REST_HP,   rest_hp).    %% 玩家剩余血量百分比

-define(SCORE_EVENT_KEYS, [
    ?DUN_GRADE_EVENT_DIE_COUNT
    ,?DUN_GRADE_EVENT_KILL_NUM
    ,?DUN_GRADE_EVENT_KILL_ALL
    ,?DUN_GRADE_EVENT_TIME
    ,?DUN_GRADE_EVENT_WAVE
    ,?DUN_GRADE_EVENT_REST_HP
    ]).

-define(SCORE_EVENT_TYPE_IDS, [
    ?DUN_SCORE_DIE_COUNT,
    ?DUN_SCORE_PASS_TIME,
    ?DUN_SCORE_DIE,
    ?DUN_SCORE_DIE_ALL,
    ?DUN_SCORE_WAVE,
    ?DUN_SCORE_HP    
    ]).

%% ----------------------------------------------------------
-define(DEFAULT_QUIT_TIME, 30).

-define(FORCE_QUIT_TIME(DunId),
    case data_dungeon:get_dun(DunId) of
        #dun_cfg{quit_time = QuitTime} -> QuitTime;
        _ -> ?DEFAULT_QUIT_TIME
    end).

%% ----------------------- 副本结果类型 -----------------------

-define(DUN_RESULT_TYPE_NO, 0).         % 没有结算
-define(DUN_RESULT_TYPE_SUCCESS, 1).    % 挑战成功
-define(DUN_RESULT_TYPE_FAIL, 2).       % 挑战失败

% 子类型
-define(DUN_RESULT_SUBTYPE_NO, 0).                  % 无
-define(DUN_RESULT_SUBTYPE_TIMEOUT, 1).             % 副本超时
-define(DUN_RESULT_SUBTYPE_WAVE_TIMEOUT, 2).        % 副本波数超时
-define(DUN_RESULT_SUBTYPE_ACTIVE_QUIT, 4).         % 主动退出副本
-define(DUN_RESULT_SUBTYPE_LOGOUT, 5).              % 玩家登出
-define(DUN_RESULT_SUBTYPE_PASSIVE_FORCE_QUIT, 6).  % 被动强制退出
-define(DUN_RESULT_SUBTYPE_ROLE_DIE, 7).            % 玩家死亡
-define(DUN_RESULT_SUBTYPE_TOWER_DIE, 8).           % 塔怪被击杀
-define(DUN_RESULT_SUBTYPE_ROLE_DISCONNECT, 9).     % 玩家中途掉线
-define(DUN_RESULT_SUBTYPE_PET_DIE,  10).           % 宠物副本-宠物死亡


-define(CREATE_ROLE_DUN, 0).            % 新人副本
-define(CREATE_ROLE_DUN_SCENE, 0).      % 新人副本场景

-define(DUN_DEF_GROUP, 99).             % 默认分组

%% ----------------------- 在线情况( #dungeon_role.online ) -----------------------
-define(DUN_ONLINE_NO,              0).         % 不在线
-define(DUN_ONLINE_YES,             1).         % 在线
-define(DUN_ONLINE_DELAY,           2).         % 延迟登出状态

%% ----------------------- 是否副本结束退出( #dungeon_role.is_end_out ) -----------------------
-define(DUN_IS_END_OUT_NO,          0).         % 副本未结束退出
-define(DUN_IS_END_OUT_YES,         1).         % 副本结束退出

%% ----------------------- 是否领取了奖励( #dungeon_role.is_reward ) -----------------------
-define(DUN_IS_REWARD_NO,           0).         % 没有领取奖励
-define(DUN_IS_REWARD_YES,          1).         % 已经领取奖励


%% 助战类型
-define(DUN_TEAM_HELP_NO,           0).         % 非助战
-define(DUN_TEAM_HELP_YES,          1).         % 助战

%% 副本玩家信息
-record(dungeon_role, {
        id = 0                          % 玩家id
        , node = undefined              % 玩家节点
        , server_id = 0                 % 角色所在的服务器id
        , server_num = 0                %
        , figure = undefined            % figure
        , combat_power = 0              % 战力
        , hp = 0                        % 玩家血量(玩家死亡,复活,登出)
        , hp_lim = 0                    % 玩家血量上限
        , base_attr = []                % 基础属性  [{key, val}]
        , pid = 0                       % 玩家服务进程
        , sid = 0                       % 异步广播进程
        , online = ?DUN_ONLINE_YES      % 在线情况
        , scene = 0                     % 原场景id
        , scene_pool_id = 0             % 原场景进程id
        , copy_id = 0                   % 原CopyId
        , x = 0                         % 原x坐标
        , y = 0                         % 原y坐标
        , team_id = 0                   % 玩家所在的队伍
        , team_position = 0             % 队伍位置
        , dead_time = 0                 % 死亡时间(复活重置为0)
        , dead_count = 0                % 死亡次数
        , revive_count = 0              % 复活的次数
        , cost_revive_count = 0         % 付费复活次数
        , revive_ref = undefined        % 复活定时器
        , delay_remove_ref = undefined  % 延迟退出副本定时器(副本中断线/闪退/关客户端)
        , help_type = 0                 % 助战类型(0:无;1:助战)
        , help_num = 0                  % 已助战次数 (跨服副本需要赋值)
        , is_end_out = 0                % 是否副本结束领取奖励后退出
        , is_reward = 0                 % 是否领取了奖励
        , drop_list = []                % 掉落列表 未捡起
        , drop_reward_list = []         % 掉落奖励列表,掉落获得的奖励列表
        , calc_reward_list = []         % 计算好的奖励列表 结算奖励
        , custom_reward_list = []       % 定制活动多倍奖励(活动奖励部分)
        , level_list = []               % 关卡列表 [#dungeon_role_level{},...]
        , rela_list = []                % 关系列表
        , drop_times_args = []          % 结算倍数
        , typical_data = #{}            % 与副本类型相关的数据，由各个副本类型相关逻辑自行处理
        % , is_leave = 0                  % 中途离开 1:离开,0:默认
        % , is_enter = 0                  % 0为正在进入loading;1为进入到场景
        , is_first = false              % 是否已首通
        , grade_progress = undefined    % 副本评分事件进度
        , grade_rating = []             % 副本通用评级,和评分事件的时间挑战通关类似，但互相独立
    }).

-record(dungeon_dummy, {
        id = 0
        ,dummy_type = 1                 % 1假人|2玩家镜像
        ,mirror_id = 0                  % 镜像玩家的真实id
        ,figure = undefined
        ,server_id = 0
        ,server_num = 0
        ,is_die = 0
        ,hurt_calc = 0                  % 假人伤害输出统计
        ,help_type = 0                  % 协助类型
        ,typical_data = #{}             % 辅助数据
    }).

%% 副本场景辅助信息
-record(dungeon_scene_helper, {
        hp_rate_list = []               % 血量比例,只触发一次就抛弃
    }).

%% 怪物辅助信息
-record(dungeon_mon_helper, {
        hp_rate_map = #{}               % 血量比例,只触发一次就抛弃
    }).

%% 关卡结果
-record(dungeon_level_result, {
        level = 0                       % 关卡
        , scene_id = 0                  % 场景id
        , start_time = 0                % 开始时间
        , end_time = 0                  % 结束时间
        , result_time = 0               % 结果时间
        , result_type = 0               % 结果
        , is_level_end = 0              % 是否已经结算
    }).

%% ----------------------- 副本是否结束 -----------------------
-define(DUN_IS_END_NO,           0).         % 没有结束
-define(DUN_IS_END_YES,          1).         % 已经结束

%% ----------------------- 是否跨服 -----------------------
-define(DUN_CLUSTER_NO,     0).             % 不是跨服副本
-define(DUN_CLUSTER_YES,    1).             % 是跨服副本

%% 副本进程状态
-record(dungeon_state, {
        dun_id = 0                      % 副本id
        , dun_type = 0                  % 副本类型
        , dun_callcack = undefined      % 副本回调模块
        , scene_id = 0                  % 当前场景id
        , scene_pool_id = 0             % 场景进程id
        , team_id = 0                   % 队伍id
        , owner_id = 0                  % 拥有者
        , enter_lv = 0                  % 进入时的等级(用于生怪:单人副本就取自己;组队就取队长)
        , cluster = 0                   % 跨服副本，1是跨服，0是本服
        , start_time = 0                % 副本开始时间
        , end_time = 0                  % 结束时间戳
        , role_list = []                % 角色列表 [#dungeon_role{}]
        , wave_num = 0                  % 波数
        , index_of_wave = 1             % 波数中的轮次(循环波数副本使用,叠加波数的副本默认为1)
        , wave_info = []                % [#dun_wave_info{}]
        , wave_type = 0                 % 0普通叠加波数|1循环波数|...待添加
        , mon_auto_id = 1               % 怪物的自增id
        , close_ref = undefined         % 结束定时器
        , is_end = 0                    % 是否结束副本(结束副本后不做任何处理)
        , result_type = 0               % 结束类型
        , result_subtype = 0            % 结束子类型
        , result_time = 0               % 结束时间
        , force_quit_ref = undefined    % 强制被动退出定时器
        , ref = undefined               % 定时器(检查事件)
        , wave_ref = []                 % [波数创怪定时器,波数结束定时器]
        , create_gap_ref = []           % 波数怪单只怪时间间隔定时器
        , init_wave_sign = 0            % 初始波数加载标志 初始波数由前端进场触发,后面波数默认忽视
        , typical_data = #{}            % 副本类型相关数据 在各自类型模块的文件里定义和说明
        , next_wave_time = []           % 下一波的触发时间[WaveNum, Time]
        , grade_ref = []                % 评分定时器列表
        , rating_ref = []               % 通用评级定时器
        , animation_ref = undefined     % 特效定时
    }).

%% 波数状态信息
-record(dun_wave_info, {
    key = {0, 0},                       % {wave_num, index_of_wave}
    progress = 0,
    require = 0,
    status = 0,
    typical_data = #{}                  % 自定义数据
    }).

%% 波数状态
-define(DUN_WAVE_UNFIN, 0).
-define(DUN_WAVE_FIN,   1).

%% 波数类型
-define(DUN_WAVE_OVERLAY, 0).           % 波数普通叠加
-define(DUN_WAVE_CYCLE,   1).           % 循环波数

-define(WAVE_SAME,  same_state).
-define(WAVE_NEXT,  next_wave).
-define(WAVE_CYCLE, cycle_wave).
-define(DUN_PASS,   dungeon_pass).

%% 波数怪创建关键字
-define(DUN_WAVE_MON_KEY, dun_wave_mon).

%% 初始波数默认生成时间,与前端是同步(等待场景加载完成)
-define(INIT_WAVE_CREATE_TIME, 22000).
%% 特效定时
-define(ANIMATION_TIMEOUT, 5000).

%%
-define(INIT_WAVE_LOAD_SIGN, 1).

%% 副本退出记录
-record(dungeon_out, {
        scene = 0                       % 原场景id
        , scene_pool_id = 0             % 原场景进程id
        , copy_id = 0                   % 原CopyId
        , x = 0                         % 原x坐标
        , y = 0                         % 原y坐标
        , is_again = 0                  % 是否重新使用退出记录,用于断线重连(0:无 1:是)
        , dun_id = 0                    % 副本id
        , reply_pid = 0                 % 默契答题pid(@情侣副本)
        , data = #{}
    }).


%% 可翻牌次数
-define(FLOP_MAX_COUNT, 3).

%% 翻牌宝藏类型
-define(FLOP_NORMAL,    1).
-define(FLOP_RARE,      2).

%% 翻牌状态
-define(FLOPING, 0).
-define(FLOPED,  1).

%% 翻牌类型
-define(NORMAL_FLOP, 0).
-define(BATCH_FLOP,  1).

-define(NORMAL_FLOP_MAX_TIME, 30).
-define(FLOP_FORCE_INTERVAL, 30000).

%% 批量翻牌持续时间,设定极大值,主要用于判断过不过时.相当于没有时间限制
-define(BATCH_FLOP_MAX_TIME, 3600).

%% 副本翻牌临时记录
-record(temp_flop, {
    flop_kind = 0,            % 翻牌类型 0普通|1批量
    flop_count = 0,           % 已翻牌次数(单个副本翻牌次数|批量副本翻牌批次)
    flop_time = 0,            % 翻牌结束时间
    flop_dun_type = 0,        % 翻牌副本类型
    flop_dun_id = 0,          % 翻牌副本id列表
    flop_duns = [],           % 批量翻牌副本列表 [{DunId, Count}] 每扫荡一次或每通关一次都有至少有一次免费翻牌,因此需统计先前使用的副本次数
    reward = [],              % 奖池已得奖励记录 [{{副本Id, 次数}, 位置, 2稀有, [奖池id,奖池内index]},{{副本id, 次数}, 位置, 1普通, [[{物品类型,物品id,数量}],倍率]}]
    batch_rewarded = [],      % 批量水晶宝藏已开启类型 1免费开启|2额外开启一次|3全部开启
    ref = undefined           % 免费翻牌强制定时器
    }).

%% 单人副本翻牌数据
-record(role_dun_flop, {
    id = 0,                 %% 玩家id
    treasure_id = 0,        %% 稀有奖池id
    flop_val = 0,           %% 祝福值 每次普通翻牌+1
    treasured = [],         %% 当前奖池已领取稀有奖励 [{稀有奖池id, [奖池内index,...]}]
    tmp_flop = #temp_flop{} %% 副本翻牌临时记录
    }).


-record(dungeon_role_grade, {
    map = #{}
    }).

%% 玩家进程的副本信息
-record(status_dungeon, {
        dun_id = 0                      % 副本id
        , dun_score = 0                 % 副本评分
        , is_end = 0                    % 副本结束
        , dead_time = 0                 % 死亡时间(复活重置为0)
        , dead_count = 0                % 死亡次数
        , revive_count = 0              % 复活的次数(默认使用)
        , cost_revive_count = 0         % 付费复活次数(特殊副本使用)
        , revive_map = #{}              % 复活Map
        , out = #dungeon_out{}          % 退出记录
        , help_type = 0                 % 当前副本的助战状态
        , data_before_enter = #{}       % 一些进入前的数据
        , dun_data = []                 % 副本相关数据 [{副本类型,相关data}]
        , flop = #role_dun_flop{}       % 翻牌
        , enter_time = 0                % 进入副本时间
        , sweep_reward_calc = #{}       % 批量扫荡临时记录(因批量扫荡奖励随机且需预展示,所以需保存临时结果,以便后续扫荡结果和展示内容一致)
    }).

%% sweep_reward_calc map key
-define(BATCH_FREE_SWEEP, batch_free_sweep).
-define(BATCH_COST_SWEEP, batch_cost_sweep).

%%阶段奖励状态
-define(CAN_NOT_GET,         0).         %% 未满足条件不能领取
-define(CAN_GET,             1).         %% 可以领取
-define(HAS_GET,             2).         %% 已经领取

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

%% 副本管理记录.
-record(dungeon_record, {
        role_id = 0                     % 角色id
        , dun_pid = 0                   % 副本进程pid
        , dun_id = 0                    % 副本id
        , last_leave = 0                % 最后离开副本时间
        , end_time = 0                  % 结束时间
    }).

%% 副本信息 61020用
-record (dungeon_info, {
    id = 0,
    daily_count = 0,
    weekly_count = 0,
    permanent_count = 0,
    permanent_pass = 0,
    buy_count = 0,
    buy_use = 0,
    gold_buy = 0,
    sweep_count = 0,
    sweep_buy_count = 0,
    help_count = 0,
    daily_pass = 0,
    daily_level = 0,    %% 日常层数(通关等级)
    data = []
    }).

-define(SQL_DUN_DATA_SELECT,
    <<" SELECT dun_type, data FROM `dungeon_data` where role_id=~p ">>).
-define(SQL_DUN_DATA_REPLACE,
    <<"REPLACE INTO dungeon_data(role_id, dun_type, data) VALUES (~p,~p,'~ts')">>).

-define(SQL_DUN_BEST_REC_SELECT,
    <<"SELECT `dun_id`, `data` FROM `dungeon_best_record` WHERE `player_id`=~p">>).
-define(SQL_DUN_BEST_REC_REPLACE,
    <<"REPLACE INTO `dungeon_best_record` (`player_id`, `dun_id`, `data`) VALUES (~p, ~p, '~s')">>).

-define(SQL_SELECT_ROLE_DUN_FLOP,
    <<"SELECT treasure_id, flop_val, treasured FROM role_dun_flop WHERE role_id = ~p">>).
-define(SQL_REPLACE_ROLE_DUN_FLOP,
    <<"REPLACE INTO role_dun_flop SET role_id = ~p, treasure_id = ~p, flop_val = ~p, treasured = ~ts">>).


-define(SQL_SELECT_EXP_DUN,
    <<"SELECT dun_id, wave, status FROM role_exp_dun_achieve WHERE role_id = ~p">>).
-define(SQL_EXP_DUN_REPLACE,
    <<"REPLACE INTO role_exp_dun_achieve (role_id, dun_id, wave, status) VALUES ~ts">>).

-define(SQL_SP_EXP_DUN_DAILY_COUNT_RESET,
    <<"UPDATE `counter_daily_four` SET `count` = ~p, `refresh_time` = ~p WHERE `role_id` = ~p AND `module` = ~p AND `sub_module` = ~p AND `type` = ~p">>).

-define(SQL_SP_EXP_DUN_REC_SELECT,
    <<"SELECT `data` FROM `dungeon_best_record` WHERE `player_id`= ~p and `dun_id` = ~p">>).
-define(SQL_SP_EXP_DUN_REC_UPDATE,
    <<"UPDATE `dungeon_best_record` SET `data` = ~ts WHERE `player_id` = ~p AND `dun_id` = ~p">>).

-define(SQL_VISUS_DUN_SELECT,
    <<"SELECT `dun_id`, `pass_waves`, `time`, `last_highest_wave` FROM role_dun_visus WHERE `role_id` = ~p">>).
-define(SQL_ONE_VISUS_DUN_SELECT,
    <<"SELECT `pass_waves`, `time`, `last_highest_wave` FROM role_dun_visus WHERE `role_id` = ~p AND `dun_id` = ~p">>).
-define(SQL_VISUS_DUN_DELETE,
    <<"DELETE FROM role_dun_visus WHERE `role_id` = ~p AND `dun_id` in (~ts)">>).
-define(SQL_VISUS_DUN_REPLACE,
    <<"REPLACE INTO role_dun_visus SET `role_id` = ~p, `dun_id` = ~p, `pass_waves` = ~ts, `time` = ~p, `last_highest_wave` = ~ts">>).
-define(SQL_VISUS_DUN_BATCH_REPLACE, 
    <<"REPLACE INTO role_dun_visus(role_id, dun_id, pass_waves, time, last_highest_wave) VALUES ~ts">>).
-define(SQL_VISUS_DUN_BATCH_VAL,
    <<"(~p, ~p, '~ts', ~p, '~ts')">>).
-define(SQL_VISUS_DUN_REC_SELECT,
    <<"SELECT `dun_id`, `data` FROM `dungeon_best_record` WHERE `player_id` = ~p AND ~ts">>).

%% ----------------------- 日志宏 -----------------------
-define(DUN_CREATE_PARTNER_POS_1, 1).   % 副本创建怪物的位置1
-define(DUN_CREATE_PARTNER_POS_2, 2).   % 副本创建怪物的位置2

%% ----------------------- 日志宏 -----------------------
-define(DUN_LOG_TYPE_NORMAL, 0).        % 无
-define(DUN_LOG_TYPE_RESULT, 1).        % 结算
-define(DUN_LOG_TYPE_HALFWAY_QUIT, 2).  % 中途退出
-define(DUN_LOG_TYPE_QUIT, 3).          % 退出操作
-define(DUN_LOG_TYPE_ROLE_OUT, 4).      % 玩家离开
-define(DUN_LOG_TYPE_DISCONNECT, 5).    % 玩家掉线