Main Menu
  • Welcome to The RPG Maker Resource Kit.

Beran's iPod script v1.15-final

Started by Berans, August 22, 2008, 07:13:46 AM

0 Members and 1 Guest are viewing this topic.

Berans

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


  • Relatively easy setup
  • IPod Graphic
  • Allows for as many songs as you wish
  • 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
  • iPod menu with some for-fun, customizable options
  • NEW: iPod menu now features a "sort-by" option (title, author or genre). Your selected option is saved with your game


Screenshots



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]



[/SPOILER]


Demo

Latest Demo:
iPod Demo v1.00-beta

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


  • Berans - Creating the script
  • Blizzard - Learnt a lot from his scripts in terms of general knowledge and scripting conventions
  • Sniper308 - For requesting the script and suggesting many of the great features
  • LandOfShadows - Use of one of his windowskins in the demo


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