Envision, Create, Share

Welcome to HBGames, a leading amateur game development forum and Discord server. All are welcome, and amongst our ranks you will find experts in their field from all aspects of video game design and development.

[XP]Berans' iPod script v1.13-final

IPod script
Version: 1.13-final
Type: Music Player


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. Keep in mind, this is only the 3rd script I've made so far.
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
  • NEW: BGM_CHANGER option now stored with your savegame changeable ingame with easy-to-use command
  • NEW: iPod menu with a few for-fun options. Including 1 easily customizable option
  • NEW: iPod menu now features a "sort by" option. Your selected option is saved in your savegame


Screenshots

http://img514.imageshack.us/img514/7193 ... niexz1.png[/img]

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
http://img513.imageshack.us/img513/8702/ipodtc0.png[/img]

http://img513.imageshack.us/img513/710/ipod2fe0.png[/img]


Demo

New Demo:
IPod Demo v1.00-beta
Note: For now, to test v1.12's new features, just insert the new script into the demo.

Script

The script should be placed somewhere above main, and below Scene_Debug
Code:
#==============================================================================
#==============================================================================
#Berans' "iPod" script v1.13-final
#Last edited: 12 August 2008
#
#------------------------------------------------------------------------------
#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)
#------------------------------------------------------------------------------
#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:
#------------------------------------------------------------------------------
#In the Configuration section below, add the names of all songs you want to be
#"unlockable". The names must be spelled exactly as in your "Audio/BGM" folder,
#enclosed in quotation marks, and separated by a comma
#example:
#PLAYBACK = ["yoursong-01", "yoursong-02", "someothersong"]
#In playback initial, add the number of all the songs you want to have initially
#unlocked, separated by comma. The numbers directly correspond to the position
#of the names in the PLAYBACK array.
#The PLAYBACK_AUTHOR and PLAYBACK_GENRE "hashes" respectively hold information on
#the author and genre, respectively, 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
  PLAYBACK = [ "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  => "Enterbrain", 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
#==============================================================================
 
  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
          $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
          $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


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 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
 
I'm happy it's so well-received.
I'm wondering though, for purposes of a "replay on/off" function, is there any way to find out when an ME file has ended? I am thinking about using a modified me_play when the "repeat" function is set to off, so that it automatically only plays the song once. I need to be able to change a variable as soon as it stops playing, but I have no clue where to begin XD
Any pointers?
If it's easier using a modified bgm_play instead I'm happy to take pointers on that too...

UPDATED to version 0.99-beta. No luck on the repeat function as of yet though, just some bugs worked out and a small extra feature for better customizability

UPDATED to version 1.00-beta. Pretty much gave up on the repeat function, but added a new feature and worked the code over a little.
 
Funny you'd say that. The guy who requested it actually wanted me to make something like MGS4 :P
Anyway, couple of bugs in the script which I've now fixed. Re-paste the script (which has now been updated) to get the fully working version
 
This looks pretty cool. So would the player be able to drag and drop their own songs into the sound folder for a customized soundtrack? Or will it only play what the project came with?
 
Due to the annoying nature of the engine, creating a custom soundtrack takes some setup, but its not that hard. There's a detailed explanation in the script, but basically, if you put songs in your Audio/BGM folder, and add the info in the config section of the script, it'll be added in the playlist. Sadly I could do something like a sort option because that's just too complicated atm XD
I tried to make the script as customizable as possible, where it was actually possible. So there's options in there that people might never even use XD
I used around 50+ lines of code just to save the BGM-changer ingame and in your saves without problem, and to allow for it to easily be changed ingame. I'm not even sure anyone will ever have it changed ingame XD
 
I know more or less how to sort. It's just that I'm still experimenting with it...due to the fact that I'm using a combination of hashes and arrays for ease of setup, sorting is somewhat tricky
 
that's an old bug sorry. It's fixed in the version I have but I'm working on a new feature before I'm updating it here :P
could you tell me the exact error so I can suggest a quick fix? I can't remember what was wrong XD

UPDATED to v1.12: After some hard thinking and experimenting, I've now implemented a fully working "sort-by" option. The songs are automatically sorted by song title until otherwise specified. Enjoy!
 
It was a line 515 nomethod error. Its because volume isn't set yet.
Edit: Ah, I see it was already fixed. Looks much better, Beran!
 
I'm glad its well-liked. I'm gonna implement another feature today specifically for the person who requested this script. There'll be an option to have certain songs/authors/genres heal you over time as you listen to them
 
Awesome, would be great if there was some way to unlock songs for the player to listen to as they progress through the game. But overall, very good job  :thumb:
 
There IS a way to do that lol. That requires the user to simply keep track of when the songs come up in the game. Whenever there's a song you haven't used before, simply add an event somewhere with the script "unlock_song(song number)"
Where song number is the number of the particular song you want to unlock, in your "PLAYBACK" array. All that requires you is to have all the songs you want to unlock in the "PLAYBACK" array initially.

On a sidenote: atm, with the new sort option, there's a rather bad problem when you unlock songs with gaps in between (i.e you've unlocked songs 1 and 3, or just 3)
I'm working on fixing the problem, but I just thought I'd let you know
 
I am absolutely in love with this script, but it needs a loop/playthrough feature.
That way someone doesnt hafta listen to the same song over and over again, if they forget to change it.
 
Sadly, making a loop/playthrough function is nearly impossible. Unless someone can either show me the Audio module of RGSS or tell me some way to find out when a file has actually finished playing. If someone could do that for me, it would be a matter of a couple of hours tops to fix it up. Also, I'm nearly done fixing the song-unlocking problem that came with the sorting functionality. I just need to review/rewrite a pretty large chunk of code first, so I'll have it up in some hours.
Sorry for releasing the new script with such a huge bug in it, was getting kinda late last night by the time I had it finished so I didn't check it well enough

UPDATED to v1.13: Fixed the major bugs that came with the sorting functionality and somewhat improved the way the script works. To ensure that the data is kept properly, the unlocked songs list is now kept as an array filled with arrays that contain the song-name, author-name and genre-name of each song respectively.
Please alert me if you find any bugs in the latest version.
EDIT: Made a tiny change in the script to reflect a the sort feature and not confuse people, not even worthy of a version change, but updated anyway
EDIT2: Made another tiny change to fix a bug caused by unlocking songs before the iPod has been opened at least once,simply a relocation of 3 lines of code, so not too noteworthy in terms of version number, might wanna re-copy the script though
 
This must be the simplest yet coolest script I've ever seen!
The whole iPod idea just doesn't go well with the standard RTP, but I could certainly use this for one of my games!

Keep scripting, man! :thumb:
 

Thank you for viewing

HBGames is a leading amateur video game development forum and Discord server open to all ability levels. Feel free to have a nosey around!

Discord

Join our growing and active Discord server to discuss all aspects of game making in a relaxed environment. Join Us

Content

  • Our Games
  • Games in Development
  • Emoji by Twemoji.
    Top