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