diff --git a/game/engine/Zone.lua b/game/engine/Zone.lua index ab6aa129b2033f7d16c7e524092dc78e0807cfe5..1c280cd10bbde29707feb20610c3d47db926bfe0 100644 --- a/game/engine/Zone.lua +++ b/game/engine/Zone.lua @@ -297,6 +297,12 @@ function _M:newLevel(level_data, lev, old_lev, game) level:setEntitiesList("object", self:computeRarities("object", self.object_list, level, nil)) level:setEntitiesList("trap", self:computeRarities("trap", self.trap_list, level, nil)) + -- Save level data + level.data = level_data + + -- Setup the level in the game + game:setLevel(level) + -- Generate the map local generator = require(level_data.generator.map.class).new( self, @@ -311,12 +317,6 @@ function _M:newLevel(level_data, lev, old_lev, game) level.downs = {{x=dx, y=dy}} level.spots = spots - -- Save level data - level.data = level_data - - -- Setup the level in the game - game:setLevel(level) - -- Generate objects if level_data.generator.object then local generator = require(level_data.generator.object.class).new( diff --git a/game/engine/generator/map/Roomer.lua b/game/engine/generator/map/Roomer.lua index f5cde30ad64b95b571f576d394dbce9bb9488066..9d2cee6d6abf3b13d25653cb5646be56604f12d5 100644 --- a/game/engine/generator/map/Roomer.lua +++ b/game/engine/generator/map/Roomer.lua @@ -3,7 +3,7 @@ local Map = require "engine.Map" require "engine.Generator" module(..., package.seeall, class.inherit(engine.Generator)) -function _M:init(zone, map, grid_list, data) +function _M:init(zone, map, level, data) engine.Generator.init(self, zone, map, level) self.data = data self.data.tunnel_change = self.data.tunnel_change or 30 @@ -14,7 +14,11 @@ function _M:init(zone, map, grid_list, data) self.rooms = {} for i, file in ipairs(data.rooms) do - table.insert(self.rooms, self:loadRoom(file)) + if type(file) == "table" then + table.insert(self.rooms, {self:loadRoom(file[1]), chance_room=file[2]}) + else + table.insert(self.rooms, self:loadRoom(file)) + end end end @@ -307,7 +311,20 @@ function _M:generate(lev, old_lev) local nb_room = self.data.nb_rooms or 10 local rooms = {} while nb_room > 0 do - local r = self:roomAlloc(self.rooms[rng.range(1, #self.rooms)], #rooms+1, lev, old_lev) + local rroom + while true do + rroom = self.rooms[rng.range(1, #self.rooms)] + if type(rroom) == "table" and rroom.chance_room then + if rng.percent(rroom.chance_room) then + rroom = rroom[1] + break + end + else + break + end + end + + local r = self:roomAlloc(rroom, #rooms+1, lev, old_lev) if r then rooms[#rooms+1] = r end nb_room = nb_room - 1 end diff --git a/game/modules/tome/class/Player.lua b/game/modules/tome/class/Player.lua index e098fa6278af7009bebea17b22968461da1fe325..a67572a2a823defe0ff808266bf5a5cffdc5e313 100644 --- a/game/modules/tome/class/Player.lua +++ b/game/modules/tome/class/Player.lua @@ -99,10 +99,9 @@ function _M:onTakeHit(value, src) self:runStop("taken damage") self:restStop("taken damage") local ret = mod.class.Actor.onTakeHit(self, value, src) - if self.life < self.max_life * 0.3 and (not self.last_life_warning or self.last_life_warning < game.turn) then + if self.life < self.max_life * 0.3 then local sx, sy = game.level.map:getTileToScreen(self.x, self.y) game.flyers:add(sx, sy, 30, (rng.range(0,2)-1) * 0.5, 2, "LOW HEALTH!", {255,0,0}, true) - self.last_life_warning = game.turn end return ret end diff --git a/game/modules/tome/data/rooms/money_vault.lua b/game/modules/tome/data/rooms/money_vault.lua new file mode 100644 index 0000000000000000000000000000000000000000..67c53d527e1408449cf8adb64336b537799ecfa4 --- /dev/null +++ b/game/modules/tome/data/rooms/money_vault.lua @@ -0,0 +1,33 @@ +return function(gen, id) + local w = 5 + local h = 5 + return { name="money_vault"..w.."x"..h, w=w, h=h, generator = function(self, x, y, is_lit) + for i = 1, self.w do + for j = 1, self.h do + if i == 1 or i == self.w or j == 1 or j == self.h then + gen.map.room_map[i-1+x][j-1+y].can_open = true + gen.map(i-1+x, j-1+y, Map.TERRAIN, gen.grid_list[gen:resolve('#')]) + else + gen.map.room_map[i-1+x][j-1+y].room = id + gen.map(i-1+x, j-1+y, Map.TERRAIN, gen.grid_list[gen:resolve('.')]) + + -- Add money + local e = gen.zone:makeEntity(gen.level, "object", {type="money"}) + if e then + gen.map(i-1+x, j-1+y, Map.OBJECT, e) + end + -- Add guardians + if rng.percent(50) then + e = gen.zone:makeEntity(gen.level, "actor") + if e then + e:move(i-1+x, j-1+y, true) + gen.level:addEntity(e) + e:added() + end + end + end + if is_lit then gen.map.lites(i-1+x, j-1+y, true) end + end + end + end} +end diff --git a/game/modules/tome/data/zones/tol-falas/zone.lua b/game/modules/tome/data/zones/tol-falas/zone.lua index e59a911921fc9e0010659cdf2654f8eac83fb01f..bb2415b0fc71c40d6a9124e6f1f316e585dcb62a 100644 --- a/game/modules/tome/data/zones/tol-falas/zone.lua +++ b/game/modules/tome/data/zones/tol-falas/zone.lua @@ -11,7 +11,7 @@ return { map = { class = "engine.generator.map.Roomer", nb_rooms = 10, - rooms = {"simple", "pilar"}, + rooms = {"simple", "pilar", {"money_vault",5}}, lite_room_chance = 100, ['.'] = "FLOOR", ['#'] = "WALL", diff --git a/game/modules/tome/data/zones/tower-amon-sul/zone.lua b/game/modules/tome/data/zones/tower-amon-sul/zone.lua index 24d8340c5966799872aabfd4fe437bf3b20448ae..7c81dfd219129a86f54e90549ddc3af8219e8709 100644 --- a/game/modules/tome/data/zones/tower-amon-sul/zone.lua +++ b/game/modules/tome/data/zones/tower-amon-sul/zone.lua @@ -11,7 +11,7 @@ return { map = { class = "engine.generator.map.Roomer", nb_rooms = 10, - rooms = {"simple", "pilar"}, + rooms = {"simple", "pilar", {"money_vault",5}}, lite_room_chance = 100, ['.'] = "FLOOR", ['#'] = "WALL",