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

336 行
14 KiB

  1. -- <*
  2. -- @Author: Saber
  3. -- @Description: 圣物系统装备分解界面
  4. -- *>
  5. PsionicArmorResolveView = PsionicArmorResolveView or BaseClass(BaseView)
  6. local PsionicArmorResolveView = PsionicArmorResolveView
  7. function PsionicArmorResolveView:__init()
  8. self.base_file = "psionic"
  9. self.layout_file = "PsionicArmorResolveView"
  10. self.layer_name = "Activity"
  11. self.destroy_imm = true
  12. self.use_background = true --全屏界面默认使用这个参数,非全屏界面自行设置
  13. self.change_scene_close = true --是否切换场景时关闭(弹出界面使用)
  14. self.append_to_ctl_queue = false --是否要添加进界面堆栈
  15. self.blur_activity_bg = true
  16. self.use_show_anim = true
  17. self.use_hide_anim = true
  18. self.wait_resolve = false -- 等待更新协议返回
  19. self.resovle_types = PsionicConst.ResovleType -- 初始化分解类型
  20. -- 将当前的背包道具通过星级筛选出星级表 格式为[[分解类型] = {goods_id = tyoe_id},{...}, ... ]
  21. self.equip_resovle_type_list = {}
  22. self.resolve_list = {} -- 待分解列表,格式为[goods_id = true]
  23. self.rec_item_list = {} -- 分解建议节点列表
  24. self.cur_equip_data = {} -- 当前穿戴的圣物数据列表
  25. self.cur_equip_break_cfg = {} -- 当前穿戴的圣物进化配置
  26. self:AddPreLoadList("psionic", {"PsionicArmorResolveTipItem"})
  27. self.model = PsionicModel:getInstance()
  28. self.goods_model = GoodsModel:getInstance()
  29. self.load_callback = function ()
  30. self:LoadSuccess()
  31. self:AddEvent()
  32. end
  33. self.open_callback = function ( )
  34. self:UpdateView()
  35. end
  36. self.switch_callback = function(index)
  37. self:SwitchTab(index)
  38. end
  39. self.destroy_callback = function ( )
  40. self:DestroySuccess()
  41. end
  42. end
  43. -- 如果存在goods_id,则代表这个是被选中要分解的装备,界面内要默认选中
  44. function PsionicArmorResolveView:Open(goods_id)
  45. if goods_id then
  46. local goods_vo = self.goods_model:GetPsionicBagGoodsByID(goods_id)
  47. if goods_vo then
  48. self.resolve_list[goods_id] = goods_vo.type_id
  49. end
  50. end
  51. BaseView.Open(self)
  52. end
  53. function PsionicArmorResolveView:LoadSuccess()
  54. local nodes = {
  55. "confirm_btn:obj",
  56. "item_scroll", "item_scroll/Viewport/item_con",
  57. "select_filter:obj:tog", -- 智能筛选
  58. -- 分解所得相关
  59. "resolve_back:tmp",
  60. "resolve_tips1:tmp",
  61. "resolve_get_icon:img",
  62. -- 左侧提示内容容器
  63. "tips_scroll",
  64. "tips_scroll/Viewport/tip_con",
  65. -- "resolve_num:tmp",
  66. }
  67. self:GetChildren(nodes)
  68. self.select_filter_tog.isOn = true -- 默认自动筛选
  69. -- 先配置好分解奖励相关内容
  70. self.resolve_tips1_tmp.text = "分解可获得:"
  71. lua_resM:setOutsideImageSprite(self, self.resolve_get_icon_img, GameResPath.GetGoodsIcon(280101), true)
  72. SetAnchoredPositionX(self.resolve_get_icon, self.resolve_tips1.anchoredPosition.x + self.resolve_tips1_tmp.preferredWidth - 10)
  73. SetAnchoredPositionX(self.resolve_back, self.resolve_get_icon.anchoredPosition.x + 44)
  74. local close_callback = function()
  75. self:Close()
  76. end
  77. self.tabWindowComponent = UITabWindow.New(self.transform, nil, nil, close_callback, self.background_wnd,
  78. self.transform, UITabWindow.SizeSmallNoTab)
  79. self.tabWindowComponent:SetBackgroundRes("ps_armor_resolve_bg")
  80. self.tabWindowComponent:SetTitleText("一键分解")
  81. end
  82. function PsionicArmorResolveView:AddEvent()
  83. local function click_event(target)
  84. if target == self.select_filter_obj then -- 智能筛选
  85. self:SelectResolveGoodsByType(self.resovle_types.Filter)
  86. elseif target == self.confirm_btn_obj then -- 确认分解
  87. if IsTableEmpty(self.resolve_list) then
  88. Message.show("请选择需要分解的圣物装备!")
  89. else
  90. local function ok( ... )
  91. self.model:Fire(PsionicConst.REQUEST_CCMD_EVENT, 13904, self.resolve_list)
  92. self.wait_resolve = true
  93. end
  94. local ask_str = "确定分解所选装备?"
  95. Alert.show(ask_str,Alert.Type.Two,ok,nil,"确定","取消")
  96. end
  97. end
  98. end
  99. AddClickEvent(self.select_filter_obj, click_event, LuaSoundManager.SOUND_UI.SWITCH)
  100. AddClickEvent(self.confirm_btn_obj, click_event, LuaSoundManager.SOUND_UI.NONE)
  101. local function onUpdateEquipData()
  102. if self.wait_resolve then
  103. -- 从销毁装备那边更新到的,所以要做清空数据处理
  104. self.resolve_list = {}
  105. self:UpdateView()
  106. end
  107. end
  108. self:BindEvent(self.model, PsionicConst.UPDATE_PISIONIC_BAG_ARMOR, onUpdateEquipData)
  109. end
  110. function PsionicArmorResolveView:UpdateView()
  111. self.equip_data = self.model:GetPsionicBagData(false)
  112. self:UpdateResolveRec() -- 更新左侧分解建议内容
  113. self:UpdateGoodsResolveList()
  114. self:UpdateEquipItem()
  115. self:UpdateResolveResult()
  116. end
  117. -- 创建装备
  118. function PsionicArmorResolveView:UpdateEquipItem( )
  119. -- 补全42个位置
  120. local empty_data = {is_empty = true}
  121. local data_length = #self.equip_data
  122. local need_full_num
  123. if #self.equip_data < 30 then
  124. need_full_num = 30
  125. elseif data_length % 6 ~= 0 then
  126. -- 有空白格子,补全成无数据格子
  127. need_full_num = math.ceil(data_length / 6) * 6
  128. end
  129. if need_full_num then
  130. for i = data_length + 1, need_full_num do
  131. self.equip_data[i] = empty_data
  132. end
  133. end
  134. local function callback(goods_vo, selected_callback)
  135. local goods_id = goods_vo.goods_id
  136. -- print("Saber:PsionicArmorResolveView [158] goods_id: ",goods_id)
  137. if self.resolve_list[goods_id] then -- 已经被选中,则取消选中
  138. self.resolve_list[goods_id] = nil
  139. -- 取消选中的同时,判断对应的toggle会不会受到影响,与冲突操作的toggle选中类型要取消勾选
  140. self:CheckToggleSelectedFlag(goods_id)
  141. else
  142. self.resolve_list[goods_id] = goods_vo.type_id
  143. end
  144. if selected_callback then
  145. selected_callback(self.resolve_list[goods_id] and true or false)
  146. end
  147. self:UpdateResolveResult()
  148. end
  149. self.bag_item_creator = self.bag_item_creator or self:AddUIComponent(UI.ItemListCreator)
  150. local info = {
  151. data_list = self.equip_data,
  152. item_con = self.item_con,
  153. scroll_view = self.item_scroll,
  154. item_class = PsionicArmorItem,
  155. item_width = 78,
  156. item_height = 78,
  157. start_x = 8,
  158. start_y = -7,
  159. space_x = 12,
  160. space_y = 12,
  161. create_frequency = 0.01,
  162. is_scroll_back_on_update = true,
  163. alignment = UnityEngine.TextAnchor.UpperLeft,
  164. on_update_item = function(item, i, v)
  165. item:SetData(v, PsionicConst.ArmorItemFlag.Resolve, callback)
  166. item:SetSelected(self.resolve_list[v.goods_id] and true or false)
  167. end,
  168. }
  169. self.bag_item_creator:UpdateItems(info)
  170. end
  171. -- 玩家直接操作了右侧装备的分解,就要更新一下toggle的选中状态
  172. function PsionicArmorResolveView:CheckToggleSelectedFlag(goods_id)
  173. for type, type_list in pairs(self.equip_resovle_type_list) do
  174. if type_list[goods_id] then -- 有列表中存在这个装备,就要把目标toggle取消勾选
  175. if type == self.resovle_types.Filter then
  176. self.select_filter_tog.isOn = false
  177. end
  178. end
  179. end
  180. end
  181. -- 刷新分解预览
  182. function PsionicArmorResolveView:UpdateResolveResult()
  183. local total_num = 0, 0
  184. local resolve_cfg, temp_resolve_cfg, goods_vo
  185. local cfg_mgr = ConfigItemMgr.Instance
  186. for k, v in pairs(self.resolve_list) do
  187. goods_vo = self.goods_model:GetPsionicBagGoodsByID(k)
  188. resolve_cfg = self.model:GetPsionicEquipGradeCfg(goods_vo.type_id)
  189. if resolve_cfg then
  190. temp_resolve_cfg = resolve_cfg.resolve
  191. total_num = total_num + temp_resolve_cfg[1][3]
  192. end
  193. end
  194. self.resolve_back_tmp.text = total_num
  195. end
  196. -- 创建并区分可分解候选列表
  197. function PsionicArmorResolveView:UpdateGoodsResolveList()
  198. -- 圣物装备分解类型列表初始化
  199. self.equip_resovle_type_list = {} -- 对应右侧的tog
  200. self.equip_resovle_type_list[self.resovle_types.Filter] = {}
  201. local cur_equip_vo, cur_break_list
  202. local cur_typeId_num_list = {} -- 当前穿戴的圣物进化已有的装备数和所需的装备数
  203. for k, v in ipairs(self.equip_data) do
  204. if not v.is_empty then
  205. cur_typeId_num_list = cur_typeId_num_list or {}
  206. cur_typeId_num_list[v.type_id] = cur_typeId_num_list[v.type_id] or 0
  207. -- 处理智能筛选的部分,先获取装备对比属性
  208. cur_equip_vo = self.cur_equip_data[v.subtype]
  209. if cur_equip_vo and v.color <= 2 then -- 当前槽位需要穿戴圣物,若没穿装备就不能加入自动筛选
  210. local can_resolve = true
  211. local can_replace = self.model:IsPsionicEquipPowerUpOrNot(v.goods_id) -- 是否替换后可提升战力
  212. -- 该装备没有替换的必要,就判断是否已经满足了该槽位装备升星的数量需求,若已满足就加入智能筛选分解列表
  213. if not can_replace then
  214. cur_break_list = self.cur_equip_break_cfg[v.subtype]
  215. if cur_break_list and cur_break_list.next ~= 0 then -- 当前穿戴的装备可以进化
  216. -- 存在进化材料列表同时现有的可分解装备达到需求
  217. if self.cur_equip_break_cfg.list and self.cur_equip_break_cfg.list[v.type_id] then -- 当前typeid满足进化需求
  218. -- 当前不满足进化需求,不加入自动分解队列,自增颜色队列
  219. if cur_typeId_num_list[v.type_id] < self.cur_equip_break_cfg.list[v.type_id] then
  220. cur_typeId_num_list[v.type_id] = cur_typeId_num_list[v.type_id] + 1
  221. can_resolve = false
  222. end
  223. end
  224. end
  225. if can_resolve then -- 如果身上的装备不可进化,也不能替换和洗练提升战力,那橙色以下的圣物加入自动筛选
  226. self.equip_resovle_type_list[self.resovle_types.Filter][v.goods_id] = v.type_id
  227. end
  228. end
  229. end
  230. end
  231. end
  232. -- 如果自动筛选开着,就设置选中列表
  233. self:SelectResolveGoodsByType()
  234. end
  235. -- 根据toggle选中类型筛选分解列表 selected:true为选中,false为不选
  236. function PsionicArmorResolveView:SelectResolveGoodsByType(type)
  237. local goods_id_list = type and self.equip_resovle_type_list[type] or {}
  238. local selected_filter = self.select_filter_tog.isOn
  239. -- 符合条件的装备全部根据需求选中或反选,但也要追加判断这件装备是不是在满足了其他条件的列表中
  240. for k, v in pairs(goods_id_list) do
  241. self.resolve_list[k] = selected and v or nil
  242. end
  243. for k, v in ipairs(self.equip_data) do
  244. if not v.is_empty then
  245. self.resolve_list[v.goods_id] = self.resolve_list[v.goods_id]
  246. or (selected_filter and self.equip_resovle_type_list[self.resovle_types.Filter][v.goods_id])
  247. or nil
  248. end
  249. end
  250. -- 然后再更新节点状态
  251. if self.bag_item_creator then
  252. local data
  253. self.bag_item_creator:IterateItems(function(item, i)
  254. data = item.data
  255. if not data.is_empty
  256. and data.goods_id then
  257. item:SetSelected(self.resolve_list[data.goods_id] and true or false)
  258. end
  259. end)
  260. end
  261. -- 更新分解预览
  262. self:UpdateResolveResult()
  263. end
  264. -- 创建分解建议内容
  265. function PsionicArmorResolveView:UpdateResolveRec( )
  266. local rec_data_list = {}
  267. self.cur_equip_data = {}
  268. self.cur_equip_break_cfg = {}
  269. local temp_vo, break_cfg, break_equip_list
  270. for i = 4, 7 do
  271. temp_vo = self.goods_model:GetPsionicEquipBySlot(i) -- 当前穿戴装备栏位
  272. break_cfg = temp_vo and self.model:GetPsionicEquipGradeCfg(temp_vo.type_id) or nil -- 进化完整配置
  273. break_equip_list = break_cfg and break_cfg.cost or nil -- 进化所需装备配置
  274. rec_data_list[#rec_data_list+1] = {equip_data = {goods_vo = temp_vo, slot = i}}
  275. rec_data_list[#rec_data_list+1] = {break_cond = {break_cfg = break_equip_list, slot = i, show_line = i == 7}}
  276. -- 缓存装备和进化装备列表配置
  277. self.cur_equip_data[i] = temp_vo
  278. -- self.cur_equip_break_cfg[i].list = break_equip_list
  279. -- 当前装备的进化需求与槽位无关,与装备id和数量有关,因此这里不区分槽位
  280. self.cur_equip_break_cfg.list = self.cur_equip_break_cfg.list or {}
  281. if break_equip_list then
  282. for k, v in ipairs(break_equip_list) do
  283. self.cur_equip_break_cfg.list[v[2]] = (self.cur_equip_break_cfg.list[v[2]] or 0) + v[3]
  284. end
  285. end
  286. -- 装备是否可以进化的字段与槽位有关
  287. self.cur_equip_break_cfg[i] = {}
  288. self.cur_equip_break_cfg[i].next = break_cfg and break_cfg.next
  289. end
  290. rec_data_list[#rec_data_list+1] = {tip_str = "圣物进化需要吞噬指定品质的同类圣物"}
  291. rec_data_list[#rec_data_list+1] = {tip_str = "紫品及以上圣物都可进化,建议保留"}
  292. rec_data_list[#rec_data_list+1] = {tip_str = "可替换和可上阵的圣物,建议保留"}
  293. local height = 0
  294. local item
  295. for k, v in ipairs(rec_data_list) do
  296. item = self.rec_item_list[k]
  297. if not item then
  298. item = PsionicArmorResolveTipItem.New(self.tip_con)
  299. self.rec_item_list[k] = item
  300. end
  301. item:SetAnchoredPosition(0, -height)
  302. height = height + item:SetData(v)
  303. end
  304. SetSizeDeltaY(self.tip_con, height + 5)
  305. end
  306. function PsionicArmorResolveView:DestroySuccess( )
  307. if self.tabWindowComponent then
  308. self.tabWindowComponent:DeleteMe()
  309. self.tabWindowComponent = nil
  310. end
  311. for k, v in pairs(self.rec_item_list) do
  312. v:DeleteMe()
  313. v = nil
  314. end
  315. self.rec_item_list = nil
  316. end