%%%------------------------------------------------
%%% @doc 全局公共定义
%%%------------------------------------------------
-ifndef(COMMON_HRL).        %% COMMON_HRL START
-define(COMMON_HRL, ok).

-record(errorcode_msg, {
	type = "",
	about  = ""
}).

-include("otp_compatible.hrl").

%% DEV_SERVER宏由web后台编译的时候决定是否定义
%% 通常开发服默认定义了DEV_SERVER宏，稳定服默认未定义
%% PS: 特别注意，如果修改参数进行编译，需要删除相关已编译模块重新编译

-ifdef(DEV_SERVER).
-define(DEBUG(F, A), util:debug(F, A, ?MODULE, ?LINE)).
-define(ERR_MSG(Cmd, ErrCode),
	case data_errorcode_msg:get(ErrCode) of
		#errorcode_msg{type = Type, about = Msg} ->
			io:format("~w[line:~w]:{~p, ~p, ~ts}~n ", [?MODULE, ?LINE, Cmd, Type, Msg]);
		_ ->
			io:format("~w[line:~w]:{~p, ~p}~n ", [?MODULE, ?LINE, Cmd, ErrCode])
	end).
-else.
-define(DEBUG(_F, _A), ok).
-define(ERR_MSG(_Cmd, _ErrCode), ok).
-endif.

-define(ERR(F, A),   util:errlog(F, A, ?MODULE, ?LINE)).
-define(INFO(F, A),  util:info(F, A, ?MODULE, ?LINE)).

%% 错误处理
% -define(DEBUG(F, A), util:log_file("DEBUG", F, A, ?MODULE, ?LINE)).
% -define(INFO(F, A),  util:log_file("INFO", F, A, ?MODULE, ?LINE)).
% -define(ERR(F, A),   util:log_file("ERROR", F, A, ?MODULE, ?LINE)).
-define(DEBUG(F),    ?DEBUG(F, [])).
-define(INFO(F),     ?INFO(F, [])).
-define(ERR(F),      ?ERR(F, [])).

%% 输出信息到Erlang终端
-define(DEBUG_TTY(F, A), game_logger:debug(F, A, ?MODULE, ?LINE)).
-define(INFO_TTY(F, A),  game_logger:info(F, A, ?MODULE, ?LINE)).
-define(ERR_TTY(F, A),   game_logger:error(F, A, ?MODULE, ?LINE)).
-define(DEBUG_TTY(Msg),  ?DEBUG_TTY(Msg, [])).
-define(INFO_TTY(Msg),   ?INFO_TTY(Msg, [])).
-define(ERR_TTY(Msg),    ?INFO_TTY(Msg, [])).

%% 定义DEBUG_TTY的别名——PRINT
-define(PRINT(F, A), ?DEBUG_TTY(F, A)).

%% --------------------------------------
%% TRY执行某个函数
%% --------------------------------------

%% -define(TRY_CATCH(X), (fun()-> try X catch A : B -> ?ERR("~p : ~p : ~p : ~p\n", [??X, A, B, erlang:get_stacktrace()]), {A, B} end end)() ).

%% 使用__作为变量名前缀，尽量避免同名变量
%% 使用(fun -> end)()而不是begin end，是为了防止同一代码块需要反复使用此宏代码时存在变量名冲突
-define(TRY(__F), (fun() -> __M=?MODULE, __L=?LINE,
                try
                    __F
                catch
                    ?EXCEPTION(__C, __R, __S) ->
                        util:errlog("~p, {~p,~p},~n  stacktrace: ~p~n", [??__F, __C, __R, ?GET_STACK(__S)], __M, __L),
                        {__C, __R}
                end
        end)()).
-define(CURR_STACK(), element(2, process_info(self(), current_stacktrace))).
%% --------------------------------------

%% 是否开发环境
-ifdef(DEV_SERVER).
-define(IS_DEV_SERVER, true).
-else.
-define(IS_DEV_SERVER, false).
-endif.

%% 节点类型
-define(NODE_GAME, 0).              %% 游戏节点
-define(NODE_CENTER, 1).            %% 跨服节点

