mirror of
https://github.com/infinitefusion/infinitefusion-e18.git
synced 2025-12-06 06:01:46 +00:00
204 lines
7.1 KiB
Ruby
204 lines
7.1 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","reminderbg",@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/Pictures/reminderSel")
|
|
@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/Pictures/types"))
|
|
pbDrawMoveList
|
|
pbDeactivateWindows(@sprites)
|
|
# Fade in all sprites
|
|
pbFadeInAndShow(@sprites) { pbUpdate }
|
|
end
|
|
|
|
def pbDrawMoveList
|
|
overlay=@sprites["overlay"].bitmap
|
|
overlay.clear
|
|
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(400,70,@typebitmap.bitmap,type1rect)
|
|
else
|
|
overlay.blt(366,70,@typebitmap.bitmap,type1rect)
|
|
overlay.blt(436,70,@typebitmap.bitmap,type2rect)
|
|
end
|
|
textpos=[
|
|
[_INTL("Teach which move?"),16,2,0,Color.new(88,88,80),Color.new(168,184,184)]
|
|
]
|
|
imagepos=[]
|
|
yPos=76
|
|
for i in 0...VISIBLEMOVES
|
|
moveobject=@moves[@sprites["commands"].top_item+i]
|
|
if moveobject
|
|
moveData=GameData::Move.get(moveobject)
|
|
type_number = GameData::Type.get(moveData.type).id_number
|
|
imagepos.push(["Graphics/Pictures/types", 12, yPos + 8, 0, type_number * 28, 64, 28])
|
|
textpos.push([moveData.name,80,yPos,0,Color.new(248,248,248),Color.new(0,0,0)])
|
|
if moveData.total_pp>0
|
|
textpos.push([_INTL("PP"),112,yPos+32,0,Color.new(64,64,64),Color.new(176,176,176)])
|
|
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(["-",80,yPos,0,Color.new(64,64,64),Color.new(176,176,176)])
|
|
textpos.push(["--",228,yPos+32,1,Color.new(64,64,64),Color.new(176,176,176)])
|
|
end
|
|
end
|
|
yPos+=64
|
|
end
|
|
imagepos.push(["Graphics/Pictures/reminderSel",
|
|
0,78+(@sprites["commands"].index-@sprites["commands"].top_item)*64,
|
|
0,0,258,72])
|
|
selMoveData=GameData::Move.get(@moves[@sprites["commands"].index])
|
|
basedamage=selMoveData.base_damage
|
|
category=selMoveData.category
|
|
accuracy=selMoveData.accuracy
|
|
textpos.push([_INTL("CATEGORY"),272,108,0,Color.new(248,248,248),Color.new(0,0,0)])
|
|
textpos.push([_INTL("POWER"),272,140,0,Color.new(248,248,248),Color.new(0,0,0)])
|
|
textpos.push([basedamage<=1 ? basedamage==1 ? "???" : "---" : sprintf("%d",basedamage),
|
|
468,140,2,Color.new(64,64,64),Color.new(176,176,176)])
|
|
textpos.push([_INTL("ACCURACY"),272,172,0,Color.new(248,248,248),Color.new(0,0,0)])
|
|
textpos.push([accuracy==0 ? "---" : "#{accuracy}%",
|
|
468,172,2,Color.new(64,64,64),Color.new(176,176,176)])
|
|
pbDrawTextPositions(overlay,textpos)
|
|
imagepos.push(["Graphics/Pictures/category",436,116,0,category*28,64,28])
|
|
if @sprites["commands"].index<@moves.length-1
|
|
imagepos.push(["Graphics/Pictures/reminderButtons",48,350,0,0,76,32])
|
|
end
|
|
if @sprites["commands"].index>0
|
|
imagepos.push(["Graphics/Pictures/reminderButtons",134,350,76,0,76,32])
|
|
end
|
|
pbDrawImagePositions(overlay,imagepos)
|
|
drawTextEx(overlay,272,214,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") {
|
|
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 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
|
|
tmoves = []
|
|
if pkmn.first_moves
|
|
for i in pkmn.first_moves
|
|
tmoves.push(i) if !pkmn.hasMove?(i) && !moves.include?(i)
|
|
end
|
|
end
|
|
moves = tmoves + moves
|
|
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)
|
|
@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 {
|
|
scene = MoveRelearner_Scene.new
|
|
screen = MoveRelearnerScreen.new(scene)
|
|
retval = screen.pbStartScreen(pkmn)
|
|
}
|
|
return retval
|
|
end
|