Scrolling Message System - Version: 1.2
Last Update
May 13, 2007
Introduction
This script makes message show in two lines of text at a time. If there are more than two lines, the lines will be scrolled in a smoothly way. Letters are drawed one by one.
Features
Version 1.2 (13/05/07)
- added: Face
- added: Name Box
- added: Bold & Italic
- fixed: Easier to expand the script
- fixed: Small bug when using slow scrolling
Version 1.1 (23/01/07)
- added: Choices supports "message code".
- fixed: Small bug with the scroll arrows
Version 1.0 (15/12/06)
- First release
Screenshots
Demo
http://www.fileul.com/view.php?file=o2KsIL
Script
Instructions
You need paste the code before Main.
Take a look to the demo and see how it works.
Compatibility
This script couldn't work with other message window script.
Author's Notes
Credit me and report bugs!
Thanks to TDS (creation asylum) to test this new version
Last Update
May 13, 2007
Introduction
This script makes message show in two lines of text at a time. If there are more than two lines, the lines will be scrolled in a smoothly way. Letters are drawed one by one.
Features
- Letter by Letter: the characters are drawed one by one.
- Scrolling: the text lines are scrolled, the time of this can be changed.
- Stop: the message window can be stopped until the player press a key. \!
- Autoclose: the message will close without the player input. \%
- Choices: the choices are showed in a different window, they are also scrolled when are more than two.
- Height: The heigth of lines can be changed, everything is adjusted to this.
- Above Events: You can draw the window above an event. \p[event]
- Name Box: Text is shown in a small window above message \name[text]
Code:#============================================================== # ** Scrolling Message System / Name Box #------------------------------------------------------------------------------ # Slipknot (http://www.creationasylum.net/) # Version 1.1 # March 13, 2007 #============================================================== class Window_Message < Window_Selectable #-------------------------------------------------------------------------- # * Alias Listing #-------------------------------------------------------------------------- alias slipknot_sms_nb_refresh refresh alias slipknot_sms_nb_repcod replace_code alias slipknot_sms_nb_termmes terminate_message #-------------------------------------------------------------------------- # * Terminate Message #-------------------------------------------------------------------------- def terminate_message slipknot_sms_nb_termmes if @name_box @name_box.dispose @name_box = nil end end #-------------------------------------------------------------------------- # * Refresh #-------------------------------------------------------------------------- def refresh slipknot_sms_nb_refresh if @name_text @name_box = Window_MessageNameBox.new(x, y - 16, @name_text) @name_box.back.opacity = 0 if $game_system.message_frame == 1 @name_text = nil end end #-------------------------------------------------------------------------- # * Replace Code #-------------------------------------------------------------------------- def replace_code slipknot_sms_nb_repcod @text.gsub!(/\\[Nn]ame\[(.*?)\]/) { @name_text = $1; '' } end end class Window_MessageNameBox < Window_Base #-------------------------------------------------------------------------- # * Public Instance Variables #-------------------------------------------------------------------------- attr_reader :back #-------------------------------------------------------------------------- # * Object Initialization #-------------------------------------------------------------------------- def initialize(x, y, text) dumb = Bitmap.new(160, 32) dumb.font = Message.font color = nil text.sub!(/\\[Cc](\d)/) { color = text_color($1.to_i); '' } size = dumb.text_size(text).width dumb.dispose @back = Window_Base.new(x, y, size + 12, 32) @back.z = 9998 super(x - 10, y - 11, size + 32, 54) self.z = 9999 self.opacity = 0 self.contents = Bitmap.new(size, 22) contents.font = Message.font contents.font.color = color if color contents.draw_text(0, 0, size, 22, text) end #-------------------------------------------------------------------------- # * Dispose #-------------------------------------------------------------------------- def dispose @back.dispose @back = nil super end end
- Face: A small graphic is shown inside the message \face[file]
Code:#============================================================== # ** Scrolling Message System / Face #------------------------------------------------------------------------------ # Slipknot (http://www.creationasylum.net/) # Version 1.0 # May 13, 2007 #============================================================== class Window_Message < Window_Selectable #-------------------------------------------------------------------------- # * Alias Listing #-------------------------------------------------------------------------- alias slipknot_sms_f_refresh refresh alias slipknot_sms_f_repcod replace_code alias slipknot_sms_f_termmes terminate_message #-------------------------------------------------------------------------- # * Refresh #-------------------------------------------------------------------------- def terminate_message slipknot_sms_f_termmes if @face @face.dispose @face = nil end end #-------------------------------------------------------------------------- # * Refresh #-------------------------------------------------------------------------- def refresh slipknot_sms_f_refresh if @face_name @face = Sprite.new @face.x = self.x + 16 @face.y = self.y + 16 @face.z = self.z + 1 @face.bitmap = RPG::Cache.picture(@face_name) @face_name = nil end end #-------------------------------------------------------------------------- # * Replace Code #-------------------------------------------------------------------------- def replace_code slipknot_sms_f_repcod @text.sub!(/\\[Ff]ace\[(.*?)\]/) do @face_name = $1 @ex += Message::Height * 2 + 4 '' end end end
- Bold: \b
Italic: \i
Code:#============================================================== # ** Scrolling Message System / Bold & Italic #------------------------------------------------------------------------------ # Slipknot (http://www.creationasylum.net/) # Version 1.0 # May 13, 2007 #============================================================== class Window_Message < Window_Selectable #-------------------------------------------------------------------------- # * Alias Listing #-------------------------------------------------------------------------- alias slipknot_sms_bi_evalextra eval_extra alias slipknot_sms_bi_repbcod replace_basic_code #-------------------------------------------------------------------------- # * Eval Extra #-------------------------------------------------------------------------- def eval_extra(bitmap) slipknot_sms_bi_evalextra(bitmap) if @c == "\005" bitmap.font.bold = bitmap.font.bold ? false : true @c = '' end if @c == "\006" bitmap.font.italic = bitmap.font.italic ? false : true @c = '' end end #-------------------------------------------------------------------------- # * Replace Basic Code #-------------------------------------------------------------------------- def replace_basic_code slipknot_sms_bi_repbcod @text.gsub!('\\b', "\005") @text.gsub!('\\i', "\006") end end
Version 1.2 (13/05/07)
- added: Face
- added: Name Box
- added: Bold & Italic
- fixed: Easier to expand the script
- fixed: Small bug when using slow scrolling
Version 1.1 (23/01/07)
- added: Choices supports "message code".
- fixed: Small bug with the scroll arrows
Version 1.0 (15/12/06)
- First release
Screenshots

