Advertisement
TechSkylander1518

Kangaskhan Storage v19

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