Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- COLUMNS = 5
- ROWS = 3
- LEFT_MARGIN = 88
- UP_MARGIN = 24
- #The X,Y of where you want the item sprite to be on the bg's sprite
- ITEM_CENTER = [32,34]
- #The X,Y of where you want the amount to be on the bg's sprite (centered)
- AMOUNT_POS = [32,50]
- AMOUNT_BASE = Color.new(255,255,255)
- AMOUNT_SHADOW = Color.new(64,64,64)
- AMOUNT_FONT_SIZE = 22
- #The limit to how many items can be put in the slot
- #Make 0 if it's infinite
- AMOUNT_LIMIT = 10
- BASE_COLOR = Color.new(80,80,88)
- SHADOW_COLOR = Color.new(160,160,168)
- #WINDOWSKIN = 0#$PokemonSystem.textskin
- DESC_X = 0
- DESC_Y = 270
- #DESC_WIDTH = Graphics.width
- DESC_HEIGHT = 128
- DEFAULT_STORAGE = (6 * COLUMNS)
- class Player
- attr_accessor :kstorage
- attr_accessor :storagelimit
- end
- #center_origins command from Marin's Scripting Utilities.
- #Since SpriteWrapper isn't a subclass of Sprite, this section needs to stay in
- class SpriteWrapper
- def center_origins
- return if !self.bitmap
- self.ox = self.bitmap.width / 2
- self.oy = self.bitmap.height / 2
- end
- end
- class KStorageDisplay < SpriteWrapper
- attr_accessor :hold
- attr_accessor :amount
- attr_accessor :overlay
- def initialize(item,quantity,viewport=nil)
- super(viewport)
- self.bitmap = Bitmap.new("Graphics/Pictures/drawer")
- self.center_origins
- self.ox = ITEM_CENTER[0]
- self.oy = ITEM_CENTER[1]
- self.hold = ItemIconSprite.new(self.x,self.y,0,viewport)
- self.hold.item = item
- if item == nil
- self.hold.visible = false
- end
- self.hold.center_origins
- self.amount = quantity
- if quantity == 0
- self.hold.item = nil
- self.hold.visible = false
- end
- self.overlay = BitmapSprite.new(self.bitmap.width,self.bitmap.height,viewport)
- self.overlay.ox = self.ox
- self.overlay.oy = self.oy
- pbSetSystemFont(self.overlay.bitmap)
- self.overlay.bitmap.font.size = AMOUNT_FONT_SIZE
- textpos = [
- [_INTL("x {1}",self.amount),AMOUNT_POS[0],AMOUNT_POS[1],2,AMOUNT_BASE,AMOUNT_SHADOW],
- ]
- pbDrawTextPositions(self.overlay.bitmap,textpos) if self.amount > 0
- end
- def x=(value)
- super
- self.hold.x = value
- self.overlay.x = value
- end
- def y=(value)
- super
- self.hold.y = value
- self.overlay.y = value
- end
- def z=(value)
- super
- self.hold.z = value
- self.overlay.z = value
- end
- def fade
- self.hold.opacity = 155
- end
- def unfade
- self.hold.opacity = 255
- end
- def item
- return self.hold.item
- end
- def dispose
- super
- self.hold.dispose if self.hold
- self.overlay.dispose if self.overlay
- end
- def take(amount)
- self.amount -= amount
- self.overlay.bitmap.clear
- if self.amount == 0
- self.hold.item = nil
- self.hold.visible = false
- else
- pbSetSystemFont(self.overlay.bitmap)
- self.overlay.bitmap.font.size = AMOUNT_FONT_SIZE
- textpos = [
- [_INTL("x {1}",self.amount),AMOUNT_POS[0],AMOUNT_POS[1],2,AMOUNT_BASE,AMOUNT_SHADOW],
- ]
- pbDrawTextPositions(self.overlay.bitmap,textpos)
- end
- end
- def setItem(item)
- self.hold.item = item
- if item == nil
- self.hold.visible = false
- else
- self.hold.visible = true
- end
- self.hold.center_origins
- end
- def setAmount(amount)
- self.amount = amount
- self.overlay.bitmap.clear
- if self.amount == 0
- self.hold.item = nil
- self.hold.visible = false
- else
- self.hold.visible = true
- pbSetSystemFont(self.overlay.bitmap)
- self.overlay.bitmap.font.size = AMOUNT_FONT_SIZE
- textpos = [
- [_INTL("x {1}",self.amount),AMOUNT_POS[0],AMOUNT_POS[1],2,AMOUNT_BASE,AMOUNT_SHADOW],
- ]
- pbDrawTextPositions(self.overlay.bitmap,textpos)
- end
- end
- end
- def pbKStorage
- scene = KangaStorage.new
- end
- class KangaStorage
- def initialize
- if $Trainer.kstorage == nil
- $Trainer.kstorage = []
- end
- $Trainer.storagelimit = DEFAULT_STORAGE if $Trainer.storagelimit == nil
- items=$Trainer.kstorage
- @viewport = Viewport.new(0,0,Graphics.width,Graphics.height)
- @sprites = {}
- @SelNo=0
- @rowboost = 0
- @rows = (items.length)/COLUMNS
- @rows += 1 if (items.length)%COLUMNS > 0
- @rows = ROWS if @rows < ROWS
- size = ROWS * COLUMNS
- for i in 0...size
- entry = [nil,0]
- entry = items[i] if items[i]
- @sprites["item#{i}"] = KStorageDisplay.new(entry[0],entry[1],@viewport)
- bg = @sprites["item#{i}"]
- bg.x = LEFT_MARGIN + bg.ox + (bg.bitmap.width*(i%COLUMNS))
- bg.y = UP_MARGIN + bg.oy + (bg.bitmap.height*(i/COLUMNS))
- bg.fade if i!=@SelNo
- end
- @sprites["cursor"] = Sprite.new(@viewport)
- @sprites["cursor"].bitmap = Bitmap.new("Graphics/Pictures/drawercursor")
- @sprites["cursor"].center_origins
- @sprites["itemtext"] = Window_UnformattedTextPokemon.newWithSize("",DESC_X,DESC_Y,Graphics.width,DESC_HEIGHT,@viewport)
- @sprites["itemtext"].baseColor = BASE_COLOR
- @sprites["itemtext"].shadowColor = SHADOW_COLOR
- # @sprites["itemtext"].windowskin = WINDOWSKIN
- $game_system.menu_disabled=true
- main
- end
- def refresh
- items=$Trainer.kstorage
- size = ROWS * COLUMNS
- for i in 0...size
- start = @rowboost * COLUMNS
- entry = [nil,0]
- entry = items[i+start] if items[i+start]
- bg = @sprites["item#{i}"]
- bg.setAmount(entry[1])
- bg.setItem(entry[0])
- bg.fade if i!=@SelNo
- end
- end
- def main
- loop do
- sel = @sprites["item#{@SelNo}"]
- sel.unfade if sel.hold.item
- @sprites["cursor"].x=sel.x
- @sprites["cursor"].y=sel.y
- if sel.item == nil
- @sprites["itemtext"].visible = false
- else
- @sprites["itemtext"].visible = true
- @sprites["itemtext"].text = _INTL("{1}",GameData::Item.get(sel.item).description)
- end
- Graphics.update
- Input.update
- if Input.trigger?(Input::LEFT)
- pbPlayDecisionSE
- @sprites["item#{@SelNo}"].fade
- if @SelNo%COLUMNS == 0
- @SelNo+=COLUMNS-1
- else
- @SelNo-=1
- end
- elsif Input.trigger?(Input::RIGHT)
- pbPlayDecisionSE
- @sprites["item#{@SelNo}"].fade
- if @SelNo%COLUMNS == COLUMNS-1
- @SelNo-=COLUMNS-1
- else
- @SelNo+=1
- end
- elsif Input.trigger?(Input::DOWN)
- pbPlayDecisionSE
- @sprites["item#{@SelNo}"].fade
- if @SelNo/COLUMNS == ROWS-1
- if @rowboost < (($Trainer.storagelimit/COLUMNS) - ROWS)
- @rowboost += 1
- else
- @SelNo-= (COLUMNS * (ROWS-1))
- @rowboost = 0
- end
- self.refresh
- else
- @SelNo+=COLUMNS
- end
- elsif Input.trigger?(Input::UP)
- pbPlayDecisionSE
- @sprites["item#{@SelNo}"].fade
- if @SelNo/COLUMNS == 0
- if @rowboost >0
- @rowboost -= 1
- else
- @SelNo+=(COLUMNS * (ROWS-1))
- @rowboost = (($Trainer.storagelimit/COLUMNS) - ROWS)
- end
- self.refresh
- else
- @SelNo-=COLUMNS
- end
- elsif Input.trigger?(Input::C)
- sel = @sprites["item#{@SelNo}"]
- if sel.item
- item = sel.item
- qty = sel.amount
- itemname = GameData::Item.get(item).real_name_plural
- @sprites["itemtext"].visible = false
- if AMOUNT_LIMIT < 0 && $PokemonBag.pbQuantity(item) > 0 ||
- AMOUNT_LIMIT > 0 && sel.amount < AMOUNT_LIMIT && $PokemonBag.pbQuantity(item) > 0
- choices = ["Withdraw","Deposit more","Exit"]
- command = pbMessage("What do you want to do?",choices,choices.length)
- case command
- #exit
- when choices.length, -1
- self.refresh
- #withdraw
- when 0
- #todo- tidy up this
- quantity=pbChooseItemNumber(_INTL("Take how many {1}?",itemname),item,qty,@viewport)
- if quantity>0
- itemname = GameData::Item.get(item).real_name if quantity == 1
- pbMessage(_INTL("Took {1} {2}.",quantity,itemname))
- $PokemonBag.pbStoreItem(item,quantity)
- entry = $Trainer.kstorage[@SelNo + (@rowboost * COLUMNS)]
- entry[1] -= quantity
- $Trainer.kstorage.delete_at(@SelNo + (@rowboost * COLUMNS)) if quantity == qty
- self.refresh
- end
- #deposit more
- when 1
- qty = $PokemonBag.pbQuantity(item)
- remainmax = AMOUNT_LIMIT - sel.amount if AMOUNT_LIMIT > 0
- qty = [qty,remainmax].min
- quantity=pbChooseItemNumber(_INTL("Deposit how many {1}?",itemname),item,qty,@viewport)
- if quantity > 0
- entry = $Trainer.kstorage[@SelNo + (@rowboost * COLUMNS)]
- $PokemonBag.pbDeleteItem(item,quantity)
- entry[1] += quantity
- self.refresh
- end
- end
- else
- quantity=pbChooseItemNumber(_INTL("Take how many {1}?",itemname),item,qty,@viewport)
- if quantity>0
- itemname = GameData::Item.get(item).real_name if quantity == 1
- pbMessage(_INTL("Took {1} {2}.",quantity,itemname))
- $PokemonBag.pbStoreItem(item,quantity)
- entry = $Trainer.kstorage[@SelNo + (@rowboost * COLUMNS)]
- entry[1] -= quantity
- $Trainer.kstorage.delete_at(@SelNo + (@rowboost * COLUMNS)) if quantity == qty
- self.refresh
- end
- end
- else
- #no item in given slot
- if pbConfirmMessage(_INTL("Store an item?"))
- pbDepositItemK
- self.refresh
- end
- end
- elsif Input.trigger?(Input::B)
- $game_variables[3]=0
- pbPlayCancelSE
- break
- end
- end
- dispose
- pbWait(5)
- $game_system.menu_disabled=false
- end
- def dispose
- pbDisposeSpriteHash(@sprites)
- @viewport.dispose
- end
- end
- def pbChooseItemNumber(helptext,item,maximum,viewport)
- curnumber = 1
- ret = 0
- helpwindow = Window_AdvancedTextPokemon.new(helptext)
- helpwindow.y = Graphics.height/2 + 70
- helpwindow.x = (Graphics.width/2) - (helpwindow.width/2)
- helpwindow.viewport = viewport
- helpwindow.visible = true
- helpwindow.update
- using(numwindow = Window_AdvancedTextPokemon.new("")) { # Showing number of items
- qty = $PokemonBag.pbQuantity(item)
- using(inbagwindow = Window_AdvancedTextPokemon.new("")) { # Showing quantity in bag
- numwindow.visible = true
- numwindow.letterbyletter = false
- inbagwindow.visible = true
- inbagwindow.letterbyletter = false
- numwindow.viewport = viewport
- numwindow.width = 99
- numwindow.height = 64
- numwindow.baseColor = Color.new(88, 88, 80)
- numwindow.shadowColor = Color.new(168, 184, 184)
- inbagwindow.visible = true
- inbagwindow.viewport = viewport
- inbagwindow.width = 150
- inbagwindow.height = 64
- inbagwindow.baseColor = Color.new(88, 88, 80)
- inbagwindow.shadowColor = Color.new(168, 184, 184)
- inbagwindow.text = _INTL("In Bag: <r>{1}", qty)
- numwindow.text = _INTL("x{1}", curnumber)
- pbBottomRight(numwindow)
- #numwindow.y -= helpwindow.height
- pbBottomLeft(inbagwindow)
- #inbagwindow.y -= helpwindow.height
- loop do
- Graphics.update
- Input.update
- numwindow.update
- inbagwindow.update
- if Input.repeat?(Input::LEFT)
- pbPlayCursorSE
- curnumber -= 10
- curnumber = 1 if curnumber < 1
- numwindow.text = _INTL("x{1}", curnumber)
- elsif Input.repeat?(Input::RIGHT)
- pbPlayCursorSE
- curnumber += 10
- curnumber = maximum if curnumber > maximum
- numwindow.text = _INTL("x{1}", curnumber)
- elsif Input.repeat?(Input::UP)
- pbPlayCursorSE
- curnumber += 1
- curnumber = 1 if curnumber > maximum
- numwindow.text = _INTL("x{1}", curnumber)
- elsif Input.repeat?(Input::DOWN)
- pbPlayCursorSE
- curnumber -= 1
- curnumber = maximum if curnumber < 1
- numwindow.text = _INTL("x{1}", curnumber)
- elsif Input.trigger?(Input::USE)
- pbPlayDecisionSE
- ret = curnumber
- break
- elsif Input.trigger?(Input::BACK)
- pbPlayCancelSE
- ret = 0
- break
- end
- end
- }
- }
- helpwindow.dispose
- return ret
- end
- # Adapted from Item Storage in the PC
- def pbDepositItemK
- scene = PokemonBag_Scene.new
- scene.pbStartScene($PokemonBag)
- loop do
- item = scene.pbChooseItem
- break if !item
- itm = GameData::Item.get(item)
- if AMOUNT_LIMIT > 0
- qty = [AMOUNT_LIMIT,$PokemonBag.pbQuantity(item)].min
- else
- qty = $PokemonBag.pbQuantity(item)
- end
- if qty>1 && !itm.is_important?
- qty = scene.pbChooseNumber(_INTL("How many do you want to deposit?"),qty)
- end
- if qty>0
- if !$PokemonBag.pbDeleteItem(item,qty)
- raise "Can't delete items from Bag"
- end
- scene.pbRefresh
- dispqty = (itm.is_important?) ? 1 : qty
- itemname = (dispqty>1) ? itm.name_plural : itm.name
- $Trainer.kstorage.push([item,qty]) if item
- scene.pbDisplay(_INTL("Deposited {1} {2}.",dispqty,itemname))
- break
- # end
- end
- end
- scene.pbEndScene
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement