Advertisement
Guest User

BW2

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