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

302 lines
11 KiB

  1. PetEvolvePanel = PetEvolvePanel or BaseClass(BaseItem)
  2. local PetEvolvePanel = PetEvolvePanel
  3. function PetEvolvePanel:__init()
  4. self.base_file = "pet"
  5. self.layout_file = "PetEvolvePanel"
  6. self.model = PetModel:getInstance()
  7. self:Load()
  8. end
  9. function PetEvolvePanel:Load_callback()
  10. self.nodes = {
  11. "evolveBtn:obj:img",--进化按钮
  12. "nextArrow:obj",--箭头
  13. "con_star_next:obj",--下一级星星容器,满星时隐藏
  14. "attr_ScrollView","attr_ScrollView/Viewport/Content",--属性容器
  15. "con_cost",--消耗道具容器
  16. "costName:tmp",--消耗道具
  17. "evolveBtn/Text:tmp",
  18. "evolveBtn/evolveRed:obj",
  19. }
  20. self:GetChildren(self.nodes)
  21. self.now_star = {}--当前星级
  22. self.next_star = {}--下一星级
  23. for i=1,5 do
  24. self.now_star[i] = self:GetChild("con_star_now/star"..i):GetComponent("Image")
  25. self.next_star[i] = self:GetChild("con_star_next/star"..i):GetComponent("Image")
  26. end
  27. --创建消耗道具
  28. self.cost_item = UIObjPool:getInstance():PopItem(UIObjPool.UIType.AwardItem, self.con_cost)
  29. self.cost_item:SetItemSize(78,78)
  30. self.cost_item:SetAnchoredPosition(0,0)
  31. self:AddEvents()
  32. if self.need_refreshData then
  33. self:UpdateView()
  34. end
  35. end
  36. function PetEvolvePanel:AddEvents( )
  37. local on_click = function ( click_obj )
  38. if self.evolveBtn_obj == click_obj then--进化按钮
  39. -- if self.can_evolve then
  40. self.model:RecordDataBeforeEvolve(DeepCopy(self.data))
  41. self.model:Fire(PetConst.REQUEST_CCMD_EVENT,16303,self.data.pet_id,2)--进化
  42. -- else
  43. -- Message.show("进化所需灵魂碎片不足哦!","fault")
  44. -- end
  45. end
  46. end
  47. AddClickEvent(self.evolveBtn_obj, on_click,LuaSoundManager.SOUND_UI.NONE)
  48. --宠物碎片刷新时
  49. local update_progress = function(goods_sub_type)
  50. if goods_sub_type == 1 then--宠物碎片
  51. local data = self.model:GetPetListById(self.data.pet_id)
  52. self:UpdateCostItems(data)
  53. end
  54. end
  55. self:BindEvent(self.model, PetConst.UPDATE_PET_GOODS_NUM, update_progress)
  56. --宠物进化成功之后的刷新
  57. local pet_evolve = function(pet_id)
  58. if not self.is_loaded then return end
  59. if pet_id == self.data.pet_id then
  60. self.data = self.model:GetPetListById(self.data.pet_id)
  61. self.cfg_data = self.model:GetPetCfg(self.data.pet_id,self.data.pet_star)
  62. -- self:SetData(data,cfg_data)
  63. self:UpdateView(need_play_attr_effect)
  64. end
  65. end
  66. self:BindEvent(self.model, PetConst.PET_EVOLVE, pet_evolve)
  67. --宠物升级时,属性框也要发生变化
  68. local pet_upgrade = function(data,cfg_data)
  69. -- if data.pet_lv ~= self.data.pet_lv then--需要刷新属性框
  70. self.data = data
  71. self.cfg_data = cfg_data
  72. self:UpdateAttr(self.data,self.cfg_data)--刷新属性栏
  73. -- end
  74. end
  75. self:BindEvent(self.model, PetConst.UPDATE_FEED_PANEL,pet_upgrade)
  76. --装上宝石后,宠物属性列表也要刷新
  77. local update_attr = function(pet_id)
  78. if self.data.pet_id == pet_id then
  79. self:UpdateAttr(self.data,self.cfg_data)
  80. end
  81. end
  82. self:BindEvent(self.model, PetConst.UPDATE_PET_DIAMOND_CON, update_attr)
  83. end
  84. function PetEvolvePanel:UpdateView(need_play_attr_effect )
  85. self:UpdateStageAndStar(self.data,self.cfg_data)
  86. self:UpdateAttr(self.data,self.cfg_data,need_play_attr_effect)
  87. self:UpdateCostItems(self.data)
  88. end
  89. --刷新阶段、星数的显示
  90. function PetEvolvePanel:UpdateStageAndStar(data,cfg_data)
  91. local max_show_star = self.model:GetMaxStarInStage(data.pet_id,data.pet_star)
  92. local now_show_star = self.model:GetNowShowPetStar(data.pet_star)
  93. for i=1,now_show_star do
  94. lua_resM:setImageSprite(self, self.now_star[i], "pet_asset", PetConst.stage_message[data.pet_stage].star_res,true)
  95. self.now_star[i].gameObject:SetActive(true)
  96. end
  97. for i=now_show_star+1,5 do
  98. lua_resM:setImageSprite(self, self.now_star[i], "pet_asset", "pet_star_0",true)
  99. self.now_star[i].gameObject:SetActive(false)
  100. end
  101. --判断是不是满星了
  102. local final_star = self.model:GetPetMaxStar(data.pet_id)
  103. if data.pet_star == final_star then
  104. --隐藏箭头和星级阶段
  105. self.nextArrow_obj:SetActive(false)
  106. self.con_star_next_obj:SetActive(false)
  107. else
  108. self.nextArrow_obj:SetActive(true)
  109. self.con_star_next_obj:SetActive(true)
  110. --判断进化后是否会升阶段
  111. local next_max_star = self.model:GetMaxStarInStage(data.pet_id,data.pet_star+5)
  112. if self.model:CanPetGradeToNextStage(data.pet_star) then
  113. lua_resM:setImageSprite(self, self.next_star[1], "pet_asset", PetConst.stage_message[data.pet_stage+1].star_res,true)
  114. self.next_star[1].gameObject:SetActive(true)
  115. for i=2,next_max_star do
  116. lua_resM:setImageSprite(self, self.next_star[i], "pet_asset", "pet_star_0",true)
  117. self.next_star[i].gameObject:SetActive(false)
  118. end
  119. else
  120. for i=1,now_show_star+1 do
  121. lua_resM:setImageSprite(self, self.next_star[i], "pet_asset", PetConst.stage_message[data.pet_stage].star_res,true)
  122. self.next_star[i].gameObject:SetActive(true)
  123. end
  124. for i=now_show_star+1+1,next_max_star do
  125. lua_resM:setImageSprite(self, self.next_star[i], "pet_asset", "pet_star_0",true)
  126. self.next_star[i].gameObject:SetActive(false)
  127. end
  128. end
  129. end
  130. end
  131. --刷新属性值
  132. function PetEvolvePanel:UpdateAttr(data,cfg_data,need_play_attr_effect)
  133. --获取计算好的属性值
  134. local diamond_data = self.model:GetPetDiamondDataById(data.pet_id)--取出宝石所加的属性一并计算
  135. local awake_cfg = nil
  136. if data.is_awaken == 1 then
  137. awake_cfg = self.model:GetPetAwakeCfg(data.pet_id)
  138. end
  139. local now_attr_list = self.model:GetPetAttrList(data.pet_lv,stringtotable(cfg_data.attr_list),diamond_data,awake_cfg,data.pet_star,data.pet_id)
  140. if data.pet_star == self.model:GetPetMaxStar(data.pet_id) then--已经达到满星
  141. self:UpdateAttrScrollView(now_attr_list,true)
  142. else
  143. local next_star = self.model:GetNextStageAndStar(data.pet_id, data.pet_star)--获取下一星级的阶段和星数
  144. local next_cfg = self.model:GetPetCfg(data.pet_id,next_star)--获取下一阶段的配置
  145. if not next_cfg then--防止没有配置的情况
  146. self:UpdateAttrScrollView(now_attr_list,true)
  147. return
  148. end
  149. local next_attr_list = self.model:GetPetAttrList(data.pet_lv,stringtotable(next_cfg.attr_list),diamond_data,awake_cfg,next_star,data.pet_id)
  150. --将两个算好的不同等级的属性table合并成一个,格式为{{属性id,当前属性值,下一级增长值},{}}
  151. local final_attr_list = self.model:MergeAttrList(now_attr_list,next_attr_list)
  152. self:UpdateAttrScrollView(final_attr_list,false,need_play_attr_effect)
  153. end
  154. end
  155. --刷新属性栏scrollview
  156. function PetEvolvePanel:UpdateAttrScrollView(attr_list,is_max_lv,need_play_attr_effect)
  157. if not self.attr_list_com then
  158. self.attr_list_com = self:AddUIComponent(UI.ItemListCreator)
  159. end
  160. -- --解决高级属性名字过长导致文字重叠的问题:普通属性一行摆两个,高级属性一行摆一个
  161. -- --思路:ItemListCreator不能自由控制一行摆几个,因此在高级属性后面插入一个空属性隐藏显示,模拟出一行只摆一个属性的效果
  162. -- --step1:排序属性列表,把高级属性排后面
  163. -- local _sort = function( a,b )
  164. -- if a[1] < b[1] then
  165. -- return true
  166. -- end
  167. -- end
  168. -- table.sort( attr_list, _sort )
  169. -- --step2:找到普通属性和高级属性的分界点
  170. -- local divide_index = 0--分界点下标
  171. -- local max_index = #attr_list--属性个数
  172. -- for i,v in ipairs(attr_list) do
  173. -- --找到高级属性,标记分界点
  174. -- if WordManager:GetAttrIsSpecial(v[1]) then
  175. -- divide_index = i-1
  176. -- break
  177. -- end
  178. -- end
  179. -- --step3:分情况操作
  180. -- --偶数个普通属性时,直接对后面的高级属性依次插入空属性即可
  181. -- --奇数个普通属性时,先在最后一个普通属性后插入空属性,让高级属性掉到下一行位置去
  182. -- if divide_index ~= 0 then
  183. -- if divide_index %2 == 0 then
  184. -- for i=1,max_index-divide_index do
  185. -- table.insert(attr_list,divide_index+2*i,{0})
  186. -- end
  187. -- else
  188. -- table.insert(attr_list,divide_index+1,{0})
  189. -- for i=1,max_index-divide_index do
  190. -- table.insert(attr_list,divide_index+2*i+1,{0})
  191. -- end
  192. -- end
  193. -- end
  194. -- ------------------
  195. local info = {
  196. data_list = attr_list,
  197. item_con = self.Content,
  198. item_class = PetAttrItem,
  199. -- item_width = 193,
  200. item_height = 47,
  201. space_x = 0,
  202. space_y = -2,
  203. start_x = 0,
  204. start_y = 5,
  205. scroll_view = self.attr_ScrollView,
  206. -- create_frequency = 0.01,
  207. on_update_item = function(item, i, v)
  208. item:SetData(i,v,is_max_lv,need_play_attr_effect)
  209. end,
  210. }
  211. self.attr_list_com:UpdateItems(info)
  212. end
  213. --刷新升级道具的显示
  214. function PetEvolvePanel:UpdateCostItems(data)
  215. local next_star = self.model:GetNextStageAndStar(data.pet_id, data.pet_star)
  216. local cfg_data = self.model:GetPetCfg(data.pet_id,next_star)
  217. local is_max_stage = false
  218. if not cfg_data then
  219. is_max_stage = true
  220. local cost_data = stringtotable(self.cfg_data.cost)
  221. local goods_type_id = cost_data[1][2]
  222. self.cost_item:SetData(goods_type_id)
  223. local color = GoodsModel:getInstance():GetGoodsColor(goods_type_id)
  224. local goods_name = HtmlColorTxt(GoodsModel:getInstance():getGoodsName(goods_type_id).."",color)
  225. self.costName_tmp.text = string.format("%s已满星",goods_name)
  226. self.can_evolve = false
  227. else
  228. local cost_data = stringtotable(cfg_data.cost)
  229. local goods_type_id = cost_data[1][2]
  230. local goods_num = GoodsModel:getInstance():GetTypeGoodsNum(goods_type_id)
  231. self.cost_item:SetData(goods_type_id)
  232. local color = GoodsModel:getInstance():GetGoodsColor(goods_type_id)
  233. local goods_name = HtmlColorTxt(GoodsModel:getInstance():getGoodsName(goods_type_id).."",color)
  234. if goods_num < cost_data[1][3] then
  235. self.costName_tmp.text = string.format("%s<#ff203a>%s</color><#fdffc2>/%s</color>", goods_name, goods_num, cost_data[1][3])
  236. else
  237. self.costName_tmp.text = string.format("%s<#2CF86F>%s</color><#fdffc2>/%s</color>", goods_name, goods_num, cost_data[1][3])
  238. end
  239. self.can_evolve = goods_num >= cost_data[1][3]--记录一个判断能否进化的标识用于进化按钮
  240. end
  241. --控制进化按钮的灰化表现状态
  242. if self.can_evolve and not is_max_stage then
  243. self.evolveBtn_img.gray = false
  244. SetTMPSharedMaterial(self.Text_tmp, ShaderTools.TMPSharedMaterialType.FZZZOutlineDarkOrangeBtn)
  245. self.evolveRed_obj:SetActive(true)
  246. else
  247. self.evolveBtn_img.gray = true
  248. SetTMPSharedMaterial(self.Text_tmp, ShaderTools.TMPSharedMaterialType.FZZZOutlineDarkGrayBtn)
  249. self.evolveRed_obj:SetActive(false)
  250. end
  251. end
  252. --data追溯至16301协议
  253. function PetEvolvePanel:SetData(data,cfg_data)
  254. self.data = data
  255. self.cfg_data = cfg_data
  256. if self.is_loaded then
  257. self.need_refreshData = false
  258. self:UpdateView()
  259. else
  260. self.need_refreshData = true
  261. end
  262. end
  263. function PetEvolvePanel:__delete( )
  264. if self.cost_item then
  265. UIObjPool:getInstance():PushItem(UIObjPool.UIType.AwardItem,self.cost_item)
  266. self.cost_item = nil
  267. end
  268. end