You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
305 lines
7.8 KiB
Lua
305 lines
7.8 KiB
Lua
local skynet = require "skynet"
|
|
local cjson = require "cjson"
|
|
local artifactlogic = require "artifactlogic"
|
|
local mqhelper = require "mqhelper"
|
|
local settings = require "settings"
|
|
|
|
require "functions"
|
|
|
|
local artifactmodel = {}
|
|
|
|
function artifactmodel:init(arts)
|
|
arts = arts or {}
|
|
self.arts = {}
|
|
for _, v in ipairs(arts) do
|
|
if v.num > 0 then
|
|
local art = {}
|
|
art.id = self:getid(v.artid, v.star)
|
|
art.artid = v.artid
|
|
art.star = v.star
|
|
art.num = v.num
|
|
art.collect_emblemstar = v.collect_emblemstar or 0 --收集徽星次数
|
|
art.heroid = v.heroid or {}
|
|
table.insert(self.arts, art)
|
|
end
|
|
end
|
|
|
|
end
|
|
|
|
function artifactmodel:getid(artid, star)
|
|
return math.floor(artid * 1000 + star)
|
|
end
|
|
|
|
function artifactmodel:add(data)
|
|
local id = self:getid(data.artid, 1)
|
|
local art = self:getart(id)
|
|
if art ~= nil then
|
|
art.num = art.num + 1
|
|
self:save(art.id)
|
|
else
|
|
local art = {}
|
|
art.id = id
|
|
art.artid = data.artid
|
|
art.star = 1
|
|
art.num = 1
|
|
art.heroid = {}
|
|
art.collect_emblemstar = 0
|
|
table.insert(self.arts, art)
|
|
self:save(art.id)
|
|
end
|
|
end
|
|
|
|
function artifactmodel:getart(id)
|
|
for i,art in ipairs(self.arts) do
|
|
if art.id == id then
|
|
return art
|
|
end
|
|
end
|
|
end
|
|
|
|
function artifactmodel:getartbyartid(artid)
|
|
local star = 0
|
|
for i,art in ipairs(self.arts) do
|
|
if artid == art.artid and art.star > star then
|
|
star = art.star
|
|
end
|
|
end
|
|
return star
|
|
end
|
|
|
|
--获取收集过的次数
|
|
function artifactmodel:getcollectcount(artid)
|
|
local n = 0
|
|
for i,art in ipairs(self.arts) do
|
|
if artid == art.artid then
|
|
n = n + art.collect_emblemstar
|
|
end
|
|
end
|
|
return n
|
|
end
|
|
|
|
--收集徽星
|
|
-- function artifactmodel:collectemblemstar(artid, n)
|
|
-- local art = self:getart(id)
|
|
-- -- DEBUG("collectemblemstar art = ", DUMP(art))
|
|
-- assert(art~=nil, " collectemblemstar 不存在的鱼灵 ")
|
|
-- assert(art.collect_emblemstar < art.star, " 收集失败 ")
|
|
-- art.collect_emblemstar = art.collect_emblemstar + 1
|
|
-- self:save(id)
|
|
-- end
|
|
|
|
--收集徽星
|
|
function artifactmodel:collectemblemstar(artid)
|
|
local t = {}
|
|
for i,art in ipairs(self.arts) do
|
|
if artid == art.artid then
|
|
table.insert(t, art)
|
|
end
|
|
end
|
|
table.sort( t, function(a, b) return a.star < b.star end)
|
|
for _, art in ipairs(t) do
|
|
if art.collect_emblemstar == 0 then
|
|
art.collect_emblemstar = 1
|
|
self:save(art.id)
|
|
return art.star
|
|
end
|
|
end
|
|
return 0
|
|
end
|
|
|
|
--获取收集徽星的阶段
|
|
function artifactmodel:getcollectemblemstar(id)
|
|
local art = self:getart(id)
|
|
assert(art~=nil, " getcollectemblemstar 不存在的鱼灵 ")
|
|
return art.collect_emblemstar
|
|
end
|
|
|
|
|
|
function artifactmodel:wear(id, heroid)
|
|
local art = self:getart(id)
|
|
assert(art~=nil and art.num > 0, "不存在的鱼灵")
|
|
table.insert(art.heroid, heroid)
|
|
self:save(id)
|
|
end
|
|
|
|
|
|
function artifactmodel:getartbyheroid(heroid)
|
|
for artid, art in ipairs(self.arts) do
|
|
local h = art.heroid
|
|
for i,v in ipairs(h) do
|
|
if v == heroid then
|
|
return art
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
function artifactmodel:takeoffqi(heroid)
|
|
local found = false
|
|
for artid, art in ipairs(self.arts) do
|
|
for i,v in ipairs(art.heroid) do
|
|
if checkint(v) == heroid then
|
|
table.remove(art.heroid, i)
|
|
found = true
|
|
self:save(art.id)
|
|
break
|
|
end
|
|
end
|
|
if found then
|
|
break
|
|
end
|
|
end
|
|
end
|
|
|
|
function artifactmodel:serialize()
|
|
local temps = {}
|
|
for k,v in ipairs(self.arts) do
|
|
local temp = {}
|
|
if v.num > 0 then
|
|
temp.id = self:getid(v.artid, v.star)
|
|
temp.artid = v.artid
|
|
temp.star = v.star
|
|
temp.num = v.num
|
|
temp.heroid = table.array(v.heroid)
|
|
table.insert(temps, temp)
|
|
end
|
|
end
|
|
return table.array(temps)
|
|
end
|
|
|
|
|
|
--图鉴
|
|
function artifactmodel:serializebook()
|
|
|
|
local function checkstar(a, t)
|
|
local found = false
|
|
for i,v in ipairs(t) do
|
|
if a.artid == v.artid then
|
|
found = true
|
|
break
|
|
end
|
|
end
|
|
if found then
|
|
for i,v in ipairs(t) do
|
|
if a.artid == v.artid and a.star > v.star then
|
|
return true
|
|
end
|
|
end
|
|
else
|
|
return true
|
|
end
|
|
return false
|
|
end
|
|
|
|
local temps = {}
|
|
for k,v in ipairs(self.arts) do
|
|
local temp = {}
|
|
if v.num > 0 and checkstar(v, temps) then
|
|
temp.id = self:getid(v.artid, v.star)
|
|
temp.artid = v.artid
|
|
temp.star = v.star
|
|
temp.num = v.num
|
|
temp.heroid = table.array(v.heroid)
|
|
temp.collect_emblemstar = v.collect_emblemstar
|
|
table.insert(temps, temp)
|
|
end
|
|
end
|
|
return table.array(temps)
|
|
end
|
|
|
|
--序列化可以穿身上的鱼灵
|
|
function artifactmodel:serializewaer()
|
|
local arts = {}
|
|
for artid, art in ipairs(self.arts) do
|
|
if art.num > #art.heroid then
|
|
table.insert(arts, art)
|
|
end
|
|
end
|
|
return arts
|
|
end
|
|
|
|
--检查鱼灵升星
|
|
function artifactmodel:checkstarup(id)
|
|
local art = self:getart(id)
|
|
assert(art~=nil, " starup 不存在的鱼灵 ")
|
|
local cnf = artifactlogic.getconf(id)
|
|
local spend = cnf.spend
|
|
local h = art.heroid
|
|
if spend <= 0 or art.num - #h <= spend then
|
|
return false
|
|
end
|
|
return true
|
|
end
|
|
|
|
--鱼灵升星
|
|
function artifactmodel:starup(id)
|
|
local art = self:getart(id)
|
|
assert(art~=nil, " starup 不存在的鱼灵 ")
|
|
local h = art.heroid
|
|
local cnf = artifactlogic.getconf(id)
|
|
local spend = cnf.spend
|
|
assert(spend > 0, " 不能升星 ")
|
|
assert(art.num - #h > spend, " 鱼灵数量不够 ")
|
|
local artid = art.artid
|
|
local star = art.star + 1
|
|
local newid = self:getid(artid, star)
|
|
local newart = self:getart(newid)
|
|
--存在高星鱼灵
|
|
if newart ~= nil then
|
|
newart.num = newart.num + 1
|
|
self:save(newart.id)
|
|
else
|
|
local newart = {}
|
|
newart.id = self:getid(artid, star)
|
|
newart.artid = artid
|
|
newart.star = star
|
|
newart.num = 1
|
|
newart.heroid = {}
|
|
newart.collect_emblemstar = 0
|
|
table.insert(self.arts, newart)
|
|
self:save(newart.id)
|
|
end
|
|
art.num = art.num - spend - 1
|
|
self:save(art.id)
|
|
DEBUG("starup arts = ", DUMP(arts))
|
|
end
|
|
|
|
|
|
function artifactmodel:getattrabs(k, heroid)
|
|
local art = self:getartbyheroid(heroid)
|
|
if art ~= nil then
|
|
return artifactlogic.getattrabs(k, art.id)
|
|
end
|
|
return 0
|
|
end
|
|
|
|
|
|
function artifactmodel:getattrext(k, heroid)
|
|
local art = self:getartbyheroid(heroid)
|
|
if art ~= nil then
|
|
return artifactlogic.getattrext(k, art.id)
|
|
end
|
|
return 0
|
|
end
|
|
|
|
function artifactmodel:getlimitattrext(k, heroid)
|
|
local art = self:getartbyheroid(heroid)
|
|
if art ~= nil then
|
|
return artifactlogic.getlimitattrext(k, heroid, art.id)
|
|
end
|
|
return 0
|
|
end
|
|
|
|
|
|
function artifactmodel:save(id)
|
|
local art = self:getart(id)
|
|
assert(art~=nil, " save 不存在的鱼灵 ")
|
|
local data = clone(art)
|
|
data.id = nil
|
|
DEBUG("artifactmodel save = ", cjson.encode(data))
|
|
local ok = skynet.call(".usercenterd", "lua", "saveartifact", UID, data)
|
|
local ok = mqhelper.exec("upsert", UID, settings.artifact_mongodb_key.tname, settings.artifact_mongodb_key.cname, {["$set"]=data}, {artid=data.artid, star=data.star, uid=UID})
|
|
end
|
|
|
|
return artifactmodel
|