#==============================================================================
#==============================================================================
#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