Sorry I'm just getting back to you... someone had hijacked my email account, so I didn't know anyone had responded.
The script is called 'Book/Library Scene', it looks like this:
#=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=
# Book/Library Scene
# Author: ForeverZer0
# Version: 1.2
# Date: 9.1.2010
#=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=
#
# Version History:
# v. 1.0 9.1.2010
# - Original version
# v. 1.1 9.3.2010
# - Added option for full-screen text
# - Made the page number window slightly wider
# v. 1.2 9.25.2010
# - Added option to simply call scene with the book ID argument and have
# that book already displayed.
#
# Introduction:
# Calls a scene that will allow player to read through books that they have
# collected.
#
# Features:
# - Easy to configure, text is read from an external text document
# - Text will automatically fit itself into the proper size for the window
# width and pages, regardless of font or font size.
#
# Instructions:
# 1. Fill in the configuration below.
# 2. Create a new folder within the "Data" folder, and name it "Books".
# 3. Within this folder, create simple text documents (.txt).
# 4. Name them EXACTLY as you did for its respective title (below).
# 5. Turn word-wrap OFF.
# 6. Create as large as document as you would like, but only break to a new
# line in between paragraphs, not when the text reaches the edge of the
# window. Every time a new line is started, it guarantees that the current
# line will start on a new line in the scene, regardless of the font size.
#
# Use the following Script Calls:
# Books.unlock(BOOK_ID)
# - Unlocks the book with BOOK_ID
# $scene = Scene_Book.new
# - Calls the Book scene.
# $scene = Scene_Book.new(BOOK_ID)
# - Calls the book scene. The book with BOOK_ID will already be displayed.
# This will also disable the book list feature. The book does not have
# to be unlocked to call this way.
#
# Credits/Thanks:
# ForeverZer0, for the script
# Blizzard, for the "slice_text" method
#=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=
module Books
#===============================================================================
# BEGIN CONFIGURATION
#===============================================================================
RETURN_SCENE = Scene_Map
# Class of the scene that the game return to after you exit the book scene.
SORT_BY_ID = true
# If true, the books will be listed in order of their Book ID, else they will
# be listed in the order they were aquired.
PAGE_TURN_SE = ['046-Book01', 80, 100]
# Set to the name of the SE that will be played when a player turns a page.
# Set to nil to disable this feature. [FILENAME, VOLUME, PITCH]
FULLSCREEN_TEXT = false
# If true, the text window will extend over the book list and take up the
# entire screen (minus the header).
def self.title(book_id)
# Here is where you define the labels used for the books. The titles will
# be used as the filename to be loaded as well.
# when BOOK_ID then 'TITLE'
return case book_id
when 0 then 'journal0'
when 1 then 'journal1'
end
end
#===============================================================================
# END CONFIGURATION
#===============================================================================
def self.unlock(book_id)
# Adds the Book ID to the array.
unless $game_system.books.include?(book_id)
$game_system.books.push(book_id)
# Sorts the array by the Book IDs if so configured.
if SORT_BY_ID
$game_system.books.sort!
end
end
end
def self.get_text(book_id)
# Opens a text document, makes an array whose elements consist of the lines
# of the document, and returns it.
filename = 'Data/Books/' + title(book_id) + '.txt'
begin
file = File.open(filename, 'r')
rescue
raise("Error occured while attempting to open the following file:\n\n" +
"\t#{filename}\n\n" +
"Please make sure that the file exist before you continue.")
end
book = []
file.each_line {|line| book.push(line)}
file.close
return book
end
end
#===============================================================================
# ** Game_System
#===============================================================================
class Game_System
attr_accessor :books # Array: Stores the IDs of all unlocked books.
alias zer0_book_init initialize
def initialize
zer0_book_init
@books = []
end
end
#===============================================================================
# ** Scene_Book
#===============================================================================
class Scene_Book
def initialize(book_id = nil)
@book_id = book_id
@no_list = @book_id != nil
end
def main
# Create a variable that is set to the window width (depending on config)
@window_width = Books::FULLSCREEN_TEXT ? 640 : 512
@window_width = 640 if @no_list
# Create a blank dummy window.
@dummy_window = Window_Base.new(128, 64, 512, 416)
# Create Help_Window to display the book titles.
@help_window = Window_Base.new(0, 0, 448, 64)
@help_window.contents = Bitmap.new(416, 32)
# Create the page number window
@page_window = Window_Base.new(448, 0, 192, 64)
@page_window.contents = Bitmap.new(160, 32)
# Create the window that text will be displayed on.
x = @window_width == 640 ? 0 : 128
@text_window = Window_Base.new(x, 64, @window_width, 416)
@text_window.contents = Bitmap.new(@window_width - 32, 384)
@text_window.z = @help_window.z + 20
@text_window.visible = false
# Make a copy of the Books array.
@books = $game_system.books.clone
# Create instance variable for updating the text window.
@update_text = false
# Make list of all books, if possible, else make list empty.
if @books.empty?
help_string = 'No books are currently available.'
@command_window = Window_Base.new(0, 64, 128, 416)
else
help_string = 'Whick book would you like to read?'
@titles = []
@books.each {|book_id| @titles.push(Books.title(book_id))}
@command_window = Window_Command.new(128, @titles)
@command_window.height, @command_window.y = 416, 64
end
# Display text on the help screen
@help_window.contents.draw_text(0, 0, 416, 32, help_string, 1)
# Create array that holds all the windows
@windows = [@dummy_window, @help_window, @text_window,
@command_window, @page_window]
if @no_list
@page_number = 1
$game_system.se_play($data_system.decision_se)
@help_window.contents.clear
@help_window.contents.draw_text(0, 0, 416, 32, Books.title(@book_id), 1)
@command_window.active, @update_text = false, true
compile_text
@text_window.visible = true
end
Graphics.transition
# Main loop
loop {Graphics.update; Input.update; update; break if $scene != self}
Graphics.freeze
@windows.each {|window| window.dispose}
end
def update
# Update windows.
@windows.each {|window| window.update}
if @command_window.is_a?(Window_Command) && @command_window.active
update_command_window
return
elsif @update_text
update_text_window
return
end
if Input.trigger?(Input::B)
$game_system.se_play($data_system.cancel_se)
$scene = Books::RETURN_SCENE.new
end
end
def update_command_window
if Input.trigger?(Input::B)
$game_system.se_play($data_system.cancel_se)
$scene = Books::RETURN_SCENE.new
elsif Input.trigger?(Input::C)
@page_number = 1
$game_system.se_play($data_system.decision_se)
@book_id = @books[@command_window.index]
@help_window.contents.clear
@help_window.contents.draw_text(0, 0, 416, 32, Books.title(@book_id), 1)
@command_window.active, @update_text = false, true
compile_text
@text_window.visible = true
end
end
def update_text_window
if Input.trigger?(Input::LEFT) || Input.trigger?(Input::RIGHT)
old_page = @page_number
@page_number += Input.trigger?(Input::LEFT) ? -1 : 1
@page_number = [[@page_number, @pages.size].min, 1].max
# Play SE if configured as such.
if old_page != @page_number && Books::PAGE_TURN_SE != nil
se = Books::PAGE_TURN_SE
audio = RPG::AudioFile.new(se[0], se[1], se[2])
$game_system.se_play(audio)
end
# Refresh the window
refresh_text
elsif Input.trigger?(Input::B)
$game_system.se_play($data_system.cancel_se)
if @no_list
$scene = Books::RETURN_SCENE.new
else
@update_text, @command_window.active = false, true
@text_window.visible = false
end
end
end
def compile_text
# Gets an array whose elements are the lines of the text document.
text = Books.get_text(@book_id)
# Iterate over each line of the text. Break each line up into segments that
# will fit into the window, then add them all together.
@pages, lines = [], []
text.each {|paragraph|
segment = @text_window.contents.slice_text(paragraph, @window_width - 32)
segment.each {|line| lines.push(line)}
}
# Organizes the lines (12 per page) into pages.
page_numbers = (lines.size / 12) + 1
(0...page_numbers).each {|i| @pages[i] = lines[i*12, 12]}
refresh_text
end
def refresh_text
[@text_window.contents, @page_window.contents].each {|bitmap| bitmap.clear}
# Displays the lines of the current page onto the window.
page = @pages[@page_number - 1]
page.each_index {|i|
@text_window.contents.draw_text(0, i*32, @window_width - 32, 32, page[i])}
# Set the proper text to the page screen.
string = "Page #{@page_number}/#{@pages.size}"
@page_window.contents.draw_text(0, 0, 160, 32, string, 1)
end
end
class Bitmap
# The slice_text method was created by Blizzard. I take no credit for it.
def slice_text(text, width)
words = text.split(' ')
return words if words.size == 1
result, current_text = [], words.shift
words.each_index {|i|
if self.text_size("#{current_text} #{words[i]}").width > width
result.push(current_text)
current_text = words[i]
else
current_text = "#{current_text} #{words[i]}"
end
result.push(current_text) if i >= words.size - 1}
return result
end
end
Here is my Window_Command
#==============================================================================
# ** Window_Command
#------------------------------------------------------------------------------
# This window deals with general command choices.
#==============================================================================
class Window_Command < Window_Selectable
#--------------------------------------------------------------------------
# * Object Initialization
# width : window width
# commands : command text string array
#--------------------------------------------------------------------------
def initialize(width, commands)
# Compute window height from command quantity
super(0, 0, width, commands.size * 32 + 32)
@item_max = commands.size
@commands = commands
self.contents = Bitmap.new(width - 32, @item_max * 32)
refresh
self.index = 0
end
#--------------------------------------------------------------------------
# * Refresh
#--------------------------------------------------------------------------
def refresh
self.contents.clear
for i in 0...@item_max
draw_item(i, normal_color)
end
end
#--------------------------------------------------------------------------
# * Draw Item
# index : item number
# color : text color
#--------------------------------------------------------------------------
def draw_item(index, color)
self.contents.font.color = color
rect = Rect.new(4, 32 * index, self.contents.width - 8, 32)
self.contents.fill_rect(rect, Color.new(0, 0, 0, 0))
self.contents.draw_text(rect, @commands[index])
end
#--------------------------------------------------------------------------
# * Disable Item
# index : item number
#--------------------------------------------------------------------------
def disable_item(index)
draw_item(index, disabled_color)
end
end
I don't see a specific Window_MenuCommand