miduo_server/luafight/Modules/Battle/Logic/Base/RoleData.lua

118 lines
3.0 KiB
Lua

RoleData = {}
RoleData.__index = RoleData
local max = math.max
local dataOrder = {
RoleDataName.Level,
RoleDataName.Hp,
RoleDataName.MaxHp,
RoleDataName.Attack,
RoleDataName.PhysicalDefence,
RoleDataName.MagicDefence,
RoleDataName.Speed,
RoleDataName.DamageBocusFactor,
RoleDataName.DamageReduceFactor,
RoleDataName.Hit,
RoleDataName.Dodge,
RoleDataName.Crit,
RoleDataName.CritDamageFactor,
RoleDataName.TreatFacter,
RoleDataName.FireDamageBocusFactor,
RoleDataName.IceDamageBocusFactor,
RoleDataName.LightDamageBocusFactor,
RoleDataName.WindDamageBocusFactor,
RoleDataName.LandDamageBocusFactor,
RoleDataName.DarkDamageBocusFactor,
RoleDataName.FireDamageReduceFactor,
RoleDataName.IceDamageReduceFactor,
RoleDataName.LightDamageReduceFactor,
RoleDataName.WindDamageReduceFactor,
RoleDataName.LandDamageReduceFactor,
RoleDataName.DarkDamageReduceFactor,
}
function RoleData.New()
local instance = {role=0, data={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}}
setmetatable(instance, RoleData)
return instance
end
function RoleData:Init(role, data)
self.role = role
for i=1, #data do
self.data[dataOrder[i]] = data[i]
end
end
function RoleData:GetData(name)
if self.data[name] then
return self.data[name]
end
end
function RoleData:SetValue(name, value)
if self.data[name] then
local delta = self.data[name]
self.data[name] = value
delta = value - delta
if delta ~= 0 then
self.role.Event:DispatchEvent(BattleEventName.RolePropertyChanged, name, value, delta)
if BattleLogic.IsOpenBattleRecord then
BattleLogic.RecordRoleProperty(self.role.uid, self.role.camp, name, value, delta)
end
end
end
end
function RoleData:AddValue(name, delta)
if delta < 0 or not self.data[name] then --delta必须非负
return 0
end
if self.data[name] then
self:SetValue(name, self.data[name] + delta)
end
return delta
end
function RoleData:AddPencentValue(name, pencent)
if self.data[name] then
return self:AddValue(name, self.data[name] * pencent)
end
return 0
end
function RoleData:SubDeltaValue(name, delta)
if delta < 0 or not self.data[name] then --delta必须非负
return 0
end
if self.data[name] then
self:SetValue(name, self.data[name] - delta)
end
return delta
end
function RoleData:SubValue(name, delta)
if delta < 0 or not self.data[name] then --delta必须非负
return 0
end
local orVal = self.data[name]
if orVal then
self:SetValue(name, max(self.data[name] - delta, 0))
orVal = orVal - self.data[name]
end
return orVal
end
function RoleData:SubPencentValue(name, pencent)
if self.data[name] then
return self:SubValue(name, self.data[name] * pencent)
end
return 0
end
--Debug
function RoleData:Foreach(func)
for k,v in ipairs(self.data) do
func(k, v)
end
end