Advertisement
12Me21

sys sblib

May 23rd, 2019
439
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 63.79 KB | None | 0 0
  1. '"
  2. ' SMILEBOOM LIBRARY "
  3. '"
  4. '
  5. ' どこか適当なスロットでEXECしてから利用します
  6. '
  7. ' (C)SMILEBOOM
  8. '
  9. ' 2019.01.07:USBKEY、BUTTON、STICKの統合型情報取得
  10. ' 2019.01.07:フォントの状態確認
  11. ' 2019.01.07:複数行対応の文字列入力ウィンドウ
  12. ' 2019.01.08:BUTVECのタイプ対応
  13. ' 2019.02.04:複数行入力はすべての行を返す
  14. '---------------------------------------
  15. ' 2019.03.31:文字列入力の引数を文字数に変更
  16. ' 2019.04.11:最初の文字列が受け取れないバグ修正
  17. '---------------------------------------
  18. ' 2019.04.14:複数行入力プロポーショナル扱いをやめる
  19. ' 2019.04.24:INKEY$()のBSとENTERを受け付ける
  20. ' 2019.04.30:スプライト検索処理追加
  21. ' 2019.05.07:GRFILL(角丸四角の描画)
  22. ' 2019.05.07:GPUTBUT(角丸四角ボタンの描画)
  23. '
  24. OPTION STRICT
  25. VAR VER$="1.1"
  26.  
  27. '--- BUTTON(KEYBOARD/STICK)
  28. ENUM \
  29. #INP_MIX=0,\
  30. #INP_BUTTON,\
  31. #INP_KEY,\
  32. #INP_STICKL,\
  33. #INP_STICKR,\
  34. #MAX_INP
  35.  
  36. ENUM \
  37. #IMD_NEW=0,\
  38. #IMD_REPEAT,\
  39. #IMD_IMPACT,\
  40. #IMD_RELEASE,\
  41. #IMD_VX,\
  42. #IMD_VY,\
  43. #IMD_REPVX,\
  44. #IMD_REPVY,\
  45. #IMD_OLD,\
  46. #IMD_TIME,\
  47. #IMD_X,\
  48. #IMD_Y,\
  49. #MAX_IMD
  50.  
  51. CONST #MAX_IDTBL=3
  52. DIM IDTBL[#MAX_IDTBL]=[\
  53. #INP_BUTTON,\
  54. #INP_KEY,\
  55. #INP_STICKL\
  56. ]
  57. VAR OLDKEY$="",KEY$=""
  58. VAR INSMODE=0,CAPSMODE=0,ISESC=0,ISSHIFT=0,ISCTRL=0
  59. VAR ISBS=0,BSCNT=0,ISDEL=0,DELCNT=0
  60. VAR ISENT=0,ENTCNT=0,ISTAB=0,TABCNT=0
  61. VAR INP[#MAX_INP,#MAX_IMD]
  62.  
  63. '--- TOUCH&MOUSE
  64. VAR TCX=0,TCY=0,TCS=0,TCR=0
  65. VAR OLDMOSBN=0,MOSBNCNT=0,MOSBN=0,MOSBR=0,MOSBI=0
  66. VAR OLDMOSX=0,OLDMOSY=0,MOSX=0,MOSY=0,MOSVX=0,MOSVY=0
  67. VAR OLDMOSW=0,MOSW=0,MOSVW=0
  68.  
  69. '--- KEY REPEAT
  70. VAR KW1,KW2
  71. SYSPARAM "KEYREPEAT" OUT KW1,KW2
  72.  
  73. '--- FONT
  74. DIM FONTX[128],FONTW[128]
  75. VAR FONTPROP=0,FONTSIZE=16
  76.  
  77. '--- SCREEN
  78. VAR SCW,SCH
  79.  
  80. '--- GPAGE
  81. CONST #GPAGE_WORK =0
  82. CONST #GPAGE_DEFSP=4
  83.  
  84. '--- WORK
  85. CONST #EDGE=2,#CAPH=11,#LCW=2
  86. VAR OLDGP
  87. VAR WINGX,WINGY,WINGW,WINGH,WINHX,WINHY
  88. VAR WINCX,WINCY,WINCW,WINCH
  89. DIM GTMP[2048*2048]
  90.  
  91. '--- COLOR
  92. CONST #C_CSRON =#C_YELLOW 'RGB(240,255,255,200)
  93. CONST #C_CSROFF =RGB(120, 0,120,255)
  94. CONST #C_WINBASE=#C_NAVY
  95. CONST #C_WINEDGE=#C_WHITE
  96. CONST #C_CLOSE =RGB(255,128,128,220)
  97.  
  98. '--- MESSAGE
  99. CONST #MSGOX=2,#MSGOY=4
  100. CONST #MAX_MSG=2048/16
  101. CONST #ALP=2
  102. CONST #DEFSPACE=4
  103. CONST #DEFENTY=2
  104. VAR LF$=CHR$(10)
  105. DIM MSG$[#MAX_MSG]
  106. VAR MSGLINECNT=0,MSGENTY=FONTSIZE
  107. VAR MSGW,MSGH,CSRX,CSRY
  108. VAR MSGGX,MSGGY,MSGGW,MSGGH
  109. VAR MSGTW,MSGTH
  110. VAR MSGMARGIN=0
  111.  
  112. '--- SPRITE
  113. CONST #SP_LIBTOP =4090
  114. CONST #SP_LIBEND =4094
  115. VAR SPTOP =#SP_LIBTOP,SPEND=#SP_LIBEND
  116. VAR SP_WIN,SP_SHADOW,SP_CSR
  117. VAR SP_HITCHK
  118.  
  119. '--- HIT CHECK
  120. CONST #MAX_CHKLIST=100
  121. DIM CHKLIST[#MAX_CHKLIST],CHKSP[#MAX_CHKLIST]
  122.  
  123. '--- INITIALIZE
  124. SB_INITLIB #SP_LIBTOP,#SP_LIBEND
  125. END
  126.  
  127.  
  128. '--- DEBUG
  129. ACLS
  130. 'XSCREEN 640,360,2,0
  131. 'XSCREEN 1280,720,1,0
  132. VAR C$="複数行対応 テキストエディター"
  133. VAR M$="ABCdefghiJKlmn さんぷる"+LF$+"2ND LINE"+LF$+"てきとうなもじれつahikl"
  134. VAR A$=SB_EDIT$(32,64,320,128,C$,M$,"USER_FUNC")
  135. PRINT A$
  136. PRINT "LEN MSG:";SB_MSGLEN(M$)
  137. END
  138.  
  139. '
  140. ' TEST(スロットを超えて呼び出されるので、必ず COMMONDEF として定義)
  141. '
  142. COMMON DEF USER_FUNC
  143. PRINT "USER"
  144. END
  145.  
  146.  
  147. '
  148. ' SMILEBOOM LIBRARY PROGRAM
  149. '
  150.  
  151. '=======================================
  152. '■存在確認用
  153. '=======================================
  154. COMMON DEF SB_LIB()
  155. 'CHKCALL("SB_LIB")==TRUE
  156. RETURN VER$
  157. END
  158.  
  159. '=======================================
  160. '■ライブラリ初期設定
  161. '=======================================
  162. COMMON DEF SB_INITLIB ST,SE
  163. '---
  164. SPTOP=ST:SPEND=SE
  165. '---
  166. XSCREEN OUT SCW,SCH
  167. '---
  168. SP_HITCHK=SPSET(SPTOP,SPEND,0,0,8,8,0)
  169. SPCOLOR SP_HITCHK,#C_CLEAR
  170. SB_CHKFONT #DEFSPACE
  171. SB_INITMSG FONTPROP,FONTSIZE,MSGMARGIN,#DEFENTY
  172. END
  173.  
  174. '
  175. ' ### SPRITE HELPER
  176. '
  177.  
  178. '=======================================
  179. '■進行方向にあるスプライトを探す(十字方向のみの移動に限定)
  180. '=======================================
  181. COMMON DEF SB_SPSCAN(SP,VX,VY,MSK)
  182. '--- 移動していない?
  183. IF VX==0 && VY==0 THEN RETURN -1
  184. '--- X優先(方向限定:斜めには動かさない)
  185. IF VX && VY THEN VY=0
  186. '--- 発生元情報取得
  187. VAR U,V,W,H,OX,OY
  188. SPOFS SP,1 OUT OX,OY
  189. SPCHR SP OUT U,V,W,H
  190. '--- 当たり判定用のスプライト準備
  191. VAR BX=OX+W/2,BY=OY+H/2
  192. SPOFS SP_HITCHK,BX,BY,-4000
  193. SPCHR SP_HITCHK,,,W,H
  194. SPHOME SP_HITCHK,W/2,H/2
  195. SPCOL SP_HITCHK,0,MSK
  196. SPCOLVEC SP_HITCHK,VX*SCW,VY*SCW
  197. SPCOLOR SP_HITCHK,#C_CLEAR
  198. '--- 進行方向にあるスプライトを探す
  199. VAR CNT=0
  200. VAR NX=SPHITSP(SP_HITCHK)
  201. IF NX!=-1 THEN
  202. '--- 1個目発見
  203. SPOFS NX,1 OUT OX,OY '+PARENT
  204. CHKSP[CNT]=NX
  205. CHKLIST[CNT]=((OX-BX)*VX)+((OY-BY)*VY)
  206. INC CNT
  207. '--- 他にもあるか?(続きの確認)
  208. LOOP
  209. NX=SPHITSP()
  210. IF NX==-1 THEN BREAK
  211. '---
  212. SPOFS NX,1 OUT OX,OY '+PARENT
  213. CHKSP[CNT]=NX
  214. CHKLIST[CNT]=((OX-BX)*VX)+((OY-BY)*VY)
  215. INC CNT
  216. IF CNT>=#MAX_CHKLIST THEN BREAK
  217. ENDLOOP
  218. '--- 1個だけなら自分自身
  219. IF CNT>1 THEN
  220. '--- 近い順に並べる
  221. SORT 0,CNT,CHKLIST,CHKSP
  222. NX=CHKSP[1] '0番目は自分自身なので1番目を使う
  223. RETURN NX
  224. ENDIF
  225. ENDIF
  226. '--- 正面に見つからないときは両側面を探す
  227. VAR CVX=SCW,CVY=SCW
  228. IF VX THEN CVX=0 ELSE CVY=0
  229. NX=-1
  230. LOOP
  231. BX=BX+(VX*W):BY=BY+(VY*H)
  232. IF BX<0 || BX>SCW THEN BREAK
  233. IF BY<0 || BY>SCH THEN BREAK
  234. SPOFS SP_HITCHK,BX,BY
  235. SPCOLVEC SP_HITCHK, CVX, CVY
  236. NX=SPHITSP(SP_HITCHK):IF NX!=-1 THEN BREAK
  237. SPCOLVEC SP_HITCHK,-CVX,-CVY
  238. NX=SPHITSP(SP_HITCHK):IF NX!=-1 THEN BREAK
  239. ENDLOOP
  240. '---
  241. RETURN NX
  242. END
  243.  
  244.  
  245. '=======================================
  246. '■ウィンドウ
  247. '=======================================
  248. COMMON DEF SB_WINSTAT OUT ED,CP
  249. ED=#EDGE
  250. CP=#CAPH
  251. END
  252.  
  253. '=======================================
  254. '■ウィンドウ
  255. '=======================================
  256. COMMON DEF SB_WINOPEN(X,Y,W,H,CP$)
  257. '--- BACKUP IMAGE
  258. WINGW=W+#EDGE*2
  259. WINGH=H+#EDGE*2+#CAPH
  260. WINGX=2048-WINGW
  261. WINGY=2048-WINGH
  262. OLDGP=GTARGET()
  263. GTARGET #GPAGE_WORK
  264. GSAVE WINGX,WINGY,WINGW,WINGH,GTMP
  265. '--- CREATE WINDOW
  266. VAR EX=WINGX+WINGW,EY=WINGY+WINGH
  267. GFILL WINGX ,WINGY ,EX-1,EY-1,#C_CLEAR
  268. GFILL WINGX+1,WINGY ,EX-2,EY-1,#C_WINEDGE
  269. GFILL WINGX ,WINGY+1,EX-1,EY-2,#C_WINEDGE
  270. '--- CLOSE AREA
  271. WINCW=32:WINCH=#EDGE+#CAPH-2
  272. WINCX=EX-WINCW:WINCY=WINGY
  273. GFILL WINCX ,WINCY,WINCX+WINCW-1,WINCY+WINCH-2,#C_CLOSE
  274. GFILL WINCX+1 ,WINCY,WINCX+WINCW-1,WINCY+WINCH-1,#C_CLOSE
  275. GPUTCHR WINCX+13,WINCY+2,"",8,#C_WHITE,#ALP
  276. '--- キャプションをのぞいたざひょう
  277. WINHX=WINGX+#EDGE
  278. WINHY=WINGY+#EDGE+#CAPH
  279. GFILL WINHX,WINHY,WINHX+W-1,WINHY+H-1,#C_WINBASE
  280. GTARGET OLDGP
  281. '--- SPRITE:WINDOW
  282. VAR OLDSPG=SPPAGE()
  283. SPPAGE #GPAGE_WORK
  284. SP_WIN=SPSET(SPTOP,SPEND,WINGX,WINGY,WINGW,WINGH,0)
  285. SPOFS SP_WIN,X,Y
  286. '--- CLOSE BUTTON
  287. WINCX=X+WINGW-WINCW:WINCY=Y
  288. '--- SPRITE:SHADOW
  289. SP_SHADOW=SPSET(SPTOP,SPEND,WINGX,WINGY,WINGW,WINGH,0)
  290. SPLINK SP_SHADOW,SP_WIN
  291. SPCOLOR SP_SHADOW,RGB(160,0,0,0)
  292. SPOFS SP_SHADOW,3,3,20
  293. SPPAGE OLDSPG
  294. '--- CAPTION
  295. GPUTCHR WINGX+#EDGE+2,WINGY+#EDGE+1,CP$,8,#C_BLACK,#ALP
  296. '---
  297. RETURN SP_WIN
  298. END
  299.  
  300. '=======================================
  301. '■CLOSE
  302. '=======================================
  303. COMMON DEF SB_WINCLOSE
  304. SPCLR SP_WIN
  305. SPCLR SP_SHADOW
  306. GTARGET OLDGP
  307. GLOAD WINGX,WINGY,WINGW,WINGH,GTMP,0
  308. END
  309.  
  310. '=======================================
  311. '■CHECK CLOSE BUTTON
  312. '=======================================
  313. COMMON DEF SB_CHKWINCLOSE(X,Y)
  314. IF X<WINCX || X>=WINCX+WINCW THEN RETURN 0
  315. IF Y<WINCY || Y>=WINCY+WINCH THEN RETURN 0
  316. RETURN 1
  317. END
  318.  
  319.  
  320. '
  321. ' ### MULTILINE TEXT EDITOR
  322. '
  323.  
  324. '=======================================
  325. '■文字列の入力(複数行対応)
  326. '=======================================
  327. COMMON DEF SB_EDIT$(DX,DY,TW,TH,CP$,MS$,USER$)
  328. '--- CALC DOTSIZE
  329. MSGTW=TW:MSGTH=TH
  330. VAR DW=(TW*(FONTSIZE+MSGMARGIN))+#MSGOX*2
  331. VAR DH=(TH*MSGENTY)+#MSGOY
  332. '--- CREATE WINDOW
  333. SP_WIN=SB_WINOPEN(DX,DY,DW,DH+#LCW,CP$)
  334. GTARGET #GPAGE_WORK
  335. '--- MAX MSGLINE ON WINDOW
  336. MSGW=TW 'DW DIV (FONTSIZE+MSGMARGIN)
  337. MSGH=TH
  338. MSGGX=WINHX:MSGGY=WINHY
  339. MSGGW=DW-MSGMARGIN*4:MSGGH=DH-MSGENTY
  340. '--- SPLIT MESSAGE
  341. VAR C$
  342. VAR I=0,MC=0
  343. FILL MSG$,""
  344. LOOP
  345. C$=MID$(MS$,I,1):INC I
  346. IF C$=="" THEN INC MC:BREAK
  347. IF C$==LF$ THEN
  348. INC MC
  349. ELSE
  350. IF LEN(MSG$[MC])<MSGTW THEN
  351. MSG$[MC]=MSG$[MC]+C$
  352. ENDIF
  353. ENDIF
  354. ENDLOOP
  355. IF MC==0 THEN INC MC
  356. MSGLINECNT=MC
  357. '--- SPRITE:CURSOR
  358. VAR OLDSPG=SPPAGE()
  359. CSRY=MSGLINECNT-1:IF CSRY>=MSGH-1 THEN CSRY=MSGH-1
  360. CSRX=LEN(MSG$[CSRY])
  361. SPPAGE -1
  362. SP_CSR=SPSET(SPTOP,SPEND,0,0,2,18,0)
  363. SPLINK SP_CSR,SP_WIN
  364. SPVAR SP_CSR,"HX",(WINHX-WINGX)+#EDGE/2
  365. SPVAR SP_CSR,"HY",(WINHY-WINGY)+#EDGE/2
  366. SPVAR SP_CSR,"OX",CSRX
  367. SPVAR SP_CSR,"OY",CSRY
  368. SPFUNC SP_CSR,"SPFUNC_CSRINPUT"
  369. SPCOLOR SP_CSR,#C_CSRON
  370. SPANIM SP_CSR,"C",8,#C_CSRON,8,#C_CSROFF,0
  371. SETCSROFS SP_CSR
  372. SPPAGE OLDSPG
  373. '--- CHECK ENTER&DRAW
  374. FOR I=0 TO MSGH-1
  375. EDPUTLINE I
  376. NEXT
  377.  
  378. '
  379. ' ### MAIN LOOP
  380. '
  381. LOOP
  382. VSYNC
  383. SB_INPUT 0 'USBKEY NOT GAMEMODE
  384. SB_TOUCHMOUSE 1
  385. EDITOR
  386. IF CHKCALL(USER$) THEN CALL USER$
  387. CALL SPRITE
  388. IF SB_BUTTON("BUTTON","IMPACT") AND (1<<#B_RDOWN) THEN BREAK
  389. IF ISESC THEN BREAK
  390. IF (MOSBI AND &H01) && SB_CHKWINCLOSE(MOSX,MOSY) THEN BREAK
  391. IF MOSBI AND &H02 THEN BREAK
  392. ENDLOOP
  393.  
  394. '--- CLOSE
  395. SB_WINCLOSE
  396. SPCLR SP_CSR
  397.  
  398. '--- MAKE MESSAGE
  399. VAR TX$=""
  400. FOR I=0 TO MSGH-1
  401. TX$=TX$+MSG$[I]+LF$
  402. NEXT
  403. RETURN TX$
  404. END
  405.  
  406. '---------------------------------------
  407. ' INPUT CURSOR
  408. '---------------------------------------
  409. DEF SPFUNC_CSRINPUT
  410. SETCSROFS CALLIDX()
  411. END
  412.  
  413. '---
  414. DEF SETCSROFS IX
  415. VAR HX=SPVAR(IX,"HX")
  416. VAR HY=SPVAR(IX,"HY")
  417. VAR OX=SB_MSGOFS(CSRX,MSG$[CSRY])
  418. VAR OY=CSRY*MSGENTY
  419. SPOFS IX,OX+HX,OY+HY
  420. END
  421.  
  422.  
  423. '---------------------------------------
  424. ' MULTI INPUT MAIN
  425. '---------------------------------------
  426. DEF EDITOR
  427. VAR OX=CSRX,OY=CSRY,O,W,L
  428. VAR HX,HY,DW,DH
  429.  
  430. 'LOCATE 2,2
  431. 'PRINT FORMAT$("%3D,%3D",CSRX,CSRY)
  432.  
  433. '--- GET VECTOR
  434. VAR VX,VY
  435. SB_BUTVEC "MIX","REPEAT" OUT VX,VY
  436. VAR BTN=SB_BUTTON("MIX","NEW")
  437. VAR BTI=SB_BUTTON("BUTTON","IMPACT")
  438. VAR BTR=SB_BUTTON("MIX","REPEAT")
  439. VAR INS=SB_KEYSTAT("INS")
  440. VAR ESC=SB_KEYSTAT("ESC")
  441. VAR BS=SB_KEYSTAT("BS")
  442. VAR DEL=SB_KEYSTAT("DEL")
  443. VAR ENT=SB_KEYSTAT("ENT")
  444. 'PRINT INS,ESC,BS,DEL,ENT,HEX$(BTN),HEX$(BTN),VX,VY
  445.  
  446. '--- ACTION
  447. IF BS THEN EDSUBBS :VX=0:VY=0
  448. IF DEL THEN EDSUBDEL:VX=0:VY=0
  449. IF ENT THEN EDSUBENT:VX=0:VY=0
  450. IF KEY$!="" THEN EDSETCHR KEY$,INS:VX=0:VY=0
  451.  
  452. '--- MOVE X
  453. VAR SX=LEN(MSG$[CSRY]),SY=MSGH
  454. CSRX=CSRX+VX
  455. IF VX<0 && CSRX<0 THEN
  456. CSRX=0:DEC CSRY
  457. IF CSRY<0 THEN CSRY=0 ELSE CSRX=LEN(MSG$[CSRY])
  458. ENDIF
  459. IF VX>0 && CSRX>SX THEN
  460. CSRX=SX
  461. INC CSRY
  462. IF CSRY>=SY THEN CSRY=SY-1 ELSE CSRX=0
  463. ENDIF
  464.  
  465. '--- MOVE Y
  466. IF VX==0 && VY THEN
  467. CSRY=CSRY+VY
  468. IF CSRY<0 THEN CSRY=0
  469. IF CSRY>=SY THEN CSRY=SY-1
  470. ENDIF
  471. SX=LEN(MSG$[CSRY])
  472. IF CSRX>SX THEN CSRX=SX
  473. END
  474.  
  475. '---------------------------------------
  476. ' BACKSPACE:1文字前を消す
  477. '---------------------------------------
  478. DEF EDSUBBS
  479. VAR C$,H$,T$,M$=MSG$[CSRY]
  480. VAR NX,I,L=LEN(M$),L2
  481. '--- 一番前?
  482. IF CSRX==0 THEN
  483. '--- カーソルより後ろに文字列があるか?
  484. NX=LEN(MSG$[CSRY-(CSRY!=0)])
  485. IF L THEN
  486. '--- 上の行に残り文字列を結合
  487. IF CSRY THEN
  488. '--- 1文字ずつ追加して収まるかどうかを判定(プロポーショナル対応)
  489. H$=MSG$[CSRY-1]:NX=LEN(MSG$[CSRY-1])
  490. WHILE M$!=""
  491. C$=LEFT$(M$,1)
  492. IF SB_MSGLEN( H$+C$ )>MSGGW THEN BREAK
  493. M$=RIGHT$(M$,LEN(M$)-1)
  494. H$=H$+C$
  495. WEND
  496. '--- 上の行に収まりきらなかったら一部を結合し残りは前の行に残す
  497. MSG$[CSRY-1]=H$:EDPUTLINE CSRY-1
  498. MSG$[CSRY]=M$ :EDPUTLINE CSRY
  499. ENDIF
  500. ENDIF
  501. '--- 1行削除
  502. IF M$=="" THEN
  503. FOR I=CSRY TO MSGH-1
  504. MSG$[I]=MSG$[I+1]:EDPUTLINE I
  505. NEXT
  506. MSG$[MSGH-1]="":EDPUTLINE MSGH-1
  507. ENDIF
  508. IF CSRY THEN DEC CSRY:CSRX=NX
  509. RETURN
  510. ENDIF
  511. '---
  512. H$=MID$(M$,0,CSRX-1)
  513. T$=MID$(M$,CSRX,L-CSRX)
  514. DEC CSRX
  515. MSG$[CSRY]=H$+T$:EDPUTLINE CSRY
  516. END
  517.  
  518. '---------------------------------------
  519. ' DELETE:1文字後ろを消す
  520. '---------------------------------------
  521. DEF EDSUBDEL
  522. VAR C$,H$,T$,M$=MSG$[CSRY]
  523. VAR I,L=LEN(M$)
  524. '--- 一番後ろ?
  525. IF CSRX>=L THEN
  526. '--- 下の行から持ってこれるだけ持ってくる
  527. IF CSRY!=MSGH-1 THEN
  528. '--- 1文字ずつ追加して収まるかどうかを判定(プロポーショナル対応)
  529. H$=MSG$[CSRY+1]
  530. WHILE H$!=""
  531. C$=LEFT$(H$,1)
  532. IF SB_MSGLEN( M$+C$ )>MSGGW THEN BREAK
  533. H$=RIGHT$(H$,LEN(H$)-1)
  534. M$=M$+C$
  535. WEND
  536. MSG$[CSRY+1]=H$:EDPUTLINE CSRY+1
  537. MSG$[CSRY]=M$ :EDPUTLINE CSRY
  538. '--- 1行削除?
  539. IF H$=="" THEN
  540. FOR I=CSRY+1 TO MSGH-1
  541. MSG$[I]=MSG$[I+1]:EDPUTLINE I
  542. NEXT
  543. MSG$[MSGH-1]="":EDPUTLINE MSGH-1
  544. ENDIF
  545. ENDIF
  546. RETURN
  547. ENDIF
  548. '--- 後ろを消す
  549. H$=MID$(M$,0,CSRX)
  550. T$=MID$(M$,CSRX+1,L-CSRX)
  551. MSG$[CSRY]=H$+T$:EDPUTLINE CSRY
  552. END
  553.  
  554. '---------------------------------------
  555. ' 1文字追加
  556. '---------------------------------------
  557. DEF EDSETCHR K$,INS
  558. '--- 新しい文字は文字数内か?
  559. VAR M$=MSG$[CSRY]
  560. IF LEN(M$)>=MSGTW THEN RETURN
  561. '--- 新しい文字はドット範囲に収まるか?
  562. VAR L=SB_MSGLEN(M$)
  563. VAR SX=SB_CHRSIZE(MID$(M$,CSRX,1))
  564. IF L+SX>MSGGW THEN RETURN '入らない時に押し出すか?
  565. '--- 新しい文字を追加
  566. L=LEN(M$):SX=CSRX:IF SX>L THEN SX=L
  567. VAR H$=MID$(M$,0,SX)
  568. VAR T$=MID$(M$,CSRX,L-SX)
  569. MSG$[CSRY]=H$+K$+T$:EDPUTLINE CSRY
  570. INC CSRX
  571. END
  572.  
  573. '---------------------------------------
  574. ' 改行
  575. '---------------------------------------
  576. DEF EDSUBENT
  577. VAR M$=MSG$[CSRY]
  578. VAR I,L=LEN(M$)
  579. IF CSRY==MSGH-1 THEN RETURN '空きなし
  580. '--- 最後の行に空きがあるか?
  581. IF MSG$[MSGH-1]!="" THEN RETURN '空きなし
  582. '--- 1行ずらす
  583. FOR I=MSGH-1 TO CSRY+1 STEP -1
  584. MSG$[I]=MSG$[I-1]:EDPUTLINE I
  585. NEXT
  586. '--- 改行時のカーソルより後ろを新しい行へ
  587. VAR H$=MID$(M$,0,CSRX)
  588. VAR T$=MID$(M$,CSRX,L-CSRX)
  589. MSG$[CSRY]=H$:EDPUTLINE CSRY
  590. CSRX=0:INC CSRY
  591. MSG$[CSRY]=T$:EDPUTLINE CSRY
  592. END
  593.  
  594. '---------------------------------------
  595. ' 1行再表示
  596. '---------------------------------------
  597. DEF EDPUTLINE Y
  598. VAR HX=MSGGX
  599. VAR HY=MSGGY+Y*MSGENTY+#MSGOY
  600. GFILL HX,HY,HX+MSGGW-1,HY+MSGENTY-1,#C_WINBASE
  601. SB_GMSG HX,HY,MSG$[Y],#C_WHITE,#ALP
  602. END
  603.  
  604. '
  605. ' ### FONT/MESSAGE
  606. '
  607.  
  608. '=======================================
  609. '■メッセージ関係の初期化
  610. '=======================================
  611. COMMON DEF SB_INITMSG PR,FS,MG,LY
  612. IF PR==0 THEN MG=0
  613. FONTPROP=PR
  614. FONTSIZE=FS
  615. MSGMARGIN=MG
  616. MSGENTY=LY+FONTSIZE
  617. END
  618.  
  619. '=======================================
  620. '■文字列全体のドット数
  621. '=======================================
  622. COMMON DEF SB_MSGLEN( TX$ )
  623. RETURN SB_MSGOFS( LEN(TX$),TX$ )
  624. END
  625.  
  626. '=======================================
  627. '■文字列の指定位置までのドット数
  628. '=======================================
  629. COMMON DEF SB_MSGOFS( OX,TX$ )
  630. VAR I=0,X=0,C,W,SC=1,SPC
  631. VAR C$
  632. WHILE I<OX
  633. C$=MID$(TX$,I,1):INC I
  634. IF C$==CHR$(10) || C$=="" THEN BREAK
  635. X=X+(SB_CHRSIZE(C$)+MSGMARGIN)*SC
  636. WEND
  637. RETURN X
  638. END
  639.  
  640. '=======================================
  641. '■指定1文字のドット数
  642. '=======================================
  643. COMMON DEF SB_CHRSIZE(C$)
  644. VAR C,FS=FONTSIZE
  645. IF C$!="" THEN
  646. C=ASC(C$)
  647. IF C>=32 && C<128 THEN
  648. IF FONTPROP THEN FS=FONTW[C]
  649. ENDIF
  650. ENDIF
  651. RETURN FS
  652. END
  653.  
  654. '=======================================
  655. '■1行表示(プロポーショナル対応)
  656. '=======================================
  657. COMMON DEF SB_GMSG HX,HY,TX$,COL,ALP
  658. VAR I=0,X=0,Y=0,C,FX,W,SC=1
  659. VAR SPC,TX=HX,ST=FONTSIZE
  660. VAR C$
  661. LOOP
  662. C$=MID$(TX$,I,1):INC I
  663. IF C$=="" THEN BREAK
  664. C=ASC(C$):FX=0:W=FONTSIZE:SPC=MSGMARGIN
  665. IF C<128 THEN
  666. W=SB_CHRSIZE(C$)
  667. IF W==FONTSIZE THEN FX=0:SPC=0 ELSE FX=FONTX[C]:SPC=1
  668. HX=HX-FX*SC
  669. ENDIF
  670. GPUTCHR X+HX,Y+HY,C$,ST,SC,SC,COL,ALP
  671. X=X+(FX+W+SPC)*SC
  672. ENDLOOP
  673. END
  674.  
  675. '=======================================
  676. '■フォントのサイズと開始点を調査(プロポーショナル用)
  677. '=======================================
  678. COMMON DEF SB_CHKFONT SPCSIZE
  679. VAR P=GTARGET()
  680. GTARGET 5 'FONT
  681. '---
  682. VAR I=0,U,V,W,H,HX
  683. VAR SX,HSW,SSW,FS=FONTSIZE
  684. VAR VTOP=(FS==16)*1024
  685. VAR C,A,R,G,B
  686. FOR V=VTOP TO VTOP+FS*2-1 STEP FS
  687. FOR U=0 TO FS*64-1 STEP FS
  688. HX=0:SX=0:HSW=0:SSW=0
  689. FOR W=0 TO FS-1
  690. FOR H=0 TO FS-1
  691. RGB GPGET(U+W,H+V) OUT A,R,G,B
  692. IF A THEN BREAK
  693. NEXT
  694. IF H==FS THEN
  695. IF HSW==0 THEN INC HX ELSE BREAK
  696. ELSE
  697. IF HSW==0 THEN HSW=1
  698. IF HSW THEN INC SX
  699. ENDIF
  700. NEXT
  701. IF HX==FS THEN HX=0:SX=FS
  702. FONTX[I]=HX:FONTW[I]=SX
  703. INC I
  704. NEXT
  705. NEXT
  706. '--- SPACE
  707. C=ASC(" ")
  708. FONTX[C]=0
  709. FONTW[C]=SPCSIZE
  710. '---
  711. GTARGET P
  712. END
  713.  
  714. '
  715. ' ### BUTTON/KEY/STICK
  716. '
  717.  
  718. '=======================================
  719. '■入力系デバイス読込み
  720. '---------------------------------------
  721. ' USB=1:USBKEY IS GAMEMODE
  722. '=======================================
  723. COMMON DEF SB_INPUT USB
  724.  
  725. '--- USBKEY
  726. CONST #USBKEY_ESC =&H29
  727. CONST #USBKEY_SPACE =&H2C
  728. CONST #USBKEY_UP =&H52
  729. CONST #USBKEY_DOWN =&H51
  730. CONST #USBKEY_LEFT =&H50
  731. CONST #USBKEY_RIGHT =&H4F
  732. CONST #USBKEY_ENTER =&H28
  733. CONST #USBKEY_ENTER2=&H58
  734. CONST #USBKEY_CTRL =&HE0
  735. CONST #USBKEY_CTRL2 =&HE4
  736. CONST #USBKEY_ALT =&HE2
  737. CONST #USBKEY_ALT2 =&HE6
  738. CONST #USBKEY_WIN =&HE3
  739. CONST #USBKEY_WIN2 =&HE7
  740. CONST #USBKEY_SHIFT =&HE1
  741. CONST #USBKEY_SHIFT2=&HE5
  742. CONST #USBKEY_CAPS =&H39
  743. CONST #USBKEY_TAB =&H2B
  744. CONST #USBKEY_INS =&H49
  745. CONST #USBKEY_DEL =&H4C
  746. CONST #USBKEY_BS =&H2A
  747. CONST #USBKEY_HANZEN=&H35
  748. CONST #USBKEY_AT =&H2F
  749. '---
  750. CONST #USBKEY_1 =&H1E
  751. CONST #USBKEY_2 =&H1F
  752. CONST #USBKEY_3 =&H20
  753. CONST #USBKEY_4 =&H21
  754. CONST #USBKEY_5 =&H22
  755. CONST #USBKEY_6 =&H23
  756. CONST #USBKEY_7 =&H24
  757. CONST #USBKEY_8 =&H25
  758. CONST #USBKEY_9 =&H26
  759. CONST #USBKEY_0 =&H27
  760. CONST #USBKEY_MINUS =&H2D
  761. CONST #USBKEY_CARET =&H2E '^
  762. CONST #USBKEY_YEN =&H89
  763. '---
  764. CONST #USBKEY_A =&H04
  765. CONST #USBKEY_B =&H05
  766. CONST #USBKEY_C =&H06
  767. CONST #USBKEY_D =&H07
  768. CONST #USBKEY_E =&H08
  769. CONST #USBKEY_F =&H09
  770. CONST #USBKEY_G =&H0A
  771. CONST #USBKEY_H =&H0B
  772. CONST #USBKEY_I =&H0C
  773. CONST #USBKEY_J =&H0D
  774. CONST #USBKEY_K =&H0E
  775. CONST #USBKEY_L =&H0F
  776. CONST #USBKEY_M =&H10
  777. CONST #USBKEY_N =&H11
  778. CONST #USBKEY_O =&H12
  779. CONST #USBKEY_P =&H13
  780. CONST #USBKEY_Q =&H14
  781. CONST #USBKEY_R =&H15
  782. CONST #USBKEY_S =&H16
  783. CONST #USBKEY_T =&H17
  784. CONST #USBKEY_U =&H18
  785. CONST #USBKEY_V =&H19
  786. CONST #USBKEY_W =&H1A
  787. CONST #USBKEY_X =&H1B
  788. CONST #USBKEY_Y =&H1C
  789. CONST #USBKEY_Z =&H1D
  790.  
  791. '
  792. ' KEY(FROM BASIC)
  793. '
  794. VAR KEYBS=0,KEYENT=0
  795. OLDKEY$=KEY$:KEY$=INKEY$()
  796. IF KEY$!="" THEN
  797. IF KEY$==CHR$(8) THEN
  798. KEY$="":KEYBS=1 'BACKSPACE
  799. ELSEIF KEY$==CHR$(13) THEN
  800. KEY$="":KEYENT=1 'ENTER
  801. ELSEIF ASC(KEY$)<&H20 THEN
  802. KEY$=""
  803. ENDIF
  804. ENDIF
  805.  
  806. '
  807. ' KEY(FROM USB)
  808. '
  809. VAR N=0
  810. IF KEYBOARD(#USBKEY_UP,0) THEN N=N OR (1<<#B_LUP)
  811. IF KEYBOARD(#USBKEY_DOWN,0) THEN N=N OR (1<<#B_LDOWN)
  812. IF KEYBOARD(#USBKEY_LEFT,0) THEN N=N OR (1<<#B_LLEFT)
  813. IF KEYBOARD(#USBKEY_RIGHT,0) THEN N=N OR (1<<#B_LRIGHT)
  814. '---
  815. IF USB THEN
  816. IF KEYBOARD(#USBKEY_SPACE,0) THEN N=N OR (1<<#B_RRIGHT) 'A
  817. IF KEYBOARD(#USBKEY_W,0) THEN N=N OR (1<<#B_LUP)
  818. IF KEYBOARD(#USBKEY_S,0) THEN N=N OR (1<<#B_LDOWN)
  819. IF KEYBOARD(#USBKEY_A,0) THEN N=N OR (1<<#B_LLEFT)
  820. IF KEYBOARD(#USBKEY_D,0) THEN N=N OR (1<<#B_LRIGHT)
  821. IF KEYBOARD(#USBKEY_Z,0) THEN N=N OR (1<<#B_RRIGHT) 'A
  822. IF KEYBOARD(#USBKEY_X,0) THEN N=N OR (1<<#B_RDOWN) 'B
  823. IF KEYBOARD(#USBKEY_C,0) THEN N=N OR (1<<#B_RLEFT) 'Y
  824. IF KEYBOARD(#USBKEY_V,0) THEN N=N OR (1<<#B_RUP) 'X
  825. IF KEYBOARD(#USBKEY_ALT,0) THEN N=N OR (1<<#B_RRIGHT) 'A
  826. IF KEYBOARD(#USBKEY_ALT2,0) THEN N=N OR (1<<#B_RRIGHT) 'A
  827. IF KEYBOARD(#USBKEY_WIN,0) THEN N=N OR (1<<#B_RDOWN) 'B
  828. IF KEYBOARD(#USBKEY_WIN2,0) THEN N=N OR (1<<#B_RDOWN) 'B
  829. ENDIF
  830. '--- L/R
  831. IF KEYBOARD(#USBKEY_SHIFT,0) THEN N=N OR (1<<#B_L1)
  832. IF KEYBOARD(#USBKEY_CTRL,0) THEN N=N OR (1<<#B_L2)
  833. IF KEYBOARD(#USBKEY_SHIFT2,0) THEN N=N OR (1<<#B_R1)
  834. IF KEYBOARD(#USBKEY_CTRL2,0) THEN N=N OR (1<<#B_R2)
  835. '---
  836. KEYSUB #INP_KEY,N
  837.  
  838. '--- SPECIAL KEY
  839. ISSHIFT=KEYBOARD(#USBKEY_SHIFT,0) OR KEYBOARD(#USBKEY_SHIFT2,0)
  840. ISCTRL=KEYBOARD(#USBKEY_CTRL,0) OR KEYBOARD(#USBKEY_CTRL2,0)
  841. ISESC=KEYBOARD(#USBKEY_ESC,2)
  842. IF KEYBOARD(#USBKEY_INS,2) THEN INSMODE=!INSMODE
  843. IF KEYBOARD(#USBKEY_CAPS,2) THEN CAPSMODE=!CAPSMODE
  844. KEYREP KEYBOARD(#USBKEY_TAB,0),TABCNT OUT ISTAB,TABCNT
  845. VAR B=KEYBS OR KEYBOARD(#USBKEY_BS,0)
  846. KEYREP B,BSCNT OUT ISBS,BSCNT
  847. KEYREP KEYBOARD(#USBKEY_DEL,0),DELCNT OUT ISDEL,DELCNT
  848. VAR E=KEYBOARD(#USBKEY_ENTER,0) OR KEYBOARD(#USBKEY_ENTER2,0) OR KEYENT
  849. KEYREP E,ENTCNT OUT ISENT,ENTCNT
  850.  
  851. '
  852. ' BUTTON
  853. '
  854. KEYSUB #INP_BUTTON,BUTTON(0)
  855.  
  856. '
  857. ' STICK(L)
  858. '
  859. VAR X,Y,LM=0.2
  860. STICK 0,0 OUT X,Y
  861. N=0
  862. IF X>-LM && X<LM THEN X=0
  863. IF Y>-LM && Y<LM THEN Y=0
  864. IF Y<-LM THEN N=N OR (1<<#B_LUP)
  865. IF Y> LM THEN N=N OR (1<<#B_LDOWN)
  866. IF X<-LM THEN N=N OR (1<<#B_LLEFT)
  867. IF X> LM THEN N=N OR (1<<#B_LRIGHT)
  868. KEYSUB #INP_STICKL,N
  869.  
  870. '
  871. ' STICK(R)
  872. '
  873. STICK 0,1 OUT X,Y
  874. N=0
  875. IF X>-LM && X<LM THEN X=0
  876. IF Y>-LM && Y<LM THEN Y=0
  877. IF Y<-LM THEN N=N OR (1<<#B_LUP)
  878. IF Y> LM THEN N=N OR (1<<#B_LDOWN)
  879. IF X<-LM THEN N=N OR (1<<#B_LLEFT)
  880. IF X> LM THEN N=N OR (1<<#B_LRIGHT)
  881. KEYSUB #INP_STICKR,N
  882.  
  883. '
  884. ' MIX
  885. '
  886. VAR S,RX=0,RY=0,ID=#INP_MIX
  887. X=0:Y=0
  888. '--- VECTOR
  889. FOR N=0 TO #MAX_IDTBL-1
  890. S=IDTBL[N]
  891. IF INP[S,#IMD_VX] THEN X=INP[S,#IMD_VX]
  892. IF INP[S,#IMD_VY] THEN Y=INP[S,#IMD_VY]
  893. IF INP[S,#IMD_REPVX] THEN RX=INP[S,#IMD_REPVX]
  894. IF INP[S,#IMD_REPVY] THEN RY=INP[S,#IMD_REPVY]
  895. NEXT
  896. INP[ID,#IMD_VX]=X
  897. INP[ID,#IMD_VY]=Y
  898. INP[ID,#IMD_REPVX]=RX
  899. INP[ID,#IMD_REPVY]=RY
  900. '--- BUTTON
  901. VAR TP
  902. TP=#IMD_NEW :INP[ID,TP]=INP[#INP_KEY,TP] OR INP[#INP_BUTTON,TP]
  903. TP=#IMD_REPEAT:INP[ID,TP]=INP[#INP_KEY,TP] OR INP[#INP_BUTTON,TP]
  904. TP=#IMD_IMPACT:INP[ID,TP]=INP[#INP_KEY,TP] OR INP[#INP_BUTTON,TP]
  905. END
  906.  
  907.  
  908. '---------------------------------------
  909. ' CHECK KEY REPEAT
  910. '---------------------------------------
  911. DEF KEYREP N,C OUT _F,_C
  912. _F=0:_C=0
  913. IF N==0 THEN RETURN
  914. _C=C+1
  915. _F=((_C==1) || ((_C>=KW1) && ((_C-KW1) MOD KW2)==0))
  916. END
  917.  
  918. '---------------------------------------
  919. ' CHECK REPEAT, MAKE VECTOR
  920. '---------------------------------------
  921. DEF KEYSUB ID,N
  922. '---
  923. INP[ID,#IMD_OLD]=INP[ID,#IMD_NEW]
  924. INP[ID,#IMD_NEW]=N
  925. '--- IMPACT
  926. INP[ID,#IMD_IMPACT]=N AND (NOT INP[ID,#IMD_OLD])
  927. '--- REPEAT
  928. VAR R=0,T=INP[ID,#IMD_TIME]
  929. IF INP[ID,#IMD_OLD]!=N THEN T=0 ELSE INC T
  930. IF T==0 || (T>=KW1 && ((T-KW1) MOD KW2)==0) THEN R=N
  931. INP[ID,#IMD_TIME]=T
  932. INP[ID,#IMD_REPEAT]=R
  933. '--- VECTOR(REPEAT)
  934. VAR VX=0,VY=0
  935. IF R AND (1<<#B_LUP) THEN DEC VY
  936. IF R AND (1<<#B_LDOWN) THEN INC VY
  937. IF R AND (1<<#B_LLEFT) THEN DEC VX
  938. IF R AND (1<<#B_LRIGHT) THEN INC VX
  939. INP[ID,#IMD_REPVX]=VX
  940. INP[ID,#IMD_REPVY]=VY
  941. '--- VECTOR(NEW)
  942. VX=0:VY=0
  943. IF N AND (1<<#B_LUP) THEN DEC VY
  944. IF N AND (1<<#B_LDOWN) THEN INC VY
  945. IF N AND (1<<#B_LLEFT) THEN DEC VX
  946. IF N AND (1<<#B_LRIGHT) THEN INC VX
  947. INP[ID,#IMD_VX]=VX
  948. INP[ID,#IMD_VY]=VY
  949. END
  950.  
  951. '=======================================
  952. '■特殊キーの状態
  953. '=======================================
  954. COMMON DEF SB_KEYSTAT(N$)
  955. IF N$=="INS" || N$=="INSERT" THEN RETURN INSMODE
  956. IF N$=="ESC" || N$=="ESCAPE" THEN RETURN ISESC
  957. IF N$=="BS" || N$=="BACKSPACE" THEN RETURN ISBS
  958. IF N$=="DEL" || N$=="DELETE" THEN RETURN ISDEL
  959. IF N$=="ENT" || N$=="ENTER" THEN RETURN ISENT
  960. IF N$=="CAPS" || N$=="CAPSLOCK" THEN RETURN CAPSMODE
  961. IF N$=="SHIFT" THEN RETURN ISSHIFT
  962. IF N$=="CTRL" THEN RETURN ISCTRL
  963. END
  964.  
  965. '=======================================
  966. '■ビット単位のボタン情報
  967. '=======================================
  968. COMMON DEF SB_BUTTON(ID$,MD$)
  969. VAR ID,MD
  970. GETIDMODE ID$,MD$ OUT ID,MD
  971. IF ID==-1 || MD==-1 THEN RETURN 0 'NONE
  972. RETURN INP[ID,MD]
  973. END
  974.  
  975. '---------------------------------------
  976. ' GET ID&MODE
  977. '---------------------------------------
  978. DEF GETIDMODE ID$,MD$ OUT _ID,_MD
  979. VAR ID=-1,MD=-1
  980. '---
  981. IF ID$=="MIX" THEN ID=#INP_MIX
  982. IF ID$=="BUTTON" THEN ID=#INP_BUTTON
  983. IF ID$=="KEY" THEN ID=#INP_KEY
  984. IF ID$=="STICKL" THEN ID=#INP_STICKL
  985. IF ID$=="STICKR" THEN ID=#INP_STICKR
  986. '---
  987. IF MD$=="NEW" THEN MD=#IMD_NEW
  988. IF MD$=="REPEAT" THEN MD=#IMD_REPEAT
  989. IF MD$=="IMPACT" THEN MD=#IMD_IMPACT
  990. IF MD$=="RELEASE" THEN MD=#IMD_RELEASE
  991. IF MD$=="OLD" THEN MD=#IMD_OLD
  992. '---
  993. _ID=ID
  994. _MD=MD
  995. END
  996.  
  997. '=======================================
  998. '■方向キーによる移動量
  999. '=======================================
  1000. COMMON DEF SB_BUTVEC ID$,MD$ OUT _VX,_VY
  1001. VAR ID,MD
  1002. GETIDMODE ID$,MD$ OUT ID,MD
  1003. _VX=0:_VY=0
  1004. IF ID!=-1 THEN
  1005. IF MD$=="NEW" THEN
  1006. _VX=INP[ID,#IMD_VX]
  1007. _VY=INP[ID,#IMD_VY]
  1008. ELSEIF MD$=="REPEAT" THEN
  1009. _VX=INP[ID,#IMD_REPVX]
  1010. _VY=INP[ID,#IMD_REPVY]
  1011. ENDIF
  1012. ENDIF
  1013. END
  1014.  
  1015.  
  1016. '=======================================
  1017. '■タッチ&マウス情報取得
  1018. '=======================================
  1019. COMMON DEF SB_TOUCHMOUSE SW
  1020. '--- TOUCH
  1021. TOUCH OUT TCS,TCX,TCY
  1022. TCR=(TCS==1) || ((TCS>KW1) && (((TCS-KW1) MOD KW2)==0))
  1023. '--- MOUSE:BUTTON
  1024. OLDMOSBN=MOSBN
  1025. MOSBN=MBUTTON() 'b0=L,b1=R,b2=C
  1026. IF MOSBN==0 THEN MOSBN=MOSBN OR (TCS==1)
  1027. MOSBI=MOSBN AND (NOT OLDMOSBN)
  1028. VAR MC=MOSBNCNT
  1029. IF OLDMOSBN==MOSBN THEN INC MC ELSE MC=0
  1030. IF MC==1 || ((MC>KW1) && (((MC-KW1) MOD KW2)==0)) THEN
  1031. MOSBR=MOSBN
  1032. ELSE
  1033. MOSBR=0
  1034. ENDIF
  1035. MOSBNCNT=MC
  1036. '--- MOUSE:座標&ホイール
  1037. OLDMOSX=MOSX
  1038. OLDMOSY=MOSY
  1039. OLDMOSW=MOSW
  1040. MOUSE 0 OUT MOSX,MOSY,MOSW
  1041. IF SW && TCS THEN MOSX=TCX:MOSY=TCY
  1042. MOSVX=MOSX-OLDMOSX
  1043. MOSVY=MOSY-OLDMOSY
  1044. MOSVW=MOSW-OLDMOSW
  1045. END
  1046.  
  1047. '=======================================
  1048. '■タッチ情報取得
  1049. '=======================================
  1050. COMMON DEF SB_GETTOUCH OUT X,Y,N,R
  1051. X=TCX:Y=TCY:N=TCS:R=TCR
  1052. END
  1053.  
  1054. '=======================================
  1055. '■マウス情報取得
  1056. '=======================================
  1057. COMMON DEF SB_GETMOUSE OUT X,Y,W
  1058. X=MOSX:Y=MOSY:W=MOSW
  1059. END
  1060. '---
  1061. COMMON DEF SB_GETMOSBUT OUT N,I,R
  1062. N=MOSBN:I=MOSBI:R=MOSBR
  1063. END
  1064. '---
  1065. COMMON DEF SB_GETMOSVEC OUT X,Y,W
  1066. X=MOSVX:Y=MOSVY:W=MOSVW
  1067. END
  1068.  
  1069.  
  1070. '=======================================
  1071. '■角丸四角の描画(かならずぐうすうさいずになる)
  1072. '=======================================
  1073. COMMON DEF GRFILL X1,Y1,X2,Y2,C,R
  1074. GPUTBUT X1,Y1,X2,Y2,C,R,0
  1075. END
  1076.  
  1077. '=======================================
  1078. '■角丸四角ボタンの描画(かならずぐうすうさいずになる)
  1079. 'X1,Y1:してん
  1080. 'X2,Y2:しゅうてん
  1081. ' C:いろ
  1082. ' R:角丸はんけい
  1083. ' ATR:角四角していビット(b3= b2= b1= b0=)
  1084. '=======================================
  1085. COMMON DEF GPUTBUT X1,Y1,X2,Y2,C,R,ATR
  1086. '--- はばとたかさをもとめる(いちのちょうせいふくむ)
  1087. IF X1>X2 THEN SWAP X1,X2
  1088. IF Y1>Y2 THEN SWAP Y1,Y2
  1089. VAR W=(((X2-X1)+1) DIV 2)*2
  1090. VAR H=(((Y2-Y1)+1) DIV 2)*2
  1091. VAR RR=R*2
  1092. VAR CX=X1+W/2,CY=Y1+H/2
  1093. '--- たてなが?
  1094. IF W<H && RR>W THEN
  1095. R=W/2
  1096. GCIRCLEF CX,Y1+R,R,C,ATR AND &B1100
  1097. GCIRCLEF CX,Y2-R,R,C,ATR AND &B0011
  1098. GFILL X1,Y1+R,X2,Y2-R,C
  1099. RETURN
  1100. ENDIF
  1101. '--- よこなが?
  1102. IF W>H && RR>H THEN
  1103. R=H/2
  1104. GCIRCLEF X1+R,CY,R,C,ATR AND &B1100
  1105. GCIRCLEF X2-R,CY,R,C,ATR AND &B0011
  1106. GFILL X1+R,Y1,X2-R,Y2,C
  1107. RETURN
  1108. ENDIF
  1109. '--- つうじょう
  1110. GCIRCLEF X1+R,Y1+R,R,C,ATR AND &B1000
  1111. GCIRCLEF X2-R,Y1+R,R,C,ATR AND &B0100
  1112. GCIRCLEF X1+R,Y2-R,R,C,ATR AND &B0010
  1113. GCIRCLEF X2-R,Y2-R,R,C,ATR AND &B0001
  1114. GFILL X1+R,Y1,X2-R,Y2,C
  1115. GFILL X1,Y1+R,X2,Y2-R,C
  1116. END
  1117.  
  1118. '---------------------------------------
  1119. ' CIRCLE/FILL
  1120. '---------------------------------------
  1121. DEF GCIRCLEF X,Y,RR,C,ATR
  1122. IF ATR THEN
  1123. GFILL X-RR,Y-RR,X+RR,Y+RR,C
  1124. RETURN
  1125. ENDIF
  1126. '--- 色分解
  1127. VAR R,G,B,A,TP=#G_ALPHA
  1128. RGB C OUT A,R,G,B
  1129. '---
  1130. GCIRCLE X,Y,RR,RGB(1,R,G,B)
  1131. GPAINT X,Y,C,RGB(1,R,G,B)
  1132. GCIRCLE X,Y,RR,C
  1133. '--- アンチエイリアス用に色分解
  1134. 'VAR R,G,B,A,TP=#G_ALPHA
  1135. 'RGB C OUT A,R,G,B
  1136. 'VAR C2=RGB(200,R/2,G/2,B/2)
  1137. 'GCIRCLE X,Y,RR,C2,#G_ALPHA
  1138. END
  1139.  
  1140.  
  1141. '===== END OF SOURCE =====
  1142.  
  1143. '"
  1144. ' SMILEBOOM LIBRARY "
  1145. '"
  1146. '
  1147. ' どこか適当なスロットでEXECしてから利用します
  1148. '
  1149. ' (C)SMILEBOOM
  1150. '
  1151. ' 2019.01.07:USBKEY、BUTTON、STICKの統合型情報取得
  1152. ' 2019.01.07:フォントの状態確認
  1153. ' 2019.01.07:複数行対応の文字列入力ウィンドウ
  1154. ' 2019.01.08:BUTVECのタイプ対応
  1155. ' 2019.02.04:複数行入力はすべての行を返す
  1156. '---------------------------------------
  1157. ' 2019.03.31:文字列入力の引数を文字数に変更
  1158. ' 2019.04.11:最初の文字列が受け取れないバグ修正
  1159. '---------------------------------------
  1160. ' 2019.04.14:複数行入力プロポーショナル扱いをやめる
  1161. ' 2019.04.24:INKEY$()のBSとENTERを受け付ける
  1162. ' 2019.04.30:スプライト検索処理追加
  1163. ' 2019.05.07:GRFILL(角丸四角の描画)
  1164. ' 2019.05.07:GPUTBUT(角丸四角ボタンの描画)
  1165. '
  1166. OPTION STRICT
  1167. VAR VER$="1.1"
  1168.  
  1169. '--- BUTTON(KEYBOARD/STICK)
  1170. ENUM \
  1171. #INP_MIX=0,\
  1172. #INP_BUTTON,\
  1173. #INP_KEY,\
  1174. #INP_STICKL,\
  1175. #INP_STICKR,\
  1176. #MAX_INP
  1177.  
  1178. ENUM \
  1179. #IMD_NEW=0,\
  1180. #IMD_REPEAT,\
  1181. #IMD_IMPACT,\
  1182. #IMD_RELEASE,\
  1183. #IMD_VX,\
  1184. #IMD_VY,\
  1185. #IMD_REPVX,\
  1186. #IMD_REPVY,\
  1187. #IMD_OLD,\
  1188. #IMD_TIME,\
  1189. #IMD_X,\
  1190. #IMD_Y,\
  1191. #MAX_IMD
  1192.  
  1193. CONST #MAX_IDTBL=3
  1194. DIM IDTBL[#MAX_IDTBL]=[\
  1195. #INP_BUTTON,\
  1196. #INP_KEY,\
  1197. #INP_STICKL\
  1198. ]
  1199. VAR OLDKEY$="",KEY$=""
  1200. VAR INSMODE=0,CAPSMODE=0,ISESC=0,ISSHIFT=0,ISCTRL=0
  1201. VAR ISBS=0,BSCNT=0,ISDEL=0,DELCNT=0
  1202. VAR ISENT=0,ENTCNT=0,ISTAB=0,TABCNT=0
  1203. VAR INP[#MAX_INP,#MAX_IMD]
  1204.  
  1205. '--- TOUCH&MOUSE
  1206. VAR TCX=0,TCY=0,TCS=0,TCR=0
  1207. VAR OLDMOSBN=0,MOSBNCNT=0,MOSBN=0,MOSBR=0,MOSBI=0
  1208. VAR OLDMOSX=0,OLDMOSY=0,MOSX=0,MOSY=0,MOSVX=0,MOSVY=0
  1209. VAR OLDMOSW=0,MOSW=0,MOSVW=0
  1210.  
  1211. '--- KEY REPEAT
  1212. VAR KW1,KW2
  1213. SYSPARAM "KEYREPEAT" OUT KW1,KW2
  1214.  
  1215. '--- FONT
  1216. DIM FONTX[128],FONTW[128]
  1217. VAR FONTPROP=0,FONTSIZE=16
  1218.  
  1219. '--- SCREEN
  1220. VAR SCW,SCH
  1221.  
  1222. '--- GPAGE
  1223. CONST #GPAGE_WORK =0
  1224. CONST #GPAGE_DEFSP=4
  1225.  
  1226. '--- WORK
  1227. CONST #EDGE=2,#CAPH=11,#LCW=2
  1228. VAR OLDGP
  1229. VAR WINGX,WINGY,WINGW,WINGH,WINHX,WINHY
  1230. VAR WINCX,WINCY,WINCW,WINCH
  1231. DIM GTMP[2048*2048]
  1232.  
  1233. '--- COLOR
  1234. CONST #C_CSRON =#C_YELLOW 'RGB(240,255,255,200)
  1235. CONST #C_CSROFF =RGB(120, 0,120,255)
  1236. CONST #C_WINBASE=#C_NAVY
  1237. CONST #C_WINEDGE=#C_WHITE
  1238. CONST #C_CLOSE =RGB(255,128,128,220)
  1239.  
  1240. '--- MESSAGE
  1241. CONST #MSGOX=2,#MSGOY=4
  1242. CONST #MAX_MSG=2048/16
  1243. CONST #ALP=2
  1244. CONST #DEFSPACE=4
  1245. CONST #DEFENTY=2
  1246. VAR LF$=CHR$(10)
  1247. DIM MSG$[#MAX_MSG]
  1248. VAR MSGLINECNT=0,MSGENTY=FONTSIZE
  1249. VAR MSGW,MSGH,CSRX,CSRY
  1250. VAR MSGGX,MSGGY,MSGGW,MSGGH
  1251. VAR MSGTW,MSGTH
  1252. VAR MSGMARGIN=0
  1253.  
  1254. '--- SPRITE
  1255. CONST #SP_LIBTOP =4090
  1256. CONST #SP_LIBEND =4094
  1257. VAR SPTOP =#SP_LIBTOP,SPEND=#SP_LIBEND
  1258. VAR SP_WIN,SP_SHADOW,SP_CSR
  1259. VAR SP_HITCHK
  1260.  
  1261. '--- HIT CHECK
  1262. CONST #MAX_CHKLIST=100
  1263. DIM CHKLIST[#MAX_CHKLIST],CHKSP[#MAX_CHKLIST]
  1264.  
  1265. '--- INITIALIZE
  1266. SB_INITLIB #SP_LIBTOP,#SP_LIBEND
  1267. END
  1268.  
  1269.  
  1270. '--- DEBUG
  1271. ACLS
  1272. 'XSCREEN 640,360,2,0
  1273. 'XSCREEN 1280,720,1,0
  1274. VAR C$="複数行対応 テキストエディター"
  1275. VAR M$="ABCdefghiJKlmn さんぷる"+LF$+"2ND LINE"+LF$+"てきとうなもじれつahikl"
  1276. VAR A$=SB_EDIT$(32,64,320,128,C$,M$,"USER_FUNC")
  1277. PRINT A$
  1278. PRINT "LEN MSG:";SB_MSGLEN(M$)
  1279. END
  1280.  
  1281. '
  1282. ' TEST(スロットを超えて呼び出されるので、必ず COMMONDEF として定義)
  1283. '
  1284. COMMON DEF USER_FUNC
  1285. PRINT "USER"
  1286. END
  1287.  
  1288.  
  1289. '
  1290. ' SMILEBOOM LIBRARY PROGRAM
  1291. '
  1292.  
  1293. '=======================================
  1294. '■存在確認用
  1295. '=======================================
  1296. COMMON DEF SB_LIB()
  1297. 'CHKCALL("SB_LIB")==TRUE
  1298. RETURN VER$
  1299. END
  1300.  
  1301. '=======================================
  1302. '■ライブラリ初期設定
  1303. '=======================================
  1304. COMMON DEF SB_INITLIB ST,SE
  1305. '---
  1306. SPTOP=ST:SPEND=SE
  1307. '---
  1308. XSCREEN OUT SCW,SCH
  1309. '---
  1310. SP_HITCHK=SPSET(SPTOP,SPEND,0,0,8,8,0)
  1311. SPCOLOR SP_HITCHK,#C_CLEAR
  1312. SB_CHKFONT #DEFSPACE
  1313. SB_INITMSG FONTPROP,FONTSIZE,MSGMARGIN,#DEFENTY
  1314. END
  1315.  
  1316. '
  1317. ' ### SPRITE HELPER
  1318. '
  1319.  
  1320. '=======================================
  1321. '■進行方向にあるスプライトを探す(十字方向のみの移動に限定)
  1322. '=======================================
  1323. COMMON DEF SB_SPSCAN(SP,VX,VY,MSK)
  1324. '--- 移動していない?
  1325. IF VX==0 && VY==0 THEN RETURN -1
  1326. '--- X優先(方向限定:斜めには動かさない)
  1327. IF VX && VY THEN VY=0
  1328. '--- 発生元情報取得
  1329. VAR U,V,W,H,OX,OY
  1330. SPOFS SP,1 OUT OX,OY
  1331. SPCHR SP OUT U,V,W,H
  1332. '--- 当たり判定用のスプライト準備
  1333. VAR BX=OX+W/2,BY=OY+H/2
  1334. SPOFS SP_HITCHK,BX,BY,-4000
  1335. SPCHR SP_HITCHK,,,W,H
  1336. SPHOME SP_HITCHK,W/2,H/2
  1337. SPCOL SP_HITCHK,0,MSK
  1338. SPCOLVEC SP_HITCHK,VX*SCW,VY*SCW
  1339. SPCOLOR SP_HITCHK,#C_CLEAR
  1340. '--- 進行方向にあるスプライトを探す
  1341. VAR CNT=0
  1342. VAR NX=SPHITSP(SP_HITCHK)
  1343. IF NX!=-1 THEN
  1344. '--- 1個目発見
  1345. SPOFS NX,1 OUT OX,OY '+PARENT
  1346. CHKSP[CNT]=NX
  1347. CHKLIST[CNT]=((OX-BX)*VX)+((OY-BY)*VY)
  1348. INC CNT
  1349. '--- 他にもあるか?(続きの確認)
  1350. LOOP
  1351. NX=SPHITSP()
  1352. IF NX==-1 THEN BREAK
  1353. '---
  1354. SPOFS NX,1 OUT OX,OY '+PARENT
  1355. CHKSP[CNT]=NX
  1356. CHKLIST[CNT]=((OX-BX)*VX)+((OY-BY)*VY)
  1357. INC CNT
  1358. IF CNT>=#MAX_CHKLIST THEN BREAK
  1359. ENDLOOP
  1360. '--- 1個だけなら自分自身
  1361. IF CNT>1 THEN
  1362. '--- 近い順に並べる
  1363. SORT 0,CNT,CHKLIST,CHKSP
  1364. NX=CHKSP[1] '0番目は自分自身なので1番目を使う
  1365. RETURN NX
  1366. ENDIF
  1367. ENDIF
  1368. '--- 正面に見つからないときは両側面を探す
  1369. VAR CVX=SCW,CVY=SCW
  1370. IF VX THEN CVX=0 ELSE CVY=0
  1371. NX=-1
  1372. LOOP
  1373. BX=BX+(VX*W):BY=BY+(VY*H)
  1374. IF BX<0 || BX>SCW THEN BREAK
  1375. IF BY<0 || BY>SCH THEN BREAK
  1376. SPOFS SP_HITCHK,BX,BY
  1377. SPCOLVEC SP_HITCHK, CVX, CVY
  1378. NX=SPHITSP(SP_HITCHK):IF NX!=-1 THEN BREAK
  1379. SPCOLVEC SP_HITCHK,-CVX,-CVY
  1380. NX=SPHITSP(SP_HITCHK):IF NX!=-1 THEN BREAK
  1381. ENDLOOP
  1382. '---
  1383. RETURN NX
  1384. END
  1385.  
  1386.  
  1387. '=======================================
  1388. '■ウィンドウ
  1389. '=======================================
  1390. COMMON DEF SB_WINSTAT OUT ED,CP
  1391. ED=#EDGE
  1392. CP=#CAPH
  1393. END
  1394.  
  1395. '=======================================
  1396. '■ウィンドウ
  1397. '=======================================
  1398. COMMON DEF SB_WINOPEN(X,Y,W,H,CP$)
  1399. '--- BACKUP IMAGE
  1400. WINGW=W+#EDGE*2
  1401. WINGH=H+#EDGE*2+#CAPH
  1402. WINGX=2048-WINGW
  1403. WINGY=2048-WINGH
  1404. OLDGP=GTARGET()
  1405. GTARGET #GPAGE_WORK
  1406. GSAVE WINGX,WINGY,WINGW,WINGH,GTMP
  1407. '--- CREATE WINDOW
  1408. VAR EX=WINGX+WINGW,EY=WINGY+WINGH
  1409. GFILL WINGX ,WINGY ,EX-1,EY-1,#C_CLEAR
  1410. GFILL WINGX+1,WINGY ,EX-2,EY-1,#C_WINEDGE
  1411. GFILL WINGX ,WINGY+1,EX-1,EY-2,#C_WINEDGE
  1412. '--- CLOSE AREA
  1413. WINCW=32:WINCH=#EDGE+#CAPH-2
  1414. WINCX=EX-WINCW:WINCY=WINGY
  1415. GFILL WINCX ,WINCY,WINCX+WINCW-1,WINCY+WINCH-2,#C_CLOSE
  1416. GFILL WINCX+1 ,WINCY,WINCX+WINCW-1,WINCY+WINCH-1,#C_CLOSE
  1417. GPUTCHR WINCX+13,WINCY+2,"",8,#C_WHITE,#ALP
  1418. '--- キャプションをのぞいたざひょう
  1419. WINHX=WINGX+#EDGE
  1420. WINHY=WINGY+#EDGE+#CAPH
  1421. GFILL WINHX,WINHY,WINHX+W-1,WINHY+H-1,#C_WINBASE
  1422. GTARGET OLDGP
  1423. '--- SPRITE:WINDOW
  1424. VAR OLDSPG=SPPAGE()
  1425. SPPAGE #GPAGE_WORK
  1426. SP_WIN=SPSET(SPTOP,SPEND,WINGX,WINGY,WINGW,WINGH,0)
  1427. SPOFS SP_WIN,X,Y
  1428. '--- CLOSE BUTTON
  1429. WINCX=X+WINGW-WINCW:WINCY=Y
  1430. '--- SPRITE:SHADOW
  1431. SP_SHADOW=SPSET(SPTOP,SPEND,WINGX,WINGY,WINGW,WINGH,0)
  1432. SPLINK SP_SHADOW,SP_WIN
  1433. SPCOLOR SP_SHADOW,RGB(160,0,0,0)
  1434. SPOFS SP_SHADOW,3,3,20
  1435. SPPAGE OLDSPG
  1436. '--- CAPTION
  1437. GPUTCHR WINGX+#EDGE+2,WINGY+#EDGE+1,CP$,8,#C_BLACK,#ALP
  1438. '---
  1439. RETURN SP_WIN
  1440. END
  1441.  
  1442. '=======================================
  1443. '■CLOSE
  1444. '=======================================
  1445. COMMON DEF SB_WINCLOSE
  1446. SPCLR SP_WIN
  1447. SPCLR SP_SHADOW
  1448. GTARGET OLDGP
  1449. GLOAD WINGX,WINGY,WINGW,WINGH,GTMP,0
  1450. END
  1451.  
  1452. '=======================================
  1453. '■CHECK CLOSE BUTTON
  1454. '=======================================
  1455. COMMON DEF SB_CHKWINCLOSE(X,Y)
  1456. IF X<WINCX || X>=WINCX+WINCW THEN RETURN 0
  1457. IF Y<WINCY || Y>=WINCY+WINCH THEN RETURN 0
  1458. RETURN 1
  1459. END
  1460.  
  1461.  
  1462. '
  1463. ' ### MULTILINE TEXT EDITOR
  1464. '
  1465.  
  1466. '=======================================
  1467. '■文字列の入力(複数行対応)
  1468. '=======================================
  1469. COMMON DEF SB_EDIT$(DX,DY,TW,TH,CP$,MS$,USER$)
  1470. '--- CALC DOTSIZE
  1471. MSGTW=TW:MSGTH=TH
  1472. VAR DW=(TW*(FONTSIZE+MSGMARGIN))+#MSGOX*2
  1473. VAR DH=(TH*MSGENTY)+#MSGOY
  1474. '--- CREATE WINDOW
  1475. SP_WIN=SB_WINOPEN(DX,DY,DW,DH+#LCW,CP$)
  1476. GTARGET #GPAGE_WORK
  1477. '--- MAX MSGLINE ON WINDOW
  1478. MSGW=TW 'DW DIV (FONTSIZE+MSGMARGIN)
  1479. MSGH=TH
  1480. MSGGX=WINHX:MSGGY=WINHY
  1481. MSGGW=DW-MSGMARGIN*4:MSGGH=DH-MSGENTY
  1482. '--- SPLIT MESSAGE
  1483. VAR C$
  1484. VAR I=0,MC=0
  1485. FILL MSG$,""
  1486. LOOP
  1487. C$=MID$(MS$,I,1):INC I
  1488. IF C$=="" THEN INC MC:BREAK
  1489. IF C$==LF$ THEN
  1490. INC MC
  1491. ELSE
  1492. IF LEN(MSG$[MC])<MSGTW THEN
  1493. MSG$[MC]=MSG$[MC]+C$
  1494. ENDIF
  1495. ENDIF
  1496. ENDLOOP
  1497. IF MC==0 THEN INC MC
  1498. MSGLINECNT=MC
  1499. '--- SPRITE:CURSOR
  1500. VAR OLDSPG=SPPAGE()
  1501. CSRY=MSGLINECNT-1:IF CSRY>=MSGH-1 THEN CSRY=MSGH-1
  1502. CSRX=LEN(MSG$[CSRY])
  1503. SPPAGE -1
  1504. SP_CSR=SPSET(SPTOP,SPEND,0,0,2,18,0)
  1505. SPLINK SP_CSR,SP_WIN
  1506. SPVAR SP_CSR,"HX",(WINHX-WINGX)+#EDGE/2
  1507. SPVAR SP_CSR,"HY",(WINHY-WINGY)+#EDGE/2
  1508. SPVAR SP_CSR,"OX",CSRX
  1509. SPVAR SP_CSR,"OY",CSRY
  1510. SPFUNC SP_CSR,"SPFUNC_CSRINPUT"
  1511. SPCOLOR SP_CSR,#C_CSRON
  1512. SPANIM SP_CSR,"C",8,#C_CSRON,8,#C_CSROFF,0
  1513. SETCSROFS SP_CSR
  1514. SPPAGE OLDSPG
  1515. '--- CHECK ENTER&DRAW
  1516. FOR I=0 TO MSGH-1
  1517. EDPUTLINE I
  1518. NEXT
  1519.  
  1520. '
  1521. ' ### MAIN LOOP
  1522. '
  1523. LOOP
  1524. VSYNC
  1525. SB_INPUT 0 'USBKEY NOT GAMEMODE
  1526. SB_TOUCHMOUSE 1
  1527. EDITOR
  1528. IF CHKCALL(USER$) THEN CALL USER$
  1529. CALL SPRITE
  1530. IF SB_BUTTON("BUTTON","IMPACT") AND (1<<#B_RDOWN) THEN BREAK
  1531. IF ISESC THEN BREAK
  1532. IF (MOSBI AND &H01) && SB_CHKWINCLOSE(MOSX,MOSY) THEN BREAK
  1533. IF MOSBI AND &H02 THEN BREAK
  1534. ENDLOOP
  1535.  
  1536. '--- CLOSE
  1537. SB_WINCLOSE
  1538. SPCLR SP_CSR
  1539.  
  1540. '--- MAKE MESSAGE
  1541. VAR TX$=""
  1542. FOR I=0 TO MSGH-1
  1543. TX$=TX$+MSG$[I]+LF$
  1544. NEXT
  1545. RETURN TX$
  1546. END
  1547.  
  1548. '---------------------------------------
  1549. ' INPUT CURSOR
  1550. '---------------------------------------
  1551. DEF SPFUNC_CSRINPUT
  1552. SETCSROFS CALLIDX()
  1553. END
  1554.  
  1555. '---
  1556. DEF SETCSROFS IX
  1557. VAR HX=SPVAR(IX,"HX")
  1558. VAR HY=SPVAR(IX,"HY")
  1559. VAR OX=SB_MSGOFS(CSRX,MSG$[CSRY])
  1560. VAR OY=CSRY*MSGENTY
  1561. SPOFS IX,OX+HX,OY+HY
  1562. END
  1563.  
  1564.  
  1565. '---------------------------------------
  1566. ' MULTI INPUT MAIN
  1567. '---------------------------------------
  1568. DEF EDITOR
  1569. VAR OX=CSRX,OY=CSRY,O,W,L
  1570. VAR HX,HY,DW,DH
  1571.  
  1572. 'LOCATE 2,2
  1573. 'PRINT FORMAT$("%3D,%3D",CSRX,CSRY)
  1574.  
  1575. '--- GET VECTOR
  1576. VAR VX,VY
  1577. SB_BUTVEC "MIX","REPEAT" OUT VX,VY
  1578. VAR BTN=SB_BUTTON("MIX","NEW")
  1579. VAR BTI=SB_BUTTON("BUTTON","IMPACT")
  1580. VAR BTR=SB_BUTTON("MIX","REPEAT")
  1581. VAR INS=SB_KEYSTAT("INS")
  1582. VAR ESC=SB_KEYSTAT("ESC")
  1583. VAR BS=SB_KEYSTAT("BS")
  1584. VAR DEL=SB_KEYSTAT("DEL")
  1585. VAR ENT=SB_KEYSTAT("ENT")
  1586. 'PRINT INS,ESC,BS,DEL,ENT,HEX$(BTN),HEX$(BTN),VX,VY
  1587.  
  1588. '--- ACTION
  1589. IF BS THEN EDSUBBS :VX=0:VY=0
  1590. IF DEL THEN EDSUBDEL:VX=0:VY=0
  1591. IF ENT THEN EDSUBENT:VX=0:VY=0
  1592. IF KEY$!="" THEN EDSETCHR KEY$,INS:VX=0:VY=0
  1593.  
  1594. '--- MOVE X
  1595. VAR SX=LEN(MSG$[CSRY]),SY=MSGH
  1596. CSRX=CSRX+VX
  1597. IF VX<0 && CSRX<0 THEN
  1598. CSRX=0:DEC CSRY
  1599. IF CSRY<0 THEN CSRY=0 ELSE CSRX=LEN(MSG$[CSRY])
  1600. ENDIF
  1601. IF VX>0 && CSRX>SX THEN
  1602. CSRX=SX
  1603. INC CSRY
  1604. IF CSRY>=SY THEN CSRY=SY-1 ELSE CSRX=0
  1605. ENDIF
  1606.  
  1607. '--- MOVE Y
  1608. IF VX==0 && VY THEN
  1609. CSRY=CSRY+VY
  1610. IF CSRY<0 THEN CSRY=0
  1611. IF CSRY>=SY THEN CSRY=SY-1
  1612. ENDIF
  1613. SX=LEN(MSG$[CSRY])
  1614. IF CSRX>SX THEN CSRX=SX
  1615. END
  1616.  
  1617. '---------------------------------------
  1618. ' BACKSPACE:1文字前を消す
  1619. '---------------------------------------
  1620. DEF EDSUBBS
  1621. VAR C$,H$,T$,M$=MSG$[CSRY]
  1622. VAR NX,I,L=LEN(M$),L2
  1623. '--- 一番前?
  1624. IF CSRX==0 THEN
  1625. '--- カーソルより後ろに文字列があるか?
  1626. NX=LEN(MSG$[CSRY-(CSRY!=0)])
  1627. IF L THEN
  1628. '--- 上の行に残り文字列を結合
  1629. IF CSRY THEN
  1630. '--- 1文字ずつ追加して収まるかどうかを判定(プロポーショナル対応)
  1631. H$=MSG$[CSRY-1]:NX=LEN(MSG$[CSRY-1])
  1632. WHILE M$!=""
  1633. C$=LEFT$(M$,1)
  1634. IF SB_MSGLEN( H$+C$ )>MSGGW THEN BREAK
  1635. M$=RIGHT$(M$,LEN(M$)-1)
  1636. H$=H$+C$
  1637. WEND
  1638. '--- 上の行に収まりきらなかったら一部を結合し残りは前の行に残す
  1639. MSG$[CSRY-1]=H$:EDPUTLINE CSRY-1
  1640. MSG$[CSRY]=M$ :EDPUTLINE CSRY
  1641. ENDIF
  1642. ENDIF
  1643. '--- 1行削除
  1644. IF M$=="" THEN
  1645. FOR I=CSRY TO MSGH-1
  1646. MSG$[I]=MSG$[I+1]:EDPUTLINE I
  1647. NEXT
  1648. MSG$[MSGH-1]="":EDPUTLINE MSGH-1
  1649. ENDIF
  1650. IF CSRY THEN DEC CSRY:CSRX=NX
  1651. RETURN
  1652. ENDIF
  1653. '---
  1654. H$=MID$(M$,0,CSRX-1)
  1655. T$=MID$(M$,CSRX,L-CSRX)
  1656. DEC CSRX
  1657. MSG$[CSRY]=H$+T$:EDPUTLINE CSRY
  1658. END
  1659.  
  1660. '---------------------------------------
  1661. ' DELETE:1文字後ろを消す
  1662. '---------------------------------------
  1663. DEF EDSUBDEL
  1664. VAR C$,H$,T$,M$=MSG$[CSRY]
  1665. VAR I,L=LEN(M$)
  1666. '--- 一番後ろ?
  1667. IF CSRX>=L THEN
  1668. '--- 下の行から持ってこれるだけ持ってくる
  1669. IF CSRY!=MSGH-1 THEN
  1670. '--- 1文字ずつ追加して収まるかどうかを判定(プロポーショナル対応)
  1671. H$=MSG$[CSRY+1]
  1672. WHILE H$!=""
  1673. C$=LEFT$(H$,1)
  1674. IF SB_MSGLEN( M$+C$ )>MSGGW THEN BREAK
  1675. H$=RIGHT$(H$,LEN(H$)-1)
  1676. M$=M$+C$
  1677. WEND
  1678. MSG$[CSRY+1]=H$:EDPUTLINE CSRY+1
  1679. MSG$[CSRY]=M$ :EDPUTLINE CSRY
  1680. '--- 1行削除?
  1681. IF H$=="" THEN
  1682. FOR I=CSRY+1 TO MSGH-1
  1683. MSG$[I]=MSG$[I+1]:EDPUTLINE I
  1684. NEXT
  1685. MSG$[MSGH-1]="":EDPUTLINE MSGH-1
  1686. ENDIF
  1687. ENDIF
  1688. RETURN
  1689. ENDIF
  1690. '--- 後ろを消す
  1691. H$=MID$(M$,0,CSRX)
  1692. T$=MID$(M$,CSRX+1,L-CSRX)
  1693. MSG$[CSRY]=H$+T$:EDPUTLINE CSRY
  1694. END
  1695.  
  1696. '---------------------------------------
  1697. ' 1文字追加
  1698. '---------------------------------------
  1699. DEF EDSETCHR K$,INS
  1700. '--- 新しい文字は文字数内か?
  1701. VAR M$=MSG$[CSRY]
  1702. IF LEN(M$)>=MSGTW THEN RETURN
  1703. '--- 新しい文字はドット範囲に収まるか?
  1704. VAR L=SB_MSGLEN(M$)
  1705. VAR SX=SB_CHRSIZE(MID$(M$,CSRX,1))
  1706. IF L+SX>MSGGW THEN RETURN '入らない時に押し出すか?
  1707. '--- 新しい文字を追加
  1708. L=LEN(M$):SX=CSRX:IF SX>L THEN SX=L
  1709. VAR H$=MID$(M$,0,SX)
  1710. VAR T$=MID$(M$,CSRX,L-SX)
  1711. MSG$[CSRY]=H$+K$+T$:EDPUTLINE CSRY
  1712. INC CSRX
  1713. END
  1714.  
  1715. '---------------------------------------
  1716. ' 改行
  1717. '---------------------------------------
  1718. DEF EDSUBENT
  1719. VAR M$=MSG$[CSRY]
  1720. VAR I,L=LEN(M$)
  1721. IF CSRY==MSGH-1 THEN RETURN '空きなし
  1722. '--- 最後の行に空きがあるか?
  1723. IF MSG$[MSGH-1]!="" THEN RETURN '空きなし
  1724. '--- 1行ずらす
  1725. FOR I=MSGH-1 TO CSRY+1 STEP -1
  1726. MSG$[I]=MSG$[I-1]:EDPUTLINE I
  1727. NEXT
  1728. '--- 改行時のカーソルより後ろを新しい行へ
  1729. VAR H$=MID$(M$,0,CSRX)
  1730. VAR T$=MID$(M$,CSRX,L-CSRX)
  1731. MSG$[CSRY]=H$:EDPUTLINE CSRY
  1732. CSRX=0:INC CSRY
  1733. MSG$[CSRY]=T$:EDPUTLINE CSRY
  1734. END
  1735.  
  1736. '---------------------------------------
  1737. ' 1行再表示
  1738. '---------------------------------------
  1739. DEF EDPUTLINE Y
  1740. VAR HX=MSGGX
  1741. VAR HY=MSGGY+Y*MSGENTY+#MSGOY
  1742. GFILL HX,HY,HX+MSGGW-1,HY+MSGENTY-1,#C_WINBASE
  1743. SB_GMSG HX,HY,MSG$[Y],#C_WHITE,#ALP
  1744. END
  1745.  
  1746. '
  1747. ' ### FONT/MESSAGE
  1748. '
  1749.  
  1750. '=======================================
  1751. '■メッセージ関係の初期化
  1752. '=======================================
  1753. COMMON DEF SB_INITMSG PR,FS,MG,LY
  1754. IF PR==0 THEN MG=0
  1755. FONTPROP=PR
  1756. FONTSIZE=FS
  1757. MSGMARGIN=MG
  1758. MSGENTY=LY+FONTSIZE
  1759. END
  1760.  
  1761. '=======================================
  1762. '■文字列全体のドット数
  1763. '=======================================
  1764. COMMON DEF SB_MSGLEN( TX$ )
  1765. RETURN SB_MSGOFS( LEN(TX$),TX$ )
  1766. END
  1767.  
  1768. '=======================================
  1769. '■文字列の指定位置までのドット数
  1770. '=======================================
  1771. COMMON DEF SB_MSGOFS( OX,TX$ )
  1772. VAR I=0,X=0,C,W,SC=1,SPC
  1773. VAR C$
  1774. WHILE I<OX
  1775. C$=MID$(TX$,I,1):INC I
  1776. IF C$==CHR$(10) || C$=="" THEN BREAK
  1777. X=X+(SB_CHRSIZE(C$)+MSGMARGIN)*SC
  1778. WEND
  1779. RETURN X
  1780. END
  1781.  
  1782. '=======================================
  1783. '■指定1文字のドット数
  1784. '=======================================
  1785. COMMON DEF SB_CHRSIZE(C$)
  1786. VAR C,FS=FONTSIZE
  1787. IF C$!="" THEN
  1788. C=ASC(C$)
  1789. IF C>=32 && C<128 THEN
  1790. IF FONTPROP THEN FS=FONTW[C]
  1791. ENDIF
  1792. ENDIF
  1793. RETURN FS
  1794. END
  1795.  
  1796. '=======================================
  1797. '■1行表示(プロポーショナル対応)
  1798. '=======================================
  1799. COMMON DEF SB_GMSG HX,HY,TX$,COL,ALP
  1800. VAR I=0,X=0,Y=0,C,FX,W,SC=1
  1801. VAR SPC,TX=HX,ST=FONTSIZE
  1802. VAR C$
  1803. LOOP
  1804. C$=MID$(TX$,I,1):INC I
  1805. IF C$=="" THEN BREAK
  1806. C=ASC(C$):FX=0:W=FONTSIZE:SPC=MSGMARGIN
  1807. IF C<128 THEN
  1808. W=SB_CHRSIZE(C$)
  1809. IF W==FONTSIZE THEN FX=0:SPC=0 ELSE FX=FONTX[C]:SPC=1
  1810. HX=HX-FX*SC
  1811. ENDIF
  1812. GPUTCHR X+HX,Y+HY,C$,ST,SC,SC,COL,ALP
  1813. X=X+(FX+W+SPC)*SC
  1814. ENDLOOP
  1815. END
  1816.  
  1817. '=======================================
  1818. '■フォントのサイズと開始点を調査(プロポーショナル用)
  1819. '=======================================
  1820. COMMON DEF SB_CHKFONT SPCSIZE
  1821. VAR P=GTARGET()
  1822. GTARGET 5 'FONT
  1823. '---
  1824. VAR I=0,U,V,W,H,HX
  1825. VAR SX,HSW,SSW,FS=FONTSIZE
  1826. VAR VTOP=(FS==16)*1024
  1827. VAR C,A,R,G,B
  1828. FOR V=VTOP TO VTOP+FS*2-1 STEP FS
  1829. FOR U=0 TO FS*64-1 STEP FS
  1830. HX=0:SX=0:HSW=0:SSW=0
  1831. FOR W=0 TO FS-1
  1832. FOR H=0 TO FS-1
  1833. RGB GPGET(U+W,H+V) OUT A,R,G,B
  1834. IF A THEN BREAK
  1835. NEXT
  1836. IF H==FS THEN
  1837. IF HSW==0 THEN INC HX ELSE BREAK
  1838. ELSE
  1839. IF HSW==0 THEN HSW=1
  1840. IF HSW THEN INC SX
  1841. ENDIF
  1842. NEXT
  1843. IF HX==FS THEN HX=0:SX=FS
  1844. FONTX[I]=HX:FONTW[I]=SX
  1845. INC I
  1846. NEXT
  1847. NEXT
  1848. '--- SPACE
  1849. C=ASC(" ")
  1850. FONTX[C]=0
  1851. FONTW[C]=SPCSIZE
  1852. '---
  1853. GTARGET P
  1854. END
  1855.  
  1856. '
  1857. ' ### BUTTON/KEY/STICK
  1858. '
  1859.  
  1860. '=======================================
  1861. '■入力系デバイス読込み
  1862. '---------------------------------------
  1863. ' USB=1:USBKEY IS GAMEMODE
  1864. '=======================================
  1865. COMMON DEF SB_INPUT USB
  1866.  
  1867. '--- USBKEY
  1868. CONST #USBKEY_ESC =&H29
  1869. CONST #USBKEY_SPACE =&H2C
  1870. CONST #USBKEY_UP =&H52
  1871. CONST #USBKEY_DOWN =&H51
  1872. CONST #USBKEY_LEFT =&H50
  1873. CONST #USBKEY_RIGHT =&H4F
  1874. CONST #USBKEY_ENTER =&H28
  1875. CONST #USBKEY_ENTER2=&H58
  1876. CONST #USBKEY_CTRL =&HE0
  1877. CONST #USBKEY_CTRL2 =&HE4
  1878. CONST #USBKEY_ALT =&HE2
  1879. CONST #USBKEY_ALT2 =&HE6
  1880. CONST #USBKEY_WIN =&HE3
  1881. CONST #USBKEY_WIN2 =&HE7
  1882. CONST #USBKEY_SHIFT =&HE1
  1883. CONST #USBKEY_SHIFT2=&HE5
  1884. CONST #USBKEY_CAPS =&H39
  1885. CONST #USBKEY_TAB =&H2B
  1886. CONST #USBKEY_INS =&H49
  1887. CONST #USBKEY_DEL =&H4C
  1888. CONST #USBKEY_BS =&H2A
  1889. CONST #USBKEY_HANZEN=&H35
  1890. CONST #USBKEY_AT =&H2F
  1891. '---
  1892. CONST #USBKEY_1 =&H1E
  1893. CONST #USBKEY_2 =&H1F
  1894. CONST #USBKEY_3 =&H20
  1895. CONST #USBKEY_4 =&H21
  1896. CONST #USBKEY_5 =&H22
  1897. CONST #USBKEY_6 =&H23
  1898. CONST #USBKEY_7 =&H24
  1899. CONST #USBKEY_8 =&H25
  1900. CONST #USBKEY_9 =&H26
  1901. CONST #USBKEY_0 =&H27
  1902. CONST #USBKEY_MINUS =&H2D
  1903. CONST #USBKEY_CARET =&H2E '^
  1904. CONST #USBKEY_YEN =&H89
  1905. '---
  1906. CONST #USBKEY_A =&H04
  1907. CONST #USBKEY_B =&H05
  1908. CONST #USBKEY_C =&H06
  1909. CONST #USBKEY_D =&H07
  1910. CONST #USBKEY_E =&H08
  1911. CONST #USBKEY_F =&H09
  1912. CONST #USBKEY_G =&H0A
  1913. CONST #USBKEY_H =&H0B
  1914. CONST #USBKEY_I =&H0C
  1915. CONST #USBKEY_J =&H0D
  1916. CONST #USBKEY_K =&H0E
  1917. CONST #USBKEY_L =&H0F
  1918. CONST #USBKEY_M =&H10
  1919. CONST #USBKEY_N =&H11
  1920. CONST #USBKEY_O =&H12
  1921. CONST #USBKEY_P =&H13
  1922. CONST #USBKEY_Q =&H14
  1923. CONST #USBKEY_R =&H15
  1924. CONST #USBKEY_S =&H16
  1925. CONST #USBKEY_T =&H17
  1926. CONST #USBKEY_U =&H18
  1927. CONST #USBKEY_V =&H19
  1928. CONST #USBKEY_W =&H1A
  1929. CONST #USBKEY_X =&H1B
  1930. CONST #USBKEY_Y =&H1C
  1931. CONST #USBKEY_Z =&H1D
  1932.  
  1933. '
  1934. ' KEY(FROM BASIC)
  1935. '
  1936. VAR KEYBS=0,KEYENT=0
  1937. OLDKEY$=KEY$:KEY$=INKEY$()
  1938. IF KEY$!="" THEN
  1939. IF KEY$==CHR$(8) THEN
  1940. KEY$="":KEYBS=1 'BACKSPACE
  1941. ELSEIF KEY$==CHR$(13) THEN
  1942. KEY$="":KEYENT=1 'ENTER
  1943. ELSEIF ASC(KEY$)<&H20 THEN
  1944. KEY$=""
  1945. ENDIF
  1946. ENDIF
  1947.  
  1948. '
  1949. ' KEY(FROM USB)
  1950. '
  1951. VAR N=0
  1952. IF KEYBOARD(#USBKEY_UP,0) THEN N=N OR (1<<#B_LUP)
  1953. IF KEYBOARD(#USBKEY_DOWN,0) THEN N=N OR (1<<#B_LDOWN)
  1954. IF KEYBOARD(#USBKEY_LEFT,0) THEN N=N OR (1<<#B_LLEFT)
  1955. IF KEYBOARD(#USBKEY_RIGHT,0) THEN N=N OR (1<<#B_LRIGHT)
  1956. '---
  1957. IF USB THEN
  1958. IF KEYBOARD(#USBKEY_SPACE,0) THEN N=N OR (1<<#B_RRIGHT) 'A
  1959. IF KEYBOARD(#USBKEY_W,0) THEN N=N OR (1<<#B_LUP)
  1960. IF KEYBOARD(#USBKEY_S,0) THEN N=N OR (1<<#B_LDOWN)
  1961. IF KEYBOARD(#USBKEY_A,0) THEN N=N OR (1<<#B_LLEFT)
  1962. IF KEYBOARD(#USBKEY_D,0) THEN N=N OR (1<<#B_LRIGHT)
  1963. IF KEYBOARD(#USBKEY_Z,0) THEN N=N OR (1<<#B_RRIGHT) 'A
  1964. IF KEYBOARD(#USBKEY_X,0) THEN N=N OR (1<<#B_RDOWN) 'B
  1965. IF KEYBOARD(#USBKEY_C,0) THEN N=N OR (1<<#B_RLEFT) 'Y
  1966. IF KEYBOARD(#USBKEY_V,0) THEN N=N OR (1<<#B_RUP) 'X
  1967. IF KEYBOARD(#USBKEY_ALT,0) THEN N=N OR (1<<#B_RRIGHT) 'A
  1968. IF KEYBOARD(#USBKEY_ALT2,0) THEN N=N OR (1<<#B_RRIGHT) 'A
  1969. IF KEYBOARD(#USBKEY_WIN,0) THEN N=N OR (1<<#B_RDOWN) 'B
  1970. IF KEYBOARD(#USBKEY_WIN2,0) THEN N=N OR (1<<#B_RDOWN) 'B
  1971. ENDIF
  1972. '--- L/R
  1973. IF KEYBOARD(#USBKEY_SHIFT,0) THEN N=N OR (1<<#B_L1)
  1974. IF KEYBOARD(#USBKEY_CTRL,0) THEN N=N OR (1<<#B_L2)
  1975. IF KEYBOARD(#USBKEY_SHIFT2,0) THEN N=N OR (1<<#B_R1)
  1976. IF KEYBOARD(#USBKEY_CTRL2,0) THEN N=N OR (1<<#B_R2)
  1977. '---
  1978. KEYSUB #INP_KEY,N
  1979.  
  1980. '--- SPECIAL KEY
  1981. ISSHIFT=KEYBOARD(#USBKEY_SHIFT,0) OR KEYBOARD(#USBKEY_SHIFT2,0)
  1982. ISCTRL=KEYBOARD(#USBKEY_CTRL,0) OR KEYBOARD(#USBKEY_CTRL2,0)
  1983. ISESC=KEYBOARD(#USBKEY_ESC,2)
  1984. IF KEYBOARD(#USBKEY_INS,2) THEN INSMODE=!INSMODE
  1985. IF KEYBOARD(#USBKEY_CAPS,2) THEN CAPSMODE=!CAPSMODE
  1986. KEYREP KEYBOARD(#USBKEY_TAB,0),TABCNT OUT ISTAB,TABCNT
  1987. VAR B=KEYBS OR KEYBOARD(#USBKEY_BS,0)
  1988. KEYREP B,BSCNT OUT ISBS,BSCNT
  1989. KEYREP KEYBOARD(#USBKEY_DEL,0),DELCNT OUT ISDEL,DELCNT
  1990. VAR E=KEYBOARD(#USBKEY_ENTER,0) OR KEYBOARD(#USBKEY_ENTER2,0) OR KEYENT
  1991. KEYREP E,ENTCNT OUT ISENT,ENTCNT
  1992.  
  1993. '
  1994. ' BUTTON
  1995. '
  1996. KEYSUB #INP_BUTTON,BUTTON(0)
  1997.  
  1998. '
  1999. ' STICK(L)
  2000. '
  2001. VAR X,Y,LM=0.2
  2002. STICK 0,0 OUT X,Y
  2003. N=0
  2004. IF X>-LM && X<LM THEN X=0
  2005. IF Y>-LM && Y<LM THEN Y=0
  2006. IF Y<-LM THEN N=N OR (1<<#B_LUP)
  2007. IF Y> LM THEN N=N OR (1<<#B_LDOWN)
  2008. IF X<-LM THEN N=N OR (1<<#B_LLEFT)
  2009. IF X> LM THEN N=N OR (1<<#B_LRIGHT)
  2010. KEYSUB #INP_STICKL,N
  2011.  
  2012. '
  2013. ' STICK(R)
  2014. '
  2015. STICK 0,1 OUT X,Y
  2016. N=0
  2017. IF X>-LM && X<LM THEN X=0
  2018. IF Y>-LM && Y<LM THEN Y=0
  2019. IF Y<-LM THEN N=N OR (1<<#B_LUP)
  2020. IF Y> LM THEN N=N OR (1<<#B_LDOWN)
  2021. IF X<-LM THEN N=N OR (1<<#B_LLEFT)
  2022. IF X> LM THEN N=N OR (1<<#B_LRIGHT)
  2023. KEYSUB #INP_STICKR,N
  2024.  
  2025. '
  2026. ' MIX
  2027. '
  2028. VAR S,RX=0,RY=0,ID=#INP_MIX
  2029. X=0:Y=0
  2030. '--- VECTOR
  2031. FOR N=0 TO #MAX_IDTBL-1
  2032. S=IDTBL[N]
  2033. IF INP[S,#IMD_VX] THEN X=INP[S,#IMD_VX]
  2034. IF INP[S,#IMD_VY] THEN Y=INP[S,#IMD_VY]
  2035. IF INP[S,#IMD_REPVX] THEN RX=INP[S,#IMD_REPVX]
  2036. IF INP[S,#IMD_REPVY] THEN RY=INP[S,#IMD_REPVY]
  2037. NEXT
  2038. INP[ID,#IMD_VX]=X
  2039. INP[ID,#IMD_VY]=Y
  2040. INP[ID,#IMD_REPVX]=RX
  2041. INP[ID,#IMD_REPVY]=RY
  2042. '--- BUTTON
  2043. VAR TP
  2044. TP=#IMD_NEW :INP[ID,TP]=INP[#INP_KEY,TP] OR INP[#INP_BUTTON,TP]
  2045. TP=#IMD_REPEAT:INP[ID,TP]=INP[#INP_KEY,TP] OR INP[#INP_BUTTON,TP]
  2046. TP=#IMD_IMPACT:INP[ID,TP]=INP[#INP_KEY,TP] OR INP[#INP_BUTTON,TP]
  2047. END
  2048.  
  2049.  
  2050. '---------------------------------------
  2051. ' CHECK KEY REPEAT
  2052. '---------------------------------------
  2053. DEF KEYREP N,C OUT _F,_C
  2054. _F=0:_C=0
  2055. IF N==0 THEN RETURN
  2056. _C=C+1
  2057. _F=((_C==1) || ((_C>=KW1) && ((_C-KW1) MOD KW2)==0))
  2058. END
  2059.  
  2060. '---------------------------------------
  2061. ' CHECK REPEAT, MAKE VECTOR
  2062. '---------------------------------------
  2063. DEF KEYSUB ID,N
  2064. '---
  2065. INP[ID,#IMD_OLD]=INP[ID,#IMD_NEW]
  2066. INP[ID,#IMD_NEW]=N
  2067. '--- IMPACT
  2068. INP[ID,#IMD_IMPACT]=N AND (NOT INP[ID,#IMD_OLD])
  2069. '--- REPEAT
  2070. VAR R=0,T=INP[ID,#IMD_TIME]
  2071. IF INP[ID,#IMD_OLD]!=N THEN T=0 ELSE INC T
  2072. IF T==0 || (T>=KW1 && ((T-KW1) MOD KW2)==0) THEN R=N
  2073. INP[ID,#IMD_TIME]=T
  2074. INP[ID,#IMD_REPEAT]=R
  2075. '--- VECTOR(REPEAT)
  2076. VAR VX=0,VY=0
  2077. IF R AND (1<<#B_LUP) THEN DEC VY
  2078. IF R AND (1<<#B_LDOWN) THEN INC VY
  2079. IF R AND (1<<#B_LLEFT) THEN DEC VX
  2080. IF R AND (1<<#B_LRIGHT) THEN INC VX
  2081. INP[ID,#IMD_REPVX]=VX
  2082. INP[ID,#IMD_REPVY]=VY
  2083. '--- VECTOR(NEW)
  2084. VX=0:VY=0
  2085. IF N AND (1<<#B_LUP) THEN DEC VY
  2086. IF N AND (1<<#B_LDOWN) THEN INC VY
  2087. IF N AND (1<<#B_LLEFT) THEN DEC VX
  2088. IF N AND (1<<#B_LRIGHT) THEN INC VX
  2089. INP[ID,#IMD_VX]=VX
  2090. INP[ID,#IMD_VY]=VY
  2091. END
  2092.  
  2093. '=======================================
  2094. '■特殊キーの状態
  2095. '=======================================
  2096. COMMON DEF SB_KEYSTAT(N$)
  2097. IF N$=="INS" || N$=="INSERT" THEN RETURN INSMODE
  2098. IF N$=="ESC" || N$=="ESCAPE" THEN RETURN ISESC
  2099. IF N$=="BS" || N$=="BACKSPACE" THEN RETURN ISBS
  2100. IF N$=="DEL" || N$=="DELETE" THEN RETURN ISDEL
  2101. IF N$=="ENT" || N$=="ENTER" THEN RETURN ISENT
  2102. IF N$=="CAPS" || N$=="CAPSLOCK" THEN RETURN CAPSMODE
  2103. IF N$=="SHIFT" THEN RETURN ISSHIFT
  2104. IF N$=="CTRL" THEN RETURN ISCTRL
  2105. END
  2106.  
  2107. '=======================================
  2108. '■ビット単位のボタン情報
  2109. '=======================================
  2110. COMMON DEF SB_BUTTON(ID$,MD$)
  2111. VAR ID,MD
  2112. GETIDMODE ID$,MD$ OUT ID,MD
  2113. IF ID==-1 || MD==-1 THEN RETURN 0 'NONE
  2114. RETURN INP[ID,MD]
  2115. END
  2116.  
  2117. '---------------------------------------
  2118. ' GET ID&MODE
  2119. '---------------------------------------
  2120. DEF GETIDMODE ID$,MD$ OUT _ID,_MD
  2121. VAR ID=-1,MD=-1
  2122. '---
  2123. IF ID$=="MIX" THEN ID=#INP_MIX
  2124. IF ID$=="BUTTON" THEN ID=#INP_BUTTON
  2125. IF ID$=="KEY" THEN ID=#INP_KEY
  2126. IF ID$=="STICKL" THEN ID=#INP_STICKL
  2127. IF ID$=="STICKR" THEN ID=#INP_STICKR
  2128. '---
  2129. IF MD$=="NEW" THEN MD=#IMD_NEW
  2130. IF MD$=="REPEAT" THEN MD=#IMD_REPEAT
  2131. IF MD$=="IMPACT" THEN MD=#IMD_IMPACT
  2132. IF MD$=="RELEASE" THEN MD=#IMD_RELEASE
  2133. IF MD$=="OLD" THEN MD=#IMD_OLD
  2134. '---
  2135. _ID=ID
  2136. _MD=MD
  2137. END
  2138.  
  2139. '=======================================
  2140. '■方向キーによる移動量
  2141. '=======================================
  2142. COMMON DEF SB_BUTVEC ID$,MD$ OUT _VX,_VY
  2143. VAR ID,MD
  2144. GETIDMODE ID$,MD$ OUT ID,MD
  2145. _VX=0:_VY=0
  2146. IF ID!=-1 THEN
  2147. IF MD$=="NEW" THEN
  2148. _VX=INP[ID,#IMD_VX]
  2149. _VY=INP[ID,#IMD_VY]
  2150. ELSEIF MD$=="REPEAT" THEN
  2151. _VX=INP[ID,#IMD_REPVX]
  2152. _VY=INP[ID,#IMD_REPVY]
  2153. ENDIF
  2154. ENDIF
  2155. END
  2156.  
  2157.  
  2158. '=======================================
  2159. '■タッチ&マウス情報取得
  2160. '=======================================
  2161. COMMON DEF SB_TOUCHMOUSE SW
  2162. '--- TOUCH
  2163. TOUCH OUT TCS,TCX,TCY
  2164. TCR=(TCS==1) || ((TCS>KW1) && (((TCS-KW1) MOD KW2)==0))
  2165. '--- MOUSE:BUTTON
  2166. OLDMOSBN=MOSBN
  2167. MOSBN=MBUTTON() 'b0=L,b1=R,b2=C
  2168. IF MOSBN==0 THEN MOSBN=MOSBN OR (TCS==1)
  2169. MOSBI=MOSBN AND (NOT OLDMOSBN)
  2170. VAR MC=MOSBNCNT
  2171. IF OLDMOSBN==MOSBN THEN INC MC ELSE MC=0
  2172. IF MC==1 || ((MC>KW1) && (((MC-KW1) MOD KW2)==0)) THEN
  2173. MOSBR=MOSBN
  2174. ELSE
  2175. MOSBR=0
  2176. ENDIF
  2177. MOSBNCNT=MC
  2178. '--- MOUSE:座標&ホイール
  2179. OLDMOSX=MOSX
  2180. OLDMOSY=MOSY
  2181. OLDMOSW=MOSW
  2182. MOUSE 0 OUT MOSX,MOSY,MOSW
  2183. IF SW && TCS THEN MOSX=TCX:MOSY=TCY
  2184. MOSVX=MOSX-OLDMOSX
  2185. MOSVY=MOSY-OLDMOSY
  2186. MOSVW=MOSW-OLDMOSW
  2187. END
  2188.  
  2189. '=======================================
  2190. '■タッチ情報取得
  2191. '=======================================
  2192. COMMON DEF SB_GETTOUCH OUT X,Y,N,R
  2193. X=TCX:Y=TCY:N=TCS:R=TCR
  2194. END
  2195.  
  2196. '=======================================
  2197. '■マウス情報取得
  2198. '=======================================
  2199. COMMON DEF SB_GETMOUSE OUT X,Y,W
  2200. X=MOSX:Y=MOSY:W=MOSW
  2201. END
  2202. '---
  2203. COMMON DEF SB_GETMOSBUT OUT N,I,R
  2204. N=MOSBN:I=MOSBI:R=MOSBR
  2205. END
  2206. '---
  2207. COMMON DEF SB_GETMOSVEC OUT X,Y,W
  2208. X=MOSVX:Y=MOSVY:W=MOSVW
  2209. END
  2210.  
  2211.  
  2212. '=======================================
  2213. '■角丸四角の描画(かならずぐうすうさいずになる)
  2214. '=======================================
  2215. COMMON DEF GRFILL X1,Y1,X2,Y2,C,R
  2216. GPUTBUT X1,Y1,X2,Y2,C,R,0
  2217. END
  2218.  
  2219. '=======================================
  2220. '■角丸四角ボタンの描画(かならずぐうすうさいずになる)
  2221. 'X1,Y1:してん
  2222. 'X2,Y2:しゅうてん
  2223. ' C:いろ
  2224. ' R:角丸はんけい
  2225. ' ATR:角四角していビット(b3= b2= b1= b0=)
  2226. '=======================================
  2227. COMMON DEF GPUTBUT X1,Y1,X2,Y2,C,R,ATR
  2228. '--- はばとたかさをもとめる(いちのちょうせいふくむ)
  2229. IF X1>X2 THEN SWAP X1,X2
  2230. IF Y1>Y2 THEN SWAP Y1,Y2
  2231. VAR W=(((X2-X1)+1) DIV 2)*2
  2232. VAR H=(((Y2-Y1)+1) DIV 2)*2
  2233. VAR RR=R*2
  2234. VAR CX=X1+W/2,CY=Y1+H/2
  2235. '--- たてなが?
  2236. IF W<H && RR>W THEN
  2237. R=W/2
  2238. GCIRCLEF CX,Y1+R,R,C,ATR AND &B1100
  2239. GCIRCLEF CX,Y2-R,R,C,ATR AND &B0011
  2240. GFILL X1,Y1+R,X2,Y2-R,C
  2241. RETURN
  2242. ENDIF
  2243. '--- よこなが?
  2244. IF W>H && RR>H THEN
  2245. R=H/2
  2246. GCIRCLEF X1+R,CY,R,C,ATR AND &B1100
  2247. GCIRCLEF X2-R,CY,R,C,ATR AND &B0011
  2248. GFILL X1+R,Y1,X2-R,Y2,C
  2249. RETURN
  2250. ENDIF
  2251. '--- つうじょう
  2252. GCIRCLEF X1+R,Y1+R,R,C,ATR AND &B1000
  2253. GCIRCLEF X2-R,Y1+R,R,C,ATR AND &B0100
  2254. GCIRCLEF X1+R,Y2-R,R,C,ATR AND &B0010
  2255. GCIRCLEF X2-R,Y2-R,R,C,ATR AND &B0001
  2256. GFILL X1+R,Y1,X2-R,Y2,C
  2257. GFILL X1,Y1+R,X2,Y2-R,C
  2258. END
  2259.  
  2260. '---------------------------------------
  2261. ' CIRCLE/FILL
  2262. '---------------------------------------
  2263. DEF GCIRCLEF X,Y,RR,C,ATR
  2264. IF ATR THEN
  2265. GFILL X-RR,Y-RR,X+RR,Y+RR,C
  2266. RETURN
  2267. ENDIF
  2268. '--- 色分解
  2269. VAR R,G,B,A,TP=#G_ALPHA
  2270. RGB C OUT A,R,G,B
  2271. '---
  2272. GCIRCLE X,Y,RR,RGB(1,R,G,B)
  2273. GPAINT X,Y,C,RGB(1,R,G,B)
  2274. GCIRCLE X,Y,RR,C
  2275. '--- アンチエイリアス用に色分解
  2276. 'VAR R,G,B,A,TP=#G_ALPHA
  2277. 'RGB C OUT A,R,G,B
  2278. 'VAR C2=RGB(200,R/2,G/2,B/2)
  2279. 'GCIRCLE X,Y,RR,C2,#G_ALPHA
  2280. END
  2281.  
  2282.  
  2283. '===== END OF SOURCE =====
  2284.  
  2285. '"
  2286. ' SMILEBOOM LIBRARY "
  2287. '"
  2288. '
  2289. ' どこか適当なスロットでEXECしてから利用します
  2290. '
  2291. ' (C)SMILEBOOM
  2292. '
  2293. ' 2019.01.07:USBKEY、BUTTON、STICKの統合型情報取得
  2294. ' 2019.01.07:フォントの状態確認
  2295. ' 2019.01.07:複数行対応の文字列入力ウィンドウ
  2296. ' 2019.01.08:BUTVECのタイプ対応
  2297. ' 2019.02.04:複数行入力はすべての行を返す
  2298. '---------------------------------------
  2299. ' 2019.03.31:文字列入力の引数を文字数に変更
  2300. ' 2019.04.11:最初の文字列が受け取れないバグ修正
  2301. '---------------------------------------
  2302. ' 2019.04.14:複数行入力プロポーショナル扱いをやめる
  2303. ' 2019.04.24:INKEY$()のBSとENTERを受け付ける
  2304. ' 2019.04.30:スプライト検索処理追加
  2305. ' 2019.05.07:GRFILL(角丸四角の描画)
  2306. ' 2019.05.07:GPUTBUT(角丸四角ボタンの描画)
  2307. '
  2308. OPTION STRICT
  2309. VAR VER$="1.1"
  2310.  
  2311. '--- BUTTON(KEYBOARD/STICK)
  2312. ENUM \
  2313. #INP_MIX=0,\
  2314. #INP_BUTTON,\
  2315. #INP_KEY,\
  2316. #INP_STICKL,\
  2317. #INP_STICKR,\
  2318. #MAX_INP
  2319.  
  2320. ENUM \
  2321. #IMD_NEW=0,\
  2322. #IMD_REPEAT,\
  2323. #IMD_IMPACT,\
  2324. #IMD_RELEASE,\
  2325. #IMD_VX,\
  2326. #IMD_VY,\
  2327. #IMD_REPVX,\
  2328. #IMD_REPVY,\
  2329. #IMD_OLD,\
  2330. #IMD_TIME,\
  2331. #IMD_X,\
  2332. #IMD_Y,\
  2333. #MAX_IMD
  2334.  
  2335. CONST #MAX_IDTBL=3
  2336. DIM IDTBL[#MAX_IDTBL]=[\
  2337. #INP_BUTTON,\
  2338. #INP_KEY,\
  2339. #INP_STICKL\
  2340. ]
  2341. VAR OLDKEY$="",KEY$=""
  2342. VAR INSMODE=0,CAPSMODE=0,ISESC=0,ISSHIFT=0,ISCTRL=0
  2343. VAR ISBS=0,BSCNT=0,ISDEL=0,DELCNT=0
  2344. VAR ISENT=0,ENTCNT=0,ISTAB=0,TABCNT=0
  2345. VAR INP[#MAX_INP,#MAX_IMD]
  2346.  
  2347. '--- TOUCH&MOUSE
  2348. VAR TCX=0,TCY=0,TCS=0,TCR=0
  2349. VAR OLDMOSBN=0,MOSBNCNT=0,MOSBN=0,MOSBR=0,MOSBI=0
  2350. VAR OLDMOSX=0,OLDMOSY=0,MOSX=0,MOSY=0,MOSVX=0,MOSVY=0
  2351. VAR OLDMOSW=0,MOSW=0,MOSVW=0
  2352.  
  2353. '--- KEY REPEAT
  2354. VAR KW1,KW2
  2355. SYSPARAM "KEYREPEAT" OUT KW1,KW2
  2356.  
  2357. '--- FONT
  2358. DIM FONTX[128],FONTW[128]
  2359. VAR FONTPROP=0,FONTSIZE=16
  2360.  
  2361. '--- SCREEN
  2362. VAR SCW,SCH
  2363.  
  2364. '--- GPAGE
  2365. CONST #GPAGE_WORK =0
  2366. CONST #GPAGE_DEFSP=4
  2367.  
  2368. '--- WORK
  2369. CONST #EDGE=2,#CAPH=11,#LCW=2
  2370. VAR OLDGP
  2371. VAR WINGX,WINGY,WINGW,WINGH,WINHX,WINHY
  2372. VAR WINCX,WINCY,WINCW,WINCH
  2373. DIM GTMP[2048*2048]
  2374.  
  2375. '--- COLOR
  2376. CONST #C_CSRON =#C_YELLOW 'RGB(240,255,255,200)
  2377. CONST #C_CSROFF =RGB(120, 0,120,255)
  2378. CONST #C_WINBASE=#C_NAVY
  2379. CONST #C_WINEDGE=#C_WHITE
  2380. CONST #C_CLOSE =RGB(255,128,128,220)
  2381.  
  2382. '--- MESSAGE
  2383. CONST #MSGOX=2,#MSGOY=4
  2384. CONST #MAX_MSG=2048/16
  2385. CONST #ALP=2
  2386. CONST #DEFSPACE=4
  2387. CONST #DEFENTY=2
  2388. VAR LF$=CHR$(10)
  2389. DIM MSG$[#MAX_MSG]
  2390. VAR MSGLINECNT=0,MSGENTY=FONTSIZE
  2391. VAR MSGW,MSGH,CSRX,CSRY
  2392. VAR MSGGX,MSGGY,MSGGW,MSGGH
  2393. VAR MSGTW,MSGTH
  2394. VAR MSGMARGIN=0
  2395.  
  2396. '--- SPRITE
  2397. CONST #SP_LIBTOP =4090
  2398. CONST #SP_LIBEND =4094
  2399. VAR SPTOP =#SP_LIBTOP,SPEND=#SP_LIBEND
  2400. VAR SP_WIN,SP_SHADOW,SP_CSR
  2401. VAR SP_HITCHK
  2402.  
  2403. '--- HIT CHECK
  2404. CONST #MAX_CHKLIST=100
  2405. DIM CHKLIST[#MAX_CHKLIST],CHKSP[#MAX_CHKLIST]
  2406.  
  2407. '--- INITIALIZE
  2408. SB_INITLIB #SP_LIBTOP,#SP_LIBEND
  2409. END
  2410.  
  2411.  
  2412. '--- DEBUG
  2413. ACLS
  2414. 'XSCREEN 640,360,2,0
  2415. 'XSCREEN 1280,720,1,0
  2416. VAR C$="複数行対応 テキストエディター"
  2417. VAR M$="ABCdefghiJKlmn さんぷる"+LF$+"2ND LINE"+LF$+"てきとうなもじれつahikl"
  2418. VAR A$=SB_EDIT$(32,64,320,128,C$,M$,"USER_FUNC")
  2419. PRINT A$
  2420. PRINT "LEN MSG:";SB_MSGLEN(M$)
  2421. END
  2422.  
  2423. '
  2424. ' TEST(スロットを超えて呼び出されるので、必ず COMMONDEF として定義)
  2425. '
  2426. COMMON DEF USER_FUNC
  2427. PRINT "USER"
  2428. END
  2429.  
  2430.  
  2431. '
  2432. ' SMILEBOOM LIBRARY PROGRAM
  2433. '
  2434.  
  2435. '=======================================
  2436. '■存在確認用
  2437. '=======================================
  2438. COMMON DEF SB_LIB()
  2439. 'CHKCALL("SB_LIB")==TRUE
  2440. RETURN VER$
  2441. END
  2442.  
  2443. '=======================================
  2444. '■ライブラリ初期設定
  2445. '=======================================
  2446. COMMON DEF SB_INITLIB ST,SE
  2447. '---
  2448. SPTOP=ST:SPEND=SE
  2449. '---
  2450. XSCREEN OUT SCW,SCH
  2451. '---
  2452. SP_HITCHK=SPSET(SPTOP,SPEND,0,0,8,8,0)
  2453. SPCOLOR SP_HITCHK,#C_CLEAR
  2454. SB_CHKFONT #DEFSPACE
  2455. SB_INITMSG FONTPROP,FONTSIZE,MSGMARGIN,#DEFENTY
  2456. END
  2457.  
  2458. '
  2459. ' ### SPRITE HELPER
  2460. '
  2461.  
  2462. '=======================================
  2463. '■進行方向にあるスプライトを探す(十字方向のみの移動に限定)
  2464. '=======================================
  2465. COMMON DEF SB_SPSCAN(SP,VX,VY,MSK)
  2466. '--- 移動していない?
  2467. IF VX==0 && VY==0 THEN RETURN -1
  2468. '--- X優先(方向限定:斜めには動かさない)
  2469. IF VX && VY THEN VY=0
  2470. '--- 発生元情報取得
  2471. VAR U,V,W,H,OX,OY
  2472. SPOFS SP,1 OUT OX,OY
  2473. SPCHR SP OUT U,V,W,H
  2474. '--- 当たり判定用のスプライト準備
  2475. VAR BX=OX+W/2,BY=OY+H/2
  2476. SPOFS SP_HITCHK,BX,BY,-4000
  2477. SPCHR SP_HITCHK,,,W,H
  2478. SPHOME SP_HITCHK,W/2,H/2
  2479. SPCOL SP_HITCHK,0,MSK
  2480. SPCOLVEC SP_HITCHK,VX*SCW,VY*SCW
  2481. SPCOLOR SP_HITCHK,#C_CLEAR
  2482. '--- 進行方向にあるスプライトを探す
  2483. VAR CNT=0
  2484. VAR NX=SPHITSP(SP_HITCHK)
  2485. IF NX!=-1 THEN
  2486. '--- 1個目発見
  2487. SPOFS NX,1 OUT OX,OY '+PARENT
  2488. CHKSP[CNT]=NX
  2489. CHKLIST[CNT]=((OX-BX)*VX)+((OY-BY)*VY)
  2490. INC CNT
  2491. '--- 他にもあるか?(続きの確認)
  2492. LOOP
  2493. NX=SPHITSP()
  2494. IF NX==-1 THEN BREAK
  2495. '---
  2496. SPOFS NX,1 OUT OX,OY '+PARENT
  2497. CHKSP[CNT]=NX
  2498. CHKLIST[CNT]=((OX-BX)*VX)+((OY-BY)*VY)
  2499. INC CNT
  2500. IF CNT>=#MAX_CHKLIST THEN BREAK
  2501. ENDLOOP
  2502. '--- 1個だけなら自分自身
  2503. IF CNT>1 THEN
  2504. '--- 近い順に並べる
  2505. SORT 0,CNT,CHKLIST,CHKSP
  2506. NX=CHKSP[1] '0番目は自分自身なので1番目を使う
  2507. RETURN NX
  2508. ENDIF
  2509. ENDIF
  2510. '--- 正面に見つからないときは両側面を探す
  2511. VAR CVX=SCW,CVY=SCW
  2512. IF VX THEN CVX=0 ELSE CVY=0
  2513. NX=-1
  2514. LOOP
  2515. BX=BX+(VX*W):BY=BY+(VY*H)
  2516. IF BX<0 || BX>SCW THEN BREAK
  2517. IF BY<0 || BY>SCH THEN BREAK
  2518. SPOFS SP_HITCHK,BX,BY
  2519. SPCOLVEC SP_HITCHK, CVX, CVY
  2520. NX=SPHITSP(SP_HITCHK):IF NX!=-1 THEN BREAK
  2521. SPCOLVEC SP_HITCHK,-CVX,-CVY
  2522. NX=SPHITSP(SP_HITCHK):IF NX!=-1 THEN BREAK
  2523. ENDLOOP
  2524. '---
  2525. RETURN NX
  2526. END
  2527.  
  2528.  
  2529. '=======================================
  2530. '■ウィンドウ
  2531. '=======================================
  2532. COMMON DEF SB_WINSTAT OUT ED,CP
  2533. ED=#EDGE
  2534. CP=#CAPH
  2535. END
  2536.  
  2537. '=======================================
  2538. '■ウィンドウ
  2539. '=======================================
  2540. COMMON DEF SB_WINOPEN(X,Y,W,H,CP$)
  2541. '--- BACKUP IMAGE
  2542. WINGW=W+#EDGE*2
  2543. WINGH=H+#EDGE*2+#CAPH
  2544. WINGX=2048-WINGW
  2545. WINGY=2048-WINGH
  2546. OLDGP=GTARGET()
  2547. GTARGET #GPAGE_WORK
  2548. GSAVE WINGX,WINGY,WINGW,WINGH,GTMP
  2549. '--- CREATE WINDOW
  2550. VAR EX=WINGX+WINGW,EY=WINGY+WINGH
  2551. GFILL WINGX ,WINGY ,EX-1,EY-1,#C_CLEAR
  2552. GFILL WINGX+1,WINGY ,EX-2,EY-1,#C_WINEDGE
  2553. GFILL WINGX ,WINGY+1,EX-1,EY-2,#C_WINEDGE
  2554. '--- CLOSE AREA
  2555. WINCW=32:WINCH=#EDGE+#CAPH-2
  2556. WINCX=EX-WINCW:WINCY=WINGY
  2557. GFILL WINCX ,WINCY,WINCX+WINCW-1,WINCY+WINCH-2,#C_CLOSE
  2558. GFILL WINCX+1 ,WINCY,WINCX+WINCW-1,WINCY+WINCH-1,#C_CLOSE
  2559. GPUTCHR WINCX+13,WINCY+2,"",8,#C_WHITE,#ALP
  2560. '--- キャプションをのぞいたざひょう
  2561. WINHX=WINGX+#EDGE
  2562. WINHY=WINGY+#EDGE+#CAPH
  2563. GFILL WINHX,WINHY,WINHX+W-1,WINHY+H-1,#C_WINBASE
  2564. GTARGET OLDGP
  2565. '--- SPRITE:WINDOW
  2566. VAR OLDSPG=SPPAGE()
  2567. SPPAGE #GPAGE_WORK
  2568. SP_WIN=SPSET(SPTOP,SPEND,WINGX,WINGY,WINGW,WINGH,0)
  2569. SPOFS SP_WIN,X,Y
  2570. '--- CLOSE BUTTON
  2571. WINCX=X+WINGW-WINCW:WINCY=Y
  2572. '--- SPRITE:SHADOW
  2573. SP_SHADOW=SPSET(SPTOP,SPEND,WINGX,WINGY,WINGW,WINGH,0)
  2574. SPLINK SP_SHADOW,SP_WIN
  2575. SPCOLOR SP_SHADOW,RGB(160,0,0,0)
  2576. SPOFS SP_SHADOW,3,3,20
  2577. SPPAGE OLDSPG
  2578. '--- CAPTION
  2579. GPUTCHR WINGX+#EDGE+2,WINGY+#EDGE+1,CP$,8,#C_BLACK,#ALP
  2580. '---
  2581. RETURN SP_WIN
  2582. END
  2583.  
  2584. '=======================================
  2585. '■CLOSE
  2586. '=======================================
  2587. COMMON DEF SB_WINCLOSE
  2588. SPCLR SP_WIN
  2589. SPCLR SP_SHADOW
  2590. GTARGET OLDGP
  2591. GLOAD WINGX,WINGY,WINGW,WINGH,GTMP,0
  2592. END
  2593.  
  2594. '=======================================
  2595. '■CHECK CLOSE BUTTON
  2596. '=======================================
  2597. COMMON DEF SB_CHKWINCLOSE(X,Y)
  2598. IF X<WINCX || X>=WINCX+WINCW THEN RETURN 0
  2599. IF Y<WINCY || Y>=WINCY+WINCH THEN RETURN 0
  2600. RETURN 1
  2601. END
  2602.  
  2603.  
  2604. '
  2605. ' ### MULTILINE TEXT EDITOR
  2606. '
  2607.  
  2608. '=======================================
  2609. '■文字列の入力(複数行対応)
  2610. '=======================================
  2611. COMMON DEF SB_EDIT$(DX,DY,TW,TH,CP$,MS$,USER$)
  2612. '--- CALC DOTSIZE
  2613. MSGTW=TW:MSGTH=TH
  2614. VAR DW=(TW*(FONTSIZE+MSGMARGIN))+#MSGOX*2
  2615. VAR DH=(TH*MSGENTY)+#MSGOY
  2616. '--- CREATE WINDOW
  2617. SP_WIN=SB_WINOPEN(DX,DY,DW,DH+#LCW,CP$)
  2618. GTARGET #GPAGE_WORK
  2619. '--- MAX MSGLINE ON WINDOW
  2620. MSGW=TW 'DW DIV (FONTSIZE+MSGMARGIN)
  2621. MSGH=TH
  2622. MSGGX=WINHX:MSGGY=WINHY
  2623. MSGGW=DW-MSGMARGIN*4:MSGGH=DH-MSGENTY
  2624. '--- SPLIT MESSAGE
  2625. VAR C$
  2626. VAR I=0,MC=0
  2627. FILL MSG$,""
  2628. LOOP
  2629. C$=MID$(MS$,I,1):INC I
  2630. IF C$=="" THEN INC MC:BREAK
  2631. IF C$==LF$ THEN
  2632. INC MC
  2633. ELSE
  2634. IF LEN(MSG$[MC])<MSGTW THEN
  2635. MSG$[MC]=MSG$[MC]+C$
  2636. ENDIF
  2637. ENDIF
  2638. ENDLOOP
  2639. IF MC==0 THEN INC MC
  2640. MSGLINECNT=MC
  2641. '--- SPRITE:CURSOR
  2642. VAR OLDSPG=SPPAGE()
  2643. CSRY=MSGLINECNT-1:IF CSRY>=MSGH-1 THEN CSRY=MSGH-1
  2644. CSRX=LEN(MSG$[CSRY])
  2645. SPPAGE -1
  2646. SP_CSR=SPSET(SPTOP,SPEND,0,0,2,18,0)
  2647. SPLINK SP_CSR,SP_WIN
  2648. SPVAR SP_CSR,"HX",(WINHX-WINGX)+#EDGE/2
  2649. SPVAR SP_CSR,"HY",(WINHY-WINGY)+#EDGE/2
  2650. SPVAR SP_CSR,"OX",CSRX
  2651. SPVAR SP_CSR,"OY",CSRY
  2652. SPFUNC SP_CSR,"SPFUNC_CSRINPUT"
  2653. SPCOLOR SP_CSR,#C_CSRON
  2654. SPANIM SP_CSR,"C",8,#C_CSRON,
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement