[XP] Journal

Started by ForeverZer0, July 06, 2010, 09:26:47 pm

Previous topic - Next topic

ForeverZer0

July 06, 2010, 09:26:47 pm Last Edit: March 11, 2012, 02:34:44 am by ForeverZer0
Journal
Authors: ForeverZer0
Version: 2.4
Type: Misc. Add-On
Key Term: Misc Add-on



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
  • 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.



Screenshots

Spoiler: ShowHide



Demo

None.


Script

Here.
Spoiler: ShowHide

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



Instructions

See script.


Compatibility

No known issues.


Credits and Thanks


  • ForeverZer0, for the script.



Author's Notes

Enjoy!
I am done scripting for RMXP. I will likely not offer support for even my own scripts anymore, but feel free to ask on the forum, there are plenty of other talented scripters that can help you.

Nadim13

It seems cool! I'll try it later! Good work! (lv.++)

Shining Riku

This script is great, it's exactly what I needed for one of my games!
Excellent work on the script! ^_^

SquareMan

July 17, 2010, 11:32:11 pm #3 Last Edit: July 18, 2010, 12:54:59 am by SquareMan
This is awesome! Lvl up. :-*
Edit: Is it possible to modify some values to make it to where you can have two journals? Since I have basic RGSS know how i attempted it my self,...., but failed and ended up with this error when i tryed to start my game.
something like this.
QuoteError on line 175 in script "Scene_Journal" (thats what i named it in the editor) Stack level too deep.

what i did was dupe the script rename it to Scene_Journal2 in the page list. then I changed those things that add info right after the config ends by adding a 2 to the end of the thingys. then i scrolled down to where it said class Scene_Journal and changed it to this Scene_Journal2 any help?
It all worked fine before i duped the script. when i deleted the dupe, it was all fine.
QuoteThey've got helmets on they're heads. But I gotta watermeloan instead!

ForeverZer0

Quote from: SquareMan on July 17, 2010, 11:32:11 pm
This is awesome! Lvl up. :-*
Edit: Is it possible to modify some values to make it to where you can have two journals? Since I have basic RGSS know how i attempted it my self,...., but failed and ended up with this error when i tryed to start my game.
something like this.
QuoteError on line 175 in script "Scene_Journal" (thats what i named it in the editor) Stack level too deep.

what i did was dupe the script rename it to Scene_Journal2 in the page list. then I changed those things that add info right after the config ends by adding a 2 to the end of the thingys. then i scrolled down to where it said class Scene_Journal and changed it to this Scene_Journal2 any help?
It all worked fine before i duped the script. when i deleted the dupe, it was all fine.


Copying the script wont do you much good. I'm not positive exactly what your trying to do, but try just renaming the scripts and config differently and calling them as such. For example instead of the Journal module, have a Journal_1 and Journal_2 module, and the same with the scenes. Just make sure that each scene calls from the appropriate Journal, etc, etc. You may also need to make some edits to have different variables that keep track of what is unlocked for each Journal. Hope that was helpful!
I am done scripting for RMXP. I will likely not offer support for even my own scripts anymore, but feel free to ask on the forum, there are plenty of other talented scripters that can help you.

SquareMan

ok i might try it again when i learn more of rgss and not just basics.
QuoteThey've got helmets on they're heads. But I gotta watermeloan instead!

XaineC

Is there any way to make it so that the journal shows the actors names as dictated by the database? I ask this because I make it so the player can name the main character what they want and I want the journal to change accordingly.

ForeverZer0

Quote from: XaineC on August 21, 2010, 05:02:08 am
Is there any way to make it so that the journal shows the actors names as dictated by the database? I ask this because I make it so the player can name the main character what they want and I want the journal to change accordingly.


Don't got my game in front of me right now, but I think if you use...
$data_actors[ACTOR_ID].name

...it will show the name of the actor with that ID.
I am done scripting for RMXP. I will likely not offer support for even my own scripts anymore, but feel free to ask on the forum, there are plenty of other talented scripters that can help you.

XaineC

Thanks, that worked. One more question. What if I want to change the picture I use for a certain actor during the game. Is there any way to do that???

ForeverZer0

Quote from: XaineC on August 24, 2010, 06:15:11 pm
Thanks, that worked. One more question. What if I want to change the picture I use for a certain actor during the game. Is there any way to do that???


Simplest way I can think of off-hand without changing the method would be to set a switch to it.
Here's an example, using Switch #10. In the part where you configure the bitmap of char with ID...
when 1 then $game_switches[10] ? 'BITMAP SWITCH ON' : 'BITMAP SWITCH OFF'


Try that. Let me know if it works.
I am done scripting for RMXP. I will likely not offer support for even my own scripts anymore, but feel free to ask on the forum, there are plenty of other talented scripters that can help you.

XaineC

Thanks Zero. It worked great. Epic you are.

Acolyte

Would it be possible to put in an option for items? Not like an inventory list, just important artifacts.

ForeverZer0

Yeah that wouldn't be hard. I'll make you a mod sometime here when I get a chance. If I forget, just PM me or bump for update.
I am done scripting for RMXP. I will likely not offer support for even my own scripts anymore, but feel free to ask on the forum, there are plenty of other talented scripters that can help you.

Acolyte

Just checking to see if you're still working on it.

Calintz

Always a great addition to any game when used right.

ForeverZer0

September 30, 2010, 12:16:54 pm #15 Last Edit: September 30, 2010, 12:18:25 pm by ForeverZer0
* UPDATES *

Version is now 2.0
- Totally overworked code for better performance and overview
- Added options to log weapons, armors, and items
- Add ability to choose what options (ie. Places, People, Items, etc.) to use in your journal
- Basic configurables for the window look/layout.
- Feature to Auto-Unlock weapons, armors, and items as the player aquires them if desired.
- Names will be defined by the database now in a list.

Thank you everyone for the suggestions. I think I added them all... :P
I am done scripting for RMXP. I will likely not offer support for even my own scripts anymore, but feel free to ask on the forum, there are plenty of other talented scripters that can help you.

Acolyte

Awesome job. Thanks a lot. :D

Lauros

I wonder if you can added to the script a section for write what is hapenning in the game
Ex: after an encounter with a strange man, this appears in the section.                             
                                                 
                                                 (Title) "The strange Man"
(What happened)"We found a strange man who told us we were at the castle, I wonder who will be
                                                but we dont have time to follow and ask"

Then after a while it reappears the same strange man, after talking with him, and at the same section title("The strange Man") appears:

                                                 (Title) "The strange Man",
(What happened)"We found a strange man who told us we were at the castle, I wonder who will be
                                                but we dont have time to follow and ask.
                         The same strange man came back to help us, I dont understand, ┬┐why he help us?"

Something like that, and space for many titles

ForeverZer0

That would not be a very hard script to write, but it would probably be easier to adapt this.
I am done scripting for RMXP. I will likely not offer support for even my own scripts anymore, but feel free to ask on the forum, there are plenty of other talented scripters that can help you.

Lauros

I have that script, if you can adapted to any of the two scripts would works for me,  :up: