%%%-------------------------------------------------------------------
%%% @doc     宠物-头文件
%%% Module  : pet
%%% Created : 2019-12-09
%%% @Author : tyl
%%%-------------------------------------------------------------------

-define(PetOpenLv, 134). %% 宠物系统开放等级

-define(REFRESH_THRESHOLD, 100).   %% 排行榜公式替换阀值

%% 宠物生活技能相关增益
-define(PET_LIFE_SKILL_AUTO_DECOMPOSE_EQUIP, 1).    %% 自动分解蓝色品质装备(前端处理)
-define(PET_LIFE_SKILL_ARENA_POWER_ADD, 2).         %% 排位赛战力加成5%
-define(PET_LIFE_SKILL_CONVOY_RE_BACK,  3).         %% 护送双倍找回
-define(PET_LIFE_SKILL_GUILD_ORDER_ADD, 4).         %% 拼单邀请社团助手额外增加20%收益
-define(PET_LIFE_SKILL_ARENA_FAIL_COMPENSATION, 5). %% 排位赛失败不损失奖励
-define(PET_LIFE_SKILL_CONVOY_PROTECT_ADD,  6).     %% 护送庇护次数+1
-define(PET_LIFE_SKILL_EQUIP_RISE_STAR_ADD, 7).     %% 装备进化成功率提升5%
-define(PET_LIFE_SKILL_BEACH_VOTE_ADD,      8).     %% 舞动温泉初始点赞次数+5
-define(PET_LIFE_SKILL_AUTO_DECOMPOSE_WARSOUL, 9).  %% 自动分解3星战魂->供养魂(前端处理)
-define(PET_LIFE_SKILL_ARENA_QUICK_KILL,    10).    %% 排位赛中直接秒杀低排位对手
-define(PET_LIFE_SKILL_CHILD_VOTE_ADD,      11).    %% 宝宝每日给同一玩家点赞次数+1
-define(PET_LIFE_SKILL_GLAMOUR_FUND_ADD,    12).    %% 社团赛马初始资金增加200
-define(PET_LIFE_SKILL_NUCLEON_WASH_FREE,   13).    %% 圣物洗练每日免费一次
-define(PET_LIFE_SKILL_DAILY_HONOUR_ADD,    14).    %% 每日名望券获取上限增加100
-define(PET_LIFE_SKILL_DESERTED_REVIVE_FREE, 15).   %% 每日混乱星域免费复活3次
-define(PET_LIFE_SKILL_GOLD_EXCHANGE_DOUBLE, 16).   %% 彩钻兑换交易券10%概率暴击，收益翻倍
-define(PET_LIFE_SKILL_DUN_EXP_DROP_SUM_TIME,17).   %% 冒险挂机累计时间提高到24小时
-define(PET_LIFE_SKILL_EQUIP_STRENGTH_ADD,   18).   %% 装备强化成功率提升2%
-define(PET_LIFE_SKILL_CAPSULE_EGG_FREE_TIME, 19).  %% 龙神扭蛋免费次数CD减少到12小时
-define(PET_LIFE_SKILL_GOD_SUMMON_FREE,      20).   %% 神座普通召唤每天免费1次
-define(PET_LIFE_SKILL_GALAXY_STORE_REFRESH_FREE, 21). %% 星辰灵市每天免费刷新1次

-define(ACTION_ACTIVE,  1). %% 激活宠物
-define(ACTION_UPGRADE, 2). %% 宠物进化

%% 宝石镶嵌
-define(SKILL_DIAMOND_SLOT_LIST, [1,2,3,4]). %% 技能石槽位列表
-define(PET_DIAMOND_UNLOAD, 0). %% 卸下当前宝石
-define(PET_DIAMOND_INLAY,  1). %% 镶嵌宝石

%% 宠物跟随状态
-define(PET_UNFOLLOW,   0). %% 非跟随状态
-define(PET_FOLLOW,     1). %% 跟随状态

