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

309 行
13 KiB

  1. PsionicSkillView = PsionicSkillView or BaseClass(BaseItem)
  2. local PsionicSkillView = PsionicSkillView
  3. function PsionicSkillView:__init(parent_wnd,prefab_asset,layer_name)
  4. self.base_file = "psionic"
  5. self.layout_file = "PsionicSkillView"
  6. self.parent_wnd = parent_wnd
  7. self.layer_name = layer_name
  8. self.model = PsionicModel:getInstance()
  9. self.goods_model = GoodsModel:getInstance()
  10. self.cur_lv_pro = {}
  11. self.next_lv_pro = {}
  12. self.upgrade_need_num = nil -- 缓存升级需要材料数
  13. self:Load()
  14. end
  15. function PsionicSkillView:Load_callback()
  16. local nodes = {
  17. "bg:raw",
  18. "upgrade_btn:obj:img", "upgrade_btn/upgrade_red:obj", "upgrade_btn/upgrade_btn_lb:tmp",
  19. -- 技能等级描述相关节点
  20. "skill_stage_lb1:tmp",
  21. "skill_stage_lb2:tmp",
  22. "skill_progress_con1",
  23. "skill_progress_con2:obj",
  24. "arrow1:obj",
  25. "arrow2:obj",
  26. "skill_lvBg1",
  27. "skill_lvBg2:obj",
  28. -- 等级战力相关
  29. "power_con:obj",
  30. "power_con/up_arrow:obj",
  31. "power_con/power_cur:txt",
  32. "power_con/power_up:tmp",
  33. "power_con/power_lb1:tmp",
  34. -- 技能节点相关
  35. "skill_icon1:img",
  36. "skill_lv1:tmp",
  37. "skill_icon2:obj:img",
  38. "skill_lv2:tmp",
  39. -- 技能描述
  40. "skill_desc:tmp",
  41. -- 技能描述容器内节点
  42. "attr_scroll", "attr_scroll/Viewport/attr_con",
  43. -- 觉醒花费相关
  44. "cost_item_bg:obj",
  45. "cost_item_con", "cost_item_name:tmp", "cost_item_num:tmp",
  46. }
  47. self:GetChildren(nodes)
  48. self.power_lb1_tmp.text = "战力"
  49. lua_resM:setOutsideRawImage(self, self.bg_raw, GameResPath.GetViewBigBg("ps_main_skill_bg"))
  50. self.cost_item = UIObjPool:getInstance():PopItem(UIObjPool.UIType.AwardItem, self.cost_item_con)
  51. self.cost_item:SetAnchoredPosition(0, 0)
  52. self.cost_item:SetItemSize(78, 78)
  53. self.cost_item:SetVisible(false)
  54. self:AddEvents()
  55. if self.need_refreshData then
  56. self:UpdateView()
  57. end
  58. end
  59. function PsionicSkillView:AddEvents( )
  60. local function click_event(target, x, y)
  61. if target == self.upgrade_btn_obj then -- 升级按钮
  62. self:OnClickUpgradeBtn()
  63. end
  64. end
  65. AddClickEvent(self.upgrade_btn_obj, click_event, LuaSoundManager.SOUND_UI.NONE)
  66. -- 技能等级提升后刷新技能等级相关数据
  67. local function update_skill_data(pos)
  68. if not pos or (self.skill_data and self.skill_data.pos == pos) then
  69. self:UpdateView()
  70. end
  71. end
  72. self:BindEvent(self.model, PsionicConst.UPDATE_SLOT_SKILL, update_skill_data)
  73. -- 技能觉醒等级提升后刷新下级突破配置及消耗信息
  74. local function update_awake_data(pos)
  75. if not pos or (self.skill_data and self.skill_data.pos == pos) then
  76. self:UpdateAttrItem()
  77. self:UpdateUpgradeCost()
  78. self:UpdateSkillRed()
  79. end
  80. end
  81. self:BindEvent(self.model, PsionicConst.UPDATE_PSIONIC_AWAKE_DATA, update_awake_data)
  82. local function update_skill_red(tab_id)
  83. if not tab_id or tab_id == PsionicConst.TabId.PSkill then
  84. self:UpdateUpgradeCost()
  85. end
  86. end
  87. self:BindEvent(self.model, PsionicConst.UPDATE_RED_BY_TABID, update_skill_red)
  88. end
  89. -- data为服务端返回的技能数据 13900
  90. function PsionicSkillView:SetData( skill_data )
  91. self.skill_data = skill_data
  92. if self.is_loaded then
  93. self.need_refreshData = false
  94. self:UpdateView()
  95. else
  96. self.need_refreshData = true
  97. end
  98. end
  99. function PsionicSkillView:UpdateView( )
  100. if self.skill_data then
  101. self.skill_lv = self.skill_data and self.skill_data.skill_lv or 1 -- 技能等级
  102. self.awake_lv = self.skill_data and self.skill_data.sec_lv or 0 -- 觉醒等级
  103. -- 技能等级配置 Config.Nucleonsection
  104. self.skill_lv_cfg = self.model:GetPsionicAwakeCfg(self.skill_data.pos, self.awake_lv)
  105. self.skill_cfg = ConfigItemMgr.Instance:GetSkillItem(self.skill_data.skill_id)
  106. local is_max = self.skill_lv_cfg.next == 0 -- 是否已经升满
  107. self.next_skill_lv_cfg = not is_max and self.model:GetPsionicAwakeCfg(self.skill_data.pos, self.awake_lv + 1) or nil
  108. self.sec_skill_id = self.next_skill_lv_cfg and self.next_skill_lv_cfg.sec_skill[1][1] or nil
  109. if not self.sec_skill_id then -- 拿不到下一级的配置,就拿当前的配置
  110. self.sec_skill_id = self.skill_lv_cfg and self.skill_lv_cfg.sec_skill[1][1] or nil
  111. end
  112. self.next_sec_skill_lv = self.next_skill_lv_cfg and self.next_skill_lv_cfg.sec_skill[1][2] or 1
  113. self.sec_skill_cfg = self.sec_skill_id and ConfigItemMgr.Instance:GetSkillItem(self.sec_skill_id) or nil
  114. self:UpdateBasicData()
  115. self:UpdateSkillLvData()
  116. self:UpdateAttrItem()
  117. self:UpdateUpgradeCost()
  118. end
  119. self:UpdateSkillRed()
  120. end
  121. -- 加载基础数据(一次更新只加载一次)
  122. function PsionicSkillView:UpdateBasicData( )
  123. -- self.skill_name_tmp.text = Trim(self.skill_cfg.name)
  124. lua_resM:setOutsideImageSprite(self, self.skill_icon1_img, GameResPath.GetSkillIcon(self.skill_data.skill_id))
  125. lua_resM:setOutsideImageSprite(self, self.skill_icon2_img, GameResPath.GetSkillIcon(self.skill_data.skill_id))
  126. end
  127. -- 根据技能等级记载配置数据
  128. function PsionicSkillView:UpdateSkillLvData( )
  129. local is_max = self.skill_lv_cfg.next == 0 -- 是否已经升满
  130. self.skill_lv1_tmp.text = string.format("Lv.%s", self.awake_lv)
  131. self.skill_lv2_tmp.text = is_max and "" or string.format("Lv.%s", self.awake_lv+1)
  132. -- 加载描述
  133. -- 获取目标等级的配置
  134. local desc = ""
  135. local lvs_cfg = self.skill_cfg.lvs and self.skill_cfg.lvs[1] or nil -- 主技能只有1级
  136. if lvs_cfg then
  137. desc = Trim(lvs_cfg.desc)
  138. end
  139. -- 下一级的描述
  140. local next_lvs_cfg = not is_max and self.sec_skill_cfg.lvs and self.sec_skill_cfg.lvs[self.next_sec_skill_lv] or nil
  141. if next_lvs_cfg then
  142. desc = desc .. string.format("\n<color=#fdffc2>下一级:%s</color>", Trim(next_lvs_cfg.desc))
  143. elseif is_max then -- 满级的情况,就使用当前等级的
  144. local cur_sec_skill_lv = self.skill_lv_cfg and self.skill_lv_cfg.sec_skill[1] and self.skill_lv_cfg.sec_skill[1][2] or 1
  145. desc = desc .. string.format("\n<color=#fdffc2>%s</color>", Trim(self.sec_skill_cfg.lvs[cur_sec_skill_lv].desc))
  146. end
  147. self.skill_desc_tmp.text = desc
  148. -- 加载等级描述
  149. self.skill_stage_lb1_tmp.text = string.format("%s段觉醒", ChineseNumber(self.awake_lv))
  150. self.skill_stage_lb2_tmp.text = is_max and "" or string.format("%s段觉醒", ChineseNumber(self.awake_lv+1))
  151. -- 加载进度节点
  152. -- 当前等级
  153. for i = 1, 6 do
  154. self.cur_lv_pro[i] = self.cur_lv_pro[i] or UiFactory.createChild(self.skill_progress_con1, UIType.Image, "pro" .. i)
  155. SetAnchoredPosition(self.cur_lv_pro[i].transform, (i-3) * 12 - 6, -6)
  156. lua_resM:setImageSprite(self, self.cur_lv_pro[i]:GetComponent("Image"), "psionic_asset",
  157. i <= self.awake_lv and "ps_skill_pro1" or "ps_skill_pro0", true)
  158. end
  159. -- 下一等级
  160. if not is_max then
  161. for i = 1, 6 do
  162. self.next_lv_pro[i] = self.next_lv_pro[i] or UiFactory.createChild(self.skill_progress_con2, UIType.Image, "pro" .. i)
  163. SetAnchoredPosition(self.next_lv_pro[i].transform, (i-3) * 12 - 6, -6)
  164. lua_resM:setImageSprite(self, self.next_lv_pro[i]:GetComponent("Image"), "psionic_asset",
  165. i <= (self.awake_lv + 1) and "ps_skill_pro1" or "ps_skill_pro0", true)
  166. end
  167. end
  168. -- 根据技能等级调整节点
  169. self:UpdateNodePos(is_max)
  170. end
  171. -- 加载属性节点和升级道具
  172. function PsionicSkillView:UpdateAttrItem( )
  173. local is_max = self.skill_lv_cfg.next == 0 -- 是否已经升满
  174. self.attr_next = not is_max and self.model:GetPsionicAwakeCfg(self.skill_data.pos, self.skill_lv_cfg.next) or nil
  175. local info_list = {}
  176. -- 组合配置
  177. local cur_attr = self.skill_lv_cfg.attrs
  178. local cur_power = GetFighting(cur_attr)
  179. self.power_cur_txt.text = cur_power
  180. local next_attr = self.attr_next and self.attr_next.attrs or nil
  181. -- 更新战力和战力节点位置
  182. local total_len = self.power_cur_txt.preferredWidth + self.power_lb1_tmp.preferredWidth
  183. if next_attr then
  184. local next_power = GetFighting(next_attr)
  185. self.power_up_tmp.text = next_power - cur_power
  186. total_len = total_len + self.up_arrow.sizeDelta.x + self.power_up_tmp.preferredWidth + 15
  187. end
  188. local offset_x = (self.power_con.sizeDelta.x - total_len) / 2
  189. SetAnchoredPositionX(self.power_lb1, offset_x)
  190. SetAnchoredPositionX(self.power_cur, offset_x + self.power_lb1_tmp.preferredWidth + 5)
  191. SetAnchoredPositionX(self.up_arrow, next_attr and self.power_cur.anchoredPosition.x + self.power_cur_txt.preferredWidth + 5 or 999999)
  192. SetAnchoredPositionX(self.power_up, self.up_arrow.anchoredPosition.x + 20)
  193. local combine_attr_list = self.model:GetPsionicLevelAttrList(cur_attr, next_attr)
  194. -- 属性条目
  195. for k, v in ipairs(combine_attr_list) do
  196. info_list[#info_list+1] = {attr_list = v, is_max = is_max}
  197. end
  198. self.attr_item_creator = self.attr_item_creator or self:AddUIComponent(UI.ItemListCreator)
  199. local info = {
  200. data_list = info_list,
  201. scroll_view = self.attr_scroll,
  202. item_con = self.attr_con,
  203. item_class = PsionicSkillAttrItem,
  204. item_height = 36,
  205. start_x = 6,
  206. start_y = -4,
  207. space_y = 0,
  208. create_frequency = 0.01,
  209. alignment = UnityEngine.TextAnchor.UpperLeft,
  210. on_update_item = function(item, i, v)
  211. item:SetData(v, i)
  212. end,
  213. }
  214. self.attr_item_creator:UpdateItems(info)
  215. end
  216. -- 根据技能等级调整节点
  217. function PsionicSkillView:UpdateNodePos(is_max)
  218. self.arrow1_obj:SetActive(not is_max)
  219. self.arrow2_obj:SetActive(not is_max)
  220. self.skill_lvBg2_obj:SetActive(not is_max)
  221. self.skill_icon2_obj:SetActive(not is_max)
  222. self.skill_progress_con2_obj:SetActive(not is_max)
  223. SetAnchoredPositionX(self.skill_stage_lb1, is_max and 304.5 or 213)
  224. SetAnchoredPositionX(self.skill_progress_con1, is_max and 304.5 or 213)
  225. SetAnchoredPositionX(self.skill_icon1, is_max and 304.5 or 213)
  226. SetAnchoredPositionX(self.skill_lv1, is_max and 304.5 or 213)
  227. SetAnchoredPositionX(self.skill_lvBg1, is_max and 304.5 or 213)
  228. end
  229. function PsionicSkillView:UpdateUpgradeCost( )
  230. -- 加载升级花费
  231. if self.attr_next then -- 存在下一级的配置,就还没满级
  232. local cost = self.skill_lv_cfg.cost[1]
  233. local typeId, lock = self.goods_model:GetMappingTypeId(cost[1], cost[2])
  234. local have_num = self.goods_model:GetTypeGoodsNum(typeId)
  235. self.cost_item:SetData(typeId, 0, nil, nil, lock)
  236. self.cost_item:SetVisible(true)
  237. self.cost_item_name_tmp.text = self.goods_model:getGoodsName(typeId, true, true)
  238. self.cost_item_num_tmp.text = string.format("需求数量:<color=%s>%s</color>/%s",
  239. cost[3] <= have_num and ColorUtil.GREEN_DARK or ColorUtil.RED_DARK,
  240. have_num, cost[3])
  241. self.upgrade_need_num = cost[3]
  242. self.upgrade_btn_obj:SetActive(true)
  243. self.cost_item_bg_obj:SetActive(true)
  244. else
  245. self.cost_item_name_tmp.text = ""
  246. self.cost_item_num_tmp.text = ""
  247. self.cost_item:SetVisible(false)
  248. self.upgrade_btn_obj:SetActive(false)
  249. self.cost_item_bg_obj:SetActive(false)
  250. self.upgrade_need_num = nil
  251. end
  252. end
  253. -- 点击升级按钮回调
  254. function PsionicSkillView:OnClickUpgradeBtn( )
  255. if self.skill_data and self.attr_next and self.upgrade_need_num then
  256. local cost = self.skill_lv_cfg.cost[1]
  257. local have_num = self.goods_model:GetTypeGoodsNum(cost[2])
  258. if have_num < self.upgrade_need_num then
  259. Message.show("道具不足")
  260. UIToolTipMgr:getInstance():AppendGoodsTips(cost[2], x, y, nil, nil, nil, nil, true)
  261. return
  262. end
  263. -- local function ok( ... )
  264. if not self.model._block_skill_upgrade_click then
  265. self.model:Fire(PsionicConst.REQUEST_CCMD_EVENT, 13908, self.skill_data.pos)
  266. self.model._block_skill_upgrade_click = true
  267. end
  268. -- end
  269. -- local ask_str = string.format("是否确定消耗%s %s进行圣物觉醒?",
  270. -- self.upgrade_need_num, self.goods_model:getGoodsName(cost[2], true, false))
  271. -- Alert.show(ask_str, Alert.Type.Two, ok, nil, "确定", "取消")
  272. end
  273. end
  274. function PsionicSkillView:UpdateSkillRed( )
  275. local skill_red = self.skill_data and self.model:GetPsionicSkillSlotRedCache(self.skill_data.pos) or false
  276. self.upgrade_red_obj:SetActive(skill_red)
  277. SetImageGray(self.upgrade_btn_img, not skill_red)
  278. SetTMPSharedMaterial(self.upgrade_btn_lb_tmp,
  279. skill_red and ShaderTools.TMPSharedMaterialType.FZZZOutlineDarkOrangeBtn
  280. or ShaderTools.TMPSharedMaterialType.FZZZOutlineDarkGrayBtn)
  281. end
  282. function PsionicSkillView:__delete( )
  283. if self.cost_item then
  284. UIObjPool:getInstance():PushItem(UIObjPool.UIType.AwardItem, self.cost_item)
  285. end
  286. self.cost_item = nil
  287. self.model._block_skill_upgrade_click = false -- 关闭界面时取消掉这个点击屏蔽
  288. end