源战役客户端
Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.
 
 
 
 
 

1878 rader
54 KiB

FosterModel = FosterModel or BaseClass(BaseVo, true)
local FosterModel = FosterModel
function FosterModel:__init()
FosterModel.Instance = self
self:Reset()
end
function FosterModel:Reset()
self:InitFosterOffSetCfg()
if self.clock_bless_id then
GlobalTimerQuest:CancelQuest(self.clock_bless_id)
self.clock_bless_id = nil
end
self.basic_info = {}
self.kernel_num_info = {} --核心已使用数量
self.view_tab_info = {}
self.skill_show_conf_list = {}
self.max_grade_star_info = {}
self.skill_conf_list = {}
self.equip_dic = {}--保存的装备目录
self:ResetSwallowSelect()
-------------------------
--红点部分
self.mask_upgrad_red = {}--升阶
self.mask_dressupgrade_red = {}--装备升级
self.red_canupgrade = {}
self.red_cankernel = {}
self.red_cankernel_all = {}
self.red_canskill = {}
self.red_candressnew = {}
self.red_candressup = {}
self.red_canupequip = {}
self.red_skin = {}
self.pet_fight_skill = false --AI娘战斗技能(大招)
self.pet_fight_skill_state = false --AI娘战斗技能(大招)激活状态
self.tip_bless_list = {}--祝福值提示倒计时
self.foster_assist_flag_data = {} -- 进阶助战状态数据
self.foster_assist_red = {} -- 进阶助战红点
self.foster_first_advance = false
end
function FosterModel:GetInstance()
if FosterModel.Instance == nil then
FosterModel.Instance = FosterModel.New()
end
return FosterModel.Instance
end
function FosterModel.getInstance()
if FosterModel.Instance == nil then
FosterModel.Instance = FosterModel.New()
end
return FosterModel.Instance
end
--进阶位置偏移配置,需要初始化
function FosterModel:InitFosterOffSetCfg( )
for k,v in pairs(FosterConst.ModelShowConfig) do
for kk,vv in pairs(v) do
if (not vv.has_init) and vv.copy_model_list then
vv.has_init = true
for a,b in pairs(vv.copy_model_list) do
v[b] = vv
end
end
end
end
end
function FosterModel:GetCanUseEquipByType( type_id )
if not type_id then return end
return type_id == FosterConst.ModuleId.FHorse or type_id == FosterConst.ModuleId.FJarvis
end
--基础系统信息
function FosterModel:GetBasicInfo( type_id )
if type_id then
return self.basic_info[type_id]
else
return self.basic_info
end
end
function FosterModel:SetBasicInfo( type_id,value )
-------------------------
--给装备加多个类型方便使用
if value and value.grade_equips then
for k,v in pairs(value.grade_equips) do
for a,b in pairs(v.equips) do
b.type = value.type
b.grade = v.grade
self.equip_dic[b.goods_id] = b
end
end
end
--核心已使用数量
self.kernel_num_info[type_id] = {}
if value and value.core_list then
for k,v in pairs(value.core_list) do
self.kernel_num_info[type_id][v.core_type] = v.core_num
end
end
-------------------------
self.basic_info[type_id] = value
end
-- 获取核心已使用数量
function FosterModel:GetKernelUseNum(type_id, id)
if not type_id or not id then
return
end
return self.kernel_num_info[type_id][id]
end
function FosterModel:RefreshEquipList( type_id,grade,data )
if not type_id or not grade or not data then return end
for a,b in pairs(data) do
b.type = type_id
b.grade = grade
self.equip_dic[b.goods_id] = b
end
-------------------------
local basic = self:GetBasicInfo( type_id )
local have_chang = false
if basic and basic.grade_equips then
for k,v in pairs(basic.grade_equips) do
if v.grade == grade then
v.equips = data
-------------------------
have_chang = true
end
end
if not have_chang then
table.insert( basic.grade_equips, {grade = grade,equips = data} )
end
end
end
--穿戴操作数据保存,写在界面里跳的太复杂了,取出来用
function FosterModel:SetDressAction( _type_id,_grade,_pos )
self.action_data = {type_id = _type_id,grade = _grade,pos = _pos}
end
function FosterModel:GetDressAction( )
return self.action_data
end
--获取当前星阶
function FosterModel:GetGradeStarByType( type_id )
local grade,star = 0,0
if type_id and self:GetBasicInfo( type_id ) then
grade = self:GetBasicInfo( type_id ).grade
star = self:GetBasicInfo( type_id ).star
end
return grade,star
end
--检查是否强化升级
function FosterModel:StrengthenCheckIsUpgrade( check_data )
local star_change = false
local grade_change = false
if check_data then
local old = self:GetBasicInfo(check_data.type)
if old then
if old.star ~= check_data.star then
star_change = true
end
if old.grade ~= check_data.grade then
grade_change = true
end
end
end
return star_change,grade_change
end
--刷新强化数据
function FosterModel:RefreshStrengthenExp( data )
if data and self:GetBasicInfo( data.type ) then
self:GetBasicInfo( data.type ).exp = self:GetBasicInfo( data.type ).exp + data.exp
return true
end
end
--更新使用核心信息(弃用)
function FosterModel:RefreshKernelUseInfo( type_id, opty, total )
if type_id and opty and total and self:GetBasicInfo(type_id) then
if opty == 0 then
self:GetBasicInfo(type_id).lowcore = total
elseif opty == 1 then
self:GetBasicInfo(type_id).highcore = total
end
-- 成功修改返回true,否则返回false通知获取服务端数据
return true
end
end
--更新技能信息
function FosterModel:RefreshSkillInfo( type_id,data )
if type_id and data and self:GetBasicInfo( type_id ) then
local need_add = true
for k,v in pairs(self:GetBasicInfo( type_id ).skills) do
if v.pos == data.pos then
v.lv = data.lv
v.skill = data.skill
need_add = false
break
end
end
if need_add then
table.insert( self:GetBasicInfo( type_id ).skills, {lv = data.lv, pos = data.pos, skill = data.skill} )
end
-- 成功修改返回true,否则返回false通知获取服务端数据
return true
end
end
--更新幻化信息
function FosterModel:RefreshSkinUseInfo( type_id, display )
if type_id and display and self:GetBasicInfo( type_id ) then
self:GetBasicInfo( type_id ).display = display
-- 成功修改返回true,否则返回false通知获取服务端数据
return true
end
end
-- 进化协助状态数据 14614
function FosterModel:SetFosterSuitAssistFlagData(vo)
if vo then
self.foster_assist_flag_data[vo.type] = {}
for k, v in ipairs(vo.grade_list) do
self.foster_assist_flag_data[vo.type][v.grade] = v.state
end
-- 检查红点
self:CanActivateFosterAssist(true, vo.type)
end
end
function FosterModel:GetFosterSuitAssistFlagData(type, grade)
if type then
if grade then
return self.foster_assist_flag_data[type]
and self.foster_assist_flag_data[type][grade] or 0
else
return self.foster_assist_flag_data[type] or {}
end
end
return self.foster_assist_flag_data
end
-- 单个协助数据更新
function FosterModel:UpdateFosterSuitAssistFlagData(vo)
if vo then
self.foster_assist_flag_data[vo.type] = self.foster_assist_flag_data[vo.type] or {}
self.foster_assist_flag_data[vo.type][vo.grade] = vo.state
end
end
--通过类型获得页面左侧tab数据
function FosterModel:GetBaseConfList( type_id )
local function get_call( type_id )
local data = {}
-- 分为强进阶弱进阶
if self:GetIsStrongFoster(type_id) then
for k,v in pairs(Config.Foster) do
if v.type == type_id and v.star == 0 then
table.insert( data, v )
end
end
local function sort_call( a,b )
return a.grade < b.grade
end
table.sort( data, sort_call )
else
for k,v in pairs(Config.Fostersuit) do
if v.type == type_id then
table.insert( data, v )
end
end
local function sort_call( a,b )
return a.grade < b.grade
end
table.sort( data, sort_call )
end
return data
end
self.view_tab_info[type_id] = self.view_tab_info[type_id] or get_call( type_id )
return self.view_tab_info[type_id]
end
--获取单条信息
function FosterModel:GetBaseConfOne( type_id, grade, star, level)
if not type_id then return end
if not grade or not star then
local basic = self:GetBasicInfo( type_id )
if basic then
grade = grade or basic.grade
star = star or basic.star
end
end
if not level then
local basic = self:GetBasicInfo( type_id )
if basic then
level = level or basic.level
end
end
grade = grade or 1
star = star or 0
level = level or 1
if not self:GetIsStrongFoster(type_id) then
return Config.Fostersub[type_id .. "@" .. level]
else
return Config.Foster[type_id .. "@" .. grade .. "@" .. star]
end
end
function FosterModel:GetIsMax( type_id )
if type_id then
local cur_grade,cur_star = self:GetGradeStarByType(type_id)
local max_grade,max_star = self:GetMaxGradeStar(type_id)
if (max_grade < cur_grade) or (max_grade == cur_grade and max_star <= cur_star) then
return true
else
return false
end
else
return true
end
end
function FosterModel:GetSubIsMax(type_id)
if type_id then
local basic = self:GetBasicInfo(type_id)
return basic and basic.lv >= self:GetSubMax(type_id)
else
return true
end
end
function FosterModel:GetSubMax(type_id)
self.max_lv = self.max_lv or {}
local max_lv_type = 1
if type_id then
if not self.max_lv[type_id] then
for key, value in pairs(Config.Fostersub) do
if value.type == type_id then
max_lv_type = max_lv_type > value.lv and max_lv_type or value.lv
end
end
self.max_lv[type_id] = max_lv_type
end
return self.max_lv[type_id]
end
end
--获取最大星阶
function FosterModel:GetMaxGradeStar( type_id )
local function get_call( type_id )
local grade,star = 0,0
for k,v in pairs(Config.Foster) do
if v.type == type_id then
grade = grade > v.grade and grade or v.grade
star = star > v.star and star or v.star
end
end
return {grade = grade,star = star}
end
self.max_grade_star_info[type_id] = self.max_grade_star_info[type_id] or get_call(type_id)
return self.max_grade_star_info[type_id].grade,self.max_grade_star_info[type_id].star
end
function FosterModel:GetCurMaxStar( type_id,grade )
local star = 0
for k,v in pairs(Config.Foster) do
if v.type == type_id and v.grade == grade then
star = star > v.star and star or v.star
end
end
return star
end
--核心使用上限
function FosterModel:GetKernelMax( type_id,kind,grade )
if not type_id or not kind or not grade then return 0 end
if not self:GetIsStrongFoster(type_id) then
local max = 0
for k,v in pairs(Config.Fostercore) do
if v.type == type_id and v.kind == kind then
local data = stringtotable(v.max)
local lv = grade
for a,b in pairs(data) do
if b[1] < grade then
max = max > b[2] and max or b[2]
end
end
break
end
end
return max
else
for k,v in pairs(Config.Fostercore) do
if v.type == type_id and v.kind == kind then
local data = stringtotable(v.max)
for a,b in pairs(data) do
if b[1] == grade then
return b[2]
end
end
break
end
end
end
return 0
end
function FosterModel:GetKernelNextMaxLv( type_id,kind,grade )
if not type_id or not kind or not grade then return 0 end
local cur_max_kernel = self:GetKernelMax( type_id,kind,grade )
local max_grade = 99999
for k,v in pairs(Config.Fostercore) do
if v.type == type_id and v.kind == kind then
local data = stringtotable(v.max)
for a,b in pairs(data) do
if b[2] > cur_max_kernel and b[1] > grade then
max_grade = max_grade > b[1] and b[1] or max_grade
end
end
break
end
end
return max_grade
end
--使用核心最低阶数
function FosterModel:GetUseKernelMinGrade( type_id,kind )
if not type_id or not kind then return 1 end
local conf = Config.Fostercore[type_id .. "@" .. kind]
if not conf then return 1 end
local min_grade,min_num = 999,99999
for k,v in pairs(stringtotable(conf.max)) do
min_grade = min_grade < v[1] and min_grade or v[1]
min_num = min_num < v[2] and min_num or v[2]
end
return min_grade, min_num
end
--获得技能列表(仅用于展示技能条目的)
function FosterModel:GetSkillShowConf( type_id )
local function get_call( type_id )
local data = {}
for k,v in pairs(Config.Fosterskill) do
if v.type == type_id and v.lv == 1 then
table.insert( data, v )
end
end
local function sort_call( a,b )
return a.pos < b.pos
end
table.sort( data, sort_call )
return data
end
self.skill_show_conf_list[type_id] = self.skill_show_conf_list[type_id] or get_call( type_id )
return self.skill_show_conf_list[type_id]
end
--获得某类的总技能列表
function FosterModel:GetSkillConf( type_id )
local function get_call( type_id )
local data = {}
for k,v in pairs(Config.Fosterskill) do
if v.type == type_id then
table.insert( data, v )
end
end
return data
end
self.skill_conf_list[type_id] = self.skill_conf_list[type_id] or get_call( type_id )
return self.skill_conf_list[type_id]
end
--获得技能配置
function FosterModel:GetSkillConfOne( type_id,lv,pos,skill_id )
lv = lv or 1
lv = lv > 0 and lv or 1
if not type_id then return end
if not pos and not skill_id then return end
for k,v in pairs(self:GetSkillConf(type_id)) do
if v.lv == lv and v.pos == pos and v.skillid == skill_id then
return v
end
end
end
--获得技能状态
function FosterModel:GetSkillStatus( type_id,pos,skill_id )
local status = "lock"
local back_lv = false
if (not type_id) or (not pos and not skill_id) then
status = "lock"
else
local basic = self:GetBasicInfo( type_id )
if not basic then
status = "lock"
else
for k,v in pairs(basic.skills) do
if v.pos == pos and skill_id == v.skill then
back_lv = v.lv
break
end
end
if back_lv == 0 then
status = "lock"
elseif back_lv and back_lv > 0 then
status = "active"
end
end
end
return status, back_lv or 0
end
--获取AI娘的战斗技能(第四个位置),每次放技能都要获取,所以在获取一次之后就缓存下来,等进阶之后技能变化了再更新
function FosterModel:GetPetFightSkill( )
local function on_check_skill( )
for k,v in pairs(Config.Fosterskill) do
if v.type == FosterConst.ModuleId.FJarvis and v.pos == 4 then
return v.skillid
end
end
end
self.pet_fight_skill = self.pet_fight_skill or on_check_skill()
self.pet_fight_skill_state = self.pet_fight_skill_state or self:GetSkillStatus(FosterConst.ModuleId.FJarvis, 4, self.pet_fight_skill)
if self.pet_fight_skill_state == "active" and self.pet_fight_skill then
return self.pet_fight_skill
end
end
--重置AI娘战斗技能激活状态
function FosterModel:ResetPetFightSkillState( )
self.pet_fight_skill_state = false
end
--获取进阶消耗材料
function FosterModel:GetGradeCost( type_id, grade, star )
if not type_id then return end
if not grade or not star then
local basic = self:GetBasicInfo( type_id )
if basic then
grade = basic.grade
star = basic.star
end
end
local conf = self:GetBaseConfOne( type_id, grade, star )
if conf then
return stringtotable(conf.cost)
end
end
function FosterModel:GetKernelConf( type_id, opty )
if not type_id then return end
local data = {}
if opty then
for k,v in pairs(Config.Fostercore) do
if v.type == type_id and v.kind == opty then
return v
end
end
else
for k,v in pairs(Config.Fostercore) do
if v.type == type_id then
table.insert( data, v )
end
end
end
local function sort_call( a,b )
return a.kind < b.kind
end
table.sort( data, sort_call )
return data
end
-- core_info = {kind ,num } 获取核心增加的属性
function FosterModel:GetKernelAttrAdd( type_id, core_info)
if not type_id then return {} end
local data = self:GetBasicInfo(type_id)
if not data then return {} end
local add_per = 0
local add_extra = 0--局部全属性加成
local attr = {}
local conf_list = self:GetKernelConf( type_id)
conf_list = self:GetKernelConf( type_id)
for key, value in pairs(conf_list) do
local cur_use_num = self:GetKernelUseNum(type_id, value.kind)
if core_info and core_info.kind == value.kind then
cur_use_num = core_info.num
end
local attr_temp = stringtotable(value.ext)
for k,v in pairs(attr_temp) do
add_extra = 0
if v[1] == 68 then
--局部全属性加成
add_extra = v[2]
else
attr[v[1]] = attr[v[1]] or 0
attr[v[1]] = attr[v[1]] + cur_use_num * v[2]
end
add_per = add_per + cur_use_num * (add_extra / 10000)
end
end
return attr, add_per
end
function FosterModel:GetGradeTempAttr( type_id )
if not type_id or not self:GetIsStrongFoster(type_id) then return {} end
local data = self:GetBasicInfo(type_id)
if not data then return {} end
if data.click == 0 then return {} end
local result = {}
local temp_attr_conf = stringtotable(self:GetBaseConfOne( type_id ).tem_attrs)
for k,v in pairs(temp_attr_conf) do
result[tonumber(v[1])] = tonumber(v[2]) * data.click
end
return result
end
--获取当前阶数下可升的最大技能等级
function FosterModel:GetSkillMaxInCurGrade( type_id, pos )
if not type_id or not pos then return 0 end
local lv = 0
local data = self:GetBasicInfo(type_id)
if self:GetIsStrongFoster(type_id) then
if data then
local grade = data.grade
for k,v in pairs(Config.Fosterskill) do
if v.type == type_id and v.pos == pos and v.limit <= grade then
lv = lv > v.lv and lv or v.lv
end
end
end
else
if data then
local basic_lv = data.lv
for k,v in pairs(Config.Fosterskill) do
if v.type == type_id and v.pos == pos and v.limit <= basic_lv then
lv = lv > v.lv and lv or v.lv
end
end
end
end
return lv
end
function FosterModel:GetSkillMaxLevel( type_id, pos )
local lv = 0
for k,v in pairs(Config.Fosterskill) do
if v.type == type_id and v.pos == pos then
lv = lv > v.lv and lv or v.lv
end
end
return lv
end
function FosterModel:GetGradeIsActive( type_id,grade )
if not type_id or not grade then return false end
local basic = self:GetBasicInfo( type_id )
if not basic then return false end
if self:GetIsStrongFoster(type_id) then
return basic.grade >= grade
else
return basic.lv >= grade
end
end
-- function FosterModel:GetMaxShowSuit( type_id,grade )
-- local max = 1
-- for key, value in pairs(Config.Fostersuit) do
-- if value.type == type_id and value.grade < grade then
-- max = max > value.grade and max or value.grade
-- end
-- end
-- return max
-- end
function FosterModel:LvToGrade(lv)
if lv then
return math.ceil((lv - 0.5) / 20)
else
return 1
end
end
--获取已穿戴的装备
function FosterModel:GetEquipInfo( type_id,grade,pos )
if not type_id or not grade or not pos then return end
local base_info = self:GetBasicInfo(type_id)
if not base_info then return end
for k,v in pairs(base_info.grade_equips) do
if v.grade == grade then
for a,b in pairs(v.equips) do
if b.pos == pos then
return b
end
end
return
end
end
end
function FosterModel:GetEquipConf( type_id )
if not type_id then return end
return Config.Fosterequip[type_id]
end
function FosterModel:GetEquipMoreConf( type_id,pos,color,lv )
if not type_id or not pos or not color or not lv then return end
return Config.Fosterequiplv[ type_id .. "@" ..pos .. "@" ..color .. "@" ..lv ]
end
--通过背包信息获取穿戴的装备
function FosterModel:GetDressInfoByBagInfo( bag_info )
if not bag_info then return end
if bag_info.goods_id then
return self.equip_dic[bag_info.goods_id]
end
end
--通过穿戴的装备获取背包的信息
function FosterModel:GetBagInfoByDressInfo( dress_info )
if not dress_info then return end
if dress_info.goods_id then
return GoodsModel:getInstance():GetFosterEquipDic()[dress_info.goods_id]
end
end
--通过背包的信息获取装备等级
function FosterModel:GetLevelByBagInfo( bag_info )
if not bag_info then return 0 end
for k,v in pairs(bag_info.other_data or {}) do
if v.type == 1 then
return tonumber(v.info or 0)
end
end
return 0
end
--通过背包的信息获取装备经验
function FosterModel:GetExpByBagInfo( bag_info )
if not bag_info then return 0 end
for k,v in pairs(bag_info.other_data or {}) do
if v.type == 2 then
return tonumber(v.info or 0)
end
end
return 0
end
function FosterModel:GetSwallowSelect( )
return self.swallow_select or {}
end
function FosterModel:ResetSwallowSelect( )
self.swallow_select = {}
end
function FosterModel:GetSwallowStatus( goods_id )
goods_id = goods_id or 0
return self.swallow_select[goods_id]
end
function FosterModel:SetSwallowSelect( goods_id , status )
if not goods_id then return end
if status then
self.swallow_select[goods_id] = true
else
self.swallow_select[goods_id] = nil
end
end
-------------------------
--检查红点屏蔽的
function FosterModel:CheckMaskUpgradeRed( type_id )
do return end -- 现在清除阶段也有红点了,这个不需要了
if not type_id then return end
local basic = self:GetBasicInfo( type_id )
if basic then
local is_clear = self:GetBaseConfOne( type_id, basic.grade, basic.star ).clear == 1
if is_clear and self:CanUpgrade( false, type_id ) then
self.mask_upgrad_red[type_id] = true
self:CanUpgrade( true, type_id )
self:Fire(FosterConst.RedDotRefresh)
end
FosterController.Instance:CheckRedDot()
end
end
--升阶红点
function FosterModel:CanUpgrade( check_new, type_id )
if not check_new then
return self.red_canupgrade[type_id]
end
self.red_canupgrade[type_id] = false
if self:GetIsStrongFoster(type_id) then --强进阶
if not self:GetIsMax(type_id) then
-------------------------
local cost = self:GetGradeCost(type_id)
if TableSize(cost) ~= 0 then
local basic = self:GetBasicInfo( type_id )
local is_clear = false
if basic then
is_clear = basic.isclear == 1
end
local have = GoodsModel:getInstance():GetTypeGoodsNum(cost[1][2])
if not is_clear then
if tonumber(cost[1][3]) <= have then
self.red_canupgrade[type_id] = true
end
else
-- 如果材料满足可以一次进阶成功就给红点
local conf = self:GetBaseConfOne(type_id)
local cur_exp = basic.exp
local need_exp = conf.max - cur_exp
need_exp = need_exp < 0 and 0 or need_exp
-- 祝福可能获得的经验值,按配置(9~11)的最小值来推测,算9点,这边写死懒得读配置了
local exp_per_upgrade = 9
local need_num = math.ceil(need_exp / exp_per_upgrade) * tonumber(cost[1][3])
if need_num <= have then
self.red_canupgrade[type_id] = true
end
end
end
end
else --弱进阶
if not self:GetSubIsMax(type_id) then
for i=1,3 do
local sub_mat = self:GetFosterSubMaterialByType(type_id)
local cost_data = stringtotable(sub_mat[FosterConst.SubMatStr[i]])
local have = GoodsModel:getInstance():GetTypeGoodsNum(cost_data[1][1])
local cost_num = 1
if have >= cost_num then
self.red_canupgrade[type_id] = true
break
end
end
end
end
return self.red_canupgrade[type_id]
end
--核心使用红点
function FosterModel:CanKernel( check_new, type_id, id )
if not type_id then return false end
self.red_cankernel[type_id] = self.red_cankernel[type_id] or {}
if not check_new then
if id then
return self.red_cankernel[type_id][id]
else
return self.red_cankernel_all[type_id]
end
end
-------------------------
self.red_cankernel[type_id] = {}
self.red_cankernel_all[type_id] = false
if type_id then
local basic_info = self:GetBasicInfo(type_id)
local core_conf = self:GetKernelConf(type_id)
if basic_info and core_conf then
local grade = basic_info.grade
--弱进阶参数为等级
if not self:GetIsStrongFoster(type_id) then
grade = basic_info.lv == 0 and 1 or basic_info.lv
end
-- print("Lizhijian:FosterModel [start:886] ")
-- PrintTable(core_conf)
-- print("Lizhijian:FosterModel [end:886] ")
for key, value in pairs(core_conf) do
self.red_cankernel[type_id][value.kind] = false
local kernel_cost_id = stringtotable(value.cost)[1][2]
local kernel_max = self:GetKernelMax( type_id, value.kind, grade )
local use_num = self:GetKernelUseNum(type_id, value.kind)
if use_num and use_num < kernel_max and GoodsModel:getInstance():GetTypeGoodsNum(kernel_cost_id) > 0 then
self.red_cankernel[type_id][value.kind] = true
self.red_cankernel_all[type_id] = true
end
end
end
end
if id then
return self.red_cankernel[type_id][id]
else
return self.red_cankernel_all[type_id]
end
end
function FosterModel:CanSkillUpgradeByType( check_new,type_id )
local basic_info = self:GetBasicInfo(type_id)
local bool = false
if basic_info then
for k,v in pairs(basic_info.skills) do
bool = self:CanSkillUpgrade(check_new,type_id,v.pos,v.skill) or bool
end
end
return bool
end
function FosterModel:CanSkillUpgrade( check_new,type_id,pos,skill_id )
if not type_id or not pos or not skill_id then return false end
self.red_canskill[type_id] = self.red_canskill[type_id] or {}
if not check_new then
return self.red_canskill[type_id][pos]
end
-------------------------
self.red_canskill[type_id][pos] = false
local status,skill_lv = self:GetSkillStatus(type_id,pos,skill_id)
if status == "active" then
local max_lv = self:GetSkillMaxInCurGrade(type_id,pos)
if skill_lv < max_lv then
local conf = self:GetSkillConfOne( type_id,skill_lv,pos,skill_id )
if conf then
local cost_info = stringtotable(conf.cost)
self.red_canskill[type_id][pos] = GoodsModel:getInstance():GetTypeGoodsNum(cost_info[1][2]) >= cost_info[1][3]
end
end
end
return self.red_canskill[type_id][pos]
end
--装备穿戴红点
function FosterModel:CanDressNewEquipWithType( check_new,type_id )
if not self:GetCanUseEquipByType( type_id ) then
return false
end
-------------------------
local basic_info = self:GetBasicInfo(type_id)
local bool = false
if basic_info then
if self:GetIsStrongFoster(type_id) then
for i=1,basic_info.grade do
bool = self:CanDressNewEquipWithGrade(check_new,type_id,i) or bool
end
else
local conf_list= self:GetBaseConfList(type_id)
for key, value in pairs(conf_list) do
bool = self:CanDressNewEquipWithGrade(check_new, type_id, value.grade) or bool
end
end
end
return bool
end
--装备穿戴红点
function FosterModel:CanDressNewEquipWithGrade( check_new,type_id,grade )
if not self:GetCanUseEquipByType( type_id ) then
return false
end
-------------------------
local bool = false
for i=1,FosterConst.EquipNum do
bool = self:CanDressNewEquip( check_new,type_id,grade,i ) or bool
end
return bool
end
--装备穿戴红点
function FosterModel:CanDressNewEquip( check_new,type_id,grade,pos )
if not self:GetCanUseEquipByType( type_id ) then
return false
end
-------------------------
if not type_id or not grade or not pos then return end
self.red_candressnew[type_id] = self.red_candressnew[type_id] or {}
self.red_candressnew[type_id][grade] = self.red_candressnew[type_id][grade] or {}
if not check_new then
return self.red_candressnew[type_id][grade][pos]
end
-------------------------
self.red_candressnew[type_id][grade][pos] = false
local basic_info = self:GetBasicInfo(type_id)
if basic_info and self:GetGradeIsActive( type_id,grade ) and (not self:GetEquipInfo( type_id,grade,pos )) then
local data = GoodsModel:getInstance():GetFosterWantList( type_id,pos,"bag" )
if TableSize(data) > 0 then
self.red_candressnew[type_id][grade][pos] = true
end
end
return self.red_candressnew[type_id][grade][pos]
end
--装备替换红点
function FosterModel:CanDressUpEquipWithType( check_new,type_id )
if not self:GetCanUseEquipByType( type_id ) then
return false
end
-------------------------
local basic_info = self:GetBasicInfo(type_id)
local bool = false
if basic_info then
if self:GetIsStrongFoster(type_id) then
for i=1,basic_info.grade do
bool = self:CanDressUpEquipWithGrade(check_new,type_id,i) or bool
end
else
local conf_list = self:GetBaseConfList(type_id)
for _, value in ipairs(conf_list) do
bool = self:CanDressUpEquipWithGrade(check_new,type_id,value.grade) or bool
end
end
end
return bool
end
--装备替换红点
function FosterModel:CanDressUpEquipWithGrade( check_new,type_id,grade )
if not self:GetCanUseEquipByType( type_id ) then
return false
end
-------------------------
local bool = false
for i=1,FosterConst.EquipNum do
bool = self:CanDressUpEquip( check_new,type_id,grade,i ) or bool
end
return bool
end
--装备替换红点
function FosterModel:CanDressUpEquip( check_new,type_id,grade,pos )
if not self:GetCanUseEquipByType( type_id ) then
return false
end
-------------------------
if not type_id or not grade or not pos then return false end
self.red_candressup[type_id] = self.red_candressup[type_id] or {}
self.red_candressup[type_id][grade] = self.red_candressup[type_id][grade] or {}
if not check_new then
return self.red_candressup[type_id][grade][pos]
end
-------------------------
self.red_candressup[type_id][grade][pos] = false
local basic_info = self:GetBasicInfo(type_id)
if basic_info and self:GetGradeIsActive( type_id,grade ) and self:GetEquipInfo( type_id,grade,pos ) then
--是否已解锁;--是否已穿戴
local data = GoodsModel:getInstance():GetFosterWantList( type_id,pos,"bag" )
local conf = {}
-- print("Lizhijian:FosterModel [start:1006] self:GetEquipInfo( type_id,grade,pos ) ------------------------------------------")
-- PrintTable(self:GetEquipInfo( type_id,grade,pos ))
for k,v in pairs(data) do
conf = self:GetEquipConf( v.type_id )
if conf then
if self:GetEquipInfo( type_id,grade,pos ).color < conf.color then
self.red_candressup[type_id][grade][pos] = true
end
end
end
end
return self.red_candressup[type_id][grade][pos]
end
-- 根据类型获取进阶装备背包中可穿戴(替换)的装备
function FosterModel:GetCanEquipDressData( type_id, grade, pos )
local equip_data = nil -- 目标返回的装备数据
local basic_info = self:GetBasicInfo(type_id)
if basic_info and self:GetGradeIsActive( type_id,grade ) then
local equip_info = self:GetEquipInfo( type_id,grade,pos ) -- 当前穿戴的装备数据
local data = GoodsModel:getInstance():GetFosterWantList( type_id,pos,"bag" )
local conf = {}
for k, v in pairs(data) do
conf = self:GetEquipConf( v.type_id )
if conf then
if ((not equip_info) or (equip_info.color < conf.color)) -- 未穿戴或当前穿戴的装备品质低于该装备
and ((not equip_data) or (equip_data.color < conf.color)) then -- 未提取目标装备或目标装备缓存的品质颜色低于该装备
equip_data = v
end
end
end
end
return equip_data
end
--装备升阶红点检查红点屏蔽的
function FosterModel:CheckMaskUpEquipRed( type_id )
if not type_id then return end
if self.red_candressup[type_id] and self.red_candressup[type_id] then
for k,v in pairs(self.red_candressup[type_id]) do
if v then
self.mask_dressupgrade_red[type_id] = true
self:Fire(FosterConst.RedDotRefresh)
FosterController.Instance:CheckRedDot()
return
end
end
end
end
--装备升阶红点
function FosterModel:CanUpEquipWithType( check_new,type_id )
if not self:GetCanUseEquipByType( type_id ) then
return false
end
-------------------------
if type_id and self.mask_dressupgrade_red[type_id] then return false end
-------------------------
local basic_info = self:GetBasicInfo(type_id)
local bool = false
if basic_info then
if self:GetIsStrongFoster(type_id) then
for i=1,basic_info.grade do
bool = self:CanUpEquipWithGrade(check_new,type_id,i) or bool
end
else
local conf_list = self:GetBaseConfList(type_id)
for _, value in ipairs(conf_list) do
bool = self:CanUpEquipWithGrade(check_new,type_id,value.grade) or bool
end
end
end
return bool
end
--装备升阶红点
function FosterModel:CanUpEquipWithGrade( check_new,type_id,grade )
if not self:GetCanUseEquipByType( type_id ) then
return false
end
-------------------------
if type_id and self.mask_dressupgrade_red[type_id] then return false end
-------------------------
local bool = false
for i=1,FosterConst.EquipNum do
bool = self:CanUpEquip( check_new,type_id,grade,i ) or bool
end
return bool
end
--装备升阶红点
function FosterModel:CanUpEquip( check_new,type_id,grade,pos )
-------------------------
if not self:GetCanUseEquipByType( type_id ) then
return false
end
-------------------------
if not type_id or not grade or not pos then
return
end
if self.mask_dressupgrade_red[type_id] then
return false
end
-------------------------
self.red_canupequip[type_id] = self.red_canupequip[type_id] or {}
self.red_canupequip[type_id][grade] = self.red_canupequip[type_id][grade] or {}
if not check_new then
return self.red_canupequip[type_id][grade][pos]
end
-------------------------
self.red_canupequip[type_id][grade][pos] = false
-- 在已激活的阶段的全部槽位都穿戴了装备之前,没有可升级的红点(引导)
local can_update_up_red = true
local cur_type_grade = self:GetBasicInfo(type_id).grade -- 当前类型的阶段数
local temp_equip_info
for i = 1, cur_type_grade do
for j = 1, FosterConst.EquipNum do
-- 存在任何一件可替换或可上阵的槽位时,不显示可升级
if self:CanDressUpEquip(false, type_id, i, j) or self:CanDressNewEquip(false, type_id, i, j) then
can_update_up_red = false
break
end
end
if not can_update_up_red then
break
end
end
--------------------
if can_update_up_red then -- 所有已激活的阶段数都穿戴了装备的情况下
local basic_info = self:GetBasicInfo(type_id)
local equip_info = self:GetEquipInfo( type_id,grade,pos )
if basic_info and self:GetGradeIsActive( type_id,grade ) and equip_info then
-- 是否满级
local not_max = self:GetEquipMoreConf(type_id, equip_info.pos, equip_info.color, equip_info.lv+1) and true or false
if not_max then
--是否已解锁;--是否已穿戴
-- local data = GoodsModel:getInstance():GetFosterWantList( type_id,pos,"bag" )
local data = GoodsModel:getInstance():GetFosterWantList( type_id,nil,"bag" )
local conf = {}
for k,v in pairs(data) do
conf = self:GetEquipConf( v.type_id )
if conf then
-- if equip_info.color > conf.color then
self.red_canupequip[type_id][grade][pos] = true
break
-- end
end
end
end
end
end
return self.red_canupequip[type_id][grade][pos]
end
function FosterModel:RefreshEquipRedData( type_id )
self:CanDressNewEquipWithType(true,type_id)
self:CanDressUpEquipWithType(true,type_id)
self:CanUpEquipWithType( true,type_id )
end
function FosterModel:CheckAllRedDot( check_new )
for k,v in pairs(FosterConst.ModuleId) do
if self:CheckRedDot( check_new,v ) then
return true
end
end
end
-- 进阶装备协助的红点
function FosterModel:CanActivateFosterAssist(check_new, type)
if not type then return false end
if check_new then
self.foster_assist_red[type] = false
local assist_data = self:GetFosterSuitAssistFlagData(type)
for k, v in pairs(assist_data) do
if v == 1 then
self.foster_assist_red[type] = true
end
end
end
return self.foster_assist_red[type]
end
-- 进阶装备协助红点
function FosterModel:CanActivateFosterAssistWithGrade(check_new, type, grade)
if not type then return false end
if check_new then
self:CanActivateFosterAssist(check_new, type)
end
if grade then
return self:GetFosterSuitAssistFlagData(type, grade) == 1
else
return self.foster_assist_red[type]
end
return false
end
function FosterModel:GetRedDotByTab( type_id,grade )
if self:GetCanUseEquipByType( type_id ) then
local bool_equip_dress = self:CanDressNewEquipWithGrade( false,type_id,grade )
local bool_equip_change = self:CanDressUpEquipWithGrade( false,type_id,grade )
local bool_equip_up = self:CanUpEquipWithGrade( false,type_id,grade )
local bool_equip_assist = self:CanActivateFosterAssistWithGrade(false, type_id, grade)
return bool_equip_dress or bool_equip_change or bool_equip_up or bool_equip_assist
end
return false
end
function FosterModel:CheckRedDot( check_new,type_id )
if not type_id then return end
if check_new then
--这时候比较特别,需要强制刷新所有相关的以备使用
self:CanUpgrade(true,type_id)
self:CanKernel(true,type_id)
self:CanDressNewEquipWithType(true,type_id)
self:CanDressUpEquipWithType(true,type_id)
self:CanUpEquipWithType(true,type_id)
self:CanSkillUpgradeByType( true,type_id )
self:CanActivateFosterAssist(true, type_id)
self:CanSkinActOrUp(true, type_id)
end
return (
self:CanUpgrade(false,type_id) or
self:CanKernel(false,type_id) or
self:CanSkillUpgradeByType( false,type_id ) or
self:CanActivateFosterAssist(false, type_id) or
self:CanDressNewEquipWithType(false,type_id) or
self:CanDressUpEquipWithType(false,type_id) or
-- self:CanUpEquipWithType( false,type_id ) or
self:CanSkinActOrUp(false, type_id)) and
GetModuleIsOpen( 146,type_id,true )
end
-------------------------
function FosterModel:GetShowHideType( type_id )
if not type_id then return false end
if type_id == FosterConst.ModuleId.FHorse then return false end
-------------------------
local data = CookieWrapper.Instance:GetCookie(CookieLevelType.Account,CookieKey.FOSTER_HIDE_TAG) or {}
return data[type_id] and true or false
end
function FosterModel:SetShowHideType( type_id,tag )
if not type_id then return end
if type_id == FosterConst.ModuleId.FHorse then tag = false end
-------------------------
local data = CookieWrapper.Instance:GetCookie(CookieLevelType.Account,CookieKey.FOSTER_HIDE_TAG) or {}
data[type_id] = tag and true or false
CookieWrapper.Instance:SaveCookie(CookieLevelType.Account,CookieTimeType.TYPE_ALWAYS,CookieKey.FOSTER_HIDE_TAG,data)
CookieWrapper.Instance:WriteAll()
-------------------------
local role = Scene.Instance:GetRole(RoleManager.Instance.mainRoleInfo.role_id)
if role then
if type_id == FosterConst.ModuleId.FPearl then
if self:GetShowHideType( FosterConst.ModuleId.FPearl ) then
role:HideSprite(SceneObj.ModelHideFlag.ServerHide)
else
role:ShowSprite(SceneObj.ModelHideFlag.ServerHide)
end
elseif type_id == FosterConst.ModuleId.FJarvis then
if self:GetShowHideType( FosterConst.ModuleId.FJarvis ) then
role:HidePet(SceneObj.ModelHideFlag.ServerHide)
else
role:ShowPet(SceneObj.ModelHideFlag.ServerHide)
end
elseif type_id == FosterConst.ModuleId.FCloud then
role:RefreshPetWing()
elseif type_id == FosterConst.ModuleId.FWing then
role:ChangeWing()
elseif type_id == FosterConst.ModuleId.FGun then
role:RefreshPetWeapon()
elseif type_id == FosterConst.ModuleId.FArmour then
role:RefreshPetFarmour()
elseif type_id == FosterConst.ModuleId.FHorse then
role:HorseChange()
elseif type_id == FosterConst.ModuleId.FWeapon then
role:CreateWeaponSprite()
end
end
end
function FosterModel:GetModuleResIdByStage( module_id,stage_id )
if not module_id and not stage_id then return end
local conf = self:GetBaseConfOne(module_id,stage_id,0)
if conf then
if not conf.resource then
return FosterConst.DefaultModelId[module_id] or 1000
end
return conf.resource
end
end
function FosterModel:GetSpriteSkillId( )
return Config.otherFightInfo.sprite_skill_id
end
function FosterModel:GetFJarvisSkillId( )
return Config.otherFightInfo.pet_skill_id
end
--得到最低阶进阶的展示属性
function FosterModel:GetMinStageAttrFight( foster_type,stage,star )
local data = Config.Foster[foster_type .. "@"..stage.."@"..star]
if not data then return end
local base_attr = stringtotable(data.attrs)
base_attr = SortAttrList( base_attr )
return GetFighting(base_attr)
end
--获取装备套装配置
function FosterModel:GetEquipSuitConf( type_id,grade,color )
for k,v in pairs(Config.Fostersuit) do
if v.type == type_id and v.color <= color and v.grade == grade then
return v
end
end
end
-- 根据展示类型和阶段数获取进阶装备协助套装要求配置
function FosterModel:GetEquipSuitAssistCfg(type, grade)
grade = grade or 1
if type and self:GetIsStrongFoster(type) then
if grade then
for k, v in pairs(Config.Fosterequipassist) do
if v.type == type and v.grade == grade then
return v
end
end
end
else
if grade then
for k, v in pairs(Config.Fosterequipassist) do
if v.type == type and v.grade == grade then
return v
end
end
end
end
return nil
end
function FosterModel:GetEquipSuitNumByColor( type_id,grade,color )
local num = 0
local equip_info = false
local equip_conf = false
for i=1,FosterConst.EquipNum do
equip_info = self:GetEquipInfo(type_id,grade,i)
if equip_info then
equip_conf = self:GetEquipConf( equip_info.type_id )
if equip_conf and equip_conf.color >= color then
num = num + 1
end
end
end
return num
end
function FosterModel:GetEquipSuitPower( type_id,grade )
local power = 0
local equip_list = {}
local equip_info = false
local equip_conf = false
for i=1,FosterConst.EquipNum do
equip_info = self:GetEquipInfo(type_id,grade,i)
if equip_info then
equip_conf = self:GetEquipConf( equip_info.type_id )
table.insert( equip_list, equip_conf )
end
end
local equip_num = false
for k,v in pairs(Config.Fostersuit) do
equip_num = 0
if v.type == type_id and v.grade == grade then
for kk,vv in pairs(equip_list) do
if vv.color >= v.color then
equip_num = equip_num + 1
end
end
end
if equip_num >= 6 then
power = power + GetFighting((stringtotable(v.attrs)),true)
end
end
return power
end
function FosterModel:ShowEquipComTip( type_id, open_show_get_way, hide_base_con )
local data = GoodsModel:getInstance():GetGoodsBasicByTypeId( type_id )
self:Fire(FosterConst.OpenFosterEquipTipView,data,nil,nil,open_show_get_way,hide_base_con)
end
function FosterModel:GetUpgradeNeedMoreCostNum( type_id, is_auto )
local cost_data = self:GetGradeCost(type_id)
if cost_data then
local have = GoodsModel:getInstance():GetTypeGoodsNum(cost_data[1][2])
if tonumber(cost_data[1][3]) > have then
return tonumber(cost_data[1][3]) - have
else
return 1
end
end
end
--祝福值清空提示机制
function FosterModel:CheckBlessClock( )
if self.clock_bless_id then
GlobalTimerQuest:CancelQuest(self.clock_bless_id)
self.clock_bless_id = nil
end
-------------------------
self.tip_bless_list = {}--每个进阶的祝福倒计时
local function check_call( start_id,end_id )
local next_time = false
local basic = false
for i=start_id,end_id do
self.tip_bless_list[i] = false
basic = self:GetBasicInfo( i )
if basic then
if basic.end_time - TimeUtil:getServerTime() > 0 and basic.isclear == 1 and basic.exp > 0 then
self.tip_bless_list[i] = basic.end_time
if next_time then
next_time = next_time > basic.end_time and basic.end_time or next_time
else
next_time = basic.end_time
end
end
end
end
return next_time
end
local next_time_horse = check_call(1,4)--座驾的最近下一次祝福值刷新
local next_time_ai = check_call(5,8)--ai娘的最近下一次祝福值刷新
next_time_ai = false -- 弱进阶屏蔽祝福值
-------------------------
local check_next_time = next_time_horse or next_time_ai
if check_next_time then
if next_time_ai then
check_next_time = check_next_time > next_time_ai and next_time_ai or check_next_time
end
local function clockFun()
if TimeUtil:getServerTime() > check_next_time then
--时间到,重新检测一次
self:CheckBlessClock()
end
end
self.clock_bless_id = GlobalTimerQuest:AddPeriodQuest(clockFun, 1, -1)
end
GlobalEventSystem:Fire(EventName.SHOW_FUNCTION_CLOCK_POINT, 146, next_time_horse and true or false)
GlobalEventSystem:Fire(EventName.SHOW_FUNCTION_CLOCK_POINT, 146555, next_time_ai and true or false)
end
--获取祝福值角标状态
function FosterModel:GetBlessTip( type_id )
return self.tip_bless_list[type_id] and true or false
end
--是否是第一次进阶
function FosterModel:IsFirstForsterAdvance( )
local cfg = self:GetFirstForsterAdvanceCookie()
return not cfg.is_first_advace
end
--保存首次进阶
function FosterModel:SetFirstForsterAdvanceCookie( )
self.foster_first_advance = self.foster_first_advance or {}
if self.foster_first_advance.is_first_advace then
return
end
self.foster_first_advance.is_first_advace = true
CookieWrapper.Instance:SaveCookie(CookieLevelType.Account,CookieTimeType.TYPE_ALWAYS,CookieKey.FORSTER_FIRST_ADVANCE_TIPS,self.foster_first_advance)
CookieWrapper.Instance:WriteAll()
end
--获取首次进阶cookie
function FosterModel:GetFirstForsterAdvanceCookie( )
if not self.foster_first_advance then
self.foster_first_advance = CookieWrapper.Instance:GetCookie(CookieLevelType.Account,CookieKey.FORSTER_FIRST_ADVANCE_TIPS) or {}
end
return self.foster_first_advance
end
function FosterModel:GetIsActive(show_type, grade)
local base_data = self:GetBasicInfo(show_type)
if base_data and grade <= base_data.grade then
return true
end
return false
end
-- 获取弱进阶系统升级材料id
function FosterModel:GetFosterSubMaterialByType(type_id)
if not type_id then
return
end
for key, value in pairs(Config.Fostersubmaterial) do
if value.type == type_id then
return value
end
end
end
-- 设置弱进阶皮肤系统数据
function FosterModel:SetFosterSubSkinData(type_id, base_data)
self.sub_skin_base = self.sub_skin_base or {}
self.sub_skin_base[type_id] = base_data
self:CanSkinActOrUp(true,type_id)
end
function FosterModel:GetFosterSubSkinData(type_id)
self.sub_skin_base = self.sub_skin_base or {}
if type_id then
return self.sub_skin_base[type_id]
end
end
-- 获取弱进阶皮肤系统配置
function FosterModel:GetFosterSubSkinConf(type_id, skin_id, star)
if type_id then
if not skin_id or not star then -- 无皮肤参数则默认获取所有初级皮肤信息
star = 0
local conf_list = {}
for key, value in pairs(Config.Fostersubskin) do
if value.type == type_id and value.star == star then
table.insert(conf_list, value)
end
end
table.sort(conf_list, function (a, b)
return a.sequence < b.sequence
end)
return conf_list
else
return Config.Fostersubskin[type_id .. "@" .. skin_id .. "@" .. star]
end
end
end
-- 获取弱进阶皮肤页签栏数据
function FosterModel:GetCurSkinTabData(type_id)
if not type_id then return end
local cur_skins = self:GetFosterSubSkinData(type_id)
local conf_list = self:GetFosterSubSkinConf(type_id)
local tab_data = DeepCopy(conf_list)
if TableSize(cur_skins) > 0 then
for _, cur_value in pairs(cur_skins) do
local new_conf = self:GetFosterSubSkinConf(type_id, cur_value.id, cur_value.star)
for key, old_conf in pairs(tab_data) do
if old_conf.skin_id == new_conf.skin_id then
tab_data[key] = new_conf
tab_data[key].display = cur_value.display
end
end
end
end
for key, conf in pairs(tab_data) do
conf.display = conf.display == nil and 0 or conf.display
end
return tab_data
end
-- 默认获取当前显示皮肤配置
function FosterModel:GetShowSubSkinConf(type_id, skin_id, star)
local res = nil
if type_id then
if not skin_id then
local basic = self:GetFosterSubSkinData(type_id)
-- local conf = self:GetFosterSubSkinConf(type_id)
if basic and basic.skins then
for key, value in pairs(basic.skins) do
if value.display ~= 0 then
skin_id = value.id
star = value.star
break
end
end
else
local name_str = ""
if type_id == 5 then
name_str = "AI希亚"
elseif type_id == 6 then
name_str = "光子磁炮"
elseif type_id == 7 then
name_str = "光子星翼"
elseif type_id == 8 then
name_str = "光子幻甲"
end
return {skin_id = 1000, name=name_str}
end
end
skin_id = skin_id or 1001
star = star or 0
return Config.Fostersubskin[type_id .. "@" .. skin_id .. "@" .. star]
end
end
-- 使用物品弹窗走这里
function FosterModel:CanSkinUse(new_goods_vo)
local goods_id = new_goods_vo.type_id
local goods_num = new_goods_vo.goods_num
local type_id = new_goods_vo.subtype - 1
local show_list = self:GetCurSkinTabData(type_id)
for _, conf in pairs(show_list) do
local cost = stringtotable(conf.cost_material)
if cost and cost[1] and cost[1][2] == goods_id and tonumber(cost[1][3]) <= goods_num then
return true
end
end
return false
end
-- 获取皮肤红点
function FosterModel:CanSkinActOrUp(check_new, type_id)
if not check_new then
return self.red_skin[type_id]
end
self.red_skin[type_id] = false
if type_id then
local show_list = self:GetCurSkinTabData(type_id)
for _, conf in pairs(show_list) do
if self:CanSkinActOrUpById(type_id, conf.skin_id, conf.star) then
self.red_skin[type_id] = true
break
end
end
end
return self.red_skin[type_id]
end
function FosterModel:CanSkinActOrUpById(type_id, skin_id, star)
if type_id and skin_id and star then
local conf = self:GetShowSubSkinConf(type_id, skin_id, star)
local cost_info = stringtotable(conf.cost_material)
if cost_info[1] then
local have = GoodsModel:getInstance():GetTypeGoodsNum(cost_info[1][2])
return have >= tonumber(cost_info[1][3])
else
return false
end
end
return false
end
function FosterModel:CanSkinAct(type_id, skin_id, star)
if type_id and skin_id and star == 0 then
local conf = self:GetShowSubSkinConf(type_id, skin_id, star)
local cost_info = stringtotable(conf.cost_material)
if cost_info[1] then
local have = GoodsModel:getInstance():GetTypeGoodsNum(cost_info[1][2])
return have >= tonumber(cost_info[1][3])
else
return false
end
end
return false
end
function FosterModel:CanSkinUp(type_id, skin_id, star)
if type_id and skin_id and star ~= 0 then
local conf = self:GetShowSubSkinConf(type_id, skin_id, star)
local cost_info = stringtotable(conf.cost_material)
if cost_info[1] then
local have = GoodsModel:getInstance():GetTypeGoodsNum(cost_info[1][2])
return have >= tonumber(cost_info[1][3])
else
return false
end
end
return false
end
function FosterModel:GetFosterSubSkinConfByMat(type_id, mat_id)
if type_id and mat_id then
local conf_list = self:GetFosterSubSkinConf(type_id)
for key, value in pairs(conf_list) do
local cost = stringtotable(value.cost_material)
if cost and tonumber(cost[1][2]) == tonumber(mat_id) then
return value
end
end
end
end
--获取当前穿戴的皮肤
function FosterModel:GetCurrentFosterSkin(type_id)
local role_vo = RoleManager.Instance.mainRoleInfo
if role_vo and role_vo.foster_sub_skin_list and role_vo.foster_skin_list then
for k,v in pairs(role_vo.foster_skin_list) do
if v.type_id == type_id and v.skin_id > 0 and v.star > 0 then
return v.skin_id
end
end
for k,v in pairs(role_vo.foster_sub_skin_list) do
if v.type_id == type_id and v.skin_id > 0 and v.star > 0 then
return v.skin_id
end
end
end
return 0
end
-- 获取当前进阶系统是否为强进阶类型
function FosterModel:GetIsStrongFoster(type_id)
if not type_id then
return false
end
return type_id < FosterConst.ModuleId.FJarvis
end
--计算核心加成属性战力
--module_type模型类型
--进阶阶级
--进阶星级
--进阶丹类型
--[转换进阶丹属性]
function FosterModel:MathFosterKernelFighting( module_type,grade,star,kernel_type )--221
local data = self:GetBaseConfOne( module_type,grade,star )
local base_attr = stringtotable(data.attrs)--进阶基础属性
--------------------------进阶丹属性
local all_kernel_list = {}
local kernel_attr = nil--增加的进阶丹属性
local conf_list = self:GetKernelConf(module_type)
for key, value in pairs(conf_list) do
local cur_use_num = self:GetKernelUseNum(module_type, value.kind)--某丹使用数量
local attr_temp = stringtotable(value.ext)--单丹属性
if kernel_type + 1 == key then
kernel_attr = DeepCopy(attr_temp)
end
for k,v in pairs(attr_temp) do
attr_temp[k][2] = attr_temp[k][2] * cur_use_num
end
all_kernel_list = CombineAttrList( all_kernel_list, attr_temp )
end
local base_temp_attr = {}--合起来的基础总属性
local percent_attr = 0
for i,v in ipairs(base_attr) do--把基础属性都合起来
if v[1] ~= 20 and v[1] ~= 52 and v[1] ~= 55 and v[1] ~= 53 then--总生命/爆伤加成/会心伤害
if v[2] > 0 then
if not base_temp_attr[v[1]] then
base_temp_attr[v[1]] = {v[1],v[2]}
else
base_temp_attr[v[1]] = {v[1],v[2] + base_temp_attr[v[1]][2]}
end
end
end
end
for i,v in ipairs(all_kernel_list) do--把基础属性都合起来
if v[1] == 68 then
percent_attr = v[2]/10000
else
if v[2] > 0 then
if not base_temp_attr[v[1]] then
base_temp_attr[v[1]] = {v[1],v[2]}
else
base_temp_attr[v[1]] = {v[1],v[2] + base_temp_attr[v[1]][2]}
end
end
end
end
local base_sum_attr = {}
for i,v in pairs(base_temp_attr) do
base_sum_attr[#base_sum_attr + 1] = v
end
--上面先算原本的战力
--接下来算这个进阶丹的战力
local new_temp_attr = {}
local new_percent_attr = 0
for i,v in ipairs(kernel_attr) do
if v[1] == 68 then
new_percent_attr = v[2]/10000
else
if v[2] > 0 then
if not new_temp_attr[v[1]] then
new_temp_attr[v[1]] = {v[1],v[2]}
else
new_temp_attr[v[1]] = {v[1],v[2] + new_temp_attr[v[1]][2]}
end
end
end
end
local kernel_attr = {}
for i,v in pairs(new_temp_attr) do
kernel_attr[#kernel_attr + 1] = v
end
if new_percent_attr == 0 then--没有加成属性就随便算
for i,v in ipairs(kernel_attr) do
v[2] = v[2]*(1+percent_attr)
end
return GetFighting(kernel_attr,false)--已拥有填true
end
local new_sum_attr = CombineAttrList( DeepCopy(base_sum_attr), kernel_attr )
for i,v in pairs(new_sum_attr) do--这里把合成的总属性算出来
v[2] = v[2]*(1 + new_percent_attr + percent_attr)
end
for i,v in pairs(base_sum_attr) do--基础的属性也算上加成
v[2] = v[2]*(1+percent_attr)
end
local final_attr = GetAttributeOffset2(base_sum_attr,new_sum_attr)--获得属性差值 四舍五入转化战力
for i,v in ipairs(final_attr) do
v[2] = round(v[2])
end
-- print("huangcong:FosterModel [start:1865] :", final_attr)
-- PrintTable(final_attr)
-- print("huangcong:FosterModel [end]")
local new_fighting = GetFighting(final_attr,false)--已拥有填true
return new_fighting
end