#=============================================================================== # #=============================================================================== 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) @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<= 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 $PokemonGlobal.pokedexUnlocked[$PokemonGlobal.pokedexUnlocked.length-1] dexnumshift = true if Settings::DEXES_WITH_OFFSETS.include?(-1) else dexnum = 0 for i in 0...$PokemonGlobal.pokedexUnlocked.length-1 next if !$PokemonGlobal.pokedexUnlocked[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("%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{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("A mysterious Pokémon Egg received from {1}.\n",mapname) else memo += _INTL("A mysterious Pokémon Egg.\n",mapname) end memo += "\n" # Empty line # Write Egg Watch blurb memo += _INTL("\"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("%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("{1} 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("{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 !mapname || mapname=="" memo += sprintf("%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("%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("{1} {2}, {3}\n",date,month,year) end mapname = pbGetMapNameFromId(@pokemon.hatched_map) mapname = _INTL("Faraway place") if !mapname || mapname=="" memo += sprintf("%s\n",mapname) memo += _INTL("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("%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,316,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, 218, 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,318,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) @sprites["itemicon"].item = @pokemon.item_id pbSEStop GameData::Species.play_cry_from_pokemon(@pokemon) 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.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.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=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<=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? commands[cmdGiveItem = commands.length] = _INTL("Give item") commands[cmdTakeItem = commands.length] = _INTL("Take item") if @pokemon.hasItem? commands[cmdPokedex = commands.length] = _INTL("View Pokédex") if $Trainer.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 pbUpdateLastSeenForm(@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.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.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 GameData::Species.play_cry_from_pokemon(@pokemon) loop do Graphics.update Input.update pbUpdate dorefresh = false if Input.trigger?(Input::SPECIAL) pbSEStop GameData::Species.play_cry_from_pokemon(@pokemon) 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 $DEBUG || !party[partyindex].moves[ret].hidden_move? 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