源战役客户端
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.

403 lines
12 KiB

  1. SkillConfigView = SkillConfigView or BaseClass(BaseView)
  2. SkillConfigView.POS_MAX = 8
  3. function SkillConfigView:__init()
  4. self.base_file = "skillUI"
  5. self.layout_file = "SkillConfigView"
  6. self.layer_name = "Activity"
  7. self.model = SkillManager:getInstance()
  8. self.skillui_model = SkillUIModel:getInstance()
  9. self.use_background = true
  10. self.click_bg_toClose = true
  11. self.change_scene_close = true
  12. self.destroy_imm = true
  13. self.is_set_zdepth = true
  14. self.blur_activity_bg = true
  15. self.use_show_anim = true
  16. self.use_hide_anim = true
  17. self.skill_item_list = {}
  18. self.config_skill_item_list = {}
  19. self.skill_tabs = false
  20. self.pos_table = {}
  21. self.select_plan = 1
  22. self.skill_plan_id_list = {}
  23. self.select_skill_id = false
  24. self.select_slot_pos = false
  25. self.drag_skill_id = false
  26. self.target_change_pos = false
  27. self.drag_view_mrg = DragViewMgr.New()
  28. self.slot_pos_unlock_table = Config.ConfigSkillUI.SlotPosUnLockTurn
  29. self.load_callback = function ()
  30. self:LoadSuccess()
  31. self:InitEvent()
  32. self:UpdateSkillPlanInfo()
  33. if self.need_refreshData == true then
  34. self:SetData(self.select_skill_id)
  35. self:UpdataSkillInfo(self.select_skill_id)
  36. end
  37. end
  38. self.open_callback = function ()
  39. end
  40. self.close_callback = function ()
  41. self:Remove()
  42. end
  43. end
  44. function SkillConfigView:Remove()
  45. for i,v in ipairs(self.skill_item_list) do
  46. v:DeleteMe()
  47. end
  48. self.skill_item_list = {}
  49. for i,v in ipairs(self.config_skill_item_list) do
  50. v:DeleteMe()
  51. end
  52. self.config_skill_item_list = {}
  53. if self.drag_view_mrg then
  54. self.drag_view_mrg:DeleteMe()
  55. end
  56. end
  57. function SkillConfigView:LoadSuccess()
  58. local nodes = {
  59. "mid/icon:img","mid/cd:tmp","mid/des:tmp","mid/power:txt","right/skill_config_con/bg:raw",
  60. "right/skill_config_con/skil_list_con", "mid/close:obj", "mid/ScrollView/Viewport/skill_con",
  61. }
  62. self:GetChildren(nodes)
  63. self.pos_table = {}
  64. for i=1,SkillConfigView.POS_MAX do
  65. self.pos_table[i] = self:GetChild("right/skill_config_con/skil_list_con/pos_"..i)
  66. end
  67. self.mScroll = self:GetChild("mid/ScrollView"):GetComponent("ScrollRect")
  68. self.skill_tabs = {}
  69. for i=1, 3 do
  70. self.skill_tabs[i] = {}
  71. self.skill_tabs[i].trans = self:GetChild("mid/ScrollView/Viewport/skill_con/tltle_"..i)
  72. self.skill_tabs[i].obj = self:GetChild("mid/ScrollView/Viewport/skill_con/tltle_"..i).gameObject
  73. self.skill_tabs[i].text = self:GetChild("mid/ScrollView/Viewport/skill_con/tltle_"..i.."/text"):GetComponent("TextMeshProUGUI")
  74. self.skill_tabs[i].title_bg = self:GetChild("mid/ScrollView/Viewport/skill_con/tltle_"..i.."/title_bg"):GetComponent("Image")
  75. end
  76. end
  77. function SkillConfigView:InitEvent()
  78. local function onBtnClickHandler(target)
  79. if target == self.close_obj then
  80. self:Close()
  81. end
  82. end
  83. AddClickEvent(self.close_obj, onBtnClickHandler)
  84. local function onClickSkillItem(view_index, skill_id, pos)
  85. if view_index == SkillUIModel.Click_SkillItem.ConfigList then
  86. self:UpdataSkillInfo(skill_id)
  87. elseif view_index == SkillUIModel.Click_SkillItem.ConfigSolt then
  88. self:SelectIdxSlot(pos, self.select_slot_pos, self.select_skill_id)
  89. end
  90. end
  91. self:BindEvent(self.skillui_model,SkillUIModel.CLICK_SKILL_ITEM, onClickSkillItem)
  92. local function onUpdateSkillList()
  93. self:UpdateSkillPlanInfo()
  94. self:UpdataSkillInfo(self.select_skill_id)
  95. --self:AddEffect()
  96. end
  97. self:BindEvent(self.model,SkillManager.UPDATE_SKILL_LIST, onUpdateSkillList)
  98. local function OnDragSkillItemEnd(item,skill_id, pos, ui_type)
  99. local pos = self.skil_list_con.transform:InverseTransformPoint(item.transform.position)
  100. local index = self:CheckDragSelectIndex(pos)
  101. if index then
  102. local my_turn = RoleManager:getInstance():GetMainRoleVo().turn
  103. if self.slot_pos_unlock_table[index] > my_turn then
  104. local career = RoleManager:getInstance():GetMainRoleVo().career
  105. local cfg = Config.Transfercareer
  106. local career_name = ""
  107. for k,v in pairs(cfg) do
  108. if v.career == career and v.transfer_id == self.slot_pos_unlock_table[index] then
  109. career_name = Trim(v.name)
  110. break
  111. end
  112. end
  113. Message.show(string.format("转职为%s后可解", HtmlColorTxt(career_name, "#2cf86f")))
  114. else
  115. local select_slot_pos = false
  116. for i,v in ipairs(self.skill_item_list) do
  117. local b = skill_id == v:GetSkillId()
  118. if b then
  119. select_slot_pos = i
  120. break
  121. end
  122. end
  123. if index ~= select_slot_pos then
  124. self:SelectIdxSlot(index, select_slot_pos, skill_id)
  125. end
  126. end
  127. end
  128. self.drag_skill_id = false
  129. self:UpdateDragTips(self.select_skill_id)
  130. end
  131. self:BindEvent(self.skillui_model,SkillUIModel.DRAG_SKILL_ITEM_END,OnDragSkillItemEnd)
  132. local function begin_callback(item)
  133. local skill_vo = self.model:getSkill(self.drag_skill_id)
  134. item:SetUseFor("SkillDrag")
  135. item:SetData(skill_vo,nil,nil,true)
  136. item:SetSelect(false)
  137. item:ShowRedDot(false)
  138. item:SetLock(false)
  139. end
  140. local function end_callback(item)
  141. self.skillui_model:Fire(SkillUIModel.DRAG_SKILL_ITEM_END, item, self.drag_skill_id, self.drag_skill_pos, 1)
  142. end
  143. local info =
  144. {
  145. item_class = SkillUIItem,
  146. begin_callback = begin_callback,
  147. end_callback = end_callback,
  148. }
  149. self.drag_view_mrg:Init(info)
  150. local function OnDragSkillItemBegin(skill_id, pos, ui_type)
  151. self.drag_skill_id = skill_id
  152. self.drag_skill_pos = pos
  153. self.drag_view_mrg:Start()
  154. self:UpdateDragTips(self.drag_skill_id)
  155. end
  156. self:BindEvent(self.skillui_model,SkillUIModel.DRAG_SKILL_ITEM_BEGIN,OnDragSkillItemBegin)
  157. end
  158. function SkillConfigView:SwitchPlan(plan)
  159. if plan == self.select_plan then return end
  160. self.select_plan = plan
  161. self:UpdateSkillPlanInfo()
  162. self:UpdataSkillInfo(self.select_skill_id)
  163. end
  164. function SkillConfigView:UpdateSkillPlanInfo()
  165. self.skill_plan_id_list = self.skillui_model:GetSkillPlan(self.select_plan)
  166. local my_turn = RoleManager:getInstance():GetMainRoleVo().turn
  167. for i=1,SkillConfigView.POS_MAX do
  168. local id = self.skill_plan_id_list[i]
  169. local item = self.skill_item_list[i]
  170. if not item then
  171. item = SkillUIItem.New(self.pos_table[i],nil, "SkillConfigView")
  172. self.skill_item_list[i] = item
  173. item:SetUseFor("SkillConfigViewSlot")
  174. end
  175. item:SetVisible(true)
  176. if self.slot_pos_unlock_table[i] > my_turn then
  177. item:SetLock(true)
  178. item:SetNil(i,SkillUIModel.Click_SkillItem.ConfigSolt)
  179. item:CanDrag(false)
  180. item:SetNeedTurnHandle(self.slot_pos_unlock_table[i])
  181. else
  182. item:SetNeedTurnHandle(false)
  183. if id == 0 then
  184. item:SetNil(i,SkillUIModel.Click_SkillItem.ConfigSolt)
  185. item:CanDrag(false)
  186. else
  187. local skill_vo = self.model:getSkill(id)
  188. item:SetData(skill_vo, i, SkillUIModel.Click_SkillItem.ConfigSolt, true, false)
  189. item:SetLockInfo(false)
  190. item:CanDrag(true)
  191. end
  192. end
  193. end
  194. self:UpdateSkillList()
  195. end
  196. --点击技能槽位
  197. function SkillConfigView:SelectIdxSlot(pos, select_slot_pos, select_skill_id)
  198. if select_slot_pos == false or self.skill_plan_id_list[pos] == 0 then
  199. --print(">>>>>>>>>>>>> 上阵技能: 位置 类型 方案 选中技能 方式",pos, SkillUIModel.Skill_Type.Skill, self.select_plan, self.select_skill_id, SkillUIModel.Hook_Type.Auto )
  200. GlobalEventSystem:Fire(EventName.SAVE_SKILL_SHORTCUT, pos, SkillUIModel.Skill_Type.Skill, self.select_plan, select_skill_id, SkillUIModel.Hook_Type.Auto)
  201. else
  202. --print(">>>>>>>>>>>>> 替换技能: 位置1 位置2 方案 ", self.select_slot_pos, pos, self.select_plan)
  203. GlobalEventSystem:Fire(EventName.REPLACE_SKILL_SHORTCUT, select_slot_pos, pos, self.select_plan)
  204. end
  205. self.target_change_pos = pos
  206. end
  207. function SkillConfigView:UpdataSkillInfo(skill_id)
  208. if not skill_id then return end
  209. self.select_skill_id = skill_id
  210. if self.is_loaded then
  211. local skill_vo = self.model:getSkill(skill_id)
  212. local cd = skill_vo:getCd()
  213. self.cd_tmp.text = cd == 0 and "" or string.format("冷却:%s", HtmlColorTxt((cd / 1000) .. "s", "#2cf86f"))
  214. self.des_tmp.text = skill_vo:GetDesc(1)
  215. self.power_txt.text = "f" .. skill_vo:GetPower()
  216. lua_resM:setOutsideImageSprite(self,self.icon_img,GameResPath.GetSkillIcon(skill_id), false)
  217. else
  218. self.need_refreshData = true
  219. end
  220. self.select_slot_pos = false
  221. for i,v in ipairs(self.skill_item_list) do
  222. local b = skill_id == v:GetSkillId()
  223. v:SetSelect(b)
  224. if b then
  225. self.select_slot_pos = i
  226. end
  227. end
  228. for i,v in ipairs(self.config_skill_item_list) do
  229. local b = skill_id == v:GetSkillId()
  230. v:SetSelect(b)
  231. end
  232. self:UpdateDragTips(self.select_skill_id)
  233. end
  234. function SkillConfigView:SetData(skill_id)
  235. self.select_skill_id = skill_id or self.select_skill_id
  236. if self.is_loaded then
  237. self.skill_plan_id_list = self.skillui_model:GetSkillPlan(self.select_plan)
  238. local list = self.skillui_model:GetMyInitiativeSkillList()
  239. local pos = false
  240. local t_pos = 0
  241. for i,v in ipairs(list) do
  242. for ii,id in ipairs(v) do
  243. t_pos = t_pos + 1
  244. if id == skill_id then
  245. pos = t_pos
  246. break
  247. end
  248. end
  249. end
  250. if pos then
  251. self.skillui_model:Fire(SkillUIModel.CLICK_SKILL_ITEM, SkillUIModel.Click_SkillItem.ConfigList, self.select_skill_id, pos)
  252. end
  253. else
  254. self.need_refreshData = true
  255. end
  256. end
  257. function SkillConfigView:CheckDragSelectIndex(pos)
  258. local index = nil
  259. local function IsContain(i_pos_x, i_pos_y, i_w, i_h, in_pos)
  260. if in_pos.x > i_pos_x - i_w / 2 and
  261. in_pos.x < i_pos_x + i_w /2 and
  262. in_pos.y > i_pos_y - i_h / 2 and
  263. in_pos.y < i_pos_y + i_h / 2 then
  264. return true
  265. end
  266. end
  267. for i,v in ipairs(self.pos_table) do
  268. local item_pos_x,item_pos_y = GetAnchoredPosition(v)
  269. local item_w, item_h = GetSizeDeltaXY(v)
  270. if IsContain(item_pos_x, item_pos_y, item_w, item_h, pos) then
  271. index = i
  272. break
  273. end
  274. end
  275. return index
  276. end
  277. function SkillConfigView:UpdateSkillList()
  278. self.skill_id_table = self.skillui_model:GetMyInitiativeSkillList()
  279. if not self.skill_id_table then return end
  280. self.skill_id_list = {}
  281. for i=1,#self.skill_tabs do
  282. self.skill_tabs[i].obj:SetActive(false)
  283. end
  284. for i,v in ipairs(self.config_skill_item_list) do
  285. v:SetVisible(false, true)
  286. end
  287. local select_skill_id = self.select_skill_id
  288. local height = 0
  289. local tab_heigt = 162
  290. local item_start_x = 78
  291. local item_start_y = -80
  292. local item_width = 122
  293. local item_height = 120
  294. local idx = 1
  295. for i,v in ipairs(self.skill_id_table) do
  296. self.skill_tabs[i].obj:SetActive(true)
  297. SetAnchoredPosition(self.skill_tabs[i].trans, 19.5 , - height)
  298. self.skill_tabs[i].text.text = self.skillui_model:GetTurnName(i - 1)
  299. for ii,vv in ipairs(v) do
  300. local row , col = self.skillui_model:GetRowCol(ii, 4)
  301. local skill_vo = self.model:getSkill(vv)
  302. self.skill_id_list[idx] = skill_vo
  303. local item = self.config_skill_item_list[idx]
  304. if not item then
  305. item = SkillUIItem.New(self.skill_con,nil,self.maskID, self.mScroll)
  306. self.config_skill_item_list[idx] = item
  307. end
  308. item:SetVisible(true, true)
  309. item:SetUseFor("SkillConfigViewList")
  310. item:SetData(skill_vo, idx, SkillUIModel.Click_SkillItem.ConfigList, false)
  311. item:SetSelect(skill_vo.id == self.select_id)
  312. item:CanDrag(skill_vo.level > 0)
  313. item:ShowRedDot(false)
  314. item:SetLockInfo(false)
  315. local x = item_start_x + (col - 1) * item_width
  316. local y = item_start_y - (row - 1) * item_height - height
  317. item:SetAnchoredPosition(x, y)
  318. if not select_skill_id then
  319. select_skill_id = skill_vo.id
  320. end
  321. idx = idx + 1
  322. end
  323. height = height + tab_heigt
  324. local row , col = self.skillui_model:GetRowCol(#v, 4)
  325. height = height + (row - 1) * item_height
  326. end
  327. SetSizeDeltaY(self.skill_con, height)
  328. self:UpdataSkillInfo(select_skill_id)
  329. end
  330. function SkillConfigView:UpdateDragTips(select_skill_id)
  331. if select_skill_id then
  332. local skill_vo = self.model:getSkill(select_skill_id)
  333. if skill_vo and skill_vo.level > 0 then
  334. for i,v in ipairs(self.skill_item_list) do
  335. local my_turn = RoleManager:getInstance():GetMainRoleVo().turn
  336. if my_turn >= self.slot_pos_unlock_table[i] then
  337. if v:IsNil() then
  338. v:SetHandle(SkillUIItem.HANDLE_TYPE.config)
  339. elseif v:GetSkillId() == select_skill_id then
  340. v:SetHandle(SkillUIItem.HANDLE_TYPE.default)
  341. else
  342. v:SetHandle(SkillUIItem.HANDLE_TYPE.change)
  343. end
  344. end
  345. end
  346. else
  347. for i,v in ipairs(self.skill_item_list) do
  348. v:SetHandle(SkillUIItem.HANDLE_TYPE.default)
  349. end
  350. end
  351. end
  352. end
  353. function SkillConfigView:AddEffect()
  354. if self.target_change_pos then
  355. if self.target_change_pos and self.skill_item_list[self.target_change_pos] then
  356. self.skill_item_list[self.target_change_pos]:WillShowEffect(true)
  357. self.target_change_pos = false
  358. end
  359. end
  360. end