ShapeModel = ShapeModel or BaseClass(BaseVo, true)
|
|
local ShapeModel = ShapeModel
|
|
|
|
ShapeModel.REQ_BASE_INFO = 'ShapeModel.REQ_BASE_INFO' -- 基础珍宝信息
|
|
ShapeModel.ANS_BASE_INFO = 'ShapeModel.ANS_BASE_INFO' -- 基础珍宝信息
|
|
ShapeModel.REQ_UP_OR_ACTIVE = 'ShapeModel.REQ_UP_OR_ACTIVE' -- 进阶or激活
|
|
ShapeModel.ANS_UP_OR_ACTIVE = 'ShapeModel.ANS_UP_OR_ACTIVE' -- 进阶or激活
|
|
ShapeModel.REQ_CHANGE_SKIN = 'ShapeModel.REQ_CHANGE_SKIN' -- 换肤
|
|
ShapeModel.ANS_CHANGE_SKIN = 'ShapeModel.ANS_CHANGE_SKIN' -- 换肤
|
|
ShapeModel.RedDotRefresh = 'ShapeModel.RedDotRefresh' -- 红点
|
|
|
|
ShapeModel.OPEN_BASE_VIEW = 'ShapeModel.OPEN_BASE_VIEW' -- 主界面
|
|
ShapeModel.OPEN_SUCCESS_VIEW = 'ShapeModel.OPEN_SUCCESS_VIEW' -- 成功界面
|
|
|
|
function ShapeModel:__init()
|
|
ShapeModel.Instance = self
|
|
self:Reset()
|
|
end
|
|
|
|
function ShapeModel:Reset()
|
|
self.base_data = {}
|
|
self.show_tab_list = {}
|
|
self.show_model_resource_list = {}
|
|
self.show_tab_type_list = false
|
|
self.goods_id_conf_list = false--物品id对照表
|
|
-------------------------
|
|
self.red_active = {}
|
|
self.red_up = {}
|
|
end
|
|
|
|
function ShapeModel:GetInstance()
|
|
if ShapeModel.Instance == nil then
|
|
ShapeModel.Instance = ShapeModel.New()
|
|
end
|
|
return ShapeModel.Instance
|
|
end
|
|
|
|
function ShapeModel:getInstance()
|
|
if ShapeModel.Instance == nil then
|
|
ShapeModel.Instance = ShapeModel.New()
|
|
end
|
|
return ShapeModel.Instance
|
|
end
|
|
|
|
--基础信息
|
|
function ShapeModel:GetBaseData( type_id )
|
|
if type_id then
|
|
return self.base_data[type_id] or {}
|
|
else
|
|
return self.base_data
|
|
end
|
|
end
|
|
--获取某类型数据
|
|
function ShapeModel:SetBaseData( data )
|
|
if data and data.type then
|
|
self.base_data[data.type] = data.skins
|
|
self:SetFightValData(data.type)
|
|
end
|
|
end
|
|
--获得单条数据
|
|
function ShapeModel:GetOneDataById( type_id,id )
|
|
if type_id and id and self.base_data[type_id] then
|
|
for k,v in pairs(self.base_data[type_id]) do
|
|
if v.id == id then
|
|
return v
|
|
end
|
|
end
|
|
end
|
|
end
|
|
--更新单数据
|
|
function ShapeModel:RefreshOneData( type_id,id,key,value )
|
|
local data = self:GetOneDataById(type_id,id)
|
|
if data and key then
|
|
data[key] = value
|
|
return true
|
|
end
|
|
return false
|
|
end
|
|
|
|
-- 设置珍宝战力数据
|
|
function ShapeModel:SetFightValData(type_id)
|
|
self.fightValList = self.fightValList or {}
|
|
self.fightValList[type_id] = self.fightValList[type_id] or {}
|
|
--属性
|
|
for key, value in pairs(self.base_data[type_id]) do
|
|
local conf = self:GetConfByStar( type_id, value.id, value.star )
|
|
if conf then
|
|
local base_attr = SortAttrList(stringtotable(conf.attrs))
|
|
--技能
|
|
local skill_info = stringtotable(conf.skills)[1]
|
|
local _,skill_power = GetSkillAttrBySkill( skill_info[1], skill_info[2], true ,value)
|
|
self.fightValList[type_id][value.id] = GetFighting(base_attr,true) + skill_power
|
|
end
|
|
end
|
|
end
|
|
|
|
-- 获取珍宝战力(默认当前已激活珍宝)
|
|
function ShapeModel:GetFightValOneData(type_id, id)
|
|
if type_id and self.fightValList and self.fightValList[type_id] then
|
|
local res = 0
|
|
for key, value in pairs(self.fightValList[type_id]) do
|
|
if self:GetIsActive(type_id, key) then
|
|
res = res + (self.fightValList[type_id][key] or 0)
|
|
end
|
|
end
|
|
return res
|
|
else
|
|
return 0
|
|
end
|
|
end
|
|
|
|
--更新使用皮肤
|
|
function ShapeModel:RefreshSkinUsing( type_id,skin,star )
|
|
local bool = false
|
|
if self.base_data[type_id] then
|
|
for k,v in pairs(self.base_data[type_id]) do
|
|
if v.id == skin then
|
|
v.display = star
|
|
bool = bool or (star > 0)
|
|
else
|
|
v.display = 0
|
|
end
|
|
end
|
|
end
|
|
return bool
|
|
end
|
|
|
|
--获得当前使用中的皮肤
|
|
function ShapeModel:GetUsingByType( type_id )
|
|
if self.base_data[type_id] then
|
|
for k,v in pairs(self.base_data[type_id]) do
|
|
if v.display > 0 then
|
|
return v.id,v.display
|
|
end
|
|
end
|
|
end
|
|
return 0,1
|
|
end
|
|
--获得配置
|
|
function ShapeModel:GetConfByStar( type_id,id,star )
|
|
return Config.Fosterskin[type_id .. "@" .. id .. "@" .. star]
|
|
end
|
|
|
|
function ShapeModel:GetModelRes( main_type, id, star )
|
|
local conf = self:GetConfByStar(main_type, id ,star)
|
|
return conf and conf.model or 0
|
|
end
|
|
|
|
--是否满级
|
|
function ShapeModel:GetIsMaxStar( type_id,id )
|
|
local base = self:GetOneDataById(type_id,id)
|
|
if base then
|
|
local conf = self:GetConfByStar(type_id,id,base.star)
|
|
return not (base.star > 0 and conf.next_star~=0)
|
|
end
|
|
return false
|
|
end
|
|
--是否已激活
|
|
function ShapeModel:GetIsActive( type_id,id )
|
|
local base = self:GetOneDataById(type_id,id)
|
|
return base and base.star > 0
|
|
end
|
|
-------------------------
|
|
--获取已经解锁的珍宝大类
|
|
function ShapeModel:GetUnlockType( )
|
|
if not self.show_tab_type_list then
|
|
self.show_tab_type_list = {}
|
|
for k,v in pairs(Config.Fosterskin) do
|
|
self.show_tab_type_list[v.type] = true
|
|
end
|
|
end
|
|
return self.show_tab_type_list
|
|
end
|
|
|
|
--获取模型资源列表
|
|
function ShapeModel:GetModelList( type_id,id )
|
|
self.show_model_resource_list[type_id] = self.show_model_resource_list[type_id] or {}
|
|
if not self.show_model_resource_list[type_id][id] then
|
|
self.show_model_resource_list[type_id][id] = {}
|
|
local temp = {}--资源对应的最小阶数
|
|
for k,v in pairs(Config.Fosterskin) do
|
|
if v.type == type_id and v.id == id then
|
|
if not temp[v.model] then
|
|
temp[v.model] = v.star
|
|
else
|
|
temp[v.model] = temp[v.model] < v.star and temp[v.model] or v.star
|
|
end
|
|
end
|
|
end
|
|
for k,v in pairs(temp) do
|
|
table.insert( self.show_model_resource_list[type_id][id], {min_star = v, source_id = k} )
|
|
end
|
|
local function sort_call( a,b )
|
|
return a.min_star < b.min_star
|
|
end
|
|
table.sort( self.show_model_resource_list[type_id][id], sort_call )
|
|
end
|
|
return self.show_model_resource_list[type_id][id]
|
|
end
|
|
|
|
--是否显示珍宝
|
|
function ShapeModel:CanShowSkin( type_id, id )
|
|
--增加限制条件,不显示部分条目类型
|
|
-- 未激活&限制条件中&无激活道具
|
|
local conf = self:GetConfByStar( type_id,id,0 )
|
|
if not self:GetIsActive( type_id,id ) then--未激活
|
|
if not GoodsModel:getInstance():GetEnough( conf.cost ) then--无激活道具
|
|
if (conf.open_day > 0) and conf.open_day > ServerTimeModel:getInstance():GetOpenServerDay() then
|
|
--开服条件未符合
|
|
return false
|
|
end
|
|
if (conf.time > 0) and (conf.time > TimeUtil:getServerTime()) then
|
|
--开放事件不符合
|
|
return false
|
|
end
|
|
end
|
|
end
|
|
return true
|
|
end
|
|
|
|
function ShapeModel:GetTabList( type_id )
|
|
local need_show = true
|
|
local show_tab_list = {}
|
|
for k,v in pairs(Config.Fosterskin) do
|
|
if v.star == 0 and v.type == type_id then
|
|
if self:CanShowSkin( type_id, v.id ) then
|
|
table.insert( show_tab_list, v )
|
|
end
|
|
end
|
|
end
|
|
-------------------------
|
|
local function sort_call( a,b )
|
|
return a.order < b.order
|
|
end
|
|
table.sort( show_tab_list, sort_call )
|
|
return show_tab_list
|
|
end
|
|
|
|
function ShapeModel:CheckRedDot( check_new )
|
|
local bool = false
|
|
local list = self:GetUnlockType()
|
|
for k,v in pairs(list) do
|
|
bool = self:CheckRedByType(check_new,k) or bool
|
|
end
|
|
return bool
|
|
end
|
|
|
|
function ShapeModel:CheckRedByType( check_new,type_id )
|
|
local bool = false
|
|
local list = self:GetTabList( type_id )
|
|
for k,v in pairs(list) do
|
|
bool = self:CheckRedById(check_new,type_id,v.id) or bool
|
|
end
|
|
return bool
|
|
end
|
|
|
|
function ShapeModel:CheckRedById( check_new,type_id,id )
|
|
if check_new then
|
|
self:CheckCanActive( check_new,type_id,id )
|
|
self:CheckCanUp( check_new,type_id,id )
|
|
end
|
|
return (self.red_active[type_id] and self.red_active[type_id][id]) or (self.red_up[type_id] and self.red_up[type_id][id])
|
|
end
|
|
|
|
-- 打开界面或切换页签时默认显示可激活或可进阶的珍宝
|
|
function ShapeModel:GetDefaultShowTabIndex(index)
|
|
local tab_index = index
|
|
local sub_tab_index
|
|
local first_can_up = true
|
|
|
|
if index then
|
|
local sub_tab_list = self:GetTabList(index)
|
|
for key, value in pairsByKeys(sub_tab_list) do
|
|
sub_tab_index = sub_tab_index or value.id
|
|
if self:CheckCanActive(true, index, value.id) then
|
|
return index, value.id
|
|
end
|
|
if first_can_up and self:CheckCanUp(true, index, value.id) then
|
|
tab_index = index
|
|
sub_tab_index = value.id
|
|
first_can_up = false
|
|
end
|
|
end
|
|
else
|
|
local tab_list = self:GetUnlockType()
|
|
for k, v in pairsByKeys(tab_list) do
|
|
tab_index = tab_index or k
|
|
local sub_tab_list = self:GetTabList(k)
|
|
for kk, vv in pairsByKeys(sub_tab_list) do
|
|
sub_tab_index = sub_tab_index or vv.id
|
|
if self:CheckCanActive(true, k, vv.id) then
|
|
return k, vv.id
|
|
end
|
|
if first_can_up and self:CheckCanUp(true, k, vv.id) then
|
|
tab_index = k
|
|
sub_tab_index = vv.id
|
|
first_can_up = false
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
-- print("Lizhijian:ShapeModel [start:254] tab_index, sub_tab_index ------------------------------------------")
|
|
-- print(tab_index, sub_tab_index)
|
|
return tab_index, sub_tab_index or 1
|
|
end
|
|
|
|
function ShapeModel:CheckCanActive( check_new,type_id,id )
|
|
self.red_active[type_id] = self.red_active[type_id] or {}
|
|
if check_new then
|
|
self.red_active[type_id][id] = false
|
|
local data = self:GetOneDataById( type_id,id )
|
|
if self:GetIsActive(type_id,id) then
|
|
self.red_active[type_id][id] = false
|
|
else
|
|
local conf = self:GetConfByStar( type_id,id,0 )
|
|
if conf then
|
|
self.red_active[type_id][id] = GoodsModel:getInstance():GetEnough( conf.cost )
|
|
end
|
|
end
|
|
end
|
|
return self.red_active[type_id][id]
|
|
end
|
|
|
|
function ShapeModel:CheckCanUp( check_new,type_id,id )
|
|
self.red_up[type_id] = self.red_up[type_id] or {}
|
|
if check_new then
|
|
self.red_up[type_id][id] = false
|
|
local data = self:GetOneDataById( type_id,id )
|
|
if (not self:GetIsActive(type_id,id)) or self:GetIsMaxStar(type_id,id) then
|
|
self.red_up[type_id][id] = false
|
|
else
|
|
local conf = self:GetConfByStar( type_id,id,data.star )
|
|
if conf then
|
|
self.red_up[type_id][id] = GoodsModel:getInstance():GetEnough( conf.cost )
|
|
end
|
|
end
|
|
end
|
|
return self.red_up[type_id][id]
|
|
end
|
|
|
|
--通过物品id获得配置
|
|
function ShapeModel:GetConfByGoodsId( goods_id )
|
|
self:SetGoodsIdConfList( )
|
|
local show_data = self.goods_id_conf_list[goods_id]
|
|
if show_data then
|
|
local base_data = self:GetOneDataById(show_data.type, show_data.id)
|
|
return self:GetConfByStar( show_data.type, show_data.id, base_data and base_data.star or 1 ) or false
|
|
end
|
|
return false
|
|
end
|
|
|
|
--设置缓存表
|
|
function ShapeModel:SetGoodsIdConfList( )
|
|
if not self.goods_id_conf_list then
|
|
self.goods_id_conf_list = {}
|
|
local temp_list = {}
|
|
local temp_cost = false
|
|
for k,v in pairs(Config.Fosterskin) do
|
|
temp_list[v.type] = temp_list[v.type] or {}
|
|
if v.star == 0 then
|
|
if not temp_list[v.type][v.id] then
|
|
temp_list[v.type][v.id] = true
|
|
temp_cost = stringtotable(v.cost)
|
|
if temp_cost[1] and temp_cost[1][2] then
|
|
self.goods_id_conf_list[tonumber(temp_cost[1][2])] = {type = v.type,id = v.id}
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
--通过物品id获得基础属性
|
|
function ShapeModel:GetBaseAttrByGoodsId( goods_id )
|
|
self:SetGoodsIdConfList( )
|
|
local show_data = self.goods_id_conf_list[goods_id]
|
|
if show_data then
|
|
local conf = self:GetConfByStar( show_data.type, show_data.id,1 )
|
|
return stringtotable(conf.attrs)
|
|
else
|
|
return {}
|
|
end
|
|
end
|
|
|
|
--通过物品id获得是否可以有升级/激活
|
|
function ShapeModel:GetRedByGoodsId( goods_id )
|
|
self:SetGoodsIdConfList( )
|
|
local show_data = self.goods_id_conf_list[goods_id]
|
|
if show_data then
|
|
return self:CheckRedById(true,show_data.type,show_data.id)
|
|
else
|
|
return false
|
|
end
|
|
end
|
|
|
|
-- 快捷使用判断走这个
|
|
function ShapeModel:CheckCanUse(goods_vo)
|
|
local goods_id = goods_vo.type_id
|
|
local goods_num = goods_vo.goods_num
|
|
-- local goods_num = GoodsModel:getInstance():GetTypeGoodsNum(goods_id)
|
|
self:SetGoodsIdConfList( )
|
|
local show_data = self.goods_id_conf_list[goods_id]
|
|
local type_id = show_data.type
|
|
local id = show_data.id
|
|
|
|
local can_active = false
|
|
local can_up = false
|
|
-- 激活
|
|
if self:GetIsActive(type_id,id) then
|
|
can_active = false
|
|
else
|
|
local conf = self:GetConfByStar( type_id,id,0 )
|
|
if conf then
|
|
local cost = stringtotable(conf.cost)
|
|
if cost[1][3] <= goods_num then
|
|
can_active = true
|
|
end
|
|
end
|
|
end
|
|
|
|
-- 升星
|
|
if (not self:GetIsActive(type_id,id)) or self:GetIsMaxStar(type_id,id) then
|
|
can_up = false
|
|
else
|
|
local data = self:GetOneDataById( type_id,id )
|
|
local conf = self:GetConfByStar( type_id,id,data.star )
|
|
if conf then
|
|
local cost = stringtotable(conf.cost)
|
|
if cost[1][3] <= goods_num then
|
|
can_up = true
|
|
end
|
|
end
|
|
end
|
|
|
|
return can_up or can_active
|
|
end
|
|
|
|
function ShapeModel:GetPowerById( type_id, id )
|
|
local base_data = self:GetOneDataById(type_id, id)
|
|
local show_star = base_data and base_data.star or 0
|
|
-------------------------
|
|
--属性
|
|
local conf = self:GetConfByStar(type_id, id,show_star)
|
|
if not conf then return 0 end
|
|
local base_attr = SortAttrList(stringtotable(conf.attrs))
|
|
local next_conf = self:GetConfByStar(type_id, id,conf.next_star)
|
|
-------------------------
|
|
if not base_data then
|
|
local next_attr = next_conf and stringtotable(next_conf.attrs) or {}
|
|
base_attr = DeepCopy(next_attr)
|
|
end
|
|
-------------------------
|
|
--技能
|
|
local skill_info = stringtotable(conf.skills)[1]
|
|
if not base_data then
|
|
skill_info = stringtotable(next_conf.skills)[1]
|
|
end
|
|
-------------------------
|
|
local _,skill_power = GetSkillAttrBySkill( skill_info[1], skill_info[2], true ,base_data)
|
|
if base_data then
|
|
return GetFighting(base_attr,true) + skill_power
|
|
else
|
|
return GetFighting(base_attr,false) + skill_power
|
|
end
|
|
end
|