The RPG Maker Resource Kit

RMRK RPG Maker Creation => RPG Maker General => General Scripting => Topic started by: Berans on August 22, 2008, 07:13:46 AM

Title: Beran's iPod script v1.15-final
Post by: Berans on August 22, 2008, 07:13:46 AM
iPod script
Version: 1.15-final
Type: Music Player
Key Term: Misc Add-On



Introduction

I made this script as a response to a request on a different forum, and decided it was my first script decent enough to post up here.
It simply displays a nice "iPod" graphic, and lets you pick songs to play from a list.


Features



Screenshots

(https://rmrk.net/proxy.php?request=http%3A%2F%2Fimg514.imageshack.us%2Fimg514%2F7193%2Fipodscreeniexz1.png&hash=ae2651ba6b2d3db62b7f14e22294434be0c9a594)

If you do not want to download the demo, save the following 2 images to your computer, and import them into your game as outlined in the script
[SPOILER]
(https://rmrk.net/proxy.php?request=http%3A%2F%2Fimg513.imageshack.us%2Fimg513%2F8702%2Fipodtc0.png&hash=9b79a1028527df3832345269a1c154da24481caf)

(https://rmrk.net/proxy.php?request=http%3A%2F%2Fimg513.imageshack.us%2Fimg513%2F710%2Fipod2fe0.png&hash=e7a3bd2d0c1497b949873374a29c6bd87fb53175)
[/SPOILER]


Demo

Latest Demo:
iPod Demo v1.00-beta (http://www.mediafire.com/?iyqzfn4sxnz)

Note: This demo is severely outdated. Don't try to get the script from the demo, it won't work very well :P
The demo does, however, display the script's features nicely


Script

The script should be placed somewhere above main, and below Scene_Debug
[SPOILER]
#==============================================================================
#==============================================================================
#Berans' "iPod" script v1.15-final
#Last edited: 12 August 2008
#
#------------------------------------------------------------------------------
#What's new in v1.15
# -Script now automatically adds any songs you have in your project to the
#  PLAYBACK list. An array in the config module allows you to also add any songs
#  from the RTP
# -Minor bugfix regarding the mute function
#------------------------------------------------------------------------------
#
#------------------------------------------------------------------------------
#What's new in v1.13
# -Major bugfixes and some code improvement
#------------------------------------------------------------------------------
#
#------------------------------------------------------------------------------
#What's new in v1.12
# -Further code improvements
# -Changed iPod menu options to include "Sorting"
#------------------------------------------------------------------------------
#
#------------------------------------------------------------------------------
#What's new in v1.01
# -Minor code cleanups
# -Debugging
# -Added "Back" option in the iPod menu
#------------------------------------------------------------------------------
#
#------------------------------------------------------------------------------
#What's new in v1.00
# -Added a "menu" feature on the ipod with a few small options
# -Code cleaned up
#------------------------------------------------------------------------------
#
#------------------------------------------------------------------------------
#What's new in v0.99
# -Fixed a few small glitches
# -The game now remembers whether or not you were playing a song upon exiting
#  the iPod, to accomodate BGM_CHANGER better.
# -The game now remembers and saves the BGM_CHANGER option, so it can be changed
#  ingame with a new, easy-to-use script command
#------------------------------------------------------------------------------
#
#will allow you to playback songs from a list using a simple window which looks
#like an ipod
#
#feel free to edit and change any names, provided you have changed them in your
#audio/bgm folder(this would let you have custom names drawn in the menu)
#see further instructions below
#
#Credits: Berans    - Making the script
#         Blizzard  - Lessons on scripting and scripting conventions
#         Sniper308 - Requesting the script
#------------------------------------------------------------------------------
#Features
#------------------------------------------------------------------------------
# -Allows for as many songs as you wish
# -Relatively easy setup
# -IPod Graphic
# -Allows for author and genre names
# -Allows unlockable songs
# -Currently selected song is remembered, and saved in your save game
# -Unlocked songs saved in save game
# -Entirely Lag-free
# -Map as background
# -Option to have the current BGM change with your selected song
# -NEW: BGM_CHANGER option now remembered and saved with new easy-to-use command
# -NEW: iPod menu with a few for-fun options
# -NEW: iPod menu now features a "sort" option, standard sorting now set to song
#  title(sort option is saved in save game)
# -NEW: Automatically sets up any custom songs you have to use in the script
#------------------------------------------------------------------------------
#Compatibility
#------------------------------------------------------------------------------
#Should be compatible with most scripts, including the SDK
#Since this is a beta test, please notify me if something's not working
#
#==============================================================================
#Instructions
#==============================================================================
#
#------------------------------------------------------------------------------
#Setup:
#------------------------------------------------------------------------------
#Songs in your project's "Audio/BGM" folder will automatically be setup to be
#used in the script. If you want to use songs from the RTP that aren't in your
#project's "Audio/BGM" folder, add them in the "PLAYBACK1" array in the Config
#section of the script.
#The names must be spelled exactly as in the RTP's "Audio/BGM" folder, enclosed
#in quotation marks, and separated by a comma.
#example:
#PLAYBACK = ["001-Battle01, "002-Battle02", "003-Battle03"]
#In playback initial, add the number of all the songs you want to have initially
#unlocked, separated by comma. The numbers correspond to a list of songs,
#consisting of your custom songs, arranged alphabetically followed by the RTP
#songs in the order you have specified.
#example:
#you have the custom songs "Song1", "Song2" and "Song3" in your "Audio/BGM" folder
#and have specified "001-Battle01" to be included in the list.
#song 1 will then be "Song1", 2 - "Song2" 3 - "Song3" and 4 "001-Battle01"
#The PLAYBACK_AUTHOR and PLAYBACK_GENRE "hashes" respectively hold information on
#the author and genre, of each song.
#To add an author or genre name, simply add "yoursongnumber => description"
#anywhere in the correct hash. The author's/genre's name must be enclosed in
#quotation marks, and the number and name together, separated by a comma
#If a song number is not in there, the author or
#genre are automatically set to "unkown" for that song
#example:
#PLAYBACK_AUTHOR = {20 => "the author of your 20th song",
#                   1 => "the author of your 1st song", 3 => "another author"}
#the same exact same format goes for genre
#If you want all the songs in your PLAYBACK array to be "unlocked" from the
#start, simply set "unlockables" to "false"
#If you want the "IPod" to change the currently playing BGM for a map when a
#song is selected and played, set bgm_changer to "true"
#
#------------------------------------------------------------------------------
#Required Graphics and instructions:
#------------------------------------------------------------------------------
#For this script to work properly, the following files are needed, and have to
#be placed in the "Graphics/Pictures" folder in your game:
#   -IPod.png
#   -IPod2.png
#you'll also need to import the files within your project and set the correct
#transparancies
#Transparancy for IPod.png must be set to white
#Transparancy for IPod2.png must be set to the darker shade of grey, with the
#semi-transparant color set to the lighter grey
#
#------------------------------------------------------------------------------
#Using the script
#------------------------------------------------------------------------------
#To call the script, within an event use the "script" command
#in the script write "$scene = Scene_Playback.new" (without quotation marks)
#If you want the "ipod" to return to menu upon exit, add (true) after
#Scene_Playback.new. This works well in combination with a common event with an
#item.
#
#To "unlock" a song, ensure its name is in the PLAYBACK array in the
#configuration below, then, use the "script" command in an event, and enter the
#following: "unlock_song(your_song_number)"
#The song number directly corresponds to the position in the PLAYBACK array
#example:
#Your PLAYBACK array is ["yoursong-01", "yoursong-02", "someothersong"]
#and you want to unlock "yoursong-02
#simply write "unlock_song(2)" within your script command
#
#To change the BGM_CHANGER option ingame, use the following code in an event,
#within a "script..." command: "bgm_changer(condition)" (without the quotes)
#replace the word condition with either true or false, depending on what you
#would like the option to be
#
#NOTE:
#Long song/author/genre names may look squashed. For optimal looks, try to keep
#names under 15 characters.
#==============================================================================
#==============================================================================


#==============================================================================
#Begin Configuration
#==============================================================================

module Playback
 UNLOCKABLES = true
 BGM_CHANGER = false
 PLAYBACK1 = [ "001-Battle01", "002-Battle02",   "003-Battle03",
              "004-Battle04",   "005-Boss01",     "006-Boss02",
                "007-Boss03",   "008-Boss04", "009-LastBoss01",
             "035-Dungeon01",   "063-Slow06",]
 PLAYBACK_INITIAL = [3,8]
 
 PLAYBACK_AUTHOR = {1  => "DragonForce", 2  => "Enterbrain", 3 => "Enterbrain",
                    4  => "Enterbrain" , 5  => "Enterbrain", 6 => "Enterbrain",
                    7  => "Enterbrain" , 8  => "Enterbrain", 9 => "Enterbrain",
                    10 => "Enterbrain" , 12 => "Enterbrain", }
 
 PLAYBACK_GENRE = {1 => "Classic"}
 
#==============================================================================
#End Configuration
#==============================================================================

 PLAYBACK2 = Dir.entries("Audio/BGM")
 PLAYBACK2.delete("..")
 PLAYBACK2.delete(".")
 for i in 0...PLAYBACK2.size
   PLAYBACK2[i] = PLAYBACK2[i].gsub(/[.][A-Za-z0-9._,]+/) {nil}
 end
 PLAYBACK = PLAYBACK2.concat(PLAYBACK1)
 PLAYBACK_UNLOCKED = []
 for i in 0...PLAYBACK.size
   PLAYBACK_UNLOCKED.push nil
 end
 unless PLAYBACK_INITIAL.empty?
   for i in 0...PLAYBACK_INITIAL.size
     PLAYBACK_UNLOCKED[PLAYBACK_INITIAL[i] -1] = PLAYBACK[PLAYBACK_INITIAL[i] -1]
   end
 end
 if !UNLOCKABLES
   for i in 0...PLAYBACK.size
     PLAYBACK_UNLOCKED[i] = PLAYBACK[i]
   end
 end
 unless $game_system == nil
   unless $game_system.bgm_changer == nil
     if $game_system.bgm_changer
       BGM_CHANGER = true
     elsif !$game_system.bgm_changer
       BGM_CHANGER = false
     end
   end
 end
 $playback_list = []
 for i in 0...PLAYBACK_UNLOCKED.size
   if PLAYBACK_UNLOCKED[i] != nil
     $playback_list[i] = [Playback::PLAYBACK_UNLOCKED[i],
                          Playback::PLAYBACK_AUTHOR[i+1] == nil ? "Unkown" :
                          Playback::PLAYBACK_AUTHOR[i+1],
                          Playback::PLAYBACK_GENRE[i+1] == nil ? "Unkown" :
                          Playback::PLAYBACK_GENRE[i+1]]
   end
 end
 $playback_list = $playback_list.compact
end

#==============================================================================
#**Window_Playback

#------------------------------------------------------------------------------
#This window displays the playback screen
#==============================================================================

class Window_Playback < Window_Selectable
 
 attr_accessor  :playback_bgm
 
 def initialize
   super (212,66,216,170)
   self.contents = Bitmap.new(width - 32, height - 32)
   @item_max = 4
   @column_max = 4
   self.z -= 100
   self.index = 0
   self.active = true
   #Get the playback bgm to draw the text right
   get_playback_bgm
   refresh
 end
 
 def refresh
   self.contents.clear
   unless $game_system.playback_list.empty?
     if $game_system.playback_list[@playback_bgm] != nil
       bgm = $game_system.playback_list[@playback_bgm][0]
     else
       @check = 0
       #check all possible songs for an unlocked entry
       loop do
         @check += 1
         @playback_bgm += 1
         @playback_bgm %= $game_system.playback_list.size
         if $game_system.playback_list[@playback_bgm] != nil
           bgm = $game_system.playback_list[@playback_bgm][0]
           break
         end
       end
     end
   else
     bgm = "No Songs Unlocked"
     $nosongs = true
   end
   if !$nosongs
     text = (@playback_bgm + 1).to_s + ": " + bgm
     if $game_system.playback_list[@playback_bgm] != nil
       text2 = "Author: " + $game_system.playback_list[@playback_bgm][1]
     else
       text2 = "Author: Unkown"
     end
     if $game_system.playback_list[@playback_bgm] != nil
       text3 = "Genre: " + $game_system.playback_list[@playback_bgm][2]
     else
       text3 = "Genre: Unkown"
     end
   else
     text = bgm
     text2 = ""
     text3 = ""
   end
   self.contents.draw_text(0,8,self.contents.width,32,text,1)
   self.contents.draw_text(0,40,self.contents.width,32,text2,1)
   self.contents.draw_text(0,72,self.contents.width,32,text3,1)
 end
 
 def update_cursor_rect
   self.cursor_rect.empty
 end
 
 def get_playback_bgm
   if $game_system.playback_bgm == nil
     @playback_bgm = 0
     $game_system.playback_bgm = @playback_bgm
   else
     @playback_bgm = $game_system.playback_bgm
   end
 end
end


#==============================================================================
#**Scene_Playback
#------------------------------------------------------------------------------
#This class handles processing for the playback window
#==============================================================================

class Scene_Playback
 
 #----------------------------------------------------------------------------
 # * Public Instance Variables
 #----------------------------------------------------------------------------
 attr_reader :mute
 
 def initialize(frommenu = false)
   @animation_flag = false
   @mute = false
   @temp_hash = {}
   @temp_hash2 = {}
   @temp_array = []
   if $game_system.playback_list.empty?
   $game_system.playback_list = $playback_list
   end
   if $game_system.sort_option == nil
     sort(0)
     $game_system.sort_option = 0
   else
     sort($game_system.sort_option)
   end
   for i in 0...$game_system.unlocked_songs.size
     unlock_song($game_system.unlocked_songs[i]+1)
   end
   if $game_temp.mute
     @mute = true
   end
   if $game_system.bgm_changer == nil
     $game_system.bgm_changer = Playback::BGM_CHANGER
   end
   if $game_temp.playing == nil
     @playing = false
   else
     @playing = $game_temp.playing
   end
   @frommenu = frommenu
 end
 
 def main
   #ensure map/menu bgm is kept
   $game_system.bgm_memorize
   @spriteset = Spriteset_Map.new
   @spriteset2 = Spriteset_Ipod.new
   @dummy_window = Ipod_Dummy.new
   @playback_window = Window_Playback.new
   @imenu_window = Window_iMenu.new
   Graphics.transition
   loop do
     Graphics.update
     Input.update
     update
     if $scene != self
       break
     end
   end
   Graphics.freeze
   @playback_window.dispose
   @spriteset.dispose
   @spriteset2.dispose
   $nosongs = false
   @dummy_window.dispose
   @imenu_window.dispose
 end
 
 def update
   if @playback_window.active
     update_playback
   end
   if @imenu_window.active
     update_imenu
   end
 end
 
 def update_playback
   if @playback_window.index != @playback_window_check
     @dummy_window.refresh(@playback_window.index)
   end
   if Input.repeat?(Input::RIGHT) && @playback_window.index == 3
     $game_system.se_play($data_system.cursor_se)
     @playback_window.index = 0
     return
   end
   if Input.repeat?(Input::LEFT) && @playback_window.index == 0
     $game_system.se_play($data_system.cursor_se)
     @playback_window.index = 3
     return
   end
   if Input.trigger?(Input::C)
     #Menu
     if @playback_window.index == 0
       $game_system.se_play($data_system.decision_se)
       @playback_window.active = false
       @playback_window.index = -1
       @imenu_window.visible = true
       @imenu_window.active = true
       @imenu_window.index = 0
       @imenu_wait = true
       return
     end
     unless $nosongs
       case @playback_window.index
       #Select next
       when 1
         $game_system.se_play($data_system.decision_se)
         #select the next BGM
         #the loop allows it to skip "nil" entries to aid in unlockables
         loop do
           @playback_window.playback_bgm += 1
           @playback_window.playback_bgm %= $game_system.playback_list.size
           $game_system.playback_bgm = @playback_window.playback_bgm
           if $game_system.playback_list[$game_system.playback_bgm] != nil
             break
           end
         end
         @playback_window.refresh
         #change the currently playing song if one was already playing
         if @playing
           bgm = RPG::AudioFile.new($game_system.playback_list[
                                    $game_system.playback_bgm][0],
                                    100, 100)
           $game_system.bgm_play(bgm)
           if @mute != false
             @mute = false
             @imenu_window.refresh
           end
         end
       #Play/Stop
       when 2
         if @init
           @init = false
         end
         if $game_system.playback_bgm != nil
           if !@playing
             $game_system.se_play($data_system.decision_se)
             #create BGM for playing
             bgm = RPG::AudioFile.new($game_system.playback_list[
                                      $game_system.playback_bgm][0],
                                      100,100)
             $game_system.bgm_play(bgm)
             if $game_system.bgm_changer
               $game_system.bgm_memorize
             end
           else
             $game_system.se_play($data_system.cancel_se)
             $game_system.bgm_play(nil)
           end
           if @mute != false
             @mute = false
             @imenu_window.refresh
           end
         end
         case @playing
         when true
           @playing = false
         when false
           @playing = true
         end
       #Select Previous
       when 3
         $game_system.se_play($data_system.decision_se)
         #select the previous BGM
         #the loop allows it to skip "nil" entries to aid in unlockables
         loop do
           @playback_window.playback_bgm += $game_system.playback_list.size - 1
           @playback_window.playback_bgm %= $game_system.playback_list.size
           $game_system.playback_bgm = @playback_window.playback_bgm
           if $game_system.playback_list[$game_system.playback_bgm] != nil
             break
           end
         end
         @playback_window.refresh
         #change the currently playing song if one was already playing
         if @playing
           bgm = RPG::AudioFile.new($game_system.playback_list[
                                    $game_system.playback_bgm][0],
                                    100, 100)
           $game_system.bgm_play(bgm)
           if @mute != false
             @mute = false
             @imenu_window.refresh
           end
         end
       end
     else
       $game_system.se_play($data_system.buzzer_se)
     end
   end
   if Input.trigger?(Input::B)
     $game_system.se_play($data_system.cancel_se)
     #get the correct @playing setting for when the iPod is restarted
     if $game_system.bgm_changer
       $game_temp.playing = @playing
     else
       @playing = false
     end
     if !@frommenu
       #restore the map/menu bgm
       if !$game_system.bgm_changer
         if @mute
           $game_map.map.bgm.volume = 0
         else
           $game_map.map.bgm.volume = 100
         end
         $game_system.bgm_play($game_map.map.bgm)
       end
       $scene = Scene_Map.new
       if !@playing && $game_system.bgm_changer
         if $game_system.playing_bgm == $game_map.map.bgm
           return
         end
         $game_system.bgm_play(nil)
       end
     else
       #restore the map/menu bgm
       if !$game_system.bgm_changer
         if @mute
           $game_map.map.bgm.volume = 0
         else
           $game_map.map.bgm.volume = 100
         end
         $game_system.bgm_play($game_map.map.bgm)
       end
       #change this to go to a different menu upon exit
       $scene = Scene_Menu.new
       if !@playing && $game_system.bgm_changer
         if $game_system.playing_bgm == $game_map.map.bgm
           return
         end
         $game_system.bgm_play(nil)
       end
     end
   end
   $game_temp.playing = @playing
   @playback_window_check = @playback_window.index
   @playback_window.update
 end
 
 def update_imenu
   if @imenu_wait
     @imenu_wait = false
     return
   end
   if @imenu_window.index != @imenu_window_check
     @dummy_window.refresh(@imenu_window.index)
   end
   if Input.repeat?(Input::RIGHT)
     if @imenu_window.index == 3
       $game_system.se_play($data_system.cursor_se)
       @imenu_window.index = 0
       return
     end
   end
   if Input.repeat?(Input::LEFT)
     if @imenu_window.index == 0
       $game_system.se_play($data_system.cursor_se)
       @imenu_window.index = 3
       return
     end
   end
   if Input.trigger?(Input::B)
     $game_system.se_play($data_system.cancel_se)
     @imenu_window.active = false
     @imenu_window.visible = false
     @playback_window.index = @imenu_window.index
     @imenu_window.index = -1
     @playback_window.active = true
   end
   if Input.trigger?(Input::C)
     case @imenu_window.index
     when 0
       $game_system.se_play($data_system.decision_se)
       if !@mute
         unless $game_system.playing_bgm == nil
           $game_system.playing_bgm.volume = 0
           $game_system.bgm_play($game_system.playing_bgm)
         end
         @mute = true
       elsif @mute
         unless $game_system.playing_bgm == nil
           $game_system.playing_bgm.volume = 100
           $game_system.bgm_play($game_system.playing_bgm)
         end
         @mute = false
       end
       @imenu_window.refresh
       $game_temp.mute = @mute
     when 1
       $game_system.se_play($data_system.cancel_se)
       if $game_system.bgm_changer
           $game_temp.playing = @playing
         else
           @playing = false
         end
         #restore the map/menu bgm
         if !$game_system.bgm_changer
             $game_system.bgm_play($game_map.map.bgm)
           end
         #change menu option 2 here
         $scene = Scene_Map.new
         if !@playing && $game_system.bgm_changer
           if $game_system.playing_bgm == $game_map.map.bgm
             return
           end
           $game_system.bgm_play(nil)
         end
     when 2
       if $nosongs
         $game_system.se_play($data_system.buzzer_se)
         return
       else
         $game_system.se_play($data_system.decision_se)
         $game_system.sort_option += 1
         $game_system.sort_option %= 3
         sort($game_system.sort_option)
         @imenu_window.refresh
         @playback_window.refresh
       end
     when 3

       $game_system.se_play($data_system.cancel_se)
       @imenu_window.active = false
       @imenu_window.visible = false
       @playback_window.index = @imenu_window.index
       @imenu_window.index = -1
       @playback_window.active = true
     end
   end
   @imenu_window.update
 end
end


#==============================================================================
#*unlock_song
#------------------------------------------------------------------------------
#Allows you to unlock songs for the playback window
#==============================================================================
def unlock_song(number)
 if $game_system.playback_list.empty?
   $game_system.playback_list = $playback_list
 end
 unless $game_system.playback_list.include?([
   Playback::PLAYBACK[number - 1], Playback::PLAYBACK_AUTHOR[number] || "Unkown",
   Playback::PLAYBACK_GENRE[number] || "Unkown"])
   for i in 0...Playback::PLAYBACK.size
     if $game_system.playback_list[i] == nil
       $game_system.playback_list[i] = [nil,nil,nil]
       $game_system.playback_list[i][0] = Playback::PLAYBACK[number - 1]
       $game_system.playback_list[i][1] =
       (Playback::PLAYBACK_AUTHOR[number] == nil ?
       "Unkown" : Playback::PLAYBACK_AUTHOR[number])
       $game_system.playback_list[i][2] =
       (Playback::PLAYBACK_GENRE[number] == nil ?
       "Unkown" : Playback::PLAYBACK_GENRE[number])
       $game_system.unlocked_songs.push(number - 1)
       return
     end
   end
 end
end


#==============================================================================
#*bgm_changer
#------------------------------------------------------------------------------
#Changes the BGM_CHANGER option for ingame use
#==============================================================================
def bgm_changer(condition)
 if !condition
   if $game_system.bgm_changer
     $game_system.bgm_changer = condition
   end
 else
   $game_system.bgm_changer = condition
 end
end


#==============================================================================
#**Spriteset_Ipod
#------------------------------------------------------------------------------
#Creates an "Ipod" Image at the centre of the screen
#==============================================================================
class Spriteset_Ipod
 def initialize
   @viewport = Viewport.new(208,53,224,374)
   @viewport.z = 5000
   @sprite = Sprite.new(@viewport)
   @sprite2 = Sprite.new
   @sprite2.bitmap = Bitmap.new(224,374)
   @ipod = RPG::Cache.picture('IPod.png')
   @sprite.bitmap = @ipod
 end

 def dispose
   @viewport.dispose
   @sprite.dispose
   @sprite2.dispose
 end
end


#==============================================================================
#**Ipod_Dummy
#------------------------------------------------------------------------------
#Creates the selection effect over the ipod image
#==============================================================================
class Ipod_Dummy < Window_Base
 
 def initialize
   super(208,53,224,374)
   self.contents = Bitmap.new(width - 32,height - 32)
   self.opacity = 0
   self.z = 9999
   refresh
 end
 
 def refresh(index = 0)
   self.contents.clear
   case index
   when 0
     rect = Rect.new(0,52,98,52)
     @bitmap = RPG::Cache.picture('IPod2.png')
     self.contents.blt(47,179,@bitmap,rect)
   when 1
     rect = Rect.new(52,104,52,98)
     @bitmap = RPG::Cache.picture('IPod2.png')
     self.contents.blt(113,199,@bitmap,rect)
   when 2
     rect = Rect.new(0,0,98,52)
     @bitmap = RPG::Cache.picture('IPod2.png')
     self.contents.blt(47,266,@bitmap,rect)
   when 3
     rect = Rect.new(0,104,52,98)
     @bitmap = RPG::Cache.picture('IPod2.png')
     self.contents.blt(26,199,@bitmap,rect)
   end
 end
end


#==============================================================================
# ** Game_System
#------------------------------------------------------------------------------
#  This class handles data surrounding the system. Backround music, etc.
#  is managed here as well. Refer to "$game_system" for the instance of
#  this class.
#==============================================================================
class Game_System
 
 #----------------------------------------------------------------------------
 # * Public Instance Variables
 #----------------------------------------------------------------------------
 attr_accessor :playback_bgm
 attr_accessor :unlocked_songs
 attr_accessor :bgm_changer
 attr_accessor :sort_option
 attr_accessor :playback_list
 
 alias initialize_ipod_later initialize
 def initialize
   initialize_ipod_later
   @unlocked_songs = []
   @playback_list = []
 end

end

#==============================================================================
# ** Game_Temp
#------------------------------------------------------------------------------
#  This class handles temporary data that is not included with save data.
#  Refer to "$game_temp" for the instance of this class.
#==============================================================================
class Game_Temp
 
 #----------------------------------------------------------------------------
 # * Public Instance Variables
 #----------------------------------------------------------------------------
 attr_accessor :playing
 attr_accessor :mute
 
end


#==============================================================================
# ** Game_Map
#------------------------------------------------------------------------------
#  This class handles the map. It includes scrolling and passable determining
#  functions. Refer to "$game_map" for the instance of this class.
#==============================================================================
class Game_Map
 
 #----------------------------------------------------------------------------
 # * Public Instance Variables
 #----------------------------------------------------------------------------
 attr_reader :map
 
end


#==============================================================================
# ** Window_iMenu
#------------------------------------------------------------------------------
#  This class creates a dummy selectable menu to use with the iPod script
#==============================================================================
class Window_iMenu < Window_Selectable
 def initialize
   super(212,66,216,170)
   self.contents = Bitmap.new(width - 32, height - 32)
   self.index = -1
   self.visible = false
   self.active = false
   self.z += 10
   @item_max = 4
   @column_max = 4
   refresh
 end
 
 def refresh
   self.contents.clear
   if $scene.mute
     self.contents.draw_text(0,-5,self.contents.width,32,"Unmute",1)
   else
     self.contents.draw_text(0,-5,self.contents.width,32,"Mute",1)
   end
   #change the bit in quotes below to reflect where your iPod menu's 2nd option
   #exits to i.e. "Exit to Main Menu" or "Exit to Equipment Screen"
   #be wary of long names, as they may look squashed
   self.contents.draw_text(0,27,self.contents.width,32,"Exit to Map",1)
   case $game_system.sort_option
   when 0
     sort = "Title"
   when 1
     sort = "Author"
   when 2
     sort = "Genre"
   end
   self.contents.draw_text(0,59,self.contents.width,32,"Sorted by: " + sort,1)
   self.contents.draw_text(0,91,self.contents.width,32,"Back",1)
 end
 
 def update_cursor_rect
   if @index < 0
     self.cursor_rect.empty
   else
     y = -5 + 32*@index
     cursor_rect.set(5,y,self.contents.width - 10,32)
   end
 end
 
end


#==============================================================================
#*Sort
#------------------------------------------------------------------------------
#Method to sort the unlocked songs array for the iPod script
#==============================================================================

def sort(choice)
 $game_system.playback_list =
 $game_system.playback_list.sort {|a, b| a[choice] <=> b[choice]}
 return $game_system.playback_list
end
[/SPOILER]


Instructions

Instructions in the script


Compatibility

Warning, WILL corrupt old savegames.
Otherwise, should be compatible with just about anything, including the SDK


Credits and Thanks



Author's Notes

Feel free to ask me any questions and PLEASE tell me if you find a bug.
I'm also quite willing to make customizations and such for this, provided they are within reason, and I have the time.

Have fun with it people ^_^

Don't forget to credit me if you use this in your game :P