Skip to content
Snippets Groups Projects
Commit 1932005d authored by dg's avatar dg
Browse files

actor generator, actor death

git-svn-id: http://svn.net-core.org/repos/t-engine4@19 51575b47-30f0-44d4-a5cc-537603b46e54
parent aa532cfa
No related branches found
No related tags found
No related merge requests found
......@@ -28,3 +28,9 @@ function _M:move(map, x, y, force)
return true
end
function _M:deleteFromMap(map)
if self.x and self.y and game.level and game.level.map then
map:remove(self.x, self.y, engine.Map.ACTOR)
end
end
File moved
......@@ -17,3 +17,11 @@ function _M:addEntity(e)
if self.entities[e.uid] then error("Entity "..e.uid.." already present on the level") end
self.entities[e.uid] = e
end
--- Removes an entity from the level
function _M:removeEntity(e)
if not self.entities[e.uid] then error("Entity "..e.uid.." not present on the level") end
self.entities[e.uid] = nil
-- Tells it to delete itself if needed
if e.deleteFromMap then e:deleteFromMap(self.map) end
end
......@@ -2,6 +2,7 @@ require "engine.class"
local Entity = require "engine.Entity"
local Tiles = require "engine.Tiles"
--- Represents a level map, handles display and various low level map work
module(..., package.seeall, class.make)
--- The place of a terrain entity in a map grid
......
......@@ -49,23 +49,37 @@ end
--- Asks the zone to generate a level of level "lev"
-- @param lev the level (from 1 to zone.max_level)
-- @return a Level object
function _M:getLevel(lev)
function _M:getLevel(game, lev)
local level_data = self:getLevelData(lev)
local map = self.map_class.new(level_data.width, level_data.height)
map:liteAll(0, 0, map.w, map.h)
map:rememberAll(0, 0, map.w, map.h)
if level_data.all_lited then map:liteAll(0, 0, map.w, map.h) end
if level_data.all_remembered then map:rememberAll(0, 0, map.w, map.h) end
local generator = require(level_data.generator.class).new(
-- Generate the map
local generator = require(level_data.generator.map.class).new(
map,
self.grid_list[level_data.generator.floor],
self.grid_list[level_data.generator.wall],
self.grid_list[level_data.generator.up],
self.grid_list[level_data.generator.down]
self.grid_list,
level_data.generator.map
)
local startx, starty = generator:generate()
local level = self.level_class.new(lev, map)
level.start = {x=startx, y=starty}
-- Setup the level in the game
game:setLevel(level)
-- Generate actors
if level_data.generator.actor then
local generator = require(level_data.generator.actor.class).new(
map,
level,
self.npc_list,
level_data.generator.actor
)
generator:generate()
end
return level
end
require "engine.class"
local Map = require "engine.Map"
require "engine.Generator"
module(..., package.seeall, class.inherit(engine.Generator))
function _M:init(map, level, npc_list, data)
engine.Generator.init(self, map)
self.level = level
self.npc_list = npc_list
self.nb_npc = data.nb_npc or {10, 20}
end
function _M:generate()
for i = 1, rng.range(self.nb_npc[1], self.nb_npc[2]) do
local m = self.npc_list[rng.range(1, #self.npc_list)]:clone()
local x, y = rng.range(0, self.map.w), rng.range(0, self.map.h)
local tries = 0
while self.map:checkAllEntities(x, y, "block_move") and tries < 100 do
x, y = rng.range(0, self.map.w), rng.range(0, self.map.h)
tries = tries + 1
end
if tries < 100 then
m:move(x, y, true)
self.level:addEntity(m)
end
end
end
require "engine.class"
require "engine.MapGenerator"
module(..., package.seeall, class.inherit(engine.MapGenerator))
require "engine.Generator"
module(..., package.seeall, class.inherit(engine.Generator))
function _M:init(map, splitzone, floor, wall)
engine.MapGenerator.init(self, map)
self.min_dimention = 4
function _M:init(map, grid_list, data)
engine.Generator.init(self, map)
self.floor = grid_list[data.floor]
self.wall = grid_list[data.wall]
self.up = grid_list[data.up]
self.down = grid_list[data.down]
self.min_dimention = data.min_dimention or 3
self.tree = {}
self.splitzone = splitzone
self.floor, self.wall = floor, wall
self.splitzone = data.splitzone or {0.4, 0.5}
end
function _M:split(x, y, w, h)
......
require "engine.class"
local Map = require "engine.Map"
require "engine.Generator"
module(..., package.seeall, class.inherit(engine.Generator))
function _M:init(map, grid_list, data)
engine.Generator.init(self, map)
self.floor = grid_list[data.floor]
self.up = grid_list[data.up]
end
function _M:generate()
for i = 0, self.map.w - 1 do for j = 0, self.map.h - 1 do
self.map(i, j, Map.TERRAIN, self.floor)
end end
-- Always starts at 1, 1
self.map(1, 1, Map.TERRAIN, self.up)
return 1, 1
end
require "engine.class"
local Map = require "engine.Map"
require "engine.MapGenerator"
module(..., package.seeall, class.inherit(engine.MapGenerator))
require "engine.Generator"
module(..., package.seeall, class.inherit(engine.Generator))
function _M:init(map, floor, wall, up, down)
engine.MapGenerator.init(self, map)
self.floor, self.wall, self.up, self.down = floor, wall, up, down
function _M:init(map, grid_list, data)
engine.Generator.init(self, map)
self.floor = grid_list[data.floor]
self.wall = grid_list[data.wall]
self.up = grid_list[data.up]
self.down = grid_list[data.down]
end
function _M:generate()
......
......@@ -30,7 +30,8 @@ end
function _M:bumped(x, y, e)
-- Dont bump yourself!
if e and e ~= self then
game.log("%s bumped into %s!", tostring(e.name), tostring(self.name))
game.log("%s attacks %s.", tostring(e.name), tostring(self.name))
self:takeHit(10, e)
end
return true
end
......@@ -38,3 +39,15 @@ end
function _M:tooltip()
return self.name.."\n#ff0000#HP: "..self.life
end
function _M:takeHit(value, src)
self.life = self.life - value
if self.life <= 0 then
game.log("%s killed %s!", src.name, self.name)
game.level:removeEntity(self)
self:die()
end
end
function _M:die()
end
......@@ -30,20 +30,11 @@ function _M:run()
self.log = engine.LogDisplay.new(self.w * 0.5, self.h * 0.20, nil, nil, nil, {255,255,255}, {30,30,30})
self.log("Welcome to #00FF00#Tales of Middle Earth!")
local level = self.zone:getLevel(1)
self:setLevel(level)
self.zone:getLevel(self, 1)
self.player = Player.new{name="player", image='player.png', display='@', color_r=230, color_g=230, color_b=230}
self.player:move(level.start.x, level.start.y, true)
level:addEntity(self.player)
for i = 1, 5 do
-- local m = self.npc_list[rng.range(1, 2)]:clone()
-- level:addEntity(m)
-- local x, y = rng.range(0, map.w), rng.range(0, map.h)
-- while map:checkAllEntities(x, y, "block_move") do x, y = rng.range(0, map.w), rng.range(0, map.h) end
-- m:move(x, y, true)
end
self.player:move(self.level.start.x, self.level.start.y, true)
self.level:addEntity(self.player)
-- Ok everything is good to go, activate the game in the engine!
self:setCurrent()
......
......@@ -15,3 +15,8 @@ end
function _M:act()
game.paused = true
end
function _M:die()
-- a tad brutal
os.exit()
end
return {
name = "ancient ruins",
max_level = 5,
width = 26, height = 25,
width = 26, height = 5,
all_remembered = true,
all_lited = true,
generator = {
class= "engine.generator.Maze",
floor = "FLOOR",
wall = "WALL",
up = "UP",
down = "DOWN",
map = {
class= "engine.generator.map.Empty",
floor = "FLOOR",
wall = "WALL",
up = "UP",
down = "DOWN",
},
actor = {
class = "engine.generator.actor.Random",
nb_npc = {6, 6},
},
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment