RoleData = {} RoleData.__index = RoleData local max = math.max local floor = math.floor 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}} setmetatable(instance, RoleData) return instance end function RoleData:Init(role, data) self.role = role for i=1, #data do self.data[i] = floor(data[i] * 100000 + 0.5) / 100000 --进行精度处理,避免前后端计算不一致 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