Demo
http://www.fileul.com/view.php?file=o2KsIL
Script
Code:
#==============================================================
# ** Scrolling Message System
#------------------------------------------------------------------------------
# Slipknot (http://www.creationasylum.net/)
# Version 1.2
# May 13, 2007
#==============================================================
module Message
#--------------------------------------------------------------------------
# * Settings
#--------------------------------------------------------------------------
# ~ Font
FontName = 'High Tower Text'
FontSize = 20
# ~ Size
Width = 388
Height = 24
# ~ Delay
TextDelay = 2
Scroll = 30
Autoclose = 16
#--------------------------------------------------------------------------
# * Font
#--------------------------------------------------------------------------
def self.font
Font.new(FontName, FontSize)
end
end
class Game_Temp
#--------------------------------------------------------------------------
# * Public Instance Variables
#--------------------------------------------------------------------------
attr_accessor :mes_choices
end
class Spriteset_Map
#--------------------------------------------------------------------------
# * Public Instance Variables
#--------------------------------------------------------------------------
attr_reader :character_sprites
end
class Interpreter
#--------------------------------------------------------------------------
# * Show Text
#--------------------------------------------------------------------------
def command_101
return false if (temp = $game_temp).message_text
@message_waiting = true
temp.message_proc = Proc.new { @message_waiting = false }
temp.message_text = @list.at(@index).parameters.at(0) + "\n"
loop do
com = @list.at(@index + 1)
if com.code == 401 || com.code == 101
temp.message_text += com.parameters.at(0) + "\n"
else
if com.code == 102
temp.choice_max = com.parameters.at(0).size
temp.mes_choices = com.parameters.at(0)
temp.choice_cancel_type = com.parameters.at(1)
current_indent = com.indent
temp.choice_proc = Proc.new { |n| @branch[current_indent] = n }
@index += 1
elsif com.code == 103
@index += 1
temp.message_text += "\n"
temp.num_input_variable_id = com.parameters.at(0)
temp.num_input_digits_max = com.parameters.at(1)
end
return true
end
@index += 1
end
end
end
class Window_Message < Window_Selectable
#--------------------------------------------------------------------------
# * Alias Listing
#--------------------------------------------------------------------------
alias slipknot_sms_init initialize
#--------------------------------------------------------------------------
# * Initialize
#--------------------------------------------------------------------------
def initialize
slipknot_sms_init
self.height = Message::Height * 2 + 32
self.back_opacity = 160
self.windowskin = windowskin.clone
self.windowskin.fill_rect(144, 16, 32, 32, Color.new(0, 0, 0, 0))
@ey = 1.0
@y = 0
end
#--------------------------------------------------------------------------
# * Opacity
#--------------------------------------------------------------------------
def opacity=(val)
super
@choices.opacity = val if @choices
end
#--------------------------------------------------------------------------
# * Refresh
#--------------------------------------------------------------------------
def refresh
contents.clear
contents.font = Message.font
@x = @y = @ex = @ey = 0
return if ! (@text = temp.message_text)
replace_code
gold_win |= @text.gsub!(/\\[Gg]/, '')
if fit |= @text[/\\[Pp]/]
if @text.sub!(/\\[Pp]\[([-1,0-9]+)\]/, '')
event = $1.to_i
elsif @text.gsub!(/\\[Pp]/, '')
event = ev_ac
end
end
lines_size = [0]
save, @lines = @text.clone, 0
while @c = @text.slice!(/./m)
if @c == "\n"
@lines += 1
lines_size << 0
next
end
lines_size[@lines] += eval_text(self.contents, true)
end
if temp.choice_max > 0
@c_data = [Bitmap.new(640 - Message::Width, Message::Height *
temp.choice_max), Array.new(temp.choice_max, 0)]
@c_data.at(0).font = Message.font
@text = temp.mes_choices.join("\n")
replace_basic_code
@y = 0
while @c = @text.slice!(/./m)
@c_data.at(1)[@y] += eval_text(@c_data.at(0))
end
@c_data[1] = @c_data.at(1).max + 8
@x = @y = 0
end
@text = save
twidth = temp.choice_max > 0 ? @c_data.at(1) + 32 : 0
self.width = fit ? lines_size.max + 40 + @ex : Message::Width - twidth
twidth += self.width
self.contents = Bitmap.new(self.width - 32, @lines * Message::Height)
contents.font = Message.font
if ! event
h2 = self.height / 2
self.y = temp.in_battle ? 96 - h2 :
case $game_system.message_position
when 0 then 96 - h2
when 1 then 240 - h2
when 2 then 384 - h2
end
self.x = 320 - twidth / 2
else
c = event > 0 ? $game_map.events[event] : $game_player
mx, my = 636 - twidth, 476 - self.height
fx = [[c.screen_x - twidth / 2, 4].max, mx].min
ch = [$scene.spriteset.character_sprites[event - 1].bitmap.height /
4 + 4, 48].max
fy = [[c.screen_y - (ch + self.height), 4].max, my].min
self.x, self.y = fx, fy
end
self.opacity = $game_system.message_frame == 0 ? 255 : 0
if gold_win
@gold_window = Window_Gold.new
@gold_window.x = 560 - @gold_window.width
if temp.in_battle
@gold_window.y = 192
else
@gold_window.y = self.y >= 128 ? 32 : 384
end
@gold_window.opacity = self.opacity
end
if temp.choice_max > 0
@choices = Window_MesChoices.new(self.x + self.width, self.y, @c_data)
@choices.back_opacity = self.back_opacity
end
end
#--------------------------------------------------------------------------
# * Replace Code
#--------------------------------------------------------------------------
def replace_code
replace_basic_code
@text.gsub!('\!') { "\003" }
@text.gsub!('\.') { "\004" }
@text.gsub!(/\\\%\[(\d+)\]/) { "\011[#$1]" }
@text.gsub!('\%') { "\011" }
end
def replace_basic_code
@text.gsub!(/\\\\/) { "\000" }
@text.gsub!(/\\[Vv]\[([0-9]+)\]/) { $game_variables[$1.to_i] }
@text.gsub!('\$') { $game_party.gold.to_s }
@text.gsub!(/\\[Nn]\[([0-9]+)\]/) do
$game_actors[$1.to_i] ? $game_actors[$1.to_i].name : ''
end
@text.gsub!('\$') { $game_party.gold.to_s }
@text.gsub!(/\\[Cc]\[([0-9]+?)\]/) { "\001[#$1]" }
end
#--------------------------------------------------------------------------
# * Evaluate Text
#--------------------------------------------------------------------------
def eval_text(bitmap, read = false)
case @c
when "\000"
@c = '\\'
when "\001"
@text.sub!(/\[(\d+)\]/, '')
return 0 if read
bitmap.font.color = text_color($1.to_i)
return 0
when "\002"
@text.sub!(/\[(.*?)\]/, '')
return 24 if read
y = Message::Height * @y
bitmap.blt(@ex + @x + 4, y, RPG::Cache.icon($1.to_s), Rect.new(0, 0, 24, 24))
@x += 24
return 0
when "\003"
return 0 if read
@stop = true
return 0
when "\004"
return 0 if read
@wait_count += 10
return 0
when "\011"
@text.sub!(/\[(\d+)\]/, '')
return 0 if read || temp.num_input_variable_id > 0 || temp.choice_max > 0
@autoclose = $1 ? $1.to_i : Message::Autoclose
return 0
end
eval_extra(bitmap)
return 0 if @c == '' || @c == nil
if @c == "\n"
@y += 1
@x = 0
return 0
end
w = bitmap.text_size(@c).width
unless read
bitmap.draw_text(@ex + @x + 4, Message::Height * @y, w, Message::Height, @c)
@x += w
end
return w
end
def eval_extra(bitmap)
end
#--------------------------------------------------------------------------
# * Variables
#--------------------------------------------------------------------------
def temp() $game_temp end
def input_number() @input_number_window end
def ev_ac() $game_system.map_interpreter.event_id end
#--------------------------------------------------------------------------
# * Frame Update
#--------------------------------------------------------------------------
def update
if @contents_showing
super
if self.oy < (@y - 1) * Message::Height && @y < @lines
@ey += Message::Height / Message::Scroll.to_f
ey = @ey - @ey.floor
self.oy += @ey.floor
@ey = ey
end
if @text
if Input.trigger?(13) && @stop
self.pause = @stop = false
return
elsif @stop
return
elsif @wait_count > 0
@wait_count -= 1
return
end
@wait_count = 0
return if self.oy < (@y - 1) * Message::Height && @y != @lines
if (@c = @text.slice!(/./m))
eval_text(contents)
if @stop
self.pause = true
return
end
@wait_count += Input.press?(13) ? 0 : Message::TextDelay
else
@text = nil
end
return if @text || @autoclose != -1
if temp.num_input_variable_id > 0
digits_max = temp.num_input_digits_max
@input_number_window = Window_InputNumber.new(digits_max)
input_number.number = $game_variables[temp.num_input_variable_id]
input_number.x = self.x + (self.width / 2 - input_number.width / 2)
input_number.y = self.y + Message::Height
@y -= 1
@ey -= 1.0
end
@choices.index, @choices.active = 0, true if @choices
return
else
if @autoclose > 0
@autoclose -= 1
return
elsif @autoclose == 0
terminate_message
@autoclose = -1
return
end
end
if input_number
input_number.update
if Input.trigger?(13)
$game_system.se_play($data_system.decision_se)
$game_variables[temp.num_input_variable_id] = input_number.number
$game_map.need_refresh = true
input_number.dispose
@input_number_window = nil
terminate_message
end
return
elsif @choices
@choices.update
end
self.pause = true
if Input.trigger?(12)
if temp.choice_max > 0 && temp.choice_cancel_type > 0
$game_system.se_play($data_system.cancel_se)
temp.choice_proc.call(temp.choice_cancel_type - 1)
terminate_message
end
end
if Input.trigger?(13)
if temp.choice_max > 0
$game_system.se_play($data_system.decision_se)
temp.choice_proc.call(@choices.index)
end
terminate_message
end
return
end
if ! @fade_out && temp.message_text
@contents_showing = temp.message_window_showing = true
if @choices
@choices.dispose
@choices = nil
end
self.oy = 0
@stop = false
@autoclose = -1
refresh
@wait_count, self.visible = 0.0, true
return
end
return if ! visible
@fade_out = true
self.opacity -= 48
if self.opacity == 0
self.visible = @fade_out = false
if @choices
@choices.dispose
@choices = nil
end
temp.message_window_showing = false
end
end
end
class Window_MesChoices < Window_Selectable
#--------------------------------------------------------------------------
# * Initialize
#--------------------------------------------------------------------------
def initialize(x, y, data)
super(x, y, data.at(1) + 32, 2 * (h = Message::Height) + 32)
self.opacity = $game_system.message_frame == 0 ? 255 : 0
self.index, self.active, @item_max = -1, false, $game_temp.choice_max
self.contents = Bitmap.new(data.at(1), @item_max * h)
contents.blt(0, 0, data.at(0), Rect.new(0, 0, data.at(1), h * @item_max))
end
#--------------------------------------------------------------------------
# * Update Cursor
#--------------------------------------------------------------------------
def update_cursor_rect
if @index < 0
self.cursor_rect.empty
return
end
self.oy = [[@index, @item_max].min - 1, 0].max * Message::Height
y = @index * Message::Height - self.oy
cursor_rect.set(0, y, width - 32, Message::Height)
end
end
class Window_InputNumber < Window_Base
#--------------------------------------------------------------------------
# * Initialize
#--------------------------------------------------------------------------
def initialize(digits)
@digits_max = digits
@number = 0
dummy = Bitmap.new(32, 32)
dummy.font = Message.font
@cursor_width = dummy.text_size('0').width + 8
dummy.dispose
super(0, 0, @cursor_width * @digits_max + 32, Message::Height + 32)
self.contents = Bitmap.new(width - 32, height - 32)
contents.font = Message.font
self.z += 9999
self.opacity = @index = 0
refresh
update_cursor_rect
end
#--------------------------------------------------------------------------
# * Update Cursor
#--------------------------------------------------------------------------
def update_cursor_rect
cursor_rect.set(@index * @cursor_width, 0, @cursor_width, Message::Height)
end
#--------------------------------------------------------------------------
# * Refresh
#--------------------------------------------------------------------------
def refresh
contents.clear
contents.font.color = normal_color
s = sprintf("%0*d", @digits_max, @number)
for i in 0...@digits_max
contents.draw_text(i * @cursor_width + 4, 0, 32, Message::Height, s[i, 1])
end
end
end
class Interpreter
#--------------------------------------------------------------------------
# * Public Instance Variables
#--------------------------------------------------------------------------
attr_reader :event_id
end
class Scene_Map
#--------------------------------------------------------------------------
# * Public Instance Variables
#--------------------------------------------------------------------------
attr_reader :spriteset
end
Instructions
You need paste the code before Main.
Take a look to the demo and see how it works.
- FontName: is the font used for the text.
- FontSize: the size of the text.
- Width: the width of the message window.
- Height: the height of each line, the height of the window is Height * 2 + 32.
- TextDelay: the higher this value is, higher the delay between characters.
- Scroll: the delay of the "scrolling".
- Autoclose: the number of frames before close the message when autoclose is used.
Compatibility
This script couldn't work with other message window script.
Author's Notes
Credit me and report bugs!
Thanks to TDS (creation asylum) to test this new version