源战役客户端
Nie możesz wybrać więcej, niż 25 tematów Tematy muszą się zaczynać od litery lub cyfry, mogą zawierać myślniki ('-') i mogą mieć do 35 znaków.
 
 
 
 
 

468 wiersze
18 KiB

-- <*
-- @Author: Saber
-- @Description: 转职任务界面
-- *>
ReinTaskView = ReinTaskView or BaseClass(BaseItem)
local ReinTaskView = ReinTaskView
function ReinTaskView:__init(parent_wnd,prefab_asset,layer_name)
self.base_file = "reincarnation"
self.layout_file = "ReinTaskView"
self.parent_wnd = parent_wnd
self.layer_name = layer_name
self.full_screen = true
self.ani_right = 400
self.ani_left = -200
-- self.adjust_mid = {left = 160, right = 780}
self.model_activity_bg = true
self.model_activity_bg_pos = Vector2(-160, 32)
self.open_rein_lv = nil -- 如果通过外部按钮跳转进来的,就会有这个值,自动定位到目标转职
-- self:AddPreLoadList("reincarnation", {"ReinTaskScrollItem"})
-- self:AddPreLoadList("reincarnation", {"ReinTaskDataItem"})
self.model = ReincarnationModel:getInstance()
-- self.model:UpdateCurReinTask() -- 加载一次转职任务
self.task_model = TaskModel:getInstance()
self.main_vo = RoleManager.Instance.mainRoleInfo
self.rein_lv = 1
self.rein_stage_cfg = {} -- 当前转职等级的阶段任务属性配置
self.cur_task_stage = self.main_vo.turn_stage -- 当前转职任务阶段index
self.first_loaded = true -- 第一次加载子节点
-- self.task_btn_list = {} -- 任务按钮item
self.tab_item = {}
self.eu_item = {}
self.task_scroll_item = {} -- 任务描述item
self.task_btn_flag = 0 -- 任务功能按钮状态 0对于已完成的任务 1接任务 2前往任务 3完成任务 4完成转职 5任务不可接
self.click_tips_level = 0 -- 当任务无法接取或进行时提示的任务等级
self.task_btn_flag_content = {
[0] = "已完成",
[1] = "接取任务",
[2] = "前往",
[3] = "完成任务",
[4] = "完成转职",
[5] = "前往",
}
self:Load()
end
function ReinTaskView:Load_callback()
local nodes = {
-- 左侧玩家模型,技能节点
"mid/role_con",
-- 右侧信息部分
"right/right_bg:raw",
"right/task_func_btn:obj:imgex", -- 任务交互按钮相关
"right/task_func_btn/task_func_btn_lb:tmp",
"right/arrow:obj", -- 转职名称相关
"right/stage_cur:obj",
"right/stage_cur/stage_cur_lb:tmp",
"right/stage_next:obj",
"right/stage_next/stage_next_lb:tmp",
"right/data_scroll",
"right/data_scroll/Viewport/data_con",
-- "right/attr_scroll", -- 转职属性奖励容器
-- "right/attr_scroll/Viewport/attr_con",
-- "right/taskdesc_scroll", -- 转职任务描述容器
-- "right/taskdesc_scroll/taskdesc_vp:img",
"right/taskdesc_con",
-- "right/unlock_con",
-- "right/titleTxt2:tmp",
-- "right/next_task_condition:tmp", -- 任务开放条件文本
-- 最左侧tab相关
"left/tab_scroll",
"left/tab_scroll/tab_vp:img",
"left/tab_scroll/tab_vp/tab_con",
}
self:GetChildren(nodes)
lua_resM:setOutsideRawImage(self, self.right_bg_raw, GameResPath.GetViewBigBg("re_task_right_bg"), false)
self:AddEvents()
if self.need_refresh_data then
self:UpdateView()
end
end
function ReinTaskView:AddEvents()
local function click_event(target)
if target == self.task_func_btn_obj then -- 任务交互按钮
self:OnTaskFuncBtnClick()
end
end
AddClickEvent(self.task_func_btn_obj, click_event)
local function updateReinStage()
self.cur_task_stage = self.main_vo.turn_stage
end
self.update_rein_stage_id = self.main_vo:BindOne("turn_stage", updateReinStage)
local function updateReinTask()
-- self.model:UpdateCurReinTask()
self:UpdateCurStageTask() -- 更新任务按钮
self:UpdateTrunTabItem()
end
-- self:BindEvent(TaskModel:getInstance(), TaskEvent.TASK_LIST_INIT, updateReinTask)
self:BindEvent(self.model, ReincarnationModel.REFRESH_REIN_TASK, updateReinTask)
end
function ReinTaskView:SetData(view_index, rein_lv)
self.open_rein_lv = rein_lv
if self.is_loaded then
self.need_refresh_data = false
self:UpdateView()
else
self.need_refresh_data = true
end
end
function ReinTaskView:UpdateView()
self.tab_data = self.model:GetTotalReinTransferCfg()
self:InitReinData(self.open_rein_lv)
self:UpdateRoleModel() -- 更新模型
self:UpdateTrunTabItem() -- 更新左侧职业按钮
self:UpdateAllTurnData() -- 更新界面转职数据
end
-- 更新界面转职数据
function ReinTaskView:UpdateAllTurnData( )
self:UpdateCareerTitle() -- 更新职业变化节点
self:UpdateCurStageTask() -- 更新任务按钮
self:UpdateReinStageEnhanceAndUnlockData() -- 更新当前阶段的转职的属性提升和解锁内容
end
function ReinTaskView:InitReinData(rein_lv)
self.rein_lv = rein_lv or self.model:GetCurTurn()
self.rein_stage_cfg = self.model:GetReinLvStageData(self.rein_lv)
-- if self.rein_lv == 0 then -- 对0转特殊处理,给5个球
-- self.rein_stage_cfg = {
-- {id = 0},
-- {id = 0},
-- {id = 0},
-- {id = 0},
-- {id = 0},
-- }
-- end
self.total_stage = #self.rein_stage_cfg
end
function ReinTaskView:UpdateRoleModel( )
local res_data = {
father_node = self,
transform = self.role_con,
fashion_type = FuncOpenModel.TypeId.Clothes,
size = Vector2(550, 440),
scale = 255,
ui_model_type = UIModelCommon.ModelType.BackModel,
show_reflection = true,
reflect_pos = Vector3(0, 76, 0),
}
FuncOpenModel:getInstance():SetModelRes(res_data)
end
-- 更新转职头衔
function ReinTaskView:UpdateCareerTitle( )
-- self.rein_lv是当前查看的转职,所以self.rein_lv获取到的数据实际上是next_cfg
local lv_cfg, next_cfg
for k, v in ipairs(self.tab_data) do
if v.transfer_id == self.rein_lv-1 then
lv_cfg = v
end
if v.transfer_id == self.rein_lv then
next_cfg = v
end
end
local turn, turn_stage = self.main_vo.turn, self.main_vo.turn_stage
if self.rein_lv <= turn then -- 只显示当前职业
self.stage_next_obj:SetActive(false)
self.arrow_obj:SetActive(false)
SetAnchoredPositionX(self.stage_cur, 4.5)
self.stage_cur_lb_tmp.text = Trim(next_cfg.name)
else -- 显示当前职业和后续转职职业
self.stage_next_obj:SetActive(true)
self.arrow_obj:SetActive(true)
SetAnchoredPositionX(self.stage_cur, -102)
if lv_cfg then
self.stage_cur_lb_tmp.text = Trim(lv_cfg.name)
end
self.stage_next_lb_tmp.text = Trim(next_cfg.name)
end
end
-- 加载转生阶段tabitem
function ReinTaskView:UpdateTrunTabItem( )
local tab_click_func = function(rein_lv)
self:InitReinData(rein_lv)
self:UpdateAllTurnData()
for k, v in pairs(self.tab_item) do
v:SetSelected(v.data.transfer_id == rein_lv)
end
end
local tab_index = 1
for k = 2, #self.tab_data do
self.tab_item[tab_index] = self.tab_item[tab_index] or ReinTaskTabItem.New(self.tab_con)
self.tab_item[tab_index]:SetAnchoredPosition(22, -(tab_index - 1) * (87 + 42) - 21)
self.tab_item[tab_index]:SetData(self.tab_data[k], tab_index, tab_click_func)
self.tab_item[tab_index]:SetSelected(self.tab_data[k].transfer_id == self.rein_lv)
tab_index = tab_index + 1
end
end
-- 加载任务节点
function ReinTaskView:UpdateCurStageTask()
-- 如果查看的是当前正在进行的转生阶段,则自动定位任务,否则定位到最后一个
if self.rein_lv == self.main_vo.turn + 1 then
-- 自动定位到当前正在进行的任务
local cur_task_vo = self.model:GetCurTaskVo()
local auto_index = self.cur_task_stage + 1
if cur_task_vo then
-- 当前已接任务则当前阶段等于跳转阶段,否则为下一阶段
local task_received = cur_task_vo.acceptType == 0
auto_index = task_received and self.cur_task_stage or self.cur_task_stage + 1
end
self:UpdateTaskData(auto_index > self.total_stage and self.total_stage or auto_index)
else
self:UpdateTaskData(self.rein_lv > self.main_vo.turn + 1 and 1 or self.total_stage)
end
end
-- 构建任务详细数据结构体生成展示节点
function ReinTaskView:UpdateTaskData(stage)
if not stage then return end
-- 当前转职进度
local turn, turn_stage = self.main_vo.turn, self.main_vo.turn_stage
-- 创建展示内容
local task_data_list = {}
self.task_btn_flag = 0 -- 任务功能按钮状态 0已完成的任务 1接任务 2前往任务 3完成任务 4完成转职 5任务不可接
local condition_tmp = "" -- 条件文本,根据不同条件赋值
if self.rein_lv < turn then -- 查看往期转职任务
-- 提示任务内容已经完成
task_data_list[#task_data_list+1] = {finish_content = string.format("<color=%s>已完成</color>全部转职任务", ColorUtil.GREEN_DARK)}
-- self.titleTxt2_tmp.text = "转职任务"
else
local cur_task_vo, auto_index = nil, self.cur_task_stage + 1
if self.rein_lv == turn + 1 then -- 查看当前转职任务
-- 先尝试获取进行中的任务
cur_task_vo = self.model:GetCurTaskVo()
if cur_task_vo then
-- 当前已接任务则当前阶段等于跳转阶段,否则为下一阶段
local task_received = cur_task_vo.acceptType == 0
auto_index = task_received and self.cur_task_stage or self.cur_task_stage + 1
self.task_btn_flag = task_received and 2 or 1
if task_received then
-- 如果任务已经完成了,则要进一步确认状态
local is_task_finished = cur_task_vo.taskTips[1] and cur_task_vo.taskTips[1].isFinish == 1
if is_task_finished then
self.task_btn_flag = self.total_stage == stage and 4 or 3
end
end
end
task_data_list[#task_data_list+1] = {title = string.format("(<color=%s>%s</color>/%s)", ColorUtil.GREEN_DARK, stage, self.total_stage)}
-- self.titleTxt2_tmp.text = string.format("转职任务(<color=%s>%s</color>/%s)", ColorUtil.GREEN_DARK, stage, self.total_stage)
else
-- self.titleTxt2_tmp.text = "转职任务"
end
local stage_data = self.rein_stage_cfg[stage]
local task_id = stage_data and stage_data.task_id
-- 用于获取展示数据的task_vo
local task_vo = nil
if stage == auto_index then -- 当查看的阶段数相同时,才获取正在进行中的转生任务
task_vo = cur_task_vo
end
-- 如果当前有进行中或可接的转职任务,则直接使用任务结构体
if task_vo then
task_data_list[#task_data_list+1] = {task_data = task_vo}
else -- 当前进行中的任务不存在,则获取任务配置
if task_id and not self.task_model:IsTaskFinished(task_id) then
task_vo = ConfigItemMgr.Instance:GetTaskData(task_id)
task_data_list[#task_data_list+1] = {
content = string.format("%s任务 (<color=%s>%s</color>/%s) 级可接取",
(self.rein_lv == turn + 1 and turn_stage ~= 0) and "下一阶段" or "转职",
self.main_vo.level < task_vo.level and ColorUtil.RED_DARK or ColorUtil.GREEN_DARK,
self.main_vo.level, task_vo.level)
}
self.task_btn_flag = 5
self.click_tips_level = task_vo.level
-- 若查看的是当前正在进行的转职,而且没有可接或进行中的任务,就需要实时显示下一阶段所需要的角色等级
if not cur_task_vo and self.rein_lv == turn + 1 then
local next_stage_cfg = self.rein_stage_cfg[auto_index]
local next_stage_task = next_stage_cfg and ConfigItemMgr.Instance:GetTaskData(next_stage_cfg.task_id)
condition_tmp = next_stage_task and
string.format("<color=%s>Lv.%s</color> 开启下一星任务", ColorUtil.RED_DARK, WordManager:GetRoleLevel(next_stage_task.level, turn))
or ""
end
else -- 对于已完成的任务或者不存在的任务,提示任务内容已经完成
task_data_list[#task_data_list+1] = {finish_content = string.format("<color=%s>已完成</color>全部转职任务", ColorUtil.GREEN_DARK)}
self.task_btn_flag = 0
end
end
end
-- self.next_task_condition_tmp.text = condition_tmp
for k, v in pairs(self.task_scroll_item) do
v:SetVisible(false)
end
-- 生成节点
local item, height = nil, 0
for k, v in ipairs(task_data_list) do
item = self.task_scroll_item[k]
if not item then
item = ReinTaskScrollItem.New(self.taskdesc_con)
self.task_scroll_item[k] = item
end
item:SetVisible(true)
item:SetAnchoredPosition(0, -height)
height = height + item:SetData(v, stage)
end
SetSizeDeltaY(self.taskdesc_con, height)
-- 更新任务按钮样式
local is_gray = self.task_btn_flag == 0 or self.task_btn_flag == 5
self.task_func_btn_imgex.gray = is_gray
SetTMPSharedMaterial(self.task_func_btn_lb_tmp, is_gray and ShaderTools.TMPSharedMaterialType.FZZZOutlineDarkGrayBtn or ShaderTools.TMPSharedMaterialType.FZZZOutlineDarkOrangeBtn)
self.task_func_btn_lb_tmp.text = self.task_btn_flag_content[self.task_btn_flag]
end
function ReinTaskView:UpdateReinStageEnhanceAndUnlockData( )
-- 总内容
local eu_data_list = {}
-- 属性提升相关
eu_data_list[#eu_data_list+1] = {title = "提升 战力属性"}
-- 获取配置
local attr_list
if self.rein_lv == 0 then -- 特殊处理
attr_list = {
{1,20},{2,200}
}
else
attr_list = stringtotable(self.rein_stage_cfg[#self.rein_stage_cfg].attr_list)
end
local attr_temp1, attr_temp2
for i = 1, #attr_list, 2 do
attr_temp1 = attr_list[i]
attr_temp2 = attr_list[i + 1]
if attr_temp1 then
eu_data_list[#eu_data_list+1] = {attr1 = attr_temp1}
end
if attr_temp2 then
eu_data_list[#eu_data_list].attr2 = attr_temp2
end
end
-- 设置最后一条属性的条目位最终条目,该字段会增加条目高度拓宽间隔
eu_data_list[#eu_data_list].is_last = true
-- 解锁的技能和装备代数表现
local unlock_data = self.model:GetReinSucceedUnlockData(self.rein_lv)
if not IsTableEmpty(unlock_data.skill_list) then
eu_data_list[#eu_data_list+1] = {title = "新增 强力技能"}
eu_data_list[#eu_data_list+1] = {skill_data = unlock_data.skill_list}
end
eu_data_list[#eu_data_list].is_last = true
if not IsTableEmpty(unlock_data.equip_list) then
eu_data_list[#eu_data_list+1] = {title = string.format("解锁 %s代装备", ChineseNumber(unlock_data.equip_series))}
eu_data_list[#eu_data_list+1] = {equip_data = unlock_data.equip_list}
end
eu_data_list[#eu_data_list].is_last = true
local height = 0
for k, v in pairs(self.eu_item) do
v:SetVisible(false)
end
for k, v in ipairs(eu_data_list) do
self.eu_item[k] = self.eu_item[k] or ReinTaskDataItem.New(self.data_con)
self.eu_item[k]:SetAnchoredPosition(0, - height)
height = height + self.eu_item[k]:SetData(v)
self.eu_item[k]:SetVisible(true)
end
SetSizeDeltaY(self.data_con, height)
-- local start_y = -3 - (#attr_list > 6 and 0 or ((self.attr_scroll.sizeDelta.y - math.floor(#attr_list/2) * 31) / 2))
-- self.attr_item_creator = self.attr_item_creator or self:AddUIComponent(UI.ItemListCreator)
-- local info = {
-- data_list = attr_list,
-- scroll_view = self.attr_scroll,
-- item_con = self.attr_con,
-- prefab_ab_name = "reincarnation",
-- prefab_res_name = "ReinTaskAttrItem",
-- item_width = 175,
-- item_height = 34,
-- start_y = start_y,
-- space_x = 15,
-- space_y = -3,
-- create_frequency = 0.01,
-- alignment = UnityEngine.TextAnchor.UpperLeft,
-- child_names = {"attr_val:tmp", "attr_name:tmp"},
-- on_update_item = function(item, i, v)
-- item.attr_name_tmp.text = WordManager:GetProperties(v[1])
-- item.attr_val_tmp.text = "+"..WordManager:GetPropertyValue(v[1], v[2])
-- end,
-- }
-- self.attr_item_creator:UpdateItems(info)
end
-- 创建转职技能节点
-- function ReinTaskView:UpdateUnlockItems( )
-- -- 先隐藏所有的技能
-- for k, v in pairs(self.unlock_item) do
-- v:SetVisible(false)
-- end
-- local unlock_data = self.model:GetReinSucceedUnlockData(self.rein_lv)
-- local item
-- local list_num = #unlock_data
-- for k, v in ipairs(unlock_data) do
-- item = self.unlock_item[k]
-- if not item then
-- item = ReinUnlockItem.New(self.unlock_con)
-- self.unlock_item[k] = item
-- end
-- local x_index = k % 2 == 0 and 1 or 0
-- local y_index = math.ceil(k / 2) - 1
-- item:SetAnchoredPosition(5.5 + x_index * 192, -121 * y_index - 5)
-- item:SetData(v)
-- item:SetVisible(true)
-- end
-- end
-- 点击任务交互按钮
function ReinTaskView:OnTaskFuncBtnClick( )
if self.task_btn_flag ~= 0 and self.task_btn_flag ~= 5 then
local cur_rein_task = self.model:GetCurTaskVo()
TaskModel:getInstance():TaskClickFun(cur_rein_task)
-- 关闭转生任务界面
GlobalEventSystem:Fire(EventName.CLOSE_NEW_MAIN_ROLE_VIEW)
elseif self.task_btn_flag == 5 then
Message.show(string.format("任务%s级开放", self.click_tips_level), "fault")
end
end
function ReinTaskView:__delete( )
for k,v in pairs(self.tab_item) do
v:DeleteMe()
v = nil
end
self.tab_item = {}
for k, v in pairs(self.task_scroll_item) do
v:DeleteMe()
v = nil
end
self.task_scroll_item = nil
for k, v in pairs(self.eu_item) do
v:DeleteMe()
v = nil
end
self.eu_item = {}
if self.update_rein_stage_id then
self.main_vo:UnBind(self.update_rein_stage_id)
self.update_rein_stage_id = nil
end
end