172 lines
6.2 KiB
Lua
172 lines
6.2 KiB
Lua
-- gen_portraits.lua: generate portrait sprite sheet for dialogue UI.
|
|
-- Each portrait cell: 24x24. Single row of many cells.
|
|
-- Cells order:
|
|
-- 0 player-smile
|
|
-- 1 player-realface (tired)
|
|
-- 2 afu (dog mayor) smile
|
|
-- 3 afu flat
|
|
-- 4 afu off
|
|
-- 5 yuanyuan (rabbit baker) smile
|
|
-- 6 yuanyuan flat
|
|
-- 7 yuanyuan off
|
|
-- 8 dabao (bear postman) smile
|
|
-- 9 dabao flat
|
|
-- 10 dabao off
|
|
-- 11 mimi (cat shopkeeper) smile
|
|
-- 12 mimi flat
|
|
-- 13 mimi off
|
|
-- 14 dr_fu (deer doctor) smile (only smile; flat/off unused but provided)
|
|
-- 15 dr_fu flat
|
|
-- 16 dr_fu off
|
|
-- 17 twinbirds smile
|
|
-- 18 grandpa_turtle (turtle elder) smile
|
|
-- 19 grandpa_turtle flat
|
|
-- 20 grandpa_turtle off
|
|
-- 21..25 extras (squirrel/hedgehog/etc) smile
|
|
-- Produces assets/sprites/portraits.png
|
|
local FW = 24
|
|
local FH = 24
|
|
local N = 26
|
|
local W = FW*N
|
|
local H = FH
|
|
app.command.NewFile{ width=W, height=H, colorMode=ColorMode.RGB }
|
|
local spr = app.activeSprite
|
|
local img = app.activeImage
|
|
for y=0,H-1 do for x=0,W-1 do img:drawPixel(x,y, app.pixelColor.rgba(0,0,0,0)) end end
|
|
local function px(x,y,c) img:drawPixel(x,y,c) end
|
|
local function rect(ox,oy,w,h,c) for y=oy,oy+h-1 do for x=ox,ox+w-1 do px(ox+(x-ox),y,c) end end end
|
|
-- careful rect above buggy; redefine properly
|
|
local function R(ox,oy,w,h,c) for y=oy,oy+h-1 do for x=ox,ox+w-1 do img:drawPixel(x,y,c) end end end
|
|
|
|
-- shared colors
|
|
local skin = app.pixelColor.rgba(255,214,176,255)
|
|
local skinS= app.pixelColor.rgba(224,176,140,255)
|
|
local eye = app.pixelColor.rgba(56,40,40,255)
|
|
local mouth= app.pixelColor.rgba(200,110,110,255)
|
|
local cheek= app.pixelColor.rgba(255,170,170,255)
|
|
local white= app.pixelColor.rgba(245,245,245,255)
|
|
local black= app.pixelColor.rgba(40,40,40,255)
|
|
|
|
-- generic face drawer: ox,oy top-left of 24x24 cell
|
|
-- species-specific color + ears, expression (smile/flat/off)
|
|
-- species: human, dog, rabbit, bear, cat, deer, bird, turtle, squirrel, hedgehog
|
|
local function face(ox, oy, col, species, expr)
|
|
-- head fill
|
|
R(ox+6, oy+5, 12, 12, col)
|
|
-- ears per species
|
|
if species == "rabbit" then
|
|
R(ox+7, oy+1, 2, 5, col); R(ox+15, oy+1, 2, 5, col)
|
|
R(ox+7, oy+2, 2, 2, skinS); R(ox+15, oy+2, 2, 2, skinS)
|
|
elseif species == "dog" then
|
|
R(ox+5, oy+4, 2, 4, col); R(ox+17, oy+4, 2, 4, col)
|
|
-- floppy
|
|
R(ox+4, oy+6, 2, 6, col)
|
|
R(ox+18, oy+6, 2, 6, col)
|
|
elseif species == "bear" then
|
|
R(ox+5, oy+3, 3, 3, col); R(ox+16, oy+3, 3, 3, col)
|
|
px(ox+6, oy+4, skinS); px(ox+17, oy+4, skinS)
|
|
elseif species == "cat" then
|
|
-- pointy ears
|
|
px(ox+6, oy+4, col); px(ox+7, oy+2, col); px(ox+8, oy+1, col); px(ox+9, oy+3, col)
|
|
px(ox+15, oy+3, col); px(ox+16, oy+1, col); px(ox+17, oy+2, col); px(ox+18, oy+4, col)
|
|
elseif species == "deer" then
|
|
px(ox+8, oy+1, col); px(ox+8, oy+2, col); px(ox+9, oy+0, col)
|
|
px(ox+9, oy+2, skinS); px(ox+15, oy+0, col); px(ox+15, oy+2, col); px(ox+14, oy+1, col)
|
|
px(ox+14, oy+2, skinS)
|
|
elseif species == "turtle" then
|
|
-- no ears, rounded; draw a cap
|
|
R(ox+5, oy+4, 14, 4, col)
|
|
elseif species == "bird" then
|
|
R(ox+6, oy+4, 12, 10, col)
|
|
px(ox+7, oy+3, col); px(ox+16, oy+3, col)
|
|
elseif species == "squirrel" then
|
|
R(ox+5, oy+4, 2, 3, col); R(ox+17, oy+4, 2, 3, col)
|
|
R(ox+2, oy+2, 3, 6, col) -- tail
|
|
elseif species == "hedgehog" then
|
|
for x=6,17,2 do px(ox+x, oy+3, skinS); px(ox+x, oy+4, skinS) end
|
|
end
|
|
-- eyes (expression dependent)
|
|
if expr == "smile" then
|
|
px(ox+9, oy+9, eye); px(ox+14, oy+9, eye)
|
|
px(ox+9, oy+10, eye); px(ox+14, oy+10, eye)
|
|
-- cheeks
|
|
px(ox+8, oy+12, cheek); px(ox+15, oy+12, cheek)
|
|
-- smile mouth
|
|
px(ox+11, oy+13, mouth); px(ox+12, oy+13, mouth)
|
|
px(ox+10, oy+12, mouth); px(ox+13, oy+12, mouth)
|
|
elseif expr == "flat" then
|
|
px(ox+9, oy+9, eye); px(ox+14, oy+9, eye)
|
|
-- straight mouth
|
|
px(ox+11, oy+13, mouth); px(ox+12, oy+13, mouth)
|
|
elseif expr == "off" then
|
|
-- one eye dropped 1px (the signature "off" detail)
|
|
px(ox+9, oy+9, eye); px(ox+9, oy+10, eye)
|
|
px(ox+14, oy+10, eye); -- right eye 1px lower
|
|
-- mouth with extra 1px droop
|
|
px(ox+11, oy+13, mouth); px(ox+12, oy+13, mouth); px(ox+13, oy+13, mouth)
|
|
end
|
|
end
|
|
|
|
-- 0 player smile (human)
|
|
face(0*FW, 0, skin, "human", "smile")
|
|
-- add hair
|
|
R(0*FW+6, 3, 12, 4, app.pixelColor.rgba(150,110,80,255))
|
|
-- 1 player realface (tired)
|
|
face(1*FW, 0, skinS, "human", "flat")
|
|
R(1*FW+6, 3, 12, 4, app.pixelColor.rgba(150,110,80,255))
|
|
-- tired eyes: half-lids
|
|
px(1*FW+9, 10, skinS); px(1*FW+14, 10, skinS)
|
|
-- a small frown
|
|
px(1*FW+11, 14, mouth); px(1*FW+12, 14, mouth)
|
|
-- shadow under eyes
|
|
px(1*FW+9, 11, skinS); px(1*FW+14, 11, skinS)
|
|
|
|
-- species color presets
|
|
local dogC = app.pixelColor.rgba(200,150,90,255)
|
|
local rabC = app.pixelColor.rgba(245,235,230,255)
|
|
local bearC = app.pixelColor.rgba(150,100,60,255)
|
|
local catC = app.pixelColor.rgba(230,220,210,255)
|
|
local deerC = app.pixelColor.rgba(210,160,110,255)
|
|
local birdC = app.pixelColor.rgba(120,200,230,255)
|
|
local turC = app.pixelColor.rgba(120,160,90,255)
|
|
local sqC = app.pixelColor.rgba(170,110,70,255)
|
|
local hedC = app.pixelColor.rgba(150,110,70,255)
|
|
|
|
-- 2-4 afu dog: smile/flat/off
|
|
face(2*FW, 0, dogC, "dog", "smile")
|
|
face(3*FW, 0, dogC, "dog", "flat")
|
|
face(4*FW, 0, dogC, "dog", "off")
|
|
-- 5-7 yuanyuan rabbit
|
|
face(5*FW, 0, rabC, "rabbit", "smile")
|
|
face(6*FW, 0, rabC, "rabbit", "flat")
|
|
face(7*FW, 0, rabC, "rabbit", "off")
|
|
-- 8-10 dabao bear
|
|
face(8*FW, 0, bearC, "bear", "smile")
|
|
face(9*FW, 0, bearC, "bear", "flat")
|
|
face(10*FW, 0, bearC, "bear", "off")
|
|
-- 11-13 mimi cat
|
|
face(11*FW, 0, catC, "cat", "smile")
|
|
face(12*FW, 0, catC, "cat", "flat")
|
|
face(13*FW, 0, catC, "cat", "off")
|
|
-- 14-16 dr_fu deer (only smile used; flat/off provided for completeness)
|
|
face(14*FW, 0, deerC, "deer", "smile")
|
|
face(15*FW, 0, deerC, "deer", "flat")
|
|
face(16*FW, 0, deerC, "deer", "off")
|
|
-- 17 twinbirds smile (single)
|
|
face(17*FW, 0, birdC, "bird", "smile")
|
|
-- 18-20 grandpa turtle
|
|
face(18*FW, 0, turC, "turtle", "smile")
|
|
face(19*FW, 0, turC, "turtle", "flat")
|
|
face(20*FW, 0, turC, "turtle", "off")
|
|
-- 21-25 extras
|
|
face(21*FW, 0, sqC, "squirrel", "smile")
|
|
face(22*FW, 0, hedC, "hedgehog", "smile")
|
|
face(23*FW, 0, sqC, "squirrel", "smile")
|
|
face(24*FW, 0, hedC, "hedgehog", "smile")
|
|
face(25*FW, 0, sqC, "squirrel", "smile")
|
|
|
|
local out = "assets/sprites/portraits.png"
|
|
spr:saveCopyAs(out)
|
|
print("Saved " .. out)
|
|
app.exit()
|