Skip to content

Instantly share code, notes, and snippets.

@nona-takahara
Created October 8, 2021 05:35
Show Gist options
  • Save nona-takahara/8fce3ac4a5aed739f458624183217e85 to your computer and use it in GitHub Desktop.
Save nona-takahara/8fce3ac4a5aed739f458624183217e85 to your computer and use it in GitHub Desktop.
Stormworks用:2px幅LED表示のLuaコードをそれなりに自動生成
from PIL import Image, ImageFilter
def maku(im, ff, sx, sy, sw, sh):
print('function W(x,y,h)screen.drawRectF(x,y,2,h+1)end function B(x,y,w)screen.drawRectF(x,y,w+1,2)end function V(x,y,h)screen.drawRectF(x,y,1,h+1)end function H(x,y,w)screen.drawRectF(x,y,w+1,1) end', file=ff)
print('function onDraw()screen.setColor(255, 255, 255)', file=ff)
pxorig=[[0 for j in range(sh)] for i in range(sw)]
pxflag=[[0 for j in range(sh)] for i in range(sw)]
for y in range(0,sh,1):
for x in range(0,sw,1):
# ドット絵エディタが256色pngを出力して、今回ドットを打つべき場所が7番パレットだったので。
pxorig[x][y]= im.getpixel((sx+x, sy+y))==7
# 縦走査2px
for y in range(0,sh-1,1):
for x in range(0,sw-1,1):
if pxorig[x][y] and pxorig[x+1][y] and pxorig[x][y+1] and pxorig[x+1][y+1] and pxorig[x][y+2] and pxorig[x+1][y+2]:
td=0
newpx=False
while y+td<sh:
newpx=newpx or (not(pxflag[x][y+td] and pxflag[x+1][y+td]))
pxflag[x][y+td]=True
pxflag[x+1][y+td]=True
if not(pxorig[x][y+td+1] and pxorig[x+1][y+td+1]):
break
td+=1
if newpx:
print('W({0},{1},{2})'.format(x,y,td+1), end='', file=ff)
# 横走査2px
for y in range(0,sh-1,1):
for x in range(0,sw-1,1):
if pxorig[x][y] and pxorig[x+1][y] and pxorig[x][y+1] and pxorig[x+1][y+1]:
td=0
newpx=False
while x+td<sw:
newpx=newpx or (not(pxflag[x+td][y] and pxflag[x+td][y+1]))
pxflag[x+td][y]=True
pxflag[x+td][y+1]=True
if not(pxorig[x+td+1][y] and pxorig[x+td+1][y+1]):
break
td+=1
if newpx:
print('B({0},{1},{2})'.format(x,y,td+1), end='', file=ff)
# 縦走査1px
for y in range(0,sh-1,1):
for x in range(0,sw-1,1):
if pxorig[x][y] and pxorig[x][y+1]:
td=0
newpx=False
while y+td<sh:
newpx=newpx or (not(pxflag[x][y+td]))
pxflag[x][y+td]=True
if not(pxorig[x][y+td+1]):
break
td+=1
if newpx:
print('V({0},{1},{2})'.format(x,y,td+1), end='', file=ff)
# 横走査1px
for y in range(0,sh-1,1):
for x in range(0,sw-1,1):
if pxorig[x][y]:
td=0
newpx=False
while x+td<sw:
newpx=newpx or (not(pxflag[x+td][y]))
pxflag[x+td][y]=True
if not(pxorig[x+td+1][y]):
break
td+=1
if newpx:
print('H({0},{1},{2})'.format(x,y,td+1), end='', file=ff)
print('\nend', file=ff)
for y in range(0,sh,1):
for x in range(0,sw,1):
if pxflag[x][y]!=pxorig[x][y]:
print('error at {0},{1}'.format(x,y))
im = Image.open('maku.png')
k=0
for X in range(0,288,32*3):
for Y in range(0,256,32):
with open('maku{0}.lua'.format(k), 'w') as f:
maku(im, f, X, Y, 32*3, 32)
k=k+1
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment