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