源战役客户端
選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

467 行
18 KiB

  1. -- <*
  2. -- @Author: Saber
  3. -- @Description: 转职任务界面
  4. -- *>
  5. ReinTaskView = ReinTaskView or BaseClass(BaseItem)
  6. local ReinTaskView = ReinTaskView
  7. function ReinTaskView:__init(parent_wnd,prefab_asset,layer_name)
  8. self.base_file = "reincarnation"
  9. self.layout_file = "ReinTaskView"
  10. self.parent_wnd = parent_wnd
  11. self.layer_name = layer_name
  12. self.full_screen = true
  13. self.ani_right = 400
  14. self.ani_left = -200
  15. -- self.adjust_mid = {left = 160, right = 780}
  16. self.model_activity_bg = true
  17. self.model_activity_bg_pos = Vector2(-160, 32)
  18. self.open_rein_lv = nil -- 如果通过外部按钮跳转进来的,就会有这个值,自动定位到目标转职
  19. -- self:AddPreLoadList("reincarnation", {"ReinTaskScrollItem"})
  20. -- self:AddPreLoadList("reincarnation", {"ReinTaskDataItem"})
  21. self.model = ReincarnationModel:getInstance()
  22. -- self.model:UpdateCurReinTask() -- 加载一次转职任务
  23. self.task_model = TaskModel:getInstance()
  24. self.main_vo = RoleManager.Instance.mainRoleInfo
  25. self.rein_lv = 1
  26. self.rein_stage_cfg = {} -- 当前转职等级的阶段任务属性配置
  27. self.cur_task_stage = self.main_vo.turn_stage -- 当前转职任务阶段index
  28. self.first_loaded = true -- 第一次加载子节点
  29. -- self.task_btn_list = {} -- 任务按钮item
  30. self.tab_item = {}
  31. self.eu_item = {}
  32. self.task_scroll_item = {} -- 任务描述item
  33. self.task_btn_flag = 0 -- 任务功能按钮状态 0对于已完成的任务 1接任务 2前往任务 3完成任务 4完成转职 5任务不可接
  34. self.click_tips_level = 0 -- 当任务无法接取或进行时提示的任务等级
  35. self.task_btn_flag_content = {
  36. [0] = "已完成",
  37. [1] = "接取任务",
  38. [2] = "前往",
  39. [3] = "完成任务",
  40. [4] = "完成转职",
  41. [5] = "前往",
  42. }
  43. self:Load()
  44. end
  45. function ReinTaskView:Load_callback()
  46. local nodes = {
  47. -- 左侧玩家模型,技能节点
  48. "mid/role_con",
  49. -- 右侧信息部分
  50. "right/right_bg:raw",
  51. "right/task_func_btn:obj:imgex", -- 任务交互按钮相关
  52. "right/task_func_btn/task_func_btn_lb:tmp",
  53. "right/arrow:obj", -- 转职名称相关
  54. "right/stage_cur:obj",
  55. "right/stage_cur/stage_cur_lb:tmp",
  56. "right/stage_next:obj",
  57. "right/stage_next/stage_next_lb:tmp",
  58. "right/data_scroll",
  59. "right/data_scroll/Viewport/data_con",
  60. -- "right/attr_scroll", -- 转职属性奖励容器
  61. -- "right/attr_scroll/Viewport/attr_con",
  62. -- "right/taskdesc_scroll", -- 转职任务描述容器
  63. -- "right/taskdesc_scroll/taskdesc_vp:img",
  64. "right/taskdesc_con",
  65. -- "right/unlock_con",
  66. -- "right/titleTxt2:tmp",
  67. -- "right/next_task_condition:tmp", -- 任务开放条件文本
  68. -- 最左侧tab相关
  69. "left/tab_scroll",
  70. "left/tab_scroll/tab_vp:img",
  71. "left/tab_scroll/tab_vp/tab_con",
  72. }
  73. self:GetChildren(nodes)
  74. lua_resM:setOutsideRawImage(self, self.right_bg_raw, GameResPath.GetViewBigBg("re_task_right_bg"), false)
  75. self:AddEvents()
  76. if self.need_refresh_data then
  77. self:UpdateView()
  78. end
  79. end
  80. function ReinTaskView:AddEvents()
  81. local function click_event(target)
  82. if target == self.task_func_btn_obj then -- 任务交互按钮
  83. self:OnTaskFuncBtnClick()
  84. end
  85. end
  86. AddClickEvent(self.task_func_btn_obj, click_event)
  87. local function updateReinStage()
  88. self.cur_task_stage = self.main_vo.turn_stage
  89. end
  90. self.update_rein_stage_id = self.main_vo:BindOne("turn_stage", updateReinStage)
  91. local function updateReinTask()
  92. -- self.model:UpdateCurReinTask()
  93. self:UpdateCurStageTask() -- 更新任务按钮
  94. self:UpdateTrunTabItem()
  95. end
  96. -- self:BindEvent(TaskModel:getInstance(), TaskEvent.TASK_LIST_INIT, updateReinTask)
  97. self:BindEvent(self.model, ReincarnationModel.REFRESH_REIN_TASK, updateReinTask)
  98. end
  99. function ReinTaskView:SetData(view_index, rein_lv)
  100. self.open_rein_lv = rein_lv
  101. if self.is_loaded then
  102. self.need_refresh_data = false
  103. self:UpdateView()
  104. else
  105. self.need_refresh_data = true
  106. end
  107. end
  108. function ReinTaskView:UpdateView()
  109. self.tab_data = self.model:GetTotalReinTransferCfg()
  110. self:InitReinData(self.open_rein_lv)
  111. self:UpdateRoleModel() -- 更新模型
  112. self:UpdateTrunTabItem() -- 更新左侧职业按钮
  113. self:UpdateAllTurnData() -- 更新界面转职数据
  114. end
  115. -- 更新界面转职数据
  116. function ReinTaskView:UpdateAllTurnData( )
  117. self:UpdateCareerTitle() -- 更新职业变化节点
  118. self:UpdateCurStageTask() -- 更新任务按钮
  119. self:UpdateReinStageEnhanceAndUnlockData() -- 更新当前阶段的转职的属性提升和解锁内容
  120. end
  121. function ReinTaskView:InitReinData(rein_lv)
  122. self.rein_lv = rein_lv or self.model:GetCurTurn()
  123. self.rein_stage_cfg = self.model:GetReinLvStageData(self.rein_lv)
  124. -- if self.rein_lv == 0 then -- 对0转特殊处理,给5个球
  125. -- self.rein_stage_cfg = {
  126. -- {id = 0},
  127. -- {id = 0},
  128. -- {id = 0},
  129. -- {id = 0},
  130. -- {id = 0},
  131. -- }
  132. -- end
  133. self.total_stage = #self.rein_stage_cfg
  134. end
  135. function ReinTaskView:UpdateRoleModel( )
  136. local res_data = {
  137. father_node = self,
  138. transform = self.role_con,
  139. fashion_type = FuncOpenModel.TypeId.Clothes,
  140. size = Vector2(550, 440),
  141. scale = 255,
  142. ui_model_type = UIModelCommon.ModelType.BackModel,
  143. show_reflection = true,
  144. reflect_pos = Vector3(0, 76, 0),
  145. }
  146. FuncOpenModel:getInstance():SetModelRes(res_data)
  147. end
  148. -- 更新转职头衔
  149. function ReinTaskView:UpdateCareerTitle( )
  150. -- self.rein_lv是当前查看的转职,所以self.rein_lv获取到的数据实际上是next_cfg
  151. local lv_cfg, next_cfg
  152. for k, v in ipairs(self.tab_data) do
  153. if v.transfer_id == self.rein_lv-1 then
  154. lv_cfg = v
  155. end
  156. if v.transfer_id == self.rein_lv then
  157. next_cfg = v
  158. end
  159. end
  160. local turn, turn_stage = self.main_vo.turn, self.main_vo.turn_stage
  161. if self.rein_lv <= turn then -- 只显示当前职业
  162. self.stage_next_obj:SetActive(false)
  163. self.arrow_obj:SetActive(false)
  164. SetAnchoredPositionX(self.stage_cur, 4.5)
  165. self.stage_cur_lb_tmp.text = Trim(next_cfg.name)
  166. else -- 显示当前职业和后续转职职业
  167. self.stage_next_obj:SetActive(true)
  168. self.arrow_obj:SetActive(true)
  169. SetAnchoredPositionX(self.stage_cur, -102)
  170. if lv_cfg then
  171. self.stage_cur_lb_tmp.text = Trim(lv_cfg.name)
  172. end
  173. self.stage_next_lb_tmp.text = Trim(next_cfg.name)
  174. end
  175. end
  176. -- 加载转生阶段tabitem
  177. function ReinTaskView:UpdateTrunTabItem( )
  178. local tab_click_func = function(rein_lv)
  179. self:InitReinData(rein_lv)
  180. self:UpdateAllTurnData()
  181. for k, v in pairs(self.tab_item) do
  182. v:SetSelected(v.data.transfer_id == rein_lv)
  183. end
  184. end
  185. local tab_index = 1
  186. for k = 2, #self.tab_data do
  187. self.tab_item[tab_index] = self.tab_item[tab_index] or ReinTaskTabItem.New(self.tab_con)
  188. self.tab_item[tab_index]:SetAnchoredPosition(22, -(tab_index - 1) * (87 + 42) - 21)
  189. self.tab_item[tab_index]:SetData(self.tab_data[k], tab_index, tab_click_func)
  190. self.tab_item[tab_index]:SetSelected(self.tab_data[k].transfer_id == self.rein_lv)
  191. tab_index = tab_index + 1
  192. end
  193. end
  194. -- 加载任务节点
  195. function ReinTaskView:UpdateCurStageTask()
  196. -- 如果查看的是当前正在进行的转生阶段,则自动定位任务,否则定位到最后一个
  197. if self.rein_lv == self.main_vo.turn + 1 then
  198. -- 自动定位到当前正在进行的任务
  199. local cur_task_vo = self.model:GetCurTaskVo()
  200. local auto_index = self.cur_task_stage + 1
  201. if cur_task_vo then
  202. -- 当前已接任务则当前阶段等于跳转阶段,否则为下一阶段
  203. local task_received = cur_task_vo.acceptType == 0
  204. auto_index = task_received and self.cur_task_stage or self.cur_task_stage + 1
  205. end
  206. self:UpdateTaskData(auto_index > self.total_stage and self.total_stage or auto_index)
  207. else
  208. self:UpdateTaskData(self.rein_lv > self.main_vo.turn + 1 and 1 or self.total_stage)
  209. end
  210. end
  211. -- 构建任务详细数据结构体生成展示节点
  212. function ReinTaskView:UpdateTaskData(stage)
  213. if not stage then return end
  214. -- 当前转职进度
  215. local turn, turn_stage = self.main_vo.turn, self.main_vo.turn_stage
  216. -- 创建展示内容
  217. local task_data_list = {}
  218. self.task_btn_flag = 0 -- 任务功能按钮状态 0已完成的任务 1接任务 2前往任务 3完成任务 4完成转职 5任务不可接
  219. local condition_tmp = "" -- 条件文本,根据不同条件赋值
  220. if self.rein_lv < turn then -- 查看往期转职任务
  221. -- 提示任务内容已经完成
  222. task_data_list[#task_data_list+1] = {finish_content = string.format("<color=%s>已完成</color>全部转职任务", ColorUtil.GREEN_DARK)}
  223. -- self.titleTxt2_tmp.text = "转职任务"
  224. else
  225. local cur_task_vo, auto_index = nil, self.cur_task_stage + 1
  226. if self.rein_lv == turn + 1 then -- 查看当前转职任务
  227. -- 先尝试获取进行中的任务
  228. cur_task_vo = self.model:GetCurTaskVo()
  229. if cur_task_vo then
  230. -- 当前已接任务则当前阶段等于跳转阶段,否则为下一阶段
  231. local task_received = cur_task_vo.acceptType == 0
  232. auto_index = task_received and self.cur_task_stage or self.cur_task_stage + 1
  233. self.task_btn_flag = task_received and 2 or 1
  234. if task_received then
  235. -- 如果任务已经完成了,则要进一步确认状态
  236. local is_task_finished = cur_task_vo.taskTips[1] and cur_task_vo.taskTips[1].isFinish == 1
  237. if is_task_finished then
  238. self.task_btn_flag = self.total_stage == stage and 4 or 3
  239. end
  240. end
  241. end
  242. task_data_list[#task_data_list+1] = {title = string.format("(<color=%s>%s</color>/%s)", ColorUtil.GREEN_DARK, stage, self.total_stage)}
  243. -- self.titleTxt2_tmp.text = string.format("转职任务(<color=%s>%s</color>/%s)", ColorUtil.GREEN_DARK, stage, self.total_stage)
  244. else
  245. -- self.titleTxt2_tmp.text = "转职任务"
  246. end
  247. local stage_data = self.rein_stage_cfg[stage]
  248. local task_id = stage_data and stage_data.task_id
  249. -- 用于获取展示数据的task_vo
  250. local task_vo = nil
  251. if stage == auto_index then -- 当查看的阶段数相同时,才获取正在进行中的转生任务
  252. task_vo = cur_task_vo
  253. end
  254. -- 如果当前有进行中或可接的转职任务,则直接使用任务结构体
  255. if task_vo then
  256. task_data_list[#task_data_list+1] = {task_data = task_vo}
  257. else -- 当前进行中的任务不存在,则获取任务配置
  258. if task_id and not self.task_model:IsTaskFinished(task_id) then
  259. task_vo = ConfigItemMgr.Instance:GetTaskData(task_id)
  260. task_data_list[#task_data_list+1] = {
  261. content = string.format("%s任务 (<color=%s>%s</color>/%s) 级可接取",
  262. (self.rein_lv == turn + 1 and turn_stage ~= 0) and "下一阶段" or "转职",
  263. self.main_vo.level < task_vo.level and ColorUtil.RED_DARK or ColorUtil.GREEN_DARK,
  264. self.main_vo.level, task_vo.level)
  265. }
  266. self.task_btn_flag = 5
  267. self.click_tips_level = task_vo.level
  268. -- 若查看的是当前正在进行的转职,而且没有可接或进行中的任务,就需要实时显示下一阶段所需要的角色等级
  269. if not cur_task_vo and self.rein_lv == turn + 1 then
  270. local next_stage_cfg = self.rein_stage_cfg[auto_index]
  271. local next_stage_task = next_stage_cfg and ConfigItemMgr.Instance:GetTaskData(next_stage_cfg.task_id)
  272. condition_tmp = next_stage_task and
  273. string.format("<color=%s>Lv.%s</color> 开启下一星任务", ColorUtil.RED_DARK, WordManager:GetRoleLevel(next_stage_task.level, turn))
  274. or ""
  275. end
  276. else -- 对于已完成的任务或者不存在的任务,提示任务内容已经完成
  277. task_data_list[#task_data_list+1] = {finish_content = string.format("<color=%s>已完成</color>全部转职任务", ColorUtil.GREEN_DARK)}
  278. self.task_btn_flag = 0
  279. end
  280. end
  281. end
  282. -- self.next_task_condition_tmp.text = condition_tmp
  283. for k, v in pairs(self.task_scroll_item) do
  284. v:SetVisible(false)
  285. end
  286. -- 生成节点
  287. local item, height = nil, 0
  288. for k, v in ipairs(task_data_list) do
  289. item = self.task_scroll_item[k]
  290. if not item then
  291. item = ReinTaskScrollItem.New(self.taskdesc_con)
  292. self.task_scroll_item[k] = item
  293. end
  294. item:SetVisible(true)
  295. item:SetAnchoredPosition(0, -height)
  296. height = height + item:SetData(v, stage)
  297. end
  298. SetSizeDeltaY(self.taskdesc_con, height)
  299. -- 更新任务按钮样式
  300. local is_gray = self.task_btn_flag == 0 or self.task_btn_flag == 5
  301. self.task_func_btn_imgex.gray = is_gray
  302. SetTMPSharedMaterial(self.task_func_btn_lb_tmp, is_gray and ShaderTools.TMPSharedMaterialType.FZZZOutlineDarkGrayBtn or ShaderTools.TMPSharedMaterialType.FZZZOutlineDarkOrangeBtn)
  303. self.task_func_btn_lb_tmp.text = self.task_btn_flag_content[self.task_btn_flag]
  304. end
  305. function ReinTaskView:UpdateReinStageEnhanceAndUnlockData( )
  306. -- 总内容
  307. local eu_data_list = {}
  308. -- 属性提升相关
  309. eu_data_list[#eu_data_list+1] = {title = "提升 战力属性"}
  310. -- 获取配置
  311. local attr_list
  312. if self.rein_lv == 0 then -- 特殊处理
  313. attr_list = {
  314. {1,20},{2,200}
  315. }
  316. else
  317. attr_list = stringtotable(self.rein_stage_cfg[#self.rein_stage_cfg].attr_list)
  318. end
  319. local attr_temp1, attr_temp2
  320. for i = 1, #attr_list, 2 do
  321. attr_temp1 = attr_list[i]
  322. attr_temp2 = attr_list[i + 1]
  323. if attr_temp1 then
  324. eu_data_list[#eu_data_list+1] = {attr1 = attr_temp1}
  325. end
  326. if attr_temp2 then
  327. eu_data_list[#eu_data_list].attr2 = attr_temp2
  328. end
  329. end
  330. -- 设置最后一条属性的条目位最终条目,该字段会增加条目高度拓宽间隔
  331. eu_data_list[#eu_data_list].is_last = true
  332. -- 解锁的技能和装备代数表现
  333. local unlock_data = self.model:GetReinSucceedUnlockData(self.rein_lv)
  334. if not IsTableEmpty(unlock_data.skill_list) then
  335. eu_data_list[#eu_data_list+1] = {title = "新增 强力技能"}
  336. eu_data_list[#eu_data_list+1] = {skill_data = unlock_data.skill_list}
  337. end
  338. eu_data_list[#eu_data_list].is_last = true
  339. if not IsTableEmpty(unlock_data.equip_list) then
  340. eu_data_list[#eu_data_list+1] = {title = string.format("解锁 %s代装备", ChineseNumber(unlock_data.equip_series))}
  341. eu_data_list[#eu_data_list+1] = {equip_data = unlock_data.equip_list}
  342. end
  343. eu_data_list[#eu_data_list].is_last = true
  344. local height = 0
  345. for k, v in pairs(self.eu_item) do
  346. v:SetVisible(false)
  347. end
  348. for k, v in ipairs(eu_data_list) do
  349. self.eu_item[k] = self.eu_item[k] or ReinTaskDataItem.New(self.data_con)
  350. self.eu_item[k]:SetAnchoredPosition(0, - height)
  351. height = height + self.eu_item[k]:SetData(v)
  352. self.eu_item[k]:SetVisible(true)
  353. end
  354. SetSizeDeltaY(self.data_con, height)
  355. -- local start_y = -3 - (#attr_list > 6 and 0 or ((self.attr_scroll.sizeDelta.y - math.floor(#attr_list/2) * 31) / 2))
  356. -- self.attr_item_creator = self.attr_item_creator or self:AddUIComponent(UI.ItemListCreator)
  357. -- local info = {
  358. -- data_list = attr_list,
  359. -- scroll_view = self.attr_scroll,
  360. -- item_con = self.attr_con,
  361. -- prefab_ab_name = "reincarnation",
  362. -- prefab_res_name = "ReinTaskAttrItem",
  363. -- item_width = 175,
  364. -- item_height = 34,
  365. -- start_y = start_y,
  366. -- space_x = 15,
  367. -- space_y = -3,
  368. -- create_frequency = 0.01,
  369. -- alignment = UnityEngine.TextAnchor.UpperLeft,
  370. -- child_names = {"attr_val:tmp", "attr_name:tmp"},
  371. -- on_update_item = function(item, i, v)
  372. -- item.attr_name_tmp.text = WordManager:GetProperties(v[1])
  373. -- item.attr_val_tmp.text = "+"..WordManager:GetPropertyValue(v[1], v[2])
  374. -- end,
  375. -- }
  376. -- self.attr_item_creator:UpdateItems(info)
  377. end
  378. -- 创建转职技能节点
  379. -- function ReinTaskView:UpdateUnlockItems( )
  380. -- -- 先隐藏所有的技能
  381. -- for k, v in pairs(self.unlock_item) do
  382. -- v:SetVisible(false)
  383. -- end
  384. -- local unlock_data = self.model:GetReinSucceedUnlockData(self.rein_lv)
  385. -- local item
  386. -- local list_num = #unlock_data
  387. -- for k, v in ipairs(unlock_data) do
  388. -- item = self.unlock_item[k]
  389. -- if not item then
  390. -- item = ReinUnlockItem.New(self.unlock_con)
  391. -- self.unlock_item[k] = item
  392. -- end
  393. -- local x_index = k % 2 == 0 and 1 or 0
  394. -- local y_index = math.ceil(k / 2) - 1
  395. -- item:SetAnchoredPosition(5.5 + x_index * 192, -121 * y_index - 5)
  396. -- item:SetData(v)
  397. -- item:SetVisible(true)
  398. -- end
  399. -- end
  400. -- 点击任务交互按钮
  401. function ReinTaskView:OnTaskFuncBtnClick( )
  402. if self.task_btn_flag ~= 0 and self.task_btn_flag ~= 5 then
  403. local cur_rein_task = self.model:GetCurTaskVo()
  404. TaskModel:getInstance():TaskClickFun(cur_rein_task)
  405. -- 关闭转生任务界面
  406. GlobalEventSystem:Fire(EventName.CLOSE_NEW_MAIN_ROLE_VIEW)
  407. elseif self.task_btn_flag == 5 then
  408. Message.show(string.format("任务%s级开放", self.click_tips_level), "fault")
  409. end
  410. end
  411. function ReinTaskView:__delete( )
  412. for k,v in pairs(self.tab_item) do
  413. v:DeleteMe()
  414. v = nil
  415. end
  416. self.tab_item = {}
  417. for k, v in pairs(self.task_scroll_item) do
  418. v:DeleteMe()
  419. v = nil
  420. end
  421. self.task_scroll_item = nil
  422. for k, v in pairs(self.eu_item) do
  423. v:DeleteMe()
  424. v = nil
  425. end
  426. self.eu_item = {}
  427. if self.update_rein_stage_id then
  428. self.main_vo:UnBind(self.update_rein_stage_id)
  429. self.update_rein_stage_id = nil
  430. end
  431. end