日付によってランダムに攻撃パターンが決まる敵編隊を、バリバリと撃破していくシューティングゲームです。This is a shoot'em up game. The pattern of enemies' attack is generated randomly depending on current date.
スライドパッドか十字キーで自機移動、Aボタンでショット、Bボタンでタイトル画面に戻ります。Your ship moves by circle pad or D-pad, and shoots by A button. You can go back to title screen by B button.
ランク(難易度)は、プレイの結果で自動的に変化します。Game rank (difficulty) is adjusted automatically according to your play result.
スコアを90以上取ると、明日はランクが1上がります。逆に、過去3日間にスコアが50以上の記録が無いと、ランクが1下がります。It will increase by 1 tomorrow if you get over 90 points. It decreases by 1 if you didn't get over 50 points in recent 3 days.
終了時に必ずセーブするようにしましょう。(タイトル画面でYボタン)You should save the record when you quit this program. (Press Y button in title screen.)
※キャラクター生成に Pixel Sprite Generator のアルゴリズムを利用しています。※This program uses Pixel Sprite Generator for character generation.
| BP | 各種ボタンの状態(押された瞬間) |
| BT | 各種ボタンの状態 |
| BX,BY | スライドパッドの状態 |
| DQ | 3日前の日付パラメータ |
| DT | 今日の日付パラメータ |
| EA | 敵機の総数 |
| EC[] | 敵機の種類ごとの数 |
| EM[] | 敵機の移動/弾幕タイミング調整値 |
| EX[],EY[] | 敵機の移動範囲の中心座標 |
| FI | 敵弾発射処理のスプライト番号決定用 |
| FT | 弾発射処理制御用(0:敵弾, 1:自機弾) |
| GA | ゲーム状態(0:タイトル画面, 1:ゲーム中, 2:クリア状態) |
| HD | プレイ日数 |
| HF$ | プレイ履歴を保存するファイル名 |
| HS%[] | プレイ履歴情報 |
| PD | ミスしたか |
| PF | 自機弾発射処理のスプライト番号決定用 |
| PH | 自機の移動速度上限 |
| PR | 自機の移動量調整用 |
| PS | 自機のショット調整用 |
| PV,PW | 自機の移動方向 |
| PX,PY | 自機の座標 |
| RK | ランク |
| SC | スコア |
| SH | 今日のハイスコア |
| TA[] | 敵編隊の敵機登場間隔 |
| TC[] | 敵編隊の色 |
| TF[] | 敵編隊の弾の発射回数 |
| TH[] | 敵編隊の弾の速度 |
| TK[] | 敵編隊の弾の発射間隔 |
| TL[] | 敵編隊の弾幕の発射周期 |
| TN[] | 敵編隊の弾の同時発射数 |
| TP[] | 敵編隊の弾の汎用パラメータ |
| TT[] | 敵編隊の種類 |
| TVR[],TWR[] | 敵編隊の移動範囲 |
| TVS[],TWS[] | 敵編隊の移動速度 |
| TZ[] | 敵編隊の弾の制御パラメータ |
| TM | ゲーム経過時間 |
| VE$ | リリース年月日 |
| WZ$[] | 初回プレイ時の説明文 |
'
' TXT:1MIN_STG Programmed by OBONO
'
DIM TC[20],TT[20],TL[20],TA[20],TK[20]
DIM TF[20],TH[20],TN[20],TP[20],TZ[20]
DIM TVR[20],TVS[20],TWR[20],TWS[20]
DIM EM[100],EX[100],EY[100],EC[6]
DIM HS%[32],WZ$[2]
VE$="2015.01.23":GOSUB @IN
' MAIN LOOP
@MN
BT=BUTTON():BP=BUTTON(2):STICK OUT BX,BY
GOSUB @EN
IF GA THEN
IF TM>=-60 && GA==1 THEN GOSUB @MP:GOSUB @MB
IF TM>=0 THEN GOSUB @MS
IF BP==32 THEN BGMSTOP:BEEP 4:GOSUB @GT
IF !EA && TM==3600 && GA==1 THEN GOSUB @GC
IF PD && GA==1 THEN GOSUB @GV
ELSE
IF BP==16 THEN GOSUB @GS
IF BP==128 THEN GOSUB @GE
ENDIF
TM=TM+(TM<3600):VSYNC 1:GOTO @MN
@MP ' CONTROL PLAYER
PV=((BT AND 8)/8-(BT AND 4)/4+BX)*PH
PW=((BT AND 2)/2-(BT AND 1) -BY)*PH
PR=SQR(PV*PV+PW*PW)
IF PR>PH THEN PV=PV/PR*PH:PW=PW/PR*PH
PX=MIN(MAX(PX+PV,12),308)
PY=MIN(MAX(PY+PW,252),468):SPOFS 20,PX,PY
IF BT AND 16 && PS<6 THEN PS=PS+12
PS=PS-(PS>0):IF PS MOD 3==2 THEN
Z=(4-PS DIV 3 MOD 4)/16:FT=1
FIRE_W &HFFC0C0C0,PX,PY,PI(),8,3,Z:FT=0
ENDIF:RETURN
@MB ' CHECK BULLETS
Z=0
FOR I=192 TO 511
S=SPHITSP(I):IF S<0 || S>20 THEN CONTINUE
SPOFS I,-8,0:IF I>=256 THEN PD=1:BREAK
P=SPVAR(S,7)-1:SPVAR S,7,P:Z=1
IF !P THEN
SPANIM S,"I",1,22,-8,30:SPCOL S,,0
ENCNT TT[SPVAR(S,0)],-1:INC SC:BEEP 120,,96
ENDIF
NEXT:IF Z THEN BEEP 31,,32
RETURN
@MS ' DISPLAY SCORE & TIME
IF !TM THEN BGCLR 2
M=TM DIV 3600:S=TM MOD 3600/60
BGSTR 2,13,0,FORMAT$("%D:%05.2F",M,S),0
BGSTR 2,0,0,"SCORE "+STR$(SC),0:RETURN
' MANAGE ENEMIES
@EN
IF TM<3600 && TM MOD 180==0 THEN GOSUB @EE
FOR S=0 TO 19:IF SPVAR(S,7) THEN GOSUB @EC
NEXT:RETURN
@EE ' ENTER 5 ENEMIES
G=TM DIV 180
FOR I=0 TO 4
J=G*5+I:S=J MOD 20
SPSET S,G+1:SPCOLOR S,TC[G]
SPCOL S,-12,-12,24,24,,0
SPVAR S,0,G:SPVAR S,1,EM[J]
SPVAR S,2,EX[J]:SPVAR S,3,EY[J]
SPVAR S,4,0:SPVAR S,5,0
SPVAR S,6,-I*TA[G]:SPVAR S,7,12
NEXT:RETURN
@EC ' CONTROL A ENEMY
G=SPVAR(S,0):M=SPVAR(S,1):E=SPVAR(S,6)
X=SPVAR(S,2)+COS(TVS[G]*(E+M))*TVR[G]
Y=SPVAR(S,3)+SIN(TWS[G]*(E+M))*TWR[G]
IF E==0 THEN
SPANIM S,"S",1,12,0,-11,2,2,1
SPSTART S:SPSHOW S:SPCOL S,,1
SPVAR S,4,ATAN(PX-X,PY-Y)
ENCNT TT[G],1:IF GA THEN BEEP 126
ENDIF
IF E==480 THEN
SPANIM S,"S",-12,12,0,1:SPCOL S,,0
ENCNT TT[G],-1
ENDIF
IF GA && E>0 && E<480 THEN
L=(E+M) MOD TL[G]
IF L MOD TK[G]==0 THEN
T=L DIV TK[G]:IF T<TF[G] THEN GOSUB @ET
ENDIF
ENDIF
SPOFS S,X,Y:SPVAR S,6,E+1:RETURN
@ET ' SHOOT BULLETS
D=ATAN(PX-X,PY-Y):C=TC[G]
H=TH[G]:N=TN[G]:P=TP[G]:Z=TZ[G]
ON TT[G] GOTO @ET0,@ET1,@ET2,@ET3,@ET4,@ET5
@ET0 ' RED
IF !T THEN SPVAR S,4,D ELSE D=SPVAR(S,4)
FIRE_K C,X,Y,D,H,N,P:RETURN
@ET1 ' YELLOW
FIRE_I C,X,Y,D,H,N,P:RETURN
@ET2 ' GREEN
D=D*Z
FIRE_K C,X,Y,D,H,N,P:RETURN
@ET3 ' CYAN
IF !T THEN SPVAR S,4,D ELSE D=SPVAR(S,4)
D=D+Z*(T-(TF[G]-1)/2)
FIRE_I C,X,Y,D,H,N,P:RETURN
@ET4 ' BLUE
D=D*Z:N=MAX(N-T MOD 2,1)
FIRE_W C,X,Y,D,H,N,P:RETURN
@ET5 ' MAGENTA
H=MAX(H+Z*(T-(TF[G]-1)/2),1)
P=P*(TF[G]-T)/TF[G]
FIRE_W C,X,Y,D,H,N,P:RETURN
' SCREENS
@GT ' TITLE
IF SH<SC THEN INC HS%[1],SC-SH:SH=SC
CLS:BGCLR 2:BGCLR 3:COLOR 15
BGSTR 2,3,2,"HISTORY RECORD",0
LOCATE 7,7,-1:? "DAY DATE RANK SCORE"
FOR I=0 TO 15
IF HS%[I*2] THEN
Z$=DTFMT$(HS%[I*2]):H=HS%[I*2+1]
D=H>>16:R=H>>8 AND 255:S=H AND 255
S$=FORMAT$("%-5D%S %-5D%-3D",D,Z$,R,S)
ELSE
S$="- ----.--.-- - -"
ENDIF
LOCATE 7,I+9:? S$
NEXT:COLOR 14
LOCATE 5,57:? VE$+" Programmed by OBONO"
LOCATE 6,58:? "http://d.hatena.ne.jp/OBONO/"
BGSTR 3,1,8,"1 MINUTE",2
BGSTR 3,1,9,"SHOOTING",2
S$=FORMAT$("DAY %-4DRANK %-2D",HD,RK)
BGSTR 2,3,22,S$,1
BGSTR 2,6,23,"SCORE "+STR$(SH),1
BGSTR 2,4,24,"("+DTFMT$(DT)+")",0
BGSTR 2,3,26,"[A] START GAME",0
BGSTR 2,3,27,"[Y] SAVE & EXIT",0
GA=0:RETURN
@GS ' GAME START
CLS:BGCLR 2:BGCLR 3:SPCLR:BEEP 119
IF HD==1 && !SH THEN
FOR I=0 TO 1:DIALOG WZ$[I],!I*5,"はじめに":NEXT
ENDIF
FOR I=0 TO 19:SPVAR I,7,0:NEXT
SPSET 20,0:SPSCALE 20,2,2
SPANIM 20,"XY",1,160,480,-60,160,450
SPCOL 20,-2,-2,4,4,,2:SPSTART 20
FOR I=192 TO 511
SPSET I,21:SPOFS I,-8,0
SPSCALE I,2,2:SPCOL I,-2,-2,4,4,,2-(I<256)
NEXT
BGSTR 2,7,20,"READY?",0
PX=160:PY=450:PS=0:PF=0:PH=4+RK/4:PD=0
FI=0:SC=0:EA=0:TM=-120:BGMPLAY 128
FOR I=0 TO 5:EC[I]=0:BGMVAR 0,I,80:NEXT
GA=1:RETURN
@GV ' MISS
BGSTOP:SPSTOP:SPANIM 20,"I",1,22,-8,30
SPSTART 20:BGMSTOP:BEEP 124,,127:WAIT 120
BGSTART:SPSTART:GOSUB @GT:RETURN
@GC ' CLEAR
BGSTR 3,2,9,"CLEAR!",2
BGSTR 2,3,23,"YOUR SCORE IS",1
BGSTR 3,3,12,FORMAT$("%3D",SC),1
BGSTR 2,5,27,"PRESS [B]",0
SPANIM 20,"XY+",-480/PH,0,-480
BGMSTOP:BEEP 89:GA=2:RETURN
@GE ' SAVE & EXIT
BGSTOP:SPSTOP:SAVE HF$,HS%:Z=RESULT
IF Z!=1 THEN
Z$=CHR$(&H7D42)+CHR$(&H4E86)
Z=DIALOG("セーブしないで"+Z$+"しますか?",1,"ゲーム"+Z$)
ENDIF
IF Z==1 THEN ACLS:END
BGSTART:SPSTART:RETURN
' FUNCTIONS
DEF BGSTR _P,_X,_Y,_S$,_C
DIM _I:FOR _I=0 TO LEN(_S$)-1
BGPUT _P,_X+_I,_Y,ASC(MID$(_S$,_I,1))+_C*64
NEXT
END
DEF DTVAL(_Y,_M,_D)
RETURN _Y<<9 OR _M<<5 OR _D
END
DEF DTFMT$(_Z)
DIM _Y=_Z>>9,_M=_Z>>5 AND 15,_D=_Z AND 31
RETURN FORMAT$("%04D.%02D.%02D",_Y,_M,_D)
END
DEF ENCNT _T,_Z
INC EA,_Z:INC EC[_T],_Z
BGMVAR 0,_T,MIN(80+EC[_T]*8,120)
END
DEF FIRE _C,_X,_Y,_D,_H
DIM _F,_V=SIN(_D)*800,_W=COS(_D)*800
IF FT THEN
_F=PF+192:PF=(PF+1)MOD 64
ELSE
_F=FI+256:FI=(FI+1)MOD 256
ENDIF
SPOFS _F,_X,_Y:SPCOLOR _F,_C
SPANIM _F,"XY+",-800/_H,_V,_W,1:SPSTART _F
END
DEF FIRE_I _C,_X,_Y,_D,_H,_N,_P
DIM _I:DEC _N:FOR _I=0 TO _N
FIRE _C,_X,_Y,_D,_H-_P*_I
NEXT
END
DEF FIRE_W _C,_X,_Y,_D,_H,_N,_P
DIM _I:DEC _N:FOR _I=-_N/2 TO _N/2
FIRE _C,_X,_Y,_D+_P*_I,_H
NEXT
END
DEF FIRE_K _C,_X,_Y,_D,_H,_N,_P
DIM _I,_V=-COS(_D)*_P,_W=SIN(_D)*_P
DEC _N:FOR _I=-_N/2 TO _N/2
FIRE _C,_X+_V*_I,_Y+_W*_I,_D,_H
NEXT
END
' INITIALIZE
@IN
ACLS:XSCREEN 4:GOSUB @IH:GOSUB @IB
RANDOMIZE 0,DT:GOSUB @IS:GOSUB @IE:GOSUB @IW
BGMSETD 128,"@IM":GOSUB @GT:RETURN
@IH ' HISTORY RECORD
HF$="DAT:"+PRGNAME$()+".SAV"
IF CHKFILE(HF$) THEN LOAD HF$,HS%,0
HD=HS%[1]>>16:RK=HS%[1]>>8 AND 255
DTREAD DATE$ OUT Y,M,D:DT=DTVAL(Y,M,D)
IF HS%[0]!=DT THEN
HD=HD+1:IF !RK THEN RK=4 'default+1
IF (HS%[1]AND 255)>=90 THEN RK=RK+1
D=D-3:IF D<1 THEN
M=M-1:IF !M THEN Y=Y-1:M=12
D=D+31-(M-(M<8))MOD 2
IF M==2 THEN D=D-2+!(Y MOD 4)
ENDIF:DQ=DTVAL(Y,M,D):I=0:Z=(RK>1)
WHILE Z && HS%[I]>=DQ
R=HS%[I+1]>>8 AND 255:S=HS%[I+1]AND 255
IF R!=RK || S>=50 THEN Z=0
I=I+2
WEND
RK=RK-Z:Z=POP(HS%)+POP(HS%)
UNSHIFT HS%,HD<<16 OR RK<<8:UNSHIFT HS%,DT
ENDIF
SH=HS%[1]AND 255:RETURN
@IB ' BG LAYER
GPAGE 0,5:GFILL 16,0,31,15,0
' BACKGROUND
H=(DT MOD 512-32)/384
FOR I=0 TO 15
GPSET I+16,I,HSL(H,.5,.4-I/48)
NEXT
FOR I=0 TO 1
BGSCREEN I,20,32:BGSCALE I,I+1,I+1
BGANIM I,"XY",1,0,31,-31,0,0,0
BGOFS I+2,0,0,-1
FOR J=0 TO 31:FOR K=0 TO 19
BGPUT I,K,J,K MOD 2+J MOD 2*2<<14 OR 1
NEXT:NEXT:NEXT:BGSCALE 3,2,2:BGSTART
' FONT
GCOPY 0,16,511,47,0,48,1
GCOPY 0,16,511,79,0,80,1
FOR I=0 TO 2:FOR J=0 TO 31:Y=I*32+J+16
C=HSL((I-.5)/3,I>0,1-(J MOD 16)/32)
FOR X=0 TO 511
GPSET X,Y,GSPOIT(X,Y) AND C
NEXT:NEXT:NEXT:RETURN
@IS ' SPRITE LAYER
GPAGE 0,4:GFILL 0,48,255,95,0
' SHIPS (0-20)
Z$= "000000000011000013000113000113001113"
Z$=Z$+"011122011122011122011113000111000000"
FOR I=0 TO 20
P$=GENPS$(Z$,6,12,1)
DRAWPS I*12,48,P$,12,12
SPDEF I,I*12,48,12,12,6,6,16-!I*15
NEXT
' BULLET (21)
GBOX 252,48,255,51,&HFF808080
GBOX 253,49,254,50,&HFFFFFFFF
SPDEF 21,252,48,4,4,2,2
' EXPLOSION (22-29)
FOR I=0 TO 99
D=RNDF(0)*PI()*2:R=RNDF(0)*15
EX[I]=COS(D)*R:EY[I]=SIN(D)*R
NEXT
FOR I=0 TO 7:FOR J=0 TO 99
R=1-POW(I-7,2)/64:C=255-I*16-J
GPSET I*32+16+EX[J]*R,80+EY[J]*R,RGB(C,C,C)
NEXT:SPDEF 22+I,I*32,64,32,32,16,16:NEXT
SPDEF 30,0,16,0:RETURN
@IE ' SET UP TODAY'S ENEMIES
FOR I=0 TO 19
H=RNDF(0):Q=RNDF(0)*.5+.75:L=FLOOR(120*Q)
TC[I]=HSL(H,RNDF(0)*.4+.2,1)
TT[I]=FLOOR(H*6+.5)MOD 6
TL[I]=L:TA[I]=RND(0,15)
V=RNDF(0)*72+12:W=RNDF(0)*36+12
TVR[I]=V:TVS[I]=(RNDF(0)*4)/V
TWR[I]=W:TWS[I]=(RNDF(0)*2)/W
Q=RK*Q:U=!RND(0,2)*RND(0,MAX(SQR(Q),1))+1
Q=FLOOR(Q/U):IF Q<1 THEN Q=1
ON TT[I] GOSUB @IE0,@IE1,@IE2,@IE3,@IE4,@IE5
TK[I]=RND(0,L/F/K)+3:TF[I]=F
TH[I]=(H+RNDF(0))*(RK/16+1)
TN[I]=N:TP[I]=P:TZ[I]=Z
FOR J=I*5 TO I*5+4
EM[J]=RND(0,65536)
EX[J]=RND(0,296-V*2)+12+V
EY[J]=RND(0,296-W*2)+12+W
NEXT:NEXT
RETURN
@IE0 ' RED
K=4:F=Q:H=3.5:N=U:P=RNDF(0)*8+8:RETURN
@IE1 ' YELLOW
K=2:F=U:H=4 :N=Q:P=RNDF(0)/N+.25:RETURN
@IE2 ' GREEN
K=1:F=U:H=2 :N=Q:P=RNDF(0)*16+8
Z=RNDF(0):RETURN
@IE3 ' CYAN
K=1:F=Q:H=2.5:N=U:P=RNDF(0)/N+.25
Z=(RNDF(0)+.5)*PI()/2/F*(RND(0)*2-1):RETURN
@IE4 ' BLUE
K=2:F=U:H=2 :N=Q:P=(RNDF(0)+.5)*PI()/2/N
Z=1-RNDF(0)*.25:RETURN
@IE5 ' MAGENTA
K=4:F=Q:H=3 :N=U:P=(RNDF(0)+.5)*PI()/4/N
Z=(RNDF(0)*3+1)/F:RETURN
@IW ' EXPLANATION
I=0:Z$=""
WHILE I<2
N=INSTR(Z$,"\")
IF N<0 THEN
INC WZ$[I],Z$:READ Z$
ELSE
INC WZ$[I],LEFT$(Z$,N)
J=ASC(MID$(Z$,N+1,1))-32:J=J-(J>95)*12225
K=ASC(MID$(Z$,N+2,1))-32:K=K-(K>95)*12225
C=J*256+K:Z$=RIGHT$(Z$,LEN(Z$)-N-3)
IF !C THEN I=I+1 ELSE INC WZ$[I],CHR$(C)
ENDIF
WEND:RETURN
DATA "1 MINUTE SHOOTING にようこそ!\ -\ -このプログラムは"
DATA "、\うテ\nスによってランダムに\う[\ぅつパターンが\きせまる\うざ\ぞド"
DATA "\ぷにを、バリバリと\ぅつ\すTしていくシューティングゲームです。\ -"
DATA "\ -スライドパッドか\sa\{wキーで\ぢニ\か\\ずボ\rザ、Aボタンで"
DATA "ショット、Bボタンでタイトル\ざ[\へぃに\ぃ[ります。\ ランク(\ぷツ"
DATA "\ぇ3\~ょ)は、プレイの\ぞp\えぽで\ぢニ\rザ\しづに\y)\s6しま"
DATA "す。\ -スコアを90\nテ\n*\sシると、\ぇ.\うテはランクが1\n*"
DATA "がります。\ぱ&に、\ぱn\s゜3\うテ\ぶぴにスコアが50\nテ\n*の"
DATA "\に8\ぴRが\げAいと、ランクが1\n+がります。\ -\ -\ぞb\nで"
DATA "\ぇbに\\ウずセーブするようにしましょう。(タイトル\ざ[\へぃでYボタン"
DATA ")\ "
@IM ' MML DATA
DATA "T180:0@129O2L8[V$0CEC16C16E]"
DATA ":1@129O3L4[[V$1D+]7V$1D+8D+8]"
DATA ":2@37L8O3[[V$2>A<A>A<G>A<F>A<E]3"
DATA "V$2CACGDFDE]"
DATA ":3@26O3[[V$3L8AAA16A.]7V$3AAL16AAGG]"
DATA ":4@94O4L1[V$4CV$4>B<V$4CV$4D]"
DATA ":5@32O4L16[V$5>A<CEA]",0
' PIXEL SPRITE GENERATOR
'Copyright © 2014 Zelimir Fedoran
'Released under the MIT license
'http://opensource.org/licenses/MIT
DEF GENPS$(_P$,_W,_H,_A)
DIM _P[_W*(_A MOD 2+1),_H*(_A DIV 2+1)]
DIM _I,_J,_T,_Z$
FOR _I=0 TO _H-1:FOR _J=0 TO _W-1
_T=VAL(MID$(_P$,_I*_W+_J,1))
IF _T<3 THEN _T=RND(0,2)*_T+(_T>1)
_P[_J,_I]=_T
NEXT:NEXT
IF _A MOD 2 THEN
FOR _I=0 TO _H-1:FOR _J=_W TO _W*2-1
_P[_J,_I]=_P[_W*2-_J-1,_I]
NEXT:NEXT:_W=_W*2
ENDIF
IF _A DIV 2 THEN
FOR _I=_H TO _H*2-1:FOR _J=0 TO _W-1
_P[_J,_I]=_P[_J,_H*2-_I-1]
NEXT:NEXT:_H=_H*2
ENDIF
FOR _I=0 TO _H-1:FOR _J=0 TO _W-1
IF _P[_J,_I]==1 THEN
IF _I>0 &&!_P[_J,_I-1]THEN _P[_J,_I-1]=3
IF _I<_H-1&&!_P[_J,_I+1]THEN _P[_J,_I+1]=3
IF _J>0 &&!_P[_J-1,_I]THEN _P[_J-1,_I]=3
IF _J<_W-1&&!_P[_J+1,_I]THEN _P[_J+1,_I]=3
ENDIF
NEXT:NEXT
FOR _I=0 TO _H-1:FOR _J=0 TO _W-1
_Z$=_Z$+STR$(_P[_J,_I])
NEXT:NEXT
RETURN _Z$
END
DEF DRAWPS _X,_Y,_P$,_W,_H
DIM _I,_J,_D,_L,_T,_A=RND(0,2)
FOR _I=0 TO _H-1:FOR _J=0 TO _W-1
IF _A THEN _D=(_I+.5)/_H ELSE _D=(_J+.5)/_W
_L=(SIN(_D*PI())*.6+RNDF(0)*.3+.1)*255
_T=VAL(MID$(_P$,_I*_W+_J,1))
IF _T==3 THEN _L=_L*.3
IF _T THEN GPSET _X+_J,_Y+_I,RGB(_L,_L,_L)
NEXT:NEXT
END
DEF HSL(_H,_S,_L)
DIM _I,_F,_P,_Q,_T:_I=FLOOR(_H*6)
_F=_H*6-_I:_L=_L*255:_P=_L*(1-_S)
_Q=_L*(1-_F*_S):_T=_L*(1-(1-_F)*_S)
IF _I==0 THEN RETURN RGB(_L,_T,_P)
IF _I==1 THEN RETURN RGB(_Q,_L,_P)
IF _I==2 THEN RETURN RGB(_P,_L,_T)
IF _I==3 THEN RETURN RGB(_P,_Q,_L)
IF _I==4 THEN RETURN RGB(_T,_P,_L)
RETURN RGB(_L,_P,_Q)
END
' EOF