Advertisement
Guest User

TextEntry

a guest
Mar 16th, 2017
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 46.37 KB | None | 0 0
  1. class Window_CharacterEntry < Window_DrawableCommand
  2. XSIZE=13
  3. YSIZE=4
  4.  
  5. def initialize(charset,viewport=nil)
  6. @viewport=viewport
  7. @charset=charset
  8. @othercharset=""
  9. super(0,96,480,192)
  10. colors=getDefaultTextColors(self.windowskin)
  11. self.baseColor=colors[0]
  12. self.shadowColor=colors[1]
  13. self.columns=XSIZE
  14. refresh
  15. end
  16.  
  17. def setOtherCharset(value)
  18. @othercharset=value.clone
  19. refresh
  20. end
  21.  
  22. def setCharset(value)
  23. @charset=value.clone
  24. refresh
  25. end
  26.  
  27. def character
  28. if self.index<0 || self.index>=@charset.length
  29. return "";
  30. else
  31. return @charset[self.index]
  32. end
  33. end
  34.  
  35. def command
  36. return -1 if self.index==@charset.length
  37. return -2 if self.index==@charset.length+1
  38. return -3 if self.index==@charset.length+2
  39. return self.index
  40. end
  41.  
  42. def itemCount
  43. return @charset.length+3
  44. end
  45.  
  46. def drawItem(index,count,rect)
  47. rect=drawCursor(index,rect)
  48. if index==@charset.length # -1
  49. pbDrawShadowText(self.contents,rect.x,rect.y,rect.width,rect.height,"[ ]",
  50. self.baseColor,self.shadowColor)
  51. elsif index==@charset.length+1 # -2
  52. pbDrawShadowText(self.contents,rect.x,rect.y,rect.width,rect.height,@othercharset,
  53. self.baseColor,self.shadowColor)
  54. elsif index==@charset.length+2 # -3
  55. pbDrawShadowText(self.contents,rect.x,rect.y,rect.width,rect.height,_INTL("OK"),
  56. self.baseColor,self.shadowColor)
  57. else
  58. pbDrawShadowText(self.contents,rect.x,rect.y,rect.width,rect.height,@charset[index],
  59. self.baseColor,self.shadowColor)
  60. end
  61. end
  62. end
  63.  
  64.  
  65.  
  66. class CharacterEntryHelper
  67. attr_reader :text
  68. attr_reader :maxlength
  69. attr_reader :passwordChar
  70. attr_accessor :cursor
  71.  
  72. def text=(value)
  73. @text=value
  74. ensure
  75. end
  76.  
  77. def textChars
  78. chars=text.scan(/./m)
  79. if @passwordChar!=""
  80. chars.length.times {|i|
  81. chars[i]=@passwordChar
  82. }
  83. end
  84. return chars
  85. end
  86.  
  87. def initialize(text)
  88. @maxlength=-1
  89. @text=text
  90. @passwordChar=""
  91. @cursor=text.scan(/./m).length
  92. ensure
  93. end
  94.  
  95. def passwordChar=(value)
  96. @passwordChar=value ? value : ""
  97. end
  98.  
  99. def maxlength=(value)
  100. @maxlength=value
  101. ensure
  102. end
  103.  
  104. def length
  105. return self.text.scan(/./m).length
  106. end
  107.  
  108. def canInsert?
  109. chars=self.text.scan(/./m)
  110. return false if @maxlength>=0 && chars.length>=@maxlength
  111. return true
  112. end
  113.  
  114. def insert(ch)
  115. chars=self.text.scan(/./m)
  116. return false if @maxlength>=0 && chars.length>=@maxlength
  117. chars.insert(@cursor,ch)
  118. @text=""
  119. for ch in chars
  120. @text+=ch if ch
  121. end
  122. @cursor+=1
  123. return true
  124. end
  125.  
  126. def canDelete?
  127. chars=self.text.scan(/./m)
  128. return false if chars.length<=0 || @cursor<=0
  129. return true
  130. end
  131.  
  132. def delete
  133. chars=self.text.scan(/./m)
  134. return false if chars.length<=0 || @cursor<=0
  135. chars.delete_at(@cursor-1)
  136. @text=""
  137. for ch in chars
  138. @text+=ch if ch
  139. end
  140. @cursor-=1
  141. return true
  142. end
  143.  
  144. private
  145.  
  146. def ensure
  147. return if @maxlength<0
  148. chars=self.text.scan(/./m)
  149. if chars.length>@maxlength && @maxlength>=0
  150. chars=chars[0,@maxlength]
  151. end
  152. @text=""
  153. for ch in chars
  154. @text+=ch if ch
  155. end
  156. end
  157. end
  158.  
  159.  
  160.  
  161. class Window_TextEntry < SpriteWindow_Base
  162. def initialize(text,x,y,width,height,heading=nil,usedarkercolor=false)
  163. super(x,y,width,height)
  164. colors=getDefaultTextColors(self.windowskin)
  165. @baseColor=colors[0]
  166. @shadowColor=colors[1]
  167. if usedarkercolor
  168. @baseColor=Color.new(16,24,32)
  169. @shadowColor=Color.new(168,184,184)
  170. end
  171. @helper=CharacterEntryHelper.new(text)
  172. @heading=heading
  173. self.active=true
  174. @frame=0
  175. refresh
  176. end
  177.  
  178. def text
  179. @helper.text
  180. end
  181.  
  182. def maxlength
  183. @helper.maxlength
  184. end
  185.  
  186. def passwordChar
  187. @helper.passwordChar
  188. end
  189.  
  190. def text=(value)
  191. @helper.text=value
  192. self.refresh
  193. end
  194.  
  195. def passwordChar=(value)
  196. @helper.passwordChar=value
  197. refresh
  198. end
  199.  
  200. def maxlength=(value)
  201. @helper.maxlength=value
  202. self.refresh
  203. end
  204.  
  205. def insert(ch)
  206. if @helper.insert(ch)
  207. @frame=0
  208. self.refresh
  209. return true
  210. end
  211. return false
  212. end
  213.  
  214. def delete
  215. if @helper.delete
  216. @frame=0
  217. self.refresh
  218. return true
  219. end
  220. return false
  221. end
  222.  
  223. def update
  224. @frame+=1
  225. @frame%=20
  226. self.refresh if ((@frame%10)==0)
  227. return if !self.active
  228. # Moving cursor
  229. if Input.repeat?(Input::LEFT) && Input.press?(Input::A)
  230. if @helper.cursor > 0
  231. @helper.cursor-=1
  232. @frame=0
  233. self.refresh
  234. end
  235. return
  236. end
  237. if Input.repeat?(Input::RIGHT) && Input.press?(Input::A)
  238. if @helper.cursor < self.text.scan(/./m).length
  239. @helper.cursor+=1
  240. @frame=0
  241. self.refresh
  242. end
  243. return
  244. end
  245. # Backspace
  246. if Input.repeat?(Input::B)
  247. self.delete if @helper.cursor > 0
  248. return
  249. end
  250. end
  251.  
  252. def refresh
  253. self.contents=pbDoEnsureBitmap(self.contents,self.width-self.borderX,
  254. self.height-self.borderY)
  255. bitmap=self.contents
  256. bitmap.clear
  257. x=0
  258. y=0
  259. if @heading
  260. textwidth=bitmap.text_size(@heading).width
  261. pbDrawShadowText(bitmap,x,y, textwidth+4, 32, @heading,@baseColor,@shadowColor)
  262. y+=32
  263. end
  264. x+=4
  265. width=self.width-self.borderX
  266. height=self.height-self.borderY
  267. cursorcolor=Color.new(16,24,32)
  268. textscan=self.text.scan(/./m)
  269. scanlength=textscan.length
  270. @helper.cursor=scanlength if @helper.cursor>scanlength
  271. @helper.cursor=0 if @helper.cursor<0
  272. startpos=@helper.cursor
  273. fromcursor=0
  274. while (startpos>0)
  275. c=(@helper.passwordChar!="") ? @helper.passwordChar : textscan[startpos-1]
  276. fromcursor+=bitmap.text_size(c).width
  277. break if fromcursor>width-4
  278. startpos-=1
  279. end
  280. for i in startpos...scanlength
  281. c=(@helper.passwordChar!="") ? @helper.passwordChar : textscan[i]
  282. textwidth=bitmap.text_size(c).width
  283. next if c=="\n"
  284. # Draw text
  285. pbDrawShadowText(bitmap,x,y, textwidth+4, 32, c,@baseColor,@shadowColor)
  286. # Draw cursor if necessary
  287. if ((@frame/10)&1) == 0 && i==@helper.cursor
  288. bitmap.fill_rect(x,y+4,2,24,cursorcolor)
  289. end
  290. # Add x to drawn text width
  291. x += textwidth
  292. end
  293. if ((@frame/10)&1) == 0 && textscan.length==@helper.cursor
  294. bitmap.fill_rect(x,y+4,2,24,cursorcolor)
  295. end
  296. end
  297. end
  298.  
  299.  
  300.  
  301. def getLineBrokenText(bitmap,value,width,dims)
  302. x=0
  303. y=0
  304. textheight=0
  305. ret=[]
  306. if dims
  307. dims[0]=0
  308. dims[1]=0
  309. end
  310. line=0
  311. position=0
  312. column=0
  313. return ret if !bitmap || bitmap.disposed? || width<=0
  314. textmsg=value.clone
  315. lines=0
  316. color=Font.default_color
  317. ret.push(["",0,0,0,bitmap.text_size("X").height,0,0,0,0])
  318. while ((c = textmsg.slice!(/\n|(\S*([ \r\t\f]?))/)) != nil)
  319. break if c==""
  320. length=c.scan(/./m).length
  321. ccheck=c
  322. if ccheck=="\n"
  323. ret.push(["\n",x,y,0,textheight,line,position,column,0])
  324. x=0
  325. y+=(textheight==0) ? bitmap.text_size("X").height : textheight
  326. line+=1
  327. textheight=0
  328. column=0
  329. position+=length
  330. ret.push(["",x,y,0,textheight,line,position,column,0])
  331. next
  332. end
  333. textcols=[]
  334. words=[ccheck]
  335. for i in 0...words.length
  336. word=words[i]
  337. if word && word!=""
  338. textSize=bitmap.text_size(word)
  339. textwidth=textSize.width
  340. if x>0 && x+textwidth>=width-2
  341. # Zero-length word break
  342. ret.push(["",x,y,0,textheight,line,position,column,0])
  343. x=0
  344. column=0
  345. y+=(textheight==0) ? bitmap.text_size("X").height : textheight
  346. line+=1
  347. textheight=0
  348. end
  349. textheight=[textheight,textSize.height].max
  350. ret.push([word,x,y,textwidth,textheight,line,position,column,length])
  351. x+=textwidth
  352. dims[0]=x if dims && dims[0]<x
  353. end
  354. if textcols[i]
  355. color=textcols[i]
  356. end
  357. end
  358. position+=length
  359. column+=length
  360. end
  361. dims[1]=y+textheight if dims
  362. return ret
  363. end
  364.  
  365.  
  366.  
  367. class Window_MultilineTextEntry < SpriteWindow_Base
  368. def initialize(text,x,y,width,height)
  369. super(x,y,width,height)
  370. colors=getDefaultTextColors(self.windowskin)
  371. @baseColor=colors[0]
  372. @shadowColor=colors[1]
  373. @helper=CharacterEntryHelper.new(text)
  374. @firstline=0
  375. @cursorLine=0
  376. @cursorColumn=0
  377. @frame=0
  378. self.active=true
  379. refresh
  380. end
  381.  
  382. attr_reader :baseColor
  383. attr_reader :shadowColor
  384.  
  385. def baseColor=(value)
  386. @baseColor=value
  387. refresh
  388. end
  389.  
  390. def shadowColor=(value)
  391. @shadowColor=value
  392. refresh
  393. end
  394.  
  395. def text
  396. @helper.text
  397. end
  398.  
  399. def maxlength
  400. @helper.maxlength
  401. end
  402.  
  403. def text=(value)
  404. @helper.text=value
  405. @textchars=nil
  406. self.refresh
  407. end
  408.  
  409. def maxlength=(value)
  410. @helper.maxlength=value
  411. @textchars=nil
  412. self.refresh
  413. end
  414.  
  415. def insert(ch)
  416. @helper.cursor=getPosFromLineAndColumn(@cursorLine,@cursorColumn)
  417. if @helper.insert(ch)
  418. @frame=0
  419. @textchars=nil
  420. moveCursor(0,1)
  421. self.refresh
  422. return true
  423. end
  424. return false
  425. end
  426.  
  427. def delete
  428. @helper.cursor=getPosFromLineAndColumn(@cursorLine,@cursorColumn)
  429. if @helper.delete
  430. @frame=0
  431. moveCursor(0,-1) # use old textchars
  432. @textchars=nil
  433. self.refresh
  434. return true
  435. end
  436. return false
  437. end
  438.  
  439. def getTextChars
  440. if !@textchars
  441. @textchars=getLineBrokenText(self.contents,@helper.text,
  442. self.contents.width,nil)
  443. end
  444. return @textchars
  445. end
  446.  
  447. def getTotalLines
  448. textchars=getTextChars
  449. if textchars.length==0
  450. return 1
  451. else
  452. tchar=textchars[textchars.length-1]
  453. return tchar[5]+1
  454. end
  455. end
  456.  
  457. def getLineY(line)
  458. textchars=getTextChars
  459. if textchars.length==0
  460. return 0
  461. else
  462. totallines=getTotalLines()
  463. line=0 if line<0
  464. line=totallines-1 if line>=totallines
  465. maximumY=0
  466. for i in 0...textchars.length
  467. thisline=textchars[i][5]
  468. y=textchars[i][2]
  469. return y if thisline==line
  470. maximumY=y if maximumY<y
  471. end
  472. return maximumY
  473. end
  474. end
  475.  
  476. def getColumnsInLine(line)
  477. textchars=getTextChars
  478. if textchars.length==0
  479. return 0
  480. else
  481. totallines=getTotalLines()
  482. line=0 if line<0
  483. line=totallines-1 if line>=totallines
  484. endpos=0
  485. for i in 0...textchars.length
  486. thisline=textchars[i][5]
  487. thispos=textchars[i][6]
  488. thislength=textchars[i][8]
  489. if thisline==line
  490. endpos+=thislength
  491. end
  492. end
  493. return endpos
  494. end
  495. end
  496.  
  497. def getPosFromLineAndColumn(line,column)
  498. textchars=getTextChars
  499. if textchars.length==0
  500. return 0
  501. else
  502. totallines=getTotalLines()
  503. line=0 if line<0
  504. line=totallines-1 if line>=totallines
  505. endpos=0
  506. for i in 0...textchars.length
  507. thisline=textchars[i][5]
  508. thispos=textchars[i][6]
  509. thiscolumn=textchars[i][7]
  510. thislength=textchars[i][8]
  511. if thisline==line
  512. endpos=thispos+thislength
  513. # echoln [endpos,thispos+(column-thiscolumn),textchars[i]]
  514. if column>=thiscolumn && column<=thiscolumn+thislength && thislength>0
  515. return thispos+(column-thiscolumn)
  516. end
  517. end
  518. end
  519. if endpos==0
  520. # echoln [totallines,line,column]
  521. # echoln textchars
  522. end
  523. # echoln "endpos=#{endpos}"
  524. return endpos
  525. end
  526. end
  527.  
  528. def getLastVisibleLine
  529. textchars=getTextChars()
  530. textheight=[1,self.contents.text_size("X").height].max
  531. lastVisible=@firstline+((self.height-self.borderY)/textheight)-1
  532. return lastVisible
  533. end
  534.  
  535. def updateCursorPos(doRefresh)
  536. # Calculate new cursor position
  537. @helper.cursor=getPosFromLineAndColumn(@cursorLine,@cursorColumn)
  538. if doRefresh
  539. @frame=0
  540. self.refresh
  541. end
  542. if @cursorLine<@firstline
  543. @firstline=@cursorLine
  544. end
  545. lastVisible=getLastVisibleLine()
  546. if @cursorLine>lastVisible
  547. @firstline+=(@cursorLine-lastVisible)
  548. end
  549. end
  550.  
  551. def moveCursor(lineOffset, columnOffset)
  552. # Move column offset first, then lines (since column offset
  553. # can affect line offset)
  554. # echoln ["beforemoving",@cursorLine,@cursorColumn]
  555. totalColumns=getColumnsInLine(@cursorLine) # check current line
  556. totalLines=getTotalLines()
  557. oldCursorLine=@cursorLine
  558. oldCursorColumn=@cursorColumn
  559. @cursorColumn+=columnOffset
  560. if @cursorColumn<0 && @cursorLine>0
  561. # Will happen if cursor is moved left from the beginning of a line
  562. @cursorLine-=1
  563. @cursorColumn=getColumnsInLine(@cursorLine)
  564. elsif @cursorColumn>totalColumns && @cursorLine<totalLines-1
  565. # Will happen if cursor is moved right from the end of a line
  566. @cursorLine+=1
  567. @cursorColumn=0
  568. updateColumns=true
  569. end
  570. # Ensure column bounds
  571. totalColumns=getColumnsInLine(@cursorLine)
  572. @cursorColumn=totalColumns if @cursorColumn>totalColumns
  573. @cursorColumn=0 if @cursorColumn<0 # totalColumns can be 0
  574. # Move line offset
  575. @cursorLine+=lineOffset
  576. @cursorLine=0 if @cursorLine<0
  577. @cursorLine=totalLines-1 if @cursorLine>=totalLines
  578. # Ensure column bounds again
  579. totalColumns=getColumnsInLine(@cursorLine)
  580. @cursorColumn=totalColumns if @cursorColumn>totalColumns
  581. @cursorColumn=0 if @cursorColumn<0 # totalColumns can be 0
  582. updateCursorPos(
  583. oldCursorLine!=@cursorLine ||
  584. oldCursorColumn!=@cursorColumn
  585. )
  586. # echoln ["aftermoving",@cursorLine,@cursorColumn]
  587. end
  588.  
  589. def update
  590. @frame+=1
  591. @frame%=20
  592. self.refresh if ((@frame%10)==0)
  593. return if !self.active
  594. # Moving cursor
  595. if Input.repeat?(Input::LEFT)
  596. moveCursor(0,-1)
  597. return
  598. elsif Input.repeat?(Input::UP)
  599. moveCursor(-1,0)
  600. return
  601. elsif Input.repeat?(Input::DOWN)
  602. moveCursor(1,0)
  603. return
  604. elsif Input.repeat?(Input::RIGHT)
  605. moveCursor(0,1)
  606. return
  607. end
  608. if !@peekMessage
  609. @peekMessage=Win32API.new("user32.dll","PeekMessage","pliii","i") rescue nil
  610. end
  611. if @peekMessage
  612. msg=[0,0,0,0,0,0,0].pack("V*")
  613. retval=@peekMessage.call(msg,0,0x102,0x102,1)
  614. if retval!=0
  615. p "WM_CHAR #{msg[2]}"
  616. end
  617. end
  618. if Input.pressex?(0x11) && Input.triggerex?(0x24) # Ctrl + Home
  619. # Move cursor to beginning
  620. @cursorLine=0
  621. @cursorColumn=0
  622. updateCursorPos(true)
  623. return
  624. elsif Input.pressex?(0x11) && Input.triggerex?(0x23) # Ctrl + End
  625. # Move cursor to end
  626. @cursorLine=getTotalLines()-1
  627. @cursorColumn=getColumnsInLine(@cursorLine)
  628. updateCursorPos(true)
  629. return
  630. elsif Input.repeatex?(13)
  631. self.insert("\n")
  632. return
  633. elsif Input.repeatex?(8) || Input.repeatex?(0x2E)
  634. # Backspace
  635. self.delete
  636. return
  637. end
  638. # Letter keys
  639. for i in 65..90
  640. if Input.repeatex?(i)
  641. shift=(Input.press?(Input::SHIFT)) ? 0x41 : 0x61
  642. insert((shift+(i-65)).chr)
  643. return
  644. end
  645. end
  646. # Number keys
  647. shifted=")!@\#$%^&*("
  648. unshifted="0123456789"
  649. for i in 48..57
  650. if Input.repeatex?(i)
  651. insert((Input.press?(Input::SHIFT)) ? shifted[i-48].chr : unshifted[i-48].chr)
  652. return
  653. end
  654. end
  655. keys=[
  656. [32," "," "],
  657. [106,"*","*"],
  658. [107,"+","+"],
  659. [109,"-","-"],
  660. [111,"/","/"],
  661. [186,";",":"],
  662. [187,"=","+"],
  663. [189,"-","_"],
  664. [191,"/","?"],
  665. [219,"[","{"],
  666. [190,".",">"],
  667. [188,",","<"],
  668. [220,"\\","|"],
  669. [190,".",""],
  670. [188,",",""],
  671. [221,"]","}"],
  672. [222,"'","\""]
  673. ]
  674. for i in keys
  675. if Input.repeatex?(i[0])
  676. insert((Input.press?(Input::SHIFT)) ? i[2] : i[1])
  677. return
  678. end
  679. end
  680. end
  681.  
  682. def refresh
  683. newContents=pbDoEnsureBitmap(self.contents,self.width-self.borderX,
  684. self.height-self.borderY)
  685. @textchars=nil if self.contents!=newContents
  686. self.contents=newContents
  687. bitmap=self.contents
  688. bitmap.clear
  689. x=0
  690. y=0
  691. getTextChars
  692. x+=4
  693. width=self.width-self.borderX
  694. height=self.height-self.borderY
  695. cursorcolor=Color.new(0,0,0)
  696. textchars=getTextChars()
  697. scanlength=@helper.length
  698. startY=getLineY(@firstline)
  699. lastheight=32
  700. for i in 0...textchars.length
  701. thisline=textchars[i][5]
  702. thispos=textchars[i][6]
  703. thiscolumn=textchars[i][7]
  704. thislength=textchars[i][8]
  705. textY=textchars[i][2]-startY
  706. # Don't draw lines before the first or zero-length segments
  707. next if thisline<@firstline || thislength==0
  708. # Don't draw lines beyond the window's height
  709. break if textY >= height
  710. c=textchars[i][0]
  711. # Don't draw spaces
  712. next if c==" "
  713. textwidth=textchars[i][3]+4 # add 4 to prevent draw_text from stretching text
  714. textheight=textchars[i][4]
  715. lastheight=textheight
  716. # Draw text
  717. pbDrawShadowText(bitmap,textchars[i][1],textY, textwidth, textheight, c,@baseColor,@shadowColor)
  718. end
  719. # Draw cursor
  720. if ((@frame/10)&1) == 0
  721. textheight=bitmap.text_size("X").height
  722. cursorY=(textheight*@cursorLine)-startY
  723. cursorX=0
  724. for i in 0...textchars.length
  725. thisline=textchars[i][5]
  726. thispos=textchars[i][6]
  727. thiscolumn=textchars[i][7]
  728. thislength=textchars[i][8]
  729. if thisline==@cursorLine && @cursorColumn>=thiscolumn &&
  730. @cursorColumn<=thiscolumn+thislength
  731. cursorY=textchars[i][2]-startY
  732. cursorX=textchars[i][1]
  733. textheight=textchars[i][4]
  734. posToCursor=@cursorColumn-thiscolumn
  735. if posToCursor>=0
  736. partialString=textchars[i][0].scan(/./m)[0,posToCursor].join("")
  737. cursorX+=bitmap.text_size(partialString).width
  738. end
  739. break
  740. end
  741. end
  742. cursorY+=4
  743. cursorHeight=[4,textheight-4,bitmap.text_size("X").height-4].max
  744. bitmap.fill_rect(cursorX,cursorY,2,cursorHeight,cursorcolor)
  745. end
  746. end
  747. end
  748.  
  749.  
  750.  
  751. class Window_TextEntry_Keyboard < Window_TextEntry
  752. def update
  753. @frame+=1
  754. @frame%=20
  755. self.refresh if ((@frame%10)==0)
  756. return if !self.active
  757. # Moving cursor
  758. if Input.repeat?(Input::LEFT)
  759. if @helper.cursor > 0
  760. @helper.cursor-=1
  761. @frame=0
  762. self.refresh
  763. end
  764. return
  765. end
  766. if Input.repeat?(Input::RIGHT)
  767. if @helper.cursor < self.text.scan(/./m).length
  768. @helper.cursor+=1
  769. @frame=0
  770. self.refresh
  771. end
  772. return
  773. end
  774. # Backspace
  775. if Input.repeatex?(8) || Input.repeatex?(0x2E)
  776. self.delete if @helper.cursor > 0
  777. return
  778. end
  779. if !@toUnicode
  780. @toUnicode=Win32API.new("user32.dll","ToUnicode","iippii","i") rescue nil
  781. @mapVirtualKey=Win32API.new("user32.dll","MapVirtualKey","ii","i") rescue nil
  782. @getKeyboardState=Win32API.new("user32.dll","GetKeyboardState","p","i") rescue nil
  783. end
  784. if @getKeyboardState
  785. kbs="\0"*256
  786. @getKeyboardState.call(kbs)
  787. kbcount=0
  788. for i in 3...256
  789. if Input.triggerex?(i)
  790. vsc=@mapVirtualKey.call(i,0)
  791. buf="\0"*8
  792. ret=@toUnicode.call(i,vsc,kbs,buf,4,0)
  793. if ret>0
  794. b=buf.unpack("v*")
  795. for j in 0...ret
  796. if buf[j]<=0x7F
  797. insert(buf[j].chr)
  798. elsif buf[j]<=0x7FF
  799. insert((0xC0|((buf[j]>>6)&0x1F)).chr+(0x80|(buf[j]&0x3F)).chr)
  800. else
  801. str=(0xE0|((buf[j]>>12)&0x0F)).chr
  802. str+=(0x80|((buf[j]>>6)&0x3F)).chr
  803. str+=(0x80|(buf[j]&0x3F)).chr
  804. insert(str)
  805. end
  806. kbcount+=1
  807. end
  808. end
  809. end
  810. end
  811. return if kbcount>0
  812. end
  813. # Letter keys
  814. for i in 65..90
  815. if Input.repeatex?(i)
  816. shift=(Input.press?(Input::SHIFT)) ? 0x41 : 0x61
  817. insert((shift+(i-65)).chr)
  818. return
  819. end
  820. end
  821. # Number keys
  822. shifted=")!@\#$%^&*("
  823. unshifted="0123456789"
  824. for i in 48..57
  825. if Input.repeatex?(i)
  826. insert((Input.press?(Input::SHIFT)) ? shifted[i-48].chr : unshifted[i-48].chr)
  827. return
  828. end
  829. end
  830. keys=[
  831. [32," "," "],
  832. [106,"*","*"],
  833. [107,"+","+"],
  834. [109,"-","-"],
  835. [111,"/","/"],
  836. [186,";",":"],
  837. [187,"=","+"],
  838. [189,"-","_"],
  839. [191,"/","?"],
  840. [219,"[","{"],
  841. [190,".",""],
  842. [188,",",""],
  843. [221,"]","}"],
  844. [222,"'","\""]
  845. ]
  846. for i in keys
  847. if Input.repeatex?(i[0])
  848. insert((Input.press?(Input::SHIFT)) ? i[2] : i[1])
  849. return
  850. end
  851. end
  852. end
  853. end
  854.  
  855.  
  856.  
  857. def Kernel.pbFreeText(msgwindow,currenttext,passwordbox,maxlength,width=240)
  858. window=Window_TextEntry_Keyboard.new(currenttext,0,0,width,64)
  859. ret=""
  860. window.maxlength=maxlength
  861. window.visible=true
  862. window.z=99999
  863. pbPositionNearMsgWindow(window,msgwindow,:right)
  864. window.text=currenttext
  865. window.passwordChar="*" if passwordbox
  866. loop do
  867. Graphics.update
  868. Input.update
  869. if Input.triggerex?(0x1B)
  870. ret=currenttext
  871. break
  872. end
  873. if Input.triggerex?(13)
  874. ret=window.text
  875. break
  876. end
  877. window.update
  878. msgwindow.update if msgwindow
  879. yield if block_given?
  880. end
  881. window.dispose
  882. Input.update
  883. return ret
  884. end
  885.  
  886. def Kernel.pbMessageFreeText(message,currenttext,passwordbox,maxlength,width=240,&block)
  887. msgwindow=Kernel.pbCreateMessageWindow
  888. retval=Kernel.pbMessageDisplay(msgwindow,message,true,
  889. proc{|msgwindow|
  890. next Kernel.pbFreeText(msgwindow,currenttext,passwordbox,maxlength,width,&block)
  891. },&block)
  892. Kernel.pbDisposeMessageWindow(msgwindow)
  893. return retval
  894. end
  895.  
  896.  
  897.  
  898. #===============================================================================
  899. # Text entry screen - free typing.
  900. #===============================================================================
  901. class PokemonEntryScene
  902. @@Characters=[
  903. [("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz").scan(/./),"[*]"],
  904. [("0123456789 !@\#$%^&*() ~`-_+={}[] :;'\"<>,.?/ ").scan(/./),"[A]"],
  905. ]
  906. USEKEYBOARD=true
  907.  
  908. def pbStartScene(helptext,minlength,maxlength,initialText,subject=0,pokemon=nil)
  909. @sprites={}
  910. @viewport=Viewport.new(0,0,Graphics.width,Graphics.height)
  911. @viewport.z=99999
  912. if USEKEYBOARD
  913. @sprites["entry"]=Window_TextEntry_Keyboard.new(initialText,
  914. 0,0,400-112,96,helptext,true)
  915. else
  916. @sprites["entry"]=Window_TextEntry.new(initialText,0,0,400,96,helptext,true)
  917. end
  918. @sprites["entry"].x=(Graphics.width/2)-(@sprites["entry"].width/2)+32
  919. @sprites["entry"].viewport=@viewport
  920. @sprites["entry"].visible=true
  921. @minlength=minlength
  922. @maxlength=maxlength
  923. @symtype=0
  924. @sprites["entry"].maxlength=maxlength
  925. if !USEKEYBOARD
  926. @sprites["entry2"]=Window_CharacterEntry.new(@@Characters[@symtype][0])
  927. @sprites["entry2"].setOtherCharset(@@Characters[@symtype][1])
  928. @sprites["entry2"].viewport=@viewport
  929. @sprites["entry2"].visible=true
  930. @sprites["entry2"].x=(Graphics.width/2)-(@sprites["entry2"].width/2)
  931. end
  932. if minlength==0
  933. @sprites["helpwindow"]=Window_UnformattedTextPokemon.newWithSize(
  934. _INTL("Enter text using the keyboard. Press\nESC to cancel, or ENTER to confirm."),
  935. 32,Graphics.height-96,Graphics.width-64,96,@viewport
  936. )
  937. else
  938. @sprites["helpwindow"]=Window_UnformattedTextPokemon.newWithSize(
  939. _INTL("Enter text using the keyboard.\nPress ENTER to confirm."),
  940. 32,Graphics.height-96,Graphics.width-64,96,@viewport
  941. )
  942. end
  943. @sprites["helpwindow"].letterbyletter=false
  944. @sprites["helpwindow"].viewport=@viewport
  945. @sprites["helpwindow"].visible=USEKEYBOARD
  946. @sprites["helpwindow"].baseColor=Color.new(16,24,32)
  947. @sprites["helpwindow"].shadowColor=Color.new(168,184,184)
  948. addBackgroundPlane(@sprites,"background","naming2bg",@viewport)
  949. case subject
  950. when 1 # Player
  951. if $PokemonGlobal
  952. meta=pbGetMetadata(0,MetadataPlayerA+$PokemonGlobal.playerID)
  953. if meta
  954. @sprites["shadow"]=IconSprite.new(0,0,@viewport)
  955. @sprites["shadow"].setBitmap("Graphics/Pictures/namingShadow")
  956. @sprites["shadow"].x=33*2
  957. @sprites["shadow"].y=32*2
  958. filename=pbGetPlayerCharset(meta,1)
  959. @sprites["subject"]=TrainerWalkingCharSprite.new(filename,@viewport)
  960. charwidth=@sprites["subject"].bitmap.width
  961. charheight=@sprites["subject"].bitmap.height
  962. @sprites["subject"].x = 44*2 - charwidth/8
  963. @sprites["subject"].y = 38*2 - charheight/4
  964. end
  965. end
  966. when 2 # Pokémon
  967. if pokemon
  968. @sprites["shadow"]=IconSprite.new(0,0,@viewport)
  969. @sprites["shadow"].setBitmap("Graphics/Pictures/namingShadow")
  970. @sprites["shadow"].x=33*2
  971. @sprites["shadow"].y=32*2
  972. @sprites["subject"]=PokemonIconSprite.new(pokemon,@viewport)
  973. @sprites["subject"].x=56
  974. @sprites["subject"].y=14
  975. @sprites["gender"]=BitmapSprite.new(32,32,@viewport)
  976. @sprites["gender"].x=430
  977. @sprites["gender"].y=54
  978. @sprites["gender"].bitmap.clear
  979. pbSetSystemFont(@sprites["gender"].bitmap)
  980. textpos=[]
  981. if pokemon.isMale?
  982. textpos.push([_INTL("♂"),0,0,false,Color.new(0,128,248),Color.new(168,184,184)])
  983. elsif pokemon.isFemale?
  984. textpos.push([_INTL("♀"),0,0,false,Color.new(248,24,24),Color.new(168,184,184)])
  985. end
  986. pbDrawTextPositions(@sprites["gender"].bitmap,textpos)
  987. end
  988. when 3 # Storage box
  989. @sprites["subject"]=IconSprite.new(0,0,@viewport)
  990. @sprites["subject"].setBitmap("Graphics/Pictures/namingStorage")
  991. @sprites["subject"].x=68
  992. @sprites["subject"].y=32
  993. when 4 # NPC
  994. @sprites["shadow"]=IconSprite.new(0,0,@viewport)
  995. @sprites["shadow"].setBitmap("Graphics/Pictures/namingShadow")
  996. @sprites["shadow"].x=33*2
  997. @sprites["shadow"].y=32*2
  998. @sprites["subject"]=TrainerWalkingCharSprite.new(pokemon.to_s,@viewport)
  999. charwidth=@sprites["subject"].bitmap.width
  1000. charheight=@sprites["subject"].bitmap.height
  1001. @sprites["subject"].x = 44*2 - charwidth/8
  1002. @sprites["subject"].y = 38*2 - charheight/4
  1003. end
  1004. pbFadeInAndShow(@sprites)
  1005. end
  1006.  
  1007. def pbEntry1
  1008. ret=""
  1009. loop do
  1010. Graphics.update
  1011. Input.update
  1012. if Input.triggerex?(0x1B) && @minlength==0
  1013. ret=""
  1014. break
  1015. end
  1016. if Input.triggerex?(13) && @sprites["entry"].text.length>=@minlength
  1017. ret=@sprites["entry"].text
  1018. break
  1019. end
  1020. @sprites["helpwindow"].update
  1021. @sprites["entry"].update
  1022. @sprites["subject"].update if @sprites["subject"]
  1023. end
  1024. Input.update
  1025. return ret
  1026. end
  1027.  
  1028. def pbEntry2
  1029. ret=""
  1030. loop do
  1031. Graphics.update
  1032. Input.update
  1033. @sprites["helpwindow"].update
  1034. @sprites["entry"].update
  1035. @sprites["entry2"].update
  1036. @sprites["subject"].update if @sprites["subject"]
  1037. if Input.trigger?(Input::C)
  1038. index=@sprites["entry2"].command
  1039. if index==-3 # Confirm text
  1040. ret=@sprites["entry"].text
  1041. if ret.length<@minlength || ret.length>@maxlength
  1042. pbPlayBuzzerSE()
  1043. else
  1044. pbPlayDecisionSE()
  1045. break
  1046. end
  1047. elsif index==-1 # Insert a space
  1048. if @sprites["entry"].insert(" ")
  1049. pbPlayDecisionSE()
  1050. else
  1051. pbPlayBuzzerSE()
  1052. end
  1053. elsif index==-2 # Change character set
  1054. pbPlayDecisionSE()
  1055. @symtype+=1
  1056. @symtype=0 if @symtype>=@@Characters.length
  1057. @sprites["entry2"].setCharset(@@Characters[@symtype][0])
  1058. @sprites["entry2"].setOtherCharset(@@Characters[@symtype][1])
  1059. else # Insert given character
  1060. if @sprites["entry"].insert(@sprites["entry2"].character)
  1061. pbPlayDecisionSE()
  1062. else
  1063. pbPlayBuzzerSE()
  1064. end
  1065. end
  1066. next
  1067. end
  1068. end
  1069. Input.update
  1070. return ret
  1071. end
  1072.  
  1073. def pbEntry
  1074. return USEKEYBOARD ? pbEntry1 : pbEntry2
  1075. end
  1076.  
  1077. def pbEndScene
  1078. pbFadeOutAndHide(@sprites)
  1079. pbDisposeSpriteHash(@sprites)
  1080. @viewport.dispose
  1081. end
  1082. end
  1083.  
  1084.  
  1085.  
  1086. #===============================================================================
  1087. # Text entry screen - arrows to select letter.
  1088. #===============================================================================
  1089. class PokemonEntryScene2
  1090. @@Characters=[
  1091. [("ABCDEFGHIJ ,."+"KLMNOPQRST '-"+"UVWXYZ ♂♀"+" "+"0123456789 ").scan(/./),_INTL("UPPER")],
  1092. [("abcdefghij ,."+"klmnopqrst '-"+"uvwxyz ♂♀"+" "+"0123456789 ").scan(/./),_INTL("lower")],
  1093. [(",.:;!? ♂♀ "+"\"'()<>[] "+"~@#%*&$ "+"+-=^_/\\| "+" ").scan(/./),_INTL("other")],
  1094. ]
  1095. ROWS=13
  1096. COLUMNS=5
  1097. MODE1=-5
  1098. MODE2=-4
  1099. MODE3=-3
  1100. BACK=-2
  1101. OK=-1
  1102.  
  1103. class NameEntryCursor
  1104. def initialize(viewport)
  1105. @sprite=SpriteWrapper.new(viewport)
  1106. @cursortype=0
  1107. @cursor1=AnimatedBitmap.new("Graphics/Pictures/NamingCursor1")
  1108. @cursor2=AnimatedBitmap.new("Graphics/Pictures/NamingCursor2")
  1109. @cursor3=AnimatedBitmap.new("Graphics/Pictures/NamingCursor3")
  1110. @cursorPos=0
  1111. updateInternal
  1112. end
  1113.  
  1114. def setCursorPos(value)
  1115. @cursorPos=value
  1116. end
  1117.  
  1118. def updateCursorPos
  1119. value=@cursorPos
  1120. if value==PokemonEntryScene2::MODE1 # Upper case
  1121. @sprite.x=48
  1122. @sprite.y=120
  1123. @cursortype=1
  1124. elsif value==PokemonEntryScene2::MODE2 # Lower case
  1125. @sprite.x=112
  1126. @sprite.y=120
  1127. @cursortype=1
  1128. elsif value==PokemonEntryScene2::MODE3 # Other symbols
  1129. @sprite.x=176
  1130. @sprite.y=120
  1131. @cursortype=1
  1132. elsif value==PokemonEntryScene2::BACK # Back
  1133. @sprite.x=312
  1134. @sprite.y=120
  1135. @cursortype=2
  1136. elsif value==PokemonEntryScene2::OK # OK
  1137. @sprite.x=392
  1138. @sprite.y=120
  1139. @cursortype=2
  1140. elsif value>=0
  1141. @sprite.x=52+32*(value%PokemonEntryScene2::ROWS)
  1142. @sprite.y=180+38*(value/PokemonEntryScene2::ROWS)
  1143. @cursortype=0
  1144. end
  1145. end
  1146.  
  1147. def visible=(value)
  1148. @sprite.visible=value
  1149. end
  1150.  
  1151. def visible
  1152. @sprite.visible
  1153. end
  1154.  
  1155. def color=(value)
  1156. @sprite.color=value
  1157. end
  1158.  
  1159. def color
  1160. @sprite.color
  1161. end
  1162.  
  1163. def disposed?
  1164. @sprite.disposed?
  1165. end
  1166.  
  1167. def updateInternal
  1168. @cursor1.update
  1169. @cursor2.update
  1170. @cursor3.update
  1171. updateCursorPos
  1172. case @cursortype
  1173. when 0
  1174. @sprite.bitmap=@cursor1.bitmap
  1175. when 1
  1176. @sprite.bitmap=@cursor2.bitmap
  1177. when 2
  1178. @sprite.bitmap=@cursor3.bitmap
  1179. end
  1180. end
  1181.  
  1182. def update
  1183. updateInternal
  1184. end
  1185.  
  1186. def dispose
  1187. @cursor1.dispose
  1188. @cursor2.dispose
  1189. @cursor3.dispose
  1190. @sprite.dispose
  1191. end
  1192. end
  1193.  
  1194.  
  1195.  
  1196. def pbStartScene(helptext,minlength,maxlength,initialText,subject=0,pokemon=nil)
  1197. @sprites={}
  1198. @viewport=Viewport.new(0,0,Graphics.width,Graphics.height)
  1199. @viewport.z=99999
  1200. @helptext=helptext
  1201. @helper=CharacterEntryHelper.new(initialText)
  1202. @bitmaps=[
  1203. AnimatedBitmap.new("Graphics/Pictures/namingTab1"),
  1204. AnimatedBitmap.new("Graphics/Pictures/namingTab2"),
  1205. AnimatedBitmap.new("Graphics/Pictures/namingTab3")
  1206. ]
  1207. @bitmaps[3]=@bitmaps[0].bitmap.clone
  1208. @bitmaps[4]=@bitmaps[1].bitmap.clone
  1209. @bitmaps[5]=@bitmaps[2].bitmap.clone
  1210. for i in 0...3
  1211. pos=0
  1212. pbSetSystemFont(@bitmaps[i+3])
  1213. textPos=[]
  1214. for y in 0...COLUMNS
  1215. for x in 0...ROWS
  1216. textPos.push([@@Characters[i][0][pos],44+x*32,18+y*38,2,
  1217. Color.new(248,248,248), Color.new(72,80,88)])
  1218. pos+=1
  1219. end
  1220. end
  1221. pbDrawTextPositions(@bitmaps[i+3],textPos)
  1222. end
  1223. @bitmaps[6]=BitmapWrapper.new(24,6)
  1224. @bitmaps[6].fill_rect(2,2,22,2,Color.new(80,136,152))
  1225. @bitmaps[6].fill_rect(0,0,22,2,Color.new(80,176,200))
  1226. @sprites["bg"]=IconSprite.new(0,0,@viewport)
  1227. @sprites["bg"].setBitmap("Graphics/Pictures/namingbg")
  1228. case subject
  1229. when 1 # Player
  1230. if $PokemonGlobal
  1231. meta=pbGetMetadata(0,MetadataPlayerA+$PokemonGlobal.playerID)
  1232. if meta
  1233. @sprites["shadow"]=IconSprite.new(0,0,@viewport)
  1234. @sprites["shadow"].setBitmap("Graphics/Pictures/namingShadow")
  1235. @sprites["shadow"].x=33*2
  1236. @sprites["shadow"].y=32*2
  1237. filename=pbGetPlayerCharset(meta,1)
  1238. @sprites["subject"]=TrainerWalkingCharSprite.new(filename,@viewport)
  1239. charwidth=@sprites["subject"].bitmap.width
  1240. charheight=@sprites["subject"].bitmap.height
  1241. @sprites["subject"].x = 44*2 - charwidth/8
  1242. @sprites["subject"].y = 38*2 - charheight/4
  1243. end
  1244. end
  1245. when 2 # Pokémon
  1246. if pokemon
  1247. @sprites["shadow"]=IconSprite.new(0,0,@viewport)
  1248. @sprites["shadow"].setBitmap("Graphics/Pictures/namingShadow")
  1249. @sprites["shadow"].x=33*2
  1250. @sprites["shadow"].y=32*2
  1251. @sprites["subject"]=PokemonIconSprite.new(pokemon,@viewport)
  1252. @sprites["subject"].x=56
  1253. @sprites["subject"].y=14
  1254. @sprites["gender"]=BitmapSprite.new(32,32,@viewport)
  1255. @sprites["gender"].x=430
  1256. @sprites["gender"].y=54
  1257. @sprites["gender"].bitmap.clear
  1258. pbSetSystemFont(@sprites["gender"].bitmap)
  1259. textpos=[]
  1260. if pokemon.isMale?
  1261. textpos.push([_INTL("♂"),0,0,false,Color.new(0,128,248),Color.new(168,184,184)])
  1262. elsif pokemon.isFemale?
  1263. textpos.push([_INTL("♀"),0,0,false,Color.new(248,24,24),Color.new(168,184,184)])
  1264. end
  1265. pbDrawTextPositions(@sprites["gender"].bitmap,textpos)
  1266. end
  1267. when 3 # Storage box
  1268. @sprites["subject"]=TrainerWalkingCharSprite.new(nil,@viewport)
  1269. @sprites["subject"].altcharset="Graphics/Pictures/namingStorage"
  1270. @sprites["subject"].animspeed=4
  1271. charwidth=@sprites["subject"].bitmap.width
  1272. charheight=@sprites["subject"].bitmap.height
  1273. @sprites["subject"].x = 44*2 - charwidth/8
  1274. @sprites["subject"].y = 26*2 - charheight/2
  1275. when 4 # NPC
  1276. @sprites["shadow"]=IconSprite.new(0,0,@viewport)
  1277. @sprites["shadow"].setBitmap("Graphics/Pictures/namingShadow")
  1278. @sprites["shadow"].x=33*2
  1279. @sprites["shadow"].y=32*2
  1280. @sprites["subject"]=TrainerWalkingCharSprite.new(pokemon.to_s,@viewport)
  1281. charwidth=@sprites["subject"].bitmap.width
  1282. charheight=@sprites["subject"].bitmap.height
  1283. @sprites["subject"].x = 44*2 - charwidth/8
  1284. @sprites["subject"].y = 38*2 - charheight/4
  1285. end
  1286. @sprites["bgoverlay"]=BitmapSprite.new(Graphics.width,Graphics.height,@viewport)
  1287. pbDoUpdateOverlay
  1288. @blanks=[]
  1289. @mode=0
  1290. @minlength=minlength
  1291. @maxlength=maxlength
  1292. @maxlength.times {|i|
  1293. @sprites["blank#{i}"]=SpriteWrapper.new(@viewport)
  1294. @sprites["blank#{i}"].bitmap=@bitmaps[6]
  1295. @sprites["blank#{i}"].x=160+24*i
  1296. @blanks[i]=0
  1297. }
  1298. @sprites["bottomtab"]=SpriteWrapper.new(@viewport) # Current tab
  1299. @sprites["bottomtab"].x=22
  1300. @sprites["bottomtab"].y=162
  1301. @sprites["bottomtab"].bitmap=@bitmaps[0+3]
  1302. @sprites["toptab"]=SpriteWrapper.new(@viewport) # Next tab
  1303. @sprites["toptab"].x=22-504
  1304. @sprites["toptab"].y=162
  1305. @sprites["toptab"].bitmap=@bitmaps[1+3]
  1306. @sprites["controls"]=IconSprite.new(0,0,@viewport)
  1307. @sprites["controls"].setBitmap("Graphics/Pictures/namingControls")
  1308. @sprites["controls"].x=16
  1309. @sprites["controls"].y=96
  1310. @init=true
  1311. @sprites["overlay"]=BitmapSprite.new(Graphics.width,Graphics.height,@viewport)
  1312. pbDoUpdateOverlay2
  1313. @sprites["cursor"]=NameEntryCursor.new(@viewport)
  1314. @cursorpos=0
  1315. @refreshOverlay=true
  1316. @sprites["cursor"].setCursorPos(@cursorpos)
  1317. pbFadeInAndShow(@sprites) { pbUpdate }
  1318. end
  1319.  
  1320. def pbUpdateOverlay
  1321. @refreshOverlay=true
  1322. end
  1323.  
  1324. def pbDoUpdateOverlay2
  1325. overlay=@sprites["overlay"].bitmap
  1326. overlay.clear
  1327. modeIcon=[["Graphics/Pictures/namingMode",48+@mode*64,120,@mode*60,0,60,44]]
  1328. pbDrawImagePositions(overlay,modeIcon)
  1329. end
  1330.  
  1331. def pbDoUpdateOverlay
  1332. return if !@refreshOverlay
  1333. @refreshOverlay=false
  1334. bgoverlay=@sprites["bgoverlay"].bitmap
  1335. bgoverlay.clear
  1336. pbSetSystemFont(bgoverlay)
  1337. textPositions=[
  1338. [@helptext,160,12,false,Color.new(16,24,32),Color.new(168,184,184)]
  1339. ]
  1340. chars=@helper.textChars
  1341. x=166
  1342. for ch in chars
  1343. textPositions.push([ch,x,48,false,Color.new(248,248,248),Color.new(72,80,88)])
  1344. x+=24
  1345. end
  1346. pbDrawTextPositions(bgoverlay,textPositions)
  1347. end
  1348.  
  1349. def pbChangeTab(newtab=@mode+1)
  1350. @sprites["cursor"].visible=false
  1351. @sprites["toptab"].bitmap=@bitmaps[(newtab%3)+3]
  1352. 21.times do
  1353. @sprites["toptab"].x+=24
  1354. @sprites["bottomtab"].y+=12
  1355. Graphics.update
  1356. Input.update
  1357. pbUpdate
  1358. end
  1359. tempx=@sprites["toptab"].x
  1360. @sprites["toptab"].x=@sprites["bottomtab"].x
  1361. @sprites["bottomtab"].x=tempx
  1362. tempy=@sprites["toptab"].y
  1363. @sprites["toptab"].y=@sprites["bottomtab"].y
  1364. @sprites["bottomtab"].y=tempy
  1365. tempbitmap=@sprites["toptab"].bitmap
  1366. @sprites["toptab"].bitmap=@sprites["bottomtab"].bitmap
  1367. @sprites["bottomtab"].bitmap=tempbitmap
  1368. Graphics.update
  1369. Input.update
  1370. pbUpdate
  1371. @mode=(newtab)%3
  1372. newtab=@bitmaps[((@mode+1)%3)+3]
  1373. @sprites["cursor"].visible=true
  1374. @sprites["toptab"].bitmap=newtab
  1375. @sprites["toptab"].x=22-504
  1376. @sprites["toptab"].y=162
  1377. pbDoUpdateOverlay2
  1378. end
  1379.  
  1380. def pbUpdate
  1381. for i in 0...3
  1382. @bitmaps[i].update
  1383. end
  1384. if @init || Graphics.frame_count%5==0
  1385. @init=false
  1386. cursorpos=@helper.cursor
  1387. cursorpos=@maxlength-1 if cursorpos>=@maxlength
  1388. cursorpos=0 if cursorpos<0
  1389. @maxlength.times {|i|
  1390. if i==cursorpos
  1391. @blanks[i]=1
  1392. else
  1393. @blanks[i]=0
  1394. end
  1395. @sprites["blank#{i}"].y=[78,82][@blanks[i]]
  1396. }
  1397. end
  1398. pbDoUpdateOverlay
  1399. pbUpdateSpriteHash(@sprites)
  1400. end
  1401.  
  1402. def pbColumnEmpty?(m)
  1403. return false if m>=ROWS-1
  1404. chset=@@Characters[@mode][0]
  1405. return (
  1406. chset[m]==" " &&
  1407. chset[m+((ROWS-1))]==" " &&
  1408. chset[m+((ROWS-1)*2)]==" " &&
  1409. chset[m+((ROWS-1)*3)]==" "
  1410. )
  1411. end
  1412.  
  1413. def wrapmod(x,y)
  1414. result=x%y
  1415. result+=y if result<0
  1416. return result
  1417. end
  1418.  
  1419. def pbMoveCursor
  1420. oldcursor=@cursorpos
  1421. cursordiv=@cursorpos/ROWS
  1422. cursormod=@cursorpos%ROWS
  1423. cursororigin=@cursorpos-cursormod
  1424. if Input.repeat?(Input::LEFT)
  1425. if @cursorpos<0 # Controls
  1426. @cursorpos-=1
  1427. @cursorpos=OK if @cursorpos<MODE1
  1428. else
  1429. begin
  1430. cursormod=wrapmod((cursormod-1),ROWS)
  1431. @cursorpos=cursororigin+cursormod
  1432. end while pbColumnEmpty?(cursormod)
  1433. end
  1434. elsif Input.repeat?(Input::RIGHT)
  1435. if @cursorpos<0 # Controls
  1436. @cursorpos+=1
  1437. @cursorpos=MODE1 if @cursorpos>OK
  1438. else
  1439. begin
  1440. cursormod=wrapmod((cursormod+1),ROWS)
  1441. @cursorpos=cursororigin+cursormod
  1442. end while pbColumnEmpty?(cursormod)
  1443. end
  1444. elsif Input.repeat?(Input::UP)
  1445. if @cursorpos<0 # Controls
  1446. case @cursorpos
  1447. when MODE1
  1448. @cursorpos=ROWS*(COLUMNS-1)
  1449. when MODE2
  1450. @cursorpos=ROWS*(COLUMNS-1)+2
  1451. when MODE3
  1452. @cursorpos=ROWS*(COLUMNS-1)+4
  1453. when BACK
  1454. @cursorpos=ROWS*(COLUMNS-1)+8
  1455. when OK
  1456. @cursorpos=ROWS*(COLUMNS-1)+11
  1457. end
  1458. elsif @cursorpos<ROWS # Top row of letters
  1459. case @cursorpos
  1460. when 0,1
  1461. @cursorpos=MODE1
  1462. when 2,3
  1463. @cursorpos=MODE2
  1464. when 4,5,6
  1465. @cursorpos=MODE3
  1466. when 7,8,9,10
  1467. @cursorpos=BACK
  1468. when 11,12
  1469. @cursorpos=OK
  1470. end
  1471. else
  1472. cursordiv=wrapmod((cursordiv-1),COLUMNS)
  1473. @cursorpos=(cursordiv*ROWS)+cursormod
  1474. end
  1475. elsif Input.repeat?(Input::DOWN)
  1476. if @cursorpos<0 # Controls
  1477. case @cursorpos
  1478. when MODE1
  1479. @cursorpos=0
  1480. when MODE2
  1481. @cursorpos=2
  1482. when MODE3
  1483. @cursorpos=4
  1484. when BACK
  1485. @cursorpos=8
  1486. when OK
  1487. @cursorpos=11
  1488. end
  1489. elsif @cursorpos>=ROWS*(COLUMNS-1) # Bottom row of letters
  1490. case @cursorpos
  1491. when ROWS*(COLUMNS-1),ROWS*(COLUMNS-1)+1
  1492. @cursorpos=MODE1
  1493. when ROWS*(COLUMNS-1)+2,ROWS*(COLUMNS-1)+3
  1494. @cursorpos=MODE2
  1495. when ROWS*(COLUMNS-1)+4,ROWS*(COLUMNS-1)+5,ROWS*(COLUMNS-1)+6
  1496. @cursorpos=MODE3
  1497. when ROWS*(COLUMNS-1)+7,ROWS*(COLUMNS-1)+8,ROWS*(COLUMNS-1)+9,ROWS*(COLUMNS-1)+10
  1498. @cursorpos=BACK
  1499. when ROWS*(COLUMNS-1)+11,ROWS*(COLUMNS-1)+12
  1500. @cursorpos=OK
  1501. end
  1502. else
  1503. cursordiv=wrapmod((cursordiv+1),COLUMNS)
  1504. @cursorpos=(cursordiv*ROWS)+cursormod
  1505. end
  1506. end
  1507. if @cursorpos!=oldcursor # Cursor position changed
  1508. @sprites["cursor"].setCursorPos(@cursorpos)
  1509. pbPlayCursorSE()
  1510. return true
  1511. else
  1512. return false
  1513. end
  1514. end
  1515.  
  1516. def pbEntry
  1517. ret=""
  1518. loop do
  1519. Graphics.update
  1520. Input.update
  1521. pbUpdate
  1522. next if pbMoveCursor
  1523. if Input.trigger?(Input::B)
  1524. @helper.delete
  1525. pbPlayCancelSE()
  1526. pbUpdateOverlay
  1527. elsif Input.trigger?(Input::C)
  1528. if @cursorpos==BACK # Backspace
  1529. @helper.delete
  1530. pbPlayCancelSE()
  1531. pbUpdateOverlay
  1532. elsif @cursorpos==OK # Done
  1533. pbPlayDecisionSE()
  1534. if @helper.length>=@minlength
  1535. ret=@helper.text
  1536. break
  1537. end
  1538. elsif @cursorpos==MODE1
  1539. pbChangeTab(0) if @mode!=0
  1540. elsif @cursorpos==MODE2
  1541. pbChangeTab(1) if @mode!=1
  1542. elsif @cursorpos==MODE3
  1543. pbChangeTab(2) if @mode!=2
  1544. else
  1545. cursormod=@cursorpos%ROWS
  1546. cursordiv=@cursorpos/ROWS
  1547. charpos=cursordiv*(ROWS)+cursormod
  1548. chset=@@Characters[@mode][0]
  1549. if @helper.length>=@maxlength
  1550. @helper.delete
  1551. end
  1552. @helper.insert(chset[charpos])
  1553. pbPlayCursorSE()
  1554. if @helper.length>=@maxlength
  1555. @cursorpos=OK
  1556. @sprites["cursor"].setCursorPos(@cursorpos)
  1557. end
  1558. pbUpdateOverlay
  1559. end
  1560. elsif Input.trigger?(Input::A)
  1561. @cursorpos=OK
  1562. @sprites["cursor"].setCursorPos(@cursorpos)
  1563. elsif Input.trigger?(Input::F5)
  1564. pbChangeTab
  1565. end
  1566. end
  1567. Input.update
  1568. return ret
  1569. end
  1570.  
  1571. def pbEndScene
  1572. pbFadeOutAndHide(@sprites) { pbUpdate }
  1573. for bitmap in @bitmaps
  1574. bitmap.dispose if bitmap
  1575. end
  1576. @bitmaps.clear
  1577. pbDisposeSpriteHash(@sprites)
  1578. @viewport.dispose
  1579. end
  1580. end
  1581.  
  1582.  
  1583.  
  1584. class PokemonEntry
  1585. def initialize(scene)
  1586. @scene=scene
  1587. end
  1588.  
  1589. def pbStartScreen(helptext,minlength,maxlength,initialText,mode=-1,pokemon=nil)
  1590. @scene.pbStartScene(helptext,minlength,maxlength,initialText,mode,pokemon)
  1591. ret=@scene.pbEntry
  1592. @scene.pbEndScene
  1593. return ret
  1594. end
  1595. end
  1596.  
  1597.  
  1598.  
  1599. def pbEnterText(helptext,minlength,maxlength,initialText="",mode=0,pokemon=nil,nofadeout=false)
  1600. ret=""
  1601. if USEKEYBOARDTEXTENTRY
  1602. pbFadeOutIn(99999,nofadeout){
  1603. sscene=PokemonEntryScene.new
  1604. sscreen=PokemonEntry.new(sscene)
  1605. ret=sscreen.pbStartScreen(helptext,minlength,maxlength,initialText,mode,pokemon)
  1606. }
  1607. else
  1608. pbFadeOutIn(99999,nofadeout){
  1609. sscene=PokemonEntryScene2.new
  1610. sscreen=PokemonEntry.new(sscene)
  1611. ret=sscreen.pbStartScreen(helptext,minlength,maxlength,initialText,mode,pokemon)
  1612. }
  1613. end
  1614. return ret
  1615. end
  1616.  
  1617. def pbEnterPlayerName(helptext,minlength,maxlength,initialText="",nofadeout=false)
  1618. return pbEnterText(helptext,minlength,maxlength,initialText,1,nil,nofadeout)
  1619. end
  1620.  
  1621. def pbEnterPokemonName(helptext,minlength,maxlength,initialText="",pokemon=nil,nofadeout=false)
  1622. return pbEnterText(helptext,minlength,maxlength,initialText,2,pokemon,nofadeout)
  1623. end
  1624.  
  1625. def pbEnterBoxName(helptext,minlength,maxlength,initialText="",nofadeout=false)
  1626. return pbEnterText(helptext,minlength,maxlength,initialText,3,nil,nofadeout)
  1627. end
  1628.  
  1629. def pbEnterNPCName(helptext,minlength,maxlength,initialText="",id=0,nofadeout=false)
  1630. return pbEnterText(helptext,minlength,maxlength,initialText,4,id,nofadeout)
  1631. end
  1632.  
  1633.  
  1634.  
  1635. class Interpreter
  1636. def command_303
  1637. if $Trainer
  1638. $Trainer.name=pbEnterPlayerName(_INTL("Your name?"),1,@parameters[1],$Trainer.name)
  1639. return true
  1640. end
  1641. if $game_actors && $data_actors && $data_actors[@parameters[0]] != nil
  1642. # Set battle abort flag
  1643. $game_temp.battle_abort = true
  1644. ret=""
  1645. pbFadeOutIn(99999){
  1646. sscene=PokemonEntryScene.new
  1647. sscreen=PokemonEntry.new(sscene)
  1648. $game_actors[@parameters[0]].name=sscreen.pbStartScreen(
  1649. _INTL("Enter {1}'s name.",$game_actors[@parameters[0]].name),
  1650. 1,@parameters[1],$game_actors[@parameters[0]].name)
  1651. }
  1652. end
  1653. return true
  1654. end
  1655. end
  1656.  
  1657.  
  1658.  
  1659. class Game_Interpreter
  1660. def command_303
  1661. if $Trainer
  1662. $Trainer.name=pbEnterPlayerName(_INTL("Your name?"),1,
  1663. @params[1],$Trainer.name)
  1664. return true
  1665. end
  1666. if $game_actors && $data_actors && $data_actors[@params[0]] != nil
  1667. # Set battle abort flag
  1668. ret=""
  1669. pbFadeOutIn(99999){
  1670. sscene=PokemonEntryScene.new
  1671. sscreen=PokemonEntry.new(sscene)
  1672. $game_actors[@params[0]].name=sscreen.pbStartScreen(
  1673. _INTL("Enter {1}'s name.",$game_actors[@params[0]].name),
  1674. 1,@params[1],$game_actors[@params[0]].name)
  1675. }
  1676. end
  1677. return true
  1678. end
  1679. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement