RMRK is retiring.
Registration is disabled. The site will remain online, but eventually become a read-only archive. More information.

RMRK.net has nothing to do with Blockchains, Cryptocurrency or NFTs. We have been around since the early 2000s, but there is a new group using the RMRK name that deals with those things. We have nothing to do with them.
NFTs are a scam, and if somebody is trying to persuade you to buy or invest in crypto/blockchain/NFT content, please turn them down and save your money. See this video for more information.
[RMXP] Trying to Customize Menu for Book Script, specific problem

0 Members and 1 Guest are viewing this topic.

**
Rep:
Level 67
TheNeonHeart.com
I'm using a book script by ForeverZer0, and I don't remember how but I remember I did something to get a 'books' label to show up on the menu, and it works, I can access the various books I activate during the game, which is what I want it to do. But there's a problem with the menu where it will show the book on the sidebar, and then when I select the book, it will switch to displaying the book's text, in a mode where it then shows the title on top... but still keeps the sidebar active. So, the two titles are redundant, and I want the sidebar to go away once I select the book.

Spoiler for:
Spoiler for:

It doesn't do this when I call the book scene directly from the game. Then it looks like this which is what I want it to look like when you choose a book from the menu.

Spoiler for:

Also, I guess I'm going to have a problem with changing the windowskin from when you access the menu to when you choose a book. I want it to be two different windowskins, and right now it is only the one, the whole menu the same as the book. So, I'm also wondering if there is a way to change the windowskin once you select a book and it opens.

Spoiler for:

If you can help me with this I'll appreciate it. Thanks for reading.
And if you stare for long enough into the abyss... you just might stare it down.

My Games: ExXception Draft
My Awesome Homepage The Neon Heart.com Host to My Writing / Music / Reviews / and More

*
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
Rep:
Level 96
&&&&&&&&&&&&&&&&&&&&&&&&&&&
GIAW 14: 2nd Place (Hard Mode)2013 Biggest Drama Whore2013 Zero to HeroParticipant - GIAW 11Secret Santa 2013 ParticipantFor taking arms in the name of your breakfast.
This the code you used?

Code: [Select]
#+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
# Journal
# Author: ForeverZer0
# Version: 2.4
# Data: 12.30.2010
#+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
#
# Introduction:
#   I wrote this script after seeing a request here on CP for something similar.
#   It basically just allows the player to view a Journal that show the player
#   information about people they have encountered and places they have visited.
#   Can also log weapons, armors, and items.

# Features:
#   - Easy to use/configure
#   - Nice simple interface
#   - Will log people, places, weapons, armors, and items seperately
#   - Configurable what type of entries you would like to log.
#   - Configurable layout
#   - Option to use pictures
#   - Fully compatible "stats" you want the system to display.
#
# Instructions:
#   - Place script in the usual place.
#   - All configuration is below, and explained in each section.
#   - All pictures must be in folder labeled "Journal" within your game's
#     Picture folder.
#   - All you have to do is assign arbitrary "ids" to each person and location
#     respectively. After you have completed configuration, when you want the
#     person/place to be added to the Journal, use these script calls:
#
#       Journal.add_character(ID)
#       Journal.add_location(ID)
#       Journal.add_weapon(ID)
#       Journal.add_armor(ID)
#       Journal.add_item(ID)
#
#       You can also delete entries in the same way:
#
#       Journal.delete_character(id)
#       Journal.delete_location(id)
#       Journal.delete_weapon(id)
#       Journal.delete_armor(id)
#       Journal.delete_item(id)
#
#     Where the "ID" is the number you assigned to each.
#   - To call the scene, use this script call:
#
#       $scene = Scene_Journal.new
#
#   - The script comes with a fix for those who like to use smaller text sizes
#     (like myself), which will allow for more information to be displayed on
#     the screen at once.
#   - If you would like to change the look up a little bit, just change around
#     the X and Y values in Window_Journal.
#
# Credits/Thanks:
#   - ForeverZer0, for the script.
#
#=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=
#                           BEGIN CONFIGURATION
#=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=

module Journal
 
  # If true, a line height of 20 pixels will be used, which looks better with
  # smaller font sizes.
  SMALL_TEXT = true
  # The width of the entry list used for Scene_Journal. The other windows will
  # automatically adjust to this width.
  LIST_WIDTH = 192
 
  # Define what aspects of the journal you would like to use. Choose from the
  # values listed below and add them to the array. DO NOT change the values.
  # Omit values for types you do not want to use.
  #        'People' - 'Places' - 'Weapons' - 'Armors' - 'Items'
  LIST_ORDER = ['People', 'Places', 'Weapons', 'Armors', 'Items']
 
  # Configure if you would like for items, weapons, and armors to be unlocked
  # automatically when they are first aquired by the player. If using this
  # options, IDs MUST match the IDs used in the Database. You will also need to
  # manually add anything the player begins with at game start.
  AUTO_WEAPONS = true
  AUTO_ARMORS = true
  AUTO_ITEMS = true
 
#-------------------------------------------------------------------------------
  CHARACTER_STATS = ['Name:', 'Race:', 'Age:', 'Height:', 'Weight:']
 
  # Configure the values used for the above array for each character. Just make
  # sure the value that corresponds to each stat is at the same index in the [].
  # Just make sure that the first stat is the name, it will be used on the menu
  # to select which character/location will be viewed.
  def self.character_info(id)
    info = case id
    when 1 then ['Aluxes', 'Human', '19', '5\'10"', '165 lbs.']
    when 2 then ['Hilda', 'Human', '20', '5\'5"', '113']
    when 3 then ['Basil', 'Human', '24', '6\'0"', '187 lbs.']
    end
    return info != nil ? info : []
  end
 
  # Short paragraph/description of character. Uses Blizzard's slice_text method
  # to automatically break to next line when needed, so do not concern yourself
  # with that.
  def self.character_bio(id)
    text = case id
    when 1
      'Our everyday hero, that seems to make an appearance in every demo.'
    when 2
      'Random witch girl.'
    when 3
      'Another RPGXP character.'
    end
    return text != nil ? text : ''
  end
#-------------------------------------------------------------------------------
  LOCATION_STATS = ['Name:', 'Country:']
 
  # Configure the values used for the above array for each location. Just make
  # sure the value that corresponds to each stat is at the same index in the [].
  # Just make sure that the first stat is the name, it will be used on the menu
  # to select which character/location will be viewed.
  def self.location_info(id)
    info = case id
    when 1 then ['New York', 'USA']
    when 2 then ['Ohio', 'USA']
    when 3 then ['Iowa', 'Who cares...']
    end
    return info != nil ? info : []
  end
 
  # Short paragraph/description of location. Uses Blizzard's slice_text method
  # to automatically break to next line when needed, so do not concern yourself
  # with that.
  def self.location_bio(id)
    return case id
    when 1
      'The state north of Pennsylvania.'
    when 2
      'The state west of Pennsylvania.'
    when 3
      'A boring state.'
    else
      ''
    end
  end
#-------------------------------------------------------------------------------
  WEAPON_STATS = ['Name:', 'Origin:']
   
  def self.weapon_info(id)
    text = case id
    when 1 then ['Bronze Sword', 'Everywhere.']
    when 2 then ['Iron Sword', 'Right here.']
    when 3 then ['Mythril Sword', 'Blah blah.']
    end
  end
 
  def self.weapon_bio(id)
    return case id
    when 1
      'Simple sword. Seems to be the standard that all RPG games have the hero start with.'
    when 2
      'Slighly better than the Bronze sword.'
    when 3
      'Yet another sword that is in almost every RPG.'
    else
      ''
    end
  end
#-------------------------------------------------------------------------------
  ARMOR_STATS = ['Name:', 'Origin:']
   
  def self.armor_info(id)
    text = case id
    when 1 then ['', '']
    when 2 then ['', '']
    when 3 then ['', '']
    end
  end
 
  def self.armor_bio(id)
    return case id
    when 1
      ''
    when 2
      ''
    when 3
      ''
    else
      ''
    end
  end
#-------------------------------------------------------------------------------
  ITEM_STATS = ['Name:', 'Origin:']
 
  def self.item_info(id)
    text = case id
    when 1 then ['', '']
    when 2 then ['', '']
    when 3 then ['', '']
    end
  end
 
  def self.item_bio(id)
    return case id
    when 1
      ''
    when 2
      ''
    when 3
      ''
    else
      ''
    end
  end
#-------------------------------------------------------------------------------

  # Set the following to true if you would loke pictures to be displayed for
  # the respective type of Journal entries. They will be defined below.
  CHARACTER_PIC = true
  LOCATION_PIC = true
  WEAPON_PIC = true
  ARMOR_PIC = true
  ITEM_PIC = true
 
  # Filenames of character pictures.
  def self.character_pic(id)
    file = case id
    when 1 then 'Aluxes'
    when 2 then 'Hilda'
    when 3 then 'Basil'
    end
    return file != nil ? RPG::Cache.picture("Journal/#{file}") : Bitmap.new(1,1)
  end
 
  # Filenames of location pictures.
  def self.location_pic(id)
    file = case id
    when 1 then ''
    when 2 then ''
    when 3 then ''
    end
    return file != nil ? RPG::Cache.picture("Journal/#{file}") : Bitmap.new(1,1)
  end 
 
  # Filename of weapon pictures.
  def self.weapon_pic(id)
    file = case id
    when 1 then ''
    when 2 then ''
    when 3 then ''
    end
    return file != nil ? RPG::Cache.picture("Journal/#{file}") : Bitmap.new(1,1)
  end
 
  # Filename of weapon pictures.
  def self.armor_pic(id)
    file = case id
    when 1 then ''
    when 2 then ''
    when 3 then ''
    end
    return file != nil ? RPG::Cache.picture("Journal/#{file}") : Bitmap.new(1,1)
  end

  # Filenames of item pictures.
  def self.item_pic(id)
    file = case id
    when 1 then ''
    when 2 then ''
    when 3 then ''
    end
    return file != nil ? RPG::Cache.picture("Journal/#{file}") : Bitmap.new(1,1)
  end

#=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=
#                           END CONFIGURATION
#=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=

  def self.add_character(id)
    unless $game_system.journal['People'].include?(id)
      $game_system.journal['People'].push(id)
      $game_system.journal['People'].sort!
    end
  end
 
  def self.add_location(id)
    unless $game_system.journal['Places'].include?(id)
      $game_system.journal['Places'].push(id)
      $game_system.journal['Places'].sort!
    end
  end
 
  def self.add_weapon(id)
    unless $game_system.journal['Weapons'].include?(id)
      $game_system.journal['Weapons'].push(id)
      $game_system.journal['Weapons'].sort!
    end
  end
 
  def self.add_armor(id)
    unless $game_system.journal['Armors'].include?(id)
      $game_system.journal['Armors'].push(id)
      $game_system.journal['Armors'].sort!
    end
  end
 
  def self.add_item(id)
    unless $game_system.journal['Items'].include?(id)
      $game_system.journal['Items'].push(id)
      $game_system.journal['Items'].sort!
    end
  end

  def self.delete_character(id)
    $game_system.journal['People'].delete(id)
    $game_system.journal['People'].sort!
  end
 
  def self.delete_location(id)
    $game_system.journal['Places'].delete(id)
    $game_system.journal['Places'].sort!
  end
 
  def self.delete_weapon(id)
    $game_system.journal['Weapons'].delete(id)
    $game_system.journal['Weapons'].sort!
  end
 
  def self.delete_armor(id)
    $game_system.journal['Armors'].delete(id)
    $game_system.journal['Armors'].sort!
  end
 
  def self.delete_item(id)
    $game_system.journal['Items'].delete(id)
    $game_system.journal['Items'].sort!
  end
end

#===============================================================================
# ** Game_System
#===============================================================================

class Game_System
 
  attr_accessor :journal
 
  alias zer0_journal_init initialize
  def initialize
    zer0_journal_init
    @journal = {}
    Journal::LIST_ORDER.each {|key| @journal[key] = [] }
  end
 
  def journal_entries(type)
    entries = []
    case type
    when 'People'
      @journal[type].each {|id| entries.push(Journal.character_info(id)[0]) }
    when 'Places'
      @journal[type].each {|id| entries.push(Journal.location_info(id)[0]) }
    when 'Weapons'
      @journal[type].each {|id| entries.push(Journal.weapon_info(id)[0]) }
    when 'Armors'
      @journal[type].each {|id| entries.push(Journal.armor_info(id)[0]) }
    when 'Items'
      @journal[type].each {|id| entries.push(Journal.item_info(id)[0]) }
    end
    return entries.empty? ? ['None'] : entries
  end
end

#===============================================================================
# ** Game_Party
#===============================================================================

class Game_Party
 
  alias zer0_auto_add_weapon gain_weapon
  def gain_weapon(weapon_id, n)
    # Unlock weapon ID if recieved.
    if Journal::AUTO_WEAPONS& ![nil, 0].include?(weapon_id)
      Journal.add_weapon(weapon_id)
    end
    zer0_auto_add_weapon(weapon_id, n)
  end

  alias zer0_auto_add_armor gain_armor
  def gain_armor(armor_id, n)
    # Unlock armor ID if recieved.
    if Journal::AUTO_ARMORS && ![nil, 0].include?(armor_id)
      Journal.add_armor(armor_id)
    end
    zer0_auto_add_armor(armor_id, n)
  end
 
  alias zer0_auto_add_item gain_item
  def gain_item(item_id, n)
    # Unlock item ID if recieved.
     if Journal::AUTO_ITEMS && ![nil, 0].include?(item_id)
      Journal.add_item(item_id)
    end
    zer0_auto_add_item(item_id, n)
  end
end

#===============================================================================
# ** Bitmap (slice_text method by Blizzard)
#===============================================================================

class Bitmap
 
  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

#===============================================================================
# ** Window_Journal
#===============================================================================

class Window_Journal < Window_Base
 
  attr_accessor :type
 
  def initialize
    super(Journal::LIST_WIDTH, 0, 640 - Journal::LIST_WIDTH, 480)
    self.contents = Bitmap.new(width - 32, height - 32)
    self.visible = false
    @type = ''
  end
 
  def id=(id)
    @id = id
    refresh
  end
 
  def refresh
    self.contents.clear
    return if @id == nil
    # Set local variables, branching by what type is being viewed.
    case @type
    when 'People'
      stats = Journal::CHARACTER_STATS
      info = Journal.character_info(@id)
      bio = Journal.character_bio(@id)
      pic = Journal::CHARACTER_PIC ? Journal.character_pic(@id) : nil
    when 'Places'
      stats = Journal::LOCATION_STATS
      info = Journal.location_info(@id)
      bio = Journal.location_bio(@id)
      pic = Journal::LOCATION_PIC ? Journal.location_pic(@id) : nil
    when 'Weapons'
      stats = Journal::WEAPON_STATS
      info = Journal.weapon_info(@id)
      bio = Journal.weapon_bio(@id)
      pic = Journal::WEAPON_PIC ? Journal.weapon_pic(@id) : nil
    when 'Armors'
      stats = Journal::ARMOR_STATS
      info = Journal.armor_info(@id)
      bio = Journal.armor_bio(@id)
      pic = Journal::ARMOR_PIC ? Journal.armor_pic(@id) : nil
    when 'Items'
      stats = Journal::ITEM_STATS
      info = Journal.item_info(@id)
      bio = Journal.item_bio(@id)
      pic = Journal::ITEM_PIC ? Journal.item_pic(@id) : nil
    end
    width = 640 - Journal::LIST_WIDTH - 40
    bio = self.contents.slice_text(bio, width)
    if pic != nil
      rect = Rect.new(0, 0, pic.width, pic.height)
      self.contents.blt(self.width-pic.width-64, 32, pic, rect)
    end
    # Draw the values on the window's bitmap.
    self.contents.font.color = system_color
    y = Journal::SMALL_TEXT ? 20 : 32
    stats.each_index {|i| self.contents.draw_text(0, i*(y*2), 128, y, stats[i])}
    self.contents.draw_text(0, 320, 128, y, 'Description:')
    self.contents.font.color = normal_color
    info.each_index {|i| self.contents.draw_text(8, y+i*(y*2), 128, y, info[i])}
    bio.each_index {|i| self.contents.draw_text(8, (320+y)+i*y, width, y, bio[i])} 
  end
end

#===============================================================================
# ** Scene_Journal
#===============================================================================

class Scene_Journal
#-------------------------------------------------------------------------------
  def main
    # Create lists of the entries for each Journal content type.
    @entry_lists, @index = [], 0
    # Create list of entry titles.
    Journal::LIST_ORDER.each {|key|
      next unless $game_system.journal.has_key?(key)
      window = Window_Command.new(Journal::LIST_WIDTH, $game_system.journal_entries(key))
      window.visible = window.active = false
      window.height = 480
      @entry_lists.push(window)
    }
    # Create main command window.
    @command_window = Window_Command.new(Journal::LIST_WIDTH, Journal::LIST_ORDER)
    @command_window.height = 480
    # Create main window for viewing information and dummy window.
    @dummy_window = Window_Base.new(Journal::LIST_WIDTH, 0, 640 - Journal::LIST_WIDTH, 480)
    @journal_window = Window_Journal.new
    @windows = @entry_lists + [@journal_window, @command_window, @dummy_window]
    # Transition and start main loop for the scene.
    Graphics.transition
    loop {Graphics.update; Input.update; update; break if $scene != self}
    # Dispose all windows and prepare for transition.
    Graphics.freeze
    @windows.each {|window| window.dispose}
  end
#-------------------------------------------------------------------------------
  def update
    # Update all the windows.
    @windows.each {|window| window.update }
    # Branch update method depending on what window is active.
    @command_window.active ? update_command : update_entry_selection
  end
#-------------------------------------------------------------------------------
  def update_command
    if Input.trigger?(Input::B)
      $game_system.se_play($data_system.cancel_se)
      $scene = Scene_Map.new
    elsif Input.trigger?(Input::C)
      # Deactivate command window and make selected entry list active.
      @index = @command_window.index
      @command_window.active = @command_window.visible = false
      @entry_lists[@index].active = @entry_lists[@index].visible = true
    end
  end
#-------------------------------------------------------------------------------
  def update_entry_selection
    if Input.trigger?(Input::B)
      $game_system.se_play($data_system.cancel_se)
      # Deactivate entry list and make command window active.
      @command_window.active = @command_window.visible = true
      @entry_lists[@index].active = @entry_lists[@index].visible = false
      @journal_window.visible = false
    elsif Input.trigger?(Input::C)
      @journal_window.visible = true
      $game_system.se_play($data_system.decision_se)
      type = Journal::LIST_ORDER[@index]
      # Set the type and id variables for the journal window and refresh.
      @journal_window.type = type
      @journal_window.id = $game_system.journal[type][@entry_lists[@index].index]
    end
  end
end


Can you upload your "Window_MenuCommand"?
I would also like to see what you use to call up books from the world map.


&&&&&&&&&&&&&&&&

**
Rep:
Level 67
TheNeonHeart.com
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:

Code: [Select]
#=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=
# 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

Code: [Select]
#==============================================================================
# ** 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
« Last Edit: March 04, 2013, 07:10:44 AM by theneonheart »
And if you stare for long enough into the abyss... you just might stare it down.

My Games: ExXception Draft
My Awesome Homepage The Neon Heart.com Host to My Writing / Music / Reviews / and More

*
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
Rep:
Level 96
&&&&&&&&&&&&&&&&&&&&&&&&&&&
GIAW 14: 2nd Place (Hard Mode)2013 Biggest Drama Whore2013 Zero to HeroParticipant - GIAW 11Secret Santa 2013 ParticipantFor taking arms in the name of your breakfast.
Sorry, I don't know how to do that.
Now that you have the scripts here for others to look at, maybe somebody else can help you.
&&&&&&&&&&&&&&&&