Hello! For the past days I've been searching for a custom message system and I've finally found one that suits my needs.
The problem is that I can't make it compatibile with my project...where are already some several scripts and also the XP ace engine.
I've made a demo of my project: https://drive.google.com/file/d/0Bz22DF-S1J2naVdTYkVRaGpMLU0/edit?usp=sharing so you can easily troubleshoot the issue.
I would be grateful to anyone who can help/advice me with this error. Thanks in advance!
Here's the original Custom Message Script (I've edited the one in my project to fix the superclass missmatch error):
The problem is that I can't make it compatibile with my project...where are already some several scripts and also the XP ace engine.
I've made a demo of my project: https://drive.google.com/file/d/0Bz22DF-S1J2naVdTYkVRaGpMLU0/edit?usp=sharing so you can easily troubleshoot the issue.
I would be grateful to anyone who can help/advice me with this error. Thanks in advance!
Here's the original Custom Message Script (I've edited the one in my project to fix the superclass missmatch error):
#==============================================================================
# ** Custom Message Script by Hodgeelmf **
#
# Version 1.4
#
# Version History
# 1.0.0 - Basic functionality
# 1.1.0 - Fixed issue with bubble size and bolded text
# Modified gold window
# Added /q function
# 1.2.0 - Added Icon display
# Added Face Graphics
# Fixed Gold command iteration error (This is what formerly broke
# the script)
# Added use of Windowskin Graphic
# Fixed sub window termination to be more natural
# 1.3.0 - Added thought indicater option
# Added emotion colors
# 1.4.0 - Fixed glitch when switching from Windowskin to Bubble mode
# Added function to disable bubble bouncing
# 1.4.1 - Fixed text drawing issue when choices displayed without
# preceding message text
# Created \nc command
#
# **************UPDATE NOTE*******************
# This script displays all choices immediately after the text
# which precedes them. I have added a command to prevent this
# should you elect to do so:
#
# \nc
#
# I see no reason to turn this into a toggle currently unless
# there were significant push for it
#
#
# Necessary updates
#
# -Add other various functions like display hp, quest, etc.
#
#==============================================================================
=begin
Welcome to the Custom Message script!
Installation instructions:
1. Install this script above Main, preferrably directly above
2. Download attached graphics (message_bubble and pointer2)
and place in Graphics/Pictures
3. That's it!
Message commands:
\e[x] Display message over a map event
By default, bubble messages display over the player's sprite. Values
outside of the map events range will display over the player as well.
\c[x] Change message text color (0-8)
\n[x] Insert actor name
\v[x] Insert variable value
\b Toggle bold text
\w[x] Wait control (0-999)
Wait values are determined by frame. 40 FPS is the script rate.
\p Pause control
Forces the player to press enter before continuing.
\q Forced ending
Forces the message winddow to close once the character is encountered.
Typically best to use directly after a wait timer.
\f Force position
Forces a specific position for the message bubble.
0 - Upper right of the sprite
1 - Upper left of the sprite
2 - Lower right of the sprite
3 - Lower left of the sprite
\g Displays gold window
Fades in the gold window to the bottom right corner of the screen. To keep
it displayed after current message, add \g into the next master message.
\i[x] Display icon
Displays an icon from the "Icons" folder. A constant array, Icons, is
compiled at runtime to store imported icon names in addition to RTP.
\z[x] Display face graphic (found in Graphics/Faces - you may have to create this
folder)
Displays a face graphic on the left of the message. Currently this script
only supports images with one face (as opposed to a whole faceset).
\t Thought Bubble
Uses thought indicater (ie two dots instead of mouth opening style)
\m[x] Mood Coloring
Changes bubble color to indicate speakers/thinkers mood (0-4)
\nc Do not Display Choices
Keeps choices from being appended to the text preceding them
\h[x] Display Hp
Not functioning at this point
\s[x] Sub window controls (explained below)
Master - the message which controls sub windows
Sub - any message that displays as a part of a master
1. The master message always has a higher z value than any sub messages
2. Sub message must immediately follow the master message and be in
consecutive order (ex. sub 0 must be the next event command after
the master message, sub 1 must be the next event command after
sub 0, etc.)
3. Sub messagge numbers do not reset after a master message. For
example, if the first master messsage contains two sub messages,
the second master message with sub messages must begin with sub
message number 3, and so on.
4. Use \s[x] where x is the number of the sub message to indicate that
a particular message is a sub message
5. Call sub messages in a master message with \s[x] where x is the
number of the sub message.
6. There is no limit to the number of sub messages, but since text is
drawn one letter at a time, too many messages may cause lag.
***NOTE***
If any of these commands seem bulky, it is because there is a glitch in
the run script command in the event editor which does not allow for
single lines changing global variables to function properly.
Script commands (from the Event Editor):
1. Choose message style (bubble, windowskin or invisible)
***** If you do not have the correct images in Graphics/Pictures
***** the script will automatically change to WINDOWSKIN mode and
***** change the default text color to white
$game_system.message_text_mode = x
TEXT_MODE_BUBBLE
TEXT_MODE_INVISIBLE
TEXT_MODE_WINDOWSKIN
2. Enable or disable bubble bouncing (only applies when in TEXT_MODE_BUBBLE)
$game_system.message_bubble_bounce = x
BUBBLE_BOUNCE_ON
BUBBLE_BOUNCE_OFF
2. Change position of invisible text
$game_system.invisible_position = x
INVISIBLE_POSITION_TOP
INVISIBLE_POSITION_MIDDLE
INVISIBLE_POSITION_BOTTOM
INVISIBLE_POSITION_BOOK(arbitrary value from one of my projects)
3. Change outline text options
$game_system.message_text_outline = x
TEXT_NORMAL
TEXT_OUTLINE
4. Change text speed
$game_system.message_text_speed = x
TEXT_SPEED_SLOW
TEXT_SPEED_MEDIUM
TEXT_SPEED_FAST
5. Change text skip rate (one letter per frame up to all at once)
$game_system.message_text_skip = x
TEXT_SKIP_NORMAL (1)
TEXT_SKIP_DOUBLE (2)
TEXT_SKIP_TRIPLE (3)
TEXT_SKIP_FULL
5. Change text size
$game_system.message_text_size = x
TEXT_SIZE_SMALL
TEXT_SIZE_MEDIUM
TEXT_SIZE_LARGE
TEXT_SIZE_JUMBO
6. Change text font
$game_system.message_text_font = x
TEXT_FONT_DEFAULT
TEXT_FONT_CORSIVA
7. Color Constants
TEXT_COLOR_BLACK
TEXT_COLOR_WHITE
8. Face Graphic Functions
$game_system.face_graphic_type = x
9. Face Graphic Constants
FACE_GRAPHIC_FULL - typically a bust which looks better offset to the left
and extending abovve the bubble
FACE_GRAPHIC_BOX - traditional boxed in face graphics which need to be
encased by the bubble to look correct
10. Global Methods (for ease of access)
message(string) - place in script box in event processing
***** Only place this command once per Event Script Box *****
You may wish to have dialogue or entries that are longer than three
lines. This global method allows you to supply a string to
$game_temp.message_text manually. The best way to do so is to store
a message in a variable and pass it to the method. In this example
script there is a Game_Messages class which has public methods that
assign a message to a variable. For full games, it would be better
to create a text file to load from. The best formatter to use is
%q (ex @message = %q(lots of text...can be multiple lines). The
%q formatter mimicks the event dialogue box text editing format
so you can use single "\" characters instead of using "\\" or not
being able to use special characters at all.
default_color(x) - set message default color
Input either a number 0 through 8 or a Color object.
face(string) - set default face graphic
Use this method to supply a default face graphic for messages. This graphic
has secondary priority to one explicitly declared in a message, so is useful
for largely unbroken monologues.
clear_face - clears the default face graphic
small_text
medium_text - Shortcut methods to change $game_system.message_text_size
large_text
jumbo_text
slow_text
fast_text - Shortcut methods to change $game_system.messge_text_speed
Enjoy! And remember to credit!
=end
#========================================================================
# Game_Messages
# You can easily create messages to display of any length using this
# Class or a similar one of your creation.
#========================================================================
class Game_Messages
# This message is obviously far too long for a bubble message, but it looks
# quite good with a darkened screen tone
# When loaded into a global variable, these class methods can be called to
# the event editor with two lines of code. For your own projects, you will
# probably want a more sophisticated heirarchy.
def message_1
@message = %q(\c[0]\bMessage commands:\b
\c[6]\b\\e[x]\c[0] Display message over a map event\b
By default, bubble messages display over the player's sprite. Values
outside of the map events range will display over the player as well.
\c[6]\b\\c[x]\c[0] Change message text color (0-8)\b
\c[6]\b\\n[x]\c[0] Insert actor name\b
\c[6]\b\\v[x]\c[0] Insert variable value\b
\c[6]\b\\\\b\c[0] Toggle bold text\b
\c[6]\b\\w[x]\c[0] Wait control (0-999)\b
Wait values are determined by frame. 40 FPS is the script rate.
\c[6]\b\\\\p\c[0] Pause control\b
Forces the player to press enter before continuing.
\c[6]\b\\\\q\c[0] Forced ending\b
Forces the message winddow to close once the character is encountered.
Typically best to use directly after a wait timer.
\c[6]\b\\\\f[x]\c[0] Force position\b
Forces a specific position for the message bubble.
\b0\b - Upper right of the sprite
\b1\b - Upper left of the sprite
\b2\b - Lower right of the sprite
\b3\b - Lower left of the sprite
\c[6]\b\\\\g\c[0] Displays gold window\b
Fades in the gold window to the bottom right corner of the screen. To keep
it displayed after current message, add \\\\g into the next master message.
\c[6]\b\\\\i[x]\c[0] Displays an icon from Graphics/Icons\b
\c[6]\b\\\\z[x]\c[0] Displays a face graphic from Graphics/Faces\b
References an array compiled at runtime from Graphics/Faces. You will have
to create this folder and manually install files.
\c[6]\b\\\\s[x]\c[0] Sub window controls\b (see documentation for full instructions))
end
def message_2
@message = %q( \c[6]\b$game_system Properties\b\c[0]
Change these properties in the Event Editor by using the Script command. Begin with
$game_system, then add a "." followed by the property you wish to alter. In the
Script command you will need to use two lines. For example:
$game_system.message_text_speed =\
TEXT_SPEED_FAST
The properties are listed below with available values to the right. For full
documentation, refer to the script instructions.
\c[6]\bmessage_text_mode\b\c[0] TEXT_MODE_INVISIBLE,TEXT_MODE_BUBBLE,TEXT_MODE_WINDOWSKIN
\c[6]\binvisible_position\b\c[0] INVISIBLE_POSITION_TOP,INVISIBLE_POSITION_MIDDLE,
INVISIBLE_POSITION_BOTTOM
\c[6]\bmessage_text_outline\b\c[0] TEXT_NORMAL,TEXT_OUTLINE
\c[6]\bmessage_text_speed\b\c[0] TEXT_SPEED_SLOW,TEXT_SPEED_MEDIUM,TEXT_SPEED_FAST
\c[6]\bmessage_text_size\b\c[0] TEXT_SIZE_SMALL,TEXT_SIZE_MEDIUM,TEXT_SIZE_LARGE,
TEXT_SIZE_JUMBO
\c[6]\bmessage_text_font\b\c[0] TEXT_FONT_DEFAULT, whatever constant you would
like to create
\c[6]\bmessage_text_skip\b\c[0] TEXT_SKIP_NORMAL,TEXT_SKIP_DOUBLE,TEXT_SKIP_TRIPLE,
TEXT_SKIP_QUAD,
TEXT_SKIP_QUIN,TEXT_SKIP_FULL
\c[6]\bmessage_skip_disabled\b\c[0] true,false
\c[6]\bface_graphic_type\b\c[0] FACE_GRAPHIC_BOX,FACE_GRAPHIC_FULL
\c[6]\bface_graphic_name\b\c[0] file name of graphic - without folders
\c[6]\bdefault_color\b\c[0] any Color object
\c[6]\bmessage_text_outline_color\b\c[0] any Color object)
end
end
#========================================================================
# Global Variables - simplest way to create communication between
# Interpreter and Window_Message
#========================================================================
$separate_choices = false
#========================================================================
# Constant Declaration
#========================================================================
# Stores the class methods for quick custom message access
$game_messages = Game_Messages.new
BUBBLE_BOUNCE_ON = 1
BUBBLE_BOUNCE_OFF = 0
BUBBLE_UPPER_LEFT = Rect.new(0,0,13,10)
BUBBLE_LOWER_LEFT = Rect.new(0,10,13,9)
BUBBLE_UPPER_RIGHT = Rect.new(13,0,12,10)
BUBBLE_LOWER_RIGHT = Rect.new(13,10,12,9)
SKIN_UPPER_LEFT = Rect.new(128,0,10,10)
SKIN_LOWER_LEFT = Rect.new(128,54,10,10)
SKIN_UPPER_RIGHT = Rect.new(182,0,10,10)
SKIN_LOWER_RIGHT = Rect.new(182,54,10,10)
TEXT_MODE_BUBBLE = 0
TEXT_MODE_INVISIBLE = 1
TEXT_MODE_WINDOWSKIN = 2
INVISIBLE_POSITION_TOP = [320,0]
INVISIBLE_POSITION_MIDDLE = [320,240]
INVISIBLE_POSITION_BOTTOM = [320,480]
INVISIBLE_POSITION_BOOK = [460,35]
TEXT_NORMAL = 0
TEXT_OUTLINE = 1
TEXT_SPEED_SLOW = 2
TEXT_SPEED_MEDIUM = 1
TEXT_SPEED_FAST = 0
TEXT_SKIP_NORMAL = 1
TEXT_SKIP_DOUBLE = 2
TEXT_SKIP_TRIPLE = 3
TEXT_SKIP_QUAD = 4
TEXT_SKIP_QUIN = 5
TEXT_SKIP_FULL = 6
TEXT_SIZE_SMALL = 14
TEXT_SIZE_MEDIUM = 16
TEXT_SIZE_LARGE = 18
TEXT_SIZE_JUMBO = 28
# Remember to set a common default or fallback font since some users won't have
# them all
TEXT_FONT_DEFAULT = "Arial"
TEXT_FONT_CORSIVA = ["Monotype Corsiva", "Arial"]
TEXT_FONT_BOLI = ["MV Boli", "Arial"]
TEXT_FONT_COMICSANS = ["Comic Sans MS", "Arial"]
TEXT_COLOR_BLACK = Color.new(0,0,0)
TEXT_COLOR_WHITE = Color.new(250,250,250)
FACE_GRAPHIC_FULL = 0
FACE_GRAPHIC_BOX = 1
# Compile Icon array
# RTP icons are best stored manually
Icons = ['001-Weapon01','002-Weapon02','003-Weapon03','004-Weapon04'\
,'005-Weapon05','006-Weapon06','007-Weapon07','008-Weapon08'\
,'009-Shield01','010-Head01','011-Head02','012-Head03','013-Body01'\
,'014-Body02','015-Body03','016-Accessory01','017-Accessory02'\
,'018-Accessory03','019-Accessory04','020-Accessory05'\
,'021-Potion01','022-Potion02','023-Potion03','024-Potion04'\
,'025-Herb01','026-Herb02','027-Herb03','028-Herb04'\
,'029-Key01','030-Key02','031-Key03','032-Item01'\
,'033-Item02','034-Item03','035-Item04','036-Item05'\
,'037-Item06','038-Item07','039-Item08','040-Item09'\
,'041-Item10','042-Item11','043-Item12','044-Skill01'\
,'045-Skill02','046-Skill03','047-Skill04','048-Skill05'\
,'049-Skill06','050-Skill07']
# All icons in the icon folder are dynamically added at runtime
ICON_FOLDER_PATH = Dir::getwd + "/Graphics/Icons/"
dir = Dir.new(ICON_FOLDER_PATH)
dir.each { |file|
if file != "." && file != ".."
Icons.push file
end
}
# Compile Face array
if File.directory? Dir::getwd + "/Graphics/Faces/"
Faces = []
FACE_FOLDER_PATH = Dir::getwd + "/Graphics/Faces/"
dir = Dir.new(FACE_FOLDER_PATH)
dir.each { |file|
if file != "." && file != ".."
Faces.push file
end
}
end
#========================================================================
# Global Methods
# Use these methods to quickly modify basic settings or set text
# to $game_temp.message_text manually
#========================================================================
def message(text)
$game_system.map_interpreter.message_waiting = true
$game_temp.message_proc = Proc.new { @message_waiting = false }
$game_temp.message_text = text
end
def default_color(color)
# If an integer passed to the method
if color.class == Fixnum
case color
when 0
$game_system.default_color = TEXT_COLOR_BLACK
when 1
$game_system.default_color = Color.new(128, 128, 255, 255)
when 2
$game_system.default_color = Color.new(255, 128, 128, 255)
when 3
$game_system.default_color = Color.new(128, 255, 128, 255)
when 4
$game_system.default_color = Color.new(128, 255, 255, 255)
when 5
$game_system.default_color = Color.new(255, 128, 255, 255)
when 6
$game_system.default_color = Color.new(255, 255, 128, 255)
when 7
$game_system.default_color = Color.new(192, 192, 192, 255)
when 8
$game_system.default_color = TEXT_COLOR_WHITE
else
$game_system.default_color = TEXT_COLOR_BLACK
end
# If a Color class value is passed to the method
elsif color.class == Color
$game_sytem.default_color = color
end
return true
end
def mood_color(color)
case color
when 0
return Color.new(70,130,180,190)
when 1
return Color.new(178,34,34,190)
when 2
return Color.new(238,174,238,190)
when 3
return Color.new(139,136,120,180)
when 4
return Color.new(255,215,0,190)
end
end
def face(name)
$game_system.face_graphic_name = name
end
def clear_face
$game_system.face_graphic_name = nil
end
def small_text
$game_system.message_text_size == TEXT_SIZE_SMALL
end
def medium_text
$game_system.message_text_size == TEXT_SIZE_MEDIUM
end
def large_text
$game_system.message_text_size == TEXT_SIZE_LARGE
end
def jumbo_text
$game_system.message_text_size == TEXT_SIZE_JUMBO
end
def slow_text
$game_system.message_text_speed == TEXT_SPEED_SLOW
end
def fast_text
$game_system.message_text_speed == TEXT_SPEED_FAST
end
#========================================================================
# Game Temp
#
# @current_event - tracks the current game event for ease of access
#========================================================================
class Game_Temp
attr_accessor :current_event
attr_accessor :consecutive_gold_window
alias old_initialize initialize
def initialize
old_initialize
@current_event = nil
@consecutive_gold_window = false
end
end
#========================================================================
# Game System
#
# Stores message text options
# Use $game_system to view and change values
#========================================================================
class Game_System
attr_accessor :message_text_mode
attr_accessor :message_bubble_bounce
attr_accessor :invisible_position
attr_accessor :message_text_outline
attr_accessor :message_text_speed
attr_accessor :message_text_size
attr_accessor :message_text_font
attr_accessor :message_skip_disabled
attr_accessor :face_graphic_type
attr_accessor :face_graphic_name
attr_accessor :message_text_skip
attr_accessor :default_color
attr_accessor :message_text_outline_color
alias old_initialize initialize
def initialize
old_initialize
@message_text_mode = TEXT_MODE_BUBBLE
@message_bubble_bounce = BUBBLE_BOUNCE_ON
@invisible_position = INVISIBLE_POSITION_TOP
@message_text_outline = TEXT_NORMAL
@message_text_speed = TEXT_SPEED_FAST
@message_text_size = TEXT_SIZE_SMALL
@message_text_font = TEXT_FONT_DEFAULT
@message_text_skip = TEXT_SKIP_NORMAL
@message_skip_disabled = false
@face_graphic_type = FACE_GRAPHIC_BOX
@face_graphic_name = nil
@default_color = TEXT_COLOR_BLACK
@message_text_outline_color = TEXT_COLOR_WHITE
end
end
#========================================================================
# Game Player
#
# The only change is in the condition --if Input.trigger?(Input::C)--
# The change allows for $game_temp.message text to be manually
# altered and still function properly
#========================================================================
class Game_Player
#--------------------------------------------------------------------------
# * Frame Update
#--------------------------------------------------------------------------
def update
# Remember whether or not moving in local variables
last_moving = moving?
# If moving, event running, move route forcing, and message window
# display are all not occurring
unless moving? or $game_system.map_interpreter.running? or
@move_route_forcing or $game_temp.message_window_showing
# Move player in the direction the directional button is being pressed
case Input.dir4
when 2
move_down
when 4
move_left
when 6
move_right
when 8
move_up
end
end
# Remember coordinates in local variables
last_real_x = @real_x
last_real_y = @real_y
super
# If character moves down and is positioned lower than the center
# of the screen
if @real_y > last_real_y and @real_y - $game_map.display_y > CENTER_Y
# Scroll map down
$game_map.scroll_down(@real_y - last_real_y)
end
# If character moves left and is positioned more let on-screen than
# center
if @real_x < last_real_x and @real_x - $game_map.display_x < CENTER_X
# Scroll map left
$game_map.scroll_left(last_real_x - @real_x)
end
# If character moves right and is positioned more right on-screen than
# center
if @real_x > last_real_x and @real_x - $game_map.display_x > CENTER_X
# Scroll map right
$game_map.scroll_right(@real_x - last_real_x)
end
# If character moves up and is positioned higher than the center
# of the screen
if @real_y < last_real_y and @real_y - $game_map.display_y < CENTER_Y
# Scroll map up
$game_map.scroll_up(last_real_y - @real_y)
end
# If not moving
unless moving?
# If player was moving last time
if last_moving
# Event determinant is via touch of same position event
result = check_event_trigger_here([1,2])
# If event which started does not exist
if result == false
# Disregard if debug mode is ON and ctrl key was pressed
unless $DEBUG and Input.press?(Input::CTRL)
# Encounter countdown
if @encounter_count > 0
@encounter_count -= 1
end
end
end
end
#-----------------------------------------------------------------
# Allows messages to display without interruption when directly
# assigned to $game_temp.message_text
#-----------------------------------------------------------------
# If C button was pressed
if Input.trigger?(Input::C) && $game_temp.message_text == nil
# Same position and front event determinant
check_event_trigger_here([0])
check_event_trigger_there([0,1,2])
end
end
end
end
#========================================================================
# Interpreter
#
# Edit forces the interpreter to wait to update until all messages
# currently on screen have finished writing
#========================================================================
class Interpreter
attr_accessor :list
attr_accessor :index
attr_accessor :message_waiting
alias old_update update
def update
#if $scene.message_window != nil && $scene.message_window.finished != nil
if $game_temp.message_text != nil
return
else
old_update
$game_temp.current_event = @event_id
end
end
def command_101
# If other text has been set to message_text
if $game_temp.message_text != nil
# End
return false
end
# Check for consecutive gold window calls
temp_index = @index+1
loop do
case @list[temp_index].code
when 401
temp_index += 1
when 101
break
else
break
end
end
# Search for consecutive message window with /g formatter
text = nil
# Iterate through max possible message size
for i in 0...3
# Check for existence of list element before checking code
if @list[temp_index+i] != nil
# Search for /g
if @list[temp_index+i].code == 101 or @list[temp_index+i].code == 401
text = @list[temp_index+i].parameters[0].slice(/\\[Gg]/)
if text != nil
# Allows for gold window to continue after first message
$game_temp.consecutive_gold_window = true
break
end
end
end
end
# Turns consecutive flag off if need be
if $game_temp.consecutive_gold_window == true && text == nil
$game_temp.consecutive_gold_window = false
end
# Set message end waiting flag and callback
@message_waiting = true
$game_temp.message_proc = Proc.new { @message_waiting = false }
# Set message text on first line
$game_temp.message_text = @list[@index].parameters[0] + "\n"
line_count = 1
# Loop
loop do
# If next event command text is on the second line or after
if @list[@index+1].code == 401
# Add the second line or after to message_text
$game_temp.message_text += @list[@index+1].parameters[0] + "\n"
line_count += 1
# If event command is not on the second line or after
else
# If next event command is show choices
if @list[@index+1].code == 102
# Make sure choice appellation is allowed
for choice in @list[@index+1].parameters[0]
if choice.slice(/\\[Nn][Cc]/)
$separate_choices = true
break
end
end
if $separate_choices == true
return
end
# Advance index
@index += 1
# Choices setup
$game_temp.choice_start = line_count
#Insert 5 spaces for indenting choices
for i in 0...@list[@index].parameters[0].size
if @list[@index].parameters[0][i].slice(0,5) != ' '
@list[@index].parameters[0][i].insert(0,' ')
end
end
setup_choices(@list[@index].parameters)
# If next event command is input number
elsif @list[@index+1].code == 103
# If number input window fits on screen
if line_count < 4
# Advance index
@index += 1
# Number input setup
$game_temp.num_input_start = line_count
$game_temp.num_input_variable_id = @list[@index].parameters[0]
$game_temp.num_input_digits_max = @list[@index].parameters[1]
end
end
# Continue
return true
end
# Advance index
@index += 1
end
end
end
#========================================================================
# Spriteset Map
#
# Edit allows access to the character_sprites variable
# Use $game_map.character_sprites to access
#========================================================================
class Spriteset_Map
attr_accessor :character_sprites
end
class Scene_Map
attr_accessor :spriteset
attr_accessor :message_window
end
#========================================================================
# Window Base
#
# Edit allows for color 8 (black)
#========================================================================
class Window_Base < Window
#--------------------------------------------------------------------------
# * Get Text Color
# n : text color number (0-7)
#--------------------------------------------------------------------------
def text_color(n)
case n
when 0
return Color.new(250, 250, 250, 255)
when 1
return Color.new(45, 45, 255, 255)
when 2
return Color.new(255, 45, 45, 255)
when 3
return Color.new(45, 255, 45, 255)
when 4
return Color.new(45, 215, 215, 255)
when 5
return Color.new(255, 45, 255, 255)
when 6
return Color.new(230, 230, 15, 255)
when 7
return Color.new(125, 125, 125, 255)
when 8
return Color.new(0, 0, 0)
else
normal_color
end
end
end
#==============================================================================
# ** Window_Gold
#------------------------------------------------------------------------------
# The gold window has been modified to use an icon and some outlined text
#==============================================================================
class Window_Gold_New < Window_Base
def initialize
@current_gold = $game_party.gold
@icon = Sprite.new
@icon.opacity = 0
@icon.bitmap = Bitmap.new('Graphics/Icons/032-Item01')
@icon.ox = @icon.bitmap.width/2
@icon.oy = @icon.bitmap.height/2
@icon.x,@icon.y = 624,460
draw_gold
end
def update
refresh
@icon.opacity += 12 if @icon.opacity < 192
@gold.opacity += 12 if @gold.opacity < 192
end
def refresh
if @current_gold != $game_party.gold
@current_gold = $game_party.gold
@gold.bitmap.clear
draw_gold
end
end
def draw_gold
@gold = Sprite.new
@gold.opacity = 0
@gold.bitmap = Bitmap.new(100,32)
@gold.ox,@gold.oy = @gold.bitmap.width/2,@gold.bitmap.height/2
@gold.x = 560
@gold.y = 465
@gold.z = 50
@gold.bitmap.font.size = 18
@gold.bitmap.font.bold = true
@gold.bitmap.font.color = text_color(8)
@gold.bitmap.draw_text(22,0,75,30,$game_party.gold.to_s,2)
@gold.bitmap.draw_text(22,2,75,30,$game_party.gold.to_s,2)
@gold.bitmap.draw_text(21,1,75,30,$game_party.gold.to_s,2)
@gold.bitmap.draw_text(23,1,75,30,$game_party.gold.to_s,2)
@gold.bitmap.font.color = text_color(6)
@gold.bitmap.draw_text(22,1,75,30,@current_gold.to_s,2)
end
def fade_out
@icon.opacity -= 48
@gold.opacity -= 48
end
def dispose
@icon.bitmap.dispose
@icon.dispose
@gold.bitmap.dispose
@gold.dispose
end
end
#==============================================================================
# ** Window_InputNumber
#------------------------------------------------------------------------------
# This window is for inputting numbers, and is used within the
# message window.
#==============================================================================
class Window_InputNumber < Window_Base
attr_accessor :x
attr_accessor :y
#--------------------------------------------------------------------------
# * Object Initialization
# digits_max : digit count
#--------------------------------------------------------------------------
def initialize(digits_max,x=0,y=0,indent=0)
@digits_max = digits_max
@number = 0
@x = x
@y = y
@indent = indent
@count = 0
@move_right = true
# Calculate character width for drawing and tracking cursor movement
dummy_bitmap = Bitmap.new(32, 32)
dummy_bitmap.font.size = $game_system.message_text_size
dummy_bitmap.font.name = $game_system.message_text_font
@width = (dummy_bitmap.text_size('0').width\
+ dummy_bitmap.text_size(' ').width)
@x = @x - (@width*@digits_max)
dummy_bitmap.dispose
@index = 0
# Create number display bitmap
@number_window = Sprite.new
@number_window.x = @x
@number_window.y = @y
@number_window.z = 15
@number_window.bitmap = Bitmap.new(@width*@digits_max, 40)
@number_window.bitmap.font.color = TEXT_COLOR_BLACK
@number_window.bitmap.font.size = $game_system.message_text_size
@number_window.bitmap.font.name = $game_system.message_text_font
# Create the cursor to track input position
create_cursor
end
#--------------------------------------------------------------------------
# * Get Number
#--------------------------------------------------------------------------
def number
return @number
end
#--------------------------------------------------------------------------
# * Set Number
# number : new number
#--------------------------------------------------------------------------
def number=(number)
@number = [[number, 0].max, 10 ** @digits_max - 1].min
refresh
end
#--------------------------------------------------------------------------
# * Create Cursor
#--------------------------------------------------------------------------
def create_cursor
@cursor = Sprite.new
@cursor.bitmap = Bitmap.new(32,5)
@cursor.x = @number_window.x
@cursor.y = @number_window.y\
+ @number_window.bitmap.text_size('0').height + 3
@cursor.z = 16
@cursor.opacity = 185
width = @number_window.bitmap.text_size('0').width + 2
@cursor.bitmap.fill_rect(0,0,width,2,text_color(1))
end
#--------------------------------------------------------------------------
# * Cursor Update
#--------------------------------------------------------------------------
def update_cursor
@count += 1
if @count % 10 == 0
if @move_right == true
@cursor.x += 1
else
@cursor.x -= 1
end
if @count == 20
if @move_right == true
@move_right = false
else
@move_right = true
end
@count = 0
end
end
end
#--------------------------------------------------------------------------
# * Frame Update
#--------------------------------------------------------------------------
def update
update_position
# If up or down directional button was pressed
if Input.repeat?(Input::UP) or Input.repeat?(Input::DOWN)
$game_system.se_play($data_system.cursor_se)
# Get current place number and change it to 0
place = 10 ** (@digits_max - 1 - @index)
n = @number / place % 10
@number -= n * place
# If up add 1, if down substract 1
n = (n + 1) % 10 if Input.repeat?(Input::UP)
n = (n + 9) % 10 if Input.repeat?(Input::DOWN)
# Reset current place number
@number += n * place
refresh
end
# Cursor right
if Input.repeat?(Input::RIGHT)
if @digits_max >= 2
$game_system.se_play($data_system.cursor_se)
@index = (@index + 1) % @digits_max
@cursor.x += @width
if @index == 0
@cursor.x = @number_window.x
end
end
end
# Cursor left
if Input.repeat?(Input::LEFT)
if @digits_max >= 2
$game_system.se_play($data_system.cursor_se)
@index = (@index + @digits_max - 1) % @digits_max
@cursor.x -= @width
if @index == @digits_max - 1
@cursor.x += @width * @digits_max
end
end
end
update_cursor
end
#--------------------------------------------------------------------------
# * Dispose
#--------------------------------------------------------------------------
def dispose
@number_window.bitmap.clear
@number_window = nil
@cursor.bitmap.clear
@cursor = nil
end
#--------------------------------------------------------------------------
# * Update Position for Bubble Movement
#--------------------------------------------------------------------------
def update_position
if @number_window.x != @x
@number_window.x = @x
@cursor.x = @number_window.x + (@index * @width)
end
if @number_window.y != @y
@number_window.y = @y
@cursor.y = @number_window.y\
+ @number_window.bitmap.text_size('0').height + 3
end
end
#--------------------------------------------------------------------------
# * Refresh
#--------------------------------------------------------------------------
def refresh
@number_window.bitmap.clear
s = sprintf("%0*d", @digits_max, @number)
for i in 0...@digits_max
@number_window.bitmap.draw_text(i * @width, 0, 32, 32, s[i,1])
end
end
end
#========================================================================
# Window Message
#
# Controls message displayed from the show text event command
#
# This modified version also allows for a message to be displayed
# from a script. Simply change $game_temp.message_text to
# whatever text you want to display. Remember that outside
# of the message entry box in the event commands, you will have
# to manuall insert the newline character "\n".)
#========================================================================
class Window_Message < Window_Base
attr_accessor :contents_showing
attr_accessor :finished
attr_accessor :fade_in
attr_accessor :fade_out
attr_accessor :message
attr_accessor :enter_pressed
#--------------------------------------------------------------------------
# * Object Initialization
#
# Prepare message variables, then wait for re_initialize
#--------------------------------------------------------------------------
def initialize(sub=false, text=nil)
# Bubble message variables
@enter_pressed = false
@text_height = 0
@fade_in = false
@event = 0
@contents_showing = false
@finished = nil
@position = ''
@active = false
@lines = 0
@up = 0
@count = 0
@cursor_count = 0
@cursor_move_right = nil
@wait = 0
@wait_add = 0
@pause = false
@index = 0
@sub = sub
@face = nil
@face_extension_x = 0
@face_extension_y = 0
@thought = false
@bubble_color = nil
@hp = nil
if @sub == false
@sub_number = nil
@sub_windows = []
end
@indent = false
@text = text
end
#--------------------------------------------------------------------------
# * Re_Initialize
#
# Call when actual text processing occurs
#--------------------------------------------------------------------------
def re_initialize
if $game_temp.message_text != nil
# Prevent improper cursor indention on choices
@indent = false
if $game_system.face_graphic_name != nil
@face = $game_system.face_graphic_name
else
@face = nil
end
@face_extension_x = 0
@face_extension_y = 0
temp = Sprite.new
temp = Bitmap.new(32,32)
# Set @text to whatever text will display
# For sub messages this will already be set
if @text == nil
@text = $game_temp.message_text
end
# Change \ escaped characters to character codes for processing
prep_text
# Determine number of lines in the message
@lines = 0
@text.each_line {|line|
@lines += 1
}
temp_text = @text.clone
# Get rid of any non displayed elements to determine the
# appropriate message box size
def get_digits(integer)
if integer < 10
return 1
elsif integer >= 10
return 2
elsif integer >= 100
return 3
end
end
while temp_text.slice(/\001\[([0-9]+)\]/)
temp_text.slice!(/\001\[([0-9]+)\]/)
end
while temp_text.slice(/\002/)
temp_text.slice!(/\002/)
end
while temp_text.slice(/\004\[([0-9]+)\]/)
temp_text.slice!(/\004\[([0-9]+)\]/)
end
while temp_text.slice(/\005\[([0-9]+)\]/) != nil
temp_text.slice!(/\005\[([0-9]+)\]/)
end
while temp_text.slice(/\006/)
temp_text.slice!(/\006/)
end
while temp_text.slice(/\007\[([0-9]+)\]/)
temp_text.slice!(/\007\[([0-9]+)\]/)
end
while temp_text.slice(/\011/) != nil
temp_text.slice!(/\011/)
end
while temp_text.slice(/\015\[([0-9]+)\]/)
temp_text.slice!(/\015\[([0-9]+)\]/)
@face = Faces[$1.to_i]
end
# Make sure @thought is false unless specified true
@thought = false
while temp_text.slice(/\017/)
temp_text.slice!(/\017/)
@thought = true
@text.slice!(/\017/)
end
# Change @bubble_color to keep default color unless specified other color
@bubble_color = nil
while temp_text.slice(/\018\[([0-9]+)\]/)
temp_text.slice!(/\018\[([0-9]+)\]/)
@bubble_color = mood_color($1.to_i)
@text.slice!(/\018\[([0-9]+)\]/)
end
# Determine message bubble size
bitmap = Sprite.new
bitmap.bitmap = Bitmap.new(32,32)
bitmap.bitmap.font.name = $game_system.message_text_font
bitmap.bitmap.font.size = $game_system.message_text_size
@text_rect = Rect.new(0,0,0,0)
@line_width = []
i = 0
temp_text.each_line {|line|
temp = bitmap.bitmap.text_size(line)
@line_width[i] = temp.width
if temp.width > @text_rect.width
@text_rect.width = temp.width
end
@text_height = temp.height
i += 1
}
# Add space for number input if necessary
if $game_temp.num_input_variable_id > 0 && @sub == false
@lines += 1
end
@text_rect.height = @text_height * @lines
total_size = 0
longest_line = 0
current_line_height = @text_height
@line_height_correction = [0,0,0,0]
line = 0
skip = 0
for i in 0...temp_text.size
# Check for bold toggling and icon insertion
if temp_text[i] == 3
bitmap.bitmap.font.bold == false ? bitmap.bitmap.font.bold = true : bitmap.bitmap.font.bold = false
end
# Check for icon insertion and add 24 pixels to this line's width
if temp_text[i] == 12
# Add sufficient width for an icon to be inserted in the text
total_size += 24
# Adjust the height of the text box if necessary
if current_line_height < 24
current_line_height = 24
@text_rect.height += (24 - @text_height)
@line_height_correction[line] = (24 - @text_height)
end
# Set variable to skip over icon text in sizing operations
skip = 4
end
# Check for face graphic
if temp_text[i] == 13
temp_text.slice(/\015\[([0-9]+)\]/)
skip = 4
@face = Faces[$1.to_i]
end
# Check for new line character
if temp_text[i] == 10
total_size = 0
current_line_height = @text_height
line += 1
end
# Do not size characters relating to an icon
if skip == 0
total_size += bitmap.bitmap.text_size(temp_text.slice(i,1)).width
else
skip -= 1
end
# Make sure longest line sets the bubble width value
longest_line = total_size if total_size > longest_line
end
# Insert facce graphic name if none explicit in message and
# one is stored in $game_system
if $game_system.face_graphic_name != nil && temp_text.slice(/\015\[([0-9]+)\]/) == nil
@face = $game_system.face_graphic_name
end
# Account for face graphic in message box graphic
if @face != nil
determine_face_extension
else
@face_extension_x = 0
@face_extension_y = 0
end
if $game_system.face_graphic_type == FACE_GRAPHIC_FULL
@text_rect.width = longest_line
else
@text_rect.width = longest_line + @face_extension_x
end
# Set start values for text drawing
@x=@y=0
# Determine message position and create the message bubble
#(only if $game_system.message_text_mode == TEXT_MODE_BUBBLE
if $game_system.message_text_mode != TEXT_MODE_INVISIBLE
# Check for existence of necessary Bubble files if mode is set to Bubble
if $game_system.message_text_mode == TEXT_MODE_BUBBLE
# Correct text mode if files do not exist
if File.exist?("Graphics/Pictures/Message_Bubble.png") == false || \
File.exist?("Graphics/Pictures/Pointer2.png") == false
$game_system.message_text_mode = TEXT_MODE_WINDOWSKIN
default_color(8)
end
end
determine_position
create_bubble
else
@bubble_correction_y = 0
@message_box = Sprite.new
@message_box.bitmap = Bitmap.new(@text_rect.width+25, @text_rect.height+26)
@message_box.ox = @message_box.bitmap.width/2
@message_box.oy = @message_box.bitmap.height/2
@message_box.x = $game_system.invisible_position[0]
@message_box.y = $game_system.invisible_position[1]
if @message_box.y - @message_box.bitmap.height/2 < 0
@message_box.y += @message_box.bitmap.height/2
elsif @message_box.y + @message_box.bitmap.height/2 > 480
@message_box.y -= @message_box.bitmap.height/2
end
end
# Create message sprite for drawing actual text
@message = Sprite.new
@message.x = @message_box.x
@message.y = @message_box.y
if @sub == false
@message.z += 1
end
@message.ox = @message_box.ox
@message.oy = @message_box.oy
@message.bitmap = \
Bitmap.new(@message_box.bitmap.width,@message_box.bitmap.height)
@message.bitmap.font.size = $game_system.message_text_size
@message.bitmap.font.color = TEXT_COLOR_BLACK
@speed = $game_system.message_text_speed
@text_color = $game_system.default_color
end
end
#--------------------------------------------------------------------------
# * Dispose
#--------------------------------------------------------------------------
def dispose
terminate_message
$game_temp.message_window_showing = false
if @input_number_window != nil
@input_number_window.dispose
end
end
#--------------------------------------------------------------------------
# * Subs Finished?
#
# Checks to see if all sub messages have finished writing
#--------------------------------------------------------------------------
def subs_finished?
abort_flag = true
count = 0
for sub in @sub_windows
count += 1 if (sub.finished == true && sub.enter_pressed == false)
if sub.finished && sub.enter_pressed
sub.enter_pressed = false
end
end
abort_flag = false if count == @sub_windows.size
if abort_flag == true
return false
else
return true
end
end
#--------------------------------------------------------------------------
# * Erase Subs
#
# Erases any existing subb messages
#--------------------------------------------------------------------------
def erase_subs
if @sub_windows != nil
for sub in @sub_windows
sub.fade_out = true
end
end
end
#--------------------------------------------------------------------------
# * Terminate Message
#--------------------------------------------------------------------------
def terminate_message
# Call message callback
if @message != nil
@message_box.bitmap.clear
@message.z -= 1
@message.bitmap.clear
end
if @cursor != nil
@cursor.bitmap.clear
@cursor.dispose
@cursor = nil
end
if $game_temp.message_proc != nil
$game_temp.message_proc.call
end
# Clear variables related to text, choices, and number input
$game_temp.message_text = nil
$game_temp.message_proc = nil
$game_temp.choice_start = 99
$game_temp.choice_max = 0
$game_temp.choice_cancel_type = 0
$game_temp.choice_proc = nil
$game_temp.num_input_start = 99
$game_temp.num_input_variable_id = 0
$game_temp.num_input_digits_max = 0
# Dispose of gold window
if @gold_window != nil && $game_temp.consecutive_gold_window == false
@gold_window.dispose
@gold_window = nil
end
@contents_showing = false
@finished = nil
@active = false
$game_temp.message_window_showing = false
@text = nil
if @sub == false
erase_subs
temp = subs_finished?
if temp == true
for i in 0...@sub_windows.size
@sub_windows[i] = nil
end
@sub_windows = []
end
end
@sub_number = nil
end
#--------------------------------------------------------------------------
# * Draw_Message
#--------------------------------------------------------------------------
def draw_message
if @pause == true
return
end
if @text == nil
return
end
# Indent if choice and following message text
index = $game_system.map_interpreter.index - 2
code = $game_system.map_interpreter.list[index].code
# Check for choice following a line of text
if @y == $game_temp.choice_start && (code == 101 || code == 401) \
&& @indent == false && $separate_choices == false
@indent = true
#@x = 16 + @face_extension_x
end
if @wait == 0
# Set correction for icon insertion
y_correction = 0
for i in 0..@y
if @line_height_correction[i] != nil
y_correction += @line_height_correction[i]
end
end
# Set offset value dependant on text mode
if $game_system.message_text_mode == TEXT_MODE_WINDOWSKIN
offset = 10
elsif $game_system.message_text_mode == TEXT_MODE_BUBBLE
offset = 13
else
offset = 0
end
y = @text_y + (@text_height * @y) + @bubble_correction_y + y_correction
# Insert face graphic if included
if @text.slice!(/\015\[([0-9]+)\]/) || @face != nil
draw_face
end
# Check for formatting options character from text
@c = @text[0,1].slice(/./m)
case @c
# If \\
when "\000"
# Return to original text
@c = "\\"
@text.sub!("\000") {"\\"}
return
# If \C[n]
when "\001"
# Change text color
@text.sub!(/\[([0-9]+)\]/, "")
color = $1.to_i
if color >= 0 and color <= 8
@message.bitmap.font.color = text_color(color)
@text_color = text_color(color)
end
@text.slice!("\001")
# go to next text
return
# If \G
when "\002"
# Make gold window
if @gold_window == nil
@gold_window = Window_Gold_New.new
#@gold_window.x = 560 - @gold_window.width
if $game_temp.in_battle
# @gold_window.y = 192
else
# @gold_window.y = 0
end
#@gold_window.opacity = @message.opacity
#@gold_window.back_opacity = 200
end
@text.slice!("\002")
# go to next text
return
# If \B
when "\003"
if @message.bitmap.font.bold == false
@message.bitmap.font.bold = true
else
@message.bitmap.font.bold = false
end
@text.slice!("\003")
return
# If sub window is being called
when "\004"
@text.slice!("\004")
@text.sub!(/\[([0-9]+)\]/, "")
if @sub == false
@sub_number = $1
event_key = $game_temp.current_event
# Find the cooresponding slave window
# Must immediately follow master window and be
# in consecutive order
num = 0
index = 0
if $game_system.map_interpreter.list[$game_system.map_interpreter.index].code == 101 \
&& num != @sub_number.to_i
for i in $game_system.map_interpreter.index\
...$game_system.map_interpreter.list.size
if $game_system.map_interpreter.list[i].code == 101
num = $game_system.map_interpreter.list[i].parameters[0].slice(/\\[Ss]\[([0-9]+)\]/)
num = num.slice(/([0-9]+)/).to_i if num!= nil
if num != nil
if num != @sub_number.to_i
num += 1
end
index = i
end
if num == @sub_number.to_i
break
end
end
end
else
index = $game_system.map_interpreter.index
end
$game_system.map_interpreter.index = index
# Save original index value for later
original_index = $game_system.map_interpreter.index
lines = 1
if $game_system.map_interpreter.list[index].code == 101
# Loop until the cooresponding \s[x] character is found
loop do
# Break if there is nothing more to sort through
if $game_system.map_interpreter.list[index] == nil
break
end
# Check the \s[x] for a match with the initial match in master message
temp = $game_system.map_interpreter.list[index].parameters.clone
number = temp[0].slice(/\\[Ss]\[([0-9]+)\]/)
if number != nil
number = number.slice(/[0-9]+/)
end
# If the proper match is found, create sub window
if number == @sub_number
# Create message text for sub message
# Make sure sub message begins at first line
while $game_system.map_interpreter.list[index].code != 101
index -= 1
end
text = $game_system.map_interpreter.list[index].parameters[0].clone
if $game_system.map_interpreter.list[index+1].code == 401
text = text + "\n"
lines += 1
end
# Continue to add text if there is something to be added
if $game_system.map_interpreter.list[index+1].code == 401
# Loop until all sub message text is added
loop do
index += 1
text = text + $game_system.map_interpreter.list[index].parameters[0].clone
if $game_system.map_interpreter.list[index+1].code == 401
text = text + "\n"
lines += 1
else
break
end
end
end
# If last sub window, set event index
if @text.slice("\004") == nil
$game_system.map_interpreter.index = index + 1
end
# Create actual sub window object and place it into
# @sub_windows array for update and disposal
sub = Window_Message.new(true,text)
@sub_windows.push sub
break
else
index += 1
end
end # end loop
return
end # end if code == 101
end
# When \w[x]
when "\005"
@text.slice!(/\005\[([0-9]+)\]/)
@wait_add = $1.to_i
@wait += @wait_add
@wait_add = 0
return
# When \p
when "\006"
@text.slice!("\006")
if @enter_pressed == false
@pause = true
end
return
# When \q
when "\011"
terminate_message
return
# When \i[x]
when "\014"
@text.slice!(/\014\[([0-9]+)\]/)
icon = Sprite.new
icon.opacity = 0
icon.bitmap = Bitmap.new("Graphics/Icons/#{Icons[$1.to_i]}")
true_y = @text_y + (@y * @text_height) + y_correction #+ y + @face_extension_y - (@text_rect.height + 25)
@message.bitmap.blt(offset+@x+@face_extension_x,true_y,icon.bitmap,Rect.new(0,0,24,24))
@x += 24
# When \h[x]
when "\016"
@text.slice!(/\016\[([0-9]+)\]/)
@hp = $game_party.actors[$1.to_i].hp
end
# Get 1 character from text
@c = @text.slice!(/./m)
if @c == nil
@finished = true
if $game_temp.choice_max > 0
@cursor_move_right = true
@index = 0
create_cursor
$separate_choices = false
elsif $game_temp.num_input_variable_id > 0 && @sub == false
digits_max = $game_temp.num_input_digits_max
number = $game_variables[$game_temp.num_input_variable_id]
x = @message.x + @message.bitmap.width/2 - 13
y = @message.y - @message.bitmap.height/2\
+ @text_height * (@y) + @bubble_correction_y
@input_number_window = Window_InputNumber.new(digits_max,x,y,@face_extension_x)
@input_number_window.number = number
end
return
end
# If new line text
if @c == "\n"
# Add 1 to y
@y += 1
@x = 0
# Indent if choice
if @y >= $game_temp.choice_start
@x = 0
end
# go to next text
return
end
# Draw text
@message.bitmap.font.name = $game_system.message_text_font
# Set exact y value for drawing
if @face_extension_y != 0
true_y = y + @face_extension_y - (@text_rect.height + 25)
else
true_y = y
end
true_y = @text_y + @y*@text_height + y_correction
if $game_system.message_text_outline == TEXT_OUTLINE
if $game_system.message_text_outline == TEXT_OUTLINE
@message.bitmap.font.color = $game_system.message_text_outline_color
elsif @message.bitmap.font.color != $game_system.default_color
@message.bitmap.font.color = $game_system.default_color
end
# Correct character writing position for lower case "f"
# due to Monotype Corsiva text writing glitch
temp = @x
if @c == 'f' && $game_system.message_text_font == TEXT_FONT_CORSIVA
@x -= 2
end
@message.bitmap.draw_text(offset+@x+@face_extension_x+1,true_y,40,32,@c)
@message.bitmap.draw_text(offset+@x+@face_extension_x-1,true_y,40,32,@c)
@message.bitmap.draw_text(offset+@x+@face_extension_x,true_y+1,40,32,@c)
@message.bitmap.draw_text(offset+@x+@face_extension_x,true_y-1,40,32,@c)
# Correct any change made to @x so that text is written
# in the proper place
if @x != temp
@x = temp
end
end
@message.bitmap.font.color = @text_color
# Correct character writing position for lower case "f"
# due to Monotype Corsiva text writing glitch
temp = @x
if @c == 'f' && $game_system.message_text_font == TEXT_FONT_CORSIVA
@x -= 2
end
@message.bitmap.draw_text(offset+@x+@face_extension_x,true_y,40,32,@c)
# Correct any change made to @x so that text is written
# in the proper place
if @x != temp && $game_system.message_text_font == TEXT_FONT_CORSIVA
@x = temp
end
# Add x to drawn text width
@x += @message.bitmap.text_size(@c).width
@wait = $game_system.message_text_speed
@wait_add = 0
else
@wait -= 1
end
end
#--------------------------------------------------------------------------
# * Determine Face Extension
# This method determines how much distance needs to be added to the
# face graphic
#--------------------------------------------------------------------------
def determine_face_extension
sprite = Sprite.new
sprite.opacity = 0
sprite.bitmap = Bitmap.new("Graphics/Faces/#{@face}")
# Set extension value in horizontal direction
if @face != nil
@face_extension_x = sprite.bitmap.width
if $game_system.face_graphic_type == FACE_GRAPHIC_BOX
@face_extension_x += 5
end
if sprite.bitmap.height > @text_rect.height
@face_extension_y = sprite.bitmap.height - @text_rect.height
end
end
sprite.bitmap.dispose
sprite = nil
end
#--------------------------------------------------------------------------
# * Draw Face Graphics
#--------------------------------------------------------------------------
def draw_face
sprite = Sprite.new
sprite.opacity = 0
sprite.bitmap = Bitmap.new("Graphics/Faces/#{@face}")
rect = Rect.new(0,0,sprite.bitmap.width,sprite.bitmap.height)
if $game_system.face_graphic_type == FACE_GRAPHIC_FULL
@message.bitmap.blt(0,0,sprite.bitmap,rect)
else
y = @text_y + 10
@message.bitmap.blt(13,y,sprite.bitmap,rect)
end
sprite.bitmap.dispose
sprite = nil
end
#--------------------------------------------------------------------------
# * Refresh
#--------------------------------------------------------------------------
def refresh
if @pause == false
if Input.trigger?(Input::C) && $game_system.message_skip_disabled == false
@enter_pressed = true
until @c == nil || @text == nil
draw_message
end
@enter_pressed = false if @sub == false
else
if $game_system.message_text_skip != TEXT_SKIP_FULL
count = $game_system.message_text_skip
for i in 0...count
draw_message if (@c != nil || @text != nil)
end
else
if @c == nil && @text != nil
draw_message
end
until @c == nil || @text == nil
draw_message
end
end
end
else
if Input.trigger?(Input::C)
temp = subs_finished?
if temp == true
erase_subs
@pause = false
end
end
draw_message
end
end
#--------------------------------------------------------------------------
# * Frame Update
#--------------------------------------------------------------------------
def update
# Update sub messages if they exist
if @sub_windows != nil
for i in 0...@sub_windows.size
@sub_windows[i].update
end
end
# Update gold window if it exists
if @gold_window != nil
@gold_window.update
end
# Update bubble graphic
if @active == true && ($game_system.message_text_mode == TEXT_MODE_BUBBLE \
|| $game_system.message_text_mode == TEXT_MODE_WINDOWSKIN)
update_bubble
end
# If fade in
if @fade_in
if $game_system.message_text_mode == TEXT_MODE_WINDOWSKIN
max_opacity = 192
else
max_opacity = 255
end
@message_box.opacity += 24
if @input_number_window != nil
@input_number_window.contents_opacity += 24
end
if @message_box.opacity == max_opacity
@fade_in = false
end
return
end
# If fade out
if @fade_out
@message_box.opacity -= 48
@message.opacity -= 48
if @cursor != nil
@cursor.opacity -= 48
end
if @input_number_window != nil
@input_number_window.contents_opacity -= 24
end
if @gold_window != nil && $game_temp.consecutive_gold_window == false
@gold_window.fade_out
end
if @message_box.opacity == 0 && @message.opacity == 0
@fade_out = false
terminate_message if @sub == false
end
return
end
# If inputting number
if @input_number_window != nil
@input_number_window.update
# Confirm
if Input.trigger?(Input::C)
$game_system.se_play($data_system.decision_se)
$game_variables[$game_temp.num_input_variable_id] =
@input_number_window.number
$game_map.need_refresh = true
# Dispose of number input window
@input_number_window.dispose
@input_number_window = nil
if @sub_windows != nil
temp = subs_finished?
if temp == true
@fade_out = true
erase_subs
end
end
end
return
end
# If message is being displayed
if @contents_showing && @finished == true
# If choice isn't being displayed, show pause sign
if $game_temp.choice_max == 0
@active = true
else
update_cursor
end
# Cancel
if Input.trigger?(Input::B)
if $game_temp.choice_max > 0 and $game_temp.choice_cancel_type > 0
$game_system.se_play($data_system.cancel_se)
$game_temp.choice_proc.call($game_temp.choice_cancel_type - 1)
terminate_message
end
end
# Confirm
if Input.trigger?(Input::C)
if $game_temp.choice_max > 0
$game_system.se_play($data_system.decision_se)
$game_temp.choice_proc.call(@index)
end
if @sub_windows != nil
temp = subs_finished?
if temp == true
@fade_out = true
erase_subs
end
end
end
return
end
# If display wait message or choice exists when not fading out
if $game_temp.message_text != nil && @finished == nil
@contents_showing = true
$game_temp.message_window_showing = true
@finished = false
re_initialize
Graphics.frame_reset
if @input_number_window != nil
@input_number_window.contents_opacity = 0
end
@fade_in = true
return
elsif @finished == false
refresh
return
end
end
#--------------------------------------------------------------------------
# Create Message Bubble
#--------------------------------------------------------------------------
# Remember! The bubble will currently display based on the src_rect of
# the $character_sprite bitmap...need to work on this...
def create_bubble # Text can be multiple lines
sprites = $scene.spriteset.character_sprites
@event_x = sprites[@event].x
@event_y = sprites[@event].y
# Draw bubble bitmap to blt from
bubble = Sprite.new
if @position.include?('Flipped_Down')
@bubble_correction_y = 7
else
@bubble_correction_y = 0
end
# Set basic x and y values for bubble drawing
# If a face graphic will be drawn
if @face != nil
# If face graphic drawn outside bubble
if $game_system.face_graphic_type == FACE_GRAPHIC_FULL
base_y = (@face_extension_y + @text_rect.height) - (@text_rect.height + 20)
# If bubble is flipped horizontally
if @position.include?('Mirror')
base_x = 0
else
base_x = @face_extension_x
end
# If bubble is not flipped vertically
if not @position.include?('Flipped_Down')
base_y -= 6
end
base_height = @text_rect.height
height_extension = @face_extension_y
if $game_system.message_text_mode == TEXT_MODE_BUBBLE
width_extension = @face_extension_x + 25
elsif $game_system.message_text_mode == TEXT_MODE_WINDOWSKIN
width_extension = @face_extension_x + 20
end
# If face graphic drawn inside bubble
else
base_x = 0
base_y = @bubble_correction_y
base_height = @face_extension_y + @text_rect.height
if $game_system.message_text_mode == TEXT_MODE_BUBBLE
width_extension = 25
height_extension = 20 + 6
elsif $game_system.message_text_mode == TEXT_MODE_WINDOWSKIN
width_extension = 20
height_extension = 20
end
end
else
base_x = 0
base_y = @bubble_correction_y
base_height = @text_rect.height
if $game_system.message_text_mode == TEXT_MODE_BUBBLE
height_extension = 20 + 7
width_extension = 25
elsif $game_system.message_text_mode == TEXT_MODE_WINDOWSKIN
height_extension = 20
width_extension = 20
end
end
base_width = @text_rect.width
# Set text drawing starting coordinates
@text_y = base_y
if $game_system.message_text_mode == TEXT_MODE_BUBBLE
bubble.bitmap = Bitmap.new("Graphics/Pictures/Message_Bubble")
elsif $game_system.message_text_mode == TEXT_MODE_WINDOWSKIN
bubble.bitmap = Bitmap.new("Graphics/Windowskins/"+$data_system.windowskin_name)
end
# Make the bubble bitmap the appropriate size
@message_box = Sprite.new
true_width = base_width + width_extension
true_height = base_height + height_extension
@message_box.bitmap = Bitmap.new(true_width,true_height)
@message_box.ox = @message_box.bitmap.width/2
@message_box.oy = @message_box.bitmap.height/2
@message_box.x = sprites[@event].x\
+ @message_box.bitmap.width/2\
+ sprites[@event].src_rect.width/2 - 15
if $game_system.face_graphic_type == FACE_GRAPHIC_FULL
@message_box.x -= @face_extension_x
end
@message_box.y = sprites[@event].y\
- ((sprites[@event].src_rect.height/3)*2)\
- @message_box.oy
if $game_system.face_graphic_type == FACE_GRAPHIC_FULL \
&& @position.include?('Flipped_Down')
@message_box.y -= @face_extension_y
end
if @sub == false
@message_box.z += 1
end
# Set rectangles for graphic block transfers
if $game_system.message_text_mode == TEXT_MODE_BUBBLE
upper_left = BUBBLE_UPPER_LEFT
lower_left = BUBBLE_LOWER_LEFT
upper_right = BUBBLE_UPPER_RIGHT
lower_right = BUBBLE_LOWER_RIGHT
elsif $game_system.message_text_mode == TEXT_MODE_WINDOWSKIN
background = Rect.new(base_x+1,base_y+1,base_width+20-2,base_height+20-2)
source_rect = Rect.new(0,0,128,128)
@message_box.bitmap.stretch_blt(background,bubble.bitmap,source_rect)
upper_left = SKIN_UPPER_LEFT
lower_left = SKIN_LOWER_LEFT
upper_right = SKIN_UPPER_RIGHT
lower_right = SKIN_LOWER_RIGHT
end
# Blt the upper left quadrant of the bubble
rect = Rect.new(0,0,13,10)
@message_box.bitmap.blt(base_x,base_y,bubble.bitmap,upper_left)
# Blt the lower left quadrant of the bubble
rect.set(0,10,13,9)
y = base_y + base_height + lower_left.height
@message_box.bitmap.blt(base_x,y,bubble.bitmap,lower_left)
# Blt the upper right quadrant of the bubble
rect.set(13,0,12,10)
x = base_x + base_width + upper_right.width
@message_box.bitmap.blt(x,base_y,bubble.bitmap,upper_right)
# Blt the lower right quadrant of the bubble
rect.set(13,10,12,9)
x = base_x + base_width + lower_right.width
y = base_y + base_height + upper_right.height
@message_box.bitmap.blt(x,y,bubble.bitmap,lower_right)
if $game_system.message_text_mode == TEXT_MODE_BUBBLE
# Fill in the left side gap
rect.set(0,8,13,1)
x = base_x
y = base_y + upper_left.height
rect2 = Rect.new(x,y,13,base_height)
@message_box.bitmap.stretch_blt(rect2,bubble.bitmap,rect)
# Fill in the right side gap
rect.set(13,8,12,1)
x = base_x + base_width + upper_right.width
y = base_y + upper_right.height
rect2 = Rect.new(x,y,13,base_height)
@message_box.bitmap.stretch_blt(rect2,bubble.bitmap,rect)
# Fill in the middle gap
x = base_x + upper_left.width - 1
y = base_y
width = base_width
height = base_height + upper_left.height + lower_left.height
rect.set(x,y,1,height)
rect2.set(x,y,base_width,height)
@message_box.bitmap.stretch_blt(rect2,@message_box.bitmap,rect)
# Place character pointer either below or above bubble
if @position.include?('Flipped_Down')
if @thought == false
rect.set(15,19,10,8)
else
rect.set(25,8,10,8)
end
x = base_x + 9
y = base_y - @bubble_correction_y
@message_box.bitmap.blt(x,y,bubble.bitmap,rect)
@message_box.y = sprites[@event].y\
- ((sprites[@event].src_rect.height/3)*2)\
+ @message_box.oy - @face_extension_y#- (offset_y-@text_rect.height-20)
else
if @thought == false
rect.set(0,19,10,8)
else
rect.set(25,0,10,8)
end
x = base_x + 9
y = base_y + base_height + 17
@message_box.bitmap.blt(x,y,bubble.bitmap,rect)
end
if @position.include?('Mirror')
@message_box.mirror = true
@message_box.x = sprites[@event].x\
- sprites[@event].src_rect.width/2\
- @message_box.bitmap.width/2 + 15 + base_x #+offset_x
end
# Fill in rim of a windowskin box
elsif $game_system.message_text_mode == TEXT_MODE_WINDOWSKIN
# Top rim
dest_rect = Rect.new(base_x+10,base_y,base_width,10)
source_rect = Rect.new(148,0,24,10)
@message_box.bitmap.stretch_blt(dest_rect,bubble.bitmap,source_rect)
# Bottom rim
dest_rect = Rect.new(base_x+10,base_y+base_height+20-10,base_width,10)
source_rect = Rect.new(148,54,24,10)
@message_box.bitmap.stretch_blt(dest_rect,bubble.bitmap,source_rect)
# Left rim
dest_rect = Rect.new(base_x,base_y+10,10,base_height)
source_rect = Rect.new(128,10,10,44)
@message_box.bitmap.stretch_blt(dest_rect,bubble.bitmap,source_rect)
# Right rim
dest_rect = Rect.new(base_x+base_width+20-10,base_y+10,10,base_height)
source_rect = Rect.new(182,10,10,44)
@message_box.bitmap.stretch_blt(dest_rect,bubble.bitmap,source_rect)
end
# Prepare bubble for up/down animation
@up = true
@message_box.opacity = 0
@fade_in = true
# Dispose of the blted bubble
bubble.bitmap.dispose
bubble = nil
@contents_showing = true
@active = true
if @bubble_color.class == Color
@message_box.color = @bubble_color
end
end
#--------------------------------------------------------------------------
# * Determine Bubble Position
#--------------------------------------------------------------------------
def determine_position(no_text=false)
sprites = $scene.spriteset.character_sprites
@position = ''
# Check upper screen boundary
temp = @text_rect.height + 25 + sprites[@event].src_rect.height
if sprites[@event].y - temp < 0
@position += 'Flipped_Down'
end
temp = @text_rect.width + 45
if sprites[@event].x\
+ sprites[@event].src_rect.width/2 + temp > 640
@position += 'Mirror'
end
if no_text == false
if @text.slice(/\007\[([0-9]+)\]/)
#c = @text.slice(/[0-9]+/).to_i
@text.slice!(/\007\[([0-9]+)\]/)
c = $1.to_i
@position = ''
if c == 0
@position = ''
elsif c == 1
@position = 'Flipped_Down'
elsif c == 2
@position = 'Mirror'
elsif c == 3
@position = 'Flipped_Down Mirror'
end
end
end
end
#--------------------------------------------------------------------------
# * Bubble Graphic Update
#--------------------------------------------------------------------------
def update_bubble
# Create an easier to use access point to the screen sprites
sprites = $scene.spriteset.character_sprites
# Bounce bubble
if $game_system.message_text_mode == TEXT_MODE_BUBBLE \
&& $game_system.message_bubble_bounce == BUBBLE_BOUNCE_ON
@count += 1
if @count % 10 == 0 && @up == true
@message_box.y -= 1
if @input_number_window != nil
@input_number_window.y -= 1
end
if @cursor != nil
@cursor.y -= 1
end
if @count == 20
@count = 0
@up = false
end
elsif @count % 10 == 0 && @up == false
@message_box.y += 1
if @input_number_window != nil
@input_number_window.y += 1
end
if @cursor != nil
@cursor.y += 1
end
if @count == 20
@count = 0
@up = true
end
end
end
x = @event_x
y = @event_y
@event_x = sprites[@event].x
@event_y = sprites[@event].y
if @event_x != x || @event_y != y
if @event_x != x
@message_box.x = @message_box.x + (@event_x - x)
if @input_number_window != nil
@input_number_window.x = @input_number_window.x + (@event_x-x)
end
if @cursor != nil
@cursor.x = @cursor.x + (@event_x - x)
end
end
if @event_y - @face_extension_y != y
@message_box.y = @message_box.y + (@event_y - y)
if @input_number_window != nil
@input_number_window.y = @input_number_window.y + (@event_y-y)
end
if @cursor != nil
@cursor.y = @cursor.y + (@event_y - y)
end
end
change = false
# Check upper screen boundary
temp = @message_box.y - @message_box.bitmap.height/2
if temp < 0 && (@position.include?('Flipped_Down') == false)
change = true
end
# Check lower screen boundary
temp = @message_box.y + @message_box.bitmap.height/2
if temp > 480
change = true
end
# Check right screen boundary
temp = @message_box.x + @message_box.bitmap.width/2
if temp > 640
change = true
end
# Check left screen boundary
temp = @message_box.x - @message_box.bitmap.width/2
if temp < 0
change = true
end
if change == true
@message_box.bitmap.clear
determine_position(true)
create_bubble
if @cursor != nil
reset_cursor
end
if @position.include?('Flipped_Down')
get_text
end
@message_box.z -= 1
end
end
@message.y = @message_box.y
@message.x = @message_box.x
end
#--------------------------------------------------------------------------
# * Get Message Text
#--------------------------------------------------------------------------
def get_text
index = $game_system.map_interpreter.index - 1
until $game_system.map_interpreter.list[index].code == 101
index -= 1
end
old_text = @text.clone
@text = ""
@lines.times do
if $game_system.map_interpreter.list[index].code == 102 \
|| $game_system.map_interpreter.list[index].code == 402
for i in 0...$game_system.map_interpreter.list[index].parameters.size
if $game_system.map_interpreter.list[index].parameters[0][i].class == String
@text = @text + $game_system.map_interpreter.list[index].parameters[0][i].clone + "\n"
end
end
else
@text = @text + $game_system.map_interpreter.list[index].parameters[0].clone + "\n"
end
index += 1
end
prep_text
@message.bitmap.clear
@x = 0
@x += 10 if $game_system.message_text_mode == TEXT_MODE_WINDOWSKIN
@y = 0
begin
draw_message
end until @text == old_text
end
#--------------------------------------------------------------------------
# * Prepare Text for processing
#--------------------------------------------------------------------------
def prep_text
# Determine what event the message will be over
if @text.slice!(/\\[Ee]\[([0-9]+)\]/) == nil
@event = -1 # Default to over player
else
@event = $1.to_i - 1
end
# Control text processing
begin
@last_text = @text.clone
@text.gsub!(/\\[Vv]\[([0-9]+)\]/) { $game_variables[$1.to_i] }
end until @text == @last_text
@text.gsub!(/\\[Nn]\[([0-9]+)\]/) do
$game_actors[$1.to_i] != nil ? "#{$game_actors[$1.to_i].name}:"+"\n" : ""
end
# Change "\\\\" to "\000" for convenience
@text.gsub!(/\\\\/) { "\000" }
# Change "\\C" to "\001" and "\\G" to "\002"
# and "\\B" to "\003" and "\\S" to "\004"
# and "\\W" to "\005" and "\\p" to "\006"
# and "\\F" to "\007" and "\\q" to "\011"
# and "\\I" to "\014 and "\\z" to "\015"
# and "\\T" to "\017 and "\\m" to "\018"
while @text.slice(/\\[Cc]\[([0-9]+)\]/) != nil
@text.gsub!(/\\[Cc]\[([0-9]+)\]/) { "\001[#{$1}]" }
end
@text.gsub!(/\\[Gg]/) { "\002" }
@text.gsub!(/\\[Bb]/) { "\003" }
@text.gsub!(/\\[Ss]/) { "\004" }
while @text.slice(/\\[Ww]\[([0-9]+)\]/) != nil
@text.gsub!(/\\[Ww]\[([0-9]+)\]/) { "\005[#{$1}]" }
end
while @text.slice(/\\[Pp]/) != nil
@text.gsub!(/\\[Pp]/) { "\006" }
end
while @text.slice(/\\[Ii]/) != nil
@text.gsub!(/\\[Ii]\[([0-9]+)\]/) { "\014[#{$1}]" }
end
while @text.slice(/\\[Zz]/) != nil
# Check for face directory existence
if File.directory? Dir::getwd + "/Graphics/Faces/"
@text.slice(/\\[Zz]\[([0-9]+)\]/)
# Check for file existence
if Faces[$1.to_i] != nil
@text.gsub!(/\\[Zz]\[([0-9]+)\]/) { "\015[#{$1}]" }
else
@text.gsub!(/\\[Zz]\[([0-9]+)\]/) { "" }
end
else
@text.gsub!(/\\[Zz]\[([0-9]+)\]/) { "" }
end
end
while @text.slice(/\\[Hh]/) != nil
@text.gsub!(/\\[Hh]\[([0-9]+)\]/) { "\016[#{$1}]" }
end
@text.gsub!(/\\[Ff]/) { "\007" }
@text.gsub!(/\\[Qq]/) { "\011" }
@text.gsub!(/\\[Tt]/) { "\017" }
while @text.slice(/\\[Mm]\[([0-9]+)]/)
@text.gsub!(/\\[Mm]\[([0-9]+)]/) { "\018[#{$1}]" }
end
@text.slice!(/\\[Nn][Cc]/)
end
#--------------------------------------------------------------------------
# * Create cursor graphic
#--------------------------------------------------------------------------
def create_cursor
if $game_system.message_text_mode == TEXT_MODE_BUBBLE
@cursor = Sprite.new
@cursor.bitmap = Bitmap.new("Graphics/Pictures/Pointer2")
@cursor.ox = @cursor.bitmap.width
if $separate_choices == false
indent = @message.bitmap.text_size(" ").width
else
indent = @message.bitmap.text_size(" ").width
end
elsif $game_system.message_text_mode == TEXT_MODE_WINDOWSKIN
template = Sprite.new
template.opacity = 0
template.bitmap = Bitmap.new("Graphics/Windowskins/"+$data_system.windowskin_name)
source_rect = Rect.new(128,64,32,32)
# Set width of the cursor rectangle
width = @line_width[@lines-$game_temp.choice_max+@index]
# Correct for added spaces in choices following main text
width -= @message.bitmap.text_size(' ').width if @indent == true
dest_rect = Rect.new(0,0,width,@text_height)
if @cursor == nil
@cursor = Sprite.new
else
@cursor.bitmap.clear
@cursor.bitmap.dispose
end
@cursor.opacity = 255
@cursor.bitmap = Bitmap.new(width,@text_height)
# Upper left
source_rect = Rect.new(128,64,3,3)
@cursor.bitmap.blt(0,0,template.bitmap,source_rect)
# Upper right
source_rect = Rect.new(157,64,3,3)
@cursor.bitmap.blt(width-3,0,template.bitmap,source_rect)
# Lower left
source_rect = Rect.new(128,93,3,3)
@cursor.bitmap.blt(0,@text_height-3,template.bitmap,source_rect)
# Lower right
source_rect = Rect.new(157,93,3,3)
@cursor.bitmap.blt(width-3,@text_height-3,template.bitmap,source_rect)
# Top fill in
source_rect = Rect.new(131,64,26,3)
dest_rect = Rect.new(3,0,width-6,3)
@cursor.bitmap.stretch_blt(dest_rect,template.bitmap,source_rect)
# Bottom fill in
source_rect = Rect.new(131,93,26,3)
dest_rect = Rect.new(3,@text_height-3,width-6,3)
@cursor.bitmap.stretch_blt(dest_rect,template.bitmap,source_rect)
# Left fill in
source_rect = Rect.new(128,67,3,@text_height-6)
dest_rect = Rect.new(0,3,3,@text_height-6)
@cursor.bitmap.stretch_blt(dest_rect,template.bitmap,source_rect)
# Right fill in
source_rect = Rect.new(157,67,3,@text_height-6)
dest_rect = Rect.new(width-3,3,3,@text_height-6)
@cursor.bitmap.stretch_blt(dest_rect,template.bitmap,source_rect)
# Center fill in
source_rect = Rect.new(131,67,26,26)
dest_rect = Rect.new(3,3,width-6,@text_height-6)
@cursor.bitmap.stretch_blt(dest_rect,template.bitmap,source_rect)
@cursor.ox = 0
template.bitmap.clear
template = nil
indent = @message.bitmap.text_size(" ").width
end
@cursor.oy = @cursor.bitmap.height/2
if @indent == true
@cursor.x = @message.x - @message.ox + 14 + @face_extension_x + indent
else
@cursor.x = @message.x - @message.ox + @face_extension_x + indent
end
y_correction = 0
@line_height_correction.each { |number|
y_correction += number
}
@cursor.y = @message.y - @message.oy + @bubble_correction_y \
+ 10 + @text_height/2 + ((@lines-$game_temp.choice_max+@index)*@text_height)\
+ y_correction
@cursor.z += 5
# More accurately place windowskin rectangle
if $game_system.message_text_mode == TEXT_MODE_WINDOWSKIN
@cursor.y -= 1
end
# Correct for bad sizing of bitmap draw_text method
if $game_system.message_text_size == TEXT_SIZE_LARGE
@cursor.y -= 2
elsif
$game_system.message_text_size == TEXT_SIZE_JUMBO
@cursor.y -= 6
end
end
#--------------------------------------------------------------------------
# * Reset cursor graphic
#--------------------------------------------------------------------------
def reset_cursor
@cursor.x = @message_box.x - @message_box.ox + 16
@cursor.y = @message_box.y - @message_box.oy\
+ ((@lines-$game_temp.choice_max + 1)*@text_height)\
+ @bubble_correction_y
end
#--------------------------------------------------------------------------
# * Update cursor graphic
#--------------------------------------------------------------------------
def update_cursor
if $game_system.message_text_mode == TEXT_MODE_BUBBLE
modulus = 10
elsif $game_system.message_text_mode == TEXT_MODE_WINDOWSKIN
modulus = 3
end
@cursor_count += 1
if @cursor_count % modulus == 0 && @cursor_move_right == true
if $game_system.message_text_mode == TEXT_MODE_BUBBLE
@cursor.x += 1
elsif $game_system.message_text_mode == TEXT_MODE_WINDOWSKIN
@cursor.opacity -= 10
end
if @cursor_count == modulus * 5
@cursor_count = 0
@cursor_move_right = false
end
elsif @cursor_count % modulus == 0 && @cursor_move_right == false
if $game_system.message_text_mode == TEXT_MODE_BUBBLE
@cursor.x -= 1
elsif $game_system.message_text_mode == TEXT_MODE_WINDOWSKIN
@cursor.opacity += 10
end
if @cursor_count == modulus * 5
@cursor_count = 0
@cursor_move_right = true
end
end
if Input.trigger?(Input::UP)
if @index != 0
@cursor.y -= @text_height
@index -= 1
else
@cursor.y += @text_height * ($game_temp.choice_max-1)
@index = $game_temp.choice_max-1
end
if $game_system.message_text_mode == TEXT_MODE_WINDOWSKIN
create_cursor
end
elsif Input.trigger?(Input::DOWN)
if @index != $game_temp.choice_max-1
@cursor.y += @text_height
@index += 1
else
@cursor.y -= @text_height * ($game_temp.choice_max-1)
@index = 0
end
if $game_system.message_text_mode == TEXT_MODE_WINDOWSKIN
create_cursor
end
end
end
end