RoleData.lua 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  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,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,0, 0,0,0}}
  11. setmetatable(instance, RoleData)
  12. return instance
  13. end
  14. function RoleData:Clone(_role)
  15. local _clone = RoleData.New()
  16. _clone.role = _role
  17. local max = max(#_clone.data, #self.data)
  18. for i=1, max do
  19. _clone.data[i] = self.data[i]
  20. _clone.orginData[i] = self.orginData[i]
  21. end
  22. return _clone
  23. end
  24. function RoleData:RoleBack(_role,_cpRoleDate)
  25. self.role = _role
  26. local max = max(#_cpRoleDate.data, #self.data)
  27. for i=1, max do
  28. self.data[i] = _cpRoleDate.data[i]
  29. self.orginData[i] =_cpRoleDate.orginData[i]
  30. end
  31. end
  32. function RoleData:Init(role, data)
  33. self.role = role
  34. local max = max(#data, #self.data)
  35. for i=1, max do
  36. self.data[i] = BattleUtil.ErrorCorrection(data[i] or 0)
  37. self.orginData[i] = BattleUtil.ErrorCorrection(data[i] or 0)
  38. end
  39. end
  40. local function tableKin(_tb,_k)
  41. for k,v in pairs(_tb) do
  42. if k==_k then return true end
  43. end
  44. return false
  45. end
  46. function RoleData:GetData(name)
  47. -- for prop in pairs(self.data) do
  48. -- BattleLogManager.Log(
  49. -- "hero:"..self.role.roleId..
  50. -- " camp:".. self.role.camp..
  51. -- " position:"..self.role.position..
  52. -- " name:".. name,
  53. -- " value:"..self.data[name])
  54. -- end
  55. if tableKin(self.data,name) then
  56. return self.data[name]
  57. end
  58. return nil
  59. end
  60. local function tableKin(_tb,_k)
  61. for k,v in pairs(_tb) do
  62. if k==_k then return true end
  63. end
  64. return false
  65. end
  66. function RoleData:GetOrginData(name)
  67. return self.orginData[name]
  68. end
  69. function RoleData:SetValue(name, value)
  70. if self.data[name] then
  71. local delta = self.data[name]
  72. self.data[name] = value
  73. delta = value - delta
  74. if delta ~= 0 then
  75. self.role.Event:DispatchEvent(BattleEventName.RolePropertyChanged, name, value, delta)
  76. -- BattleLogManager.Log(
  77. -- self.role.roleId..":property change",
  78. -- "camp", self.role.camp,
  79. -- "position", self.role.position,
  80. -- "propId", name,
  81. -- "value", value)
  82. end
  83. end
  84. end
  85. function RoleData:AddValue(name, delta)
  86. if delta < 0 or not self.data[name] then --delta必须非负
  87. return 0
  88. end
  89. if self.data[name] then
  90. self:SetValue(name, self.data[name] + delta)
  91. end
  92. return delta
  93. end
  94. function RoleData:AddPencentValue(name, pencent)
  95. if self.data[name] then
  96. local delta
  97. if isFactor(name) then
  98. delta = BattleUtil.ErrorCorrection(self.orginData[name] * pencent)
  99. else
  100. delta = floor(self.orginData[name] * pencent)
  101. end
  102. return self:AddValue(name, delta)
  103. end
  104. return 0
  105. end
  106. function RoleData:SubDeltaValue(name, delta)
  107. if not delta or delta < 0 or not self.data[name] then --delta必须非负
  108. return 0
  109. end
  110. if self.data[name] then
  111. -- RoleManager.LogCa(
  112. -- "SubDeltaValue curframe:"..BattleLogic.CurFrame(),
  113. -- "name:"..name,
  114. -- "data:"..(self.data[name] - delta)
  115. -- )
  116. self:SetValue(name, self.data[name] - delta)
  117. end
  118. return delta
  119. end
  120. function RoleData:SubValue(name, delta)
  121. if delta < 0 or not self.data[name] then --delta必须非负
  122. return 0
  123. end
  124. local orVal = self.data[name]
  125. if isFactor(name) then
  126. if orVal then
  127. self:SetValue(name, self.data[name] - delta)
  128. orVal = orVal - self.data[name]
  129. end
  130. return orVal
  131. else
  132. if orVal then
  133. self:SetValue(name, max(self.data[name] - delta,0))
  134. orVal = orVal - self.data[name]
  135. end
  136. return orVal
  137. end
  138. end
  139. function RoleData:SubPencentValue(name, pencent)
  140. if self.data[name] then
  141. local delta
  142. if isFactor(name) then
  143. delta = BattleUtil.ErrorCorrection(self.orginData[name] * pencent)
  144. else
  145. delta = floor(self.orginData[name] * pencent)
  146. end
  147. return self:SubValue(name, delta)
  148. end
  149. return 0
  150. end
  151. function RoleData:CountValue(name, value, ct)
  152. if ct == 1 then
  153. self:AddValue(name, value)
  154. elseif ct == 2 then
  155. self:AddPencentValue(name, value)
  156. elseif ct == 3 then
  157. self:SubValue(name, value)
  158. elseif ct == 4 then
  159. self:SubPencentValue(name, value)
  160. end
  161. end
  162. --Debug
  163. function RoleData:Foreach(func)
  164. for k,v in ipairs(self.data) do
  165. func(k, v)
  166. end
  167. end