diff --git a/src/models/Daily.lua b/src/models/Daily.lua index 1dcd79b..463f2a4 100644 --- a/src/models/Daily.lua +++ b/src/models/Daily.lua @@ -3,47 +3,47 @@ local Daily = class("Daily", require("shared.ModelBase")) function Daily:ctor(properties) - Daily.super.ctor(self, properties) + Daily.super.ctor(self, properties) end Daily.schema = { - commentHero = {"string", ""}, --单日评论食灵记录 type=1 - hangQC ={"number", 0}, -- 挂机快速次数 + commentHero = {"string", ""}, --单日评论食灵记录 type=1 + hangQC ={"number", 0}, -- 挂机快速次数 } function Daily:updateProperty(params) - local type, default = table.unpack(self.schema[params.field]) - - if params.delta then - self:setProperty(params.field, self:getProperty(paramsfield) + params.delta) - self.owner:notifyUpdateProperty(params.field, self:getProperty(params.field)) - return true - end - if params.value then - self:setProperty(params.field, params.value) - self.owner:notifyUpdateProperty(params.field, self:getProperty(params.field)) - return true - end - return false + local type, default = table.unpack(self.schema[params.field]) + + if params.delta then + self:setProperty(params.field, self:getProperty(paramsfield) + params.delta) + self.owner:notifyUpdateProperty(params.field, self:getProperty(params.field)) + return true + end + if params.value then + self:setProperty(params.field, params.value) + self.owner:notifyUpdateProperty(params.field, self:getProperty(params.field)) + return true + end + return false end function Daily:refreshDailyData(notify) - for field, schema in pairs(self.schema) do - if field ~= "key" then - local typ, def = table.unpack(schema) - self:setProperty(field, def) - end - end - if notify then - self.owner:notifyUpdateProperties(self:data()) - end + for field, schema in pairs(self.schema) do + if field ~= "key" then + local typ, def = table.unpack(schema) + self:setProperty(field, def) + end + end + if notify then + self.owner:notifyUpdateProperties(self:data()) + end end function Daily:data() - return { - -- dailyTaskStatus = self:getProperty("dailyTaskStatus"), - hangQC = self:getProperty("hangQC"), - } + return { + -- dailyTaskStatus = self:getProperty("dailyTaskStatus"), + hangQC = self:getProperty("hangQC"), + } end return Daily \ No newline at end of file diff --git a/src/models/Hero.lua b/src/models/Hero.lua index 65ac74b..83a8e99 100644 --- a/src/models/Hero.lua +++ b/src/models/Hero.lua @@ -6,15 +6,15 @@ HeroPlugin.bind(Hero) Hero.schema = { id = {"number"}, type = {"number", 0}, - level = {"number", 1}, -- 等级 - breakL = {"number", 0}, -- 突破等级 - wakeL = {"number", 0}, -- 觉醒等级 - skillL = {"string", ""}, -- 技能等级 1=1 2=1 3=1 - talent = {"string", ""}, -- 0=阶段 1=1 2=1 3=1 4=1 四个天赋当前阶段的等级 阶段默认为1 等级默认为0 + level = {"number", 1}, -- 等级 + breakL = {"number", 0}, -- 突破等级 + wakeL = {"number", 0}, -- 觉醒等级 + skillL = {"string", ""}, -- 技能等级 1=1 2=1 3=1 + talent = {"string", ""}, -- 0=阶段 1=1 2=1 3=1 4=1 四个天赋当前阶段的等级 阶段默认为1 等级默认为0 battleV = {"number", 0}, -- 保存战斗力 - loveExp = {"number", 0}, --好感度经验 - loveL = {"number", 0}, --好感度等级 - skin = {"number", 0}, --皮肤 0 、 1、 2、 3 + loveExp = {"number", 0}, --好感度经验 + loveL = {"number", 0}, --好感度等级 + skin = {"number", 0}, --皮肤 0 、 1、 2、 3 } function Hero:ctor( properties ) @@ -22,65 +22,65 @@ function Hero:ctor( properties ) end function Hero:notifyUpdateProperty(field, newValue, oldValue) - local updateData = { - id = self:getProperty("id"), - datas = { - { - key = field, - newValue = newValue, - oldValue = oldValue or "", - }, - } - } + local updateData = { + id = self:getProperty("id"), + datas = { + { + key = field, + newValue = newValue, + oldValue = oldValue or "", + }, + } + } - SendPacket(actionCodes.Hero_updateProperty, MsgPack.pack(updateData)) + SendPacket(actionCodes.Hero_updateProperty, MsgPack.pack(updateData)) end function Hero:notifyUpdateProperties(params) - local updateData = { - id = self:getProperty("id"), - datas = params - } + local updateData = { + id = self:getProperty("id"), + datas = params + } - SendPacket(actionCodes.Hero_updateProperty, MsgPack.pack(updateData)) + SendPacket(actionCodes.Hero_updateProperty, MsgPack.pack(updateData)) end function Hero:updateProperty(params) - if not params.field or (not params.delta and not params.value) then - return - end - if params.delta then - self:incrProperty(params.field, params.delta) - elseif params.value then - self:setProperty(params.field, params.value) - end - local datas = {} - table.insert(datas, {key = params.field, newValue = self:getProperty(params.field)}) + if not params.field or (not params.delta and not params.value) then + return + end + if params.delta then + self:incrProperty(params.field, params.delta) + elseif params.value then + self:setProperty(params.field, params.value) + end + local datas = {} + table.insert(datas, {key = params.field, newValue = self:getProperty(params.field)}) - local check = {level = true, breakL = true, wakeL = true, talent = true, loveL = true, skin = true} - if check[params.field] then - local orginValue = self:getProperty("battleV") - local curValue = self:saveBattleValue() - if orginValue ~= curValue then - table.insert(datas, { key = "battleV", newValue = curValue }) - end - end + local check = {level = true, breakL = true, wakeL = true, talent = true, loveL = true, skin = true} + if check[params.field] then + local orginValue = self:getProperty("battleV") + local curValue = self:saveBattleValue() + if orginValue ~= curValue then + table.insert(datas, { key = "battleV", newValue = curValue }) + end + end - self:notifyUpdateProperties(datas) + self:notifyUpdateProperties(datas) end function Hero:data() return { id = self:getProperty("id"), type = self:getProperty("type"), - level = self:getProperty("level"), - breakL = self:getProperty("breakL"), - wakeL = self:getProperty("wakeL"), - skillL = self:getProperty("skillL"), - talent = self:getProperty("talent"), - battleV = self:getProperty("battleV"), - loveExp = self:getProperty("loveExp"), - loveL = self:getProperty("loveL"), + level = self:getProperty("level"), + breakL = self:getProperty("breakL"), + wakeL = self:getProperty("wakeL"), + skillL = self:getProperty("skillL"), + talent = self:getProperty("talent"), + battleV = self:getProperty("battleV"), + loveExp = self:getProperty("loveExp"), + loveL = self:getProperty("loveL"), skin = self:getProperty("skin"), } end diff --git a/src/models/HeroPlugin.lua b/src/models/HeroPlugin.lua index 132cef6..ed7a363 100644 --- a/src/models/HeroPlugin.lua +++ b/src/models/HeroPlugin.lua @@ -3,144 +3,144 @@ local HeroPlugin = {} function HeroPlugin.bind(Hero) - function Hero:getMaxLevel() - return math.min(#csvdb["unit_expCsv"], csvdb["unit_breakCsv"][self:getProperty("breakL")].levelLimit) - end - - function Hero:getSPoint() - local point = 0 - for i = 0, self:getProperty("wakeL") do - if csvdb["unit_wakeCsv"][i] then - point = point + csvdb["unit_wakeCsv"][i].sp - end - end - return point - end - - function Hero:getLSPoint() - local point = self:getSPoint() - for skill, level in pairs(self:getProperty("skillL"):toNumMap()) do - point = point - (level - 1) - end - return point - end - --角色属性值 = 基础属性值(unit)* [ 1 + 升级属性(unit_exp)+ 突破属性(unit_break)] * [ 1 + 觉醒属性(unit_wake)+ 天赋属性(unit_talent)] - function Hero:getBaseAttrs(params) - params = params or {} - local unitData = csvdb["unitCsv"][self:getProperty("type")] - local level = params.level or self:getProperty("level") - local breakL = params.breakL or self:getProperty("breakL") - local wakeL = params.wakeL or self:getProperty("wakeL") - local talent = params.talent or self:getProperty("talent") - - - local attrs = {} - for _, attName in pairs(AttsEnumEx) do - attrs[attName] = unitData[attName] or 0 - end - local lData = csvdb["unit_expCsv"][level] - local blData = csvdb["unit_breakCsv"][breakL] - -- core - for attr, value in pairs(attrs) do - attrs[attr] = attrs[attr] * (100 + (lData[attr .. "Level"] or 0) + (blData[attr .. "Level"] or 0)) / 100 - end - - local talentAttrS = {} - -- 天赋阶段属性 - for i = 1, (talent:getv(0, 1) - 1) do - local curData = csvdb["unit_talentCsv"][i] - local effect = curData[#curData].effect:toArray(true, "=") - talentAttrS[AttsEnumEx[effect[1]]] = (talentAttrS[AttsEnumEx[effect[1]]] or 0) + effect[2] - end - -- 四个基础属性 - local curData = csvdb["unit_talentCsv"][talent:getv(0, 1)] - if not curData then -- 已经满阶段了 - curData = csvdb["unit_talentCsv"][#csvdb["unit_talentCsv"]] - local strength = curData[#curData].strength - for i = 1, 4 do - talentAttrS[AttsEnumEx[i]] = (talentAttrS[AttsEnumEx[i]] or 0) + strength - end - else - for i = 1, 4 do --4个天赋 - talentAttrS[AttsEnumEx[i]] = (talentAttrS[AttsEnumEx[i]] or 0) + curData[talent:getv(i, 0)].strength - end - end - - --好感度 - local loveUp = {} - for i = 0, self:getProperty("loveL") do - local reward = csvdb["unit_love_effectCsv"][i]["reward"] - for attrId, value in pairs(reward:toNumMap()) do - loveUp[AttsEnumEx[attrId]] = (loveUp[AttsEnumEx[attrId]] or 0) + value - end - end - - --皮肤 - local skinUp = {} - local reward = (csvdb["unit_skinCsv"][self:getSkinId()] or {})["reward"] or "" - for attrId, value in pairs(reward:toNumMap()) do - skinUp[AttsEnumEx[attrId]] = (skinUp[AttsEnumEx[attrId]] or 0) + value - end - - --觉醒 - local wData = csvdb["unit_wakeCsv"][wakeL] - for attr, value in pairs(attrs) do - attrs[attr] = attrs[attr] * (100 + (wData[attr .. "Level"] or 0) + (talentAttrS[attr] or 0) + (loveUp[attr] or 0) + (skinUp[attr] or 0)) / 100 - end - - return attrs - end - - --当前属性 = [ 角色属性值 + 基础装备(固定)+ 专属装备(固定)] * [ 1 + 基础装备(百分比) + 专属装备(百分比)] - function Hero:getTotalAttrs(params) - local attrs = self:getBaseAttrs() - return attrs - end - -- 战斗力(当前属性)= POWER[(生命 + 防御 * 7 + 闪避 * 4)*(攻击 + 命中 * 4)*(1 + 暴击几率/100 * 暴击伤害/100)* 攻击速度 / 60000 ,0.8 ] - function Hero:getBattleValue() - local attrs = self:getTotalAttrs() - local battleValue = ((attrs["hp"] + attrs["def"] * 7 + attrs["miss"] * 4) * (attrs["atk"] + attrs["hit"] * 4) * (1 + attrs["crit"]/100 * attrs["critHurt"]/100) * attrs["atkSpeed"] / 60000) ^ 0.8 - return math.floor(battleValue) - end - - function Hero:saveBattleValue() - local battleValue = self:getBattleValue() - if battleValue ~= self:getProperty("battleV") then - self:setProperty("battleV", battleValue) - end - return battleValue - end - - function Hero:getSkillLevel(idx) - return self:getProperty("skillL"):getv(idx, 1) - end - - function Hero:getSkillData(idx, skin) - local unitData = csvdb["unitCsv"][self:getSkinId(skin)] - if idx == 1 then - return csvdb["skill_blockCsv"][unitData.block] - elseif idx == 2 then - return csvdb["skill_specialCsv"][unitData.special] - elseif idx == 3 then - return csvdb["skill_passiveCsv"][unitData.passive] - elseif idx == 4 then --冒险技能 - if unitData.adv > 1000 then - return csvdb["adv_skill_passiveCsv"][unitData.adv] - else - return csvdb["adv_skillCsv"][unitData.adv] - end - end - return {} - end - - function Hero:getSkinId(skin) - skin = skin or self:getProperty("skin") - if skin == 0 then - return self:getProperty("type") - else - return 30000 + self:getProperty("type") * 10 + skin - end - end + function Hero:getMaxLevel() + return math.min(#csvdb["unit_expCsv"], csvdb["unit_breakCsv"][self:getProperty("breakL")].levelLimit) + end + + function Hero:getSPoint() + local point = 0 + for i = 0, self:getProperty("wakeL") do + if csvdb["unit_wakeCsv"][i] then + point = point + csvdb["unit_wakeCsv"][i].sp + end + end + return point + end + + function Hero:getLSPoint() + local point = self:getSPoint() + for skill, level in pairs(self:getProperty("skillL"):toNumMap()) do + point = point - (level - 1) + end + return point + end + --角色属性值 = 基础属性值(unit)* [ 1 + 升级属性(unit_exp)+ 突破属性(unit_break)] * [ 1 + 觉醒属性(unit_wake)+ 天赋属性(unit_talent)] + function Hero:getBaseAttrs(params) + params = params or {} + local unitData = csvdb["unitCsv"][self:getProperty("type")] + local level = params.level or self:getProperty("level") + local breakL = params.breakL or self:getProperty("breakL") + local wakeL = params.wakeL or self:getProperty("wakeL") + local talent = params.talent or self:getProperty("talent") + + + local attrs = {} + for _, attName in pairs(AttsEnumEx) do + attrs[attName] = unitData[attName] or 0 + end + local lData = csvdb["unit_expCsv"][level] + local blData = csvdb["unit_breakCsv"][breakL] + -- core + for attr, value in pairs(attrs) do + attrs[attr] = attrs[attr] * (100 + (lData[attr .. "Level"] or 0) + (blData[attr .. "Level"] or 0)) / 100 + end + + local talentAttrS = {} + -- 天赋阶段属性 + for i = 1, (talent:getv(0, 1) - 1) do + local curData = csvdb["unit_talentCsv"][i] + local effect = curData[#curData].effect:toArray(true, "=") + talentAttrS[AttsEnumEx[effect[1]]] = (talentAttrS[AttsEnumEx[effect[1]]] or 0) + effect[2] + end + -- 四个基础属性 + local curData = csvdb["unit_talentCsv"][talent:getv(0, 1)] + if not curData then -- 已经满阶段了 + curData = csvdb["unit_talentCsv"][#csvdb["unit_talentCsv"]] + local strength = curData[#curData].strength + for i = 1, 4 do + talentAttrS[AttsEnumEx[i]] = (talentAttrS[AttsEnumEx[i]] or 0) + strength + end + else + for i = 1, 4 do --4个天赋 + talentAttrS[AttsEnumEx[i]] = (talentAttrS[AttsEnumEx[i]] or 0) + curData[talent:getv(i, 0)].strength + end + end + + --好感度 + local loveUp = {} + for i = 0, self:getProperty("loveL") do + local reward = csvdb["unit_love_effectCsv"][i]["reward"] + for attrId, value in pairs(reward:toNumMap()) do + loveUp[AttsEnumEx[attrId]] = (loveUp[AttsEnumEx[attrId]] or 0) + value + end + end + + --皮肤 + local skinUp = {} + local reward = (csvdb["unit_skinCsv"][self:getSkinId()] or {})["reward"] or "" + for attrId, value in pairs(reward:toNumMap()) do + skinUp[AttsEnumEx[attrId]] = (skinUp[AttsEnumEx[attrId]] or 0) + value + end + + --觉醒 + local wData = csvdb["unit_wakeCsv"][wakeL] + for attr, value in pairs(attrs) do + attrs[attr] = attrs[attr] * (100 + (wData[attr .. "Level"] or 0) + (talentAttrS[attr] or 0) + (loveUp[attr] or 0) + (skinUp[attr] or 0)) / 100 + end + + return attrs + end + + --当前属性 = [ 角色属性值 + 基础装备(固定)+ 专属装备(固定)] * [ 1 + 基础装备(百分比) + 专属装备(百分比)] + function Hero:getTotalAttrs(params) + local attrs = self:getBaseAttrs() + return attrs + end + -- 战斗力(当前属性)= POWER[(生命 + 防御 * 7 + 闪避 * 4)*(攻击 + 命中 * 4)*(1 + 暴击几率/100 * 暴击伤害/100)* 攻击速度 / 60000 ,0.8 ] + function Hero:getBattleValue() + local attrs = self:getTotalAttrs() + local battleValue = ((attrs["hp"] + attrs["def"] * 7 + attrs["miss"] * 4) * (attrs["atk"] + attrs["hit"] * 4) * (1 + attrs["crit"]/100 * attrs["critHurt"]/100) * attrs["atkSpeed"] / 60000) ^ 0.8 + return math.floor(battleValue) + end + + function Hero:saveBattleValue() + local battleValue = self:getBattleValue() + if battleValue ~= self:getProperty("battleV") then + self:setProperty("battleV", battleValue) + end + return battleValue + end + + function Hero:getSkillLevel(idx) + return self:getProperty("skillL"):getv(idx, 1) + end + + function Hero:getSkillData(idx, skin) + local unitData = csvdb["unitCsv"][self:getSkinId(skin)] + if idx == 1 then + return csvdb["skill_blockCsv"][unitData.block] + elseif idx == 2 then + return csvdb["skill_specialCsv"][unitData.special] + elseif idx == 3 then + return csvdb["skill_passiveCsv"][unitData.passive] + elseif idx == 4 then --冒险技能 + if unitData.adv > 1000 then + return csvdb["adv_skill_passiveCsv"][unitData.adv] + else + return csvdb["adv_skillCsv"][unitData.adv] + end + end + return {} + end + + function Hero:getSkinId(skin) + skin = skin or self:getProperty("skin") + if skin == 0 then + return self:getProperty("type") + else + return 30000 + self:getProperty("type") * 10 + skin + end + end end -- libgit2 0.21.2