Scripts & Tutorials This forum is for scripts and code, as well as all kinds of tutorials, software, tools and so forth. Remember to give credit!
The thread revival limit does not apply here.

Reply
 
Thread Tools
  #1    
Old August 21st, 2012 (4:38 AM).
FL's Avatar
FL FL is offline
Pokémon Island Creator
     
    Join Date: Sep 2010
    Gender: Male
    Posts: 1,695
    Code:
    #===============================================================================
    # * Hall of Fame - by FL (Credits will be apreciated)
    #===============================================================================
    #
    # This script is for Pokémon Essentials. It makes a recordable Hall of Fame
    # like the Gen 3 games.
    #
    #===============================================================================
    #
    # To this scripts works, put it above main, put a 512x384 picture in 
    # hallbars and a 8x24 background picture in hallbg. To call this script use
    # 'pbHallOfFameEntry'. After you recorder the first entry, you can access the
    # hall teams using a PC. You can also check the player Hall of Fame last
    # number using '$PokemonGlobal.hallOfFameLastNumber'.
    # 
    #===============================================================================
    
    class HallOfFameScene
      
      # When true, all pokémon will be in one line
      # When false, all pokémon will be in two lines
      SINGLEROW=false
      # Make the pokémon movement ON in hall entry
      ANIMATION=true
      # Speed in pokémon movement in hall entry. Don't use less than 2!
      ANIMATIONSPEED=32
      # Entry wait time between each pokémon (and trainer) is show
      ENTRYWAITTIME=128
      # Maximum number limit of simultaneous hall entries saved. 
      # 0 = Doesn't save any hall. -1 = no limit
      # Prefer to use larger numbers (like 500 and 1000) than don't put a limit
      # If a player exceed this limit, the first one will be removed
      HALLLIMIT=50
      # The entry music name. Put "" to doesn't play anything
      ENTRYMUSIC="Hall of Fame"
      # Allow eggs to be show and saved in hall
      ALLOWEGGS=true
      # Remove the hallbars when the trainer sprite appears
      REMOVEBARS=true
      # The final fade speed on entry
      FINALFADESPEED=16
      # Sprites opacity value when them aren't selected
      OPACITY=64
      
      def pbUpdate
        pbUpdateSpriteHash(@sprites)
      end
      
      def pbUpdateAnimation
        if(@battlerIndex<[email protected])
          if(@xmovement[@battlerIndex]!=0 || @ymovement[@battlerIndex]!=0)
            spriteIndex=(@battlerIndex<@hallEntry.size) ? @battlerIndex : -1
            moveSprite(spriteIndex)
          else
            @battlerIndex+=1
            if(@battlerIndex<[email protected])
              # If it is a pokémon, write the pokémon text, wait the 
              # ENTRYWAITTIME and goes to the next battler
              pbPlayCry(@hallEntry[@battlerIndex-1])
              writePokemonData(@hallEntry[@battlerIndex-1])
              pbWait(ENTRYWAITTIME)
              if(@battlerIndex<@hallEntry.size) # Preparates the next battler
                setPokemonSpritesOpacity(@battlerIndex,OPACITY)
                @sprites["overlay"].bitmap.clear
              else # Show the welcome message and preparates the trainer
                setPokemonSpritesOpacity(-1)
                writeWelcome
                pbWait(ENTRYWAITTIME*2)
                setPokemonSpritesOpacity(-1,OPACITY) if !SINGLEROW
                createTrainerBattler
              end
            end
          end  
        elsif(@battlerIndex>@hallEntry.size)
          # Write the trainer data and fade
          writeTrainerData
          pbWait(ENTRYWAITTIME)      
          fadeSpeed=((Math.log(2**12)-Math.log(FINALFADESPEED))/Math.log(2)).floor
          pbBGMFade((2**fadeSpeed).to_f/20) if @useMusic
          slowFadeOut(@sprites,fadeSpeed){ pbUpdate } 
          @alreadyFadedInEnd=true
          @battlerIndex+=1
        end
      end
      
      def pbUpdatePC
        # Change the team
        if @battlerIndex>[email protected]
          @hallIndex-=1
          return false if @hallIndex==-1
          @hallEntry=$PokemonGlobal.hallOfFame[@hallIndex]
          @battlerIndex=0
          createBattlers(false)
        elsif @battlerIndex<0
          @hallIndex+=1
          return false if @hallIndex>=$PokemonGlobal.hallOfFame.size
          @hallEntry=$PokemonGlobal.hallOfFame[@hallIndex]
          @[email protected]
          createBattlers(false)
        end
        # Change the pokemon
        pbPlayCry(@hallEntry[@battlerIndex])
        setPokemonSpritesOpacity(@battlerIndex,OPACITY)
        hallNumber=($PokemonGlobal.hallOfFameLastNumber+@hallIndex-
            $PokemonGlobal.hallOfFame.size+1)
        writePokemonData(@hallEntry[@battlerIndex],hallNumber)
        return true
      end
      
      def slowFadeOut(sprites,exponent) # 2 exponent
        # To handle values above 8
        extraWaitExponent=exponent-9 
        exponent=8 if 8<exponent
        
        max=2**exponent
        speed=(2**8)/max
        for j in 0..max
         pbWait(2**extraWaitExponent) if extraWaitExponent>-1
         pbSetSpritesToColor(sprites,Color.new(0,0,0,j*speed))
         block_given? ? yield : pbUpdateSpriteHash(sprites)
        end
      end
      
      # Dispose the sprite if the sprite exists and make it null
      def restartSpritePosition(sprites,spritename)
        sprites[spritename].dispose if (
            sprites.include?(spritename) && sprites[spritename])
        sprites[spritename]=nil  
      end  
      
      # Change the pokémon sprites opacity except the index one
      def setPokemonSpritesOpacity(index,opacity=255)
        for n in 0...@hallEntry.size
          @sprites["pokemon#{n}"].opacity = (n==index
              ) ? 255 : opacity if @sprites["pokemon#{n}"]
        end  
      end  
    
      #placement for pokemon icons
      def pbStartScene
        @sprites={}
        @viewport=Viewport.new(0,0,Graphics.width, Graphics.height)
        @viewport.z=99999
        # Comment the below line to doesn't use a background
        addBackgroundPlane(@sprites,"bg","hallbg",@viewport)
        @sprites["hallbars"]=IconSprite.new(@viewport)
        @sprites["hallbars"].setBitmap("Graphics/Pictures/hallbars")
        @sprites["overlay"]=BitmapSprite.new(
            Graphics.width,Graphics.height,@viewport)
        @sprites["overlay"].z=10
        pbSetSystemFont(@sprites["overlay"].bitmap)
        @alreadyFadedInEnd=false
        @useMusic=false
        @battlerIndex=0
        @hallEntry=[]
      end
      
      def pbStartSceneEntry
        pbStartScene
        @useMusic=(ENTRYMUSIC && ENTRYMUSIC!="")
        pbBGMPlay(ENTRYMUSIC) if @useMusic
        saveHallEntry
        @xmovement=[]
        @ymovement=[]
        createBattlers
        pbFadeInAndShow(@sprites) { pbUpdate }
      end
      
      def pbStartScenePC
        pbStartScene
        @hallIndex=$PokemonGlobal.hallOfFame.size-1
        @hallEntry=$PokemonGlobal.hallOfFame[-1]
        createBattlers(false)
        pbFadeInAndShow(@sprites) { pbUpdate }
        pbUpdatePC
      end
      
      def saveHallEntry
        for i in 0...$Trainer.party.length
          # Clones every pokémon object
          @hallEntry.push($Trainer.party[i].clone) if (
            !$Trainer.party[i].egg?||ALLOWEGGS)
        end
        # Update the global variables
        $PokemonGlobal.hallOfFame.push(@hallEntry)
        $PokemonGlobal.hallOfFameLastNumber+=1
        $PokemonGlobal.hallOfFame.delete_at(0) if(
            HALLLIMIT>-1 && $PokemonGlobal.hallOfFame.size>HALLLIMIT)
      end
      
      # Return the x/y point position in screen for battler index number
      # Don't use odd numbers!
      def xpointformula(battlernumber)
        ret=0
        if !SINGLEROW
          ret=32+160*xpositionformula(battlernumber)
        else
          ret=(60*(battlernumber/2)+48)*(xpositionformula(battlernumber)-1)
          ret+=Graphics.width/2-56
        end  
        return ret
      end
    
      def ypointformula(battlernumber)
        ret=0
        if !SINGLEROW
          ret=32+128*ypositionformula(battlernumber)/2
        else
          ret=96-8*(battlernumber/2)
        end  
        return ret
      end
      
      # Returns 0, 1 or 2 as the x/y column value
      def xpositionformula(battlernumber)
        ret=0
        if !SINGLEROW
          ret=(battlernumber/3%2==0) ? (19-battlernumber)%3 : (19+battlernumber)%3
        else
          ret=battlernumber%2*2
        end  
        return ret
      end
      
      def ypositionformula(battlernumber)
        ret=0
        if !SINGLEROW
          ret=(battlernumber/3)%2*2
        else
          ret=1
        end  
        return ret
      end 
      
      def createBattlers(hide=true)
        # Movement in animation
        for i in 0...6
          # Clear all 6 pokémon sprites and dispose the ones that exists every time
          # that this method is call
          restartSpritePosition(@sprites,"pokemon#{i}") 
          next if i>[email protected]
          xpoint=xpointformula(i)
          ypoint=ypointformula(i)
          [email protected][i]
          @sprites["pokemon#{i}"]=PokemonSprite.new(@viewport)
          @sprites["pokemon#{i}"].setPokemonBitmap(pok)
          # This method doesn't put the exact coordinates
          pbPositionPokemonSprite(@sprites["pokemon#{i}"],xpoint,ypoint)
          @sprites["pokemon#{i}"].z=7-i if SINGLEROW
          next if !hide
          # Animation distance calculation
          horizontal=1-xpositionformula(i)
          vertical=1-ypositionformula(i)
          xdistance=(horizontal==-1) ? [email protected]["pokemon#{i}"].bitmap.width : (
              Graphics.width)
          ydistance=(vertical==-1) ? [email protected]["pokemon#{i}"].bitmap.height : (
              Graphics.height)
          xdistance=(([email protected]["pokemon#{i}"].x)/ANIMATIONSPEED).abs+1
          ydistance=(([email protected]["pokemon#{i}"].y)/ANIMATIONSPEED).abs+1
          biggerdistance=(xdistance>ydistance) ? xdistance : ydistance
          @xmovement[i]=biggerdistance
          @xmovement[i]*=-1 if horizontal==-1
          @xmovement[i]=0   if horizontal== 0
          @ymovement[i]=biggerdistance
          @ymovement[i]*=-1 if vertical==-1
          @ymovement[i]=0   if vertical== 0
          # Hide the battlers
          @sprites["pokemon#{i}"].[email protected][i]*ANIMATIONSPEED
          @sprites["pokemon#{i}"].[email protected][i]*ANIMATIONSPEED
        end
      end
      
      def moveSprite(i)
        spritename=(i>-1) ? "pokemon#{i}" : "trainer"
        speed = (i>-1) ? ANIMATIONSPEED : 2
        if(!ANIMATION) # Skips animation
          @sprites[spritename].[email protected][i]
          @xmovement[i]=0
          @sprites[spritename].[email protected][i]
          @ymovement[i]=0
        end
        if(@xmovement[i]!=0)
          direction = (@xmovement[i]>0) ? -1 : 1
          @sprites[spritename].x+=speed*direction
          @xmovement[i]+=direction
        end
        if(@ymovement[i]!=0)
          direction = (@ymovement[i]>0) ? -1 : 1
          @sprites[spritename].y+=speed*direction
          @ymovement[i]+=direction
        end
      end
      
      def createTrainerBattler
        @sprites["trainer"]=IconSprite.new(@viewport)
        @sprites["trainer"].setBitmap(
            sprintf("Graphics/Characters/trainer%03d",$Trainer.trainertype))
        if !SINGLEROW
          @sprites["trainer"].x=Graphics.width-96
          @sprites["trainer"].y=160
        else
          @sprites["trainer"].x=Graphics.width/2
          @sprites["trainer"].y=178
        end
        @sprites["trainer"].z=9
        @sprites["trainer"].[email protected]["trainer"].bitmap.width/2
        @sprites["trainer"].[email protected]["trainer"].bitmap.height/2
        if REMOVEBARS
          @sprites["overlay"].bitmap.clear
          @sprites["hallbars"].visible=false
        end
        @xmovement[@battlerIndex]=0
        @ymovement[@battlerIndex]=0
        if(ANIMATION && !SINGLEROW) # Trainer Animation
          startpoint=Graphics.width/2
          # 2 is the trainer speed
          @xmovement[@battlerIndex]=([email protected]["trainer"].x)/2
          @sprites["trainer"].x=startpoint
        else
          pbWait(ENTRYWAITTIME)
        end
      end
      
      def writeTrainerData
        totalsec = Graphics.frame_count / Graphics.frame_rate
        hour = totalsec / 60 / 60
        min = totalsec / 60 % 60
        pubid=sprintf("%05d",$Trainer.publicID($Trainer.id))
        lefttext= _INTL("Name<r>{1}<br>",$Trainer.name)
        lefttext+=_INTL("IDNo.<r>{1}<br>",pubid)
        lefttext+=_ISPRINTF("Time<r>{1:02d}:{2:02d}<br>",hour,min)
        lefttext+=_INTL("Pokédex<r>{1}/{2}<br>",
            $Trainer.pokedexOwned,$Trainer.pokedexSeen)
        @sprites["messagebox"]=Window_AdvancedTextPokemon.new(lefttext)
        @sprites["messagebox"].[email protected]
        @sprites["messagebox"].width=192 if @sprites["messagebox"].width<192
        @sprites["msgwindow"]=Kernel.pbCreateMessageWindow(@viewport)
        Kernel.pbMessageDisplay(@sprites["msgwindow"],
            _INTL("League champion!\nCongratulations!\\^"))
      end  
      
      BASECOLOR=Color.new(248,248,248)
      SHADOWCOLOR=Color.new(0,0,0)
      
      def writePokemonData(pokemon,hallNumber=-1)
        [email protected]["overlay"].bitmap
        overlay.clear 
        
        pokename=pokemon.name
        speciesname=PBSpecies.getName(pokemon.species)
        speciesname=speciesname[0..-2] if (
            speciesname.split('').last=="♂" || speciesname.split('').last=="♀")
        if pokemon.gender==0
          speciesname+="♂"
        elsif pokemon.gender==1
          speciesname+="♀"
        end
        pokename+="/"+speciesname
        pokename=_INTL("Egg")+"/"+_INTL("Egg") if pokemon.egg?
        idno=(pokemon.ot=="" || pokemon.egg?) ? _INTL("?????") : 
            _ISPRINTF("{1:05d}",pokemon.publicID)
        dexnumber=pokemon.egg? ? _INTL("No. ???") : 
            _ISPRINTF("No. {1:03d}",pokemon.species)
            
        textPositions=[
           [dexnumber,32,Graphics.height-80,0,BASECOLOR,SHADOWCOLOR],
           [pokename,Graphics.width-192,Graphics.height-80,2,BASECOLOR,SHADOWCOLOR],
           [_INTL("Lv. {1}",pokemon.egg? ? _INTL("?") : pokemon.level),
               64,Graphics.height-48,0,BASECOLOR,SHADOWCOLOR],
           [_INTL("IDNo.{1}",pokemon.egg? ? _INTL("?????") : idno),
               Graphics.width-192,Graphics.height-48,2,BASECOLOR,SHADOWCOLOR]
        ]
        if (hallNumber>-1)
          textPositions.push([_INTL("Hall of Fame No."),
              Graphics.width/2-104,0,0,BASECOLOR,SHADOWCOLOR])
          textPositions.push([hallNumber.to_s,
              Graphics.width/2+104,0,1,BASECOLOR,SHADOWCOLOR])
        end       
        pbDrawTextPositions(overlay,textPositions)
      end
      
      def writeWelcome
        [email protected]["overlay"].bitmap
        overlay.clear
        pbDrawTextPositions(overlay,[[_INTL("Welcome to the Hall of Fame!"),
            Graphics.width/2,Graphics.height-80,2,BASECOLOR,SHADOWCOLOR]])
      end
    
      def pbEndScene
        $game_map.autoplay if @useMusic
        Kernel.pbDisposeMessageWindow(@sprites["msgwindow"]) if (
            @sprites.include?("msgwindow"))
        pbFadeOutAndHide(@sprites) { pbUpdate } if [email protected]
        pbDisposeSpriteHash(@sprites)
        @viewport.dispose
      end
     
      def pbPCSelection
        loop do
          Graphics.update
          Input.update
          pbUpdate
          continueScene=true
          if Input.trigger?(Input::B) # Exits
            break
          end
          if Input.trigger?(Input::C) # Moves the selection one entry backward
            @battlerIndex+=10
            continueScene=pbUpdatePC
          end
          if Input.trigger?(Input::LEFT) # Moves the selection one pokémon forward
            @battlerIndex-=1
            continueScene=pbUpdatePC
          end
          if Input.trigger?(Input::RIGHT) # Moves the selection one pokémon backward
            @battlerIndex+=1
            continueScene=pbUpdatePC
          end
          break if !continueScene
        end
      end
      
      def pbAnimationLoop
        loop do
          Graphics.update
          Input.update
          pbUpdate
          pbUpdateAnimation
          break if @battlerIndex==(@hallEntry.size+2)
        end
      end
     
    end
    
    class HallOfFameScreen
      def initialize(scene)
        @scene = scene
      end
      def pbStartScreenEntry
        @scene.pbStartSceneEntry
        @scene.pbAnimationLoop
        @scene.pbEndScene
      end
      def pbStartScreenPC
        @scene.pbStartScenePC
        @scene.pbPCSelection
        @scene.pbEndScene
      end
    end
    
    class HallOfFamePC
      def shouldShow?
        return $PokemonGlobal.hallOfFameLastNumber>0
      end
      def name
        return _INTL("Hall of Fame")
      end
      def access
        Kernel.pbMessage(_INTL("\\se[accesspc]Accessed the Hall of Fame."))
        pbHallOfFamePC
      end
    end
    
    PokemonPCList.registerPC(HallOfFamePC.new)
    
    class PokemonGlobalMetadata
      attr_accessor :hallOfFame
      # Number necessary if hallOfFame array reach in its size limit
      attr_accessor :hallOfFameLastNumber
      
      def hallOfFame
        @hallOfFame=[] if [email protected]
        return @hallOfFame
      end
      
      def hallOfFameLastNumber
        @hallOfFameLastNumber=0 if [email protected]
        return @hallOfFameLastNumber
      end
    end
    
    def pbHallOfFameEntry
      scene=HallOfFameScene.new
      screen=HallOfFameScreen.new(scene)
      screen.pbStartScreenEntry
    end
    
    def pbHallOfFamePC
      scene=HallOfFameScene.new
      screen=HallOfFameScreen.new(scene)
      screen.pbStartScreenPC
    end
    Attached Thumbnails
    hallscreen.png‎   hallscreen2.png‎   hallscreen3.png‎   hallscreen4.png‎  
    Attached Files
    File Type: zip Hall of Fame Sample Resources.zip‎ (1.8 KB, 80 views) (Save to Dropbox)
    __________________
    Reply With Quote

    Relevant Advertising!

      #2    
    Old August 21st, 2012 (4:42 AM).
    venom12's Avatar
    venom12 venom12 is offline
    Pokemon Crystal Rain Relased
       
      Join Date: Sep 2006
      Age: 26
      Gender: Male
      Nature: Adamant
      Posts: 529
      WOw man great script :O I love it, i will use it, Thanks.
      Reply With Quote
        #3    
      Old March 29th, 2013 (1:00 PM).
      BenGames,Films, and More!'s Avatar
      BenGames,Films, and More! BenGames,Films, and More! is offline
      Are you not entertained?
         
        Join Date: Nov 2012
        Gender: Male
        Nature: Serious
        Posts: 134
        Does it matter what the script bank (like Poke_Battle) is called?
        __________________


        YouTube Channel
        Deviant Art
        BGFM Forums
        Take a quiz about me!
        I believe in Jesus Christ my Savior. If you do too, and aren't scared to admit it, then copy and paste this in your signature.
        If you say "pls" or "plz" because it's shorter than "please", I'll say "no" because it's shorter than "yes".
        Reply With Quote
          #4    
        Old March 30th, 2013 (4:40 PM).
        FL's Avatar
        FL FL is offline
        Pokémon Island Creator
           
          Join Date: Sep 2010
          Gender: Male
          Posts: 1,695
          This script is included in the Essentials v10.
          Quote:
          Originally Posted by BenGames,Films, and More! View Post
          Does it matter what the script bank (like Poke_Battle) is called?
          I didn't understand you post. I aren't sure, but this script doesn't call the Poke_Battle, but you can call if you know what you are doing.
          __________________
          Reply With Quote
            #5    
          Old March 31st, 2013 (7:13 AM). Edited April 4th, 2013 by Maruno.
          Maruno's Avatar
          Maruno Maruno is offline
          Lead Dev of Pokémon Essentials
             
            Join Date: Jan 2008
            Location: England
            Posts: 5,171
            BenGames, you're talking about the name of a script section. No, it doesn't matter what it's called.
            __________________
            Go to the Pokémon Essentials Wiki

            | Downloads | Tutorials | Fangames |
            | All Animations Project |

            Follow me on Twitter: @maruno42


            Reply With Quote
            Reply
            Quick Reply

            Sponsored Links
            Thread Tools

            Posting Rules
            You may not post new threads
            You may not post replies
            You may not post attachments
            You may not edit your posts

            BB code is On
            Smilies are On
            [IMG] code is On
            HTML code is Off

            Forum Jump


            All times are GMT -8. The time now is 5:29 PM.