-define(SKILL_SLOT_LIST, [1,2,3,4]).    %% 技能槽位列表
%%-define(LIFE_SKILL,    1).  %% 生活技能
%%-define(PASSIVE_SKILL, 2).  %% (被动)战斗技能
%% 技能天赋类型细分
-define(SKILL_LIFE,   0).   %% 生活技能
-define(SKILL_ATTR,   1).   %% 玩家被动(属性)技能
-define(SKILL_BATTLE, 2).   %% 宠物技能(其实配的也是被动,宠物主战加在玩家身上)

%% 主战位宠物拿战斗技能
-define(PET_BATTLE_SKILL_SLOT, 1).

%% 每天投票次数
-define(DAY_VOTE_PET_COUNT, 3).
%% 战力榜长度
-define(PET_POWER_RANK_LEN, 8).

%% 觉醒需要星级基础
-define(PET_AWAKEN_NEED_STAR, 10).

%% 普通支援加成比例
-define(PET_NORMAL_SUPPORT_RATIO, 0.03).

-define(SUPPORT_TIMES_ENOUGH, 0).  %% 支援次数足够
-define(SUPPORT_TIMES_OVER,   1).  %% 支援次数已经达到上限

-define(PET_SUPPORT_NOT_LOGIN, 0).  %% 还未登录过
-define(PET_SUPPORT_HAS_LOGIN, 1).  %% 已经登录过

%% 宠物Ets表数据
-define(ETS_PET, ets_pet).

