10 hours ago
HiddenPlayList XP
by Kyonides
Introduction
Well, this one is quite easy to explain: it's a simple jukebox script.

Script Call
Code:
$scene = HiddenPlay::Scene.newThe Script
Code:
# * HiddenPlayList XP * #
# Scripter : Kyonides Arkanthes
# 2026-06-18
# * REQUIRES HiddenChest v1.2.11 * #
# This scriptlet allows you to play a list of songs one after another.
# * Script Call * #
# $scene = HiddenPlay::Scene.new
module HiddenPlay
@menu_bgm = ["024-Town02", 50]
LIST_BGM_CHANNEL = 1
class Song < RPG::AudioFile
DIR = "Audio/BGM/"
def play(n)
@channel = n
Audio.bgms_play(@channel, DIR + @name, @volume, @pitch)
end
def pause
Audio.bgms_pause(@channel)
end
def resume
Audio.bgms_resume(@channel)
end
attr_accessor :title
end
class List
def initialize
@name = "Playlist"
@files = []
end
attr_accessor :name, :files
end
extend self
attr_reader :menu_bgm
class Scene
SELECT_LIST = "Select a Playlist"
EMPTY_LIST = "Empty List"
MENU_BGM = Song.new(*HiddenPlay.menu_bgm)
VOLUME = 40
def initialize
@loop_state = Audio.bgm_loop
Audio.bgm_loop = false
3.times {|n| Audio.bgms_fade(n + 1, 60) }
MENU_BGM.play(3)
@font_outline = Font.default_outline
Font.default_outline = true
@lists = []
@files = Dir["playlist*.txt"].sort
@files.each do |file|
lines = File.readlines(file)
list = List.new
list.name = lines.shift.chomp
lines.each do |line|
texts = line.split(" > ")
audio = Song.new
audio.title = texts.shift
audio.name = texts.shift.chomp
audio.volume = VOLUME
list.files << audio
end
@lists << list
end
@commands = @lists.map(&:name) || [EMPTY_LIST]
@playlist_empty = @lists.empty?
@index = @timer = 0
@stop = true
@stage = :main
end
def main
start
Graphics.transition
while @stage
Graphics.update
Input.update
update
end
Graphics.freeze
terminate
end
def start
@help_window = Window_Help.new
@help_window.set_text(SELECT_LIST, 1)
@list_window = Window_Command.new(240, @commands)
@list_window.y = 64
end
def update
update_timer
update_play
case @stage
when :main
update_main
when :list
update_list
end
end
def update_timer
return if @stop
if @timer == 0
@timer = 10
return
end
@timer -= 1
@play_next = @timer == 0
end
def update_play
return if @stop or !Audio.bgm_stopped?
if @play_next
@index = (@index + 1) % @file_max
@song_window.index = @index
file = @files[@index]
file.play(LIST_BGM_CHANNEL)
@play_next = nil
return @stage = :list
end
end
def update_main
@list_window.update
if Input.trigger?(:B)
$game_system.se_play($data_system.cancel_se)
Audio.bgms_stop_all
$scene = Scene_Map.new
return @stage = nil
elsif Input.trigger?(:C)
if @playlist_empty
$game_system.se_play($data_system.buzzer_se)
return
end
MENU_BGM.pause
n = @list_window.index
@list = @lists[n]
@files = @list.files
if @files.empty?
$game_system.se_play($data_system.buzzer_se)
@list = nil
return @files = nil
end
$game_system.se_play($data_system.decision_se)
@help_window.set_text(@list.name, 1)
@list_window.active = false
@list_window.visible = false
titles = @files.map(&:title)
@song_window = Window_Command.new(240, titles)
@song_window.y = 64
@file_max = @files.size
file = @files[0]
$game_system.bgms_play(LIST_BGM_CHANNEL, file)
@index = -1
@stop = nil
@stage = :list
end
end
def update_list
@song_window.update
if Input.trigger?(:B)
$game_system.se_play($data_system.cancel_se)
Audio.bgms_stop(LIST_BGM_CHANNEL)
MENU_BGM.resume
@help_window.set_text(SELECT_LIST, 1)
@song_window.dispose
@list_window.active = true
@list_window.visible = true
@stop = true
return @stage = :main
elsif Input.trigger?(:C)
$game_system.se_play($data_system.decision_se)
return if @song_window.index == @index
Audio.bgm_stop
@index = @song_window.index - 1
@stage = true
end
end
def terminate
Audio.bgm_loop = @loop_state
Font.default_outline = @font_outline
@list_window.dispose
@help_window.dispose
$game_map.autoplay
end
end
end
class Game_System
def bgms_play(n, bgm)
@playing_bgms ||= {}
@playing_bgms[n] = bgm
if bgm != nil and bgm.name != ""
Audio.bgms_play(n, "Audio/BGM/" + bgm.name, bgm.volume, bgm.pitch)
else
Audio.bgms_stop(n)
end
Graphics.frame_reset
end
def bgms_stop(n)
Audio.bgms_stop(n)
end
def bgm_fade(n, time)
@playing_bgms ||= {}
@playing_bgms[n] = nil
Audio.bgms_fade(n, time * 1000)
end
def bgms_memorize(n)
@memorized_bgms ||= {}
@memorized_bgms[n] = @playing_bgm
end
def bgms_restore(n)
bgms_play(n, @memorized_bgm)
end
endTerms & Conditions
Under MIT License.
That's it!
"For God has not destined us for wrath, but for obtaining salvation through our Lord Jesus Christ," 1 Thessalonians 5:9
Maranatha!
The Internet might be either your friend or enemy. It just depends on whether or not she has a bad hair day.
![[Image: SP1-Scripter.png]](https://www.save-point.org/images/userbars/SP1-Scripter.png)
![[Image: SP1-Writer.png]](https://www.save-point.org/images/userbars/SP1-Writer.png)
![[Image: SP1-Poet.png]](https://www.save-point.org/images/userbars/SP1-Poet.png)
![[Image: SP1-PixelArtist.png]](https://www.save-point.org/images/userbars/SP1-PixelArtist.png)
![[Image: SP1-Reporter.png]](https://i.postimg.cc/GmxWbHyL/SP1-Reporter.png)
My Original Stories (available in English and Spanish)
List of Compiled Binary Executables I have published...
HiddenChest & Roole
Give me a free copy of your completed game if you include at least 3 of my scripts!
Just some scripts I've already published on the board...
KyoGemBoost XP VX & ACE, RandomEnkounters XP, KSkillShop XP, Kolloseum States XP, KEvents XP, KScenario XP & Gosu, KyoPrizeShop XP Mangostan, Kuests XP, KyoDiscounts XP VX, ACE & MV, KChest XP VX & ACE 2016, KTelePort XP, KSkillMax XP & VX & ACE, Gem Roulette XP VX & VX Ace, KRespawnPoint XP, VX & VX Ace, GiveAway XP VX & ACE, Klearance XP VX & ACE, KUnits XP VX, ACE & Gosu 2017, KLevel XP, KRumors XP & ACE, KMonsterPals XP VX & ACE, KStatsRefill XP VX & ACE, KLotto XP VX & ACE, KItemDesc XP & VX, KPocket XP & VX, OpenChest XP VX & ACE
Maranatha!
The Internet might be either your friend or enemy. It just depends on whether or not she has a bad hair day.
![[Image: SP1-Scripter.png]](https://www.save-point.org/images/userbars/SP1-Scripter.png)
![[Image: SP1-Writer.png]](https://www.save-point.org/images/userbars/SP1-Writer.png)
![[Image: SP1-Poet.png]](https://www.save-point.org/images/userbars/SP1-Poet.png)
![[Image: SP1-Reporter.png]](https://i.postimg.cc/GmxWbHyL/SP1-Reporter.png)
My Original Stories (available in English and Spanish)
List of Compiled Binary Executables I have published...
HiddenChest & Roole
Give me a free copy of your completed game if you include at least 3 of my scripts!

Just some scripts I've already published on the board...
KyoGemBoost XP VX & ACE, RandomEnkounters XP, KSkillShop XP, Kolloseum States XP, KEvents XP, KScenario XP & Gosu, KyoPrizeShop XP Mangostan, Kuests XP, KyoDiscounts XP VX, ACE & MV, KChest XP VX & ACE 2016, KTelePort XP, KSkillMax XP & VX & ACE, Gem Roulette XP VX & VX Ace, KRespawnPoint XP, VX & VX Ace, GiveAway XP VX & ACE, Klearance XP VX & ACE, KUnits XP VX, ACE & Gosu 2017, KLevel XP, KRumors XP & ACE, KMonsterPals XP VX & ACE, KStatsRefill XP VX & ACE, KLotto XP VX & ACE, KItemDesc XP & VX, KPocket XP & VX, OpenChest XP VX & ACE

