Advertisement
Guest User

BW2

a guest
Dec 14th, 2015
189
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 37.59 KB | None | 0 0
  1. #===============================================================================
  2. # BW2 Bag Screen (Stock Essentials)
  3. # Modded by Erassus (Colours & Sounds)
  4. #===============================================================================
  5. class Window_PokemonBag < Window_DrawableCommand
  6. attr_reader :pocket
  7. attr_reader :sortIndex
  8.  
  9. def initialize(bag,pocket,x,y,width,height)
  10. @bag=bag
  11. @pocket=pocket
  12. @sortIndex=-1
  13. @adapter=PokemonMartAdapter.new
  14. super(x,y,width,height)
  15. @selarrow=AnimatedBitmap.new("Graphics/Pictures/BW2 Bag/BagSel")
  16. self.windowskin=nil
  17. end
  18.  
  19. def pocket=(value)
  20. @pocket=value
  21. @item_max=thispocket.length+1
  22. refresh
  23. end
  24.  
  25. def sortIndex=(value)
  26. @sortIndex=value
  27. refresh
  28. end
  29.  
  30. def page_row_max; return PokemonBag_Scene::ITEMSVISIBLE; end
  31. def page_item_max; return PokemonBag_Scene::ITEMSVISIBLE; end
  32.  
  33. def itemRect(item)
  34. if item<0 || item>=@item_max || item<self.top_item-1 ||
  35. item>self.top_item+self.page_item_max
  36. return Rect.new(0,0,0,0)
  37. else
  38. cursor_width = (self.width-self.borderX-(@column_max-1)*@column_spacing) / @column_max
  39. x = item % @column_max * (cursor_width + @column_spacing)
  40. y = item / @column_max * @row_height - @virtualOy
  41. return Rect.new(x, y, cursor_width, @row_height)
  42. end
  43. end
  44.  
  45. def drawCursor(index,rect)
  46. if self.index==index
  47. pbCopyBitmap(self.contents,@selarrow.bitmap,rect.x,rect.y+14)
  48. end
  49. return Rect.new(rect.x+16,rect.y+16,rect.width-16,rect.height)
  50. end
  51.  
  52. def item
  53. [email protected][self.pocket]
  54. item=thispocket[self.index]
  55. return item ? item[0] : 0
  56. end
  57.  
  58. def itemCount
  59. return @bag.pockets[self.pocket].length+1
  60. end
  61.  
  62. def drawItem(index,count,rect)
  63. textpos=[]
  64. rect=drawCursor(index,rect)
  65. ypos=rect.y+4
  66. if [email protected][self.pocket].length
  67. textpos.push([_INTL("CLOSE BAG"),rect.x,ypos,false,
  68. self.baseColor,self.shadowColor])
  69. else
  70. [email protected][self.pocket][index][0]
  71. qty=_ISPRINTF("x{1: 2d}",@bag.pockets[self.pocket][index][1])
  72. sizeQty=self.contents.text_size(qty).width
  73. xQty=rect.x+rect.width-sizeQty-16
  74. baseColor=(index==@sortIndex) ? Color.new(224,0,0) : self.baseColor
  75. shadowColor=(index==@sortIndex) ? Color.new(248,144,144) : self.shadowColor
  76. textpos.push([itemname,rect.x,ypos,false,baseColor,shadowColor])
  77. if !pbIsImportantItem?(item) # Not a Key item or HM (or infinite TM)
  78. textpos.push([qty,xQty,ypos,false,baseColor,shadowColor])
  79. end
  80. end
  81. pbDrawTextPositions(self.contents,textpos)
  82. if [email protected][self.pocket].length
  83. if @[email protected][self.pocket][index][0]
  84. pbDrawImagePositions(self.contents,[
  85. ["Graphics/Pictures/BW2 Bag/BagReg",rect.x+rect.width-58,ypos+4,0,0,-1,-1]
  86. ])
  87. end
  88. end
  89. end
  90.  
  91. def refresh
  92. @item_max=itemCount()
  93. dwidth=self.width-self.borderX
  94. dheight=self.height-self.borderY
  95. self.contents=pbDoEnsureBitmap(self.contents,dwidth,dheight)
  96. self.contents.clear
  97. for i in 0...@item_max
  98. if i<self.top_item-1 || i>self.top_item+self.page_item_max
  99. next
  100. end
  101. drawItem(i,@item_max,itemRect(i))
  102. end
  103. end
  104. end
  105.  
  106.  
  107.  
  108. class PokemonBag_Scene
  109. ## Configuration
  110. ITEMLISTBASECOLOR = Color.new(248,248,248)
  111. ITEMLISTSHADOWCOLOR = Color.new(90,90,90)
  112. ITEMTEXTBASECOLOR = Color.new(248,248,248)
  113. ITEMTEXTSHADOWCOLOR = Color.new(90,90,90)
  114. POCKETNAMEBASECOLOR = Color.new(248,248,248)
  115. POCKETNAMESHADOWCOLOR = Color.new(90,90,90)
  116. ITEMSVISIBLE = 7
  117.  
  118. def update
  119. pbUpdateSpriteHash(@sprites)
  120. end
  121.  
  122. def pbStartScene(bag)
  123. @viewport=Viewport.new(0,0,Graphics.width,Graphics.height)
  124. @viewport.z=99999
  125. @bag=bag
  126. @sprites={}
  127. [email protected](lastpocket)
  128. @sprites["background"]=IconSprite.new(0,0,@viewport)
  129. @sprites["leftarrow"]=AnimatedSprite.new("Graphics/Pictures/LeftArrow",8,40,28,2,@viewport)
  130. @sprites["rightarrow"]=AnimatedSprite.new("Graphics/Pictures/RightArrow",8,40,28,2,@viewport)
  131. @sprites["leftarrow"].play
  132. @sprites["rightarrow"].play
  133. @sprites["bag"]=IconSprite.new(0,0,@viewport)
  134. @sprites["icon"]=IconSprite.new(24,Graphics.height-72,@viewport)
  135. @sprites["itemwindow"]=Window_PokemonBag.new(@bag,lastpocket,168,-8,314,40+32+ITEMSVISIBLE*32)
  136. @sprites["itemwindow"].viewport=@viewport
  137. @sprites["itemwindow"].pocket=lastpocket
  138. @sprites["itemwindow"].index=lastitem
  139. @sprites["itemwindow"].baseColor=ITEMLISTBASECOLOR
  140. @sprites["itemwindow"].shadowColor=ITEMLISTSHADOWCOLOR
  141. @sprites["itemwindow"].refresh
  142. @sprites["slider"]=IconSprite.new(Graphics.width-40,60,@viewport)
  143. @sprites["slider"].setBitmap(sprintf("Graphics/Pictures/BW2 Bag/BagSlider"))
  144. @sprites["pocketwindow"]=BitmapSprite.new(186,228,@viewport)
  145. pbSetSystemFont(@sprites["pocketwindow"].bitmap)
  146. @sprites["itemtextwindow"]=Window_UnformattedTextPokemon.new("")
  147. @sprites["itemtextwindow"].x=72
  148. @sprites["itemtextwindow"].y=270
  149. @sprites["itemtextwindow"].width=Graphics.width-72
  150. @sprites["itemtextwindow"].height=128
  151. @sprites["itemtextwindow"].baseColor=ITEMTEXTBASECOLOR
  152. @sprites["itemtextwindow"].shadowColor=ITEMTEXTSHADOWCOLOR
  153. @sprites["itemtextwindow"].visible=true
  154. @sprites["itemtextwindow"].viewport=@viewport
  155. @sprites["itemtextwindow"].windowskin=nil
  156. @sprites["helpwindow"]=Window_UnformattedTextPokemon.new("")
  157. @sprites["helpwindow"].visible=false
  158. @sprites["helpwindow"].viewport=@viewport
  159. @sprites["msgwindow"]=Window_AdvancedTextPokemon.new("")
  160. @sprites["msgwindow"].visible=false
  161. @sprites["msgwindow"].viewport=@viewport
  162. pbBottomLeftLines(@sprites["helpwindow"],1)
  163. pbDeactivateWindows(@sprites)
  164. pbRefresh
  165. pbFadeInAndShow(@sprites)
  166. end
  167.  
  168. def pbEndScene
  169. pbFadeOutAndHide(@sprites)
  170. pbDisposeSpriteHash(@sprites)
  171. @viewport.dispose
  172. end
  173.  
  174. def pbChooseNumber(helptext,maximum)
  175. return UIHelper.pbChooseNumber(
  176. @sprites["helpwindow"],helptext,maximum) { update }
  177. end
  178.  
  179. def pbDisplay(msg,brief=false)
  180. UIHelper.pbDisplay(@sprites["msgwindow"],msg,brief) { update }
  181. end
  182.  
  183. def pbConfirm(msg)
  184. UIHelper.pbConfirm(@sprites["msgwindow"],msg) { update }
  185. end
  186.  
  187. def pbShowCommands(helptext,commands)
  188. return UIHelper.pbShowCommands(
  189. @sprites["helpwindow"],helptext,commands) { update }
  190. end
  191.  
  192. def pbRefresh
  193. bm=@sprites["pocketwindow"].bitmap
  194. bm.clear
  195. # Set the bag picture for the currently selected pocket
  196. fbagexists=pbResolveBitmap(sprintf("Graphics/Pictures/BW2 Bag/Bag#{@bag.lastpocket}f"))
  197. if $Trainer.isFemale? && fbagexists
  198. @sprites["bag"].setBitmap("Graphics/Pictures/BW2 Bag/Bag#{@bag.lastpocket}f")
  199. else
  200. @sprites["bag"].setBitmap("Graphics/Pictures/BW2 Bag/Bag#{@bag.lastpocket}")
  201. end
  202. # Draw the pocket name
  203. name=PokemonBag.pocketNames()[@bag.lastpocket]
  204. base=POCKETNAMEBASECOLOR
  205. shadow=POCKETNAMESHADOWCOLOR
  206. pbDrawTextPositions(bm,[
  207. [name,bm.width/2,180,2,base,shadow]
  208. ])
  209. # Reset positions of left/right arrows around the bag
  210. @sprites["leftarrow"].x=-4
  211. @sprites["leftarrow"].y=76
  212. @sprites["rightarrow"].x=150
  213. @sprites["rightarrow"].y=76
  214. itemwindow=@sprites["itemwindow"]
  215. # Draw the slider
  216. ycoord=60
  217. if itemwindow.itemCount>1
  218. ycoord+=116.0 * itemwindow.index/(itemwindow.itemCount-1)
  219. end
  220. @sprites["slider"].y=ycoord
  221. # Set the icon for the currently selected item
  222. filename=pbItemIconFile(itemwindow.item)
  223. @sprites["icon"].setBitmap(filename)
  224. # Display the item's description
  225. @sprites["itemtextwindow"].text=(itemwindow.item==0) ? _INTL("Close bag.") :
  226. pbGetMessage(MessageTypes::ItemDescriptions,itemwindow.item)
  227. # Refresh the item window
  228. itemwindow.refresh
  229. end
  230.  
  231. # Called when the item screen wants an item to be chosen from the screen
  232. def pbChooseItem
  233. pbRefresh
  234. @sprites["helpwindow"].visible=false
  235. itemwindow=@sprites["itemwindow"]
  236. itemwindow.refresh
  237. sorting=false
  238. sortindex=-1
  239. pbActivateWindow(@sprites,"itemwindow"){
  240. loop do
  241. Graphics.update
  242. Input.update
  243. olditem=itemwindow.item
  244. oldindex=itemwindow.index
  245. self.update
  246. if itemwindow.item!=olditem
  247. # Update slider position
  248. ycoord=60
  249. if itemwindow.itemCount>1
  250. ycoord+=116.0 * itemwindow.index/(itemwindow.itemCount-1)
  251. end
  252. @sprites["slider"].y=ycoord
  253. # Update item icon and description
  254. filename=pbItemIconFile(itemwindow.item)
  255. @sprites["icon"].setBitmap(filename)
  256. @sprites["itemtextwindow"].text=(itemwindow.item==0) ? _INTL("Close bag.") :
  257. pbGetMessage(MessageTypes::ItemDescriptions,itemwindow.item)
  258. end
  259. if itemwindow.index!=oldindex
  260. # Update selected item for current pocket
  261. @bag.setChoice(itemwindow.pocket,itemwindow.index)
  262. end
  263. # Change pockets if Left/Right pressed
  264. numpockets=PokemonBag.numPockets
  265. if Input.trigger?(Input::LEFT)
  266. pbSEPlay("BW2_BagSound")
  267. if !sorting
  268. itemwindow.pocket=(itemwindow.pocket==1) ? numpockets : itemwindow.pocket-1
  269. @bag.lastpocket=itemwindow.pocket
  270. pbRefresh
  271. end
  272. elsif Input.trigger?(Input::RIGHT)
  273. pbSEPlay("BW2_BagSound")
  274. if !sorting
  275. itemwindow.pocket=(itemwindow.pocket==numpockets) ? 1 : itemwindow.pocket+1
  276. @bag.lastpocket=itemwindow.pocket
  277. pbRefresh
  278. end
  279. end
  280. # Select item for switching if A is pressed
  281. if Input.trigger?(Input::A)
  282. [email protected][itemwindow.pocket]
  283. if itemwindow.index<thispocket.length && thispocket.length>1 &&
  284. !POCKETAUTOSORT[itemwindow.pocket]
  285. sortindex=itemwindow.index
  286. sorting=true
  287. @sprites["itemwindow"].sortIndex=sortindex
  288. else
  289. next
  290. end
  291. end
  292. # Cancel switching or cancel the item screen
  293. if Input.trigger?(Input::B)
  294. pbSEPlay("BW2_Cancel")
  295. if sorting
  296. sorting=false
  297. @sprites["itemwindow"].sortIndex=-1
  298. else
  299. return 0
  300. end
  301. end
  302. # Confirm selection or item switch
  303. if Input.trigger?(Input::C)
  304. [email protected][itemwindow.pocket]
  305. if itemwindow.index<thispocket.length
  306. if sorting
  307. sorting=false
  308. tmp=thispocket[itemwindow.index]
  309. thispocket[itemwindow.index]=thispocket[sortindex]
  310. thispocket[sortindex]=tmp
  311. @sprites["itemwindow"].sortIndex=-1
  312. pbRefresh
  313. next
  314. else
  315. pbRefresh
  316. return thispocket[itemwindow.index][0]
  317. end
  318. else
  319. return 0
  320. end
  321. end
  322. end
  323. }
  324. end
  325. end
  326.  
  327.  
  328.  
  329. class PokemonBagScreen
  330. def initialize(scene,bag)
  331. @bag=bag
  332. @scene=scene
  333. end
  334.  
  335. def pbDisplay(text)
  336. @scene.pbDisplay(text)
  337. end
  338.  
  339. def pbConfirm(text)
  340. return @scene.pbConfirm(text)
  341. end
  342.  
  343. # UI logic for the item screen when an item is to be held by a Pokémon.
  344. def pbGiveItemScreen
  345. @scene.pbStartScene(@bag)
  346. item=0
  347. loop do
  348. break if item==0
  349. itemname=PBItems.getName(item)
  350. # Key items and hidden machines can't be held
  351. if pbIsImportantItem?(item)
  352. @scene.pbDisplay(_INTL("The {1} can't be held.",itemname))
  353. next
  354. else
  355. break
  356. end
  357. end
  358. @scene.pbEndScene
  359. return item
  360. end
  361.  
  362. #For use on item on Pokémon from Party screen
  363. def pbUseItemScreen(pokemon)
  364. @scene.pbStartScene(@bag)
  365. item=0
  366. loop do
  367. break if item==0
  368. itemname=PBItems.getName(item)
  369. # Key items and hidden machines can't be held
  370. if !ItemHandlers.hasUseOnPokemonHandler(item) && !pbIsMachine?(item)
  371. @scene.pbDisplay(_INTL("The {1} can't be used on {2}.",itemname, pokemon.name))
  372. next
  373. else
  374. ret=pbCheckUseOnPokemonQuick(item,pokemon,@scene)
  375. break if ret==true # End screen, not actually used
  376. @scene.pbRefresh
  377. next
  378. end
  379. end
  380. @scene.pbEndScene
  381. return item
  382. end
  383.  
  384. # UI logic for the item screen for choosing an item
  385. def pbChooseItemScreen
  386. @scene.pbStartScene(@bag)
  387. @scene.pbEndScene
  388. @bag.lastpocket=oldlastpocket
  389. return item
  390. end
  391.  
  392. # UI logic for the item screen for choosing a Berry
  393. def pbChooseBerryScreen
  394. @bag.lastpocket=BERRYPOCKET
  395. @scene.pbStartScene(@bag)
  396. item=0
  397. loop do
  398. break if item==0
  399. itemname=PBItems.getName(item)
  400. if !pbIsBerry?(item)
  401. @scene.pbDisplay(_INTL("That's not a Berry.",itemname))
  402. next
  403. else
  404. break
  405. end
  406. end
  407. @scene.pbEndScene
  408. @bag.lastpocket=oldlastpocket
  409. return item
  410. end
  411.  
  412. # UI logic for tossing an item in the item screen.
  413. def pbTossItemScreen
  414. if !$PokemonGlobal.pcItemStorage
  415. $PokemonGlobal.pcItemStorage=PCItemStorage.new
  416. end
  417. storage=$PokemonGlobal.pcItemStorage
  418. @scene.pbStartScene(storage)
  419. loop do
  420. break if item==0
  421. if pbIsImportantItem?(item)
  422. @scene.pbDisplay(_INTL("That's too important to toss out!"))
  423. next
  424. end
  425. qty=storage.pbQuantity(item)
  426. itemname=PBItems.getName(item)
  427. if qty>1
  428. [email protected](_INTL("Toss out how many {1}(s)?",itemname),qty)
  429. end
  430. if qty>0
  431. if pbConfirm(_INTL("Is it OK to throw away {1} {2}(s)?",qty,itemname))
  432. if !storage.pbDeleteItem(item,qty)
  433. raise "Can't delete items from storage"
  434. end
  435. pbDisplay(_INTL("Threw away {1} {2}(s).",qty,itemname))
  436. end
  437. end
  438. end
  439. @scene.pbEndScene
  440. end
  441.  
  442. # UI logic for withdrawing an item in the item screen.
  443. def pbWithdrawItemScreen
  444. if !$PokemonGlobal.pcItemStorage
  445. $PokemonGlobal.pcItemStorage=PCItemStorage.new
  446. end
  447. storage=$PokemonGlobal.pcItemStorage
  448. @scene.pbStartScene(storage)
  449. loop do
  450. break if item==0
  451. commands=[_INTL("Withdraw"),_INTL("Give"),_INTL("Cancel")]
  452. itemname=PBItems.getName(item)
  453. [email protected](_INTL("{1} is selected.",itemname),commands)
  454. if command==0
  455. qty=storage.pbQuantity(item)
  456. if qty>1
  457. [email protected](_INTL("How many do you want to withdraw?"),qty)
  458. end
  459. if qty>0
  460. if [email protected]?(item,qty)
  461. pbDisplay(_INTL("There's no more room in the Bag."))
  462. else
  463. pbDisplay(_INTL("Withdrew {1} {2}(s).",qty,itemname))
  464. if !storage.pbDeleteItem(item,qty)
  465. raise "Can't delete items from storage"
  466. end
  467. if [email protected](item,qty)
  468. raise "Can't withdraw items from storage"
  469. end
  470. end
  471. end
  472. elsif command==1 # Give
  473. if $Trainer.pokemonCount==0
  474. @scene.pbDisplay(_INTL("There is no Pokémon."))
  475. return 0
  476. elsif pbIsImportantItem?(item)
  477. @scene.pbDisplay(_INTL("The {1} can't be held.",itemname))
  478. else
  479. pbFadeOutIn(99999){
  480. sscene=PokemonScreen_Scene.new
  481. sscreen=PokemonScreen.new(sscene,$Trainer.party)
  482. if sscreen.pbPokemonGiveScreen(item)
  483. # If the item was held, delete the item from storage
  484. if !storage.pbDeleteItem(item,1)
  485. raise "Can't delete item from storage"
  486. end
  487. end
  488. @scene.pbRefresh
  489. }
  490. end
  491. end
  492. end
  493. @scene.pbEndScene
  494. end
  495.  
  496. # UI logic for depositing an item in the item screen.
  497. def pbDepositItemScreen
  498. @scene.pbStartScene(@bag)
  499. if !$PokemonGlobal.pcItemStorage
  500. $PokemonGlobal.pcItemStorage=PCItemStorage.new
  501. end
  502. storage=$PokemonGlobal.pcItemStorage
  503. item=0
  504. loop do
  505. break if item==0
  506. if qty>1
  507. [email protected](_INTL("How many do you want to deposit?"),qty)
  508. end
  509. if qty>0
  510. itemname=PBItems.getName(item)
  511. if !storage.pbCanStore?(item,qty)
  512. pbDisplay(_INTL("There's no room to store items."))
  513. else
  514. pbDisplay(_INTL("Deposited {1} {2}(s).",qty,itemname))
  515. if [email protected](item,qty)
  516. raise "Can't delete items from bag"
  517. end
  518. if !storage.pbStoreItem(item,qty)
  519. raise "Can't deposit items to storage"
  520. end
  521. end
  522. end
  523. end
  524. @scene.pbEndScene
  525. end
  526.  
  527. def pbStartScreen
  528. @scene.pbStartScene(@bag)
  529. item=0
  530. loop do
  531. break if item==0
  532. cmdUse=-1
  533. cmdRegister=-1
  534. cmdGive=-1
  535. cmdToss=-1
  536. cmdRead=-1
  537. cmdMysteryGift=-1
  538. commands=[]
  539. # Generate command list
  540. commands[cmdRead=commands.length]=_INTL("Read") if pbIsMail?(item)
  541. commands[cmdUse=commands.length]=_INTL("Use") if ItemHandlers.hasOutHandler(item) || (pbIsMachine?(item) && $Trainer.party.length>0)
  542. commands[cmdGive=commands.length]=_INTL("Give") if $Trainer.party.length>0 && !pbIsImportantItem?(item)
  543. commands[cmdToss=commands.length]=_INTL("Toss") if !pbIsImportantItem?(item) || $DEBUG
  544. if @bag.registeredItem==item
  545. commands[cmdRegister=commands.length]=_INTL("Deselect")
  546. elsif pbIsKeyItem?(item) && ItemHandlers.hasKeyItemHandler(item)
  547. commands[cmdRegister=commands.length]=_INTL("Register")
  548. end
  549. commands[cmdMysteryGift=commands.length]=_INTL("Make Mystery Gift") if $DEBUG
  550. commands[commands.length]=_INTL("Cancel")
  551. # Show commands generated above
  552. itemname=PBItems.getName(item) # Get item name
  553. [email protected](_INTL("{1} is selected.",itemname),commands)
  554. if cmdUse>=0 && command==cmdUse # Use item
  555. ret=pbUseItem(@bag,item,@scene)
  556. # 0=Item wasn't used; 1=Item used; 2=Close Bag to use in field
  557. break if ret==2 # End screen
  558. @scene.pbRefresh
  559. next
  560. elsif cmdRead>=0 && command==cmdRead # Read mail
  561. pbFadeOutIn(99999){
  562. pbDisplayMail(PokemonMail.new(item,"",""))
  563. }
  564. elsif cmdRegister>=0 && command==cmdRegister # Register key item
  565. @bag.pbRegisterKeyItem(item)
  566. @scene.pbRefresh
  567. elsif cmdGive>=0 && command==cmdGive # Give item to Pokémon
  568. if $Trainer.pokemonCount==0
  569. @scene.pbDisplay(_INTL("There is no Pokémon."))
  570. elsif pbIsImportantItem?(item)
  571. @scene.pbDisplay(_INTL("The {1} can't be held.",itemname))
  572. else
  573. # Give item to a Pokémon
  574. pbFadeOutIn(99999){
  575. sscene=PokemonScreen_Scene.new
  576. sscreen=PokemonScreen.new(sscene,$Trainer.party)
  577. sscreen.pbPokemonGiveScreen(item)
  578. @scene.pbRefresh
  579. }
  580. end
  581. elsif cmdToss>=0 && command==cmdToss # Toss item
  582. helptext=_INTL("Toss out how many {1}(s)?",itemname)
  583. [email protected](helptext,qty)
  584. if qty>0
  585. if pbConfirm(_INTL("Is it OK to throw away {1} {2}(s)?",qty,itemname))
  586. pbDisplay(_INTL("Threw away {1} {2}(s).",qty,itemname))
  587. qty.times { @bag.pbDeleteItem(item) }
  588. end
  589. end
  590. elsif cmdMysteryGift>=0 && command==cmdMysteryGift # Export to Mystery Gift
  591. pbCreateMysteryGift(1,item)
  592. end
  593. end
  594. @scene.pbEndScene
  595. return item
  596. end
  597. end
  598.  
  599.  
  600.  
  601. #===============================================================================
  602. # The Bag object, which actually contains all the items
  603. #===============================================================================
  604. class PokemonBag
  605. attr_reader :registeredItem
  606. attr_accessor :lastpocket
  607. attr_reader :pockets
  608.  
  609. def self.pocketNames()
  610. return pbPocketNames
  611. end
  612.  
  613. def self.numPockets()
  614. return self.pocketNames().length-1
  615. end
  616.  
  617. def initialize
  618. @lastpocket=1
  619. @pockets=[]
  620. @choices=[]
  621. # Initialize each pocket of the array
  622. for i in 0..PokemonBag.numPockets
  623. @pockets[i]=[]
  624. @choices[i]=0
  625. end
  626. @registeredItem=0
  627. end
  628.  
  629. def pockets
  630. rearrange
  631. return @pockets
  632. end
  633.  
  634. def rearrange
  635. if (@pockets.length-1)!=PokemonBag.numPockets
  636. newpockets=[]
  637. for i in 0..PokemonBag.numPockets
  638. newpockets[i]=[]
  639. @choices[i]=0 if !@choices[i]
  640. end
  641. nump=PokemonBag.numPockets
  642. for item in @pockets[i]
  643. p=pbGetPocket(item[0])
  644. newpockets[p].push(item) if p<=nump
  645. end
  646. end
  647. @pockets=newpockets
  648. end
  649. end
  650.  
  651. # Gets the index of the current selected item in the pocket
  652. def getChoice(pocket)
  653. if pocket<=0 || pocket>PokemonBag.numPockets
  654. raise ArgumentError.new(_INTL("Invalid pocket: {1}",pocket.inspect))
  655. end
  656. rearrange
  657. return [@choices[pocket],@pockets[pocket].length].min || 0
  658. end
  659.  
  660. # Clears the entire bag
  661. def clear
  662. for pocket in @pockets
  663. pocket.clear
  664. end
  665. end
  666.  
  667. # Sets the index of the current selected item in the pocket
  668. def setChoice(pocket,value)
  669. if pocket<=0 || pocket>PokemonBag.numPockets
  670. raise ArgumentError.new(_INTL("Invalid pocket: {1}",pocket.inspect))
  671. end
  672. rearrange
  673. @choices[pocket]=value if value<=@pockets[pocket].length
  674. end
  675.  
  676. # Registers the item as a key item. Can be retrieved with $PokemonBag.registeredItem
  677. def pbRegisterKeyItem(item)
  678. if item.is_a?(String) || item.is_a?(Symbol)
  679. item=getID(PBItems,item)
  680. end
  681. if !item || item<1
  682. raise ArgumentError.new(_INTL("The item number is invalid.",item))
  683. return
  684. end
  685. @registeredItem=(item!=@registeredItem) ? item : 0
  686. end
  687.  
  688. def maxPocketSize(pocket)
  689. maxsize=MAXPOCKETSIZE[pocket]
  690. return -1 if !maxsize
  691. return maxsize
  692. end
  693.  
  694. def pbQuantity(item)
  695. if item.is_a?(String) || item.is_a?(Symbol)
  696. item=getID(PBItems,item)
  697. end
  698. if !item || item<1
  699. raise ArgumentError.new(_INTL("The item number is invalid.",item))
  700. return 0
  701. end
  702. pocket=pbGetPocket(item)
  703. maxsize=maxPocketSize(pocket)
  704. maxsize=@pockets[pocket].length if maxsize<0
  705. return ItemStorageHelper.pbQuantity(@pockets[pocket],maxsize,item)
  706. end
  707.  
  708. def pbDeleteItem(item,qty=1)
  709. if item.is_a?(String) || item.is_a?(Symbol)
  710. item=getID(PBItems,item)
  711. end
  712. if !item || item<1
  713. raise ArgumentError.new(_INTL("The item number is invalid.",item))
  714. return false
  715. end
  716. pocket=pbGetPocket(item)
  717. maxsize=maxPocketSize(pocket)
  718. maxsize=@pockets[pocket].length if maxsize<0
  719. ret=ItemStorageHelper.pbDeleteItem(@pockets[pocket],maxsize,item,qty)
  720. if ret
  721. @registeredItem=0 if @registeredItem==item && pbQuantity(item)<=0
  722. end
  723. return ret
  724. end
  725.  
  726. def pbCanStore?(item,qty=1)
  727. if item.is_a?(String) || item.is_a?(Symbol)
  728. item=getID(PBItems,item)
  729. end
  730. if !item || item<1
  731. raise ArgumentError.new(_INTL("The item number is invalid.",item))
  732. return false
  733. end
  734. pocket=pbGetPocket(item)
  735. maxsize=maxPocketSize(pocket)
  736. maxsize=@pockets[pocket].length+1 if maxsize<0
  737. return ItemStorageHelper.pbCanStore?(
  738. @pockets[pocket],maxsize,BAGMAXPERSLOT,item,qty)
  739. end
  740.  
  741. def pbStoreAllOrNone(item,qty=1)
  742. if item.is_a?(String) || item.is_a?(Symbol)
  743. item=getID(PBItems,item)
  744. end
  745. if !item || item<1
  746. raise ArgumentError.new(_INTL("The item number is invalid.",item))
  747. return false
  748. end
  749. pocket=pbGetPocket(item)
  750. maxsize=maxPocketSize(pocket)
  751. maxsize=@pockets[pocket].length+1 if maxsize<0
  752. return ItemStorageHelper.pbStoreAllOrNone(
  753. @pockets[pocket],maxsize,BAGMAXPERSLOT,item,qty)
  754. end
  755.  
  756. def pbStoreItem(item,qty=1)
  757. if item.is_a?(String) || item.is_a?(Symbol)
  758. item=getID(PBItems,item)
  759. end
  760. if !item || item<1
  761. raise ArgumentError.new(_INTL("The item number is invalid.",item))
  762. return false
  763. end
  764. pocket=pbGetPocket(item)
  765. maxsize=maxPocketSize(pocket)
  766. maxsize=@pockets[pocket].length+1 if maxsize<0
  767. return ItemStorageHelper.pbStoreItem(
  768. @pockets[pocket],maxsize,BAGMAXPERSLOT,item,qty,true)
  769. end
  770. end
  771.  
  772.  
  773.  
  774. #===============================================================================
  775. # PC item storage screen
  776. #===============================================================================
  777. class Window_PokemonItemStorage < Window_DrawableCommand
  778. attr_reader :bag
  779. attr_reader :pocket
  780. attr_reader :sortIndex
  781.  
  782. def sortIndex=(value)
  783. @sortIndex=value
  784. refresh
  785. end
  786.  
  787. def initialize(bag,x,y,width,height)
  788. @bag=bag
  789. @sortIndex=-1
  790. @adapter=PokemonMartAdapter.new
  791. super(x,y,width,height)
  792. self.windowskin=nil
  793. end
  794.  
  795. def item
  796. item=@bag[self.index]
  797. return item ? item[0] : 0
  798. end
  799.  
  800. def itemCount
  801. return @bag.length+1
  802. end
  803.  
  804. def drawItem(index,count,rect)
  805. textpos=[]
  806. rect=drawCursor(index,rect)
  807. ypos=rect.y
  808. textpos.push([_INTL("CANCEL"),rect.x,ypos,false,
  809. self.baseColor,self.shadowColor])
  810. else
  811. item=@bag[index][0]
  812. qty=_ISPRINTF("x{1: 2d}",@bag[index][1])
  813. sizeQty=self.contents.text_size(qty).width
  814. xQty=rect.x+rect.width-sizeQty-2
  815. baseColor=(index==@sortIndex) ? Color.new(248,24,24) : self.baseColor
  816. textpos.push([itemname,rect.x,ypos,false,self.baseColor,self.shadowColor])
  817. if !pbIsImportantItem?(item) # Not a Key item or HM (or infinite TM)
  818. textpos.push([qty,xQty,ypos,false,baseColor,self.shadowColor])
  819. end
  820. end
  821. pbDrawTextPositions(self.contents,textpos)
  822. end
  823. end
  824.  
  825.  
  826.  
  827. class ItemStorageScene
  828. ## Configuration
  829. ITEMLISTBASECOLOR = Color.new(248,248,248)
  830. ITEMLISTSHADOWCOLOR = Color.new(90,90,90)
  831. ITEMTEXTBASECOLOR = Color.new(248,248,248)
  832. ITEMTEXTSHADOWCOLOR = Color.new(90,90,90)
  833. TITLEBASECOLOR = Color.new(248,248,248)
  834. TITLESHADOWCOLOR = Color.new(90,90,90)
  835. ITEMSVISIBLE = 7
  836.  
  837. def initialize(title)
  838. @title=title
  839. end
  840.  
  841. def update
  842. pbUpdateSpriteHash(@sprites)
  843. end
  844.  
  845. def pbStartScene(bag)
  846. @viewport=Viewport.new(0,0,Graphics.width,Graphics.height)
  847. @viewport.z=99999
  848. @bag=bag
  849. @sprites={}
  850. @sprites["background"]=IconSprite.new(0,0,@viewport)
  851. @sprites["background"].setBitmap("Graphics/Pictures/BW2 Bag/PCItemBG")
  852. @sprites["icon"]=IconSprite.new(26,310,@viewport)
  853. # Item list
  854. @sprites["itemwindow"]=Window_PokemonItemStorage.new(@bag,98,14,334,32+ITEMSVISIBLE*32)
  855. @sprites["itemwindow"].viewport=@viewport
  856. @sprites["itemwindow"].index=0
  857. @sprites["itemwindow"].baseColor=ITEMLISTBASECOLOR
  858. @sprites["itemwindow"].shadowColor=ITEMLISTSHADOWCOLOR
  859. @sprites["itemwindow"].refresh
  860. # Title
  861. @sprites["pocketwindow"]=BitmapSprite.new(88,64,@viewport)
  862. @sprites["pocketwindow"].x=14
  863. @sprites["pocketwindow"].y=16
  864. pbSetNarrowFont(@sprites["pocketwindow"].bitmap)
  865. # Item description
  866. @sprites["itemtextwindow"]=Window_UnformattedTextPokemon.newWithSize("",84,270,Graphics.width-84,128,@viewport)
  867. @sprites["itemtextwindow"].baseColor=ITEMTEXTBASECOLOR
  868. @sprites["itemtextwindow"].shadowColor=ITEMTEXTSHADOWCOLOR
  869. @sprites["itemtextwindow"].windowskin=nil
  870. @sprites["helpwindow"]=Window_UnformattedTextPokemon.new("")
  871. @sprites["helpwindow"].visible=false
  872. @sprites["helpwindow"].viewport=@viewport
  873. # Letter-by-letter message window
  874. @sprites["msgwindow"]=Window_AdvancedTextPokemon.new("")
  875. @sprites["msgwindow"].visible=false
  876. @sprites["msgwindow"].viewport=@viewport
  877. pbBottomLeftLines(@sprites["helpwindow"],1)
  878. pbDeactivateWindows(@sprites)
  879. pbRefresh
  880. pbFadeInAndShow(@sprites)
  881. end
  882.  
  883. def pbEndScene
  884. pbFadeOutAndHide(@sprites)
  885. pbDisposeSpriteHash(@sprites)
  886. @viewport.dispose
  887. end
  888.  
  889. def pbRefresh
  890. bm=@sprites["pocketwindow"].bitmap
  891. # Draw title at upper left corner ("Toss Item/Withdraw Item")
  892. drawTextEx(bm,0,0,bm.width,2,@title,TITLEBASECOLOR,TITLESHADOWCOLOR)
  893. itemwindow=@sprites["itemwindow"]
  894. # Draw item icon
  895. filename=pbItemIconFile(itemwindow.item)
  896. @sprites["icon"].setBitmap(filename)
  897. # Get item description
  898. @sprites["itemtextwindow"].text=(itemwindow.item==0) ? _INTL("Close storage.") :
  899. pbGetMessage(MessageTypes::ItemDescriptions,itemwindow.item)
  900. itemwindow.refresh
  901. end
  902.  
  903. def pbChooseItem
  904. pbRefresh
  905. @sprites["helpwindow"].visible=false
  906. itemwindow=@sprites["itemwindow"]
  907. itemwindow.refresh
  908. pbActivateWindow(@sprites,"itemwindow"){
  909. loop do
  910. Graphics.update
  911. Input.update
  912. olditem=itemwindow.item
  913. self.update
  914. if itemwindow.item!=olditem
  915. self.pbRefresh
  916. end
  917. if Input.trigger?(Input::B)
  918. return 0
  919. end
  920. if Input.trigger?(Input::C)
  921. if itemwindow.index<@bag.length
  922. pbRefresh
  923. return @bag[itemwindow.index][0]
  924. else
  925. return 0
  926. end
  927. end
  928. end
  929. }
  930. end
  931.  
  932. def pbChooseNumber(helptext,maximum)
  933. return UIHelper.pbChooseNumber(
  934. @sprites["helpwindow"],helptext,maximum) { update }
  935. end
  936.  
  937. def pbDisplay(msg,brief=false)
  938. UIHelper.pbDisplay(@sprites["msgwindow"],msg,brief) { update }
  939. end
  940.  
  941. def pbConfirm(msg)
  942. UIHelper.pbConfirm(@sprites["msgwindow"],msg) { update }
  943. end
  944.  
  945. def pbShowCommands(helptext,commands)
  946. return UIHelper.pbShowCommands(
  947. @sprites["helpwindow"],helptext,commands) { update }
  948. end
  949. end
  950.  
  951.  
  952.  
  953. class WithdrawItemScene < ItemStorageScene
  954. def initialize
  955. super(_INTL("Withdraw\nItem"))
  956. end
  957. end
  958.  
  959.  
  960.  
  961. class TossItemScene < ItemStorageScene
  962. def initialize
  963. super(_INTL("Toss\nItem"))
  964. end
  965. end
  966.  
  967.  
  968.  
  969. #===============================================================================
  970. # The PC item storage object, which actually contains all the items
  971. #===============================================================================
  972. class PCItemStorage
  973. MAXSIZE = 50 # Number of different slots in storage
  974. MAXPERSLOT = 999 # Max. number of items per slot
  975.  
  976. def initialize
  977. @items=[]
  978. # Start storage with a Potion
  979. if hasConst?(PBItems,:POTION)
  980. ItemStorageHelper.pbStoreItem(
  981. @items,MAXSIZE,MAXPERSLOT,getConst(PBItems,:POTION),1)
  982. end
  983. end
  984.  
  985. def empty?
  986. return @items.length==0
  987. end
  988.  
  989. def length
  990. @items.length
  991. end
  992.  
  993. def [](i)
  994. @items[i]
  995. end
  996.  
  997. def getItem(index)
  998. if index<0 || index>[email protected]
  999. return 0
  1000. else
  1001. return @items[index][0]
  1002. end
  1003. end
  1004.  
  1005. def getCount(index)
  1006. if index<0 || index>[email protected]
  1007. return 0
  1008. else
  1009. return @items[index][1]
  1010. end
  1011. end
  1012.  
  1013. def pbQuantity(item)
  1014. return ItemStorageHelper.pbQuantity(@items,MAXSIZE,item)
  1015. end
  1016.  
  1017. def pbDeleteItem(item,qty=1)
  1018. return ItemStorageHelper.pbDeleteItem(@items,MAXSIZE,item,qty)
  1019. end
  1020.  
  1021. def pbCanStore?(item,qty=1)
  1022. return ItemStorageHelper.pbCanStore?(@items,MAXSIZE,MAXPERSLOT,item,qty)
  1023. end
  1024.  
  1025. def pbStoreItem(item,qty=1)
  1026. return ItemStorageHelper.pbStoreItem(@items,MAXSIZE,MAXPERSLOT,item,qty)
  1027. end
  1028. end
  1029.  
  1030.  
  1031.  
  1032. #===============================================================================
  1033. # Common UI functions used in both the Bag and item storage screens.
  1034. # Allows the user to choose a number. The window _helpwindow_ will
  1035. # display the _helptext_.
  1036. #===============================================================================
  1037. module UIHelper
  1038. def self.pbChooseNumber(helpwindow,helptext,maximum)
  1039. oldvisible=helpwindow.visible
  1040. helpwindow.visible=true
  1041. helpwindow.text=helptext
  1042. helpwindow.letterbyletter=false
  1043. curnumber=1
  1044. ret=0
  1045. using(numwindow=Window_UnformattedTextPokemon.new("x000")){
  1046. numwindow.viewport=helpwindow.viewport
  1047. numwindow.letterbyletter=false
  1048. numwindow.text=_ISPRINTF("x{1:03d}",curnumber)
  1049. numwindow.resizeToFit(numwindow.text,480)
  1050. pbBottomRight(numwindow) # Move number window to the bottom right
  1051. helpwindow.resizeHeightToFit(helpwindow.text,480-numwindow.width)
  1052. pbBottomLeft(helpwindow) # Move help window to the bottom left
  1053. loop do
  1054. Graphics.update
  1055. Input.update
  1056. numwindow.update
  1057. block_given? ? yield : helpwindow.update
  1058. if Input.repeat?(Input::LEFT)
  1059. curnumber-=10
  1060. curnumber=1 if curnumber<1
  1061. numwindow.text=_ISPRINTF("x{1:03d}",curnumber)
  1062. pbPlayCursorSE()
  1063. elsif Input.repeat?(Input::RIGHT)
  1064. curnumber+=10
  1065. curnumber=maximum if curnumber>maximum
  1066. numwindow.text=_ISPRINTF("x{1:03d}",curnumber)
  1067. pbPlayCursorSE()
  1068. elsif Input.repeat?(Input::UP)
  1069. curnumber+=1
  1070. curnumber=1 if curnumber>maximum
  1071. numwindow.text=_ISPRINTF("x{1:03d}",curnumber)
  1072. pbPlayCursorSE()
  1073. elsif Input.repeat?(Input::DOWN)
  1074. curnumber-=1
  1075. curnumber=maximum if curnumber<1
  1076. numwindow.text=_ISPRINTF("x{1:03d}",curnumber)
  1077. pbPlayCursorSE()
  1078. elsif Input.trigger?(Input::C)
  1079. ret=curnumber
  1080. pbPlayDecisionSE()
  1081. break
  1082. elsif Input.trigger?(Input::B)
  1083. ret=0
  1084. pbPlayCancelSE()
  1085. break
  1086. end
  1087. end
  1088. }
  1089. helpwindow.visible=oldvisible
  1090. return ret
  1091. end
  1092.  
  1093. def self.pbDisplayStatic(msgwindow,message)
  1094. oldvisible=msgwindow.visible
  1095. msgwindow.visible=true
  1096. msgwindow.letterbyletter=false
  1097. msgwindow.width=Graphics.width
  1098. msgwindow.resizeHeightToFit(message,Graphics.width)
  1099. msgwindow.text=message
  1100. pbBottomRight(msgwindow)
  1101. loop do
  1102. Graphics.update
  1103. Input.update
  1104. if Input.trigger?(Input::B)
  1105. break
  1106. end
  1107. if Input.trigger?(Input::C)
  1108. break
  1109. end
  1110. block_given? ? yield : msgwindow.update
  1111. end
  1112. msgwindow.visible=oldvisible
  1113. Input.update
  1114. end
  1115.  
  1116. # Letter by letter display of the message _msg_ by the window _helpwindow_.
  1117. def self.pbDisplay(helpwindow,msg,brief)
  1118. cw=helpwindow
  1119. cw.letterbyletter=true
  1120. cw.text=msg+"\1"
  1121. pbBottomLeftLines(cw,2)
  1122. oldvisible=cw.visible
  1123. cw.visible=true
  1124. loop do
  1125. Graphics.update
  1126. Input.update
  1127. block_given? ? yield : cw.update
  1128. if brief && !cw.busy?
  1129. cw.visible=oldvisible
  1130. return
  1131. end
  1132. if Input.trigger?(Input::C) && cw.resume && !cw.busy?
  1133. cw.visible=oldvisible
  1134. return
  1135. end
  1136. end
  1137. end
  1138.  
  1139. # Letter by letter display of the message _msg_ by the window _helpwindow_,
  1140. # used to ask questions. Returns true if the user chose yes, false if no.
  1141. def self.pbConfirm(helpwindow,msg)
  1142. dw=helpwindow
  1143. oldvisible=dw.visible
  1144. dw.letterbyletter=true
  1145. dw.text=msg
  1146. dw.visible=true
  1147. pbBottomLeftLines(dw,2)
  1148. commands=[_INTL("Yes"),_INTL("No")]
  1149. cw = Window_CommandPokemon.new(commands)
  1150. cw.viewport=helpwindow.viewport
  1151. pbBottomRight(cw)
  1152. cw.y-=dw.height
  1153. cw.index=0
  1154. loop do
  1155. cw.visible=!dw.busy?
  1156. Graphics.update
  1157. Input.update
  1158. cw.update
  1159. block_given? ? yield : dw.update
  1160. if Input.trigger?(Input::B) && dw.resume && !dw.busy?
  1161. cw.dispose
  1162. dw.visible=oldvisible
  1163. pbPlayCancelSE()
  1164. return false
  1165. end
  1166. if Input.trigger?(Input::C) && dw.resume && !dw.busy?
  1167. cwIndex=cw.index
  1168. cw.dispose
  1169. dw.visible=oldvisible
  1170. pbPlayDecisionSE()
  1171. return (cwIndex==0)?true:false
  1172. end
  1173. end
  1174. end
  1175.  
  1176. def self.pbShowCommands(helpwindow,helptext,commands)
  1177. ret=-1
  1178. oldvisible=helpwindow.visible
  1179. helpwindow.visible=helptext ? true : false
  1180. helpwindow.letterbyletter=false
  1181. helpwindow.text=helptext ? helptext : ""
  1182. cmdwindow=Window_CommandPokemon.new(commands)
  1183. begin
  1184. cmdwindow.viewport=helpwindow.viewport
  1185. pbBottomRight(cmdwindow)
  1186. helpwindow.resizeHeightToFit(helpwindow.text,480-cmdwindow.width)
  1187. pbBottomLeft(helpwindow)
  1188. loop do
  1189. Graphics.update
  1190. Input.update
  1191. yield
  1192. cmdwindow.update
  1193. if Input.trigger?(Input::B)
  1194. ret=-1
  1195. pbPlayCancelSE()
  1196. break
  1197. end
  1198. if Input.trigger?(Input::C)
  1199. ret=cmdwindow.index
  1200. pbPlayDecisionSE()
  1201. break
  1202. end
  1203. end
  1204. ensure
  1205. cmdwindow.dispose if cmdwindow
  1206. end
  1207. helpwindow.visible=oldvisible
  1208. return ret
  1209. end
  1210. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement