Advertisement
Guest User

Untitled

a guest
Oct 9th, 2018
95
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 55.73 KB | None | 0 0
  1. #=====================================================================================
  2. # * Bag Script by shiney570. (Originally written for the Essentials BW2 Mod)
  3. #=====================================================================================
  4.  
  5. #===============================================================================
  6. # * adding and defining variables for the class PokeBattle_Trainer
  7. #===============================================================================
  8. class PokeBattle_Trainer
  9. attr_accessor :registeredItems
  10. attr_accessor :freeSpaceItems
  11.  
  12. def registeredItems
  13. @registeredItems=[] if !@registeredItems
  14. return @registeredItems
  15. end
  16.  
  17. def freeSpaceItems
  18. @freeSpaceItems=[] if !@freeSpaceItems
  19. return @freeSpaceItems
  20. end
  21. end
  22.  
  23. # Function for checking if an item is a battle item.
  24. def pbIsBattleItem?(item)
  25. return $ItemData[item] && ($ItemData[item][ITEMBATTLEUSE]==0 && $ItemData[item][ITEMPOCKET]==1)
  26. end
  27.  
  28. # Function for checking if an item belongs to the medicine pocket.
  29. def pbIsMedicineItem?(item)
  30. return ($ItemData[item][ITEMPOCKET]==2)
  31. end
  32.  
  33. # Function for checking if an item is in the Free Space.
  34. def pbIsInFreeSpace?(item)
  35. if item.is_a?(Array)
  36. item=item[0]
  37. end
  38. for i in 0...$Trainer.freeSpaceItems.length
  39. return true if item==$Trainer.freeSpaceItems[i][0]
  40. end
  41. return false
  42. end
  43.  
  44. # Function for adding an item to the Free Space.
  45. def pbAddItemToFreeSpace(item)
  46. if !pbIsInFreeSpace?(item)
  47. $Trainer.freeSpaceItems.push(item)
  48. elsif $DEBUG
  49. p "Something went wrong. The Item is already in the Free Space."
  50. end
  51. end
  52.  
  53. # Function for deleting an item from the Free Space.
  54. def pbDeleteItemFromFreeSpace(item)
  55. if item.is_a?(Array)
  56. item=item[0]
  57. end
  58. if pbIsInFreeSpace?(item)
  59. for i in 0...$Trainer.freeSpaceItems.length
  60. if $Trainer.freeSpaceItems[i][0]==item
  61. $Trainer.freeSpaceItems.delete_at(i)
  62. break
  63. end
  64. end
  65. elsif $DEBUG
  66. p "Something went wrong. The Item isn't even in the Free Space."
  67. end
  68. end
  69.  
  70. # Function for checking if an item is a registered item.
  71. def pbIsRegisteredItem?(item)
  72. for i in 0...$Trainer.registeredItems.length
  73. return true if item==$Trainer.registeredItems[i]
  74. end
  75. return false
  76. end
  77.  
  78. # Function to register another item.
  79. def pbRegisterItem(item)
  80. if item.is_a?(Array)
  81. item=item[0]
  82. end
  83. $Trainer.registeredItems.push(item) if !pbIsRegisteredItem?(item)
  84. end
  85.  
  86. # Function to deselect a registered item.
  87. def pbRemoveRegisteredItem(item)
  88. if item.is_a?(Array)
  89. item=item[0]
  90. end
  91. for i in 0...$Trainer.registeredItems.length
  92. if item==$Trainer.registeredItems[i]
  93. $Trainer.registeredItems.delete_at(i)
  94. break
  95. end
  96. end
  97. end
  98.  
  99. # Updating pbGetPocket to work with BW2 Pockets. It won't use the bag number
  100. # from the items.txt anymore. defining it is still very very important.
  101. def pbGetPocket(item)
  102. if item.is_a?(Array)
  103. item=item[0]
  104. end
  105. return 0 if !item
  106. pocket=1
  107. # Adding Pockets together.
  108. if pbIsInFreeSpace?(item) # Free Space
  109. pocket=6
  110. elsif pbIsKeyItem?(item) # Key Item
  111. pocket=5
  112. elsif pbIsBerry?(item) # Berry
  113. pocket=4
  114. elsif pbIsMachine?(item) # TM / HM
  115. pocket=3
  116. elsif pbIsAbilityMachine?(item) # AM
  117. pocket=3
  118. elsif pbIsMedicineItem?(item) # Medicine
  119. pocket=2
  120. end
  121. return pocket
  122. end
  123. # Returns the name of the pocket an item belongs to as a string.
  124. def pbGetPocketName(item)
  125. if item.is_a?(Array)
  126. item=item[0]
  127. end
  128. return "NONE" if !item
  129. # Checking for the Pocket the item is in regulary. (I could not use
  130. # the method pbGetPocket since I don't want to get "Free Space" returned
  131. # by any chanche.)
  132. pocket=1
  133. if pbIsKeyItem?(item) # Key Item
  134. pocket=5
  135. elsif pbIsBerry?(item) # Berry
  136. pocket=4
  137. elsif pbIsMachine?(item) # TM / HM
  138. pocket=3
  139. elsif pbIsAbilityMachine?(item) # AM
  140. pocket=3
  141. elsif pbIsMedicineItem?(item) # Medicine
  142. pocket=2
  143. end
  144. return pbPocketNames[pocket]
  145. end
  146.  
  147. #===============================================================================
  148. # * Bag screen
  149. #===============================================================================
  150. class Window_PokemonBag < Window_DrawableCommand
  151. attr_reader :pocket
  152. attr_reader :sortIndex
  153.  
  154. def initialize(bag,pocket,x,y,width,height)
  155. @bag=bag
  156. @pocket=pocket
  157. @sortIndex=-1
  158. @adapter=PokemonMartAdapter.new
  159. super(x,y,width,height)
  160. @row_height=48
  161. @selarrow=AnimatedBitmap.new("Graphics/Pictures/Bag/panel_select")
  162. @selarrowy=0
  163. @panel=AnimatedBitmap.new("Graphics/Pictures/Bag/panel")
  164. @pokeball=AnimatedBitmap.new("Graphics/Pictures/Bag/icon_pokeball")
  165. @mail=AnimatedBitmap.new("Graphics/Pictures/Bag/icon_mail")
  166. @tm=AnimatedBitmap.new("Graphics/Pictures/Bag/icon_tm")
  167. @hm=AnimatedBitmap.new("Graphics/Pictures/Bag/icon_hm")
  168. @battle_item=AnimatedBitmap.new("Graphics/Pictures/Bag/icon_item")
  169. @box=AnimatedBitmap.new("Graphics/Pictures/Universal/box")
  170. @box_check=AnimatedBitmap.new("Graphics/Pictures/Universal/box_check")
  171. self.windowskin=nil
  172. end
  173.  
  174. def pocket=(value)
  175. @pocket=value
  176. thispocket=@bag.pockets[@pocket]
  177. @item_max=thispocket.length-1#+1
  178. self.index=@bag.getChoice(@pocket)
  179. refresh
  180. end
  181.  
  182. def sortIndex=(value)
  183. @sortIndex=value
  184. refresh
  185. end
  186.  
  187. def page_row_max; return PokemonBag_Scene::ITEMSVISIBLE; end
  188. def page_item_max; return PokemonBag_Scene::ITEMSVISIBLE; end
  189.  
  190. def itemRect(item)
  191. if item<0 || item>=@item_max || item<self.top_item-1 ||
  192. item>self.top_item+self.page_item_max
  193. return Rect.new(0,0,0,0)
  194. else
  195. cursor_width = (self.width-self.borderX-(@column_max-1)*@column_spacing) / @column_max
  196. x = item % @column_max * (cursor_width + @column_spacing)
  197. y = item / @column_max * @row_height- @virtualOy #48 , virtualoy*1.5
  198. return Rect.new(x, y, cursor_width,48)
  199. end
  200. end
  201.  
  202. def selectedNumber
  203. ret=@selarrowy/48
  204. ret+=1
  205. return ret
  206. end
  207.  
  208. def drawCursor(index,rect)
  209. # Creating panels
  210. if self.index==index
  211. pbCopyBitmap(self.contents,@selarrow.bitmap,rect.x+6+48,rect.y+24)
  212. @selarrowy=rect.y+24
  213. else
  214. @panel=AnimatedBitmap.new("Graphics/Pictures/Bag/panel") if !@panel
  215. pbCopyBitmap(self.contents,@panel.bitmap,rect.x+6+48,rect.y+24) #6
  216. end
  217. return Rect.new(rect.x+16,rect.y+24,rect.width-16,rect.height+24)
  218. end
  219.  
  220. def item
  221. thispocket=@bag.pockets[self.pocket]
  222. item=thispocket[self.index]
  223. return item ? item[0] : 0
  224. end
  225.  
  226. def itemCount
  227. return @bag.pockets[self.pocket].length+1
  228. end
  229.  
  230. def drawItem(index,count,rect)
  231. # Defining the variables again since i got a lot of different errors
  232. # telling me that a random of these variables below is undefined so yeah...
  233. @pokeball=AnimatedBitmap.new("Graphics/Pictures/Bag/icon_pokeball") if !@pokeball
  234. @mail=AnimatedBitmap.new("Graphics/Pictures/Bag/icon_mail") if !@mail
  235. @tm=AnimatedBitmap.new("Graphics/Pictures/Bag/icon_tm") if !@tm
  236. @hm=AnimatedBitmap.new("Graphics/Pictures/Bag/icon_hm") if !@hm
  237. @battle_item=AnimatedBitmap.new("Graphics/Pictures/Bag/icon_item") if !@battle_item
  238. @box=AnimatedBitmap.new("Graphics/Pictures/Universal/box") if !@box
  239. @box_check=AnimatedBitmap.new("Graphics/Pictures/Universal/box_check") if !@box_check
  240. textpos=[]
  241. rect=drawCursor(index,rect)
  242. ypos=rect.y+8
  243. if index==@bag.pockets[self.pocket].length
  244. textpos.push([_INTL("CLOSE BAG"),rect.x+48,ypos,false,
  245. self.baseColor,self.shadowColor])
  246. else
  247. item=@bag.pockets[self.pocket][index][0]
  248. @current_item=item
  249. itemname=@adapter.getDisplayName(item)
  250. qty=_ISPRINTF("x{1: 2d}",@bag.pockets[self.pocket][index][1])
  251. sizeQty=self.contents.text_size(qty).width
  252. xQty=rect.x+rect.width-sizeQty-16
  253. baseColor=(index==@sortIndex) ? Color.new(255,255,255) : self.baseColor
  254. shadowColor=(index==@sortIndex) ? Color.new(165,165,173) : self.shadowColor
  255. # Drawing item type icons behind the panels.
  256. if pbIsPokeBall?(item)
  257. pbCopyBitmap(self.contents,@pokeball.bitmap,rect.x+6,rect.y)
  258. elsif pbIsMail?(item)
  259. pbCopyBitmap(self.contents,@mail.bitmap,rect.x+6,rect.y)
  260. elsif pbIsTechnicalMachine?(item)
  261. pbCopyBitmap(self.contents,@tm.bitmap,rect.x-2,rect.y)
  262. elsif pbIsAbilityMachine?(item)
  263. pbCopyBitmap(self.contents,@tm.bitmap,rect.x-2,rect.y)
  264. elsif pbIsHiddenMachine?(item)
  265. pbCopyBitmap(self.contents,@hm.bitmap,rect.x-2,rect.y)
  266. elsif pbIsBattleItem?(item)
  267. pbCopyBitmap(self.contents,@battle_item.bitmap,rect.x+6,rect.y)
  268. elsif pbIsKeyItem?(item) && ItemHandlers.hasKeyItemHandler(item)
  269. if pbIsRegisteredItem?(item)
  270. pbCopyBitmap(self.contents,@box_check.bitmap,rect.x+6,rect.y+8)
  271. else
  272. pbCopyBitmap(self.contents,@box.bitmap,rect.x+6,rect.y+8)
  273. end
  274. end
  275. if pbIsHiddenMachine?(item) && self.index==index
  276. textpos.push([itemname,rect.x+48,ypos,false,Color.new(239,214,255),Color.new(189,148,206)])
  277. elsif pbIsHiddenMachine?(item)
  278. textpos.push([itemname,rect.x+48,ypos,false,Color.new(206,123,255),Color.new(123,82,148)])
  279. else
  280. textpos.push([itemname,rect.x+48,ypos,false,baseColor,shadowColor])
  281. end
  282. if !pbIsImportantItem?(item) # Not a Key item or HM (or infinite TM)
  283. textpos.push([qty,xQty+48,ypos,false,baseColor,shadowColor])
  284. end
  285. end
  286. pbDrawTextPositions(self.contents,textpos)
  287. if index!=@bag.pockets[self.pocket].length
  288. if @bag.registeredItem==@bag.pockets[self.pocket][index][0]
  289. pbDrawImagePositions(self.contents,[
  290. ["Graphics/Pictures/bagReg",rect.x+rect.width-58,ypos+4,0,0,-1,-1]
  291. ])
  292. end
  293. end
  294. end
  295.  
  296. def refresh
  297. @item_max=itemCount()
  298. dwidth=self.width-self.borderX
  299. dheight=self.height-self.borderY
  300. self.contents=pbDoEnsureBitmap(self.contents,dwidth,dheight)
  301. self.contents.clear
  302. $bag_bitmap=self.contents
  303. for i in 0...@item_max
  304. if i<self.top_item-1 || i>self.top_item+self.page_item_max
  305. next
  306. end
  307. drawItem(i,@item_max,itemRect(i))
  308. end
  309. end
  310. end
  311.  
  312. class PokemonBag_Scene
  313.  
  314. ## Configuration
  315. ITEMLISTBASECOLOR = Color.new(88,88,80)
  316. ITEMLISTSHADOWCOLOR = Color.new(168,184,184)
  317. ITEMTEXTBASECOLOR = Color.new(248,248,248)
  318. ITEMTEXTSHADOWCOLOR = Color.new(0,0,0)
  319. POCKETNAMEBASECOLOR = Color.new(88,88,80)
  320. POCKETNAMESHADOWCOLOR = Color.new(168,184,184)
  321. ITEMSVISIBLE = 6
  322.  
  323. def update
  324. pbUpdateSpriteHash(@sprites)
  325. end
  326.  
  327. def sprites
  328. return @sprites
  329. end
  330.  
  331. def pbStartScene(bag)
  332. pockets=pbPocketNames
  333. @bag=bag
  334. @viewport=Viewport.new(0,0,Graphics.width,Graphics.height)
  335. @viewport.z=99999
  336. @sprites={}
  337. lastpocket=@bag.lastpocket
  338. lastitem=@bag.getChoice(lastpocket)
  339. @sprites["background"]=IconSprite.new(0,0,@viewport)
  340. @sprites["background"].setBitmap("Graphics/Pictures/Bag/bg")
  341. @sprites["background"].setBitmap("Graphics/Pictures/Bag/bg_f") if $Trainer.isFemale?
  342. @sprites["item_bg"]=IconSprite.new(0,0,@viewport)
  343. @sprites["item_bg"].setBitmap("Graphics/Pictures/Bag/item_bg")
  344. @sprites["item_bg"].setBitmap("Graphics/Pictures/Bag/item_bg_f") if $Trainer.isFemale?
  345. @sprites["item_bg"].visible=false
  346. # Ignore the last argument of the arrays. editing it won't make a difference,
  347. # deleting it will give you an error.
  348. x=[0,0,66,135,130,104,1337,1337]
  349. y=[84,188,222,208,124,32,1337,1337]
  350. # (the bag's in BW2 have different coordinates for different gender's
  351. # because the bag's have different height's and width's.)
  352. x=[0,0,66,137,131,99,1337,1337] if $Trainer.isFemale?
  353. y=[40,181,223,205,112,56,1337,1337] if $Trainer.isFemale?
  354.  
  355. for i in 1..pockets.length
  356. if x[i-1]
  357. @sprites["bag_#{i}"]=IconSprite.new(x[i-1],y[i-1],@viewport)
  358. else
  359. @sprites["bag_#{i}"]=IconSprite.new(1337,1337,@viewport)
  360. end
  361.  
  362. fbagexists=pbResolveBitmap(sprintf("Graphics/Pictures/Bag/bag#{i}f"))
  363. if $Trainer.isFemale? && fbagexists
  364. @sprites["bag_#{i}"].setBitmap("Graphics/Pictures/Bag/bag#{i}f")
  365. else
  366. @sprites["bag_#{i}"].setBitmap("Graphics/Pictures/Bag/bag#{i}")
  367. end
  368. @sprites["bag_#{i}"].src_rect.width=@sprites["bag_#{i}"].bitmap.width/3
  369. # Changing the priority. it's kinda stupid because in BW2 the first pocket
  370. # isn't the top/bottom one.
  371. if i<5
  372. @sprites["bag_#{i}"].z+=2
  373. @sprites["bag_#{i}"].z+=1 if i==3
  374. elsif i==5
  375. @sprites["bag_#{i}"].z+=1
  376. end
  377. end
  378. @sprites["itemwindow"]=Window_PokemonBag.new(@bag,lastpocket,281-32-48,-16,512,384-16)
  379. @sprites["itemwindow"].viewport=@viewport
  380. @sprites["itemwindow"].pocket=lastpocket
  381. @sprites["itemwindow"].index=lastitem
  382. @sprites["itemwindow"].baseColor=Color.new(255,255,255)
  383. @sprites["itemwindow"].shadowColor=Color.new(156,156,156)
  384. @sprites["itemwindow"].refresh
  385. @sprites["slider_bg"]=IconSprite.new(490,36,@viewport)
  386. @sprites["slider_bg"].setBitmap("Graphics/Pictures/Bag/slider_bg")
  387. @sprites["slider"]=IconSprite.new(Graphics.width-40,60,@viewport)
  388. @sprites["slider"].setBitmap(sprintf("Graphics/Pictures/Bag/slider"))
  389. @sprites["slider"].x=486
  390. @sprites["itemtextwindow"]=Window_UnformattedTextPokemon.new("")
  391. @sprites["itemtextwindow"].x=20
  392. @sprites["itemtextwindow"].y=184
  393. @sprites["itemtextwindow"].visible=false
  394. @sprites["itemtextwindow"].width=Graphics.width-72
  395. @sprites["itemtextwindow"].height=128
  396. @sprites["itemtextwindow"].baseColor=Color.new(255,255,255)
  397. @sprites["itemtextwindow"].shadowColor=Color.new(123,148,173)
  398. @sprites["itemtextwindow"].shadowColor=Color.new(231,123,148) if $Trainer.isFemale?
  399. @sprites["itemtextwindow"].viewport=@viewport
  400. @sprites["itemtextwindow"].windowskin=nil
  401. @sprites["helpwindow"]=Window_UnformattedTextPokemon.new("")
  402. @sprites["helpwindow"].visible=false
  403. @sprites["helpwindow"].viewport=@viewport
  404. @sprites["msgwindow"]=Window_AdvancedTextPokemon.new("")
  405. @sprites["msgwindow"].visible=false
  406. @sprites["msgwindow"].viewport=@viewport
  407. @sprites["down_bg"]=IconSprite.new(0,0,@viewport)
  408. @sprites["down_bg"].setBitmap("Graphics/Pictures/Universal/down_bg")
  409. @sprites["down_bg"].y= 384-48
  410. @sprites["switch"]=IconSprite.new(0,0,@viewport)
  411. @sprites["switch"].setBitmap("Graphics/Pictures/Bag/switch")
  412. @sprites["switch"].x=6
  413. @sprites["switch"].y=346
  414. @sprites["exit"]=IconSprite.new(0,0,@viewport)
  415. @sprites["exit"].setBitmap("Graphics/Pictures/Universal/exit")
  416. @sprites["exit"].x=385
  417. @sprites["exit"].y=346
  418. @sprites["return"]=IconSprite.new(0,0,@viewport)
  419. @sprites["return"].setBitmap("Graphics/Pictures/Universal/return")
  420. @sprites["return"].x=459
  421. @sprites["return"].y=346
  422. @sprites["icon"]=IconSprite.new(231,128,@viewport)
  423. @sprites["icon"].visible=false
  424. @sprites["overlay"]=BitmapSprite.new(Graphics.width, Graphics.height, @viewport)
  425. @sprites["overlay"].visible=false
  426. @sprites["pocketwindow"]=BitmapSprite.new(512,384,@viewport)# medicine,key items etc...
  427. pbSetSystemFont(@sprites["pocketwindow"].bitmap)
  428. pbBottomLeftLines(@sprites["helpwindow"],1)
  429. pbDeactivateWindows(@sprites)
  430. pbRefresh
  431. pbFadeInAndShow(@sprites)
  432. end
  433.  
  434. # Method for moving an Item to the Free Space and moving it back to the pocket
  435. # if the item is already in the Free Space.
  436. def moveItemToFreeSpace(item)
  437. adapter=PokemonMartAdapter.new
  438. itemname=adapter.getDisplayName(item)
  439. # Moving Item to Free Space if it isn't already.
  440. if !pbIsInFreeSpace?(item)
  441. pockets=pbPocketNames
  442. for i in 1..pockets.length
  443. for u in 0...@bag.pockets[i].length
  444. return if !@bag.pockets[i][u]
  445. if item==@bag.pockets[i][u][0]
  446. array=@bag.pockets[i][u]
  447. pbAddItemToFreeSpace(@bag.pockets[i][u])
  448. @bag.pockets[i].delete_at(u)
  449. @bag.pockets[6]=$Trainer.freeSpaceItems
  450. Kernel.pbMessage("Moved the #{itemname} to the FREE SPACE!")
  451. return
  452. end
  453. end
  454. end
  455. # Moving Item from Free Space back to the pocket
  456. # if it is already in the Free Space.
  457. else
  458. for i in 0...$Trainer.freeSpaceItems.length
  459. if $Trainer.freeSpaceItems[i][0]==item
  460. full_item=$Trainer.freeSpaceItems[i]
  461. end
  462. end
  463. pbDeleteItemFromFreeSpace(item)
  464. @bag.pockets[pbGetPocket(item)].push(full_item)
  465. Kernel.pbMessage("Returned the #{itemname} to the #{pbGetPocketName(item)}!")
  466. end
  467. end
  468.  
  469. def pbEndScene
  470. pbFadeOutAndHide(@sprites)
  471. pbDisposeSpriteHash(@sprites)
  472. @viewport.dispose
  473. end
  474.  
  475. def pbChooseNumber(helptext,maximum)
  476. return UIHelper.pbChooseNumber(
  477. @sprites["helpwindow"],helptext,maximum) { update }
  478. end
  479.  
  480. def pbDisplay(msg,brief=false)
  481. UIHelper.pbDisplay(@sprites["msgwindow"],msg,brief) { update }
  482. end
  483.  
  484. def pbConfirm(msg)
  485. UIHelper.pbConfirm(@sprites["msgwindow"],msg) { update }
  486. end
  487.  
  488. def pbShowCommands(helptext,commands)
  489. return UIHelper.pbShowCommands(
  490. @sprites["helpwindow"],helptext,commands) { update }
  491. end
  492.  
  493. # Quick method for updating the pockets. Will be called in pbRefresh.
  494. def pbUpdatePockets
  495. pockets=pbPocketNames
  496. for i in 1..pockets.length
  497. if i==@bag.lastpocket
  498. @sprites["bag_#{i}"].src_rect.x=@sprites["bag_#{i}"].bitmap.width*2/3
  499. else
  500. @sprites["bag_#{i}"].src_rect.x=0
  501. end
  502. end
  503. end
  504.  
  505. # Quick method for showing the little animation (showing the middle pocket
  506. # image for 5 frames)
  507. def showPocketAnimation(pocket)
  508. pockets=pbPocketNames
  509. for i in 1..pockets.length
  510. @sprites["bag_#{i}"].src_rect.x=0
  511. @sprites["bag_#{i}"].src_rect.x=@sprites["bag_#{i}"].bitmap.width/3 if i==pocket
  512. end
  513. pbWait(5)
  514. end
  515.  
  516. def pbRefresh
  517. @sprites["itemwindow"].visible=false if @page==2
  518. bm=@sprites["pocketwindow"].bitmap
  519. bm.clear
  520. pbUpdatePockets
  521. # Draw the pocket name.
  522. name=PokemonBag.pocketNames()[@bag.lastpocket]
  523. base=Color.new(255,255,255)
  524. shadow=Color.new(165,165,173)
  525. pbDrawTextPositions(bm,[
  526. [name,117+28,344,2,base,shadow]
  527. ])
  528. itemwindow=@sprites["itemwindow"]
  529. # Reposition the slider.
  530. ycoord=36
  531. if itemwindow.itemCount>1
  532. ycoord+=228.0 * itemwindow.index/(itemwindow.itemCount-1)
  533. end
  534. @sprites["slider"].y=ycoord
  535. # Set the icon for the currently selected item
  536. filename=pbItemIconFile(itemwindow.item)
  537. @sprites["icon"].setBitmap(filename)
  538. # Display the item's description
  539. @sprites["itemtextwindow"].text=(itemwindow.item==0) ? _INTL("Close bag.") :
  540. pbGetMessage(MessageTypes::ItemDescriptions,itemwindow.item)
  541. # Refresh the item window
  542. itemwindow.refresh
  543. drawPageTwo if @page==2
  544. end
  545.  
  546. # "draws" the first page. basically it's just changing visibility but yeah...
  547. def drawPageOne
  548. @page=1
  549. pockets=pbPocketNames
  550. for i in 1..pockets.length
  551. @sprites["bag_#{i}"].visible=true
  552. end
  553. @sprites["itemwindow"].visible=true
  554. @sprites["pocketwindow"].visible=true
  555. @sprites["item_bg"].visible=false
  556. @sprites["itemtextwindow"].visible=false
  557. @sprites["icon"].visible=false
  558. @sprites["overlay"].visible=false
  559. end
  560.  
  561. # draws the second page (the page when you click on an item).
  562. def drawPageTwo
  563. @page=2
  564. pockets=pbPocketNames
  565. for i in 1..pockets.length
  566. @sprites["bag_#{i}"].visible=false
  567. end
  568. @sprites["itemwindow"].visible=false
  569. @sprites["item_bg"].visible=true
  570. @sprites["itemtextwindow"].visible=true
  571. @sprites["icon"].visible=true
  572. @sprites["overlay"].visible=true
  573. if @sprites["itemwindow"].pocket==6 # Free Space Pocket.
  574. @sprites["item_bg"].setBitmap("Graphics/Pictures/Bag/item_bg2")
  575. @sprites["item_bg"].setBitmap("Graphics/Pictures/Bag/item_bg_f2") if $Trainer.isFemale?
  576. else
  577. @sprites["item_bg"].setBitmap("Graphics/Pictures/Bag/item_bg")
  578. @sprites["item_bg"].setBitmap("Graphics/Pictures/Bag/item_bg_f") if $Trainer.isFemale?
  579. end
  580. $bag_bitmap.clear
  581. overlay= @sprites["overlay"].bitmap
  582. overlay.clear
  583. base=Color.new(255,255,255)
  584. shadow=Color.new(123,148,173)
  585. shadow=Color.new(231,123,148) if $Trainer.isFemale?
  586. pbSetSystemFont(@sprites["overlay"].bitmap)
  587. @adapter=PokemonMartAdapter.new
  588. textos=[]
  589. # If it's not the last one (Close Bag.)
  590. last_one=(@sprites["itemwindow"].index == (@sprites["itemwindow"].itemCount-1))
  591. if !last_one
  592. item=@bag.pockets[@sprites["itemwindow"].pocket][@sprites["itemwindow"].index][0]
  593. itemname=@adapter.getDisplayName(item)
  594. # Changes String of TMs + HMs.
  595. # Example 1: TM02 Dragon Claw --> No. 02 Dragon Claw
  596. # Example 2: HM03 Surf ---> Hidden 03 Surf
  597. if pbIsMachine?(item)
  598. itemname=itemname[2..-1] # deleting first two characters of the string.
  599. if pbIsTechnicalMachine?(item)
  600. itemname.insert(0,"No. ") # adding characters to the string.
  601. elsif pbIsAbilityMachine?(item)
  602. itemname.insert(0,"No. ") # adding characters to the string.
  603. elsif pbIsHiddenMachine?(item)
  604. itemname.insert(0,"Hidden ") # adding characters to the string.
  605. end
  606. end
  607. textos.push([itemname,256,86,2,base,shadow])
  608. show_itemquantity=true
  609. show_itemquantity=false if pbIsKeyItem?(item)
  610. show_itemquantity=false if pbIsHiddenMachine?(item)
  611. show_itemquantity=false if (pbIsTechnicalMachine?(item) && INFINITETMS)
  612. show_itemquantity=false if (pbIsAbilityMachine?(item) && INFINITEAMS)
  613.  
  614. if show_itemquantity
  615. textos.push([_INTL("x#{@bag.pbQuantity(item)}"),315,136,0,base,shadow])
  616. end
  617. end
  618. textos.push([_INTL("Close Bag."),256,86,2,base,shadow]) if last_one
  619. textos.push([pbGetPocketName(item),256,16,2,base,shadow]) if @sprites["itemwindow"].pocket==6 # Free Space Pocket.
  620. pbDrawTextPositions(overlay,textos)
  621. end
  622.  
  623. # Called when the item screen wants an item to be chosen from the screen
  624. def pbChooseItem
  625. if @bag.pockets[@sprites["itemwindow"].pocket][@sprites["itemwindow"].index]
  626. index=@bag.pockets[@sprites["itemwindow"].pocket][@sprites["itemwindow"].index][0]
  627. else
  628. index=0 # Close Bag.
  629. end
  630. @page=1 if !@page
  631. pbRefresh
  632. @sprites["helpwindow"].visible=false
  633. itemwindow=@sprites["itemwindow"]
  634. itemwindow.refresh
  635. sorting=false
  636. sortindex=-1
  637. pbActivateWindow(@sprites,"itemwindow"){
  638. loop do
  639. Graphics.update
  640. Input.update
  641. olditem=itemwindow.item
  642. oldindex=itemwindow.index
  643. self.update
  644. if itemwindow.item!=olditem
  645. # Update slider position
  646. ycoord=36
  647. if itemwindow.itemCount>1
  648. ycoord+=228.0 * itemwindow.index/(itemwindow.itemCount-1)
  649. end
  650. @sprites["slider"].y=ycoord
  651. # Update item icon and description
  652. drawPageTwo if @page==2
  653. filename=pbItemIconFile(itemwindow.item)
  654. @sprites["icon"].setBitmap(filename)
  655. @sprites["itemtextwindow"].text=(itemwindow.item==0) ? _INTL("Close bag.") :
  656. pbGetMessage(MessageTypes::ItemDescriptions,itemwindow.item)
  657. end
  658. if itemwindow.index!=oldindex
  659. # Update selected item for current pocket
  660. @bag.setChoice(itemwindow.pocket,itemwindow.index)
  661. end
  662. # Change pockets if Left/Right pressed
  663. numpockets=PokemonBag.numPockets
  664. if Input.trigger?(Input::LEFT)
  665. if !sorting
  666. @sprites["switch"].setBitmap("Graphics/Pictures/Bag/switch2")
  667. pbWait(5)
  668. pbPlayDecisionSE()
  669. @sprites["switch"].setBitmap("Graphics/Pictures/Bag/switch")
  670. itemwindow.pocket=(itemwindow.pocket==1) ? numpockets : itemwindow.pocket-1
  671. @bag.lastpocket=itemwindow.pocket
  672. showPocketAnimation(itemwindow.pocket)
  673. pbRefresh
  674. end
  675. elsif Input.trigger?(Input::RIGHT)
  676. if !sorting
  677. @sprites["switch"].setBitmap("Graphics/Pictures/Bag/switch3")
  678. pbWait(5)
  679. pbPlayDecisionSE()
  680. @sprites["switch"].setBitmap("Graphics/Pictures/Bag/switch")
  681. itemwindow.pocket=(itemwindow.pocket==numpockets) ? 1 : itemwindow.pocket+1
  682. @bag.lastpocket=itemwindow.pocket
  683. showPocketAnimation(itemwindow.pocket)
  684. pbRefresh
  685. end
  686. end
  687. # Select item for switching if A is pressed
  688. if Input.trigger?(Input::A)
  689. thispocket=@bag.pockets[itemwindow.pocket]
  690. if itemwindow.index<thispocket.length && thispocket.length>1 &&
  691. !POCKETAUTOSORT[itemwindow.pocket]
  692. sortindex=itemwindow.index
  693. sorting=true
  694. @sprites["itemwindow"].sortIndex=sortindex
  695. else
  696. next
  697. end
  698. end
  699. # Cancel switching or cancel the item screen
  700. if Input.trigger?(Input::B)
  701. @sprites["exit"].setBitmap("Graphics/Pictures/Universal/exit2")
  702. pbWait(10)
  703. @sprites["exit"].setBitmap("Graphics/Pictures/Universal/exit")
  704. pbWait(5)
  705. if @page==2
  706. drawPageOne
  707. pbRefresh
  708. elsif sorting
  709. sorting=false
  710. @sprites["itemwindow"].sortIndex=-1
  711. else
  712. return 0
  713. end
  714. end
  715. if defined?($mouse)
  716. # Mouse Scroll Bar
  717. if $mouse.inAreaPress?(482,10,512-482,300)
  718. max=@sprites["itemwindow"].itemCount-1
  719. @sprites["itemwindow"].index=($mouse.y-36)*max/264
  720. @sprites["itemwindow"].index=max if @sprites["itemwindow"].index>max
  721. @sprites["itemwindow"].index=0 if @sprites["itemwindow"].index<0
  722. pbRefresh
  723. end
  724. # clicking on a panel or on the box to register an item.
  725. if $mouse.leftClick?(@sprites["itemwindow"]) && @sprites["itemwindow"].visible==true
  726. if $mouse.inAreaLeft?(239,25,243,288) #itemwindow.index<@bag.pockets[itemwindow.pocket].length && !sorting
  727. for i in 1...7
  728. break if sorting
  729. if $mouse.inAreaLeft?(239,-24+i*48,243,48)
  730. num=i
  731. break
  732. end
  733. end
  734. if num
  735. val=@sprites["itemwindow"].selectedNumber-num
  736. # Getting the value of the clicked item.
  737. if @bag.pockets[itemwindow.pocket][@sprites["itemwindow"].index-val]
  738. item=@bag.pockets[itemwindow.pocket][@sprites["itemwindow"].index-val][0]
  739. # If clicking on the box for registering an item.
  740. if $mouse.inAreaPress?(239,33,31,272) && pbIsKeyItem?(item) && ItemHandlers.hasKeyItemHandler(item)
  741. if pbIsRegisteredItem?(item)
  742. pbRemoveRegisteredItem(item)
  743. else
  744. pbRegisterItem(item)
  745. end
  746. pbRefresh
  747. # If clicking on the panel.
  748. elsif $mouse.inAreaLeft?(271,25,211,288)
  749. @sprites["itemwindow"].index-=val
  750. thispocket=@bag.pockets[itemwindow.pocket]
  751. pbRefresh
  752. pbWait(10)
  753. drawPageTwo
  754. end
  755. end
  756. end
  757. end
  758. end
  759. # Clicking on the pockets.
  760. pockets=pbPocketNames
  761. for i in 1..pockets.length
  762. if $mouse.leftClick?(@sprites["bag_#{i}"]) &&
  763. !($mouse.leftClick?(@sprites["itemwindow"]) &&
  764. @sprites["itemwindow"].visible==true) &&
  765. $mouse.overPixel?(@sprites["bag_#{i}"])
  766. itemwindow.pocket=i
  767. @bag.lastpocket=itemwindow.pocket
  768. showPocketAnimation(itemwindow.pocket) if @page==1
  769. pbRefresh
  770. end
  771. end
  772. end
  773. # Confirm selection or item switch
  774. if Input.trigger?(Input::C)
  775. thispocket=@bag.pockets[@sprites["itemwindow"].pocket]
  776. @bag.pockets[itemwindow.pocket]
  777. if @page==1 && itemwindow.index<thispocket.length
  778. pbSEPlay("SE_Select1")
  779. drawPageTwo
  780. elsif itemwindow.index<thispocket.length
  781. if sorting
  782. sorting=false
  783. tmp=thispocket[itemwindow.index]
  784. thispocket[itemwindow.index]=thispocket[sortindex]
  785. thispocket[sortindex]=tmp
  786. @sprites["itemwindow"].sortIndex=-1
  787. pbRefresh
  788. next
  789. else
  790. pbRefresh
  791. return thispocket[itemwindow.index][0]
  792. end
  793. else
  794. return 0
  795. end
  796. end
  797. end
  798. pbEndScene
  799. }
  800. end
  801. end
  802.  
  803.  
  804.  
  805. class PokemonBagScreen
  806. def initialize(scene,bag)
  807. @bag=bag
  808. @scene=scene
  809. end
  810.  
  811. def pbDisplay(text)
  812. @scene.pbDisplay(text)
  813. end
  814.  
  815. def pbConfirm(text)
  816. return @scene.pbConfirm(text)
  817. end
  818.  
  819. # UI logic for the item screen when an item is to be held by a Pokmon.
  820. def pbGiveItemScreen
  821. @scene.pbStartScene(@bag)
  822. item=0
  823. loop do
  824. item=@scene.pbChooseItem
  825. break if item==0
  826. itemname=PBItems.getName(item)
  827. # Key items and hidden machines can't be held
  828. if pbIsImportantItem?(item)
  829. @scene.pbDisplay(_INTL("The {1} can't be held.",itemname))
  830. next
  831. else
  832. break
  833. end
  834. end
  835. @scene.pbEndScene
  836. return item
  837. end
  838.  
  839. # UI logic for the item screen for choosing an item
  840. def pbChooseItemScreen
  841. oldlastpocket=@bag.lastpocket
  842. @scene.pbStartScene(@bag)
  843. item=@scene.pbChooseItem
  844. @scene.pbEndScene
  845. @bag.lastpocket=oldlastpocket
  846. return item
  847. end
  848.  
  849. # UI logic for the item screen for choosing a Berry
  850. def pbChooseBerryScreen
  851. oldlastpocket=@bag.lastpocket
  852. @bag.lastpocket=BERRYPOCKET
  853. @scene.pbStartScene(@bag)
  854. item=0
  855. loop do
  856. item=@scene.pbChooseItem
  857. break if item==0
  858. itemname=PBItems.getName(item)
  859. if !pbIsBerry?(item)
  860. @scene.pbDisplay(_INTL("That's not a Berry.",itemname))
  861. next
  862. else
  863. break
  864. end
  865. end
  866. @scene.pbEndScene
  867. @bag.lastpocket=oldlastpocket
  868. return item
  869. end
  870.  
  871. # UI logic for tossing an item in the item screen.
  872. def pbTossItemScreen
  873. if !$PokemonGlobal.pcItemStorage
  874. $PokemonGlobal.pcItemStorage=PCItemStorage.new
  875. end
  876. storage=$PokemonGlobal.pcItemStorage
  877. @scene.pbStartScene(storage)
  878. loop do
  879. item=@scene.pbChooseItem
  880. break if item==0
  881. if pbIsImportantItem?(item)
  882. @scene.pbDisplay(_INTL("That's too important to toss out!"))
  883. next
  884. end
  885. qty=storage.pbQuantity(item)
  886. itemname=PBItems.getName(item)
  887. if qty>1
  888. qty=@scene.pbChooseNumber(_INTL("Toss out how many {1}(s)?",itemname),qty)
  889. end
  890. if qty>0
  891. if pbConfirm(_INTL("Is it OK to throw away {1} {2}(s)?",qty,itemname))
  892. if !storage.pbDeleteItem(item,qty)
  893. raise "Can't delete items from storage"
  894. end
  895. pbDisplay(_INTL("Threw away {1} {2}(s).",qty,itemname))
  896. end
  897. end
  898. end
  899. @scene.pbEndScene
  900. end
  901.  
  902. # UI logic for withdrawing an item in the item screen.
  903. def pbWithdrawItemScreen
  904. if !$PokemonGlobal.pcItemStorage
  905. $PokemonGlobal.pcItemStorage=PCItemStorage.new
  906. end
  907. storage=$PokemonGlobal.pcItemStorage
  908. @scene.pbStartScene(storage)
  909. loop do
  910. item=@scene.pbChooseItem
  911. break if item==0
  912. commands=[_INTL("Withdraw"),_INTL("Give"),_INTL("Cancel")]
  913. itemname=PBItems.getName(item)
  914. command=@scene.pbShowCommands(_INTL("{1} is selected.",itemname),commands)
  915. if command==0
  916. qty=storage.pbQuantity(item)
  917. if qty>1
  918. qty=@scene.pbChooseNumber(_INTL("How many do you want to withdraw?"),qty)
  919. end
  920. if qty>0
  921. if !@bag.pbCanStore?(item,qty)
  922. pbDisplay(_INTL("There's no more room in the Bag."))
  923. else
  924. pbDisplay(_INTL("Withdrew {1} {2}(s).",qty,itemname))
  925. if !storage.pbDeleteItem(item,qty)
  926. raise "Can't delete items from storage"
  927. end
  928. if !@bag.pbStoreItem(item,qty)
  929. raise "Can't withdraw items from storage"
  930. end
  931. end
  932. end
  933. elsif command==1 # Give
  934. if $Trainer.pokemonCount==0
  935. @scene.pbDisplay(_INTL("There is no Pokmon."))
  936. return 0
  937. elsif pbIsImportantItem?(item)
  938. @scene.pbDisplay(_INTL("The {1} can't be held.",itemname))
  939. else
  940. pbFadeOutIn(99999){
  941. sscene=PokemonScreen_Scene.new
  942. sscreen=PokemonScreen.new(sscene,$Trainer.party)
  943. if sscreen.pbPokemonGiveScreen(item)
  944. # If the item was held, delete the item from storage
  945. if !storage.pbDeleteItem(item,1)
  946. raise "Can't delete item from storage"
  947. end
  948. end
  949. updateBag
  950. }
  951. end
  952. end
  953. end
  954. @scene.pbEndScene
  955. end
  956.  
  957. # UI logic for depositing an item in the item screen.
  958. def pbDepositItemScreen
  959. @scene.pbStartScene(@bag)
  960. if !$PokemonGlobal.pcItemStorage
  961. $PokemonGlobal.pcItemStorage=PCItemStorage.new
  962. end
  963. storage=$PokemonGlobal.pcItemStorage
  964. item=0
  965. loop do
  966. item=@scene.pbChooseItem
  967. break if item==0
  968. qty=@bag.pbQuantity(item)
  969. if qty>1
  970. qty=@scene.pbChooseNumber(_INTL("How many do you want to deposit?"),qty)
  971. end
  972. if qty>0
  973. itemname=PBItems.getName(item)
  974. if !storage.pbCanStore?(item,qty)
  975. pbDisplay(_INTL("There's no room to store items."))
  976. else
  977. pbDisplay(_INTL("Deposited {1} {2}(s).",qty,itemname))
  978. if !@bag.pbDeleteItem(item,qty)
  979. raise "Can't delete items from bag"
  980. end
  981. if !storage.pbStoreItem(item,qty)
  982. raise "Can't deposit items to storage"
  983. end
  984. end
  985. end
  986. end
  987. @scene.pbEndScene
  988. end
  989.  
  990. def updateBag
  991. return if !@scene.sprites["pocketwindow"]
  992. #bag.pbRefresh
  993. @scene.drawPageTwo
  994. end
  995.  
  996. def pbStartScreen
  997. @scene.pbStartScene(@bag)
  998. item=0
  999. loop do
  1000. item=@scene.pbChooseItem
  1001. break if item==0
  1002. cmdUse=-1
  1003. cmdRegister=-1
  1004. cmdGive=-1
  1005. cmdToss=-1
  1006. cmdRead=-1
  1007. cmdMysteryGift=-1
  1008. cmdFreeSpace=-1
  1009. commands=[]
  1010. # Generate command list
  1011. commands[cmdRead=commands.length]=_INTL("Read") if pbIsMail?(item)
  1012. commands[cmdUse=commands.length]=_INTL("Use") if ItemHandlers.hasOutHandler(item) || (pbIsMachine?(item) && $Trainer.party.length>0)
  1013. commands[cmdGive=commands.length]=_INTL("Give") if $Trainer.party.length>0 && !pbIsImportantItem?(item)
  1014. commands[cmdToss=commands.length]=_INTL("Toss") if !pbIsImportantItem?(item) || $DEBUG
  1015. if @bag.registeredItem==item || pbIsRegisteredItem?(item)
  1016. commands[cmdRegister=commands.length]=_INTL("Deselect")
  1017. elsif pbIsKeyItem?(item) && ItemHandlers.hasKeyItemHandler(item)
  1018. commands[cmdRegister=commands.length]=_INTL("Register")
  1019. end
  1020. if pbIsInFreeSpace?(item)
  1021. commands[cmdFreeSpace=commands.length]=_INTL("Return to Case")
  1022. else
  1023. commands[cmdFreeSpace=commands.length]=_INTL("To Free Space")
  1024. end
  1025. commands[cmdMysteryGift=commands.length]=_INTL("Make Mystery Gift") if $DEBUG
  1026. commands[commands.length]=_INTL("Cancel")
  1027. # Show commands generated above
  1028. itemname=PBItems.getName(item) # Get item name
  1029. command=@scene.pbShowCommands(_INTL("{1} is selected.",itemname),commands)
  1030. if cmdUse>=0 && command==cmdUse # Use item
  1031. ret=pbUseItem(@bag,item,@scene)
  1032. # 0=Item wasn't used; 1=Item used; 2=Close Bag to use in field
  1033. break if ret==2 # End screen
  1034. updateBag
  1035. next
  1036. elsif cmdRead>=0 && command==cmdRead # Read mail
  1037. pbFadeOutIn(99999){
  1038. pbDisplayMail(PokemonMail.new(item,"",""))
  1039. }
  1040. elsif cmdRegister>=0 && command==cmdRegister # Register key item
  1041. @bag.pbRegisterKeyItem(item)
  1042. #updateBag
  1043. @scene.drawPageTwo
  1044. elsif cmdGive>=0 && command==cmdGive # Give item to Pokmon
  1045. if $Trainer.pokemonCount==0
  1046. @scene.pbDisplay(_INTL("There is no Pokmon."))
  1047. elsif pbIsImportantItem?(item)
  1048. @scene.pbDisplay(_INTL("The {1} can't be held.",itemname))
  1049. else
  1050. # Give item to a Pokmon
  1051. pbFadeOutIn(99999){
  1052. #updateBag
  1053. sscene=PokemonScreen_Scene.new
  1054. sscreen=PokemonScreen.new(sscene,$Trainer.party)
  1055. sscreen.pbPokemonGiveScreen(item)
  1056. }
  1057. updateBag
  1058. end
  1059. elsif cmdToss>=0 && command==cmdToss # Toss item
  1060. qty=@bag.pbQuantity(item)
  1061. helptext=_INTL("Toss out how many {1}(s)?",itemname)
  1062. qty=@scene.pbChooseNumber(helptext,qty)
  1063. if qty>0
  1064. if pbConfirm(_INTL("Is it OK to throw away {1} {2}(s)?",qty,itemname))
  1065. pbDisplay(_INTL("Threw away {1} {2}(s).",qty,itemname))
  1066. qty.times { @bag.pbDeleteItem(item) }
  1067. end
  1068. end
  1069. elsif cmdFreeSpace>=0 && command==cmdFreeSpace
  1070. @scene.moveItemToFreeSpace(item)
  1071. elsif cmdMysteryGift>=0 && command==cmdMysteryGift # Export to Mystery Gift
  1072. pbCreateMysteryGift(1,item)
  1073. end
  1074. end
  1075. @scene.pbEndScene
  1076. return item
  1077. end
  1078. end
  1079.  
  1080. #===============================================================================
  1081. # The Bag object, which actually contains all the items
  1082. #===============================================================================
  1083. class PokemonBag
  1084. attr_reader :registeredItem
  1085. attr_accessor :lastpocket
  1086. attr_reader :pockets
  1087.  
  1088. def self.pocketNames()
  1089. return pbPocketNames
  1090. end
  1091.  
  1092. def self.numPockets()
  1093. return self.pocketNames().length-1
  1094. end
  1095.  
  1096. def initialize
  1097. @lastpocket=1
  1098. @pockets=[]
  1099. @choices=[]
  1100. # Initialize each pocket of the array
  1101. for i in 0..PokemonBag.numPockets
  1102. @pockets[i]=[]
  1103. @choices[i]=0
  1104. end
  1105. @registeredItem=0
  1106. end
  1107.  
  1108. def pockets
  1109. rearrange
  1110. return @pockets
  1111. end
  1112.  
  1113. def rearrange
  1114. if (@pockets.length-1)!=PokemonBag.numPockets
  1115. newpockets=[]
  1116. for i in 0..PokemonBag.numPockets
  1117. newpockets[i]=[]
  1118. @choices[i]=0 if !@choices[i]
  1119. end
  1120. nump=PokemonBag.numPockets
  1121. for i in 0...@pockets.length
  1122. for item in @pockets[i]
  1123. p=pbGetPocket(item[0])
  1124. newpockets[p].push(item) if p<=nump
  1125. end
  1126. end
  1127. @pockets=newpockets
  1128. end
  1129. end
  1130.  
  1131. # Gets the index of the current selected item in the pocket
  1132. def getChoice(pocket)
  1133. if pocket<=0 || pocket>PokemonBag.numPockets
  1134. raise ArgumentError.new(_INTL("Invalid pocket: {1}",pocket.inspect))
  1135. end
  1136. rearrange
  1137. return [@choices[pocket],@pockets[pocket].length].min || 0
  1138. end
  1139.  
  1140. # Clears the entire bag
  1141. def clear
  1142. for pocket in @pockets
  1143. pocket.clear
  1144. end
  1145. end
  1146.  
  1147. # Sets the index of the current selected item in the pocket
  1148. def setChoice(pocket,value)
  1149. if pocket<=0 || pocket>PokemonBag.numPockets
  1150. raise ArgumentError.new(_INTL("Invalid pocket: {1}",pocket.inspect))
  1151. end
  1152. rearrange
  1153. @choices[pocket]=value if value<=@pockets[pocket].length
  1154. end
  1155.  
  1156. # Registers the item as a key item. Can be retrieved with $PokemonBag.registeredItem
  1157. def pbRegisterKeyItem(item)
  1158. if item.is_a?(String) || item.is_a?(Symbol)
  1159. item=getID(PBItems,item)
  1160. end
  1161. if !item || item<1
  1162. raise ArgumentError.new(_INTL("The item number is invalid.",item))
  1163. return
  1164. end
  1165. @registeredItem=(item!=@registeredItem) ? item : 0
  1166. if pbIsRegisteredItem?(item)
  1167. pbRemoveRegisteredItem(item)
  1168. else
  1169. pbRegisterItem(item)
  1170. end
  1171. end
  1172.  
  1173. def maxPocketSize(pocket)
  1174. maxsize=MAXPOCKETSIZE[pocket]
  1175. return -1 if !maxsize
  1176. return maxsize
  1177. end
  1178.  
  1179. def pbQuantity(item)
  1180. if item.is_a?(String) || item.is_a?(Symbol)
  1181. item=getID(PBItems,item)
  1182. end
  1183. if !item || item<1
  1184. raise ArgumentError.new(_INTL("The item number is invalid.",item))
  1185. return 0
  1186. end
  1187. pocket=pbGetPocket(item)
  1188. maxsize=maxPocketSize(pocket)
  1189. maxsize=@pockets[pocket].length if maxsize<0
  1190. return ItemStorageHelper.pbQuantity(@pockets[pocket],maxsize,item)
  1191. end
  1192.  
  1193. def pbDeleteItem(item,qty=1)
  1194. if item.is_a?(String) || item.is_a?(Symbol)
  1195. item=getID(PBItems,item)
  1196. end
  1197. if !item || item<1
  1198. raise ArgumentError.new(_INTL("The item number is invalid.",item))
  1199. return false
  1200. end
  1201. pocket=pbGetPocket(item)
  1202. maxsize=maxPocketSize(pocket)
  1203. maxsize=@pockets[pocket].length if maxsize<0
  1204. ret=ItemStorageHelper.pbDeleteItem(@pockets[pocket],maxsize,item,qty)
  1205. if ret
  1206. @registeredItem=0 if @registeredItem==item && pbQuantity(item)<=0
  1207. end
  1208. return ret
  1209. end
  1210.  
  1211. def pbCanStore?(item,qty=1)
  1212. if item.is_a?(String) || item.is_a?(Symbol)
  1213. item=getID(PBItems,item)
  1214. end
  1215. if !item || item<1
  1216. raise ArgumentError.new(_INTL("The item number is invalid.",item))
  1217. return false
  1218. end
  1219. pocket=pbGetPocket(item)
  1220. maxsize=maxPocketSize(pocket)
  1221. maxsize=@pockets[pocket].length+1 if maxsize<0
  1222. return ItemStorageHelper.pbCanStore?(
  1223. @pockets[pocket],maxsize,BAGMAXPERSLOT,item,qty)
  1224. end
  1225.  
  1226. def pbStoreAllOrNone(item,qty=1)
  1227. if item.is_a?(String) || item.is_a?(Symbol)
  1228. item=getID(PBItems,item)
  1229. end
  1230. if !item || item<1
  1231. raise ArgumentError.new(_INTL("The item number is invalid.",item))
  1232. return false
  1233. end
  1234. pocket=pbGetPocket(item)
  1235. maxsize=maxPocketSize(pocket)
  1236. maxsize=@pockets[pocket].length+1 if maxsize<0
  1237. return ItemStorageHelper.pbStoreAllOrNone(
  1238. @pockets[pocket],maxsize,BAGMAXPERSLOT,item,qty)
  1239. end
  1240.  
  1241. def pbStoreItem(item,qty=1)
  1242. if item.is_a?(String) || item.is_a?(Symbol)
  1243. item=getID(PBItems,item)
  1244. end
  1245. if !item || item<1
  1246. raise ArgumentError.new(_INTL("The item number is invalid.",item))
  1247. return false
  1248. end
  1249. pocket=1
  1250. # Adding Pockets together.
  1251. if pbIsInFreeSpace?(item)
  1252. pocket=6
  1253. elsif pbIsKeyItem?(item)
  1254. pocket=5
  1255. elsif pbIsBerry?(item)
  1256. pocket=4
  1257. elsif pbIsMachine?(item)
  1258. pocket=3
  1259. elsif pbIsAbilityMachine?(item) # AM
  1260. pocket=3
  1261. elsif pbIsMedicineItem?(item) # Medicine
  1262. pocket=2
  1263. end
  1264. maxsize=maxPocketSize(pocket)
  1265. maxsize=@pockets[pocket].length+1 if maxsize<0
  1266. return ItemStorageHelper.pbStoreItem(
  1267. @pockets[pocket],maxsize,BAGMAXPERSLOT,item,qty,true)
  1268. end
  1269. end
  1270.  
  1271. #===============================================================================
  1272. # PC item storage screen
  1273. #===============================================================================
  1274. class Window_PokemonItemStorage < Window_DrawableCommand
  1275. attr_reader :bag
  1276. attr_reader :pocket
  1277. attr_reader :sortIndex
  1278.  
  1279. def sortIndex=(value)
  1280. @sortIndex=value
  1281. refresh
  1282. end
  1283.  
  1284. def initialize(bag,x,y,width,height)
  1285. @bag=bag
  1286. @sortIndex=-1
  1287. @adapter=PokemonMartAdapter.new
  1288. super(x,y,width,height)
  1289. self.windowskin=nil
  1290. end
  1291.  
  1292. def item
  1293. item=@bag[self.index]
  1294. return item ? item[0] : 0
  1295. end
  1296.  
  1297. def itemCount
  1298. return @bag.length+1
  1299. end
  1300.  
  1301. def drawItem(index,count,rect)
  1302. textpos=[]
  1303. rect=drawCursor(index,rect)
  1304. ypos=rect.y
  1305. if index==@bag.length
  1306. textpos.push([_INTL("CANCEL"),rect.x,ypos,false,
  1307. self.baseColor,self.shadowColor])
  1308. else
  1309. item=@bag[index][0]
  1310. itemname=@adapter.getDisplayName(item)
  1311. qty=_ISPRINTF("x{1: 2d}",@bag[index][1])
  1312. sizeQty=self.contents.text_size(qty).width
  1313. xQty=rect.x+rect.width-sizeQty-2
  1314. baseColor=(index==@sortIndex) ? Color.new(248,24,24) : self.baseColor
  1315. textpos.push([itemname,rect.x,ypos,false,self.baseColor,self.shadowColor])
  1316. if !pbIsImportantItem?(item) # Not a Key item or HM (or infinite TM)
  1317. textpos.push([qty,xQty,ypos,false,baseColor,self.shadowColor])
  1318. end
  1319. end
  1320. pbDrawTextPositions(self.contents,textpos)
  1321. end
  1322. end
  1323.  
  1324.  
  1325.  
  1326. class ItemStorageScene
  1327. ## Configuration
  1328. ITEMLISTBASECOLOR = Color.new(88,88,80)
  1329. ITEMLISTSHADOWCOLOR = Color.new(168,184,184)
  1330. ITEMTEXTBASECOLOR = Color.new(248,248,248)
  1331. ITEMTEXTSHADOWCOLOR = Color.new(0,0,0)
  1332. TITLEBASECOLOR = Color.new(248,248,248)
  1333. TITLESHADOWCOLOR = Color.new(0,0,0)
  1334. ITEMSVISIBLE = 7
  1335.  
  1336. def initialize(title)
  1337. @title=title
  1338. end
  1339.  
  1340. def update
  1341. pbUpdateSpriteHash(@sprites)
  1342. end
  1343.  
  1344. def pbStartScene(bag)
  1345. @viewport=Viewport.new(0,0,Graphics.width,Graphics.height)
  1346. @viewport.z=99999
  1347. @bag=bag
  1348. @sprites={}
  1349. @sprites["background"]=IconSprite.new(0,0,@viewport)
  1350. @sprites["background"].setBitmap("Graphics/Pictures/pcItembg")
  1351. @sprites["icon"]=IconSprite.new(25,310,@viewport)
  1352. # Item list
  1353. @sprites["itemwindow"]=Window_PokemonItemStorage.new(@bag,98,14,334,32+ITEMSVISIBLE*32) #32
  1354. @sprites["itemwindow"].viewport=@viewport
  1355. @sprites["itemwindow"].index=0
  1356. @sprites["itemwindow"].baseColor=ITEMLISTBASECOLOR
  1357. @sprites["itemwindow"].shadowColor=ITEMLISTSHADOWCOLOR
  1358. @sprites["itemwindow"].refresh
  1359. # Title
  1360. @sprites["pocketwindow"]=BitmapSprite.new(88,64,@viewport)
  1361. @sprites["pocketwindow"].x=14
  1362. @sprites["pocketwindow"].y=16
  1363. pbSetNarrowFont(@sprites["pocketwindow"].bitmap)
  1364. # Item description
  1365. @sprites["itemtextwindow"]=Window_UnformattedTextPokemon.newWithSize("",84,270,Graphics.width-84,128,@viewport)
  1366. @sprites["itemtextwindow"].baseColor=ITEMTEXTBASECOLOR
  1367. @sprites["itemtextwindow"].shadowColor=ITEMTEXTSHADOWCOLOR
  1368. @sprites["itemtextwindow"].windowskin=nil
  1369. @sprites["helpwindow"]=Window_UnformattedTextPokemon.new("")
  1370. @sprites["helpwindow"].visible=false
  1371. @sprites["helpwindow"].viewport=@viewport
  1372. # Letter-by-letter message window
  1373. @sprites["msgwindow"]=Window_AdvancedTextPokemon.new("")
  1374. @sprites["msgwindow"].visible=false
  1375. @sprites["msgwindow"].viewport=@viewport
  1376. pbBottomLeftLines(@sprites["helpwindow"],1)
  1377. pbDeactivateWindows(@sprites)
  1378. pbRefresh
  1379. pbFadeInAndShow(@sprites)
  1380. end
  1381.  
  1382. def pbEndScene
  1383. pbFadeOutAndHide(@sprites)
  1384. pbDisposeSpriteHash(@sprites)
  1385. @viewport.dispose
  1386. end
  1387.  
  1388. def pbRefresh
  1389. bm=@sprites["pocketwindow"].bitmap
  1390. # Draw title at upper left corner ("Toss Item/Withdraw Item")
  1391. drawTextEx(bm,0,0,bm.width,2,@title,TITLEBASECOLOR,TITLESHADOWCOLOR)
  1392. itemwindow=@sprites["itemwindow"]
  1393. # Draw item icon
  1394. filename=pbItemIconFile(itemwindow.item)
  1395. @sprites["icon"].setBitmap(filename)
  1396. # Get item description
  1397. @sprites["itemtextwindow"].text=(itemwindow.item==0) ? _INTL("Close storage.") :
  1398. pbGetMessage(MessageTypes::ItemDescriptions,itemwindow.item)
  1399. itemwindow.refresh
  1400. end
  1401.  
  1402. def pbChooseItem
  1403. pbRefresh
  1404. @sprites["helpwindow"].visible=false
  1405. itemwindow=@sprites["itemwindow"]
  1406. itemwindow.refresh
  1407. pbActivateWindow(@sprites,"itemwindow"){
  1408. loop do
  1409. Graphics.update
  1410. Input.update
  1411. olditem=itemwindow.item
  1412. self.update
  1413. if itemwindow.item!=olditem
  1414. self.pbRefresh
  1415. end
  1416. if Input.trigger?(Input::B)
  1417. return 0
  1418. end
  1419. if Input.trigger?(Input::C)
  1420. if itemwindow.index<@bag.length
  1421. pbRefresh
  1422. return @bag[itemwindow.index][0]
  1423. else
  1424. return 0
  1425. end
  1426. end
  1427. end
  1428. }
  1429. end
  1430.  
  1431. def pbChooseNumber(helptext,maximum)
  1432. return UIHelper.pbChooseNumber(
  1433. @sprites["helpwindow"],helptext,maximum) { update }
  1434. end
  1435.  
  1436. def pbDisplay(msg,brief=false)
  1437. UIHelper.pbDisplay(@sprites["msgwindow"],msg,brief) { update }
  1438. end
  1439.  
  1440. def pbConfirm(msg)
  1441. UIHelper.pbConfirm(@sprites["msgwindow"],msg) { update }
  1442. end
  1443.  
  1444. def pbShowCommands(helptext,commands)
  1445. return UIHelper.pbShowCommands(
  1446. @sprites["helpwindow"],helptext,commands) { update }
  1447. end
  1448. end
  1449.  
  1450.  
  1451.  
  1452. class WithdrawItemScene < ItemStorageScene
  1453. def initialize
  1454. super(_INTL("Withdraw\nItem"))
  1455. end
  1456. end
  1457.  
  1458.  
  1459.  
  1460. class TossItemScene < ItemStorageScene
  1461. def initialize
  1462. super(_INTL("Toss\nItem"))
  1463. end
  1464. end
  1465.  
  1466. #===============================================================================
  1467. # The PC item storage object, which actually contains all the items
  1468. #===============================================================================
  1469. class PCItemStorage
  1470. MAXSIZE = 50 # Number of different slots in storage
  1471. MAXPERSLOT = 999 # Max. number of items per slot
  1472.  
  1473. def initialize
  1474. @items=[]
  1475. # Start storage with a Potion
  1476. if hasConst?(PBItems,:POTION)
  1477. ItemStorageHelper.pbStoreItem(
  1478. @items,MAXSIZE,MAXPERSLOT,getConst(PBItems,:POTION),1)
  1479. end
  1480. end
  1481.  
  1482. def empty?
  1483. return @items.length==0
  1484. end
  1485.  
  1486. def length
  1487. @items.length
  1488. end
  1489.  
  1490. def [](i)
  1491. @items[i]
  1492. end
  1493.  
  1494. def getItem(index)
  1495. if index<0 || index>=@items.length
  1496. return 0
  1497. else
  1498. return @items[index][0]
  1499. end
  1500. end
  1501.  
  1502. def getCount(index)
  1503. if index<0 || index>=@items.length
  1504. return 0
  1505. else
  1506. return @items[index][1]
  1507. end
  1508. end
  1509.  
  1510. def pbQuantity(item)
  1511. return ItemStorageHelper.pbQuantity(@items,MAXSIZE,item)
  1512. end
  1513.  
  1514. def pbDeleteItem(item,qty=1)
  1515. return ItemStorageHelper.pbDeleteItem(@items,MAXSIZE,item,qty)
  1516. end
  1517.  
  1518. def pbCanStore?(item,qty=1)
  1519. return ItemStorageHelper.pbCanStore?(@items,MAXSIZE,MAXPERSLOT,item,qty)
  1520. end
  1521.  
  1522. def pbStoreItem(item,qty=1)
  1523. return ItemStorageHelper.pbStoreItem(@items,MAXSIZE,MAXPERSLOT,item,qty)
  1524. end
  1525. end
  1526.  
  1527.  
  1528.  
  1529. #===============================================================================
  1530. # Common UI functions used in both the Bag and item storage screens.
  1531. # Allows the user to choose a number. The window _helpwindow_ will
  1532. # display the _helptext_.
  1533. #===============================================================================
  1534. module UIHelper
  1535. def self.pbChooseNumber(helpwindow,helptext,maximum)
  1536. oldvisible=helpwindow.visible
  1537. helpwindow.visible=true
  1538. helpwindow.text=helptext
  1539. helpwindow.letterbyletter=false
  1540. curnumber=1
  1541. ret=0
  1542. using(numwindow=Window_UnformattedTextPokemon.new("x000")){
  1543. numwindow.viewport=helpwindow.viewport
  1544. numwindow.letterbyletter=false
  1545. numwindow.text=_ISPRINTF("x{1:03d}",curnumber)
  1546. numwindow.resizeToFit(numwindow.text,480)
  1547. pbBottomRight(numwindow) # Move number window to the bottom right
  1548. helpwindow.resizeHeightToFit(helpwindow.text,480-numwindow.width)
  1549. pbBottomLeft(helpwindow) # Move help window to the bottom left
  1550. loop do
  1551. Graphics.update
  1552. Input.update
  1553. numwindow.update
  1554. block_given? ? yield : helpwindow.update
  1555. if Input.repeat?(Input::LEFT)
  1556. curnumber-=10
  1557. curnumber=1 if curnumber<1
  1558. numwindow.text=_ISPRINTF("x{1:03d}",curnumber)
  1559. pbPlayCursorSE()
  1560. elsif Input.repeat?(Input::RIGHT)
  1561. curnumber+=10
  1562. curnumber=maximum if curnumber>maximum
  1563. numwindow.text=_ISPRINTF("x{1:03d}",curnumber)
  1564. pbPlayCursorSE()
  1565. elsif Input.repeat?(Input::UP)
  1566. curnumber+=1
  1567. curnumber=1 if curnumber>maximum
  1568. numwindow.text=_ISPRINTF("x{1:03d}",curnumber)
  1569. pbPlayCursorSE()
  1570. elsif Input.repeat?(Input::DOWN)
  1571. curnumber-=1
  1572. curnumber=maximum if curnumber<1
  1573. numwindow.text=_ISPRINTF("x{1:03d}",curnumber)
  1574. pbPlayCursorSE()
  1575. elsif Input.trigger?(Input::C)
  1576. ret=curnumber
  1577. pbPlayDecisionSE()
  1578. break
  1579. elsif Input.trigger?(Input::B)
  1580. ret=0
  1581. pbPlayCancelSE()
  1582. break
  1583. end
  1584. end
  1585. }
  1586. helpwindow.visible=oldvisible
  1587. return ret
  1588. end
  1589.  
  1590. def self.pbDisplayStatic(msgwindow,message)
  1591. oldvisible=msgwindow.visible
  1592. msgwindow.visible=true
  1593. msgwindow.letterbyletter=false
  1594. msgwindow.width=Graphics.width
  1595. msgwindow.resizeHeightToFit(message,Graphics.width)
  1596. msgwindow.text=message
  1597. pbBottomRight(msgwindow)
  1598. loop do
  1599. Graphics.update
  1600. Input.update
  1601. if Input.trigger?(Input::B)
  1602. break
  1603. end
  1604. if Input.trigger?(Input::C)
  1605. break
  1606. end
  1607. block_given? ? yield : msgwindow.update
  1608. end
  1609. msgwindow.visible=oldvisible
  1610. Input.update
  1611. end
  1612.  
  1613. # Letter by letter display of the message _msg_ by the window _helpwindow_.
  1614. def self.pbDisplay(helpwindow,msg,brief)
  1615. cw=helpwindow
  1616. cw.letterbyletter=true
  1617. cw.text=msg+"\1"
  1618. pbBottomLeftLines(cw,2)
  1619. oldvisible=cw.visible
  1620. cw.visible=true
  1621. loop do
  1622. Graphics.update
  1623. Input.update
  1624. block_given? ? yield : cw.update
  1625. if brief && !cw.busy?
  1626. cw.visible=oldvisible
  1627. return
  1628. end
  1629. if Input.trigger?(Input::C) && cw.resume && !cw.busy?
  1630. cw.visible=oldvisible
  1631. return
  1632. end
  1633. end
  1634. end
  1635.  
  1636. # Letter by letter display of the message _msg_ by the window _helpwindow_,
  1637. # used to ask questions. Returns true if the user chose yes, false if no.
  1638. def self.pbConfirm(helpwindow,msg)
  1639. dw=helpwindow
  1640. oldvisible=dw.visible
  1641. dw.letterbyletter=true
  1642. dw.text=msg
  1643. dw.visible=true
  1644. pbBottomLeftLines(dw,2)
  1645. commands=[_INTL("Yes"),_INTL("No")]
  1646. cw = Window_CommandPokemon.new(commands)
  1647. cw.viewport=helpwindow.viewport
  1648. pbBottomRight(cw)
  1649. cw.y-=dw.height
  1650. cw.index=0
  1651. loop do
  1652. cw.visible=!dw.busy?
  1653. Graphics.update
  1654. Input.update
  1655. cw.update
  1656. block_given? ? yield : dw.update
  1657. if Input.trigger?(Input::B) && dw.resume && !dw.busy?
  1658. cw.dispose
  1659. dw.visible=oldvisible
  1660. pbPlayCancelSE()
  1661. return false
  1662. end
  1663. if Input.trigger?(Input::C) && dw.resume && !dw.busy?
  1664. cwIndex=cw.index
  1665. cw.dispose
  1666. dw.visible=oldvisible
  1667. pbPlayDecisionSE()
  1668. return (cwIndex==0)?true:false
  1669. end
  1670. end
  1671. end
  1672.  
  1673. def self.pbShowCommands(helpwindow,helptext,commands)
  1674. ret=-1
  1675. oldvisible=helpwindow.visible
  1676. helpwindow.visible=helptext ? true : false
  1677. helpwindow.letterbyletter=false
  1678. helpwindow.text=helptext ? helptext : ""
  1679. cmdwindow=Window_CommandPokemon.new(commands)
  1680. begin
  1681. cmdwindow.viewport=helpwindow.viewport
  1682. pbBottomRight(cmdwindow)
  1683. helpwindow.resizeHeightToFit(helpwindow.text,480-cmdwindow.width)
  1684. pbBottomLeft(helpwindow)
  1685. loop do
  1686. Graphics.update
  1687. Input.update
  1688. yield
  1689. cmdwindow.update
  1690. if Input.trigger?(Input::B)
  1691. ret=-1
  1692. pbPlayCancelSE()
  1693. break
  1694. end
  1695. if Input.trigger?(Input::C)
  1696. ret=cmdwindow.index
  1697. pbPlayDecisionSE()
  1698. break
  1699. end
  1700. end
  1701. ensure
  1702. cmdwindow.dispose if cmdwindow
  1703. end
  1704. helpwindow.visible=oldvisible
  1705. return ret
  1706. end
  1707. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement