源战役客户端
Non puoi selezionare più di 25 argomenti Gli argomenti devono iniziare con una lettera o un numero, possono includere trattini ('-') e possono essere lunghi fino a 35 caratteri.
 
 
 
 
 

337 righe
14 KiB

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