RoleData.lua 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. RoleData = {}
  2. RoleData.__index = RoleData
  3. local max = math.max
  4. local floor = math.floor
  5. local function isFactor(name)
  6. return name > 7
  7. end
  8. function RoleData.New()
  9. 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,0,0,0,0, 0,0,0,0},
  10. 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, 0,0,0,0,0, 0,0,0,0}}
  11. setmetatable(instance, RoleData)
  12. return instance
  13. end
  14. function RoleData:Init(role, data)
  15. self.role = role
  16. local max = max(#data, #self.data)
  17. for i=1, max do
  18. self.data[i] = BattleUtil.ErrorCorrection(data[i] or 0)
  19. self.orginData[i] = BattleUtil.ErrorCorrection(data[i] or 0)
  20. end
  21. end
  22. function RoleData:GetData(name)
  23. return self.data[name]
  24. end
  25. function RoleData:GetOrginData(name)
  26. return self.orginData[name]
  27. end
  28. function RoleData:SetValue(name, value)
  29. if self.data[name] then
  30. local delta = self.data[name]
  31. self.data[name] = value
  32. delta = value - delta
  33. if delta ~= 0 then
  34. self.role.Event:DispatchEvent(BattleEventName.RolePropertyChanged, name, value, delta)
  35. BattleLogManager.Log(
  36. "property change",
  37. "camp", self.role.camp,
  38. "position", self.role.position,
  39. "propId", name,
  40. "value", value)
  41. end
  42. end
  43. end
  44. function RoleData:AddValue(name, delta)
  45. if delta < 0 or not self.data[name] then --delta必须非负
  46. return 0
  47. end
  48. if self.data[name] then
  49. self:SetValue(name, self.data[name] + delta)
  50. end
  51. return delta
  52. end
  53. function RoleData:AddPencentValue(name, pencent)
  54. if self.data[name] then
  55. local delta
  56. if isFactor(name) then
  57. delta = BattleUtil.ErrorCorrection(self.orginData[name] * pencent)
  58. else
  59. delta = floor(self.orginData[name] * pencent)
  60. end
  61. return self:AddValue(name, delta)
  62. end
  63. return 0
  64. end
  65. function RoleData:SubDeltaValue(name, delta)
  66. if not delta or delta < 0 or not self.data[name] then --delta必须非负
  67. return 0
  68. end
  69. if self.data[name] then
  70. self:SetValue(name, self.data[name] - delta)
  71. end
  72. return delta
  73. end
  74. function RoleData:SubValue(name, delta)
  75. if delta < 0 or not self.data[name] then --delta必须非负
  76. return 0
  77. end
  78. local orVal = self.data[name]
  79. if orVal then
  80. self:SetValue(name, max(self.data[name] - delta, 0))
  81. orVal = orVal - self.data[name]
  82. end
  83. return orVal
  84. end
  85. function RoleData:SubPencentValue(name, pencent)
  86. if self.data[name] then
  87. local delta
  88. if isFactor(name) then
  89. delta = BattleUtil.ErrorCorrection(self.orginData[name] * pencent)
  90. else
  91. delta = floor(self.orginData[name] * pencent)
  92. end
  93. return self:SubValue(name, delta)
  94. end
  95. return 0
  96. end
  97. function RoleData:CountValue(name, value, ct)
  98. if ct == 1 then
  99. self:AddValue(name, value)
  100. elseif ct == 2 then
  101. self:AddPencentValue(name, value)
  102. elseif ct == 3 then
  103. self:SubValue(name, value)
  104. elseif ct == 4 then
  105. self:SubPencentValue(name, value)
  106. end
  107. end
  108. --Debug
  109. function RoleData:Foreach(func)
  110. for k,v in ipairs(self.data) do
  111. func(k, v)
  112. end
  113. end