Advertisement
Guest User

Untitled

a guest
May 29th, 2017
55
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.52 KB | None | 0 0
  1. require "engine.class"
  2. local Map = require "engine.Map"
  3. require "engine.Generator"
  4.  
  5. --- Tower Defence creep spawner
  6. module(..., package.seeall, class.inherit(engine.Generator))
  7.  
  8. function _M:init(zone, map, level, spots)
  9. engine.Generator.init(self, zone, map, level, spots)
  10. self.data = level.data.generator.actor
  11.  
  12. self.rate = self.data.rate
  13.  
  14. self.turn_scale = game.energy_per_tick / game.energy_to_act
  15. end
  16.  
  17. function _M:generate()
  18. self.max_rate = self.data.max_rate or #level.spawnsource
  19. self.count = 0
  20. end
  21.  
  22. function _M:factorial(n)
  23. if n == 0 then
  24. return 1
  25. else
  26. return n * factorial(n - 1)
  27. end
  28. end
  29.  
  30. function _P:poissonProcess(k)
  31. return math.exp(-self.rate*self.turn_scale)*((self.rate*self.turn_scale)^k)/self:factorial(k)
  32. end
  33.  
  34. function _M:tick()
  35. local val = rng.float(0,1)
  36. for i = 0,self.max_rate - 1 do
  37. if self:poissonProcess(k) < val then
  38. self:generateOne()
  39. else
  40. break
  41. end
  42. end
  43. end
  44.  
  45. function _M:generateOne()
  46. local f = nil
  47. if self.filters then f = self.filters[rng.range(1, #self.filters)] end
  48. local m = self.zone:makeEntity(self.level, "actor", f)
  49. if m then
  50. local pos = rng.table(self.level.spawnsource)
  51. local x = pos.x
  52. local y = pos.y
  53. local tries = 0
  54. while (not m:canMove(x, y)) and tries < 100 do
  55. pos = rng.table(self.level.spawnsource)
  56. x = pos.x
  57. y = pos.y
  58. tries = tries + 1
  59. end
  60. if tries < 100 then
  61. self.zone:addEntity(self.level, m, "actor", x, y)
  62. if self.post_generation then self.post_generation(m) end
  63. end
  64. end
  65. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement