源战役客户端
Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

1877 строки
54 KiB

4 недель назад
  1. FosterModel = FosterModel or BaseClass(BaseVo, true)
  2. local FosterModel = FosterModel
  3. function FosterModel:__init()
  4. FosterModel.Instance = self
  5. self:Reset()
  6. end
  7. function FosterModel:Reset()
  8. self:InitFosterOffSetCfg()
  9. if self.clock_bless_id then
  10. GlobalTimerQuest:CancelQuest(self.clock_bless_id)
  11. self.clock_bless_id = nil
  12. end
  13. self.basic_info = {}
  14. self.kernel_num_info = {} --核心已使用数量
  15. self.view_tab_info = {}
  16. self.skill_show_conf_list = {}
  17. self.max_grade_star_info = {}
  18. self.skill_conf_list = {}
  19. self.equip_dic = {}--保存的装备目录
  20. self:ResetSwallowSelect()
  21. -------------------------
  22. --红点部分
  23. self.mask_upgrad_red = {}--升阶
  24. self.mask_dressupgrade_red = {}--装备升级
  25. self.red_canupgrade = {}
  26. self.red_cankernel = {}
  27. self.red_cankernel_all = {}
  28. self.red_canskill = {}
  29. self.red_candressnew = {}
  30. self.red_candressup = {}
  31. self.red_canupequip = {}
  32. self.red_skin = {}
  33. self.pet_fight_skill = false --AI娘战斗技能(大招)
  34. self.pet_fight_skill_state = false --AI娘战斗技能(大招)激活状态
  35. self.tip_bless_list = {}--祝福值提示倒计时
  36. self.foster_assist_flag_data = {} -- 进阶助战状态数据
  37. self.foster_assist_red = {} -- 进阶助战红点
  38. self.foster_first_advance = false
  39. end
  40. function FosterModel:GetInstance()
  41. if FosterModel.Instance == nil then
  42. FosterModel.Instance = FosterModel.New()
  43. end
  44. return FosterModel.Instance
  45. end
  46. function FosterModel.getInstance()
  47. if FosterModel.Instance == nil then
  48. FosterModel.Instance = FosterModel.New()
  49. end
  50. return FosterModel.Instance
  51. end
  52. --进阶位置偏移配置,需要初始化
  53. function FosterModel:InitFosterOffSetCfg( )
  54. for k,v in pairs(FosterConst.ModelShowConfig) do
  55. for kk,vv in pairs(v) do
  56. if (not vv.has_init) and vv.copy_model_list then
  57. vv.has_init = true
  58. for a,b in pairs(vv.copy_model_list) do
  59. v[b] = vv
  60. end
  61. end
  62. end
  63. end
  64. end
  65. function FosterModel:GetCanUseEquipByType( type_id )
  66. if not type_id then return end
  67. return type_id == FosterConst.ModuleId.FHorse or type_id == FosterConst.ModuleId.FJarvis
  68. end
  69. --基础系统信息
  70. function FosterModel:GetBasicInfo( type_id )
  71. if type_id then
  72. return self.basic_info[type_id]
  73. else
  74. return self.basic_info
  75. end
  76. end
  77. function FosterModel:SetBasicInfo( type_id,value )
  78. -------------------------
  79. --给装备加多个类型方便使用
  80. if value and value.grade_equips then
  81. for k,v in pairs(value.grade_equips) do
  82. for a,b in pairs(v.equips) do
  83. b.type = value.type
  84. b.grade = v.grade
  85. self.equip_dic[b.goods_id] = b
  86. end
  87. end
  88. end
  89. --核心已使用数量
  90. self.kernel_num_info[type_id] = {}
  91. if value and value.core_list then
  92. for k,v in pairs(value.core_list) do
  93. self.kernel_num_info[type_id][v.core_type] = v.core_num
  94. end
  95. end
  96. -------------------------
  97. self.basic_info[type_id] = value
  98. end
  99. -- 获取核心已使用数量
  100. function FosterModel:GetKernelUseNum(type_id, id)
  101. if not type_id or not id then
  102. return
  103. end
  104. return self.kernel_num_info[type_id][id]
  105. end
  106. function FosterModel:RefreshEquipList( type_id,grade,data )
  107. if not type_id or not grade or not data then return end
  108. for a,b in pairs(data) do
  109. b.type = type_id
  110. b.grade = grade
  111. self.equip_dic[b.goods_id] = b
  112. end
  113. -------------------------
  114. local basic = self:GetBasicInfo( type_id )
  115. local have_chang = false
  116. if basic and basic.grade_equips then
  117. for k,v in pairs(basic.grade_equips) do
  118. if v.grade == grade then
  119. v.equips = data
  120. -------------------------
  121. have_chang = true
  122. end
  123. end
  124. if not have_chang then
  125. table.insert( basic.grade_equips, {grade = grade,equips = data} )
  126. end
  127. end
  128. end
  129. --穿戴操作数据保存,写在界面里跳的太复杂了,取出来用
  130. function FosterModel:SetDressAction( _type_id,_grade,_pos )
  131. self.action_data = {type_id = _type_id,grade = _grade,pos = _pos}
  132. end
  133. function FosterModel:GetDressAction( )
  134. return self.action_data
  135. end
  136. --获取当前星阶
  137. function FosterModel:GetGradeStarByType( type_id )
  138. local grade,star = 0,0
  139. if type_id and self:GetBasicInfo( type_id ) then
  140. grade = self:GetBasicInfo( type_id ).grade
  141. star = self:GetBasicInfo( type_id ).star
  142. end
  143. return grade,star
  144. end
  145. --检查是否强化升级
  146. function FosterModel:StrengthenCheckIsUpgrade( check_data )
  147. local star_change = false
  148. local grade_change = false
  149. if check_data then
  150. local old = self:GetBasicInfo(check_data.type)
  151. if old then
  152. if old.star ~= check_data.star then
  153. star_change = true
  154. end
  155. if old.grade ~= check_data.grade then
  156. grade_change = true
  157. end
  158. end
  159. end
  160. return star_change,grade_change
  161. end
  162. --刷新强化数据
  163. function FosterModel:RefreshStrengthenExp( data )
  164. if data and self:GetBasicInfo( data.type ) then
  165. self:GetBasicInfo( data.type ).exp = self:GetBasicInfo( data.type ).exp + data.exp
  166. return true
  167. end
  168. end
  169. --更新使用核心信息(弃用)
  170. function FosterModel:RefreshKernelUseInfo( type_id, opty, total )
  171. if type_id and opty and total and self:GetBasicInfo(type_id) then
  172. if opty == 0 then
  173. self:GetBasicInfo(type_id).lowcore = total
  174. elseif opty == 1 then
  175. self:GetBasicInfo(type_id).highcore = total
  176. end
  177. -- 成功修改返回true,否则返回false通知获取服务端数据
  178. return true
  179. end
  180. end
  181. --更新技能信息
  182. function FosterModel:RefreshSkillInfo( type_id,data )
  183. if type_id and data and self:GetBasicInfo( type_id ) then
  184. local need_add = true
  185. for k,v in pairs(self:GetBasicInfo( type_id ).skills) do
  186. if v.pos == data.pos then
  187. v.lv = data.lv
  188. v.skill = data.skill
  189. need_add = false
  190. break
  191. end
  192. end
  193. if need_add then
  194. table.insert( self:GetBasicInfo( type_id ).skills, {lv = data.lv, pos = data.pos, skill = data.skill} )
  195. end
  196. -- 成功修改返回true,否则返回false通知获取服务端数据
  197. return true
  198. end
  199. end
  200. --更新幻化信息
  201. function FosterModel:RefreshSkinUseInfo( type_id, display )
  202. if type_id and display and self:GetBasicInfo( type_id ) then
  203. self:GetBasicInfo( type_id ).display = display
  204. -- 成功修改返回true,否则返回false通知获取服务端数据
  205. return true
  206. end
  207. end
  208. -- 进化协助状态数据 14614
  209. function FosterModel:SetFosterSuitAssistFlagData(vo)
  210. if vo then
  211. self.foster_assist_flag_data[vo.type] = {}
  212. for k, v in ipairs(vo.grade_list) do
  213. self.foster_assist_flag_data[vo.type][v.grade] = v.state
  214. end
  215. -- 检查红点
  216. self:CanActivateFosterAssist(true, vo.type)
  217. end
  218. end
  219. function FosterModel:GetFosterSuitAssistFlagData(type, grade)
  220. if type then
  221. if grade then
  222. return self.foster_assist_flag_data[type]
  223. and self.foster_assist_flag_data[type][grade] or 0
  224. else
  225. return self.foster_assist_flag_data[type] or {}
  226. end
  227. end
  228. return self.foster_assist_flag_data
  229. end
  230. -- 单个协助数据更新
  231. function FosterModel:UpdateFosterSuitAssistFlagData(vo)
  232. if vo then
  233. self.foster_assist_flag_data[vo.type] = self.foster_assist_flag_data[vo.type] or {}
  234. self.foster_assist_flag_data[vo.type][vo.grade] = vo.state
  235. end
  236. end
  237. --通过类型获得页面左侧tab数据
  238. function FosterModel:GetBaseConfList( type_id )
  239. local function get_call( type_id )
  240. local data = {}
  241. -- 分为强进阶弱进阶
  242. if self:GetIsStrongFoster(type_id) then
  243. for k,v in pairs(Config.Foster) do
  244. if v.type == type_id and v.star == 0 then
  245. table.insert( data, v )
  246. end
  247. end
  248. local function sort_call( a,b )
  249. return a.grade < b.grade
  250. end
  251. table.sort( data, sort_call )
  252. else
  253. for k,v in pairs(Config.Fostersuit) do
  254. if v.type == type_id then
  255. table.insert( data, v )
  256. end
  257. end
  258. local function sort_call( a,b )
  259. return a.grade < b.grade
  260. end
  261. table.sort( data, sort_call )
  262. end
  263. return data
  264. end
  265. self.view_tab_info[type_id] = self.view_tab_info[type_id] or get_call( type_id )
  266. return self.view_tab_info[type_id]
  267. end
  268. --获取单条信息
  269. function FosterModel:GetBaseConfOne( type_id, grade, star, level)
  270. if not type_id then return end
  271. if not grade or not star then
  272. local basic = self:GetBasicInfo( type_id )
  273. if basic then
  274. grade = grade or basic.grade
  275. star = star or basic.star
  276. end
  277. end
  278. if not level then
  279. local basic = self:GetBasicInfo( type_id )
  280. if basic then
  281. level = level or basic.level
  282. end
  283. end
  284. grade = grade or 1
  285. star = star or 0
  286. level = level or 1
  287. if not self:GetIsStrongFoster(type_id) then
  288. return Config.Fostersub[type_id .. "@" .. level]
  289. else
  290. return Config.Foster[type_id .. "@" .. grade .. "@" .. star]
  291. end
  292. end
  293. function FosterModel:GetIsMax( type_id )
  294. if type_id then
  295. local cur_grade,cur_star = self:GetGradeStarByType(type_id)
  296. local max_grade,max_star = self:GetMaxGradeStar(type_id)
  297. if (max_grade < cur_grade) or (max_grade == cur_grade and max_star <= cur_star) then
  298. return true
  299. else
  300. return false
  301. end
  302. else
  303. return true
  304. end
  305. end
  306. function FosterModel:GetSubIsMax(type_id)
  307. if type_id then
  308. local basic = self:GetBasicInfo(type_id)
  309. return basic and basic.lv >= self:GetSubMax(type_id)
  310. else
  311. return true
  312. end
  313. end
  314. function FosterModel:GetSubMax(type_id)
  315. self.max_lv = self.max_lv or {}
  316. local max_lv_type = 1
  317. if type_id then
  318. if not self.max_lv[type_id] then
  319. for key, value in pairs(Config.Fostersub) do
  320. if value.type == type_id then
  321. max_lv_type = max_lv_type > value.lv and max_lv_type or value.lv
  322. end
  323. end
  324. self.max_lv[type_id] = max_lv_type
  325. end
  326. return self.max_lv[type_id]
  327. end
  328. end
  329. --获取最大星阶
  330. function FosterModel:GetMaxGradeStar( type_id )
  331. local function get_call( type_id )
  332. local grade,star = 0,0
  333. for k,v in pairs(Config.Foster) do
  334. if v.type == type_id then
  335. grade = grade > v.grade and grade or v.grade
  336. star = star > v.star and star or v.star
  337. end
  338. end
  339. return {grade = grade,star = star}
  340. end
  341. self.max_grade_star_info[type_id] = self.max_grade_star_info[type_id] or get_call(type_id)
  342. return self.max_grade_star_info[type_id].grade,self.max_grade_star_info[type_id].star
  343. end
  344. function FosterModel:GetCurMaxStar( type_id,grade )
  345. local star = 0
  346. for k,v in pairs(Config.Foster) do
  347. if v.type == type_id and v.grade == grade then
  348. star = star > v.star and star or v.star
  349. end
  350. end
  351. return star
  352. end
  353. --核心使用上限
  354. function FosterModel:GetKernelMax( type_id,kind,grade )
  355. if not type_id or not kind or not grade then return 0 end
  356. if not self:GetIsStrongFoster(type_id) then
  357. local max = 0
  358. for k,v in pairs(Config.Fostercore) do
  359. if v.type == type_id and v.kind == kind then
  360. local data = stringtotable(v.max)
  361. local lv = grade
  362. for a,b in pairs(data) do
  363. if b[1] < grade then
  364. max = max > b[2] and max or b[2]
  365. end
  366. end
  367. break
  368. end
  369. end
  370. return max
  371. else
  372. for k,v in pairs(Config.Fostercore) do
  373. if v.type == type_id and v.kind == kind then
  374. local data = stringtotable(v.max)
  375. for a,b in pairs(data) do
  376. if b[1] == grade then
  377. return b[2]
  378. end
  379. end
  380. break
  381. end
  382. end
  383. end
  384. return 0
  385. end
  386. function FosterModel:GetKernelNextMaxLv( type_id,kind,grade )
  387. if not type_id or not kind or not grade then return 0 end
  388. local cur_max_kernel = self:GetKernelMax( type_id,kind,grade )
  389. local max_grade = 99999
  390. for k,v in pairs(Config.Fostercore) do
  391. if v.type == type_id and v.kind == kind then
  392. local data = stringtotable(v.max)
  393. for a,b in pairs(data) do
  394. if b[2] > cur_max_kernel and b[1] > grade then
  395. max_grade = max_grade > b[1] and b[1] or max_grade
  396. end
  397. end
  398. break
  399. end
  400. end
  401. return max_grade
  402. end
  403. --使用核心最低阶数
  404. function FosterModel:GetUseKernelMinGrade( type_id,kind )
  405. if not type_id or not kind then return 1 end
  406. local conf = Config.Fostercore[type_id .. "@" .. kind]
  407. if not conf then return 1 end
  408. local min_grade,min_num = 999,99999
  409. for k,v in pairs(stringtotable(conf.max)) do
  410. min_grade = min_grade < v[1] and min_grade or v[1]
  411. min_num = min_num < v[2] and min_num or v[2]
  412. end
  413. return min_grade, min_num
  414. end
  415. --获得技能列表(仅用于展示技能条目的)
  416. function FosterModel:GetSkillShowConf( type_id )
  417. local function get_call( type_id )
  418. local data = {}
  419. for k,v in pairs(Config.Fosterskill) do
  420. if v.type == type_id and v.lv == 1 then
  421. table.insert( data, v )
  422. end
  423. end
  424. local function sort_call( a,b )
  425. return a.pos < b.pos
  426. end
  427. table.sort( data, sort_call )
  428. return data
  429. end
  430. self.skill_show_conf_list[type_id] = self.skill_show_conf_list[type_id] or get_call( type_id )
  431. return self.skill_show_conf_list[type_id]
  432. end
  433. --获得某类的总技能列表
  434. function FosterModel:GetSkillConf( type_id )
  435. local function get_call( type_id )
  436. local data = {}
  437. for k,v in pairs(Config.Fosterskill) do
  438. if v.type == type_id then
  439. table.insert( data, v )
  440. end
  441. end
  442. return data
  443. end
  444. self.skill_conf_list[type_id] = self.skill_conf_list[type_id] or get_call( type_id )
  445. return self.skill_conf_list[type_id]
  446. end
  447. --获得技能配置
  448. function FosterModel:GetSkillConfOne( type_id,lv,pos,skill_id )
  449. lv = lv or 1
  450. lv = lv > 0 and lv or 1
  451. if not type_id then return end
  452. if not pos and not skill_id then return end
  453. for k,v in pairs(self:GetSkillConf(type_id)) do
  454. if v.lv == lv and v.pos == pos and v.skillid == skill_id then
  455. return v
  456. end
  457. end
  458. end
  459. --获得技能状态
  460. function FosterModel:GetSkillStatus( type_id,pos,skill_id )
  461. local status = "lock"
  462. local back_lv = false
  463. if (not type_id) or (not pos and not skill_id) then
  464. status = "lock"
  465. else
  466. local basic = self:GetBasicInfo( type_id )
  467. if not basic then
  468. status = "lock"
  469. else
  470. for k,v in pairs(basic.skills) do
  471. if v.pos == pos and skill_id == v.skill then
  472. back_lv = v.lv
  473. break
  474. end
  475. end
  476. if back_lv == 0 then
  477. status = "lock"
  478. elseif back_lv and back_lv > 0 then
  479. status = "active"
  480. end
  481. end
  482. end
  483. return status, back_lv or 0
  484. end
  485. --获取AI娘的战斗技能(第四个位置),每次放技能都要获取,所以在获取一次之后就缓存下来,等进阶之后技能变化了再更新
  486. function FosterModel:GetPetFightSkill( )
  487. local function on_check_skill( )
  488. for k,v in pairs(Config.Fosterskill) do
  489. if v.type == FosterConst.ModuleId.FJarvis and v.pos == 4 then
  490. return v.skillid
  491. end
  492. end
  493. end
  494. self.pet_fight_skill = self.pet_fight_skill or on_check_skill()
  495. self.pet_fight_skill_state = self.pet_fight_skill_state or self:GetSkillStatus(FosterConst.ModuleId.FJarvis, 4, self.pet_fight_skill)
  496. if self.pet_fight_skill_state == "active" and self.pet_fight_skill then
  497. return self.pet_fight_skill
  498. end
  499. end
  500. --重置AI娘战斗技能激活状态
  501. function FosterModel:ResetPetFightSkillState( )
  502. self.pet_fight_skill_state = false
  503. end
  504. --获取进阶消耗材料
  505. function FosterModel:GetGradeCost( type_id, grade, star )
  506. if not type_id then return end
  507. if not grade or not star then
  508. local basic = self:GetBasicInfo( type_id )
  509. if basic then
  510. grade = basic.grade
  511. star = basic.star
  512. end
  513. end
  514. local conf = self:GetBaseConfOne( type_id, grade, star )
  515. if conf then
  516. return stringtotable(conf.cost)
  517. end
  518. end
  519. function FosterModel:GetKernelConf( type_id, opty )
  520. if not type_id then return end
  521. local data = {}
  522. if opty then
  523. for k,v in pairs(Config.Fostercore) do
  524. if v.type == type_id and v.kind == opty then
  525. return v
  526. end
  527. end
  528. else
  529. for k,v in pairs(Config.Fostercore) do
  530. if v.type == type_id then
  531. table.insert( data, v )
  532. end
  533. end
  534. end
  535. local function sort_call( a,b )
  536. return a.kind < b.kind
  537. end
  538. table.sort( data, sort_call )
  539. return data
  540. end
  541. -- core_info = {kind ,num } 获取核心增加的属性
  542. function FosterModel:GetKernelAttrAdd( type_id, core_info)
  543. if not type_id then return {} end
  544. local data = self:GetBasicInfo(type_id)
  545. if not data then return {} end
  546. local add_per = 0
  547. local add_extra = 0--局部全属性加成
  548. local attr = {}
  549. local conf_list = self:GetKernelConf( type_id)
  550. conf_list = self:GetKernelConf( type_id)
  551. for key, value in pairs(conf_list) do
  552. local cur_use_num = self:GetKernelUseNum(type_id, value.kind)
  553. if core_info and core_info.kind == value.kind then
  554. cur_use_num = core_info.num
  555. end
  556. local attr_temp = stringtotable(value.ext)
  557. for k,v in pairs(attr_temp) do
  558. add_extra = 0
  559. if v[1] == 68 then
  560. --局部全属性加成
  561. add_extra = v[2]
  562. else
  563. attr[v[1]] = attr[v[1]] or 0
  564. attr[v[1]] = attr[v[1]] + cur_use_num * v[2]
  565. end
  566. add_per = add_per + cur_use_num * (add_extra / 10000)
  567. end
  568. end
  569. return attr, add_per
  570. end
  571. function FosterModel:GetGradeTempAttr( type_id )
  572. if not type_id or not self:GetIsStrongFoster(type_id) then return {} end
  573. local data = self:GetBasicInfo(type_id)
  574. if not data then return {} end
  575. if data.click == 0 then return {} end
  576. local result = {}
  577. local temp_attr_conf = stringtotable(self:GetBaseConfOne( type_id ).tem_attrs)
  578. for k,v in pairs(temp_attr_conf) do
  579. result[tonumber(v[1])] = tonumber(v[2]) * data.click
  580. end
  581. return result
  582. end
  583. --获取当前阶数下可升的最大技能等级
  584. function FosterModel:GetSkillMaxInCurGrade( type_id, pos )
  585. if not type_id or not pos then return 0 end
  586. local lv = 0
  587. local data = self:GetBasicInfo(type_id)
  588. if self:GetIsStrongFoster(type_id) then
  589. if data then
  590. local grade = data.grade
  591. for k,v in pairs(Config.Fosterskill) do
  592. if v.type == type_id and v.pos == pos and v.limit <= grade then
  593. lv = lv > v.lv and lv or v.lv
  594. end
  595. end
  596. end
  597. else
  598. if data then
  599. local basic_lv = data.lv
  600. for k,v in pairs(Config.Fosterskill) do
  601. if v.type == type_id and v.pos == pos and v.limit <= basic_lv then
  602. lv = lv > v.lv and lv or v.lv
  603. end
  604. end
  605. end
  606. end
  607. return lv
  608. end
  609. function FosterModel:GetSkillMaxLevel( type_id, pos )
  610. local lv = 0
  611. for k,v in pairs(Config.Fosterskill) do
  612. if v.type == type_id and v.pos == pos then
  613. lv = lv > v.lv and lv or v.lv
  614. end
  615. end
  616. return lv
  617. end
  618. function FosterModel:GetGradeIsActive( type_id,grade )
  619. if not type_id or not grade then return false end
  620. local basic = self:GetBasicInfo( type_id )
  621. if not basic then return false end
  622. if self:GetIsStrongFoster(type_id) then
  623. return basic.grade >= grade
  624. else
  625. return basic.lv >= grade
  626. end
  627. end
  628. -- function FosterModel:GetMaxShowSuit( type_id,grade )
  629. -- local max = 1
  630. -- for key, value in pairs(Config.Fostersuit) do
  631. -- if value.type == type_id and value.grade < grade then
  632. -- max = max > value.grade and max or value.grade
  633. -- end
  634. -- end
  635. -- return max
  636. -- end
  637. function FosterModel:LvToGrade(lv)
  638. if lv then
  639. return math.ceil((lv - 0.5) / 20)
  640. else
  641. return 1
  642. end
  643. end
  644. --获取已穿戴的装备
  645. function FosterModel:GetEquipInfo( type_id,grade,pos )
  646. if not type_id or not grade or not pos then return end
  647. local base_info = self:GetBasicInfo(type_id)
  648. if not base_info then return end
  649. for k,v in pairs(base_info.grade_equips) do
  650. if v.grade == grade then
  651. for a,b in pairs(v.equips) do
  652. if b.pos == pos then
  653. return b
  654. end
  655. end
  656. return
  657. end
  658. end
  659. end
  660. function FosterModel:GetEquipConf( type_id )
  661. if not type_id then return end
  662. return Config.Fosterequip[type_id]
  663. end
  664. function FosterModel:GetEquipMoreConf( type_id,pos,color,lv )
  665. if not type_id or not pos or not color or not lv then return end
  666. return Config.Fosterequiplv[ type_id .. "@" ..pos .. "@" ..color .. "@" ..lv ]
  667. end
  668. --通过背包信息获取穿戴的装备
  669. function FosterModel:GetDressInfoByBagInfo( bag_info )
  670. if not bag_info then return end
  671. if bag_info.goods_id then
  672. return self.equip_dic[bag_info.goods_id]
  673. end
  674. end
  675. --通过穿戴的装备获取背包的信息
  676. function FosterModel:GetBagInfoByDressInfo( dress_info )
  677. if not dress_info then return end
  678. if dress_info.goods_id then
  679. return GoodsModel:getInstance():GetFosterEquipDic()[dress_info.goods_id]
  680. end
  681. end
  682. --通过背包的信息获取装备等级
  683. function FosterModel:GetLevelByBagInfo( bag_info )
  684. if not bag_info then return 0 end
  685. for k,v in pairs(bag_info.other_data or {}) do
  686. if v.type == 1 then
  687. return tonumber(v.info or 0)
  688. end
  689. end
  690. return 0
  691. end
  692. --通过背包的信息获取装备经验
  693. function FosterModel:GetExpByBagInfo( bag_info )
  694. if not bag_info then return 0 end
  695. for k,v in pairs(bag_info.other_data or {}) do
  696. if v.type == 2 then
  697. return tonumber(v.info or 0)
  698. end
  699. end
  700. return 0
  701. end
  702. function FosterModel:GetSwallowSelect( )
  703. return self.swallow_select or {}
  704. end
  705. function FosterModel:ResetSwallowSelect( )
  706. self.swallow_select = {}
  707. end
  708. function FosterModel:GetSwallowStatus( goods_id )
  709. goods_id = goods_id or 0
  710. return self.swallow_select[goods_id]
  711. end
  712. function FosterModel:SetSwallowSelect( goods_id , status )
  713. if not goods_id then return end
  714. if status then
  715. self.swallow_select[goods_id] = true
  716. else
  717. self.swallow_select[goods_id] = nil
  718. end
  719. end
  720. -------------------------
  721. --检查红点屏蔽的
  722. function FosterModel:CheckMaskUpgradeRed( type_id )
  723. do return end -- 现在清除阶段也有红点了,这个不需要了
  724. if not type_id then return end
  725. local basic = self:GetBasicInfo( type_id )
  726. if basic then
  727. local is_clear = self:GetBaseConfOne( type_id, basic.grade, basic.star ).clear == 1
  728. if is_clear and self:CanUpgrade( false, type_id ) then
  729. self.mask_upgrad_red[type_id] = true
  730. self:CanUpgrade( true, type_id )
  731. self:Fire(FosterConst.RedDotRefresh)
  732. end
  733. FosterController.Instance:CheckRedDot()
  734. end
  735. end
  736. --升阶红点
  737. function FosterModel:CanUpgrade( check_new, type_id )
  738. if not check_new then
  739. return self.red_canupgrade[type_id]
  740. end
  741. self.red_canupgrade[type_id] = false
  742. if self:GetIsStrongFoster(type_id) then --强进阶
  743. if not self:GetIsMax(type_id) then
  744. -------------------------
  745. local cost = self:GetGradeCost(type_id)
  746. if TableSize(cost) ~= 0 then
  747. local basic = self:GetBasicInfo( type_id )
  748. local is_clear = false
  749. if basic then
  750. is_clear = basic.isclear == 1
  751. end
  752. local have = GoodsModel:getInstance():GetTypeGoodsNum(cost[1][2])
  753. if not is_clear then
  754. if tonumber(cost[1][3]) <= have then
  755. self.red_canupgrade[type_id] = true
  756. end
  757. else
  758. -- 如果材料满足可以一次进阶成功就给红点
  759. local conf = self:GetBaseConfOne(type_id)
  760. local cur_exp = basic.exp
  761. local need_exp = conf.max - cur_exp
  762. need_exp = need_exp < 0 and 0 or need_exp
  763. -- 祝福可能获得的经验值,按配置(9~11)的最小值来推测,算9点,这边写死懒得读配置了
  764. local exp_per_upgrade = 9
  765. local need_num = math.ceil(need_exp / exp_per_upgrade) * tonumber(cost[1][3])
  766. if need_num <= have then
  767. self.red_canupgrade[type_id] = true
  768. end
  769. end
  770. end
  771. end
  772. else --弱进阶
  773. if not self:GetSubIsMax(type_id) then
  774. for i=1,3 do
  775. local sub_mat = self:GetFosterSubMaterialByType(type_id)
  776. local cost_data = stringtotable(sub_mat[FosterConst.SubMatStr[i]])
  777. local have = GoodsModel:getInstance():GetTypeGoodsNum(cost_data[1][1])
  778. local cost_num = 1
  779. if have >= cost_num then
  780. self.red_canupgrade[type_id] = true
  781. break
  782. end
  783. end
  784. end
  785. end
  786. return self.red_canupgrade[type_id]
  787. end
  788. --核心使用红点
  789. function FosterModel:CanKernel( check_new, type_id, id )
  790. if not type_id then return false end
  791. self.red_cankernel[type_id] = self.red_cankernel[type_id] or {}
  792. if not check_new then
  793. if id then
  794. return self.red_cankernel[type_id][id]
  795. else
  796. return self.red_cankernel_all[type_id]
  797. end
  798. end
  799. -------------------------
  800. self.red_cankernel[type_id] = {}
  801. self.red_cankernel_all[type_id] = false
  802. if type_id then
  803. local basic_info = self:GetBasicInfo(type_id)
  804. local core_conf = self:GetKernelConf(type_id)
  805. if basic_info and core_conf then
  806. local grade = basic_info.grade
  807. --弱进阶参数为等级
  808. if not self:GetIsStrongFoster(type_id) then
  809. grade = basic_info.lv == 0 and 1 or basic_info.lv
  810. end
  811. -- print("Lizhijian:FosterModel [start:886] ")
  812. -- PrintTable(core_conf)
  813. -- print("Lizhijian:FosterModel [end:886] ")
  814. for key, value in pairs(core_conf) do
  815. self.red_cankernel[type_id][value.kind] = false
  816. local kernel_cost_id = stringtotable(value.cost)[1][2]
  817. local kernel_max = self:GetKernelMax( type_id, value.kind, grade )
  818. local use_num = self:GetKernelUseNum(type_id, value.kind)
  819. if use_num and use_num < kernel_max and GoodsModel:getInstance():GetTypeGoodsNum(kernel_cost_id) > 0 then
  820. self.red_cankernel[type_id][value.kind] = true
  821. self.red_cankernel_all[type_id] = true
  822. end
  823. end
  824. end
  825. end
  826. if id then
  827. return self.red_cankernel[type_id][id]
  828. else
  829. return self.red_cankernel_all[type_id]
  830. end
  831. end
  832. function FosterModel:CanSkillUpgradeByType( check_new,type_id )
  833. local basic_info = self:GetBasicInfo(type_id)
  834. local bool = false
  835. if basic_info then
  836. for k,v in pairs(basic_info.skills) do
  837. bool = self:CanSkillUpgrade(check_new,type_id,v.pos,v.skill) or bool
  838. end
  839. end
  840. return bool
  841. end
  842. function FosterModel:CanSkillUpgrade( check_new,type_id,pos,skill_id )
  843. if not type_id or not pos or not skill_id then return false end
  844. self.red_canskill[type_id] = self.red_canskill[type_id] or {}
  845. if not check_new then
  846. return self.red_canskill[type_id][pos]
  847. end
  848. -------------------------
  849. self.red_canskill[type_id][pos] = false
  850. local status,skill_lv = self:GetSkillStatus(type_id,pos,skill_id)
  851. if status == "active" then
  852. local max_lv = self:GetSkillMaxInCurGrade(type_id,pos)
  853. if skill_lv < max_lv then
  854. local conf = self:GetSkillConfOne( type_id,skill_lv,pos,skill_id )
  855. if conf then
  856. local cost_info = stringtotable(conf.cost)
  857. self.red_canskill[type_id][pos] = GoodsModel:getInstance():GetTypeGoodsNum(cost_info[1][2]) >= cost_info[1][3]
  858. end
  859. end
  860. end
  861. return self.red_canskill[type_id][pos]
  862. end
  863. --装备穿戴红点
  864. function FosterModel:CanDressNewEquipWithType( check_new,type_id )
  865. if not self:GetCanUseEquipByType( type_id ) then
  866. return false
  867. end
  868. -------------------------
  869. local basic_info = self:GetBasicInfo(type_id)
  870. local bool = false
  871. if basic_info then
  872. if self:GetIsStrongFoster(type_id) then
  873. for i=1,basic_info.grade do
  874. bool = self:CanDressNewEquipWithGrade(check_new,type_id,i) or bool
  875. end
  876. else
  877. local conf_list= self:GetBaseConfList(type_id)
  878. for key, value in pairs(conf_list) do
  879. bool = self:CanDressNewEquipWithGrade(check_new, type_id, value.grade) or bool
  880. end
  881. end
  882. end
  883. return bool
  884. end
  885. --装备穿戴红点
  886. function FosterModel:CanDressNewEquipWithGrade( check_new,type_id,grade )
  887. if not self:GetCanUseEquipByType( type_id ) then
  888. return false
  889. end
  890. -------------------------
  891. local bool = false
  892. for i=1,FosterConst.EquipNum do
  893. bool = self:CanDressNewEquip( check_new,type_id,grade,i ) or bool
  894. end
  895. return bool
  896. end
  897. --装备穿戴红点
  898. function FosterModel:CanDressNewEquip( check_new,type_id,grade,pos )
  899. if not self:GetCanUseEquipByType( type_id ) then
  900. return false
  901. end
  902. -------------------------
  903. if not type_id or not grade or not pos then return end
  904. self.red_candressnew[type_id] = self.red_candressnew[type_id] or {}
  905. self.red_candressnew[type_id][grade] = self.red_candressnew[type_id][grade] or {}
  906. if not check_new then
  907. return self.red_candressnew[type_id][grade][pos]
  908. end
  909. -------------------------
  910. self.red_candressnew[type_id][grade][pos] = false
  911. local basic_info = self:GetBasicInfo(type_id)
  912. if basic_info and self:GetGradeIsActive( type_id,grade ) and (not self:GetEquipInfo( type_id,grade,pos )) then
  913. local data = GoodsModel:getInstance():GetFosterWantList( type_id,pos,"bag" )
  914. if TableSize(data) > 0 then
  915. self.red_candressnew[type_id][grade][pos] = true
  916. end
  917. end
  918. return self.red_candressnew[type_id][grade][pos]
  919. end
  920. --装备替换红点
  921. function FosterModel:CanDressUpEquipWithType( check_new,type_id )
  922. if not self:GetCanUseEquipByType( type_id ) then
  923. return false
  924. end
  925. -------------------------
  926. local basic_info = self:GetBasicInfo(type_id)
  927. local bool = false
  928. if basic_info then
  929. if self:GetIsStrongFoster(type_id) then
  930. for i=1,basic_info.grade do
  931. bool = self:CanDressUpEquipWithGrade(check_new,type_id,i) or bool
  932. end
  933. else
  934. local conf_list = self:GetBaseConfList(type_id)
  935. for _, value in ipairs(conf_list) do
  936. bool = self:CanDressUpEquipWithGrade(check_new,type_id,value.grade) or bool
  937. end
  938. end
  939. end
  940. return bool
  941. end
  942. --装备替换红点
  943. function FosterModel:CanDressUpEquipWithGrade( check_new,type_id,grade )
  944. if not self:GetCanUseEquipByType( type_id ) then
  945. return false
  946. end
  947. -------------------------
  948. local bool = false
  949. for i=1,FosterConst.EquipNum do
  950. bool = self:CanDressUpEquip( check_new,type_id,grade,i ) or bool
  951. end
  952. return bool
  953. end
  954. --装备替换红点
  955. function FosterModel:CanDressUpEquip( check_new,type_id,grade,pos )
  956. if not self:GetCanUseEquipByType( type_id ) then
  957. return false
  958. end
  959. -------------------------
  960. if not type_id or not grade or not pos then return false end
  961. self.red_candressup[type_id] = self.red_candressup[type_id] or {}
  962. self.red_candressup[type_id][grade] = self.red_candressup[type_id][grade] or {}
  963. if not check_new then
  964. return self.red_candressup[type_id][grade][pos]
  965. end
  966. -------------------------
  967. self.red_candressup[type_id][grade][pos] = false
  968. local basic_info = self:GetBasicInfo(type_id)
  969. if basic_info and self:GetGradeIsActive( type_id,grade ) and self:GetEquipInfo( type_id,grade,pos ) then
  970. --是否已解锁;--是否已穿戴
  971. local data = GoodsModel:getInstance():GetFosterWantList( type_id,pos,"bag" )
  972. local conf = {}
  973. -- print("Lizhijian:FosterModel [start:1006] self:GetEquipInfo( type_id,grade,pos ) ------------------------------------------")
  974. -- PrintTable(self:GetEquipInfo( type_id,grade,pos ))
  975. for k,v in pairs(data) do
  976. conf = self:GetEquipConf( v.type_id )
  977. if conf then
  978. if self:GetEquipInfo( type_id,grade,pos ).color < conf.color then
  979. self.red_candressup[type_id][grade][pos] = true
  980. end
  981. end
  982. end
  983. end
  984. return self.red_candressup[type_id][grade][pos]
  985. end
  986. -- 根据类型获取进阶装备背包中可穿戴(替换)的装备
  987. function FosterModel:GetCanEquipDressData( type_id, grade, pos )
  988. local equip_data = nil -- 目标返回的装备数据
  989. local basic_info = self:GetBasicInfo(type_id)
  990. if basic_info and self:GetGradeIsActive( type_id,grade ) then
  991. local equip_info = self:GetEquipInfo( type_id,grade,pos ) -- 当前穿戴的装备数据
  992. local data = GoodsModel:getInstance():GetFosterWantList( type_id,pos,"bag" )
  993. local conf = {}
  994. for k, v in pairs(data) do
  995. conf = self:GetEquipConf( v.type_id )
  996. if conf then
  997. if ((not equip_info) or (equip_info.color < conf.color)) -- 未穿戴或当前穿戴的装备品质低于该装备
  998. and ((not equip_data) or (equip_data.color < conf.color)) then -- 未提取目标装备或目标装备缓存的品质颜色低于该装备
  999. equip_data = v
  1000. end
  1001. end
  1002. end
  1003. end
  1004. return equip_data
  1005. end
  1006. --装备升阶红点检查红点屏蔽的
  1007. function FosterModel:CheckMaskUpEquipRed( type_id )
  1008. if not type_id then return end
  1009. if self.red_candressup[type_id] and self.red_candressup[type_id] then
  1010. for k,v in pairs(self.red_candressup[type_id]) do
  1011. if v then
  1012. self.mask_dressupgrade_red[type_id] = true
  1013. self:Fire(FosterConst.RedDotRefresh)
  1014. FosterController.Instance:CheckRedDot()
  1015. return
  1016. end
  1017. end
  1018. end
  1019. end
  1020. --装备升阶红点
  1021. function FosterModel:CanUpEquipWithType( check_new,type_id )
  1022. if not self:GetCanUseEquipByType( type_id ) then
  1023. return false
  1024. end
  1025. -------------------------
  1026. if type_id and self.mask_dressupgrade_red[type_id] then return false end
  1027. -------------------------
  1028. local basic_info = self:GetBasicInfo(type_id)
  1029. local bool = false
  1030. if basic_info then
  1031. if self:GetIsStrongFoster(type_id) then
  1032. for i=1,basic_info.grade do
  1033. bool = self:CanUpEquipWithGrade(check_new,type_id,i) or bool
  1034. end
  1035. else
  1036. local conf_list = self:GetBaseConfList(type_id)
  1037. for _, value in ipairs(conf_list) do
  1038. bool = self:CanUpEquipWithGrade(check_new,type_id,value.grade) or bool
  1039. end
  1040. end
  1041. end
  1042. return bool
  1043. end
  1044. --装备升阶红点
  1045. function FosterModel:CanUpEquipWithGrade( check_new,type_id,grade )
  1046. if not self:GetCanUseEquipByType( type_id ) then
  1047. return false
  1048. end
  1049. -------------------------
  1050. if type_id and self.mask_dressupgrade_red[type_id] then return false end
  1051. -------------------------
  1052. local bool = false
  1053. for i=1,FosterConst.EquipNum do
  1054. bool = self:CanUpEquip( check_new,type_id,grade,i ) or bool
  1055. end
  1056. return bool
  1057. end
  1058. --装备升阶红点
  1059. function FosterModel:CanUpEquip( check_new,type_id,grade,pos )
  1060. -------------------------
  1061. if not self:GetCanUseEquipByType( type_id ) then
  1062. return false
  1063. end
  1064. -------------------------
  1065. if not type_id or not grade or not pos then
  1066. return
  1067. end
  1068. if self.mask_dressupgrade_red[type_id] then
  1069. return false
  1070. end
  1071. -------------------------
  1072. self.red_canupequip[type_id] = self.red_canupequip[type_id] or {}
  1073. self.red_canupequip[type_id][grade] = self.red_canupequip[type_id][grade] or {}
  1074. if not check_new then
  1075. return self.red_canupequip[type_id][grade][pos]
  1076. end
  1077. -------------------------
  1078. self.red_canupequip[type_id][grade][pos] = false
  1079. -- 在已激活的阶段的全部槽位都穿戴了装备之前,没有可升级的红点(引导)
  1080. local can_update_up_red = true
  1081. local cur_type_grade = self:GetBasicInfo(type_id).grade -- 当前类型的阶段数
  1082. local temp_equip_info
  1083. for i = 1, cur_type_grade do
  1084. for j = 1, FosterConst.EquipNum do
  1085. -- 存在任何一件可替换或可上阵的槽位时,不显示可升级
  1086. if self:CanDressUpEquip(false, type_id, i, j) or self:CanDressNewEquip(false, type_id, i, j) then
  1087. can_update_up_red = false
  1088. break
  1089. end
  1090. end
  1091. if not can_update_up_red then
  1092. break
  1093. end
  1094. end
  1095. --------------------
  1096. if can_update_up_red then -- 所有已激活的阶段数都穿戴了装备的情况下
  1097. local basic_info = self:GetBasicInfo(type_id)
  1098. local equip_info = self:GetEquipInfo( type_id,grade,pos )
  1099. if basic_info and self:GetGradeIsActive( type_id,grade ) and equip_info then
  1100. -- 是否满级
  1101. local not_max = self:GetEquipMoreConf(type_id, equip_info.pos, equip_info.color, equip_info.lv+1) and true or false
  1102. if not_max then
  1103. --是否已解锁;--是否已穿戴
  1104. -- local data = GoodsModel:getInstance():GetFosterWantList( type_id,pos,"bag" )
  1105. local data = GoodsModel:getInstance():GetFosterWantList( type_id,nil,"bag" )
  1106. local conf = {}
  1107. for k,v in pairs(data) do
  1108. conf = self:GetEquipConf( v.type_id )
  1109. if conf then
  1110. -- if equip_info.color > conf.color then
  1111. self.red_canupequip[type_id][grade][pos] = true
  1112. break
  1113. -- end
  1114. end
  1115. end
  1116. end
  1117. end
  1118. end
  1119. return self.red_canupequip[type_id][grade][pos]
  1120. end
  1121. function FosterModel:RefreshEquipRedData( type_id )
  1122. self:CanDressNewEquipWithType(true,type_id)
  1123. self:CanDressUpEquipWithType(true,type_id)
  1124. self:CanUpEquipWithType( true,type_id )
  1125. end
  1126. function FosterModel:CheckAllRedDot( check_new )
  1127. for k,v in pairs(FosterConst.ModuleId) do
  1128. if self:CheckRedDot( check_new,v ) then
  1129. return true
  1130. end
  1131. end
  1132. end
  1133. -- 进阶装备协助的红点
  1134. function FosterModel:CanActivateFosterAssist(check_new, type)
  1135. if not type then return false end
  1136. if check_new then
  1137. self.foster_assist_red[type] = false
  1138. local assist_data = self:GetFosterSuitAssistFlagData(type)
  1139. for k, v in pairs(assist_data) do
  1140. if v == 1 then
  1141. self.foster_assist_red[type] = true
  1142. end
  1143. end
  1144. end
  1145. return self.foster_assist_red[type]
  1146. end
  1147. -- 进阶装备协助红点
  1148. function FosterModel:CanActivateFosterAssistWithGrade(check_new, type, grade)
  1149. if not type then return false end
  1150. if check_new then
  1151. self:CanActivateFosterAssist(check_new, type)
  1152. end
  1153. if grade then
  1154. return self:GetFosterSuitAssistFlagData(type, grade) == 1
  1155. else
  1156. return self.foster_assist_red[type]
  1157. end
  1158. return false
  1159. end
  1160. function FosterModel:GetRedDotByTab( type_id,grade )
  1161. if self:GetCanUseEquipByType( type_id ) then
  1162. local bool_equip_dress = self:CanDressNewEquipWithGrade( false,type_id,grade )
  1163. local bool_equip_change = self:CanDressUpEquipWithGrade( false,type_id,grade )
  1164. local bool_equip_up = self:CanUpEquipWithGrade( false,type_id,grade )
  1165. local bool_equip_assist = self:CanActivateFosterAssistWithGrade(false, type_id, grade)
  1166. return bool_equip_dress or bool_equip_change or bool_equip_up or bool_equip_assist
  1167. end
  1168. return false
  1169. end
  1170. function FosterModel:CheckRedDot( check_new,type_id )
  1171. if not type_id then return end
  1172. if check_new then
  1173. --这时候比较特别,需要强制刷新所有相关的以备使用
  1174. self:CanUpgrade(true,type_id)
  1175. self:CanKernel(true,type_id)
  1176. self:CanDressNewEquipWithType(true,type_id)
  1177. self:CanDressUpEquipWithType(true,type_id)
  1178. self:CanUpEquipWithType(true,type_id)
  1179. self:CanSkillUpgradeByType( true,type_id )
  1180. self:CanActivateFosterAssist(true, type_id)
  1181. self:CanSkinActOrUp(true, type_id)
  1182. end
  1183. return (
  1184. self:CanUpgrade(false,type_id) or
  1185. self:CanKernel(false,type_id) or
  1186. self:CanSkillUpgradeByType( false,type_id ) or
  1187. self:CanActivateFosterAssist(false, type_id) or
  1188. self:CanDressNewEquipWithType(false,type_id) or
  1189. self:CanDressUpEquipWithType(false,type_id) or
  1190. -- self:CanUpEquipWithType( false,type_id ) or
  1191. self:CanSkinActOrUp(false, type_id)) and
  1192. GetModuleIsOpen( 146,type_id,true )
  1193. end
  1194. -------------------------
  1195. function FosterModel:GetShowHideType( type_id )
  1196. if not type_id then return false end
  1197. if type_id == FosterConst.ModuleId.FHorse then return false end
  1198. -------------------------
  1199. local data = CookieWrapper.Instance:GetCookie(CookieLevelType.Account,CookieKey.FOSTER_HIDE_TAG) or {}
  1200. return data[type_id] and true or false
  1201. end
  1202. function FosterModel:SetShowHideType( type_id,tag )
  1203. if not type_id then return end
  1204. if type_id == FosterConst.ModuleId.FHorse then tag = false end
  1205. -------------------------
  1206. local data = CookieWrapper.Instance:GetCookie(CookieLevelType.Account,CookieKey.FOSTER_HIDE_TAG) or {}
  1207. data[type_id] = tag and true or false
  1208. CookieWrapper.Instance:SaveCookie(CookieLevelType.Account,CookieTimeType.TYPE_ALWAYS,CookieKey.FOSTER_HIDE_TAG,data)
  1209. CookieWrapper.Instance:WriteAll()
  1210. -------------------------
  1211. local role = Scene.Instance:GetRole(RoleManager.Instance.mainRoleInfo.role_id)
  1212. if role then
  1213. if type_id == FosterConst.ModuleId.FPearl then
  1214. if self:GetShowHideType( FosterConst.ModuleId.FPearl ) then
  1215. role:HideSprite(SceneObj.ModelHideFlag.ServerHide)
  1216. else
  1217. role:ShowSprite(SceneObj.ModelHideFlag.ServerHide)
  1218. end
  1219. elseif type_id == FosterConst.ModuleId.FJarvis then
  1220. if self:GetShowHideType( FosterConst.ModuleId.FJarvis ) then
  1221. role:HidePet(SceneObj.ModelHideFlag.ServerHide)
  1222. else
  1223. role:ShowPet(SceneObj.ModelHideFlag.ServerHide)
  1224. end
  1225. elseif type_id == FosterConst.ModuleId.FCloud then
  1226. role:RefreshPetWing()
  1227. elseif type_id == FosterConst.ModuleId.FWing then
  1228. role:ChangeWing()
  1229. elseif type_id == FosterConst.ModuleId.FGun then
  1230. role:RefreshPetWeapon()
  1231. elseif type_id == FosterConst.ModuleId.FArmour then
  1232. role:RefreshPetFarmour()
  1233. elseif type_id == FosterConst.ModuleId.FHorse then
  1234. role:HorseChange()
  1235. elseif type_id == FosterConst.ModuleId.FWeapon then
  1236. role:CreateWeaponSprite()
  1237. end
  1238. end
  1239. end
  1240. function FosterModel:GetModuleResIdByStage( module_id,stage_id )
  1241. if not module_id and not stage_id then return end
  1242. local conf = self:GetBaseConfOne(module_id,stage_id,0)
  1243. if conf then
  1244. if not conf.resource then
  1245. return FosterConst.DefaultModelId[module_id] or 1000
  1246. end
  1247. return conf.resource
  1248. end
  1249. end
  1250. function FosterModel:GetSpriteSkillId( )
  1251. return Config.otherFightInfo.sprite_skill_id
  1252. end
  1253. function FosterModel:GetFJarvisSkillId( )
  1254. return Config.otherFightInfo.pet_skill_id
  1255. end
  1256. --得到最低阶进阶的展示属性
  1257. function FosterModel:GetMinStageAttrFight( foster_type,stage,star )
  1258. local data = Config.Foster[foster_type .. "@"..stage.."@"..star]
  1259. if not data then return end
  1260. local base_attr = stringtotable(data.attrs)
  1261. base_attr = SortAttrList( base_attr )
  1262. return GetFighting(base_attr)
  1263. end
  1264. --获取装备套装配置
  1265. function FosterModel:GetEquipSuitConf( type_id,grade,color )
  1266. for k,v in pairs(Config.Fostersuit) do
  1267. if v.type == type_id and v.color <= color and v.grade == grade then
  1268. return v
  1269. end
  1270. end
  1271. end
  1272. -- 根据展示类型和阶段数获取进阶装备协助套装要求配置
  1273. function FosterModel:GetEquipSuitAssistCfg(type, grade)
  1274. grade = grade or 1
  1275. if type and self:GetIsStrongFoster(type) then
  1276. if grade then
  1277. for k, v in pairs(Config.Fosterequipassist) do
  1278. if v.type == type and v.grade == grade then
  1279. return v
  1280. end
  1281. end
  1282. end
  1283. else
  1284. if grade then
  1285. for k, v in pairs(Config.Fosterequipassist) do
  1286. if v.type == type and v.grade == grade then
  1287. return v
  1288. end
  1289. end
  1290. end
  1291. end
  1292. return nil
  1293. end
  1294. function FosterModel:GetEquipSuitNumByColor( type_id,grade,color )
  1295. local num = 0
  1296. local equip_info = false
  1297. local equip_conf = false
  1298. for i=1,FosterConst.EquipNum do
  1299. equip_info = self:GetEquipInfo(type_id,grade,i)
  1300. if equip_info then
  1301. equip_conf = self:GetEquipConf( equip_info.type_id )
  1302. if equip_conf and equip_conf.color >= color then
  1303. num = num + 1
  1304. end
  1305. end
  1306. end
  1307. return num
  1308. end
  1309. function FosterModel:GetEquipSuitPower( type_id,grade )
  1310. local power = 0
  1311. local equip_list = {}
  1312. local equip_info = false
  1313. local equip_conf = false
  1314. for i=1,FosterConst.EquipNum do
  1315. equip_info = self:GetEquipInfo(type_id,grade,i)
  1316. if equip_info then
  1317. equip_conf = self:GetEquipConf( equip_info.type_id )
  1318. table.insert( equip_list, equip_conf )
  1319. end
  1320. end
  1321. local equip_num = false
  1322. for k,v in pairs(Config.Fostersuit) do
  1323. equip_num = 0
  1324. if v.type == type_id and v.grade == grade then
  1325. for kk,vv in pairs(equip_list) do
  1326. if vv.color >= v.color then
  1327. equip_num = equip_num + 1
  1328. end
  1329. end
  1330. end
  1331. if equip_num >= 6 then
  1332. power = power + GetFighting((stringtotable(v.attrs)),true)
  1333. end
  1334. end
  1335. return power
  1336. end
  1337. function FosterModel:ShowEquipComTip( type_id, open_show_get_way, hide_base_con )
  1338. local data = GoodsModel:getInstance():GetGoodsBasicByTypeId( type_id )
  1339. self:Fire(FosterConst.OpenFosterEquipTipView,data,nil,nil,open_show_get_way,hide_base_con)
  1340. end
  1341. function FosterModel:GetUpgradeNeedMoreCostNum( type_id, is_auto )
  1342. local cost_data = self:GetGradeCost(type_id)
  1343. if cost_data then
  1344. local have = GoodsModel:getInstance():GetTypeGoodsNum(cost_data[1][2])
  1345. if tonumber(cost_data[1][3]) > have then
  1346. return tonumber(cost_data[1][3]) - have
  1347. else
  1348. return 1
  1349. end
  1350. end
  1351. end
  1352. --祝福值清空提示机制
  1353. function FosterModel:CheckBlessClock( )
  1354. if self.clock_bless_id then
  1355. GlobalTimerQuest:CancelQuest(self.clock_bless_id)
  1356. self.clock_bless_id = nil
  1357. end
  1358. -------------------------
  1359. self.tip_bless_list = {}--每个进阶的祝福倒计时
  1360. local function check_call( start_id,end_id )
  1361. local next_time = false
  1362. local basic = false
  1363. for i=start_id,end_id do
  1364. self.tip_bless_list[i] = false
  1365. basic = self:GetBasicInfo( i )
  1366. if basic then
  1367. if basic.end_time - TimeUtil:getServerTime() > 0 and basic.isclear == 1 and basic.exp > 0 then
  1368. self.tip_bless_list[i] = basic.end_time
  1369. if next_time then
  1370. next_time = next_time > basic.end_time and basic.end_time or next_time
  1371. else
  1372. next_time = basic.end_time
  1373. end
  1374. end
  1375. end
  1376. end
  1377. return next_time
  1378. end
  1379. local next_time_horse = check_call(1,4)--座驾的最近下一次祝福值刷新
  1380. local next_time_ai = check_call(5,8)--ai娘的最近下一次祝福值刷新
  1381. next_time_ai = false -- 弱进阶屏蔽祝福值
  1382. -------------------------
  1383. local check_next_time = next_time_horse or next_time_ai
  1384. if check_next_time then
  1385. if next_time_ai then
  1386. check_next_time = check_next_time > next_time_ai and next_time_ai or check_next_time
  1387. end
  1388. local function clockFun()
  1389. if TimeUtil:getServerTime() > check_next_time then
  1390. --时间到,重新检测一次
  1391. self:CheckBlessClock()
  1392. end
  1393. end
  1394. self.clock_bless_id = GlobalTimerQuest:AddPeriodQuest(clockFun, 1, -1)
  1395. end
  1396. GlobalEventSystem:Fire(EventName.SHOW_FUNCTION_CLOCK_POINT, 146, next_time_horse and true or false)
  1397. GlobalEventSystem:Fire(EventName.SHOW_FUNCTION_CLOCK_POINT, 146555, next_time_ai and true or false)
  1398. end
  1399. --获取祝福值角标状态
  1400. function FosterModel:GetBlessTip( type_id )
  1401. return self.tip_bless_list[type_id] and true or false
  1402. end
  1403. --是否是第一次进阶
  1404. function FosterModel:IsFirstForsterAdvance( )
  1405. local cfg = self:GetFirstForsterAdvanceCookie()
  1406. return not cfg.is_first_advace
  1407. end
  1408. --保存首次进阶
  1409. function FosterModel:SetFirstForsterAdvanceCookie( )
  1410. self.foster_first_advance = self.foster_first_advance or {}
  1411. if self.foster_first_advance.is_first_advace then
  1412. return
  1413. end
  1414. self.foster_first_advance.is_first_advace = true
  1415. CookieWrapper.Instance:SaveCookie(CookieLevelType.Account,CookieTimeType.TYPE_ALWAYS,CookieKey.FORSTER_FIRST_ADVANCE_TIPS,self.foster_first_advance)
  1416. CookieWrapper.Instance:WriteAll()
  1417. end
  1418. --获取首次进阶cookie
  1419. function FosterModel:GetFirstForsterAdvanceCookie( )
  1420. if not self.foster_first_advance then
  1421. self.foster_first_advance = CookieWrapper.Instance:GetCookie(CookieLevelType.Account,CookieKey.FORSTER_FIRST_ADVANCE_TIPS) or {}
  1422. end
  1423. return self.foster_first_advance
  1424. end
  1425. function FosterModel:GetIsActive(show_type, grade)
  1426. local base_data = self:GetBasicInfo(show_type)
  1427. if base_data and grade <= base_data.grade then
  1428. return true
  1429. end
  1430. return false
  1431. end
  1432. -- 获取弱进阶系统升级材料id
  1433. function FosterModel:GetFosterSubMaterialByType(type_id)
  1434. if not type_id then
  1435. return
  1436. end
  1437. for key, value in pairs(Config.Fostersubmaterial) do
  1438. if value.type == type_id then
  1439. return value
  1440. end
  1441. end
  1442. end
  1443. -- 设置弱进阶皮肤系统数据
  1444. function FosterModel:SetFosterSubSkinData(type_id, base_data)
  1445. self.sub_skin_base = self.sub_skin_base or {}
  1446. self.sub_skin_base[type_id] = base_data
  1447. self:CanSkinActOrUp(true,type_id)
  1448. end
  1449. function FosterModel:GetFosterSubSkinData(type_id)
  1450. self.sub_skin_base = self.sub_skin_base or {}
  1451. if type_id then
  1452. return self.sub_skin_base[type_id]
  1453. end
  1454. end
  1455. -- 获取弱进阶皮肤系统配置
  1456. function FosterModel:GetFosterSubSkinConf(type_id, skin_id, star)
  1457. if type_id then
  1458. if not skin_id or not star then -- 无皮肤参数则默认获取所有初级皮肤信息
  1459. star = 0
  1460. local conf_list = {}
  1461. for key, value in pairs(Config.Fostersubskin) do
  1462. if value.type == type_id and value.star == star then
  1463. table.insert(conf_list, value)
  1464. end
  1465. end
  1466. table.sort(conf_list, function (a, b)
  1467. return a.sequence < b.sequence
  1468. end)
  1469. return conf_list
  1470. else
  1471. return Config.Fostersubskin[type_id .. "@" .. skin_id .. "@" .. star]
  1472. end
  1473. end
  1474. end
  1475. -- 获取弱进阶皮肤页签栏数据
  1476. function FosterModel:GetCurSkinTabData(type_id)
  1477. if not type_id then return end
  1478. local cur_skins = self:GetFosterSubSkinData(type_id)
  1479. local conf_list = self:GetFosterSubSkinConf(type_id)
  1480. local tab_data = DeepCopy(conf_list)
  1481. if TableSize(cur_skins) > 0 then
  1482. for _, cur_value in pairs(cur_skins) do
  1483. local new_conf = self:GetFosterSubSkinConf(type_id, cur_value.id, cur_value.star)
  1484. for key, old_conf in pairs(tab_data) do
  1485. if old_conf.skin_id == new_conf.skin_id then
  1486. tab_data[key] = new_conf
  1487. tab_data[key].display = cur_value.display
  1488. end
  1489. end
  1490. end
  1491. end
  1492. for key, conf in pairs(tab_data) do
  1493. conf.display = conf.display == nil and 0 or conf.display
  1494. end
  1495. return tab_data
  1496. end
  1497. -- 默认获取当前显示皮肤配置
  1498. function FosterModel:GetShowSubSkinConf(type_id, skin_id, star)
  1499. local res = nil
  1500. if type_id then
  1501. if not skin_id then
  1502. local basic = self:GetFosterSubSkinData(type_id)
  1503. -- local conf = self:GetFosterSubSkinConf(type_id)
  1504. if basic and basic.skins then
  1505. for key, value in pairs(basic.skins) do
  1506. if value.display ~= 0 then
  1507. skin_id = value.id
  1508. star = value.star
  1509. break
  1510. end
  1511. end
  1512. else
  1513. local name_str = ""
  1514. if type_id == 5 then
  1515. name_str = "AI希亚"
  1516. elseif type_id == 6 then
  1517. name_str = "光子磁炮"
  1518. elseif type_id == 7 then
  1519. name_str = "光子星翼"
  1520. elseif type_id == 8 then
  1521. name_str = "光子幻甲"
  1522. end
  1523. return {skin_id = 1000, name=name_str}
  1524. end
  1525. end
  1526. skin_id = skin_id or 1001
  1527. star = star or 0
  1528. return Config.Fostersubskin[type_id .. "@" .. skin_id .. "@" .. star]
  1529. end
  1530. end
  1531. -- 使用物品弹窗走这里
  1532. function FosterModel:CanSkinUse(new_goods_vo)
  1533. local goods_id = new_goods_vo.type_id
  1534. local goods_num = new_goods_vo.goods_num
  1535. local type_id = new_goods_vo.subtype - 1
  1536. local show_list = self:GetCurSkinTabData(type_id)
  1537. for _, conf in pairs(show_list) do
  1538. local cost = stringtotable(conf.cost_material)
  1539. if cost and cost[1] and cost[1][2] == goods_id and tonumber(cost[1][3]) <= goods_num then
  1540. return true
  1541. end
  1542. end
  1543. return false
  1544. end
  1545. -- 获取皮肤红点
  1546. function FosterModel:CanSkinActOrUp(check_new, type_id)
  1547. if not check_new then
  1548. return self.red_skin[type_id]
  1549. end
  1550. self.red_skin[type_id] = false
  1551. if type_id then
  1552. local show_list = self:GetCurSkinTabData(type_id)
  1553. for _, conf in pairs(show_list) do
  1554. if self:CanSkinActOrUpById(type_id, conf.skin_id, conf.star) then
  1555. self.red_skin[type_id] = true
  1556. break
  1557. end
  1558. end
  1559. end
  1560. return self.red_skin[type_id]
  1561. end
  1562. function FosterModel:CanSkinActOrUpById(type_id, skin_id, star)
  1563. if type_id and skin_id and star then
  1564. local conf = self:GetShowSubSkinConf(type_id, skin_id, star)
  1565. local cost_info = stringtotable(conf.cost_material)
  1566. if cost_info[1] then
  1567. local have = GoodsModel:getInstance():GetTypeGoodsNum(cost_info[1][2])
  1568. return have >= tonumber(cost_info[1][3])
  1569. else
  1570. return false
  1571. end
  1572. end
  1573. return false
  1574. end
  1575. function FosterModel:CanSkinAct(type_id, skin_id, star)
  1576. if type_id and skin_id and star == 0 then
  1577. local conf = self:GetShowSubSkinConf(type_id, skin_id, star)
  1578. local cost_info = stringtotable(conf.cost_material)
  1579. if cost_info[1] then
  1580. local have = GoodsModel:getInstance():GetTypeGoodsNum(cost_info[1][2])
  1581. return have >= tonumber(cost_info[1][3])
  1582. else
  1583. return false
  1584. end
  1585. end
  1586. return false
  1587. end
  1588. function FosterModel:CanSkinUp(type_id, skin_id, star)
  1589. if type_id and skin_id and star ~= 0 then
  1590. local conf = self:GetShowSubSkinConf(type_id, skin_id, star)
  1591. local cost_info = stringtotable(conf.cost_material)
  1592. if cost_info[1] then
  1593. local have = GoodsModel:getInstance():GetTypeGoodsNum(cost_info[1][2])
  1594. return have >= tonumber(cost_info[1][3])
  1595. else
  1596. return false
  1597. end
  1598. end
  1599. return false
  1600. end
  1601. function FosterModel:GetFosterSubSkinConfByMat(type_id, mat_id)
  1602. if type_id and mat_id then
  1603. local conf_list = self:GetFosterSubSkinConf(type_id)
  1604. for key, value in pairs(conf_list) do
  1605. local cost = stringtotable(value.cost_material)
  1606. if cost and tonumber(cost[1][2]) == tonumber(mat_id) then
  1607. return value
  1608. end
  1609. end
  1610. end
  1611. end
  1612. --获取当前穿戴的皮肤
  1613. function FosterModel:GetCurrentFosterSkin(type_id)
  1614. local role_vo = RoleManager.Instance.mainRoleInfo
  1615. if role_vo and role_vo.foster_sub_skin_list and role_vo.foster_skin_list then
  1616. for k,v in pairs(role_vo.foster_skin_list) do
  1617. if v.type_id == type_id and v.skin_id > 0 and v.star > 0 then
  1618. return v.skin_id
  1619. end
  1620. end
  1621. for k,v in pairs(role_vo.foster_sub_skin_list) do
  1622. if v.type_id == type_id and v.skin_id > 0 and v.star > 0 then
  1623. return v.skin_id
  1624. end
  1625. end
  1626. end
  1627. return 0
  1628. end
  1629. -- 获取当前进阶系统是否为强进阶类型
  1630. function FosterModel:GetIsStrongFoster(type_id)
  1631. if not type_id then
  1632. return false
  1633. end
  1634. return type_id < FosterConst.ModuleId.FJarvis
  1635. end
  1636. --计算核心加成属性战力
  1637. --module_type模型类型
  1638. --进阶阶级
  1639. --进阶星级
  1640. --进阶丹类型
  1641. --[转换进阶丹属性]
  1642. function FosterModel:MathFosterKernelFighting( module_type,grade,star,kernel_type )--221
  1643. local data = self:GetBaseConfOne( module_type,grade,star )
  1644. local base_attr = stringtotable(data.attrs)--进阶基础属性
  1645. --------------------------进阶丹属性
  1646. local all_kernel_list = {}
  1647. local kernel_attr = nil--增加的进阶丹属性
  1648. local conf_list = self:GetKernelConf(module_type)
  1649. for key, value in pairs(conf_list) do
  1650. local cur_use_num = self:GetKernelUseNum(module_type, value.kind)--某丹使用数量
  1651. local attr_temp = stringtotable(value.ext)--单丹属性
  1652. if kernel_type + 1 == key then
  1653. kernel_attr = DeepCopy(attr_temp)
  1654. end
  1655. for k,v in pairs(attr_temp) do
  1656. attr_temp[k][2] = attr_temp[k][2] * cur_use_num
  1657. end
  1658. all_kernel_list = CombineAttrList( all_kernel_list, attr_temp )
  1659. end
  1660. local base_temp_attr = {}--合起来的基础总属性
  1661. local percent_attr = 0
  1662. for i,v in ipairs(base_attr) do--把基础属性都合起来
  1663. if v[1] ~= 20 and v[1] ~= 52 and v[1] ~= 55 and v[1] ~= 53 then--总生命/爆伤加成/会心伤害
  1664. if v[2] > 0 then
  1665. if not base_temp_attr[v[1]] then
  1666. base_temp_attr[v[1]] = {v[1],v[2]}
  1667. else
  1668. base_temp_attr[v[1]] = {v[1],v[2] + base_temp_attr[v[1]][2]}
  1669. end
  1670. end
  1671. end
  1672. end
  1673. for i,v in ipairs(all_kernel_list) do--把基础属性都合起来
  1674. if v[1] == 68 then
  1675. percent_attr = v[2]/10000
  1676. else
  1677. if v[2] > 0 then
  1678. if not base_temp_attr[v[1]] then
  1679. base_temp_attr[v[1]] = {v[1],v[2]}
  1680. else
  1681. base_temp_attr[v[1]] = {v[1],v[2] + base_temp_attr[v[1]][2]}
  1682. end
  1683. end
  1684. end
  1685. end
  1686. local base_sum_attr = {}
  1687. for i,v in pairs(base_temp_attr) do
  1688. base_sum_attr[#base_sum_attr + 1] = v
  1689. end
  1690. --上面先算原本的战力
  1691. --接下来算这个进阶丹的战力
  1692. local new_temp_attr = {}
  1693. local new_percent_attr = 0
  1694. for i,v in ipairs(kernel_attr) do
  1695. if v[1] == 68 then
  1696. new_percent_attr = v[2]/10000
  1697. else
  1698. if v[2] > 0 then
  1699. if not new_temp_attr[v[1]] then
  1700. new_temp_attr[v[1]] = {v[1],v[2]}
  1701. else
  1702. new_temp_attr[v[1]] = {v[1],v[2] + new_temp_attr[v[1]][2]}
  1703. end
  1704. end
  1705. end
  1706. end
  1707. local kernel_attr = {}
  1708. for i,v in pairs(new_temp_attr) do
  1709. kernel_attr[#kernel_attr + 1] = v
  1710. end
  1711. if new_percent_attr == 0 then--没有加成属性就随便算
  1712. for i,v in ipairs(kernel_attr) do
  1713. v[2] = v[2]*(1+percent_attr)
  1714. end
  1715. return GetFighting(kernel_attr,false)--已拥有填true
  1716. end
  1717. local new_sum_attr = CombineAttrList( DeepCopy(base_sum_attr), kernel_attr )
  1718. for i,v in pairs(new_sum_attr) do--这里把合成的总属性算出来
  1719. v[2] = v[2]*(1 + new_percent_attr + percent_attr)
  1720. end
  1721. for i,v in pairs(base_sum_attr) do--基础的属性也算上加成
  1722. v[2] = v[2]*(1+percent_attr)
  1723. end
  1724. local final_attr = GetAttributeOffset2(base_sum_attr,new_sum_attr)--获得属性差值 四舍五入转化战力
  1725. for i,v in ipairs(final_attr) do
  1726. v[2] = round(v[2])
  1727. end
  1728. -- print("huangcong:FosterModel [start:1865] :", final_attr)
  1729. -- PrintTable(final_attr)
  1730. -- print("huangcong:FosterModel [end]")
  1731. local new_fighting = GetFighting(final_attr,false)--已拥有填true
  1732. return new_fighting
  1733. end