源战役客户端
您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

1259 行
50 KiB

  1. PsionicModel = PsionicModel or BaseClass(BaseVo, true)
  2. local PsionicModel = PsionicModel
  3. local GetFighting = GetFighting
  4. local stringtotable = stringtotable
  5. function PsionicModel:__init()
  6. PsionicModel.Instance = self
  7. self:Reset()
  8. end
  9. function PsionicModel:Reset()
  10. self.psionic_lv = 0 -- 圣物等级
  11. self.psionic_exp = 0 -- 圣物经验值
  12. self.ps_slot_data = {} -- 圣物槽位信息
  13. self.psionic_bag_data = nil -- 圣物装备背包
  14. self.psionic_equip_data = nil -- 圣物装备栏
  15. self.psionic_dig_data = {} -- 圣物抽奖面板信息
  16. self.psionic_skill_vo_list = {} -- 圣物技能主动技能vo列表
  17. -- 红点缓存
  18. self.psionic_red_cache = {} -- 圣物红点缓存
  19. self.ps_main_effect_red = false -- 圣物圣环红点按钮缓存
  20. self.ps_resolve_btn_red = false -- 圣物分解提示红点
  21. self.psionic_equip_slot_red = {} -- 圣物系统可装备槽位红点
  22. self.psionic_power_higher_bagitem = {} -- 圣物背包中属性更高的装备列表,格式 = {goods_id = goods_id, ...}
  23. self.psionic_power_higest_bagitem = {} -- 圣物背包中战斗力最高的装备列表,格式 = {slot = goods_id, ...}
  24. self.psionic_advance_slot_red = {} --圣物装备进阶左侧装备红点
  25. self.psionic_break_equip_red = {} -- 圣物装备突破红点缓存
  26. self.psionic_break_slot_red = {} -- 圣物突破页签槽位红点
  27. self.psionic_wash_slot_red = {} -- 圣物装备洗练槽位红点
  28. self.psionic_wash_break_slot_red = {} -- 圣物装备洗练槽位的突破红点
  29. self.psionic_skill_slot_red = {} -- 圣物技能觉醒槽位红点
  30. self.psionic_datadig_pooltype_red = {} -- 圣物数据挖掘池子红点缓存(分别缓存了单抽券,十连券和免费红点)
  31. self.psionic_exchange_sort_red = {} -- 圣物兑换商店栏位红点 格式 = [sort] = true/false
  32. -- 兑换商店
  33. self.psionic_exchange_shop_cfg = {} -- 圣物兑换商店商品配置
  34. -- toggle快速购买确认
  35. self._hide_double_check_advance_flag = false -- 本次登录是否直接付费自动购买进阶材料
  36. self._hide_double_check_break_flag = false -- 本次登录是否直接付费自动购买突破材料
  37. self._dont_check_psionic_draw_tip = {} -- 不打开寻宝二次确认标志
  38. self.ps_left_free_wash_times = 0--剩余免费洗练次数
  39. -- 新版圣物增加
  40. self.ps_stage_title_data = nil -- 圣物系统等级头衔配置
  41. self.ps_equip_cfg = {} -- 动态增加的圣物阶段配置
  42. self.ps_wash_cfg = {} -- 动态增加圣物洗练配置
  43. self.ps_stage_max_level = {} -- 动态获得阶段的最高等级
  44. self.ps_skill_awake_cfg = {} -- 动态获得觉醒的等级配置
  45. self.psionic_show_goods_fly = true -- 是否展示道具飞入表现
  46. -- 新版圣物红点缓存
  47. self._ps_equip_power_list = {} -- 圣物装备战力缓存 ([slot]{[goods_id] = 基础属性+成长属性*槽位等级, slot_lv = slot_lv}),槽位等级变动时清空
  48. self:InitExchangeShopCfg()
  49. self.ps_effect_show_status = nil -- 圣物魂环展示标志cookie{当前装备, 历史最高解锁, {[阶段数] = 是否有红点}}
  50. -- 进化装备缓存
  51. self._break_type_id_cache = {}
  52. self._block_skill_upgrade_click = false -- 延迟弹出觉醒成功界面之前,禁止发起觉醒协议
  53. end
  54. function PsionicModel:getInstance()
  55. if self.Instance == nil then
  56. self.Instance = PsionicModel.New()
  57. end
  58. return self.Instance
  59. end
  60. -----------------
  61. -- 配置初始化相关
  62. -----------------
  63. -- 通过服务端发过来的道具信息获取道具配置
  64. function PsionicModel:GetPsionicEquipGradeCfg(type_id)
  65. if not type_id then return nil end
  66. type_id = tonumber(type_id)
  67. if not self.ps_equip_cfg[type_id] then
  68. local equip_cfg = Config.Nucleonequip[type_id]
  69. if not equip_cfg then
  70. return nil
  71. end
  72. local tb = {
  73. cost = stringtotable(equip_cfg.cost),
  74. attrs = stringtotable(equip_cfg.attrs),
  75. resolve = stringtotable(equip_cfg.resolve),
  76. id = equip_cfg.id,
  77. next = equip_cfg.next,
  78. star = equip_cfg.star,
  79. }
  80. self.ps_equip_cfg[type_id] = tb
  81. end
  82. return self.ps_equip_cfg[type_id]
  83. end
  84. function PsionicModel:InitExchangeShopCfg( )
  85. self.psionic_exchange_shop_cfg = {}
  86. for k, v in pairs(Config.Nucleonexchange) do
  87. self.psionic_exchange_shop_cfg[#self.psionic_exchange_shop_cfg+1] = v
  88. end
  89. local sort_func = function ( a, b )
  90. return a.sort < b.sort
  91. end
  92. table.sort(self.psionic_exchange_shop_cfg, sort_func)
  93. end
  94. function PsionicModel:GetExchangeShopCfg( )
  95. return self.psionic_exchange_shop_cfg
  96. end
  97. -- 获取圣物洗练配置
  98. function PsionicModel:GetPsionicWashCfg(slot, grade, no_need_mapping)
  99. -- 一般调用这个接口的都是用goods_vo的subtype,装备是从4开始,需要减3做映射
  100. -- 多一个字段用来控制映射处理
  101. if no_need_mapping then
  102. slot = slot and slot or 1
  103. else
  104. slot = slot and slot - 3 or 1
  105. end
  106. grade = grade or 1
  107. local key = slot .. "@" .. grade
  108. if not self.ps_wash_cfg[key] then
  109. local cfg = Config.Nucleonrecast[key]
  110. local tb = {}
  111. tb.cost = stringtotable(cfg.cost)
  112. tb.attrs = stringtotable(cfg.attrs)
  113. tb.maxs = SortAttrList(stringtotable(cfg.maxs))
  114. tb.adds = stringtotable(cfg.adds)
  115. self.ps_wash_cfg[key] = tb
  116. end
  117. return self.ps_wash_cfg[key]
  118. end
  119. -- 根据阶段数,获取阶段的最高等级
  120. function PsionicModel:GetPsionicSlotStageMaxLevel(grade)
  121. grade = grade or 1
  122. if not self.ps_stage_max_level[grade] then
  123. local max = 999
  124. for k, v in pairs(Config.Nucleonlv) do
  125. if v.grade == grade and Config.Nucleonlv[v.next].grade ~= grade then
  126. max = v.lv
  127. break
  128. end
  129. end
  130. self.ps_stage_max_level[grade] = max
  131. end
  132. -- 获取最高阶段数,并每次都默认返回
  133. if not self.ps_stage_max_level["max"] then
  134. local max_grade = 0
  135. for k, v in pairs(Config.Nucleonlv) do
  136. if Config.Nucleonlv[v.next].grade ~= v.grade and max_grade < v.grade then
  137. max_grade = v.grade
  138. end
  139. end
  140. self.ps_stage_max_level["max"] = max_grade
  141. end
  142. return self.ps_stage_max_level[grade], self.ps_stage_max_level["max"]
  143. end
  144. -- 获取圣物等级头衔数据
  145. function PsionicModel:GetPsionicStageTitleData( )
  146. if not self.ps_stage_title_data then
  147. self.ps_stage_title_data = {}
  148. for k, v in pairs(Config.Nucleontitle) do
  149. local tb = DeepCopy(v)
  150. tb.attrs = stringtotable(tb.attrs)
  151. tb.cost = stringtotable(tb.cost)
  152. table.insert(self.ps_stage_title_data, tb)
  153. end
  154. local sort_func = function ( a, b )
  155. return a.lv < b.lv
  156. end
  157. table.sort(self.ps_stage_title_data, sort_func)
  158. end
  159. return self.ps_stage_title_data
  160. end
  161. -- 根据对应的位置获取圣物觉醒配置
  162. function PsionicModel:GetPsionicAwakeCfg(pos, section)
  163. if not pos then return nil end
  164. section = section or 0 -- 未传入觉醒等级给默认0级配置
  165. pos = pos - 3 -- 配置等级要与参数等级做一个减3映射
  166. local key = pos .. "@" .. section
  167. if not self.ps_skill_awake_cfg[key] then
  168. local tb = DeepCopy(Config.Nucleonsection[key])
  169. tb.cost = stringtotable(tb.cost)
  170. tb.attrs = stringtotable(tb.attrs)
  171. tb.skill = stringtotable(tb.skill)
  172. tb.sec_skill = stringtotable(tb.sec_skill)
  173. self.ps_skill_awake_cfg[key] = tb
  174. end
  175. return self.ps_skill_awake_cfg[key]
  176. end
  177. -- 获取圣物觉醒技能解锁和技能配置
  178. function PsionicModel:GetPsionicAwakeUnlockCfg(pos)
  179. if not pos then return nil end
  180. pos = pos - 3 -- 这边的配置需要减3映射
  181. return Config.Nucleonhole[pos] or nil
  182. end
  183. -- 获取圣物抽奖奖池概率信息
  184. function PsionicModel:GetPsionicDrawPoolPecData(pool_type)
  185. if not self.ps_draw_poolpec_data then
  186. self.ps_draw_poolpec_data = {}
  187. self.ps_draw_poolpec_data[PsionicConst.DrawPoolType.Normal] = {}
  188. self.ps_draw_poolpec_data[PsionicConst.DrawPoolType.Deep] = {}
  189. -- 筛选出两个不同奖池的配置
  190. local pt1, pt2, temp_tb = {}, {}
  191. for k, v in pairs(Config.Nucleonpoolawards) do
  192. temp_tb = DeepCopy(v)
  193. temp_tb.awards = stringtotable(v.awards)
  194. if temp_tb.pool == PsionicConst.DrawPoolType.Normal then
  195. pt1[#pt1+1] = temp_tb
  196. elseif temp_tb.pool == PsionicConst.DrawPoolType.Deep then
  197. pt2[#pt2+1] = temp_tb
  198. end
  199. end
  200. local function sort_rewards_by_color(tb, target_list)
  201. local total_weight = 0
  202. for k, v in ipairs(tb) do
  203. -- 总权值
  204. total_weight = total_weight + v.weight
  205. -- 不同品质总权值
  206. target_list.color_weight = target_list.color_weight or {}
  207. target_list.color_weight[v.color] = (target_list.color_weight[v.color] or 0) + v.weight
  208. -- 这里用的不是顺序表,在使用的时候请用自然数递减的方式推算颜色获取数据
  209. target_list.data = target_list.data or {}
  210. target_list.data[v.color] = target_list.data[v.color] or {}
  211. table.insert(target_list.data[v.color], v)
  212. end
  213. target_list.total_weight = total_weight
  214. -- 根据商品sort排序
  215. local sort_func = function ( a, b )
  216. return a.sort < b.sort
  217. end
  218. for k, v in pairs(target_list.data) do
  219. table.sort(v, sort_func)
  220. end
  221. end -- sort_rewards_by_color
  222. sort_rewards_by_color(pt1, self.ps_draw_poolpec_data[PsionicConst.DrawPoolType.Normal])
  223. sort_rewards_by_color(pt2, self.ps_draw_poolpec_data[PsionicConst.DrawPoolType.Deep])
  224. end
  225. return self.ps_draw_poolpec_data[pool_type]
  226. end
  227. -----------------
  228. -- 协议相关
  229. -----------------
  230. -- 圣物数据 13900
  231. function PsionicModel:SetPsionicMainData(vo)
  232. if not vo then return end
  233. self.psionic_lv = vo.lv
  234. self.psionic_exp = vo.exp
  235. -- 缓存槽位信息
  236. self.ps_slot_data = {}
  237. for k, v in pairs(vo.holes) do
  238. self.ps_slot_data[v.pos] = v
  239. -- 如果没有战斗力缓存,或者缓存的槽位等级与当前不相等,则清空当前槽位的战斗力缓存并重新初始化
  240. if not self._ps_equip_power_list[v.pos]
  241. or not self._ps_equip_power_list[v.pos].slot_lv
  242. or self._ps_equip_power_list[v.pos].slot_lv ~= v.lv then
  243. self._ps_equip_power_list[v.pos] = {}
  244. self._ps_equip_power_list[v.pos].slot_lv = v.lv
  245. self._ps_equip_power_list[v.pos].goods_list = {}
  246. end
  247. -- 加载vo
  248. self:UpdatePsionicSkillVo(v)
  249. end
  250. end
  251. function PsionicModel:GetPsionicLv( )
  252. return self.psionic_lv, self.psionic_exp
  253. end
  254. -- 获取圣物槽位数据
  255. function PsionicModel:GetPsionicSlotData(slot)
  256. if slot then
  257. return self.ps_slot_data[slot]
  258. else
  259. return self.ps_slot_data
  260. end
  261. end
  262. -- 圣物充能结果推送,更新圣物等级和经验值 13901 13902
  263. function PsionicModel:UpdatePsionicMainLv(vo)
  264. self.psionic_lv = vo.lv
  265. self.psionic_exp = vo.exp
  266. end
  267. -- 圣物槽位升级 13905
  268. function PsionicModel:UpdatePsionicSlotLv(vo)
  269. if vo and self.ps_slot_data[vo.pos] then
  270. self.ps_slot_data[vo.pos].lv = vo.lv
  271. self.ps_slot_data[vo.pos].exp = vo.exp
  272. -- 如果没有战斗力缓存,或者缓存的槽位等级与当前不相等,则清空当前槽位的战斗力缓存并重新初始化
  273. if not self._ps_equip_power_list[vo.pos]
  274. or not self._ps_equip_power_list[vo.pos].slot_lv
  275. or self._ps_equip_power_list[vo.pos].slot_lv ~= vo.lv then
  276. self._ps_equip_power_list[vo.pos] = {}
  277. self._ps_equip_power_list[vo.pos].slot_lv = vo.lv
  278. self._ps_equip_power_list[vo.pos].goods_list = {}
  279. end
  280. end
  281. end
  282. -- 圣物槽位突破 13906
  283. function PsionicModel:UpdatePsionicSlotGrade(vo)
  284. if vo and self.ps_slot_data[vo.pos] then
  285. self.ps_slot_data[vo.pos].grade = vo.grade
  286. self.ps_slot_data[vo.pos].lv = vo.lv
  287. self.ps_slot_data[vo.pos].exp = vo.exp
  288. -- 如果没有战斗力缓存,或者缓存的槽位等级与当前不相等,则清空当前槽位的战斗力缓存并重新初始化
  289. if not self._ps_equip_power_list[vo.pos]
  290. or not self._ps_equip_power_list[vo.pos].slot_lv
  291. or self._ps_equip_power_list[vo.pos].slot_lv ~= vo.lv then
  292. self._ps_equip_power_list[vo.pos] = {}
  293. self._ps_equip_power_list[vo.pos].slot_lv = vo.lv
  294. self._ps_equip_power_list[vo.pos].goods_list = {}
  295. end
  296. end
  297. end
  298. -- 获取背包相关的数据
  299. -- 获取圣物背包中的装备 15010
  300. function PsionicModel:SetPsionicBagData( )
  301. self.psionic_bag_data = GoodsModel:getInstance():GetPsionicBagList()
  302. self:Fire(PsionicConst.UPDATE_PISIONIC_BAG_ARMOR)
  303. end
  304. -- sort_flag:true 品质降序 false 品质升序
  305. function PsionicModel:GetPsionicBagData(sort_flag)
  306. if not self.psionic_bag_data then return {} end
  307. local tb = {}
  308. for k, v in pairs(self.psionic_bag_data) do
  309. tb[#tb+1] = v
  310. end
  311. -- 没有排序需求,就直接扔出来
  312. if sort_flag == nil then
  313. return tb
  314. else
  315. local sort_func = function ( a, b )
  316. if a.color ~= b.color then
  317. -- 根据排序类型决定排序规则
  318. if sort_flag then
  319. return a.color > b.color
  320. else
  321. return a.color < b.color
  322. end
  323. else -- 颜色相同,现根据星数再根据装备id最后再根据战斗力(战斗力这块数与旧逻辑,有可能不用了)
  324. if a.subtype ~= b.subtype then
  325. return a.subtype < b.subtype
  326. else
  327. if a.star ~= b.star then
  328. return a.star > b.star
  329. else
  330. return a.type_id < b.type_id
  331. end
  332. end
  333. end
  334. end
  335. table.sort(tb, sort_func)
  336. return tb
  337. end
  338. end
  339. -- 更新槽位觉醒信息 13908
  340. function PsionicModel:UpdatePsionicSectionLv(vo)
  341. if vo and self.ps_slot_data[vo.pos] then
  342. self.ps_slot_data[vo.pos].sec_lv = vo.section
  343. end
  344. end
  345. -- 圣物槽位洗练数据更新 13909
  346. function PsionicModel:UpdatePsionicSlotWashData(vo)
  347. if vo and self.ps_slot_data[vo.pos] then
  348. self.ps_slot_data[vo.pos].attrs = vo.attrs
  349. end
  350. end
  351. -- 圣物抽奖面板信息 13910
  352. function PsionicModel:SetPsionicDigData(vo)
  353. if not vo then return end
  354. for k, v in pairs(vo.pools) do
  355. self.psionic_dig_data[v.pool] = v
  356. end
  357. end
  358. function PsionicModel:GetPsionicDigData(pool_type)
  359. if pool_type then
  360. return self.psionic_dig_data[pool_type]
  361. end
  362. return self.psionic_dig_data
  363. end
  364. -- 更新圣物数据挖掘信息 13910
  365. function PsionicModel:UpdatePsionicDigData(vo)
  366. if not vo or not self.psionic_dig_data then return end
  367. -- 更新剩余次数
  368. self.psionic_dig_data[vo.pool].remain = vo.remain
  369. self.psionic_dig_data[vo.pool].rtime = vo.rtime
  370. self.psionic_dig_data[vo.pool].isfirst = vo.isfirst
  371. end
  372. -- 更新玩家的圣物等级
  373. function PsionicModel:UpdatePsionicSkillData(vo)
  374. if vo and self.ps_slot_data[vo.pos] then
  375. self.ps_slot_data[vo.pos].skill_id = vo.skill_id
  376. self.ps_slot_data[vo.pos].skill_lv = vo.skill_lv
  377. -- 加载vo
  378. self:UpdatePsionicSkillVo(self.ps_slot_data[vo.pos])
  379. end
  380. end
  381. -- 更新圣物技能主动技vo
  382. function PsionicModel:UpdatePsionicSkillVo(slot_data)
  383. if not slot_data then return end
  384. local skill_cfg = ConfigItemMgr.Instance:GetSkillItem(slot_data.skill_id)
  385. if skill_cfg and skill_cfg.type == 1 then -- 主动技能才需要加载skillvo
  386. self.psionic_skill_vo_list[slot_data.pos] = self.psionic_skill_vo_list[slot_data.pos] or SkillVo.New(slot_data.skill_id)
  387. self.psionic_skill_vo_list[slot_data.pos].level = slot_data.skill_lv
  388. self:Fire(PsionicConst.UPDATE_PSIONIC_SKILL_VO, slot_data.pos)
  389. end
  390. end
  391. function PsionicModel:GetPsionicSkillVo(slot)
  392. if slot then
  393. return self.psionic_skill_vo_list[slot]
  394. else
  395. return self.psionic_skill_vo_list
  396. end
  397. end
  398. ----------------
  399. -- 红点表现相关 --
  400. ----------------
  401. -- 更新圣物系统全部红点
  402. function PsionicModel:CheckPsionicAllRed( )
  403. self.psionic_red_cache[PsionicConst.TabId.PArmor] = self:CheckPsionicArmorTabRed()
  404. self.psionic_red_cache[PsionicConst.TabId.PAdvance] = self:CheckPsionicAdvanceTabRed()
  405. self.psionic_red_cache[PsionicConst.TabId.PBreak] = self:CheckPsionicBreakTabRed()
  406. self.psionic_red_cache[PsionicConst.TabId.PWash] = self:CheckPsionicWashTabRed()
  407. self.psionic_red_cache[PsionicConst.TabId.PSkill] = self:CheckPsionicSkillTabRed()
  408. self.psionic_red_cache[PsionicConst.TabId.PDataDig] = self:CheckPsionicDataDigTabRed()
  409. self.psionic_red_cache[PsionicConst.TabId.PExchange] = self:CheckPsionicExchangeRed()
  410. self:Fire(PsionicConst.UPDATE_RED_BY_TABID)
  411. self:CheckPsionicMainIconRed()
  412. end
  413. -- 获取界面tab的缓存红点
  414. function PsionicModel:GetPsionicRedDotCache( tab_id )
  415. return not tab_id and self.psionic_red_cache or self.psionic_red_cache[tab_id]
  416. end
  417. -- 通过界面类型缓存红点
  418. function PsionicModel:CheckPsionicRedByTabID(tab_id, is_all, ...)
  419. local other_args = {...}
  420. local function get_slot()
  421. local slot = other_args[1] or false
  422. local goods_id = other_args[2] or false
  423. if not slot and goods_id then
  424. -- 没有传入slot但传入了对应的装备id,则获取这件装备的id对应的装备槽位
  425. slot = self:GetPsionicEquipSlotByGoodsId(goods_id)
  426. end
  427. return slot
  428. end
  429. local bool = false
  430. if tab_id == PsionicConst.TabId.PArmor then -- 圣物背包相关
  431. local slot = get_slot()
  432. bool = self:CheckPsionicArmorTabRed(slot)
  433. elseif tab_id == PsionicConst.TabId.PAdvance then -- 圣物进阶相关
  434. local slot = get_slot()
  435. bool = self:CheckPsionicAdvanceTabRed(slot)
  436. elseif tab_id == PsionicConst.TabId.PBreak then -- 圣物突破相关
  437. local slot = get_slot()
  438. bool = self:CheckPsionicBreakTabRed(slot)
  439. elseif tab_id == PsionicConst.TabId.PWash then -- 圣物洗练相关
  440. local slot = other_args[1] or false
  441. bool = self:CheckPsionicWashTabRed(slot)
  442. elseif tab_id == PsionicConst.TabId.PSkill then -- 圣物觉醒(技能)相关
  443. local slot = get_slot()
  444. bool = self:CheckPsionicSkillTabRed(slot)
  445. elseif tab_id == PsionicConst.TabId.PDataDig then -- 圣物数据挖掘相关
  446. local pool_type = other_args[1] or false
  447. bool = self:CheckPsionicDataDigTabRed(pool_type)
  448. elseif tab_id == PsionicConst.TabId.PExchange then -- 圣物兑换商店
  449. bool = self:CheckPsionicExchangeRed()
  450. end
  451. self.psionic_red_cache[tab_id] = bool
  452. self:Fire(PsionicConst.UPDATE_RED_BY_TABID, tab_id, bool)
  453. if is_all then
  454. self:CheckPsionicMainIconRed()
  455. end
  456. return bool
  457. end
  458. function PsionicModel:CheckPsionicMainIconRed( )
  459. local bool = false
  460. for k, v in pairs(self.psionic_red_cache) do
  461. if v == true then
  462. bool = true
  463. break
  464. end
  465. end
  466. GlobalEventSystem:Fire(EventName.SHOW_FUNCTION_RED_POINT, 139, bool) --通知自己功能按钮红点
  467. end
  468. -- 当圣物背包发生变动时调用
  469. function PsionicModel:OnPsionicEquipChange()
  470. local function refresh_psionic_bag_red()
  471. self:CheckPsionicRedByTabID(PsionicConst.TabId.PArmor)
  472. self:CheckPsionicRedByTabID(PsionicConst.TabId.PAdvance)
  473. self:CheckPsionicRedByTabID(PsionicConst.TabId.PBreak)
  474. self:CheckPsionicRedByTabID(PsionicConst.TabId.PWash, true) -- 最后再全局刷新按钮红点
  475. end
  476. TimeManager.GetInstance():StartTime("PsionicModelEquipRed_1", 0.5, refresh_psionic_bag_red)
  477. end
  478. -- 当头衔/进阶/突破/觉醒/兑换材料变动时调用
  479. function PsionicModel:OnPsionicGoodsChange( )
  480. self:CheckPsionicRedByTabID(PsionicConst.TabId.PAdvance)
  481. self:CheckPsionicRedByTabID(PsionicConst.TabId.PWash)
  482. self:CheckPsionicRedByTabID(PsionicConst.TabId.PSkill)
  483. self:CheckPsionicRedByTabID(PsionicConst.TabId.PExchange, true) -- 最后再全局刷新按钮红点
  484. -- self:Fire(PsionicConst.UPDATE_PSIONIC_ADVANCE_GOODSNUM)
  485. end
  486. function PsionicModel:OnPsionicDrawGoodsChange( )
  487. local function refresh_psionic_draw_goods()
  488. self:CheckPsionicRedByTabID(PsionicConst.TabId.PDataDig, true)
  489. end
  490. TimeManager.GetInstance():StartTime("PsionicModelDrawGoodsUpdate", 0.5, refresh_psionic_draw_goods)
  491. end
  492. -- 检查圣物装备界面红点
  493. function PsionicModel:CheckPsionicArmorTabRed(slot)
  494. -- 这个红点比较麻烦,需要先判断身上的装备穿齐了没,然后还要判断身上的装备战斗力是否比背包中的低
  495. local goods_model = GoodsModel:getInstance()
  496. local equip_data
  497. local bag_list_by_slot
  498. local bool = false
  499. local function check_slot_equip_red(slot)
  500. -- 初始化最高战斗力装备数据
  501. self.psionic_power_higest_bagitem[slot] = nil
  502. local temp_bool = false
  503. equip_data = goods_model:GetPsionicEquipBySlot(slot)
  504. bag_list_by_slot = goods_model:GetPsionicBagItemBySlot(slot)
  505. if equip_data then
  506. -- 判断是否有装备的战斗力超过了当前的装备
  507. local cur_power = self:GetPsionicEquipTotalPower(equip_data)
  508. local temp_power = 0
  509. local heightest_power = 0
  510. for k2, bag_equip_vo in ipairs(bag_list_by_slot) do
  511. temp_power = self:GetPsionicEquipTotalPower(bag_equip_vo)
  512. if temp_power > cur_power then
  513. self.psionic_power_higher_bagitem[bag_equip_vo.goods_id] = bag_equip_vo.goods_id -- 替换装备战斗力提升的标识
  514. temp_bool = true
  515. -- 缓存下最高战斗力的圣物
  516. if heightest_power < temp_power then
  517. heightest_power = temp_power
  518. self.psionic_power_higest_bagitem[slot] = bag_equip_vo.goods_id
  519. end
  520. else
  521. self.psionic_power_higher_bagitem[bag_equip_vo.goods_id] = nil
  522. end
  523. end
  524. else -- 当前装备没有穿戴,而背包对应栏位有装备,则需要提示红点
  525. temp_bool = not IsTableEmpty(bag_list_by_slot)
  526. end
  527. self.psionic_equip_slot_red[slot] = temp_bool
  528. bool = bool or temp_bool
  529. end
  530. if slot then
  531. check_slot_equip_red(slot)
  532. if not bool then -- 当前的槽位已经消除了红点,则需要判断一下其他槽位的情况
  533. for k, v in pairs(self.psionic_equip_slot_red) do
  534. bool = bool or v
  535. end
  536. end
  537. else
  538. for i = 4, 7 do
  539. check_slot_equip_red(i)
  540. end
  541. end
  542. -- 检测圣环红点
  543. self.ps_main_effect_red = false
  544. -- 获取实时的装备状态
  545. local cur_stage = self:GetPsionicEffectStage()
  546. local effect_status = self:GetPsionicEffectShowStatus()
  547. for k, v in pairs(effect_status[3]) do
  548. if k ~= 0 and k <= cur_stage then
  549. self.ps_main_effect_red = self.ps_main_effect_red or v
  550. end
  551. end
  552. bool = bool or self.ps_main_effect_red
  553. -- 检查分解红点
  554. -- 获取背包列表
  555. self.psionic_bag_data = self.psionic_bag_data or {}
  556. local blue_equip_num = 0
  557. for k, v in pairs(self.psionic_bag_data) do
  558. if v.color <= 2 then -- 蓝色装备
  559. blue_equip_num = blue_equip_num + 1
  560. end
  561. if blue_equip_num >= 10 then
  562. break
  563. end
  564. end
  565. self.ps_resolve_btn_red = blue_equip_num >= 10
  566. bool = bool or self.ps_resolve_btn_red
  567. return bool
  568. end
  569. -- 获取圣物装备左侧装备位置红点缓存
  570. function PsionicModel:GetPsionicEquipSlotRed(slot)
  571. if slot then
  572. return self.psionic_equip_slot_red[slot] or false
  573. else
  574. return self.psionic_equip_slot_red
  575. end
  576. end
  577. function PsionicModel:CheckPsionicEffectBtnRed( )
  578. -- 检测圣环红点
  579. self.ps_main_effect_red = false
  580. local effect_status = self:GetPsionicEffectShowStatus()
  581. for k, v in pairs(effect_status[3]) do
  582. if k ~= 0 then
  583. self.ps_main_effect_red = self.ps_main_effect_red or v
  584. end
  585. end
  586. end
  587. -- 获取圣环红点
  588. function PsionicModel:GetPsionicEffectBtnRed( )
  589. return self.ps_main_effect_red
  590. end
  591. -- 获取圣物分解红点
  592. function PsionicModel:GetPsionicResolveBtnRed( )
  593. return self.ps_resolve_btn_red
  594. end
  595. -- 判断这件装备是否替换后能提升战斗力
  596. function PsionicModel:IsPsionicEquipPowerUpOrNot(goods_id)
  597. return self.psionic_power_higher_bagitem[goods_id] and true or false
  598. end
  599. -- 2020年7月23日新增 对于背包界面的未穿戴装备和可替换装备栏位追加逻辑引导穿戴和替换
  600. -- 获取到目标栏位战力最高的圣物装备 greater:是否要追加判断战斗力大于身上穿戴的,否则就单纯返回背包中战力最高的一件
  601. function PsionicModel:GetTopPowerUpEquipInBag(slot, greater)
  602. if not slot then return nil end
  603. local goods_model = GoodsModel:getInstance()
  604. local equip_data = goods_model:GetPsionicEquipBySlot(slot)
  605. if equip_data then
  606. -- 存在战力比自己身上的高的装备,就挑最好的返回
  607. if self.psionic_power_higest_bagitem[slot] then
  608. -- 需要判断战力超过身上的,就判断有没有带红点就好了,没红点就没有必要替换
  609. if greater and not self:GetPsionicEquipSlotRed(slot) then return nil end
  610. return goods_model:GetPsionicBagGoodsByID(self.psionic_power_higest_bagitem[slot])
  611. else
  612. return nil
  613. end
  614. else -- 身上没有穿戴的话就比较麻烦,由于装备槽位红点对这种情况的战斗力做了优化导致没有缓存,这里要首次点击要算一次战斗力
  615. local bag_list_by_slot = goods_model:GetPsionicBagItemBySlot(slot)
  616. local temp_power, heightest_power, heightest_equip_vo = 0, 0, nil
  617. local role_lv = RoleManager.Instance.mainRoleInfo.level
  618. for k2, bag_equip_vo in ipairs(bag_list_by_slot) do
  619. temp_power = self:GetPsionicEquipTotalPower(bag_equip_vo)
  620. -- 逐个判断最高战力的装备
  621. if heightest_power < temp_power then
  622. heightest_power = temp_power
  623. heightest_equip_vo = bag_equip_vo
  624. end
  625. end
  626. return heightest_equip_vo
  627. end
  628. return nil
  629. end
  630. -- 获取装备进阶页签红点 (slot:当更换了某个位置的装备之后,有则需要重新计算这个位置的红点)
  631. function PsionicModel:CheckPsionicAdvanceTabRed(slot)
  632. local bool = false
  633. local goods_model = GoodsModel:getInstance()
  634. local equip_data, slot_data, cur_exp_cfg, next_exp_cfg, advance_cost_cfg
  635. local function check_advance_slot_red(slot)
  636. equip_data = goods_model:GetPsionicEquipBySlot(slot)
  637. local temp_bool = false
  638. if equip_data then
  639. slot_data = self:GetPsionicSlotData(slot)
  640. cur_exp_cfg = Config.Nucleonlv[slot_data.lv]
  641. if cur_exp_cfg.next ~= 0 then -- 还能升级
  642. -- 追加判断是否是处于突破时,等待突破的期间没有红点
  643. next_exp_cfg = Config.Nucleonlv[cur_exp_cfg.next]
  644. if next_exp_cfg.grade ~= cur_exp_cfg.grade and slot_data.exp == cur_exp_cfg.exp then
  645. temp_bool = false
  646. else
  647. advance_cost_cfg = stringtotable(cur_exp_cfg.cost)[1]
  648. -- 当存在所需材料时就有红点
  649. temp_bool = goods_model:GetTypeGoodsNum(advance_cost_cfg[2]) > 0
  650. end
  651. end
  652. end
  653. self.psionic_advance_slot_red[slot] = temp_bool
  654. bool = bool or temp_bool
  655. end
  656. if slot then
  657. check_advance_slot_red(slot)
  658. end
  659. if not bool then -- 主要针对圣物进阶之后,本装备已经没有红点,但是其他装备的红点是由背包材料决定,这里需要判断其他槽位
  660. for i = 4, 7 do
  661. if not slot or slot ~= i then
  662. check_advance_slot_red(i)
  663. end
  664. end
  665. end
  666. return bool
  667. end
  668. function PsionicModel:GetPsionicAdvanceRed(slot)
  669. if slot then
  670. return self.psionic_advance_slot_red[slot]
  671. else
  672. return self.psionic_advance_slot_red
  673. end
  674. end
  675. -- 获取突破红点
  676. -- 2021年6月30日追加 提前缓存好当前背包中所有的可突破的装备id,并调整红点提示规则
  677. function PsionicModel:CheckPsionicBreakTabRed(slot)
  678. local bool = false
  679. local goods_model = GoodsModel:getInstance()
  680. local cost_cfg
  681. local function check_equip_break_red(equip_data, equip_slot)
  682. local break_red = false
  683. if equip_data then
  684. if equip_data.next ~= 0 then
  685. -- 加载材料装备和基础材料的消耗配置
  686. cost_cfg = equip_data.cost or {}
  687. if not IsTableEmpty(cost_cfg) then
  688. for k, v in ipairs(cost_cfg) do
  689. local typeId, lock = goods_model:GetMappingTypeId(v[1], v[2])
  690. local have_num = goods_model:GetPsionicBagGoodsNumByTypeID(typeId, equip_data.goods_id)
  691. break_red = have_num >= v[3]
  692. end
  693. end
  694. end
  695. self.psionic_break_equip_red[equip_data.goods_id] = break_red
  696. end
  697. self.psionic_break_slot_red[equip_slot] = break_red or self.psionic_break_slot_red[equip_slot]
  698. bool = bool or break_red
  699. end
  700. -- 获取背包列表
  701. self.psionic_bag_data = self.psionic_bag_data or {}
  702. local cur_equip_data
  703. if slot then
  704. -- 需要清除一次槽位红点
  705. self.psionic_break_slot_red[slot] = false
  706. -- 当前穿戴
  707. cur_equip_data = goods_model:GetPsionicEquipBySlot(slot)
  708. check_equip_break_red(cur_equip_data, slot)
  709. -- 背包内装备的突破红点
  710. for k, v in pairs(self.psionic_bag_data) do
  711. if v.subtype == slot then
  712. check_equip_break_red(v, v.subtype)
  713. end
  714. end
  715. end
  716. if not bool then -- 没有更新到红点,就再刷新其他页签
  717. for i = 4, 7 do
  718. if not slot or slot ~= i then
  719. -- 清除一次槽位红点再开始计算
  720. self.psionic_break_slot_red[i] = false
  721. -- 当前穿戴
  722. cur_equip_data = goods_model:GetPsionicEquipBySlot(i)
  723. check_equip_break_red(cur_equip_data, i)
  724. end
  725. end
  726. -- 背包内装备的突破红点
  727. for k, v in pairs(self.psionic_bag_data) do
  728. if not slot or slot ~= v.subtype then
  729. check_equip_break_red(v, v.subtype)
  730. end
  731. end
  732. end
  733. return bool
  734. end
  735. -- 获取圣物系统突破页签槽位红点
  736. function PsionicModel:GetPsionicBreakSlotRed(slot)
  737. if slot then
  738. return self.psionic_break_slot_red[slot] or false
  739. else
  740. return self.psionic_break_slot_red[slot]
  741. end
  742. end
  743. function PsionicModel:GetPsionicBreakEquipRed(goods_id)
  744. if goods_id then
  745. return self.psionic_break_equip_red[goods_id] or false
  746. else
  747. return self.psionic_break_equip_red
  748. end
  749. end
  750. -- 获取洗练红点
  751. function PsionicModel:CheckPsionicWashTabRed(slot)
  752. local bool = false
  753. local goods_model = GoodsModel:getInstance()
  754. local equip_data, slot_data, wash_cfg, cost_data, lv_data
  755. local function check_wash_slot_red(slot)
  756. local wash_red = false
  757. local break_red = false
  758. equip_data = goods_model:GetPsionicEquipBySlot(slot)
  759. if equip_data then
  760. local all_attr_max = true
  761. slot_data = self:GetPsionicSlotData(slot)
  762. wash_cfg = self:GetPsionicWashCfg(equip_data.subtype, slot_data.grade)
  763. lv_data = Config.Nucleonlv[slot_data.lv]
  764. local stage_max_lv, max_stage = self:GetPsionicSlotStageMaxLevel(slot_data.grade)
  765. cost_data = wash_cfg.cost[1]
  766. -- 突破红点
  767. local slot_can_break = stage_max_lv <= slot_data.lv and slot_data.exp >= lv_data.exp -- 当前槽位已达到阶段满级满经验
  768. -- 整合协议属性
  769. local attr_id_list = {}
  770. for k, v in pairs(slot_data.attrs) do
  771. attr_id_list[v.attr_id] = v.attr_value
  772. end
  773. for k, v in pairs(wash_cfg.maxs) do
  774. -- 如果有一条属性没有拉满,那就把这个标识设为false,而为true时有材料也不给红点
  775. local cur_val = attr_id_list[v[1]] or 0
  776. all_attr_max = all_attr_max and tonumber(v[2]) <= cur_val
  777. -- 槽位突破红点(需判断有没有达到最终阶段且当前阶段等级升满了)
  778. break_red = slot_can_break and max_stage > slot_data.grade and (break_red or v[2] <= cur_val)
  779. end
  780. -- 满足单次洗练的材料就有红点
  781. wash_red = not all_attr_max and goods_model:GetTypeGoodsNum(cost_data[2]) >= cost_data[3] or false
  782. --宠物生活技能多一次免费洗练的机会 如果词条满了不能再洗练,那免费洗练也不给
  783. if not all_attr_max then
  784. local left_free_wash_times = self:GetPsionicFreeWashTimes()
  785. wash_red = wash_red or left_free_wash_times > 0
  786. end
  787. end
  788. self.psionic_wash_slot_red[slot] = wash_red
  789. self.psionic_wash_break_slot_red[slot] = break_red
  790. -- bool = bool or wash_red -- 突破的红点需要去进阶那边操作,就不要强制到页签上面去
  791. bool = bool or wash_red or break_red
  792. end
  793. if slot then
  794. check_wash_slot_red(slot)
  795. end
  796. if not bool then
  797. for i = 4, 7 do
  798. if not slot or slot ~= i then
  799. check_wash_slot_red(i)
  800. end
  801. end
  802. end
  803. return bool
  804. end
  805. -- 获取圣物洗练界面洗练按钮红点缓存
  806. function PsionicModel:GetPsionicWashSlotRed(slot)
  807. if slot then
  808. return self.psionic_wash_slot_red[slot] or false
  809. else
  810. return self.psionic_wash_slot_red
  811. end
  812. end
  813. -- 获取圣物洗练界面突破按钮红点缓存
  814. function PsionicModel:GetPsionicWashSlotBreakRed(slot)
  815. if slot then
  816. return self.psionic_wash_break_slot_red[slot] or false
  817. else
  818. return self.psionic_wash_break_slot_red
  819. end
  820. end
  821. -- 检查技能页签红点
  822. function PsionicModel:CheckPsionicSkillTabRed(slot)
  823. local bool = false
  824. local slot_awake_lv, skill_slot_cfg, slot_data
  825. local goods_model = GoodsModel:getInstance()
  826. local function check_skill_red_by_slot(slot)
  827. self.psionic_skill_slot_red[slot] = false -- 清除缓存
  828. slot_data = self:GetPsionicSlotData(slot)
  829. if slot_data and slot_data.skill_lv > 0 then -- 判断是否已经激活了圣物技能
  830. slot_awake_lv = slot_data.sec_lv -- 觉醒等级
  831. skill_slot_cfg = self:GetPsionicAwakeCfg(slot, slot_awake_lv)
  832. if skill_slot_cfg and skill_slot_cfg.next ~= 0 then -- 不满级才有红点
  833. local cost = skill_slot_cfg.cost[1]
  834. local need_num = cost[3]
  835. local have_num = goods_model:GetTypeGoodsNum(cost[2])
  836. self.psionic_skill_slot_red[slot] = have_num >= need_num
  837. bool = bool or self.psionic_skill_slot_red[slot]
  838. end
  839. end
  840. end
  841. if slot then
  842. check_skill_red_by_slot(slot)
  843. end
  844. if not bool then
  845. for i = 4, 7 do
  846. if not slot or i ~= slot then
  847. check_skill_red_by_slot(i)
  848. end
  849. end
  850. end
  851. return bool
  852. end
  853. function PsionicModel:GetPsionicSkillSlotRedCache(slot)
  854. if slot then
  855. return self.psionic_skill_slot_red[slot]
  856. else
  857. return self.psionic_skill_slot_red
  858. end
  859. end
  860. -- 检查数据挖掘界面红点
  861. function PsionicModel:CheckPsionicDataDigTabRed(pool_type)
  862. local bool = false
  863. -- 寻宝是否开放
  864. local draw_open = GetModuleIsOpen(139, 7)
  865. local function check_datadig_by_pooltype(pool_type)
  866. local pool_data, cfg_data
  867. local temp_bool
  868. self.psionic_datadig_pooltype_red[pool_type] = self.psionic_datadig_pooltype_red[pool_type] or {}
  869. pool_data = self:GetPsionicDigData(pool_type)
  870. cfg_data = Config.Nucleonpool[pool_type]
  871. self:ClearFreePoolTimerByType(pool_type)
  872. if draw_open and pool_data and cfg_data then
  873. self.psionic_datadig_pooltype_red[pool_type].free_red = false
  874. if pool_data.isfirst == 0 then -- 终生首次
  875. temp_bool = true
  876. self.psionic_datadig_pooltype_red[pool_type].free_red = true
  877. else
  878. if pool_data.remain > 0 then
  879. local function free_pull_timer()
  880. if pool_data.rtime <= TimeUtil:getServerTime() then -- 已经过了冷却时间
  881. temp_bool = true
  882. self.psionic_datadig_pooltype_red[pool_type].free_red = temp_bool
  883. self.psionic_red_cache[PsionicConst.TabId.PDataDig] = temp_bool
  884. self:Fire(PsionicConst.UPDATE_RED_BY_TABID, PsionicConst.TabId.PDataDig, temp_bool)
  885. self:Fire(PsionicConst.UPDATE_DATADIG_RED_BY_TYPE, pool_type)
  886. GlobalEventSystem:Fire(EventName.SHOW_FUNCTION_RED_POINT, 139, temp_bool) --通知自己功能按钮红点
  887. self:ClearFreePoolTimerByType(pool_type)
  888. end
  889. end
  890. self["free_pull_timer"..pool_type] = GlobalTimerQuest:AddPeriodQuest(free_pull_timer, 1, -1)
  891. free_pull_timer()
  892. end
  893. local single_pull_num = GoodsModel:getInstance():GetTypeGoodsNum(cfg_data.one)
  894. local ten_pull_num = GoodsModel:getInstance():GetTypeGoodsNum(cfg_data.ten)
  895. self.psionic_datadig_pooltype_red[pool_type].single_red = single_pull_num >= 6 and single_pull_num < 9 -- 单抽券超过6张少于9张给单抽红点
  896. self.psionic_datadig_pooltype_red[pool_type].ten_red = ten_pull_num > 0 or single_pull_num >= 9 -- 存在十连或者9张以上单抽给十连抽的红点
  897. temp_bool = temp_bool or self.psionic_datadig_pooltype_red[pool_type].single_red or self.psionic_datadig_pooltype_red[pool_type].ten_red
  898. end
  899. if temp_bool then
  900. self:ClearFreePoolTimerByType(pool_type)
  901. end
  902. bool = bool or temp_bool
  903. -- 数据挖掘这边单独起一个刷新事件
  904. self:Fire(PsionicConst.UPDATE_DATADIG_RED_BY_TYPE, pool_type)
  905. end
  906. end
  907. if pool_type then
  908. check_datadig_by_pooltype(pool_type)
  909. end
  910. if not bool then -- 没有页签红点的情况下,更新另一个池子的红点
  911. if pool_type then
  912. check_datadig_by_pooltype(pool_type == PsionicConst.DrawPoolType.Normal and PsionicConst.DrawPoolType.Deep or PsionicConst.DrawPoolType.Normal)
  913. else
  914. check_datadig_by_pooltype(PsionicConst.DrawPoolType.Normal)
  915. check_datadig_by_pooltype(PsionicConst.DrawPoolType.Deep)
  916. end
  917. end
  918. return bool
  919. end
  920. function PsionicModel:GetPsionicDataDigPoolRedCache(pool_type)
  921. if pool_type then
  922. return self.psionic_datadig_pooltype_red[pool_type]
  923. else
  924. return self.psionic_datadig_pooltype_red
  925. end
  926. end
  927. function PsionicModel:ClearFreePoolTimerByType(pool_type)
  928. if self["free_pull_timer" .. pool_type] then
  929. GlobalTimerQuest:CancelQuest(self["free_pull_timer" .. pool_type])
  930. self["free_pull_timer" .. pool_type] = nil
  931. end
  932. end
  933. -- 替换完某件装备后,保险起见要删除这件装备在红点中的缓存
  934. function PsionicModel:ClearTargetEquipRedCache(goods_id)
  935. self.psionic_power_higher_bagitem[goods_id] = nil
  936. end
  937. -- 检查圣物兑换商店红点
  938. function PsionicModel:CheckPsionicExchangeRed( )
  939. local bool = false
  940. local goods_model = GoodsModel:getInstance()
  941. local cost, have_num, is_enough
  942. for k, v in ipairs(self.psionic_exchange_shop_cfg) do
  943. cost = stringtotable(v.cost)[1]
  944. have_num = goods_model:GetTypeGoodsNum(cost[2])
  945. is_enough = have_num >= cost[3]
  946. bool = bool or is_enough
  947. self.psionic_exchange_sort_red[v.sort] = is_enough
  948. end
  949. return bool
  950. end
  951. function PsionicModel:GetPsionicExchangeRed(sort)
  952. if sort then
  953. return self.psionic_exchange_sort_red[sort] or false
  954. else
  955. for k, v in pairs(self.psionic_exchange_sort_red) do
  956. if v == true then
  957. return true
  958. end
  959. end
  960. return false
  961. end
  962. end
  963. ----------------
  964. -- 数据处理相关 --
  965. ----------------
  966. -- 计算圣物装备的总战斗力
  967. function PsionicModel:GetPsionicEquipTotalPower(goods_vo)
  968. if goods_vo then
  969. local slot = goods_vo.subtype
  970. if self._ps_equip_power_list[slot].goods_list[goods_vo.goods_id] then
  971. -- 存在战斗力缓存,则返回缓存即可
  972. return self._ps_equip_power_list[slot].goods_list[goods_vo.goods_id]
  973. else
  974. local slot_lv = self._ps_equip_power_list[slot].slot_lv
  975. -- 整合数据,根据槽位等级叠加属性,计算战力并返回
  976. local attr_list = {}
  977. for k, v in pairs(goods_vo.cfg_attrs) do
  978. attr_list[#attr_list+1] = {
  979. [1] = v[1],
  980. [2] = v[2] + v[3] * slot_lv
  981. }
  982. end
  983. local power = GetFighting(attr_list)
  984. self._ps_equip_power_list[slot].goods_list[goods_vo.goods_id] = power
  985. return power
  986. end
  987. end
  988. return 0
  989. end
  990. -- 通过两个等级的属性数据获得一个数据链表
  991. function PsionicModel:GetPsionicLevelAttrList(cfg_cur, cfg_next)
  992. local temp_tb = {}
  993. cfg_cur = cfg_cur or {}
  994. cfg_next = cfg_next or {}
  995. for k, v in ipairs(cfg_next) do
  996. temp_tb[v[1]] = temp_tb[v[1]] or {type = v[1], sort_id = k}
  997. temp_tb[v[1]].next_val = v[2]
  998. end
  999. for k, v in ipairs(cfg_cur) do
  1000. temp_tb[v[1]] = temp_tb[v[1]] or {type = v[1], sort_id = k}
  1001. temp_tb[v[1]].cur_val = v[2]
  1002. end
  1003. local tb = {}
  1004. for k, v in pairs(temp_tb) do
  1005. tb[v.sort_id] = v
  1006. end
  1007. return tb
  1008. end
  1009. -- 计算目标圣物装备上随机属性的战力列表并按需求排序
  1010. -- sort_type:排序类型 0降序 1升序
  1011. function PsionicModel:GetPsionicEquipAttrPowerBySortType(attr_list, sort_type)
  1012. local power_list = {}
  1013. local temp_power = 0
  1014. if attr_list then
  1015. for k, v in pairs(attr_list) do
  1016. temp_power = GetFighting({{[1] = v[3], [2] = v[4]}})
  1017. power_list[#power_list+1] = {power = temp_power, type = v[3]}
  1018. end
  1019. end
  1020. local sort_func_list = {
  1021. [0] = function ( a, b )
  1022. return a.power > b.power
  1023. end,
  1024. [1] = function ( a, b )
  1025. return a.power < b.power
  1026. end,
  1027. }
  1028. local sort_func = sort_func_list[sort_type]
  1029. table.sort(power_list, sort_func)
  1030. return power_list
  1031. end
  1032. -- 根据属性的颜色品质,星级和条目获取属性配置
  1033. function PsionicModel:GetRefactorAttrCfg(color, star, code)
  1034. if not color or not star or not code then return nil end
  1035. local key = color .. "@" .. star .. "@" .. code
  1036. local cfg = Config.Nucleonrule[key]
  1037. return cfg
  1038. end
  1039. -- 获取目标圣物装备对应的槽位信息
  1040. function PsionicModel:GetPsionicEquipSlotByGoodsId(goods_id)
  1041. local slot = nil
  1042. if goods_id then
  1043. local goods_vo = GoodsModel:getInstance():GetPsionicEquipGoodsByID(goods_id)
  1044. or GoodsModel:getInstance():GetPsionicBagGoodsByID(goods_id)
  1045. if goods_vo then
  1046. slot = goods_vo.subtype
  1047. end
  1048. end
  1049. return slot
  1050. end
  1051. -- 根据目标装备数据,获得该装备列表能解锁的圣环阶段
  1052. -- 返回值:解锁阶段,装备颜色列表
  1053. function PsionicModel:GetPsionicEffectStage(equip_data)
  1054. local color_list = { [2] = 0, [3] = 0, [4] = 0, [5] = 0, [6] = 0, }
  1055. if not equip_data then -- 不传的话就默认拿玩家自己的装备数据
  1056. equip_data = {}
  1057. for i = 4, 7 do
  1058. slot_data = GoodsModel:getInstance():GetPsionicEquipBySlot(i)
  1059. if slot_data then
  1060. table.insert(equip_data, slot_data)
  1061. for j = 2, 6 do
  1062. if slot_data.color >= j then
  1063. color_list[j] = color_list[j] + 1
  1064. else
  1065. break
  1066. end
  1067. end
  1068. end
  1069. end
  1070. end
  1071. local lowest_color, activated
  1072. local state
  1073. if TableSize(equip_data) < 4 then -- 装备没有带齐,那就不给光环效果或者给个1级的展示效果
  1074. state = 0
  1075. end
  1076. if not state then
  1077. -- 穿戴装备齐全了,就找出最低品质的装备来决定展示的特效
  1078. for k, v in pairs(equip_data) do
  1079. lowest_color = lowest_color and (lowest_color > v.color and v.color or lowest_color) or v.color
  1080. end
  1081. if lowest_color < 3 then -- 最低品质圣物低于紫色品质
  1082. state = 0
  1083. elseif lowest_color == 3 then -- 展示紫色品质圣物特效
  1084. state = 1
  1085. elseif lowest_color == 4 then -- 展示橙色品质圣物特效
  1086. state = 2
  1087. elseif lowest_color >= 5 then -- 展示红色品质圣物特效
  1088. state = 3
  1089. end
  1090. end
  1091. return state, color_list
  1092. end
  1093. function PsionicModel:CheckPsionicEffectStage( )
  1094. if self.ps_effect_show_status == nil then return end
  1095. local cur_equip_state = self:GetPsionicEffectStage() -- 当前圣物装备品质下的可激活阶段数
  1096. local cur_state = self.ps_effect_show_status[1] or 0 -- 当前佩戴的圣环阶段数
  1097. local top_state = self.ps_effect_show_status[2] or 0 -- 历史激活的圣环最高阶段数缓存
  1098. if cur_state > cur_equip_state then -- 当前的装备圣环阶段数达不到当前穿戴的圣环阶段数,则需要强制设置为0脱下圣环
  1099. self:SavePsionicEffectShowStatus(0)
  1100. end
  1101. if top_state < cur_equip_state then -- 当前装备的圣环阶段能超过了缓存的最高阶段数,则赋予红点,且修改缓存中最高的解锁阶段数缓存
  1102. self.ps_effect_show_status[2] = cur_equip_state
  1103. for i = top_state + 1, cur_equip_state do
  1104. self:SavePsionicEffectStatusRed(i, true, i == cur_equip_state)
  1105. end
  1106. end
  1107. end
  1108. -- 获得该模型需要的圣物光环资源名
  1109. function PsionicModel:GetPsionicEffectStageByid(res_id)
  1110. return "effect_hunhuan_00" .. res_id
  1111. end
  1112. -- 获取当前是否在大世界显示玩家圣环效果
  1113. function PsionicModel:GetPsionicEffectShowStatus( )
  1114. if self.ps_effect_show_status == nil then
  1115. self.ps_effect_show_status = CookieWrapper.Instance:GetCookie(CookieLevelType.Account, CookieKey.PSIONIC_EFFECT_SHOW_STATUS) or {0, 0, {}}
  1116. -- 兼容旧缓存
  1117. if type(self.ps_effect_show_status) == "boolean" then
  1118. self.ps_effect_show_status = {0, 0, {}}
  1119. end
  1120. if type(self.ps_effect_show_status) == "number" then
  1121. self.ps_effect_show_status = {self.ps_effect_show_status, self.ps_effect_show_status, {}}
  1122. end
  1123. --
  1124. end
  1125. return self.ps_effect_show_status
  1126. end
  1127. -- status 目标使用的阶段数 cur_equip_state 当前激活的最高阶段数(默认不传,只有在装备变动的时候会更新)
  1128. function PsionicModel:SavePsionicEffectShowStatus(status, cur_equip_state)
  1129. if self.ps_effect_show_status then
  1130. cur_equip_state = cur_equip_state or self.ps_effect_show_status[2]
  1131. if status ~= self.ps_effect_show_status[1] then
  1132. self.ps_effect_show_status[1] = status
  1133. if self.ps_effect_show_status[2] < cur_equip_state then
  1134. self.ps_effect_show_status[2] = status
  1135. end
  1136. CookieWrapper.Instance:SaveCookie(CookieLevelType.Account, CookieTimeType.TYPE_ALWAYS, CookieKey.PSIONIC_EFFECT_SHOW_STATUS, self.ps_effect_show_status)
  1137. CookieWrapper.Instance:WriteAll()
  1138. end
  1139. -- 更新场景的魂环
  1140. self:Fire(PsionicConst.UPDATE_PSIONIC_EFFECT)
  1141. end
  1142. end
  1143. -- status 目标使用的阶段数
  1144. function PsionicModel:SavePsionicEffectStatusRed(status, bool, save_cookie)
  1145. if self.ps_effect_show_status then
  1146. status = status or 0
  1147. bool = bool and true or false
  1148. self.ps_effect_show_status[3] = self.ps_effect_show_status[3] or {}
  1149. -- 检查默认,默认没有红点
  1150. self.ps_effect_show_status[3][status] = self.ps_effect_show_status[3][status] or false
  1151. if bool ~= self.ps_effect_show_status[3] then
  1152. self.ps_effect_show_status[3][status] = bool
  1153. if save_cookie then
  1154. CookieWrapper.Instance:SaveCookie(CookieLevelType.Account, CookieTimeType.TYPE_ALWAYS, CookieKey.PSIONIC_EFFECT_SHOW_STATUS, self.ps_effect_show_status)
  1155. CookieWrapper.Instance:WriteAll()
  1156. end
  1157. end
  1158. self:CheckPsionicRedByTabID(PsionicConst.TabId.PArmor, true)
  1159. end
  1160. end
  1161. --剩余免费洗练次数
  1162. function PsionicModel:UpdatePsionicFreeWashTimes(vo)
  1163. self.ps_left_free_wash_times = vo.free_times
  1164. end
  1165. function PsionicModel:GetPsionicFreeWashTimes( )
  1166. return self.ps_left_free_wash_times
  1167. end
  1168. -- 圣物系统道具飞入限制
  1169. function PsionicModel:SetPsionicShowFlyGoods(show)
  1170. self.psionic_show_goods_fly = show
  1171. end
  1172. function PsionicModel:GetPsionicShowFlyGoods( )
  1173. return self.psionic_show_goods_fly
  1174. end
  1175. --打开技能激活展示界面
  1176. function PsionicModel:OpenSkillActiveShowView(skill_id)
  1177. if skill_id then
  1178. local skill_cfg = ConfigItemMgr.Instance:GetSkillItem(skill_id)
  1179. if skill_cfg then
  1180. local desc = ""
  1181. if skill_cfg.lvs and skill_cfg.lvs[1] then
  1182. desc = skill_cfg.lvs[1].desc
  1183. end
  1184. local show_vos = {{
  1185. type = 2,
  1186. is_out_res=true,
  1187. outside_res = GameResPath.GetSkillIcon(skill_id),
  1188. saying = desc or "",
  1189. ignore_fly=true,
  1190. id=skill_id,
  1191. show_time=15,
  1192. is_angry = true,
  1193. skill_id = skill_id,
  1194. res_name = GameResPath.GetSkillIcon(skill_id),
  1195. name = skill_cfg.name,
  1196. ignore_auto_task = true,
  1197. }}
  1198. local view = NewFuncOpenView.New()
  1199. view:Open(show_vos)
  1200. end
  1201. end
  1202. end