Files
infinitefusion-e18/Data/Scripts/016_UI/006_UI_Summary.rb
2022-09-24 09:45:22 -04:00

1424 lines
50 KiB
Ruby

#===============================================================================
#
#===============================================================================
class MoveSelectionSprite < SpriteWrapper
attr_reader :preselected
attr_reader :index
def initialize(viewport = nil, fifthmove = false)
super(viewport)
@movesel = AnimatedBitmap.new("Graphics/Pictures/Summary/cursor_move")
@frame = 0
@index = 0
@fifthmove = fifthmove
@preselected = false
@updating = false
refresh
end
def dispose
@movesel.dispose
super
end
def index=(value)
@index = value
refresh
end
def preselected=(value)
@preselected = value
refresh
end
def refresh
w = @movesel.width
h = @movesel.height / 2
self.x = 240
self.y = 92 + (self.index * 64)
self.y -= 76 if @fifthmove
self.y += 20 if @fifthmove && self.index == Pokemon::MAX_MOVES # Add a gap
self.bitmap = @movesel.bitmap
if self.preselected
self.src_rect.set(0, h, w, h)
else
self.src_rect.set(0, 0, w, h)
end
end
def update
@updating = true
super
@movesel.update
@updating = false
refresh
end
end
#===============================================================================
#
#===============================================================================
class RibbonSelectionSprite < MoveSelectionSprite
def initialize(viewport = nil)
super(viewport)
@movesel = AnimatedBitmap.new("Graphics/Pictures/Summary/cursor_ribbon")
@frame = 0
@index = 0
@preselected = false
@updating = false
@spriteVisible = true
refresh
end
def visible=(value)
super
@spriteVisible = value if !@updating
end
def refresh
w = @movesel.width
h = @movesel.height / 2
self.x = 228 + (self.index % 4) * 68
self.y = 76 + ((self.index / 4).floor * 68)
self.bitmap = @movesel.bitmap
if self.preselected
self.src_rect.set(0, h, w, h)
else
self.src_rect.set(0, 0, w, h)
end
end
def update
@updating = true
super
self.visible = @spriteVisible && @index >= 0 && @index < 12
@movesel.update
@updating = false
refresh
end
end
#===============================================================================
#
#===============================================================================
class PokemonSummary_Scene
def pbUpdate
pbUpdateSpriteHash(@sprites)
end
def pbStartScene(party, partyindex, inbattle = false)
@viewport = Viewport.new(0, 0, Graphics.width, Graphics.height)
@viewport.z = 99999
@party = party
@partyindex = partyindex
@pokemon = @party[@partyindex]
@inbattle = inbattle
@page = 1
@typebitmap = AnimatedBitmap.new(_INTL("Graphics/Pictures/types"))
@markingbitmap = AnimatedBitmap.new("Graphics/Pictures/Summary/markings")
@sprites = {}
@sprites["background"] = IconSprite.new(0, 0, @viewport)
@sprites["pokemon"] = PokemonSprite.new(@viewport)
@sprites["pokemon"].setOffset(PictureOrigin::Center)
@sprites["pokemon"].x = 104
@sprites["pokemon"].y = 206
@sprites["pokemon"].setPokemonBitmap(@pokemon)
if @pokemon.egg?
@sprites["pokemon"].zoom_x = Settings::EGGSPRITE_SCALE
@sprites["pokemon"].zoom_y = Settings::EGGSPRITE_SCALE
else
@sprites["pokemon"].zoom_x = Settings::FRONTSPRITE_SCALE
@sprites["pokemon"].zoom_y = Settings::FRONTSPRITE_SCALE
end
@sprites["pokeicon"] = PokemonIconSprite.new(@pokemon, @viewport)
@sprites["pokeicon"].setOffset(PictureOrigin::Center)
@sprites["pokeicon"].x = 46
@sprites["pokeicon"].y = 92
@sprites["pokeicon"].visible = false
@sprites["itemicon"] = ItemIconSprite.new(30, 320, @pokemon.item_id, @viewport)
@sprites["itemicon"].blankzero = true
@sprites["overlay"] = BitmapSprite.new(Graphics.width, Graphics.height, @viewport)
pbSetSystemFont(@sprites["overlay"].bitmap)
@sprites["movepresel"] = MoveSelectionSprite.new(@viewport)
@sprites["movepresel"].visible = false
@sprites["movepresel"].preselected = true
@sprites["movesel"] = MoveSelectionSprite.new(@viewport)
@sprites["movesel"].visible = false
@sprites["ribbonpresel"] = RibbonSelectionSprite.new(@viewport)
@sprites["ribbonpresel"].visible = false
@sprites["ribbonpresel"].preselected = true
@sprites["ribbonsel"] = RibbonSelectionSprite.new(@viewport)
@sprites["ribbonsel"].visible = false
@sprites["uparrow"] = AnimatedSprite.new("Graphics/Pictures/uparrow", 8, 28, 40, 2, @viewport)
@sprites["uparrow"].x = 350
@sprites["uparrow"].y = 56
@sprites["uparrow"].play
@sprites["uparrow"].visible = false
@sprites["downarrow"] = AnimatedSprite.new("Graphics/Pictures/downarrow", 8, 28, 40, 2, @viewport)
@sprites["downarrow"].x = 350
@sprites["downarrow"].y = 260
@sprites["downarrow"].play
@sprites["downarrow"].visible = false
@sprites["markingbg"] = IconSprite.new(260, 88, @viewport)
@sprites["markingbg"].setBitmap("Graphics/Pictures/Summary/overlay_marking")
@sprites["markingbg"].visible = false
@sprites["markingoverlay"] = BitmapSprite.new(Graphics.width, Graphics.height, @viewport)
@sprites["markingoverlay"].visible = false
pbSetSystemFont(@sprites["markingoverlay"].bitmap)
@sprites["markingsel"] = IconSprite.new(0, 0, @viewport)
@sprites["markingsel"].setBitmap("Graphics/Pictures/Summary/cursor_marking")
@sprites["markingsel"].src_rect.height = @sprites["markingsel"].bitmap.height / 2
@sprites["markingsel"].visible = false
@sprites["messagebox"] = Window_AdvancedTextPokemon.new("")
@sprites["messagebox"].viewport = @viewport
@sprites["messagebox"].visible = false
@sprites["messagebox"].letterbyletter = true
pbBottomLeftLines(@sprites["messagebox"], 2)
drawPage(@page)
pbFadeInAndShow(@sprites) { pbUpdate }
end
def pbStartForgetScene(party, partyindex, move_to_learn)
@viewport = Viewport.new(0, 0, Graphics.width, Graphics.height)
@viewport.z = 99999
@party = party
@partyindex = partyindex
@pokemon = @party[@partyindex]
@page = 4
@typebitmap = AnimatedBitmap.new(_INTL("Graphics/Pictures/types"))
@sprites = {}
@sprites["background"] = IconSprite.new(0, 0, @viewport)
@sprites["overlay"] = BitmapSprite.new(Graphics.width, Graphics.height, @viewport)
pbSetSystemFont(@sprites["overlay"].bitmap)
@sprites["pokeicon"] = PokemonIconSprite.new(@pokemon, @viewport)
@sprites["pokeicon"].setOffset(PictureOrigin::Center)
@sprites["pokeicon"].x = 46
@sprites["pokeicon"].y = 92
@sprites["movesel"] = MoveSelectionSprite.new(@viewport, !move_to_learn.nil?)
@sprites["movesel"].visible = false
@sprites["movesel"].visible = true
@sprites["movesel"].index = 0
new_move = (move_to_learn) ? Pokemon::Move.new(move_to_learn) : nil
drawSelectedMove(new_move, @pokemon.moves[0])
pbFadeInAndShow(@sprites)
end
def pbEndScene
pbFadeOutAndHide(@sprites) { pbUpdate }
pbDisposeSpriteHash(@sprites)
@typebitmap.dispose
@markingbitmap.dispose if @markingbitmap
@viewport.dispose
end
def pbDisplay(text)
@sprites["messagebox"].text = text
@sprites["messagebox"].visible = true
pbPlayDecisionSE()
loop do
Graphics.update
Input.update
pbUpdate
if @sprites["messagebox"].busy?
if Input.trigger?(Input::USE)
pbPlayDecisionSE() if @sprites["messagebox"].pausing?
@sprites["messagebox"].resume
end
elsif Input.trigger?(Input::USE) || Input.trigger?(Input::BACK)
break
end
end
@sprites["messagebox"].visible = false
end
def pbConfirm(text)
ret = -1
@sprites["messagebox"].text = text
@sprites["messagebox"].visible = true
using(cmdwindow = Window_CommandPokemon.new([_INTL("Yes"), _INTL("No")])) {
cmdwindow.z = @viewport.z + 1
cmdwindow.visible = false
pbBottomRight(cmdwindow)
cmdwindow.y -= @sprites["messagebox"].height
loop do
Graphics.update
Input.update
cmdwindow.visible = true if !@sprites["messagebox"].busy?
cmdwindow.update
pbUpdate
if !@sprites["messagebox"].busy?
if Input.trigger?(Input::BACK)
ret = false
break
elsif Input.trigger?(Input::USE) && @sprites["messagebox"].resume
ret = (cmdwindow.index == 0)
break
end
end
end
}
@sprites["messagebox"].visible = false
return ret
end
def pbShowCommands(commands, index = 0)
ret = -1
using(cmdwindow = Window_CommandPokemon.new(commands)) {
cmdwindow.z = @viewport.z + 1
cmdwindow.index = index
pbBottomRight(cmdwindow)
loop do
Graphics.update
Input.update
cmdwindow.update
pbUpdate
if Input.trigger?(Input::BACK)
pbPlayCancelSE
ret = -1
break
elsif Input.trigger?(Input::USE)
pbPlayDecisionSE
ret = cmdwindow.index
break
end
end
}
return ret
end
def drawMarkings(bitmap, x, y)
markings = @pokemon.markings
markrect = Rect.new(0, 0, 16, 16)
for i in 0...6
markrect.x = i * 16
markrect.y = (markings & (1 << i) != 0) ? 16 : 0
bitmap.blt(x + i * 16, y, @markingbitmap.bitmap, markrect)
end
end
def drawPage(page)
if @pokemon.egg?
drawPageOneEgg
return
end
@sprites["itemicon"].item = @pokemon.item_id
overlay = @sprites["overlay"].bitmap
overlay.clear
base = Color.new(248, 248, 248)
shadow = Color.new(104, 104, 104)
# Set background image
@sprites["background"].setBitmap("Graphics/Pictures/Summary/bg_#{page}")
imagepos = []
# Show the Poké Ball containing the Pokémon
ballimage = sprintf("Graphics/Pictures/Summary/icon_ball_%s", @pokemon.poke_ball)
if !pbResolveBitmap(ballimage)
ballimage = sprintf("Graphics/Pictures/Summary/icon_ball_%02d", pbGetBallType(@pokemon.poke_ball))
end
imagepos.push([ballimage, 14, 60])
# Show status/fainted/Pokérus infected icon
status = 0
if @pokemon.fainted?
status = GameData::Status::DATA.keys.length / 2
elsif @pokemon.status != :NONE
status = GameData::Status.get(@pokemon.status).id_number
elsif @pokemon.pokerusStage == 1
status = GameData::Status::DATA.keys.length / 2 + 1
end
status -= 1
if status >= 0
imagepos.push(["Graphics/Pictures/statuses", 124, 100, 0, 16 * status, 44, 16])
end
# Show Pokérus cured icon
if @pokemon.pokerusStage == 2
imagepos.push([sprintf("Graphics/Pictures/Summary/icon_pokerus"), 176, 100])
end
# Show shininess star
if @pokemon.shiny?
imagepos.push([sprintf("Graphics/Pictures/shiny"), 2, 134])
end
# Draw all images
pbDrawImagePositions(overlay, imagepos)
# Write various bits of text
pagename = [_INTL("INFO"),
_INTL("TRAINER MEMO"),
_INTL("SKILLS"),
_INTL("MOVES"),
_INTL("RIBBONS")][page - 1]
textpos = [
[pagename, 26, 10, 0, base, shadow],
[@pokemon.name, 46, 56, 0, base, shadow],
[@pokemon.level.to_s, 46, 86, 0, Color.new(64, 64, 64), Color.new(176, 176, 176)],
[_INTL("Item"), 66, 312, 0, base, shadow]
]
# Write the held item's name
if @pokemon.hasItem?
textpos.push([@pokemon.item.name, 16, 346, 0, Color.new(64, 64, 64), Color.new(176, 176, 176)])
else
textpos.push([_INTL("None"), 16, 346, 0, Color.new(192, 200, 208), Color.new(208, 216, 224)])
end
# Write the gender symbol
if @pokemon.male?
textpos.push([_INTL(""), 178, 56, 0, Color.new(24, 112, 216), Color.new(136, 168, 208)])
elsif @pokemon.female?
textpos.push([_INTL(""), 178, 56, 0, Color.new(248, 56, 32), Color.new(224, 152, 144)])
end
# Draw all text
pbDrawTextPositions(overlay, textpos)
# Draw the Pokémon's markings
drawMarkings(overlay, 84, 292)
# Draw page-specific information
case page
when 1 then
drawPageOne
when 2 then
drawPageTwo
when 3 then
drawPageThree
when 4 then
drawPageFour
when 5 then
drawPageFive
end
end
def drawPageOne
overlay = @sprites["overlay"].bitmap
base = Color.new(248, 248, 248)
shadow = Color.new(104, 104, 104)
dexNumBase = (@pokemon.shiny?) ? Color.new(248, 56, 32) : Color.new(64, 64, 64)
dexNumShadow = (@pokemon.shiny?) ? Color.new(224, 152, 144) : Color.new(176, 176, 176)
# If a Shadow Pokémon, draw the heart gauge area and bar
if @pokemon.shadowPokemon?
shadowfract = @pokemon.heart_gauge.to_f / Pokemon::HEART_GAUGE_SIZE
imagepos = [
["Graphics/Pictures/Summary/overlay_shadow", 224, 240],
["Graphics/Pictures/Summary/overlay_shadowbar", 242, 280, 0, 0, (shadowfract * 248).floor, -1]
]
pbDrawImagePositions(overlay, imagepos)
end
# Write various bits of text
textpos = [
[_INTL("Dex No."), 238, 74, 0, base, shadow],
[_INTL("Species"), 238, 106, 0, base, shadow],
[@pokemon.speciesName, 435, 106, 2, Color.new(64, 64, 64), Color.new(176, 176, 176)],
[_INTL("Type"), 238, 138, 0, base, shadow],
[_INTL("OT"), 238, 170, 0, base, shadow],
[_INTL("ID No."), 238, 202, 0, base, shadow],
]
# Write the Regional/National Dex number
dexnum = GameData::Species.get(@pokemon.species).id_number
dexnumshift = false
# if $Trainer.pokedex.unlocked?(-1) # National Dex is unlocked
# dexnumshift = true if Settings::DEXES_WITH_OFFSETS.include?(-1)
# else
# dexnum = 0
# for i in 0...$Trainer.pokedex.dexes_count - 1
# next if !$Trainer.pokedex.unlocked?(i)
# num = pbGetRegionalNumber(i,@pokemon.species)
# next if num<=0
# dexnum = num
# dexnumshift = true if Settings::DEXES_WITH_OFFSETS.include?(i)
# break
# end
# end
# if dexnum <= 0
# textpos.push(["???", 435, 74, 2, dexNumBase, dexNumShadow])
# else
# dexnum -= 1 if dexnumshift
# textpos.push([sprintf("%03d", dexnum), 435, 74, 2, dexNumBase, dexNumShadow])
# end
# Write Original Trainer's name and ID number
if @pokemon.owner.name.empty?
textpos.push([_INTL("RENTAL"), 435, 170, 2, Color.new(64, 64, 64), Color.new(176, 176, 176)])
textpos.push(["?????", 435, 202, 2, Color.new(64, 64, 64), Color.new(176, 176, 176)])
else
ownerbase = Color.new(64, 64, 64)
ownershadow = Color.new(176, 176, 176)
case @pokemon.owner.gender
when 0
ownerbase = Color.new(24, 112, 216)
ownershadow = Color.new(136, 168, 208)
when 1
ownerbase = Color.new(248, 56, 32)
ownershadow = Color.new(224, 152, 144)
end
textpos.push([@pokemon.owner.name, 435, 170, 2, ownerbase, ownershadow])
textpos.push([sprintf("%05d", @pokemon.owner.public_id), 435, 202, 2, Color.new(64, 64, 64), Color.new(176, 176, 176)])
end
# Write Exp text OR heart gauge message (if a Shadow Pokémon)
if @pokemon.shadowPokemon?
textpos.push([_INTL("Heart Gauge"), 238, 234, 0, base, shadow])
heartmessage = [_INTL("The door to its heart is open! Undo the final lock!"),
_INTL("The door to its heart is almost fully open."),
_INTL("The door to its heart is nearly open."),
_INTL("The door to its heart is opening wider."),
_INTL("The door to its heart is opening up."),
_INTL("The door to its heart is tightly shut.")][@pokemon.heartStage]
memo = sprintf("<c3=404040,B0B0B0>%s\n", heartmessage)
drawFormattedTextEx(overlay, 234, 304, 264, memo)
else
endexp = @pokemon.growth_rate.minimum_exp_for_level(@pokemon.level + 1)
textpos.push([_INTL("Exp. Points"), 238, 234, 0, base, shadow])
textpos.push([@pokemon.exp.to_s_formatted, 488, 266, 1, Color.new(64, 64, 64), Color.new(176, 176, 176)])
textpos.push([_INTL("To Next Lv."), 238, 298, 0, base, shadow])
textpos.push([(endexp - @pokemon.exp).to_s_formatted, 488, 330, 1, Color.new(64, 64, 64), Color.new(176, 176, 176)])
end
# Draw all text
pbDrawTextPositions(overlay, textpos)
# Draw Pokémon type(s)
type1_number = GameData::Type.get(@pokemon.type1).id_number
type2_number = GameData::Type.get(@pokemon.type2).id_number
type1rect = Rect.new(0, type1_number * 28, 64, 28)
type2rect = Rect.new(0, type2_number * 28, 64, 28)
if @pokemon.type1 == @pokemon.type2
overlay.blt(402, 146, @typebitmap.bitmap, type1rect)
else
overlay.blt(370, 146, @typebitmap.bitmap, type1rect)
overlay.blt(436, 146, @typebitmap.bitmap, type2rect)
end
# Draw Exp bar
if @pokemon.level < GameData::GrowthRate.max_level
w = @pokemon.exp_fraction * 128
w = ((w / 2).round) * 2
pbDrawImagePositions(overlay, [
["Graphics/Pictures/Summary/overlay_exp", 362, 372, 0, 0, w, 6]
])
end
end
def drawPageOneEgg
@sprites["itemicon"].item = @pokemon.item_id
overlay = @sprites["overlay"].bitmap
overlay.clear
base = Color.new(248, 248, 248)
shadow = Color.new(104, 104, 104)
# Set background image
@sprites["background"].setBitmap("Graphics/Pictures/Summary/bg_egg")
imagepos = []
# Show the Poké Ball containing the Pokémon
ballimage = sprintf("Graphics/Pictures/Summary/icon_ball_%s", @pokemon.poke_ball)
if !pbResolveBitmap(ballimage)
ballimage = sprintf("Graphics/Pictures/Summary/icon_ball_%02d", pbGetBallType(@pokemon.poke_ball))
end
imagepos.push([ballimage, 14, 60])
# Draw all images
pbDrawImagePositions(overlay, imagepos)
# Write various bits of text
textpos = [
[_INTL("TRAINER MEMO"), 26, 10, 0, base, shadow],
[@pokemon.name, 46, 56, 0, base, shadow],
[_INTL("Item"), 66, 312, 0, base, shadow]
]
# Write the held item's name
if @pokemon.hasItem?
textpos.push([@pokemon.item.name, 16, 346, 0, Color.new(64, 64, 64), Color.new(176, 176, 176)])
else
textpos.push([_INTL("None"), 16, 346, 0, Color.new(192, 200, 208), Color.new(208, 216, 224)])
end
# Draw all text
pbDrawTextPositions(overlay, textpos)
memo = ""
# Write date received
if @pokemon.timeReceived
date = @pokemon.timeReceived.day
month = pbGetMonthName(@pokemon.timeReceived.mon)
year = @pokemon.timeReceived.year
memo += _INTL("<c3=404040,B0B0B0>{1} {2}, {3}\n", date, month, year)
end
# Write map name egg was received on
mapname = pbGetMapNameFromId(@pokemon.obtain_map)
mapname = @pokemon.obtain_text if @pokemon.obtain_text && !@pokemon.obtain_text.empty?
if mapname && mapname != ""
memo += _INTL("<c3=404040,B0B0B0>A mysterious Pokémon Egg received from <c3=F83820,E09890>{1}<c3=404040,B0B0B0>.\n", mapname)
else
memo += _INTL("<c3=404040,B0B0B0>A mysterious Pokémon Egg.\n", mapname)
end
memo += "\n" # Empty line
# Write Egg Watch blurb
memo += _INTL("<c3=404040,B0B0B0>\"The Egg Watch\"\n")
eggstate = _INTL("It looks like this Egg will take a long time to hatch.")
eggstate = _INTL("What will hatch from this? It doesn't seem close to hatching.") if @pokemon.steps_to_hatch < 10200
eggstate = _INTL("It appears to move occasionally. It may be close to hatching.") if @pokemon.steps_to_hatch < 2550
eggstate = _INTL("Sounds can be heard coming from inside! It will hatch soon!") if @pokemon.steps_to_hatch < 1275
memo += sprintf("<c3=404040,B0B0B0>%s\n", eggstate)
# Draw all text
drawFormattedTextEx(overlay, 232, 82, 268, memo)
# Draw the Pokémon's markings
drawMarkings(overlay, 84, 292)
end
def drawPageTwo
overlay = @sprites["overlay"].bitmap
memo = ""
# Write nature
showNature = !@pokemon.shadowPokemon? || @pokemon.heartStage > 3
if showNature
natureName = @pokemon.nature.name
memo += _INTL("<c3=F83820,E09890>{1}<c3=404040,B0B0B0> nature.\n", natureName)
end
# Write date received
if @pokemon.timeReceived
date = @pokemon.timeReceived.day
month = pbGetMonthName(@pokemon.timeReceived.mon)
year = @pokemon.timeReceived.year
memo += _INTL("<c3=404040,B0B0B0>{1} {2}, {3}\n", date, month, year)
end
# Write map name Pokémon was received on
mapname = pbGetMapNameFromId(@pokemon.obtain_map)
mapname = @pokemon.obtain_text if @pokemon.obtain_text && !@pokemon.obtain_text.empty?
mapname = _INTL("Faraway place") if nil_or_empty?(mapname)
memo += sprintf("<c3=F83820,E09890>%s\n", mapname)
# Write how Pokémon was obtained
mettext = [_INTL("Met at Lv. {1}.", @pokemon.obtain_level),
_INTL("Egg received."),
_INTL("Traded at Lv. {1}.", @pokemon.obtain_level),
"",
_INTL("Had a fateful encounter at Lv. {1}.", @pokemon.obtain_level)
][@pokemon.obtain_method]
memo += sprintf("<c3=404040,B0B0B0>%s\n", mettext) if mettext && mettext != ""
# If Pokémon was hatched, write when and where it hatched
if @pokemon.obtain_method == 1
if @pokemon.timeEggHatched
date = @pokemon.timeEggHatched.day
month = pbGetMonthName(@pokemon.timeEggHatched.mon)
year = @pokemon.timeEggHatched.year
memo += _INTL("<c3=404040,B0B0B0>{1} {2}, {3}\n", date, month, year)
end
mapname = pbGetMapNameFromId(@pokemon.hatched_map)
mapname = _INTL("Faraway place") if nil_or_empty?(mapname)
memo += sprintf("<c3=F83820,E09890>%s\n", mapname)
memo += _INTL("<c3=404040,B0B0B0>Egg hatched.\n")
else
memo += "\n" # Empty line
end
# Write characteristic
if showNature
best_stat = nil
best_iv = 0
stats_order = [:HP, :ATTACK, :DEFENSE, :SPEED, :SPECIAL_ATTACK, :SPECIAL_DEFENSE]
start_point = @pokemon.personalID % stats_order.length # Tiebreaker
for i in 0...stats_order.length
stat = stats_order[(i + start_point) % stats_order.length]
if !best_stat || @pokemon.iv[stat] > @pokemon.iv[best_stat]
best_stat = stat
best_iv = @pokemon.iv[best_stat]
end
end
characteristics = {
:HP => [_INTL("Loves to eat."),
_INTL("Takes plenty of siestas."),
_INTL("Nods off a lot."),
_INTL("Scatters things often."),
_INTL("Likes to relax.")],
:ATTACK => [_INTL("Proud of its power."),
_INTL("Likes to thrash about."),
_INTL("A little quick tempered."),
_INTL("Likes to fight."),
_INTL("Quick tempered.")],
:DEFENSE => [_INTL("Sturdy body."),
_INTL("Capable of taking hits."),
_INTL("Highly persistent."),
_INTL("Good endurance."),
_INTL("Good perseverance.")],
:SPECIAL_ATTACK => [_INTL("Highly curious."),
_INTL("Mischievous."),
_INTL("Thoroughly cunning."),
_INTL("Often lost in thought."),
_INTL("Very finicky.")],
:SPECIAL_DEFENSE => [_INTL("Strong willed."),
_INTL("Somewhat vain."),
_INTL("Strongly defiant."),
_INTL("Hates to lose."),
_INTL("Somewhat stubborn.")],
:SPEED => [_INTL("Likes to run."),
_INTL("Alert to sounds."),
_INTL("Impetuous and silly."),
_INTL("Somewhat of a clown."),
_INTL("Quick to flee.")]
}
memo += sprintf("<c3=404040,B0B0B0>%s\n", characteristics[best_stat][best_iv % 5])
end
# Write all text
drawFormattedTextEx(overlay, 232, 82, 268, memo)
end
def drawPageThree
overlay = @sprites["overlay"].bitmap
base = Color.new(248, 248, 248)
shadow = Color.new(104, 104, 104)
# Determine which stats are boosted and lowered by the Pokémon's nature
statshadows = {}
GameData::Stat.each_main { |s| statshadows[s.id] = shadow }
if !@pokemon.shadowPokemon? || @pokemon.heartStage > 3
@pokemon.nature_for_stats.stat_changes.each do |change|
statshadows[change[0]] = Color.new(136, 96, 72) if change[1] > 0
statshadows[change[0]] = Color.new(64, 120, 152) if change[1] < 0
end
end
# Write various bits of text
textpos = [
[_INTL("HP"), 292, 70, 2, base, statshadows[:HP]],
[sprintf("%d/%d", @pokemon.hp, @pokemon.totalhp), 462, 70, 1, Color.new(64, 64, 64), Color.new(176, 176, 176)],
[_INTL("Attack"), 248, 114, 0, base, statshadows[:ATTACK]],
[sprintf("%d", @pokemon.attack), 456, 114, 1, Color.new(64, 64, 64), Color.new(176, 176, 176)],
[_INTL("Defense"), 248, 146, 0, base, statshadows[:DEFENSE]],
[sprintf("%d", @pokemon.defense), 456, 146, 1, Color.new(64, 64, 64), Color.new(176, 176, 176)],
[_INTL("Sp. Atk"), 248, 178, 0, base, statshadows[:SPECIAL_ATTACK]],
[sprintf("%d", @pokemon.spatk), 456, 178, 1, Color.new(64, 64, 64), Color.new(176, 176, 176)],
[_INTL("Sp. Def"), 248, 210, 0, base, statshadows[:SPECIAL_DEFENSE]],
[sprintf("%d", @pokemon.spdef), 456, 210, 1, Color.new(64, 64, 64), Color.new(176, 176, 176)],
[_INTL("Speed"), 248, 242, 0, base, statshadows[:SPEED]],
[sprintf("%d", @pokemon.speed), 456, 242, 1, Color.new(64, 64, 64), Color.new(176, 176, 176)],
[_INTL("Ability"), 224, 278, 0, base, shadow]
]
# Draw ability name and description
ability = @pokemon.ability
if ability
textpos.push([ability.name, 362, 278, 0, Color.new(64, 64, 64), Color.new(176, 176, 176)])
drawTextEx(overlay, 224, 320, 282, 2, ability.description, Color.new(64, 64, 64), Color.new(176, 176, 176))
end
# Draw all text
pbDrawTextPositions(overlay, textpos)
# Draw HP bar
if @pokemon.hp > 0
w = @pokemon.hp * 96 * 1.0 / @pokemon.totalhp
w = 1 if w < 1
w = ((w / 2).round) * 2
hpzone = 0
hpzone = 1 if @pokemon.hp <= (@pokemon.totalhp / 2).floor
hpzone = 2 if @pokemon.hp <= (@pokemon.totalhp / 4).floor
imagepos = [
["Graphics/Pictures/Summary/overlay_hp", 360, 110, 0, hpzone * 6, w, 6]
]
pbDrawImagePositions(overlay, imagepos)
end
end
def drawPageFour
overlay = @sprites["overlay"].bitmap
moveBase = Color.new(64, 64, 64)
moveShadow = Color.new(176, 176, 176)
ppBase = [moveBase, # More than 1/2 of total PP
Color.new(248, 192, 0), # 1/2 of total PP or less
Color.new(248, 136, 32), # 1/4 of total PP or less
Color.new(248, 72, 72)] # Zero PP
ppShadow = [moveShadow, # More than 1/2 of total PP
Color.new(144, 104, 0), # 1/2 of total PP or less
Color.new(144, 72, 24), # 1/4 of total PP or less
Color.new(136, 48, 48)] # Zero PP
@sprites["pokemon"].visible = true
@sprites["pokeicon"].visible = false
@sprites["itemicon"].visible = true
textpos = []
imagepos = []
# Write move names, types and PP amounts for each known move
yPos = 92
for i in 0...Pokemon::MAX_MOVES
move = @pokemon.moves[i]
if move
type_number = GameData::Type.get(move.type).id_number
imagepos.push(["Graphics/Pictures/types", 248, yPos + 8, 0, type_number * 28, 64, 28])
textpos.push([move.name, 316, yPos, 0, moveBase, moveShadow])
if move.total_pp > 0
textpos.push([_INTL("PP"), 342, yPos + 32, 0, moveBase, moveShadow])
ppfraction = 0
if move.pp == 0;
ppfraction = 3
elsif move.pp * 4 <= move.total_pp;
ppfraction = 2
elsif move.pp * 2 <= move.total_pp;
ppfraction = 1
end
textpos.push([sprintf("%d/%d", move.pp, move.total_pp), 460, yPos + 32, 1, ppBase[ppfraction], ppShadow[ppfraction]])
end
else
textpos.push(["-", 316, yPos, 0, moveBase, moveShadow])
textpos.push(["--", 442, yPos + 32, 1, moveBase, moveShadow])
end
yPos += 64
end
# Draw all text and images
pbDrawTextPositions(overlay, textpos)
pbDrawImagePositions(overlay, imagepos)
end
def drawPageFourSelecting(move_to_learn)
overlay = @sprites["overlay"].bitmap
overlay.clear
base = Color.new(248, 248, 248)
shadow = Color.new(104, 104, 104)
moveBase = Color.new(64, 64, 64)
moveShadow = Color.new(176, 176, 176)
ppBase = [moveBase, # More than 1/2 of total PP
Color.new(248, 192, 0), # 1/2 of total PP or less
Color.new(248, 136, 32), # 1/4 of total PP or less
Color.new(248, 72, 72)] # Zero PP
ppShadow = [moveShadow, # More than 1/2 of total PP
Color.new(144, 104, 0), # 1/2 of total PP or less
Color.new(144, 72, 24), # 1/4 of total PP or less
Color.new(136, 48, 48)] # Zero PP
# Set background image
if move_to_learn
@sprites["background"].setBitmap("Graphics/Pictures/Summary/bg_learnmove")
else
@sprites["background"].setBitmap("Graphics/Pictures/Summary/bg_movedetail")
end
# Write various bits of text
textpos = [
[_INTL("MOVES"), 26, 10, 0, base, shadow],
[_INTL("CATEGORY"), 20, 116, 0, base, shadow],
[_INTL("POWER"), 20, 148, 0, base, shadow],
[_INTL("ACCURACY"), 20, 180, 0, base, shadow]
]
imagepos = []
# Write move names, types and PP amounts for each known move
yPos = 92
yPos -= 76 if move_to_learn
limit = (move_to_learn) ? Pokemon::MAX_MOVES + 1 : Pokemon::MAX_MOVES
for i in 0...limit
move = @pokemon.moves[i]
if i == Pokemon::MAX_MOVES
move = move_to_learn
yPos += 20
end
if move
type_number = GameData::Type.get(move.type).id_number
imagepos.push(["Graphics/Pictures/types", 248, yPos + 8, 0, type_number * 28, 64, 28])
textpos.push([move.name, 316, yPos, 0, moveBase, moveShadow])
if move.total_pp > 0
textpos.push([_INTL("PP"), 342, yPos + 32, 0, moveBase, moveShadow])
ppfraction = 0
if move.pp == 0;
ppfraction = 3
elsif move.pp * 4 <= move.total_pp;
ppfraction = 2
elsif move.pp * 2 <= move.total_pp;
ppfraction = 1
end
textpos.push([sprintf("%d/%d", move.pp, move.total_pp), 460, yPos + 32, 1, ppBase[ppfraction], ppShadow[ppfraction]])
end
else
textpos.push(["-", 316, yPos, 0, moveBase, moveShadow])
textpos.push(["--", 442, yPos + 32, 1, moveBase, moveShadow])
end
yPos += 64
end
# Draw all text and images
pbDrawTextPositions(overlay, textpos)
pbDrawImagePositions(overlay, imagepos)
# Draw Pokémon's type icon(s)
type1_number = GameData::Type.get(@pokemon.type1).id_number
type2_number = GameData::Type.get(@pokemon.type2).id_number
type1rect = Rect.new(0, type1_number * 28, 64, 28)
type2rect = Rect.new(0, type2_number * 28, 64, 28)
if @pokemon.type1 == @pokemon.type2
overlay.blt(130, 78, @typebitmap.bitmap, type1rect)
else
overlay.blt(96, 78, @typebitmap.bitmap, type1rect)
overlay.blt(166, 78, @typebitmap.bitmap, type2rect)
end
end
def drawSelectedMove(move_to_learn, selected_move)
# Draw all of page four, except selected move's details
drawPageFourSelecting(move_to_learn)
# Set various values
overlay = @sprites["overlay"].bitmap
base = Color.new(64, 64, 64)
shadow = Color.new(176, 176, 176)
@sprites["pokemon"].visible = false if @sprites["pokemon"]
@sprites["pokeicon"].pokemon = @pokemon
@sprites["pokeicon"].visible = true
@sprites["itemicon"].visible = false if @sprites["itemicon"]
textpos = []
# Write power and accuracy values for selected move
case selected_move.base_damage
when 0 then
textpos.push(["---", 216, 148, 1, base, shadow]) # Status move
when 1 then
textpos.push(["???", 216, 148, 1, base, shadow]) # Variable power move
else
textpos.push([selected_move.base_damage.to_s, 216, 148, 1, base, shadow])
end
if selected_move.accuracy == 0
textpos.push(["---", 216, 180, 1, base, shadow])
else
textpos.push(["#{selected_move.accuracy}%", 216 + overlay.text_size("%").width, 180, 1, base, shadow])
end
# Draw all text
pbDrawTextPositions(overlay, textpos)
# Draw selected move's damage category icon
imagepos = [["Graphics/Pictures/category", 166, 124, 0, selected_move.category * 28, 64, 28]]
pbDrawImagePositions(overlay, imagepos)
# Draw selected move's description
drawTextEx(overlay, 4, 222, 230, 5, selected_move.description, base, shadow)
end
def drawPageFive
overlay = @sprites["overlay"].bitmap
@sprites["uparrow"].visible = false
@sprites["downarrow"].visible = false
# Write various bits of text
textpos = [
[_INTL("No. of Ribbons:"), 234, 326, 0, Color.new(64, 64, 64), Color.new(176, 176, 176)],
[@pokemon.numRibbons.to_s, 450, 326, 1, Color.new(64, 64, 64), Color.new(176, 176, 176)],
]
# Draw all text
pbDrawTextPositions(overlay, textpos)
# Show all ribbons
imagepos = []
coord = 0
for i in @ribbonOffset * 4...@ribbonOffset * 4 + 12
break if !@pokemon.ribbons[i]
ribbon_data = GameData::Ribbon.get(@pokemon.ribbons[i])
ribn = ribbon_data.id_number - 1
imagepos.push(["Graphics/Pictures/ribbons",
230 + 68 * (coord % 4), 78 + 68 * (coord / 4).floor,
64 * (ribn % 8), 64 * (ribn / 8).floor, 64, 64])
coord += 1
end
# Draw all images
pbDrawImagePositions(overlay, imagepos)
end
def drawSelectedRibbon(ribbonid)
# Draw all of page five
drawPage(5)
# Set various values
overlay = @sprites["overlay"].bitmap
base = Color.new(64, 64, 64)
shadow = Color.new(176, 176, 176)
nameBase = Color.new(248, 248, 248)
nameShadow = Color.new(104, 104, 104)
# Get data for selected ribbon
name = ribbonid ? GameData::Ribbon.get(ribbonid).name : ""
desc = ribbonid ? GameData::Ribbon.get(ribbonid).description : ""
# Draw the description box
imagepos = [
["Graphics/Pictures/Summary/overlay_ribbon", 8, 280]
]
pbDrawImagePositions(overlay, imagepos)
# Draw name of selected ribbon
textpos = [
[name, 18, 280, 0, nameBase, nameShadow]
]
pbDrawTextPositions(overlay, textpos)
# Draw selected ribbon's description
drawTextEx(overlay, 18, 322, 480, 2, desc, base, shadow)
end
def pbGoToPrevious
newindex = @partyindex
while newindex > 0
newindex -= 1
if @party[newindex] && (@page == 1 || !@party[newindex].egg?)
@partyindex = newindex
break
end
end
end
def pbGoToNext
newindex = @partyindex
while newindex < @party.length - 1
newindex += 1
if @party[newindex] && (@page == 1 || !@party[newindex].egg?)
@partyindex = newindex
break
end
end
end
def pbChangePokemon
@pokemon = @party[@partyindex]
@sprites["pokemon"].setPokemonBitmap(@pokemon)
if @pokemon.egg?
@sprites["pokemon"].zoom_x = Settings::EGGSPRITE_SCALE
@sprites["pokemon"].zoom_y = Settings::EGGSPRITE_SCALE
else
@sprites["pokemon"].zoom_x = Settings::FRONTSPRITE_SCALE
@sprites["pokemon"].zoom_y = Settings::FRONTSPRITE_SCALE
end
@sprites["itemicon"].item = @pokemon.item_id
pbSEStop
@pokemon.play_cry
end
def pbMoveSelection
@sprites["movesel"].visible = true
@sprites["movesel"].index = 0
selmove = 0
oldselmove = 0
switching = false
drawSelectedMove(nil, @pokemon.moves[selmove])
loop do
Graphics.update
Input.update
pbUpdate
if @sprites["movepresel"].index == @sprites["movesel"].index
@sprites["movepresel"].z = @sprites["movesel"].z + 1
else
@sprites["movepresel"].z = @sprites["movesel"].z
end
if Input.trigger?(Input::BACK)
(switching) ? pbPlayCancelSE : pbPlayCloseMenuSE
break if !switching
@sprites["movepresel"].visible = false
switching = false
elsif Input.trigger?(Input::USE)
pbPlayDecisionSE
if selmove == Pokemon::MAX_MOVES
break if !switching
@sprites["movepresel"].visible = false
switching = false
else
if !@pokemon.shadowPokemon?
if !switching
@sprites["movepresel"].index = selmove
@sprites["movepresel"].visible = true
oldselmove = selmove
switching = true
else
tmpmove = @pokemon.moves[oldselmove]
@pokemon.moves[oldselmove] = @pokemon.moves[selmove]
@pokemon.moves[selmove] = tmpmove
@sprites["movepresel"].visible = false
switching = false
drawSelectedMove(nil, @pokemon.moves[selmove])
end
end
end
elsif Input.trigger?(Input::UP)
selmove -= 1
if selmove < Pokemon::MAX_MOVES && selmove >= @pokemon.numMoves
selmove = @pokemon.numMoves - 1
end
selmove = 0 if selmove >= Pokemon::MAX_MOVES
selmove = @pokemon.numMoves - 1 if selmove < 0
@sprites["movesel"].index = selmove
pbPlayCursorSE
drawSelectedMove(nil, @pokemon.moves[selmove])
elsif Input.trigger?(Input::DOWN)
selmove += 1
selmove = 0 if selmove < Pokemon::MAX_MOVES && selmove >= @pokemon.numMoves
selmove = 0 if selmove >= Pokemon::MAX_MOVES
selmove = Pokemon::MAX_MOVES if selmove < 0
@sprites["movesel"].index = selmove
pbPlayCursorSE
drawSelectedMove(nil, @pokemon.moves[selmove])
end
end
@sprites["movesel"].visible = false
end
def pbRibbonSelection
@sprites["ribbonsel"].visible = true
@sprites["ribbonsel"].index = 0
selribbon = @ribbonOffset * 4
oldselribbon = selribbon
switching = false
numRibbons = @pokemon.ribbons.length
numRows = [((numRibbons + 3) / 4).floor, 3].max
drawSelectedRibbon(@pokemon.ribbons[selribbon])
loop do
@sprites["uparrow"].visible = (@ribbonOffset > 0)
@sprites["downarrow"].visible = (@ribbonOffset < numRows - 3)
Graphics.update
Input.update
pbUpdate
if @sprites["ribbonpresel"].index == @sprites["ribbonsel"].index
@sprites["ribbonpresel"].z = @sprites["ribbonsel"].z + 1
else
@sprites["ribbonpresel"].z = @sprites["ribbonsel"].z
end
hasMovedCursor = false
if Input.trigger?(Input::BACK)
(switching) ? pbPlayCancelSE : pbPlayCloseMenuSE
break if !switching
@sprites["ribbonpresel"].visible = false
switching = false
elsif Input.trigger?(Input::USE)
if !switching
if @pokemon.ribbons[selribbon]
pbPlayDecisionSE
@sprites["ribbonpresel"].index = selribbon - @ribbonOffset * 4
oldselribbon = selribbon
@sprites["ribbonpresel"].visible = true
switching = true
end
else
pbPlayDecisionSE
tmpribbon = @pokemon.ribbons[oldselribbon]
@pokemon.ribbons[oldselribbon] = @pokemon.ribbons[selribbon]
@pokemon.ribbons[selribbon] = tmpribbon
if @pokemon.ribbons[oldselribbon] || @pokemon.ribbons[selribbon]
@pokemon.ribbons.compact!
if selribbon >= numRibbons
selribbon = numRibbons - 1
hasMovedCursor = true
end
end
@sprites["ribbonpresel"].visible = false
switching = false
drawSelectedRibbon(@pokemon.ribbons[selribbon])
end
elsif Input.trigger?(Input::UP)
selribbon -= 4
selribbon += numRows * 4 if selribbon < 0
hasMovedCursor = true
pbPlayCursorSE
elsif Input.trigger?(Input::DOWN)
selribbon += 4
selribbon -= numRows * 4 if selribbon >= numRows * 4
hasMovedCursor = true
pbPlayCursorSE
elsif Input.trigger?(Input::LEFT)
selribbon -= 1
selribbon += 4 if selribbon % 4 == 3
hasMovedCursor = true
pbPlayCursorSE
elsif Input.trigger?(Input::RIGHT)
selribbon += 1
selribbon -= 4 if selribbon % 4 == 0
hasMovedCursor = true
pbPlayCursorSE
end
if hasMovedCursor
@ribbonOffset = (selribbon / 4).floor if selribbon < @ribbonOffset * 4
@ribbonOffset = (selribbon / 4).floor - 2 if selribbon >= (@ribbonOffset + 3) * 4
@ribbonOffset = 0 if @ribbonOffset < 0
@ribbonOffset = numRows - 3 if @ribbonOffset > numRows - 3
@sprites["ribbonsel"].index = selribbon - @ribbonOffset * 4
@sprites["ribbonpresel"].index = oldselribbon - @ribbonOffset * 4
drawSelectedRibbon(@pokemon.ribbons[selribbon])
end
end
@sprites["ribbonsel"].visible = false
end
def pbMarking(pokemon)
@sprites["markingbg"].visible = true
@sprites["markingoverlay"].visible = true
@sprites["markingsel"].visible = true
base = Color.new(248, 248, 248)
shadow = Color.new(104, 104, 104)
ret = pokemon.markings
markings = pokemon.markings
index = 0
redraw = true
markrect = Rect.new(0, 0, 16, 16)
loop do
# Redraw the markings and text
if redraw
@sprites["markingoverlay"].bitmap.clear
for i in 0...6
markrect.x = i * 16
markrect.y = (markings & (1 << i) != 0) ? 16 : 0
@sprites["markingoverlay"].bitmap.blt(300 + 58 * (i % 3), 154 + 50 * (i / 3), @markingbitmap.bitmap, markrect)
end
textpos = [
[_INTL("Mark {1}", pokemon.name), 366, 90, 2, base, shadow],
[_INTL("OK"), 366, 242, 2, base, shadow],
[_INTL("Cancel"), 366, 292, 2, base, shadow]
]
pbDrawTextPositions(@sprites["markingoverlay"].bitmap, textpos)
redraw = false
end
# Reposition the cursor
@sprites["markingsel"].x = 284 + 58 * (index % 3)
@sprites["markingsel"].y = 144 + 50 * (index / 3)
if index == 6 # OK
@sprites["markingsel"].x = 284
@sprites["markingsel"].y = 244
@sprites["markingsel"].src_rect.y = @sprites["markingsel"].bitmap.height / 2
elsif index == 7 # Cancel
@sprites["markingsel"].x = 284
@sprites["markingsel"].y = 294
@sprites["markingsel"].src_rect.y = @sprites["markingsel"].bitmap.height / 2
else
@sprites["markingsel"].src_rect.y = 0
end
Graphics.update
Input.update
pbUpdate
if Input.trigger?(Input::BACK)
pbPlayCloseMenuSE
break
elsif Input.trigger?(Input::USE)
pbPlayDecisionSE
if index == 6 # OK
ret = markings
break
elsif index == 7 # Cancel
break
else
mask = (1 << index)
if (markings & mask) == 0
markings |= mask
else
markings &= ~mask
end
redraw = true
end
elsif Input.trigger?(Input::UP)
if index == 7;
index = 6
elsif index == 6;
index = 4
elsif index < 3;
index = 7
else
; index -= 3
end
pbPlayCursorSE
elsif Input.trigger?(Input::DOWN)
if index == 7;
index = 1
elsif index == 6;
index = 7
elsif index >= 3;
index = 6
else
; index += 3
end
pbPlayCursorSE
elsif Input.trigger?(Input::LEFT)
if index < 6
index -= 1
index += 3 if index % 3 == 2
pbPlayCursorSE
end
elsif Input.trigger?(Input::RIGHT)
if index < 6
index += 1
index -= 3 if index % 3 == 0
pbPlayCursorSE
end
end
end
@sprites["markingbg"].visible = false
@sprites["markingoverlay"].visible = false
@sprites["markingsel"].visible = false
if pokemon.markings != ret
pokemon.markings = ret
return true
end
return false
end
def pbOptions
dorefresh = false
commands = []
cmdGiveItem = -1
cmdTakeItem = -1
cmdPokedex = -1
cmdMark = -1
if !@pokemon.egg?
if pbBattleChallenge.currentChallenge == -1
commands[cmdGiveItem = commands.length] = _INTL("Give item")
commands[cmdTakeItem = commands.length] = _INTL("Take item") if @pokemon.hasItem?
end
commands[cmdPokedex = commands.length] = _INTL("View Pokédex") if $Trainer.has_pokedex
end
commands[cmdMark = commands.length] = _INTL("Mark")
commands[commands.length] = _INTL("Cancel")
command = pbShowCommands(commands)
if cmdGiveItem >= 0 && command == cmdGiveItem
item = nil
pbFadeOutIn {
scene = PokemonBag_Scene.new
screen = PokemonBagScreen.new(scene, $PokemonBag)
item = screen.pbChooseItemScreen(Proc.new { |itm| GameData::Item.get(itm).can_hold? })
}
if item
dorefresh = pbGiveItemToPokemon(item, @pokemon, self, @partyindex)
end
elsif cmdTakeItem >= 0 && command == cmdTakeItem
dorefresh = pbTakeItemFromPokemon(@pokemon, self)
elsif cmdPokedex >= 0 && command == cmdPokedex
$Trainer.pokedex.register_last_seen(@pokemon)
pbFadeOutIn {
scene = PokemonPokedexInfo_Scene.new
screen = PokemonPokedexInfoScreen.new(scene)
screen.pbStartSceneSingle(@pokemon.species)
}
dorefresh = true
elsif cmdMark >= 0 && command == cmdMark
dorefresh = pbMarking(@pokemon)
end
return dorefresh
end
def pbChooseMoveToForget(move_to_learn)
new_move = (move_to_learn) ? Pokemon::Move.new(move_to_learn) : nil
selmove = 0
maxmove = (new_move) ? Pokemon::MAX_MOVES : Pokemon::MAX_MOVES - 1
loop do
Graphics.update
Input.update
pbUpdate
if Input.trigger?(Input::BACK)
selmove = Pokemon::MAX_MOVES
pbPlayCloseMenuSE if new_move
break
elsif Input.trigger?(Input::USE)
pbPlayDecisionSE
break
elsif Input.trigger?(Input::UP)
selmove -= 1
selmove = maxmove if selmove < 0
if selmove < Pokemon::MAX_MOVES && selmove >= @pokemon.numMoves
selmove = @pokemon.numMoves - 1
end
@sprites["movesel"].index = selmove
selected_move = (selmove == Pokemon::MAX_MOVES) ? new_move : @pokemon.moves[selmove]
drawSelectedMove(new_move, selected_move)
elsif Input.trigger?(Input::DOWN)
selmove += 1
selmove = 0 if selmove > maxmove
if selmove < Pokemon::MAX_MOVES && selmove >= @pokemon.numMoves
selmove = (new_move) ? maxmove : 0
end
@sprites["movesel"].index = selmove
selected_move = (selmove == Pokemon::MAX_MOVES) ? new_move : @pokemon.moves[selmove]
drawSelectedMove(new_move, selected_move)
end
end
return (selmove == Pokemon::MAX_MOVES) ? -1 : selmove
end
def pbScene
@pokemon.play_cry
loop do
Graphics.update
Input.update
pbUpdate
dorefresh = false
if Input.trigger?(Input::ACTION)
pbSEStop
@pokemon.play_cry
elsif Input.trigger?(Input::BACK)
pbPlayCloseMenuSE
break
elsif Input.trigger?(Input::USE)
if @page == 4
pbPlayDecisionSE
pbMoveSelection
dorefresh = true
elsif @page == 5
pbPlayDecisionSE
pbRibbonSelection
dorefresh = true
elsif !@inbattle
pbPlayDecisionSE
dorefresh = pbOptions
end
elsif Input.trigger?(Input::UP) && @partyindex > 0
oldindex = @partyindex
pbGoToPrevious
if @partyindex != oldindex
pbChangePokemon
@ribbonOffset = 0
dorefresh = true
end
elsif Input.trigger?(Input::DOWN) && @partyindex < @party.length - 1
oldindex = @partyindex
pbGoToNext
if @partyindex != oldindex
pbChangePokemon
@ribbonOffset = 0
dorefresh = true
end
elsif Input.trigger?(Input::LEFT) && !@pokemon.egg?
oldpage = @page
@page -= 1
@page = 1 if @page < 1
@page = 5 if @page > 5
if @page != oldpage # Move to next page
pbSEPlay("GUI summary change page")
@ribbonOffset = 0
dorefresh = true
end
elsif Input.trigger?(Input::RIGHT) && !@pokemon.egg?
oldpage = @page
@page += 1
@page = 1 if @page < 1
@page = 5 if @page > 5
if @page != oldpage # Move to next page
pbSEPlay("GUI summary change page")
@ribbonOffset = 0
dorefresh = true
end
end
if dorefresh
drawPage(@page)
end
end
return @partyindex
end
end
#===============================================================================
#
#===============================================================================
class PokemonSummaryScreen
def initialize(scene, inbattle = false)
@scene = scene
@inbattle = inbattle
end
def pbStartScreen(party, partyindex)
@scene.pbStartScene(party, partyindex, @inbattle)
ret = @scene.pbScene
@scene.pbEndScene
return ret
end
def pbStartForgetScreen(party, partyindex, move_to_learn)
ret = -1
@scene.pbStartForgetScene(party, partyindex, move_to_learn)
loop do
ret = @scene.pbChooseMoveToForget(move_to_learn)
break if ret < 0 || !move_to_learn
break if party[partyindex].moves[ret]
#pbMessage(_INTL("HM moves can't be forgotten now.")) { @scene.pbUpdate }
end
@scene.pbEndScene
return ret
end
def pbStartChooseMoveScreen(party, partyindex, message)
ret = -1
@scene.pbStartForgetScene(party, partyindex, nil)
pbMessage(message) { @scene.pbUpdate }
loop do
ret = @scene.pbChooseMoveToForget(nil)
break if ret >= 0
pbMessage(_INTL("You must choose a move!")) { @scene.pbUpdate }
end
@scene.pbEndScene
return ret
end
end
#===============================================================================
#
#===============================================================================
def pbChooseMove(pokemon, variableNumber, nameVarNumber)
return if !pokemon
ret = -1
pbFadeOutIn {
scene = PokemonSummary_Scene.new
screen = PokemonSummaryScreen.new(scene)
ret = screen.pbStartForgetScreen([pokemon], 0, nil)
}
$game_variables[variableNumber] = ret
if ret >= 0
$game_variables[nameVarNumber] = pokemon.moves[ret].name
else
$game_variables[nameVarNumber] = ""
end
$game_map.need_refresh = true if $game_map
end