gdritter repos animaltransiro / master tile.lua
master

Tree @master (Download .tar.gz)

tile.lua @master

c831fbd
 
6080844
 
 
c6568f2
 
6f822a9
 
 
 
 
 
 
5d5aa3d
 
 
 
 
 
 
6f822a9
 
6080844
c6568f2
 
 
 
 
 
 
c79df9e
c6568f2
8836666
2855bf0
8836666
 
 
 
 
 
 
 
 
 
6f822a9
8836666
 
 
 
 
 
 
 
c6568f2
 
 
 
 
 
 
 
 
 
6080844
 
 
a114db3
 
 
 
6080844
 
6f822a9
 
 
 
 
 
 
 
8836666
 
 
d558512
8836666
 
6f822a9
 
 
d558512
6f822a9
 
6080844
d558512
6080844
 
 
d558512
6080844
 
8fba99d
6080844
24d65ce
8fba99d
 
6080844
 
6f822a9
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5d5aa3d
 
 
6f822a9
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
a557cce
 
 
 
8f4a6a9
 
 
 
24d65ce
 
 
 
 
 
 
 
6080844
24d65ce
6f822a9
a557cce
8f4a6a9
24d65ce
6080844
local consts = require 'constants'

local Tile = {}
Tile.__index = Tile

local spritesheet

local tileActions = {}

function tileActions:showMessage(state)
   state.message = self.signText or 'default text'
end

function tileActions:loadArea(state)
   if self.target then
      state:loadMap(self.target)
      state.char.x = self.targetX * consts.tileSize
      state.char.y = self.targetY * consts.tileSize
   else
      state.message = 'No target assigned to this door!'
   end
end

function Tile:new(name)
   if not spritesheet then
      spritesheet = love.graphics.newImage('tiles/spritesheet.png')
   end

   local f = io.open('tiles/' .. name .. '.lua')
   local t
   if f then
      t = load('return' .. f:read('*all'))()
      f:close()
      if t.animation then
         t.totalFrames = #t.animation
         t.quads = {}
         for i = 1, t.totalFrames do
            t.quads[i] = love.graphics.newQuad(
               t.animation[i][1] * consts.tileSize,
               t.animation[i][2] * consts.tileSize,
               consts.tileSize,
               consts.tileSize,
               spritesheet:getDimensions())
         end
         t.draw = tileAnimation
         t.drawPx = tileAnimationPx
      else
         t.quad = love.graphics.newQuad(
            t.spriteX * consts.tileSize,
            t.spriteY * consts.tileSize,
            consts.tileSize,
            consts.tileSize,
            spritesheet:getDimensions())
      end
   else
      t = {
         name   = name,
         sprite = love.graphics.newImage('tiles/' .. name .. '.png'),
         pass   = name == 'grass',
         draw   = function(self, x, y)
            love.graphics.draw(self.sprite, x * consts.tileSize, y * consts.tileSize)
         end
      }
   end
   return setmetatable(t, Tile)
end

function Tile:action(self, state)
end

function Tile:enterTile(self, state)
end

function Tile.mkCopy(self)
   local t = {}
   for k, v in pairs(self) do
      t[k] = v
   end
   return setmetatable(t, Tile)
end

function tileAnimation(self, x, y, t)
   local tM = math.floor(t / 40) % self.totalFrames

   return self.quads[tM + 1], x * consts.tileSize, y * consts.tileSize
end

function tileAnimationPx(self, x, y, t)
   local tM = math.floor(t / 8) % self.totalFrames

   return self.quads[tM + 1], x, y
end

function Tile:draw(x, y)
   return self.quad, x * consts.tileSize, y * consts.tileSize
end

function Tile:drawPx(x, y)
   return self.quad, x, y
end

local tileCache = {}

local function getTile(name)
   tileCache[name] = tileCache[name] or Tile:new(name)
   return tileCache[name]
end

local function newSprite(data, n)
   if not spritesheet then
      spritesheet = love.graphics.newImage('tiles/spritesheet.png')
   end

   local tileset = data.tilesets[1]

   local x = (n - 1) % 32
   local y = math.floor((n - x - 1) / 32)
   local t = {
      name = 'unknown',
   }
   for prop, val in pairs(tileset.tiles[n].properties) do
      t[prop] = val
   end

   if t.action then
      t.action = tileActions[t.action]
   end
   if t.enterTile then
      t.enterTile = tileActions[t.enterTile]
   end

   t.quad = love.graphics.newQuad(
      x * consts.tileSize,
      y * consts.tileSize,
      consts.tileSize,
      consts.tileSize,
      spritesheet:getDimensions())

   return setmetatable(t, Tile)
end

local function getSprite(data, n)
   tileCache[n] = tileCache[n] or newSprite(data, n)
   return tileCache[n]
end

local function copyTile(name)
   return Tile:new(name)
end

local function allTiles()
   return tileCache
end

local nilTile = {
   pass = false,
   name = 'nil',
   draw = function(self, x, y) end,
   drawPx = function(self, x, y) end,
   action = function() end,
}

return {
   getTile = getTile,
   getSprite = getSprite,
   copyTile = copyTile,
   allTiles = allTiles,
   nilTile = nilTile,
}