=== hanabi.def v0.62 === 25-10-10 hitoさんの paint.defと JUNさんの 花火.defと 和生さんの BRIGHT.DEFを合体した 連続打ち上げ花火マクロです。PC98 または DOSV で動きます。 起動すると一時ファイルを開いてその中で打ち上げ花火が上がります。 動作中 0〜9 の数字入力で速度調整できます。 速度調整やタイマーの設定は ★★ のある行を変更します。 [ESC] 又は 'Q' で終了します。 konno *M 70 ^\ "hanabi" ?. (wt)? { #Y >^ } ; (s||wt)?. ;single only (mb)? #b &07 ;push hh1, ; ★★ 速度調整wait 0〜 qq0, ; ★★ qq0:連続 qq1 〜 Play秒数 ;---------------------------------------------------------------------------- ax=$2C00, &i($21) rn=cx+dx, ; 日付・時間でrandomize tt=(dx>>8)+(cx%256)*60, ; timer u"*☆●◆■★◎・〇", ;全角指定文字 限定 6 (wy<=16)? u"*☆●◆★■◎・〇", ;全角指定文字 限定 6 (wy<=12)? u"☆●◆★■◎・〇●", ;全角指定文字 限定 6 #if 98 aa"!;<>=|+*", ;半角指定文字 限定 6 ee"$(21,41,61,81,a1,c1,25,45,65,85,a5,c5)",;青,赤,紫,緑,空,黄,・・反転 cc"$(21,41,61,81,a1,c1,21,41,61,81,a1,c1)",;青,赤,紫,緑,空,黄, ; _1 normal _5 reverse ;12 の指定文字に対応 dd"$(1f,1d)", ;[EOL][EOF] ; ↓ ← ;vz.def *Else 10 #elseif DOSV aa";<|!>=+*", ;半角指定文字 限定 6 ; cc"$(19,1a,1b,1c,1d,1e,91,a1,b1,c1,d1,e1)",;青,緑,空,赤,紫,黄,・・反転 ee"$(10,1a,1b,1c,1d,1e,91,a0,b1,c1,d1,e1)",;青,緑,空,赤,紫,黄,・・反転 cc"$(10,1a,1b,10,11,1e,09,0a,0b,0c,0d,0e)",;青,緑,空,赤,紫,黄, ; 青 緑 空 桃 紫 黄 ;背景 bit7 輝度 6-4 色, 文字 bit3 輝度, ;12 の指定文字に対応 dd"$(1b,1f)", ;[EOL][EOF] ; ↓ ← ;vz.def *Else 10 ; d"$(07,1f)",;my_cust #endif &s #R &?("%shanabi.tmp",pi) #m ; テンポラリファイルオープン mr+, #if kVZ op[-, ; インジケータoff DOSVAXJ3用 #endif #39 #n #18 ;画面作成 (78){' '} #m &d #e #k (wy+1){ #p } #i jj=mg.-9, &j(0) #^ &d #] ; IME off ps=pa, &d (wy<=23)?{ ; ======== ステータスライン消し ======== wa.54=0, #] ; テキスト上端を上げ #85 再描画 wa.56=lc, wa.57=lc-1, ; FKEYラインを下げて消す &d } :s &61 r..0=(vp..13 * wa.54 + wa.53) * 2, ;vp..13 物理的な画面の横幅 ;wa.54 左隅の絶対Y位置 wa.53 左隅の絶対X位置 r..1=vp..1, ; vp..1 カーソル位置のsegment r..2=vp..14, ;doswd2 画面1行のバイト数 r.6=wa.55, ;wx tw_sx r[, &Sc(r+8,aa) r], ;brt_chr_a~f &Sc(r+38,dd) ;[EOL][EOF] &v(0) o-, ; LOOP oo-, ; 左右振り分け t5, ; size v=-1, ; loop1回目スルー ff-, ; fire size next gg-, ; loop count :Z ;===== 繰り返し loop ===== #^ gg++, ; loop count y=9, ;(wy<=23)?y--, ; y 縦位置 &r ; ランダム ==== x=(r%(14)+22), ; x 花火の横位置 左 (wx<70)?{x=(r%(12)+7),} ; x 花火の横位置 左 nn=(r%(12)+44), ; nn 花火の横位置 右 (wx<70)?{nn=(r%(12)+18),} ; x 花火の横位置 左 bb=(r%(6)+2), ; bb 花火の大きさ (wy<=23)?bb=(r%(5)+2), ; bb 花火の大きさ mm=(r%(4)),(wy<23)?{mm=3,y=y-2,} ; mm 花火のモード (wy<=16)?{bb=(r%(4)+2),y=y-1,} ; bb 花火の大きさ (wy<=12)?{bb=(r%(3)+2),y=y-1,} ; bb 花火の大きさ (oo==0)?{x=nn, oo1,}?oo!, ; 左右振り分け (x>54)?{x=54,} ; x pos? 花火の位置 (bb<2)?{bb=2,} ; bb 花火の大きさ (bb>7)?{bb=7, } ; (wy==23&&bb==7)?bb--, y=y+(bb-2), ; o=wy-3, (wy>=38)?o=35, :a ; ==== LOOP 打ち上げ =============== &03 ;&k kk=r, ; キー入力チェック ==== (kk=='Q'||kk=='q'||kk==$1b)?{ >Q }?{ ; Q esc (o>=y)?{ &x(x) &y(o) &?("|") &x(x) &y(o+1) &?("!") &62 &04 ;&w(hh) (o>bb+16)?>b ;?&d ; (o<=ff+ff+8)?{&02 &w(1) ;fire size #if 98 (bb<3&&hh==3)?&w(hh) #endif &d } ;;キャラ消し ==== (oc (uu-tt>=qq-2-hh)?{&06 (uu-tt>=qq)?>Q } ; qq秒で終了 :c >a } &x(x) &y(o+1) &?(" ") } v-, &03 ;&k kk=r, ; キー入力チェック ==== (kk=='Q'||kk=='q'||kk==$1b)? >Q ; Q ESC ew[-, &s #56 &?("|") #m " " #m "ay" #56 &?("!") #m " " #m "ay" ew], &d x=x+3, ; x 調整 o-, t-, ; size v-, y--, :L ; ==== LOOP 花火 ================ &d #^ #< &03 ;&k kk=r, ; キー入力チェック ==== (kk=='Q'||kk=='q'||kk==$1b)?{ >Q }?{ ; Q esc &s &x(x) &y(y) o++, #b mb4, xb=lx, &51 ;51: w"%.O1" ;@COLOR (w.3-'0')?w.3='1', :A (w.3-'0')?fa+,?fa-, :B xx=x-(t+1)*4, yy=y-(t+1)*2, ;拡大率2 (mm>2)?>m xx=x-(t+1)*6, yy=y-(t+1)*3, ;拡大率3 :m ; (bb<=3&& x<37)?{xx=x-(t+1)*8,yy=y-(t+1)*2,} ;楕円 mb0, :C k=0, w.3=fa+'0', #^ &s (k==0)?{ww=u..t,WW!!, &01 } ;楕円描画 mb0, t=t+1, (mm>2)?{ x=x+2,y++, } ;拡大率2 ?{ x=x+3,y=y+1+(y%3%2), } ;拡大率3 &62 &05 ;bright ;wait&beep &03 ;&k kk=r, ; キー入力チェック ==== (kk=='Q'||kk=='q'||kk==$1b)? >Q ; Q ESC (qq==0)?>d (uu-tt>=qq-2-hh)?{ &06 (uu-tt>=qq)?>Q } ; qq秒で終了 :d } (oL ff=bb, ; fire size next (qq==0)?>e &06 (uu-tt>=qq)?>Q ; qq秒で終了 (uu-tt<=0)?>Q ; マイナスなら終了 :e >Z ; big loop :Q ; ==== 終了処理 ================ #if kVZ op], #endif (wa.54==0)?{ &d wa.54=1, #] ; ステータスライン on wa.56=lc-2, wa.57=lc-3, ; ##06 FKEYライン復帰 #if 98 ep[-, #E #[ ep], ; ファンクションキー表示 #endif &d #] ; #85 ステータスラインの再描画 } &w(10) mr-, #C &d #? ; 一時ファイル閉じる &m("打ち上げ回数 %d %d秒 wait %d",gg,uu-tt,hh) &08 ;pop mb0, #] . ;========================================================== 01: ;楕円描画 a[,b[,c[,d[,e[,f[,g[,m[,n[,x[,y[,xx[,yy[, f=(x-xx)%2, g=(y-yy)%2, a=(x-xx)/2, b=(y-yy)/2, x=(x+xx)/2, y=(y+yy)/2, (a>b)?{&12 (0)}?&13 yy],xx],y],x],n],m],g],f],e],d],c],b],a], 02: ; ==== キャラ消し ==== (v==-1)?. ew[-, mx[+, ss+, ww=u..v, ww!!, #56 &?("%c",ww) #m " " #m "ay" v++, ss-, &62 mx],ew], 03: ; ==== 速度変更 ==== &k kk=r, (kk>='0'&&kk<='9')?{hh=kk-48, } ; 0 〜 9 04: ; ==== ウエイト ==== (hh<=0)?. #if 98 (hh){&i($28)} ; DOS idle (hh){ ax$1680,&i($2f)} ;&m("idle call: AX=%04x CF=%d",ax,r) &w(hh) &w(hh) #else (hh){ ax$1680,&i($2f)} ;&m("idle call: AX=%04x CF=%d",ax,r) #endif AX=$7476,BX=$0000,CX=$6F64, ;VTDOS:ax0 MSP:ax1 DOSVAXJ3:ax$7476 &i($2F) ;VTDOS check $7476なら DOSVAXJ3 (ax==$7476)?{ ;DOSVAXJ3 (hh==1)?&w(1) . } (ax==1&&hh>1)?{ ;MS-DOS Player (hh){ ax$1680,&i($2f)} ;&m("idle call: AX=%04x CF=%d",ax,r) } &i($28) ; DOS idle #endif 05: ; ==== ウエイト& beep ==== &b(1) (hh<=0)?. ; beep #if 98 &i($28) ; DOS idle (bb<=3)?&w(hh) (bb<=2)?&w(hh) #endif AX=$7476,BX=$0000,CX=$6F64, ;VTDOS:ax0 MSP:ax1 DOSVAXJ3:ax$7476 &i($2F) ; VTDOS check $7476なら DOSVAXJ3 (ax==$7476)?{ ; DOSVAXJ3 (hh==1)?&w(3) (hh>2)?{ ax$1680,&i($2f)} ;&m("idle call: AX=%04x CF=%d",ax,r) .} (ax==1&&hh>1)?{ ; MS-DOS Player (hh){ ax$1680,&i($2f)} ; &m("idle call: AX=%04x CF=%d",ax,r) } &i($28) ; DOS idle 06: ; ==== timer ===== ax=$2C00, &i($21) ; 時間 uu=(dx>>8)+(cx%256)*60, 07: ; ==== push ==== ps[,du[-,ds[+,dc[-,aa[,bb[,cc[,dd[,ee[,ff[,gg[, hh[,kk[-,mm[,nn[,oo[,qq[,tt[,uu[,as[-, ;bright ky[,mx[+,mi[=2,en[-,ep[+,eu[+,mp[=0, fa[,k[,x[,y[,w[,jj[,xx[,yy[,ww[, 08: ; ==== pop ==== ww],yy],xx],jj],w],y],x],k],fa], mp],eu],ep],en],mi],mx],ky], as],uu],tt],qq],oo],nn],mm],kk],hh], gg],ff],ee],dd],cc],bb],aa],dc],ds],du],ps], ;bright 12: xx=a, c=a, yy=0, l[1, :A (xx>=yy)?{ d=xx*b/a, e=yy*b/a, m=x+xx+f, n=y+e+g, &50 m=x-xx, n=y+e+g, &50 m=x+yy+f, n=y+d+g, &50 m=x-yy, n=y+d+g, &50 m=x+yy+f, n=y-d, &50 m=x-yy, n=y-d, &50 m=x+xx+f, n=y-e, &50 m=x-xx, n=y-e, &50 ((c-=(yy++<<1)-1)<0)?{c+=(xx-- -1)<<1,} ; (l>0)?{l--, >A } >A } l], 13: xx=b,c=b,yy=0, :A (xx>=yy)?{ d=xx*a/b, e=yy*a/b, m=x+d+f, n=y+yy+g, &50 m=x-d, n=y+yy+g, &50 m=x+e+f, n=y+xx+g, &50 m=x-e, n=y+xx+g, &50 m=x+d+f, n=y-yy, &50 m=x-d, n=y-yy, &50 m=x+e+f, n=y-xx, &50 m=x-e, n=y-xx, &50 ((c-=(yy++<<1)-1)<0)?c+=(xx-- -1)<<1, } 25: m=x*2+f-q.p, &50 ((q.p-x)*2-f==-1)?. &?("%c",ww) 50: (n<0||m<0)?. &#J(n) #> D(m) &x(m) &?("%c",ww) 51: w"%.O1" ;@COLOR ;60: q 3+$,."$[130]" 61: (3+$)."$[44]" 62: ss-, ; 色付け :a ((pn.-15&=3)&&wt!=2)?j+,?j-, ;msg_line kx[, #] &x(r]) ;##k01 &61 r.7=wa.56-j, ;tw_sy - msg r[, &Sc(r+14,u) r], ;brt_chr_g~l r[, &Sc(r+26,ee) r], ;attr 12 #if 98 r.40=ks&2, ;ks=capslock #elseif DOSV r.40=ks&64, ;ks=capslock #endif r.41-, ax=r, &> 63: #if 98 &i(3+$)."$ $(8b,e8,e8,29,01,c5,76,00,8a,4e,07,32,ed,51,56,e8)$ $(0a,00,5e,59,72,05,03,76,04,e2,f2,c3,32,c9,3a,4e)$ $(06,73,19,ad,80,fc,00,74,03,e9,87,00,3a,46,27,74)$ $(0d,3a,46,26,74,06,eb,08,fe,c1,eb,e2,f8,c3,f9,c3)$ $(3a,46,08,75,05,8a,56,1a,eb,30,3a,46,09,75,05,8a)$ $(56,1b,eb,26,3a,46,0a,75,05,8a,56,1c,eb,1c,3a,46)$ $(0b,75,05,8a,56,1d,eb,12,3a,46,0c,75,05,8a,56,1e)$ $(eb,08,3a,46,0d,75,15,8a,56,1f,80,7e,29,01,75,06)$ $(c6,46,29,00,eb,22,c6,46,29,01,eb,1c,8a,56,28,80)$ $(fa,00,74,a4,8a,56,29,80,fa,00,74,9c,56,81,c6,00)$ $(20,8a,54,fc,80,e2,f7,5e,56,81,c6,00,20,88,54,fe)$ $(5e,eb,85,86,e0,3b,46,0e,75,05,8a,56,20,eb,30,3b)$ $(46,10,75,05,8a,56,21,eb,26,3b,46,12,75,05,8a,56)$ $(22,eb,1c,3b,46,14,75,05,8a,56,23,eb,12,3b,46,16)$ $(75,05,8a,56,24,eb,08,3b,46,18,75,15,8a,56,25,80)$ $(7e,29,01,75,06,c6,46,29,00,eb,04,c6,46,29,01,eb)$ $(1c,8a,56,28,80,fa,00,74,1f,8a,56,29,80,fa,00,74)$ $(17,56,81,c6,00,20,8a,54,fc,80,e2,f7,5e,56,81,c6)$ $(00,20,88,54,fe,88,14,5e,ad,fe,c1,e9,0a,ff,8b,46)$ $(0e,e8,31,00,89,46,0e,8b,46,10,e8,28,00,89,46,10)$ $(8b,46,12,e8,1f,00,89,46,12,8b,46,14,e8,16,00,89)$ $(46,14,8b,46,16,e8,0d,00,89,46,16,8b,46,18,e8,04)$ $(00,89,46,18,c3,86,e0,3c,80,14,61,72,02,2c,a2,d0)$ $(d4,05,21,1f,80,e4,7f,80,ec,20,c3)" #elseif DOSV &i(3+$)."$ $(8b,e8,c5,76,00,8a,4e,07,32,ed,51,56,e8,23,00,5e)$ $(59,72,05,03,76,04,e2,f2,e8,01,00,c3,c4,7e,00,8b)$ $(46,04,d1,e8,8a,56,07,32,f6,f7,e2,8b,c8,b4,ff,cd)$ $(10,c3,32,c9,3a,4e,06,73,23,ad,3c,80,72,0c,3c,ef)$ $(77,08,3c,9f,76,7e,3c,e0,73,7a,3c,20,77,12,3a,46)$ $(27,74,0b,3a,46,26,74,04,fe,c1,eb,d8,f8,c3,f9,c3)$ $(3a,46,08,75,05,8a,56,1a,eb,30,3a,46,09,75,05,8a)$ $(56,1b,eb,26,3a,46,0a,75,05,8a,56,1c,eb,1c,3a,46)$ $(0b,75,05,8a,56,1d,eb,12,3a,46,0c,75,05,8a,56,1e)$ $(eb,08,3a,46,0d,75,15,8a,56,1f,80,7e,29,01,75,06)$ $(c6,46,29,00,eb,19,c6,46,29,01,eb,13,8a,56,28,80)$ $(fa,00,74,a4,8a,56,29,80,fa,00,74,9c,8a,54,fd,88)$ $(54,ff,eb,94,8a,d8,ad,8a,f8,3b,5e,0e,75,05,8a,56)$ $(20,eb,30,3b,5e,10,75,05,8a,56,21,eb,26,3b,5e,12)$ $(75,05,8a,56,22,eb,1c,3b,5e,14,75,05,8a,56,23,eb)$ $(12,3b,5e,16,75,05,8a,56,24,eb,08,3b,5e,18,75,15)$ $(8a,56,25,80,7e,29,01,75,06,c6,46,29,00,eb,04,c6)$ $(46,29,01,eb,13,8a,56,28,80,fa,00,74,11,8a,56,29)$ $(80,fa,00,74,09,8a,54,fb,88,54,fd,88,54,ff,fe,c1)$ $(e9,25,ff)" #endif * v0.62 2025-10-10 致命的なバグ修正で再々アップ v0.61 2025-10-01 0〜9 の数字入力で動作中に速度調整→致命的なバグで再アップ v0.6 2025-09-26 CPU負荷低減、画面拡大、タイマー機能、&k,ビープ音改善。 v0.5 2025-09-09 hh で調速、花火大小左右振分け、40桁、12行まで対応。 v0.4 2025-09-06 花火が消える前に次の打ち上げ出来た。色反転等色々。 v0.31 2025-09-05 花火が消える時に色が抜けていたのを改善。 v0.3 2025-09-03 窓チラチラ、[ESC]反応修正、ビープON。 v0.2 2025-09-01 色反転修正 その他もろもろ。 v0.1 2025-08-30 キャラ色反転でとりあえず形は出来た。 ===== End of hanabi.def =====