|
|
- SoulPowerModel = SoulPowerModel or BaseClass(BaseVo, true)
- local SoulPowerModel = SoulPowerModel
-
- function SoulPowerModel:__init()
- SoulPowerModel.Instance = self
- self:Reset()
- end
-
- function SoulPowerModel:getInstance()
- if SoulPowerModel.Instance == nil then
- SoulPowerModel.Instance = SoulPowerModel.New()
- end
- return SoulPowerModel.Instance
- end
-
- function SoulPowerModel:Reset()
- self.soul_power_grade = 0--当前的魂力阶数
- self.soul_power_lv = -1--当前的魂力层数
- self.soul_power_power = 0--当前的魂力总战力
- self.soul_power_time_head = 0--当前阶数开始计时的时间头
- self.soul_power_time_tail = 0--当前阶数到达最大层数可突破的时间尾
-
- self.soul_power_energy = 0--当前能量
-
- self.soul_power_lv_cfg = {}--魂力系统表 |时间消耗、属性加成
- self.soul_power_grade_cfg = {}--魂力阶段表 |绑定技能、突破条件(1,玩家等级,2爬塔副本层数)
- self.soul_power_hp_resume_cfg = {}--特殊技能回血配置
-
-
- self.soul_power_can_strength = false--是否可以直达最后一级
- self.soul_power_can_up_grade = false--是否可以突破
-
- self.soul_power_red_dot_info = {}--红点
-
- self:InitCfg()
- end
-
- ---------------------------配置start
- function SoulPowerModel:InitCfg( )
- --魂力系统表
- for k,v in pairs(Config.Uraniumlv) do
- self.soul_power_lv_cfg[v.grade] = self.soul_power_lv_cfg[v.grade] or {}
- table.insert(self.soul_power_lv_cfg[v.grade], v)
- end
-
- for k,v in pairs(self.soul_power_lv_cfg) do
- local function onSortFunction(v1, v2)
- return v1.lv < v2.lv
- end
- table.sort(v, onSortFunction)
- end
-
- --魂力阶段表
- for k,v in pairs(Config.Uraniumgrade) do
- self.soul_power_grade_cfg[v.grade] = v
- end
-
- for k,v in pairs(Config.Hpresume) do
- if self.soul_power_hp_resume_cfg[v.skill_level] then
- if v.hp_resume > self.soul_power_hp_resume_cfg[v.skill_level] then
- self.soul_power_hp_resume_cfg[v.skill_level] = v.hp_resume
- end
- else
- self.soul_power_hp_resume_cfg[v.skill_level] = v.hp_resume
- end
- end
- end
-
- --获取回血配置当前等级最大回血量
- function SoulPowerModel:GetSoulPowerHpResumeCfg(skill_lv)
- return self.soul_power_hp_resume_cfg[skill_lv] or nil
- end
-
- --根据阶数获取当前阶的魂力配置
- function SoulPowerModel:GetSoulPowerLvCfgByGrade(grade)
- return self.soul_power_lv_cfg[grade] or nil
- end
-
- --获取当前阶数的最大层数
- function SoulPowerModel:GetSoulPowerMaxLv(grade)
- if self.soul_power_lv_cfg[grade] then
- local len = #self.soul_power_lv_cfg[grade]
- return self.soul_power_lv_cfg[grade][len].lv
- end
- return 0
- end
-
- --根据阶数和等级获取魂力配置
- function SoulPowerModel:GetSoulPowerLvCfgByGradeLv(grade, lv)
- if self.soul_power_lv_cfg[grade] then
- for k,v in pairs(self.soul_power_lv_cfg[grade]) do
- if v.lv == lv then
- return v
- end
- end
-
- end
- return nil
- end
-
- --根据阶数获取魂力阶段配置
- function SoulPowerModel:GetSoulPowerGradeCfgByGrade(grade)
- return self.soul_power_grade_cfg[grade] or nil
- end
-
- --获取消耗道具id
- function SoulPowerModel:GetMaterialGoodsId( )
- local cfg = stringtotable(Config.Uraniumkv["material_use"].val_content)
- return cfg[1][1]
- end
-
- --获取道具每次充能所提供的能量
- function SoulPowerModel:GetMaterialCanGetEnergy( )
- local cfg = stringtotable(Config.Uraniumkv["material_use"].val_content)
- return cfg[1][2]
- end
- ---------------------------配置end
-
- ---------------------------协议start
- --保存魂力系统基础信息 14400
- function SoulPowerModel:SetSoulPowerBaseData(vo)
- if self.soul_power_lv > -1 and self.soul_power_lv < vo.lv then
- self.need_show_attr_up_effect = true
- end
- self.soul_power_grade = vo.grade
- self.soul_power_lv = vo.lv
- self.soul_power_power = vo.power
- self.soul_power_time_head = vo.time_head or 0
- self.soul_power_time_tail = vo.time_tail or 0
- self.soul_power_energy = vo.energy or 0
-
- -- self:CountDownSoulPowerTime()
- end
-
- --获取当前阶数和层数
- function SoulPowerModel:GetSoulPowerNowGradeLv( )
- return self.soul_power_grade, self.soul_power_lv
- end
-
- --获取当前战力
- function SoulPowerModel:GetSoulPowerNowPower( )
- return self.soul_power_power
- end
-
- --获取当前阶数的时间头时间尾
- function SoulPowerModel:GetSoulPowerTimeHeadTail( )
- return self.soul_power_time_head, self.soul_power_time_tail
- end
-
- --获取当前的能量
- function SoulPowerModel:GetSoulPowerNowEnergy( )
- return self.soul_power_energy
- end
-
-
-
- ---------------------------协议end
-
- --检测材料物品数量变更
- function SoulPowerModel:CheckMaterialGoodsNum( )
- self:Fire(SoulPowerConst.UPDATE_SP_GOODS_NUM)
- end
-
- ---------------------------红点start
- function SoulPowerModel:IsNeedRedAll( )
- for k,v in pairs(SoulPowerConst.RedType) do
- self:IsNeedRed(v)
- end
- end
-
- function SoulPowerModel:IsNeedRed(red_type)
- local bool = false
- if red_type == SoulPowerConst.RedType.Activate then
- bool = self:CheckActivateRed()
- self:Fire(SoulPowerConst.REMIND_SOUL_POWER_CAN_STRENGTHEN, self.soul_power_can_strength)
- elseif red_type == SoulPowerConst.RedType.UpGrade then
- bool = self:CheckUpGradeRed()
- --通知变强 可以魂力突破
- self.soul_power_can_up_grade = bool
- self:Fire(SoulPowerConst.REMIND_SOUL_POWER_CAN_UP_GRADE, self.soul_power_can_up_grade)
- end
- self.soul_power_red_dot_info[red_type] = bool
- end
-
- -- function SoulPowerModel:CheckActivateRed( )
- -- local bool = false
- -- self.soul_power_can_strength = false
- -- if not GetModuleIsOpen(144) then return false end
-
- -- local sp_grade, sp_lv = self:GetSoulPowerNowGradeLv()
- -- if sp_lv == self:GetSoulPowerMaxLv(sp_grade) then return false end
-
- -- local time_head, time_tail = self:GetSoulPowerTimeHeadTail()
- -- local next_lv_total_time = self:GetSoulPowerNextLvNeedTotalTime(sp_grade, sp_lv)
- -- local left_time = time_tail - next_lv_total_time - TimeUtil:getServerTime()
- -- if left_time <= 0 then
- -- bool = true
- -- end
-
- -- --判断是否可以直达这轮的最后一个魂力等级,是的话要发事件提醒变强
- -- if time_tail <= TimeUtil:getServerTime() then
- -- self.soul_power_can_strength = true
- -- end
-
- -- return bool
- -- end
-
- function SoulPowerModel:CheckActivateRed( )
- local bool = false
- self.soul_power_can_strength = false
- if not GetModuleIsOpen(144) then return false end
- local sp_grade, sp_lv = self:GetSoulPowerNowGradeLv()
- if sp_lv == self:GetSoulPowerMaxLv(sp_grade) then return false end
-
- local cost_goods_id = self:GetMaterialGoodsId()
- local goods_num = GoodsModel:getInstance():GetTypeGoodsNum(cost_goods_id)
- if goods_num > 0 then
- bool = true
-
- local lv_cfg = self:GetSoulPowerLvCfgByGradeLv(sp_grade,sp_lv)
- local need_energy = lv_cfg and lv_cfg.energy or 0
- local now_energy = self:GetSoulPowerNowEnergy()
- local left_energy = need_energy-now_energy
- charge_num = left_energy/self:GetMaterialCanGetEnergy()
- if goods_num >= charge_num then
- self.soul_power_can_strength = true
- end
- end
-
- return bool
- end
-
- --是否可以直达这轮最后一个魂力等级(变强)
- function SoulPowerModel:GetSoulPowerCanGoFinalLv( )
- return self.soul_power_can_strength
- end
-
- --是否可以魂力突破(变强)
- function SoulPowerModel:GetSoulPOwerCanUpGrade( )
- return self.soul_power_can_up_grade
- end
-
- function SoulPowerModel:CheckUpGradeRed( )
- local bool = false
- if not GetModuleIsOpen(144) then return false end
-
- local sp_grade, sp_lv = self:GetSoulPowerNowGradeLv()
- if sp_lv ~= self:GetSoulPowerMaxLv(sp_grade) then return false end
-
- local sp_grade_condition_cfg = self:GetSoulPowerGradeCfgByGrade(sp_grade)
- local condition_data = sp_grade_condition_cfg and stringtotable(sp_grade_condition_cfg.condition) or nil
- if not condition_data or #condition_data == 0 then return false end
- local next_sp_grade_condition_cfg = self:GetSoulPowerGradeCfgByGrade(sp_grade+1)
- if not next_sp_grade_condition_cfg then return false end
- local can_up_grade = true
- for i,v in ipairs(condition_data) do
- local is_arrive = false
- if v[1] == SoulPowerConst.UpGradeConditionType.Lv then
- is_arrive = RoleManager.Instance.mainRoleInfo.level >= v[2]
- elseif v[1] == SoulPowerConst.UpGradeConditionType.DunTower then
- local easy_pass_num,diffcult_pass_num = BaseDungeonModel:getInstance():GetOneTowerPassRecord()
- is_arrive = easy_pass_num >= v[2]
- elseif v[1] == SoulPowerConst.UpGradeConditionType.Power then
- is_arrive = RoleManager.Instance.mainRoleInfo.fighting >= v[2]
- elseif v[1] == SoulPowerConst.UpGradeConditionType.DunExp then
- local cur_assult_wave = ExpDunModel:getInstance():GetCurrentWave()
- is_arrive = cur_assult_wave >= v[2]
- elseif v[1] == SoulPowerConst.UpGradeConditionType.WarSoulStar then
- local star_sum_num = WarSoulModel:getInstance():GetAllWarSoulSumStar()
- is_arrive = star_sum_num >= v[2]
- end
- if not is_arrive then
- can_up_grade = false
- break
- end
- end
- bool = can_up_grade
- return bool
- end
-
- function SoulPowerModel:GetAllRedDot( )
- return self.soul_power_red_dot_info
- end
-
- function SoulPowerModel:IsSoulPowerRed( )
- local bool = false
- for k,v in pairs(self.soul_power_red_dot_info) do
- if v then
- bool = true
- break
- end
- end
- return bool
- end
-
- ---------------------------红点end
-
- --获取当前的魂力战力
- function SoulPowerModel:GetSoulPowerNowFight(grade, lv)
- local fight_value = 0
- local cfg = self:GetSoulPowerLvCfgByGradeLv(grade, lv)
- if cfg then
- local attr_list = stringtotable(cfg.attrs)
- fight_value = GetFighting(attr_list,true)
- end
- return fight_value
- end
-
- --魂力升到下一层将能提升的战力 参数:当前阶数 当前层数
- function SoulPowerModel:GetSoulPowerNextUpLvFight(grade, lv)
- local now_fight = self:GetSoulPowerNowFight(grade, lv)
- local add_fight = 0
- local next_cfg = self:GetSoulPowerLvCfgByGradeLv(grade, lv+1)
- if next_cfg then
- local next_attr_list = stringtotable(next_cfg.attrs)
- local next_fight_value = GetFighting(next_attr_list,true)
- add_fight = next_fight_value - now_fight
- end
- return add_fight
- end
-
- -- --魂力升级倒计时
- -- function SoulPowerModel:CountDownSoulPowerTime( )
- -- self:StopSoulPowerTimer()
- -- local function checkTime()
- -- --用时间尾减去当前时间,判断还有多久到达最高层
- -- self.soul_up_grade_left_time = self.soul_power_time_tail - TimeUtil:getServerTime()
- -- self:Fire(SoulPowerConst.UPDATE_SOUL_POWER_LEFT_TIME)
-
- -- --红点持续监测
- -- local sp_grade, sp_lv = self:GetSoulPowerNowGradeLv()
- -- local time_head, time_tail = self:GetSoulPowerTimeHeadTail()
- -- local next_lv_total_time = self:GetSoulPowerNextLvNeedTotalTime(sp_grade, sp_lv)
- -- local left_time = time_tail - next_lv_total_time - TimeUtil:getServerTime()
- -- if left_time == 0 then
- -- self:Fire(SoulPowerConst.UPDATE_RED_DOT, SoulPowerConst.RedType.Activate)
- -- end
- -- --到达最后时间点时也判断一下
- -- if time_tail == TimeUtil:getServerTime() then
- -- self:Fire(SoulPowerConst.UPDATE_RED_DOT, SoulPowerConst.RedType.Activate)
- -- end
- -- end
- -- checkTime()
- -- local function onTimer()
- -- checkTime()
- -- if self.soul_up_grade_left_time <= 0 then
- -- self:StopSoulPowerTimer()
- -- end
- -- end
- -- if self.soul_power_timer_id == nil then
- -- if self.soul_up_grade_left_time > 0 then
- -- self.soul_power_timer_id = GlobalTimerQuest:AddPeriodQuest(onTimer, 1, -1)
- -- end
- -- end
-
- -- end
-
- -- function SoulPowerModel:StopSoulPowerTimer( )
- -- self.soul_up_grade_left_time = 0
- -- if self.soul_power_timer_id then
- -- GlobalTimerQuest:CancelQuest(self.soul_power_timer_id)
- -- self.soul_power_timer_id = nil
- -- end
- -- end
-
- -- --升到下一层后还差多久到最高层
- -- function SoulPowerModel:GetSoulPowerNextLvNeedTotalTime(grade, lv)
- -- local this_lv_total_time = self:GetSoulPowerLvCfgByGradeLv(grade, lv) and self:GetSoulPowerLvCfgByGradeLv(grade, lv).total or 0
- -- local max_lv = self:GetSoulPowerMaxLv(grade)
- -- local max_lv_total_time = self:GetSoulPowerLvCfgByGradeLv(grade, max_lv) and self:GetSoulPowerLvCfgByGradeLv(grade, max_lv).total or 0
- -- return max_lv_total_time - this_lv_total_time
- -- end
-
- function SoulPowerModel:UpdateChangePower(force)
- local function refresh_func()
- self:Fire(SoulPowerConst.UPDATE_RED_DOT, SoulPowerConst.RedType.UpGrade)
- end
- if force then
- refresh_func()
- else
- TimeManager.GetInstance():StartTime("SoulPowerModel_UpdateChangePower", 5, refresh_func)
- end
- end
|