源战役客户端
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

464 rivejä
19 KiB

1 kuukausi sitten
  1. -- <*
  2. -- @Author: Saber
  3. -- @Description: 转职系统 转职弹出任务界面 (与角色-转职界面区分,这个界面仅当转职进行中可以弹出)
  4. -- *>
  5. ReinMainTaskView = ReinMainTaskView or BaseClass(BaseView)
  6. local ReinMainTaskView = ReinMainTaskView
  7. local SetAnchoredPositionX = SetAnchoredPositionX
  8. --[[
  9. ReinMainTaskView.TabData = {
  10. [1] = {name = "人物", level = MainRoleModel.TabOpenLevel[1]},
  11. }
  12. --]]
  13. function ReinMainTaskView:__init()
  14. self.base_file = "reincarnation"
  15. self.layout_file = "ReinMainTaskView"
  16. self.layer_name = "UI"
  17. self.destroy_imm = true
  18. self.use_background = true --全屏界面默认使用这个参数,非全屏界面自行设置
  19. self.use_show_anim = false
  20. self.use_hide_anim = true
  21. self.model = ReincarnationModel:getInstance()
  22. self.task_model = TaskModel:getInstance()
  23. self.role_img_pos = {
  24. [1] = Vector2(-315.5, -6),
  25. [2] = Vector2(-313.5, -25),
  26. [3] = Vector2(-168.5, 9.5),
  27. [4] = Vector2(-318, -0.5),
  28. }
  29. self.main_vo = RoleManager.Instance.mainRoleInfo
  30. self.cur_task_stage = self.main_vo.turn_stage -- 当前转职任务阶段index
  31. self.rein_lv = 1
  32. self.rein_stage_cfg = {} -- 当前转生等级的阶段任务属性配置
  33. self.skill_item = {} -- 界面中的技能图标
  34. self.equip_item = {} -- 界面中的技能图标
  35. self.task_reward = {} -- 界面中的任务奖励
  36. self.task_btn_flag_content = {
  37. [0] = "已完成",
  38. [1] = "接取任务",
  39. [2] = "前往",
  40. [3] = "完成任务",
  41. [4] = "完成转职",
  42. [5] = "前往",
  43. }
  44. self.load_callback = function ()
  45. self:LoadSuccess()
  46. self:AddEvent()
  47. end
  48. self.open_callback = function ( )
  49. self:UpdateView()
  50. end
  51. self.destroy_callback = function ( )
  52. self:DestroySuccess()
  53. end
  54. end
  55. function ReinMainTaskView:Open(rein_lv)
  56. self.rein_lv = rein_lv
  57. BaseView.Open(self)
  58. end
  59. function ReinMainTaskView:LoadSuccess()
  60. local nodes = {
  61. "bg:raw",
  62. "role_rp:rawex",
  63. "close_btn:obj",
  64. "main_title:imgex",
  65. -- 右侧信息部分,分为动画父节点和内部的信息节点
  66. -- 转职头像和名称
  67. "head_anim_con:cg",
  68. "head_anim_con/head_before_bg/head_before:raw",
  69. "head_anim_con/head_new_bg/head_new:raw",
  70. "head_anim_con/pname_before:tmp", "head_anim_con/pname_new:tmp",
  71. -- 属性节点和技能解锁容器
  72. "attr_skill_anim_con:cg",
  73. "attr_skill_anim_con/attr_scroll", "attr_skill_anim_con/attr_scroll/Viewport/attr_con",
  74. "attr_skill_anim_con/skill_con",
  75. -- 装备代数解锁容器
  76. "equip_anim_con:cg",
  77. "equip_anim_con/equip_con", "equip_anim_con/title3:tmp",
  78. -- 任务内容容器
  79. "task_anim_con:cg",
  80. "task_anim_con/task_proceed_btn:obj:imgex",
  81. "task_anim_con/task_proceed_btn/task_proceed_red:img",
  82. "task_anim_con/task_proceed_btn/task_proceed_btn_lb:tmp",
  83. "task_anim_con/task_title",
  84. "task_anim_con/task_award_con",
  85. "task_anim_con/task_progress:tmp",
  86. "task_anim_con/title4:tmp",
  87. }
  88. self:GetChildren(nodes)
  89. lua_resM:setOutsideRawImage(self, self.bg_raw, GameResPath.GetViewBigBg("re_main_bg"))
  90. end
  91. function ReinMainTaskView:AddEvent()
  92. local function click_event(target)
  93. if target == self.close_btn_obj then
  94. self:Close()
  95. elseif target == self.task_proceed_btn_obj then
  96. self:OnTaskProceedBtnClick()
  97. end
  98. end
  99. AddClickEvent(self.close_btn_obj, click_event)
  100. AddClickEvent(self.task_proceed_btn_obj, click_event)
  101. local function updateReinStage()
  102. self.cur_task_stage = self.main_vo.turn_stage
  103. end
  104. self.update_rein_stage_id = self.main_vo:BindOne("turn_stage", updateReinStage)
  105. local function updateReinTask()
  106. self:UpdateCurrentTask() -- 更新任务按钮
  107. end
  108. self:BindEvent(self.model, ReincarnationModel.REFRESH_REIN_TASK, updateReinTask)
  109. end
  110. function ReinMainTaskView:UpdateView()
  111. self:InitReinData(self.rein_lv)
  112. self:UpdateRoleRP() -- 更新立绘
  113. self:UpdateRoleHead() -- 更新转职系统头像
  114. self:UpdateAttrData() -- 更新战斗力和属性
  115. self:UpdateUnlockItems() -- 更新新增技能
  116. self:UpdateCurrentTask() -- 更新任务相关
  117. self:StartReinMainTaskAnim()
  118. end
  119. function ReinMainTaskView:InitReinData(rein_lv)
  120. self.rein_lv = rein_lv or self.model:GetCurTurn()
  121. self.rein_stage_cfg = self.model:GetReinLvStageData(self.rein_lv)
  122. self.total_stage = #self.rein_stage_cfg
  123. end
  124. -- 更新立绘
  125. function ReinMainTaskView:UpdateRoleRP( )
  126. -- 加载立绘
  127. self.role_rp_rawex.alpha = 0
  128. lua_resM:setOutsideRawImage(self, self.role_rp_rawex, GameResPath.GetRoleBg("rein_success_role" .. self.main_vo.career), true)
  129. end
  130. -- 更新转职系统头像
  131. function ReinMainTaskView:UpdateRoleHead( )
  132. -- 先获取上个转职阶段的默认头像
  133. local career_cfg = self.model:GetReinCareerHeadData(self.main_vo.career, self.rein_lv - 1)
  134. lua_resM:setOutsideRawImage(self, self.head_before_raw, GameResPath.GetHeadIcon(career_cfg and career_cfg.image_id or 1001))
  135. self.pname_before_tmp.text = career_cfg and Trim(career_cfg.name) or ""
  136. -- 获取当前转职的头像
  137. career_cfg = self.model:GetReinCareerHeadData(self.main_vo.career, self.rein_lv)
  138. lua_resM:setOutsideRawImage(self, self.head_new_raw, GameResPath.GetHeadIcon(career_cfg and career_cfg.image_id or 1001))
  139. self.pname_new_tmp.text = career_cfg and Trim(career_cfg.name) or ""
  140. end
  141. -- 更新转职属性提升数据
  142. function ReinMainTaskView:UpdateAttrData( )
  143. -- 获取配置
  144. local attr_list = stringtotable(self.rein_stage_cfg[#self.rein_stage_cfg].attr_list)
  145. attr_list = SortAttrList(attr_list)
  146. self.attr_item_creator = self.attr_item_creator or self:AddUIComponent(UI.ItemListCreator)
  147. local info = {
  148. data_list = attr_list,
  149. scroll_view = self.attr_scroll,
  150. item_con = self.attr_con,
  151. prefab_ab_name = "reincarnation",
  152. prefab_res_name = "ReinMainTaskAttrItem",
  153. item_height = 30,
  154. create_frequency = 0.01,
  155. alignment = UnityEngine.TextAnchor.UpperLeft,
  156. child_names = {"attr_name:tmp", "attr_val:tmp"},
  157. on_update_item = function(item, i, v)
  158. item.attr_name_tmp.text = WordManager:GetProperties(v[1])
  159. item.attr_val_tmp.text = WordManager:GetPropertyValue(v[1], v[2])
  160. end,
  161. }
  162. self.attr_item_creator:UpdateItems(info)
  163. end
  164. -- 更新转职解锁内容
  165. function ReinMainTaskView:UpdateUnlockItems( )
  166. local unlock_data = self.model:GetReinSucceedUnlockData(self.rein_lv)
  167. -- 解锁的技能
  168. for k, v in ipairs(unlock_data.skill_list) do
  169. self.skill_item[k] = self.skill_item[k] or ReinTaskSkillItem.New(self.skill_con)
  170. self.skill_item[k]:SetTransformSize(62)
  171. local row, col = (k - 1) % 4, math.floor((k - 1) / 4)
  172. self.skill_item[k]:SetAnchoredPosition(81.5 * row + 1, -68 * col)
  173. self.skill_item[k]:SetData(v.skill_data)
  174. end
  175. -- 解锁的装备
  176. for k, v in ipairs(unlock_data.equip_list) do
  177. self.equip_item[k] = self.equip_item[k] or UIObjPool:getInstance():PopItem(UIObjPool.UIType.AwardItem, self.equip_con)
  178. self.equip_item[k]:SetAnchoredPosition((k - 1) * 78 + 9, -5)
  179. self.equip_item[k]:SetItemSize(62, 62)
  180. self.equip_item[k]:SetVisible(true)
  181. self.equip_item[k]:SetData(v.equip_data)
  182. end
  183. -- 装备栏标题
  184. self.title3_tmp.text = string.format("解锁 %s代装备", ChineseNumber(unlock_data.equip_series))
  185. end
  186. -- 更新当前的转职任务信息
  187. function ReinMainTaskView:UpdateCurrentTask( )
  188. -- 如果查看的是当前正在进行的转生阶段,则自动定位任务,否则定位到最后一个
  189. if self.rein_lv == self.main_vo.turn + 1 then
  190. -- 自动定位到当前正在进行的任务
  191. local cur_task_vo = self.model:GetCurTaskVo()
  192. local auto_index = self.cur_task_stage + 1
  193. if cur_task_vo then
  194. -- 当前已接任务则当前阶段等于跳转阶段,否则为下一阶段
  195. local task_received = cur_task_vo.acceptType == 0
  196. auto_index = task_received and self.cur_task_stage or self.cur_task_stage + 1
  197. end
  198. self:UpdateTaskData(auto_index > self.total_stage and self.total_stage or auto_index)
  199. else
  200. self:UpdateTaskData(self.rein_lv > self.main_vo.turn + 1 and 1 or self.total_stage)
  201. end
  202. end
  203. function ReinMainTaskView:UpdateTaskData(stage)
  204. if not stage then return end
  205. -- 当前转职进度
  206. local turn, turn_stage = self.main_vo.turn, self.main_vo.turn_stage
  207. -- 创建展示内容
  208. -- local task_data_list = {}
  209. self.task_btn_flag = 0 -- 任务功能按钮状态 0已完成的任务 1接任务 2前往任务 3完成任务 4完成转职 5任务不可接
  210. local progress_lb = nil
  211. local task_award = nil
  212. if self.rein_lv < turn then -- 查看往期转职任务
  213. -- 提示任务内容已经完成
  214. self.title4_tmp.text = string.format("<color=%s>已完成</color>全部转职任务", ColorUtil.GREEN_DARK)
  215. else
  216. local cur_task_vo, auto_index = nil, self.cur_task_stage + 1
  217. if self.rein_lv == turn + 1 then -- 查看当前转职任务
  218. -- 先尝试获取进行中的任务
  219. cur_task_vo = self.model:GetCurTaskVo()
  220. if cur_task_vo then
  221. -- 记录奖励列表
  222. task_award = cur_task_vo.award_list
  223. -- 当前已接任务则当前阶段等于跳转阶段,否则为下一阶段
  224. local task_received = cur_task_vo.acceptType == 0
  225. auto_index = task_received and self.cur_task_stage or self.cur_task_stage + 1
  226. self.task_btn_flag = task_received and 2 or 1
  227. if task_received then
  228. -- 如果任务已经完成了,则要进一步确认状态
  229. local is_task_finished = cur_task_vo.taskTips[1] and cur_task_vo.taskTips[1].isFinish == 1
  230. if is_task_finished then
  231. self.task_btn_flag = self.total_stage == stage and 4 or 3
  232. end
  233. end
  234. end
  235. progress_lb = string.format("(<color=%s>%s</color>/%s)", ColorUtil.GREEN_DARK, stage, self.total_stage)
  236. else
  237. progress_lb = nil
  238. end
  239. local stage_data = self.rein_stage_cfg[stage]
  240. local task_id = stage_data and stage_data.task_id
  241. if progress_lb then
  242. self.task_progress_tmp.text = progress_lb
  243. SetAnchoredPositionX(self.task_title, -15.5)
  244. else
  245. self.task_progress_tmp.text = ""
  246. SetAnchoredPositionX(self.task_title, 15.5)
  247. end
  248. -- 用于获取展示数据的task_vo
  249. local task_vo = nil
  250. if stage == auto_index then -- 当查看的阶段数相同时,才获取正在进行中的转生任务
  251. task_vo = cur_task_vo
  252. end
  253. print("Saber:ReinMainTaskView [279] task_id: ",task_id)
  254. -- 如果当前有进行中或可接的转职任务,则直接使用任务结构体
  255. if task_vo then
  256. self.title4_tmp.text = task_vo.tipContent
  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_award = self:GetTaskRewardList(task_vo)
  261. self.title4_tmp.text = 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. self.task_btn_flag = 5
  266. self.click_tips_level = task_vo.level
  267. else -- 对于已完成的任务或者不存在的任务,提示任务内容已经完成
  268. self.title4_tmp.text = string.format("<color=%s>已完成</color>全部转职任务", ColorUtil.GREEN_DARK)
  269. self.task_btn_flag = 0
  270. end
  271. end
  272. end
  273. -- 更新任务按钮样式
  274. local is_gray = self.task_btn_flag == 0 or self.task_btn_flag == 5
  275. self.task_proceed_btn_imgex.gray = is_gray
  276. SetTMPSharedMaterial(self.task_proceed_btn_lb_tmp, is_gray
  277. and ShaderTools.TMPSharedMaterialType.FZZZOutlineDarkGrayBtn
  278. or ShaderTools.TMPSharedMaterialType.FZZZOutlineDarkOrangeBtn
  279. )
  280. self.task_proceed_btn_lb_tmp.text = self.task_btn_flag_content[self.task_btn_flag]
  281. -- 加载任务奖励
  282. for k, v in pairs(self.task_reward) do
  283. v:SetVisible(false)
  284. end
  285. if task_award then
  286. for k, v in ipairs(task_award) do
  287. self.task_reward[k] = self.task_reward[k] or UIObjPool:getInstance():PopItem(UIObjPool.UIType.AwardItem, self.task_award_con)
  288. self.task_reward[k]:SetAnchoredPosition((k - 1) * 78 + 9, -5)
  289. self.task_reward[k]:SetItemSize(62, 62)
  290. self.task_reward[k]:SetVisible(true)
  291. self.task_reward[k]:SetDataWithMapId(v[2], v[3], v[1])
  292. end
  293. end
  294. end
  295. function ReinMainTaskView:GetTaskRewardList(task_vo)
  296. local normal_list = stringtotable(task_vo.award_list)
  297. local career_list = stringtotable(task_vo.special_goods_list)
  298. local award_list = {}
  299. for i,v in ipairs(career_list) do
  300. if (self.main_vo.career == tonumber(v[1]) or tonumber(v[1])==0)
  301. and (self.main_vo.sex==tonumber(v[2]) or tonumber(v[2])==0) then
  302. local obj = {}
  303. obj[1] = 0
  304. obj[2] = tonumber(v[3])
  305. obj[3] = tonumber(v[4])
  306. table.insert(award_list, obj)
  307. end
  308. end
  309. for i,v in ipairs(normal_list) do
  310. table.insert(award_list, v)
  311. end
  312. return award_list
  313. end
  314. ---------- 动画相关 --------------
  315. function ReinMainTaskView:StartReinMainTaskAnim( )
  316. local title_action_time = 0.2
  317. local role_rp_action_time = 0.5
  318. local right_info_delay = 0.1
  319. local head_action_time = 0.3
  320. local a_s_action_time = 0.3
  321. local equip_action_time = 0.3
  322. local task_action_time = 0.3
  323. local function east_func(percent)
  324. percent = percent - 1.0
  325. local real_pec = percent * percent * percent * percent * percent + 1
  326. return real_pec
  327. end
  328. -- 标题小位移效果和淡出效果
  329. local target_main_title_posx = -77
  330. SetAnchoredPositionX(self.main_title, target_main_title_posx - 100)
  331. local function title_size_x_func(percent)
  332. percent = east_func(percent)
  333. self.main_title_imgex.alpha = percent
  334. SetAnchoredPositionX(self.main_title, target_main_title_posx - 100 * (1 - percent))
  335. end
  336. local main_title_action = cc.CustomUpdate.New(title_action_time, title_size_x_func)
  337. cc.ActionManager:getInstance():addAction(main_title_action, self.main_title)
  338. -- 左侧立绘淡入和位移
  339. local pos = self.role_img_pos[self.main_vo.career]
  340. SetAnchoredPosition(self.role_rp, pos.x - 300, pos.y)
  341. local function role_rp_action_func(percent)
  342. percent = east_func(percent)
  343. self.role_rp_rawex.alpha = percent
  344. SetAnchoredPositionX(self.role_rp, pos.x - 300 * (1 - percent))
  345. end
  346. local role_rp_action = cc.Sequence.New(
  347. cc.DelayTime.New(title_action_time),
  348. cc.CustomUpdate.New(role_rp_action_time, role_rp_action_func)
  349. )
  350. cc.ActionManager:getInstance():addAction(role_rp_action, self.role_rp)
  351. -- 右侧信息淡入和位移
  352. -- (自上而下)头像框
  353. local head_pos_x = 260
  354. SetAnchoredPositionX(self.head_anim_con, head_pos_x - 50)
  355. local function head_action_func(percent)
  356. percent = east_func(percent)
  357. self.head_anim_con_cg.alpha = percent
  358. SetAnchoredPositionX(self.head_anim_con, head_pos_x - 50 * (1 - percent))
  359. end
  360. local head_action = cc.Sequence.New(
  361. cc.DelayTime.New(title_action_time),
  362. cc.CustomUpdate.New(head_action_time, head_action_func)
  363. )
  364. cc.ActionManager:getInstance():addAction(head_action, self.head_anim_con)
  365. -- 属性和技能解锁
  366. local a_s_pos_x = 240
  367. SetAnchoredPositionX(self.attr_skill_anim_con, a_s_pos_x - 50)
  368. local function attr_skill_action_func(percent)
  369. percent = east_func(percent)
  370. self.attr_skill_anim_con_cg.alpha = percent
  371. SetAnchoredPositionX(self.attr_skill_anim_con, a_s_pos_x - 50 * (1 - percent))
  372. end
  373. local a_s_action = cc.Sequence.New(
  374. cc.DelayTime.New(title_action_time + right_info_delay),
  375. cc.CustomUpdate.New(a_s_action_time, attr_skill_action_func)
  376. )
  377. cc.ActionManager:getInstance():addAction(a_s_action, self.attr_skill_anim_con)
  378. -- 装备代数
  379. local equip_pos_x = 240
  380. SetAnchoredPositionX(self.equip_anim_con, equip_pos_x - 50)
  381. local function equip_action_func(percent)
  382. percent = east_func(percent)
  383. self.equip_anim_con_cg.alpha = percent
  384. SetAnchoredPositionX(self.equip_anim_con, equip_pos_x - 50 * (1 - percent))
  385. end
  386. local equip_action = cc.Sequence.New(
  387. cc.DelayTime.New(title_action_time + right_info_delay * 2),
  388. cc.CustomUpdate.New(equip_action_time, equip_action_func)
  389. )
  390. cc.ActionManager:getInstance():addAction(equip_action, self.equip_anim_con)
  391. -- 任务内容
  392. local task_pos_x = 240
  393. SetAnchoredPositionX(self.task_anim_con, task_pos_x - 50)
  394. local function task_action_func(percent)
  395. percent = east_func(percent)
  396. self.task_anim_con_cg.alpha = percent
  397. SetAnchoredPositionX(self.task_anim_con, task_pos_x - 50 * (1 - percent))
  398. end
  399. local task_action = cc.Sequence.New(
  400. cc.DelayTime.New(title_action_time + right_info_delay * 3),
  401. cc.CustomUpdate.New(task_action_time, task_action_func)
  402. )
  403. cc.ActionManager:getInstance():addAction(task_action, self.task_anim_con)
  404. end
  405. ---------- 动画相关 --------------
  406. -- 点击任务前往按钮回调
  407. function ReinMainTaskView:OnTaskProceedBtnClick( )
  408. if self.task_btn_flag ~= 0 and self.task_btn_flag ~= 5 then
  409. local cur_rein_task = self.model:GetCurTaskVo()
  410. TaskModel:getInstance():TaskClickFun(cur_rein_task)
  411. -- 关闭界面
  412. self:Close()
  413. elseif self.task_btn_flag == 5 then
  414. Message.show(string.format("任务%s级开放", self.click_tips_level), "fault")
  415. end
  416. end
  417. function ReinMainTaskView:DestroySuccess( )
  418. cc.ActionManager:getInstance():removeAllActionsFromTarget(self.main_title)
  419. cc.ActionManager:getInstance():removeAllActionsFromTarget(self.head_anim_con)
  420. cc.ActionManager:getInstance():removeAllActionsFromTarget(self.role_rp)
  421. cc.ActionManager:getInstance():removeAllActionsFromTarget(self.attr_skill_anim_con)
  422. cc.ActionManager:getInstance():removeAllActionsFromTarget(self.equip_anim_con)
  423. cc.ActionManager:getInstance():removeAllActionsFromTarget(self.task_anim_con)
  424. for k, v in pairs(self.skill_item) do
  425. v:DeleteMe()
  426. v = nil
  427. end
  428. for k, v in pairs(self.equip_item) do
  429. UIObjPool:getInstance():PushItem(UIObjPool.UIType.AwardItem, v)
  430. end
  431. self.equip_item = {}
  432. for k, v in pairs(self.task_reward) do
  433. UIObjPool:getInstance():PushItem(UIObjPool.UIType.AwardItem, v)
  434. end
  435. self.task_reward = {}
  436. if self.update_rein_stage_id then
  437. self.main_vo:UnBind(self.update_rein_stage_id)
  438. self.update_rein_stage_id = nil
  439. end
  440. end