源战役客户端
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1758 lines
50 KiB

  1. PetModel = PetModel or BaseClass(BaseVo, true)
  2. local PetModel = PetModel
  3. function PetModel:__init()
  4. PetModel.Instance = self
  5. self:Reset()
  6. end
  7. function PetModel:Reset()
  8. self.pet_cfg = {} --宠物基础配置信息
  9. self.pet_upgrade_cfg = {} --宠物升级配置信息
  10. self.pet_story_cfg = {} --宠物故事配置信息
  11. self.pet_skill_cfg = {} --宠物技能配置信息
  12. self.pet_life_skill_cfg = {} --宠物生活技能配置
  13. self.pet_diamond_cfg = {} --宠物宝石配置信息
  14. self.pet_support_slot_cfg = {} --宠物声援槽位配置信息
  15. self.pet_support_rank_cfg = {} --宠物声援排名配置信息
  16. self.pet_cfg_rare = {} --宠物基础配置信息(根据稀有度获取)
  17. self.pet_awake_cfg = {} --宠物觉醒配置
  18. self.pet_diamond_compose_cfg = {} --宠物宝石合成配置
  19. self.pet_upgrade_cfg_max_lv = {} --某稀有度下的宠物的最大等级配置
  20. self.follow_pet = 0 --跟随宠物的id
  21. self.pet_list = {} --自己的宠物列表
  22. self.pet_skill_list = {} --宠物技能列表
  23. self.pet_diamond_list = {} --宠物宝石列表
  24. self.pet_support_list = {} --宠物声援信息
  25. self.pet_support_list.pet_list = {}
  26. self.pet_support_rank_list ={} --全服宠物声援信息(排行榜前十位)
  27. self.pet_vote_data = {}
  28. self.my_left_vote_times = 0--剩余的投票次数
  29. self.max_vote_times = 3 --最大的投票次数
  30. self.my_vote_data = {} --投票信息
  31. self.select_collect_item_id = 0 --当前选中的图鉴itemid
  32. self.select_item_id = 0 --当前选中的itemid
  33. self.pet_rank_reward_data = {} --昨日榜领奖数据
  34. self.upgrade_cost_cfg = {} --宠物升级消耗道具配置
  35. self.share_cd = 0
  36. self.share_cd2 = 0
  37. self.pet_red_dot_info = {} --红点数据
  38. self.single_pet_feed_red_info = {} --单个宠物的升级红点
  39. self.single_pet_evolve_red_info = {} --单个宠物的进化红点
  40. self.single_pet_active_red_info = {} --单个宠物的激活红点
  41. self.single_pet_rare_active_red_info = {} --单个宠物类型的激活红点(稀有度)
  42. self.pet_awake_red = {}--觉醒红点
  43. self.pet_vote_red = false--投票次数红点
  44. self.pet_vote_reward_red = false--领奖红点
  45. self.diamond_compose_red = {}--宝石合成红点列表
  46. self.pet_rank_data_num = 0--当前宠物声援榜单的上榜数量
  47. self.single_pet_diamond_red_info = {} --单个宠物的宝石红点
  48. self.single_pet_slot_diamond_red_info = {} --单个宠物槽位上的红点
  49. self.need_update_collect_item = nil
  50. self.pet_cfg_by_id = {}
  51. self:SetPetCfg()
  52. self:SetPetRaceMaterial()
  53. self:SetPetUpgradeCfg()
  54. self:SetPetStoryCfg()
  55. self:SetPetSkillCfg()
  56. self:SetPetDiamondCfg()
  57. self:SetPetSupportSlotCfg()
  58. self:SetPetSupportRankCfg()
  59. self:SetPetAwakeCfg()
  60. self:SetPetDiamondComposeCfg()
  61. end
  62. function PetModel.getInstance()
  63. if PetModel.Instance == nil then
  64. PetModel.Instance = PetModel.New()
  65. end
  66. return PetModel.Instance
  67. end
  68. ----------------------------------------------配置的获取------START
  69. --设置宠物基础配置信息
  70. function PetModel:SetPetCfg()
  71. --先初始化一下稀有度配置table
  72. self.pet_cfg_rare[1] = {}
  73. self.pet_cfg_rare[2] = {}
  74. self.pet_cfg_rare[3] = {}
  75. --将某id的宠物存一下
  76. self.pet_cfg_by_id = {}
  77. for k,v in pairs(Config.Pet) do
  78. --设置总配置pet_cfg
  79. local index = v.pet_id.."@"..v.pet_star
  80. if not self.pet_cfg[index] then
  81. self.pet_cfg[index] = {}
  82. end
  83. self.pet_cfg[index] = v
  84. self.pet_cfg_by_id[v.pet_id] = self.pet_cfg_by_id[v.pet_id] or {}
  85. self.pet_cfg_by_id[v.pet_id][#self.pet_cfg_by_id[v.pet_id]+1] = v
  86. --设置稀有度配置pet_cfg_rare
  87. if v.rare_degree == 1 then
  88. if v.pet_star == 1 then
  89. table.insert(self.pet_cfg_rare[1],v)
  90. end
  91. elseif v.rare_degree == 2 then
  92. if v.pet_star == 1 then
  93. table.insert(self.pet_cfg_rare[2],v)
  94. end
  95. elseif v.rare_degree == 3 then
  96. if v.pet_star == 1 then
  97. table.insert(self.pet_cfg_rare[3],v)
  98. end
  99. end
  100. end
  101. for k,v in pairs(self.pet_cfg_by_id) do
  102. local function onSortFunction(v1, v2)
  103. return v1.pet_star < v2.pet_star
  104. end
  105. table.sort(v, onSortFunction)
  106. end
  107. end
  108. --根据宠物id拿到配置列表
  109. function PetModel:GetPetCfgById(pet_id)
  110. return self.pet_cfg_by_id[pet_id] and self.pet_cfg_by_id[pet_id] or {}
  111. end
  112. --宠物的最大星数
  113. function PetModel:GetPetMaxStar(pet_id)
  114. if self.pet_cfg_by_id[pet_id] then
  115. return #self.pet_cfg_by_id[pet_id]
  116. else
  117. return 0
  118. end
  119. end
  120. --判断宠物几星能解锁到这个阶段 1 2 3
  121. function PetModel:GetStarCanUnlockFigure(pet_id,figure_stage)
  122. local pet_cfg = self.pet_cfg_by_id[pet_id]
  123. if pet_cfg then
  124. local change_times = 0
  125. local original_figure_id = 0
  126. for i,v in ipairs(pet_cfg) do
  127. if v.figure_id ~= original_figure_id then
  128. change_times = change_times + 1
  129. if change_times == figure_stage then
  130. return v.pet_star
  131. end
  132. end
  133. original_figure_id = v.figure_id
  134. end
  135. else
  136. return 0
  137. end
  138. end
  139. --用当前星数判断是否会进化到下一阶
  140. function PetModel:CanPetGradeToNextStage(now_star)
  141. if now_star%5 == 0 then
  142. return true
  143. else
  144. return false
  145. end
  146. end
  147. --根据资源id判断是不是宠物资源
  148. function PetModel:IsPetFigureId(figure_id)
  149. for k,v in pairs(self.pet_cfg) do
  150. if v.figure_id == figure_id then
  151. return true
  152. end
  153. end
  154. return false
  155. end
  156. function PetModel:GetNowPetFigure( )
  157. local follow_pet_data = self:GetPetListById(self.follow_pet)
  158. if follow_pet_data then
  159. local pet_cfg = self:GetPetCfg(follow_pet_data.pet_id, follow_pet_data.pet_star)
  160. if pet_cfg then
  161. return pet_cfg.figure_id
  162. end
  163. end
  164. return nil
  165. end
  166. --根据宠物id pet_id、 宠物星级 pet_star查找相应宠物配置
  167. function PetModel:GetPetCfg(pet_id, pet_star)
  168. for k,v in pairs(self.pet_cfg) do
  169. if v.pet_id == pet_id and v.pet_star == pet_star then
  170. return v
  171. end
  172. end
  173. return nil
  174. end
  175. --根据稀有度获取宠物配置信息
  176. function PetModel:GetPetRareCfg(rare_type)
  177. local pet_all_cfg = {}
  178. for k,v in pairs(self.pet_cfg_rare[rare_type]) do
  179. local is_have = self:GetPetListById(v.pet_id)
  180. v.is_have = is_have and 1 or 2
  181. if self:CanShowPet(v.pet_id) then
  182. table.insert(pet_all_cfg,v)
  183. end
  184. end
  185. local arg = {"is_have", "pet_id"}
  186. local condition = {Array.LOWER, Array.LOWER}
  187. SortTools.MoreKeysSorter(pet_all_cfg, arg, condition)
  188. return pet_all_cfg
  189. end
  190. --排序所有宠物(图鉴)
  191. function PetModel:GetPetBySort( )
  192. local pet_all_cfg = {}
  193. for k,v in pairs(self.pet_cfg_rare) do
  194. for kk,vv in pairs(v) do
  195. local is_have = self:GetPetListById(vv.pet_id)
  196. vv.is_have = is_have and 1 or 2
  197. if self:CanShowPet(vv.pet_id) then
  198. table.insert(pet_all_cfg,vv)
  199. end
  200. end
  201. end
  202. local arg = {"is_have", "rare_degree", "pet_id"}
  203. local condition = {Array.LOWER, Array.UPPER, Array.LOWER}
  204. SortTools.MoreKeysSorter(pet_all_cfg, arg, condition)
  205. return pet_all_cfg
  206. end
  207. --该宠物是否符合开放时间
  208. function PetModel:CanShowPet(pet_id)
  209. local pet_cfg = self:GetPetCfg(pet_id,1)
  210. if not pet_cfg then return false end
  211. local is_pet_active = self:IsPetActived(pet_id)
  212. --如果都已经激活了那就无视开放时间
  213. if is_pet_active then return true end
  214. --未达到开放天数
  215. if pet_cfg.open_day > 0 and ServerTimeModel:getInstance():GetOpenServerDay() <= pet_cfg.open_day then return false end
  216. --未到开放时间
  217. if pet_cfg.open_time > 0 and TimeUtil:getServerTime() <= pet_cfg.open_time then return false end
  218. return true
  219. end
  220. --根据宠物id获取该宠物的种族
  221. function PetModel:GetPetRaceById(pet_id)
  222. for k,v in pairs(self.pet_cfg) do
  223. if v.pet_id == pet_id then
  224. return v.pet_race
  225. end
  226. end
  227. return 1
  228. end
  229. --根据id获取宠物的品质
  230. function PetModel:GetPetDegreeById(pet_id)
  231. for k,v in pairs(self.pet_cfg) do
  232. if v.pet_id == pet_id then
  233. return v.rare_degree
  234. end
  235. end
  236. return 1
  237. end
  238. --判断宠物的某个故事是否解锁
  239. function PetModel:IsStoryActived(pet_id,item_id)
  240. local data = self:GetPetListById(pet_id)
  241. local story_cfg = self:GetPetStoryCfg(pet_id,item_id)
  242. --判断是否已经解锁
  243. local is_actived = false
  244. if data then
  245. if data.pet_star >= story_cfg.star then
  246. is_actived = true
  247. else
  248. is_actived = false
  249. end
  250. end
  251. return is_actived
  252. end
  253. --判断宠物已经解锁到哪个故事了
  254. function PetModel:GetTheActiveStoryId(pet_id)
  255. local final_index = 0
  256. for i=1,3 do
  257. if self:IsStoryActived(pet_id,i) then
  258. final_index = final_index + 1
  259. else
  260. break
  261. end
  262. end
  263. return final_index
  264. end
  265. --设置不同种族的宠物升级消耗材料信息
  266. function PetModel:SetPetRaceMaterial( )
  267. self.upgrade_cost_cfg = {}
  268. for i,v in ipairs(Config.Petracematerial) do
  269. self.upgrade_cost_cfg[i] = {}
  270. self.upgrade_cost_cfg[i].race = v.race
  271. self.upgrade_cost_cfg[i].cost_material = stringtotable(v.cost_material)
  272. end
  273. end
  274. --设置宠物升级配置信息
  275. function PetModel:SetPetUpgradeCfg()
  276. for k,v in pairs(Config.Petupgrade) do
  277. local index = v.pet_rare_degree.."@"..v.level
  278. if not self.pet_upgrade_cfg[index] then
  279. self.pet_upgrade_cfg[index] = {}
  280. end
  281. self.pet_upgrade_cfg[index] = v
  282. --记录稀有度下的宠物的最大等级
  283. if not self.pet_upgrade_cfg_max_lv[v.pet_rare_degree] then
  284. self.pet_upgrade_cfg_max_lv[v.pet_rare_degree] = {}
  285. self.pet_upgrade_cfg_max_lv[v.pet_rare_degree].level = 0
  286. end
  287. if v.level > self.pet_upgrade_cfg_max_lv[v.pet_rare_degree].level then
  288. self.pet_upgrade_cfg_max_lv[v.pet_rare_degree].level = v.level
  289. end
  290. end
  291. end
  292. --根据稀有度 pet_rare_degree、等级level查找
  293. function PetModel:GetPetUpgradeCfg(pet_rare_degree,level)
  294. for k,v in pairs(self.pet_upgrade_cfg) do
  295. if v.pet_rare_degree == pet_rare_degree and v.level == level then
  296. return v
  297. end
  298. end
  299. return nil
  300. end
  301. --获取某稀有度宠物的最大等级
  302. function PetModel:GetPetMaxLv(pet_rare_degree)
  303. return self.pet_upgrade_cfg_max_lv[pet_rare_degree].level
  304. end
  305. --设置宠物故事配置表
  306. function PetModel:SetPetStoryCfg()
  307. for k,v in pairs(Config.Petstory) do
  308. local index = v.pet_id.."@"..v.para_id
  309. if not self.pet_story_cfg[index] then
  310. self.pet_story_cfg[index] = {}
  311. end
  312. self.pet_story_cfg[index] = v
  313. end
  314. end
  315. --根据宠物id和段落id查找
  316. function PetModel:GetPetStoryCfg(pet_id,para_id)
  317. for k,v in pairs(self.pet_story_cfg) do
  318. if v.pet_id == pet_id and v.para_id == para_id then
  319. return v
  320. end
  321. end
  322. return nil
  323. end
  324. --设置宠物技能配置表
  325. function PetModel:SetPetSkillCfg()
  326. for k,v in pairs(Config.Petskill) do
  327. local index = v.pet_id.."@"..v.skill_slot
  328. if not self.pet_skill_cfg[index] then
  329. self.pet_skill_cfg[index] = {}
  330. end
  331. self.pet_skill_cfg[index] = v
  332. --宠物生活技能
  333. if v.skill_talent_type == 0 then
  334. self.pet_life_skill_cfg[v.skill_talent_id] = v
  335. end
  336. end
  337. end
  338. --获取宠物生活配置
  339. function PetModel:GetPetLifeSkillCfgById(skill_id)
  340. return self.pet_life_skill_cfg[skill_id] and self.pet_life_skill_cfg[skill_id] or nil
  341. end
  342. --获取宠物生活配置系数
  343. function PetModel:GetPetLifeSkillRatio(skill_id)
  344. return self.pet_life_skill_cfg[skill_id] and self.pet_life_skill_cfg[skill_id].skill_ratio or 0
  345. end
  346. --根据宠物id和槽位查找
  347. function PetModel:GetPetSkillCfg(pet_id,skill_slot,is_awaken)
  348. local skill_data = {}
  349. for k,v in pairs(self.pet_skill_cfg) do
  350. if v.pet_id == pet_id and v.skill_slot == skill_slot then
  351. skill_data = DeepCopy(v)
  352. if is_awaken then
  353. local awake_cfg = self:GetPetAwakeCfg(pet_id)
  354. local awake_skill_id = awake_cfg and stringtotable(awake_cfg.skill_list)[skill_slot-1] or nil
  355. if awake_skill_id then
  356. skill_data.skill_talent_id = awake_skill_id
  357. end
  358. end
  359. return skill_data
  360. end
  361. end
  362. return nil
  363. end
  364. --设置宠物宝石配置表
  365. function PetModel:SetPetDiamondCfg()
  366. for k,v in pairs(Config.Petdiamondstorage) do
  367. local index = v.diamond_id
  368. if not self.pet_diamond_cfg[index] then
  369. self.pet_diamond_cfg[index] = {}
  370. end
  371. self.pet_diamond_cfg[index] = v
  372. end
  373. end
  374. --根据宝石id查找
  375. function PetModel:GetPetDiamondCfg(diamond_id)
  376. for k,v in pairs(self.pet_diamond_cfg) do
  377. if v.diamond_id == diamond_id then
  378. return v
  379. end
  380. end
  381. return nil
  382. end
  383. --设置宠物声援槽位配置信息
  384. function PetModel:SetPetSupportSlotCfg()
  385. for k,v in pairs(Config.Petsupportslot) do
  386. local index = v.slot_id
  387. if not self.pet_support_slot_cfg[index] then
  388. self.pet_support_slot_cfg[index] = {}
  389. end
  390. self.pet_support_slot_cfg[index] = v
  391. end
  392. end
  393. --根据槽位id查找
  394. function PetModel:GetPetSupportSlotCfg(slot_id)
  395. for k,v in pairs(self.pet_support_slot_cfg) do
  396. if v.slot_id == slot_id then
  397. return v
  398. end
  399. end
  400. return nil
  401. end
  402. --设置宠物声援排名配置信息
  403. function PetModel:SetPetSupportRankCfg()
  404. for k,v in pairs(Config.Petsupportrank) do
  405. local index = v.rank
  406. if not self.pet_support_rank_cfg[index] then
  407. self.pet_support_rank_cfg[index] = {}
  408. end
  409. self.pet_support_rank_cfg[index] = v
  410. end
  411. end
  412. --根据排名id查找
  413. function PetModel:GetPetSupportRankCfg(rank)
  414. for k,v in pairs(self.pet_support_rank_cfg) do
  415. if v.rank == rank then
  416. return v
  417. end
  418. end
  419. return nil
  420. end
  421. --宠物觉醒配置
  422. function PetModel:SetPetAwakeCfg( )
  423. self.pet_awake_cfg = DeepCopy(Config.Petawaken)
  424. end
  425. --获取宠物觉醒配置
  426. function PetModel:GetPetAwakeCfg(pet_id)
  427. return self.pet_awake_cfg[pet_id]
  428. end
  429. --宠物宝石合成配置
  430. function PetModel:SetPetDiamondComposeCfg( )
  431. for k,v in pairs(Config.Petstonecompound) do
  432. local diamond_cfg = self:GetPetDiamondCfg(v.stone_id)
  433. if diamond_cfg then
  434. v.need_race = diamond_cfg.need_race
  435. v.diamond_type = diamond_cfg.diamond_type
  436. local goods_vo = GoodsModel:getInstance():GetGoodsBasicByTypeId(v.stone_id)
  437. v.color = goods_vo.color
  438. self.pet_diamond_compose_cfg[v.need_race] = self.pet_diamond_compose_cfg[v.need_race] or {}
  439. table.insert(self.pet_diamond_compose_cfg[v.need_race],v)
  440. end
  441. end
  442. for k,v in pairs(self.pet_diamond_compose_cfg) do
  443. local arg = {"diamond_type", "color", "stone_id"}
  444. local condition = {Array.UPPER, Array.LOWER, Array.LOWER}
  445. SortTools.MoreKeysSorter(v, arg, condition)
  446. end
  447. end
  448. function PetModel:GetPetDiamondComposeCfgByRace(race)
  449. return self.pet_diamond_compose_cfg[race] and self.pet_diamond_compose_cfg[race] or {}
  450. end
  451. ----------------------------------------------配置的获取------END
  452. --设置宠物列表,16301
  453. function PetModel:SetPetList(vo)
  454. self.follow_pet = vo.follow_pet
  455. for k,v in pairs(vo.pet_list) do
  456. if not self.pet_list[v.pet_id] then
  457. self.pet_list[v.pet_id] = {}
  458. end
  459. self.pet_list[v.pet_id].pet_id = v.pet_id
  460. self.pet_list[v.pet_id].pet_star = v.pet_star
  461. ------原有的stage去除,改为5星一个stage
  462. self.pet_list[v.pet_id].pet_stage = math.ceil((v.pet_star-0.5)/5)
  463. -------------------------------------
  464. self.pet_list[v.pet_id].pet_lv = v.pet_lv
  465. self.pet_list[v.pet_id].now_exp = v.now_exp
  466. self.pet_list[v.pet_id].power = v.power
  467. self.pet_list[v.pet_id].collect_time = v.collect_time
  468. self.pet_list[v.pet_id].attr_list = v.attr_list
  469. self.pet_list[v.pet_id].is_awaken = v.is_awaken
  470. end
  471. end
  472. --16303协议激活宠物后先创建该id的列表
  473. function PetModel:ActivePet(vo)
  474. self.pet_list[vo.pet_id] = self.pet_list[vo.pet_id] or {}
  475. self.pet_list[vo.pet_id].pet_id = vo.pet_id
  476. self.pet_list[vo.pet_id].pet_star = vo.pet_star
  477. ------原有的stage去除,改为5星一个stage
  478. self.pet_list[vo.pet_id].pet_stage = math.ceil((vo.pet_star-0.5)/5)
  479. -------------------------------------
  480. self.pet_list[vo.pet_id].power = vo.pet_power
  481. self.pet_list[vo.pet_id].pet_lv = 1
  482. end
  483. --根据id获取宠物信息
  484. function PetModel:GetPetListById(pet_id)
  485. if self.pet_list[pet_id] then
  486. return self.pet_list[pet_id]
  487. end
  488. return nil
  489. end
  490. --获取排好序的宠物列表
  491. function PetModel:GetPetListAfterSort()
  492. local list = self.pet_list
  493. for k,v in pairs(list) do
  494. v.rare_degree = self:GetPetDegreeById(v.pet_id)
  495. end
  496. local final_list = {}
  497. for k,v in pairs(list) do
  498. table.insert(final_list,v)
  499. end
  500. local arg = {"rare_degree", "pet_star", "pet_lv"}
  501. local condition = {Array.UPPER, Array.UPPER, Array.LOWER,}
  502. SortTools.MoreKeysSorter(final_list, arg, condition)
  503. return final_list
  504. end
  505. --根据战力给宠物列表排序(宠物副本用)
  506. function PetModel:GetPetListAfterSortFight( )
  507. local final_list = {}
  508. for k,v in pairs(self.pet_list) do
  509. v.client_power = self:GetPetFightById(v.pet_id)
  510. table.insert(final_list,v)
  511. end
  512. local arg = {"client_power"}
  513. local condition = {Array.UPPER}
  514. SortTools.MoreKeysSorter(final_list, arg, condition)
  515. return final_list
  516. end
  517. --根据品质等级给宠物列表排序
  518. function PetModel:GetPetListAfterSortByDegreeAndLv( )
  519. local list = self.pet_list
  520. for k,v in pairs(list) do
  521. v.rare_degree = self:GetPetDegreeById(v.pet_id)
  522. end
  523. local final_list = {}
  524. for k,v in pairs(list) do
  525. table.insert(final_list,v)
  526. end
  527. local arg = {"rare_degree", "pet_lv"}
  528. local condition = {Array.UPPER, Array.UPPER,}
  529. SortTools.MoreKeysSorter(final_list, arg, condition)
  530. return final_list
  531. end
  532. --喂养宠物后刷新其经验和等级,16302
  533. function PetModel:SetPetLvAfterFeed(vo)
  534. if self.pet_list[vo.pet_id] then
  535. self.pet_list[vo.pet_id].pet_lv = vo.pet_lv
  536. self.pet_list[vo.pet_id].now_exp = vo.now_exp
  537. self.pet_list[vo.pet_id].power = vo.pet_power
  538. end
  539. end
  540. --宠物进阶后刷新其数据,16303
  541. function PetModel:SetPetDataAfterUpStar(vo)
  542. if self.pet_list[vo.pet_id] then
  543. self.pet_list[vo.pet_id].pet_stage = vo.pet_stage
  544. self.pet_list[vo.pet_id].pet_star = vo.pet_star
  545. ------原有的stage去除,改为5星一个stage
  546. self.pet_list[vo.pet_id].pet_stage = math.ceil((vo.pet_star-0.5)/5)
  547. -------------------------------------
  548. self.pet_list[vo.pet_id].power = vo.pet_power
  549. end
  550. end
  551. --设置宠物的技能栏数据,16304
  552. function PetModel:SetPetSkillData(vo)
  553. if not self.pet_skill_list[vo.pet_id] then
  554. self.pet_skill_list[vo.pet_id] = {}
  555. end
  556. for k,v in pairs(vo.skill_list) do
  557. if not self.pet_skill_list[vo.pet_id][v.skill_slot_id] then
  558. self.pet_skill_list[vo.pet_id][v.skill_slot_id] = {}
  559. end
  560. self.pet_skill_list[vo.pet_id][v.skill_slot_id].skill_slot_id = v.skill_slot_id
  561. self.pet_skill_list[vo.pet_id][v.skill_slot_id].talent_type = v.talent_type
  562. self.pet_skill_list[vo.pet_id][v.skill_slot_id].talent_id = v.talent_id
  563. end
  564. end
  565. --根据宠物id获取技能数据
  566. function PetModel:GetPetSkillDataById(pet_id)
  567. return self.pet_skill_list[pet_id] and self.pet_skill_list[pet_id] or nil
  568. end
  569. --判断宠物技能是否解锁
  570. function PetModel:IsPetSkillActive(pet_star, active_star)
  571. local is_actived = false
  572. if pet_star >= active_star then
  573. is_actived = true
  574. else
  575. is_actived = false
  576. end
  577. return is_actived
  578. end
  579. --设置宠物的宝石栏数据,16304
  580. function PetModel:SetPetDiamondData(vo)
  581. if not self.pet_diamond_list[vo.pet_id] then
  582. self.pet_diamond_list[vo.pet_id] = {}
  583. end
  584. for k,v in pairs(vo.diamond_list) do
  585. if not self.pet_diamond_list[vo.pet_id][v.diamond_slot] then
  586. self.pet_diamond_list[vo.pet_id][v.diamond_slot] = {}
  587. end
  588. self.pet_diamond_list[vo.pet_id][v.diamond_slot].diamond_slot = v.diamond_slot
  589. self.pet_diamond_list[vo.pet_id][v.diamond_slot].diamond_id = v.diamond_id
  590. end
  591. end
  592. --根据id和槽位获取宝石栏数据(如果位置上没有宝石,直接返回nil)
  593. function PetModel:GetPetDiamondDataByIdAndSlot(pet_id,slot_id)
  594. if self.pet_diamond_list[pet_id] and self.pet_diamond_list[pet_id][slot_id] then
  595. return self.pet_diamond_list[pet_id][slot_id]
  596. end
  597. return nil
  598. end
  599. --根据宠物id获取宝石栏数据
  600. function PetModel:GetPetDiamondDataById(pet_id)
  601. return self.pet_diamond_list[pet_id] and self.pet_diamond_list[pet_id] or nil
  602. end
  603. --宝石上阵后刷新宝石栏数据,16305
  604. function PetModel:SetPetDiamondDataAfterPut(vo)
  605. if not self.pet_diamond_list[vo.pet_id] then
  606. self.pet_diamond_list[vo.pet_id] = {}
  607. end
  608. self.pet_diamond_list[vo.pet_id][vo.diamond_slot] = self.pet_diamond_list[vo.pet_id][vo.diamond_slot] or {}
  609. self.pet_diamond_list[vo.pet_id][vo.diamond_slot].diamond_slot = vo.diamond_slot
  610. self.pet_diamond_list[vo.pet_id][vo.diamond_slot].diamond_id = vo.diamond_id
  611. self.pet_list[vo.pet_id].power = vo.pet_power
  612. end
  613. --宠物跟随,16306
  614. function PetModel:SetPetFollow(vo)
  615. if vo.role_id ~= RoleManager.Instance:GetMainRoleId() then return end
  616. if vo.is_follow == 1 then
  617. self.follow_pet = vo.pet_id
  618. else
  619. self.follow_pet = 0
  620. end
  621. end
  622. --获取跟随的宠物id
  623. function PetModel:GetFollowPetId()
  624. return self.follow_pet or 0
  625. end
  626. function PetModel:GetFollowPetStar( )
  627. return self:GetPetListById(self.follow_pet).pet_star
  628. end
  629. --宠物声援信息,16307
  630. function PetModel:SetPetSupportData(vo)
  631. self.pet_support_list.pet_sum_star = vo.pet_sum_star
  632. self.pet_support_list.pet_list = self.pet_support_list.pet_list or {}
  633. for k,v in pairs(vo.pet_list) do
  634. self.pet_support_list.pet_list[v.support_slot] = self.pet_support_list.pet_list[v.support_slot] or {}
  635. self.pet_support_list.pet_list[v.support_slot].support_slot = v.support_slot
  636. self.pet_support_list.pet_list[v.support_slot].pet_id = v.pet_id
  637. end
  638. end
  639. --找到最前的空声援位
  640. function PetModel:GetRecentSupportSlot()
  641. local sum_stars = self:CountPetStars()
  642. for i=1,10 do
  643. local support_slot_cfg = self:GetPetSupportSlotCfg(i)
  644. if sum_stars >= support_slot_cfg.open_sum_star then--已经解锁了
  645. if self.pet_support_list and self.pet_support_list.pet_list and not self.pet_support_list.pet_list[i] then
  646. return i
  647. end
  648. else
  649. return 0
  650. end
  651. end
  652. return 0
  653. end
  654. --根据声援位获取声援信息
  655. function PetModel:GetPetSupportDataBySlot(slot_id)
  656. return self.pet_support_list.pet_list and self.pet_support_list.pet_list[slot_id] and self.pet_support_list.pet_list[slot_id] or nil
  657. end
  658. --根据宠物id找到其声援信息
  659. function PetModel:GetPetSupportDataByPetId(pet_id)
  660. for k,v in pairs(self.pet_support_list.pet_list) do
  661. if v.pet_id == pet_id then
  662. return v
  663. end
  664. end
  665. return nil
  666. end
  667. --获取总星数
  668. function PetModel:GetPetStars()
  669. return self.pet_support_list.pet_sum_star
  670. end
  671. --客户端自己计算总星数
  672. function PetModel:CountPetStars()
  673. local num = 0
  674. for k,v in pairs(self.pet_list) do
  675. num = num + v.pet_star
  676. end
  677. return num
  678. end
  679. --宠物上阵之后,16308
  680. function PetModel:PresentPet(vo)
  681. self.pet_support_list.pet_list = self.pet_support_list.pet_list or {}
  682. self.pet_support_list.pet_list[vo.support_slot] = self.pet_support_list.pet_list[vo.support_slot] or {}
  683. self.pet_support_list.pet_list[vo.support_slot].support_slot = vo.support_slot
  684. self.pet_support_list.pet_list[vo.support_slot].pet_id = vo.pet_id
  685. --接下来处理槽位调换的情况
  686. if vo.old_pet_id ~= 0 and vo.old_support_slot == 0 then--未上阵宠物顶替上阵的
  687. --啥都不用做,因为阵位数据已经替换了
  688. return
  689. elseif vo.old_pet_id == 0 and vo.old_support_slot == 0 then--未上阵宠物上阵空位
  690. --啥都不用做,因为阵位数据已经替换了
  691. return
  692. elseif vo.old_pet_id == 0 and vo.old_support_slot ~= 0 then--上阵宠物换到空位
  693. --把原来的位置数据置空
  694. self.pet_support_list.pet_list[vo.old_support_slot] = nil
  695. -- TableRemove(self.pet_support_list.pet_list,self.pet_support_list.pet_list[vo.old_support_slot])
  696. elseif vo.old_pet_id ~= 0 and vo.old_support_slot ~= 0 then--两个阵位宠物互换
  697. --把主动替换方的位置数据换成被动替换方
  698. self.pet_support_list.pet_list[vo.old_support_slot].pet_id = vo.old_pet_id
  699. self.pet_support_list.pet_list[vo.old_support_slot].support_slot = vo.old_support_slot
  700. end
  701. end
  702. --全服宠物声援信息,16309
  703. -- rank :int8 //全服排名
  704. -- pet_id :int32 //宠物Id
  705. -- player_id :int64 //玩家Id
  706. -- player_name :string //玩家名称
  707. -- player_power :int64 //玩家战力
  708. -- support_ratio :int16 //声援率
  709. function PetModel:SetPetSupportRankData(vo)
  710. for k,v in pairs(vo.rank_list) do
  711. self.pet_support_rank_list[v.rank] = v--以排名为键
  712. end
  713. self.pet_rank_data_num = #vo.rank_list
  714. end
  715. function PetModel:GetRankData()
  716. return self.pet_support_rank_list or nil
  717. end
  718. --根据排名rank获取排行榜信息
  719. function PetModel:GetRankDataByRank(rank)
  720. return self.pet_support_rank_list[rank] or nil
  721. end
  722. --宠物投票信息 16312
  723. function PetModel:SetPetVoteData(vo)
  724. for k,v in pairs(vo.rank_list) do
  725. self.pet_vote_data[v.rare] = v
  726. local arg = {"ticket_num", "pet_id"}
  727. local condition = {Array.UPPER, Array.LOWER}
  728. SortTools.MoreKeysSorter(self.pet_vote_data[v.rare].rare_list, arg, condition)
  729. end
  730. for k,v in pairs(self.pet_vote_data) do
  731. local first_ticikes = 0
  732. for i,v in ipairs(v.rare_list) do
  733. if i == 1 then
  734. first_ticikes = v.ticket_num
  735. end
  736. if first_ticikes == 0 then
  737. v.rank = 1
  738. else
  739. v.rank = i
  740. end
  741. end
  742. end
  743. end
  744. --我的投票信息 16313 16314
  745. function PetModel:SetPetMyVoteData(vo)
  746. self.my_left_vote_times = self.max_vote_times - vo.support_times
  747. self.my_vote_data = vo.my_ticket
  748. if vo.pet_num then
  749. self.pet_rank_data_num = vo.pet_num
  750. --剩余投票次数置为0,不给投票
  751. if not self:CanVotePetRank() then
  752. self.my_left_vote_times = 0
  753. end
  754. end
  755. end
  756. --宠物声援榜单数量低于8个时候显示空界面并且不能投票
  757. function PetModel:CanVotePetRank( )
  758. return self.pet_rank_data_num >= 8
  759. end
  760. --获取我的投票信息
  761. function PetModel:GetPetMyVoteData( )
  762. return self.my_vote_data
  763. end
  764. --获取剩余投票次数
  765. function PetModel:GetMyLeftVoteTimes( )
  766. return self.my_left_vote_times
  767. end
  768. --昨日人气榜奖励领取信息 16310
  769. function PetModel:SetPetRankRewardData(vo)
  770. self.pet_rank_data_num = vo.pet_num
  771. if self:CanVotePetRank() then
  772. for i=1,3 do
  773. if vo.receive_list and vo.receive_list[i] then
  774. self.pet_rank_reward_data[i] = vo.receive_list[i]
  775. else
  776. self.pet_rank_reward_data[i] = {pet_id = 0,is_received = 0}
  777. end
  778. end
  779. else
  780. self.pet_rank_reward_data = {}
  781. end
  782. --剩余投票次数置为0,不给投票
  783. if not self:CanVotePetRank() then
  784. self.my_left_vote_times = 0
  785. end
  786. end
  787. --获取昨日榜的领奖数据
  788. function PetModel:GetPetRankRewardData()
  789. return self.pet_rank_reward_data
  790. end
  791. --更新领取奖励状态 16315
  792. function PetModel:UpdatePetRankRewardData(vo)
  793. local is_find = false
  794. for k,v in pairs(self.pet_rank_reward_data) do
  795. if v.pet_id == vo.pet_id then
  796. v.is_received = 1
  797. is_find = true
  798. end
  799. end
  800. if not is_find then
  801. for k,v in pairs(self.pet_rank_reward_data) do
  802. if v.pet_id == 0 then
  803. v.pet_id =vo.pet_id
  804. v.is_received = 1
  805. break
  806. end
  807. end
  808. end
  809. end
  810. --根据稀有度获取投票排行列表
  811. function PetModel:GetPetVoteDataByRare(rare)
  812. if self.pet_vote_data[rare] then
  813. return self.pet_vote_data[rare].rare_list
  814. end
  815. return {}
  816. end
  817. --更新宠物觉醒状态 16316
  818. function PetModel:UpdatePetAwakeState(vo)
  819. if self.pet_list[vo.pet_id] then
  820. self.pet_list[vo.pet_id].is_awaken = 1
  821. end
  822. end
  823. --计算属性值 宠物当前各基础属性=宠物基础属性+(宠物当前等级-1)*属性对应成长值
  824. function PetModel:GetPetAttrList(pet_lv,attr_list,diamond_data,awake_cfg,pet_star,pet_id)
  825. --计算基础属性
  826. local final_attr_list = attr_list
  827. for k,v in pairs(final_attr_list) do
  828. v[2] = v[2]+(pet_lv-1)*v[3]
  829. end
  830. local diamond_attr_data = {}--宝石总加成属性列表
  831. if diamond_data then
  832. for k,v in pairs(diamond_data) do
  833. if v then
  834. --单个槽位宝石加成属性列表
  835. local diamond_attr_data_slot = stringtotable(self:GetPetDiamondCfg(v.diamond_id).add_attr_list)
  836. for k,v in pairs(diamond_attr_data_slot) do
  837. if not diamond_attr_data[v[1]] then
  838. diamond_attr_data[v[1]] = {}
  839. diamond_attr_data[v[1]][1] = v[1]
  840. diamond_attr_data[v[1]][2] = 0
  841. end
  842. diamond_attr_data[v[1]][2] = diamond_attr_data[v[1]][2] + v[2]
  843. end
  844. end
  845. end
  846. end
  847. for k,v in pairs(final_attr_list) do
  848. if diamond_attr_data[v[1]] then
  849. v[2] = v[2] + diamond_attr_data[v[1]][2]
  850. diamond_attr_data[v[1]].isGet = true
  851. end
  852. end
  853. for k,v in pairs(diamond_attr_data) do
  854. if not v.isGet then
  855. table.insert(final_attr_list,v)
  856. end
  857. end
  858. local awaken_attr_data = {}--觉醒加成属性
  859. if awake_cfg then
  860. local awake_attr_cfg = stringtotable(awake_cfg.add_attr)
  861. for k,v in pairs(awake_attr_cfg) do
  862. awaken_attr_data[v[1]] = v
  863. end
  864. end
  865. for k,v in pairs(final_attr_list) do
  866. if awaken_attr_data[v[1]] then
  867. v[2] = v[2] + awaken_attr_data[v[1]][2]
  868. awaken_attr_data[v[1]].isGet = true
  869. end
  870. end
  871. for k,v in pairs(awaken_attr_data) do
  872. if not v.isGet then
  873. table.insert(final_attr_list,v)
  874. end
  875. end
  876. local skill_attr_data = {}--技能属性加成
  877. local sttr_list = {}
  878. local data = self:GetPetSkillCfg(pet_id,3,awake_cfg)
  879. if data and data.active_star <= pet_star then
  880. local skill_id = data.skill_talent_id
  881. sttr_list = GetSkillAttrBySkill( skill_id, 1 )
  882. end
  883. for k,v in pairs(sttr_list) do
  884. skill_attr_data[v[1]] = v
  885. end
  886. for k,v in pairs(final_attr_list) do
  887. if skill_attr_data[v[1]] then
  888. v[2] = v[2] + skill_attr_data[v[1]][2]
  889. skill_attr_data[v[1]].isGet = true
  890. end
  891. end
  892. for k,v in pairs(skill_attr_data) do
  893. if not v.isGet then
  894. table.insert(final_attr_list,v)
  895. end
  896. end
  897. local skill_attr_data_2 = {}--技能属性加成
  898. local sttr_list_2 = {}
  899. local data_2 = self:GetPetSkillCfg(pet_id,4,awake_cfg)
  900. if data_2 and data_2.active_star <= pet_star then
  901. local skill_id = data_2.skill_talent_id
  902. sttr_list_2 = GetSkillAttrBySkill( skill_id, 1 )
  903. end
  904. for k,v in pairs(sttr_list_2) do
  905. skill_attr_data_2[v[1]] = v
  906. end
  907. for k,v in pairs(final_attr_list) do
  908. if skill_attr_data_2[v[1]] then
  909. v[2] = v[2] + skill_attr_data_2[v[1]][2]
  910. skill_attr_data_2[v[1]].isGet = true
  911. end
  912. end
  913. for k,v in pairs(skill_attr_data_2) do
  914. if not v.isGet then
  915. table.insert(final_attr_list,v)
  916. end
  917. end
  918. return final_attr_list
  919. end
  920. --合并属性table得出一个格式为{{属性id,当前属性值,下一级增长值},{}}的新table
  921. function PetModel:MergeAttrList(tb_now,tb_next)
  922. for i,v in ipairs(tb_now) do
  923. v[3] = tb_next[i][2]-v[2]
  924. end
  925. return tb_now
  926. end
  927. --第二种合并法(当前属性和上一阶段的比较)
  928. function PetModel:MergeAttrList2(tb_now,tb_last)
  929. for i,v in ipairs(tb_now) do
  930. local last_num = tb_last[i] and tb_last[i][2] or 0
  931. v[3] = v[2] - last_num
  932. end
  933. return tb_now
  934. end
  935. --判断该宠物是否已经激活
  936. function PetModel:IsPetActived(pet_id)
  937. return self.pet_list[pet_id] and true or false
  938. end
  939. --------物品数量检测---START
  940. -----
  941. function PetModel:UpPetChipGoodsChange( )--刷新宠物碎片道具
  942. self:Fire(PetConst.UPDATE_PET_GOODS_NUM,1)
  943. end
  944. function PetModel:UpPetFeedGoodsChange( )--刷新宠物升级道具
  945. self:Fire(PetConst.UPDATE_PET_GOODS_NUM,2)
  946. end
  947. function PetModel:UpPetDiamondGoodsChange( )--刷新宠物技能宝石
  948. self:Fire(PetConst.UPDATE_PET_GOODS_NUM,3)
  949. end
  950. function PetModel:UpPetAwakeMaterial( )--刷新宠物觉醒碎片
  951. self:Fire(PetConst.UPDATE_PET_GOODS_NUM,4)
  952. end
  953. -----
  954. --------物品数量检测---END
  955. --宠物进化前保存一下当前的数据,用于进化成功界面的属性对比
  956. function PetModel:RecordDataBeforeEvolve(data)
  957. self.pet_old_data = self.pet_old_data or {}
  958. self.pet_old_data[data.pet_id] = self.pet_old_data[data.pet_id] or {}
  959. self.pet_old_data[data.pet_id] = data
  960. end
  961. --获取宠物进化前的数据
  962. function PetModel:GetPetOldDataById(pet_id)
  963. return self.pet_old_data and self.pet_old_data[pet_id] and self.pet_old_data[pet_id] or nil
  964. end
  965. --获取宠物id某阶段时的最大星数
  966. function PetModel:GetMaxStarInStage(pet_id,star)
  967. local final_max_star = self:GetPetMaxStar(pet_id)
  968. local final_stage_max_star = math.ceil((final_max_star-0.5)/5)*5--最后阶段的理论最高星数
  969. if final_stage_max_star-star < 5 then--判断是否在最后的阶段
  970. return 5 - (final_stage_max_star - final_max_star)
  971. else
  972. return 5
  973. end
  974. return 5
  975. end
  976. --获取宠物进化后的下一星级
  977. function PetModel:GetNextStageAndStar(pet_id,now_star)
  978. local max_star = self:GetPetMaxStar(pet_id)
  979. local next_star
  980. -- if now_star == max_star then--已经满星了
  981. -- next_star = max_star
  982. -- else
  983. next_star = now_star + 1
  984. -- end
  985. return next_star
  986. end
  987. --转换宠物当前显示的星数
  988. function PetModel:GetNowShowPetStar(star)
  989. return (star-1)%5+1
  990. end
  991. ------------红点------START
  992. function PetModel:IsNeedRedAll( )
  993. for k,v in pairs(PetConst.RED_DOT_TYPE) do
  994. self:IsNeedRed(v)
  995. end
  996. end
  997. function PetModel:IsNeedRed( tab_id )
  998. local bool = false
  999. if GetModuleIsOpen(163) then
  1000. if tab_id == PetConst.RED_DOT_TYPE.Feed then--升级
  1001. bool = self:CheckPetFeedRed()
  1002. elseif tab_id == PetConst.RED_DOT_TYPE.Evolve then--进化
  1003. bool = self:CheckPetEvolveRed()
  1004. elseif tab_id == PetConst.RED_DOT_TYPE.Diamond then--宝石
  1005. bool = self:CheckPetDiamondRed()
  1006. elseif tab_id == PetConst.RED_DOT_TYPE.Active then--激活
  1007. bool = self:CheckPetActiveRed()
  1008. elseif tab_id == PetConst.RED_DOT_TYPE.Vote then--投票
  1009. bool = self:CheckPetVoteRed()
  1010. elseif tab_id == PetConst.RED_DOT_TYPE.Reward then--领奖
  1011. bool = self:CheckPetRewardRed()
  1012. elseif tab_id == PetConst.RED_DOT_TYPE.Awake then--觉醒
  1013. bool = self:CheckPetAwakeRed()
  1014. elseif tab_id == PetConst.RED_DOT_TYPE.DiamondCompose then--宝石合成
  1015. bool = self:CheckDiamondComposeRed()
  1016. end
  1017. end
  1018. self.pet_red_dot_info[tab_id] = bool
  1019. self:Fire(PetConst.ANS_UPDATE_RED_DOT,tab_id,bool)
  1020. end
  1021. function PetModel:GetAllRedDot( )
  1022. return self.pet_red_dot_info
  1023. end
  1024. --获取宠物红点
  1025. function PetModel:GetPetRedDotByType(tab_type)
  1026. if not tab_type then return false end
  1027. return self.pet_red_dot_info[tab_type]
  1028. end
  1029. --获取单个宠物的升级红点
  1030. function PetModel:GetSingleFeedRedDot(pet_id)
  1031. return self.single_pet_feed_red_info[pet_id]
  1032. end
  1033. --获取单个宠物的进化红点
  1034. function PetModel:GetSingleEvolveRedDot(pet_id)
  1035. return self.single_pet_evolve_red_info[pet_id]
  1036. end
  1037. --获取单个宠物的激活红点
  1038. function PetModel:GetSingleActiveRedDot(pet_id)
  1039. return self.single_pet_active_red_info[pet_id]
  1040. end
  1041. --获取单个宠物稀有度类型的激活红点
  1042. function PetModel:GetSingleRareActiveRedDot(rare_type)
  1043. return self.single_pet_rare_active_red_info[rare_type]
  1044. end
  1045. --获得单个宠物的宝石红点
  1046. function PetModel:GetSingleDiamondRedDot(pet_id)
  1047. return self.single_pet_diamond_red_info[pet_id]
  1048. end
  1049. --获得单个宠物槽位的宝石红点
  1050. function PetModel:GetSingleSlotDiamondRedDot(pet_id,slot_id)
  1051. return self.single_pet_slot_diamond_red_info[pet_id][slot_id]
  1052. end
  1053. --获取单个宠物觉醒的红点
  1054. function PetModel:GetPetAwakeRedDot(pet_id)
  1055. return self.pet_awake_red[pet_id]
  1056. end
  1057. --获取宠物投票次数红点
  1058. function PetModel:GetPetVoteTimesRed( )
  1059. return self.pet_vote_red
  1060. end
  1061. --获取领奖红点
  1062. function PetModel:GetPetRewardRed( )
  1063. return self.pet_vote_reward_red
  1064. end
  1065. -------升级红点相关
  1066. function PetModel:IsFeedCostEnough(pet_race)
  1067. for k,v in pairs(self.upgrade_cost_cfg[pet_race].cost_material) do
  1068. local goods_num = GoodsModel:getInstance():GetTypeGoodsNum(v[1])
  1069. if goods_num >= 1 then
  1070. return true
  1071. end
  1072. end
  1073. return false
  1074. end
  1075. function PetModel:CheckPetFeedRed()
  1076. local bool = false
  1077. for k,v in pairs(self.pet_list) do
  1078. if self:CheckPetFeedRedById(v.pet_id) then
  1079. bool = true
  1080. self.single_pet_feed_red_info[v.pet_id] = true
  1081. else
  1082. self.single_pet_feed_red_info[v.pet_id] = false
  1083. end
  1084. end
  1085. return bool
  1086. end
  1087. function PetModel:CheckPetFeedRedById(pet_id)
  1088. local data = self:GetPetListById(pet_id)
  1089. if not data then return false end
  1090. local cfg = self:GetPetCfg(data.pet_id,data.pet_star)
  1091. local max_lv = self:GetPetMaxLv(cfg.rare_degree)
  1092. if data.pet_lv < max_lv and self:IsFeedCostEnough(cfg.pet_race) then
  1093. return true
  1094. end
  1095. return false
  1096. end
  1097. ------------------------
  1098. -------进化红点相关
  1099. function PetModel:CheckPetEvolveRed()
  1100. local bool = false
  1101. for k,v in pairs(self.pet_list) do
  1102. if self:CheckPetEvolveRedById(v.pet_id) then
  1103. bool = true
  1104. self.single_pet_evolve_red_info[v.pet_id] = true
  1105. else
  1106. self.single_pet_evolve_red_info[v.pet_id] = false
  1107. end
  1108. end
  1109. return bool
  1110. end
  1111. function PetModel:CheckPetEvolveRedById(pet_id)
  1112. local data = self:GetPetListById(pet_id)
  1113. if not data then return false end
  1114. local next_star = self:GetNextStageAndStar(data.pet_id, data.pet_star)
  1115. local cfg_data = self:GetPetCfg(data.pet_id, next_star)
  1116. if not cfg_data then return false end
  1117. local cost_data = stringtotable(cfg_data.cost)
  1118. local goods_type_id = cost_data[1][2]
  1119. local goods_num = GoodsModel:getInstance():GetTypeGoodsNum(goods_type_id)
  1120. local can_evolve = goods_num >= cost_data[1][3]
  1121. return can_evolve
  1122. end
  1123. ------------------------
  1124. -------激活红点相关
  1125. function PetModel:CheckPetActiveRed()
  1126. for i=1,3 do
  1127. if self:CheckPetActiveRedByRareType(i) then return true end
  1128. end
  1129. return false
  1130. end
  1131. function PetModel:CheckPetActiveRedByRareType(rare_type)
  1132. local data = self:GetPetRareCfg(rare_type)
  1133. self.single_pet_rare_active_red_info[rare_type] = false
  1134. local bool = false
  1135. for k,v in pairs(data) do
  1136. if self:CheckPetActiveRedById(v.pet_id) then
  1137. bool = true
  1138. self.single_pet_active_red_info[v.pet_id] = true
  1139. self.single_pet_rare_active_red_info[rare_type] = true
  1140. else
  1141. self.single_pet_active_red_info[v.pet_id] = false
  1142. end
  1143. end
  1144. return bool
  1145. end
  1146. function PetModel:CheckPetActiveRedById(pet_id)
  1147. local is_actived = self:IsPetActived(pet_id)
  1148. if is_actived then return false end
  1149. if not self:CanShowPet(pet_id) then return false end
  1150. local cfg = self:GetPetCfg(pet_id, 1)
  1151. local cost_table = stringtotable(cfg.cost)[1]--需要的消耗材料
  1152. local have_num = GoodsModel:getInstance():GetGoodsNumFromType(0,cost_table[2])--拥有的碎片数量
  1153. local need_num = cost_table[3]--需要的碎片数量
  1154. local enough = have_num >= need_num--是否达到解锁条件
  1155. return enough
  1156. end
  1157. ------------------------
  1158. -------宝石红点相关
  1159. function PetModel:CheckPetDiamondRed()
  1160. local bool = false
  1161. for k,v in pairs(self.pet_list) do
  1162. if self:CheckPetDiamondRedById(v.pet_id) then
  1163. bool = true
  1164. self.single_pet_diamond_red_info[v.pet_id] = true
  1165. else
  1166. self.single_pet_diamond_red_info[v.pet_id] = false
  1167. end
  1168. end
  1169. return bool
  1170. end
  1171. function PetModel:CheckPetDiamondRedById(pet_id)
  1172. self.single_pet_slot_diamond_red_info[pet_id] = self.single_pet_slot_diamond_red_info[pet_id] or {}
  1173. local pet_race = self:GetPetRaceById(pet_id)
  1174. local list = DeepCopy(GoodsModel:getInstance():GetPetDiamondDicByType())
  1175. local diamond_type_data={}--保存该槽位的宝石类型
  1176. for i=1,4 do
  1177. local data = self:GetPetDiamondDataByIdAndSlot(pet_id,i)
  1178. if data then
  1179. if list[data.diamond_id] then
  1180. list[data.diamond_id] = nil
  1181. end
  1182. local diamond_type = self:GetPetDiamondCfg(data.diamond_id).diamond_type
  1183. table.insert(diamond_type_data,diamond_type)
  1184. end
  1185. end
  1186. local bool = false
  1187. for i=1,4 do
  1188. self.single_pet_slot_diamond_red_info[pet_id][i] = false
  1189. if not self:GetPetDiamondDataByIdAndSlot(pet_id,i) then
  1190. for k,v in pairs(list) do
  1191. local diamond_race = self:GetPetDiamondCfg(k).need_race
  1192. local diamond_type_2 = self:GetPetDiamondCfg(k).diamond_type
  1193. if v and diamond_race == pet_race then
  1194. local is_different_type = true
  1195. for kk,vv in pairs(diamond_type_data) do
  1196. if vv == diamond_type_2 then
  1197. is_different_type = false
  1198. end
  1199. end
  1200. self.single_pet_slot_diamond_red_info[pet_id][i] = is_different_type
  1201. bool = is_different_type
  1202. end
  1203. end
  1204. end
  1205. end
  1206. return bool
  1207. end
  1208. ------------------------
  1209. --投票红点
  1210. function PetModel:CheckPetVoteRed( )
  1211. local bool = self.my_left_vote_times > 0 and self:CanVotePetRank()
  1212. self.pet_vote_red = bool
  1213. return bool
  1214. end
  1215. --领奖红点
  1216. function PetModel:CheckPetRewardRed( )
  1217. local bool = false
  1218. for k,v in pairs(self.pet_rank_reward_data) do
  1219. if v.is_received == 0 then
  1220. bool = true
  1221. break
  1222. end
  1223. end
  1224. self.pet_vote_reward_red = bool
  1225. return bool
  1226. end
  1227. --觉醒红点
  1228. function PetModel:CheckPetAwakeRed( )
  1229. if not GetModuleIsOpen(163,4) then return false end
  1230. local bool = false
  1231. for k,v in pairs(self.pet_list) do
  1232. if v.is_awaken == 0 then --未觉醒
  1233. local awake_cfg = self:GetPetAwakeCfg(v.pet_id)
  1234. local cost_data = stringtotable(awake_cfg.cost_material)
  1235. local goods_num = GoodsModel:getInstance():GetTypeGoodsNum(cost_data[1][2])
  1236. if goods_num >= cost_data[1][3] and v.pet_star >= awake_cfg.need_star then
  1237. bool = true
  1238. self.pet_awake_red[v.pet_id] = true
  1239. else
  1240. self.pet_awake_red[v.pet_id] = false
  1241. end
  1242. else
  1243. self.pet_awake_red[v.pet_id] = false
  1244. end
  1245. end
  1246. return bool
  1247. end
  1248. --宝石合成红点
  1249. function PetModel:CheckDiamondComposeRed( )
  1250. if not GetModuleIsOpen(163,1) then return false end
  1251. local bool = false
  1252. local material_data = nil
  1253. local diamond_num = 0
  1254. for k,v in pairs(self.pet_diamond_compose_cfg) do
  1255. for m,n in pairs(v) do
  1256. material_data = stringtotable(n.compound_list)
  1257. diamond_num = GoodsModel:getInstance():GetPetDiamondNumByTypeID(material_data[1][1])
  1258. if diamond_num >= 3 then
  1259. bool = true
  1260. self.diamond_compose_red[n.stone_id] = true
  1261. else
  1262. self.diamond_compose_red[n.stone_id] = false
  1263. end
  1264. end
  1265. end
  1266. return bool
  1267. end
  1268. function PetModel:GetPetDiamnondComposeRedById(diamond_id)
  1269. return self.diamond_compose_red[diamond_id] and self.diamond_compose_red[diamond_id] or false
  1270. end
  1271. function PetModel:GetPetDiamnondComposeRedList( )
  1272. return self.diamond_compose_red
  1273. end
  1274. ------------红点------END
  1275. --计算宠物战力
  1276. function PetModel:GetPetFightById(pet_id)
  1277. local diamond_data = self:GetPetDiamondDataById(pet_id)--取出宝石所加的属性一并计算
  1278. local pet_data = self:GetPetListById(pet_id)
  1279. local pet_cfg = self:GetPetCfg(pet_id, pet_data.pet_star)
  1280. local awake_cfg = nil
  1281. if pet_data.is_awaken == 1 then
  1282. awake_cfg = self:GetPetAwakeCfg(pet_id)
  1283. end
  1284. local attr_list = self:GetPetAttrList(pet_data.pet_lv,stringtotable(pet_cfg.attr_list),diamond_data,awake_cfg,pet_data.pet_star,pet_data.pet_id)
  1285. --上面拿到的属性列表list不是Getfighting用到的参数格式,先转一下格式
  1286. local need_attr_list = {}
  1287. for k,v in pairs(attr_list) do
  1288. local data = {v[1],v[2]}
  1289. table.insert(need_attr_list,data)
  1290. end
  1291. local fight_value = GetFighting(need_attr_list,true)
  1292. --技能基础战力添加
  1293. for i=1,4 do
  1294. local skill_data = self:GetPetSkillCfg(pet_id,i,awake_cfg)
  1295. if skill_data and pet_data.pet_star >= skill_data.active_star then
  1296. local skill_id = skill_data.skill_talent_id
  1297. local conf_power = GetSkillConfPowerBySkill(skill_id, 1)
  1298. fight_value = fight_value + conf_power
  1299. end
  1300. end
  1301. return fight_value
  1302. end
  1303. --传入petdata的计算战力方式
  1304. function PetModel:GetPetFightByData(data)
  1305. local pet_data = data
  1306. local diamond_data = self:GetPetDiamondDataById(pet_data.pet_id)--取出宝石所加的属性一并计算
  1307. local pet_cfg = self:GetPetCfg(pet_data.pet_id, pet_data.pet_star)
  1308. local awake_cfg = nil
  1309. if pet_data.is_awaken == 1 then
  1310. awake_cfg = self:GetPetAwakeCfg(pet_data.pet_id)
  1311. end
  1312. local attr_list = self:GetPetAttrList(pet_data.pet_lv,stringtotable(pet_cfg.attr_list),diamond_data,awake_cfg,pet_data.pet_star,pet_data.pet_id)
  1313. --上面拿到的属性列表list不是Getfighting用到的参数格式,先转一下格式
  1314. local need_attr_list = {}
  1315. for k,v in pairs(attr_list) do
  1316. local data = {v[1],v[2]}
  1317. table.insert(need_attr_list,data)
  1318. end
  1319. local fight_value = GetFighting(need_attr_list,true)
  1320. --技能基础战力添加
  1321. for i=1,4 do
  1322. local skill_data = self:GetPetSkillCfg(pet_data.pet_id,i,awake_cfg)
  1323. if skill_data and pet_data.pet_star >= skill_data.active_star then
  1324. local skill_id = skill_data.skill_talent_id
  1325. local conf_power = GetSkillConfPowerBySkill(skill_id, 1)
  1326. fight_value = fight_value + conf_power
  1327. end
  1328. end
  1329. return fight_value
  1330. end
  1331. --计算声援加成系数之后的战力
  1332. function PetModel:GetPetAditionFightById(pet_id,adition)
  1333. local diamond_data = self:GetPetDiamondDataById(pet_id)--取出宝石所加的属性一并计算
  1334. local pet_data = self:GetPetListById(pet_id)
  1335. local pet_cfg = self:GetPetCfg(pet_id, pet_data.pet_star)
  1336. local awake_cfg = nil
  1337. if pet_data.is_awaken == 1 then
  1338. awake_cfg = self:GetPetAwakeCfg(pet_id)
  1339. end
  1340. local attr_list = self:GetPetAttrList(pet_data.pet_lv,stringtotable(pet_cfg.attr_list),diamond_data,awake_cfg,pet_data.pet_star,pet_data.pet_id)
  1341. --上面拿到的属性列表list不是Getfighting用到的参数格式,先转一下格式,并把加成系数算进去
  1342. local need_attr_list = {}
  1343. for k,v in pairs(attr_list) do
  1344. local adition_attr = v[2]*(1+adition)
  1345. local data = {v[1],adition_attr}
  1346. table.insert(need_attr_list,data)
  1347. end
  1348. local fight_value = GetFighting(need_attr_list,true)
  1349. --技能基础战力添加
  1350. for i=1,4 do
  1351. local skill_data = self:GetPetSkillCfg(pet_data.pet_id,i,awake_cfg)
  1352. if skill_data and pet_data.pet_star >= skill_data.active_star then
  1353. local skill_id = skill_data.skill_talent_id
  1354. local conf_power = GetSkillConfPowerBySkill(skill_id, 1)
  1355. fight_value = fight_value + conf_power
  1356. end
  1357. end
  1358. return fight_value
  1359. end
  1360. --获取当前出战的宠物战斗技能id列表
  1361. function PetModel:GetFollowPetFightSkillIdList()
  1362. local fight_skill_data = {}
  1363. if not self.follow_pet or self.follow_pet == 0 then
  1364. return fight_skill_data
  1365. end
  1366. local follow_pet_data = self:GetPetListById(self.follow_pet)
  1367. for i=1,4 do--遍历4个技能槽位,找到战斗技能
  1368. local fight_skill_cfg = self:GetPetSkillCfg(self.follow_pet,i,follow_pet_data.is_awaken==1)
  1369. if fight_skill_cfg.skill_talent_type == 2 then --类型2为战斗技能
  1370. if self:IsPetSkillActive(follow_pet_data.pet_star, fight_skill_cfg.active_star) then
  1371. table.insert(fight_skill_data,fight_skill_cfg.skill_talent_id)
  1372. end
  1373. end
  1374. end
  1375. return fight_skill_data
  1376. end
  1377. --获取当前助战的宠物战斗大招技能id
  1378. function PetModel:GetHelpPetFightSkillIdList( )
  1379. local skill_id_list = {}
  1380. local pet_1 = self:GetPetSupportDataBySlot(2)
  1381. local pet_2 = self:GetPetSupportDataBySlot(3)
  1382. if pet_1 then
  1383. local pet_1_data = self:GetPetListById(pet_1.pet_id)
  1384. local pet_1_skill_cfg = self:GetPetSkillCfg(pet_1_data.pet_id, 4, pet_1_data.is_awaken==1)
  1385. if self:IsPetSkillActive(pet_1_data.pet_star, pet_1_skill_cfg.active_star) then
  1386. local temp = {
  1387. pet_id = pet_1_data.pet_id,
  1388. pet_star = pet_1_data.pet_star,
  1389. pet_skill = pet_1_skill_cfg.skill_talent_id,
  1390. }
  1391. table.insert(skill_id_list,temp)
  1392. end
  1393. end
  1394. if pet_2 then
  1395. local pet_2_data = self:GetPetListById(pet_2.pet_id)
  1396. local pet_2_skill_cfg = self:GetPetSkillCfg(pet_2_data.pet_id, 4, pet_2_data.is_awaken==1)
  1397. if self:IsPetSkillActive(pet_2_data.pet_star, pet_2_skill_cfg.active_star) then
  1398. local temp = {
  1399. pet_id = pet_2_data.pet_id,
  1400. pet_star = pet_2_data.pet_star,
  1401. pet_skill = pet_2_skill_cfg.skill_talent_id,
  1402. }
  1403. table.insert(skill_id_list,temp)
  1404. end
  1405. end
  1406. return skill_id_list
  1407. end
  1408. --根据宠物id pet_id、宠物星级 pet_star查找相应宠物配置
  1409. function PetModel:GetPetBaseFightCfg(pet_id,pet_star)
  1410. print("huangcong:PetModel [start:1035] :", pet_id,pet_star)
  1411. for k,v in pairs(self.pet_cfg) do
  1412. if v.pet_id == pet_id and v.pet_star == pet_star then
  1413. local base_attr = stringtotable(DeepCopy(v.attr_list))
  1414. base_attr = SortAttrList( base_attr )
  1415. print("huangcong:PetModel [start:1039] :", base_attr)
  1416. PrintTable(base_attr)
  1417. print("huangcong:PetModel [end]")
  1418. local new_base_attr = {}
  1419. for i,v in ipairs(base_attr) do
  1420. local attr = {}
  1421. attr[1] = v[1]
  1422. attr[2] = v[2]
  1423. new_base_attr[#new_base_attr + 1] = attr
  1424. end
  1425. print("huangcong:PetModel [start:1051] :", GetFighting(new_base_attr))
  1426. PrintTable(new_base_attr)
  1427. print("huangcong:PetModel [end]")
  1428. return GetFighting(new_base_attr)
  1429. end
  1430. end
  1431. return 0
  1432. end
  1433. function PetModel:ChangeFightPetScene(vo,do_skill_call_back)
  1434. data = {
  1435. role_id = RoleManager.Instance.mainRoleInfo.role_id,
  1436. pet_id = vo.pet_id,
  1437. is_follow = 1,
  1438. pet_star = vo.pet_star,
  1439. }
  1440. self:Fire(PetConst.UPDATE_SCENE_PET_MODEL,data,do_skill_call_back)
  1441. end
  1442. --提供一个通过碎片goods_id获取宠物基础属性列表的接口给皮皮聪
  1443. function PetModel:GetConfAttrListByGoodsId(goods_id)
  1444. local attr_list = {}
  1445. for k,v in pairs(self.pet_cfg) do
  1446. local cost = stringtotable(v.cost)
  1447. if v.pet_star == 1 and cost[1] and cost[1][2] == goods_id then
  1448. attr_list = stringtotable(v.attr_list)
  1449. break
  1450. end
  1451. end
  1452. return attr_list
  1453. end
  1454. --根据碎片goodsid获取宠物形象(最小的形象)
  1455. function PetModel:GetPetFigureByGoodsId(goods_id)
  1456. for k,v in pairs(self.pet_cfg) do
  1457. local cost = stringtotable(v.cost)
  1458. if v.pet_star == 1 and cost[1] and cost[1][2] == goods_id then
  1459. return v.figure_id, Trim(v.pet_name)
  1460. end
  1461. end
  1462. return 1121,""
  1463. end
  1464. --根据碎片goodsid获取宠物id
  1465. function PetModel:GetPetIdByGoodsId(goods_id)
  1466. for k,v in pairs(self.pet_cfg) do
  1467. local cost = stringtotable(v.cost)
  1468. if v.pet_star == 1 and cost[1] and cost[1][2] == goods_id then
  1469. return v.pet_id
  1470. end
  1471. end
  1472. return nil
  1473. end
  1474. --根据宠物的宝石列表得出宝石光环特效资源名 规则:4个宝石全穿戴,以其中最低品质为资源
  1475. function PetModel:GetPokemonDiamondEffectRes(pokemon_id)
  1476. local diamond_data = self:GetPetDiamondDataById(pokemon_id)
  1477. if not diamond_data then return nil end
  1478. --找到身上品质最高的宝石颜色
  1479. local low_color = 6
  1480. local diamond_num = 0
  1481. for k,v in pairs(diamond_data) do
  1482. diamond_num = diamond_num + 1
  1483. local color = GoodsModel:getInstance():GetGoodsColorNum(v.diamond_id)
  1484. if color < low_color then
  1485. low_color = color
  1486. end
  1487. end
  1488. --颜色3(紫色)以上才开始有资格创建光环特效
  1489. local diamond_effect_res = nil
  1490. if low_color >= 3 and diamond_num == 4 then
  1491. diamond_effect_res = "effect_pet_guanghuan_00"..(low_color-2)
  1492. end
  1493. return diamond_effect_res
  1494. end
  1495. --根据宠物id获取宠物的原生id(即宠物最初形态的形象id)
  1496. function PetModel:GetPetOriginalFigureId(pet_id)
  1497. local pet_cfg = self:GetPetCfg(pet_id,1)
  1498. return pet_cfg and pet_cfg.figure_id or nil
  1499. end
  1500. ---------宠物生活技能--------->>>>>>>
  1501. function PetModel:IsLifeSkillActived(skill_id)
  1502. --后端提交前先屏蔽
  1503. -- do return false end
  1504. --判断技能是否存在或是否被屏蔽
  1505. local is_skill_have = false
  1506. for k,v in pairs(PetConst.LifeSkill) do
  1507. if v == skill_id then
  1508. is_skill_have = true
  1509. break
  1510. end
  1511. end
  1512. if not is_skill_have then return false end
  1513. local is_in_shiled_list = false
  1514. for k,v in pairs(PetConst.LifeSkillShieldList) do
  1515. if v == skill_id then
  1516. is_in_shiled_list = true
  1517. break
  1518. end
  1519. end
  1520. if is_in_shiled_list then return false end
  1521. --判断是否有生活技能配置
  1522. local life_skill_cfg = self:GetPetLifeSkillCfgById(skill_id)
  1523. if not life_skill_cfg then return false end
  1524. --判断是否激活宠物
  1525. local pet_data = self:GetPetListById(life_skill_cfg.pet_id)
  1526. if not pet_data then return false end
  1527. --判断宠物星数是否达成激活技能
  1528. return pet_data.pet_star >= life_skill_cfg.active_star
  1529. end
  1530. function PetModel:AdvicePetLifeSkillActived(pet_id)
  1531. --获取宠物的技能id
  1532. local life_skill_id = 0
  1533. local skill_cfg = self:GetPetSkillCfg(pet_id,1)
  1534. if skill_cfg then
  1535. life_skill_id = skill_cfg.skill_talent_id
  1536. end
  1537. if self:IsLifeSkillActived(life_skill_id) then
  1538. self:Fire(PetConst.PET_LIFE_SKILL_ACTIVED,life_skill_id)
  1539. end
  1540. end
  1541. ---------宠物生活技能---------<<<<<<<