-- <* -- @Author: Saber -- @Description: 圣物系统装备分解界面 -- *> PsionicArmorResolveView = PsionicArmorResolveView or BaseClass(BaseView) local PsionicArmorResolveView = PsionicArmorResolveView function PsionicArmorResolveView:__init() self.base_file = "psionic" self.layout_file = "PsionicArmorResolveView" self.layer_name = "Activity" self.destroy_imm = true self.use_background = true --全屏界面默认使用这个参数,非全屏界面自行设置 self.change_scene_close = true --是否切换场景时关闭(弹出界面使用) self.append_to_ctl_queue = false --是否要添加进界面堆栈 self.blur_activity_bg = true self.use_show_anim = true self.use_hide_anim = true self.wait_resolve = false -- 等待更新协议返回 self.resovle_types = PsionicConst.ResovleType -- 初始化分解类型 -- 将当前的背包道具通过星级筛选出星级表 格式为[[分解类型] = {goods_id = tyoe_id},{...}, ... ] self.equip_resovle_type_list = {} self.resolve_list = {} -- 待分解列表,格式为[goods_id = true] self.rec_item_list = {} -- 分解建议节点列表 self.cur_equip_data = {} -- 当前穿戴的圣物数据列表 self.cur_equip_break_cfg = {} -- 当前穿戴的圣物进化配置 self:AddPreLoadList("psionic", {"PsionicArmorResolveTipItem"}) self.model = PsionicModel:getInstance() self.goods_model = GoodsModel:getInstance() self.load_callback = function () self:LoadSuccess() self:AddEvent() end self.open_callback = function ( ) self:UpdateView() end self.switch_callback = function(index) self:SwitchTab(index) end self.destroy_callback = function ( ) self:DestroySuccess() end end -- 如果存在goods_id,则代表这个是被选中要分解的装备,界面内要默认选中 function PsionicArmorResolveView:Open(goods_id) if goods_id then local goods_vo = self.goods_model:GetPsionicBagGoodsByID(goods_id) if goods_vo then self.resolve_list[goods_id] = goods_vo.type_id end end BaseView.Open(self) end function PsionicArmorResolveView:LoadSuccess() local nodes = { "confirm_btn:obj", "item_scroll", "item_scroll/Viewport/item_con", "select_filter:obj:tog", -- 智能筛选 -- 分解所得相关 "resolve_back:tmp", "resolve_tips1:tmp", "resolve_get_icon:img", -- 左侧提示内容容器 "tips_scroll", "tips_scroll/Viewport/tip_con", -- "resolve_num:tmp", } self:GetChildren(nodes) self.select_filter_tog.isOn = true -- 默认自动筛选 -- 先配置好分解奖励相关内容 self.resolve_tips1_tmp.text = "分解可获得:" lua_resM:setOutsideImageSprite(self, self.resolve_get_icon_img, GameResPath.GetGoodsIcon(280101), true) SetAnchoredPositionX(self.resolve_get_icon, self.resolve_tips1.anchoredPosition.x + self.resolve_tips1_tmp.preferredWidth - 10) SetAnchoredPositionX(self.resolve_back, self.resolve_get_icon.anchoredPosition.x + 44) local close_callback = function() self:Close() end self.tabWindowComponent = UITabWindow.New(self.transform, nil, nil, close_callback, self.background_wnd, self.transform, UITabWindow.SizeSmallNoTab) self.tabWindowComponent:SetBackgroundRes("ps_armor_resolve_bg") self.tabWindowComponent:SetTitleText("一键分解") end function PsionicArmorResolveView:AddEvent() local function click_event(target) if target == self.select_filter_obj then -- 智能筛选 self:SelectResolveGoodsByType(self.resovle_types.Filter) elseif target == self.confirm_btn_obj then -- 确认分解 if IsTableEmpty(self.resolve_list) then Message.show("请选择需要分解的圣物装备!") else local function ok( ... ) self.model:Fire(PsionicConst.REQUEST_CCMD_EVENT, 13904, self.resolve_list) self.wait_resolve = true end local ask_str = "确定分解所选装备?" Alert.show(ask_str,Alert.Type.Two,ok,nil,"确定","取消") end end end AddClickEvent(self.select_filter_obj, click_event, LuaSoundManager.SOUND_UI.SWITCH) AddClickEvent(self.confirm_btn_obj, click_event, LuaSoundManager.SOUND_UI.NONE) local function onUpdateEquipData() if self.wait_resolve then -- 从销毁装备那边更新到的,所以要做清空数据处理 self.resolve_list = {} self:UpdateView() end end self:BindEvent(self.model, PsionicConst.UPDATE_PISIONIC_BAG_ARMOR, onUpdateEquipData) end function PsionicArmorResolveView:UpdateView() self.equip_data = self.model:GetPsionicBagData(false) self:UpdateResolveRec() -- 更新左侧分解建议内容 self:UpdateGoodsResolveList() self:UpdateEquipItem() self:UpdateResolveResult() end -- 创建装备 function PsionicArmorResolveView:UpdateEquipItem( ) -- 补全42个位置 local empty_data = {is_empty = true} local data_length = #self.equip_data local need_full_num if #self.equip_data < 30 then need_full_num = 30 elseif data_length % 6 ~= 0 then -- 有空白格子,补全成无数据格子 need_full_num = math.ceil(data_length / 6) * 6 end if need_full_num then for i = data_length + 1, need_full_num do self.equip_data[i] = empty_data end end local function callback(goods_vo, selected_callback) local goods_id = goods_vo.goods_id -- print("Saber:PsionicArmorResolveView [158] goods_id: ",goods_id) if self.resolve_list[goods_id] then -- 已经被选中,则取消选中 self.resolve_list[goods_id] = nil -- 取消选中的同时,判断对应的toggle会不会受到影响,与冲突操作的toggle选中类型要取消勾选 self:CheckToggleSelectedFlag(goods_id) else self.resolve_list[goods_id] = goods_vo.type_id end if selected_callback then selected_callback(self.resolve_list[goods_id] and true or false) end self:UpdateResolveResult() end self.bag_item_creator = self.bag_item_creator or self:AddUIComponent(UI.ItemListCreator) local info = { data_list = self.equip_data, item_con = self.item_con, scroll_view = self.item_scroll, item_class = PsionicArmorItem, item_width = 78, item_height = 78, start_x = 8, start_y = -7, space_x = 12, space_y = 12, create_frequency = 0.01, is_scroll_back_on_update = true, alignment = UnityEngine.TextAnchor.UpperLeft, on_update_item = function(item, i, v) item:SetData(v, PsionicConst.ArmorItemFlag.Resolve, callback) item:SetSelected(self.resolve_list[v.goods_id] and true or false) end, } self.bag_item_creator:UpdateItems(info) end -- 玩家直接操作了右侧装备的分解,就要更新一下toggle的选中状态 function PsionicArmorResolveView:CheckToggleSelectedFlag(goods_id) for type, type_list in pairs(self.equip_resovle_type_list) do if type_list[goods_id] then -- 有列表中存在这个装备,就要把目标toggle取消勾选 if type == self.resovle_types.Filter then self.select_filter_tog.isOn = false end end end end -- 刷新分解预览 function PsionicArmorResolveView:UpdateResolveResult() local total_num = 0, 0 local resolve_cfg, temp_resolve_cfg, goods_vo local cfg_mgr = ConfigItemMgr.Instance for k, v in pairs(self.resolve_list) do goods_vo = self.goods_model:GetPsionicBagGoodsByID(k) resolve_cfg = self.model:GetPsionicEquipGradeCfg(goods_vo.type_id) if resolve_cfg then temp_resolve_cfg = resolve_cfg.resolve total_num = total_num + temp_resolve_cfg[1][3] end end self.resolve_back_tmp.text = total_num end -- 创建并区分可分解候选列表 function PsionicArmorResolveView:UpdateGoodsResolveList() -- 圣物装备分解类型列表初始化 self.equip_resovle_type_list = {} -- 对应右侧的tog self.equip_resovle_type_list[self.resovle_types.Filter] = {} local cur_equip_vo, cur_break_list local cur_typeId_num_list = {} -- 当前穿戴的圣物进化已有的装备数和所需的装备数 for k, v in ipairs(self.equip_data) do if not v.is_empty then cur_typeId_num_list = cur_typeId_num_list or {} cur_typeId_num_list[v.type_id] = cur_typeId_num_list[v.type_id] or 0 -- 处理智能筛选的部分,先获取装备对比属性 cur_equip_vo = self.cur_equip_data[v.subtype] if cur_equip_vo and v.color <= 2 then -- 当前槽位需要穿戴圣物,若没穿装备就不能加入自动筛选 local can_resolve = true local can_replace = self.model:IsPsionicEquipPowerUpOrNot(v.goods_id) -- 是否替换后可提升战力 -- 该装备没有替换的必要,就判断是否已经满足了该槽位装备升星的数量需求,若已满足就加入智能筛选分解列表 if not can_replace then cur_break_list = self.cur_equip_break_cfg[v.subtype] if cur_break_list and cur_break_list.next ~= 0 then -- 当前穿戴的装备可以进化 -- 存在进化材料列表同时现有的可分解装备达到需求 if self.cur_equip_break_cfg.list and self.cur_equip_break_cfg.list[v.type_id] then -- 当前typeid满足进化需求 -- 当前不满足进化需求,不加入自动分解队列,自增颜色队列 if cur_typeId_num_list[v.type_id] < self.cur_equip_break_cfg.list[v.type_id] then cur_typeId_num_list[v.type_id] = cur_typeId_num_list[v.type_id] + 1 can_resolve = false end end end if can_resolve then -- 如果身上的装备不可进化,也不能替换和洗练提升战力,那橙色以下的圣物加入自动筛选 self.equip_resovle_type_list[self.resovle_types.Filter][v.goods_id] = v.type_id end end end end end -- 如果自动筛选开着,就设置选中列表 self:SelectResolveGoodsByType() end -- 根据toggle选中类型筛选分解列表 selected:true为选中,false为不选 function PsionicArmorResolveView:SelectResolveGoodsByType(type) local goods_id_list = type and self.equip_resovle_type_list[type] or {} local selected_filter = self.select_filter_tog.isOn -- 符合条件的装备全部根据需求选中或反选,但也要追加判断这件装备是不是在满足了其他条件的列表中 for k, v in pairs(goods_id_list) do self.resolve_list[k] = selected and v or nil end for k, v in ipairs(self.equip_data) do if not v.is_empty then self.resolve_list[v.goods_id] = self.resolve_list[v.goods_id] or (selected_filter and self.equip_resovle_type_list[self.resovle_types.Filter][v.goods_id]) or nil end end -- 然后再更新节点状态 if self.bag_item_creator then local data self.bag_item_creator:IterateItems(function(item, i) data = item.data if not data.is_empty and data.goods_id then item:SetSelected(self.resolve_list[data.goods_id] and true or false) end end) end -- 更新分解预览 self:UpdateResolveResult() end -- 创建分解建议内容 function PsionicArmorResolveView:UpdateResolveRec( ) local rec_data_list = {} self.cur_equip_data = {} self.cur_equip_break_cfg = {} local temp_vo, break_cfg, break_equip_list for i = 4, 7 do temp_vo = self.goods_model:GetPsionicEquipBySlot(i) -- 当前穿戴装备栏位 break_cfg = temp_vo and self.model:GetPsionicEquipGradeCfg(temp_vo.type_id) or nil -- 进化完整配置 break_equip_list = break_cfg and break_cfg.cost or nil -- 进化所需装备配置 rec_data_list[#rec_data_list+1] = {equip_data = {goods_vo = temp_vo, slot = i}} rec_data_list[#rec_data_list+1] = {break_cond = {break_cfg = break_equip_list, slot = i, show_line = i == 7}} -- 缓存装备和进化装备列表配置 self.cur_equip_data[i] = temp_vo -- self.cur_equip_break_cfg[i].list = break_equip_list -- 当前装备的进化需求与槽位无关,与装备id和数量有关,因此这里不区分槽位 self.cur_equip_break_cfg.list = self.cur_equip_break_cfg.list or {} if break_equip_list then for k, v in ipairs(break_equip_list) do self.cur_equip_break_cfg.list[v[2]] = (self.cur_equip_break_cfg.list[v[2]] or 0) + v[3] end end -- 装备是否可以进化的字段与槽位有关 self.cur_equip_break_cfg[i] = {} self.cur_equip_break_cfg[i].next = break_cfg and break_cfg.next end rec_data_list[#rec_data_list+1] = {tip_str = "圣物进化需要吞噬指定品质的同类圣物"} rec_data_list[#rec_data_list+1] = {tip_str = "紫品及以上圣物都可进化,建议保留"} rec_data_list[#rec_data_list+1] = {tip_str = "可替换和可上阵的圣物,建议保留"} local height = 0 local item for k, v in ipairs(rec_data_list) do item = self.rec_item_list[k] if not item then item = PsionicArmorResolveTipItem.New(self.tip_con) self.rec_item_list[k] = item end item:SetAnchoredPosition(0, -height) height = height + item:SetData(v) end SetSizeDeltaY(self.tip_con, height + 5) end function PsionicArmorResolveView:DestroySuccess( ) if self.tabWindowComponent then self.tabWindowComponent:DeleteMe() self.tabWindowComponent = nil end for k, v in pairs(self.rec_item_list) do v:DeleteMe() v = nil end self.rec_item_list = nil end