%%% -------------------------------------------------------
%%% @author huangyongxing@yeah.net
%%% @doc 场景
%%% -------------------------------------------------------
%%% 关于场景网格的划分
%%%     场景划分网格是为了进行广播优化，对于非全场景广播的场景可以大幅降低移动和战斗等更新广播量
%%%     场景网络划分后，对每个网格进行统一编号，按从左至右、从下至上的顺序编号，不需要用两个值来标识
%%%     例如HORIZ_GRID_CNT（场景横向宽度网格数量）为5时，编号如下：
%%%         ...
%%%         11 12 13 14 15
%%%         6  7  8  9  10
%%%         1  2  3  4  5
%%%     场景元素信息变更需要广播时通常可以最多只对周围9个网格进行广播，即九宫格广播
%%% -------------------------------------------------------
%%% 关于场景坐标
%%%     坐标系原点在屏幕左下角，每个像素对应一个坐标点
%%%     服务端和客户端中角色坐标即为这个坐标系中的坐标
%%% -------------------------------------------------------
%%% 关于场景玩家数记录
%%%  1. scene_role_count包含场景进程对应角色数量、相应各房间(CopyId区分)的角色数量
%%%     场景进程存储这份数据在进程字典中，便于读写更新操作
%%%     同时将这份数据写入ETS表供其他进程查询用
%%%     scene_mgr为ETS所有者，对ETS表只读；场景进程对ETS表只写不读；其他进程只读
%%%  2. 除了场景角色数量，还有每个网格附近九格区域角色总数量记录，只保存在场景进程的进程字典
%%%     附近九格角色总数量主要用于广播减频功能
%%% @doc
%%% -------------------------------------------------------
-ifndef(SCENE_HRL).
-define(SCENE_HRL, ok).

-include("mon.hrl").

%% 场景数据结构
-define(ETS_SCENE, ets_scene).

%% 场景玩家数（进程字典KEY，同时也是相应ETS表的表名）
-define(SCENE_ROLE_COUNT, scene_role_count).

%% 特定网格(AreaId)的附近九格区域总人数记录（进程字典KEY）
-define(AREA_ROLE_COUNT(AreaId, CopyId), {area_role_count, CopyId, AreaId}).

%% 场景中记录各房间或区域有哪些角色的进程字典KEY
-define(AREA_ROLES(AreaId, CopyId), {area_roles, CopyId, AreaId}).      % 场景区域中的角色Key
-define(ROOM_ROLES(CopyId), {room_roles, CopyId}).                      % 场景房间中的角色key

%% 场景配置中，某场景是否全场景广播的属性值
-define(BROADCAST_0, 0).                                % 不广播
-define(BROADCAST_1, 1).                                % 广播

%% 怪物类型定义 0普通怪,1采集怪,2任务采集怪,3护送怪,4拾取怪,6进击怪,7塔防怪,9自动进击怪,10非进攻巡逻怪
-define(MON_KIND_NORMAL,            0).                 % 普通怪
-define(MON_KIND_COLLECT,           1).                 % 采集怪
-define(MON_KIND_TASK_COLLECT,      2).                 % 任务采集怪
-define(MON_KIND_CONVOY,            3).                 % 护送怪
-define(MON_KIND_PICK,              4).                 % 拾取怪

-define(MON_KIND_ATT,               6).                 % 进击怪
-define(MON_KIND_TOWER_DEF,         7).                 % 塔防怪
-define(MON_KIND_ATT_AUTO,          9).                 % 自动进击怪：根据指定的攻击对象自动寻路
-define(MON_KIND_WALK_AUTO,        10).                 % 宝宝副本特殊怪物(遇到攻击会反击，否则按规定路径行走)

%% 怪物Boss定义 0普通怪(普通怪),1普通野外怪(普通怪),2精英怪物(普通怪),3赏金BOSS(赏金专用),4世界BOSS(世界BOSS专用),
%% 5不死BOSS,6副本BOSS,7任务BOSS,8战场BOSS(不可被击退),9废都BOSS,10废都BOSS精英,11活动BOSS
-define(MON_NORMAL,             0).                     % 普通怪(普通怪)
-define(MON_NORMAL_OUSIDE,      1).                     % 普通野外怪(普通怪)
-define(MON_ELITE,              2).                     % 精英怪物(普通怪)
-define(MON_REWARD_BOSS,        3).                     % 赏金BOSS(赏金专用)/次元幻魔
-define(MON_WORLD_BOSS,         4).                     % 世界BOSS(世界BOSS专用)
-define(MON_KEEP_ALIVE,         5).                     % 不死BOSS: 受击时血量高于100，血量不变(血量变化由具体玩法处理);小于100时，自然扣血
-define(MON_DUN_BOSS,           6).                     % 副本BOSS
-define(MON_TASK_BOSS,          7).                     % 任务BOSS
-define(MON_ACT_BATTLE,         8).                     % 战场BOSS(不可被击退)
-define(MON_DESERTED_BOSS,      9).                     % 废都BOSS/混乱星域
-define(MON_DESERTED_ELITE,    10).                     % 废都BOSS精英/混乱星域
-define(MON_ACT_BOSS,          11).                     % 活动BOSS
-define(MON_HOME_BOSS,         12).                     % 幻魔之家BOSS
-define(MON_HOME_GBOSS,        13).                     % 幻魔之家(社团)BOSS

%% 传送类型
-define(TRANS_TYPE_SERVER,              0).             % 服务器传送
-define(TRANS_TYPE_FLY,                 1).             % 小飞鞋
-define(TRANS_TYPE_WORLD,               2).             % 世界传送（到场景出生点）
-define(TRANS_TYPE_GATE_NEAR,           3).             % 传送门 - 邻近城市传送（传统传送门）
-define(TRANS_TYPE_GATE_ANY,            4).             % 传送门 - 任意城市传送（需服务端计算距指定坐标最近的目标场景传送门）

-define(IN_IDLE,   0).  %% 正常状态
-define(IN_FIRE,   1).  %% 祝火状态

%% 不死怪: 血量高于100时，血量不变，小于100时，自然扣血
-define(KEEP_ALIVE_MON_DIE_HP, 100).

%% 大世界镜像场景id
-define(MIRROR_IMAGE_SCENE(SceneId), (SceneId * 10 + 1)).
%% -------------------------------------------------------
%% 场景逻辑点坐标与网格说明
%%
%% LOGIC_PT 即 logic point，服务端与客户端约定，
%% 按一定宽度与高度（单位：像素），划分出的方格，即为逻辑点
%%
%% GRID 即为网格（九宫格广播依赖于网格划分，相邻九个GRID组成一个广播的九宫格）
%%
%% HORIZ_GRID_CNT 即为 水平方向上网格的数量（为了使网格采用一维数组编号，
%% 所以需要定义此值。此值与网格的像素宽度，共同决定了地图水平宽度上限）
%% 网格编号由服务端管理（广播需要），不发送给前端
%%
%% -------------------------------------------------------

%% GRID_WIDTH 和 GRID_HEIGHT 需要按主流分辨率来决定，
%% 九格广播的情况下，一个网格要超半屏，才不易引起边界上突然失踪的问题
%% 在近3D的视角下，横向无偏角，实际长度一致，纵向有偏角，实际需要更长一些
-define(LOGIC_PT_WIDTH, 100).                           % 一个逻辑坐标点X轴（水平）方向长度(pixel)
-define(LOGIC_PT_HEIGHT,  100).                         % 一个逻辑坐标点Y轴（垂直）方向长度(pixel)
-define(GRID_WIDTH, (12 * ?LOGIC_PT_WIDTH)).            % 一个网格的横向像素长度(pixel)
-define(GRID_HEIGHT,  (12 * ?LOGIC_PT_HEIGHT)).          % 一个网格的纵向像素长度(pixel)
%% 场景横向划分网格数量:
%% 可支持的地图横向宽度上限为?GRID_WIDTH * ?HORIZ_GRID_CNT，地图宽度如超出会引起移动广播问题
-define(HORIZ_GRID_CNT, 30).

%% 坐标系原点在屏幕左下角
-define(GRID_OFFSET_M, 0).                              % 九宫格中间格子编号偏移值
-define(GRID_OFFSET_R, 1).                              % 九宫格右边格子编号偏移值
-define(GRID_OFFSET_L, -1).                             % 九宫格左边格子编号偏移值
-define(GRID_OFFSET_U, ?HORIZ_GRID_CNT).                % 九宫格上边格子编号偏移值
-define(GRID_OFFSET_D, -?HORIZ_GRID_CNT).               % 九宫格下边格子编号偏移值
-define(GRID_OFFSET_LU, (?HORIZ_GRID_CNT-1)).           % 九宫格左上边格子编号偏移值
-define(GRID_OFFSET_LD, (-?HORIZ_GRID_CNT-1)).          % 九宫格左下边格子编号偏移值
-define(GRID_OFFSET_RU, (?HORIZ_GRID_CNT+1)).           % 九宫格右上边格子编号偏移值
-define(GRID_OFFSET_RD, (-?HORIZ_GRID_CNT+1)).          % 九宫格右下边格子编号偏移值
%% -------------------------------------------------------

%% 场景类型定义.(特殊的活动最好新加场景类型)
%% 主类型-影响生成逻辑，客户端ui, 对应#ets_scene.type
-define(SCENE_TYPE_NORMAL,          0).                 % 主城（普通场景）
-define(SCENE_TYPE_OUTSIDE,         1).                 % 野外场景
-define(SCENE_TYPE_DUNGEON,         2).                 % 副本场景
-define(SCENE_TYPE_WORLD_BOSS,      3).                 % 世界BOSS场景
-define(SCENE_TYPE_GUILD,           4).                 % 公会场景
-define(SCENE_TYPE_ACTIVE,          5).                 % 活动场景(通用)
-define(SCENE_TYPE_VOID_FAM,        6).                 % 无尽领域
-define(SCENE_TYPE_REWARD_BOSS,     7).                 % 赏金BOSS场景
-define(SCENE_TYPE_GWAR,            8).                 % 百团大战
-define(SCENE_TYPE_ARENA,           9).                 % 9  竞技联赛(竞技场)
-define(SCENE_TYPE_HOT_SPRING,     10).                 % 10 舞池派对(温泉)
-define(SCENE_TYPE_MADNESS,        11).                 % 狂战领域
-define(SCENE_TYPE_3v3,            12).                 % 3V3
-define(SCENE_TYPE_DRUMWAR,        13).                 % 钻石大战
-define(SCENE_TYPE_1vN,            14).                 % 1vN
-define(SCENE_TYPE_CAMP_WAR,       15).                 % 跨服团战
-define(SCENE_TYPE_CGW,            16).                 % 跨服国战
-define(SCENE_TYPE_WASTELAND,      17).                 % 废土战场(饥饿游戏)场景
-define(SCENE_TYPE_DESERTED_BOSS,  18).                 % 混乱星域BOSS场景
-define(SCENE_TYPE_JUMP_ACT,       19).                 % 跳一跳玩法
-define(SCENE_TYPE_HOME_BOSS,      20).                 % 幻魔/社团之家
-define(SCENE_TYPE_EXP_SEA,        21).                 % 经验海

%% 下面的作废 新增顶掉  删掉旧功能
-define(SCENE_TYPE_TOPPK,           99).                % 巅峰竞技

%% 次类型：按场景的对角色的影响而分,对应 #ets_scene.subtype
-define(SCENE_SUBTYPE_NORMAL,       0).                 % 场景次类型-自由切换pk模式场景,入场pk状态看pkstate,入场后可以切换pk状态
-define(SCENE_SUBTYPE_SAFE,         1).                 % 场景次类型-安全场景,强制切换为和平状态。无法战斗
-define(SCENE_SUBTYPE_PK,           2).                 % 场景次类型-强制切换pk状态场景,入场pk状态看pkstate,入场后不能切换pk状态
-define(SCENE_SUBTYPE_GROUP,        3).                 % 场景次类型-强制切换pk为和平状态场景,入场后不能切换pk状态,pk按照分组模式

%% 场景所在节点类型 #ets_scene.cls_type
-define(SCENE_CLS_TYPE_GAME, 0).                        % 非跨服场景
-define(SCENE_CLS_TYPE_CENTER, 1).                      % 跨服场景

%% 场景所在节点类型 #ets_scene.broadcast
-define(BROADCAST_AREA, 0).                             % 九宫格广播
-define(BROADCAST_ALL,  1).                             % 全场景广播

%% 场景mark类型
-define(SCENE_MASK_NORMAL,  0).
-define(SCENE_MASK_BLOCK,  -1).
-define(SCENE_MASK_SAFE,   -2).

%% 移动类型
-define(MOVE_ROLE_WALK,                 0).             % 正常走路
-define(MOVE_ROLE_JUMP,                 1).             % 跳跃（主动式）
-define(MOVE_ROLE_ACCELERATE,           2).             % 任务加速
-define(MOVE_ROLE_FLASH,                3).             % 闪现移动
-define(MOVE_ROLE_TASK_JUMP,            4).             % 任务飞行、起跳点跳跃等（被动式）
-define(MOVE_ROLE_DASH,                 5).             % 冲刺（前端用）
-define(MOVE_ROLE_BLINK,                6).             % 瞬移
%% 服务端内部值，由MOVE_ROLE_JUMP转换而来，以精确度为代价省去场景进程中的计算逻辑
-define(MOVE_ROLE_JUMP_COST_ENG,      101).             % 跳跃（消耗能量，服务端MOVE_ROLE_JUMP的特定状态）

%% 伙伴战斗类型
-define(PARTNER_BATTLE_TYPE_NO,         0).             % 不出战
-define(PARTNER_BATTLE_TYPE_GROUP,      1).             % 伙伴组出战(位置1、2为一组,位置3、4为一组)
-define(PARTNER_BATTLE_TYPE_DIE_SHIFT,  2).             % 死亡切换(默认出两个)
-define(PARTNER_BATTLE_TYPE_ROBOT_ALL,  3).             % 机器人的伙伴

%% 复活类型
% 1元宝原地复活
% 2绑定元宝原地复活
% 3回城复活
% 4原血量复活
% 5原地满血复活
% 8挂机自动复活
% 9通用副本复活
-define(REVIVE_DUNGEON,     9).              %% 副本复活


%% --------------------------------------------------------------
%% 以下复活类型待定
-define(REVIVE_KF_3V3,      10).             %% 跨服3v3
-define(REVIVE_MELEE,       11).             %% 大乱斗钻石原地复活
-define(REVIVE_DRUMWARD,    12).             %% 钻石大战复活
-define(REVIVE_KF_TOWN_WAR_OWN, 13).         %% 跨服城战复活点复活
-define(REVIVE_KF_TOWN_WAR_BORN, 14).        %% 跨服城战出生点复活
-define(REVIVE_MELEE_FREE,       15).        %% 大乱斗免费原地复活
-define(REVIVE_FOR_GOODS,        16).        %% 使用复活券原地复活

-define(REVIVE_MAX_TYPE,  ?REVIVE_FOR_GOODS).    %% 最大复活类型

%% 脱离战斗时间(s)
-define(ESCAPE_ATT_TIME,   10).

-define(EXP_SHARE_ALL_TO_ATTACKER, 0).                  % 所有伤害者获得所有经验
-define(EXP_SHARE_PART_TO_ATTACKER, 1).                 % 按照伤害比例分配经验
-define(EXP_SHARE_TO_SCENE, 2).                         % 同场景的玩家获得经验 比例按动态经验和个人等级挂钩
-define(EXP_SHARE_ALL_TO_ATTACKER_DYNAMIC, 3).          % 所有伤害者获得所有经验 比例按动态经验和个人等级挂钩


%% 场景房间人数上限的最小限制
-ifdef(DEV_SERVER).
-define(MIN_SCENE_MAX_ROLE, 1).
-else.
-define(MIN_SCENE_MAX_ROLE, 30).
-endif.

%% 玩家场景更新类型
-define(SCENE_USER_UPDATE_MATE_ROLE,       10).   % 羁绊对象更新
-define(SCENE_USER_UPDATE_MATE_TITLE,      11).   % 羁绊称号更新
-define(SCENE_USER_UPDATE_MATE_LV,         12).   % 羁绊等级更新
-define(SCENE_USER_UPDATE_FOLLOW_GUARD,    13).   % 守护跟随更新
%% -----------------------------------------------------------------
%% 一些特殊的场景或场景类型定义
%% -----------------------------------------------------------------

%% 需要服务器强制自动动态创建分线的场景类型
-define(SCENE_TYPE_NEED_SUB_LINE, [
        ?SCENE_TYPE_NORMAL
        ,?SCENE_TYPE_OUTSIDE
        ,?SCENE_TYPE_GWAR
        ,?SCENE_TYPE_MADNESS
        ,?SCENE_TYPE_VOID_FAM
    ]).

%% 玩家能够主动切换分线的场景类型SCENE_TYPE_NORMAL和SCENE_TYPE_OUTSIDE 见12040和12041协议
-define(SCENE_TYPE_CAN_ACTIVE_SWITCH, [
        ?SCENE_TYPE_NORMAL,
        ?SCENE_TYPE_OUTSIDE
    ]).

%% 掉落归属显示的boss
-define(IS_DROP_BOSS(X), lists:member(X,
    [
        ?MON_REWARD_BOSS,
        ?MON_DESERTED_BOSS,
        ?MON_DESERTED_ELITE,
        ?MON_HOME_BOSS,
        ?MON_HOME_GBOSS
    ])).

%% 是不是boss
-define(IS_BOSS(X),
    lists:member(X,
        [
            ?MON_REWARD_BOSS,
            ?MON_DUN_BOSS,
            ?MON_TASK_BOSS,
            ?MON_DESERTED_BOSS,
            ?MON_DESERTED_ELITE,
            ?MON_HOME_BOSS,
            ?MON_HOME_GBOSS
        ]
    )).

%% 禁止通过12005协议传送进入的场景id列表
-define(FORBID_SCENE_IDS, [4101, 4301, 4302]).
%% -----------------------------------------------------------------

%% 场景进程字典
%% Key:{dungeon_hp_rate, CopyId}, Value:HpRateList. 副本辅助信息,CopyId:副本id

%% 怪物进程字典
%% Key:{dungeon_hp_rate, MonId}, Value:HpRateList. 副本血量额外触发

%% 场景数据结构
-record(ets_scene, {
        id = 0                  :: non_neg_integer(),   % 场景ID包括资源id
        pool_id=0               :: non_neg_integer(),   % 场景进程id
        % bpid = 0,                                       % 广播进程pid
        name = <<>>,                                    % 场景名称
        type = 0                :: non_neg_integer(),   % 场景主类型(参考上面定义)
        subtype = 0             :: non_neg_integer(),   % 场景次类型(参考上面定义)
        cls_type = 0            :: non_neg_integer(),   % 所在节点(参考上面定义)
        broadcast = 0           :: non_neg_integer(),   % 广播类型(参考上面定义)
        x = 0                   :: non_neg_integer(),   % 默认开始点
        y = 0                   :: non_neg_integer(),   % 默认开始点
        elem=[]                 :: list(),              % 传送阵坐标
        requirement = []        :: list(),              % 进入需求[{lv, SLv, RLv}]
        mask = "",                                      % 障碍点数据
        npc = [],                                       % npc数据
        mon = [],                                       % 默认怪物数据
        jump = [],                                      % 跳跃点配置
        width = 0               :: non_neg_integer(),   % 场景资源宽度px
        height = 0              :: non_neg_integer(),   % 场景资源长度px
        is_have_safe_area = 0   :: non_neg_integer(),   % 是否有安全区(0没有, 1有)
        is_have_minimap = 0     :: non_neg_integer(),   % 是否有小地图(0:无;1:有小地图)
        mount = 0               :: non_neg_integer(),   % 是否可以上坐骑（0不能，1可以）
        parnter_battle_type = 0,                        % 伙伴战斗类型
        fuhuoscene = 0          :: non_neg_integer(),   % 复活场景
        reborn_xys = []         :: list()               % 复活坐标列表（[{X, Y}, ...]）
    }).

