#=============================================================================== # 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 set_moves(moves_list) @moves = moves_list end def pbStartScene(pokemon,moves) @pokemon=pokemon @moves=moves moveCommands=[] echoln moves moves.each do |m| echoln m.name moveCommands.push(GameData::Move.get(m).name) end # 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("Graphics/Pictures/types") pbDrawMoveList pbDeactivateWindows(@sprites) # Fade in all sprites pbFadeInAndShow(@sprites) { pbUpdate } end def pbDrawMoveList overlay=@sprites["overlay"].bitmap overlay.clear if @pokemon 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 end text = @pokemon ? "Teach which move?" : "Moves list" textpos=[ [_INTL(text),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) && @pokemon 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 pkmn.learned_moves.each do |move| move_id = move.is_a?(Symbol) ? move : move.id next if pkmn.hasMove?(move_id) moves.push(move_id) if !moves.include?(move_id) 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=nil) if moves == nil moves = pbGetRelearnableMoves(pkmn) end @scene.pbStartScene(pkmn, moves) loop do move = @scene.pbChooseMove if !pkmn @scene.pbEndScene return false end if move if @scene.pbConfirm(_INTL("Teach {1}?", GameData::Move.get(move).name)) if pbLearnMove(pkmn, move, false, true) @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