源战役客户端
Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.

869 linhas
29 KiB

4 semanas atrás
  1. NatureModel = NatureModel or BaseClass(BaseVo, true)
  2. local NatureModel = NatureModel
  3. NatureModel.REQUEST_CCMD_EVENT = "NatureModel.REQUEST_CCMD_EVENT"
  4. NatureModel.REPLACE_TAG = "NatureModel.REPLACE_TAG" -- 替换标签
  5. NatureModel.UPDATE_CATEGORY_INFO = "NatureModel.UPDATE_CATEGORY_INFO" -- 替换标签
  6. NatureModel.OPEN_UPGRADE_VIEW = "NatureModel.OPEN_UPGRADE_VIEW" -- 打开突破界面
  7. NatureModel.SUCCESS_UPGRADE = "NatureModel.SUCCESS_UPGRADE" -- 成功突破
  8. NatureModel.UPDATE_NATURE_REWARD_VIEW = "NatureModel.UPDATE_NATURE_REWARD_VIEW" -- 更新章节奖励界面
  9. NatureModel.UPDATE_ADD_POINT_VIEW = "NatureModel.UPDATE_ADD_POINT_VIEW" -- 更新加点界面
  10. NatureModel.UPDATE_TAG_VIEW = "NatureModel.UPDATE_ADD_POINT_VIEW" -- 更新标签界面
  11. NatureModel.UPDATE_MAIN_VIEW = "NatureModel.UPDATE_MAIN_VIEW" -- 更新性格主界面
  12. NatureModel.UPDATE_REWARD_RED_DOT = "NatureModel.UPDATE_REWARD_RED_DOT" -- 更新奖励红点
  13. NatureModel.UPDATE_FREE_POINT_RED_DOT = "NatureModel.UPDATE_FREE_POINT_RED_DOT" -- 更新自由点数红点
  14. NatureModel.UPDATE_UPGRADE_RED_DOT = "NatureModel.UPDATE_UPGRADE_RED_DOT" -- 性格突破红点
  15. NatureModel.OPEN_AWARD_RESULT_VIEW = "NatureModel.OPEN_AWARD_RESULT_VIEW" -- 打开跑环奖励结算界面
  16. NatureModel.OPEN_TAG_VIEW = "NatureModel.OPEN_TAG_VIEW" -- 打开tag界面
  17. NatureModel.OPEN_ADD_POINT_VIEW = "NatureModel.OPEN_ADD_POINT_VIEW" -- 打开加点界面
  18. NatureModel.OPEN_PRE_REWARD_VIEW = "NatureModel.OPEN_PRE_REWARD_VIEW" -- 打开奖励预览界面
  19. NatureModel.CATEGORY_NAME = {
  20. [1] = "性格感知",
  21. [2] = "性格成长",
  22. [3] = "性格塑造",
  23. }
  24. NatureModel.RedDotTpye = {
  25. GET_REWRAD = "GET_REWRAD",
  26. FREE_POINT = "FREE_POINT",
  27. }
  28. -- 以下数据是固定的 不会变也不能变
  29. local SPOT_COUNT = 4 -- 单个章节单个分支的节点数
  30. local CATEGORY_COUNT = 3 -- 章节数
  31. local NATURE_TYPE_COUNT = 3 -- 单章节分支数
  32. local UPGRADRE_NEED_VALUE = Config.Naturebranch["1@1@1@1"].need_value -- 每一级升级所需的点数
  33. function NatureModel:__init()
  34. NatureModel.Instance = self
  35. end
  36. function NatureModel:ResetData()
  37. self.nature_category_data = {}
  38. self.cur_nature_index_data = {} -- 记录每个章节每个分支的最新进度
  39. --self:UpdateAllNatureIndex( ) -- 先初始化一遍
  40. --self:InitNatureIndexData()
  41. self.free_value = 0 -- 自由点数
  42. self.total_nature_info = {}
  43. self.total_nature_level = 0 -- 当前等级
  44. self.pre_level = 0 -- 上一次的等级
  45. self.pre_overflow_value = 0 -- 上一次的经验
  46. self.overflow_value = 0 -- 当前经验
  47. self.category_reward_state = {} -- 章节奖励领取状态
  48. self.category_red_info = {} -- 记录了某个章节是否应该有红点
  49. self.category_light_times_data = {}
  50. self.has_tag_data = {}
  51. self.show_tag_data = {}
  52. self.point_lv_list = {} -- 记录了星空图的等级分布
  53. self:InitConfig()
  54. self:InitPointList()
  55. self:InitTaskNatureTextRange( )
  56. end
  57. function NatureModel.getInstance()
  58. if NatureModel.Instance == nil then
  59. NatureModel.Instance = NatureModel.New()
  60. end
  61. return NatureModel.Instance
  62. end
  63. -----------------------------配置相关---start-------------------------
  64. function NatureModel:InitConfig( )
  65. self.config_Naturekv = {} -- 常量配置
  66. self.config_Naturebranch = {} -- 分支配置
  67. --self.branch_kv_data = {} -- 分支顺序表 (用来快速取出上对应数据的上一条数据)
  68. self.nature_total_point_data = {} -- 用来存三个分支性格的分别总点数(常量)
  69. self.category_total_point_data = {} -- 用来存三个章节性格的分别总点数(常量)
  70. for k,v in pairs(Config.Naturekv) do
  71. local key = Trim(v.key)
  72. self.config_Naturekv[key] = v
  73. end
  74. self.point_lv_list = stringtotable(self:GetNatureKv("interval").constant)
  75. -- logWarn('=======Msh:NatureModel.lua[85]=======')
  76. -- PrintTable(self.point_lv_list)
  77. for category=1, 3 do
  78. self.config_Naturebranch[category] = {}
  79. --self.branch_kv_data[category] = {}
  80. self.category_total_point_data[category] = 0
  81. for nature_type=1, 3 do
  82. self.nature_total_point_data[nature_type] = self.nature_total_point_data[nature_type] or 0
  83. self.config_Naturebranch[category][nature_type] = {}
  84. --self.branch_kv_data[category][nature_type] = {}
  85. --local branch_kv_t = self.branch_kv_data[category][nature_type]
  86. local index = 1
  87. for spot=1,4 do
  88. self.config_Naturebranch[category][nature_type][spot] = {}
  89. local temp = self.config_Naturebranch[category][nature_type][spot]
  90. local light_times = 1
  91. while true do
  92. local key = string.format("%s@%s@%s@%s", category, nature_type, spot, light_times)
  93. local data = Config.Naturebranch[key]
  94. if not data then
  95. break
  96. end
  97. temp[light_times] = data
  98. temp[light_times].reward_list = stringtotable(data.reward)
  99. temp[light_times].new_attr_list = stringtotable(data.attr_list)
  100. temp[light_times].order = index
  101. light_times = light_times + 1
  102. Config.Naturebranch[key].order = index
  103. -- 累加性格点数
  104. self.nature_total_point_data[nature_type] = self.nature_total_point_data[nature_type] + data.need_value
  105. self.category_total_point_data[category] = self.category_total_point_data[category] + 1
  106. -- 处理顺序表
  107. --branch_kv_t[index] = {index = index, key = key}
  108. index = index + 1
  109. end
  110. end
  111. end
  112. end
  113. --logWarn('=======Msh:NatureModel.lua[51]=======')
  114. -- PrintTable(self.config_Naturebranch)
  115. --PrintTable(self.branch_kv_data)
  116. --PrintTable(self.nature_total_point_data)
  117. end
  118. function NatureModel:InitPointList( )
  119. end
  120. function NatureModel:InitTaskNatureTextRange( )
  121. local i = 1
  122. self.task_range = {}
  123. while true do
  124. local kv = self:GetNatureKv( "daily_nature_range" .. i )
  125. if kv then
  126. local range = stringtotable(kv.constant)
  127. self.task_range[i] = {}
  128. self.task_range[i].min = tonumber(range[1])
  129. self.task_range[i].max = tonumber(range[2])
  130. self.task_range[i].des = Trim(kv.remark)
  131. i = i + 1
  132. else
  133. break
  134. end
  135. end
  136. end
  137. function NatureModel:GetBranchConifg( category )
  138. if category then
  139. return self.config_Naturebranch[category] or logWarn('=======Msh:NatureModel.lua[57]===error category====', category)
  140. else
  141. return self.config_Naturebranch
  142. end
  143. end
  144. function NatureModel:GetNatureKv( key )
  145. return self.config_Naturekv[key] or logWarn('=======Msh:NatureModel.lua[64]===error key====', key)
  146. end
  147. function NatureModel:GetPointLevelByIndex( index )
  148. return self.point_lv_list[index]
  149. end
  150. -----------------------------配置相关---end-------------------------
  151. -----------------------------后端数据---start-------------------------
  152. -- 设置拥有的标签列表
  153. function NatureModel:SetHasTagData( data )
  154. for i,v in pairsByKeys(data) do
  155. self.has_tag_data[v.nature_type] = v.tips_list
  156. local sort_func = function ( a, b )
  157. return a.tip < b.tip
  158. end
  159. table.sort(self.has_tag_data[v.nature_type], sort_func)
  160. end
  161. end
  162. -- 设置展示用的标签列表
  163. function NatureModel:SetShowTagData( data )
  164. self.show_tag_data = {}
  165. for i,v in pairs(data) do
  166. self.show_tag_data[v.show_pos] = v
  167. end
  168. end
  169. function NatureModel:GetHasTagData( )
  170. return self.has_tag_data
  171. end
  172. function NatureModel:GetShowTagData( data )
  173. return self.show_tag_data
  174. end
  175. -- 性格总览
  176. function NatureModel:SetTotalNatureInfo( data )
  177. self.total_nature_info = data.nature_list
  178. self:UpdateNatureLevel(data.level)
  179. self:UpdateOverflowValue(data.overflow_value)
  180. --self.now_value = data.now_value -- 当前等级性格点数
  181. self:SetFreePoint(data.free_value)
  182. end
  183. -- 更新等级 以及 上一次的等级
  184. function NatureModel:UpdateNatureLevel( level )
  185. self.pre_level = self.total_nature_level
  186. self.total_nature_level = level
  187. end
  188. -- 更新当前经验以及 上一级的经验
  189. function NatureModel:UpdateOverflowValue( value )
  190. self.pre_overflow_value = self.overflow_value
  191. self.overflow_value = value
  192. self:UpdateRedDot( NatureModel.RedDotTpye.FREE_POINT )
  193. end
  194. function NatureModel:GetCurOverflowValue( )
  195. return self.overflow_value or 0
  196. end
  197. function NatureModel:GetPreOverflowValue( )
  198. return self.pre_overflow_value
  199. end
  200. function NatureModel:GetCurNatureLevel( )
  201. return self.total_nature_level or 0
  202. end
  203. -- 上次的等级
  204. function NatureModel:GetPreLevel( )
  205. return self.pre_level or 0
  206. end
  207. function NatureModel:GetCurRecycleValue( )
  208. return self.overflow_value or 0
  209. end
  210. -- function NatureModel:GetCurNowValue( )
  211. -- return self.now_value or 0
  212. -- end
  213. -- 成功突破后 数据更新
  214. function NatureModel:SetAfterUpgradeData( data )
  215. self:UpdateOverflowValue(data.overflow_value)
  216. self:UpdateNatureLevel(data.level)
  217. end
  218. -- 章节数据
  219. function NatureModel:SetCategoryNatureInfo( data )
  220. local temp_list = {}
  221. for i,v1 in ipairs(data.branch_list) do
  222. temp_list[v1.nature_type] = temp_list[v1.nature_type] or {}
  223. for j, v2 in ipairs(v1.spot_list) do
  224. temp_list[v1.nature_type][v2.spot] = v2
  225. temp_list[v1.nature_type][v2.spot].nature_type = v1.nature_type
  226. end
  227. end
  228. self.nature_category_data[data.category] = temp_list
  229. self.category_reward_state[data.category] = data.category_reward_status
  230. self:UpdateTargetNatureIndex(data.category)
  231. end
  232. -- 更新章节奖励领取状态
  233. function NatureModel:UpdateCategoryRewardState( category, state )
  234. self.category_reward_state[category] = state
  235. end
  236. -- 获取章节奖励状态 1 已经领取 0 未领取(还需要结合章节进度判断可领与否 )
  237. function NatureModel:GetCategoryRewardState( category )
  238. return self.category_reward_state[category] or 1 --(没收到数据默认已经领取)
  239. end
  240. -- 更改章节数据的某一条
  241. function NatureModel:SetSingleCategoryNatureInfo( category, nature_type, spot, reward_status )
  242. self.nature_category_data[category][nature_type][spot].reward_status = reward_status
  243. end
  244. -- 获取章节数据
  245. function NatureModel:GetCategoryNatureInfo( category, nature_type, spot )
  246. if category and nature_type and spot and
  247. self.nature_category_data[category] and
  248. self.nature_category_data[category][nature_type] and
  249. self.nature_category_data[category][nature_type][spot]
  250. then
  251. return self.nature_category_data[category][nature_type][spot]
  252. else
  253. local empty_data = {
  254. nature_type = nature_type,
  255. spot = spot,
  256. light_times = 0,
  257. reward_status = 0,
  258. }
  259. return empty_data
  260. end
  261. end
  262. -- 设置经验跑环获得的任务点数(仅作展示用)
  263. function NatureModel:SetTaskNatureValue( scmd )
  264. self.task_nature_value = scmd.nature_value
  265. self.task_rand_value = scmd.rand_value
  266. end
  267. function NatureModel:GetTaskNatureValue( )
  268. return self.task_nature_value or 0
  269. end
  270. function NatureModel:GetTaskRandValue( )
  271. return self.task_rand_value or 0
  272. end
  273. function NatureModel:GetTaskNatureTxtStr( )
  274. local nature_value = self:GetTaskNatureValue()
  275. for i,v in pairsByKeys(self.task_range) do
  276. if v.min <= nature_value and nature_value <= v.max then
  277. return v.des
  278. end
  279. end
  280. return ""
  281. end
  282. -----------------------------后端数据---end-------------------------
  283. -- -- 获得上一个数据的值
  284. -- function NatureModel:GetLastOrderData( category, nature_type , order )
  285. -- --print('Msh:NatureModel.lua[111] data', category, nature_type , order)
  286. -- local kv_data = self.branch_kv_data[category][nature_type][order - 1]
  287. -- if not kv_data then return end
  288. -- return Config.Naturebranch[kv_data.key]
  289. -- end
  290. -- function NatureModel:GetOrderData( category, nature_type, order )
  291. -- local kv_data = self.branch_kv_data[category][nature_type][order]
  292. -- if not kv_data then return end
  293. -- return Config.Naturebranch[kv_data.key]
  294. -- end
  295. -- 求两个属性列表的差值
  296. function NatureModel:GetChangeAttrList( old_list, new_list )
  297. local res = {}
  298. for i,v in ipairs(new_list) do
  299. for i2,v2 in ipairs(old_list) do
  300. if v[1] == v2[1] then
  301. table.insert(res, {v[1], v[2] - v2[2]})
  302. break
  303. end
  304. end
  305. end
  306. -- logWarn('=======Msh:NatureModel.lua[128]=======')
  307. -- PrintTable(res)
  308. return res
  309. end
  310. -- 设置自由点数
  311. function NatureModel:SetFreePoint( count )
  312. self.free_value = count
  313. self:UpdateRedDot( NatureModel.RedDotTpye.FREE_POINT )
  314. end
  315. function NatureModel:GetFreePoint( )
  316. local is_finish = self:GetTotalHasUseNaturePoint() >= self:GetTotalNaturePoint()
  317. -- print('Msh:NatureModel.lua[364] data', self.overflow_value)
  318. -- print('Msh:NatureModel.lua[364] data', self.free_value)
  319. if is_finish then -- 如果已经完成 自由点将读取溢出点
  320. return self.overflow_value or 0
  321. else
  322. return self.free_value or 0
  323. end
  324. end
  325. -- 有自由点数可以用(用于加点分支)
  326. function NatureModel:HasFreePointCanUse( )
  327. -- 总使用情况
  328. local is_finish = self:GetTotalHasUseNaturePoint() >= self:GetTotalNaturePoint()
  329. if is_finish then -- 如果已经完成 自由点没用了
  330. return false
  331. else
  332. return self.free_value > 0
  333. end
  334. end
  335. -- 获取某一分支的总点数
  336. function NatureModel:GetNatureTypeTotalPoint( nature_type )
  337. return self.nature_total_point_data[nature_type]
  338. end
  339. -- 获取所有分支总点数
  340. function NatureModel:GetTotalNaturePoint( )
  341. local res = 0
  342. for i,v in ipairs(self.nature_total_point_data) do
  343. res = res + v
  344. end
  345. return res
  346. end
  347. -- 获取已经使用性格的总点数
  348. function NatureModel:GetTotalHasUseNaturePoint( )
  349. local res = 0
  350. for i,v in pairs(self.total_nature_info) do
  351. res = res + v.nature_value
  352. end
  353. return res
  354. end
  355. -- 获取已经使用性格的总点数
  356. function NatureModel:GetHasUseNaturePoint( nature_type )
  357. if not self.total_nature_info[nature_type] then
  358. return 0
  359. end
  360. return self.total_nature_info[nature_type].nature_value
  361. end
  362. -- 获取章节已经加的点数
  363. function NatureModel:GetHasUsePointInCategory( category )
  364. local res = 0
  365. if not self.nature_category_data[category] then return 0 end -- 判空
  366. for nature_type,v1 in pairs(self.nature_category_data[category]) do
  367. for spot, data in pairs(v1) do
  368. res = res + data.light_times
  369. end
  370. end
  371. return res
  372. end
  373. -- 获取章节可以加的总点数
  374. function NatureModel:GetCategoryTotalPoint( category )
  375. return self.category_total_point_data[category]
  376. end
  377. -- 更新记录每个章节每个分支的最新进度
  378. function NatureModel:UpdateAllNatureIndex( )
  379. local t = self.cur_nature_index_data
  380. for category, v1 in pairsByKeys(self.nature_category_data) do
  381. self:UpdateTargetNatureIndex(category)
  382. end
  383. end
  384. -- -- 更新某章节的进度
  385. -- function NatureModel:UpdateTargetNatureIndex( category )
  386. -- for i=1, CATEGORY_COUNT do
  387. -- for j=1, NATURE_TYPE_COUNT do
  388. -- if then
  389. -- end
  390. -- end
  391. -- end
  392. -- end
  393. -- 更新某章节的进度 利用遍历顺序表得到当前进度
  394. function NatureModel:UpdateTargetNatureIndex( category )
  395. local data = self.nature_category_data[category]
  396. -- logWarn('=======Msh:NatureModel.lua[347]=======')
  397. -- PrintTable(data)
  398. self.cur_nature_index_data[category] = self.cur_nature_index_data[category] or {}
  399. for nature_type, v2 in pairsByKeys(data) do
  400. self.cur_nature_index_data[category][nature_type] = self.cur_nature_index_data[category][nature_type] or false
  401. --local d = self.cur_nature_index_data[category][nature_type]
  402. for spot, v3 in pairsByKeys(v2) do
  403. local cur_config = self.config_Naturebranch[category][nature_type][spot][v3.light_times]
  404. self.category_light_times_data[category] = self.category_light_times_data[category] or 0
  405. self.category_light_times_data[category] = self.category_light_times_data[category] + v3.light_times
  406. self.cur_nature_index_data[category][nature_type] = cur_config
  407. end
  408. end
  409. end
  410. -- 获取性格系统的总加成属性列表
  411. -- 这种是策划 配表 每个章节的每个分支是独立配属性的 3 * 3
  412. function NatureModel:GetTotalAttr( )
  413. local arr_list = {}
  414. -- logWarn('=======Msh:NatureModel.lua[349]=======')
  415. -- PrintTable(self.cur_nature_index_data)
  416. -- 先把三个章节共9个分支的属性全部累加
  417. for category, v1 in pairsByKeys(self.cur_nature_index_data) do
  418. for nature_type, data in pairsByKeys(v1) do
  419. if data.attr_list then
  420. for i, v in pairs(stringtotable(data.attr_list)) do
  421. arr_list[v[1]] = arr_list[v[1]] or 0
  422. arr_list[v[1]] = arr_list[v[1]] + v[2]
  423. end
  424. end
  425. end
  426. end
  427. -- logWarn('=======Msh:NatureModel.lua[461]=======')
  428. -- PrintTable(arr_list)
  429. -- PrintTable(self.cur_nature_index_data)
  430. -- 再加一波突破的属性
  431. local lv_cfg = Config.Naturelevel[self:GetCurNatureLevel()]
  432. for i,v in pairs(stringtotable(lv_cfg.add_attr)) do
  433. arr_list[v[1]] = arr_list[v[1]] or 0
  434. arr_list[v[1]] = arr_list[v[1]] + v[2]
  435. end
  436. -- 最后处理一下格式
  437. local res = {}
  438. for k,v in pairsByKeys(arr_list) do
  439. table.insert(res, {k, v})
  440. end
  441. -- logWarn('=======Msh:NatureModel.lua[474]=======')
  442. -- PrintTable(res)
  443. return res
  444. end
  445. -- 这种是策划 配表 每个节点是独立配属性的 3 * 3 * 4
  446. function NatureModel:GetTotalAttr2( )
  447. local arr_list = {}
  448. -- 以下代码说明:
  449. -- 1-3层遍历 章节-性格分支-节点
  450. -- 4层 遍历要加的属性值
  451. -- 遍历过程中会判断 self.cur_nature_index_data 是否有该数据,如果没有说明还没解锁,就不往下走了
  452. -- 主逻辑在第3层 对比是否为最新节点 小于最新取节点最大LV 等于取最新节点LV 大于不管
  453. local add_arr = function ( arr_data )
  454. for i,v in pairs(arr_data) do
  455. arr_list[v[1]] = arr_list[v[1]] or 0
  456. arr_list[v[1]] = arr_list[v[1]] + v[2]
  457. end
  458. end
  459. for category=1, CATEGORY_COUNT do
  460. if self.cur_nature_index_data[category] then
  461. for nature_type=1, NATURE_TYPE_COUNT do
  462. if self.cur_nature_index_data[category][nature_type] then
  463. local cur_data = self.cur_nature_index_data[category][nature_type]
  464. for spot=1, SPOT_COUNT do
  465. local data
  466. if cur_data.spot == spot then
  467. add_arr( cur_data.new_attr_list )
  468. break
  469. else
  470. local max_cfg = self:GetSpotMaxLvCfg( category, nature_type, spot )
  471. add_arr( max_cfg.new_attr_list )
  472. end
  473. end
  474. end
  475. end
  476. end
  477. end
  478. local lv_cfg = Config.Naturelevel[self:GetCurNatureLevel()]
  479. add_arr(stringtotable(lv_cfg.add_attr))
  480. -- 最后处理一下格式
  481. local res = {}
  482. for k,v in pairsByKeys(arr_list) do
  483. table.insert(res, {k, v})
  484. end
  485. -- logWarn('=======Msh:NatureModel.lua[524]=======')
  486. -- PrintTable(res)
  487. return res
  488. end
  489. function NatureModel:GetSpotMaxLvCfg( category, nature_type, spot )
  490. local max_lv = #self.config_Naturebranch[category][nature_type][spot]
  491. local cfg = self.config_Naturebranch[category][nature_type][spot][max_lv]
  492. return cfg
  493. end
  494. -- 获取升级消耗的点数 upgrade_level-升几级 cur_light_times-当前的点亮等级
  495. function NatureModel:GetUpgradeCostFreeValue( category, nature_type, spot, cur_light_times, upgrade_level )
  496. local cfg = self.config_Naturebranch[category][nature_type][spot]
  497. local cost = 0
  498. for light_times = cur_light_times + 1, cur_light_times + upgrade_level do
  499. cost = cost + cfg[light_times].need_value
  500. end
  501. return cost
  502. end
  503. --初始化记录点亮进度的index表
  504. function NatureModel:InitNatureIndexData( )
  505. for i=1, CATEGORY_COUNT do
  506. self.cur_nature_index_data[i] = {}
  507. for j=1, NATURE_TYPE_COUNT do
  508. self.cur_nature_index_data[i][j] = {}
  509. end
  510. end
  511. end
  512. -- -- 获取某章节的总点亮数
  513. -- function NatureModel:GetCategoryTotalLightTimes( category )
  514. -- local total_times = 0
  515. -- if category and self.cur_nature_index_data[category] then
  516. -- for i,v in ipairs(self.cur_nature_index_data[category]) do
  517. -- if v.order then
  518. -- total_times = total_times + v.order
  519. -- end
  520. -- end
  521. -- else
  522. -- return total_times
  523. -- end
  524. -- return total_times
  525. -- end
  526. -- 判断章节是否已经解锁
  527. function NatureModel:CategoryIsUnLock( category )
  528. if category == 1 then -- 默认解锁第一章
  529. return true
  530. elseif category == 2 or category == 3 then
  531. return self:GetHasUsePointInCategory( category - 1 ) >= self:GetNatureKv("unlock").constant or -- 点亮点数大于指定值
  532. self:HasMaxNatureType( category - 1 ) -- 或者点满了一个分支
  533. end
  534. end
  535. -- 检查指定章节是否有满分支的
  536. function NatureModel:HasMaxNatureType( category )
  537. for i=1, NATURE_TYPE_COUNT do
  538. if self.cur_nature_index_data and self.cur_nature_index_data[category] and self.cur_nature_index_data[category][i] then
  539. local data = self.cur_nature_index_data[category][i]
  540. local cfg = self:GetSpotMaxLvCfg( category, i, SPOT_COUNT )
  541. if data.spot == SPOT_COUNT and cfg.light_times == data.light_times then
  542. return true
  543. end
  544. end
  545. end
  546. return false
  547. end
  548. -- 检查当前节点是否已经解锁
  549. function NatureModel:SpotIsUnLock( category, nature_type, spot )
  550. local latest_data
  551. --print('Msh:NatureModel.lua[470] data', category, nature_type, spot, self.cur_nature_index_data )
  552. if self.cur_nature_index_data and
  553. self.cur_nature_index_data[category] and
  554. self.cur_nature_index_data[category][nature_type] then
  555. latest_data = self.cur_nature_index_data[category][nature_type]
  556. end
  557. -- 先章节解锁
  558. if not self:CategoryIsUnLock(category) then
  559. return false
  560. end
  561. -- 节点对比
  562. if not latest_data then -- 没有点亮过这章节这个分支
  563. return spot == 1 -- 如果是第一个节点则可以解锁
  564. else
  565. if latest_data.spot >= spot then -- 如果当前节点就是最新节点 或 当前节点在最新节点之前
  566. return true -- 已解锁
  567. elseif latest_data.spot < spot and spot - latest_data.spot == 1 then -- 当前节点在最新节点之后一个节点
  568. local cur_spot_config = self:GetBranchConifg(category)[nature_type][latest_data.spot]
  569. if latest_data.light_times == #cur_spot_config then -- 当前最新的节点点亮数已达上限
  570. return true
  571. else
  572. return false
  573. end
  574. else
  575. return false
  576. end
  577. end
  578. end
  579. -- 获取当前需要展示的标签的字符串列表(包含颜色html标签)
  580. function NatureModel:GetCurShowTagStrList( )
  581. local str_list = {}
  582. for i,v in ipairs(self.show_tag_data) do
  583. local cfg = Config.Naturetips[v.nature_type .. "@" .. v.tip]
  584. local str = HtmlColorTxt(Trim(cfg.desc), ColorUtil:GetColor(cfg.color))
  585. table.insert(str_list, str)
  586. end
  587. return str_list
  588. end
  589. -- 将传入的标签数据 转化为代颜色标签的字符串
  590. function NatureModel:TagToTagStrList( tag_data )
  591. local sort_func = function ( a, b )
  592. return a.show_pos < b.show_pos
  593. end
  594. table.sort(tag_data, sort_func)
  595. local str_list = {}
  596. for i,v in ipairs(tag_data) do
  597. local cfg = Config.Naturetips[v.nature_type .. "@" .. v.tip]
  598. local str = HtmlColorTxt(Trim(cfg.desc), ColorUtil:GetColor(cfg.color))
  599. table.insert(str_list, str)
  600. end
  601. return str_list
  602. end
  603. -- 整理别人的数据
  604. function NatureModel:DealTagData( tag_data )
  605. local sort_func = function ( a, b )
  606. return a.show_pos < b.show_pos
  607. end
  608. table.sort(tag_data, sort_func)
  609. local list = {}
  610. for i,v in ipairs(tag_data) do
  611. local cfg = Config.Naturetips[v.nature_type .. "@" .. v.tip]
  612. local str = Trim(cfg.desc)
  613. table.insert(list, {str = str, color = cfg.color, nature_type = v.nature_type, tip = v.tip})
  614. end
  615. return list
  616. end
  617. -- 获取最新章节的加点最多的分支的最新加点节点
  618. function NatureModel:GetCurLatestSpot( )
  619. -- 没任何节点时 选中第一章第一分支第一节点
  620. -- logWarn('=======Msh:NatureModel.lua[505]=======')
  621. -- PrintTable(self.cur_nature_index_data)
  622. local select_category, select_nature_type, select_spot = 1, 1, 1
  623. -- 检测是否满足解锁新章节
  624. for i=2, CATEGORY_COUNT do
  625. if self:CategoryIsUnLock( i ) then
  626. select_category = i
  627. else
  628. break
  629. end
  630. end
  631. -- 对比记录中的最新数据
  632. for category,v1 in pairsByKeys(self.cur_nature_index_data) do
  633. for nature_type, data in pairsByKeys(v1) do
  634. if category > select_category then
  635. select_category = category
  636. select_nature_type = nature_type
  637. select_spot = data.spot
  638. elseif category == select_category and select_spot == data.spot then
  639. select_category = category
  640. select_nature_type = nature_type
  641. select_spot = data.spot
  642. elseif category == select_category and select_spot < data.spot then
  643. select_category = category
  644. select_nature_type = nature_type
  645. select_spot = data.spot
  646. end
  647. end
  648. end
  649. local config_spot_max_lv = #self:GetBranchConifg(select_category)[select_nature_type][select_spot]
  650. -- print('Msh:NatureModel.lua[504] data', TableSize(self.cur_nature_index_data), select_category, select_nature_type)
  651. --PrintTable(self.cur_nature_index_data)
  652. if self.cur_nature_index_data and
  653. self.cur_nature_index_data[select_category] and
  654. self.cur_nature_index_data[select_category][select_nature_type] then
  655. local cur_spot_lv = self.cur_nature_index_data[select_category][select_nature_type].light_times or 0
  656. -- PrintTable(self.cur_nature_index_data[select_category][select_nature_type])
  657. -- print('Msh:NatureModel.lua[505] data', config_spot_max_lv, cur_spot_lv, select_spot)
  658. if config_spot_max_lv == cur_spot_lv and select_spot ~= 4 then -- 当前节点满 且 不是最后一个节点 切到后一个节点上
  659. select_spot = select_spot + 1
  660. end
  661. end
  662. --PrintTable(self.cur_nature_index_data)
  663. --print('Msh:NatureModel.lua[561] data', select_category, select_nature_type, select_spot)
  664. return select_category, select_nature_type, select_spot
  665. end
  666. -- 红点
  667. function NatureModel:UpdateRedDot( id )
  668. if id == NatureModel.RedDotTpye.GET_REWRAD then -- 领奖状态刷新
  669. self:Fire(NatureModel.UPDATE_REWARD_RED_DOT)
  670. elseif id == NatureModel.RedDotTpye.FREE_POINT then -- 自由点数刷新
  671. self:Fire(NatureModel.UPDATE_FREE_POINT_RED_DOT)
  672. elseif id == NatureModel.UPDATE_UPGRADE_RED_DOT then -- 突破状态刷新
  673. self:Fire(NatureModel.UPDATE_UPGRADE_RED_DOT)
  674. else
  675. self:Fire(NatureModel.UPDATE_FREE_POINT_RED_DOT)
  676. self:Fire(NatureModel.UPDATE_REWARD_RED_DOT)
  677. self:Fire(NatureModel.UPDATE_UPGRADE_RED_DOT)
  678. end
  679. NewMainRoleModel:getInstance():Fire(NewMainRoleModel.ANS_UPDATE_RED_DOT)
  680. end
  681. function NatureModel:GetNatureAllRed( check_new )
  682. if check_new then
  683. self:CheckCategoryRed( )
  684. self.red_has_point = self:HasFreePointCanUse()
  685. self.red_reward_can_get = self:CheckRewawrdCanGet()
  686. self.red_nature_upgrade = self:CanUpgradeNature()
  687. end
  688. --print('Msh:NatureModel.lua[732] data', self.red_has_point ,self.red_reward_can_get , self.red_nature_upgrade )
  689. -- print('Msh:NatureModel.lua[763] data', self.red_has_point , self.red_reward_can_get, self.red_nature_upgrade)
  690. return self.red_has_point or self.red_reward_can_get or self.red_nature_upgrade
  691. end
  692. -- 检查整个系统是否有奖励可领取
  693. function NatureModel:CheckRewawrdCanGet( )
  694. local has_reward_can_get = false
  695. -- 普通节点奖励
  696. for category, v1 in pairs(self.nature_category_data) do
  697. for nature_type, v2 in pairs(v1) do
  698. for spot, data in pairs(v2) do
  699. -- 约定好了 取第一条数据
  700. local tip = self.config_Naturebranch[category][nature_type][spot][1].tip
  701. if data.reward_status == 1 and tip ~= 0 then -- 可领奖 且 该节点是有奖励的节点
  702. return true
  703. end
  704. end
  705. end
  706. end
  707. -- 总的章节奖励
  708. for category, v in pairs(self.category_reward_state) do
  709. if self:CanGetCategoryReward( category ) then
  710. return true
  711. end
  712. end
  713. return false
  714. end
  715. -- 检测章节奖励是否可领
  716. function NatureModel:CanGetCategoryReward( category )
  717. --print('Msh:NatureModel.lua[630] data', self:GetHasUsePointInCategory(category), self:GetCategoryTotalPoint(category), self:GetCategoryRewardState(category))
  718. local rate = self:GetHasUsePointInCategory(category) / self:GetCategoryTotalPoint(category)
  719. return rate >= 1 and self:GetCategoryRewardState(category) == 0
  720. end
  721. --检测是否可以突破
  722. function NatureModel:CanUpgradeNature( )
  723. local cur_over_flow = self:GetCurOverflowValue( )
  724. local cur_lv = self:GetCurNatureLevel( )
  725. local cfg = Config.Naturelevel[cur_lv]
  726. if not cfg then return false end
  727. local upgrade_need_over_flow = cfg.cost_value
  728. return upgrade_need_over_flow <= cur_over_flow
  729. end
  730. -- 获取指定几个章节的红点数据
  731. function NatureModel:GetCategoryRed( start_index, end_index )
  732. local bool = false
  733. for i = start_index, end_index do
  734. if self.category_red_info[i] then
  735. bool = true
  736. end
  737. end
  738. return bool
  739. end
  740. -- 检查章节红点(某个章节是否有奖励可领或有节点可以加)
  741. function NatureModel:CheckCategoryRed( )
  742. self.category_red_info = {}
  743. local has_free_point = self:HasFreePointCanUse()
  744. -- 遍历节点
  745. for category = 1, CATEGORY_COUNT do
  746. for nature_type = 1, CATEGORY_COUNT do
  747. for spot = 1, CATEGORY_COUNT do
  748. -- 约定好了 取第一条数据
  749. local cfg = self.config_Naturebranch[category][nature_type][spot] -- 配置
  750. local data = self:GetCategoryNatureInfo( category, nature_type, spot ) -- 后端数据
  751. local is_unlock = self:SpotIsUnLock(category, nature_type, spot) -- 节点是否解锁
  752. -- (可领奖 且 该节点是有奖励的节点) 或 (节点未点满 且 已解锁 且 有点数可用)
  753. if (data.reward_status == 1 and cfg[1].tip ~= 0) or
  754. (data.light_times < #cfg and is_unlock and has_free_point) then
  755. self.category_red_info[category] = true
  756. break
  757. end
  758. end
  759. end
  760. end
  761. -- 总的章节奖励
  762. for category, v in pairs(self.category_reward_state) do
  763. if self:CanGetCategoryReward( category ) then
  764. self.category_red_info[category] = true
  765. break
  766. end
  767. end
  768. end
  769. ----------升级特效标志-start---------
  770. function NatureModel:SetEffectFlag( )
  771. self.need_upgrade_effect = true
  772. end
  773. function NatureModel:InitEffectFlag( )
  774. self.need_upgrade_effect = false
  775. end
  776. function NatureModel:IsNeedEffect( )
  777. return self.need_upgrade_effect
  778. end
  779. ----------升级特效标志-end-----------