Decaying levels and Zone:getGenerator
Posted: Fri Aug 06, 2010 9:27 pm
The current ToME decay level code is found here:
A bug in shoob's module showed that if the zone's zone.lua does not have an object generator defined the lua code crashes on the zone:getGenerator("object", self.level) call from above. Looking at Zone:getGenerator it is obvious why. There is no check that level.data.generator[what] exists before trying to access it. Maybe the zone:getGenerator should return nil if level.data.generator[what] does not exist?
EDIT: As a side note, this is how the Zone:newLevel code works. Maybe the checks should be internal to getGenerator, or at least the decay level should have similar checks. Thoughts?
Code: Select all
-- Decay level ?
if self.level.last_turn and self.level.data.decay and self.level.last_turn + self.level.data.decay[1] * 10 < game.turn then
local nb_actor, remain_actor = self.level:decay(Map.ACTOR, function(e) return not e.unique and self.level.last_turn + rng.range(self.level.data.decay[1], self.level.data.decay[2]) < game.turn * 10 end)
local nb_object, remain_object = self.level:decay(Map.OBJECT, function(e) return not e.unique and self.level.last_turn + rng.range(self.level.data.decay[1], self.level.data.decay[2]) < game.turn * 10 end)
local gen = self.zone:getGenerator("actor", self.level)
if gen.regenFrom then gen:regenFrom(remain_actor) end
local gen = self.zone:getGenerator("object", self.level)
if gen.regenFrom then gen:regenFrom(remain_object) end
end
Code: Select all
function _M:getGenerator(what, level, spots)
print("[GENERATOR] requiring", what, level.data.generator and level.data.generator[what] and level.data.generator[what].class)
return require(level.data.generator[what].class).new(
self,
level.map,
level,
spots
)
end
Code: Select all
if level_data.generator.actor and level_data.generator.actor.class then
local generator = self:getGenerator("actor", level, spots)
generator:generate()
end