ATS: Special Message Codes
Version: 1.0.6
Author: modern algebra
Date: 18 October 2012
Version History
- <Version 1.0.6> 2012.10.18 - Made it so that you could set default values for font settings like fontname and size.
- <Version 1.0.5> 2012.10.07 - Added the \NP code to show the name of a party member
- <Version 1.0.4> 2012.08.12 - Fixed an error where setting message speed to 0 wouldn't be instant. I also made it so you can use {} for the conditional text command, thus allowing you to include other text codes within it.
- <Version 1.0.3> 2012.08.01 - Added \lb as an alternate code to break a line.
- <Version 1.0a> 2012.02.03 - Fixed an error with the \resub message code
- <Version 1.0> 2011.12.11 - Original Release
Description
This script allows you to use a number of additional special codes in the message system, which will function similar to the default codes like \v[n], \c[n], etc. Please see the list of special message codes starting at line 54 for a full idea of what is added. Basically, it gives you greater control over the delivery of a message, allows you to make use of font effects like bolding and italicizing, and allows you to retrieve and display useful data like the names of weapons and armors.
Features
- Greater message control - can now specify the speed at which text is displayed, the speec at which it is displayed when holding enter, and can also specify the exact number of frames to wait. It is also possible to disable the ability to show the message fast
- More Font Effects - can now use a number of font effects, such as changing the font, bolding, italicizing, underlining, and more
- Replacement Codes - Can use codes to display a number of useful things, such as an actor's nickname, the icon of a weapon, the name of a variable, and more
- Conditional Text - Can set some text to appear only if a particular switch is ON or OFF.
Screenshots
(https://rmrk.net/proxy.php?request=http%3A%2F%2Fimg853.imageshack.us%2Fimg853%2F3829%2Fatssmcscreen.png&hash=c55e832bf2564d1078899d0842afecc3f472a7d0)
Instructions
Insert this script in its own slot above Main and below Materials.
For a complete list of the new special message codes and what they do, see the header of the script.
Script
#==============================================================================
# ATS: Special Message Codes [VXA]
# Version: 1.0.6
# Author: modern algebra (rmrk.net)
# Date: 18 October 2012
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# Description:
#
# This script allows you to use a number of additional special codes in the
# message system, which will function similar to the default codes like
# \v[n], \c[n], etc. Please see the list of special message codes starting at
# line 54 for a full idea of what is added. Basically, it gives you greater
# control over the delivery of a message, allows you to make use of font
# effects like bolding and italicizing, and allows you to retrieve and
# display useful data like the names of weapons and armors.
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# ATS Series:
#
# This script is part of the Advanced Text System series of scripts. These
# scripts are based off the Advanced Text System for RMVX, but since RMVX Ace
# has a much more sensibly designed message system, it is no longer necessary
# that it be one large script. For that reason, and responding to feedback on
# the ATS, I have split the ATS into multiple different scripts so that you
# only need to pick up the components for the features that you want. It is
# therefore easier to customize and configure.
#
# To find more scripts in the ATS Series, please visit:
# http://rmrk.net/index.php/topic,44525.0.html
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# Instructions:
#
# This script is not difficult to use or configure. There are only ten
# configuration options for this script. These are:
#
# :message_speed :font_italic
# :show_fast_speed :font_outline
# :font_name :font_shadow
# :font_size :font_underline
# :font_bold :font_highlight
#
# :message_speed allows you to set the default number of frames to wait
# between drawing each letter in the message window. :show_fast_speed allows
# you to control the amount it speeds up when the player presses enter. You
# can gain instructions on setting the default value for both at line 180.
#
# All of the :font_ settings simply let you set the initial values for the
# font when used.
#
# As with other ATS scripts, you can change the value of these options in
# game with the following codes in a script call:
#
# ats_next(:message_option, x)
# ats_all(:message_option, x)
#
# Where :message_option is the symbol you want (:message_speed or
# :show_fast_speed) and x is the value you want to change it to. ats_next
# will only change it for the very next message, while ats_all will change it
# for every message to follow.
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# List of Special Message Codes:
#
# The default message codes are retained, and this script adds a number of
# other desirable features. The following is a complete list of the message
# codes at your disposal. Simply insert them into a Display Message command,
# Choice Branches, or any other message related system.
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Font Effects:
#
# \fn[fontname] - Change the font to fontname. If you put multiple fontnames
# separated by commas, then it will take the first one the user has installed
# \fs[n] - Change the font size to n.
# \{ - Increase the font size by 8.
# \} - Decrease the font size by 8.
# \c[n] - Set the colour of the text being drawn to the nth colour of the
# Windowskin palette. 0 is the normal color and 16 is the system color.
# \hc[RRGGBB] or \c[#RRGGBB] - Set the colour of the text being drawn to any
# colour, using hexadecimal values. You can set each colour (red, green,
# blue) to anything from 0-255 (00-FF). You must use hexadecimal values. If
# so desired, you can add an additional hex value from 00-FF to change the
# alpha.
# \b - Turn bold on. Text drawn after this code will be bolded.
# /b - Turn bold off.
# \i - Turn italic on. Text drawn after this code will be italicized.
# /i - Turn italic off.
# \o - Turn outline on.
# /o - Turn outline off.
# \s - Turn shadow on. Text drawn after this code will have a shadow.
# /s - Turn shadow off.
# \u - Turn underline on. Text drawn after this code will be underlined.
# /u - Turn underline off.
# \hl[n] - Turn highlight on. Text drawn after this code will be highlighted
# with colour n + 1 from the windowskin palette
# /hl OR \hl[0] - Turn highlight off.
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Message Control:
#
# \s[n] - Sets the message speed to wait n frames between drawing every letter.
# 0 is instant.
# \s[+n] - Sets the message speed to wait an additional n frames between drawing
# every letter.
# \s[-n] - Sets the message speed to wait n less frames between drawing every
# letter.
# \. - Wait 15 frames before drawing the next character
# \| - Wait 60 frames before drawing the next character
# \w[n] - Wait n frames before drawing the next character
# \! - Pause text and wait for player to press Enter
# \^ - Skip Pause; allows you to close a message window without requiring player
# input.
# \> - Show line fast.
# \< - Stop showing line fast.
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Replacement Codes:
#
# \p[n] - Draw the name of the actor in the xth position in the party. 1 is
# the party leader, 2 is the second member, etc.
# \n[n] - Draw the name of the actor with ID n
# \nn[n] - Draw the nickname of the actor with ID n.
# \pid[n] - Draw the ID of the actor in the nth position in the party.
# \ac[n] - Draw the class name of the actor with ID n.
# \al[n] - Draw the level of the actor with ID n.
# \ni[n] - Draw the name of the item with ID n.
# \nw[n] - Draw the name of the weapon with ID n.
# \na[n] - Draw the name of the armor with ID n.
# \ns[n] - Draw the name of the skill with ID n.
# \nt[n] - Draw the name of the state with ID n.
# \nc[n] - Draw the name of the class with ID n.
# \ne[n] - Draw the name of the event with ID n on the current map.
# \nm[n] - Draw the name of the enemy with ID n.
# \nv[n] - Draw the name of the variable with ID n.
# \nsw[n] - Draw the name of the switch with ID n.
# \nl[n] - Draw the name of the element with ID n.
# \nwt[n] - Draw the name of the weapon type with ID n.
# \nat[n] - Draw the name of the armor type with ID n.
# \nst[n] - Draw the name of the skill type with ID n.
# \np[n] - Draw the name of the actor in the nth position in the party.
# \map - Draw the name of the map the player is currently on.
# \map[n] - Draw the name of the map with ID n.
# \pg - Draws the amount of money the party has.
# \g - Draws the unit of currency.
# \vocab[method] - Will draw whatever Vocab.method returns, if it is a valid
# method call. Suitable values for method are: level, level_a, hp, hp_a,
# mp, mp_a, tp, tp_a, fight, escape, attack, guard, item, skill, equip,
# status, formation, save, game_end, weapon, armor, key_item, equip2,
# optimize, clear, new_game, continue, shutdown, to_title, cancel,
# currency_unit
# \vocab[param, n] - Will draw the label for parameter with ID n. 0 => Max HP;
# 1 => Max MP; 2 => Attack; 3 => Defence; 4 => Magic; 5 => Magic Defence;
# 6 => Agility; 7 => Luck
# \vocab[etype, n] - Will draw the label for equipment type with ID n.
# 0 => Weapon; 1 => Shield; 2 => Head; 3 => Body; 4 => Accessory
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Other Effects:
#
# \$ - Opens a window which shows the party's gold.
# \n - line break
# \i[n] - Draw icon with index n.
# \ii[n] - Draw icon of the item with ID n.
# \iw[n] - Draw icon of the weapon with ID n.
# \ia[n] - Draw icon of the armor with ID n.
# \is[n] - Draw icon of the skill with ID n.
# \it[n] - Draw icon of the state with ID n.
# \x[n] - Draw next character at pixel n of the window contents.
# \s{n,text} - Will only draw text if the switch with ID n is ON.
# \s!{n,text} - Will only draw text if the switch with ID n is OFF.
# \#{code} - This will evaluate code. So, if you know scipting, you can place
# any code there and it will draw whatever is returned by it. For instance:
# \#{$game_system.save_count} would draw the number of times the player has
# saved the current game.
#==============================================================================
$imported = {} unless $imported
$imported[:ATS_SpecialMessageCodes] = true
#==============================================================================
# ** Game_ATS
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# Summary of Changes:
# new public instance variables - message_speed; special_message_codes
#==============================================================================
class Game_ATS
CONFIG = {} unless $imported[:AdvancedTextSystem]
CONFIG[:special_message_codes] = {
special_message_codes: true,
#\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
# EDITABLE REGION
#||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
# :message_speed => x,
# Changing the value of x determines the default number of frames to
# wait between drawing letters in a message window. 0 is instant.
:message_speed => 1,
# :show_fast_speed => x
# Changing the value of x determines the number of frames to wait
# between drawing letters when the player is holding enter. 0 is
# instant
:show_fast_speed => 0,
# Font Settings - Set the default settings for the font you are using here.
:font_name => Font.default_name, # String or Array of Strings
:font_size => Font.default_size, # Integer
:font_bold => Font.default_bold, # true or false
:font_italic => Font.default_italic, # true or false
:font_outline => Font.default_outline, # true or false
:font_shadow => Font.default_shadow, # true or false
:font_underline => false, # true or false
:font_highlight => -1, # Integer for colour of highlight
#||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
# END EDITABLE REGION
#////////////////////////////////////////////////////////////////////////
}
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# * Public Instance Variables
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
CONFIG[:special_message_codes].keys.each { |key| attr_accessor key }
end
#==============================================================================
# Initialize Common ATS Data if no other ATS script interpreted first
#==============================================================================
if !$imported[:AdvancedTextSystem]
#============================================================================
# *** DataManager
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# Summary of Changes:
# aliased method - create_game_objects; make_save_contents;
# extract_save_contents
#============================================================================
module DataManager
class << self
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# * Create Game Objects
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
alias modb_ats_crtgmobj_6yh7 create_game_objects
def create_game_objects(*args, &block)
modb_ats_crtgmobj_6yh7(*args, &block)
$game_ats = Game_ATS.new
$game_ats.init_new_installs
end
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# * Make Save Contents
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
alias mlba_ats_mksave_5tg9 make_save_contents
def make_save_contents(*args, &block)
contents = mlba_ats_mksave_5tg9(*args, &block)
contents[:ats] = $game_ats
contents
end
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# * Extract Save Contents
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
alias ma_ats_extrcsvcon_8uj2 extract_save_contents
def extract_save_contents(contents, *args, &block)
ma_ats_extrcsvcon_8uj2(contents, *args, &block)
$game_ats = contents[:ats] ? contents[:ats] : Game_ATS.new
$game_ats.init_new_installs
end
end
end
#============================================================================
# ** Game_ATS
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# This class holds the default data for all scripts in the ATS series
#============================================================================
class Game_ATS
def initialize; reset; end
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# * Reset any or all installed ATS scripts
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
def reset(script_name = nil)
if script_name.is_a? (Symbol) # If script to reset specified
CONFIG[script_name].each_pair { |key, value|
self.send("#{key}=".to_sym, value)
$game_message.send("#{key}=".to_sym, value)
}
else # Reset all ATS scripts
CONFIG.keys.each { |script| reset(script) }
end
end
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# * Initialize any newly installed ATS scripts
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
def init_new_installs
CONFIG.keys.each { |script| reset(script) unless self.send(script) }
end
end
#============================================================================
# ** Game_Message
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# Summary of Changes:
# aliased method - clear
#============================================================================
class Game_Message
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# * Clear
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
alias mlb_ats_clrats_5tv1 clear
def clear(*args, &block)
mlb_ats_clrats_5tv1(*args, &block) # Run Original Method
return if !$game_ats
Game_ATS::CONFIG.values.each { |installed|
installed.keys.each { |key| self.send("#{key}=".to_sym, $game_ats.send(key)) }
}
end
end
#============================================================================
# ** Game_Interpreter
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# Summary of Changes:
# new methods - ats_all; ats_next
#============================================================================
class Game_Interpreter
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# * ATS All
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
def ats_all(sym, *args, &block)
$game_ats.send("#{sym}=".to_sym, *args, &block)
ats_next(sym, *args, &block)
end
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# * ATS Next
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
def ats_next(sym, *args, &block)
$game_message.send("#{sym}=".to_sym, *args, &block)
end
end
end
$imported[:AdvancedTextSystem] = true
class Game_Message
Game_ATS::CONFIG[:special_message_codes].keys.each { |key| attr_accessor key }
end
#==============================================================================
# ** Game_Event
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# Summary of Changes:
# new method - name
#==============================================================================
class Game_Event
def name
return @event ? @event.name : ""
end
end
#==============================================================================
# ** Window_Base
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# Summary of Changes:
# aliased methods - initialize; convert_escape_characters; calc_line_height;
# process_escape_character; process_normal_character
#==============================================================================
class Window_Base
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# * Object Initialization
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
alias mlgb_atssmc_init_3do9 initialize
def initialize(*args, &block)
mlgb_atssmc_init_3do9(*args, &block) # Run Original Method
@underline = false
@highlight = -1
end
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# * Convert Escape Characters
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
alias ma_atssmc_convesc_4rc1 convert_escape_characters
def convert_escape_characters(text, *args, &block)
result = ma_atssmc_convesc_4rc1(text, *args, &block) # Run Original Method
# Party
result.gsub!(/\ePID\[(\d+)\]/i) { $1.to_i >= 1 ? $game_party.members[$1.to_i - 1].id.to_s : "1" }
result.gsub!(/\ePG/i) { $game_party.gold }
# Message Speed
result.gsub!(/\eS\[([\+-]?\d+)\]/i) { "\eMS\[#{$1}\]" }
result.gsub!(/\e%/) { "\eDS%"}
# Hex Colour
result.gsub!(/\eC\[#/i) { "\eHC[" }
# Icons
result.gsub!(/\eII\[(\d+)\]/i) { "\eI\[#{$data_items[$1.to_i].icon_index}\]" rescue "" }
result.gsub!(/\eIW\[(\d+)\]/i) { "\eI\[#{$data_weapons[$1.to_i].icon_index}\]" rescue "" }
result.gsub!(/\eIA\[(\d+)\]/i) { "\eI\[#{$data_armors[$1.to_i].icon_index}\]" rescue "" }
result.gsub!(/\eIS\[(\d+)\]/i) { "\eI\[#{$data_skills[$1.to_i].icon_index}\]" rescue "" }
result.gsub!(/\eIT\[(\d+)\]/i) { "\eI\[#{$data_states[$1.to_i].icon_index}\]" rescue "" }
# Actor Stats
result.gsub!(/\eAC\[(\d+)\]/i) { $data_classes[$game_actors[$1.to_i].class_id].name }
result.gsub!(/\eAL\[(\d+)\]/i) { $game_actors[$1.to_i].level.to_s }
# Names
result.gsub!(/\eMAP\[(\d+)\]/i) { load_data(sprintf("Data/Map%03d.rvdata2", $1.to_i)).display_name rescue "" }
result.gsub!(/\eMAP/i) { $game_map.display_name rescue "" }
result.gsub!(/\eNP\[(\d+)\]/i) { $game_party.members[$1.to_i].name rescue "" }
result.gsub!(/\eNE\[(\d+)\]/i) { $game_map.events[$1.to_i].name rescue "" }
result.gsub!(/\eNN\[(\d+)\]/i) { $game_actors[$1.to_i].nickname rescue "" }
result.gsub!(/\eNI\[(\d+)\]/i) { $data_items[$1.to_i].name rescue "" }
result.gsub!(/\eNW\[(\d+)\]/i) { $data_weapons[$1.to_i].name rescue "" }
result.gsub!(/\eNA\[(\d+)\]/i) { $data_armors[$1.to_i].name rescue "" }
result.gsub!(/\eNS\[(\d+)\]/i) { $data_skills[$1.to_i].name rescue "" }
result.gsub!(/\eNT\[(\d+)\]/i) { $data_states[$1.to_i].name rescue "" }
result.gsub!(/\eNM\[(\d+)\]/i) { $data_enemies[$1.to_i].name rescue "" }
result.gsub!(/\eNC\[(\d+)\]/i) { $data_classes[$1.to_i].name rescue "" }
result.gsub!(/\eNV\[(\d+)\]/i) { $data_system.variables[$1.to_i] }
result.gsub!(/\eNSW\[(\d+)\]/i) { $data_system.switches[$1.to_i] }
result.gsub!(/\eNWT\[(\d+)\]/i) { $data_system.weapon_types[$1.to_i] }
result.gsub!(/\eNAT\[(\d+)\]/i) { $data_system.armor_types[$1.to_i] }
result.gsub!(/\eNST\[(\d+)\]/i) { $data_system.skill_types[$1.to_i] }
result.gsub!(/\eNL\[(\d+)\]/i) { $data_system.elements[$1.to_i] }
# Vocab
result.gsub!(/\eVOCAB\[(\w+),\s*(\d+)\s*\]/i) { Vocab.send($1.downcase, $2.to_i) rescue "" }
result.gsub!(/\eVOCAB\[(\w+)\]/i) { Vocab.send($1.downcase) rescue "" }
# Font Settings
result.gsub!(/\eB/i) { "\eFE[0]" } # Bold On
result.gsub!(/\/B/i) { "\eFE[1]" } # Bold Off
result.gsub!(/\eI([^\[])/i) { "\eFE[2]#{$1}" } # Italics On
result.gsub!(/\/I/i) { "\eFE[3]" } # Italics Off
result.gsub!(/\eO/i) { "\eFE[4]" } # Outline On
result.gsub!(/\/O/i) { "\eFE[5]" } # Outline Off
result.gsub!(/\eS([^\[!])/i) { "\eFE[6]#{$1}" } # Shadow On
result.gsub!(/\/S/i) { "\eFE[7]" } # Shadow Off
result.gsub!(/\eU/i) { "\eFE[8]" } # Underline On
result.gsub!(/\/U/i) { "\e\FE[9]" } # Underline Off
result.gsub!(/\eHL\[(\d+)\]/i) { "\eHL[#{$1.to_i}]" } # Highlight On: custom colour
result.gsub!(/\eHL([^\[])/i) { "\eHL[17]#{$1}" }# Highlight On: system colour
result.gsub!(/\/HL/i) { "\eHL[0]" } # Hightlight Off
result.gsub!(/\/FN/i) { "\eFN[]" } # Default Font
result.gsub!(/\/FS/i) { "\eFS[#{Font.default_size}]" } # Default Font
# Conditional Text
result.gsub!(/\eS\[(\d+)[,;:](.+?)\]/mi) { $game_switches[$1.to_i] ? $2 : "" }
result.gsub!(/\eS!\[(\d+)[,;:](.+?)\]/mi) { $game_switches[$1.to_i] ? "" : $2 }
result.gsub!(/\eS\{(\d+)[,;:](.+?)\}/mi) { $game_switches[$1.to_i] ? $2 : "" }
result.gsub!(/\eS!\{(\d+)[,;:](.+?)\}/mi) { $game_switches[$1.to_i] ? "" : $2 }
# Evaluation
result.gsub!(/\e#\{(.+?)\}/im) { (eval($1)).to_s rescue "" }
# Do resubstitutions if requested
if result.sub!(/\eRESUB/i, "") != nil
result = convert_escape_characters(result, *args, &block)
end
result.gsub!(/\e(N|LB)/i, "\n") # Line Break
result # Return result
end
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# * Calculate Line Height
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
alias ma_atssmc_clclnhght_3ek9 calc_line_height
def calc_line_height(text, *args, &block)
res = ma_atssmc_clclnhght_3ek9(text, *args, &block) # Run Original Method
text.slice(/^.*$/).scan(/\eFS\[(\d+)\]/i) { |num| res = [res, num[0].to_i].max }
res
end
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# * Process Normal Character
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
alias mlra_atssmc_procnorm_5fg2 process_normal_character
def process_normal_character(c, pos, *args, &block)
draw_highlight_underline(c, pos) if @underline || @highlight
mlra_atssmc_procnorm_5fg2(c, pos, *args, &block) # Run Original Method
end
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# * Process Escape Character
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
alias ma_atssmc_procesc_7gv1 process_escape_character
def process_escape_character(code, text, pos, *args, &block)
case code.upcase
when 'X' then pos[:x] = obtain_escape_param(text)
when 'HC' # Hex Colour
hex = text.slice!(/^\[([ABCDEF\d]+)\]/i)
rgb = $1.scan(/../).map { |hex| hex.to_i(16) }
change_color(Color.new(*rgb)) if rgb.size.between?(3,4)
when 'FE' # Font Settings
param = obtain_escape_param(text)
case param / 2
when 0 then contents.font.bold = ((param % 2) == 0) # Bold
when 1 then contents.font.italic = ((param % 2) == 0) # Italic
when 2 then contents.font.outline = ((param % 2) == 0) # Outline
when 3 then contents.font.shadow = ((param % 2) == 0) # Shadow
when 4 then @underline = ((param % 2) == 0) # Underline
end
when 'HL' then @highlight = obtain_escape_param(text) - 1 # Highlight
when 'FN' # Font Name
text.slice!(/^\[(.*?\])/)
param = $1
if param.nil? || param == ']'
contents.font.name = Font.default_name
else
ary = []
while param.slice!(/\s*(.+?)\s*[,;:\]]/) != nil do ary.push($1) end
contents.font.name = ary
end
when 'FS' # Font Size
text.slice!(/^\[(\d+)\]/)
contents.font.size = [[$1.to_i, 16].max, 64].min
else
ma_atssmc_procesc_7gv1(code, text, pos, *args, &block) # Run Original Method
end
end
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# * Draw Highlighting and Underlining
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
def draw_highlight_underline(c, pos)
text_width = text_size(c).width
y_space = (pos[:height] - contents.font.size) / 2
if @underline # Underlining
y = pos[:y] + pos[:height]
y -= [2, y_space].max
contents.fill_rect(pos[:x], y, text_width, 2, contents.font.color)
end
if @highlight >= 0 # Highlighting
y = pos[:y]
y += y_space - 1 if y_space > 0
text_height = [contents.font.size + 2, pos[:height]].min
colour = text_color(@highlight)
colour.alpha = 128 if colour.alpha > 128
contents.fill_rect(pos[:x], y, text_width, text_height, colour)
end
end
end
#===============================================================================
# ** Window_Message
#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# Summary of Changes:
# aliased method - clear_instance_variables; process_escape_character;
# update_show_fast; wait_for_one_character
# overwritten super method - reset_font_settings
#===============================================================================
class Window_Message
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# * Clear Instance Variables
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
alias ma_atssmc_clrinsvar_3dq9 clear_instance_variables
def clear_instance_variables(*args, &block)
ma_atssmc_clrinsvar_3dq9(*args, &block) # Run Original Method
@skip_disabled = false
end
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# * Reset Font Settings
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
def reset_font_settings(*args, &block)
change_color(normal_color)
contents.font.name = $game_message.font_name
contents.font.size = $game_message.font_size
contents.font.bold = $game_message.font_bold
contents.font.italic = $game_message.font_italic
contents.font.outline = $game_message.font_outline
contents.font.shadow = $game_message.font_shadow
@underline = $game_message.font_underline
@highlight = $game_message.font_highlight
end
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# * Process Escape Character
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
alias mnaa_atssmc_escchar_3dr9 process_escape_character
def process_escape_character(code, text, pos, *args, &block)
case code.upcase
when 'MS' # Set Message Speed
if !text[/^\[([+-])/].nil?
text.sub!(/^\[([\+-])/, '[' )
sign = $1
else
sign = ""
end
param = obtain_escape_param(text)
sign.empty? ? $game_message.message_speed = param : $game_message.message_speed += "#{sign}#{param}".to_i
when 'DS'
text.slice!(/^%/) # Delete buffer to ensure code isn't overextended
@skip_disabled = !@skip_disabled
when 'W' then wait(obtain_escape_param(text))
else
mnaa_atssmc_escchar_3dr9(code, text, pos, *args, &block) # Run Original Method
end
end
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# * Update Show Fast
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
alias mlg_atssmc_updshwfast_7yb1 update_show_fast
def update_show_fast(*args, &block)
mlg_atssmc_updshwfast_7yb1(*args, &block)
if $game_message.message_speed < 1
@show_fast = true
elsif @skip_disabled
@show_fast = false
elsif $game_message.show_fast_speed > 0
@show_fast = Input.press?(:C)
end
end
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# * Wait for One Character
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
alias mdrnl_smcats_waitonechar_5rf1 wait_for_one_character
def wait_for_one_character(*args, &block)
mdrnl_smcats_waitonechar_5rf1(*args, &block) # Run Original Method
if (@show_fast || @line_show_fast) && $game_message.show_fast_speed > 0
wait($game_message.show_fast_speed)
elsif $game_message.message_speed > 1
wait($game_message.message_speed - 1)
end
end
end
Credit
Support
Please post in this topic at RMRK for support.
Known Compatibility Issues
May not work with other message scripts which use the same codes for different functions.
you my good sir are what we call the second coming of jesus
I can't live without Italics, it's something I must have.
Awesome! Few ideas:
1) Could you add to conditional text possibility to evaluate variables? E.g. \var[ID,expr,val,text] - draws text only when variable conforms to specific value. Expr can be =,>,<,<=,>=, example "\var[64,>=,15,You got 15 or more fish!]" will draw text "You got 15 or more fish!" only when variable 64 is greater or equal to 15.
Also, could you add possibility to draw Picture from pictures folder inside message? E.g. \pic[box] would draw picture box inside message. I know we have icons, but 1 - icons are limited, 2 - sometimes you want to draw something bigger than 32x32 picture.
And a question: Can we in conditional text use codes, e.g. \s[32,Switch 32 is on. \c[10]I like red!]? If not, thqat would be cool to have.
//edit: Also it seems like code /o isn't processed.
Text in message command:
/o \fs[72]THUD!
(https://rmrk.net/proxy.php?request=http%3A%2F%2Fi.imgur.com%2FzfKXP.png&hash=53c4717b62e2854c35c0d516025423a001f8e766)
Script addition order:
ATS Formatting
ATS Special message codes <- this one
I don't have any other scripts yet.
Also additional idea: How about /dfs command? It would set default font size for messages if no \fs or \{/\} commands are called. This way, if we want to have, say 48 font size thorough game we won't have to call \fs every single message.
1) I don't want to do that since there are already ways to achieve that effect which are far more flexible. Namely, you could instead just put a conditional branch immediately preceding the text that sets a switch to the value, then just use the switch. Ie:
@>Conditional Branch: Variable [64: Fish] >= 15
@>Control Switch: [32: Switch] = ON
: Else
@>Control Switch: [32: Switch] = OFF
END
@>Text:\s[32,You got \v[64] fish!]
2) I don't want to add that feature.
3) Kind of, but mostly not. You can use it for most replacement codes - things like \v[64], for instance - but you wouldn't be able to do it for the codes that affect the way text is drawn, like \c[n], or \b, \i, \fs[n], etc. I can add that feature though.
4) I don't think that would be useful as a message code, but I could add it in as an ats_all() script call.
Quote from: modern algebra on June 29, 2012, 03:49:55 AM
1) I don't want to do that since there are already ways to achieve that effect which are far more flexible. Namely, you could instead just put a conditional branch immediately preceding the text that sets a switch to the value, then just use the switch. Ie:
@>Conditional Branch: Variable [64: Fish] >= 15
@>Control Switch: [32: Switch] = ON
: Else
@>Control Switch: [32: Switch] = OFF
END
@>Text:\s[32,You got \v[64] fish!]
From my experience the text box disappears when you call a conditional branch...
I'm not sure what you mean. As in the example, you would do the conditional branch and set the switch before calling the text box.
What I meant was if you use it in between two text boxes, the text box disappears and reappears again, so if you want text preceding that message... A few other things do this as well, I believe
Then do the conditional branch before the first text box. It is intentional that text between boxes will only be appended if it directly succeeds the first text box. I do not see that as a problem.
Can this be used to drawn the name of the target being attacked?
Like under the Skill menu where it says uses/casts/does/attacks?
And if so how would one do that or would it require a different script?
No, it can't. It seems like a good idea, but I wouldn't include it with this script since it actually is a little different.
I might write an independent script for it though. How would you want it to deal with multiple targets? Ie. Let's say, for now that the script is written so that \t is replaced by the name of the target and the message you have is:
(User name) casts Skill on \t! I
f the scope is something like "3 random enemies", how should the names of the enemies chosen come up?
I'm not sure on that. I was looking for a way to display a targets name but I never thought about multiple targets.
Yanfly's scripts are awesome, but you are the master of VXA message boxes. Thanks a lot.
If this showed actor faces, I would uninstall Yanfly's. If you ever consider adding that feature, please consider making it \af[n].
Thanks again!
I just ran into a bug with the \np[n] code to show the name of a party member in a specific position. Instead of displaying the name it just shows "p[1]" for \np[1], or "p[2]" for \np[2]. I tried this in a separate project by itself and got the same effect.
Hmm, I appear to have neglected to add that code to the script. I updated the script to version 1.0.5 - you can get it from the original post.
Thanks, that fixed it!
I'm glad I could help.
Updated to version 1.0.6 to allow for setting the font settings through script call prior to the message itself.
Wow thanks for this.
Hm, is there a way to change the default font, outline and shadow settings within the script itself?
Yes. At lines 196-205 you should see this:
# Font Settings - Set the default settings for the font you are using here.
:font_name => Font.default_name, # String or Array of Strings
:font_size => Font.default_size, # Integer
:font_bold => Font.default_bold, # true or false
:font_italic => Font.default_italic, # true or false
:font_outline => Font.default_outline, # true or false
:font_shadow => Font.default_shadow, # true or false
:font_underline => false, # true or false
:font_highlight => -1, # Integer for colour of highlight
Just set them to the values you want. Ie. If you want the default font name to be Times New Roman, then set:
:font_name => "Times New Roman", # String or Array of Strings
If you want to change the default font at some point in the course of the game, then you would use the ats_all method in an Evaluate Script event command, like so:
ats_all(:font_name, "Arial")
Not good idea,
I want to put
Instruction
-----------------------------------------------------------------------------------------------
#FONT INSTRUCTION
-----------------------------------------------------------------------------------------------
#/fn[x] - open font, (fn)font name is for required. X supposed to be any font with font names
#\fn - close font
#/s[x] - open size, x supposed to be any number.
#\s - go back to normal.
#/i - italic, to make word italic
#\i - close italic, words go back normal
#/b - bold, to make word bold
#\b - close bold, words go back to normal
#/out - outline, to make the words outline
#\out - close outline, word go back to normal
Sorry for my bad english
Well, I don't really see the benefit of just reversing the slashes, especially since the current configuration more closely resembles the default codes. However, you could certainly change it for your own purposes by finding the following section of the script:
# Font Settings
result.gsub!(/\eB/i) { "\eFE[0]" } # Bold On
result.gsub!(/\/B/i) { "\eFE[1]" } # Bold Off
result.gsub!(/\eI([^\[])/i) { "\eFE[2]#{$1}" } # Italics On
result.gsub!(/\/I/i) { "\eFE[3]" } # Italics Off
result.gsub!(/\eO/i) { "\eFE[4]" } # Outline On
result.gsub!(/\/O/i) { "\eFE[5]" } # Outline Off
result.gsub!(/\eS([^\[!])/i) { "\eFE[6]#{$1}" } # Shadow On
result.gsub!(/\/S/i) { "\eFE[7]" } # Shadow Off
result.gsub!(/\eU/i) { "\eFE[8]" } # Underline On
result.gsub!(/\/U/i) { "\e\FE[9]" } # Underline Off
result.gsub!(/\eHL\[(\d+)\]/i) { "\eHL[#{$1.to_i}]" } # Highlight On: custom colour
result.gsub!(/\eHL([^\[])/i) { "\eHL[17]#{$1}" }# Highlight On: system colour
result.gsub!(/\/HL/i) { "\eHL[0]" } # Hightlight Off
result.gsub!(/\/FN/i) { "\eFN[]" } # Default Font
result.gsub!(/\/FS/i) { "\eFS[#{Font.default_size}]" } # Default Font
# Font Settings
result.gsub!(/\eB/i) { "\eFE[0]" } # Bold On
result.gsub!(/\/B/i) { "\eFE[1]" } # Bold Off
result.gsub!(/\eI([^\[])/i) { "\eFE[2]#{$1}" } # Italics On
result.gsub!(/\/I/i) { "\eFE[3]" } # Italics Off
result.gsub!(/\eO/i) { "\eFE[4]" } # Outline On
result.gsub!(/\/O/i) { "\eFE[5]" } # Outline Off
result.gsub!(/\eS([^\[!])/i) { "\eFE[6]#{$1}" } # Shadow On
result.gsub!(/\/S/i) { "\eFE[7]" } # Shadow Off
result.gsub!(/\eU/i) { "\eFE[8]" } # Underline On
result.gsub!(/\/U/i) { "\e\FE[9]" } # Underline Off
result.gsub!(/\eHL\[(\d+)\]/i) { "\eHL[#{$1.to_i}]" } # Highlight On: custom colour
result.gsub!(/\eHL([^\[])/i) { "\eHL[17]#{$1}" }# Highlight On: system colour
result.gsub!(/\/HL/i) { "\eHL[0]" } # Hightlight Off
result.gsub!(/\/FN/i) { "\eFN[]" } # Default Font
result.gsub!(/\/FS/i) { "\eFS[#{Font.default_size}]" } # Default Font
and by switching the \e with the \/
Thanks..........
Sorry, I guess I should be a little more clear. If, for instance, you want to change it so /b turns bold on and \b turns it off, you would look at these two lines:
result.gsub!(/\eB/i) { "\eFE[0]" } # Bold On
result.gsub!(/\/B/i) { "\eFE[1]" } # Bold Off
And change it to:
result.gsub!(/\/B/i) { "\eFE[0]" } # Bold On
result.gsub!(/\eB/i) { "\eFE[1]" } # Bold Off
In my opinion though, I am not really sure there is much utility to changing all these lines - why not just use it the way it is? '\bThis is bold/b' is not any harder to type than '/bThis is bold\b'
MA, So cool man. I love you awesome scriptwriter.
Can I do a demo for you, Modern Algebra
Thanks for the offer, but no.
Hi great script.
I´m missing..
Quote\#!{code}# - This will evaluate code at the time the window reaches this code
# when drawing. It does not put the result of the code into the message
# but is instead intended to be evaluated. For instance: \#!{new_page}#
# would perform the same function as \pb. You need to know syntax!
, from your old script, is there any other way to use code in textboxes in Ace?, not only displaying the value of an switch or something...
Or are you going to add such a feature soon.
That's still a feature in this script. It is just:
# \#{code} - This will evaluate code. So, if you know scipting, you can place
# any code there and it will draw whatever is returned by it. For instance:
# \#{$game_system.save_count} would draw the number of times the player has
# saved the current game.
But it shows the result in the box.
Example: text text text \#{$game_switches[70] = true} (<--Switch 70 on to show a picture / activate an event in the right moment) text....
The textbox writes "text text text true text"
There apears a "true" in the Text.
Your old VX script had the \#{code}# and the \#!{code}# possibilities, the \#!{code}# worked fine for this problem.
Sry for my bad english or if i did any mistakes =)
Ah, sorry, I guess I forgot about that feature. I will add it at some point.
Will you consider adding in an option to change the outline color? Yanfly's messaging system has it, and it's nice to highlight words with outlines. It looks nice. :ladyj:
Time for a delicious necropost...
Modern. One of the features you had in a previous version of your ATS, for use with VX, was the ability to play a sound with an in-text command. I was about to do this myself, but I figure it would be better to ask you to do it first before attempting a kludge. Seems more... reliable of an option.
Something like:
\snd["soundname"]
Hey Arrow!
I sort of messed around with the formatting of the scripts and divided them by features. Sound effect-based features are in the Message Options (http://rmrk.net/index.php/topic,46770.0.html) script.
I'm an idiot. I installed that very script and missed the feature entirely. Probably because I was looking for the word "Sound" instead of "SE" because I haven't touched RPG Maker in "years" and thank you for addressing the issue courteously.
Once again, your work is fantastic.
Huge necropost, first post of mine here too, so sorry and stuff, but I noticed something when playing around with this message system. With the \#{} code evaluator bit, I noticed it's impossible for you to actually evaluate any extra message codes from what that value returns. This would be extremely useful for users who, say, want to use an external file to hold dialogue. This can be remedied with a single recursive call wrapped around what the code tag returns(I tested it, so I'm 100% sure it works.)
So basically changing the line in the method convert_escape_characters which reads "(eval($1)).to_s" to say "convert_escape_characters((eval($1)).to_s, *args, &block)" instead.
Sorry if I'm out of line or anything like that, but I discovered this and wanted to make sure others could benefit from it. This is a great script set, probably one of the best message system overhauls I've seen. Again, sorry for the necropost!