-- Aseprite Lua: generate 16x16 tileset (≥64 tiles) candy palette village + white layer -- Run: aseprite -b -script scripts/generate_tileset.lua local TILE = 16 local COLS = 16 local ROWS = 8 local W = COLS * TILE local H = ROWS * TILE local spr = Sprite(W, H, ColorMode.RGB) app.activeSprite = spr local img = spr.cels[1].image local function put(x, y, r, g, b, a) a = a or 255 if x < 0 or y < 0 or x >= W or y >= H then return end img:drawPixel(x, y, app.pixelColor.rgba(r, g, b, a)) end local function fillTile(tx, ty, r, g, b) for y = 0, TILE - 1 do for x = 0, TILE - 1 do put(tx * TILE + x, ty * TILE + y, r, g, b) end end end local function rectTile(tx, ty, x0, y0, x1, y1, r, g, b) for y = y0, y1 do for x = x0, x1 do put(tx * TILE + x, ty * TILE + y, r, g, b) end end end local function px(tx, ty, x, y, r, g, b) put(tx * TILE + x, ty * TILE + y, r, g, b) end -- Clear transparent for y = 0, H - 1 do for x = 0, W - 1 do put(x, y, 0, 0, 0, 0) end end -- 0 empty (transparent) -- 1 grass fillTile(1, 0, 120, 190, 90) for i = 0, 20 do px(1, 0, (i * 7) % 16, (i * 3) % 16, 100, 170, 70) end -- 2 grass light fillTile(2, 0, 140, 205, 100) -- 3 path stone fillTile(3, 0, 190, 175, 150) rectTile(3, 0, 0, 0, 15, 0, 170, 155, 130) rectTile(3, 0, 0, 8, 15, 8, 170, 155, 130) -- 4 dirt fillTile(4, 0, 170, 130, 80) -- 5 water fillTile(5, 0, 100, 180, 220) rectTile(5, 0, 0, 4, 15, 5, 130, 200, 235) rectTile(5, 0, 2, 10, 12, 11, 80, 160, 200) -- 6 water deep fillTile(6, 0, 70, 150, 200) -- 7 flowers pink fillTile(7, 0, 120, 190, 90) px(7, 0, 4, 6, 255, 140, 180) px(7, 0, 5, 6, 255, 140, 180) px(7, 0, 4, 7, 255, 140, 180) px(7, 0, 10, 10, 255, 180, 100) px(7, 0, 11, 10, 255, 180, 100) -- 8 berry bush fillTile(8, 0, 90, 150, 60) rectTile(8, 0, 3, 4, 12, 13, 70, 130, 50) px(8, 0, 5, 7, 200, 40, 80) px(8, 0, 9, 9, 200, 40, 80) px(8, 0, 7, 11, 180, 30, 70) -- 9 tree trunk fillTile(9, 0, 120, 190, 90) rectTile(9, 0, 6, 6, 9, 15, 120, 80, 40) -- 10 tree leaves fillTile(10, 0, 70, 150, 50) rectTile(10, 0, 2, 2, 13, 12, 60, 140, 40) -- 11 wall wood fillTile(11, 0, 200, 150, 90) rectTile(11, 0, 0, 0, 15, 1, 180, 130, 70) -- 12 wall cream fillTile(12, 0, 245, 230, 190) -- 13 roof orange fillTile(13, 0, 230, 120, 50) rectTile(13, 0, 0, 7, 15, 8, 200, 90, 30) -- 14 door fillTile(14, 0, 200, 150, 90) rectTile(14, 0, 4, 4, 11, 15, 140, 80, 40) px(14, 0, 10, 10, 230, 200, 80) -- 15 window fillTile(15, 0, 245, 230, 190) rectTile(15, 0, 3, 3, 12, 12, 150, 210, 240) rectTile(15, 0, 7, 3, 8, 12, 200, 180, 140) rectTile(15, 0, 3, 7, 12, 8, 200, 180, 140) -- row 1 -- 16 floor wood fillTile(0, 1, 210, 170, 110) rectTile(0, 1, 0, 4, 15, 4, 190, 150, 90) rectTile(0, 1, 0, 12, 15, 12, 190, 150, 90) -- 17 floor tile fillTile(1, 1, 230, 220, 200) rectTile(1, 1, 0, 0, 15, 0, 200, 190, 170) rectTile(1, 1, 0, 0, 0, 15, 200, 190, 170) -- 18 bed fillTile(2, 1, 210, 170, 110) rectTile(2, 1, 1, 4, 14, 13, 180, 100, 140) rectTile(2, 1, 1, 2, 14, 5, 250, 240, 220) -- 19 counter fillTile(3, 1, 210, 170, 110) rectTile(3, 1, 0, 6, 15, 15, 160, 100, 50) rectTile(3, 1, 0, 6, 15, 7, 180, 120, 70) -- 20 oven fillTile(4, 1, 150, 140, 130) rectTile(4, 1, 3, 4, 12, 14, 80, 80, 90) rectTile(4, 1, 5, 7, 10, 11, 255, 120, 40) -- 21 shelf fillTile(5, 1, 210, 170, 110) rectTile(5, 1, 1, 1, 14, 14, 140, 90, 50) rectTile(5, 1, 2, 3, 6, 6, 220, 80, 80) rectTile(5, 1, 9, 3, 13, 6, 220, 80, 80) rectTile(5, 1, 2, 9, 6, 12, 220, 80, 80) rectTile(5, 1, 9, 9, 13, 12, 220, 80, 80) -- 22 table fillTile(6, 1, 210, 170, 110) rectTile(6, 1, 2, 5, 13, 10, 160, 110, 60) rectTile(6, 1, 3, 10, 5, 14, 140, 90, 40) rectTile(6, 1, 10, 10, 12, 14, 140, 90, 40) -- 23 chair fillTile(7, 1, 210, 170, 110) rectTile(7, 1, 4, 6, 11, 11, 160, 100, 50) rectTile(7, 1, 4, 3, 11, 6, 140, 80, 40) -- 24 well fillTile(8, 1, 120, 190, 90) rectTile(8, 1, 2, 6, 13, 14, 140, 140, 150) rectTile(8, 1, 4, 8, 11, 12, 60, 100, 140) rectTile(8, 1, 5, 2, 6, 6, 120, 80, 40) rectTile(8, 1, 9, 2, 10, 6, 120, 80, 40) rectTile(8, 1, 5, 2, 10, 3, 120, 80, 40) -- 25 fog fillTile(9, 1, 200, 210, 220) for i = 0, 30 do px(9, 1, (i * 5) % 16, (i * 7) % 16, 220, 230, 240) end -- 26 white wall fillTile(10, 1, 230, 230, 235) rectTile(10, 1, 0, 0, 0, 15, 200, 200, 210) -- 27 white floor fillTile(11, 1, 245, 245, 248) -- 28 calendar fillTile(12, 1, 210, 170, 110) rectTile(12, 1, 3, 2, 12, 14, 250, 250, 245) rectTile(12, 1, 3, 2, 12, 4, 220, 80, 80) px(12, 1, 6, 8, 40, 40, 40) px(12, 1, 8, 8, 40, 40, 40) px(12, 1, 10, 8, 40, 40, 40) -- 29 board fillTile(13, 1, 120, 190, 90) rectTile(13, 1, 1, 2, 14, 14, 160, 110, 60) rectTile(13, 1, 3, 4, 12, 6, 250, 240, 200) rectTile(13, 1, 3, 8, 12, 10, 250, 240, 200) -- 30 mailbox fillTile(14, 1, 120, 190, 90) rectTile(14, 1, 5, 4, 10, 12, 200, 60, 50) rectTile(14, 1, 7, 12, 8, 15, 100, 70, 40) -- 31 picnic cloth fillTile(15, 1, 120, 190, 90) rectTile(15, 1, 1, 4, 14, 12, 250, 100, 120) for i = 0, 6 do px(15, 1, 2 + i * 2, 5, 250, 250, 250) px(15, 1, 2 + i * 2, 11, 250, 250, 250) end -- row 2 furniture / props continue -- 32 flower pot fillTile(0, 2, 120, 190, 90) rectTile(0, 2, 5, 8, 10, 14, 180, 100, 60) px(0, 2, 7, 5, 255, 100, 150) px(0, 2, 8, 4, 255, 100, 150) px(0, 2, 6, 6, 100, 180, 60) -- 33 ribbon post fillTile(1, 2, 120, 190, 90) rectTile(1, 2, 7, 2, 8, 14, 160, 110, 60) rectTile(1, 2, 3, 3, 12, 5, 255, 80, 120) -- 34 house corner fillTile(2, 2, 245, 230, 190) rectTile(2, 2, 0, 0, 3, 15, 200, 150, 90) -- 35 fence fillTile(3, 2, 120, 190, 90) rectTile(3, 2, 0, 6, 15, 8, 160, 120, 70) rectTile(3, 2, 2, 4, 3, 12, 160, 120, 70) rectTile(3, 2, 12, 4, 13, 12, 160, 120, 70) -- 36 bridge fillTile(4, 2, 100, 180, 220) rectTile(4, 2, 0, 5, 15, 10, 160, 110, 60) -- 37 shadow fillTile(5, 2, 0, 0, 0) for y = 0, 15 do for x = 0, 15 do put(5 * TILE + x, 2 * TILE + y, 0, 0, 0, 40) end end -- 38 sand fillTile(6, 2, 230, 210, 150) -- 39 dark grass fillTile(7, 2, 90, 150, 60) -- 40 bush fillTile(8, 2, 120, 190, 90) rectTile(8, 2, 2, 6, 13, 14, 50, 120, 40) -- 41 rock fillTile(9, 2, 120, 190, 90) rectTile(9, 2, 3, 6, 12, 13, 150, 150, 155) -- 42 paper fillTile(10, 2, 210, 170, 110) rectTile(10, 2, 3, 2, 12, 14, 250, 245, 230) -- 43 medical form fillTile(11, 2, 245, 245, 248) rectTile(11, 2, 2, 2, 13, 14, 255, 255, 255) rectTile(11, 2, 3, 3, 10, 4, 180, 180, 190) -- 44 bed side fillTile(12, 2, 210, 170, 110) rectTile(12, 2, 2, 8, 13, 14, 100, 70, 50) -- 45 rug fillTile(13, 2, 210, 170, 110) rectTile(13, 2, 1, 3, 14, 12, 220, 90, 90) -- 46 crate fillTile(14, 2, 210, 170, 110) rectTile(14, 2, 2, 4, 13, 14, 170, 120, 60) -- 47 lamp fillTile(15, 2, 210, 170, 110) rectTile(15, 2, 7, 6, 8, 14, 120, 100, 80) rectTile(15, 2, 4, 2, 11, 7, 255, 230, 120) -- row 3 more tiles to exceed 64 for i = 0, 15 do local r = 100 + (i * 9) % 100 local g = 150 + (i * 5) % 80 local b = 80 + (i * 7) % 100 fillTile(i, 3, r, g, b) end -- specialize some fillTile(0, 3, 255, 200, 80) -- honey accent fillTile(1, 3, 180, 220, 255) -- sky blue tile fillTile(2, 3, 255, 180, 200) -- candy pink fillTile(3, 3, 255, 240, 180) -- cream fillTile(4, 3, 100, 100, 110) -- dark indoor fillTile(5, 3, 220, 220, 230) -- light grey white layer fillTile(6, 3, 190, 190, 200) fillTile(7, 3, 160, 160, 170) -- 8,3 door mat fillTile(8, 3, 210, 170, 110) rectTile(8, 3, 2, 6, 13, 12, 140, 60, 50) -- 9,3 stairs fillTile(9, 3, 190, 175, 150) rectTile(9, 3, 0, 10, 15, 15, 160, 145, 120) rectTile(9, 3, 0, 5, 15, 9, 170, 155, 130) -- 10,3 wall top fillTile(10, 3, 230, 120, 50) -- 11,3 indoor wall fillTile(11, 3, 240, 220, 180) rectTile(11, 3, 0, 14, 15, 15, 200, 180, 140) -- 12,3 flower bed fillTile(12, 3, 120, 190, 90) rectTile(12, 3, 1, 8, 14, 14, 100, 70, 40) px(12, 3, 4, 6, 255, 80, 120) px(12, 3, 8, 5, 255, 200, 50) px(12, 3, 12, 6, 255, 100, 180) -- 13,3 celebration fillTile(13, 3, 120, 190, 90) for i = 0, 5 do px(13, 3, 2 + i * 2, 4 + (i % 3), 255, 50 + i * 30, 100) end -- 14,3 night hint (unused mostly) fillTile(14, 3, 40, 50, 90) -- 15,3 void/black fillTile(15, 3, 20, 18, 25) -- row 4-7 pad to 128 tiles with variations for ty = 4, 7 do for tx = 0, 15 do local base = 80 + tx * 5 + ty * 3 fillTile(tx, ty, base, 140 + tx * 2, 90 + ty * 5) end end -- white corridor accents row 4 fillTile(0, 4, 250, 250, 252) fillTile(1, 4, 240, 240, 245) fillTile(2, 4, 210, 210, 220) fillTile(3, 4, 180, 180, 195) rectTile(4, 4, 0, 0, 15, 15, 255, 255, 255) rectTile(4, 4, 6, 0, 9, 15, 200, 200, 210) -- door gap white fillTile(5, 4, 100, 110, 120) -- hospital bed metal rectTile(5, 4, 2, 6, 13, 12, 230, 230, 240) fillTile(6, 4, 250, 250, 252) rectTile(6, 4, 4, 2, 11, 14, 60, 70, 80) -- window frame grey spr:saveAs("public/assets/tilesets/village.aseprite") spr:saveCopyAs("public/assets/tilesets/village.png") print("tileset written: 128 tiles (16x8)")