パズル画面では、十字キーかスライドパットでカーソル移動、Aボタンでマスを塗る/消す、Bボタンで×マーク/消す、Xボタンで初期状態に戻す、Yボタンでタイトル画面に戻ります。During puzzle, move cursor by circle pad or D-pad, fill a cell/cancel by A button, mark X/cancel by B button, reset by X button and return to title screen by Y button.
BP | カーソル移動のリピート処理用カウンタ |
EY | 画面右下の説明文のY座標 |
FD[,] | 現在のマスの状態 |
FH | マスの背景色(色相) |
FM | 正解パターンと一致してるマスの数(225になったら完成) |
HC$[] | 各列のヒント情報 |
HR$[] | 各行のヒント情報 |
MN | 現在のパターン番号 |
PC | クリアしたパターンの数 |
PT[,] | キャラを二値化パターン(つまり、正解パターン) |
PT%[] | 各パターンのクリア時間(0の場合は未クリア) |
PX,PY | パターンの基準座標(キャラは16×16だが、問題は15×15なので) |
PZ[] | 各パターンの情報(キャラ番号、二値化閾値) |
SV$ | セーブデータのファイル名 |
TM | パズル開始からの経過フレーム数 |
'
' SPRITE ILLUST-LOGIC Programmed by OBONO
'
OPTION STRICT
DIM MN,TM,BP,EY
DIM PZ[150],PT[16,16],PX,PY,PT%[152],PC
DIM FD[15,15],HR$[15],HC$[15],FM,FH
DIM SV$="DAT:"+PRGNAME$()+".SAV"
INIT
WHILE 1
LIST_PZL
CHOOSE_PZL
SETUP_PZL
DRAW_PZL 1
PLAY_PZL
IF FM==225 THEN CLEAR_PZL
WEND
' DRAW GRID SCREEN
DEF LIST_PZL
DIM I,J,M,Y,Z
' TITLE
BGSTR 5,1,"SPRITE"
BGSTR 8,2,"ILLUST-LOGIC"
' SETUP GRID VIEW
M=MIN(FLOOR((PC+20)/15),10)
Y=FLOOR(9-M/2)
FOR I=0 TO M-1
BGPUT 0,4,Y+I,I+33
FOR J=0 TO 14
BGPUT 0,5+J,Y+I,160+I*32+J
NEXT
NEXT
PRINT_BEST
' SCROLL IN
Z=400
FOR I=0 TO 29
BGMVOL I*2
Z=Z*4/5:BGOFS 0,Z,0:VSYNC
NEXT
END
' CHOOSE PUZZLE
DEF CHOOSE_PZL
DIM CX,CY,MA,MY,BT,VX,VY,VZ
CX=MN MOD 15:CY=MN DIV 15
MA=MIN(FLOOR((PC+20)/15),10)*15
MY=FLOOR(9-MA/30)*16
SPSET 0,1
SPSET 1,5:IF PC<5 THEN EY=264
REPEAT
GET_PAD OUT VX,VY:VZ=VX+VY*15
IF VZ && MN+VZ>=0 && MN+VZ<MA THEN
MN=MN+VZ:PRINT_BEST:BEEP 9
ENDIF
CX=MN MOD 15:CY=MN DIV 15
SPOFS 0,CX*16+80,CY*16+MY
BT=BUTTON(2)
IF BT AND #Y THEN
PT%[150]=PC:PT%[151]=MN
SAVE SV$,PT%
ENDIF
VSYNC
UNTIL BT AND #A
SPCLR:BEEP 32
END
DEF PRINT_BEST
IF PT%[MN]==0 THEN
BGSTR 5,14," NOT CLEARED "
ELSE
BGSTR 5,14,"BEST TIME "+GET_TM$(PT%[MN])
ENDIF
END
' GENERATE PUZZLE PATTERN
DEF SETUP_PZL
DIM I,J
DIM SP=PZ[MN] DIV 4
DIM TH=(PZ[MN] MOD 4)*300+885
' BINARIZATION
DIM X,Y,A,R,G,B
GPAGE 0,4
X=(SP MOD 32)*16
Y=(SP DIV 32)*16
FOR I=0 TO 15:FOR J=0 TO 15
RGBREAD GSPOIT(J+X,I+Y) OUT A,R,G,B
PT[J,I]=A>0 && B+R*3+G*6<TH
NEXT:NEXT
' ADJUST OFFSET
DIM CT,CB,CL,CR
FOR I=0 TO 15
CT=CT+PT[I,0]:CB=CB+PT[I,15]
NEXT
PY=CT<CB
FOR I=PY TO PY+14
CL=CL+PT[0,I]:CR=CR+PT[15,I]
NEXT
PX=CL<CR
SPDEF 7,X+PX,Y+PY,15,15
' HINTS
FOR I=0 TO 14
HR$[I]=GET_HINT$(PT,PX,PY+I,0)
HC$[I]=GET_HINT$(PT,PX+I,PY,1)
NEXT
END
' DRAW PUZZLE SCREEN
DEF DRAW_PZL A
GPAGE 0,5
FH=MN DIV 15/12
' RESET MARKS
DIM I,J
FM=0:TM=0
FOR I=0 TO 14:FOR J=0 TO 14
FD[J,I]=0
FM=FM+!PT[J+PX,I+PY]
NEXT:NEXT
' FRAME & MATRIX
DIM Z,C
GFILL 4,244,234,474,HSV(FH,.125,1)
FOR Z=1 TO 5 STEP 4
C=HSV(FH,.25,.875-Z/16)
FOR I=0 TO 14 STEP Z
GLINE 4,I*10+324,234,I*10+324,C
GLINE I*10+84,244,I*10+84,474,C
NEXT:NEXT
GBOX 4,244,234,474,C
GFILL 4,244,83,323,0
' PUZZLE NUMBER
I=MN DIV 15+1:J=MN MOD 15+1
BGSTR 30,1,FORMAT$("%2D-%-2D",I,J)
DRAW_TM 16,288,"00:00",#BLACK
IF PT%[MN]>0 THEN
DRAW_TM 16,304,GET_TM$(PT%[MN]),#GRAY
ENDIF
' HINTS
FOR I=0 TO 14
Z=HR$[I]==CHR$(192)
DRAW_HINT_R I,HR$[I],HSV(FH,.75-Z/2,.5+Z/4)
Z=HC$[I]==CHR$(192)
DRAW_HINT_C I,HC$[I],HSV(FH,.75-Z/2,.5+Z/4)
NEXT
IF A THEN
' MARKS
GFILL 32,480,51,489,HSV(FH,.125,1)
GFILL 52,480,61,489,HSV(FH,1,.5)
C=HSV(FH,.25,.75)
GLINE 35,483,39,487,C
GLINE 39,483,35,487,C
GFILL 0,480,14,494,#WHITE
' SCROLL IN
Z=0
FOR I=0 TO 29
BGMVOL 58-I*2
Z=(Z*4+401)/5:BGOFS 0,Z,0:VSYNC
NEXT
' SPRITES
SPSET 0,0
SPSET 1,4:IF PC<5 THEN EY=280
SPSET 2,2:SPCOLOR 2,&H30FFFFFF
SPSET 3,3:SPCOLOR 3,&H30FFFFFF
ENDIF
END
' PLAY PUZZLE
' MAIN LOOP
DEF PLAY_PZL
DIM CX,CY,MK,MD=-3
DIM BT,VX,VY,VZ
REPEAT
BT=BUTTON(0)
' CURSOR
GET_PAD OUT VX,VY
IF CX+VX<0||CX+VX>14||CY+VY<0||CY+VY>14THEN
IF BT AND #A+#B THEN VX=0:VY=0
ENDIF
CX=(CX+VX+15) MOD 15
CY=(CY+VY+15) MOD 15
VZ=VX || VY
SPOFS 0,CX*10+165,CY*10+85
SPOFS 2,165,CY*10+85
SPOFS 3,CX*10+165,85
' MARK
IF BT AND #A+#B THEN
IF MD==-2 THEN
IF BT AND #A THEN
MD=FD[CX,CY]:MK=!MD
ELSEIF BT AND #B THEN
MD=FD[CX,CY]:MK=-!MD
ENDIF
ENDIF
IF FD[CX,CY]==MD THEN
SET_MARK CX,CY,MK:VZ=0
ENDIF
ELSE
MD=-2
ENDIF
IF VZ THEN BEEP 9
' ETC
IF TM MOD 60==0 THEN
DRAW_TM 16,288,GET_TM$(TM),#BLACK
ENDIF
TM=TM+1
BT=BUTTON(2)
IF BT AND #X THEN BEEP 37:DRAW_PZL 0
IF BT AND #Y THEN BEEP 4
VSYNC
UNTIL BT AND #Y || FM==225
SPCLR
END
' SET/REMOVE MARK
DEF SET_MARK X,Y,M
' CHECK MATRIX
FM=FM-IS_MATCH(X,Y)
FD[X,Y]=M
FM=FM+IS_MATCH(X,Y)
' DRAW MARK
DIM P=42+M*10
GCOPY P+1,481,P+9,489,X*10+85,Y*10+325,1
GPSET X,480+Y,HSV(0,0,1-(M==1)/8)
' UPDATE HINT COLOR
DIM Z,T
Z=HR$[Y]==GET_HINT$(FD,0,Y,0):T=T || Z
DRAW_HINT_R Y,HR$[Y],HSV(FH,.75-Z/2,.5+Z/4)
Z=HC$[X]==GET_HINT$(FD,X,0,1):T=T || Z
DRAW_HINT_C X,HC$[X],HSV(FH,.75-Z/2,.5+Z/4)
' SOUND
IF M==1 THEN BEEP 95:IF T THEN BEEP 54
IF M==0 THEN BEEP 59
IF M==-1 THEN BEEP 47
END
DEF IS_MATCH(X,Y)
RETURN PT[X+PX,Y+PY]==(FD[X,Y]>0)
END
' CLEAR PUZZLE
DEF CLEAR_PZL
DIM BT,VX,VY
BEEP 38
' STORE BEST TIME
IF PT%[MN]==0 THEN
PC=PC+1:PT%[MN]=TM
SET_THUMB MN,1
ELSEIF PT%[MN]>TM THEN
PT%[MN]=TM
ENDIF
' FADE IN
WAIT 60
SPSET 0,7:SPCOLOR 0,&H00FFFFFF
SPOFS 0,164,84:SPSCALE 0,10,10
SPANIM 0,"C",-60,#WHITE
SPSET 1,6:IF PC<5 THEN EY=248
REPEAT
BT=BUTTON(2)
GET_PAD OUT VX,VY
VSYNC
UNTIL BT AND 240
SPCLR:BEEP 3
END
' FUNCTIONS
' PUT STRING ON BG
DEF BGSTR X,Y,S$
DIM I,L=LEN(S$)-1
FOR I=0 TO L
BGPUT 0,X+I,Y,ASC(MID$(S$,I,1))
NEXT
END
' SET THUMBNAIL OF PUZZLE
DEF SET_THUMB P,A
DIM H=P DIV 15/12
DIM PX=P MOD 15*16,PY=P DIV 15*16+80
DIM N=PZ[P] DIV 4
DIM NX=(N MOD 32)*16,NY=(N DIV 32)*16
GFILL PX,PY,PX+15,PY+15,HSV(H,.125,1)
IF A THEN
GCOPY 4,NX,NY,NX+15,NY+15,PX,PY,0
ELSE
GCOLOR HSV(H,.25,.75)
GPUTCHR PX+4,PY+4,P MOD 15+193
ENDIF
GBOX PX,PY,PX+15,PY+15,HSV(H,.25,.625)
END
' HANDLE D-PAD & CIRCLE PAD
DEF GET_PAD OUT VX,VY
DIM BX,BY,BT=BUTTON(0)
STICK OUT BX,BY
VX=(BT AND 8 || BX>.5)-(BT AND 4 || BX<-.5)
VY=(BT AND 2 || BY<-.5)-(BT AND 1 || BY>.5)
BP=(BP+1)*(VX || VY)
IF BP==15 THEN
BP=BP-2
ELSEIF BP>1 THEN
VX=0:VY=0
ENDIF
IF PC>=3 &&(BT || BP) THEN EY=420
EY=EY-(EY>240):SPOFS 1,320,EY
END
' GET HINT STRING
DEF GET_HINT$(A[],X,Y,D)
DIM I,C,P,H$
FOR I=0 TO 14
IF D THEN P=A[X,Y+I] ELSE P=A[X+I,Y]
IF P==1 THEN
C=C+1
ELSE
IF C>0 THEN H$=H$+CHR$(C+192)
C=0
ENDIF
NEXT
IF C>0 || H$=="" THEN H$=H$+CHR$(C+192)
RETURN H$
END
' DRAW HINT OF ROW
DEF DRAW_HINT_R Y,H$,C
DIM I,L=LEN(H$)-1
Y=Y*10+325
FOR I=0 TO L
GPUTCHR 75+(I-L)*10,Y,H$[I],C
NEXT
END
' DRAW HINT OF COLUMN
DEF DRAW_HINT_C X,H$,C
DIM I,L=LEN(H$)-1
X=X*10+85
FOR I=0 TO L
GPUTCHR X,315+(I-L)*10,H$[I],C
NEXT
END
' GET TIME STRING
DEF GET_TM$(T)
DIM M=T DIV 3600
DIM S=T DIV 60 MOD 60
IF M>=100 THEN M=99:S=59
RETURN FORMAT$("%02D:%02D",M,S)
END
' DRAW TIME STRING
DEF DRAW_TM X,Y,S$,C
DIM I,L=LEN(S$)-1,A
GFILL X,Y,X+L*10+7,Y+7,0
FOR I=0 TO L
A=ASC(MID$(S$,I,1))
A=A+144+(A==45)*19+(A==58)*7
GPUTCHR X+I*10,Y,A,C
NEXT
END
' HSV2RGB
DEF HSV(H,S,V)
DIM I,F,P,Q,T:I=FLOOR(H*6)
F=H*6-I:V=V*255:P=V*(1-S)
Q=V*(1-F*S):T=V*(1-(1-F)*S)
IF I==0 THEN RETURN RGB(V,T,P)
IF I==1 THEN RETURN RGB(Q,V,P)
IF I==2 THEN RETURN RGB(P,V,T)
IF I==3 THEN RETURN RGB(P,Q,V)
IF I==4 THEN RETURN RGB(T,P,V)
RETURN RGB(V,P,Q)
END
' INITIALIZE
DEF INIT
ACLS
IF CHKFILE(SV$) THEN
LOAD SV$,PT%,0
PC=PT%[150]:MN=PT%[151]
ENDIF
INIT_FONT
INIT_PZL
INIT_SPRITE
INIT_BG
IF PC==0 THEN WAIT 120
BGMVOL 0:BGMPLAY 26
END
' GLYPHS FOR HINT NUMBER
DEF INIT_FONT
DIM I,X,Y,F$,P,P$
FOR I=0 TO 17
F$="":READ P$
FOR Y=0 TO 7
P=VAL("&H"+MID$(P$,Y*2,2))
FOR X=0 TO 7
F$=F$+"0F"[P>>(7-X) AND 1]*4
NEXT:NEXT
FONTDEF I+192,F$
NEXT
END
' PUZZLE INFORMATION
DEF INIT_PZL
DIM I,J,P$
FOR I=0 TO 14
READ P$
FOR J=0 TO 9
PZ[I*10+J]=VAL("&H"+MID$(P$,J*3,3))
NEXT:NEXT
END
' SPRITE IMAGES
DEF INIT_SPRITE
DIM I,J,X,Y,S,P$
GPAGE 0,4
GFILL 384,384,511,511,0
' CURSOR
FOR I=0 TO 1
X=I*16+384:Y=384:S=13+I*7
FOR J=0 TO I+1
GBOX X+J,Y+J,X+S-J-1,Y+S-J-1,#RED
NEXT
SPDEF I,X,Y,S,S,2,2
NEXT
' HIGHLIGHT
GFILL 432,384,510,392,#RED
SPDEF 2,432,384,79,9,80,0
SPDEF 3,432,384,79,9,0,80,#SPSHOW+#SPROT90
' INSTRUCTION
EY=420:I=4:S=0
FOR J=0 TO 11
READ P$:Y=400+J*8
IF P$=="" THEN
SPDEF I,432,Y-S,80,S,0,S:I=I+1:S=0
ELSE
GPUTCHR 432,Y,P$,#GRAY:S=S+8
ENDIF
NEXT
END
' BG IMAGES
DEF INIT_BG
DIM I,J,C,X,Y,P$
BGSCREEN 0,50,15
BGSCREEN 1,28,22
' SCROLLING BACKGROUND
GPAGE 0,5
GFILL 0,480,31,495,HSV(0,0,15/16)
GFILL 1,481,15,495,HSV(0,0,13/16)
GFILL 0,480,14,494,#WHITE
BGFILL 1,0,0,27,21,961
FOR I=0 TO 20 STEP 2:FOR J=0 TO 24 STEP 4
BGPUT 1,J+I MOD 4,I,960
NEXT:NEXT
BGOFS 1,0,0,1024
BGANIM 1,"XY",1,48,95,-95,16,0,0
' PUZZLE SCREEN
BGOFS 0,400,0
GFILL 0,240,239,479,0
FOR I=0 TO 14:FOR J=0 TO 14
BGPUT 0,J+30,I,480+I*32+J
NEXT:NEXT
' AUTHOR INFORMATION
IF PC==0 THEN
FOR I=0 TO 3
READ P$
GPUTCHR (30-LEN(P$))*4,408+I*16,P$,#BLACK
NEXT
ENDIF
' BORDERED NUMBERS
GFILL 16,16,175,31,0
FOR I=1 TO 10:FOR J=0 TO 1
C=#BLACK OR #WHITE*J
FOR Y=J TO 2-J:FOR X=J TO 2-J
GPUTCHR I*16+X+3,Y+19,192+I,C
NEXT:NEXT:NEXT:NEXT
' GRADATION
FOR I=16 TO 47:FOR J=0 TO 511
IF GSPOIT(J,I)==#WHITE THEN
C=I MOD 16+J MOD 16
GPSET J,I,RGB(255-C*6,255-C*2,255)
ENDIF
NEXT:NEXT
' THUMBNAILS
FOR I=0 TO 149
SET_THUMB I,PT%[I]>0
NEXT
END
' DATA
' GLYPHS FOR HINT NUMBER
DATA "7EFFC3C3C3C3FF7E","1838381818183C3C"
DATA "7EFFC70E3C70FFFF","7EFFC31E1FC3FF7E"
DATA "3E7EE6C6FFFF0606","FFFFC0FEFF03FFFE"
DATA "3C7CE0FEFFC3FF7E","FFFF03070E1C1818"
DATA "7EFFC37EFFC3FF7E","7EFFC3FF7E0E1C38"
DATA "CEDFDBDBDBDBDFCE","C6C6C6C6C6C6C6C6"
DATA "CEDFD3C7CEDCDFDF","CEDFD3C6C7D3DFCE"
DATA "C7CFDBD3DFDFC3C3","DFDFD8DEDFC3DFCE"
DATA "0000007E7E000000","0018180000181800"
' PUZZLE INFORMATION
DATA "3832421501E925B00128424D36D245"
DATA "65394590E02304A2CF3661640763C2"
DATA "2217ED2C30641CA7E29571A189F926"
DATA "90393268F6B30111C668B94E00F007"
DATA "01D5FF1E093C2002A262F2A713404E"
DATA "04705E23375D1F72C72725A003F4A5"
DATA "62B8C214C5494B30191605E38420D0"
DATA "53360A12888E67266A008394746027"
DATA "3D711C5F361270B4C938A6A32C92B1"
DATA "1101445760FC2060E01A98A8551965"
DATA "02F09826F0735B05830CC482353647"
DATA "8AD70F7528951681EF5C229488276C"
DATA "10094906B593063039529762512BCE"
DATA "1481BB28BB07872183BAF5D37241FB"
DATA "56AD578B38EB8BF78E6CA01722B19F"
' INSTRUCTION
DATA " カーソルいどう"," ぬる/けす"," マーク/けす"
DATA " しょきか" ," パズルせんたく",""
DATA " カーソルいどう"," けってい"," セーブ",""
DATA " もどる","","SPRITE ILLUST-LOGIC",""
DATA "2016.1.30 Programmed by OBONO"
DATA "http://d.hatena.ne.jp/OBONO/"
' EOF