mirror of
https://github.com/infinitefusion/infinitefusion-e18.git
synced 2025-12-06 06:01:46 +00:00
468 lines
14 KiB
Ruby
468 lines
14 KiB
Ruby
# TODO: Could inherit from class UI::BagVisuals and just change some graphics.
|
||
|
||
#===============================================================================
|
||
#
|
||
#===============================================================================
|
||
class Window_PokemonItemStorage < Window_DrawableCommand
|
||
attr_reader :bag
|
||
attr_reader :pocket
|
||
attr_reader :sortIndex
|
||
|
||
def sortIndex=(value)
|
||
@sortIndex = value
|
||
refresh
|
||
end
|
||
|
||
def initialize(bag, x, y, width, height)
|
||
@bag = bag
|
||
@sortIndex = -1
|
||
@adapter = PokemonMartAdapter.new
|
||
super(x, y, width, height)
|
||
self.windowskin = nil
|
||
end
|
||
|
||
def item
|
||
item = @bag[self.index]
|
||
return item ? item[0] : nil
|
||
end
|
||
|
||
def itemCount
|
||
return @bag.length + 1
|
||
end
|
||
|
||
def drawItem(index, _count, rect)
|
||
rect = drawCursor(index, rect)
|
||
textpos = []
|
||
if index == @bag.length
|
||
textpos.push([_INTL("CANCEL"), rect.x, rect.y, :left, self.baseColor, self.shadowColor])
|
||
else
|
||
item = @bag[index][0]
|
||
itemname = @adapter.getDisplayName(item)
|
||
baseColor = (index == @sortIndex) ? Color.new(248, 24, 24) : self.baseColor
|
||
textpos.push([itemname, rect.x, rect.y, :left, self.baseColor, self.shadowColor])
|
||
if GameData::Item.get(item).show_quantity?
|
||
qty = _ISPRINTF("×{1: 2d}", @bag[index][1])
|
||
sizeQty = self.contents.text_size(qty).width
|
||
xQty = rect.x + rect.width - sizeQty - 2
|
||
textpos.push([qty, xQty, rect.y, :left, baseColor, self.shadowColor])
|
||
end
|
||
end
|
||
pbDrawTextPositions(self.contents, textpos)
|
||
end
|
||
end
|
||
|
||
#===============================================================================
|
||
#
|
||
#===============================================================================
|
||
class ItemStorage_Scene
|
||
ITEMLISTBASECOLOR = Color.new(88, 88, 80)
|
||
ITEMLISTSHADOWCOLOR = Color.new(168, 184, 184)
|
||
ITEMTEXTBASECOLOR = Color.new(248, 248, 248)
|
||
ITEMTEXTSHADOWCOLOR = Color.new(0, 0, 0)
|
||
TITLEBASECOLOR = Color.new(248, 248, 248)
|
||
TITLESHADOWCOLOR = Color.new(0, 0, 0)
|
||
ITEMSVISIBLE = 7
|
||
|
||
def initialize(title)
|
||
@title = title
|
||
end
|
||
|
||
def update
|
||
pbUpdateSpriteHash(@sprites)
|
||
end
|
||
|
||
def pbStartScene(bag)
|
||
@viewport = Viewport.new(0, 0, Graphics.width, Graphics.height)
|
||
@viewport.z = 99999
|
||
@bag = bag
|
||
@sprites = {}
|
||
@sprites["background"] = IconSprite.new(0, 0, @viewport)
|
||
@sprites["background"].setBitmap("Graphics/UI/itemstorage_bg")
|
||
@sprites["icon"] = ItemIconSprite.new(50, 334, nil, @viewport)
|
||
# Item list
|
||
@sprites["itemwindow"] = Window_PokemonItemStorage.new(@bag, 98, 14, 334, 32 + (ITEMSVISIBLE * 32))
|
||
@sprites["itemwindow"].viewport = @viewport
|
||
@sprites["itemwindow"].index = 0
|
||
@sprites["itemwindow"].baseColor = ITEMLISTBASECOLOR
|
||
@sprites["itemwindow"].shadowColor = ITEMLISTSHADOWCOLOR
|
||
@sprites["itemwindow"].refresh
|
||
# Title
|
||
@sprites["pocketwindow"] = BitmapSprite.new(88, 64, @viewport)
|
||
@sprites["pocketwindow"].x = 14
|
||
@sprites["pocketwindow"].y = 16
|
||
pbSetNarrowFont(@sprites["pocketwindow"].bitmap)
|
||
# Item description
|
||
@sprites["itemtextwindow"] = Window_UnformattedTextPokemon.newWithSize("", 84, 272, Graphics.width - 84, 128, @viewport)
|
||
@sprites["itemtextwindow"].baseColor = ITEMTEXTBASECOLOR
|
||
@sprites["itemtextwindow"].shadowColor = ITEMTEXTSHADOWCOLOR
|
||
@sprites["itemtextwindow"].windowskin = nil
|
||
@sprites["helpwindow"] = Window_UnformattedTextPokemon.new("")
|
||
@sprites["helpwindow"].visible = false
|
||
@sprites["helpwindow"].viewport = @viewport
|
||
# Letter-by-letter message window
|
||
@sprites["msgwindow"] = Window_AdvancedTextPokemon.new("")
|
||
@sprites["msgwindow"].visible = false
|
||
@sprites["msgwindow"].viewport = @viewport
|
||
pbBottomLeftLines(@sprites["helpwindow"], 1)
|
||
pbDeactivateWindows(@sprites)
|
||
pbRefresh
|
||
pbFadeInAndShow(@sprites)
|
||
end
|
||
|
||
def pbEndScene
|
||
pbFadeOutAndHide(@sprites)
|
||
pbDisposeSpriteHash(@sprites)
|
||
@viewport.dispose
|
||
end
|
||
|
||
def pbChooseNumber(helptext, maximum)
|
||
return UIHelper.pbChooseNumber(@sprites["helpwindow"], helptext, maximum) { update }
|
||
end
|
||
|
||
def pbDisplay(msg, brief = false)
|
||
UIHelper.pbDisplay(@sprites["msgwindow"], msg, brief) { update }
|
||
end
|
||
|
||
def pbConfirm(msg)
|
||
UIHelper.pbConfirm(@sprites["msgwindow"], msg) { update }
|
||
end
|
||
|
||
def pbShowCommands(helptext, commands)
|
||
return UIHelper.pbShowCommands(@sprites["helpwindow"], helptext, commands) { update }
|
||
end
|
||
|
||
def pbRefresh
|
||
bm = @sprites["pocketwindow"].bitmap
|
||
# Draw title at upper left corner ("Toss Item/Withdraw Item")
|
||
drawTextEx(bm, 0, 8, bm.width, 2, @title, TITLEBASECOLOR, TITLESHADOWCOLOR)
|
||
itemwindow = @sprites["itemwindow"]
|
||
# Draw item icon
|
||
@sprites["icon"].item = itemwindow.item
|
||
# Get item description
|
||
if itemwindow.item
|
||
@sprites["itemtextwindow"].text = GameData::Item.get(itemwindow.item).description
|
||
else
|
||
@sprites["itemtextwindow"].text = _INTL("Close storage.")
|
||
end
|
||
itemwindow.refresh
|
||
end
|
||
|
||
def pbChooseItem
|
||
pbRefresh
|
||
@sprites["helpwindow"].visible = false
|
||
itemwindow = @sprites["itemwindow"]
|
||
itemwindow.refresh
|
||
pbActivateWindow(@sprites, "itemwindow") do
|
||
loop do
|
||
Graphics.update
|
||
Input.update
|
||
olditem = itemwindow.item
|
||
self.update
|
||
pbRefresh if itemwindow.item != olditem
|
||
if Input.trigger?(Input::BACK)
|
||
return nil
|
||
elsif Input.trigger?(Input::USE)
|
||
if itemwindow.index < @bag.length
|
||
pbRefresh
|
||
return @bag[itemwindow.index][0]
|
||
else
|
||
return nil
|
||
end
|
||
end
|
||
end
|
||
end
|
||
end
|
||
end
|
||
|
||
#===============================================================================
|
||
#
|
||
#===============================================================================
|
||
class WithdrawItemScene < ItemStorage_Scene
|
||
def initialize
|
||
super(_INTL("Withdraw\nItem"))
|
||
end
|
||
end
|
||
|
||
#===============================================================================
|
||
#
|
||
#===============================================================================
|
||
class TossItemScene < ItemStorage_Scene
|
||
def initialize
|
||
super(_INTL("Toss\nItem"))
|
||
end
|
||
end
|
||
|
||
#===============================================================================
|
||
#
|
||
#===============================================================================
|
||
class ItemStorageScreen
|
||
def initialize(scene, bag)
|
||
@bag = bag
|
||
@scene = scene
|
||
end
|
||
|
||
def pbDisplay(text)
|
||
@scene.pbDisplay(text)
|
||
end
|
||
|
||
def pbConfirm(text)
|
||
return @scene.pbConfirm(text)
|
||
end
|
||
|
||
# UI logic for withdrawing an item in the item storage screen.
|
||
def pbWithdrawItemScreen
|
||
if !$PokemonGlobal.pcItemStorage
|
||
$PokemonGlobal.pcItemStorage = PCItemStorage.new
|
||
end
|
||
storage = $PokemonGlobal.pcItemStorage
|
||
@scene.pbStartScene(storage)
|
||
loop do
|
||
item = @scene.pbChooseItem
|
||
break if !item
|
||
itm = GameData::Item.get(item)
|
||
qty = storage.quantity(item)
|
||
if qty > 1 && !itm.is_important?
|
||
qty = @scene.pbChooseNumber(_INTL("How many do you want to withdraw?"), qty)
|
||
end
|
||
next if qty <= 0
|
||
if @bag.can_add?(item, qty)
|
||
if !storage.remove(item, qty)
|
||
raise "Can't delete items from storage"
|
||
end
|
||
if !@bag.add(item, qty)
|
||
raise "Can't withdraw items from storage"
|
||
end
|
||
@scene.pbRefresh
|
||
dispqty = (itm.is_important?) ? 1 : qty
|
||
itemname = (dispqty > 1) ? itm.portion_name_plural : itm.portion_name
|
||
pbDisplay(_INTL("Withdrew {1} {2}.", dispqty, itemname))
|
||
else
|
||
pbDisplay(_INTL("There's no more room in the Bag."))
|
||
end
|
||
end
|
||
@scene.pbEndScene
|
||
end
|
||
|
||
# UI logic for tossing an item in the item storage screen.
|
||
def pbTossItemScreen
|
||
if !$PokemonGlobal.pcItemStorage
|
||
$PokemonGlobal.pcItemStorage = PCItemStorage.new
|
||
end
|
||
storage = $PokemonGlobal.pcItemStorage
|
||
@scene.pbStartScene(storage)
|
||
loop do
|
||
item = @scene.pbChooseItem
|
||
break if !item
|
||
itm = GameData::Item.get(item)
|
||
if itm.is_important?
|
||
@scene.pbDisplay(_INTL("That's too important to toss out!"))
|
||
next
|
||
end
|
||
qty = storage.quantity(item)
|
||
itemname = itm.portion_name
|
||
itemnameplural = itm.portion_name_plural
|
||
if qty > 1
|
||
qty = @scene.pbChooseNumber(_INTL("Toss out how many {1}?", itemnameplural), qty)
|
||
end
|
||
next if qty <= 0
|
||
itemname = itemnameplural if qty > 1
|
||
next if !pbConfirm(_INTL("Is it OK to throw away {1} {2}?", qty, itemname))
|
||
if !storage.remove(item, qty)
|
||
raise "Can't delete items from storage"
|
||
end
|
||
@scene.pbRefresh
|
||
pbDisplay(_INTL("Threw away {1} {2}.", qty, itemname))
|
||
end
|
||
@scene.pbEndScene
|
||
end
|
||
end
|
||
|
||
|
||
|
||
#===============================================================================
|
||
# Common UI functions used in both the Bag and item storage screens.
|
||
# Displays messages and allows the user to choose a number/command.
|
||
# The window _helpwindow_ will display the _helptext_.
|
||
#===============================================================================
|
||
module UIHelper
|
||
module_function
|
||
|
||
# Letter by letter display of the message _msg_ by the window _helpwindow_.
|
||
def pbDisplay(helpwindow, msg, brief)
|
||
cw = helpwindow
|
||
oldvisible = cw.visible
|
||
cw.letterbyletter = true
|
||
cw.text = msg + "\1"
|
||
cw.visible = true
|
||
pbBottomLeftLines(cw, 2)
|
||
loop do
|
||
Graphics.update
|
||
Input.update
|
||
(block_given?) ? yield : cw.update
|
||
if !cw.busy? && (brief || (Input.trigger?(Input::USE) && cw.resume))
|
||
break
|
||
end
|
||
end
|
||
cw.visible = oldvisible
|
||
end
|
||
|
||
def pbDisplayStatic(msgwindow, message)
|
||
oldvisible = msgwindow.visible
|
||
msgwindow.visible = true
|
||
msgwindow.letterbyletter = false
|
||
msgwindow.width = Graphics.width
|
||
msgwindow.resizeHeightToFit(message, Graphics.width)
|
||
msgwindow.text = message
|
||
pbBottomRight(msgwindow)
|
||
loop do
|
||
Graphics.update
|
||
Input.update
|
||
(block_given?) ? yield : msgwindow.update
|
||
if Input.trigger?(Input::BACK) || Input.trigger?(Input::USE)
|
||
break
|
||
end
|
||
end
|
||
msgwindow.visible = oldvisible
|
||
Input.update
|
||
end
|
||
|
||
# Letter by letter display of the message _msg_ by the window _helpwindow_,
|
||
# used to ask questions. Returns true if the user chose yes, false if no.
|
||
def pbConfirm(helpwindow, msg)
|
||
dw = helpwindow
|
||
oldvisible = dw.visible
|
||
dw.letterbyletter = true
|
||
dw.text = msg
|
||
dw.visible = true
|
||
pbBottomLeftLines(dw, 2)
|
||
commands = [_INTL("Yes"), _INTL("No")]
|
||
cw = Window_CommandPokemon.new(commands)
|
||
cw.index = 0
|
||
cw.viewport = helpwindow.viewport
|
||
pbBottomRight(cw)
|
||
cw.y -= dw.height
|
||
ret = false
|
||
loop do
|
||
cw.visible = (!dw.busy?)
|
||
Graphics.update
|
||
Input.update
|
||
cw.update
|
||
(block_given?) ? yield : dw.update
|
||
if !dw.busy? && dw.resume
|
||
if Input.trigger?(Input::BACK)
|
||
pbPlayCancelSE
|
||
break
|
||
elsif Input.trigger?(Input::USE)
|
||
pbPlayDecisionSE
|
||
ret = (cw.index == 0)
|
||
break
|
||
end
|
||
end
|
||
end
|
||
cw.dispose
|
||
dw.visible = oldvisible
|
||
return ret
|
||
end
|
||
|
||
def pbChooseNumber(helpwindow, helptext, maximum, initnum = 1)
|
||
oldvisible = helpwindow.visible
|
||
helpwindow.visible = true
|
||
helpwindow.text = helptext
|
||
helpwindow.letterbyletter = false
|
||
curnumber = initnum
|
||
ret = 0
|
||
numwindow = Window_UnformattedTextPokemon.new("×000")
|
||
numwindow.viewport = helpwindow.viewport
|
||
numwindow.letterbyletter = false
|
||
numwindow.text = _ISPRINTF("×{1:03d}", curnumber)
|
||
numwindow.resizeToFit(numwindow.text, Graphics.width)
|
||
pbBottomRight(numwindow)
|
||
helpwindow.resizeHeightToFit(helpwindow.text, Graphics.width - numwindow.width)
|
||
pbBottomLeft(helpwindow)
|
||
loop do
|
||
Graphics.update
|
||
Input.update
|
||
numwindow.update
|
||
helpwindow.update
|
||
yield if block_given?
|
||
oldnumber = curnumber
|
||
if Input.trigger?(Input::BACK)
|
||
ret = 0
|
||
pbPlayCancelSE
|
||
break
|
||
elsif Input.trigger?(Input::USE)
|
||
ret = curnumber
|
||
pbPlayDecisionSE
|
||
break
|
||
elsif Input.repeat?(Input::UP)
|
||
curnumber += 1
|
||
curnumber = 1 if curnumber > maximum
|
||
if curnumber != oldnumber
|
||
numwindow.text = _ISPRINTF("×{1:03d}", curnumber)
|
||
pbPlayCursorSE
|
||
end
|
||
elsif Input.repeat?(Input::DOWN)
|
||
curnumber -= 1
|
||
curnumber = maximum if curnumber < 1
|
||
if curnumber != oldnumber
|
||
numwindow.text = _ISPRINTF("×{1:03d}", curnumber)
|
||
pbPlayCursorSE
|
||
end
|
||
elsif Input.repeat?(Input::LEFT)
|
||
curnumber -= 10
|
||
curnumber = 1 if curnumber < 1
|
||
if curnumber != oldnumber
|
||
numwindow.text = _ISPRINTF("×{1:03d}", curnumber)
|
||
pbPlayCursorSE
|
||
end
|
||
elsif Input.repeat?(Input::RIGHT)
|
||
curnumber += 10
|
||
curnumber = maximum if curnumber > maximum
|
||
if curnumber != oldnumber
|
||
numwindow.text = _ISPRINTF("×{1:03d}", curnumber)
|
||
pbPlayCursorSE
|
||
end
|
||
end
|
||
end
|
||
numwindow.dispose
|
||
helpwindow.visible = oldvisible
|
||
return ret
|
||
end
|
||
|
||
def pbShowCommands(helpwindow, helptext, commands, initcmd = 0)
|
||
ret = -1
|
||
oldvisible = helpwindow.visible
|
||
helpwindow.visible = helptext ? true : false
|
||
helpwindow.letterbyletter = false
|
||
helpwindow.text = helptext || ""
|
||
cmdwindow = Window_CommandPokemon.new(commands)
|
||
cmdwindow.index = initcmd
|
||
begin
|
||
cmdwindow.viewport = helpwindow.viewport
|
||
pbBottomRight(cmdwindow)
|
||
helpwindow.resizeHeightToFit(helpwindow.text, Graphics.width - cmdwindow.width)
|
||
pbBottomLeft(helpwindow)
|
||
loop do
|
||
Graphics.update
|
||
Input.update
|
||
yield
|
||
cmdwindow.update
|
||
if Input.trigger?(Input::BACK)
|
||
ret = -1
|
||
pbPlayCancelSE
|
||
break
|
||
end
|
||
if Input.trigger?(Input::USE)
|
||
ret = cmdwindow.index
|
||
pbPlayDecisionSE
|
||
break
|
||
end
|
||
end
|
||
ensure
|
||
cmdwindow&.dispose
|
||
end
|
||
helpwindow.visible = oldvisible
|
||
return ret
|
||
end
|
||
end
|