Rewrote party screen, implemented redesign of it

This commit is contained in:
Maruno17
2024-09-07 21:51:54 +01:00
parent fab5fc0641
commit 2190f7c251
26 changed files with 2236 additions and 562 deletions

View File

@@ -104,6 +104,10 @@ class HandlerHash
return nil
end
def keys
return @hash.keys
end
def add(id, handler = nil, &handlerBlock)
if ![Proc, Hash].include?(handler.class) && !block_given?
raise ArgumentError, "#{self.class.name} for #{id.inspect} has no valid handler (#{handler.inspect} was given)"
@@ -160,6 +164,10 @@ class HandlerHashSymbol
return nil
end
def keys
return @hash.keys
end
def add(sym, handler = nil, &handlerBlock)
if ![Proc, Hash].include?(handler.class) && !block_given?
raise ArgumentError, "#{self.class.name} for #{sym.inspect} has no valid handler (#{handler.inspect} was given)"
@@ -225,6 +233,10 @@ class HandlerHashEnum
return ret
end
def keys
return @hash.keys
end
def fromSymbol(sym)
return sym unless sym.is_a?(Symbol) || sym.is_a?(String)
mod = Object.const_get(@mod) rescue nil

View File

@@ -114,6 +114,17 @@ module MenuHandlers
sorted_keys.each do |option|
hash = options[option]
next if hash["condition"] && !hash["condition"].call(*args)
if hash["multi_options"]
extra_options = hash["multi_options"].call(*args)
if extra_options && extra_options.length > 0
if extra_options[0].is_a?(Array)
extra_options.each { |opt| yield *opt }
else
yield *extra_options
end
end
next
end
if hash["name"].is_a?(Proc)
name = hash["name"].call
else

View File

@@ -13,6 +13,8 @@ class Game_Temp
attr_accessor :battle_abort # battle flag: interrupt (unused)
attr_accessor :title_screen_calling # return to title screen flag
attr_accessor :common_event_id # common event ID to start
attr_accessor :field_move_to_use
attr_accessor :field_move_user
# Flags indicating something is happening
attr_accessor :in_menu # menu is open
attr_accessor :in_storage # in-Pokémon storage flag

View File

@@ -491,7 +491,7 @@ def using(window)
end
def pbUpdateSpriteHash(windows)
windows.each do |i|
windows&.each do |i|
window = i[1]
if window
if window.is_a?(Sprite) || window.is_a?(Window)
@@ -591,7 +591,7 @@ def pbFadeOutIn(z = 99999, nofadeout = false)
end
end
def pbFadeOutInWithUpdate(z, sprites, nofadeout = false)
def pbFadeOutInWithUpdate(sprites, z = 99999, nofadeout = false)
duration = 0.4 # In seconds
col = Color.new(0, 0, 0, 0)
viewport = Viewport.new(0, 0, Graphics.width, Graphics.height)

View File

@@ -1243,19 +1243,6 @@ end
class Window_AdvancedCommandPokemon < Window_DrawableCommand
attr_reader :commands
def textWidth(bitmap, text)
dims = [nil, 0]
chars = getFormattedText(bitmap, 0, 0,
Graphics.width - self.borderX - SpriteWindow_Base::TEXT_PADDING - 16,
-1, text, self.rowHeight, true, true)
chars.each do |ch|
dims[0] = dims[0] ? [dims[0], ch[1]].min : ch[1]
dims[1] = [dims[1], ch[1] + ch[3]].max
end
dims[0] = 0 if !dims[0]
return dims[1] - dims[0]
end
def initialize(commands, width = nil)
@starting = true
@commands = []
@@ -1321,6 +1308,42 @@ class Window_AdvancedCommandPokemon < Window_DrawableCommand
end
end
def textWidth(bitmap, text)
dims = [nil, 0]
chars = getFormattedText(bitmap, 0, 0,
Graphics.width - self.borderX - SpriteWindow_Base::TEXT_PADDING - 16,
-1, text, self.rowHeight, true, true)
chars.each do |ch|
dims[0] = dims[0] ? [dims[0], ch[1]].min : ch[1]
dims[1] = [dims[1], ch[1] + ch[3]].max
end
dims[0] = 0 if !dims[0]
return dims[1] - dims[0]
end
def getAutoDims(commands, dims, width = nil)
rowMax = ((commands.length + self.columns - 1) / self.columns).to_i
windowheight = (rowMax * self.rowHeight)
windowheight += self.borderY
if !width || width < 0
width = 0
tmpbitmap = Bitmap.new(1, 1)
pbSetSystemFont(tmpbitmap)
commands.each do |i|
txt = toUnformattedText(i).gsub(/\n/, "")
width = [width, tmpbitmap.text_size(txt).width].max
end
# one 16 to allow cursor
width += 16 + 16 + SpriteWindow_Base::TEXT_PADDING
tmpbitmap.dispose
end
# Store suggested width and height of window
dims[0] = [self.borderX + 1,
(width * self.columns) + self.borderX + ((self.columns - 1) * self.columnSpacing)].max
dims[1] = [self.borderY + 1, windowheight].max
dims[1] = [dims[1], Graphics.height].min
end
def resizeToFit(commands, width = nil)
dims = []
getAutoDims(commands, dims, width)
@@ -1340,7 +1363,7 @@ class Window_AdvancedCommandPokemon < Window_DrawableCommand
pbDrawShadowText(self.contents, rect.x, rect.y + (self.contents.text_offset_y || 0),
rect.width, rect.height, @commands[index], self.baseColor, self.shadowColor)
else
chars = getFormattedText(self.contents, rect.x, rect.y + (self.contents.text_offset_y || 0),
chars = getFormattedText(self.contents, rect.x, rect.y + (self.contents.text_offset_y || 0) + 2, # TEXT OFFSET
rect.width, rect.height, @commands[index], rect.height, true, true)
drawFormattedChars(self.contents, chars)
end

View File

@@ -152,46 +152,33 @@ class Battle::Scene
partyStart, _partyEnd = @battle.pbTeamIndexRangeFromBattlerIndex(idxBattler)
modParty = @battle.pbPlayerDisplayParty(idxBattler)
# Start party screen
scene = PokemonParty_Scene.new
switchScreen = PokemonPartyScreen.new(scene, modParty)
msg = _INTL("Choose a Pokémon.")
msg = _INTL("Send which Pokémon to Boxes?") if mode == 1
switchScreen.pbStartScene(msg, @battle.pbNumPositions(0, 0))
# Loop while in party screen
loop do
# Select a Pokémon
scene.pbSetHelpText(msg)
idxParty = switchScreen.pbChoosePokemon
if idxParty < 0
next if !canCancel
break
end
party_mode = (mode == 1) ? :battle_choose_to_box : :battle_choose_pokemon
screen = UI::Party.new(modParty, mode: party_mode)
screen.choose_pokemon do |pkmn, party_index|
next canCancel if party_index < 0
# Choose a command for the selected Pokémon
cmdSwitch = -1
cmdBoxes = -1
cmdSummary = -1
commands = []
commands[cmdSwitch = commands.length] = _INTL("Switch In") if mode == 0 && modParty[idxParty].able? &&
(@battle.canSwitch || !canCancel)
commands[cmdBoxes = commands.length] = _INTL("Send to Boxes") if mode == 1
commands[cmdSummary = commands.length] = _INTL("Summary")
commands[commands.length] = _INTL("Cancel")
command = scene.pbShowCommands(_INTL("Do what with {1}?", modParty[idxParty].name), commands)
if (cmdSwitch >= 0 && command == cmdSwitch) || # Switch In
(cmdBoxes >= 0 && command == cmdBoxes) # Send to Boxes
idxPartyRet = -1
commands = {}
commands[:switch_in] = _INTL("Switch In") if mode == 0 && pkmn.able? &&
(@battle.canSwitch || !canCancel)
commands[:send_to_boxes] = _INTL("Send to Boxes") if mode == 1
commands[:summary] = _INTL("Summary")
commands[:cancel] = _INTL("Cancel")
choice = screen.show_choice_message(_INTL("Do what with {1}?", pkmn.name), commands)
next canCancel if choice.nil?
case choice
when :switch_in, :send_to_boxes
real_party_index = -1
partyPos.each_with_index do |pos, i|
next if pos != idxParty + partyStart
idxPartyRet = i
next if pos != party_index + partyStart
real_party_index = i
break
end
break if yield idxPartyRet, switchScreen
elsif cmdSummary >= 0 && command == cmdSummary # Summary
scene.pbSummary(idxParty, true)
next true if yield real_party_index, screen
when :summary
screen.perform_action(:summary)
end
next false
end
# Close party screen
switchScreen.pbEndScene
# Fade back into battle screen
pbFadeInAndShow(@sprites, visibleSprites)
end
@@ -272,34 +259,29 @@ class Battle::Scene
partyStart, _partyEnd = @battle.pbTeamIndexRangeFromBattlerIndex(idxBattler)
modParty = @battle.pbPlayerDisplayParty(idxBattler)
# Start party screen
pkmnScene = PokemonParty_Scene.new
pkmnScreen = PokemonPartyScreen.new(pkmnScene, modParty)
pkmnScreen.pbStartScene(_INTL("Use on which Pokémon?"), @battle.pbNumPositions(0, 0))
idxParty = -1
# Loop while in party screen
loop do
# Select a Pokémon
pkmnScene.pbSetHelpText(_INTL("Use on which Pokémon?"))
idxParty = pkmnScreen.pbChoosePokemon
break if idxParty < 0
idxPartyRet = -1
party_idx = -1
party_screen = UI::Party.new(modParty, mode: :battle_use_item)
party_screen.choose_pokemon do |pkmn, party_index|
party_idx = party_index
next true if party_index < 0
# Use the item on the selected Pokémon
real_party_index = -1
partyPos.each_with_index do |pos, i|
next if pos != idxParty + partyStart
idxPartyRet = i
next if pos != party_index + partyStart
real_party_index = i
break
end
next if idxPartyRet < 0
pkmn = party[idxPartyRet]
next if !pkmn || pkmn.egg?
idxMove = -1
next false if real_party_index < 0
next false if !pkmn || pkmn.egg?
move_index = -1
if useType == 2 # Use on Pokémon's move
idxMove = pkmnScreen.pbChooseMove(pkmn, _INTL("Restore which move?"))
next if idxMove < 0
move_index = party_screen.choose_move(pkmn, _INTL("Restore which move?"))
next false if move_index < 0
end
break if yield item.id, useType, idxPartyRet, idxMove, pkmnScene
next true if yield item.id, useType, real_party_index, move_index, party_screen
next false
end
pkmnScene.pbEndScene
break if idxParty >= 0
break if party_idx >= 0 # Item was used; close the Bag screen
# Cancelled choosing a Pokémon; show the Bag screen again
itemScene.pbFadeInScene
when 4 # Use on opposing battler (Poké Balls)

View File

@@ -14,6 +14,11 @@ module HiddenMoveHandlers
return !CanUseMove[item].nil? && !UseMove[item].nil?
end
def self.eachHandler
ret = CanUseMove.keys & UseMove.keys
ret.each { |key| yield key }
end
# Returns whether move can be used
def self.triggerCanUseMove(item, pokemon, showmsg)
return false if !CanUseMove[item]

View File

@@ -134,8 +134,8 @@ end
def pbChangeLevel(pkmn, new_level, scene)
new_level = new_level.clamp(1, GameData::GrowthRate.max_level)
if pkmn.level == new_level
if scene.is_a?(PokemonPartyScreen)
scene.pbDisplay(_INTL("{1}'s level remained unchanged.", pkmn.name))
if scene.is_a?(UI::Party)
scene.show_message(_INTL("{1}'s level remained unchanged.", pkmn.name))
else
pbMessage(_INTL("{1}'s level remained unchanged.", pkmn.name))
end
@@ -153,8 +153,8 @@ def pbChangeLevel(pkmn, new_level, scene)
pkmn.hp = 1 if new_level > old_level && pkmn.species_data.base_stats[:HP] == 1
scene.pbRefresh
if old_level > new_level
if scene.is_a?(PokemonPartyScreen)
scene.pbDisplay(_INTL("{1} dropped to Lv. {2}!", pkmn.name, pkmn.level))
if scene.is_a?(UI::Party)
scene.show_message(_INTL("{1} dropped to Lv. {2}!", pkmn.name, pkmn.level))
else
pbMessage(_INTL("{1} dropped to Lv. {2}!", pkmn.name, pkmn.level))
end
@@ -170,8 +170,8 @@ def pbChangeLevel(pkmn, new_level, scene)
pkmn.totalhp, pkmn.attack, pkmn.defense, pkmn.spatk, pkmn.spdef, pkmn.speed), scene)
else
pkmn.changeHappiness("vitamin")
if scene.is_a?(PokemonPartyScreen)
scene.pbDisplay(_INTL("{1} grew to Lv. {2}!", pkmn.name, pkmn.level))
if scene.is_a?(UI::Party)
scene.show_message(_INTL("{1} grew to Lv. {2}!", pkmn.name, pkmn.level))
else
pbMessage(_INTL("{1} grew to Lv. {2}!", pkmn.name, pkmn.level))
end
@@ -199,7 +199,7 @@ def pbChangeLevel(pkmn, new_level, scene)
evo.pbStartScreen(pkmn, new_species)
evo.pbEvolution
evo.pbEndScreen
scene.pbRefresh if scene.is_a?(PokemonPartyScreen)
scene.refresh if scene.is_a?(UI::Party)
end
end
end
@@ -225,8 +225,8 @@ end
def pbChangeExp(pkmn, new_exp, scene)
new_exp = new_exp.clamp(0, pkmn.growth_rate.maximum_exp)
if pkmn.exp == new_exp
if scene.is_a?(PokemonPartyScreen)
scene.pbDisplay(_INTL("{1}'s Exp. Points remained unchanged.", pkmn.name))
if scene.is_a?(UI::Party)
scene.show_message(_INTL("{1}'s Exp. Points remained unchanged.", pkmn.name))
else
pbMessage(_INTL("{1}'s Exp. Points remained unchanged.", pkmn.name))
end
@@ -241,8 +241,8 @@ def pbChangeExp(pkmn, new_exp, scene)
old_speed = pkmn.speed
if pkmn.exp > new_exp # Loses Exp
difference = pkmn.exp - new_exp
if scene.is_a?(PokemonPartyScreen)
scene.pbDisplay(_INTL("{1} lost {2} Exp. Points!", pkmn.name, difference))
if scene.is_a?(UI::Party)
scene.show_message(_INTL("{1} lost {2} Exp. Points!", pkmn.name, difference))
else
pbMessage(_INTL("{1} lost {2} Exp. Points!", pkmn.name, difference))
end
@@ -251,8 +251,8 @@ def pbChangeExp(pkmn, new_exp, scene)
scene.pbRefresh
return if pkmn.level == old_level
# Level changed
if scene.is_a?(PokemonPartyScreen)
scene.pbDisplay(_INTL("{1} dropped to Lv. {2}!", pkmn.name, pkmn.level))
if scene.is_a?(UI::Party)
scene.show_message(_INTL("{1} dropped to Lv. {2}!", pkmn.name, pkmn.level))
else
pbMessage(_INTL("{1} dropped to Lv. {2}!", pkmn.name, pkmn.level))
end
@@ -268,8 +268,8 @@ def pbChangeExp(pkmn, new_exp, scene)
pkmn.totalhp, pkmn.attack, pkmn.defense, pkmn.spatk, pkmn.spdef, pkmn.speed), scene)
else # Gains Exp
difference = new_exp - pkmn.exp
if scene.is_a?(PokemonPartyScreen)
scene.pbDisplay(_INTL("{1} gained {2} Exp. Points!", pkmn.name, difference))
if scene.is_a?(UI::Party)
scene.show_message(_INTL("{1} gained {2} Exp. Points!", pkmn.name, difference))
else
pbMessage(_INTL("{1} gained {2} Exp. Points!", pkmn.name, difference))
end
@@ -279,8 +279,8 @@ def pbChangeExp(pkmn, new_exp, scene)
scene.pbRefresh
return if pkmn.level == old_level
# Level changed
if scene.is_a?(PokemonPartyScreen)
scene.pbDisplay(_INTL("{1} grew to Lv. {2}!", pkmn.name, pkmn.level))
if scene.is_a?(UI::Party)
scene.show_message(_INTL("{1} grew to Lv. {2}!", pkmn.name, pkmn.level))
else
pbMessage(_INTL("{1} grew to Lv. {2}!", pkmn.name, pkmn.level))
end
@@ -308,7 +308,7 @@ def pbChangeExp(pkmn, new_exp, scene)
evo.pbStartScreen(pkmn, new_species)
evo.pbEvolution
evo.pbEndScreen
scene.pbRefresh if scene.is_a?(PokemonPartyScreen)
scene.refresh if scene.is_a?(UI::Party)
end
end
end
@@ -320,7 +320,7 @@ def pbGainExpFromExpCandy(pkmn, base_amt, qty, scene)
return false
end
pbSEPlay("Pkmn level up")
scene.scene.pbSetHelpText("") if scene.is_a?(PokemonPartyScreen)
scene.set_help_text("") if scene.is_a?(UI::Party)
if qty > 1
(qty - 1).times { pkmn.changeHappiness("vitamin") }
end
@@ -581,9 +581,12 @@ end
#===============================================================================
# Teach and forget a move.
#===============================================================================
def pbLearnMove(pkmn, move, ignore_if_known = false, by_machine = false, &block)
def pbLearnMove(pkmn, move, ignore_if_known = false, by_machine = false, screen = nil, &block)
return false if !pkmn
pkmn_name = pkmn.name
move = GameData::Move.get(move).id
move_name = GameData::Move.get(move).name
# Check if Pokémon is unable to learn any moves
if pkmn.egg? && !$DEBUG
pbMessage(_INTL("Eggs can't be taught any moves."), &block)
return false
@@ -591,27 +594,29 @@ def pbLearnMove(pkmn, move, ignore_if_known = false, by_machine = false, &block)
pbMessage(_INTL("Shadow Pokémon can't be taught any moves."), &block)
return false
end
pkmn_name = pkmn.name
move_name = GameData::Move.get(move).name
# Check if Pokémon can learn this move
if pkmn.hasMove?(move)
pbMessage(_INTL("{1} already knows {2}.", pkmn_name, move_name), &block) if !ignore_if_known
if !ignore_if_known
pbMessage(_INTL("{1} already knows {2}.", pkmn_name, move_name), &block)
end
return false
elsif pkmn.numMoves < Pokemon::MAX_MOVES
pkmn.learn_move(move)
pbMessage("\\se[]" + _INTL("{1} learned {2}!", pkmn_name, move_name) + "\\se[Pkmn move learnt]", &block)
return true
end
# Pokémon needs to forget a move to learn this one
pbMessage(_INTL("{1} wants to learn {2}, but it already knows {3} moves.",
pkmn_name, move_name, pkmn.numMoves.to_word) + "\1", &block)
if pbConfirmMessage(_INTL("Should {1} forget a move to learn {2}?", pkmn_name, move_name), &block)
loop do
move_index = pbForgetMove(pkmn, move)
move_index = pbForgetMove(pkmn, move, screen)
if move_index >= 0
old_move_name = pkmn.moves[move_index].name
oldmovepp = pkmn.moves[move_index].pp
old_move_pp = pkmn.moves[move_index].pp
pkmn.moves[move_index] = Pokemon::Move.new(move) # Replaces current/total PP
if by_machine && Settings::TAUGHT_MACHINES_KEEP_OLD_PP
pkmn.moves[move_index].pp = [oldmovepp, pkmn.moves[move_index].total_pp].min
pkmn.moves[move_index].pp = [old_move_pp, pkmn.moves[move_index].total_pp].min
end
pbMessage(_INTL("1, 2, and...\\wt[16] ...\\wt[16] ...\\wt[16] Ta-da!") + "\\se[Battle ball drop]\1", &block)
pbMessage(_INTL("{1} forgot how to use {2}.\nAnd..." + "\1", pkmn_name, old_move_name), &block)
@@ -629,11 +634,11 @@ def pbLearnMove(pkmn, move, ignore_if_known = false, by_machine = false, &block)
return false
end
def pbForgetMove(pkmn, moveToLearn)
def pbForgetMove(pkmn, move_to_learn, screen = nil)
ret = -1
pbFadeOutIn do
screen = UI::PokemonSummary.new([pkmn], 0, mode: :choose_move, new_move: moveToLearn)
ret = screen.choose_move
pbFadeOutInWithUpdate(screen&.sprites) do
summary_screen = UI::PokemonSummary.new([pkmn], 0, mode: :choose_move, new_move: move_to_learn)
ret = summary_screen.choose_move
end
return ret
end
@@ -642,7 +647,7 @@ end
# Use an item from the Bag and/or on a Pokémon.
#===============================================================================
# @return [Integer] 0 = item wasn't used; 1 = item used; 2 = close Bag to use in field
def pbUseItem(bag, item, bagscene = nil)
def pbUseItem(bag, item, bag_scene = nil)
itm = GameData::Item.get(item)
useType = itm.field_use
if useType == 1 # Item is usable on a Pokémon
@@ -660,37 +665,35 @@ def pbUseItem(bag, item, bagscene = nil)
end
end
pbFadeOutIn do
scene = PokemonParty_Scene.new
screen = PokemonPartyScreen.new(scene, $player.party)
screen.pbStartScene(_INTL("Use on which Pokémon?"), false, annot)
loop do
scene.pbSetHelpText(_INTL("Use on which Pokémon?"))
chosen = screen.pbChoosePokemon
if chosen < 0
ret = false
break
end
pkmn = $player.party[chosen]
next if !pbCheckUseOnPokemon(item, pkmn, screen)
screen = UI::Party.new($player.party, mode: :use_item)
if itm.is_evolution_stone?
screen.set_able_annotation_proc(proc { |pkmn| next pkmn.check_evolution_on_use_item(item) })
end
screen.choose_pokemon do |pkmn, party_index|
next true if party_index < 0
next false if !pbCheckUseOnPokemon(item, pkmn, screen)
qty = 1
max_at_once = ItemHandlers.triggerUseOnPokemonMaximum(item, pkmn)
max_at_once = [max_at_once, $bag.quantity(item)].min
max_at_once = [max_at_once, bag.quantity(item)].min
if max_at_once > 1
qty = screen.scene.pbChooseNumber(
pbPlayDecisionSE
qty = screen.choose_number(
_INTL("How many {1} do you want to use?", GameData::Item.get(item).portion_name_plural), max_at_once
)
screen.scene.pbSetHelpText("") if screen.is_a?(PokemonPartyScreen)
screen.set_help_text("")
end
next if qty <= 0
next false if qty <= 0
ret = ItemHandlers.triggerUseOnPokemon(item, qty, pkmn, screen)
next unless ret && itm.consumed_after_use?
bag.remove(item, qty)
next if bag.has?(item)
pbMessage(_INTL("You used your last {1}.", itm.portion_name)) { screen.pbUpdate }
break
if ret && itm.consumed_after_use?
bag.remove(item, qty)
if !bag.has?(item)
screen.show_message(_INTL("You used your last {1}.", itm.portion_name))
next true
end
end
next false
end
screen.pbEndScene
bagscene&.pbRefresh
bag_scene&.pbRefresh
end
return (ret) ? 1 : 0
elsif useType == 2 || itm.is_machine? # Item is usable from Bag or teaches a move
@@ -708,6 +711,7 @@ end
# Only called when in the party screen and having chosen an item to be used on
# the selected Pokémon.
# TODO: Replace all pbMessage and so on in here. scene is the party screen.
def pbUseItemOnPokemon(item, pkmn, scene)
itm = GameData::Item.get(item)
# TM or HM
@@ -738,12 +742,12 @@ def pbUseItemOnPokemon(item, pkmn, scene)
qty = scene.scene.pbChooseNumber(
_INTL("How many {1} do you want to use?", itm.portion_name_plural), max_at_once
)
scene.scene.pbSetHelpText("") if scene.is_a?(PokemonPartyScreen)
scene.set_help_text("") if scene.is_a?(UI::Party)
end
return false if qty <= 0
ret = ItemHandlers.triggerUseOnPokemon(item, qty, pkmn, scene)
scene.pbClearAnnotations
scene.pbHardRefresh
scene.clear_annotations
scene.refresh
if ret && itm.consumed_after_use?
$bag.remove(item, qty)
if !$bag.has?(item)
@@ -779,6 +783,7 @@ end
#===============================================================================
# Give an item to a Pokémon to hold, and take a held item from a Pokémon.
#===============================================================================
# TODO: Replace all pbDisplay and so on in here.
def pbGiveItemToPokemon(item, pkmn, scene, pkmnid = 0)
return false if item.nil?
newitemname = GameData::Item.get(item).portion_name
@@ -824,6 +829,7 @@ def pbGiveItemToPokemon(item, pkmn, scene, pkmnid = 0)
return false
end
# TODO: Replace all pbDisplay and so on in here.
def pbTakeItemFromPokemon(pkmn, scene)
ret = false
if !pkmn.hasItem?
@@ -833,23 +839,25 @@ def pbTakeItemFromPokemon(pkmn, scene)
elsif pkmn.mail
if scene.pbConfirm(_INTL("Save the removed mail in your PC?"))
if pbMoveToMailbox(pkmn)
scene.pbDisplay(_INTL("The mail was saved in your PC."))
pkmn.item = nil
scene.pbDisplay(_INTL("The mail was saved in your PC."))
ret = true
else
scene.pbDisplay(_INTL("Your PC's Mailbox is full."))
end
elsif scene.pbConfirm(_INTL("If the mail is removed, its message will be lost. OK?"))
item_name = pkmn.item.portion_name
$bag.add(pkmn.item)
scene.pbDisplay(_INTL("Received the {1} from {2}.", pkmn.item.portion_name, pkmn.name))
pkmn.item = nil
pkmn.mail = nil
scene.pbDisplay(_INTL("Received the {1} from {2}.", item_name, pkmn.name))
ret = true
end
else
item_name = pkmn.item.portion_name
$bag.add(pkmn.item)
scene.pbDisplay(_INTL("Received the {1} from {2}.", pkmn.item.portion_name, pkmn.name))
pkmn.item = nil
scene.pbDisplay(_INTL("Received the {1} from {2}.", item_name, pkmn.name))
ret = true
end
return ret

View File

@@ -243,19 +243,19 @@ ItemHandlers::UseInField.add(:SACREDASH, proc { |item|
end
revived = 0
pbFadeOutIn do
scene = PokemonParty_Scene.new
screen = PokemonPartyScreen.new(scene, $player.party)
screen.pbStartScene(_INTL("Using item..."), false)
pbSEPlay("Use item in party")
$player.party.each_with_index do |pkmn, i|
next if !pkmn.fainted?
revived += 1
pkmn.heal
screen.pbRefreshSingle(i)
screen.pbDisplay(_INTL("{1}'s HP was restored.", pkmn.name))
screen = UI::Party.new($player.party, mode: :choose_pokemon)
screen.set_help_text(_INTL("Using item..."))
screen.show_and_hide do
$player.party.each_with_index do |pkmn, i|
next if !pkmn.fainted?
revived += 1
pkmn.heal
screen.refresh
pbSEPlay("Use item in party")
screen.show_message(_INTL("{1}'s HP was restored.", pkmn.name))
end
screen.show_message(_INTL("It won't have any effect.")) if revived == 0
end
screen.pbDisplay(_INTL("It won't have any effect.")) if revived == 0
screen.pbEndScene
end
next (revived > 0)
})
@@ -391,16 +391,16 @@ ItemHandlers::UseOnPokemon.addIf(:evolution_stones,
scene.pbDisplay(_INTL("It won't have any effect."))
next false
end
newspecies = pkmn.check_evolution_on_use_item(item)
if newspecies
new_species = pkmn.check_evolution_on_use_item(item)
if new_species
pbFadeOutInWithMusic do
evo = PokemonEvolutionScene.new
evo.pbStartScreen(pkmn, newspecies)
evo.pbStartScreen(pkmn, new_species)
evo.pbEvolution(false)
evo.pbEndScreen
if scene.is_a?(PokemonPartyScreen)
scene.pbRefreshAnnotations(proc { |p| !p.check_evolution_on_use_item(item).nil? })
scene.pbRefresh
if scene.is_a?(UI::Party)
scene.set_able_annotation_proc(proc { |pkmn| !pkmn.check_evolution_on_use_item(item).nil? })
scene.refresh
end
end
next true
@@ -415,17 +415,17 @@ ItemHandlers::UseOnPokemon.add(:SCROLLOFWATERS, proc { |item, qty, pkmn, scene|
scene.pbDisplay(_INTL("It won't have any effect."))
next false
end
newspecies = pkmn.check_evolution_on_use_item(item)
if newspecies
new_species = pkmn.check_evolution_on_use_item(item)
if new_species
pkmn.form = 1 # NOTE: This is the only difference to the generic evolution stone code.
pbFadeOutInWithMusic do
evo = PokemonEvolutionScene.new
evo.pbStartScreen(pkmn, newspecies)
evo.pbStartScreen(pkmn, new_species)
evo.pbEvolution(false)
evo.pbEndScreen
if scene.is_a?(PokemonPartyScreen)
scene.pbRefreshAnnotations(proc { |p| !p.check_evolution_on_use_item(item).nil? })
scene.pbRefresh
if scene.is_a?(UI::Party)
scene.set_able_annotation_proc(proc { |p| !p.check_evolution_on_use_item(item).nil? })
scene.refresh
end
end
next true
@@ -995,7 +995,7 @@ ItemHandlers::UseOnPokemon.add(:RARECANDY, proc { |item, qty, pkmn, scene|
evo.pbStartScreen(pkmn, new_species)
evo.pbEvolution
evo.pbEndScreen
scene.pbRefresh if scene.is_a?(PokemonPartyScreen)
scene.refresh if scene.is_a?(UI::Party)
end
next true
end

View File

@@ -101,7 +101,7 @@ def pbWriteMail(item, pkmn, pkmnid, scene)
message = ""
loop do
message = pbMessageFreeText(_INTL("Please enter a message (max. 250 characters)."),
"", false, 250, Graphics.width) { scene.pbUpdate }
"", false, 250, Graphics.width) { scene.update }
if message != ""
# Store mail if a message was written
poke1 = poke2 = nil
@@ -120,6 +120,6 @@ def pbWriteMail(item, pkmn, pkmnid, scene)
pbStoreMail(pkmn, item, message, poke1, poke2, poke3)
return true
end
return false if scene.pbConfirm(_INTL("Stop giving the Pokémon Mail?"))
return false if scene.show_confirm_message(_INTL("Stop giving the Pokémon Mail?"))
end
end

View File

@@ -120,7 +120,7 @@ class HeldItemIconSprite < Sprite
self.y = y
@pokemon = pokemon
@item = nil
self.item = @pokemon.item_id
self.item = @pokemon&.item_id
end
def dispose
@@ -130,7 +130,7 @@ class HeldItemIconSprite < Sprite
def pokemon=(value)
@pokemon = value
self.item = @pokemon.item_id
self.item = @pokemon&.item_id
end
def item=(value)
@@ -148,7 +148,7 @@ class HeldItemIconSprite < Sprite
def update
super
self.item = @pokemon.item_id
self.item = @pokemon&.item_id
if @animbitmap
@animbitmap.update
self.bitmap = @animbitmap.bitmap

View File

@@ -686,10 +686,7 @@ class PokemonParty_Scene
self.update
break if oldsprite.x == old_start_x - (old_mult * Graphics.width / 2)
end
Settings::MAX_PARTY_SIZE.times do |i|
@sprites["pokemon#{i}"].preselected = false
@sprites["pokemon#{i}"].switching = false
end
pbClearSwitching
pbRefresh
end
@@ -914,43 +911,6 @@ class PokemonPartyScreen
@scene.pbStartScene(@party, helptext, annotations)
end
def pbChoosePokemon(helptext = nil)
@scene.pbSetHelpText(helptext) if helptext
return @scene.pbChoosePokemon
end
def pbPokemonGiveScreen(item)
@scene.pbStartScene(@party, _INTL("Give to which Pokémon?"))
pkmnid = @scene.pbChoosePokemon
ret = false
if pkmnid >= 0
ret = pbGiveItemToPokemon(item, @party[pkmnid], self, pkmnid)
end
pbRefreshSingle(pkmnid)
@scene.pbEndScene
return ret
end
def pbPokemonGiveMailScreen(mailIndex)
@scene.pbStartScene(@party, _INTL("Give to which Pokémon?"))
pkmnid = @scene.pbChoosePokemon
if pkmnid >= 0
pkmn = @party[pkmnid]
if pkmn.hasItem? || pkmn.mail
pbDisplay(_INTL("This Pokémon is holding an item. It can't hold mail."))
elsif pkmn.egg?
pbDisplay(_INTL("Eggs can't hold mail."))
else
pbDisplay(_INTL("Mail was transferred from the Mailbox."))
pkmn.mail = $PokemonGlobal.mailbox[mailIndex]
pkmn.item = pkmn.mail.item
$PokemonGlobal.mailbox.delete_at(mailIndex)
pbRefreshSingle(pkmnid)
end
end
@scene.pbEndScene
end
def pbEndScene
@scene.pbEndScene
end
@@ -1006,6 +966,53 @@ class PokemonPartyScreen
return true
end
# For after using an evolution stone.
def pbRefreshAnnotations(ableProc)
return if !@scene.pbHasAnnotations?
annot = []
@party.each do |pkmn|
elig = ableProc.call(pkmn)
annot.push((elig) ? _INTL("ABLE") : _INTL("NOT ABLE"))
end
@scene.pbAnnotate(annot)
end
def pbClearAnnotations
@scene.pbAnnotate(nil)
end
def pbPokemonGiveScreen(item)
@scene.pbStartScene(@party, _INTL("Give to which Pokémon?"))
pkmnid = @scene.pbChoosePokemon
ret = false
if pkmnid >= 0
ret = pbGiveItemToPokemon(item, @party[pkmnid], self, pkmnid)
end
pbRefreshSingle(pkmnid)
@scene.pbEndScene
return ret
end
def pbPokemonGiveMailScreen(mailIndex)
@scene.pbStartScene(@party, _INTL("Give to which Pokémon?"))
pkmnid = @scene.pbChoosePokemon
if pkmnid >= 0
pkmn = @party[pkmnid]
if pkmn.hasItem? || pkmn.mail
pbDisplay(_INTL("This Pokémon is holding an item. It can't hold mail."))
elsif pkmn.egg?
pbDisplay(_INTL("Eggs can't hold mail."))
else
pbDisplay(_INTL("Mail was transferred from the Mailbox."))
pkmn.mail = $PokemonGlobal.mailbox[mailIndex]
pkmn.item = pkmn.mail.item
$PokemonGlobal.mailbox.delete_at(mailIndex)
pbRefreshSingle(pkmnid)
end
end
@scene.pbEndScene
end
def pbSwitch(oldid, newid)
if oldid != newid
@scene.pbSwitchBegin(oldid, newid)
@@ -1029,21 +1036,6 @@ class PokemonPartyScreen
return @scene.pbShowCommands(helptext, movenames, index)
end
# For after using an evolution stone.
def pbRefreshAnnotations(ableProc)
return if !@scene.pbHasAnnotations?
annot = []
@party.each do |pkmn|
elig = ableProc.call(pkmn)
annot.push((elig) ? _INTL("ABLE") : _INTL("NOT ABLE"))
end
@scene.pbAnnotate(annot)
end
def pbClearAnnotations
@scene.pbAnnotate(nil)
end
def pbPokemonMultipleEntryScreenEx(ruleset)
annot = []
statuses = []
@@ -1134,6 +1126,11 @@ class PokemonPartyScreen
return ret
end
def pbChoosePokemon(helptext = nil)
@scene.pbSetHelpText(helptext) if helptext
return @scene.pbChoosePokemon
end
def pbChooseAblePokemon(ableProc, allowIneligible = false)
annot = []
eligibility = []
@@ -1480,78 +1477,3 @@ MenuHandlers.add(:party_menu_item, :move, {
screen.scene.pbSelect(old_party_idx) if !moved
}
})
#===============================================================================
# Open the party screen.
#===============================================================================
def pbPokemonScreen
pbFadeOutIn do
sscene = PokemonParty_Scene.new
sscreen = PokemonPartyScreen.new(sscene, $player.party)
sscreen.pbPokemonScreen
end
end
#===============================================================================
# Choose a Pokémon in the party.
#===============================================================================
# Choose a Pokémon/egg from the party.
# Stores result in variable _variableNumber_ and the chosen Pokémon's name in
# variable _nameVarNumber_; result is -1 if no Pokémon was chosen
def pbChoosePokemon(variableNumber, nameVarNumber, ableProc = nil, allowIneligible = false)
chosen = 0
pbFadeOutIn do
scene = PokemonParty_Scene.new
screen = PokemonPartyScreen.new(scene, $player.party)
if ableProc
chosen = screen.pbChooseAblePokemon(ableProc, allowIneligible)
else
screen.pbStartScene(_INTL("Choose a Pokémon."), false)
chosen = screen.pbChoosePokemon
screen.pbEndScene
end
end
pbSet(variableNumber, chosen)
if chosen >= 0
pbSet(nameVarNumber, $player.party[chosen].name)
else
pbSet(nameVarNumber, "")
end
end
def pbChooseNonEggPokemon(variableNumber, nameVarNumber)
pbChoosePokemon(variableNumber, nameVarNumber, proc { |pkmn| !pkmn.egg? })
end
def pbChooseAblePokemon(variableNumber, nameVarNumber)
pbChoosePokemon(variableNumber, nameVarNumber, proc { |pkmn| !pkmn.egg? && pkmn.hp > 0 })
end
# Same as pbChoosePokemon, but prevents choosing an egg or a Shadow Pokémon.
def pbChooseTradablePokemon(variableNumber, nameVarNumber, ableProc = nil, allowIneligible = false)
chosen = 0
pbFadeOutIn do
scene = PokemonParty_Scene.new
screen = PokemonPartyScreen.new(scene, $player.party)
if ableProc
chosen = screen.pbChooseTradablePokemon(ableProc, allowIneligible)
else
screen.pbStartScene(_INTL("Choose a Pokémon."), false)
chosen = screen.pbChoosePokemon
screen.pbEndScene
end
end
pbSet(variableNumber, chosen)
if chosen >= 0
pbSet(nameVarNumber, $player.party[chosen].name)
else
pbSet(nameVarNumber, "")
end
end
def pbChoosePokemonForTrade(variableNumber, nameVarNumber, wanted)
wanted = GameData::Species.get(wanted).species
pbChooseTradablePokemon(variableNumber, nameVarNumber, proc { |pkmn|
next pkmn.species == wanted
})
end

View File

@@ -513,10 +513,11 @@ class PokemonBagScreen
@scene.pbDisplay(_INTL("The {1} can't be held.", itm.portion_name))
else
pbFadeOutIn do
sscene = PokemonParty_Scene.new
sscreen = PokemonPartyScreen.new(sscene, $player.party)
sscreen.pbPokemonGiveScreen(item)
@scene.pbRefresh
screen = UI::Party.new($player.party, mode: :choose_pokemon)
screen.choose_pokemon do |pkmn, party_index|
pbGiveItemToPokemon(item, screen.pokemon, screen, chosen) if party_index >= 0
next true
end
end
end
elsif cmdToss >= 0 && command == cmdToss # Toss item

View File

@@ -261,7 +261,7 @@ class PokemonReadyMenu
user = $player.party[commands[0][command[1]][3]]
if move == :FLY
ret = nil
pbFadeOutInWithUpdate(99999, @scene.sprites) do
pbFadeOutInWithUpdate(@scene.sprites) do
pbHideMenu
scene = PokemonRegionMap_Scene.new(-1, false)
screen = PokemonRegionMapScreen.new(scene)

View File

@@ -1576,7 +1576,7 @@ class PokemonStorageScreen
elsif cmdRelease >= 0 && command == cmdRelease # Release
pbRelease(selected, @heldpkmn)
elsif cmdDebug >= 0 && command == cmdDebug # Debug
pbPokemonDebug((@heldpkmn) ? @heldpkmn : pokemon, selected, heldpoke)
pokemon_debug_menu((@heldpkmn) ? @heldpkmn : pokemon, selected, heldpoke)
end
end
end

View File

@@ -68,9 +68,9 @@ def pbPCMailbox
commands.push(_INTL("Cancel"))
command = pbShowCommands(nil, commands, -1, command)
if command >= 0 && command < $PokemonGlobal.mailbox.length
mailIndex = command
mail_index = command
commandMail = pbMessage(
_INTL("What do you want to do with {1}'s Mail?", $PokemonGlobal.mailbox[mailIndex].sender),
_INTL("What do you want to do with {1}'s Mail?", $PokemonGlobal.mailbox[mail_index].sender),
[_INTL("Read"),
_INTL("Move to Bag"),
_INTL("Give"),
@@ -79,22 +79,36 @@ def pbPCMailbox
case commandMail
when 0 # Read
pbFadeOutIn do
pbDisplayMail($PokemonGlobal.mailbox[mailIndex])
pbDisplayMail($PokemonGlobal.mailbox[mail_index])
end
when 1 # Move to Bag
if pbConfirmMessage(_INTL("The message will be lost. Is that OK?"))
if $bag.add($PokemonGlobal.mailbox[mailIndex].item)
if $bag.add($PokemonGlobal.mailbox[mail_index].item)
pbMessage(_INTL("The Mail was returned to the Bag with its message erased."))
$PokemonGlobal.mailbox.delete_at(mailIndex)
$PokemonGlobal.mailbox.delete_at(mail_index)
else
pbMessage(_INTL("The Bag is full."))
end
end
when 2 # Give
pbFadeOutIn do
sscene = PokemonParty_Scene.new
sscreen = PokemonPartyScreen.new(sscene, $player.party)
sscreen.pbPokemonGiveMailScreen(mailIndex)
screen = UI::Party.new($player.party, mode: :choose_pokemon)
screen.choose_pokemon do |pkmn, party_index|
next true if party_index < 0
if pkmn.egg?
screen.show_message(_INTL("Eggs can't hold mail."))
elsif pkmn.hasItem? || pkmn.mail
screen.show_message(_INTL("This Pokémon is holding an item. It can't hold mail."))
else
pkmn.mail = $PokemonGlobal.mailbox[mail_index]
pkmn.item = pkmn.mail.item
$PokemonGlobal.mailbox.delete_at(mail_index)
screen.refresh
screen.show_message(_INTL("Mail was transferred from the Mailbox."))
next true
end
next false
end
end
end
else

View File

@@ -2,60 +2,17 @@ module UI
#=============================================================================
# The visuals class.
#=============================================================================
class BaseVisuals
UI_FOLDER = "Graphics/UI/"
GRAPHICS_FOLDER = "" # Subfolder in UI_FOLDER
BACKGROUND_FILENAME = "bg"
TEXT_COLOR_THEMES = { # These color themes are added to @sprites[:overlay]
module SpriteContainerMixin
UI_FOLDER = "Graphics/UI/"
GRAPHICS_FOLDER = "" # Subfolder in UI_FOLDER
TEXT_COLOR_THEMES = { # These color themes are added to @sprites[:overlay]
:default => [Color.new(72, 72, 72), Color.new(160, 160, 160)] # Base and shadow colour
}
def initialize
@bitmaps = {}
@sprites = {}
initialize_viewport
initialize_bitmaps
initialize_background
initialize_overlay
initialize_message_box
# TODO: Initialize dialogue box for messages to use.
initialize_sprites
refresh
end
def initialize_viewport
@viewport = Viewport.new(0, 0, Graphics.width, Graphics.height)
@viewport.z = 99999
end
def initialize_bitmaps
end
def initialize_background
addBackgroundPlane(@sprites, :background, self.class::GRAPHICS_FOLDER + background_filename, @viewport)
@sprites[:background].z = -1000
end
def initialize_overlay
add_overlay(:overlay)
end
def initialize_message_box
@sprites[:message_box] = Window_AdvancedTextPokemon.new("")
@sprites[:message_box].viewport = @viewport
@sprites[:message_box].z = 2000
@sprites[:message_box].visible = false
@sprites[:message_box].letterbyletter = true
pbBottomLeftLines(@sprites[:message_box], 2)
end
def initialize_sprites
end
#---------------------------------------------------------------------------
def add_overlay(overlay)
@sprites[overlay] = BitmapSprite.new(Graphics.width, Graphics.height, @viewport)
def add_overlay(overlay, overlay_width = -1, overlay_height = -1)
overlay_width = Graphics.width if overlay_width < 0
overlay_height = Graphics.height if overlay_height < 0
@sprites[overlay] = BitmapSprite.new(overlay_width, overlay_height, @viewport)
@sprites[overlay].z = 1000
self.class::TEXT_COLOR_THEMES.each_pair { |key, values| @sprites[overlay].add_text_theme(key, *values) }
pbSetSystemFont(@sprites[overlay].bitmap)
@@ -85,20 +42,16 @@ module UI
#---------------------------------------------------------------------------
def fade_in
pbFadeInAndShow(@sprites) { update_visuals }
end
def fade_out
pbFadeOutAndHide(@sprites) { update_visuals }
end
def dispose
@sprites.each_value { |s| s.dispose if s && !s.disposed? }
@sprites.clear
@bitmaps.each_value { |b| b.dispose if b && !b.disposed? }
@bitmaps.clear
@viewport.dispose
@disposed = true
end
def disposed?
return !!@disposed
end
#---------------------------------------------------------------------------
@@ -126,123 +79,6 @@ module UI
#---------------------------------------------------------------------------
def show_message(text)
@sprites[:message_box].text = text
@sprites[:message_box].visible = true
loop do
Graphics.update
Input.update
update_visuals
if @sprites[:message_box].busy?
if Input.trigger?(Input::USE)
pbPlayDecisionSE if @sprites[:message_box].pausing?
@sprites[:message_box].resume
end
elsif Input.trigger?(Input::USE) || Input.trigger?(Input::BACK)
break
end
end
@sprites[:message_box].visible = false
end
def show_confirm_message(text)
ret = false
@sprites[:message_box].text = text
@sprites[:message_box].visible = true
using(cmd_window = Window_CommandPokemon.new([_INTL("Yes"), _INTL("No")])) do
cmd_window.z = @viewport.z + 1
cmd_window.visible = false
pbBottomRight(cmd_window)
cmd_window.y -= @sprites[:message_box].height
loop do
Graphics.update
Input.update
update_visuals
cmd_window.visible = true if !@sprites[:message_box].busy?
cmd_window.update
if !@sprites[:message_box].busy?
if Input.trigger?(Input::BACK)
pbPlayCancelSE
ret = false
break
elsif Input.trigger?(Input::USE) && @sprites[:message_box].resume
pbPlayDecisionSE
ret = (cmd_window.index == 0)
break
end
end
end
end
@sprites[:message_box].visible = false
return ret
end
def show_choice_message(text, options, index = 0)
ret = -1
commands = options
commands = options.values if options.is_a?(Hash)
@sprites[:message_box].text = text
@sprites[:message_box].visible = true
using(cmd_window = Window_CommandPokemon.new(commands)) do
cmd_window.z = @viewport.z + 1
cmd_window.visible = false
cmd_window.index = index
pbBottomRight(cmd_window)
cmd_window.y -= @sprites[:message_box].height
loop do
Graphics.update
Input.update
update_visuals
cmd_window.visible = true if !@sprites[:message_box].busy?
cmd_window.update
if !@sprites[:message_box].busy?
if Input.trigger?(Input::BACK)
pbPlayCancelSE
ret = -1
break
elsif Input.trigger?(Input::USE) && @sprites[:message_box].resume
pbPlayDecisionSE
ret = cmd_window.index
break
end
end
end
end
@sprites[:message_box].visible = false
ret = options.keys[ret] if options.is_a?(Hash)
return ret
end
def show_choice(options, index = 0)
ret = -1
commands = options
commands = options.values if options.is_a?(Hash)
using(cmd_window = Window_CommandPokemon.new(commands)) do
cmd_window.z = @viewport.z + 1
cmd_window.index = index
pbBottomRight(cmd_window)
loop do
Graphics.update
Input.update
update_visuals
cmd_window.update
if Input.trigger?(Input::BACK)
pbPlayCancelSE
ret = -1
break
elsif Input.trigger?(Input::USE)
pbPlayDecisionSE
ret = cmd_window.index
break
end
end
end
ret = options.keys[ret] if options.is_a?(Hash)
return ret
end
#---------------------------------------------------------------------------
# NOTE: max_width should include the width of the text shadow at the end of
# the string (because characters in the font have a blank 2 pixels
# after them for the shadow to occupy).
@@ -267,7 +103,7 @@ module UI
def draw_paragraph_text(string, text_x, text_y, text_width, num_lines, theme: :default, overlay: :overlay)
drawTextEx(@sprites[overlay].bitmap, text_x, text_y, text_width, num_lines,
string, *self.class::TEXT_COLOR_THEMES[theme])
string, *self.class::TEXT_COLOR_THEMES[theme])
end
# NOTE: This also draws string in a paragraph, but with no limit on the
@@ -295,7 +131,7 @@ module UI
index = (char == "/") ? 10 : char.to_i
char_x = (align == :right) ? text_x - ((i + 1) * char_width) : text_x + (i * char_width)
draw_image(bitmap, char_x, text_y,
index * char_width, 0, char_width, char_height, overlay: overlay)
index * char_width, 0, char_width, char_height, overlay: overlay)
end
end
@@ -316,6 +152,311 @@ module UI
pbUpdateSpriteHash(@sprites)
end
def update
update_visuals
end
end
#=============================================================================
# The visuals class.
#=============================================================================
class SpriteContainer
attr_reader :x, :y, :z, :visible, :color
include SpriteContainerMixin
def initialize(viewport)
@viewport = viewport
@x ||= 0
@y ||= 0
@z ||= 0
@visible = true
@color = Color.new(0, 0, 0, 0)
@bitmaps = {}
@sprites = {}
@sprites_values = {}
initialize_bitmaps
initialize_sprites
refresh_sprites_values
end
def initialize_bitmaps
end
def initialize_sprites
end
#---------------------------------------------------------------------------
# x, y, z, visible, opacity, color
def x=(value)
@x = value
@sprites.each_pair do |key, sprite|
sprite.x = @x + @sprites_values[key][:x]
end
end
def y=(value)
@y = value
@sprites.each_pair do |key, sprite|
sprite.y = @y + @sprites_values[key][:y]
end
end
def z=(value)
@z = value
@sprites.each_pair do |key, sprite|
sprite.z = @z + @sprites_values[key][:z]
end
end
def visible=(value)
@visible = value
@sprites.each_pair do |key, sprite|
sprite.visible = @visible && @sprites_values[key][:visible]
end
end
def color=(value)
@color = value
@sprites.each_pair do |key, sprite|
sprite.color = @color
end
end
#---------------------------------------------------------------------------
def record_values(key)
@sprites_values[key] ||= {}
@sprites_values[key][:x] = @sprites[key].x
@sprites_values[key][:y] = @sprites[key].y
@sprites_values[key][:z] = @sprites[key].z
@sprites_values[key][:visible] = @sprites[key].visible
end
def refresh_sprites_values
self.x = @x
self.y = @y
self.z = @z
self.visible = @visible
end
end
#=============================================================================
# The visuals class.
#=============================================================================
class BaseVisuals
BACKGROUND_FILENAME = "bg"
include SpriteContainerMixin
def initialize
@bitmaps = {}
@sprites = {}
initialize_viewport
initialize_bitmaps
initialize_background
initialize_overlay
initialize_message_box
initialize_sprites
refresh
end
def initialize_viewport
@viewport = Viewport.new(0, 0, Graphics.width, Graphics.height)
@viewport.z = 99999
end
def initialize_bitmaps
end
def initialize_background
addBackgroundPlane(@sprites, :background, self.class::GRAPHICS_FOLDER + background_filename, @viewport)
@sprites[:background].z = -1000
end
def initialize_overlay
add_overlay(:overlay)
end
def initialize_message_box
@sprites[:message_box] = Window_AdvancedTextPokemon.new("")
@sprites[:message_box].viewport = @viewport
@sprites[:message_box].z = 2000
@sprites[:message_box].visible = false
@sprites[:message_box].letterbyletter = true
pbBottomLeftLines(@sprites[:message_box], 2)
@sprites[:speech_box] = Window_AdvancedTextPokemon.new("")
@sprites[:speech_box].viewport = @viewport
@sprites[:speech_box].z = 2001
@sprites[:speech_box].visible = false
@sprites[:speech_box].letterbyletter = true
@sprites[:speech_box].setSkin(MessageConfig.pbGetSpeechFrame)
pbBottomLeftLines(@sprites[:speech_box], 2)
end
def initialize_sprites
end
#---------------------------------------------------------------------------
def fade_in
pbFadeInAndShow(@sprites)# { update_visuals }
end
def fade_out
pbFadeOutAndHide(@sprites)# { update_visuals }
end
def dispose
super
@viewport.dispose
end
#---------------------------------------------------------------------------
def show_message(text)
@sprites[:speech_box].visible = true
@sprites[:speech_box].text = text
pbBottomLeftLines(@sprites[:speech_box], 2)
loop do
Graphics.update
Input.update
update_visuals
if @sprites[:speech_box].busy?
if Input.trigger?(Input::USE)
pbPlayDecisionSE if @sprites[:speech_box].pausing?
@sprites[:speech_box].resume
end
elsif Input.trigger?(Input::USE) || Input.trigger?(Input::BACK)
break
end
end
@sprites[:speech_box].visible = false
end
def show_confirm_message(text)
ret = false
@sprites[:speech_box].visible = true
@sprites[:speech_box].text = text
pbBottomLeftLines(@sprites[:speech_box], 2)
using(cmd_window = Window_CommandPokemon.new([_INTL("Yes"), _INTL("No")])) do
cmd_window.z = @viewport.z + 1
cmd_window.visible = false
pbBottomRight(cmd_window)
cmd_window.y -= @sprites[:speech_box].height
cmd_window.visible = true if !@sprites[:speech_box].busy?
loop do
Graphics.update
Input.update
update_visuals
cmd_window.visible = true if !@sprites[:speech_box].busy?
cmd_window.update
if !@sprites[:speech_box].busy?
if Input.trigger?(Input::BACK)
pbPlayCancelSE
ret = false
break
elsif Input.trigger?(Input::USE) && @sprites[:speech_box].resume
pbPlayDecisionSE
ret = (cmd_window.index == 0)
break
end
end
end
end
@sprites[:speech_box].visible = false
return ret
end
# align: Where the command window is in relation to the message window.
# :horizontal is side by side, :vertical is command window above.
def show_choice_message(text, options, index = 0, align: :horizontal, cmd_side: :right)
ret = -1
commands = options
commands = options.values if options.is_a?(Hash)
@sprites[:speech_box].visible = true
@sprites[:speech_box].text = text
using(cmd_window = Window_AdvancedCommandPokemon.new(commands)) do
if align == :vertical
@sprites[:speech_box].resizeHeightToFit(text, Graphics.width)
else
@sprites[:speech_box].resizeHeightToFit(text, Graphics.width - cmd_window.width)
end
cmd_window.z = @viewport.z + 1
cmd_window.visible = false
cmd_window.index = index
if cmd_side == :right
pbBottomLeft(@sprites[:speech_box])
pbBottomRight(cmd_window)
else
pbBottomRight(@sprites[:speech_box])
pbBottomLeft(cmd_window)
end
if align == :vertical
cmd_window.height = [cmd_window.height, Graphics.height - @sprites[:speech_box].height].min
cmd_window.y = Graphics.height - @sprites[:speech_box].height - cmd_window.height
end
cmd_window.visible = true if !@sprites[:speech_box].busy?
loop do
Graphics.update
Input.update
update_visuals
cmd_window.visible = true if !@sprites[:speech_box].busy?
cmd_window.update
if !@sprites[:speech_box].busy?
if Input.trigger?(Input::BACK)
pbPlayCancelSE
ret = -1
break
elsif Input.trigger?(Input::USE) && @sprites[:speech_box].resume
pbPlayDecisionSE
ret = cmd_window.index
break
end
end
end
end
@sprites[:speech_box].visible = false
ret = options.keys[ret] if options.is_a?(Hash)
return ret
end
def show_choice(options, index = 0)
ret = -1
commands = options
commands = options.values if options.is_a?(Hash)
using(cmd_window = Window_AdvancedCommandPokemon.new(commands)) do
cmd_window.z = @viewport.z + 1
cmd_window.index = index
pbBottomRight(cmd_window)
loop do
Graphics.update
Input.update
update_visuals
cmd_window.update
if Input.trigger?(Input::BACK)
pbPlayCancelSE
ret = -1
break
elsif Input.trigger?(Input::USE)
pbPlayDecisionSE
ret = cmd_window.index
break
end
end
end
ret = options.keys[ret] if options.is_a?(Hash)
return ret
end
# TODO: Rewrite this.
def choose_number(help_text, maximum, init_num = 1)
return UIHelper.pbChooseNumber(@sprites[:speech_box], help_text, maximum, init_num) { update_visuals }
end
#---------------------------------------------------------------------------
def update_input
if Input.trigger?(Input::BACK)
return :quit
@@ -323,11 +464,6 @@ module UI
return nil
end
# def update
# update_visuals
# return update_input
# end
#---------------------------------------------------------------------------
def navigate
@@ -395,46 +531,72 @@ module UI
return @visuals.show_choice_message(text, options, initial_index)
end
alias pbShowCommands show_choice_message
def show_choice(options, initial_index = 0)
return @visuals.show_choice(options, initial_index)
end
alias pbShowCommands show_choice
def show_choice_from_menu_handler(menu_handler_id)
def show_choice_from_menu_handler(menu_handler_id, message = nil)
commands = {}
MenuHandlers.each_available(menu_handler_id, self) do |option, hash, name|
MenuHandlers.each_available(menu_handler_id, self) do |option, _hash, name|
commands[option] = name
end
return show_choice_message(message, commands) if message
return show_choice(commands)
end
def choose_number(help_text, maximum, init_num = 1)
return @visuals.choose_number(help_text, maximum, init_num)
end
alias pbChooseNumber choose_number
#-----------------------------------------------------------------------------
def refresh
@visuals.refresh
end
alias pbRefresh refresh
def update
@visuals.update
end
alias pbUpdate update
#-----------------------------------------------------------------------------
def show_and_hide
start_screen
yield if block_given?
end_screen
end
def main
start_screen
loop do
on_start_main_loop
command = @visuals.navigate
break if command == :quit
command = perform_action(command)
break if command == :quit
break if @disposed
end
end_screen
end
def on_start_main_loop
end
def perform_action(command)
return nil if !self.class::SCREEN_ID
action_hash = UIActionHandlers.get(self.class::SCREEN_ID, command)
return nil if !action_hash
return nil if action_hash[:condition] && !action_hash[:condition].call(self)
if action_hash[:menu]
choice = show_choice_from_menu_handler(action_hash[:menu])
choice = show_choice_from_menu_handler(action_hash[:menu], action_hash[:menu_message]&.call(self))
perform_action(choice) if choice
elsif action_hash[:effect]
return perform_action_effect(action_hash)

View File

@@ -200,16 +200,15 @@ MenuHandlers.add(:pause_menu, :party, {
"condition" => proc { next $player.party_count > 0 },
"effect" => proc { |menu|
pbPlayDecisionSE
hidden_move = nil
pbFadeOutIn do
sscene = PokemonParty_Scene.new
sscreen = PokemonPartyScreen.new(sscene, $player.party)
hidden_move = sscreen.pbPokemonScreen
(hidden_move) ? menu.silent_end_screen : menu.refresh
UI::Party.new($player.party).main
($game_temp.field_move_to_use) ? menu.silent_end_screen : menu.refresh
end
next false if !hidden_move
next false if !$game_temp.field_move_to_use
$game_temp.in_menu = false
pbUseHiddenMove(hidden_move[0], hidden_move[1])
pbUseHiddenMove($game_temp.field_move_user, $game_temp.field_move_to_use)
$game_temp.field_move_user = nil
$game_temp.field_move_to_use = nil
next true
}
})

File diff suppressed because it is too large Load Diff

View File

@@ -218,6 +218,7 @@ class UI::PokemonSummaryVisuals < UI::BaseVisuals
@page = (@mode == :choose_move) ? :moves : all_pages[0]
@move_index = (@mode == :choose_move) ? 0 : nil
super()
refresh_move_cursor if @move_index
end
def initialize_bitmaps
@@ -974,9 +975,9 @@ class UI::PokemonSummaryVisuals < UI::BaseVisuals
def refresh_move_cursor
# Update cursor positions
@sprites[:move_cursor].index = @move_index
@sprites[:selected_move_cursor].index = @swap_move_index
@sprites[:selected_move_cursor].index = @swap_move_index || -1
# Update cursor z values
if @swap_move_index >= 0
if @swap_move_index && @swap_move_index >= 0
@sprites[:selected_move_cursor].z = @sprites[:move_cursor].z + 1
@sprites[:selected_move_cursor].z -= 2 if @move_index != @swap_move_index
end
@@ -1417,7 +1418,7 @@ end
#===============================================================================
# Actions that can be triggered in the Pokémon summary screen.
#===============================================================================
UIActionHandlers.add(UI::PokemonSummary::SCREEN_ID, :go_to_previous_pokemon,
UIActionHandlers.add(UI::PokemonSummary::SCREEN_ID, :go_to_previous_pokemon, {
:effect => proc { |screen|
if screen.party_index > 0
new_index = screen.party_index
@@ -1434,9 +1435,9 @@ UIActionHandlers.add(UI::PokemonSummary::SCREEN_ID, :go_to_previous_pokemon,
end
end
}
)
})
UIActionHandlers.add(UI::PokemonSummary::SCREEN_ID, :go_to_next_pokemon,
UIActionHandlers.add(UI::PokemonSummary::SCREEN_ID, :go_to_next_pokemon, {
:effect => proc { |screen|
if screen.party_index < screen.party.length - 1
new_index = screen.party_index
@@ -1453,9 +1454,9 @@ UIActionHandlers.add(UI::PokemonSummary::SCREEN_ID, :go_to_next_pokemon,
end
end
}
)
})
UIActionHandlers.add(UI::PokemonSummary::SCREEN_ID, :navigate_moves,
UIActionHandlers.add(UI::PokemonSummary::SCREEN_ID, :navigate_moves, {
:returns_value => true,
:effect => proc { |screen|
move_index = screen.visuals.navigate_moves
@@ -1463,29 +1464,29 @@ UIActionHandlers.add(UI::PokemonSummary::SCREEN_ID, :navigate_moves,
screen.refresh
next nil
}
)
})
UIActionHandlers.add(UI::PokemonSummary::SCREEN_ID, :navigate_ribbons,
UIActionHandlers.add(UI::PokemonSummary::SCREEN_ID, :navigate_ribbons, {
:effect => proc { |screen|
screen.visuals.navigate_ribbons
screen.refresh
}
)
})
UIActionHandlers.add(UI::PokemonSummary::SCREEN_ID, :marking,
UIActionHandlers.add(UI::PokemonSummary::SCREEN_ID, :marking, {
:effect => proc { |screen|
screen.visuals.navigate_markings
screen.refresh
}
)
})
# Shows a choice menu using the MenuHandlers options below.
UIActionHandlers.add(UI::PokemonSummary::SCREEN_ID, :interact_menu,
UIActionHandlers.add(UI::PokemonSummary::SCREEN_ID, :interact_menu, {
:menu => :summary_screen_interact,
:condition => proc { |screen| next screen.mode != :in_battle }
)
})
UIActionHandlers.add(UI::PokemonSummary::SCREEN_ID, :give_item,
UIActionHandlers.add(UI::PokemonSummary::SCREEN_ID, :give_item, {
:effect => proc { |screen|
item = nil
pbFadeOutIn do
@@ -1495,15 +1496,15 @@ UIActionHandlers.add(UI::PokemonSummary::SCREEN_ID, :give_item,
end
screen.refresh if pbGiveItemToPokemon(item, screen.pokemon, screen, screen.party_index)
}
)
})
UIActionHandlers.add(UI::PokemonSummary::SCREEN_ID, :take_item,
UIActionHandlers.add(UI::PokemonSummary::SCREEN_ID, :take_item, {
:effect => proc { |screen|
screen.refresh if pbTakeItemFromPokemon(screen.pokemon, screen)
}
)
})
UIActionHandlers.add(UI::PokemonSummary::SCREEN_ID, :pokedex,
UIActionHandlers.add(UI::PokemonSummary::SCREEN_ID, :pokedex, {
:effect => proc { |screen|
$player.pokedex.register_last_seen(screen.pokemon)
pbFadeOutIn do
@@ -1512,7 +1513,7 @@ UIActionHandlers.add(UI::PokemonSummary::SCREEN_ID, :pokedex,
dex_screen.pbStartSceneSingle(screen.pokemon.species)
end
}
)
})
#===============================================================================
# Menu options for choice menus that exist in the Pokémon summary screen.

View File

@@ -36,17 +36,16 @@ end
#
#===============================================================================
def pbEntryScreen(*arg)
retval = false
ret_val = false
pbFadeOutIn do
scene = PokemonParty_Scene.new
screen = PokemonPartyScreen.new(scene, $player.party)
ret = screen.pbPokemonMultipleEntryScreenEx(pbBattleChallenge.rules.ruleset)
screen = UI::Party.new($player.party, mode: :choose_entry_order)
ret = screen.choose_pokemon_entry_order(pbBattleChallenge.rules.ruleset)
# Set party
pbBattleChallenge.setParty(ret) if ret
# Continue (return true) if Pokémon were chosen
retval = (ret && ret.length > 0)
ret_val = (ret && ret.length > 0)
end
return retval
return ret_val
end
#===============================================================================

View File

@@ -445,39 +445,35 @@ def pbMoveTutorAnnotations(move, movelist = nil)
return ret
end
def pbMoveTutorChoose(move, movelist = nil, bymachine = false, oneusemachine = false)
def pbMoveTutorChoose(move, movelist = nil, by_machine = false, one_use_machine = false)
ret = false
move = GameData::Move.get(move).id
if movelist.is_a?(Array)
movelist.map! { |m| GameData::Move.get(m).id }
end
pbFadeOutIn do
movename = GameData::Move.get(move).name
move_name = GameData::Move.get(move).name
screen = UI::Party.new($player.party, mode: :teach_pokemon)
annot = pbMoveTutorAnnotations(move, movelist)
scene = PokemonParty_Scene.new
screen = PokemonPartyScreen.new(scene, $player.party)
screen.pbStartScene(_INTL("Teach which Pokémon?"), false, annot)
loop do
chosen = screen.pbChoosePokemon
break if chosen < 0
pokemon = $player.party[chosen]
if pokemon.egg?
pbMessage(_INTL("Eggs can't be taught any moves.")) { screen.pbUpdate }
elsif pokemon.shadowPokemon?
pbMessage(_INTL("Shadow Pokémon can't be taught any moves.")) { screen.pbUpdate }
elsif movelist && movelist.none? { |j| j == pokemon.species }
pbMessage(_INTL("{1} can't learn {2}.", pokemon.name, movename)) { screen.pbUpdate }
elsif !pokemon.compatible_with_move?(move)
pbMessage(_INTL("{1} can't learn {2}.", pokemon.name, movename)) { screen.pbUpdate }
elsif pbLearnMove(pokemon, move, false, bymachine) { screen.pbUpdate }
$stats.moves_taught_by_item += 1 if bymachine
$stats.moves_taught_by_tutor += 1 if !bymachine
pokemon.add_first_move(move) if oneusemachine
ret = true
break
screen.set_annotations(annot)
screen.choose_pokemon do |pkmn, party_index|
next true if party_index < 0
if pkmn.egg?
screen.show_message(_INTL("Eggs can't be taught any moves."))
elsif pkmn.shadowPokemon?
screen.show_message(_INTL("Shadow Pokémon can't be taught any moves."))
elsif movelist && movelist.none? { |j| j == pkmn.species }
screen.show_message(_INTL("{1} can't learn {2}.", pkmn.name, move_name))
elsif !pkmn.compatible_with_move?(move)
screen.show_message(_INTL("{1} can't learn {2}.", pkmn.name, move_name))
elsif pbLearnMove(pkmn, move, false, by_machine, screen) { screen.update }
$stats.moves_taught_by_item += 1 if by_machine
$stats.moves_taught_by_tutor += 1 if !by_machine
pkmn.add_first_move(move) if one_use_machine
next true
end
next false
end
screen.pbEndScene
end
return ret # Returns whether the move was learned by a Pokemon
end

View File

@@ -149,7 +149,7 @@ end
#
#===============================================================================
module PokemonDebugMixin
def pbPokemonDebug(pkmn, pkmnid, heldpoke = nil, settingUpBattle = false)
def pokemon_debug_menu(pkmn, pkmnid, heldpoke = nil, settingUpBattle = false)
# Get all commands
commands = CommandMenuList.new
MenuHandlers.each_available(:pokemon_debug_menu) do |option, hash, name|
@@ -408,7 +408,7 @@ end
#===============================================================================
#
#===============================================================================
class PokemonPartyScreen
class UI::Party
include PokemonDebugMixin
end

View File

@@ -355,7 +355,7 @@ MenuHandlers.add(:debug_menu, :test_wild_battle_advanced, {
else # Edit a Pokémon
if pbConfirmMessage(_INTL("Change this Pokémon?"))
scr = PokemonDebugPartyScreen.new
scr.pbPokemonDebug(pkmn[pkmnCmd], -1, nil, true)
scr.pokemon_debug_menu(pkmn[pkmnCmd], -1, nil, true)
scr.pbEndScreen
elsif pbConfirmMessage(_INTL("Delete this Pokémon?"))
pkmn.delete_at(pkmnCmd)

View File

@@ -738,6 +738,7 @@ end
#===============================================================================
# Pseudo-party screen for editing Pokémon being set up for a wild battle.
# TODO: Rewrite this with the new UI code.
#===============================================================================
class PokemonDebugPartyScreen
def initialize

View File

@@ -1,3 +1,5 @@
# TODO: Rewrite all code in here to replace pbDisplay and whatnot, once storage
# screen and PokemonDebugPartyScreen have been rewritten.
#===============================================================================
# HP/Status options.
#===============================================================================
@@ -90,8 +92,8 @@ MenuHandlers.add(:pokemon_debug_menu, :full_heal, {
screen.pbDisplay(_INTL("{1} is an egg.", pkmn.name))
else
pkmn.heal
screen.pbDisplay(_INTL("{1} was fully healed.", pkmn.name))
screen.pbRefreshSingle(pkmnid)
screen.pbDisplay(_INTL("{1} was fully healed.", pkmn.name))
end
next false
}
@@ -1018,7 +1020,7 @@ MenuHandlers.add(:pokemon_debug_menu, :set_egg, {
"effect" => proc { |pkmn, pkmnid, heldpoke, settingUpBattle, screen|
cmd = 0
loop do
msg = [_INTL("Not an egg"),
msg = [_INTL("Not an egg."),
_INTL("Egg (hatches in {1} steps).", pkmn.steps_to_hatch)][pkmn.egg? ? 1 : 0]
cmd = screen.pbShowCommands(msg,
[_INTL("Make egg"),
@@ -1113,9 +1115,10 @@ MenuHandlers.add(:pokemon_debug_menu, :duplicate, {
next false if !screen.pbConfirm(_INTL("Are you sure you want to copy this Pokémon?"))
clonedpkmn = pkmn.clone
case screen
when PokemonPartyScreen
when UI::Party
pbStorePokemon(clonedpkmn)
screen.pbHardRefresh
screen.refresh_party
screen.refresh
screen.pbDisplay(_INTL("The Pokémon was duplicated."))
when PokemonStorageScreen
if screen.storage.pbMoveCaughtToParty(clonedpkmn)
@@ -1145,9 +1148,10 @@ MenuHandlers.add(:pokemon_debug_menu, :delete, {
"effect" => proc { |pkmn, pkmnid, heldpoke, settingUpBattle, screen|
next false if !screen.pbConfirm(_INTL("Are you sure you want to delete this Pokémon?"))
case screen
when PokemonPartyScreen
when UI::Party
screen.party.delete_at(pkmnid)
screen.pbHardRefresh
screen.refresh_party
screen.refresh
when PokemonStorageScreen
screen.scene.pbRelease(pkmnid, heldpoke)
(heldpoke) ? screen.heldpkmn = nil : screen.storage.pbDelete(pkmnid[0], pkmnid[1])