%% 场景玩家数
-record(scene_role_count, {
        key = {0, 0}                                    % SceneKey: {场景Id, 场景PoolId}
        ,type = 0                                       % 场景类型
        ,num = 0                                        % 当前场景进程下的场景人数
        ,change_time = 0                                % 变更时间
        ,num_maps = #{}                                 % 不同房间(copy_id)的人数 #{CopyId => Num}
    }).

%% 场景其他属性
-record(ets_scene_other, {
        id = 0,                                         % 场景id
        room_max_people = 100                           % 房间最大人数
    }).

%% 场景用户数据
%% 只保留场景所需的信息
-record(ets_scene_user, {
        id = 0,                                         % 角色id
        scene = 0,                                      % 场景id
        scene_pool_id=0,                                % 场景进程id
        copy_id = 0,                                    % 房间id
        x = 0,                                          % X坐标
        y = 0,                                          % Y坐标
        last_load_scene = 0,                            % 最近load的场景（用于检测是否全新进入场景，避免复活或其他load_scene操作影响）
        last_load_pool = 0,                             % 最近load的场景分线（用于检测是否全新进入场景，避免复活或其他load_scene操作影响）
        server_id = 0,                                  % 来自的服务器独立唯一标识
        node=none,                                      % 来自节点
        platform = "",                                  % 平台标示
        server_num = 0,                                 % 所在的服标示
        server_name = <<>>,                             % 选择服务器的名字
        source="",                                      % 渠道来源
        sid = undefined,                                % 玩家发送消息进程
        pid = undefined,                                % 玩家进程
        figure=undefined,                               % #figure{} (figure.hrl)
        battle_attr=undefined,                          % #battle_attr{} (attr.hrl)
        skill_list = [],                                % 技能列表
        skill_cd = [],                                  % 技能cd
        skill_combo = [],                               % 技能连技（切换场景清空）
        skill_combo_ders = [],                          % 连技受击者(combo技能不重新选择攻击目标)[{Sign, Id}]
        shaking_skill = 0,                              % 正在前摇的技能id
        main_skill = {0, 0},                            % 连技中主技能
        skill_link = [],                                % 连接技能
        skill_passive = [],                             % 被动技能的汇总(人物的被动=人被+天赋+xxx...)
        skill_pet_passive = [],                         % 宠物独立战斗的被动技能列表
        skill_talent_active_list = [],                  % 天赋主动技能列表 [{SkillId, SkillLv}]
        att_list = [],                                  % 正在攻击我的怪物列表
        collect_pid = {0, 0, 0},                        % 正在采集的目标：{MonPid, MonId, MonCfgId}
        hp_resume_ref = undefined,                      % 回血定时器
        follow_target_xy={0,0},                         % 跟随目标xy坐标
        online = 1,                                     % 是否真实在线
        team = 0,                                       % 组队 #status_team{} (team.hrl)
        dun_multi = 0,                                  % 跨服组队 #role_dun_multi{} 只放team_id和dun_id
        is_ride = 0,                                    % 是否骑乘
        mount_figure = 0,                               % 坐骑id
        follow_pet = 0,                                 % 宠物跟随
        show = 0,                                       % 展示
        quickbar_skills = [],                           % 当前技能快捷栏装备的技能
        change_scene_sign = 0,                          % 排队换线标志
        leave_scene_sign = 0,                           % 离开场景标志(某些活动在进入排队前就已经切换成离开场景标识)
        boss_tired = 0,                                 % 世界BOSS疲劳值
        bl_who = 0,                                     % boss归属标识：0：不显示；1：显示
        baby_battle_attr = undefined,                   % 宝具战斗属性
        partner_battle_attr = undefined,                % 伙伴/ai娘战斗属性
        child_battle_attr = undefined,                  % 孩子战斗属性
        scene_att_objects = [],                         % 场景攻击方对象ID列表 [#scene_att_object{}]
        mate_role_id = 0,                               % 配对玩家id 目前是海滩约会对象的id 默认为0
        att_tired = 0,                                  % 攻击疲劳值,100为上限,不能造成伤害
        act_label = [],                                 % 活动标识 [{K,V}]
        be_follow_mons = [],                            % 被跟随的怪物自增id列表
        boss_crush_r = 0,                               % boss碾压参数
        can_att_list = [],                              % 可攻击对象 [{对象类型, 对象列表}]   eg:[{?BATTLE_SIGN_MON, [怪物配置Id]}, {?BATTLE_SIGN_PLAYER, [玩家ID: 空则表示所有]}]
        cannot_beatt_list = []                          % 不可被攻击对象 [{对象类型, 对象列表}]
        ,mate_name = ""                                 % 展示的羁绊名字
        ,mate_title = ""                                % 羁绊称号，如果该称号不为空，则显示该称号
        ,mate_lv = 0                                    % 羁绊称号等级
        ,support_id = 0                                 % 被协助玩家id
        ,support_name = ""                              % 被协助玩家名字
        ,support_team = 0                               % 被协助玩家队伍id
        ,support_team_name = ""                         % 被协助玩家队长名字
        ,support_content = []                           % 被协助者简要信息
        ,scene_motion = undefined                       % 运动能量相关行为信息
        ,badge = []
        ,role_dance = 0
        ,god_fighting = []
        ,offline_hosting = []                           % 离线托管数据
        ,deserted_boss_tired = []                       % 废都boss疲劳值
        ,support_pet_list = []                          % 助战宠物列表[{宠物Id,星级,是否觉醒,是否主战}]
        ,unite_buffs = #{}                              % 联合BUFF
        ,reb_protect_time = 0                           % 赏金boss免战时间
        ,deb_protect_time = 0                           % 星域幻魔免战时间
    }).

-record(ets_npc, {
        id = 0,                             % 唯一id
        target = 0,                         % 开服N天后 本服跨服主城NPC映射 任务使用
        func = 0,                           % 功能
        icon = 0,                           % 场景模型资源id
        image = 0,                          % 头像
        title = "",                         % 称谓
        name = "",                          % npc名字
        scene = 0,                          % npc所在场景
        copy_id = 0,                        % npc所在房间
        show = 1,                           % 默认是否显示 1显示 0不显示(默认显示)
        anima = "",                         % 模型动作和角度参数
        sname = "",
        x,
        y,
        talk,
        realm = 0,
        icon_scale = 0
    }).

%% 场景进程状态数据结构
-record(scene_state, {
        scene = #ets_scene{}                % 场景数据
        ,msg_count = 0                      % 已处理的消息数量
        ,msg_filter_len = 0                 % 消息需要检查过滤的数量
        ,mon_mgr_pid = undefined            % 场景怪物逻辑进程
    }).

%% A*寻路
-record(path_point, {
        xy,
        g,
        h,
        f,
        last_point
    }).

%% add_buff_to_role AI参数
-record(add_buff_to_role_args, {
        role_num = 0                        % 给多少个玩家增加buff
        ,skill_id = 0                       % 技能Id
        ,skill_lev = 0                      % 技能等级
        ,scene = 0                          % 场景Id
        ,scene_pool_id = 0                  % 场景分线Id
        ,effect = []                        % buff定时完了要执行什么效果。比如创建怪物[#create_mon_args{}]
        ,buff_time = 0                      % buff持续时间
        ,role_id_list = []                  % 玩家Id列表
    }).

-endif.
