ForeverZer0
Sponsor
Diary Version: 1.1
By: ForeverZer0
Introduction
This is a basic script that will allow you to keep a "diary" or notepad in your game. It is very simple to use, and uses a simple interface for displaying the notes.
Features
Screenshots
Script
[rgss]#+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
# Diary Scene
# Author: ForeverZer0
# Version: 1.0
# Date: 12.18.2010
#+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
#
# Introduction:
#
# This is a basic script that will allow you to keep a "diary" or notepad in
# your game. It is very simple to use, and uses a simple interface for
# displaying the notes.
#
# Features:
#
# - Group your notes into "chapters".
# - Automatically formats text to fit on each line in a legible format.
# - Simple script call to add text.
# - Option to define each note in the script editor, then simply use a script
# call to add it.
# - Option to use the map as the background.
#
# Instructions:
#
# - Place script above main, and below default scripts.
# - Make configurations below.
# - To call the scene, use this syntax: $scene = Scene_Diary.new
# - To add an entry, use this syntax:
#
# Diary.add_entry(CHAPTER, TEXT)
#
# CHAPTER: An arbitrary integer to define what group to add the note to.
# TEXT: Either a string which will be the text added to the diary, or an
# integer which will return the string defined in the configuration
# below. The second method will make it easier to make long notes
# without filling up the little script call box.
#
# Author's Notes:
#
# - Please be sure to report any bugs/issues with the script. Enjoy!
#
#+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
module Diary
#:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
# BEGIN CONFIGURATION
#:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
MAP_BACKGROUND = true
# Set to true if you would like the map to show behind the window.
RETURN_SCENE = Scene_Map
# The scene that the game returns to when you exit the diary.
SCENE_ARGUMENTS = []
# Define any arguments that may need called with scene if need be. Place them
# in the array in the order in which they are normally called.
def self.chapter_name(chapter)
# Define the names of the "chapters".
# when CHAPTER then "CHAPTER_NAME"
return case chapter
when 1 then 'Millenium Fair'
when 2 then 'What Happened to Marle?'
end
end
def self.entry(index)
# Define the strings that correspond with each index. The index can be called
# instead of actual text to add an entry.
# when INDEX then "TEXT"
return case index
when 0 then 'I forgot today was the day of the big fair! I was supposed to go and see
Lucca\'s new invention.'
when 1 then 'I need to escort Marle around the fair, and maybe play a few games.'
when 2 then 'Marle was sucked into the vortex. I think it had something to do with
that pendant that she was wearing...'
when 3 then 'This place is very strange, and everyone talks funny. It\'s all vaguely
the same, yet different. Where am I?'
end
end
#:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
# END CONFIGURATION
#:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
def self.add_entry(chapter, text)
# Add the chapter number if it does not exist.
if $game_party.diary[chapter] == nil
$game_party.diary[chapter] = []
end
if text.is_a?(String)
# Add the new entry to the end of the chapter.
$game_party.diary[chapter].push(text)
elsif text.is_a?(Integer)
# Get the defined note if the text is a number.
$game_party.diary[chapter].push(self.entry(text))
end
end
end
#===============================================================================
# ** Window_Diary
#===============================================================================
class Window_Diary < Window_Base
attr_reader :lines
def initialize
super(0, 64, 640, 416)
self.back_opacity = Diary::MAP_BACKGROUND ? 160 : 255
self.contents = Bitmap.new(width - 32, height - 32)
@lines = []
end
def chapter=(chapter)
# Reset the current entries.
entries = $game_party.diary[chapter]
entries = [''] if entries == nil
# Divide the current entries into lines based off the text size and length.
@lines = entries.collect {|text| self.contents.slice_text(text, 608) }
@lines.flatten!
refresh
end
def refresh
# Dispose bitmap, returning if no lines are defined.
self.contents.clear
return if @lines.size == 0
self.contents.dispose
# Create bitmap to contain the lines.
self.contents = Bitmap.new(self.width - 32, @lines.size * 32)
# Draw each line.
@lines.each_index {|i| self.contents.draw_text(0, i*32, 608, 32, @lines)}
end
end
#===============================================================================
# ** Bitmap
#===============================================================================
class Bitmap
# Blizzard's slice_text method. This method can be removed if you have another
# script that already uses 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}").width > width
result.push(current_text)
current_text = words
else
current_text = "#{current_text} #{words}"
end
result.push(current_text) if i >= words.size - 1}
return result
end
end
#===============================================================================
# ** Scene_Diary
#===============================================================================
class Scene_Diary
def main
# Create the windows.
@sprites = [Window_Help.new, Window_Diary.new]
if Diary::MAP_BACKGROUND
@sprites.push(Spriteset_Map.new)
@sprites[0].back_opacity = 160
end
@keys = $game_party.diary.keys.sort
@names = @keys.collect {|chapter| Diary.chapter_name(chapter) }
# Find current index, setting to first chapter if undefined.
@index = @keys.index(Diary.chapter_name(@chapter))
@index = 0 if @index == nil
# Set the information for each window.
@sprites[0].set_text(@names[@index] == nil ? '' : @names[@index])
@sprites[1].chapter = @keys[@index]
# Transition Graphics.
Graphics.transition
# Main loop.
loop { Graphics.update; Input.update; update; break if $scene != self }
# Dispose windows.
Graphics.freeze
@sprites.each {|sprite| sprite.dispose }
end
def update
# Branch by what input is recieved.
if Input.repeat?(Input::UP) || Input.trigger?(Input::UP)
$game_system.se_play($data_system.cursor_se)
@sprites[1].oy -= 32 if @sprites[1].oy if @sprites[1].oy > 0
elsif Input.repeat?(Input::DOWN) || Input.trigger?(Input::DOWN)
$game_system.se_play($data_system.cursor_se)
@sprites[1].oy += 32 if @sprites[1].oy < (@sprites[1].contents.height-384)
elsif Input.trigger?(Input::L) || Input.trigger?(Input::R)
$game_system.se_play($data_system.decision_se)
# Change the current index.
@index += Input.trigger?(Input::L) ? -1 : 1
@index %= @keys.size
# Display the name of the current chapter in the header.
@sprites[0].set_text(@names[@index], 1)
# Change the current chapter.
@sprites[1].chapter = @keys[@index]
elsif Input.trigger?(Input::B)
# Play cancel SE and return to the defined scene.
$game_system.se_play($data_system.cancel_se)
args, scene = Diary::SCENE_ARGUMENTS, Diary::RETURN_SCENE
$scene = (args == []) ? scene.new : scene.new(*args)
end
end
end
#===============================================================================
# ** Game_Party
#===============================================================================
class Game_Party
attr_accessor :diary
alias zer0_diary_init initialize
def initialize
zer0_diary_init
@diary = {}
end
end
[/rgss]
Instructions
Place script below default scripts, and above "Main".
Instructions are in the script.
Compatibility
No known issues.
Credits and Thanks
Author's Notes
Please report any bugs/issues so that they can be resolved. Enjoy!
Terms and Conditions
Creative Commons - Attribution-NonCommercial-ShareAlike 3.0 Unported
By: ForeverZer0
Introduction
This is a basic script that will allow you to keep a "diary" or notepad in your game. It is very simple to use, and uses a simple interface for displaying the notes.
Features
- Group your notes into "chapters".
- Automatically formats text to fit on each line in a legible format.
- Simple script call to add text.
- Option to define each note in the script editor, then simply use a script call to add it.
- Option to use the map as the background.
Screenshots

