Honey Village: six model builds + hub frontend, Dockerized for Dokploy

This commit is contained in:
2026-07-15 10:50:12 -04:00
commit 67253bded5
523 changed files with 58879 additions and 0 deletions
+215
View File
@@ -0,0 +1,215 @@
-- Aseprite Lua: player + NPCs + portraits + extras
-- Run: aseprite -b -script scripts/generate_sprites.lua
local function newSprite(w, h)
local s = Sprite(w, h, ColorMode.RGB)
app.activeSprite = s
return s
end
local function clear(img, w, h)
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
end
local function P(img, x, y, r, g, b, a)
a = a or 255
if x < 0 or y < 0 then return end
img:drawPixel(x, y, app.pixelColor.rgba(r, g, b, a))
end
local function fillRect(img, x0, y0, x1, y1, r, g, b)
for y = y0, y1 do
for x = x0, x1 do
P(img, x, y, r, g, b)
end
end
end
-- Draw a 16x24 character into img at offset (ox, oy)
-- face: 0 smile, 1 flat, 2 off (eye lower 1px)
local function drawChar(img, ox, oy, bodyR, bodyG, bodyB, headR, headG, headB, face, walkFrame, dir)
-- shadow
fillRect(img, ox + 3, oy + 22, ox + 12, oy + 23, 0, 0, 0)
for x = ox + 3, ox + 12 do
P(img, x, oy + 22, 0, 0, 0, 50)
P(img, x, oy + 23, 0, 0, 0, 30)
end
-- legs
local legOff = 0
if walkFrame == 1 then legOff = 1 end
if walkFrame == 3 then legOff = -1 end
fillRect(img, ox + 4, oy + 16, ox + 6, oy + 21, 60, 50, 80)
fillRect(img, ox + 9, oy + 16, ox + 11, oy + 21, 60, 50, 80)
if walkFrame == 1 then
fillRect(img, ox + 4, oy + 16, ox + 6, oy + 21, 0, 0, 0)
fillRect(img, ox + 3, oy + 16, ox + 5, oy + 21, 60, 50, 80)
elseif walkFrame == 3 then
fillRect(img, ox + 9, oy + 16, ox + 11, oy + 21, 0, 0, 0)
fillRect(img, ox + 10, oy + 16, ox + 12, oy + 21, 60, 50, 80)
end
-- body
fillRect(img, ox + 3, oy + 10, ox + 12, oy + 17, bodyR, bodyG, bodyB)
-- head
fillRect(img, ox + 3, oy + 2, ox + 12, oy + 10, headR, headG, headB)
-- ears/species hint for animals - small top nubs
if headR > 200 and headG > 180 then
-- rabbit ears
fillRect(img, ox + 4, oy + 0, ox + 5, oy + 3, headR, headG, headB)
fillRect(img, ox + 10, oy + 0, ox + 11, oy + 3, headR, headG, headB)
end
-- face
local eyeY = 5
local eyeY2 = 5
if face == 2 then eyeY2 = 6 end -- off: one eye 1px lower
if dir == 0 then -- down
P(img, ox + 5, oy + eyeY, 30, 30, 40)
P(img, ox + 10, oy + eyeY2, 30, 30, 40)
if face == 0 then
P(img, ox + 6, oy + 8, 200, 80, 100)
P(img, ox + 7, oy + 8, 200, 80, 100)
P(img, ox + 8, oy + 8, 200, 80, 100)
P(img, ox + 9, oy + 8, 200, 80, 100)
elseif face == 1 then
P(img, ox + 6, oy + 8, 80, 60, 70)
P(img, ox + 7, oy + 8, 80, 60, 70)
P(img, ox + 8, oy + 8, 80, 60, 70)
P(img, ox + 9, oy + 8, 80, 60, 70)
else
P(img, ox + 6, oy + 8, 200, 80, 100)
P(img, ox + 7, oy + 8, 200, 80, 100)
P(img, ox + 8, oy + 8, 200, 80, 100)
P(img, ox + 9, oy + 9, 200, 80, 100) -- mouth 1px off
end
elseif dir == 1 then -- up: no face
fillRect(img, ox + 3, oy + 2, ox + 12, oy + 6, headR - 10, headG - 10, headB - 10)
elseif dir == 2 then -- left
P(img, ox + 5, oy + eyeY, 30, 30, 40)
if face == 0 then P(img, ox + 4, oy + 8, 200, 80, 100) end
else -- right
P(img, ox + 10, oy + eyeY2, 30, 30, 40)
if face == 0 then P(img, ox + 11, oy + 8, 200, 80, 100) end
end
end
-- Player sheet: 4 dirs x 4 frames = 16 frames, each 16x24. Layout 4 cols x 4 rows
local pw, ph = 16 * 4, 24 * 4
local ps = newSprite(pw, ph)
local pimg = ps.cels[1].image
clear(pimg, pw, ph)
for dir = 0, 3 do
for frame = 0, 3 do
drawChar(pimg, frame * 16, dir * 24, 100, 170, 220, 250, 220, 190, 0, frame, dir)
end
end
ps:saveAs("public/assets/sprites/player.aseprite")
ps:saveCopyAs("public/assets/sprites/player.png")
-- Player portraits: smile + real face, 32x32 each side by side
local port = newSprite(64, 32)
local po = port.cels[1].image
clear(po, 64, 32)
-- smile portrait
fillRect(po, 4, 4, 27, 28, 250, 220, 190)
P(po, 11, 14, 30, 30, 40)
P(po, 20, 14, 30, 30, 40)
fillRect(po, 12, 20, 19, 21, 200, 80, 100)
-- real tired face
fillRect(po, 36, 4, 59, 28, 240, 210, 185)
P(po, 43, 14, 30, 30, 40)
P(po, 52, 15, 30, 30, 40)
fillRect(po, 44, 21, 51, 21, 100, 80, 90)
P(po, 42, 18, 200, 160, 160)
P(po, 53, 18, 200, 160, 160)
port:saveAs("public/assets/sprites/portraits.aseprite")
port:saveCopyAs("public/assets/sprites/portraits.png")
-- Named NPCs: 7 npcs x 3 faces, each 16x24. Grid: 3 faces per row, 7 rows
local npcs = {
{ name = "afu", br = 200, bg = 160, bb = 100, hr = 180, hg = 130, hb = 70 }, -- dog
{ name = "yuanyuan", br = 255, bg = 200, bb = 210, hr = 255, hg = 230, hb = 230 }, -- rabbit
{ name = "dabao", br = 160, bg = 110, bb = 70, hr = 180, hg = 130, hb = 80 }, -- bear
{ name = "mimi", br = 255, bg = 180, bb = 100, hr = 255, hg = 160, hb = 80 }, -- cat
{ name = "fu", br = 200, bg = 220, bb = 160, hr = 230, hg = 210, hb = 140 }, -- deer
{ name = "twinbirds", br = 100, bg = 180, bb = 220, hr = 255, hg = 220, hb = 80 },
{ name = "gui", br = 100, bg = 150, bb = 90, hr = 120, hg = 160, hb = 100 }, -- turtle
}
local ns = newSprite(16 * 3, 24 * 7)
local ni = ns.cels[1].image
clear(ni, 16 * 3, 24 * 7)
for i, n in ipairs(npcs) do
for face = 0, 2 do
drawChar(ni, face * 16, (i - 1) * 24, n.br, n.bg, n.bb, n.hr, n.hg, n.hb, face, 0, 0)
end
end
ns:saveAs("public/assets/sprites/npcs.aseprite")
ns:saveCopyAs("public/assets/sprites/npcs.png")
-- Twin birds beak anim 2 frames 16x16
local tb = newSprite(32, 16)
local ti = tb.cels[1].image
clear(ti, 32, 16)
-- frame 0 closed
fillRect(ti, 2, 4, 13, 12, 100, 180, 220)
P(ti, 5, 7, 30, 30, 40)
fillRect(ti, 10, 8, 12, 9, 255, 100, 80)
-- frame 1 open
fillRect(ti, 18, 4, 29, 12, 100, 180, 220)
P(ti, 21, 7, 30, 30, 40)
fillRect(ti, 26, 7, 29, 10, 255, 100, 80)
tb:saveAs("public/assets/sprites/birds.aseprite")
tb:saveCopyAs("public/assets/sprites/birds.png")
-- Extras x5, 2 frames each, 16x24
local ex = newSprite(16 * 2, 24 * 5)
local ei = ex.cels[1].image
clear(ei, 32, 120)
local colors = {
{ 200, 140, 80 },
{ 160, 100, 60 },
{ 220, 160, 100 },
{ 180, 120, 70 },
{ 140, 100, 50 },
}
for i = 1, 5 do
local c = colors[i]
for f = 0, 1 do
drawChar(ei, f * 16, (i - 1) * 24, c[1], c[2], c[3], c[1] + 20, c[2] + 20, c[3] + 10, 0, f * 2, 0)
end
end
ex:saveAs("public/assets/sprites/extras.aseprite")
ex:saveCopyAs("public/assets/sprites/extras.png")
-- Sunflower HUD petals sprite sheet 16x16 x 14 (12 petals + center + seeds)
local sf = newSprite(16 * 14, 16)
local si = sf.cels[1].image
clear(si, 16 * 14, 16)
for i = 0, 11 do
local ox = i * 16
fillRect(si, ox + 4, 2, ox + 11, 13, 255, 210, 50)
fillRect(si, ox + 6, 0, ox + 9, 15, 255, 200, 40)
end
-- center
fillRect(si, 12 * 16 + 4, 4, 12 * 16 + 11, 11, 180, 120, 40)
-- black seeds center
fillRect(si, 13 * 16 + 4, 4, 13 * 16 + 11, 11, 40, 30, 20)
for k = 0, 5 do
P(si, 13 * 16 + 5 + (k % 3) * 2, 5 + math.floor(k / 3) * 3, 20, 15, 10)
end
sf:saveAs("public/assets/sprites/sunflower.aseprite")
sf:saveCopyAs("public/assets/sprites/sunflower.png")
-- UI dialog panel 320x48
local ui = newSprite(320, 48)
local uiImg = ui.cels[1].image
clear(uiImg, 320, 48)
fillRect(uiImg, 0, 0, 319, 47, 40, 30, 25)
fillRect(uiImg, 2, 2, 317, 45, 250, 240, 220)
fillRect(uiImg, 4, 4, 315, 43, 255, 250, 235)
ui:saveAs("public/assets/sprites/dialog_panel.aseprite")
ui:saveCopyAs("public/assets/sprites/dialog_panel.png")
print("sprites generated")