Files
infinitefusion-e18/Data/Scripts/016_UI/022_UI_MoveRelearner.rb

200 lines
7.4 KiB
Ruby

#===============================================================================
# Scene class for handling appearance of the screen
#===============================================================================
class MoveRelearner_Scene
VISIBLEMOVES = 4
def pbDisplay(msg, brief = false)
UIHelper.pbDisplay(@sprites["msgwindow"], msg, brief) { pbUpdate }
end
def pbConfirm(msg)
UIHelper.pbConfirm(@sprites["msgwindow"], msg) { pbUpdate }
end
def pbUpdate
pbUpdateSpriteHash(@sprites)
end
def pbStartScene(pokemon, moves)
@pokemon = pokemon
@moves = moves
moveCommands = []
moves.each { |m| moveCommands.push(GameData::Move.get(m).name) }
# Create sprite hash
@viewport = Viewport.new(0, 0, Graphics.width, Graphics.height)
@viewport.z = 99999
@sprites = {}
addBackgroundPlane(@sprites, "bg", "Move Reminder/bg", @viewport)
@sprites["pokeicon"] = PokemonIconSprite.new(@pokemon, @viewport)
@sprites["pokeicon"].setOffset(PictureOrigin::CENTER)
@sprites["pokeicon"].x = 320
@sprites["pokeicon"].y = 84
@sprites["background"] = IconSprite.new(0, 0, @viewport)
@sprites["background"].setBitmap("Graphics/UI/Move Reminder/cursor")
@sprites["background"].y = 78
@sprites["background"].src_rect = Rect.new(0, 72, 258, 72)
@sprites["overlay"] = BitmapSprite.new(Graphics.width, Graphics.height, @viewport)
pbSetSystemFont(@sprites["overlay"].bitmap)
@sprites["commands"] = Window_CommandPokemon.new(moveCommands, 32)
@sprites["commands"].height = 32 * (VISIBLEMOVES + 1)
@sprites["commands"].visible = false
@sprites["msgwindow"] = Window_AdvancedTextPokemon.new("")
@sprites["msgwindow"].visible = false
@sprites["msgwindow"].viewport = @viewport
@typebitmap = AnimatedBitmap.new(_INTL("Graphics/UI/types"))
pbDrawMoveList
pbDeactivateWindows(@sprites)
# Fade in all sprites
pbFadeInAndShow(@sprites) { pbUpdate }
end
def pbDrawMoveList
overlay = @sprites["overlay"].bitmap
overlay.clear
@pokemon.types.each_with_index do |type, i|
type_number = GameData::Type.get(type).icon_position
type_rect = Rect.new(0, type_number * 28, 64, 28)
type_x = (@pokemon.types.length == 1) ? 400 : 366 + (70 * i)
overlay.blt(type_x, 70, @typebitmap.bitmap, type_rect)
end
textpos = [
[_INTL("Teach which move?"), 16, 14, 0, Color.new(88, 88, 80), Color.new(168, 184, 184)]
]
imagepos = []
yPos = 88
VISIBLEMOVES.times do |i|
moveobject = @moves[@sprites["commands"].top_item + i]
if moveobject
moveData = GameData::Move.get(moveobject)
type_number = GameData::Type.get(moveData.display_type(@pokemon)).icon_position
imagepos.push(["Graphics/UI/types", 12, yPos - 4, 0, type_number * 28, 64, 28])
textpos.push([moveData.name, 80, yPos, 0, Color.new(248, 248, 248), Color.black])
textpos.push([_INTL("PP"), 112, yPos + 32, 0, Color.new(64, 64, 64), Color.new(176, 176, 176)])
if moveData.total_pp > 0
textpos.push([_INTL("{1}/{1}", moveData.total_pp), 230, yPos + 32, 1,
Color.new(64, 64, 64), Color.new(176, 176, 176)])
else
textpos.push(["--", 230, yPos + 32, 1, Color.new(64, 64, 64), Color.new(176, 176, 176)])
end
end
yPos += 64
end
imagepos.push(["Graphics/UI/Move Reminder/cursor",
0, 78 + ((@sprites["commands"].index - @sprites["commands"].top_item) * 64),
0, 0, 258, 72])
selMoveData = GameData::Move.get(@moves[@sprites["commands"].index])
power = selMoveData.display_damage(@pokemon)
category = selMoveData.display_category(@pokemon)
accuracy = selMoveData.display_accuracy(@pokemon)
textpos.push([_INTL("CATEGORY"), 272, 120, 0, Color.new(248, 248, 248), Color.black])
textpos.push([_INTL("POWER"), 272, 152, 0, Color.new(248, 248, 248), Color.black])
textpos.push([power <= 1 ? power == 1 ? "???" : "---" : sprintf("%d", power),
468, 152, 2, Color.new(64, 64, 64), Color.new(176, 176, 176)])
textpos.push([_INTL("ACCURACY"), 272, 184, 0, Color.new(248, 248, 248), Color.black])
textpos.push([accuracy == 0 ? "---" : "#{accuracy}%",
468, 184, 2, Color.new(64, 64, 64), Color.new(176, 176, 176)])
pbDrawTextPositions(overlay, textpos)
imagepos.push(["Graphics/UI/category", 436, 116, 0, category * 28, 64, 28])
if @sprites["commands"].index < @moves.length - 1
imagepos.push(["Graphics/UI/Move Reminder/buttons", 48, 350, 0, 0, 76, 32])
end
if @sprites["commands"].index > 0
imagepos.push(["Graphics/UI/Move Reminder/buttons", 134, 350, 76, 0, 76, 32])
end
pbDrawImagePositions(overlay, imagepos)
drawTextEx(overlay, 272, 216, 230, 5, selMoveData.description,
Color.new(64, 64, 64), Color.new(176, 176, 176))
end
# Processes the scene
def pbChooseMove
oldcmd = -1
pbActivateWindow(@sprites, "commands") do
loop do
oldcmd = @sprites["commands"].index
Graphics.update
Input.update
pbUpdate
if @sprites["commands"].index != oldcmd
@sprites["background"].x = 0
@sprites["background"].y = 78 + ((@sprites["commands"].index - @sprites["commands"].top_item) * 64)
pbDrawMoveList
end
if Input.trigger?(Input::BACK)
return nil
elsif Input.trigger?(Input::USE)
return @moves[@sprites["commands"].index]
end
end
end
end
# End the scene here
def pbEndScene
pbFadeOutAndHide(@sprites) { pbUpdate }
pbDisposeSpriteHash(@sprites)
@typebitmap.dispose
@viewport.dispose
end
end
#===============================================================================
# Screen class for handling game logic
#===============================================================================
class MoveRelearnerScreen
def initialize(scene)
@scene = scene
end
def pbGetRelearnableMoves(pkmn)
return [] if !pkmn || pkmn.egg? || pkmn.shadowPokemon?
moves = []
pkmn.getMoveList.each do |m|
next if m[0] > pkmn.level || pkmn.hasMove?(m[1])
moves.push(m[1]) if !moves.include?(m[1])
end
if Settings::MOVE_RELEARNER_CAN_TEACH_MORE_MOVES && pkmn.first_moves
tmoves = []
pkmn.first_moves.each do |i|
tmoves.push(i) if !moves.include?(i) && !pkmn.hasMove?(i)
end
moves = tmoves + moves # List first moves before level-up moves
end
return moves | [] # remove duplicates
end
def pbStartScreen(pkmn)
moves = pbGetRelearnableMoves(pkmn)
@scene.pbStartScene(pkmn, moves)
loop do
move = @scene.pbChooseMove
if move
if @scene.pbConfirm(_INTL("Teach {1}?", GameData::Move.get(move).name))
if pbLearnMove(pkmn, move)
$stats.moves_taught_by_reminder += 1
@scene.pbEndScene
return true
end
end
elsif @scene.pbConfirm(_INTL("Give up trying to teach a new move to {1}?", pkmn.name))
@scene.pbEndScene
return false
end
end
end
end
#===============================================================================
#
#===============================================================================
def pbRelearnMoveScreen(pkmn)
retval = true
pbFadeOutIn do
scene = MoveRelearner_Scene.new
screen = MoveRelearnerScreen.new(scene)
retval = screen.pbStartScreen(pkmn)
end
return retval
end