70 lines
2.5 KiB
Fennel
70 lines
2.5 KiB
Fennel
(local files (require :game.files))
|
|
(local TileDraw {})
|
|
|
|
(fn TileDraw.putpixel [x y color]
|
|
(when color
|
|
(love.graphics.setColor (/ (. color 1) 255) (/ (. color 2) 255) (/ (. color 3) 255))
|
|
(love.graphics.points (+ x 0.5) (+ y 0.5))))
|
|
|
|
(fn TileDraw.make-canvas [w h f]
|
|
(local canvas (love.graphics.newCanvas w h))
|
|
(local prevcanvas (love.graphics.getCanvas))
|
|
(canvas:setFilter :nearest :nearest)
|
|
(local scissor [(love.graphics.getScissor)])
|
|
(love.graphics.setScissor)
|
|
(love.graphics.setCanvas canvas)
|
|
(love.graphics.clear 0 0 0 0)
|
|
(f canvas)
|
|
(love.graphics.setCanvas prevcanvas)
|
|
(love.graphics.setScissor (table.unpack scissor))
|
|
(love.graphics.setColor 1 1 1 1)
|
|
canvas)
|
|
|
|
(files.platform-methods TileDraw :editor.tiledraw
|
|
:tile-to-sprite :char-to-sprite :portrait-to-sprite :screen-to-sprite :screen-y-to-offset
|
|
:pal-from-bit :pal-from-byte :draw-byte)
|
|
|
|
(files.default-platform-method TileDraw :editor.tiledraw :tilestrip-to-sprite
|
|
(fn [tiles style]
|
|
(let [spritegen (TileDraw.spritegen-for-style style)
|
|
sprites (icollect [_ tile (ipairs tiles)] (spritegen tile))]
|
|
(TileDraw.make-canvas (* (: (. sprites 1) :getWidth) (length sprites)) (: (. sprites 1) :getHeight)
|
|
#(each [isprite sprite (ipairs sprites)]
|
|
(love.graphics.draw sprite (* (sprite:getWidth) (- isprite 1)) 0))))))
|
|
|
|
(files.default-platform-method TileDraw :editor.tiledraw :spritegen-for-style
|
|
(fn [style]
|
|
(match style
|
|
:font TileDraw.char-to-sprite
|
|
:brushes TileDraw.char-to-sprite
|
|
:portraits TileDraw.portrait-to-sprite
|
|
_ TileDraw.tile-to-sprite)))
|
|
|
|
(fn TileDraw.TileCache [tiles ?spritegen]
|
|
{: tiles
|
|
:spritegen (or ?spritegen TileDraw.tile-to-sprite)
|
|
:tilesprites []
|
|
:tile (fn [self itile] (or (. self.tiles itile) {:flags {}}))
|
|
:cachekey (fn [itile ?key] (.. (or ?key :gfx) itile))
|
|
:update-tile
|
|
(fn [self itile tile ?key]
|
|
(tset self.tiles itile
|
|
(-> (self:tile itile)
|
|
(doto (tset (or ?key :gfx) tile))))
|
|
(tset self.tilesprites (self.cachekey itile ?key) nil))
|
|
:set-flag
|
|
(fn [self itile flag clear]
|
|
(tset (. self.tiles itile :flags) flag (if clear nil true)))
|
|
:load
|
|
(fn [self tiles]
|
|
(set self.tiles tiles)
|
|
(set self.tilesprites []))
|
|
:sprite
|
|
(fn [self itile ?key]
|
|
(local key (self.cachekey itile ?key))
|
|
(when (and (= nil (. self.tilesprites key)) (not= nil (. self.tiles itile)))
|
|
(tset self.tilesprites key (self.spritegen (. self.tiles itile (or ?key :gfx)))))
|
|
(. self.tilesprites key))})
|
|
|
|
TileDraw
|