diff --git a/editor/gfxedit.fnl b/editor/gfxedit.fnl index 9d3528a..31ae28c 100644 --- a/editor/gfxedit.fnl +++ b/editor/gfxedit.fnl @@ -29,8 +29,10 @@ (when (>= itile 1) (set self.itile itile)))) (fn GraphicsEditView.draw-sprite [self x y itile ?key] - (love.graphics.setColor 1 1 1) - (love.graphics.draw (self.tilecache:sprite itile ?key) x y 0 self.sprite-scale self.sprite-scale)) + (let [sprite (self.tilecache:sprite itile ?key)] + (when sprite + (love.graphics.setColor 1 1 1) + (love.graphics.draw sprite x y 0 self.sprite-scale self.sprite-scale)))) (fn GraphicsEditView.draw-tile-selector [self x y w ?key] (var tilex x) diff --git a/editor/tiledraw/iigs.fnl b/editor/tiledraw/iigs.fnl index 54f6d78..16f7e97 100644 --- a/editor/tiledraw/iigs.fnl +++ b/editor/tiledraw/iigs.fnl @@ -8,6 +8,7 @@ (fn tile-to-sprite [tile] (if tile (make-canvas 16 16 (fn [canvas] + (love.graphics.clear 0 0 0 0) (for [y 0 15] (for [x 0 15] (let [ibyte (+ (* y 16) x 1) @@ -15,6 +16,6 @@ mask (bit.band (bit.rshift byte 4) 0xf) color (bit.band byte 0xf) rgb (if (= mask 0) (gs-to-rgb (. pal (+ color 1))) [255 0 255])] - (putpixel x y rgb)))))))) + (when (= mask 0) (putpixel x y rgb))))))))) {: tile-to-sprite : pal : gs-to-rgb} diff --git a/editor/tileedit/iigs.fnl b/editor/tileedit/iigs.fnl index 1ae9ab4..f63e0de 100644 --- a/editor/tileedit/iigs.fnl +++ b/editor/tileedit/iigs.fnl @@ -7,5 +7,6 @@ :draw-bits #(if (= $1.icolor 17) 0xf0 (- $1.icolor 1)) :palette #(lume.concat (icollect [_ color (ipairs pal)] (gs-to-rgb color)) [[255 0 255]]) :pixel-storage-divisor #1 + :preview-locations #[[8 0] [0 5] [16 5] [8 10]] } diff --git a/editor/tileedit/init.fnl b/editor/tileedit/init.fnl index 64b652d..d0533cc 100644 --- a/editor/tileedit/init.fnl +++ b/editor/tileedit/init.fnl @@ -34,6 +34,9 @@ (files.platform-methods TileView :editor.tileedit :map-bitxy :pixel-color :draw-on :draw-off :draw-bits :palette :pixel-storage-divisor) +(files.default-platform-method TileView :editor.tileedit :preview-locations + (fn [self] (let [(w h) (self:tilesize)] [[0 0] [w 0] [0 h] [w h]]))) + (fn TileView.tile [self] (local (w h) (self:tilesize)) (or (-?> self.tilecache.tiles (. self.itile) (. (or self.tilekey :gfx))) @@ -77,7 +80,12 @@ (set (tile.word y) (textfield self "Default word" tile.word x (+ y style.padding.y) (* 100 SCALE) (* 200 SCALE))) (set (tile.label y) (textfield self "Label" tile.label x (+ y style.padding.y) (* 100 SCALE) (* 200 SCALE)))) (each [iflag flagname (ipairs (tiles.flags))] - (set y (self:draw-tile-flag flagname x (+ y style.padding.y))))) + (set y (self:draw-tile-flag flagname x (+ y style.padding.y)))) + y) + +(fn TileView.draw-tile-preview [self x y] + (each [_ [tx ty] (ipairs (self:preview-locations))] + (self:draw-sprite (+ x (* tx self.sprite-scale)) (+ y (* ty self.sprite-scale)) self.itile self.tilekey))) (fn TileView.draw-tile-palette [self x y w] (local pal (self:palette)) @@ -107,7 +115,8 @@ (local (x y) (values (+ self.position.x style.padding.x (- self.scroll.x)) (+ self.position.y style.padding.y (- self.scroll.y)))) (local (editor-w editor-h) (self:draw-tile-editor (self:tile) x y)) - (self:draw-tile-flags (+ x editor-w pixel-size) y) + (local preview-y (self:draw-tile-flags (+ x editor-w pixel-size) y)) + (self:draw-tile-preview (+ x editor-w pixel-size) (+ preview-y style.padding.y)) (var selector-y (+ y editor-h pixel-size)) (set selector-y (+ selector-y (self:draw-tile-palette x selector-y (- self.size.x 20)))) (each [_ key (ipairs (self:tilekeys))] diff --git a/neutgs/game.json b/neutgs/game.json index e9a3c49..6591162 100644 --- a/neutgs/game.json +++ b/neutgs/game.json @@ -1 +1 @@ -{"tiles":[{"flags":[],"word":"","label":"","gfx":"0F000E0B07070707070707070707070707070707070707070702070707070707070707070707070702070707070707070707070707070707070707070707070707070707070404040404040707070707070707070505050505050505070707070707070606060606060606060607070707070708080808080808080807070707070707090909090909090907070707070707070B0B0B0B0B0B0B0B0B070707070707070D0D0D0D0D0D0D0D0D0D070707070707070E0E0E0E0E0E0E0E0707070707070707070F0F07070F0F0707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707"},{"flags":[],"word":"","label":"","gfx":"00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006060000000000000606000000000000000600000000000000060000000000000006000000000000000600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000606000000000600000000000000000606000000000000060000000606060600000000000000000606060606000000000000000000000000000000000000000000000000000000000000000000000000000000"},{"flags":[],"word":"","label":"","gfx":"F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F00BF0F0F0F0F0F0F0F0F0F005F0F0F00505F0F0F0F0F0F0F0F0F0F00BF0F0F00BF0F0F0F0F0F00BF0F0F0F0F0F0F0F0F0F0F0F0F00B05F0F0F0F0F0F0F0F00B0BF0F0F0F0F0F0F0F0F0F0F0F0F00B05050BF0F0F0F0F0F0F0F00B050BF00B05050BF0F0F0F0F0F0F0F0F0F0F0F0F00B0BF0F00B05F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F00B05F0F0F0050BF00BF0F0F0F0F0F0F0F0F005F00BF0F0F005F0F0F0F00BF0F0F0F00BF0F0F0F0F00BF0F0F0F005F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F00BF0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0"},{"flags":[],"word":"","label":"","gfx":"00000000000000000000000000000000000000000000000000000000000000000000000E00000000000E0000000000000000000E00000000000E00000000000000000000000000000E0000000E0E0E00000000000000000000000000000000000000000000000E0E0E0E0E0E0000000000000000000E0E080E0E080E0000000000000000000E0E0E0E0E0E0E000E000000000000000E0E0606060E00000E0E00000E0E0E00000E0E0E0E000E00000E0000000000000000000000000E000000000000000000000E00000000000000000000000000000E0E000000000000000000000000000E0E0000000000000000000000000000000000000000000000000000"}],"platform":"iigs","levels":[{"loadword":"","map":"000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000200000000000000000000000000000400000000040000000000000000000000000000040000020204000000000000000000000000000004000004000000000000000000000000000000000402020400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","tickword":"","moveword":"","objects":[]}]} \ No newline at end of file +{"tiles":[{"flags":[],"word":"","label":"","gfx":"F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F00F0FF0F0F0F0F0F0F0F0F0F0F0F00F0F0F0F0F0FF0F0F0F0F0F0F0F00A0A0F0F0F0F0F0F0A0AF0F0F0F00A0A0A0A0A0A0F0F0A0A0A0A0A0AF00A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0AF00A0A0A0A0A0A0F0F0A0A0A0A0A0AF0F0F0F00A0A0F0F0F0F0F0F0A0AF0F0F0F0F0F0F0F00F0F0F0F0F0FF0F0F0F0F0F0F0F0F0F0F0F00F0FF0F0F0F0F0F0F0"},{"flags":[],"word":"","label":"","gfx":"F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F00808F0F0F0F0F0F0F0F0F0F0F0F0080808080808F0F0F0F0F0F0F0F008080208020802080808F0F0F0F00808080808020802080808080808F008080808080808080808080808080808F00808080808080808080808080808F0F0F0F008080808020802080208F0F0F0F0F0F0F0F0080808020802F0F0F0F0F0F0F0F0F0F0F0F00808F0F0F0F0F0F0F0"},{"flags":[],"word":"","label":"","gfx":"F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F00904F0F0F0F0F0F0F0F0F0F0F0F0040409090404F0F0F0F0F0F0F0F009090904040909090404F0F0F0F00909040909090404090909040909F004040909040409090904040909040409F00904090904040404090904090909F0F0F0F004090909090904090904F0F0F0F0F0F0F0F0040409090404F0F0F0F0F0F0F0F0F0F0F0F00409F0F0F0F0F0F0F0"},{"flags":[],"word":"","label":"","gfx":"F0F0F0F0F0F0F00707F0F0F0F0F0F0F0F0F0F0F0F0070707070707F0F0F0F0F0F0F0F007070707070707070707F0F0F0F00707070707070707070707070707F00707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070303070707070707070707070707030303030307070707070707070707030303F00303030307070707070703030303F0F0F0F003030303070703030303F0F0F0F0F0F0F0F0030303030303F0F0F0F0F0F0F0F0F0F0F0F00303F0F0F0F0F0F0F0"}],"platform":"iigs","levels":[{"loadword":"","map":"000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000200000000000000000000000000000400000000040000000000000000000000000000040000020204000000000000000000000000000004000004000000000000000000000000000000000402020400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","tickword":"","moveword":"","objects":[]}],"tilesets":{"jaye-tileset":"gfx","neut-tileset":"neut"}} \ No newline at end of file diff --git a/neutgs/init.fnl b/neutgs/init.fnl index a847180..7c176c7 100644 --- a/neutgs/init.fnl +++ b/neutgs/init.fnl @@ -62,24 +62,22 @@ (form itile-to-tile [(fn [ssc itile] [:block (ssc:expr-word itile) [:asl] [:asl] [:clc] [:adc #($1:lookup-addr :tiles)]])]) - (fn enable-shadowing () (set! (word-at (ref :0xc035)) (& (word-at (ref :0xc035)) 0xfff1))) - (fn disable-shadowing () (set! (word-at (ref :0xc035)) (| (word-at (ref :0xc035)) 0x000e))) - (global word with-shadowing 0) (fn draw-test-tiles (i) - (when with-shadowing (disable-shadowing)) + (when with-shadowing (disable-shadow-writes)) (let (x 0 y 0 screen 0x2000) - (while (< y 12) - (draw-object screen (itile-to-tile (& (+ x y i) 3))) + (while (< y 37) + (let (tile (itile-to-tile (& (+ x y i) 3))) + (draw-object screen tile)) (set! x (+ x 1)) (if (= x 20) - (do (set! x 0) - (set! y (+ y 1)) - (set! screen (+ screen [(+ 8 (* 160 15))]))) + (do (set! y (+ y 1)) + (set! x (if (& y 1) 1 0)) + (set! screen (+ screen [(+ 12 (* 160 4))]))) (set! screen (+ screen 8))))) (when with-shadowing - (enable-shadowing) + (enable-shadow-writes) (if (= with-shadowing 1) (let (x 0 y 0 screen 0x2000) (while (< y 12) @@ -112,11 +110,15 @@ (EMStartUp 0x2000 0 0 320 0 200 userID) (GrafOn) (ClearScreen 0) + (let (screen 0x12000) (while (< screen 0x1a000) + (word! screen 0) + (set! screen (+ screen 2)))) (set-palette 0 [pal]) (SetAllSCBs 0) + (enable-shadow-writes) + (draw-test-tiles 0) (wait-for-key) - (enable-shadowing) (let (tile-task (new-task (ref draw-test-tiles-forever))) (wait-for-key) (set! with-shadowing 1) @@ -124,7 +126,8 @@ (set! with-shadowing 2) (wait-for-key) (set! with-shadowing false) - (reset-task tile-task (ref yield-forever))) + (reset-task tile-task (ref yield-forever)) + (wait-for-key)) (GrafOff) diff --git a/ssc/iigs/graphics.fnl b/ssc/iigs/graphics.fnl index b07600c..3b95e70 100644 --- a/ssc/iigs/graphics.fnl +++ b/ssc/iigs/graphics.fnl @@ -90,6 +90,9 @@ block)) #(compile $1 + (fn enable-shadow-writes () (set! (word-at (ref :0xc035)) (& (word-at (ref :0xc035)) 0xfff1))) + (fn disable-shadow-writes () (set! (word-at (ref :0xc035)) (| (word-at (ref :0xc035)) 0x000e))) + ; The fastest way to draw any graphics on the IIgs is to map the stack pointer to ; video memory, and use stack-pushing instructions to write values. draw-object ; takes a location in video memory and a pointer to a machine code routine called a "drawfn"