Script
[rgss]#+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
# Diary Scene
# Author: ForeverZer0
# Version: 1.0
# Date: 12.18.2010
#+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
#
# Introduction:
#
# This is a basic script that will allow you to keep a "diary" or notepad in
# your game. It is very simple to use, and uses a simple interface for
# displaying the notes.
#
# Features:
#
# - Group your notes into "chapters".
# - Automatically formats text to fit on each line in a legible format.
# - Simple script call to add text.
# - Option to define each note in the script editor, then simply use a script
# call to add it.
# - Option to use the map as the background.
#
# Instructions:
#
# - Place script above main, and below default scripts.
# - Make configurations below.
# - To call the scene, use this syntax: $scene = Scene_Diary.new
# - To add an entry, use this syntax:
#
# Diary.add_entry(CHAPTER, TEXT)
#
# CHAPTER: An arbitrary integer to define what group to add the note to.
# TEXT: Either a string which will be the text added to the diary, or an
# integer which will return the string defined in the configuration
# below. The second method will make it easier to make long notes
# without filling up the little script call box.
#
# Author's Notes:
#
# - Please be sure to report any bugs/issues with the script. Enjoy!
#
#+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
module Diary
#:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
# BEGIN CONFIGURATION
#:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
MAP_BACKGROUND = true
# Set to true if you would like the map to show behind the window.
RETURN_SCENE = Scene_Map
# The scene that the game returns to when you exit the diary.
SCENE_ARGUMENTS = []
# Define any arguments that may need called with scene if need be. Place them
# in the array in the order in which they are normally called.
def self.chapter_name(chapter)
# Define the names of the "chapters".
# when CHAPTER then "CHAPTER_NAME"
return case chapter
when 1 then 'Millenium Fair'
when 2 then 'What Happened to Marle?'
end
end
def self.entry(index)
# Define the strings that correspond with each index. The index can be called
# instead of actual text to add an entry.
# when INDEX then "TEXT"
return case index
when 0 then 'I forgot today was the day of the big fair! I was supposed to go and see
Lucca\'s new invention.'
when 1 then 'I need to escort Marle around the fair, and maybe play a few games.'
when 2 then 'Marle was sucked into the vortex. I think it had something to do with
that pendant that she was wearing...'
when 3 then 'This place is very strange, and everyone talks funny. It\'s all vaguely
the same, yet different. Where am I?'
end
end
#:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
# END CONFIGURATION
#:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
def self.add_entry(chapter, text)
# Add the chapter number if it does not exist.
if $game_party.diary[chapter] == nil
$game_party.diary[chapter] = []
end
if text.is_a?(String)
# Add the new entry to the end of the chapter.
$game_party.diary[chapter].push(text)
elsif text.is_a?(Integer)
# Get the defined note if the text is a number.
$game_party.diary[chapter].push(self.entry(text))
end
end
end
#===============================================================================
# ** Window_Diary
#===============================================================================
class Window_Diary < Window_Base
attr_reader :lines
def initialize
super(0, 64, 640, 416)
self.back_opacity = Diary::MAP_BACKGROUND ? 160 : 255
self.contents = Bitmap.new(width - 32, height - 32)
@lines = []
end
def chapter=(chapter)
# Reset the current entries.
entries = $game_party.diary[chapter]
entries = [''] if entries == nil
# Divide the current entries into lines based off the text size and length.
@lines = entries.collect {|text| self.contents.slice_text(text, 608) }
@lines.flatten!
refresh
end
def refresh
# Dispose bitmap, returning if no lines are defined.
self.contents.clear
return if @lines.size == 0
self.contents.dispose
# Create bitmap to contain the lines.
self.contents = Bitmap.new(self.width - 32, @lines.size * 32)
# Draw each line.
@lines.each_index {|i| self.contents.draw_text(0, i*32, 608, 32, @lines)}
end
end
#===============================================================================
# ** Bitmap
#===============================================================================
class Bitmap
# Blizzard's slice_text method. This method can be removed if you have another
# script that already uses 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}").width > width
result.push(current_text)
current_text = words
else
current_text = "#{current_text} #{words}"
end
result.push(current_text) if i >= words.size - 1}
return result
end
end
#===============================================================================
# ** Scene_Diary
#===============================================================================
class Scene_Diary
def main
# Create the windows.
@sprites = [Window_Help.new, Window_Diary.new]
if Diary::MAP_BACKGROUND
@sprites.push(Spriteset_Map.new)
@sprites[0].back_opacity = 160
end
@keys = $game_party.diary.keys.sort
@names = @keys.collect {|chapter| Diary.chapter_name(chapter) }
# Find current index, setting to first chapter if undefined.
@index = @keys.index(Diary.chapter_name(@chapter))
@index = 0 if @index == nil
# Set the information for each window.
@sprites[0].set_text(@names[@index] == nil ? '' : @names[@index])
@sprites[1].chapter = @keys[@index]
# Transition Graphics.
Graphics.transition
# Main loop.
loop { Graphics.update; Input.update; update; break if $scene != self }
# Dispose windows.
Graphics.freeze
@sprites.each {|sprite| sprite.dispose }
end
def update
# Branch by what input is recieved.
if Input.repeat?(Input::UP) || Input.trigger?(Input::UP)
$game_system.se_play($data_system.cursor_se)
@sprites[1].oy -= 32 if @sprites[1].oy if @sprites[1].oy > 0
elsif Input.repeat?(Input::DOWN) || Input.trigger?(Input::DOWN)
$game_system.se_play($data_system.cursor_se)
@sprites[1].oy += 32 if @sprites[1].oy < (@sprites[1].contents.height-384)
elsif Input.trigger?(Input::L) || Input.trigger?(Input::R)
$game_system.se_play($data_system.decision_se)
# Change the current index.
@index += Input.trigger?(Input::L) ? -1 : 1
@index %= @keys.size
# Display the name of the current chapter in the header.
@sprites[0].set_text(@names[@index], 1)
# Change the current chapter.
@sprites[1].chapter = @keys[@index]
elsif Input.trigger?(Input::B)
# Play cancel SE and return to the defined scene.
$game_system.se_play($data_system.cancel_se)
args, scene = Diary::SCENE_ARGUMENTS, Diary::RETURN_SCENE
$scene = (args == []) ? scene.new : scene.new(*args)
end
end
end
#===============================================================================
# ** Game_Party
#===============================================================================
class Game_Party
attr_accessor :diary
alias zer0_diary_init initialize
def initialize
zer0_diary_init
@diary = {}
end
end
[/rgss]
Instructions
Place script below default scripts, and above "Main".
Instructions are in the script.
Compatibility
No known issues.
Credits and Thanks
- ForeverZer0, for the script.
- Blizzard, for the "slice_text" method I always steal.
- Lauros, for requesting it.
Author's Notes
Please report any bugs/issues so that they can be resolved. Enjoy!
Terms and Conditions
Creative Commons - Attribution-NonCommercial-ShareAlike 3.0 Unported
You are free:
to Share - to copy, distribute and transmit the work
to Remix - to adapt the work
Under the following conditions:
Attribution. You must attribute the work in the manner specified by the author or licensor (but not in any way that suggests that they endorse you or your use of the work).
Noncommercial. You may not use this work for commercial purposes.
Share alike. If you alter, transform, or build upon this work, you may distribute the resulting work only under the same or similar license to this one.
- For any reuse or distribution, you must make clear to others the license terms of this work. The best way to do this is with a link to this web page.
- Any of the above conditions can be waived if you get permission from the copyright holder.
- Nothing in this license impairs or restricts the author's moral rights.
to Share - to copy, distribute and transmit the work
to Remix - to adapt the work
Under the following conditions:
Attribution. You must attribute the work in the manner specified by the author or licensor (but not in any way that suggests that they endorse you or your use of the work).
Noncommercial. You may not use this work for commercial purposes.
Share alike. If you alter, transform, or build upon this work, you may distribute the resulting work only under the same or similar license to this one.
- For any reuse or distribution, you must make clear to others the license terms of this work. The best way to do this is with a link to this web page.
- Any of the above conditions can be waived if you get permission from the copyright holder.
- Nothing in this license impairs or restricts the author's moral rights.