源战役客户端
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.

299 lines
12 KiB

  1. -- <*
  2. -- @Author: Saber
  3. -- @Description: 圣物装备装备升星界面
  4. -- *>
  5. PsionicAdvanceBreakView = PsionicAdvanceBreakView or BaseClass(BaseItem)
  6. local PsionicAdvanceBreakView = PsionicAdvanceBreakView
  7. function PsionicAdvanceBreakView:__init(parent_wnd,prefab_asset,layer_name)
  8. self.base_file = "psionic"
  9. self.layout_file = "PsionicAdvanceBreakView"
  10. self.parent_wnd = parent_wnd
  11. self.layer_name = layer_name
  12. self.selected_equip_list = {} -- 选中的装备列表 格式:{[配置顺序] = {need_num= 123, list = {goods_id, goods_id, ...}}, ...}
  13. self.cur_star_list = {}
  14. self.next_star_list = {}
  15. self.cost_item_list = {}
  16. self.is_auto_buy_mat = false -- 是否自动购买材料
  17. self.equip_need_num = 0 -- 进化所需装备数量
  18. self.model = PsionicModel:getInstance()
  19. self.goods_model = GoodsModel:getInstance()
  20. self.slot_break_red_equip_list = {}
  21. self:Load()
  22. end
  23. function PsionicAdvanceBreakView:Load_callback()
  24. local nodes = {
  25. "bg:raw",
  26. -- 战力节点
  27. "power_con",
  28. "power_con/power_lb1:tmp",
  29. "power_con/up_arrow",
  30. "power_con/power_cur:txt",
  31. "power_con/power_up:tmp",
  32. -- 模型,星星,属性item和装备节点
  33. "attr_scroll", "attr_scroll/Viewport/attr_con",
  34. "star_con_cur", "star_con_next",
  35. "arrow1:obj", "arrow2:obj",
  36. "item_cur", "item_next",
  37. "confirm_btn:obj",
  38. "confirm_btn/confirm_btn_red:obj",
  39. -- 进化需求相关节点
  40. "cost_item_bg:obj",
  41. "line1:obj",
  42. "line2:obj",
  43. "sub_title1:obj",
  44. }
  45. self:GetChildren(nodes)
  46. lua_resM:setOutsideRawImage(self, self.bg_raw, GameResPath.GetViewBigBg("ps_break_bg"))
  47. self.power_lb1_tmp.text = "战力"
  48. self.cur_equip_item = PsionicArmorItem.New(self.item_cur)
  49. self.cur_equip_item:SetAnchoredPosition(0, 0)
  50. self.cur_equip_item:SetVisible(false)
  51. self.next_equip_item = PsionicArmorItem.New(self.item_next)
  52. self.next_equip_item:SetAnchoredPosition(0, 0)
  53. self.next_equip_item:SetVisible(false)
  54. self:AddEvents()
  55. if self.need_refreshData then
  56. self:UpdateView()
  57. end
  58. end
  59. function PsionicAdvanceBreakView:AddEvents()
  60. local function click_event(target)
  61. if target == self.confirm_btn_obj then -- 确认进化
  62. self:OnConfirmBtnClick()
  63. end
  64. end
  65. AddClickEvent(self.confirm_btn_obj, click_event, LuaSoundManager.SOUND_UI.NONE)
  66. local function update_break_red(tab_id)
  67. if not tab_id or tab_id == PsionicConst.TabId.PBreak then
  68. self:UpdateView()
  69. end
  70. end
  71. self:BindEvent(self.model, PsionicConst.UPDATE_RED_BY_TABID, update_break_red)
  72. end
  73. function PsionicAdvanceBreakView:SetData( goods_vo, need_show_effect, slot_break_red_equip_list )
  74. self.goods_vo = goods_vo
  75. self.need_show_effect = need_show_effect -- 是否需要展示进化成功的属性流光动画
  76. self.slot_break_red_equip_list = slot_break_red_equip_list
  77. if self.is_loaded then
  78. self.need_refreshData = false
  79. self:UpdateView()
  80. else
  81. self.need_refreshData = true
  82. end
  83. end
  84. function PsionicAdvanceBreakView:UpdateView()
  85. -- 获取当前装备的进化配置
  86. self:UpdateBasicData()
  87. self:UpdateMaterialArmorItem()
  88. self:UpdateBreakBtnRed()
  89. end
  90. -- 加载基础数据(只加载一次)
  91. function PsionicAdvanceBreakView:UpdateBasicData( )
  92. -- 加载属性
  93. -- 获取配置
  94. self.cur_equip_item:SetData(self.goods_vo, PsionicConst.ArmorItemFlag.Show)
  95. self.cur_equip_item:SetVisible(true)
  96. self.next_psionic_cfg = self.model:GetPsionicEquipGradeCfg(self.goods_vo.next)
  97. local attr_cur = self.goods_vo.basic_attrs
  98. local basic_attr_next = self.next_psionic_cfg and self.next_psionic_cfg.attrs or {}
  99. local attr_next = self.next_psionic_cfg and self.next_psionic_cfg.attrs or {}
  100. -- 需要重新构造表来计算战斗力,否则会出错
  101. local attr_next = {}
  102. for k, v in ipairs(basic_attr_next) do
  103. attr_next[k] = {[1] = v[1], [2] = v[2]}
  104. end
  105. attr_cur = SortAttrList(attr_cur)
  106. attr_next = SortAttrList(attr_next)
  107. -- 战斗力表现
  108. local cur_power = GetFighting(attr_cur, false)
  109. local t_p_next = GetFighting(attr_next)
  110. self.power_cur_txt.text = cur_power
  111. self.power_up_tmp.text = GetFighting(attr_next, false) - cur_power
  112. local total_len = self.power_lb1_tmp.preferredWidth + self.power_cur_txt.preferredWidth
  113. if t_p_next ~= 0 then
  114. total_len = total_len + self.up_arrow.sizeDelta.x + self.power_up_tmp.preferredWidth + 15
  115. end
  116. local offset_x = (self.power_con.sizeDelta.x - total_len) / 2
  117. SetAnchoredPositionX(self.power_lb1, offset_x)
  118. SetAnchoredPositionX(self.power_cur, offset_x + self.power_lb1_tmp.preferredWidth + 5)
  119. SetAnchoredPositionX(self.up_arrow, self.next_psionic_cfg and self.power_cur.anchoredPosition.x + self.power_cur_txt.preferredWidth + 5 or 999999)
  120. SetAnchoredPositionX(self.power_up, self.up_arrow.anchoredPosition.x + 20)
  121. -- 通过这两个列表重新获得一个新的属性列表
  122. local data_list = self.model:GetPsionicLevelAttrList(attr_cur, attr_next)
  123. self.attr_item_creator = self.attr_item_creator or self:AddUIComponent(UI.ItemListCreator)
  124. local info = {
  125. data_list = data_list,
  126. scroll_view = self.attr_scroll,
  127. item_con = self.attr_con,
  128. prefab_ab_name = "psionic",
  129. prefab_res_name = "PsionicAdvanceBreakAttrItem",
  130. item_height = 28,
  131. start_y = -7.5,
  132. space_y = 8,
  133. create_frequency = 0.01,
  134. alignment = UnityEngine.TextAnchor.UpperLeft,
  135. child_names = {
  136. "arrow:obj",
  137. "val_name:tmp",
  138. "val_cur:tmp",
  139. "val_next:tmp",
  140. "attr_effect_con",
  141. },
  142. on_update_item = function(item, i, v)
  143. -- 调整节点大小
  144. item.arrow_obj:SetActive(self.next_psionic_cfg and true or false)
  145. item.val_name_tmp.text = WordManager:GetProperties(v.type)
  146. item.val_cur_tmp.text = WordManager:GetPropertyValue(v.type, v.cur_val)
  147. item.val_next_tmp.text = self.next_psionic_cfg and WordManager:GetPropertyValue(v.type, v.next_val - v.cur_val) or ""
  148. -- 属性流光特效
  149. if self.need_show_effect and not item.showing_attr_effect then
  150. local function call_back( )
  151. item.showing_attr_effect = false
  152. end
  153. self:ClearUIEffect(item.attr_effect_con)
  154. self:AddUIEffect("ui_jinjieshuxing", item.attr_effect_con, self.layer_name, Vector3(-175,0,0), 1, false, 0.75, nil, call_back)
  155. item.showing_attr_effect = true
  156. end
  157. end,
  158. }
  159. self.attr_item_creator:UpdateItems(info)
  160. -- 判断是否要显示下一等级的星星表现
  161. self.arrow1_obj:SetActive(self.next_psionic_cfg and true or false)
  162. self.arrow2_obj:SetActive(self.next_psionic_cfg and true or false)
  163. SetAnchoredPositionX(self.star_con_cur, self.next_psionic_cfg and 228.5 or 312.5)
  164. SetAnchoredPositionX(self.item_cur, self.next_psionic_cfg and 228.5 or 312.5)
  165. -- 加载当前星数
  166. for k, v in ipairs(self.cur_star_list) do
  167. v.gameObject:SetActive(false)
  168. end
  169. local cur_star_num = self.goods_vo.star
  170. local offset_x = (self.star_con_cur.sizeDelta.x - cur_star_num * 22) / 2
  171. for i = 1, cur_star_num do
  172. self.cur_star_list[i] = self.cur_star_list[i] or UiFactory.createChild(self.star_con_cur, UIType.Image2, "star" .. i)
  173. SetAnchoredPosition(self.cur_star_list[i].transform, (i-1) * 22 + offset_x - 1, -3)
  174. lua_resM:setImageSprite(self, self.cur_star_list[i]:GetComponent("Image"), "psionic_asset", "ps_star_1", true)
  175. self.cur_star_list[i].gameObject:SetActive(true)
  176. end
  177. -- 加载下一级星数
  178. for k, v in ipairs(self.next_star_list) do
  179. v.gameObject:SetActive(false)
  180. end
  181. if self.next_psionic_cfg then
  182. self.next_equip_item:SetData(nil, PsionicConst.ArmorItemFlag.Show, nil, self.goods_vo.next)
  183. self.next_equip_item:SetVisible(true)
  184. local next_equip_cfg = Config.Nucleonequip[self.goods_vo.next]
  185. local next_star_num = next_equip_cfg.star
  186. local offset_x = (self.star_con_next.sizeDelta.x - next_star_num * 22) / 2
  187. for i = 1, next_star_num do
  188. self.next_star_list[i] = self.next_star_list[i] or UiFactory.createChild(self.star_con_next, UIType.Image2, "star" .. i)
  189. SetAnchoredPosition(self.next_star_list[i].transform, (i-1) * 22 + offset_x - 1, -3)
  190. lua_resM:setImageSprite(self, self.next_star_list[i]:GetComponent("Image"), "psionic_asset", "ps_star_1", true)
  191. self.next_star_list[i].gameObject:SetActive(true)
  192. end
  193. else
  194. self.next_equip_item:SetVisible(false)
  195. end
  196. end
  197. -- 加载进化用材料装备
  198. function PsionicAdvanceBreakView:UpdateMaterialArmorItem()
  199. -- 加载材料装备和基础材料的消耗配置
  200. local cost_cfg = self.goods_vo.cost
  201. local cost_item_num = #cost_cfg
  202. for k, v in pairs(self.cost_item_list) do
  203. v:SetVisible(false)
  204. end
  205. self.has_enough_equip = true -- 提前记录,是否已经存在了足够的装备材料
  206. if self.goods_vo.next == 0 then -- 已经不需要再进化了
  207. -- 后续补上满破的表现
  208. self.has_enough_equip = false
  209. self.cost_item_bg_obj:SetActive(false)
  210. self.confirm_btn_obj:SetActive(false)
  211. self.sub_title1_obj:SetActive(false)
  212. self.line1_obj:SetActive(false)
  213. self.line2_obj:SetActive(false)
  214. else
  215. self.cost_item_bg_obj:SetActive(true)
  216. self.confirm_btn_obj:SetActive(true)
  217. self.sub_title1_obj:SetActive(true)
  218. self.line1_obj:SetActive(true)
  219. self.line2_obj:SetActive(true)
  220. local offset_x = (298 - cost_item_num * 80) / 2 + 10
  221. for k, v in ipairs(cost_cfg) do
  222. self.cost_item_list[k] = self.cost_item_list[k] or UIObjPool:getInstance():PopItem(UIObjPool.UIType.AwardItem, self.cost_item_bg)
  223. self.cost_item_list[k]:SetAnchoredPosition(offset_x + (k-1) * 80, 0)
  224. self.cost_item_list[k]:SetVisible(true)
  225. self.cost_item_list[k]:SetItemSize(62, 62)
  226. local typeId, lock = self.goods_model:GetMappingTypeId(v[1], v[2])
  227. local have_num = self.goods_model:GetPsionicBagGoodsNumByTypeID(typeId, self.goods_vo.goods_id)
  228. self.cost_item_list[k]:SetData(typeId, 0, nil, nil, lock)
  229. local get_str = string.format("<color=%s>%s</color>/%s",
  230. have_num >= v[3] and ColorUtil.GREEN_DARK or ColorUtil.RED_DARK,
  231. have_num, v[3])
  232. self.cost_item_list[k]:IsGetGoods(true, get_str)
  233. self.has_enough_equip = self.has_enough_equip and have_num >= v[3]
  234. end
  235. end
  236. end
  237. function PsionicAdvanceBreakView:UpdateBreakBtnRed( )
  238. if self.goods_vo then
  239. -- 先判断有没有红点,再判断是不是身上穿的
  240. -- local bool = self.model:GetPsionicBreakSlotRed(self.goods_vo.subtype)
  241. -- if bool then
  242. -- local cur_equip_vo = self.goods_model:GetPsionicEquipBySlot(self.goods_vo.subtype)
  243. -- self.confirm_btn_red_obj:SetActive(cur_equip_vo.goods_id == self.goods_vo.goods_id)
  244. -- else
  245. -- self.confirm_btn_red_obj:SetActive(false)
  246. -- end
  247. local break_red = self.slot_break_red_equip_list[self.goods_vo.subtype] and self.slot_break_red_equip_list[self.goods_vo.subtype] == self.goods_vo.goods_id or false
  248. self.confirm_btn_red_obj:SetActive(break_red)
  249. else
  250. self.confirm_btn_red_obj:SetActive(false)
  251. end
  252. end
  253. -- 进化按钮逻辑
  254. function PsionicAdvanceBreakView:OnConfirmBtnClick( )
  255. if self.has_enough_equip then
  256. -- 缓存当前进化对象的物品id,用于做物品升级后的结算表现
  257. self.model._break_type_id_cache[self.goods_vo.goods_id] = DeepCopy(self.goods_vo)
  258. -- bag_type 道具背包类型 GoodsModel.GOODS_POS_TYPE
  259. self.model:Fire(PsionicConst.REQUEST_CCMD_EVENT, 13907, self.goods_vo.goods_id, self.goods_vo.bag_type)
  260. else
  261. Message.show("圣物装备不足", "fault")
  262. end
  263. end
  264. function PsionicAdvanceBreakView:__delete( )
  265. if self.cur_equip_item then
  266. self.cur_equip_item:DeleteMe()
  267. self.cur_equip_item = nil
  268. end
  269. if self.next_equip_item then
  270. self.next_equip_item:DeleteMe()
  271. self.next_equip_item = nil
  272. end
  273. for k, v in pairs(self.cost_item_list) do
  274. UIObjPool:getInstance():PushItem(UIObjPool.UIType.AwardItem, v)
  275. end
  276. self.cost_item_list = nil
  277. end