308 lines
8.6 KiB
Lua
308 lines
8.6 KiB
Lua
-- 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)")
|