源战役客户端
Non puoi selezionare più di 25 argomenti Gli argomenti devono iniziare con una lettera o un numero, possono includere trattini ('-') e possono essere lunghi fino a 35 caratteri.
 
 
 
 
 

383 righe
12 KiB

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