日付によってランダムに攻撃パターンが決まる敵編隊を、バリバリと撃破していくシューティングゲームです。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