RoleData = {} RoleData.__index = RoleData local max = math.max local floor = math.floor local function isFactor(name) return name > 7 end 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}, orginData={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[i] = BattleUtil.ErrorCorrection(data[i]) self.orginData[i] = BattleUtil.ErrorCorrection(data[i]) end end function RoleData:GetData(name) return self.data[name] end function RoleData:GetOrginData(name) return self.orginData[name] 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 local delta if isFactor(name) then delta = BattleUtil.ErrorCorrection(self.orginData[name] * pencent) else delta = floor(self.orginData[name] * pencent) end return self:AddValue(name, delta) 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 local delta if isFactor(name) then delta = BattleUtil.ErrorCorrection(self.orginData[name] * pencent) else delta = floor(self.orginData[name] * pencent) end return self:SubValue(name, delta) end return 0 end --Debug function RoleData:Foreach(func) for k,v in ipairs(self.data) do func(k, v) end end