Advertisement
TechSkylander1518

Kangaskhan Storage v18

Aug 4th, 2021 (edited)
262
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Ruby 15.24 KB | None | 0 0
  1. COLUMNS = 5
  2. ROWS = 3
  3.  
  4. LEFT_MARGIN = 88
  5. UP_MARGIN = 24
  6. #The X,Y of where you want the item sprite to be on the bg's sprite
  7. ITEM_CENTER = [32,34]
  8. #The X,Y of where you want the amount to be on the bg's sprite (centered)
  9. AMOUNT_POS = [32,60]
  10. AMOUNT_BASE = Color.new(255,255,255)
  11. AMOUNT_SHADOW = Color.new(64,64,64)
  12. AMOUNT_FONT_SIZE = 22
  13. #The limit to how many items can be put in the slot
  14. #Make 0 if it's infinite
  15. AMOUNT_LIMIT = 10
  16.  
  17. BASE_COLOR = Color.new(80,80,88)
  18. SHADOW_COLOR = Color.new(160,160,168)
  19. #WINDOWSKIN = 0#$PokemonSystem.textskin
  20. DESC_X = 0
  21. DESC_Y = 270
  22. #DESC_WIDTH = Graphics.width
  23. DESC_HEIGHT = 128
  24.  
  25. DEFAULT_STORAGE = (6 * COLUMNS)
  26.  
  27. #This mostly just exists for me playtesting
  28. DEFAULT_CONTENTS = [
  29. [:POTION,5],
  30. [:POTION,5],
  31. [:POTION,5],
  32. [:POTION,5],
  33. [:POTION,5],
  34. [:SUPERPOTION,8],
  35. [:SUPERPOTION,8],
  36. [:SUPERPOTION,8],
  37. [:SUPERPOTION,8],
  38. [:SUPERPOTION,8],
  39. [:HYPERPOTION,10],
  40. [:HYPERPOTION,10],
  41. [:HYPERPOTION,10],
  42. [:HYPERPOTION,10],
  43. [:HYPERPOTION,10],
  44. [:POKEBALL,20],
  45. [:POKEBALL,20],
  46. [:POKEBALL,20],
  47. [:POKEBALL,20],
  48. [:POKEBALL,20],
  49. [:RARECANDY,5],
  50. [:REPEL,667],
  51. [:ULTRABALL,90],
  52. [:REPEL,555],
  53. [:SUPERREPEL,4]
  54. ]
  55.  
  56.  
  57. class PokeBattle_Trainer
  58.   attr_accessor :kstorage
  59.   attr_accessor :storagelimit
  60. end
  61.  
  62. #center_origins command from Marin's Scripting Utilities.
  63. #Since SpriteWrapper isn't a subclass of Sprite, this section needs to stay in
  64. class SpriteWrapper
  65.   def center_origins
  66.     return if !self.bitmap
  67.     self.ox = self.bitmap.width / 2
  68.     self.oy = self.bitmap.height / 2
  69.   end
  70. end
  71.  
  72.  
  73.  
  74. class KStorageDisplay < SpriteWrapper
  75.   attr_accessor :hold
  76.   attr_accessor :amount
  77.   attr_accessor :overlay
  78.  
  79.   def initialize(item,quantity,viewport=nil)
  80.     super(viewport)
  81.     self.bitmap = Bitmap.new("Graphics/Pictures/drawer")
  82.     self.center_origins
  83.     self.ox = ITEM_CENTER[0]
  84.     self.oy = ITEM_CENTER[1]
  85.     self.hold = ItemIconSprite.new(self.x,self.y,0,viewport)
  86.     self.hold.item = getID(PBItems,item)
  87.     if item == nil
  88.         self.hold.visible = false
  89.     end
  90.     self.hold.center_origins
  91.     self.amount = quantity
  92.     if quantity == 0
  93.       self.hold.item = nil
  94.       self.hold.visible = false
  95.     end
  96.       self.overlay = BitmapSprite.new(self.bitmap.width,self.bitmap.height,viewport)
  97.     self.overlay.ox = self.ox
  98.     self.overlay.oy = self.oy
  99.     pbSetSystemFont(self.overlay.bitmap)
  100.     self.overlay.bitmap.font.size = AMOUNT_FONT_SIZE
  101.       textpos = [
  102.        [_INTL("x {1}",self.amount),AMOUNT_POS[0],AMOUNT_POS[1],2,AMOUNT_BASE,AMOUNT_SHADOW],
  103.        ]
  104.        pbDrawTextPositions(self.overlay.bitmap,textpos) if self.amount > 0
  105.   end
  106.  
  107.   def x=(value)
  108.     super
  109.     self.hold.x = value
  110.     self.overlay.x = value
  111.   end
  112.  
  113.   def y=(value)
  114.     super
  115.     self.hold.y = value
  116.     self.overlay.y = value
  117.   end
  118.  
  119.  
  120.   def z=(value)
  121.     super
  122.     self.hold.z = value
  123.     self.overlay.z = value
  124.   end
  125.  
  126.   def fade
  127.     self.hold.opacity = 155
  128.   end
  129.  
  130.   def unfade
  131.     self.hold.opacity = 255
  132.   end
  133.  
  134.   def item
  135.     return self.hold.item
  136.   end
  137.  
  138.   def dispose
  139.     super
  140.     self.hold.dispose if self.hold
  141.     self.overlay.dispose if self.overlay
  142.   end
  143.  
  144.   def take(amount)
  145.     self.amount -= amount
  146.       self.overlay.bitmap.clear
  147.     if self.amount == 0
  148.       self.hold.item = nil
  149.       self.hold.visible = false
  150.     else
  151.       pbSetSystemFont(self.overlay.bitmap)
  152.       self.overlay.bitmap.font.size = AMOUNT_FONT_SIZE
  153.       textpos = [
  154.          [_INTL("x {1}",self.amount),AMOUNT_POS[0],AMOUNT_POS[1],2,AMOUNT_BASE,AMOUNT_SHADOW],
  155.          ]
  156.       pbDrawTextPositions(self.overlay.bitmap,textpos)
  157.     end
  158.   end
  159.  
  160.   def setItem(item)
  161.     self.hold.item = getID(PBItems,item)
  162.     if item == nil
  163.         self.hold.visible = false
  164.     else
  165.         self.hold.visible = true
  166.     end
  167.     self.hold.center_origins
  168.   end
  169.  
  170.  
  171.   def setAmount(amount)
  172.     self.amount = amount
  173.       self.overlay.bitmap.clear
  174.     if self.amount == 0
  175.       self.hold.item = nil
  176.       self.hold.visible = false
  177.     else
  178.       self.hold.visible = true
  179.       pbSetSystemFont(self.overlay.bitmap)
  180.       self.overlay.bitmap.font.size = AMOUNT_FONT_SIZE
  181.       textpos = [
  182.          [_INTL("x {1}",self.amount),AMOUNT_POS[0],AMOUNT_POS[1],2,AMOUNT_BASE,AMOUNT_SHADOW],
  183.          ]
  184.       pbDrawTextPositions(self.overlay.bitmap,textpos)
  185.     end
  186.   end
  187.  
  188. end
  189.  
  190. def pbKStorage
  191.   scene = KangaStorage.new
  192. end
  193.  
  194. class KangaStorage
  195.  
  196.   def initialize
  197.     if !$Trainer.kstorage
  198.       $Trainer.kstorage = []
  199.       $Trainer.kstorage = DEFAULT_CONTENTS if $DEBUG
  200.     end
  201.     $Trainer.storagelimit = DEFAULT_STORAGE  if $Trainer.storagelimit == nil
  202.     items=$Trainer.kstorage
  203.     @viewport = Viewport.new(0,0,Graphics.width,Graphics.height)
  204.     @sprites = {}
  205.     @SelNo=0
  206.     @rowboost = 0
  207.     @rows = (items.length)/COLUMNS
  208.     @rows += 1 if (items.length)%COLUMNS > 0
  209.     @rows = ROWS if @rows < ROWS
  210.     size = ROWS * COLUMNS
  211.     for i in 0...size
  212.       entry = [nil,0]
  213.       entry = items[i] if items[i]
  214.       @sprites["item#{i}"] = KStorageDisplay.new(entry[0],entry[1],@viewport)
  215.       bg = @sprites["item#{i}"]
  216.       bg.x = LEFT_MARGIN + bg.ox + (bg.bitmap.width*(i%COLUMNS))
  217.       bg.y = UP_MARGIN + bg.oy + (bg.bitmap.height*(i/COLUMNS))
  218.       bg.fade if i!=@SelNo
  219.     end
  220.     @sprites["cursor"] = Sprite.new(@viewport)
  221.     @sprites["cursor"].bitmap = Bitmap.new("Graphics/Pictures/drawercursor")
  222.     @sprites["cursor"].center_origins
  223.     @sprites["itemtext"] = Window_UnformattedTextPokemon.newWithSize("",DESC_X,DESC_Y,Graphics.width,DESC_HEIGHT,@viewport)
  224.     @sprites["itemtext"].baseColor   = BASE_COLOR
  225.     @sprites["itemtext"].shadowColor = SHADOW_COLOR
  226.    # @sprites["itemtext"].windowskin  = WINDOWSKIN
  227.     $game_system.menu_disabled=true
  228.     main
  229.   end
  230.  
  231.   def refresh
  232.     items=$Trainer.kstorage
  233.     size = ROWS * COLUMNS
  234.     start = @rowboost * COLUMNS
  235.     for i in 0...size
  236.       entry = [nil,0]
  237.       entry = items[i+start] if items[i+start]
  238.       bg = @sprites["item#{i}"]
  239.       bg.setAmount(entry[1])
  240.       bg.setItem(entry[0])
  241.       bg.fade if i!=@SelNo
  242.     end
  243.   end
  244.    
  245.  
  246.   def main
  247.     loop do
  248.       sel = @sprites["item#{@SelNo}"]
  249.       sel.unfade if sel.hold.item
  250.       @sprites["cursor"].x=sel.x
  251.       @sprites["cursor"].y=sel.y
  252.       if sel.item == nil
  253.         @sprites["itemtext"].visible = false
  254.       else
  255.         @sprites["itemtext"].visible = true
  256.         @sprites["itemtext"].text = _INTL("{1}",pbGetMessage(MessageTypes::ItemDescriptions,sel.item))
  257.       end
  258.       Graphics.update
  259.       Input.update
  260.         if Input.trigger?(Input::LEFT)
  261.            pbPlayDecisionSE
  262.            @sprites["item#{@SelNo}"].fade
  263.             if @SelNo%COLUMNS == 0
  264.               @SelNo+=COLUMNS-1
  265.             else
  266.               @SelNo-=1
  267.             end
  268.         elsif Input.trigger?(Input::RIGHT)
  269.            pbPlayDecisionSE
  270.            @sprites["item#{@SelNo}"].fade
  271.             if @SelNo%COLUMNS == COLUMNS-1
  272.               @SelNo-=COLUMNS-1
  273.             else
  274.               @SelNo+=1
  275.             end
  276.         elsif Input.trigger?(Input::DOWN)
  277.            pbPlayDecisionSE
  278.            @sprites["item#{@SelNo}"].fade
  279.             if @SelNo/COLUMNS == ROWS-1
  280.               if @rowboost < (($Trainer.storagelimit/COLUMNS) - ROWS)
  281.                 @rowboost += 1
  282.               else
  283.                 @SelNo-= (COLUMNS * (ROWS-1))
  284.                 @rowboost = 0
  285.               end
  286.               self.refresh
  287.             else
  288.               @SelNo+=COLUMNS
  289.             end
  290.         elsif Input.trigger?(Input::UP)
  291.            pbPlayDecisionSE
  292.            @sprites["item#{@SelNo}"].fade
  293.             if @SelNo/COLUMNS == 0
  294.               if @rowboost >0
  295.                 @rowboost -= 1
  296.               else
  297.                 @SelNo+=(COLUMNS * (ROWS-1))
  298.                 @rowboost = (($Trainer.storagelimit/COLUMNS) - ROWS)
  299.               end
  300.               self.refresh
  301.             else
  302.               @SelNo-=COLUMNS
  303.             end
  304.       elsif Input.trigger?(Input::C)
  305.           sel = @sprites["item#{@SelNo}"]
  306.           if sel.item
  307.             item = sel.item
  308.             qty = sel.amount
  309.             itemname = PBItems.getNamePlural(item)
  310.             @sprites["itemtext"].visible = false
  311.             if AMOUNT_LIMIT < 0 && $PokemonBag.pbQuantity(item) > 0 ||
  312.               AMOUNT_LIMIT > 0 && sel.amount < AMOUNT_LIMIT && $PokemonBag.pbQuantity(item) > 0
  313.               choices = ["Withdraw","Deposit more","Exit"]
  314.               command = pbMessage("What do you want to do?",choices,choices.length)
  315.               case command
  316.                 #exit
  317.                 when choices.length, -1
  318.                   self.refresh
  319.                 #withdraw
  320.                 when 0
  321.                 #todo- tidy up this
  322.                   quantity=pbChooseItemNumber(_INTL("Take how many {1}?",itemname),item,qty,@viewport)
  323.                   if quantity>0
  324.                     itemname = PBItems.getName(item) if quantity == 1
  325.                     pbMessage(_INTL("Took {1} {2}.",quantity,itemname))
  326.                     $PokemonBag.pbStoreItem(item,quantity)
  327.                     entry = $Trainer.kstorage[@SelNo + (@rowboost * COLUMNS)]
  328.                     entry[1] -= quantity
  329.                     $Trainer.kstorage.delete_at(@SelNo + (@rowboost * COLUMNS)) if quantity == qty
  330.                     self.refresh
  331.                   end
  332.                 #deposit more
  333.                 when 1
  334.                   qty = $PokemonBag.pbQuantity(item)
  335.                   remainmax = AMOUNT_LIMIT - sel.amount if AMOUNT_LIMIT > 0
  336.                   qty = [qty,remainmax].min
  337.                   quantity=pbChooseItemNumber(_INTL("Deposit how many {1}?",itemname),item,qty,@viewport)
  338.                   if quantity > 0
  339.                     entry = $Trainer.kstorage[@SelNo + (@rowboost * COLUMNS)]
  340.                     $PokemonBag.pbDeleteItem(item,quantity)
  341.                     entry[1] += quantity
  342.                     self.refresh
  343.                   end
  344.               end
  345.             else
  346.               quantity=pbChooseItemNumber(_INTL("Take how many {1}?",itemname),item,qty,@viewport)
  347.               if quantity>0
  348.                 itemname = PBItems.getName(item) if quantity == 1
  349.                 pbMessage(_INTL("Took {1} {2}.",quantity,itemname))
  350.                 $PokemonBag.pbStoreItem(item,quantity)
  351.                 entry = $Trainer.kstorage[@SelNo + (@rowboost * COLUMNS)]
  352.                 entry[1] -= quantity
  353.                 $Trainer.kstorage.delete_at(@SelNo + (@rowboost * COLUMNS)) if quantity == qty
  354.                 self.refresh
  355.               end
  356.           end
  357.           else
  358.             #no item in given slot
  359.             if pbConfirmMessage(_INTL("Store an item?"))
  360.                 pbDepositItemK
  361.                 self.refresh
  362.             end
  363.           end
  364.       elsif Input.trigger?(Input::B)
  365.         $game_variables[3]=0
  366.            pbPlayCancelSE
  367.             break
  368.         end
  369.     end
  370.     dispose
  371.     pbWait(5)
  372.     $game_system.menu_disabled=false
  373.   end
  374.  
  375.   def dispose
  376.     pbDisposeSpriteHash(@sprites)
  377.     @viewport.dispose
  378.   end
  379.  
  380. end
  381.  
  382.  
  383.   def pbChooseItemNumber(helptext,item,maximum,viewport)
  384.     curnumber = 1
  385.     ret = 0
  386.     helpwindow = Window_AdvancedTextPokemon.new(helptext)
  387.     helpwindow.y = Graphics.height/2 + 70
  388.     helpwindow.x = (Graphics.width/2) - (helpwindow.width/2)
  389.     helpwindow.viewport = viewport
  390.     helpwindow.visible = true
  391.     helpwindow.update
  392.     using(numwindow = Window_AdvancedTextPokemon.new("")) {   # Showing number of items
  393.       qty = $PokemonBag.pbQuantity(item)
  394.       using(inbagwindow = Window_AdvancedTextPokemon.new("")) {   # Showing quantity in bag
  395.         numwindow.visible = true
  396.         numwindow.letterbyletter = false
  397.         inbagwindow.visible = true
  398.         inbagwindow.letterbyletter = false
  399.         numwindow.viewport = viewport
  400.         numwindow.width = 99
  401.         numwindow.height = 64
  402.         numwindow.baseColor = Color.new(88, 88, 80)
  403.         numwindow.shadowColor = Color.new(168, 184, 184)
  404.         inbagwindow.visible = true
  405.         inbagwindow.viewport = viewport
  406.         inbagwindow.width = 150
  407.         inbagwindow.height = 64
  408.         inbagwindow.baseColor = Color.new(88, 88, 80)
  409.         inbagwindow.shadowColor = Color.new(168, 184, 184)
  410.         inbagwindow.text = _INTL("In Bag: <r>{1}", qty)
  411.         numwindow.text = _INTL("x{1}", curnumber)
  412.         pbBottomRight(numwindow)
  413.         #numwindow.y -= helpwindow.height
  414.         pbBottomLeft(inbagwindow)
  415.         #inbagwindow.y -= helpwindow.height
  416.         loop do
  417.           Graphics.update
  418.           Input.update
  419.           numwindow.update
  420.           inbagwindow.update
  421.           if Input.repeat?(Input::LEFT)
  422.             pbPlayCursorSE
  423.             curnumber -= 10
  424.             curnumber = 1 if curnumber < 1
  425.             numwindow.text = _INTL("x{1}", curnumber)
  426.           elsif Input.repeat?(Input::RIGHT)
  427.             pbPlayCursorSE
  428.             curnumber += 10
  429.             curnumber = maximum if curnumber > maximum
  430.             numwindow.text = _INTL("x{1}", curnumber)
  431.           elsif Input.repeat?(Input::UP)
  432.             pbPlayCursorSE
  433.             curnumber += 1
  434.             curnumber = 1 if curnumber > maximum
  435.             numwindow.text = _INTL("x{1}", curnumber)
  436.           elsif Input.repeat?(Input::DOWN)
  437.             pbPlayCursorSE
  438.             curnumber -= 1
  439.             curnumber = maximum if curnumber < 1
  440.             numwindow.text = _INTL("x{1}", curnumber)
  441.           elsif Input.trigger?(Input::C)
  442.             pbPlayDecisionSE
  443.             ret = curnumber
  444.             break
  445.           elsif Input.trigger?(Input::X)
  446.             pbPlayCancelSE
  447.             ret = 0
  448.             break
  449.           end
  450.         end
  451.       }
  452.     }
  453.     helpwindow.dispose
  454.     return ret
  455.   end
  456.  
  457.     # Adapted from Item Storage in the PC
  458.   def pbDepositItemK
  459.     scene = PokemonBag_Scene.new
  460.     scene.pbStartScene($PokemonBag)
  461.     loop do
  462.       item = scene.pbChooseItem
  463.       break if !item
  464.       itm = getID(PBItems,item)
  465.       if AMOUNT_LIMIT > 0
  466.         qty  = [AMOUNT_LIMIT,$PokemonBag.pbQuantity(item)].min
  467.       else
  468.         qty = $PokemonBag.pbQuantity(item)
  469.       end
  470.       if qty>1 && !pbIsImportantItem?(itm)
  471.         qty = scene.pbChooseNumber(_INTL("How many do you want to deposit?"),qty)
  472.       end
  473.       if qty>0
  474.        # if !storage.pbCanStore?(item,qty)
  475.        #   pbDisplay(_INTL("There's no room to store items."))
  476.        # else
  477.           if !$PokemonBag.pbDeleteItem(item,qty)
  478.             raise "Can't delete items from Bag"
  479.           end
  480.          # if !storage.pbStoreItem(item,qty)
  481.          #   raise "Can't deposit items to storage"
  482.          # end
  483.           scene.pbRefresh
  484.           dispqty  = (pbIsImportantItem?(itm)) ? 1 : qty
  485.           itemname = (dispqty>1) ? PBItems.getNamePlural(itm) : PBItems.getName(itm)
  486.           #I'm going to eventually add a way to merge with an existing slot, just need to work it out
  487.           #for i in 0...$Trainer.kstorage.length
  488.           #  if $Trainer.kstorage[i][0] == item && $Trainer.kstorage[i][0] < AMOUNT_LIMIT - qty
  489.           #     $Trainer.kstorage[i][1] += qty
  490.           #     break
  491.           #  end
  492.           #end
  493.           $Trainer.kstorage.push([item,qty]) if item
  494.           scene.pbDisplay(_INTL("Deposited {1} {2}.",dispqty,itemname))
  495.           break
  496.        # end
  497.       end
  498.     end
  499.     scene.pbEndScene
  500.   end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement