Honey Village: six model builds + hub frontend, Dockerized for Dokploy
This commit is contained in:
Executable
+23
@@ -0,0 +1,23 @@
|
||||
#!/usr/bin/env bash
|
||||
# Regenerates ALL art + maps from source scripts. Requires Aseprite + Tiled installed.
|
||||
set -euo pipefail
|
||||
ROOT="$(cd "$(dirname "$0")/.." && pwd)"
|
||||
ASE="${ASEPRITE:-/Applications/Aseprite.app/Contents/MacOS/aseprite}"
|
||||
TILED="${TILED:-/Applications/Tiled.app/Contents/MacOS/Tiled}"
|
||||
SPRITES="$ROOT/public/assets/sprites"
|
||||
MAPS="$ROOT/public/assets/maps"
|
||||
mkdir -p "$SPRITES" "$MAPS"
|
||||
|
||||
echo "== [1/3] Aseprite: pixel art =="
|
||||
"$ASE" -b --script-param outdir="$SPRITES" --script "$ROOT/tools/gen_all.lua"
|
||||
|
||||
echo "== [2/3] Node: Tiled .tmx sources =="
|
||||
node "$ROOT/tools/gen_maps.mjs"
|
||||
|
||||
echo "== [3/3] Tiled: export .tmx -> .json =="
|
||||
for f in "$ROOT/tools/tmx/"*.tmx; do
|
||||
name="$(basename "$f" .tmx)"
|
||||
"$TILED" --export-map "$f" "$MAPS/$name.json"
|
||||
echo " exported $name.json"
|
||||
done
|
||||
echo "== assets built =="
|
||||
@@ -0,0 +1,314 @@
|
||||
-- gen_all.lua : draws EVERY pixel asset for 蜜糖村 from scratch (Aseprite Lua API).
|
||||
-- No external art, no imported palettes. Run: aseprite -b --script-param outdir=... --script gen_all.lua
|
||||
local outdir = app.params["outdir"]
|
||||
if not outdir then error("need --script-param outdir=") end
|
||||
|
||||
local function pack(t) return app.pixelColor.rgba(t[1], t[2], t[3], t[4] or 255) end
|
||||
local function px(img,x,y,c) if x>=0 and y>=0 and x<img.width and y<img.height then img:drawPixel(x,y,pack(c)) end end
|
||||
local function rect(img,x,y,w,h,c) for j=0,h-1 do for i=0,w-1 do px(img,x+i,y+j,c) end end end
|
||||
local function hline(img,x,y,w,c) for i=0,w-1 do px(img,x+i,y,c) end end
|
||||
local function vline(img,x,y,h,c) for j=0,h-1 do px(img,x,y+j,c) end end
|
||||
local function speck(img,ox,oy,w,h,c,mod,rem) for j=0,h-1 do for i=0,w-1 do if ((i*7+j*13+i*j)%mod)==rem then px(img,ox+i,oy+j,c) end end end end
|
||||
|
||||
local function newImg(w,h)
|
||||
local s = Sprite(w,h, ColorMode.RGB)
|
||||
return s, s.cels[1].image
|
||||
end
|
||||
local function save(s,name) s:saveAs(outdir.."/"..name) end
|
||||
|
||||
local P = {
|
||||
grass1={124,200,110}, grass2={96,170,80}, grass3={158,222,138},
|
||||
soil={150,110,70}, soilD={120,86,54},
|
||||
path1={203,185,158}, path2={170,150,118}, path3={226,214,190},
|
||||
water1={112,196,232}, water2={80,168,216}, water3={56,134,182}, foam={205,240,250}, waterDeep={44,110,158},
|
||||
wall1={234,202,156}, wall2={210,170,122}, wallD={186,140,96},
|
||||
roof1={224,116,108}, roof2={192,88,80}, roof3={240,152,142},
|
||||
door1={140,92,60}, door2={106,64,40}, knob={240,208,120},
|
||||
wood1={178,130,82}, wood2={140,98,58}, wood3={202,160,114},
|
||||
pink1={244,156,194}, pink2={224,112,160}, pinkD={198,86,134},
|
||||
red1={232,90,90}, red2={192,58,58},
|
||||
yellow1={246,232,170}, yellow2={234,210,130}, yellow3={252,244,206},
|
||||
orange1={242,170,80}, orange2={218,140,54},
|
||||
sky={144,212,240},
|
||||
trunk={140,98,58}, trunkD={108,74,44},
|
||||
canopy1={80,170,70}, canopy2={64,128,58}, canopy3={100,198,88},
|
||||
ifloor1={202,160,114}, ifloor2={178,134,88},
|
||||
iwall1={152,118,86}, iwall2={122,92,66}, iwallTrim={212,182,142},
|
||||
cloth={244,182,122}, clothW={252,236,214},
|
||||
paper={248,244,232}, ink={90,70,60},
|
||||
metal={150,158,166}, metalD={110,118,128}, glass={176,222,240},
|
||||
seed={58,46,46}, black={40,34,34}, gray={120,120,124},
|
||||
wbg={218,221,224}, wwall={196,200,206}, wwallD={168,174,182},
|
||||
wfloor={208,212,216}, wfloorL={224,227,230}, wdark={150,156,164}, wbed={234,236,238}, wline={176,182,190},
|
||||
skin={245,205,162}, skinD={214,168,128}, hair={92,64,42},
|
||||
}
|
||||
|
||||
-- ============ TILESET (8x9 = 72 tiles) -> tileset.png ============
|
||||
do
|
||||
local s, img = newImg(128,144)
|
||||
local function grassBase(ox,oy) rect(img,ox,oy,16,16,P.grass1); speck(img,ox,oy,16,16,P.grass2,5,0); speck(img,ox,oy,16,16,P.grass3,7,2) end
|
||||
local T = {}
|
||||
T[0]=function(ox,oy) grassBase(ox,oy) end
|
||||
T[1]=function(ox,oy) grassBase(ox,oy); px(img,ox+4,oy+5,P.yellow2); px(img,ox+11,oy+10,P.pink1); px(img,ox+8,oy+13,P.pink1) end
|
||||
T[2]=function(ox,oy) rect(img,ox,oy,16,16,P.path1); speck(img,ox,oy,16,16,P.path2,6,1); speck(img,ox,oy,16,16,P.path3,9,3); hline(img,ox,oy,16,P.path2); vline(img,ox,oy,16,P.path2) end
|
||||
T[3]=function(ox,oy) grassBase(ox,oy); rect(img,ox+4,oy,8,16,P.path1); speck(img,ox+4,oy,8,16,P.path2,6,1) end
|
||||
T[4]=function(ox,oy) rect(img,ox,oy,16,16,P.water1); speck(img,ox,oy,16,16,P.water2,5,0); hline(img,ox+2,oy+4,5,P.foam); hline(img,ox+9,oy+10,4,P.foam) end
|
||||
T[5]=function(ox,oy) rect(img,ox,oy,16,16,P.water1); speck(img,ox,oy,16,16,P.water3,7,2); hline(img,ox+1,oy+2,14,P.foam); hline(img,ox+3,oy+8,10,P.water2) end
|
||||
T[6]=function(ox,oy) grassBase(ox,oy); rect(img,ox+2,oy+6,12,8,P.canopy2); speck(img,ox+2,oy+6,12,8,P.canopy1,4,0); px(img,ox+4,oy+7,P.pink1); px(img,ox+9,oy+8,P.yellow2); px(img,ox+7,oy+11,P.pink2); px(img,ox+12,oy+11,P.pink1) end
|
||||
T[7]=function(ox,oy) grassBase(ox,oy); rect(img,ox+2,oy+5,12,9,P.canopy2); speck(img,ox+2,oy+5,12,9,P.canopy1,3,0); for _,p in ipairs({{5,7},{9,7},{6,10},{11,9},{8,12}}) do px(img,ox+p[1],oy+p[2],P.red1); px(img,ox+p[1],oy+p[2]-1,P.red2) end end
|
||||
T[8]=function(ox,oy) rect(img,ox+2,oy+1,12,12,P.canopy2); rect(img,ox+3,oy,10,2,P.canopy2); rect(img,ox+1,oy+3,14,8,P.canopy2); speck(img,ox,oy,16,14,P.canopy1,4,0); speck(img,ox,oy,16,14,P.canopy3,6,3) end
|
||||
T[9]=function(ox,oy) grassBase(ox,oy); rect(img,ox+6,oy+2,4,13,P.trunk); vline(img,ox+6,oy+2,13,P.trunkD); px(img,ox+7,oy+7,P.trunkD) end
|
||||
T[10]=function(ox,oy) rect(img,ox,oy,16,16,P.wall1); speck(img,ox,oy,16,16,P.wall2,7,2); hline(img,ox,oy+8,16,P.wallD); for i=0,3 do vline(img,ox+i*4+2,oy,8,P.wallD) end; for i=0,3 do vline(img,ox+i*4,oy+8,8,P.wallD) end end
|
||||
T[11]=function(ox,oy) rect(img,ox,oy,16,16,P.roof1); for j=0,15 do hline(img,ox,oy+j,16,(j%3==0) and P.roof2 or P.roof1) end; speck(img,ox,oy,16,16,P.roof3,8,4) end
|
||||
T[12]=function(ox,oy) rect(img,ox,oy,16,16,P.wall2); rect(img,ox+3,oy+2,10,14,P.door1); rect(img,ox+4,oy+3,8,13,P.door2); px(img,ox+10,oy+9,P.knob) end
|
||||
T[13]=function(ox,oy) grassBase(ox,oy); rect(img,ox+1,oy+4,2,10,P.wood2); rect(img,ox+7,oy+4,2,10,P.wood2); rect(img,ox+13,oy+4,2,10,P.wood2); hline(img,ox,oy+6,16,P.wood1); hline(img,ox,oy+10,16,P.wood1) end
|
||||
T[14]=function(ox,oy) rect(img,ox,oy,16,16,P.soilD); rect(img,ox+1,oy+1,14,14,P.soil); for _,p in ipairs({{3,3},{8,4},{12,6},{5,9},{10,11},{3,12}}) do px(img,ox+p[1],oy+p[2],P.pink1); px(img,ox+p[1]+1,oy+p[2],P.pink2); px(img,ox+p[1],oy+p[2]-1,P.yellow2) end end
|
||||
T[15]=function(ox,oy) grassBase(ox,oy); rect(img,ox+2,oy+4,12,11,P.path2); rect(img,ox+3,oy+5,10,9,P.path1); rect(img,ox+5,oy+7,6,6,P.black); rect(img,ox+5,oy+7,6,3,P.waterDeep); vline(img,ox+2,oy+1,5,P.wood2); vline(img,ox+13,oy+1,5,P.wood2); hline(img,ox+2,oy+1,12,P.wood1) end
|
||||
T[16]=function(ox,oy) rect(img,ox,oy,16,16,{225,228,232,235}); speck(img,ox,oy,16,16,{240,242,245,255},4,0); speck(img,ox,oy,16,16,{205,210,216,220},5,2) end
|
||||
T[17]=function(ox,oy) rect(img,ox+1,oy+2,14,11,P.wood2); rect(img,ox+2,oy+3,12,9,P.paper); px(img,ox+4,oy+5,P.ink); px(img,ox+6,oy+5,P.ink); px(img,ox+8,oy+5,P.ink); hline(img,ox+4,oy+7,7,P.ink); hline(img,ox+4,oy+9,5,P.ink); rect(img,ox+2,oy+13,2,3,P.wood1); rect(img,ox+12,oy+13,2,3,P.wood1) end
|
||||
T[18]=function(ox,oy) grassBase(ox,oy); rect(img,ox+7,oy+6,2,9,P.wood2); rect(img,ox+4,oy+2,8,6,P.red1); rect(img,ox+4,oy+2,8,2,P.red2); hline(img,ox+5,oy+5,6,P.black); rect(img,ox+11,oy+1,1,4,P.red2) end
|
||||
T[19]=function(ox,oy) grassBase(ox,oy); for j=0,9 do for i=0,13 do local red=((i//2)+(j//2))%2==0; px(img,ox+1+i,oy+3+j, red and P.red1 or P.clothW) end end end
|
||||
T[20]=function(ox,oy) grassBase(ox,oy); rect(img,ox+1,oy+7,14,3,P.wood1); rect(img,ox+1,oy+4,14,2,P.wood2); vline(img,ox+2,oy+9,5,P.wood2); vline(img,ox+13,oy+9,5,P.wood2) end
|
||||
T[21]=function(ox,oy) grassBase(ox,oy); rect(img,ox+7,oy+4,2,11,P.metalD); rect(img,ox+5,oy+1,6,4,P.yellow3); rect(img,ox+6,oy+2,4,2,P.yellow2) end
|
||||
T[22]=function(ox,oy) grassBase(ox,oy); rect(img,ox+4,oy+8,8,6,P.canopy2); speck(img,ox+4,oy+8,8,6,P.canopy1,3,0) end
|
||||
T[23]=function(ox,oy) rect(img,ox,oy,16,16,P.wall1); speck(img,ox,oy,16,16,P.wall2,4,1); speck(img,ox,oy,16,16,P.wallD,9,3) end
|
||||
T[24]=function(ox,oy) rect(img,ox,oy,16,16,P.ifloor1); for j=0,3 do hline(img,ox,oy+j*4,16,P.ifloor2) end; speck(img,ox,oy,16,16,P.ifloor2,11,4) end
|
||||
T[25]=function(ox,oy) rect(img,ox,oy,16,16,P.ifloor1); for i=0,3 do vline(img,ox+i*4,oy,16,P.ifloor2) end end
|
||||
T[26]=function(ox,oy) rect(img,ox,oy,16,16,P.iwall1); speck(img,ox,oy,16,16,P.iwall2,7,3); hline(img,ox,oy,16,P.iwall2) end
|
||||
T[27]=function(ox,oy) rect(img,ox,oy,16,16,P.iwall1); rect(img,ox,oy,16,5,P.iwallTrim); hline(img,ox,oy+5,16,P.iwall2) end
|
||||
T[28]=function(ox,oy) rect(img,ox,oy,16,16,P.wood2); rect(img,ox+1,oy+4,14,11,P.pink1); rect(img,ox+1,oy+4,14,4,P.clothW); rect(img,ox+2,oy+4,5,3,P.clothW); hline(img,ox+1,oy+9,14,P.pinkD) end
|
||||
T[29]=function(ox,oy) rect(img,ox,oy,16,16,P.iwall1); rect(img,ox+3,oy+2,10,12,P.paper); hline(img,ox+3,oy+2,10,P.red1); px(img,ox+5,oy+6,P.ink); px(img,ox+7,oy+6,P.ink); px(img,ox+9,oy+6,P.ink); hline(img,ox+5,oy+9,6,P.ink); px(img,ox+7,oy+11,P.red2); px(img,ox+8,oy+11,P.red2) end
|
||||
T[30]=function(ox,oy) rect(img,ox,oy+3,16,12,P.wood2); rect(img,ox,oy+3,16,3,P.wood3); hline(img,ox,oy+9,16,P.wood1); rect(img,ox+2,oy+11,3,3,P.wood1); rect(img,ox+11,oy+11,3,3,P.wood1) end
|
||||
T[31]=function(ox,oy) rect(img,ox,oy+1,16,14,P.metalD); rect(img,ox+2,oy+3,12,8,P.black); rect(img,ox+3,oy+7,10,4,P.orange1); rect(img,ox+4,oy+8,8,2,P.yellow2); hline(img,ox+2,oy+2,12,P.metal); px(img,ox+11,oy+4,P.red1) end
|
||||
T[32]=function(ox,oy) rect(img,ox,oy,16,16,P.wood1); rect(img,ox+2,oy+2,12,12,P.paper); hline(img,ox+4,oy+5,8,P.ink); hline(img,ox+4,oy+7,8,P.ink); hline(img,ox+4,oy+9,5,P.ink); px(img,ox+12,oy+11,P.red1) end
|
||||
T[33]=function(ox,oy) rect(img,ox,oy,16,16,P.wood2); hline(img,ox,oy+5,16,P.wood1); hline(img,ox,oy+10,16,P.wood1); rect(img,ox+2,oy+1,3,3,P.orange1); rect(img,ox+7,oy+1,3,3,P.red1); rect(img,ox+11,oy+1,3,3,P.sky); rect(img,ox+2,oy+6,3,3,P.pink1); rect(img,ox+7,oy+6,3,3,P.yellow2) end
|
||||
T[34]=function(ox,oy) rect(img,ox,oy,16,16,P.wood2); hline(img,ox,oy+8,16,P.wood1); rect(img,ox+3,oy+2,4,5,P.orange1); rect(img,ox+3,oy+2,4,2,P.orange2); rect(img,ox+9,oy+2,4,5,P.orange1); rect(img,ox+9,oy+2,4,2,P.orange2); rect(img,ox+3,oy+10,4,5,P.orange1); rect(img,ox+9,oy+10,4,5,P.orange1) end
|
||||
T[35]=function(ox,oy) rect(img,ox+1,oy+4,14,4,P.wood3); rect(img,ox+1,oy+4,14,2,P.wood1); vline(img,ox+2,oy+8,6,P.wood2); vline(img,ox+13,oy+8,6,P.wood2) end
|
||||
T[36]=function(ox,oy) rect(img,ox+4,oy+2,8,3,P.wood2); rect(img,ox+4,oy+7,8,3,P.wood3); vline(img,ox+4,oy+5,2,P.wood2); vline(img,ox+5,oy+10,4,P.wood2); vline(img,ox+10,oy+10,4,P.wood2) end
|
||||
T[37]=function(ox,oy) rect(img,ox+1,oy+5,14,4,P.wood3); rect(img,ox+3,oy,10,7,P.paper); hline(img,ox+3,oy,10,P.water3); hline(img,ox+4,oy+2,8,P.ink); hline(img,ox+4,oy+4,5,P.ink); rect(img,ox+9,oy+1,4,3,P.wood3) end
|
||||
T[38]=function(ox,oy) rect(img,ox,oy,16,16,P.iwall1); rect(img,ox+2,oy+2,12,10,P.glass); rect(img,ox+2,oy+2,12,4,P.sky); vline(img,ox+8,oy+2,10,P.iwall2); hline(img,ox+2,oy+7,12,P.iwall2); rect(img,ox+1,oy+1,14,1,P.iwallTrim) end
|
||||
T[39]=function(ox,oy) rect(img,ox,oy,16,16,P.iwall1); rect(img,ox+3,oy+2,10,14,P.door1); rect(img,ox+4,oy+3,8,13,P.door2); px(img,ox+10,oy+9,P.knob) end
|
||||
T[40]=function(ox,oy) rect(img,ox,oy,16,16,P.wwall); speck(img,ox,oy,16,16,P.wwallD,9,4); hline(img,ox,oy+11,16,P.wwallD) end
|
||||
T[41]=function(ox,oy) rect(img,ox,oy,16,16,P.wfloor); hline(img,ox,oy,16,P.wline); vline(img,ox,oy,16,P.wline); speck(img,ox,oy,16,16,P.wfloorL,13,3) end
|
||||
T[42]=function(ox,oy) rect(img,ox,oy,16,16,P.wfloorL); hline(img,ox+8,oy,8,P.wline); vline(img,ox,oy+8,8,P.wline) end
|
||||
T[43]=function(ox,oy) rect(img,ox,oy,16,16,P.wfloor); rect(img,ox+1,oy+3,14,11,P.wbed); rect(img,ox+1,oy+3,14,3,P.wdark); hline(img,ox+1,oy+9,14,P.wline); rect(img,ox,oy+2,2,13,P.metal); rect(img,ox+14,oy+2,2,13,P.metal) end
|
||||
T[44]=function(ox,oy) rect(img,ox,oy,16,16,P.wwall); rect(img,ox+3,oy+1,10,15,P.wfloorL); rect(img,ox+4,oy+2,8,14,P.wfloor); px(img,ox+10,oy+9,P.metalD) end
|
||||
T[45]=function(ox,oy) rect(img,ox,oy,16,16,P.wwall); rect(img,ox+2,oy+2,12,10,{212,224,230}); vline(img,ox+8,oy+2,10,P.wdark); hline(img,ox+2,oy+7,12,P.wdark) end
|
||||
T[46]=function(ox,oy) for i=0,15 do local j=math.floor(2*math.sin(i*0.9)+6); px(img,ox+i,oy+j,P.pink2); px(img,ox+i,oy+j+1,P.pink1) end; px(img,ox+3,oy+3,P.yellow2); px(img,ox+11,oy+9,P.sky) end
|
||||
T[47]=function(ox,oy) rect(img,ox,oy+6,16,10,P.wood2); rect(img,ox,oy+6,16,2,P.wood3); rect(img,ox+2,oy,12,6,P.red1); for i=0,3 do px(img,ox+2+i*4,oy+5,P.yellow2) end end
|
||||
T[48]=function(ox,oy) grassBase(ox,oy); for _,p in ipairs({{4,6},{9,4},{11,10},{6,11}}) do px(img,ox+p[1],oy+p[2],P.red1); px(img,ox+p[1]+1,oy+p[2],P.red2); px(img,ox+p[1],oy+p[2]+1,P.yellow2) end end
|
||||
T[49]=function(ox,oy) grassBase(ox,oy); for _,p in ipairs({{5,5},{10,7},{7,11},{12,12}}) do px(img,ox+p[1],oy+p[2],P.sky); px(img,ox+p[1]+1,oy+p[2],P.water2); px(img,ox+p[1],oy+p[2]+1,P.yellow2) end end
|
||||
T[50]=function(ox,oy) grassBase(ox,oy); rect(img,ox+6,oy+9,3,4,P.wall1); rect(img,ox+4,oy+6,7,4,P.red1); px(img,ox+5,oy+7,P.yellow3); px(img,ox+8,oy+8,P.yellow3) end
|
||||
T[51]=function(ox,oy) grassBase(ox,oy); rect(img,ox+3,oy+7,10,6,P.gray); rect(img,ox+3,oy+7,10,2,{150,150,154}); px(img,ox+5,oy+10,P.metalD) end
|
||||
T[52]=function(ox,oy) grassBase(ox,oy); rect(img,ox+4,oy+7,8,6,P.trunk); rect(img,ox+5,oy+6,6,2,P.wood3); px(img,ox+7,oy+7,P.trunkD); px(img,ox+8,oy+7,P.trunkD) end
|
||||
T[53]=function(ox,oy) rect(img,ox,oy,16,16,P.water1); speck(img,ox,oy,16,16,P.water2,5,0); rect(img,ox+4,oy+5,8,6,P.canopy1); px(img,ox+7,oy+7,P.pink1); px(img,ox+8,oy+7,P.pink2) end
|
||||
T[54]=function(ox,oy) rect(img,ox,oy,16,16,P.water1); speck(img,ox,oy,16,16,P.water2,5,0); vline(img,ox+5,oy+2,10,P.canopy2); vline(img,ox+9,oy+1,11,P.canopy2); rect(img,ox+4,oy+1,3,3,P.trunk); rect(img,ox+8,oy,3,3,P.trunk) end
|
||||
T[55]=function(ox,oy) rect(img,ox+4,oy+4,8,10,P.orange1); rect(img,ox+4,oy+4,8,3,P.orange2); rect(img,ox+5,oy+1,6,3,P.wood2); rect(img,ox+6,oy+8,4,4,P.yellow2) end
|
||||
T[56]=function(ox,oy) rect(img,ox+1,oy+2,14,13,P.wood2); rect(img,ox+2,oy+3,12,11,P.wood1); vline(img,ox+8,oy+3,11,P.wood2); hline(img,ox+2,oy+8,12,P.wood2) end
|
||||
T[57]=function(ox,oy) rect(img,ox+3,oy+1,10,14,P.wood1); rect(img,ox+3,oy+1,10,2,P.wood2); hline(img,ox+3,oy+5,10,P.wood2); hline(img,ox+3,oy+10,10,P.wood2); vline(img,ox+7,oy+1,14,P.wood3) end
|
||||
T[58]=function(ox,oy) rect(img,ox,oy,16,16,P.wood2); hline(img,ox,oy+8,16,P.wood1); for i=0,4 do vline(img,ox+1+i*3,oy+1,6,({P.red1,P.sky,P.canopy1,P.orange1,P.pink2})[i+1]) end; for i=0,4 do vline(img,ox+1+i*3,oy+9,6,({P.canopy1,P.pink2,P.red1,P.sky,P.yellow2})[i+1]) end end
|
||||
T[59]=function(ox,oy) rect(img,ox,oy,16,16,P.iwall1); rect(img,ox+4,oy+3,8,8,P.wall1); rect(img,ox+5,oy+4,6,6,P.paper); vline(img,ox+8,oy+5,3,P.ink); hline(img,ox+8,oy+7,3,P.ink) end
|
||||
T[60]=function(ox,oy) rect(img,ox,oy,16,16,P.iwall1); rect(img,ox+2,oy+2,12,10,P.wood2); rect(img,ox+3,oy+3,10,8,P.sky); rect(img,ox+3,oy+8,10,3,P.canopy1); px(img,ox+10,oy+5,P.yellow3) end
|
||||
T[61]=function(ox,oy) rect(img,ox+5,oy+10,6,5,P.orange2); rect(img,ox+4,oy+9,8,2,P.orange1); rect(img,ox+5,oy+4,6,6,P.canopy2); speck(img,ox+5,oy+4,6,6,P.canopy1,3,0) end
|
||||
T[62]=function(ox,oy) rect(img,ox,oy,16,16,P.ifloor1); rect(img,ox+2,oy+3,12,10,P.pink2); rect(img,ox+4,oy+5,8,6,P.pink1); px(img,ox+7,oy+7,P.yellow2); px(img,ox+8,oy+8,P.yellow2) end
|
||||
T[63]=function(ox,oy) rect(img,ox,oy,16,16,P.grass2); speck(img,ox,oy,16,16,P.canopy2,5,0); speck(img,ox,oy,16,16,P.grass1,7,2) end
|
||||
T[64]=function(ox,oy) grassBase(ox,oy); px(img,ox+3,oy+3,P.orange1); px(img,ox+7,oy+6,P.pink2); px(img,ox+12,oy+4,P.yellow2); px(img,ox+9,oy+12,P.red1); px(img,ox+4,oy+11,P.sky) end
|
||||
T[65]=function(ox,oy) rect(img,ox,oy,16,16,P.waterDeep); speck(img,ox,oy,16,16,P.water3,5,0); hline(img,ox+3,oy+6,8,P.water2) end
|
||||
T[66]=function(ox,oy) rect(img,ox,oy,16,16,P.path1); speck(img,ox,oy,16,16,P.path2,6,1); rect(img,ox,oy,6,6,P.grass1); speck(img,ox,oy,6,6,P.grass2,4,0) end
|
||||
T[67]=function(ox,oy) rect(img,ox,oy,16,16,P.roof1); rect(img,ox,oy+11,16,5,P.roof2); hline(img,ox,oy+11,16,P.wall1); speck(img,ox,oy,16,11,P.roof3,8,4) end
|
||||
T[68]=function(ox,oy) rect(img,ox,oy,16,16,P.wall1); speck(img,ox,oy,16,16,P.wall2,7,2); rect(img,ox+3,oy+3,10,9,P.glass); rect(img,ox+3,oy+3,10,4,P.sky); vline(img,ox+8,oy+3,9,P.wallD); hline(img,ox+3,oy+7,10,P.wallD); rect(img,ox+2,oy+2,12,1,P.wallD) end
|
||||
T[69]=function(ox,oy) rect(img,ox,oy,16,16,P.sky); rect(img,ox+7,oy+4,3,3,P.yellow2); px(img,ox+8,oy+3,P.yellow3); px(img,ox+8,oy+8,P.yellow3); px(img,ox+4,oy+6,P.yellow3); px(img,ox+12,oy+6,P.yellow3) end
|
||||
T[70]=function(ox,oy) grassBase(ox,oy); vline(img,ox+7,oy+8,5,P.canopy2); rect(img,ox+6,oy+5,4,4,P.clothW); px(img,ox+7,oy+6,P.yellow2) end
|
||||
T[71]=function(ox,oy) rect(img,ox,oy,16,16,P.path2); for j=0,3 do for i=0,3 do local c=((i+j)%2==0) and P.path1 or P.path3; rect(img,ox+i*4,oy+j*4,4,4,c) end end end
|
||||
for idx=0,71 do T[idx]((idx%8)*16,(idx//8)*16) end
|
||||
save(s,"tileset.png"); s:close(); print("tileset done")
|
||||
end
|
||||
|
||||
-- ============ PLAYER walk sheet 64x96 (4 dir x 4 frame) ============
|
||||
do
|
||||
local skin=P.skin; local skinD=P.skinD; local hair=P.hair
|
||||
local shirt={92,152,212}; local shirtD={64,116,176}
|
||||
local pants={78,96,128}; local pantsD={56,72,102}; local shoe={70,58,58}
|
||||
local s, img = newImg(64,96)
|
||||
local function person(ox,oy,dir,frame)
|
||||
local sw=0; if frame==1 then sw=1 elseif frame==3 then sw=-1 end
|
||||
rect(img,ox+5,oy+10,6,7,shirt); hline(img,ox+5,oy+10,6,shirtD); vline(img,ox+5,oy+10,7,shirtD)
|
||||
vline(img,ox+4,oy+11,4,skin); vline(img,ox+11,oy+11,4,skin)
|
||||
rect(img,ox+5,oy+3,6,6,skin); hline(img,ox+5,oy+8,6,skinD)
|
||||
rect(img,ox+4,oy+1,8,3,hair); px(img,ox+4,oy+4,hair); px(img,ox+11,oy+4,hair)
|
||||
local lx,rx=ox+6,ox+9
|
||||
if dir==0 then
|
||||
px(img,ox+6,oy+5,P.black); px(img,ox+9,oy+5,P.black); px(img,ox+7,oy+7,skinD)
|
||||
rect(img,lx,oy+17,2,4,pants); rect(img,rx,oy+17,2,4,pants)
|
||||
rect(img,lx,oy+21+(sw>0 and 1 or 0),2,1,shoe); rect(img,rx,oy+21+(sw<0 and 1 or 0),2,1,shoe)
|
||||
elseif dir==3 then
|
||||
rect(img,ox+4,oy+1,8,5,hair)
|
||||
rect(img,lx,oy+17,2,4,pants); rect(img,rx,oy+17,2,4,pants)
|
||||
rect(img,lx,oy+21+(sw>0 and 1 or 0),2,1,shoe); rect(img,rx,oy+21+(sw<0 and 1 or 0),2,1,shoe)
|
||||
else
|
||||
px(img,ox+9,oy+5,P.black); px(img,ox+11,oy+6,skinD); rect(img,ox+4,oy+1,7,3,hair)
|
||||
rect(img,ox+6+sw,oy+17,2,4,pants); rect(img,ox+8-sw,oy+17,2,4,pantsD)
|
||||
rect(img,ox+6+sw,oy+21,2,1,shoe); rect(img,ox+8-sw,oy+21,2,1,shoe)
|
||||
end
|
||||
end
|
||||
for f=0,3 do person(f*16,0,0,f); person(f*16,72,3,f); person(f*16,48,2,f) end
|
||||
for f=0,3 do for yy=0,23 do for xx=0,15 do
|
||||
img:drawPixel(f*16+(15-xx), 24+yy, img:getPixel(f*16+xx, 48+yy))
|
||||
end end end
|
||||
save(s,"player.png"); s:close(); print("player done")
|
||||
end
|
||||
|
||||
-- ============ PLAYER PORTRAITS 64x32 (smile / real face) ============
|
||||
do
|
||||
local s, img = newImg(64,32)
|
||||
local function drawPortrait(ox,tired)
|
||||
local sk = tired and {216,199,185} or P.skin
|
||||
local skd = tired and {186,170,158} or P.skinD
|
||||
local hr = tired and {104,98,92} or P.hair
|
||||
rect(img,ox+8,4,16,20,sk)
|
||||
rect(img,ox+7,3,18,7,hr); px(img,ox+7,10,hr); px(img,ox+24,10,hr)
|
||||
if tired then
|
||||
rect(img,ox+11,13,2,2,P.black); rect(img,ox+19,13,2,2,P.black)
|
||||
hline(img,ox+10,16,4,skd); hline(img,ox+18,16,4,skd)
|
||||
hline(img,ox+13,20,6,skd); px(img,ox+12,21,skd); px(img,ox+19,21,skd)
|
||||
else
|
||||
rect(img,ox+11,12,2,3,P.black); rect(img,ox+19,12,2,3,P.black); px(img,ox+12,12,P.glass)
|
||||
px(img,ox+12,19,skd); hline(img,ox+13,20,6,skd); px(img,ox+19,19,skd)
|
||||
px(img,ox+14,13,{255,150,160}); px(img,ox+18,13,{255,150,160})
|
||||
end
|
||||
rect(img,ox+15,16,2,2,skd)
|
||||
end
|
||||
drawPortrait(0,false); drawPortrait(32,true)
|
||||
save(s,"portraits.png"); s:close(); print("portraits done")
|
||||
end
|
||||
|
||||
-- ============ NPCS 48x24 (smile/flat/off) ============
|
||||
local function drawAnimal(img, ox, expr, spec)
|
||||
local body=spec.body; local bodyD=spec.bodyD; local muzzle=spec.muzzle or {250,244,232}
|
||||
-- torso
|
||||
rect(img,ox+3,9,10,12,body); rect(img,ox+3,9,10,2,bodyD)
|
||||
rect(img,ox+5,13,6,7,muzzle) -- belly
|
||||
-- feet
|
||||
rect(img,ox+4,21,3,2,bodyD); rect(img,ox+9,21,3,2,bodyD)
|
||||
-- head
|
||||
rect(img,ox+4,2,8,8,body)
|
||||
rect(img,ox+5,5,6,5,muzzle) -- face patch
|
||||
-- ears
|
||||
if spec.ears=="floppy" then
|
||||
rect(img,ox+2,3,2,5,bodyD); rect(img,ox+12,3,2,5,bodyD)
|
||||
elseif spec.ears=="long" then
|
||||
rect(img,ox+4,-0+0,2,4,body); rect(img,ox+10,0,2,4,body); px(img,ox+4,1,P.pink1); px(img,ox+10,1,P.pink1)
|
||||
rect(img,ox+4,0,2,3,body); rect(img,ox+10,0,2,3,body)
|
||||
elseif spec.ears=="round" then
|
||||
rect(img,ox+3,1,3,3,body); rect(img,ox+10,1,3,3,body); px(img,ox+4,2,bodyD); px(img,ox+11,2,bodyD)
|
||||
elseif spec.ears=="pointy" then
|
||||
px(img,ox+4,1,body); rect(img,ox+3,2,3,2,body); px(img,ox+11,1,body); rect(img,ox+10,2,3,2,body); px(img,ox+4,2,P.pink1); px(img,ox+11,2,P.pink1)
|
||||
elseif spec.ears=="antler" then
|
||||
px(img,ox+4,0,P.wood2); px(img,ox+4,1,P.wood2); px(img,ox+3,0,P.wood2); px(img,ox+11,0,P.wood2); px(img,ox+11,1,P.wood2); px(img,ox+12,0,P.wood2)
|
||||
end
|
||||
-- eyes (base y=6). off lowers RIGHT eye by 1px.
|
||||
local ey=6
|
||||
px(img,ox+6,ey,P.black)
|
||||
px(img,ox+9, expr=="off" and ey+1 or ey, P.black)
|
||||
-- nose
|
||||
px(img,ox+7,8,bodyD); px(img,ox+8,8,bodyD)
|
||||
-- mouth: smile curve / flat line / off = smile + 1px corner
|
||||
if expr=="flat" then
|
||||
hline(img,ox+6,10,4,bodyD)
|
||||
else
|
||||
px(img,ox+5,9,bodyD); hline(img,ox+6,10,4,bodyD); px(img,ox+10,9,bodyD)
|
||||
if expr=="off" then px(img,ox+11,9,bodyD) end -- 1px extra corner
|
||||
end
|
||||
-- extras
|
||||
if spec.whiskers then hline(img,ox+1,7,3,P.gray); hline(img,ox+12,7,3,P.gray) end
|
||||
if spec.glasses then rect(img,ox+5,5,3,3,P.metal); rect(img,ox+8,5,3,3,P.metal); px(img,ox+6,6,P.glass); px(img,ox+9, expr=="off" and 7 or 6,P.glass) end
|
||||
if spec.shell then rect(img,ox+3,10,10,9,{86,140,80}); rect(img,ox+5,12,6,5,{110,168,100}); px(img,ox+7,14,{70,116,66}); px(img,ox+8,15,{70,116,66}); rect(img,ox+5,13,6,7,muzzle,{}); rect(img,ox+3,10,10,9,{86,140,80}); px(img,ox+6,13,{70,116,66}); px(img,ox+9,16,{70,116,66}) end
|
||||
if spec.coat then rect(img,ox+3,11,10,10,P.clothW); rect(img,ox+3,11,10,2,{230,230,236}); rect(img,ox+7,13,2,7,P.red1); rect(img,ox+6,15,4,2,P.red1); rect(img,ox+4,20,3,1,bodyD); rect(img,ox+9,20,3,1,bodyD) end
|
||||
if spec.head then rect(img,ox+4,0,8,3,spec.head) end
|
||||
end
|
||||
|
||||
do
|
||||
local specs = {
|
||||
afu ={body={168,120,72}, bodyD={128,90,52}, ears="floppy"}, -- 狗 村长
|
||||
yuan ={body={244,236,222}, bodyD={206,196,180}, ears="long"}, -- 兔 面包师
|
||||
dabao ={body={128,90,60}, bodyD={98,68,44}, ears="round"}, -- 熊 邮差
|
||||
mimi ={body={236,152,80}, bodyD={200,120,56}, ears="pointy", whiskers=true}, -- 猫 杂货
|
||||
fu ={body={216,176,124}, bodyD={176,138,92}, ears="antler", coat=true}, -- 鹿 医生
|
||||
gui ={body={120,180,110}, bodyD={90,140,84}, ears=nil, shell=true, glasses=true}, -- 龟 老者
|
||||
afu2 =nil,
|
||||
}
|
||||
local order = {"afu","yuan","dabao","mimi","fu","gui"}
|
||||
for _,name in ipairs(order) do
|
||||
local s, img = newImg(48,24)
|
||||
local exprs = {"smile","flat","off"}
|
||||
for i,e in ipairs(exprs) do drawAnimal(img,(i-1)*16,e,specs[name]) end
|
||||
save(s,"npc_"..name..".png"); s:close()
|
||||
end
|
||||
print("npcs done")
|
||||
end
|
||||
|
||||
-- ============ TWIN BIRDS 32x24 (beak closed / open) ============
|
||||
do
|
||||
local s, img = newImg(32,24)
|
||||
local function drawBird(ox,open)
|
||||
local body={110,170,220}; local bodyD={78,132,186}
|
||||
rect(img,ox+4,6,8,10,body); rect(img,ox+4,6,8,2,{150,200,240})
|
||||
rect(img,ox+3,9,3,5,bodyD) -- wing
|
||||
rect(img,ox+5,3,6,5,body) -- head
|
||||
px(img,ox+7,5,P.black); px(img,ox+8,5,P.black) -- eyes
|
||||
-- beak
|
||||
if open then
|
||||
px(img,ox+11,6,P.orange2); px(img,ox+12,6,P.orange2); px(img,ox+11,8,P.orange2); px(img,ox+12,8,P.orange2); px(img,ox+13,7,P.orange1)
|
||||
else
|
||||
px(img,ox+11,7,P.orange2); px(img,ox+12,7,P.orange2); px(img,ox+13,7,P.orange1)
|
||||
end
|
||||
-- feet
|
||||
px(img,ox+6,16,P.orange2); px(img,ox+9,16,P.orange2)
|
||||
-- little tuft
|
||||
px(img,ox+7,2,bodyD); px(img,ox+8,2,body)
|
||||
end
|
||||
drawBird(0,false); drawBird(16,true)
|
||||
save(s,"birds.png"); s:close(); print("birds done")
|
||||
end
|
||||
|
||||
-- ============ EXTRAS (群演) 32x80 = 5 critters x 2 frames, 16x16 ============
|
||||
do
|
||||
local s, img = newImg(32,80)
|
||||
local function critter(ox,oy,f,spec)
|
||||
local bob = (f==1) and 1 or 0
|
||||
local b=spec.body; local bd=spec.bodyD
|
||||
rect(img,ox+4,oy+7+bob,8,6,b); rect(img,ox+4,oy+7+bob,8,2,bd) -- body
|
||||
rect(img,ox+5,oy+3+bob,6,5,b) -- head
|
||||
px(img,ox+6,oy+5+bob,P.black); px(img,ox+9,oy+5+bob,P.black)
|
||||
if spec.tail=="bushy" then rect(img,ox+11,oy+4+bob,3,7,b); rect(img,ox+12,oy+3+bob,2,3,bd) end
|
||||
if spec.tail=="thin" then vline(img,ox+12,oy+9+bob,3,bd) end
|
||||
if spec.spikes then for i=0,4 do px(img,ox+4+i*2,oy+6+bob,bd); px(img,ox+5+i*2,oy+8+bob,bd) end end
|
||||
if spec.ears=="mouse" then px(img,ox+5,oy+2+bob,b); px(img,ox+10,oy+2+bob,b); rect(img,ox+4,oy+2+bob,2,2,b); rect(img,ox+10,oy+2+bob,2,2,b) end
|
||||
if spec.ears=="pointy" then px(img,ox+5,oy+2+bob,b); px(img,ox+10,oy+2+bob,b) end
|
||||
rect(img,ox+5,oy+13+bob,2,2,bd); rect(img,ox+9,oy+13+bob,2,2,bd) -- feet
|
||||
end
|
||||
local specs = {
|
||||
{body={214,142,72}, bodyD={176,108,52}, tail="bushy", ears="pointy"}, -- squirrel
|
||||
{body={150,120,90}, bodyD={110,86,64}, spikes=true, ears="pointy"}, -- hedgehog
|
||||
{body={200,160,100}, bodyD={160,120,70}, tail="bushy", ears="pointy"}, -- squirrel2
|
||||
{body={188,190,196}, bodyD={150,152,158},tail="thin", ears="mouse"}, -- mouse
|
||||
{body={230,200,120}, bodyD={196,164,90}, tail="thin", ears="pointy"}, -- chipmunk
|
||||
}
|
||||
for k=0,4 do critter(0,k*16,0,specs[k+1]); critter(16,k*16,1,specs[k+1]) end
|
||||
save(s,"extras.png"); s:close(); print("extras done")
|
||||
end
|
||||
|
||||
-- ============ SPARROW (E3 real bird) 16x16 gray ============
|
||||
do
|
||||
local s, img = newImg(16,16)
|
||||
local g1={128,124,118}; local g2={98,94,90}; local g3={160,156,150}; local beak={90,80,60}
|
||||
rect(img,4,6,8,6,g1); rect(img,4,6,8,2,g3)
|
||||
rect(img,3,8,3,4,g2) -- wing
|
||||
rect(img,10,4,4,4,g1) -- head
|
||||
px(img,12,5,P.black); px(img,13,6,beak); px(img,14,6,beak)
|
||||
px(img,5,12,beak); px(img,8,12,beak) -- feet
|
||||
speck(img,4,6,8,6,g2,3,0)
|
||||
save(s,"sparrow.png"); s:close(); print("sparrow done")
|
||||
end
|
||||
|
||||
print("ALL ASSETS DONE")
|
||||
@@ -0,0 +1,330 @@
|
||||
// gen_maps.mjs : builds all 10 Tiled maps as .tmx (embedded tileset), for export via Tiled CLI.
|
||||
// Original layouts, no external tilesets. Run with node; then Tiled exports each .tmx -> .json.
|
||||
import { mkdirSync, writeFileSync } from 'node:fs';
|
||||
import { dirname, resolve } from 'node:path';
|
||||
import { fileURLToPath } from 'node:url';
|
||||
|
||||
const __dir = dirname(fileURLToPath(import.meta.url));
|
||||
const ROOT = resolve(__dir, '..');
|
||||
const TMX_DIR = resolve(__dir, 'tmx');
|
||||
const PNG = resolve(ROOT, 'public/assets/sprites/tileset.png');
|
||||
mkdirSync(TMX_DIR, { recursive: true });
|
||||
|
||||
// tile index (0-based); GID = idx+1
|
||||
const G = (i) => i + 1;
|
||||
const t = {
|
||||
grass: G(0), grassF: G(1), path: G(2), pathEdge: G(3), water: G(4), waterL: G(5),
|
||||
flowerBush: G(6), berry: G(7), treeTop: G(8), treeTrunk: G(9), wall: G(10), roof: G(11),
|
||||
door: G(12), fence: G(13), flowerbed: G(14), well: G(15), fog: G(16), board: G(17),
|
||||
mailbox: G(18), picnic: G(19), bench: G(20), lamp: G(21), bushS: G(22), sand: G(23),
|
||||
wfloor: G(24), wfloorB: G(25), iwall: G(26), iwallTop: G(27), bed: G(28), calendar: G(29),
|
||||
counter: G(30), oven: G(31), recipe: G(32), shelf: G(33), shelfItem: G(34), table: G(35),
|
||||
chair: G(36), clinicForm: G(37), windowI: G(38), doorI: G(39), wwall: G(40), wfloorW: G(41),
|
||||
wfloorWb: G(42), hbed: G(43), wdoor: G(44), wwindow: G(45), ribbon: G(46), stage: G(47),
|
||||
flowersRed: G(48), flowersBlue: G(49), mushroom: G(50), rock: G(51), stump: G(52),
|
||||
lilypad: G(53), reed: G(54), honey: G(55), crate: G(56), barrel: G(57), bookshelf: G(58),
|
||||
clock: G(59), painting: G(60), plantPot: G(61), rug: G(62), darkGrass: G(63), grassF2: G(64),
|
||||
waterDeep: G(65), pathCorner: G(66), roofEdge: G(67), houseWindow: G(68), star: G(69),
|
||||
snowdrop: G(70), cobble: G(71),
|
||||
};
|
||||
|
||||
function M(w, h, base) {
|
||||
return {
|
||||
w, h,
|
||||
ground: new Array(w * h).fill(base),
|
||||
obs: new Array(w * h).fill(0),
|
||||
objects: [],
|
||||
_oid: 1,
|
||||
};
|
||||
}
|
||||
const idx = (m, c, r) => r * m.w + c;
|
||||
function setG(m, c, r, g) { if (c >= 0 && c < m.w && r >= 0 && r < m.h) m.ground[idx(m, c, r)] = g; }
|
||||
function setO(m, c, r, g) { if (c >= 0 && c < m.w && r >= 0 && r < m.h) m.obs[idx(m, c, r)] = g; }
|
||||
function rectG(m, c, r, w, h, g) { for (let j = 0; j < h; j++) for (let i = 0; i < w; i++) setG(m, c + i, r + j, g); }
|
||||
function rectO(m, c, r, w, h, g) { for (let j = 0; j < h; j++) for (let i = 0; i < w; i++) setO(m, c + i, r + j, g); }
|
||||
function borderO(m, g) {
|
||||
for (let c = 0; c < m.w; c++) { setO(m, c, 0, g); setO(m, c, m.h - 1, g); }
|
||||
for (let r = 0; r < m.h; r++) { setO(m, 0, r, g); setO(m, m.w - 1, r, g); }
|
||||
}
|
||||
function obj(m, name, type, c, r, props = {}, wTiles = 1, hTiles = 1) {
|
||||
m.objects.push({ id: m._oid++, name, type, x: c * 16, y: r * 16, w: wTiles * 16, h: hTiles * 16, props });
|
||||
}
|
||||
|
||||
// ---- interior room helper (wood floor + walls) ----
|
||||
function room(m) {
|
||||
rectG(m, 0, 0, m.w, m.h, t.wfloor);
|
||||
for (let c = 0; c < m.w; c++) { setO(m, c, 0, t.iwallTop); setO(m, c, m.h - 1, t.iwall); }
|
||||
for (let r = 0; r < m.h; r++) { setO(m, 0, r, t.iwall); setO(m, m.w - 1, r, t.iwall); }
|
||||
}
|
||||
function exitDoor(m, c, r, target, dest) { setG(m, c, r, t.doorI); setO(m, c, r, 0); obj(m, 'door_' + target, 'door', c, r, { target, dest }); }
|
||||
|
||||
const maps = {};
|
||||
|
||||
// ============ 1. HOME 12x8 ============
|
||||
{
|
||||
const m = M(12, 8, t.wfloor); room(m);
|
||||
setG(m, 5, 1, t.rug); setG(m, 6, 1, t.rug);
|
||||
setO(m, 1, 1, t.bed); setO(m, 1, 2, t.bed); // bed (2 tiles)
|
||||
setG(m, 2, 0, t.calendar); // 床头日历 on top wall
|
||||
setO(m, 9, 1, t.bookshelf); setO(m, 8, 1, t.plantPot);
|
||||
setO(m, 8, 5, t.table); setO(m, 9, 5, t.chair);
|
||||
setG(m, 4, 0, t.windowI); setG(m, 7, 0, t.windowI);
|
||||
exitDoor(m, 6, 7, 'plaza', 'sp_from_home');
|
||||
obj(m, 'start', 'spawn', 3, 3);
|
||||
obj(m, 'sp_from_plaza', 'spawn', 6, 6);
|
||||
obj(m, 'i_bed', 'interact', 2, 2, { kind: 'bed' });
|
||||
obj(m, 'i_calendar', 'interact', 2, 1, { kind: 'calendar' });
|
||||
maps.home = m;
|
||||
}
|
||||
|
||||
// ============ 2. PLAZA 30x20 ============
|
||||
{
|
||||
const m = M(30, 20, t.grass);
|
||||
// scatter grass flowers
|
||||
for (let r = 0; r < 20; r++) for (let c = 0; c < 30; c++) if (((c * 5 + r * 7) % 11) === 0) setG(m, c, r, t.grassF);
|
||||
borderO(m, t.fence);
|
||||
// trees along corners
|
||||
for (const [c, r] of [[1, 1], [2, 1], [27, 1], [28, 1], [1, 18], [28, 18]]) { setO(m, c, r, t.treeTrunk); setG(m, c, r - 1 < 0 ? 0 : c, r); }
|
||||
// ---- houses along top (home/bakery/grocery/clinic) ----
|
||||
function house(c, target, dest) {
|
||||
rectO(m, c, 1, 3, 2, t.roof);
|
||||
rectO(m, c, 3, 3, 1, t.wall);
|
||||
setO(m, c, 2, t.wall); setO(m, c + 2, 2, t.wall);
|
||||
setG(m, c + 1, 3, t.door); setO(m, c + 1, 3, 0);
|
||||
obj(m, 'door_' + target, 'door', c + 1, 3, { target, dest });
|
||||
// path down from door
|
||||
setG(m, c + 1, 4, t.path); setG(m, c + 1, 5, t.path);
|
||||
obj(m, 'sp_from_' + target, 'spawn', c + 1, 5);
|
||||
}
|
||||
house(2, 'home', 'sp_from_plaza');
|
||||
house(8, 'bakery', 'sp_from_plaza');
|
||||
house(15, 'grocery', 'sp_from_plaza');
|
||||
house(22, 'clinic', 'sp_from_plaza');
|
||||
// central cobble plaza + main path
|
||||
rectG(m, 3, 9, 24, 3, t.path);
|
||||
rectG(m, 11, 13, 8, 4, t.cobble);
|
||||
// festival stage (center) — walkable cobble around; stage tile as decor obstacle at back
|
||||
rectO(m, 12, 12, 4, 1, t.stage);
|
||||
// bulletin board (afu)
|
||||
setO(m, 14, 8, t.board);
|
||||
// flowerbed (T2 water) cluster left-center
|
||||
setO(m, 5, 13, t.flowerbed); setO(m, 6, 13, t.flowerbed); setO(m, 7, 13, t.flowerbed);
|
||||
// twin-bird tree (right)
|
||||
setO(m, 24, 5, t.treeTrunk); setG(m, 23, 4, t.treeTop); setG(m, 24, 4, t.treeTop); setG(m, 25, 4, t.treeTop); setG(m, 24, 3, t.treeTop);
|
||||
// mailbox (dabao) bottom-center
|
||||
setO(m, 15, 17, t.mailbox);
|
||||
obj(m, 'i_mailbox', 'interact', 15, 16, { kind: 'mailbox' }); // C3 散落信件
|
||||
// decorative
|
||||
setO(m, 3, 16, t.bushS); setO(m, 26, 16, t.bushS); setO(m, 9, 8, t.lamp); setO(m, 20, 8, t.lamp);
|
||||
// edge exits (leave gaps in fence)
|
||||
setO(m, 0, 10, 0); exitDoor(m, 0, 10, 'field', 'sp_from_plaza'); setG(m, 1, 10, t.path); obj(m, 'sp_from_field', 'spawn', 2, 10);
|
||||
setO(m, 29, 10, 0); exitDoor(m, 29, 10, 'lake', 'sp_from_plaza'); setG(m, 28, 10, t.path); obj(m, 'sp_from_lake', 'spawn', 27, 10);
|
||||
setO(m, 4, 19, 0); exitDoor(m, 4, 19, 'well', 'sp_from_plaza'); setG(m, 4, 18, t.path); obj(m, 'sp_from_well', 'spawn', 4, 17);
|
||||
setO(m, 25, 19, 0); exitDoor(m, 25, 19, 'fog', 'sp_from_plaza'); setG(m, 25, 18, t.path); obj(m, 'sp_from_fog', 'spawn', 25, 17);
|
||||
// NPCs
|
||||
obj(m, 'afu', 'npc', 14, 9, { npc: 'afu' });
|
||||
obj(m, 'dabao', 'npc', 15, 18, { npc: 'dabao' });
|
||||
obj(m, 'bird1', 'npc', 23, 5, { npc: 'bird1' });
|
||||
obj(m, 'bird2', 'npc', 25, 5, { npc: 'bird2' });
|
||||
obj(m, 'extra1', 'npc', 10, 15, { npc: 'extra1' });
|
||||
obj(m, 'extra2', 'npc', 19, 16, { npc: 'extra2' });
|
||||
obj(m, 'extra3', 'npc', 6, 6, { npc: 'extra3' });
|
||||
// interacts
|
||||
obj(m, 'i_board', 'interact', 14, 9, { kind: 'board' });
|
||||
obj(m, 'i_flowerbed', 'interact', 6, 14, { kind: 'flowerbed' });
|
||||
obj(m, 'i_festival', 'interact', 14, 14, { kind: 'festival' });
|
||||
obj(m, 'i_ribbon0', 'interact', 12, 13, { kind: 'ribbon', n: 0 });
|
||||
obj(m, 'i_ribbon1', 'interact', 14, 13, { kind: 'ribbon', n: 1 });
|
||||
obj(m, 'i_ribbon2', 'interact', 16, 13, { kind: 'ribbon', n: 2 });
|
||||
obj(m, 'i_ribbon3', 'interact', 18, 13, { kind: 'ribbon', n: 3 });
|
||||
maps.plaza = m;
|
||||
}
|
||||
|
||||
// ============ 3. BAKERY 15x10 ============
|
||||
{
|
||||
const m = M(15, 10, t.wfloor); room(m);
|
||||
rectG(m, 1, 1, 13, 8, t.wfloorB);
|
||||
rectO(m, 2, 1, 5, 1, t.oven);
|
||||
rectO(m, 1, 6, 8, 1, t.counter);
|
||||
setG(m, 4, 5, t.recipe); // 配方纸 (C2 on back)
|
||||
setO(m, 11, 1, t.shelf); setO(m, 12, 1, t.shelf);
|
||||
setO(m, 12, 7, t.barrel); setO(m, 13, 4, t.plantPot);
|
||||
setG(m, 8, 0, t.windowI);
|
||||
exitDoor(m, 7, 9, 'plaza', 'sp_from_bakery');
|
||||
obj(m, 'sp_from_plaza', 'spawn', 7, 8);
|
||||
obj(m, 'yuan', 'npc', 4, 7, { npc: 'yuan' });
|
||||
obj(m, 'i_recipe', 'interact', 4, 6, { kind: 'recipe' });
|
||||
maps.bakery = m;
|
||||
}
|
||||
|
||||
// ============ 4. GROCERY 15x10 ============
|
||||
{
|
||||
const m = M(15, 10, t.wfloor); room(m);
|
||||
rectG(m, 1, 1, 13, 8, t.wfloorB);
|
||||
// shelves: same item repeated 9 (C5)
|
||||
for (let c = 2; c <= 10; c++) setO(m, c, 1, t.shelfItem); // 9 identical
|
||||
rectO(m, 1, 6, 8, 1, t.counter);
|
||||
setO(m, 12, 3, t.crate); setO(m, 13, 6, t.barrel); setO(m, 12, 7, t.crate);
|
||||
setG(m, 11, 0, t.windowI);
|
||||
exitDoor(m, 7, 9, 'plaza', 'sp_from_grocery');
|
||||
obj(m, 'sp_from_plaza', 'spawn', 7, 8);
|
||||
obj(m, 'mimi', 'npc', 4, 7, { npc: 'mimi' });
|
||||
obj(m, 'i_shelf', 'interact', 6, 2, { kind: 'shelf' });
|
||||
maps.grocery = m;
|
||||
}
|
||||
|
||||
// ============ 5. CLINIC 12x8 ============
|
||||
{
|
||||
const m = M(12, 8, t.wfloor); room(m);
|
||||
rectG(m, 1, 1, 10, 6, t.wfloorB);
|
||||
setO(m, 2, 2, t.table); setG(m, 2, 1, t.clinicForm); // 表格 (C8)
|
||||
setO(m, 9, 1, t.bookshelf); setO(m, 9, 5, t.plantPot);
|
||||
setO(m, 5, 5, t.chair);
|
||||
setG(m, 6, 0, t.windowI);
|
||||
exitDoor(m, 6, 7, 'plaza', 'sp_from_clinic');
|
||||
obj(m, 'sp_from_plaza', 'spawn', 6, 6);
|
||||
obj(m, 'fu', 'npc', 4, 3, { npc: 'fu' });
|
||||
obj(m, 'i_clinicform', 'interact', 2, 2, { kind: 'clinicform' });
|
||||
maps.clinic = m;
|
||||
}
|
||||
|
||||
// ============ 6. LAKE 24x16 ============
|
||||
{
|
||||
const m = M(24, 16, t.grass);
|
||||
for (let r = 0; r < 16; r++) for (let c = 0; c < 24; c++) if (((c * 3 + r * 5) % 13) === 0) setG(m, c, r, t.grassF);
|
||||
// lake fills bottom rows 9-15
|
||||
for (let r = 9; r < 16; r++) for (let c = 1; c < 23; c++) {
|
||||
const deep = r >= 12;
|
||||
setG(m, c, r, deep ? t.waterDeep : (((c + r) % 2) ? t.water : t.waterL));
|
||||
setO(m, c, r, deep ? t.waterDeep : t.water);
|
||||
}
|
||||
// lilypads / reeds on shore
|
||||
setO(m, 3, 9, t.reed); setO(m, 20, 9, t.reed); setO(m, 12, 10, t.lilypad);
|
||||
borderO(m, t.fence);
|
||||
// top exit to plaza
|
||||
setO(m, 12, 0, 0); exitDoor(m, 12, 0, 'plaza', 'sp_from_lake'); setG(m, 12, 1, t.path); obj(m, 'sp_from_plaza', 'spawn', 12, 2);
|
||||
// bench (gui) at shore
|
||||
setO(m, 5, 8, t.bench);
|
||||
// picnic cloth (T7)
|
||||
setG(m, 16, 6, t.picnic);
|
||||
// trees
|
||||
setO(m, 2, 2, t.treeTrunk); setG(m, 2, 1, t.treeTop); setO(m, 21, 3, t.treeTrunk); setG(m, 21, 2, t.treeTop);
|
||||
setO(m, 8, 3, t.rock); setO(m, 18, 2, t.bushS);
|
||||
obj(m, 'gui', 'npc', 5, 7, { npc: 'gui' });
|
||||
obj(m, 'extra4', 'npc', 15, 3, { npc: 'extra4' });
|
||||
obj(m, 'i_picnic', 'interact', 16, 6, { kind: 'picnic' });
|
||||
maps.lake = m;
|
||||
}
|
||||
|
||||
// ============ 7. FIELD 20x14 ============
|
||||
{
|
||||
const m = M(20, 14, t.grass);
|
||||
for (let r = 0; r < 14; r++) for (let c = 0; c < 20; c++) {
|
||||
const k = (c * 7 + r * 3) % 9;
|
||||
if (k === 0) setG(m, c, r, t.grassF); else if (k === 3) setG(m, c, r, t.grassF2);
|
||||
}
|
||||
borderO(m, t.fence);
|
||||
// berry bushes (T6, pick x5) — 5 spread
|
||||
const berries = [[4, 3], [8, 4], [13, 3], [6, 8], [14, 9]];
|
||||
berries.forEach(([c, r], i) => { setO(m, c, r, t.berry); obj(m, 'i_berry' + i, 'interact', c, r, { kind: 'berry', n: i }); });
|
||||
// flowerbed (浇花点)
|
||||
setO(m, 10, 6, t.flowerbed); setO(m, 11, 6, t.flowerbed);
|
||||
obj(m, 'i_fieldbed', 'interact', 10, 7, { kind: 'flowerbed' });
|
||||
setO(m, 2, 2, t.treeTrunk); setG(m, 2, 1, t.treeTop); setO(m, 17, 11, t.stump); setO(m, 16, 4, t.mushroom);
|
||||
// top exit to plaza
|
||||
setO(m, 10, 0, 0); exitDoor(m, 10, 0, 'plaza', 'sp_from_field'); setG(m, 10, 1, t.path); obj(m, 'sp_from_plaza', 'spawn', 10, 2);
|
||||
obj(m, 'extra5', 'npc', 15, 7, { npc: 'extra5' });
|
||||
maps.field = m;
|
||||
}
|
||||
|
||||
// ============ 8. WELL 14x10 ============
|
||||
{
|
||||
const m = M(14, 10, t.grass);
|
||||
for (let r = 0; r < 10; r++) for (let c = 0; c < 14; c++) if (((c + r) % 5) === 0) setG(m, c, r, t.grassF);
|
||||
rectG(m, 5, 3, 4, 4, t.sand);
|
||||
borderO(m, t.fence);
|
||||
setO(m, 6, 4, t.well); setO(m, 7, 4, t.well);
|
||||
setO(m, 2, 2, t.rock); setO(m, 11, 7, t.bushS); setO(m, 3, 7, t.stump);
|
||||
// top exit to plaza
|
||||
setO(m, 7, 0, 0); exitDoor(m, 7, 0, 'plaza', 'sp_from_well'); setG(m, 7, 1, t.path); obj(m, 'sp_from_plaza', 'spawn', 7, 2);
|
||||
obj(m, 'i_well', 'interact', 7, 5, { kind: 'well' });
|
||||
maps.well = m;
|
||||
}
|
||||
|
||||
// ============ 9. FOG 20x8 ============
|
||||
{
|
||||
const m = M(20, 8, t.grass);
|
||||
for (let r = 0; r < 8; r++) for (let c = 0; c < 20; c++) if (((c * 2 + r) % 7) === 0) setG(m, c, r, t.grassF);
|
||||
// fog wall fills top rows 0-2 (collides)
|
||||
for (let r = 0; r < 3; r++) for (let c = 0; c < 20; c++) { setG(m, c, r, t.fog); setO(m, c, r, t.fog); }
|
||||
for (let r = 3; r < 8; r++) { setO(m, 0, r, t.fence); setO(m, 19, r, t.fence); }
|
||||
for (let c = 0; c < 20; c++) setO(m, c, 7, t.fence);
|
||||
setO(m, 3, 5, t.bushS); setO(m, 16, 5, t.bushS);
|
||||
// bottom exit to plaza
|
||||
setO(m, 10, 7, 0); exitDoor(m, 10, 7, 'plaza', 'sp_from_fog'); setG(m, 10, 6, t.path); obj(m, 'sp_from_plaza', 'spawn', 10, 5);
|
||||
obj(m, 'i_fog', 'interact', 10, 3, { kind: 'fog' });
|
||||
maps.fog = m;
|
||||
}
|
||||
|
||||
// ============ 10. WHITE (corridor 20x6 stacked over ward) 20x14 ============
|
||||
{
|
||||
const m = M(20, 14, t.wfloorW);
|
||||
rectG(m, 0, 0, 20, 14, t.wfloorW);
|
||||
rectG(m, 0, 0, 20, 6, t.wfloorWb); // corridor top band
|
||||
borderO(m, t.wwall);
|
||||
// ward divider wall (row 6) with a doorway
|
||||
for (let c = 0; c < 20; c++) setO(m, c, 6, t.wwall);
|
||||
setO(m, 10, 6, 0); setG(m, 10, 6, t.wdoor);
|
||||
// corridor windows
|
||||
setG(m, 4, 0, t.wwindow); setG(m, 15, 0, t.wwindow);
|
||||
// ward: hospital beds
|
||||
setO(m, 3, 9, t.hbed); setO(m, 3, 11, t.hbed); setO(m, 16, 9, t.hbed);
|
||||
obj(m, 'sp_corridor', 'spawn', 10, 2);
|
||||
obj(m, 'sp_ward', 'spawn', 10, 11);
|
||||
maps.white = m;
|
||||
}
|
||||
|
||||
// ================= TMX serialization =================
|
||||
function tmx(m) {
|
||||
const csv = (arr) => {
|
||||
let out = '';
|
||||
for (let r = 0; r < m.h; r++) {
|
||||
out += arr.slice(r * m.w, r * m.w + m.w).join(',');
|
||||
if (r < m.h - 1) out += ',';
|
||||
out += '\n';
|
||||
}
|
||||
return out;
|
||||
};
|
||||
const objXml = m.objects.map((o) => {
|
||||
const props = Object.entries(o.props);
|
||||
const p = props.length
|
||||
? `\n <properties>\n${props.map(([k, v]) => ` <property name="${k}" value="${v}"/>`).join('\n')}\n </properties>\n `
|
||||
: '';
|
||||
return ` <object id="${o.id}" name="${o.name}" type="${o.type}" x="${o.x}" y="${o.y}" width="${o.w}" height="${o.h}">${p}</object>`;
|
||||
}).join('\n');
|
||||
const nextId = Math.max(1, ...m.objects.map((o) => o.id)) + 1;
|
||||
return `<?xml version="1.0" encoding="UTF-8"?>
|
||||
<map version="1.10" tiledversion="1.12.2" orientation="orthogonal" renderorder="right-down" width="${m.w}" height="${m.h}" tilewidth="16" tileheight="16" infinite="0" nextlayerid="5" nextobjectid="${nextId}">
|
||||
<tileset firstgid="1" name="tiles" tilewidth="16" tileheight="16" tilecount="72" columns="8">
|
||||
<image source="${PNG}" width="128" height="144"/>
|
||||
</tileset>
|
||||
<layer id="1" name="ground" width="${m.w}" height="${m.h}">
|
||||
<data encoding="csv">
|
||||
${csv(m.ground)}</data>
|
||||
</layer>
|
||||
<layer id="2" name="obstacles" width="${m.w}" height="${m.h}">
|
||||
<data encoding="csv">
|
||||
${csv(m.obs)}</data>
|
||||
</layer>
|
||||
<objectgroup id="3" name="objects">
|
||||
${objXml}
|
||||
</objectgroup>
|
||||
</map>
|
||||
`;
|
||||
}
|
||||
|
||||
for (const [name, m] of Object.entries(maps)) {
|
||||
writeFileSync(resolve(TMX_DIR, name + '.tmx'), tmx(m));
|
||||
console.log('wrote', name + '.tmx', m.w + 'x' + m.h, m.objects.length + ' objects');
|
||||
}
|
||||
console.log('MAPS TMX DONE');
|
||||
@@ -0,0 +1,35 @@
|
||||
-- montage.lua : upscale generated assets into preview PNGs for visual QA
|
||||
local dir = app.params["outdir"]
|
||||
local function open(name) return app.open(dir.."/"..name) end
|
||||
local function blit(dst, src, dx, dy, sc)
|
||||
for y=0,src.height-1 do for x=0,src.width-1 do
|
||||
local p = src:getPixel(x,y)
|
||||
for j=0,sc-1 do for i=0,sc-1 do dst:drawPixel(dx+x*sc+i, dy+y*sc+j, p) end end
|
||||
end end
|
||||
end
|
||||
-- tiles preview
|
||||
do
|
||||
local ts = open("tileset.png"); local si = ts.cels[1].image
|
||||
local out = Sprite(128*5, 144*5, ColorMode.RGB)
|
||||
local oi = out.cels[1].image
|
||||
for y=0,oi.height-1 do for x=0,oi.width-1 do oi:drawPixel(x,y, app.pixelColor.rgba(30,30,36,255)) end end
|
||||
blit(oi, si, 0, 0, 5)
|
||||
out:saveAs(dir.."/_preview_tiles.png"); out:close(); ts:close()
|
||||
end
|
||||
-- chars preview
|
||||
do
|
||||
local out = Sprite(760, 420, ColorMode.RGB)
|
||||
local oi = out.cels[1].image
|
||||
for y=0,oi.height-1 do for x=0,oi.width-1 do oi:drawPixel(x,y, app.pixelColor.rgba(40,44,52,255)) end end
|
||||
local pl = open("player.png"); blit(oi, pl.cels[1].image, 0, 0, 4); pl:close()
|
||||
local po = open("portraits.png"); blit(oi, po.cels[1].image, 280, 0, 4); po:close()
|
||||
local bi = open("birds.png"); blit(oi, bi.cels[1].image, 560, 0, 5); bi:close()
|
||||
local sp = open("sparrow.png"); blit(oi, sp.cels[1].image, 680, 0, 5); sp:close()
|
||||
local ex = open("extras.png"); blit(oi, ex.cels[1].image, 560, 140, 4); ex:close()
|
||||
local names = {"afu","yuan","dabao","mimi","fu","gui"}
|
||||
for i,n in ipairs(names) do
|
||||
local np = open("npc_"..n..".png"); blit(oi, np.cels[1].image, (i-1)*84, 200, 5); np:close()
|
||||
end
|
||||
out:saveAs(dir.."/_preview_chars.png"); out:close()
|
||||
end
|
||||
print("montage done")
|
||||
@@ -0,0 +1,53 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<map version="1.10" tiledversion="1.12.2" orientation="orthogonal" renderorder="right-down" width="15" height="10" tilewidth="16" tileheight="16" infinite="0" nextlayerid="5" nextobjectid="5">
|
||||
<tileset firstgid="1" name="tiles" tilewidth="16" tileheight="16" tilecount="72" columns="8">
|
||||
<image source="/Users/leidianyayi/Documents/GitHub/ModelTest20260714/Opus4-8-xhigh/public/assets/sprites/tileset.png" width="128" height="144"/>
|
||||
</tileset>
|
||||
<layer id="1" name="ground" width="15" height="10">
|
||||
<data encoding="csv">
|
||||
25,25,25,25,25,25,25,25,39,25,25,25,25,25,25,
|
||||
25,26,26,26,26,26,26,26,26,26,26,26,26,26,25,
|
||||
25,26,26,26,26,26,26,26,26,26,26,26,26,26,25,
|
||||
25,26,26,26,26,26,26,26,26,26,26,26,26,26,25,
|
||||
25,26,26,26,26,26,26,26,26,26,26,26,26,26,25,
|
||||
25,26,26,26,33,26,26,26,26,26,26,26,26,26,25,
|
||||
25,26,26,26,26,26,26,26,26,26,26,26,26,26,25,
|
||||
25,26,26,26,26,26,26,26,26,26,26,26,26,26,25,
|
||||
25,26,26,26,26,26,26,26,26,26,26,26,26,26,25,
|
||||
25,25,25,25,25,25,25,40,25,25,25,25,25,25,25
|
||||
</data>
|
||||
</layer>
|
||||
<layer id="2" name="obstacles" width="15" height="10">
|
||||
<data encoding="csv">
|
||||
27,28,28,28,28,28,28,28,28,28,28,28,28,28,27,
|
||||
27,0,32,32,32,32,32,0,0,0,0,34,34,0,27,
|
||||
27,0,0,0,0,0,0,0,0,0,0,0,0,0,27,
|
||||
27,0,0,0,0,0,0,0,0,0,0,0,0,0,27,
|
||||
27,0,0,0,0,0,0,0,0,0,0,0,0,62,27,
|
||||
27,0,0,0,0,0,0,0,0,0,0,0,0,0,27,
|
||||
27,31,31,31,31,31,31,31,31,0,0,0,0,0,27,
|
||||
27,0,0,0,0,0,0,0,0,0,0,0,58,0,27,
|
||||
27,0,0,0,0,0,0,0,0,0,0,0,0,0,27,
|
||||
27,27,27,27,27,27,27,0,27,27,27,27,27,27,27
|
||||
</data>
|
||||
</layer>
|
||||
<objectgroup id="3" name="objects">
|
||||
<object id="1" name="door_plaza" type="door" x="112" y="144" width="16" height="16">
|
||||
<properties>
|
||||
<property name="target" value="plaza"/>
|
||||
<property name="dest" value="sp_from_bakery"/>
|
||||
</properties>
|
||||
</object>
|
||||
<object id="2" name="sp_from_plaza" type="spawn" x="112" y="128" width="16" height="16"></object>
|
||||
<object id="3" name="yuan" type="npc" x="64" y="112" width="16" height="16">
|
||||
<properties>
|
||||
<property name="npc" value="yuan"/>
|
||||
</properties>
|
||||
</object>
|
||||
<object id="4" name="i_recipe" type="interact" x="64" y="96" width="16" height="16">
|
||||
<properties>
|
||||
<property name="kind" value="recipe"/>
|
||||
</properties>
|
||||
</object>
|
||||
</objectgroup>
|
||||
</map>
|
||||
@@ -0,0 +1,49 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<map version="1.10" tiledversion="1.12.2" orientation="orthogonal" renderorder="right-down" width="12" height="8" tilewidth="16" tileheight="16" infinite="0" nextlayerid="5" nextobjectid="5">
|
||||
<tileset firstgid="1" name="tiles" tilewidth="16" tileheight="16" tilecount="72" columns="8">
|
||||
<image source="/Users/leidianyayi/Documents/GitHub/ModelTest20260714/Opus4-8-xhigh/public/assets/sprites/tileset.png" width="128" height="144"/>
|
||||
</tileset>
|
||||
<layer id="1" name="ground" width="12" height="8">
|
||||
<data encoding="csv">
|
||||
25,25,25,25,25,25,39,25,25,25,25,25,
|
||||
25,26,38,26,26,26,26,26,26,26,26,25,
|
||||
25,26,26,26,26,26,26,26,26,26,26,25,
|
||||
25,26,26,26,26,26,26,26,26,26,26,25,
|
||||
25,26,26,26,26,26,26,26,26,26,26,25,
|
||||
25,26,26,26,26,26,26,26,26,26,26,25,
|
||||
25,26,26,26,26,26,26,26,26,26,26,25,
|
||||
25,25,25,25,25,25,40,25,25,25,25,25
|
||||
</data>
|
||||
</layer>
|
||||
<layer id="2" name="obstacles" width="12" height="8">
|
||||
<data encoding="csv">
|
||||
27,28,28,28,28,28,28,28,28,28,28,27,
|
||||
27,0,0,0,0,0,0,0,0,59,0,27,
|
||||
27,0,36,0,0,0,0,0,0,0,0,27,
|
||||
27,0,0,0,0,0,0,0,0,0,0,27,
|
||||
27,0,0,0,0,0,0,0,0,0,0,27,
|
||||
27,0,0,0,0,37,0,0,0,62,0,27,
|
||||
27,0,0,0,0,0,0,0,0,0,0,27,
|
||||
27,27,27,27,27,27,0,27,27,27,27,27
|
||||
</data>
|
||||
</layer>
|
||||
<objectgroup id="3" name="objects">
|
||||
<object id="1" name="door_plaza" type="door" x="96" y="112" width="16" height="16">
|
||||
<properties>
|
||||
<property name="target" value="plaza"/>
|
||||
<property name="dest" value="sp_from_clinic"/>
|
||||
</properties>
|
||||
</object>
|
||||
<object id="2" name="sp_from_plaza" type="spawn" x="96" y="96" width="16" height="16"></object>
|
||||
<object id="3" name="fu" type="npc" x="64" y="48" width="16" height="16">
|
||||
<properties>
|
||||
<property name="npc" value="fu"/>
|
||||
</properties>
|
||||
</object>
|
||||
<object id="4" name="i_clinicform" type="interact" x="32" y="32" width="16" height="16">
|
||||
<properties>
|
||||
<property name="kind" value="clinicform"/>
|
||||
</properties>
|
||||
</object>
|
||||
</objectgroup>
|
||||
</map>
|
||||
@@ -0,0 +1,91 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<map version="1.10" tiledversion="1.12.2" orientation="orthogonal" renderorder="right-down" width="20" height="14" tilewidth="16" tileheight="16" infinite="0" nextlayerid="5" nextobjectid="10">
|
||||
<tileset firstgid="1" name="tiles" tilewidth="16" tileheight="16" tilecount="72" columns="8">
|
||||
<image source="/Users/leidianyayi/Documents/GitHub/ModelTest20260714/Opus4-8-xhigh/public/assets/sprites/tileset.png" width="128" height="144"/>
|
||||
</tileset>
|
||||
<layer id="1" name="ground" width="20" height="14">
|
||||
<data encoding="csv">
|
||||
2,1,1,65,1,1,1,1,1,2,40,1,65,1,1,1,1,1,2,1,
|
||||
65,1,9,1,1,1,2,1,1,65,3,1,1,1,1,2,1,1,65,1,
|
||||
1,1,1,2,1,1,65,1,1,1,1,1,2,1,1,65,1,1,1,1,
|
||||
2,1,1,65,1,1,1,1,1,2,1,1,65,1,1,1,1,1,2,1,
|
||||
65,1,1,1,1,1,2,1,1,65,1,1,1,1,1,2,1,1,65,1,
|
||||
1,1,1,2,1,1,65,1,1,1,1,1,2,1,1,65,1,1,1,1,
|
||||
2,1,1,65,1,1,1,1,1,2,1,1,65,1,1,1,1,1,2,1,
|
||||
65,1,1,1,1,1,2,1,1,65,1,1,1,1,1,2,1,1,65,1,
|
||||
1,1,1,2,1,1,65,1,1,1,1,1,2,1,1,65,1,1,1,1,
|
||||
2,1,1,65,1,1,1,1,1,2,1,1,65,1,1,1,1,1,2,1,
|
||||
65,1,1,1,1,1,2,1,1,65,1,1,1,1,1,2,1,1,65,1,
|
||||
1,1,1,2,1,1,65,1,1,1,1,1,2,1,1,65,1,1,1,1,
|
||||
2,1,1,65,1,1,1,1,1,2,1,1,65,1,1,1,1,1,2,1,
|
||||
65,1,1,1,1,1,2,1,1,65,1,1,1,1,1,2,1,1,65,1
|
||||
</data>
|
||||
</layer>
|
||||
<layer id="2" name="obstacles" width="20" height="14">
|
||||
<data encoding="csv">
|
||||
14,14,14,14,14,14,14,14,14,14,0,14,14,14,14,14,14,14,14,14,
|
||||
14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14,
|
||||
14,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14,
|
||||
14,0,0,0,8,0,0,0,0,0,0,0,0,8,0,0,0,0,0,14,
|
||||
14,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,51,0,0,14,
|
||||
14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14,
|
||||
14,0,0,0,0,0,0,0,0,0,15,15,0,0,0,0,0,0,0,14,
|
||||
14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14,
|
||||
14,0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,14,
|
||||
14,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,14,
|
||||
14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14,
|
||||
14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,53,0,14,
|
||||
14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14,
|
||||
14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14
|
||||
</data>
|
||||
</layer>
|
||||
<objectgroup id="3" name="objects">
|
||||
<object id="1" name="i_berry0" type="interact" x="64" y="48" width="16" height="16">
|
||||
<properties>
|
||||
<property name="kind" value="berry"/>
|
||||
<property name="n" value="0"/>
|
||||
</properties>
|
||||
</object>
|
||||
<object id="2" name="i_berry1" type="interact" x="128" y="64" width="16" height="16">
|
||||
<properties>
|
||||
<property name="kind" value="berry"/>
|
||||
<property name="n" value="1"/>
|
||||
</properties>
|
||||
</object>
|
||||
<object id="3" name="i_berry2" type="interact" x="208" y="48" width="16" height="16">
|
||||
<properties>
|
||||
<property name="kind" value="berry"/>
|
||||
<property name="n" value="2"/>
|
||||
</properties>
|
||||
</object>
|
||||
<object id="4" name="i_berry3" type="interact" x="96" y="128" width="16" height="16">
|
||||
<properties>
|
||||
<property name="kind" value="berry"/>
|
||||
<property name="n" value="3"/>
|
||||
</properties>
|
||||
</object>
|
||||
<object id="5" name="i_berry4" type="interact" x="224" y="144" width="16" height="16">
|
||||
<properties>
|
||||
<property name="kind" value="berry"/>
|
||||
<property name="n" value="4"/>
|
||||
</properties>
|
||||
</object>
|
||||
<object id="6" name="i_fieldbed" type="interact" x="160" y="112" width="16" height="16">
|
||||
<properties>
|
||||
<property name="kind" value="flowerbed"/>
|
||||
</properties>
|
||||
</object>
|
||||
<object id="7" name="door_plaza" type="door" x="160" y="0" width="16" height="16">
|
||||
<properties>
|
||||
<property name="target" value="plaza"/>
|
||||
<property name="dest" value="sp_from_field"/>
|
||||
</properties>
|
||||
</object>
|
||||
<object id="8" name="sp_from_plaza" type="spawn" x="160" y="32" width="16" height="16"></object>
|
||||
<object id="9" name="extra5" type="npc" x="240" y="112" width="16" height="16">
|
||||
<properties>
|
||||
<property name="npc" value="extra5"/>
|
||||
</properties>
|
||||
</object>
|
||||
</objectgroup>
|
||||
</map>
|
||||
@@ -0,0 +1,44 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<map version="1.10" tiledversion="1.12.2" orientation="orthogonal" renderorder="right-down" width="20" height="8" tilewidth="16" tileheight="16" infinite="0" nextlayerid="5" nextobjectid="4">
|
||||
<tileset firstgid="1" name="tiles" tilewidth="16" tileheight="16" tilecount="72" columns="8">
|
||||
<image source="/Users/leidianyayi/Documents/GitHub/ModelTest20260714/Opus4-8-xhigh/public/assets/sprites/tileset.png" width="128" height="144"/>
|
||||
</tileset>
|
||||
<layer id="1" name="ground" width="20" height="8">
|
||||
<data encoding="csv">
|
||||
17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,
|
||||
17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,
|
||||
17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,
|
||||
1,1,2,1,1,1,1,1,1,2,1,1,1,1,1,1,2,1,1,1,
|
||||
1,1,1,1,1,2,1,1,1,1,1,1,2,1,1,1,1,1,1,2,
|
||||
1,2,1,1,1,1,1,1,2,1,1,1,1,1,1,2,1,1,1,1,
|
||||
1,1,1,1,2,1,1,1,1,1,3,2,1,1,1,1,1,1,2,1,
|
||||
2,1,1,1,1,1,1,2,1,1,40,1,1,1,2,1,1,1,1,1
|
||||
</data>
|
||||
</layer>
|
||||
<layer id="2" name="obstacles" width="20" height="8">
|
||||
<data encoding="csv">
|
||||
17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,
|
||||
17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,
|
||||
17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,
|
||||
14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14,
|
||||
14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14,
|
||||
14,0,0,23,0,0,0,0,0,0,0,0,0,0,0,0,23,0,0,14,
|
||||
14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14,
|
||||
14,14,14,14,14,14,14,14,14,14,0,14,14,14,14,14,14,14,14,14
|
||||
</data>
|
||||
</layer>
|
||||
<objectgroup id="3" name="objects">
|
||||
<object id="1" name="door_plaza" type="door" x="160" y="112" width="16" height="16">
|
||||
<properties>
|
||||
<property name="target" value="plaza"/>
|
||||
<property name="dest" value="sp_from_fog"/>
|
||||
</properties>
|
||||
</object>
|
||||
<object id="2" name="sp_from_plaza" type="spawn" x="160" y="80" width="16" height="16"></object>
|
||||
<object id="3" name="i_fog" type="interact" x="160" y="48" width="16" height="16">
|
||||
<properties>
|
||||
<property name="kind" value="fog"/>
|
||||
</properties>
|
||||
</object>
|
||||
</objectgroup>
|
||||
</map>
|
||||
@@ -0,0 +1,53 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<map version="1.10" tiledversion="1.12.2" orientation="orthogonal" renderorder="right-down" width="15" height="10" tilewidth="16" tileheight="16" infinite="0" nextlayerid="5" nextobjectid="5">
|
||||
<tileset firstgid="1" name="tiles" tilewidth="16" tileheight="16" tilecount="72" columns="8">
|
||||
<image source="/Users/leidianyayi/Documents/GitHub/ModelTest20260714/Opus4-8-xhigh/public/assets/sprites/tileset.png" width="128" height="144"/>
|
||||
</tileset>
|
||||
<layer id="1" name="ground" width="15" height="10">
|
||||
<data encoding="csv">
|
||||
25,25,25,25,25,25,25,25,25,25,25,39,25,25,25,
|
||||
25,26,26,26,26,26,26,26,26,26,26,26,26,26,25,
|
||||
25,26,26,26,26,26,26,26,26,26,26,26,26,26,25,
|
||||
25,26,26,26,26,26,26,26,26,26,26,26,26,26,25,
|
||||
25,26,26,26,26,26,26,26,26,26,26,26,26,26,25,
|
||||
25,26,26,26,26,26,26,26,26,26,26,26,26,26,25,
|
||||
25,26,26,26,26,26,26,26,26,26,26,26,26,26,25,
|
||||
25,26,26,26,26,26,26,26,26,26,26,26,26,26,25,
|
||||
25,26,26,26,26,26,26,26,26,26,26,26,26,26,25,
|
||||
25,25,25,25,25,25,25,40,25,25,25,25,25,25,25
|
||||
</data>
|
||||
</layer>
|
||||
<layer id="2" name="obstacles" width="15" height="10">
|
||||
<data encoding="csv">
|
||||
27,28,28,28,28,28,28,28,28,28,28,28,28,28,27,
|
||||
27,0,35,35,35,35,35,35,35,35,35,0,0,0,27,
|
||||
27,0,0,0,0,0,0,0,0,0,0,0,0,0,27,
|
||||
27,0,0,0,0,0,0,0,0,0,0,0,57,0,27,
|
||||
27,0,0,0,0,0,0,0,0,0,0,0,0,0,27,
|
||||
27,0,0,0,0,0,0,0,0,0,0,0,0,0,27,
|
||||
27,31,31,31,31,31,31,31,31,0,0,0,0,58,27,
|
||||
27,0,0,0,0,0,0,0,0,0,0,0,57,0,27,
|
||||
27,0,0,0,0,0,0,0,0,0,0,0,0,0,27,
|
||||
27,27,27,27,27,27,27,0,27,27,27,27,27,27,27
|
||||
</data>
|
||||
</layer>
|
||||
<objectgroup id="3" name="objects">
|
||||
<object id="1" name="door_plaza" type="door" x="112" y="144" width="16" height="16">
|
||||
<properties>
|
||||
<property name="target" value="plaza"/>
|
||||
<property name="dest" value="sp_from_grocery"/>
|
||||
</properties>
|
||||
</object>
|
||||
<object id="2" name="sp_from_plaza" type="spawn" x="112" y="128" width="16" height="16"></object>
|
||||
<object id="3" name="mimi" type="npc" x="64" y="112" width="16" height="16">
|
||||
<properties>
|
||||
<property name="npc" value="mimi"/>
|
||||
</properties>
|
||||
</object>
|
||||
<object id="4" name="i_shelf" type="interact" x="96" y="32" width="16" height="16">
|
||||
<properties>
|
||||
<property name="kind" value="shelf"/>
|
||||
</properties>
|
||||
</object>
|
||||
</objectgroup>
|
||||
</map>
|
||||
@@ -0,0 +1,50 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<map version="1.10" tiledversion="1.12.2" orientation="orthogonal" renderorder="right-down" width="12" height="8" tilewidth="16" tileheight="16" infinite="0" nextlayerid="5" nextobjectid="6">
|
||||
<tileset firstgid="1" name="tiles" tilewidth="16" tileheight="16" tilecount="72" columns="8">
|
||||
<image source="/Users/leidianyayi/Documents/GitHub/ModelTest20260714/Opus4-8-xhigh/public/assets/sprites/tileset.png" width="128" height="144"/>
|
||||
</tileset>
|
||||
<layer id="1" name="ground" width="12" height="8">
|
||||
<data encoding="csv">
|
||||
25,25,30,25,39,25,25,39,25,25,25,25,
|
||||
25,25,25,25,25,63,63,25,25,25,25,25,
|
||||
25,25,25,25,25,25,25,25,25,25,25,25,
|
||||
25,25,25,25,25,25,25,25,25,25,25,25,
|
||||
25,25,25,25,25,25,25,25,25,25,25,25,
|
||||
25,25,25,25,25,25,25,25,25,25,25,25,
|
||||
25,25,25,25,25,25,25,25,25,25,25,25,
|
||||
25,25,25,25,25,25,40,25,25,25,25,25
|
||||
</data>
|
||||
</layer>
|
||||
<layer id="2" name="obstacles" width="12" height="8">
|
||||
<data encoding="csv">
|
||||
27,28,28,28,28,28,28,28,28,28,28,27,
|
||||
27,29,0,0,0,0,0,0,62,59,0,27,
|
||||
27,29,0,0,0,0,0,0,0,0,0,27,
|
||||
27,0,0,0,0,0,0,0,0,0,0,27,
|
||||
27,0,0,0,0,0,0,0,0,0,0,27,
|
||||
27,0,0,0,0,0,0,0,36,37,0,27,
|
||||
27,0,0,0,0,0,0,0,0,0,0,27,
|
||||
27,27,27,27,27,27,0,27,27,27,27,27
|
||||
</data>
|
||||
</layer>
|
||||
<objectgroup id="3" name="objects">
|
||||
<object id="1" name="door_plaza" type="door" x="96" y="112" width="16" height="16">
|
||||
<properties>
|
||||
<property name="target" value="plaza"/>
|
||||
<property name="dest" value="sp_from_home"/>
|
||||
</properties>
|
||||
</object>
|
||||
<object id="2" name="start" type="spawn" x="48" y="48" width="16" height="16"></object>
|
||||
<object id="3" name="sp_from_plaza" type="spawn" x="96" y="96" width="16" height="16"></object>
|
||||
<object id="4" name="i_bed" type="interact" x="32" y="32" width="16" height="16">
|
||||
<properties>
|
||||
<property name="kind" value="bed"/>
|
||||
</properties>
|
||||
</object>
|
||||
<object id="5" name="i_calendar" type="interact" x="32" y="16" width="16" height="16">
|
||||
<properties>
|
||||
<property name="kind" value="calendar"/>
|
||||
</properties>
|
||||
</object>
|
||||
</objectgroup>
|
||||
</map>
|
||||
@@ -0,0 +1,70 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<map version="1.10" tiledversion="1.12.2" orientation="orthogonal" renderorder="right-down" width="24" height="16" tilewidth="16" tileheight="16" infinite="0" nextlayerid="5" nextobjectid="6">
|
||||
<tileset firstgid="1" name="tiles" tilewidth="16" tileheight="16" tilecount="72" columns="8">
|
||||
<image source="/Users/leidianyayi/Documents/GitHub/ModelTest20260714/Opus4-8-xhigh/public/assets/sprites/tileset.png" width="128" height="144"/>
|
||||
</tileset>
|
||||
<layer id="1" name="ground" width="24" height="16">
|
||||
<data encoding="csv">
|
||||
2,1,1,1,1,1,1,1,1,1,1,1,40,2,1,1,1,1,1,1,1,1,1,1,
|
||||
1,1,9,1,1,1,1,2,1,1,1,1,3,1,1,1,1,1,1,1,2,1,1,1,
|
||||
1,2,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,9,1,1,
|
||||
1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,
|
||||
1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,
|
||||
1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,2,1,
|
||||
1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,20,1,1,1,1,1,1,1,
|
||||
1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,2,
|
||||
1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,
|
||||
1,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,1,
|
||||
1,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,1,
|
||||
1,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,1,
|
||||
1,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,1,
|
||||
2,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,1,
|
||||
1,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,1,
|
||||
1,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,1
|
||||
</data>
|
||||
</layer>
|
||||
<layer id="2" name="obstacles" width="24" height="16">
|
||||
<data encoding="csv">
|
||||
14,14,14,14,14,14,14,14,14,14,14,14,0,14,14,14,14,14,14,14,14,14,14,14,
|
||||
14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14,
|
||||
14,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,0,0,0,0,14,
|
||||
14,0,0,0,0,0,0,0,52,0,0,0,0,0,0,0,0,0,0,0,0,10,0,14,
|
||||
14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14,
|
||||
14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14,
|
||||
14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14,
|
||||
14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14,
|
||||
14,0,0,0,0,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14,
|
||||
14,5,5,55,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,55,5,5,14,
|
||||
14,5,5,5,5,5,5,5,5,5,5,5,54,5,5,5,5,5,5,5,5,5,5,14,
|
||||
14,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,14,
|
||||
14,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,14,
|
||||
14,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,14,
|
||||
14,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,14,
|
||||
14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14
|
||||
</data>
|
||||
</layer>
|
||||
<objectgroup id="3" name="objects">
|
||||
<object id="1" name="door_plaza" type="door" x="192" y="0" width="16" height="16">
|
||||
<properties>
|
||||
<property name="target" value="plaza"/>
|
||||
<property name="dest" value="sp_from_lake"/>
|
||||
</properties>
|
||||
</object>
|
||||
<object id="2" name="sp_from_plaza" type="spawn" x="192" y="32" width="16" height="16"></object>
|
||||
<object id="3" name="gui" type="npc" x="80" y="112" width="16" height="16">
|
||||
<properties>
|
||||
<property name="npc" value="gui"/>
|
||||
</properties>
|
||||
</object>
|
||||
<object id="4" name="extra4" type="npc" x="240" y="48" width="16" height="16">
|
||||
<properties>
|
||||
<property name="npc" value="extra4"/>
|
||||
</properties>
|
||||
</object>
|
||||
<object id="5" name="i_picnic" type="interact" x="256" y="96" width="16" height="16">
|
||||
<properties>
|
||||
<property name="kind" value="picnic"/>
|
||||
</properties>
|
||||
</object>
|
||||
</objectgroup>
|
||||
</map>
|
||||
@@ -0,0 +1,191 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<map version="1.10" tiledversion="1.12.2" orientation="orthogonal" renderorder="right-down" width="30" height="20" tilewidth="16" tileheight="16" infinite="0" nextlayerid="5" nextobjectid="32">
|
||||
<tileset firstgid="1" name="tiles" tilewidth="16" tileheight="16" tilecount="72" columns="8">
|
||||
<image source="/Users/leidianyayi/Documents/GitHub/ModelTest20260714/Opus4-8-xhigh/public/assets/sprites/tileset.png" width="128" height="144"/>
|
||||
</tileset>
|
||||
<layer id="1" name="ground" width="30" height="20">
|
||||
<data encoding="csv">
|
||||
2,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,
|
||||
1,18,1,2,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,
|
||||
1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,2,1,
|
||||
1,1,1,13,1,1,1,1,1,13,1,1,1,1,1,1,13,1,1,1,2,1,1,13,9,1,1,1,1,1,
|
||||
1,2,1,3,1,1,1,1,1,3,1,1,2,1,1,1,3,1,1,1,1,1,1,9,9,9,1,1,1,1,
|
||||
1,1,1,3,2,1,1,1,1,3,1,1,1,1,1,2,3,1,1,1,1,1,1,3,1,1,2,1,1,1,
|
||||
1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,2,
|
||||
1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,
|
||||
1,1,2,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,
|
||||
1,1,1,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,1,1,
|
||||
40,3,1,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,3,40,
|
||||
2,1,1,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,1,1,
|
||||
1,1,1,2,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,
|
||||
1,1,1,1,1,1,2,1,1,1,1,72,72,72,72,72,72,72,72,1,1,1,1,1,1,1,1,1,2,1,
|
||||
1,1,1,1,1,1,1,1,1,2,1,72,72,72,72,72,72,72,72,1,2,1,1,1,1,1,1,1,1,1,
|
||||
1,2,1,1,1,1,1,1,1,1,1,72,72,72,72,72,72,72,72,1,1,1,1,2,1,1,1,1,1,1,
|
||||
1,1,1,1,2,1,1,1,1,1,1,72,72,72,72,72,72,72,72,1,1,1,1,1,1,1,2,1,1,1,
|
||||
1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,2,
|
||||
1,1,1,1,3,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,2,1,1,1,3,1,1,1,1,
|
||||
1,1,2,1,40,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,2,40,1,1,1,1
|
||||
</data>
|
||||
</layer>
|
||||
<layer id="2" name="obstacles" width="30" height="20">
|
||||
<data encoding="csv">
|
||||
14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,
|
||||
14,10,12,12,12,0,0,0,12,12,12,0,0,0,0,12,12,12,0,0,0,0,12,12,12,0,0,10,10,14,
|
||||
14,0,11,12,11,0,0,0,11,12,11,0,0,0,0,11,12,11,0,0,0,0,11,12,11,0,0,0,0,14,
|
||||
14,0,11,0,11,0,0,0,11,0,11,0,0,0,0,11,0,11,0,0,0,0,11,0,11,0,0,0,0,14,
|
||||
14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14,
|
||||
14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,14,
|
||||
14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14,
|
||||
14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14,
|
||||
14,0,0,0,0,0,0,0,0,22,0,0,0,0,18,0,0,0,0,0,22,0,0,0,0,0,0,0,0,14,
|
||||
14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14,
|
||||
14,0,0,0,0,0,0,0,0,0,0,0,48,48,48,48,0,0,0,0,0,0,0,0,0,0,0,0,0,14,
|
||||
14,0,0,0,0,15,15,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14,
|
||||
14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14,
|
||||
14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14,
|
||||
14,0,0,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,0,0,14,
|
||||
14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19,0,0,0,0,0,0,0,0,0,0,0,0,0,14,
|
||||
14,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,14,
|
||||
14,14,14,14,0,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,0,14,14,14,14
|
||||
</data>
|
||||
</layer>
|
||||
<objectgroup id="3" name="objects">
|
||||
<object id="1" name="door_home" type="door" x="48" y="48" width="16" height="16">
|
||||
<properties>
|
||||
<property name="target" value="home"/>
|
||||
<property name="dest" value="sp_from_plaza"/>
|
||||
</properties>
|
||||
</object>
|
||||
<object id="2" name="sp_from_home" type="spawn" x="48" y="80" width="16" height="16"></object>
|
||||
<object id="3" name="door_bakery" type="door" x="144" y="48" width="16" height="16">
|
||||
<properties>
|
||||
<property name="target" value="bakery"/>
|
||||
<property name="dest" value="sp_from_plaza"/>
|
||||
</properties>
|
||||
</object>
|
||||
<object id="4" name="sp_from_bakery" type="spawn" x="144" y="80" width="16" height="16"></object>
|
||||
<object id="5" name="door_grocery" type="door" x="256" y="48" width="16" height="16">
|
||||
<properties>
|
||||
<property name="target" value="grocery"/>
|
||||
<property name="dest" value="sp_from_plaza"/>
|
||||
</properties>
|
||||
</object>
|
||||
<object id="6" name="sp_from_grocery" type="spawn" x="256" y="80" width="16" height="16"></object>
|
||||
<object id="7" name="door_clinic" type="door" x="368" y="48" width="16" height="16">
|
||||
<properties>
|
||||
<property name="target" value="clinic"/>
|
||||
<property name="dest" value="sp_from_plaza"/>
|
||||
</properties>
|
||||
</object>
|
||||
<object id="8" name="sp_from_clinic" type="spawn" x="368" y="80" width="16" height="16"></object>
|
||||
<object id="9" name="i_mailbox" type="interact" x="240" y="256" width="16" height="16">
|
||||
<properties>
|
||||
<property name="kind" value="mailbox"/>
|
||||
</properties>
|
||||
</object>
|
||||
<object id="10" name="door_field" type="door" x="0" y="160" width="16" height="16">
|
||||
<properties>
|
||||
<property name="target" value="field"/>
|
||||
<property name="dest" value="sp_from_plaza"/>
|
||||
</properties>
|
||||
</object>
|
||||
<object id="11" name="sp_from_field" type="spawn" x="32" y="160" width="16" height="16"></object>
|
||||
<object id="12" name="door_lake" type="door" x="464" y="160" width="16" height="16">
|
||||
<properties>
|
||||
<property name="target" value="lake"/>
|
||||
<property name="dest" value="sp_from_plaza"/>
|
||||
</properties>
|
||||
</object>
|
||||
<object id="13" name="sp_from_lake" type="spawn" x="432" y="160" width="16" height="16"></object>
|
||||
<object id="14" name="door_well" type="door" x="64" y="304" width="16" height="16">
|
||||
<properties>
|
||||
<property name="target" value="well"/>
|
||||
<property name="dest" value="sp_from_plaza"/>
|
||||
</properties>
|
||||
</object>
|
||||
<object id="15" name="sp_from_well" type="spawn" x="64" y="272" width="16" height="16"></object>
|
||||
<object id="16" name="door_fog" type="door" x="400" y="304" width="16" height="16">
|
||||
<properties>
|
||||
<property name="target" value="fog"/>
|
||||
<property name="dest" value="sp_from_plaza"/>
|
||||
</properties>
|
||||
</object>
|
||||
<object id="17" name="sp_from_fog" type="spawn" x="400" y="272" width="16" height="16"></object>
|
||||
<object id="18" name="afu" type="npc" x="224" y="144" width="16" height="16">
|
||||
<properties>
|
||||
<property name="npc" value="afu"/>
|
||||
</properties>
|
||||
</object>
|
||||
<object id="19" name="dabao" type="npc" x="240" y="288" width="16" height="16">
|
||||
<properties>
|
||||
<property name="npc" value="dabao"/>
|
||||
</properties>
|
||||
</object>
|
||||
<object id="20" name="bird1" type="npc" x="368" y="80" width="16" height="16">
|
||||
<properties>
|
||||
<property name="npc" value="bird1"/>
|
||||
</properties>
|
||||
</object>
|
||||
<object id="21" name="bird2" type="npc" x="400" y="80" width="16" height="16">
|
||||
<properties>
|
||||
<property name="npc" value="bird2"/>
|
||||
</properties>
|
||||
</object>
|
||||
<object id="22" name="extra1" type="npc" x="160" y="240" width="16" height="16">
|
||||
<properties>
|
||||
<property name="npc" value="extra1"/>
|
||||
</properties>
|
||||
</object>
|
||||
<object id="23" name="extra2" type="npc" x="304" y="256" width="16" height="16">
|
||||
<properties>
|
||||
<property name="npc" value="extra2"/>
|
||||
</properties>
|
||||
</object>
|
||||
<object id="24" name="extra3" type="npc" x="96" y="96" width="16" height="16">
|
||||
<properties>
|
||||
<property name="npc" value="extra3"/>
|
||||
</properties>
|
||||
</object>
|
||||
<object id="25" name="i_board" type="interact" x="224" y="144" width="16" height="16">
|
||||
<properties>
|
||||
<property name="kind" value="board"/>
|
||||
</properties>
|
||||
</object>
|
||||
<object id="26" name="i_flowerbed" type="interact" x="96" y="224" width="16" height="16">
|
||||
<properties>
|
||||
<property name="kind" value="flowerbed"/>
|
||||
</properties>
|
||||
</object>
|
||||
<object id="27" name="i_festival" type="interact" x="224" y="224" width="16" height="16">
|
||||
<properties>
|
||||
<property name="kind" value="festival"/>
|
||||
</properties>
|
||||
</object>
|
||||
<object id="28" name="i_ribbon0" type="interact" x="192" y="208" width="16" height="16">
|
||||
<properties>
|
||||
<property name="kind" value="ribbon"/>
|
||||
<property name="n" value="0"/>
|
||||
</properties>
|
||||
</object>
|
||||
<object id="29" name="i_ribbon1" type="interact" x="224" y="208" width="16" height="16">
|
||||
<properties>
|
||||
<property name="kind" value="ribbon"/>
|
||||
<property name="n" value="1"/>
|
||||
</properties>
|
||||
</object>
|
||||
<object id="30" name="i_ribbon2" type="interact" x="256" y="208" width="16" height="16">
|
||||
<properties>
|
||||
<property name="kind" value="ribbon"/>
|
||||
<property name="n" value="2"/>
|
||||
</properties>
|
||||
</object>
|
||||
<object id="31" name="i_ribbon3" type="interact" x="288" y="208" width="16" height="16">
|
||||
<properties>
|
||||
<property name="kind" value="ribbon"/>
|
||||
<property name="n" value="3"/>
|
||||
</properties>
|
||||
</object>
|
||||
</objectgroup>
|
||||
</map>
|
||||
@@ -0,0 +1,48 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<map version="1.10" tiledversion="1.12.2" orientation="orthogonal" renderorder="right-down" width="14" height="10" tilewidth="16" tileheight="16" infinite="0" nextlayerid="5" nextobjectid="4">
|
||||
<tileset firstgid="1" name="tiles" tilewidth="16" tileheight="16" tilecount="72" columns="8">
|
||||
<image source="/Users/leidianyayi/Documents/GitHub/ModelTest20260714/Opus4-8-xhigh/public/assets/sprites/tileset.png" width="128" height="144"/>
|
||||
</tileset>
|
||||
<layer id="1" name="ground" width="14" height="10">
|
||||
<data encoding="csv">
|
||||
2,1,1,1,1,2,1,40,1,1,2,1,1,1,
|
||||
1,1,1,1,2,1,1,3,1,2,1,1,1,1,
|
||||
1,1,1,2,1,1,1,1,2,1,1,1,1,2,
|
||||
1,1,2,1,1,24,24,24,24,1,1,1,2,1,
|
||||
1,2,1,1,1,24,24,24,24,1,1,2,1,1,
|
||||
2,1,1,1,1,24,24,24,24,1,2,1,1,1,
|
||||
1,1,1,1,2,24,24,24,24,2,1,1,1,1,
|
||||
1,1,1,2,1,1,1,1,2,1,1,1,1,2,
|
||||
1,1,2,1,1,1,1,2,1,1,1,1,2,1,
|
||||
1,2,1,1,1,1,2,1,1,1,1,2,1,1
|
||||
</data>
|
||||
</layer>
|
||||
<layer id="2" name="obstacles" width="14" height="10">
|
||||
<data encoding="csv">
|
||||
14,14,14,14,14,14,14,0,14,14,14,14,14,14,
|
||||
14,0,0,0,0,0,0,0,0,0,0,0,0,14,
|
||||
14,0,52,0,0,0,0,0,0,0,0,0,0,14,
|
||||
14,0,0,0,0,0,0,0,0,0,0,0,0,14,
|
||||
14,0,0,0,0,0,16,16,0,0,0,0,0,14,
|
||||
14,0,0,0,0,0,0,0,0,0,0,0,0,14,
|
||||
14,0,0,0,0,0,0,0,0,0,0,0,0,14,
|
||||
14,0,0,53,0,0,0,0,0,0,0,23,0,14,
|
||||
14,0,0,0,0,0,0,0,0,0,0,0,0,14,
|
||||
14,14,14,14,14,14,14,14,14,14,14,14,14,14
|
||||
</data>
|
||||
</layer>
|
||||
<objectgroup id="3" name="objects">
|
||||
<object id="1" name="door_plaza" type="door" x="112" y="0" width="16" height="16">
|
||||
<properties>
|
||||
<property name="target" value="plaza"/>
|
||||
<property name="dest" value="sp_from_well"/>
|
||||
</properties>
|
||||
</object>
|
||||
<object id="2" name="sp_from_plaza" type="spawn" x="112" y="32" width="16" height="16"></object>
|
||||
<object id="3" name="i_well" type="interact" x="112" y="80" width="16" height="16">
|
||||
<properties>
|
||||
<property name="kind" value="well"/>
|
||||
</properties>
|
||||
</object>
|
||||
</objectgroup>
|
||||
</map>
|
||||
@@ -0,0 +1,46 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<map version="1.10" tiledversion="1.12.2" orientation="orthogonal" renderorder="right-down" width="20" height="14" tilewidth="16" tileheight="16" infinite="0" nextlayerid="5" nextobjectid="3">
|
||||
<tileset firstgid="1" name="tiles" tilewidth="16" tileheight="16" tilecount="72" columns="8">
|
||||
<image source="/Users/leidianyayi/Documents/GitHub/ModelTest20260714/Opus4-8-xhigh/public/assets/sprites/tileset.png" width="128" height="144"/>
|
||||
</tileset>
|
||||
<layer id="1" name="ground" width="20" height="14">
|
||||
<data encoding="csv">
|
||||
43,43,43,43,46,43,43,43,43,43,43,43,43,43,43,46,43,43,43,43,
|
||||
43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,
|
||||
43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,
|
||||
43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,
|
||||
43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,
|
||||
43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,
|
||||
42,42,42,42,42,42,42,42,42,42,45,42,42,42,42,42,42,42,42,42,
|
||||
42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,
|
||||
42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,
|
||||
42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,
|
||||
42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,
|
||||
42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,
|
||||
42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,
|
||||
42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42
|
||||
</data>
|
||||
</layer>
|
||||
<layer id="2" name="obstacles" width="20" height="14">
|
||||
<data encoding="csv">
|
||||
41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,
|
||||
41,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,41,
|
||||
41,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,41,
|
||||
41,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,41,
|
||||
41,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,41,
|
||||
41,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,41,
|
||||
41,41,41,41,41,41,41,41,41,41,0,41,41,41,41,41,41,41,41,41,
|
||||
41,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,41,
|
||||
41,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,41,
|
||||
41,0,0,44,0,0,0,0,0,0,0,0,0,0,0,0,44,0,0,41,
|
||||
41,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,41,
|
||||
41,0,0,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,41,
|
||||
41,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,41,
|
||||
41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41
|
||||
</data>
|
||||
</layer>
|
||||
<objectgroup id="3" name="objects">
|
||||
<object id="1" name="sp_corridor" type="spawn" x="160" y="32" width="16" height="16"></object>
|
||||
<object id="2" name="sp_ward" type="spawn" x="160" y="176" width="16" height="16"></object>
|
||||
</objectgroup>
|
||||
</map>
|
||||
Reference in New Issue
Block a user