Trilobytes Message System XP
Message System XP Version 1.00Trilobytes by Trihan
Introduction
This script gives RMXP most of the same additional message codes as are available in Yanfly's Ace Message System for VX Ace.
Features
- Ability to display more than 4 lines of text at a time, controlled by a configurable variable
- Text codes for changing font name, size, colour, outlining and shadow
- Text codes for displaying a name window to the left, centre or right
- Text codes to show pictures and icons
- Text codes to display actor/party names and attributes
- Text codes to display names of database entries for classes, skills, items, weapons, armours and states
Screenshots
Spoiler: Screenshots
https://forums.rpgmakerweb.com/attachments/1647227473296-png.219820/
https://forums.rpgmakerweb.com/attachments/1647227629723-png.219824/
https://forums.rpgmakerweb.com/attachments/1647227746389-png.219825/
How to Use
In XP's Script Editor, insert a new line above Main, give it a descriptive name, and paste this script into the large window on the right. Then click Apply to save the changes.
Script
Code:
#==============================================================================
# Trilobytes - Message System XP v1.00
#
# - Updated: 14/03/22
#==============================================================================
module TLB_MSG
ROW_VAR = 21
def self.rows_for_text
return 4 if ROW_VAR <= 0 || $game_variables <= 0
return $game_variables
end
end # TLB_MSG
#==============================================================================
# Version history
#
# 14/03/22 - Finished script
#==============================================================================
# Introduction
# ------------
# This script introduces to RPG Maker XP most of the text codes added to VX
# Ace by Yanfly's Ace Message System. Some of them aren't applicable to XP,
# such as those related to waiting (since XP shows all text at once) and faces
# (since XP doesn't use them).
#==============================================================================
# Instructions
# ------------
# In XP's Script Editor, insert a new line above Main, give it a descriptive
# name, and paste this script into the large window on the right. Then click
# Apply to save the changes.
#
# Text Codes
# ----------
# Code: Result:
# \p - The name of the party member in slot x.
# \g - The name of the currency unit.
# \c - Changes text colour to x.
# \i - Draws the icon with the filename x.
# \{ - Increases text size by 8.
# \} - Decreases text size by 8.
# \$ - Opens the gold display window (was previously \g)
#
# Name Window: Result:
# \n<x> - Opens a name window with the string x on the left side.
# \nc<x> - Opens a name window with the string x in the centre.
# \nr<x> - Opens a name window with the string x on the right side.
#
# Position: Result:
# \px - Places the following text at X position x.
# \py - Places the following text at Y position x.
#
# Picture: Result:
# \pic - Draws picture x from the Graphics/Pictures folder.
#
# Outline: Result:
# \oc - Sets the outline colour to x (as defined in windowskin)
# \oo - Sets outline opacity to x (0-255)
#
# Font: Result:
# \fn - Sets the font name to x.
# \fz - Sets the font size to x.
# \fb - Toggles font's bold setting.
# \fi - Toggles font's italic setting.
# \fo - Toggles font's outline.
# \fs - Toggles font's shadow.
# \fr - Resets all font changes.
#
# Actor: Result:
# \ac - The name of actor x's class.
#
# Note: Using 0 or a negative number for xwill use party index instead
# of actor ID.
#
# Names: Result:
# \nc - The name of class x.
# \ni - The name of item x.
# \nw - The name of weapon x.
# \na - The name of armour x.
# \nt - The name of state x.
#
# Icon Names: Result:
# \ii - The name of item x, with icon.
# \iw - The name of weapon x, with icon.
# \ia - The name of armour x, with icon.
# \is - The name of skill x, with icon.
#==============================================================================
#
#Special thanks to Yanfly for the codes used in the VX Ace message system.
#
#==============================================================================
class Interpreter
#--------------------------------------------------------------------------
# * Show Text (overwrite)
#--------------------------------------------------------------------------
def command_101
# If other text has been set to message_text
if $game_temp.message_text != nil
# End
return 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 + "\n"
line_count = 1
# Loop
loop do
# Workaround for lines in a box that don't fit in the limit
if @list[@index+1].code == 401 && line_count >= TLB_MSG.rows_for_text
@list.insert(@index+2, RPG::EventCommand.new(101, @list[@index+1].indent, @list[@index+1].parameters))
@list.delete_at(@index+1)
return true
# If next event command text is on the second line or after
elsif @list[@index+1].code == 401 || (@list[@index+1].code == 101 && TLB_MSG.rows_for_text >= 4)
# Add the second line or after to message_text
#if @list[@index+1].code == 401
$game_temp.message_text += @list[@index+1].parameters + "\n"
line_count += 1
#end
# 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
# If choices fit on screen
if @list[@index+1].parameters.size <= 4 - line_count
# Advance index
@index += 1
# Choices setup
$game_temp.choice_start = line_count
setup_choices(@list[@index].parameters)
end
# 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
$game_temp.num_input_digits_max = @list[@index].parameters
end
end
# Continue
return true
end
# Advance index
return true if line_count > TLB_MSG.rows_for_text
@index += 1
end
end
end
class Bitmap
def draw_outline_text(*args)
if args.is_a?(Rect)
x, y, width, height = args.x, args.y, args.width, args.height
text = args
alignment = args ? args : 0
else
x, y, width, height, text = args
alignment = args ? args : 0
end
draw_text(x+1, y, width, height, text, alignment)
draw_text(x-1, y, width, height, text, alignment)
draw_text(x, y+1, width, height, text, alignment)
draw_text(x, y-1, width, height, text, alignment)
draw_text(x, y, width, height, text, alignment)
end
end
class Window_Name < Window_Base
#--------------------------------------------------------------------------
# * Object Initialization
#--------------------------------------------------------------------------
def initialize(message_window, text, position)
@message_window = message_window
width = @message_window.contents.text_size(text).width + 40
x = @message_window.x
case position
when 1:
x = @message_window.x + @message_window.width - @message_window.width / 2 - width / 2
when 2;
x = @message_window.x + @message_window.width - width
end
super(x, @message_window.y - 64, width, 64)
self.contents = Bitmap.new(width - 32, height - 32)
self.back_opacity = 160
@text = text.clone
@position = position
refresh
end
#--------------------------------------------------------------------------
# * Refresh
#--------------------------------------------------------------------------
def refresh
self.contents.clear
self.contents.font.color = normal_color
self.contents.draw_text(4, 0, 120, 32, @text.to_s)
end
end
class Window_Message < Window_Selectable
def create_name_window(text, position)
if @name_window == nil
@name_window = Window_Name.new(self, text, position)
end
end
def reset_font_settings
self.contents.font.name = Font.default_name
self.contents.font.size = Font.default_size
self.contents.font.bold = Font.default_bold
self.contents.font.italic = Font.default_italic
self.contents.font.color = Font.default_color
end
def strip_string(text)
return text.sub!(/\[(.*)\]/, "")
end
def refresh
self.height = TLB_MSG.rows_for_text * 32 + 32
self.y = 480 - self.height - 16
if @name_window != nil
@name_window.y = self.y - 64
end
self.contents = Bitmap.new(self.width - 32, self.height - 32)
self.contents.clear
self.contents.font.color = normal_color
x = y = 0
y_override = nil
outline = false
shadow = false
out_color = Color.new(0, 0, 0, 255)
@cursor_width = 0
# Indent if choice
if $game_temp.choice_start == 0
x = 8
end
# If waiting for a message to be displayed
if $game_temp.message_text != nil
text = $game_temp.message_text
# Control text processing
begin
last_text = text.clone
text.gsub!(/\\\[(+)\]/) { $game_variables[$1.to_i] }
end until text == last_text
# Change "\\\\" to "\000" for convenience
text.gsub!(/\\\\/) { "\000" }
text.gsub!(/\\\[(+)\]/) do
$game_actors[$1.to_i] != nil ? $game_actors[$1.to_i].name : ""
end
text.gsub!(/\\\[(+)\]/) do
$game_party.actors[$1.to_i] != nil ? $game_party.actors[$1.to_i].name : ""
end
text.gsub!(/\\/) do
$data_system.words.gold
end
text.gsub!(/\\ac\[(-?+)\]/) do
id = $1.to_i
if id > 0 && $game_actors != nil
$data_classes[$game_actors.class_id].name
elsif id <= 0 && $game_party.actors[-id] != nil
$data_classes[$game_party.actors[-id].class_id].name
else
""
end
end
text.gsub!(/\\nc\[(+)\]/) do
id = $1.to_i
$data_classes != nil ? $data_classes.name : ""
end
text.gsub!(/\\ni\[(+)\]/) do
id = $1.to_i
$data_items != nil ? $data_items.name : ""
end
text.gsub!(/\\nw\[(+)\]/) do
id = $1.to_i
$data_weapons != nil ? $data_weapons.name : ""
end
text.gsub!(/\\na\[(+)\]/) do
id = $1.to_i
$data_armors != nil ? $data_armors.name : ""
end
text.gsub!(/\\ns\[(+)\]/) do
id = $1.to_i
$data_skills != nil ? $data_skills.name : ""
end
text.gsub!(/\\nt\[(+)\]/) do
id = $1.to_i
$data_states != nil ? $data_states.name : ""
end
# Change "\\C" to "\001" and "\\G" to "\002"
text.gsub!(/\\\[(+)\]/) { "\001[#{$1}]" }
text.gsub!(/\\\$/) { "\002" }
text.gsub!(/\\\[(.*)\]/) { "\003[#{$1}]" }
text.gsub!(/\\\{/) { "\004" }
text.gsub!(/\\\}/) { "\005" }
text.gsub!(/\\n\<(.*)\>/) { "\006[#{$1}]" }
text.gsub!(/\\nc\<(.*)\>/) { "\007[#{$1}]" }
text.gsub!(/\\nr\<(.*)\>/) { "\010[#{$1}]" }
text.gsub!(/\\px\[(+)\]/) { "\013[#{$1}]" }
text.gsub!(/\\py\[(+)\]/) { "\014[#{$1}]" }
text.gsub!(/\\pic\[(.*)\]/) { "\015[#{$1}]" }
text.gsub!(/\\oc\[(+)\]/) { "\016[#{$1}]" }
text.gsub!(/\\oo\[(+)\]/) { "\017[#{$1}]" }
text.gsub!(/\\fr/) { "\020" }
text.gsub!(/\\fz\[(+)\]/) { "\021[#{$1}]" }
text.gsub!(/\\fn\[(.*)\]/) { "\022[#{$1}]" }
text.gsub!(/\\fb/) { "\023" }
text.gsub!(/\\fi/) { "\024" }
text.gsub!(/\\fo/) { "\025" }
text.gsub!(/\\fs/) { "\026" }
text.gsub!(/\\ii\[(+)\]/) { "\027[#{$1}]" }
text.gsub!(/\\iw\[(+)\]/) { "\030[#{$1}]" }
text.gsub!(/\\ia\[(+)\]/) { "\031[#{$1}]" }
text.gsub!(/\\is\[(+)\]/) { "\032[#{$1}]" }
# Get 1 text character in c (loop until unable to get text)
while ((c = text.slice!(/./m)) != nil)
# If \\
if c == "\000"
# Return to original text
c = "\\"
end
# If \C
if c == "\001"
# Change text color
text.sub!(/\[(+)\]/, "")
color = $1.to_i
if color >= 0 and color <= 7
self.contents.font.color = text_color(color)
end
# go to next text
next
end
# If \G
if c == "\002"
# Make gold window
if @gold_window == nil
@gold_window = Window_Gold.new
@gold_window.x = 560 - @gold_window.width
if $game_temp.in_battle
@gold_window.y = 192
else
@gold_window.y = self.y >= 128 ? 32 : 384
end
@gold_window.opacity = self.opacity
@gold_window.back_opacity = self.back_opacity
end
# go to next text
next
end
if c == "\003"
text.sub!(/\[(.*)\]/, "")
icon_name = $1.to_s
bitmap = RPG::Cache.icon(icon_name)
self.contents.blt(x, 32 * y + 4, bitmap, Rect.new(0, 0, 24, 24))
x += 12
next
end
if c == "\004"
self.contents.font.size += 8 if self.contents.font.size <= 64
next
end
if c == "\005"
self.contents.font.size -= 8 if self.contents.font.size >= 16
next
end
if c == "\006"
text.sub!(/\[(.*)\]/, "")
name_text = $1.to_s
create_name_window(name_text, 0)
next
end
if c == "\007"
text.sub!(/\[(.*)\]/, "")
name_text = $1.to_s
create_name_window(name_text, 1)
next
end
if c == "\010"
text.sub!(/\[(.*)\]/, "")
name_text = $1.to_s
create_name_window(name_text, 2)
next
end
if c == "\013"
text.sub!(/\[(+)\]/, "")
x = $1.to_i
next
end
if c == "\014"
text.sub!(/\[(+)\]/, "")
y_override = $1.to_i
next
end
if c == "\015"
text.sub!(/\[(.*)\]/, "")
bitmap = RPG::Cache.picture($1.to_s)
cw = bitmap.width
ch = bitmap.height
src_rect = Rect.new(0, 0, cw, ch)
self.contents.blt(x, y, bitmap, src_rect)
next
end
if c == "\016"
text.sub!(/\[(+)\]/, "")
outline = true
out_color = text_color($1.to_i)
next
end
if c == "\017"
text.sub!(/\[(+)\]/, "")
outline = true
out_color.alpha = $1.to_i
next
end
if c == "\020"
reset_font_settings
outline = false
shadow = false
out_color = Color.new(0, 0, 0, 255)
next
end
if c == "\021"
text.sub!(/\[(+)\]/, "")
self.contents.font.size = $1.to_i
next
end
if c == "\022"
text.sub!(/\[(.*)\]/, "")
self.contents.font.name = $1.to_s
next
end
if c == "\023"
self.contents.font.bold = !self.contents.font.bold
next
end
if c == "\024"
self.contents.font.italic = !self.contents.font.italic
next
end
if c == "\025"
outline = !outline
next
end
if c == "\026"
shadow = !shadow
next
end
if c == "\027"
text.sub!(/\[(+)\]/, "")
item = $data_items[$1.to_i]
if item != nil
bitmap = RPG::Cache.icon(item.icon_name)
self.contents.blt(x, (y_override || (32 * y)) + 4, bitmap, Rect.new(0, 0, 24, 24))
text = item.name + text
x += 24
end
next
end
if c == "\030"
text.sub!(/\[(+)\]/, "")
item = $data_weapons[$1.to_i]
if item != nil
bitmap = RPG::Cache.icon(item.icon_name)
self.contents.blt(x, (y_override || (32 * y)) + 4, bitmap, Rect.new(0, 0, 24, 24))
text = item.name + text
x += 24
end
next
end
if c == "\031"
text.sub!(/\[(+)\]/, "")
item = $data_armors[$1.to_i]
if item != nil
bitmap = RPG::Cache.icon(item.icon_name)
self.contents.blt(x, (y_override || (32 * y)) + 4, bitmap, Rect.new(0, 0, 24, 24))
text = item.name + text
x += 24
end
next
end
if c == "\032"
text.sub!(/\[(+)\]/, "")
item = $data_skills[$1.to_i]
if item != nil
bitmap = RPG::Cache.icon(item.icon_name)
self.contents.blt(x, (y_override || (32 * y)) + 4, bitmap, Rect.new(0, 0, 24, 24))
text = item.name + text
x += 24
end
next
end
# If new line text
if c == "\n"
# Update cursor width if choice
if y >= $game_temp.choice_start
@cursor_width = [@cursor_width, x].max
end
# Add 1 to y
y += 1
x = 0
# Indent if choice
if y >= $game_temp.choice_start
x = 8
end
y_override += 32 if y_override
# go to next text
next
end
# Draw text
if shadow
color = self.contents.font.color.dup
self.contents.font.color = Color.new(0, 0, 0)
self.contents.draw_text(4 + x, (y_override || (32 * y)) + 1, 40, 32, c)
self.contents.font.color = color
end
if outline
color = self.contents.font.color.dup
self.contents.font.color = out_color
self.contents.draw_outline_text(4 + x, y_override || (32 * y), 40, 32, c)
self.contents.font.color = color
else
self.contents.draw_text(4 + x, y_override || 32 * y, 40, 32, c)
end
# Add x to drawn text width
x += self.contents.text_size(c).width
end
end
# If choice
if $game_temp.choice_max > 0
@item_max = $game_temp.choice_max
self.active = true
self.index = 0
end
# If number input
if $game_temp.num_input_variable_id > 0
digits_max = $game_temp.num_input_digits_max
number = $game_variables[$game_temp.num_input_variable_id]
@input_number_window = Window_InputNumber.new(digits_max)
@input_number_window.number = number
@input_number_window.x = self.x + 8
@input_number_window.y = self.y + $game_temp.num_input_start * 32
end
end
alias :tlb_msg_update :update unless $@
def update
tlb_msg_update
if !self.visible && @name_window != nil
@name_window.dispose
@name_window = nil
end
end
end
FAQ
None yet
Credit and Thanks
- Trihan
- Yanfly, for the message codes provided in the Ace Message System
本贴来自国际rpgmaker官方论坛作者:Trihan处,因国际论坛即将永久关站,为了存档多年珍贵资料,署名转载到本论坛存档,由于官方帖子为英文原帖,需要中文翻译请点击论坛顶部切换语言为中文就可以将帖子翻译成中文浏览,方便大家随时查看,原文地址:https://forums.rpgmakerweb.com/threads/trilobytes-message-system-xp.145747/
页:
[1]