05-13-2007, 01:00 PM
(This post was last modified: 05-11-2017, 05:03 AM by DerVVulfman.)
Scrolling Message System
by Sheol
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.1 (23/01/07)
- added: Choices supports "message code".
- fixed: Small bug with the scroll arrows.
Version 1.0 (15/12/06)
- First release
Script
Instructions
You need paste the code before Main.
Take a look to the demo and see how it works.
This script couldn't work with other message window script.
Author's Notes
Credit me and report bugs!
Thanks to TDS to test this :)
by Sheol
Version: 1.2
Last Update
May 13, 2007
This is a locked, single-post thread from Creation Asylum. Archived here to prevent its loss.
No support is given. If you are the owner of the thread, please contact administration.
No support is given. If you are the owner of the thread, please contact administration.
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]
Name BoxCode:#==============================================================
# ** 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]
FaceCode:#==============================================================
# ** 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
Bold and ItalicCode:#==============================================================
# ** 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 == "�5"
bitmap.font.bold = bitmap.font.bold ? false : true
@c = ''
end
if @c == "�6"
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', "�5")
@text.gsub!('\\i', "�6")
end
end
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
Script
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!('\!') { "�3" }
@text.gsub!('\.') { "�4" }
@text.gsub!(/\\\%\[(\d+)\]/) { "11[#$1]" }
@text.gsub!('\%') { "11" }
end
def replace_basic_code
@text.gsub!(/\\\\/) { "�0" }
@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]+?)\]/) { "�1[#$1]" }
end
#--------------------------------------------------------------------------
# * Evaluate Text
#--------------------------------------------------------------------------
def eval_text(bitmap, read = false)
case @c
when "�0"
@c = '\\'
when "�1"
@text.sub!(/\[(\d+)\]/, '')
return 0 if read
bitmap.font.color = text_color($1.to_i)
return 0
when "�2"
@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 "�3"
return 0 if read
@stop = true
return 0
when "�4"
return 0 if read
@wait_count += 10
return 0
when "11"
@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.
This script couldn't work with other message window script.
Author's Notes
Credit me and report bugs!
Thanks to TDS to test this :)