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

382 rivejä
12 KiB

4 viikkoa sitten
  1. SoulPowerModel = SoulPowerModel or BaseClass(BaseVo, true)
  2. local SoulPowerModel = SoulPowerModel
  3. function SoulPowerModel:__init()
  4. SoulPowerModel.Instance = self
  5. self:Reset()
  6. end
  7. function SoulPowerModel:getInstance()
  8. if SoulPowerModel.Instance == nil then
  9. SoulPowerModel.Instance = SoulPowerModel.New()
  10. end
  11. return SoulPowerModel.Instance
  12. end
  13. function SoulPowerModel:Reset()
  14. self.soul_power_grade = 0--当前的魂力阶数
  15. self.soul_power_lv = -1--当前的魂力层数
  16. self.soul_power_power = 0--当前的魂力总战力
  17. self.soul_power_time_head = 0--当前阶数开始计时的时间头
  18. self.soul_power_time_tail = 0--当前阶数到达最大层数可突破的时间尾
  19. self.soul_power_energy = 0--当前能量
  20. self.soul_power_lv_cfg = {}--魂力系统表 |时间消耗、属性加成
  21. self.soul_power_grade_cfg = {}--魂力阶段表 |绑定技能、突破条件(1,玩家等级,2爬塔副本层数)
  22. self.soul_power_hp_resume_cfg = {}--特殊技能回血配置
  23. self.soul_power_can_strength = false--是否可以直达最后一级
  24. self.soul_power_can_up_grade = false--是否可以突破
  25. self.soul_power_red_dot_info = {}--红点
  26. self:InitCfg()
  27. end
  28. ---------------------------配置start
  29. function SoulPowerModel:InitCfg( )
  30. --魂力系统表
  31. for k,v in pairs(Config.Uraniumlv) do
  32. self.soul_power_lv_cfg[v.grade] = self.soul_power_lv_cfg[v.grade] or {}
  33. table.insert(self.soul_power_lv_cfg[v.grade], v)
  34. end
  35. for k,v in pairs(self.soul_power_lv_cfg) do
  36. local function onSortFunction(v1, v2)
  37. return v1.lv < v2.lv
  38. end
  39. table.sort(v, onSortFunction)
  40. end
  41. --魂力阶段表
  42. for k,v in pairs(Config.Uraniumgrade) do
  43. self.soul_power_grade_cfg[v.grade] = v
  44. end
  45. for k,v in pairs(Config.Hpresume) do
  46. if self.soul_power_hp_resume_cfg[v.skill_level] then
  47. if v.hp_resume > self.soul_power_hp_resume_cfg[v.skill_level] then
  48. self.soul_power_hp_resume_cfg[v.skill_level] = v.hp_resume
  49. end
  50. else
  51. self.soul_power_hp_resume_cfg[v.skill_level] = v.hp_resume
  52. end
  53. end
  54. end
  55. --获取回血配置当前等级最大回血量
  56. function SoulPowerModel:GetSoulPowerHpResumeCfg(skill_lv)
  57. return self.soul_power_hp_resume_cfg[skill_lv] or nil
  58. end
  59. --根据阶数获取当前阶的魂力配置
  60. function SoulPowerModel:GetSoulPowerLvCfgByGrade(grade)
  61. return self.soul_power_lv_cfg[grade] or nil
  62. end
  63. --获取当前阶数的最大层数
  64. function SoulPowerModel:GetSoulPowerMaxLv(grade)
  65. if self.soul_power_lv_cfg[grade] then
  66. local len = #self.soul_power_lv_cfg[grade]
  67. return self.soul_power_lv_cfg[grade][len].lv
  68. end
  69. return 0
  70. end
  71. --根据阶数和等级获取魂力配置
  72. function SoulPowerModel:GetSoulPowerLvCfgByGradeLv(grade, lv)
  73. if self.soul_power_lv_cfg[grade] then
  74. for k,v in pairs(self.soul_power_lv_cfg[grade]) do
  75. if v.lv == lv then
  76. return v
  77. end
  78. end
  79. end
  80. return nil
  81. end
  82. --根据阶数获取魂力阶段配置
  83. function SoulPowerModel:GetSoulPowerGradeCfgByGrade(grade)
  84. return self.soul_power_grade_cfg[grade] or nil
  85. end
  86. --获取消耗道具id
  87. function SoulPowerModel:GetMaterialGoodsId( )
  88. local cfg = stringtotable(Config.Uraniumkv["material_use"].val_content)
  89. return cfg[1][1]
  90. end
  91. --获取道具每次充能所提供的能量
  92. function SoulPowerModel:GetMaterialCanGetEnergy( )
  93. local cfg = stringtotable(Config.Uraniumkv["material_use"].val_content)
  94. return cfg[1][2]
  95. end
  96. ---------------------------配置end
  97. ---------------------------协议start
  98. --保存魂力系统基础信息 14400
  99. function SoulPowerModel:SetSoulPowerBaseData(vo)
  100. if self.soul_power_lv > -1 and self.soul_power_lv < vo.lv then
  101. self.need_show_attr_up_effect = true
  102. end
  103. self.soul_power_grade = vo.grade
  104. self.soul_power_lv = vo.lv
  105. self.soul_power_power = vo.power
  106. self.soul_power_time_head = vo.time_head or 0
  107. self.soul_power_time_tail = vo.time_tail or 0
  108. self.soul_power_energy = vo.energy or 0
  109. -- self:CountDownSoulPowerTime()
  110. end
  111. --获取当前阶数和层数
  112. function SoulPowerModel:GetSoulPowerNowGradeLv( )
  113. return self.soul_power_grade, self.soul_power_lv
  114. end
  115. --获取当前战力
  116. function SoulPowerModel:GetSoulPowerNowPower( )
  117. return self.soul_power_power
  118. end
  119. --获取当前阶数的时间头时间尾
  120. function SoulPowerModel:GetSoulPowerTimeHeadTail( )
  121. return self.soul_power_time_head, self.soul_power_time_tail
  122. end
  123. --获取当前的能量
  124. function SoulPowerModel:GetSoulPowerNowEnergy( )
  125. return self.soul_power_energy
  126. end
  127. ---------------------------协议end
  128. --检测材料物品数量变更
  129. function SoulPowerModel:CheckMaterialGoodsNum( )
  130. self:Fire(SoulPowerConst.UPDATE_SP_GOODS_NUM)
  131. end
  132. ---------------------------红点start
  133. function SoulPowerModel:IsNeedRedAll( )
  134. for k,v in pairs(SoulPowerConst.RedType) do
  135. self:IsNeedRed(v)
  136. end
  137. end
  138. function SoulPowerModel:IsNeedRed(red_type)
  139. local bool = false
  140. if red_type == SoulPowerConst.RedType.Activate then
  141. bool = self:CheckActivateRed()
  142. self:Fire(SoulPowerConst.REMIND_SOUL_POWER_CAN_STRENGTHEN, self.soul_power_can_strength)
  143. elseif red_type == SoulPowerConst.RedType.UpGrade then
  144. bool = self:CheckUpGradeRed()
  145. --通知变强 可以魂力突破
  146. self.soul_power_can_up_grade = bool
  147. self:Fire(SoulPowerConst.REMIND_SOUL_POWER_CAN_UP_GRADE, self.soul_power_can_up_grade)
  148. end
  149. self.soul_power_red_dot_info[red_type] = bool
  150. end
  151. -- function SoulPowerModel:CheckActivateRed( )
  152. -- local bool = false
  153. -- self.soul_power_can_strength = false
  154. -- if not GetModuleIsOpen(144) then return false end
  155. -- local sp_grade, sp_lv = self:GetSoulPowerNowGradeLv()
  156. -- if sp_lv == self:GetSoulPowerMaxLv(sp_grade) then return false end
  157. -- local time_head, time_tail = self:GetSoulPowerTimeHeadTail()
  158. -- local next_lv_total_time = self:GetSoulPowerNextLvNeedTotalTime(sp_grade, sp_lv)
  159. -- local left_time = time_tail - next_lv_total_time - TimeUtil:getServerTime()
  160. -- if left_time <= 0 then
  161. -- bool = true
  162. -- end
  163. -- --判断是否可以直达这轮的最后一个魂力等级,是的话要发事件提醒变强
  164. -- if time_tail <= TimeUtil:getServerTime() then
  165. -- self.soul_power_can_strength = true
  166. -- end
  167. -- return bool
  168. -- end
  169. function SoulPowerModel:CheckActivateRed( )
  170. local bool = false
  171. self.soul_power_can_strength = false
  172. if not GetModuleIsOpen(144) then return false end
  173. local sp_grade, sp_lv = self:GetSoulPowerNowGradeLv()
  174. if sp_lv == self:GetSoulPowerMaxLv(sp_grade) then return false end
  175. local cost_goods_id = self:GetMaterialGoodsId()
  176. local goods_num = GoodsModel:getInstance():GetTypeGoodsNum(cost_goods_id)
  177. if goods_num > 0 then
  178. bool = true
  179. local lv_cfg = self:GetSoulPowerLvCfgByGradeLv(sp_grade,sp_lv)
  180. local need_energy = lv_cfg and lv_cfg.energy or 0
  181. local now_energy = self:GetSoulPowerNowEnergy()
  182. local left_energy = need_energy-now_energy
  183. charge_num = left_energy/self:GetMaterialCanGetEnergy()
  184. if goods_num >= charge_num then
  185. self.soul_power_can_strength = true
  186. end
  187. end
  188. return bool
  189. end
  190. --是否可以直达这轮最后一个魂力等级(变强)
  191. function SoulPowerModel:GetSoulPowerCanGoFinalLv( )
  192. return self.soul_power_can_strength
  193. end
  194. --是否可以魂力突破(变强)
  195. function SoulPowerModel:GetSoulPOwerCanUpGrade( )
  196. return self.soul_power_can_up_grade
  197. end
  198. function SoulPowerModel:CheckUpGradeRed( )
  199. local bool = false
  200. if not GetModuleIsOpen(144) then return false end
  201. local sp_grade, sp_lv = self:GetSoulPowerNowGradeLv()
  202. if sp_lv ~= self:GetSoulPowerMaxLv(sp_grade) then return false end
  203. local sp_grade_condition_cfg = self:GetSoulPowerGradeCfgByGrade(sp_grade)
  204. local condition_data = sp_grade_condition_cfg and stringtotable(sp_grade_condition_cfg.condition) or nil
  205. if not condition_data or #condition_data == 0 then return false end
  206. local next_sp_grade_condition_cfg = self:GetSoulPowerGradeCfgByGrade(sp_grade+1)
  207. if not next_sp_grade_condition_cfg then return false end
  208. local can_up_grade = true
  209. for i,v in ipairs(condition_data) do
  210. local is_arrive = false
  211. if v[1] == SoulPowerConst.UpGradeConditionType.Lv then
  212. is_arrive = RoleManager.Instance.mainRoleInfo.level >= v[2]
  213. elseif v[1] == SoulPowerConst.UpGradeConditionType.DunTower then
  214. local easy_pass_num,diffcult_pass_num = BaseDungeonModel:getInstance():GetOneTowerPassRecord()
  215. is_arrive = easy_pass_num >= v[2]
  216. elseif v[1] == SoulPowerConst.UpGradeConditionType.Power then
  217. is_arrive = RoleManager.Instance.mainRoleInfo.fighting >= v[2]
  218. elseif v[1] == SoulPowerConst.UpGradeConditionType.DunExp then
  219. local cur_assult_wave = ExpDunModel:getInstance():GetCurrentWave()
  220. is_arrive = cur_assult_wave >= v[2]
  221. elseif v[1] == SoulPowerConst.UpGradeConditionType.WarSoulStar then
  222. local star_sum_num = WarSoulModel:getInstance():GetAllWarSoulSumStar()
  223. is_arrive = star_sum_num >= v[2]
  224. end
  225. if not is_arrive then
  226. can_up_grade = false
  227. break
  228. end
  229. end
  230. bool = can_up_grade
  231. return bool
  232. end
  233. function SoulPowerModel:GetAllRedDot( )
  234. return self.soul_power_red_dot_info
  235. end
  236. function SoulPowerModel:IsSoulPowerRed( )
  237. local bool = false
  238. for k,v in pairs(self.soul_power_red_dot_info) do
  239. if v then
  240. bool = true
  241. break
  242. end
  243. end
  244. return bool
  245. end
  246. ---------------------------红点end
  247. --获取当前的魂力战力
  248. function SoulPowerModel:GetSoulPowerNowFight(grade, lv)
  249. local fight_value = 0
  250. local cfg = self:GetSoulPowerLvCfgByGradeLv(grade, lv)
  251. if cfg then
  252. local attr_list = stringtotable(cfg.attrs)
  253. fight_value = GetFighting(attr_list,true)
  254. end
  255. return fight_value
  256. end
  257. --魂力升到下一层将能提升的战力 参数:当前阶数 当前层数
  258. function SoulPowerModel:GetSoulPowerNextUpLvFight(grade, lv)
  259. local now_fight = self:GetSoulPowerNowFight(grade, lv)
  260. local add_fight = 0
  261. local next_cfg = self:GetSoulPowerLvCfgByGradeLv(grade, lv+1)
  262. if next_cfg then
  263. local next_attr_list = stringtotable(next_cfg.attrs)
  264. local next_fight_value = GetFighting(next_attr_list,true)
  265. add_fight = next_fight_value - now_fight
  266. end
  267. return add_fight
  268. end
  269. -- --魂力升级倒计时
  270. -- function SoulPowerModel:CountDownSoulPowerTime( )
  271. -- self:StopSoulPowerTimer()
  272. -- local function checkTime()
  273. -- --用时间尾减去当前时间,判断还有多久到达最高层
  274. -- self.soul_up_grade_left_time = self.soul_power_time_tail - TimeUtil:getServerTime()
  275. -- self:Fire(SoulPowerConst.UPDATE_SOUL_POWER_LEFT_TIME)
  276. -- --红点持续监测
  277. -- local sp_grade, sp_lv = self:GetSoulPowerNowGradeLv()
  278. -- local time_head, time_tail = self:GetSoulPowerTimeHeadTail()
  279. -- local next_lv_total_time = self:GetSoulPowerNextLvNeedTotalTime(sp_grade, sp_lv)
  280. -- local left_time = time_tail - next_lv_total_time - TimeUtil:getServerTime()
  281. -- if left_time == 0 then
  282. -- self:Fire(SoulPowerConst.UPDATE_RED_DOT, SoulPowerConst.RedType.Activate)
  283. -- end
  284. -- --到达最后时间点时也判断一下
  285. -- if time_tail == TimeUtil:getServerTime() then
  286. -- self:Fire(SoulPowerConst.UPDATE_RED_DOT, SoulPowerConst.RedType.Activate)
  287. -- end
  288. -- end
  289. -- checkTime()
  290. -- local function onTimer()
  291. -- checkTime()
  292. -- if self.soul_up_grade_left_time <= 0 then
  293. -- self:StopSoulPowerTimer()
  294. -- end
  295. -- end
  296. -- if self.soul_power_timer_id == nil then
  297. -- if self.soul_up_grade_left_time > 0 then
  298. -- self.soul_power_timer_id = GlobalTimerQuest:AddPeriodQuest(onTimer, 1, -1)
  299. -- end
  300. -- end
  301. -- end
  302. -- function SoulPowerModel:StopSoulPowerTimer( )
  303. -- self.soul_up_grade_left_time = 0
  304. -- if self.soul_power_timer_id then
  305. -- GlobalTimerQuest:CancelQuest(self.soul_power_timer_id)
  306. -- self.soul_power_timer_id = nil
  307. -- end
  308. -- end
  309. -- --升到下一层后还差多久到最高层
  310. -- function SoulPowerModel:GetSoulPowerNextLvNeedTotalTime(grade, lv)
  311. -- local this_lv_total_time = self:GetSoulPowerLvCfgByGradeLv(grade, lv) and self:GetSoulPowerLvCfgByGradeLv(grade, lv).total or 0
  312. -- local max_lv = self:GetSoulPowerMaxLv(grade)
  313. -- local max_lv_total_time = self:GetSoulPowerLvCfgByGradeLv(grade, max_lv) and self:GetSoulPowerLvCfgByGradeLv(grade, max_lv).total or 0
  314. -- return max_lv_total_time - this_lv_total_time
  315. -- end
  316. function SoulPowerModel:UpdateChangePower(force)
  317. local function refresh_func()
  318. self:Fire(SoulPowerConst.UPDATE_RED_DOT, SoulPowerConst.RedType.UpGrade)
  319. end
  320. if force then
  321. refresh_func()
  322. else
  323. TimeManager.GetInstance():StartTime("SoulPowerModel_UpdateChangePower", 5, refresh_func)
  324. end
  325. end