%% 节点node Id
-define(GAME_NODE_ID, 10).          %% 游戏服node id
-define(CLUSTERS_NODE_ID, 0).       %% 跨服中心node id

-define(SERVER_ENV_CLOSE,    0). %% 服务器状态: 0关闭
-define(SERVER_ENV_STARTED,  1). %% 服务器状态: 1开启
-define(SERVER_ENV_STARTING, 2). %% 服务器状态: 2开启中

-define(CLUSTER_LINK_CLOSE, 0).     %% 跨服连接状态: 断开连接
-define(CLUSTER_LINK_CONNECTED, 1). %% 跨服连接状态: 已连接

-define(ONE_MIN,                         60).
-define(DIFF_SECONDS_0000_1970, 62167219200).
-define(ONE_DAY_SECONDS,              86400).
-define(ONE_WEEK_SECONDS,         (86400*7)).
-define(FOUR_HOUR_SECONDS,         (4*3600)).

%% PS: Erlang后面的版本扩大了范围，不过再大也意义不大了，保留这个历史限制
%% 定时器超时时间上限 ( 16#FFFFFFFE / 1000 / 86400 = 49.71 天)
%% 16#FFFFFFFF : 2^32 - 1
-define(MAX_TIMEOUT,            16#FFFFFFFF).

%% 百分比系数型属性的对应分母值（或其他非属性的万分比配置值分母）
-define(RATIO_MAX, 10000).
-define(RATIO_10W, 100000).

%% 逻辑天数
-define(LOGIC_NEW_DAY,                    4).  %% 4点为新的一天
-define(DAY_LOGIC_OFFSET_HOUR,            4).  %% 天数逻辑偏移小时

-define(ONE_KBYTE,                     1024).  %% 1kb

-define(OBJECT_TUPLE(Type, GoodsId, Num), {Type, GoodsId, Num}).



%% 玩家在线状态
-define(ONLINE_OFF,         0).              %% 玩家离线
-define(ONLINE_ON,          1).              %% 玩家在线
-define(ONLINE_OFF_HOSTING, 2).              %% 玩家离线托管中

%% 玩家加经验类型
% -define(ADD_EXP_NO,             0). %% 无类型
% -define(ADD_EXP_GM,             1). %% GM
% -define(ADD_EXP_TASK,           2). %% 任务
% -define(ADD_EXP_MON,            3). %% 个人杀怪
% -define(ADD_EXP_DUN,            4). %% 副本
% -define(ADD_EXP_TEAM_MON,       5). %% 队伍杀怪
% -define(ADD_EXP_GOODS,          6). %% 物品使用加经验
% -define(ADD_EXP_ONHOOK_OFFLINE, 7). %% 离线挂机
% -define(ADD_EXP_BONFIRE,        8). %% 公会篝火
% -define(ADD_EXP_ONHOOK_ONLINE,  9). %% 在线挂机
% -define(ADD_EXP_GUILD_GUARD,   10). %% 公会守护
% -define(ADD_EXP_RESOURCE_BACK, 11). %% 奖励找回
% -define(ADD_EXP_NOON_QUIZ,     12). %% 中午答题
% -define(ADD_EXP_CHARM_BEACH,   13). %% 魅力海滩
% -define(ADD_EXP_EXPLIBRARY,    14). %% 经验书馆
% -define(ADD_EXP_BUTTERFLY,	   15). %% 捕蝶积分
% -define(ADD_EXP_HUSONG,		   18). %% 护送
% -define(ADD_EXP_TASK_GUILD,	   19). %% 公会任务
% -define(ADD_EXP_TASK_DAILY,	   20). %% 日常任务
%% --------------------------------------

-define(ETS_NODE, ets_node).                                    %% 节点列表
-define(ETS_ROLE_BACK_ID, ets_role_back_id).                    %% 玩家回归邀请id

%% 比较函数
-define (OP (A, Op, B), case Op of
        gt  -> A     >      B;  %% greater than
        lt  -> A     <      B;  %% less than
        eq  -> A    =:=     B;  %% equal
        ge  -> A    >=      B;  %% greater equal
        le  -> A    =<      B;  %% less equal
        _   -> false
    end).

-endif.                     %% COMMON_HRL END

