|
|
- -- <*
- -- @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
|