-record(ets_role_pets, {
	rid   = 0            %% 玩家Id
	,pets = []           %% 宠物列表[#ets_pet_info{}],与status_pet里的pets不同,只保留部分字段
}).

-record(ets_pet_info, {
	pet_id     = 0       %% 宠物Id
	,pet_star  = 0       %% 宠物星级
	,pet_lv    = 0       %% 宠物等级
	,pet_attr  = 0       %% 宠物属性
	,pet_power = 0       %% 宠物战力
}).

%% 宠物基础数据
-record(status_pet, {
	pets                = []   %% 领养的宠物列表 [#pet_info{}...]
	,follow_pet         = 0    %% 跟随的宠物Id
	,sum_pet_star       = 0    %% 宠物总星级
	,life_skills        = []   %% 生活技能列表       格式:[SkillId1,SkillId2...]
	,passive_skills     = []   %% (被动)战斗技能列表,附加玩家身上 格式:[SkillId1,SkillId2...]
	,battle_skills      = []   %% 宠物战斗技能,主副战宠物         格式:[SkillId1,SkillId2...]
	,attr_list          = []   %% 所有宠物属性列表
	,power              = 0    %% 总战力
	,extra_power        = 0    %% 额外战力，目前有战力提供的额外战力
	,open_support_slots = 0    %% 已经开启的槽位列表
	,support_list       = []   %% 宠物助战槽位 [#pet_support_slot{}...]
	,vote_list          = []   %% 宠物投票[pet_id...]
	,support_times      = 0    %% 当天宠物投票次数,限制在3次以内(为使统计数据尽量准确)
	,receive_pet_list   = []   %% 已领取的昨日投票榜奖励
}).

%% 单只宠物数据
-record(pet_info, {
	pet_id             = 0    %% 宠物Id
	,pet_star          = 0    %% 宠物星级
	,pet_lv            = 0    %% 宠物培养等级
	,pet_exp           = 0    %% 宠物当前培养经验值
	,pet_life_skills   = []   %% 生活技能列表 格式:[SkillId1,SkillId2...]
	,pet_attr_skills   = []   %% 属性技能列表 格式:[SkillId1,SkillId2...]
	,pet_battle_skills = []   %% 战斗技能列表 格式:[SkillId1,SkillId2...]
	,diamond_slots     = []   %% 技能宝石槽位 [{SlotId,GoodsId}...]
	,pet_attr          = []   %% 属性列表
	,pet_power         = 0    %% 战力
	,pet_extra_power   = 0    %% 额外战力,目前有战力技能提供的战力
	,adopt_time        = 0    %% 领养的时间
	,support_add_ratio = 0    %% 宠物助战属性增长比率 万分比的整数部分
	,is_awaken         = 0    %% 是否已觉醒
	,old_power         = 0    %% 前一次刷新的战力(也可以看做历史最高战力)
%%	,pet_support_times = 0    %% 当天宠物全服支援次数
}).

%% 玩家宠物声援槽位数据
-record(pet_support_slot, {
	slot_id            = 0    %% 声援槽位
	,pet_id            = 0    %% 宠物Id
}).

%% 宠物全服战力排名
-record(pet_power_rank_state, {
	rank_info_list          = []   %% 排名信息 [#pet_power_rank_info{}...]
	,yest_rank_info_list    = []   %% 昨天排名信息 [#pet_power_rank_info{}] 只读
	,center_rank_length     = 0    %% 跨服榜单长度(进入跨服后 连接跨服/每天0点更新) 只读
}).

%% 宠物跨服战力排名
-record(pet_power_rank_center_state, {
	rank_info_map          = #{}   %% 排名信息 #{zone=>[#pet_rank_info{}...]}
	,yest_rank_info_map    = #{}   %% 昨天排名信息 #{zone=>[#pet_rank_info{}]} 只读
	,tmp_rank_info_map     = #{}   %% #{zone=>[#pet_rank_info{}...]} 用于存放各个服上报的临时数据(有可能只是部分的服)
	,tmp_up_servers        = #{}   %% #{zone=>[srv_id...]}已经上报的数据的区服(避免重复上报叠加数据)
	,rezone_info_map       = #{}   %% #{old_zone=>[stage,new_zone]...} 当天重新分区数据，只存内存，4点结算时删除
}).

%% 游戏服上报跨服数据结构
-record(up_pet_info, {
	pet_id             = 0    %% 宠物Id
	,player_id         = 0    %% 玩家Id
	,sex               = 0    %% 玩家性别
	,player_name       = ""   %% 玩家名称
	,player_power      = 0    %% 玩家战力
	,vip               = 0
	,sup_vip           = 0
	,dress_id          = 0
	,photo_id          = 0
	,server_id         = 0    %% 服务器Id(跨服使用)
	,server_num        = 0    %% 服务器Num(跨服使用)
	,sum_power         = 0    %% 总战力
}).

%% 宠物排名信息(old: 已废弃逻辑)
-record(pet_rank_info, {
	rank               = 0    %% 排名(如果是今天排行为0,由前端自行排序)
	,pet_id            = 0    %% 宠物Id
	,player_id         = 0    %% 玩家Id
	,player_name       = ""   %% 玩家名称
	,player_power      = 0    %% 玩家战力
	,support_count     = 0    %% 支援人数
	,support_ratio     = 0    %% 声援率 万分比的整数部分
}).

%% 游戏服宠物战力榜
-record(pet_power_rank_info, {
	rank               = 0    %% 排名
	,pet_id            = 0    %% 宠物Id
	,player_id         = 0    %% 玩家Id
	,pet_power         = 0    %% 宠物战力(游戏服使用)
	,sex               = 0    %% 玩家性别
	,player_name       = ""   %% 玩家名称
	,player_power      = 0    %% 玩家战力
	,vip               = 0
	,sup_vip           = 0
	,dress_id          = 0
	,photo_id          = 0
	,server_id         = 0    %% 最高战力玩家服务器Id(跨服使用)
	,server_num        = 0    %% 最高战力玩家服务器Num(跨服使用)
	,sum_power         = 0    %% 总战力
}).

%% ==================================== 后台配置 ===========================
%% 宠物基础配置表
-record(pet_cfg, {
	pet_id         = 0      %% 宠物Id
	,pet_name      = ""     %% 宠物名称
	,pet_star      = 0      %% 星级
	,rare_degree   = 0      %% 稀有度 1,普通 2,稀有 3,极品
	,color         = 0      %% 品质色
	,pet_race      = 0      %% 宠物种族
	,attr_list     = 0      %% 成长属性
	,is_native_pet = 0      %% 是否原始宠物
	,cost          = []     %% 激活和进化碎片需求
	,figure_id     = 0      %% 形象资源Id
	,illus_range   = 0      %% 图鉴序列
	,open_day      = 0      %% 开启天数
	,open_time     = 0      %% 开启时间
}).

%% 宠物升级配置表
-record(pet_grow_up_cfg, {
	pet_rare_degree = 0     %% 宠物稀有度(同稀有度升级逻辑相同)
	,level          = 0     %% 等级
	,need_exp       = 0     %% 升级需要经验值
}).

%% 种族经验道具表
-record(pet_race_material_cfg, {
	race            = 0     %% 种族
	,cost_material  = []    %% 消耗材料
}).

%% 宠物故事配置表
-record(pet_story_cfg, {
	pet_id    = 0           %% 宠物Id
	,para_id  = 0           %% 段落Id
	,star     = 0           %% 需求星级
	,title    = ""          %% 正文标题
	,content  = ""          %% 正文内容
}).

%% 宠物技能配置表
-record(pet_skill_cfg, {
	pet_id             = 0    %% 宠物Id
	,skill_slot        = 0    %% 槽位
	,skill_talent_type = 0    %% 天赋类别
	,skill_talent_id   = 0    %% 天赋Id
	,skill_ratio       = 0    %% 技能系数(生活技能),战斗技能系数默认为0
	,name              = ""   %% 技能名称
	,desc              = ""   %% 技能描述
	,active_star       = 0    %% 开放星级
}).

%% 宠物宝石栏配置表
-record(pet_diamond_storage_cfg, {
	diamond_id     = 0      %% 宝石Id
	,diamond_type  = ""     %% 宝石类型
	,need_race     = 0      %% 对应种族
	,add_attr_list = []     %% 属性加成列表
	,diamond_name  = ""     %% 宝石名称
	,diamond_desc  = ""     %% 宝石效果描述
}).

%% 宠物声援阵位配置表
-record(pet_support_slot_cfg, {
	slot_id         = 0     %% 声援阵位
	,attr_add_ratio = 0     %% 宠物属性加成比例
	,open_sum_star  = 0     %% 开放总星级(所有宠物累计星级)
}).

%% 宠物人气榜配置表
-record(pet_support_rank_cfg, {
	rank            = 0     %% 排名
	,top_designation= 0     %% 头名玩家称号
	,server_reward  = []    %% 全服奖励
	,pet_expression = ""    %% 宠物随机发言
}).

%% 宠物觉醒配置表
-record(pet_awaken_cfg, {
	pet_id          = 0     %% 宠物Id
	,need_star      = 0     %% 需求星级
	,cost_material  = []    %% 需求材料
	,add_attr       = []    %% 属性加成
	,skill_list     = []    %% 技能替换
}).

%% 宠物宝石合成配置表
-record(pet_stone_compound_cfg, {
	stone_id        = 0     %% 宠物技能石Id
	,compound_list  = []    %% 合成列表
}).

%% 常量配置(直接后台生成配置，这里不配格式了)

%% ============================= 数据库操作 ==================================
%% 宠物基础信息
-define(SQL_INSERT_PET, <<"REPLACE INTO role_pet (`role_id`, `pet_id`, `pet_star`, `pet_lv`, `pet_exp`, `adopt_time`,`is_awaken`, `old_power`)
							VALUES (~p, ~p, ~p, ~p, ~p, ~p, ~p, ~p)">>).
-define(SQL_SELECT_PET, <<"SELECT `pet_id`, `pet_star`, `pet_lv`, `pet_exp`, `adopt_time`, `is_awaken`, `old_power` FROM role_pet WHERE `role_id` = ~p">>).

%% 宠物培养
-define(SQL_UPDATE_PET, <<"UPDATE role_pet SET `pet_star` = ~p WHERE `role_id` = ~p and `pet_id` = ~p">>).
-define(SQL_UPDATE_PET_LV, <<"UPDATE role_pet SET `pet_lv` = ~p, `pet_exp` = ~p WHERE `role_id` = ~p and `pet_id` = ~p">>).
-define(SQL_UPDATE_PET_AWAKEN, <<"UPDATE role_pet SET `is_awaken` = 1 WHERE `role_id` = ~p and `pet_id` = ~p">>).
-define(SQL_UPDATE_PET_POWER, <<"UPDATE role_pet SET `old_power` = ~p WHERE `role_id` = ~p and `pet_id` = ~p">>).

%% 宠物技能相关
-define(SQL_SAVE_PET_SKILL_DIAMOND, <<"REPLACE INTO pet_skill_diamond (`role_id`, `pet_id`, `diamond_slot`, `diamond_id`) VALUES (~p, ~p, ~p, ~p)">>).
-define(SQL_SELECT_PET_SKILL_DIAMOND, <<"SELECT `diamond_slot`, `diamond_id` FROM pet_skill_diamond WHERE `role_id` = ~p AND `pet_id` = ~p">>).
%%-define(SQL_DELETE_PET_SKILL_DIAMOND, <<"DELETE FROM pet_skill_diamond WHERE `role_id` = ~p and `pet_id` = ~p and `diamond_slot` = ~p">>).
-define(SQL_UPDATE_PET_SKILL_DIAMOND, <<"REPLACE INTO pet_skill_diamond (`role_id`, `pet_id`, `diamond_slot`, `diamond_id`) VALUES (~p, ~p, ~p, ~p)">>).

%% 宠物助战
-define(SQL_SAVE_PET_SUPPORT_INFO, <<"REPLACE INTO pet_support_info (`role_id`, `slot_id`, `pet_id`, `time`) VALUES (~p, ~p, ~p, ~p)">>).
-define(SQL_SELECT_PET_SUPPORT_INFO, <<"SELECT `slot_id`, `pet_id` FROM pet_support_info WHERE `role_id` = ~p">>).
-define(SQL_UPDATE_PET_SUPPORT_PET, <<"UPDATE pet_support_info SET `pet_id` = ~p, `time` = ~p WHERE `role_id` = ~p AND `slot_id` = ~p">>).
-define(SQL_UPDATE_PET_SUPPORT_SLOT, <<"UPDATE pet_support_info SET `slot_id` = ~p, `time` = ~p WHERE `role_id` = ~p AND `pet_id` = ~p">>).
-define(SQL_BATCH_SAVE_PET_SUPPORT_SLOT, <<"REPLACE INTO pet_support_info (`role_id`, `slot_id`, `pet_id`, `time`) VALUES ~ts">>).
-define(SQL_BATCH_SAVE_PET_SUPPORT_SLOT_VALUE, <<"(~p, ~p, ~p, ~p)">>).

%% 宠物投票排行
-define(SQL_SAVE_PET_SUPPORT_RANK, <<"REPLACE INTO pet_support_rank (`pet_id`, `role_id`, `support_count`, `yest_role_id`, `yest_support_count`, `time`) VALUES (~p, ~p, ~p, ~p, ~p, ~p)">>).
-define(SQL_SELECT_PET_SUPPORT_RANK, <<"SELECT `pet_id`, `role_id`, `support_count` FROM pet_support_rank">>).
-define(SQL_SELECT_PET_SUPPORT_OLD_RANK, <<"SELECT `pet_id`, `yest_role_id`, `yest_support_count` FROM pet_support_rank">>).
-define(SQL_UPDATE_PET_SUPPORT_COUNT, <<"UPDATE pet_support_rank SET `role_id` = ~p, `support_count` = ~p WHERE `pet_id` = ~p">>).
-define(SQL_UPDATE_PET_SUPPORT_RANK_INFO, <<"UPDATE pet_support_rank SET `role_id` = ~p, `support_count` = ~p, `yest_role_id` = ~p, `yest_support_count` = ~p WHERE `pet_id` = ~p">>).
-define(SQL_UPDATE_PET_SUPPORT_RANK_POWER, <<"UPDATE pet_support_rank SET `role_id` = ~p WHERE `pet_id` = ~p">>).

%% 宠物战力排行
-define(SQL_SAVE_PET_POWER_RANK, <<"REPLACE INTO pet_power_rank (`pet_id`, `role_id`, `role_pet_power`, `sum_power`, `yest_role_id`, `yest_sum_power`, `time`) VALUES (~p, ~p, ~p, ~p, ~p, ~p, ~p)">>).
-define(SQL_SELECT_PET_POWER_RANK, <<"SELECT `pet_id`, `role_id`, `role_pet_power`, `sum_power` FROM pet_power_rank">>).
-define(SQL_SELECT_PET_POWER_OLD_RANK, <<"SELECT `pet_id`, `yest_role_id`, `yest_sum_power` FROM pet_power_rank">>).
-define(SQL_UPDATE_PET_POWER_RANK_POWER, <<"UPDATE pet_power_rank SET `role_id` = ~p, `sum_power` = ~p WHERE `pet_id` = ~p">>).
-define(SQL_UPDATE_PET_POWER_RANK_INFO, <<"UPDATE pet_power_rank SET `yest_role_id` = ~p, `yest_sum_power` = ~p WHERE `pet_id` = ~p">>).
-define(SQL_UPDATE_PET_POWER_RANK_ROLE, <<"UPDATE pet_power_rank SET `role_id` = ~p WHERE `pet_id` = ~p">>).

%% 宠物战力跨服排行(只需要记录昨日的数据，今天数据由游戏服上报)
-define(SQL_SAVE_PET_POWER_CENTER_RANK, <<"REPLACE INTO pet_power_center_rank (`zone_id`, `pet_id`, `role_id`,`sex`, `role_name`, `server_num`, `vip`, `sup_vip`, `dress_id`, `photo_id`, `sum_power`, `time`) VALUES ~ts">>).
-define(SQL_SAVE_PET_POWER_CENTER_RANK_VALUE, <<"(~p, ~p, ~p, ~p, '~ts', ~p, ~p, ~p, ~p, ~p, ~p, ~p)">>).
-define(SQL_SELECT_PET_POWER_CENTER_RANK, <<"SELECT `zone_id`, `pet_id`, `role_id`, `sex`, `role_name`, `server_num`, `vip`, `sup_vip`, `dress_id`, `photo_id`, `sum_power` FROM pet_power_center_rank">>).

%% 玩家宠物投票数据：投票次数,宠物列表,领取奖励列表
-define(SQL_SAVE_PET_VOTE_INFO, <<"REPLACE INTO pet_vote_info (`role_id`, `vote_count`, `pet_list`, `receive_pet_list`) VALUES (~p, ~p, '~ts', '~ts')">>).
-define(SQL_SELECT_PET_VOTE_INFO, <<"SELECT `vote_count`, `pet_list`, `receive_pet_list` FROM pet_vote_info WHERE `role_id` = ~p">>).
-define(SQL_UPDATE_PET_VOTE_COUNT, <<"UPDATE pet_vote_info SET `vote_count` = ~p, `pet_list` = '~ts' WHERE `role_id` = ~p">>).
-define(SQL_UPDATE_PET_VOTE_RECEIVE_LIST, <<"UPDATE pet_vote_info SET `receive_pet_list` = '~ts' WHERE `role_id` = ~p">>).
-define(SQL_DELETE_PET_VOTE_INFO, <<"TRUNCATE table pet_vote_info">>).
