################################################################ # RETCON Library # In Game Sound Test Version 1.3 # Author: Matt # Script is free for usage, but please give credit where credit # is due. :) ################################################################ # PURPOSE # This script allows users to have an in-game sound test, where # players may listen to all the songs in the game. # # There are two ways to use this script: # Jukebox style: # Define an event in the game world to run this script. Syntax is: # SceneManager.call(Scene_SoundTest) # This will run the script as-is. # # Title Screen style: # The other usage is to run it from your title screen. Turning on the # appropriate boolean variable will add it to the the title screen. # # Running Jukebox Style allows for discovery mode. Users can customize the # script so that songs in the sound test are only revealed when they are # first encountered in the game. ################################################################ # UPDATE HISTORY # 1.3 - Now part of a library called RETCON. # 1.2 - Hey cool, Matt figured out aliases! No more overwrites! Should now # play nicely with other scripts! # 1.1 - Added method to escape with the cancel key. # - Fixed issue wherein song progress would not be saved after shutdown. # 1.0 - First draft ################################################################ # METHODOLOGY # Two new window classes are created: # # Window_SoundTest -- Derived from Window_Command # Creates the actual sound test command window. Lists all the songs out # with their titles. # # Window_SoundTestDesc - Derived from Window_Selectable # Puts the currently selected song's description in its own window line. # # One new scene class is created: # # Scene_SoundTest -- Derived from Scene_MenuBase # Puts the entire Soundtest in a new "scene". # # Four classes are overwritten to accommodate the sound test: # # The most important is: RPG::BGM, which added a line to turn # the song in the hash listing to true when it gets activated. # # The Game_Party class is modified so that progress in unlocking # songs is saved in the global $game_party class. # # Classes Window_TitleCommand and Scene_Title also get overwritten # to accommodate accessing the sound test from the title screen. ################################################################ # CUSTOMIZATION # In the module here, you will define each song in the matrix # that you want in the sound test. First is the file name, (sans extension) # then the song name, then the song description. # # All songs must be written as they are in your game database. Make sure to # increment the MusicLibrary array for each new song you use. # # Example: # MusicLibrary[0] = ["002-Battle02", "Battle of the Dancers", "The default battle music"] # MusicLibrary[1] = ["037-Dungeon03", "Mysteries Within", "Tower exploration music"] # MusicLibrary[2] = ["Field4-2k", "Song of Adventures Past", "Third world map music"] # etc. module RETCON module SoundTest MusicLibrary = Array.new #edit here, dawg MusicLibrary[0] = ["002-Battle02", "Battle of the Dancers", "The default battle music"] MusicLibrary[1] = ["037-Dungeon03", "Mysteries Within", "Tower exploration music"] MusicLibrary[2] = ["Field4-2k", "Song of Adventures Past", "Third world map music"] #This adjusts the width of the box, default size is 300 WindowWidth = 300 #Number of menu items to display at once NumOfLines = 5 #Offset for the song menu. Set to 0 to align at the bottom Offset = 75 #Volume of the songs to be played at in the soundtest. Volume = 50 #Size of the descriptor window. This size is added onto the size of the #window menu to make it wider DescWindowSize = 75 #Descriptor window offset. Set to 0 to align at the top DescOffSet = 75 #Locked song on menu text. Value must be a string. LockedDisp = "???" #Description for locked song. Value must also be a string. LockedDesc = "Song Currently Locked!" #Name in the song menu to exit out of the sound test ExitDisp = "Exit" #Description for when the exit command is highlighted. ExitDesc = " " #Variable on making songs locked when the game first starts. #If set to true, then songs will be locked until they are first #played in the game. Set to false, all the songs will be made #available. Value must be a boolean. #NOTE: If this value is set to true, then set TitleScreenDisplay to false! MakeTheHash = true #Enables the sound test to be accessed from the title screen #NOTE: MakeTheHash --must-- be set to false! Otherwise you'll #get a bunch of locked songs! Value also must be a boolean. TitleScreenDisplay = false #Name of the command in the title menu. Value must be a string. TitleScreenName = "Sound Test" ################################################################ #Customization ends here! #You shouldn't really edit below here, but if you know what #you're doing, it won't be a big deal. Edit at your own risk and #all that jazz. ################################################################ end end ################# #CLASS ORIGINALS# ################# #Initializes the Music Library into a window with appropriate key class Window_SoundTest < Window_Command def initialize super(0, 0) update_placement refresh self.openness = 0 open end def visible_line_number return RETCON::SoundTest::NumOfLines end def window_width return RETCON::SoundTest::WindowWidth end #places the location of the sound test menu def update_placement self.x = (Graphics.width - RETCON::SoundTest::WindowWidth) / 2 self.y = (Graphics.height - height) - RETCON::SoundTest::Offset end #creates the command list for playing songs def make_command_list i = 0 while i < RETCON::SoundTest::MusicLibrary.size if $game_party.music_hash[RETCON::SoundTest::MusicLibrary[i][0]] == false add_command(RETCON::SoundTest::LockedDisp, :soundtestblank) else add_command(RETCON::SoundTest::MusicLibrary[i][1], :soundtestitem) end i += 1 end #adds the exit option to the menu add_command(RETCON::SoundTest::ExitDisp, :exit) end end #Description window class class Window_SoundTestDesc < Window_Selectable def initialize super(0, 0, RETCON::SoundTest::WindowWidth + RETCON::SoundTest::DescWindowSize, fitting_height(1)) update_placement refresh end def update_placement self.x = (Graphics.width - width) / 2 self.y += RETCON::SoundTest::DescOffSet end def refresh super update_text(@songindex) end #updates the descrption window when changing selection def update_text(songindex) @songindex = songindex contents.clear draw_text(0, 0, width, line_height, @songindex) end end #Sets objects in the window to play them in a new scene class Scene_SoundTest < Scene_MenuBase def initialize super create_background create_soundtest end #creates both windows def create_soundtest @stest = Window_SoundTest.new @stestdesc = Window_SoundTestDesc.new i = 0 while i < RETCON::SoundTest::MusicLibrary.size @stest.set_handler(:soundtestitem, method(:playsong)) @stest.set_handler(:soundtestblank, method(:empty)) i += 1 end @stest.set_handler(:exit, method(:backout)) @stest.set_handler(:cancel, method(:return_scene)) end #function that calls a song play def playsong @stest.active = true Audio.bgm_play('Audio/BGM/' + RETCON::SoundTest::MusicLibrary[@stest.index][0], RETCON::SoundTest::Volume, 100) end #Should a player decide to try and a play a locked song, this acts as #a dummy function def empty @stest.active = true end def backout @stest.close SceneManager.return end #updates the decsription window def update super if @stest.index < RETCON::SoundTest::MusicLibrary.size if $game_party.music_hash[RETCON::SoundTest::MusicLibrary[@stest.index][0]] == true @stestdesc.update_text(RETCON::SoundTest::MusicLibrary[@stest.index][2]) else @stestdesc.update_text(RETCON::SoundTest::LockedDesc) end else @stestdesc.update_text(RETCON::SoundTest::ExitDesc) end end end ############### #CLASS ADDENDA# ############### #Modify BGM class to change hash values to true when song plays for the #first time, thus unlocking them in the menu. class RPG::BGM < RPG::AudioFile alias st_play_function play def play(pos = 0) st_play_function $game_party.song_played(@name) end end #Initalizes/saves the hash in the Game_Party class, and can be accessed #via $game_party.music_hash class Game_Party < Game_Unit attr_accessor :music_hash alias st_retain_previous initialize def initialize st_retain_previous @music_hash = Hash.new make_the_hash end #initalizes the song hash. true means songs are locked. false means # they're all available. def make_the_hash i = 0 while i < RETCON::SoundTest::MusicLibrary.size if RETCON::SoundTest::MakeTheHash == true @music_hash.merge! RETCON::SoundTest::MusicLibrary[i][0] => false else @music_hash.merge! RETCON::SoundTest::MusicLibrary[i][0] => true end i += 1 end end #updates the hash when a song is unlocked. def song_played(nameofsong) @music_hash[nameofsong] = true end end #Adds function to Title Screen window class to add soundtest option to menu. class Window_TitleCommand < Window_Command alias st_command_list make_command_list def make_command_list st_command_list if RETCON::SoundTest::TitleScreenDisplay == true add_command(RETCON::SoundTest::TitleScreenName, :soundtest) end end end #Adds soundtest option to Scene_Title and displays it. class Scene_Title < Scene_Base alias st_command_window create_command_window def create_command_window st_command_window @command_window.set_handler(:soundtest, method(:command_soundtest)) end def command_soundtest close_command_window SceneManager.call(Scene_SoundTest) end end