Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- require "engine.class"
- local Map = require "engine.Map"
- require "engine.Generator"
- --- Tower Defence creep spawner
- module(..., package.seeall, class.inherit(engine.Generator))
- function _M:init(zone, map, level, spots)
- engine.Generator.init(self, zone, map, level, spots)
- self.data = level.data.generator.actor
- self.rate = self.data.rate
- self.turn_scale = game.energy_per_tick / game.energy_to_act
- end
- function _M:generate()
- self.max_rate = self.data.max_rate or #level.spawnsource
- self.count = 0
- end
- function _M:factorial(n)
- if n == 0 then
- return 1
- else
- return n * factorial(n - 1)
- end
- end
- function _P:poissonProcess(k)
- return math.exp(-self.rate*self.turn_scale)*((self.rate*self.turn_scale)^k)/self:factorial(k)
- end
- function _M:tick()
- local val = rng.float(0,1)
- for i = 0,self.max_rate - 1 do
- if self:poissonProcess(k) < val then
- self:generateOne()
- else
- break
- end
- end
- end
- function _M:generateOne()
- local f = nil
- if self.filters then f = self.filters[rng.range(1, #self.filters)] end
- local m = self.zone:makeEntity(self.level, "actor", f)
- if m then
- local pos = rng.table(self.level.spawnsource)
- local x = pos.x
- local y = pos.y
- local tries = 0
- while (not m:canMove(x, y)) and tries < 100 do
- pos = rng.table(self.level.spawnsource)
- x = pos.x
- y = pos.y
- tries = tries + 1
- end
- if tries < 100 then
- self.zone:addEntity(self.level, m, "actor", x, y)
- if self.post_generation then self.post_generation(m) end
- end
- end
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement